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