@@ -1290,7 +1290,7 class JRODataReader(JRODataIO): | |||||
1290 | format=None, |
|
1290 | format=None, | |
1291 | oneDDict=None, |
|
1291 | oneDDict=None, | |
1292 | twoDDict=None, |
|
1292 | twoDDict=None, | |
1293 |
ind |
|
1293 | independentParam=None): | |
1294 | if server is not None: |
|
1294 | if server is not None: | |
1295 | if 'tcp://' in server: |
|
1295 | if 'tcp://' in server: | |
1296 | address = server |
|
1296 | address = server | |
@@ -1485,7 +1485,7 class JRODataReader(JRODataIO): | |||||
1485 | format=None, |
|
1485 | format=None, | |
1486 | oneDDict=None, |
|
1486 | oneDDict=None, | |
1487 | twoDDict=None, |
|
1487 | twoDDict=None, | |
1488 |
ind |
|
1488 | independentParam=None, **kwargs): | |
1489 |
|
1489 | |||
1490 | if not(self.isConfig): |
|
1490 | if not(self.isConfig): | |
1491 | self.setup(path=path, |
|
1491 | self.setup(path=path, | |
@@ -1512,7 +1512,7 class JRODataReader(JRODataIO): | |||||
1512 | format=format, |
|
1512 | format=format, | |
1513 | oneDDict=oneDDict, |
|
1513 | oneDDict=oneDDict, | |
1514 | twoDDict=twoDDict, |
|
1514 | twoDDict=twoDDict, | |
1515 |
ind |
|
1515 | independentParam=independentParam) | |
1516 | self.isConfig = True |
|
1516 | self.isConfig = True | |
1517 | if server is None: |
|
1517 | if server is None: | |
1518 | self.getData() |
|
1518 | self.getData() |
@@ -25,6 +25,11 except: | |||||
25 | 'You should install "madrigal library" module if you want to read/write Madrigal data' |
|
25 | 'You should install "madrigal library" module if you want to read/write Madrigal data' | |
26 | ) |
|
26 | ) | |
27 |
|
27 | |||
|
28 | try: | |||
|
29 | basestring | |||
|
30 | except: | |||
|
31 | basestring = str | |||
|
32 | ||||
28 | DEF_CATALOG = { |
|
33 | DEF_CATALOG = { | |
29 | 'principleInvestigator': 'Marco Milla', |
|
34 | 'principleInvestigator': 'Marco Milla', | |
30 | 'expPurpose': '', |
|
35 | 'expPurpose': '', | |
@@ -66,10 +71,10 def load_json(obj): | |||||
66 | iterable = obj |
|
71 | iterable = obj | |
67 |
|
72 | |||
68 | if isinstance(iterable, dict): |
|
73 | if isinstance(iterable, dict): | |
69 |
return {str(k): load_json(v) if isinstance(v, dict) else str(v) if isinstance(v, |
|
74 | return {str(k): load_json(v) if isinstance(v, dict) else str(v) if isinstance(v, basestring) else v | |
70 | for k, v in list(iterable.items())} |
|
75 | for k, v in list(iterable.items())} | |
71 | elif isinstance(iterable, (list, tuple)): |
|
76 | elif isinstance(iterable, (list, tuple)): | |
72 | return [str(v) if isinstance(v, str) else v for v in iterable] |
|
77 | return [str(v) if isinstance(v, basestring) else v for v in iterable] | |
73 |
|
78 | |||
74 | return iterable |
|
79 | return iterable | |
75 |
|
80 | |||
@@ -107,8 +112,8 class MADReader(JRODataReader, ProcessingUnit): | |||||
107 | "{\"GDLATR\":\"lat\", \"GDLONR\":\"lon\"}")) |
|
112 | "{\"GDLATR\":\"lat\", \"GDLONR\":\"lon\"}")) | |
108 | self.twoDDict = load_json(kwargs.get('twoDDict', |
|
113 | self.twoDDict = load_json(kwargs.get('twoDDict', | |
109 | "{\"GDALT\": \"heightList\"}")) |
|
114 | "{\"GDALT\": \"heightList\"}")) | |
110 | self.ind2DList = load_json(kwargs.get('ind2DList', |
|
115 | self.independentParam = 'GDALT' | |
111 | "[\"GDALT\"]")) |
|
116 | ||
112 | if self.path is None: |
|
117 | if self.path is None: | |
113 | raise ValueError('The path is not valid') |
|
118 | raise ValueError('The path is not valid') | |
114 |
|
119 | |||
@@ -139,7 +144,6 class MADReader(JRODataReader, ProcessingUnit): | |||||
139 | ''' |
|
144 | ''' | |
140 |
|
145 | |||
141 | log.log('Searching files {} in {} '.format(self.ext, path), 'MADReader') |
|
146 | log.log('Searching files {} in {} '.format(self.ext, path), 'MADReader') | |
142 | foldercounter = 0 |
|
|||
143 | fileList0 = glob.glob1(path, '*{}'.format(self.ext)) |
|
147 | fileList0 = glob.glob1(path, '*{}'.format(self.ext)) | |
144 | fileList0.sort() |
|
148 | fileList0.sort() | |
145 |
|
149 | |||
@@ -181,24 +185,18 class MADReader(JRODataReader, ProcessingUnit): | |||||
181 | self.version = '2' |
|
185 | self.version = '2' | |
182 | s_parameters = None |
|
186 | s_parameters = None | |
183 | if self.ext == '.txt': |
|
187 | if self.ext == '.txt': | |
184 | self.parameters = [s.strip().lower() for s in self.fp.readline().strip().split(' ') if s] |
|
188 | self.parameters = [s.strip().lower() for s in self.fp.readline().decode().strip().split(' ') if s] | |
185 | elif self.ext == '.hdf5': |
|
189 | elif self.ext == '.hdf5': | |
186 | metadata = self.fp['Metadata'] |
|
190 | self.metadata = self.fp['Metadata'] | |
187 | data = self.fp['Data']['Array Layout'] |
|
191 | if '_record_layout' in self.metadata: | |
188 | if 'Independent Spatial Parameters' in metadata: |
|
192 | s_parameters = [s[0].lower().decode() for s in self.metadata['Independent Spatial Parameters']] | |
189 | s_parameters = [s[0].lower() for s in metadata['Independent Spatial Parameters']] |
|
|||
190 | self.version = '3' |
|
193 | self.version = '3' | |
191 |
|
|
194 | self.parameters = [s[0].lower().decode() for s in self.metadata['Data Parameters']] | |
192 | one_d = [1 for s in one] |
|
|||
193 | two = [s[0].lower() for s in data['2D Parameters']['Data Parameters']] |
|
|||
194 | two_d = [2 for s in two] |
|
|||
195 | self.parameters = one + two |
|
|||
196 | self.parameters_d = one_d + two_d |
|
|||
197 |
|
195 | |||
198 | log.success('Parameters found: {}'.format(self.parameters), |
|
196 | log.success('Parameters found: {}'.format(self.parameters), | |
199 | 'MADReader') |
|
197 | 'MADReader') | |
200 | if s_parameters: |
|
198 | if s_parameters: | |
201 |
log.success('Spatial parameters: {}'.format( |
|
199 | log.success('Spatial parameters found: {}'.format(s_parameters), | |
202 | 'MADReader') |
|
200 | 'MADReader') | |
203 |
|
201 | |||
204 | for param in list(self.oneDDict.keys()): |
|
202 | for param in list(self.oneDDict.keys()): | |
@@ -220,7 +218,7 class MADReader(JRODataReader, ProcessingUnit): | |||||
220 | if isinstance(value, list): |
|
218 | if isinstance(value, list): | |
221 | if value[0] not in self.output: |
|
219 | if value[0] not in self.output: | |
222 | self.output[value[0]] = [] |
|
220 | self.output[value[0]] = [] | |
223 |
self.output[value[0]].append( |
|
221 | self.output[value[0]].append([]) | |
224 |
|
222 | |||
225 | def parseData(self): |
|
223 | def parseData(self): | |
226 | ''' |
|
224 | ''' | |
@@ -229,12 +227,15 class MADReader(JRODataReader, ProcessingUnit): | |||||
229 | if self.ext == '.txt': |
|
227 | if self.ext == '.txt': | |
230 | self.data = numpy.genfromtxt(self.fp, missing_values=('missing')) |
|
228 | self.data = numpy.genfromtxt(self.fp, missing_values=('missing')) | |
231 | self.nrecords = self.data.shape[0] |
|
229 | self.nrecords = self.data.shape[0] | |
232 |
self.ranges = numpy.unique(self.data[:,self.parameters.index(self.ind |
|
230 | self.ranges = numpy.unique(self.data[:,self.parameters.index(self.independentParam.lower())]) | |
|
231 | self.counter_records = 0 | |||
233 | elif self.ext == '.hdf5': |
|
232 | elif self.ext == '.hdf5': | |
234 |
self.data = self.fp['Data'] |
|
233 | self.data = self.fp['Data'] | |
235 | self.nrecords = len(self.data['timestamps'].value) |
|
234 | self.ranges = numpy.unique(self.data['Table Layout'][self.independentParam.lower()]) | |
236 |
self. |
|
235 | self.times = numpy.unique(self.data['Table Layout']['ut1_unix']) | |
237 |
|
236 | self.counter_records = int(self.data['Table Layout']['recno'][0]) | ||
|
237 | self.nrecords = int(self.data['Table Layout']['recno'][-1]) | |||
|
238 | ||||
238 | def setNextFile(self): |
|
239 | def setNextFile(self): | |
239 | ''' |
|
240 | ''' | |
240 | ''' |
|
241 | ''' | |
@@ -267,7 +268,6 class MADReader(JRODataReader, ProcessingUnit): | |||||
267 | self.parseHeader() |
|
268 | self.parseHeader() | |
268 | self.parseData() |
|
269 | self.parseData() | |
269 | self.sizeOfFile = os.path.getsize(self.filename) |
|
270 | self.sizeOfFile = os.path.getsize(self.filename) | |
270 | self.counter_records = 0 |
|
|||
271 | self.flagIsNewFile = 0 |
|
271 | self.flagIsNewFile = 0 | |
272 | self.fileId += 1 |
|
272 | self.fileId += 1 | |
273 |
|
273 | |||
@@ -326,17 +326,8 class MADReader(JRODataReader, ProcessingUnit): | |||||
326 | break |
|
326 | break | |
327 | elif self.ext == '.hdf5': |
|
327 | elif self.ext == '.hdf5': | |
328 | datatime = datetime.datetime.utcfromtimestamp( |
|
328 | datatime = datetime.datetime.utcfromtimestamp( | |
329 |
self. |
|
329 | self.times[self.counter_records]) | |
330 | nHeights = len(self.ranges) |
|
330 | dum = self.data['Table Layout'][self.data['Table Layout']['recno']==self.counter_records] | |
331 | for n, param in enumerate(self.parameters): |
|
|||
332 | if self.parameters_d[n] == 1: |
|
|||
333 | dum.append(numpy.ones(nHeights)*self.data['1D Parameters'][param][self.counter_records]) |
|
|||
334 | else: |
|
|||
335 | if self.version == '2': |
|
|||
336 | dum.append(self.data['2D Parameters'][param][self.counter_records]) |
|
|||
337 | else: |
|
|||
338 | tmp = self.data['2D Parameters'][param].value.T |
|
|||
339 | dum.append(tmp[self.counter_records]) |
|
|||
340 | self.intervals.add((datatime-self.datatime).seconds) |
|
331 | self.intervals.add((datatime-self.datatime).seconds) | |
341 | if datatime.date()>self.datatime.date(): |
|
332 | if datatime.date()>self.datatime.date(): | |
342 | self.flagDiscontinuousBlock = 1 |
|
333 | self.flagDiscontinuousBlock = 1 | |
@@ -359,29 +350,30 class MADReader(JRODataReader, ProcessingUnit): | |||||
359 | x = self.parameters.index(param.lower()) |
|
350 | x = self.parameters.index(param.lower()) | |
360 | setattr(self.dataOut, attr, self.buffer[0][x]) |
|
351 | setattr(self.dataOut, attr, self.buffer[0][x]) | |
361 |
|
352 | |||
362 |
for param, value in list(self.twoDDict.items()): |
|
353 | for param, value in list(self.twoDDict.items()): | |
363 | x = self.parameters.index(param.lower()) |
|
354 | dummy = numpy.zeros(self.ranges.shape) + numpy.nan | |
364 | if self.ext == '.txt': |
|
355 | if self.ext == '.txt': | |
365 |
|
|
356 | x = self.parameters.index(param.lower()) | |
|
357 | y = self.parameters.index(self.independentParam.lower()) | |||
366 | ranges = self.buffer[:,y] |
|
358 | ranges = self.buffer[:,y] | |
367 | #if self.ranges.size == ranges.size: |
|
359 | #if self.ranges.size == ranges.size: | |
368 | # continue |
|
360 | # continue | |
369 | index = numpy.where(numpy.in1d(self.ranges, ranges))[0] |
|
361 | index = numpy.where(numpy.in1d(self.ranges, ranges))[0] | |
370 | dummy = numpy.zeros(self.ranges.shape) + numpy.nan |
|
|||
371 | dummy[index] = self.buffer[:,x] |
|
362 | dummy[index] = self.buffer[:,x] | |
372 |
else: |
|
363 | else: | |
373 | dummy = self.buffer[x] |
|
364 | ranges = self.buffer[self.independentParam.lower()] | |
|
365 | index = numpy.where(numpy.in1d(self.ranges, ranges))[0] | |||
|
366 | dummy[index] = self.buffer[param.lower()] | |||
374 |
|
367 | |||
375 | if isinstance(value, str): |
|
368 | if isinstance(value, str): | |
376 |
if value not in self.ind |
|
369 | if value not in self.independentParam: | |
377 | setattr(self.dataOut, value, dummy.reshape(1,-1)) |
|
370 | setattr(self.dataOut, value, dummy.reshape(1,-1)) | |
378 | elif isinstance(value, list): |
|
371 | elif isinstance(value, list): | |
379 | self.output[value[0]][value[1]] = dummy |
|
372 | self.output[value[0]][value[1]] = dummy | |
380 | parameters[value[1]] = param |
|
373 | parameters[value[1]] = param | |
381 |
|
||||
382 | for key, value in list(self.output.items()): |
|
374 | for key, value in list(self.output.items()): | |
383 | setattr(self.dataOut, key, numpy.array(value)) |
|
375 | setattr(self.dataOut, key, numpy.array(value)) | |
384 |
|
376 | |||
385 | self.dataOut.parameters = [s for s in parameters if s] |
|
377 | self.dataOut.parameters = [s for s in parameters if s] | |
386 | self.dataOut.heightList = self.ranges |
|
378 | self.dataOut.heightList = self.ranges | |
387 | self.dataOut.utctime = (self.datatime - datetime.datetime(1970, 1, 1)).total_seconds() |
|
379 | self.dataOut.utctime = (self.datatime - datetime.datetime(1970, 1, 1)).total_seconds() | |
@@ -422,7 +414,7 class MADWriter(Operation): | |||||
422 | self.path = None |
|
414 | self.path = None | |
423 | self.fp = None |
|
415 | self.fp = None | |
424 |
|
416 | |||
425 |
def run(self, dataOut, path, oneDDict, ind |
|
417 | def run(self, dataOut, path, oneDDict, independentParam='[]', twoDDict='{}', | |
426 | metadata='{}', format='cedar', **kwargs): |
|
418 | metadata='{}', format='cedar', **kwargs): | |
427 | ''' |
|
419 | ''' | |
428 | Inputs: |
|
420 | Inputs: | |
@@ -434,8 +426,8 class MADWriter(Operation): | |||||
434 | 'gdlonr': 'lon', |
|
426 | 'gdlonr': 'lon', | |
435 | 'gdlat2':'lat', |
|
427 | 'gdlat2':'lat', | |
436 | 'glon2':'lon'} |
|
428 | 'glon2':'lon'} | |
437 |
ind |
|
429 | independentParam - list of independent spatial two-dimensional parameters e.g: | |
438 | ['heighList'] |
|
430 | ['heigthList'] | |
439 | twoDDict - json of two-dimensional parameters in record where keys |
|
431 | twoDDict - json of two-dimensional parameters in record where keys | |
440 | are Madrigal codes (integers or mnemonics) and values the corresponding |
|
432 | are Madrigal codes (integers or mnemonics) and values the corresponding | |
441 | dataOut attribute if multidimensional array specify as tupple |
|
433 | dataOut attribute if multidimensional array specify as tupple | |
@@ -449,14 +441,14 class MADWriter(Operation): | |||||
449 | metadata - json of madrigal metadata (kinst, kindat, catalog and header) |
|
441 | metadata - json of madrigal metadata (kinst, kindat, catalog and header) | |
450 | ''' |
|
442 | ''' | |
451 | if not self.isConfig: |
|
443 | if not self.isConfig: | |
452 |
self.setup(path, oneDDict, ind |
|
444 | self.setup(path, oneDDict, independentParam, twoDDict, metadata, format, **kwargs) | |
453 | self.isConfig = True |
|
445 | self.isConfig = True | |
454 |
|
446 | |||
455 | self.dataOut = dataOut |
|
447 | self.dataOut = dataOut | |
456 | self.putData() |
|
448 | self.putData() | |
457 | return 1 |
|
449 | return 1 | |
458 |
|
450 | |||
459 |
def setup(self, path, oneDDict, ind |
|
451 | def setup(self, path, oneDDict, independentParam, twoDDict, metadata, format, **kwargs): | |
460 | ''' |
|
452 | ''' | |
461 | Configure Operation |
|
453 | Configure Operation | |
462 | ''' |
|
454 | ''' | |
@@ -466,7 +458,7 class MADWriter(Operation): | |||||
466 | self.counter = 0 |
|
458 | self.counter = 0 | |
467 | self.oneDDict = load_json(oneDDict) |
|
459 | self.oneDDict = load_json(oneDDict) | |
468 | self.twoDDict = load_json(twoDDict) |
|
460 | self.twoDDict = load_json(twoDDict) | |
469 |
self.ind |
|
461 | self.independentParam = load_json(independentParam) | |
470 | meta = load_json(metadata) |
|
462 | meta = load_json(metadata) | |
471 | self.kinst = meta.get('kinst') |
|
463 | self.kinst = meta.get('kinst') | |
472 | self.kindat = meta.get('kindat') |
|
464 | self.kindat = meta.get('kindat') | |
@@ -477,7 +469,7 class MADWriter(Operation): | |||||
477 | self.extra_args = {} |
|
469 | self.extra_args = {} | |
478 | elif format == 'hdf5': |
|
470 | elif format == 'hdf5': | |
479 | self.ext = '.hdf5' |
|
471 | self.ext = '.hdf5' | |
480 |
self.extra_args = {'ind |
|
472 | self.extra_args = {'independentParam': self.independentParam} | |
481 |
|
473 | |||
482 | self.keys = [k.lower() for k in self.twoDDict] |
|
474 | self.keys = [k.lower() for k in self.twoDDict] | |
483 | if 'range' in self.keys: |
|
475 | if 'range' in self.keys: |
General Comments 0
You need to be logged in to leave comments.
Login now