##// END OF EJS Templates
Use of delays instead of input queue to keep dataouts and avoid loose of them
Use of delays instead of input queue to keep dataouts and avoid loose of them

File last commit:

r1241:c3044f867269
r1245:1ee18bfa3eb6
Show More
jroIO_madrigal.py
638 lines | 21.0 KiB | text/x-python | PythonLexer
Juan C. Espinoza
BLTRParamreader ready
r1010 '''
Created on Aug 1, 2017
@author: Juan C. Espinoza
'''
import os
import sys
import time
Juan C. Espinoza
Operation MAD2Writer done Task #343
r1021 import json
MADReader support for HDF5 (mad2 & mad3)
r1065 import glob
Juan C. Espinoza
BLTRParamreader ready
r1010 import datetime
import numpy
MADReader support for HDF5 (mad2 & mad3)
r1065 import h5py
Errors handling and gracefully terminate main process
r1241
import schainpy.admin
George Yong
Writing Unit for Madrigal decorated (just for python 2x)
r1206 from schainpy.model.io.jroIO_base import LOCALTIME, JRODataReader, JRODataWriter
George Yong
Reading Unit for Madrigal decorated (just for python2X)
r1189 from schainpy.model.proc.jroproc_base import ProcessingUnit, Operation, MPDecorator
Juan C. Espinoza
Operation MAD2Writer done Task #343
r1021 from schainpy.model.data.jrodata import Parameters
MADReader support for HDF5 (mad2 & mad3)
r1065 from schainpy.utils import log
Madrigal 3 reading/writing task #1154
r1070 try:
Juan C. Espinoza
Fix bugs in madrigal module
r1073 import madrigal.cedar
Madrigal 3 reading/writing task #1154
r1070 except:
log.warning(
'You should install "madrigal library" module if you want to read/write Madrigal data'
)
Juan C. Espinoza
Operation MAD2Writer done Task #343
r1021
Juan C. Espinoza
Fix Madrigal HDF5 reader (v2 & v3)
r1208 try:
basestring
except:
basestring = str
Juan C. Espinoza
Operation MAD2Writer done Task #343
r1021 DEF_CATALOG = {
'principleInvestigator': 'Marco Milla',
George Yong
Writing Unit for Madrigal decorated (just for python 2x)
r1206 'expPurpose': '',
'cycleTime': '',
'correlativeExp': '',
'sciRemarks': '',
'instRemarks': ''
Juan C. Espinoza
Operation MAD2Writer done Task #343
r1021 }
George Yong
Writing Unit for Madrigal decorated (just for python 2x)
r1206
Juan C. Espinoza
Operation MAD2Writer done Task #343
r1021 DEF_HEADER = {
George Yong
Writing Unit for Madrigal decorated (just for python 2x)
r1206 'kindatDesc': '',
Juan C. Espinoza
Operation MAD2Writer done Task #343
r1021 'analyst': 'Jicamarca User',
George Yong
Writing Unit for Madrigal decorated (just for python 2x)
r1206 'comments': '',
'history': ''
Juan C. Espinoza
Operation MAD2Writer done Task #343
r1021 }
George Yong
Writing Unit for Madrigal decorated (just for python 2x)
r1206
Juan C. Espinoza
Operation MAD2Writer done Task #343
r1021 MNEMONICS = {
10: 'jro',
11: 'jbr',
840: 'jul',
13: 'jas',
1000: 'pbr',
1001: 'hbr',
1002: 'obr',
George Yong
Writing Unit for Madrigal decorated (just for python 2x)
r1206 400: 'clr'
Juan C. Espinoza
Operation MAD2Writer done Task #343
r1021 }
MADReader support for HDF5 (mad2 & mad3)
r1065 UT1970 = datetime.datetime(1970, 1, 1) - datetime.timedelta(seconds=time.timezone)
Juan C. Espinoza
Operation MAD2Writer done Task #343
r1021 def load_json(obj):
'''
Parse json as string instead of unicode
'''
if isinstance(obj, str):
MADReader support for HDF5 (mad2 & mad3)
r1065 iterable = json.loads(obj)
Madrigal 3 reading/writing task #1154
r1070 else:
iterable = obj
MADReader support for HDF5 (mad2 & mad3)
r1065
if isinstance(iterable, dict):
Juan C. Espinoza
Fix Madrigal HDF5 reader (v2 & v3)
r1208 return {str(k): load_json(v) if isinstance(v, dict) else str(v) if isinstance(v, basestring) else v
George Yong
Python 2to3, Spectra (all operations) working
r1167 for k, v in list(iterable.items())}
MADReader support for HDF5 (mad2 & mad3)
r1065 elif isinstance(iterable, (list, tuple)):
Juan C. Espinoza
Fix Madrigal HDF5 reader (v2 & v3)
r1208 return [str(v) if isinstance(v, basestring) else v for v in iterable]
MADReader support for HDF5 (mad2 & mad3)
r1065
return iterable
George Yong
Reading Unit for Madrigal decorated (just for python2X)
r1189 @MPDecorator
MADReader support for HDF5 (mad2 & mad3)
r1065 class MADReader(JRODataReader, ProcessingUnit):
George Yong
Reading Unit for Madrigal decorated (just for python2X)
r1189 def __init__(self):
MADReader support for HDF5 (mad2 & mad3)
r1065
George Yong
Reading Unit for Madrigal decorated (just for python2X)
r1189 ProcessingUnit.__init__(self)
MADReader support for HDF5 (mad2 & mad3)
r1065
self.dataOut = Parameters()
self.counter_records = 0
self.nrecords = None
self.flagNoMoreFiles = 0
self.isConfig = False
self.filename = None
self.intervals = set()
def setup(self,
path=None,
startDate=None,
endDate=None,
format=None,
startTime=datetime.time(0, 0, 0),
endTime=datetime.time(23, 59, 59),
**kwargs):
Madrigal 3 reading/writing task #1154
r1070
MADReader support for HDF5 (mad2 & mad3)
r1065 self.path = path
self.startDate = startDate
self.endDate = endDate
self.startTime = startTime
self.endTime = endTime
self.datatime = datetime.datetime(1900,1,1)
self.oneDDict = load_json(kwargs.get('oneDDict',
"{\"GDLATR\":\"lat\", \"GDLONR\":\"lon\"}"))
self.twoDDict = load_json(kwargs.get('twoDDict',
"{\"GDALT\": \"heightList\"}"))
Juan C. Espinoza
Fix Madrigal HDF5 reader (v2 & v3)
r1208 self.independentParam = 'GDALT'
MADReader support for HDF5 (mad2 & mad3)
r1065 if self.path is None:
George Yong
Python 2to3, Spectra (all operations) working
r1167 raise ValueError('The path is not valid')
MADReader support for HDF5 (mad2 & mad3)
r1065
if format is None:
George Yong
Python 2to3, Spectra (all operations) working
r1167 raise ValueError('The format is not valid choose simple or hdf5')
MADReader support for HDF5 (mad2 & mad3)
r1065 elif format.lower() in ('simple', 'txt'):
self.ext = '.txt'
elif format.lower() in ('cedar',):
self.ext = '.001'
else:
self.ext = '.hdf5'
self.search_files(self.path)
self.fileId = 0
if not self.fileList:
George Yong
Python 2to3, Spectra (all operations) working
r1167 raise Warning('There is no files matching these date in the folder: {}. \n Check startDate and endDate'.format(path))
MADReader support for HDF5 (mad2 & mad3)
r1065
self.setNextFile()
def search_files(self, path):
'''
Searching for madrigal files in path
Creating a list of files to procces included in [startDate,endDate]
Input:
path - Path to find files
'''
Madrigal 3 reading/writing task #1154
r1070 log.log('Searching files {} in {} '.format(self.ext, path), 'MADReader')
MADReader support for HDF5 (mad2 & mad3)
r1065 fileList0 = glob.glob1(path, '*{}'.format(self.ext))
fileList0.sort()
self.fileList = []
self.dateFileList = []
startDate = self.startDate - datetime.timedelta(1)
endDate = self.endDate + datetime.timedelta(1)
for thisFile in fileList0:
year = thisFile[3:7]
if not year.isdigit():
continue
month = thisFile[7:9]
if not month.isdigit():
continue
day = thisFile[9:11]
if not day.isdigit():
continue
year, month, day = int(year), int(month), int(day)
dateFile = datetime.date(year, month, day)
if (startDate > dateFile) or (endDate < dateFile):
continue
self.fileList.append(thisFile)
self.dateFileList.append(dateFile)
return
def parseHeader(self):
'''
'''
self.output = {}
self.version = '2'
s_parameters = None
if self.ext == '.txt':
Juan C. Espinoza
Fix Madrigal HDF5 reader (v2 & v3)
r1208 self.parameters = [s.strip().lower() for s in self.fp.readline().decode().strip().split(' ') if s]
MADReader support for HDF5 (mad2 & mad3)
r1065 elif self.ext == '.hdf5':
Juan C. Espinoza
Fix Madrigal HDF5 reader (v2 & v3)
r1208 self.metadata = self.fp['Metadata']
if '_record_layout' in self.metadata:
s_parameters = [s[0].lower().decode() for s in self.metadata['Independent Spatial Parameters']]
MADReader support for HDF5 (mad2 & mad3)
r1065 self.version = '3'
Juan C. Espinoza
Fix Madrigal HDF5 reader (v2 & v3)
r1208 self.parameters = [s[0].lower().decode() for s in self.metadata['Data Parameters']]
MADReader support for HDF5 (mad2 & mad3)
r1065
George Yong
Writing Unit for Madrigal decorated (just for python 2x)
r1206 log.success('Parameters found: {}'.format(self.parameters),
MADReader support for HDF5 (mad2 & mad3)
r1065 'MADReader')
if s_parameters:
Juan C. Espinoza
Fix Madrigal HDF5 reader (v2 & v3)
r1208 log.success('Spatial parameters found: {}'.format(s_parameters),
MADReader support for HDF5 (mad2 & mad3)
r1065 'MADReader')
George Yong
Python 2to3, Spectra (all operations) working
r1167 for param in list(self.oneDDict.keys()):
MADReader support for HDF5 (mad2 & mad3)
r1065 if param.lower() not in self.parameters:
Madrigal 3 reading/writing task #1154
r1070 log.warning(
'Parameter {} not found will be ignored'.format(
param),
'MADReader')
MADReader support for HDF5 (mad2 & mad3)
r1065 self.oneDDict.pop(param, None)
George Yong
Python 2to3, Spectra (all operations) working
r1167 for param, value in list(self.twoDDict.items()):
MADReader support for HDF5 (mad2 & mad3)
r1065 if param.lower() not in self.parameters:
Madrigal 3 reading/writing task #1154
r1070 log.warning(
'Parameter {} not found, it will be ignored'.format(
param),
'MADReader')
MADReader support for HDF5 (mad2 & mad3)
r1065 self.twoDDict.pop(param, None)
continue
if isinstance(value, list):
if value[0] not in self.output:
self.output[value[0]] = []
Juan C. Espinoza
Fix Madrigal HDF5 reader (v2 & v3)
r1208 self.output[value[0]].append([])
MADReader support for HDF5 (mad2 & mad3)
r1065
def parseData(self):
'''
'''
Juan C. Espinoza
Operation MAD2Writer done Task #343
r1021
MADReader support for HDF5 (mad2 & mad3)
r1065 if self.ext == '.txt':
self.data = numpy.genfromtxt(self.fp, missing_values=('missing'))
self.nrecords = self.data.shape[0]
Juan C. Espinoza
Fix Madrigal HDF5 reader (v2 & v3)
r1208 self.ranges = numpy.unique(self.data[:,self.parameters.index(self.independentParam.lower())])
self.counter_records = 0
MADReader support for HDF5 (mad2 & mad3)
r1065 elif self.ext == '.hdf5':
Juan C. Espinoza
Fix Madrigal HDF5 reader (v2 & v3)
r1208 self.data = self.fp['Data']
self.ranges = numpy.unique(self.data['Table Layout'][self.independentParam.lower()])
self.times = numpy.unique(self.data['Table Layout']['ut1_unix'])
self.counter_records = int(self.data['Table Layout']['recno'][0])
self.nrecords = int(self.data['Table Layout']['recno'][-1])
MADReader support for HDF5 (mad2 & mad3)
r1065 def setNextFile(self):
'''
'''
file_id = self.fileId
if file_id == len(self.fileList):
Madrigal 3 reading/writing task #1154
r1070 log.success('No more files', 'MADReader')
MADReader support for HDF5 (mad2 & mad3)
r1065 self.flagNoMoreFiles = 1
return 0
Madrigal 3 reading/writing task #1154
r1070 log.success(
'Opening: {}'.format(self.fileList[file_id]),
'MADReader'
)
MADReader support for HDF5 (mad2 & mad3)
r1065 filename = os.path.join(self.path, self.fileList[file_id])
if self.filename is not None:
self.fp.close()
self.filename = filename
self.filedate = self.dateFileList[file_id]
if self.ext=='.hdf5':
self.fp = h5py.File(self.filename, 'r')
else:
self.fp = open(self.filename, 'rb')
self.parseHeader()
self.parseData()
self.sizeOfFile = os.path.getsize(self.filename)
self.flagIsNewFile = 0
self.fileId += 1
return 1
def readNextBlock(self):
while True:
Madrigal 3 reading/writing task #1154
r1070 self.flagDiscontinuousBlock = 0
MADReader support for HDF5 (mad2 & mad3)
r1065 if self.flagIsNewFile:
if not self.setNextFile():
return 0
self.readBlock()
if (self.datatime < datetime.datetime.combine(self.startDate, self.startTime)) or \
(self.datatime > datetime.datetime.combine(self.endDate, self.endTime)):
Madrigal 3 reading/writing task #1154
r1070 log.warning(
'Reading Record No. {}/{} -> {} [Skipping]'.format(
self.counter_records,
self.nrecords,
self.datatime.ctime()),
'MADReader')
MADReader support for HDF5 (mad2 & mad3)
r1065 continue
break
Madrigal 3 reading/writing task #1154
r1070 log.log(
'Reading Record No. {}/{} -> {}'.format(
self.counter_records,
self.nrecords,
self.datatime.ctime()),
'MADReader')
MADReader support for HDF5 (mad2 & mad3)
r1065
return 1
def readBlock(self):
'''
'''
dum = []
if self.ext == '.txt':
dt = self.data[self.counter_records][:6].astype(int)
Juan C. Espinoza
Fix bugs in madrigal module
r1073 if datetime.datetime(dt[0], dt[1], dt[2], dt[3], dt[4], dt[5]).date() > self.datatime.date():
self.flagDiscontinuousBlock = 1
MADReader support for HDF5 (mad2 & mad3)
r1065 self.datatime = datetime.datetime(dt[0], dt[1], dt[2], dt[3], dt[4], dt[5])
while True:
dt = self.data[self.counter_records][:6].astype(int)
datatime = datetime.datetime(dt[0], dt[1], dt[2], dt[3], dt[4], dt[5])
if datatime == self.datatime:
dum.append(self.data[self.counter_records])
self.counter_records += 1
if self.counter_records == self.nrecords:
self.flagIsNewFile = True
break
continue
Juan C. Espinoza
Fix bugs in madrigal module
r1073 self.intervals.add((datatime-self.datatime).seconds)
MADReader support for HDF5 (mad2 & mad3)
r1065 break
elif self.ext == '.hdf5':
datatime = datetime.datetime.utcfromtimestamp(
Juan C. Espinoza
Fix Madrigal HDF5 reader (v2 & v3)
r1208 self.times[self.counter_records])
dum = self.data['Table Layout'][self.data['Table Layout']['recno']==self.counter_records]
MADReader support for HDF5 (mad2 & mad3)
r1065 self.intervals.add((datatime-self.datatime).seconds)
Madrigal 3 reading/writing task #1154
r1070 if datatime.date()>self.datatime.date():
self.flagDiscontinuousBlock = 1
MADReader support for HDF5 (mad2 & mad3)
r1065 self.datatime = datatime
self.counter_records += 1
if self.counter_records == self.nrecords:
self.flagIsNewFile = True
Madrigal 3 reading/writing task #1154
r1070 self.buffer = numpy.array(dum)
MADReader support for HDF5 (mad2 & mad3)
r1065 return
def set_output(self):
'''
Storing data from buffer to dataOut object
'''
parameters = [None for __ in self.parameters]
George Yong
Python 2to3, Spectra (all operations) working
r1167 for param, attr in list(self.oneDDict.items()):
MADReader support for HDF5 (mad2 & mad3)
r1065 x = self.parameters.index(param.lower())
setattr(self.dataOut, attr, self.buffer[0][x])
Madrigal 3 reading/writing task #1154
r1070
Juan C. Espinoza
Fix Madrigal HDF5 reader (v2 & v3)
r1208 for param, value in list(self.twoDDict.items()):
dummy = numpy.zeros(self.ranges.shape) + numpy.nan
MADReader support for HDF5 (mad2 & mad3)
r1065 if self.ext == '.txt':
Juan C. Espinoza
Fix Madrigal HDF5 reader (v2 & v3)
r1208 x = self.parameters.index(param.lower())
y = self.parameters.index(self.independentParam.lower())
MADReader support for HDF5 (mad2 & mad3)
r1065 ranges = self.buffer[:,y]
George Yong
Writing Unit for Madrigal decorated (just for python 2x)
r1206 #if self.ranges.size == ranges.size:
# continue
MADReader support for HDF5 (mad2 & mad3)
r1065 index = numpy.where(numpy.in1d(self.ranges, ranges))[0]
dummy[index] = self.buffer[:,x]
Juan C. Espinoza
Fix Madrigal HDF5 reader (v2 & v3)
r1208 else:
ranges = self.buffer[self.independentParam.lower()]
index = numpy.where(numpy.in1d(self.ranges, ranges))[0]
dummy[index] = self.buffer[param.lower()]
George Yong
Writing Unit for Madrigal decorated (just for python 2x)
r1206
MADReader support for HDF5 (mad2 & mad3)
r1065 if isinstance(value, str):
Juan C. Espinoza
Fix Madrigal HDF5 reader (v2 & v3)
r1208 if value not in self.independentParam:
MADReader support for HDF5 (mad2 & mad3)
r1065 setattr(self.dataOut, value, dummy.reshape(1,-1))
elif isinstance(value, list):
self.output[value[0]][value[1]] = dummy
parameters[value[1]] = param
George Yong
Python 2to3, Spectra (all operations) working
r1167 for key, value in list(self.output.items()):
MADReader support for HDF5 (mad2 & mad3)
r1065 setattr(self.dataOut, key, numpy.array(value))
Juan C. Espinoza
Fix Madrigal HDF5 reader (v2 & v3)
r1208
MADReader support for HDF5 (mad2 & mad3)
r1065 self.dataOut.parameters = [s for s in parameters if s]
self.dataOut.heightList = self.ranges
Juan C. Espinoza
Fix utc time in MAdrigal modules
r1086 self.dataOut.utctime = (self.datatime - datetime.datetime(1970, 1, 1)).total_seconds()
MADReader support for HDF5 (mad2 & mad3)
r1065 self.dataOut.utctimeInit = self.dataOut.utctime
self.dataOut.paramInterval = min(self.intervals)
self.dataOut.useLocalTime = False
Madrigal 3 reading/writing task #1154
r1070 self.dataOut.flagNoData = False
self.dataOut.nrecords = self.nrecords
self.dataOut.flagDiscontinuousBlock = self.flagDiscontinuousBlock
MADReader support for HDF5 (mad2 & mad3)
r1065
def getData(self):
'''
Storing data from databuffer to dataOut object
'''
if self.flagNoMoreFiles:
self.dataOut.flagNoData = True
Errors handling and gracefully terminate main process
r1241 raise schainpy.admin.SchainError('No file left to process')
MADReader support for HDF5 (mad2 & mad3)
r1065 return 0
if not self.readNextBlock():
self.dataOut.flagNoData = True
return 0
self.set_output()
return 1
Juan C. Espinoza
Operation MAD2Writer done Task #343
r1021
George Yong
Writing Unit for Madrigal decorated (just for python 2x)
r1206 @MPDecorator
Madrigal 3 reading/writing task #1154
r1070 class MADWriter(Operation):
MADReader support for HDF5 (mad2 & mad3)
r1065
Madrigal 3 reading/writing task #1154
r1070 missing = -32767
Juan C. Espinoza
BLTRParamreader ready
r1010
George Yong
Writing Unit for Madrigal decorated (just for python 2x)
r1206 def __init__(self):
Madrigal 3 reading/writing task #1154
r1070
George Yong
Writing Unit for Madrigal decorated (just for python 2x)
r1206 Operation.__init__(self)
Juan C. Espinoza
BLTRParamreader ready
r1010 self.dataOut = Parameters()
Juan C. Espinoza
Fix utc time in MAdrigal modules
r1086 self.counter = 0
Juan C. Espinoza
BLTRParamreader ready
r1010 self.path = None
Madrigal 3 reading/writing task #1154
r1070 self.fp = None
Juan C. Espinoza
Fix Madrigal HDF5 reader (v2 & v3)
r1208 def run(self, dataOut, path, oneDDict, independentParam='[]', twoDDict='{}',
Madrigal 3 reading/writing task #1154
r1070 metadata='{}', format='cedar', **kwargs):
Juan C. Espinoza
Operation MAD2Writer done Task #343
r1021 '''
Inputs:
path - path where files will be created
MADReader support for HDF5 (mad2 & mad3)
r1065 oneDDict - json of one-dimensional parameters in record where keys
Juan C. Espinoza
Operation MAD2Writer done Task #343
r1021 are Madrigal codes (integers or mnemonics) and values the corresponding
dataOut attribute e.g: {
'gdlatr': 'lat',
'gdlonr': 'lon',
'gdlat2':'lat',
'glon2':'lon'}
Juan C. Espinoza
Fix Madrigal HDF5 reader (v2 & v3)
r1208 independentParam - list of independent spatial two-dimensional parameters e.g:
['heigthList']
MADReader support for HDF5 (mad2 & mad3)
r1065 twoDDict - json of two-dimensional parameters in record where keys
Juan C. Espinoza
Operation MAD2Writer done Task #343
r1021 are Madrigal codes (integers or mnemonics) and values the corresponding
dataOut attribute if multidimensional array specify as tupple
('attr', pos) e.g: {
'gdalt': 'heightList',
'vn1p2': ('data_output', 0),
'vn2p2': ('data_output', 1),
'vn3': ('data_output', 2),
'snl': ('data_SNR', 'db')
}
metadata - json of madrigal metadata (kinst, kindat, catalog and header)
'''
if not self.isConfig:
Juan C. Espinoza
Fix Madrigal HDF5 reader (v2 & v3)
r1208 self.setup(path, oneDDict, independentParam, twoDDict, metadata, format, **kwargs)
Juan C. Espinoza
Operation MAD2Writer done Task #343
r1021 self.isConfig = True
Madrigal 3 reading/writing task #1154
r1070
self.dataOut = dataOut
Juan C. Espinoza
BLTRParamreader ready
r1010 self.putData()
George Yong
Writing Unit for Madrigal decorated (just for python 2x)
r1206 return 1
Juan C. Espinoza
BLTRParamreader ready
r1010
Juan C. Espinoza
Fix Madrigal HDF5 reader (v2 & v3)
r1208 def setup(self, path, oneDDict, independentParam, twoDDict, metadata, format, **kwargs):
Juan C. Espinoza
BLTRParamreader ready
r1010 '''
Juan C. Espinoza
Operation MAD2Writer done Task #343
r1021 Configure Operation
Juan C. Espinoza
BLTRParamreader ready
r1010 '''
Madrigal 3 reading/writing task #1154
r1070
Juan C. Espinoza
BLTRParamreader ready
r1010 self.path = path
Juan C. Espinoza
Operation MAD2Writer done Task #343
r1021 self.blocks = kwargs.get('blocks', None)
Madrigal 3 reading/writing task #1154
r1070 self.counter = 0
MADReader support for HDF5 (mad2 & mad3)
r1065 self.oneDDict = load_json(oneDDict)
self.twoDDict = load_json(twoDDict)
Juan C. Espinoza
Fix Madrigal HDF5 reader (v2 & v3)
r1208 self.independentParam = load_json(independentParam)
Juan C. Espinoza
Operation MAD2Writer done Task #343
r1021 meta = load_json(metadata)
self.kinst = meta.get('kinst')
self.kindat = meta.get('kindat')
self.catalog = meta.get('catalog', DEF_CATALOG)
self.header = meta.get('header', DEF_HEADER)
Madrigal 3 reading/writing task #1154
r1070 if format == 'cedar':
self.ext = '.dat'
self.extra_args = {}
elif format == 'hdf5':
self.ext = '.hdf5'
Juan C. Espinoza
Fix Madrigal HDF5 reader (v2 & v3)
r1208 self.extra_args = {'independentParam': self.independentParam}
Madrigal 3 reading/writing task #1154
r1070
self.keys = [k.lower() for k in self.twoDDict]
if 'range' in self.keys:
self.keys.remove('range')
if 'gdalt' in self.keys:
self.keys.remove('gdalt')
Juan C. Espinoza
Operation MAD2Writer done Task #343
r1021
Juan C. Espinoza
BLTRParamreader ready
r1010 def setFile(self):
'''
Juan C. Espinoza
Operation MAD2Writer done Task #343
r1021 Create new cedar file object
'''
self.mnemonic = MNEMONICS[self.kinst] #TODO get mnemonic from madrigal
Juan C. Espinoza
Fix utc time in MAdrigal modules
r1086 date = datetime.datetime.utcfromtimestamp(self.dataOut.utctime)
Juan C. Espinoza
Operation MAD2Writer done Task #343
r1021
Madrigal 3 reading/writing task #1154
r1070 filename = '{}{}{}'.format(self.mnemonic,
date.strftime('%Y%m%d_%H%M%S'),
Juan C. Espinoza
Fix utc time in MAdrigal modules
r1086 self.ext)
Juan C. Espinoza
BLTRParamreader ready
r1010
Juan C. Espinoza
Operation MAD2Writer done Task #343
r1021 self.fullname = os.path.join(self.path, filename)
George Yong
Reading Unit for Madrigal decorated (just for python2X)
r1189
Juan C. Espinoza
BLTRParamreader ready
r1010 if os.path.isfile(self.fullname) :
Madrigal 3 reading/writing task #1154
r1070 log.warning(
Juan C. Espinoza
Fix utc time in MAdrigal modules
r1086 'Destination file {} already exists, previous file deleted.'.format(
Madrigal 3 reading/writing task #1154
r1070 self.fullname),
'MADWriter')
Juan C. Espinoza
BLTRParamreader ready
r1010 os.remove(self.fullname)
try:
Madrigal 3 reading/writing task #1154
r1070 log.success(
'Creating file: {}'.format(self.fullname),
'MADWriter')
Juan C. Espinoza
Fix bugs in madrigal module
r1073 self.fp = madrigal.cedar.MadrigalCedarFile(self.fullname, True)
George Yong
Python 2to3, Spectra (all operations) working
r1167 except ValueError as e:
Madrigal 3 reading/writing task #1154
r1070 log.error(
'Impossible to create a cedar object with "madrigal.cedar.MadrigalCedarFile"',
'MADWriter')
Juan C. Espinoza
BLTRParamreader ready
r1010 return
Juan C. Espinoza
Fix bugs in madrigal module
r1073
return 1
Juan C. Espinoza
BLTRParamreader ready
r1010 def writeBlock(self):
'''
MADReader support for HDF5 (mad2 & mad3)
r1065 Add data records to cedar file taking data from oneDDict and twoDDict
Juan C. Espinoza
Operation MAD2Writer done Task #343
r1021 attributes.
Allowed parameters in: parcodes.tab
Juan C. Espinoza
BLTRParamreader ready
r1010 '''
Juan C. Espinoza
Fix utc time in MAdrigal modules
r1086 startTime = datetime.datetime.utcfromtimestamp(self.dataOut.utctime)
Juan C. Espinoza
Operation MAD2Writer done Task #343
r1021 endTime = startTime + datetime.timedelta(seconds=self.dataOut.paramInterval)
Madrigal 3 reading/writing task #1154
r1070 heights = self.dataOut.heightList
Juan C. Espinoza
Fix bugs in madrigal module
r1073
Madrigal 3 reading/writing task #1154
r1070 if self.ext == '.dat':
George Yong
Python 2to3, Spectra (all operations) working
r1167 for key, value in list(self.twoDDict.items()):
Juan C. Espinoza
Fix bugs in madrigal module
r1073 if isinstance(value, str):
data = getattr(self.dataOut, value)
invalid = numpy.isnan(data)
data[invalid] = self.missing
elif isinstance(value, (tuple, list)):
attr, key = value
data = getattr(self.dataOut, attr)
invalid = numpy.isnan(data)
data[invalid] = self.missing
out = {}
George Yong
Python 2to3, Spectra (all operations) working
r1167 for key, value in list(self.twoDDict.items()):
Madrigal 3 reading/writing task #1154
r1070 key = key.lower()
Juan C. Espinoza
Fix bugs in madrigal module
r1073 if isinstance(value, str):
Madrigal 3 reading/writing task #1154
r1070 if 'db' in value.lower():
tmp = getattr(self.dataOut, value.replace('_db', ''))
Juan C. Espinoza
Fix bugs in madrigal module
r1073 SNRavg = numpy.average(tmp, axis=0)
Madrigal 3 reading/writing task #1154
r1070 tmp = 10*numpy.log10(SNRavg)
else:
Juan C. Espinoza
Fix bugs in madrigal module
r1073 tmp = getattr(self.dataOut, value)
Madrigal 3 reading/writing task #1154
r1070 out[key] = tmp.flatten()
elif isinstance(value, (tuple, list)):
Juan C. Espinoza
Fix bugs in madrigal module
r1073 attr, x = value
Madrigal 3 reading/writing task #1154
r1070 data = getattr(self.dataOut, attr)
out[key] = data[int(x)]
George Yong
Reading Unit for Madrigal decorated (just for python2X)
r1189
Madrigal 3 reading/writing task #1154
r1070 a = numpy.array([out[k] for k in self.keys])
Juan C. Espinoza
Fix bugs in madrigal module
r1073 nrows = numpy.array([numpy.isnan(a[:, x]).all() for x in range(len(heights))])
Madrigal 3 reading/writing task #1154
r1070 index = numpy.where(nrows == False)[0]
Juan C. Espinoza
Fix bugs in madrigal module
r1073
Juan C. Espinoza
Operation MAD2Writer done Task #343
r1021 rec = madrigal.cedar.MadrigalDataRecord(
self.kinst,
self.kindat,
startTime.year,
startTime.month,
startTime.day,
startTime.hour,
startTime.minute,
startTime.second,
startTime.microsecond/10000,
endTime.year,
endTime.month,
endTime.day,
endTime.hour,
endTime.minute,
endTime.second,
endTime.microsecond/10000,
George Yong
Python 2to3, Spectra (all operations) working
r1167 list(self.oneDDict.keys()),
list(self.twoDDict.keys()),
Madrigal 3 reading/writing task #1154
r1070 len(index),
**self.extra_args
)
Juan C. Espinoza
Operation MAD2Writer done Task #343
r1021 # Setting 1d values
MADReader support for HDF5 (mad2 & mad3)
r1065 for key in self.oneDDict:
rec.set1D(key, getattr(self.dataOut, self.oneDDict[key]))
Juan C. Espinoza
BLTRParamreader ready
r1010
# Setting 2d values
Madrigal 3 reading/writing task #1154
r1070 nrec = 0
for n in index:
Juan C. Espinoza
Operation MAD2Writer done Task #343
r1021 for key in out:
Madrigal 3 reading/writing task #1154
r1070 rec.set2D(key, nrec, out[key][n])
nrec += 1
self.fp.append(rec)
if self.ext == '.hdf5' and self.counter % 500 == 0 and self.counter > 0:
self.fp.dump()
George Yong
Writing Unit for Madrigal decorated (just for python 2x)
r1206 if self.counter % 20 == 0 and self.counter > 0:
Madrigal 3 reading/writing task #1154
r1070 log.log(
'Writing {} records'.format(
self.counter),
'MADWriter')
Juan C. Espinoza
BLTRParamreader ready
r1010
def setHeader(self):
'''
Juan C. Espinoza
Operation MAD2Writer done Task #343
r1021 Create an add catalog and header to cedar file
Juan C. Espinoza
BLTRParamreader ready
r1010 '''
Madrigal 3 reading/writing task #1154
r1070 log.success('Closing file {}'.format(self.fullname), 'MADWriter')
if self.ext == '.dat':
self.fp.write()
else:
self.fp.dump()
self.fp.close()
Juan C. Espinoza
Operation MAD2Writer done Task #343
r1021 header = madrigal.cedar.CatalogHeaderCreator(self.fullname)
header.createCatalog(**self.catalog)
header.createHeader(**self.header)
header.write()
Juan C. Espinoza
BLTRParamreader ready
r1010
def putData(self):
if self.dataOut.flagNoData:
Madrigal 3 reading/writing task #1154
r1070 return 0
Juan C. Espinoza
BLTRParamreader ready
r1010
Madrigal 3 reading/writing task #1154
r1070 if self.dataOut.flagDiscontinuousBlock or self.counter == self.blocks:
Juan C. Espinoza
Fix bugs in madrigal module
r1073 if self.counter > 0:
Madrigal 3 reading/writing task #1154
r1070 self.setHeader()
self.counter = 0
Juan C. Espinoza
Operation MAD2Writer done Task #343
r1021 if self.counter == 0:
Juan C. Espinoza
Fix bugs in madrigal module
r1073 self.setFile()
Juan C. Espinoza
BLTRParamreader ready
r1010
Madrigal 3 reading/writing task #1154
r1070 self.writeBlock()
self.counter += 1
def close(self):
Juan C. Espinoza
BLTRParamreader ready
r1010
Madrigal 3 reading/writing task #1154
r1070 if self.counter > 0:
George Yong
Python 2to3, Spectra (all operations) working
r1167 self.setHeader()