##// END OF EJS Templates
Rewrite controller, remove MPDecorator to units (keep for plots an writers) use of queues for interproc comm instead of zmq, self operations are no longer supported
Rewrite controller, remove MPDecorator to units (keep for plots an writers) use of queues for interproc comm instead of zmq, self operations are no longer supported

File last commit:

r1287:af11e4aac00c
r1287:af11e4aac00c
Show More
jroIO_madrigal.py
594 lines | 19.9 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
Update ParamReader to support diferent HDF5 files, fix Read/Write Madrigal files
r1254 from schainpy.model.io.jroIO_base import LOCALTIME, Reader
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:
Juan C. Espinoza
Fix CLI and remove imports warnings
r1284 pass
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
Juan C. Espinoza
Rewrite controller, remove MPDecorator to units (keep for plots an writers) use of queues for interproc comm instead of zmq, self operations are no longer supported
r1287
Update ParamReader to support diferent HDF5 files, fix Read/Write Madrigal files
r1254 class MADReader(Reader, ProcessingUnit):
MADReader support for HDF5 (mad2 & mad3)
r1065
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.filename = None
self.intervals = set()
Update ParamReader to support diferent HDF5 files, fix Read/Write Madrigal files
r1254 self.datatime = datetime.datetime(1900,1,1)
self.format = None
self.filefmt = "***%Y%m%d*******"
MADReader support for HDF5 (mad2 & mad3)
r1065
Update ParamReader to support diferent HDF5 files, fix Read/Write Madrigal files
r1254 def setup(self, **kwargs):
Madrigal 3 reading/writing task #1154
r1070
Update ParamReader to support diferent HDF5 files, fix Read/Write Madrigal files
r1254 self.set_kwargs(**kwargs)
self.oneDDict = load_json(self.oneDDict)
self.twoDDict = load_json(self.twoDDict)
self.ind2DList = load_json(self.ind2DList)
self.independentParam = self.ind2DList[0]
Juan C. Espinoza
Fix Madrigal HDF5 reader (v2 & v3)
r1208
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
Update ParamReader to support diferent HDF5 files, fix Read/Write Madrigal files
r1254 self.open_file = open
self.open_mode = 'rb'
if self.format is None:
George Yong
Python 2to3, Spectra (all operations) working
r1167 raise ValueError('The format is not valid choose simple or hdf5')
Update ParamReader to support diferent HDF5 files, fix Read/Write Madrigal files
r1254 elif self.format.lower() in ('simple', 'txt'):
MADReader support for HDF5 (mad2 & mad3)
r1065 self.ext = '.txt'
Update ParamReader to support diferent HDF5 files, fix Read/Write Madrigal files
r1254 elif self.format.lower() in ('cedar',):
MADReader support for HDF5 (mad2 & mad3)
r1065 self.ext = '.001'
else:
self.ext = '.hdf5'
Update ParamReader to support diferent HDF5 files, fix Read/Write Madrigal files
r1254 self.open_file = h5py.File
self.open_mode = 'r'
MADReader support for HDF5 (mad2 & mad3)
r1065
Update ParamReader to support diferent HDF5 files, fix Read/Write Madrigal files
r1254 if self.online:
log.log("Searching files in online mode...", self.name)
MADReader support for HDF5 (mad2 & mad3)
r1065
Update ParamReader to support diferent HDF5 files, fix Read/Write Madrigal files
r1254 for nTries in range(self.nTries):
fullpath = self.searchFilesOnLine(self.path, self.startDate,
self.endDate, self.expLabel, self.ext, self.walk,
self.filefmt, self.folderfmt)
MADReader support for HDF5 (mad2 & mad3)
r1065
Update ParamReader to support diferent HDF5 files, fix Read/Write Madrigal files
r1254 try:
fullpath = next(fullpath)
except:
fullpath = None
if fullpath:
break
MADReader support for HDF5 (mad2 & mad3)
r1065
Update ParamReader to support diferent HDF5 files, fix Read/Write Madrigal files
r1254 log.warning(
'Waiting {} sec for a valid file in {}: try {} ...'.format(
self.delay, self.path, nTries + 1),
self.name)
time.sleep(self.delay)
if not(fullpath):
raise schainpy.admin.SchainError(
'There isn\'t any valid file in {}'.format(self.path))
else:
log.log("Searching files in {}".format(self.path), self.name)
self.filenameList = self.searchFilesOffLine(self.path, self.startDate,
self.endDate, self.expLabel, self.ext, self.walk, self.filefmt, self.folderfmt)
self.setNextFile()
MADReader support for HDF5 (mad2 & mad3)
r1065
Update ParamReader to support diferent HDF5 files, fix Read/Write Madrigal files
r1254 def readFirstHeader(self):
'''Read header and data'''
MADReader support for HDF5 (mad2 & mad3)
r1065
Update ParamReader to support diferent HDF5 files, fix Read/Write Madrigal files
r1254 self.parseHeader()
self.parseData()
self.blockIndex = 0
return
MADReader support for HDF5 (mad2 & mad3)
r1065
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 readNextBlock(self):
while True:
Madrigal 3 reading/writing task #1154
r1070 self.flagDiscontinuousBlock = 0
Update ParamReader to support diferent HDF5 files, fix Read/Write Madrigal files
r1254 if self.counter_records == self.nrecords:
self.setNextFile()
MADReader support for HDF5 (mad2 & mad3)
r1065
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:
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
Update ParamReader to support diferent HDF5 files, fix Read/Write Madrigal files
r1254 self.counter_records += 1
MADReader support for HDF5 (mad2 & mad3)
r1065
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 not self.readNextBlock():
self.dataOut.flagNoData = True
return 0
self.set_output()
return 1
Juan C. Espinoza
Operation MAD2Writer done Task #343
r1021
Update ParamReader to support diferent HDF5 files, fix Read/Write Madrigal files
r1254 def run(self, **kwargs):
if not(self.isConfig):
self.setup(**kwargs)
self.isConfig = True
self.getData()
return
George Yong
Writing Unit for Madrigal decorated (just for python 2x)
r1206 @MPDecorator
Madrigal 3 reading/writing task #1154
r1070 class MADWriter(Operation):
Update ParamReader to support diferent HDF5 files, fix Read/Write Madrigal files
r1254 '''Writing module for Madrigal files
type: external
Inputs:
path path where files will be created
oneDDict json of one-dimensional parameters in record where keys
are Madrigal codes (integers or mnemonics) and values the corresponding
dataOut attribute e.g: {
'gdlatr': 'lat',
'gdlonr': 'lon',
'gdlat2':'lat',
'glon2':'lon'}
ind2DList list of independent spatial two-dimensional parameters e.g:
['heigthList']
twoDDict json of two-dimensional parameters in record where keys
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)
format hdf5, cedar
blocks number of blocks per file'''
__attrs__ = ['path', 'oneDDict', 'ind2DList', 'twoDDict','metadata', 'format', 'blocks']
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
Update ParamReader to support diferent HDF5 files, fix Read/Write Madrigal files
r1254 def run(self, dataOut, path, oneDDict, ind2DList='[]', twoDDict='{}',
Madrigal 3 reading/writing task #1154
r1070 metadata='{}', format='cedar', **kwargs):
Update ParamReader to support diferent HDF5 files, fix Read/Write Madrigal files
r1254
Juan C. Espinoza
Operation MAD2Writer done Task #343
r1021 if not self.isConfig:
Update ParamReader to support diferent HDF5 files, fix Read/Write Madrigal files
r1254 self.setup(path, oneDDict, ind2DList, 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
Update ParamReader to support diferent HDF5 files, fix Read/Write Madrigal files
r1254 def setup(self, path, oneDDict, ind2DList, 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)
Update ParamReader to support diferent HDF5 files, fix Read/Write Madrigal files
r1254 self.ind2DList = load_json(ind2DList)
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'
Update ParamReader to support diferent HDF5 files, fix Read/Write Madrigal files
r1254 self.extra_args = {'ind2DList': self.ind2DList}
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')
Update ParamReader to support diferent HDF5 files, fix Read/Write Madrigal files
r1254 if not os.path.exists(self.path):
os.makedirs(self.path)
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)
Update ParamReader to support diferent HDF5 files, fix Read/Write Madrigal files
r1254 out[key] = tmp.flatten()[:len(heights)]
Madrigal 3 reading/writing task #1154
r1070 elif isinstance(value, (tuple, list)):
Juan C. Espinoza
Fix bugs in madrigal module
r1073 attr, x = value
Update ParamReader to support diferent HDF5 files, fix Read/Write Madrigal files
r1254 data = getattr(self.dataOut, attr)
out[key] = data[int(x)][:len(heights)]
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()