##// END OF EJS Templates
Separación de datos antes del 17 de Julio del 2021, donde se modificó los apuntes y la lectura de estos
joabAM -
r1371:603b419b2641
parent child
Show More
@@ -0,0 +1,1
1 <Project description="AMISR EEJ Experiment" id="11" name="Process (eej_proc)"><ReadUnit id="111" inputId="None" name="AMISRReader"><Parameter name="path" value="/media/soporte/UARS_4T_D02/AMISR_DATA/2021/" /><Parameter name="startDate" value="2021/07/11" /><Parameter name="endDate" value="2021/07/11" /><Parameter name="startTime" value="07:01:30" /><Parameter name="endTime" value="19:00:00" /><Parameter name="walk" value="1" /><Parameter name="code" value="(1, -1, -1, -1, 1, 1, 1, 1, -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, 1, -1, 1, 1, -1, 1)" /><Parameter name="nCode" value="1" /><Parameter name="nBaud" value="28" /><Parameter name="timezone" value="ut" /><Parameter name="online" value="0" /></ReadUnit><ProcUnit id="112" inputId="111" name="VoltageProc"><Operation id="1121" name="setAttribute"><Parameter name="frequency" value="445090000.0" /></Operation><Operation id="1122" name="Decoder"><Parameter name="code" value="(1, -1, -1, -1, 1, 1, 1, 1, -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, 1, -1, 1, 1, -1, 1)" /><Parameter name="nCode" value="1" /><Parameter name="nBaud" value="28" /><Parameter name="osamp" value="1" /></Operation></ProcUnit><ProcUnit id="113" inputId="112" name="SpectraProc"><Parameter name="nFFTPoints" value="16" /><Operation id="1131" name="IncohInt"><Parameter name="n" value="150" /></Operation><Operation id="1132" name="removeDC" /><Operation id="1133" name="SpectraPlot"><Parameter name="id" value="21" /><Parameter name="xaxis" value="velocity" /><Parameter name="ymax" value="300" /><Parameter name="showprofile" value="1" /><Parameter name="wintitle" value="AMISR Beam 0" /><Parameter name="zmin" value="45" /><Parameter name="zmax" value="65" /><Parameter name="save" value="/home/soporte/Data/EEJ/EEJ2021192/plots" /><Parameter name="colormap" value="jet" /><Parameter name="localtime" value="0" /><Parameter name="show" value="1" /></Operation><Operation id="1134" name="SpectraWriter"><Parameter name="path" value="/home/soporte/Data/EEJ/EEJ2021192" /><Parameter name="blocksPerFile" value="10" /></Operation><Operation id="1135" name="NoisePlot"><Parameter name="id" value="3" /><Parameter name="wintitle" value="title0" /><Parameter name="showprofile" value="0" /><Parameter name="xmin" value="07" /><Parameter name="xmax" value="18" /><Parameter name="ymin" value="45" /><Parameter name="ymax" value="65" /><Parameter name="save" value="/home/soporte/Data/EEJ/EEJ2021192" /><Parameter name="localtime" value="0" /><Parameter name="show" value="0" /></Operation><Operation id="1136" name="RTIPlot"><Parameter name="id" value="2" /><Parameter name="localtime" value="0" /><Parameter name="wintitle" value="RTI" /><Parameter name="xmin" value="07" /><Parameter name="xmax" value="18" /><Parameter name="ymin" value="0" /><Parameter name="zmin" value="45" /><Parameter name="zmax" value="65" /><Parameter name="showprofile" value="0" /><Parameter name="save" value="/home/soporte/Data/EEJ/EEJ2021192/plots" /><Parameter name="colormap" value="jet" /><Parameter name="show" value="1" /></Operation></ProcUnit><ProcUnit id="114" inputId="113" name="ParametersProc"><Operation id="1141" name="SpectralMoments" /><Operation id="1142" name="ParamWriter"><Parameter name="path" value="/home/soporte/Data/EEJ/EEJ2021192" /><Parameter name="blocksPerFile" value="10" /><Parameter name="metadataList" value="['type', 'inputUnit', 'heightList']" /><Parameter name="dataList" value="['moments', 'data_SNR', 'utctime']" /><Parameter name="mode" value="1" /></Operation></ProcUnit></Project> No newline at end of file
@@ -1,918 +1,659
1 # Copyright (c) 2012-2020 Jicamarca Radio Observatory
1 # Copyright (c) 2012-2020 Jicamarca Radio Observatory
2 # All rights reserved.
2 # All rights reserved.
3 #
3 #
4 # Distributed under the terms of the BSD 3-clause license.
4 # Distributed under the terms of the BSD 3-clause license.
5 """API to create signal chain projects
5 """API to create signal chain projects
6
6
7 The API is provide through class: Project
7 The API is provide through class: Project
8 """
8 """
9
9
10 import re
10 import re
11 import sys
11 import sys
12 import ast
12 import ast
13 import datetime
13 import datetime
14 import traceback
14 import traceback
15 import time
15 import time
16 import multiprocessing
16 import multiprocessing
17 from multiprocessing import Process, Queue
17 from multiprocessing import Process, Queue
18 from threading import Thread
18 from threading import Thread
19 from xml.etree.ElementTree import ElementTree, Element, SubElement
19 from xml.etree.ElementTree import ElementTree, Element, SubElement
20
20
21 from schainpy.admin import Alarm, SchainWarning
21 from schainpy.admin import Alarm, SchainWarning
22 from schainpy.model import *
22 from schainpy.model import *
23 from schainpy.utils import log
23 from schainpy.utils import log
24
24
25 if 'darwin' in sys.platform and sys.version_info[0] == 3 and sys.version_info[1] > 7:
25 if 'darwin' in sys.platform and sys.version_info[0] == 3 and sys.version_info[1] > 7:
26 multiprocessing.set_start_method('fork')
26 multiprocessing.set_start_method('fork')
27
27
28 DTYPES = {
28 class ConfBase():
29 'Voltage': '.r',
30 'Spectra': '.pdata'
31 }
32
33
34 def MPProject(project, n=cpu_count()):
35 '''
36 Project wrapper to run schain in n processes
37 '''
38
39 rconf = project.getReadUnitObj()
40 op = rconf.getOperationObj('run')
41 dt1 = op.getParameterValue('startDate')
42 dt2 = op.getParameterValue('endDate')
43 tm1 = op.getParameterValue('startTime')
44 tm2 = op.getParameterValue('endTime')
45 days = (dt2 - dt1).days
46
47 for day in range(days + 1):
48 skip = 0
49 cursor = 0
50 processes = []
51 dt = dt1 + datetime.timedelta(day)
52 dt_str = dt.strftime('%Y/%m/%d')
53 reader = JRODataReader()
54 paths, files = reader.searchFilesOffLine(path=rconf.path,
55 startDate=dt,
56 endDate=dt,
57 startTime=tm1,
58 endTime=tm2,
59 ext=DTYPES[rconf.datatype])
60 nFiles = len(files)
61 if nFiles == 0:
62 continue
63 skip = int(math.ceil(nFiles / n))
64 while nFiles > cursor * skip:
65 rconf.update(startDate=dt_str, endDate=dt_str, cursor=cursor,
66 skip=skip)
67 p = project.clone()
68 p.start()
69 processes.append(p)
70 cursor += 1
71
72 def beforeExit(exctype, value, trace):
73 for process in processes:
74 process.terminate()
75 process.join()
76 print(traceback.print_tb(trace))
77
78 sys.excepthook = beforeExit
79
80 for process in processes:
81 process.join()
82 process.terminate()
83
84 time.sleep(3)
85
86 def wait(context):
87
88 time.sleep(1)
89 c = zmq.Context()
90 receiver = c.socket(zmq.SUB)
91 receiver.connect('ipc:///tmp/schain_{}_pub'.format(self.id))
92 receiver.setsockopt(zmq.SUBSCRIBE, self.id.encode())
93 msg = receiver.recv_multipart()[1]
94 context.terminate()
95
96 class ParameterConf():
97
98 id = None
99 name = None
100 value = None
101 format = None
102
103 __formated_value = None
104
105 ELEMENTNAME = 'Parameter'
106
107 def __init__(self):
108
109 self.format = 'str'
110
111 def getElementName(self):
112
113 return self.ELEMENTNAME
114
115 def getValue(self):
116
117 value = self.value
118 format = self.format
119
120 if self.__formated_value != None:
121
122 return self.__formated_value
123
124 if format == 'obj':
125 return value
126
127 if format == 'str':
128 self.__formated_value = str(value)
129 return self.__formated_value
130
131 if value == '':
132 raise ValueError('%s: This parameter value is empty' % self.name)
133
134 if format == 'list':
135 strList = [s.strip() for s in value.split(',')]
136 self.__formated_value = strList
137
138 return self.__formated_value
139
140 if format == 'intlist':
141 '''
142 Example:
143 value = (0,1,2)
144 '''
145
146 new_value = ast.literal_eval(value)
147
148 if type(new_value) not in (tuple, list):
149 new_value = [int(new_value)]
150
151 self.__formated_value = new_value
152
153 return self.__formated_value
154
155 if format == 'floatlist':
156 '''
157 Example:
158 value = (0.5, 1.4, 2.7)
159 '''
160
161 new_value = ast.literal_eval(value)
162
163 if type(new_value) not in (tuple, list):
164 new_value = [float(new_value)]
165
166 self.__formated_value = new_value
167
168 return self.__formated_value
169
170 if format == 'date':
171 strList = value.split('/')
172 intList = [int(x) for x in strList]
173 date = datetime.date(intList[0], intList[1], intList[2])
174
175 self.__formated_value = date
176
177 return self.__formated_value
178
179 if format == 'time':
180 strList = value.split(':')
181 intList = [int(x) for x in strList]
182 time = datetime.time(intList[0], intList[1], intList[2])
183
184 self.__formated_value = time
185
186 return self.__formated_value
187
188 if format == 'pairslist':
189 '''
190 Example:
191 value = (0,1),(1,2)
192 '''
193
194 new_value = ast.literal_eval(value)
195
196 if type(new_value) not in (tuple, list):
197 raise ValueError('%s has to be a tuple or list of pairs' % value)
198
199 if type(new_value[0]) not in (tuple, list):
200 if len(new_value) != 2:
201 raise ValueError('%s has to be a tuple or list of pairs' % value)
202 new_value = [new_value]
203
204 for thisPair in new_value:
205 if len(thisPair) != 2:
206 raise ValueError('%s has to be a tuple or list of pairs' % value)
207
208 self.__formated_value = new_value
209
210 return self.__formated_value
211
212 if format == 'multilist':
213 '''
214 Example:
215 value = (0,1,2),(3,4,5)
216 '''
217 multiList = ast.literal_eval(value)
218
219 if type(multiList[0]) == int:
220 multiList = ast.literal_eval('(' + value + ')')
221
222 self.__formated_value = multiList
223
224 return self.__formated_value
225
226 if format == 'bool':
227 value = int(value)
228
229 if format == 'int':
230 value = float(value)
231
232 format_func = eval(format)
233
234 self.__formated_value = format_func(value)
235
236 return self.__formated_value
237
238 def updateId(self, new_id):
239
240 self.id = str(new_id)
241
242 def setup(self, id, name, value, format='str'):
243 self.id = str(id)
244 self.name = name
245 if format == 'obj':
246 self.value = value
247 else:
248 self.value = str(value)
249 self.format = str.lower(format)
250
251 self.getValue()
252
253 return 1
254
255 def update(self, name, value, format='str'):
256
257 self.name = name
258 self.value = str(value)
259 self.format = format
260
261 def makeXml(self, opElement):
262 if self.name not in ('queue',):
263 parmElement = SubElement(opElement, self.ELEMENTNAME)
264 parmElement.set('id', str(self.id))
265 parmElement.set('name', self.name)
266 parmElement.set('value', self.value)
267 parmElement.set('format', self.format)
268
269 def readXml(self, parmElement):
270
271 self.id = parmElement.get('id')
272 self.name = parmElement.get('name')
273 self.value = parmElement.get('value')
274 self.format = str.lower(parmElement.get('format'))
275
276 # Compatible with old signal chain version
277 if self.format == 'int' and self.name == 'idfigure':
278 self.name = 'id'
279
280 def printattr(self):
281
282 print('Parameter[%s]: name = %s, value = %s, format = %s, project_id = %s' % (self.id, self.name, self.value, self.format, self.project_id))
283
284 class OperationConf():
285
286 ELEMENTNAME = 'Operation'
287
29
288 def __init__(self):
30 def __init__(self):
289
31
290 self.id = '0'
32 self.id = '0'
291 self.name = None
33 self.name = None
292 self.priority = None
34 self.priority = None
293 self.parameters = {}
35 self.parameters = {}
294 self.object = None
36 self.object = None
295 self.operations = []
37 self.operations = []
296
38
297 def getId(self):
39 def getId(self):
298
40
299 return self.id
41 return self.id
300
42
301 def getNewId(self):
43 def getNewId(self):
302
44
303 return int(self.id) * 10 + len(self.operations) + 1
45 return int(self.id) * 10 + len(self.operations) + 1
304
46
305 def updateId(self, new_id):
47 def updateId(self, new_id):
306
48
307 self.id = str(new_id)
49 self.id = str(new_id)
308
50
309 n = 1
51 n = 1
310 for conf in self.operations:
52 for conf in self.operations:
311 conf_id = str(int(new_id) * 10 + n)
53 conf_id = str(int(new_id) * 10 + n)
312 conf.updateId(conf_id)
54 conf.updateId(conf_id)
313 n += 1
55 n += 1
314
56
315 def getKwargs(self):
57 def getKwargs(self):
316
58
317 params = {}
59 params = {}
318
60
319 for key, value in self.parameters.items():
61 for key, value in self.parameters.items():
320 if value not in (None, '', ' '):
62 if value not in (None, '', ' '):
321 params[key] = value
63 params[key] = value
322
64
323 return params
65 return params
324
66
325 def update(self, **kwargs):
67 def update(self, **kwargs):
326
68
327 for key, value in kwargs.items():
69 for key, value in kwargs.items():
328 self.addParameter(name=key, value=value)
70 self.addParameter(name=key, value=value)
329
71
330 def addParameter(self, name, value, format=None):
72 def addParameter(self, name, value, format=None):
331 '''
73 '''
332 '''
74 '''
333
75
334 if isinstance(value, str) and re.search(r'(\d+/\d+/\d+)', value):
76 if isinstance(value, str) and re.search(r'(\d+/\d+/\d+)', value):
335 self.parameters[name] = datetime.date(*[int(x) for x in value.split('/')])
77 self.parameters[name] = datetime.date(*[int(x) for x in value.split('/')])
336 elif isinstance(value, str) and re.search(r'(\d+:\d+:\d+)', value):
78 elif isinstance(value, str) and re.search(r'(\d+:\d+:\d+)', value):
337 self.parameters[name] = datetime.time(*[int(x) for x in value.split(':')])
79 self.parameters[name] = datetime.time(*[int(x) for x in value.split(':')])
338 else:
80 else:
339 try:
81 try:
340 self.parameters[name] = ast.literal_eval(value)
82 self.parameters[name] = ast.literal_eval(value)
341 except:
83 except:
342 if isinstance(value, str) and ',' in value:
84 if isinstance(value, str) and ',' in value:
343 self.parameters[name] = value.split(',')
85 self.parameters[name] = value.split(',')
344 else:
86 else:
345 self.parameters[name] = value
87 self.parameters[name] = value
346
88
347 def getParameters(self):
89 def getParameters(self):
348
90
349 params = {}
91 params = {}
350 for key, value in self.parameters.items():
92 for key, value in self.parameters.items():
351 s = type(value).__name__
93 s = type(value).__name__
352 if s == 'date':
94 if s == 'date':
353 params[key] = value.strftime('%Y/%m/%d')
95 params[key] = value.strftime('%Y/%m/%d')
354 elif s == 'time':
96 elif s == 'time':
355 params[key] = value.strftime('%H:%M:%S')
97 params[key] = value.strftime('%H:%M:%S')
356 else:
98 else:
357 params[key] = str(value)
99 params[key] = str(value)
358
100
359 return params
101 return params
360
102
361 def makeXml(self, element):
103 def makeXml(self, element):
362
104
363 xml = SubElement(element, self.ELEMENTNAME)
105 xml = SubElement(element, self.ELEMENTNAME)
364 for label in self.xml_labels:
106 for label in self.xml_labels:
365 xml.set(label, str(getattr(self, label)))
107 xml.set(label, str(getattr(self, label)))
366
108
367 for key, value in self.getParameters().items():
109 for key, value in self.getParameters().items():
368 xml_param = SubElement(xml, 'Parameter')
110 xml_param = SubElement(xml, 'Parameter')
369 xml_param.set('name', key)
111 xml_param.set('name', key)
370 xml_param.set('value', value)
112 xml_param.set('value', value)
371
113
372 for conf in self.operations:
114 for conf in self.operations:
373 conf.makeXml(xml)
115 conf.makeXml(xml)
374
116
375 def __str__(self):
117 def __str__(self):
376
118
377 if self.ELEMENTNAME == 'Operation':
119 if self.ELEMENTNAME == 'Operation':
378 s = ' {}[id={}]\n'.format(self.name, self.id)
120 s = ' {}[id={}]\n'.format(self.name, self.id)
379 else:
121 else:
380 s = '{}[id={}, inputId={}]\n'.format(self.name, self.id, self.inputId)
122 s = '{}[id={}, inputId={}]\n'.format(self.name, self.id, self.inputId)
381
123
382 for key, value in self.parameters.items():
124 for key, value in self.parameters.items():
383 if self.ELEMENTNAME == 'Operation':
125 if self.ELEMENTNAME == 'Operation':
384 s += ' {}: {}\n'.format(key, value)
126 s += ' {}: {}\n'.format(key, value)
385 else:
127 else:
386 s += ' {}: {}\n'.format(key, value)
128 s += ' {}: {}\n'.format(key, value)
387
129
388 for conf in self.operations:
130 for conf in self.operations:
389 s += str(conf)
131 s += str(conf)
390
132
391 return s
133 return s
392
134
393 class OperationConf(ConfBase):
135 class OperationConf(ConfBase):
394
136
395 ELEMENTNAME = 'Operation'
137 ELEMENTNAME = 'Operation'
396 xml_labels = ['id', 'name']
138 xml_labels = ['id', 'name']
397
139
398 def setup(self, id, name, priority, project_id, err_queue):
140 def setup(self, id, name, priority, project_id, err_queue):
399
141
400 self.id = str(id)
142 self.id = str(id)
401 self.project_id = project_id
143 self.project_id = project_id
402 self.name = name
144 self.name = name
403 self.type = 'other'
145 self.type = 'other'
404 self.err_queue = err_queue
146 self.err_queue = err_queue
405
147
406 def readXml(self, element, project_id, err_queue):
148 def readXml(self, element, project_id, err_queue):
407
149
408 self.id = element.get('id')
150 self.id = element.get('id')
409 self.name = element.get('name')
151 self.name = element.get('name')
410 self.type = 'other'
152 self.type = 'other'
411 self.project_id = str(project_id)
153 self.project_id = str(project_id)
412 self.err_queue = err_queue
154 self.err_queue = err_queue
413
155
414 for elm in element.iter('Parameter'):
156 for elm in element.iter('Parameter'):
415 self.addParameter(elm.get('name'), elm.get('value'))
157 self.addParameter(elm.get('name'), elm.get('value'))
416
158
417 def createObject(self):
159 def createObject(self):
418
160
419 className = eval(self.name)
161 className = eval(self.name)
420
162
421 if 'Plot' in self.name or 'Writer' in self.name or 'Send' in self.name or 'print' in self.name:
163 if 'Plot' in self.name or 'Writer' in self.name or 'Send' in self.name or 'print' in self.name:
422 kwargs = self.getKwargs()
164 kwargs = self.getKwargs()
423 opObj = className(self.id, self.id, self.project_id, self.err_queue, **kwargs)
165 opObj = className(self.id, self.id, self.project_id, self.err_queue, **kwargs)
424 opObj.start()
166 opObj.start()
425 self.type = 'external'
167 self.type = 'external'
426 else:
168 else:
427 opObj = className()
169 opObj = className()
428
170
429 self.object = opObj
171 self.object = opObj
430 return opObj
172 return opObj
431
173
432 class ProcUnitConf(ConfBase):
174 class ProcUnitConf(ConfBase):
433
175
434 ELEMENTNAME = 'ProcUnit'
176 ELEMENTNAME = 'ProcUnit'
435 xml_labels = ['id', 'inputId', 'name']
177 xml_labels = ['id', 'inputId', 'name']
436
178
437 def setup(self, project_id, id, name, datatype, inputId, err_queue):
179 def setup(self, project_id, id, name, datatype, inputId, err_queue):
438 '''
180 '''
439 '''
181 '''
440
182
441 if datatype == None and name == None:
183 if datatype == None and name == None:
442 raise ValueError('datatype or name should be defined')
184 raise ValueError('datatype or name should be defined')
443
185
444 if name == None:
186 if name == None:
445 if 'Proc' in datatype:
187 if 'Proc' in datatype:
446 name = datatype
188 name = datatype
447 else:
189 else:
448 name = '%sProc' % (datatype)
190 name = '%sProc' % (datatype)
449
191
450 if datatype == None:
192 if datatype == None:
451 datatype = name.replace('Proc', '')
193 datatype = name.replace('Proc', '')
452
194
453 self.id = str(id)
195 self.id = str(id)
454 self.project_id = project_id
196 self.project_id = project_id
455 self.name = name
197 self.name = name
456 self.datatype = datatype
198 self.datatype = datatype
457 self.inputId = inputId
199 self.inputId = inputId
458 self.err_queue = err_queue
200 self.err_queue = err_queue
459 self.operations = []
201 self.operations = []
460 self.parameters = {}
202 self.parameters = {}
461
203
462 def removeOperation(self, id):
204 def removeOperation(self, id):
463
205
464 i = [1 if x.id==id else 0 for x in self.operations]
206 i = [1 if x.id==id else 0 for x in self.operations]
465 self.operations.pop(i.index(1))
207 self.operations.pop(i.index(1))
466
208
467 def getOperation(self, id):
209 def getOperation(self, id):
468
210
469 for conf in self.operations:
211 for conf in self.operations:
470 if conf.id == id:
212 if conf.id == id:
471 return conf
213 return conf
472
214
473 def addOperation(self, name, optype='self'):
215 def addOperation(self, name, optype='self'):
474 '''
216 '''
475 '''
217 '''
476
218
477 id = self.getNewId()
219 id = self.getNewId()
478 conf = OperationConf()
220 conf = OperationConf()
479 conf.setup(id, name=name, priority='0', project_id=self.project_id, err_queue=self.err_queue)
221 conf.setup(id, name=name, priority='0', project_id=self.project_id, err_queue=self.err_queue)
480 self.operations.append(conf)
222 self.operations.append(conf)
481
223
482 return conf
224 return conf
483
225
484 def readXml(self, element, project_id, err_queue):
226 def readXml(self, element, project_id, err_queue):
485
227
486 self.id = element.get('id')
228 self.id = element.get('id')
487 self.name = element.get('name')
229 self.name = element.get('name')
488 self.inputId = None if element.get('inputId') == 'None' else element.get('inputId')
230 self.inputId = None if element.get('inputId') == 'None' else element.get('inputId')
489 self.datatype = element.get('datatype', self.name.replace(self.ELEMENTNAME.replace('Unit', ''), ''))
231 self.datatype = element.get('datatype', self.name.replace(self.ELEMENTNAME.replace('Unit', ''), ''))
490 self.project_id = str(project_id)
232 self.project_id = str(project_id)
491 self.err_queue = err_queue
233 self.err_queue = err_queue
492 self.operations = []
234 self.operations = []
493 self.parameters = {}
235 self.parameters = {}
494
236
495 for elm in element:
237 for elm in element:
496 if elm.tag == 'Parameter':
238 if elm.tag == 'Parameter':
497 self.addParameter(elm.get('name'), elm.get('value'))
239 self.addParameter(elm.get('name'), elm.get('value'))
498 elif elm.tag == 'Operation':
240 elif elm.tag == 'Operation':
499 conf = OperationConf()
241 conf = OperationConf()
500 conf.readXml(elm, project_id, err_queue)
242 conf.readXml(elm, project_id, err_queue)
501 self.operations.append(conf)
243 self.operations.append(conf)
502
244
503 def createObjects(self):
245 def createObjects(self):
504 '''
246 '''
505 Instancia de unidades de procesamiento.
247 Instancia de unidades de procesamiento.
506 '''
248 '''
507
249
508 className = eval(self.name)
250 className = eval(self.name)
509 #print(self.name)
510 kwargs = self.getKwargs()
251 kwargs = self.getKwargs()
511 procUnitObj = className()
252 procUnitObj = className()
512 procUnitObj.name = self.name
253 procUnitObj.name = self.name
513 log.success('creating process...', self.name)
254 log.success('creating process...', self.name)
514
255
515 for conf in self.operations:
256 for conf in self.operations:
516
257
517 opObj = conf.createObject()
258 opObj = conf.createObject()
518
259
519 log.success('adding operation: {}, type:{}'.format(
260 log.success('adding operation: {}, type:{}'.format(
520 conf.name,
261 conf.name,
521 conf.type), self.name)
262 conf.type), self.name)
522
263
523 procUnitObj.addOperation(conf, opObj)
264 procUnitObj.addOperation(conf, opObj)
524
265
525 self.object = procUnitObj
266 self.object = procUnitObj
526
267
527 def run(self):
268 def run(self):
528 '''
269 '''
529 '''
270 '''
530
271
531 return self.object.call(**self.getKwargs())
272 return self.object.call(**self.getKwargs())
532
273
533
274
534 class ReadUnitConf(ProcUnitConf):
275 class ReadUnitConf(ProcUnitConf):
535
276
536 ELEMENTNAME = 'ReadUnit'
277 ELEMENTNAME = 'ReadUnit'
537
278
538 def __init__(self):
279 def __init__(self):
539
280
540 self.id = None
281 self.id = None
541 self.datatype = None
282 self.datatype = None
542 self.name = None
283 self.name = None
543 self.inputId = None
284 self.inputId = None
544 self.operations = []
285 self.operations = []
545 self.parameters = {}
286 self.parameters = {}
546
287
547 def setup(self, project_id, id, name, datatype, err_queue, path='', startDate='', endDate='',
288 def setup(self, project_id, id, name, datatype, err_queue, path='', startDate='', endDate='',
548 startTime='', endTime='', server=None, **kwargs):
289 startTime='', endTime='', server=None, **kwargs):
549
290
550 if datatype == None and name == None:
291 if datatype == None and name == None:
551 raise ValueError('datatype or name should be defined')
292 raise ValueError('datatype or name should be defined')
552 if name == None:
293 if name == None:
553 if 'Reader' in datatype:
294 if 'Reader' in datatype:
554 name = datatype
295 name = datatype
555 datatype = name.replace('Reader','')
296 datatype = name.replace('Reader','')
556 else:
297 else:
557 name = '{}Reader'.format(datatype)
298 name = '{}Reader'.format(datatype)
558 if datatype == None:
299 if datatype == None:
559 if 'Reader' in name:
300 if 'Reader' in name:
560 datatype = name.replace('Reader','')
301 datatype = name.replace('Reader','')
561 else:
302 else:
562 datatype = name
303 datatype = name
563 name = '{}Reader'.format(name)
304 name = '{}Reader'.format(name)
564
305
565 self.id = id
306 self.id = id
566 self.project_id = project_id
307 self.project_id = project_id
567 self.name = name
308 self.name = name
568 self.datatype = datatype
309 self.datatype = datatype
569 self.err_queue = err_queue
310 self.err_queue = err_queue
570
311
571 self.addParameter(name='path', value=path)
312 self.addParameter(name='path', value=path)
572 self.addParameter(name='startDate', value=startDate)
313 self.addParameter(name='startDate', value=startDate)
573 self.addParameter(name='endDate', value=endDate)
314 self.addParameter(name='endDate', value=endDate)
574 self.addParameter(name='startTime', value=startTime)
315 self.addParameter(name='startTime', value=startTime)
575 self.addParameter(name='endTime', value=endTime)
316 self.addParameter(name='endTime', value=endTime)
576
317
577 for key, value in kwargs.items():
318 for key, value in kwargs.items():
578 self.addParameter(name=key, value=value)
319 self.addParameter(name=key, value=value)
579
320
580
321
581 class Project(Process):
322 class Project(Process):
582 """API to create signal chain projects"""
323 """API to create signal chain projects"""
583
324
584 ELEMENTNAME = 'Project'
325 ELEMENTNAME = 'Project'
585
326
586 def __init__(self, name=''):
327 def __init__(self, name=''):
587
328
588 Process.__init__(self)
329 Process.__init__(self)
589 self.id = '1'
330 self.id = '1'
590 if name:
331 if name:
591 self.name = '{} ({})'.format(Process.__name__, name)
332 self.name = '{} ({})'.format(Process.__name__, name)
592 self.filename = None
333 self.filename = None
593 self.description = None
334 self.description = None
594 self.email = None
335 self.email = None
595 self.alarm = []
336 self.alarm = []
596 self.configurations = {}
337 self.configurations = {}
597 # self.err_queue = Queue()
338 # self.err_queue = Queue()
598 self.err_queue = None
339 self.err_queue = None
599 self.started = False
340 self.started = False
600
341
601 def getNewId(self):
342 def getNewId(self):
602
343
603 idList = list(self.configurations.keys())
344 idList = list(self.configurations.keys())
604 id = int(self.id) * 10
345 id = int(self.id) * 10
605
346
606 while True:
347 while True:
607 id += 1
348 id += 1
608
349
609 if str(id) in idList:
350 if str(id) in idList:
610 continue
351 continue
611
352
612 break
353 break
613
354
614 return str(id)
355 return str(id)
615
356
616 def updateId(self, new_id):
357 def updateId(self, new_id):
617
358
618 self.id = str(new_id)
359 self.id = str(new_id)
619
360
620 keyList = list(self.configurations.keys())
361 keyList = list(self.configurations.keys())
621 keyList.sort()
362 keyList.sort()
622
363
623 n = 1
364 n = 1
624 new_confs = {}
365 new_confs = {}
625
366
626 for procKey in keyList:
367 for procKey in keyList:
627
368
628 conf = self.configurations[procKey]
369 conf = self.configurations[procKey]
629 idProcUnit = str(int(self.id) * 10 + n)
370 idProcUnit = str(int(self.id) * 10 + n)
630 conf.updateId(idProcUnit)
371 conf.updateId(idProcUnit)
631 new_confs[idProcUnit] = conf
372 new_confs[idProcUnit] = conf
632 n += 1
373 n += 1
633
374
634 self.configurations = new_confs
375 self.configurations = new_confs
635
376
636 def setup(self, id=1, name='', description='', email=None, alarm=[]):
377 def setup(self, id=1, name='', description='', email=None, alarm=[]):
637
378
638 self.id = str(id)
379 self.id = str(id)
639 self.description = description
380 self.description = description
640 self.email = email
381 self.email = email
641 self.alarm = alarm
382 self.alarm = alarm
642 if name:
383 if name:
643 self.name = '{} ({})'.format(Process.__name__, name)
384 self.name = '{} ({})'.format(Process.__name__, name)
644
385
645 def update(self, **kwargs):
386 def update(self, **kwargs):
646
387
647 for key, value in kwargs.items():
388 for key, value in kwargs.items():
648 setattr(self, key, value)
389 setattr(self, key, value)
649
390
650 def clone(self):
391 def clone(self):
651
392
652 p = Project()
393 p = Project()
653 p.id = self.id
394 p.id = self.id
654 p.name = self.name
395 p.name = self.name
655 p.description = self.description
396 p.description = self.description
656 p.configurations = self.configurations.copy()
397 p.configurations = self.configurations.copy()
657
398
658 return p
399 return p
659
400
660 def addReadUnit(self, id=None, datatype=None, name=None, **kwargs):
401 def addReadUnit(self, id=None, datatype=None, name=None, **kwargs):
661
402
662 '''
403 '''
663 '''
404 '''
664
405
665 if id is None:
406 if id is None:
666 idReadUnit = self.getNewId()
407 idReadUnit = self.getNewId()
667 else:
408 else:
668 idReadUnit = str(id)
409 idReadUnit = str(id)
669
410
670 conf = ReadUnitConf()
411 conf = ReadUnitConf()
671 conf.setup(self.id, idReadUnit, name, datatype, self.err_queue, **kwargs)
412 conf.setup(self.id, idReadUnit, name, datatype, self.err_queue, **kwargs)
672 self.configurations[conf.id] = conf
413 self.configurations[conf.id] = conf
673
414
674 return conf
415 return conf
675
416
676 def addProcUnit(self, id=None, inputId='0', datatype=None, name=None):
417 def addProcUnit(self, id=None, inputId='0', datatype=None, name=None):
677
418
678 '''
419 '''
679 '''
420 '''
680
421
681 if id is None:
422 if id is None:
682 idProcUnit = self.getNewId()
423 idProcUnit = self.getNewId()
683 else:
424 else:
684 idProcUnit = id
425 idProcUnit = id
685
426
686 conf = ProcUnitConf()
427 conf = ProcUnitConf()
687 conf.setup(self.id, idProcUnit, name, datatype, inputId, self.err_queue)
428 conf.setup(self.id, idProcUnit, name, datatype, inputId, self.err_queue)
688 self.configurations[conf.id] = conf
429 self.configurations[conf.id] = conf
689
430
690 return conf
431 return conf
691
432
692 def removeProcUnit(self, id):
433 def removeProcUnit(self, id):
693
434
694 if id in self.configurations:
435 if id in self.configurations:
695 self.configurations.pop(id)
436 self.configurations.pop(id)
696
437
697 def getReadUnit(self):
438 def getReadUnit(self):
698
439
699 for obj in list(self.configurations.values()):
440 for obj in list(self.configurations.values()):
700 if obj.ELEMENTNAME == 'ReadUnit':
441 if obj.ELEMENTNAME == 'ReadUnit':
701 return obj
442 return obj
702
443
703 return None
444 return None
704
445
705 def getProcUnit(self, id):
446 def getProcUnit(self, id):
706
447
707 return self.configurations[id]
448 return self.configurations[id]
708
449
709 def getUnits(self):
450 def getUnits(self):
710
451
711 keys = list(self.configurations)
452 keys = list(self.configurations)
712 keys.sort()
453 keys.sort()
713
454
714 for key in keys:
455 for key in keys:
715 yield self.configurations[key]
456 yield self.configurations[key]
716
457
717 def updateUnit(self, id, **kwargs):
458 def updateUnit(self, id, **kwargs):
718
459
719 conf = self.configurations[id].update(**kwargs)
460 conf = self.configurations[id].update(**kwargs)
720
461
721 def makeXml(self):
462 def makeXml(self):
722
463
723 xml = Element('Project')
464 xml = Element('Project')
724 xml.set('id', str(self.id))
465 xml.set('id', str(self.id))
725 xml.set('name', self.name)
466 xml.set('name', self.name)
726 xml.set('description', self.description)
467 xml.set('description', self.description)
727
468
728 for conf in self.configurations.values():
469 for conf in self.configurations.values():
729 conf.makeXml(xml)
470 conf.makeXml(xml)
730
471
731 self.xml = xml
472 self.xml = xml
732
473
733 def writeXml(self, filename=None):
474 def writeXml(self, filename=None):
734
475
735 if filename == None:
476 if filename == None:
736 if self.filename:
477 if self.filename:
737 filename = self.filename
478 filename = self.filename
738 else:
479 else:
739 filename = 'schain.xml'
480 filename = 'schain.xml'
740
481
741 if not filename:
482 if not filename:
742 print('filename has not been defined. Use setFilename(filename) for do it.')
483 print('filename has not been defined. Use setFilename(filename) for do it.')
743 return 0
484 return 0
744
485
745 abs_file = os.path.abspath(filename)
486 abs_file = os.path.abspath(filename)
746
487
747 if not os.access(os.path.dirname(abs_file), os.W_OK):
488 if not os.access(os.path.dirname(abs_file), os.W_OK):
748 print('No write permission on %s' % os.path.dirname(abs_file))
489 print('No write permission on %s' % os.path.dirname(abs_file))
749 return 0
490 return 0
750
491
751 if os.path.isfile(abs_file) and not(os.access(abs_file, os.W_OK)):
492 if os.path.isfile(abs_file) and not(os.access(abs_file, os.W_OK)):
752 print('File %s already exists and it could not be overwriten' % abs_file)
493 print('File %s already exists and it could not be overwriten' % abs_file)
753 return 0
494 return 0
754
495
755 self.makeXml()
496 self.makeXml()
756
497
757 ElementTree(self.xml).write(abs_file, method='xml')
498 ElementTree(self.xml).write(abs_file, method='xml')
758
499
759 self.filename = abs_file
500 self.filename = abs_file
760
501
761 return 1
502 return 1
762
503
763 def readXml(self, filename):
504 def readXml(self, filename):
764
505
765 abs_file = os.path.abspath(filename)
506 abs_file = os.path.abspath(filename)
766
507
767 self.configurations = {}
508 self.configurations = {}
768
509
769 try:
510 try:
770 self.xml = ElementTree().parse(abs_file)
511 self.xml = ElementTree().parse(abs_file)
771 except:
512 except:
772 log.error('Error reading %s, verify file format' % filename)
513 log.error('Error reading %s, verify file format' % filename)
773 return 0
514 return 0
774
515
775 self.id = self.xml.get('id')
516 self.id = self.xml.get('id')
776 self.name = self.xml.get('name')
517 self.name = self.xml.get('name')
777 self.description = self.xml.get('description')
518 self.description = self.xml.get('description')
778
519
779 for element in self.xml:
520 for element in self.xml:
780 if element.tag == 'ReadUnit':
521 if element.tag == 'ReadUnit':
781 conf = ReadUnitConf()
522 conf = ReadUnitConf()
782 conf.readXml(element, self.id, self.err_queue)
523 conf.readXml(element, self.id, self.err_queue)
783 self.configurations[conf.id] = conf
524 self.configurations[conf.id] = conf
784 elif element.tag == 'ProcUnit':
525 elif element.tag == 'ProcUnit':
785 conf = ProcUnitConf()
526 conf = ProcUnitConf()
786 input_proc = self.configurations[element.get('inputId')]
527 input_proc = self.configurations[element.get('inputId')]
787 conf.readXml(element, self.id, self.err_queue)
528 conf.readXml(element, self.id, self.err_queue)
788 self.configurations[conf.id] = conf
529 self.configurations[conf.id] = conf
789
530
790 self.filename = abs_file
531 self.filename = abs_file
791
532
792 return 1
533 return 1
793
534
794 def __str__(self):
535 def __str__(self):
795
536
796 text = '\nProject[id=%s, name=%s, description=%s]\n\n' % (
537 text = '\nProject[id=%s, name=%s, description=%s]\n\n' % (
797 self.id,
538 self.id,
798 self.name,
539 self.name,
799 self.description,
540 self.description,
800 )
541 )
801
542
802 for conf in self.configurations.values():
543 for conf in self.configurations.values():
803 text += '{}'.format(conf)
544 text += '{}'.format(conf)
804
545
805 return text
546 return text
806
547
807 def createObjects(self):
548 def createObjects(self):
808
549
809 keys = list(self.configurations.keys())
550 keys = list(self.configurations.keys())
810 keys.sort()
551 keys.sort()
811 for key in keys:
552 for key in keys:
812 conf = self.configurations[key]
553 conf = self.configurations[key]
813 conf.createObjects()
554 conf.createObjects()
814 if conf.inputId is not None:
555 if conf.inputId is not None:
815 conf.object.setInput(self.configurations[conf.inputId].object)
556 conf.object.setInput(self.configurations[conf.inputId].object)
816
557
817 def monitor(self):
558 def monitor(self):
818
559
819 t = Thread(target=self._monitor, args=(self.err_queue, self.ctx))
560 t = Thread(target=self._monitor, args=(self.err_queue, self.ctx))
820 t.start()
561 t.start()
821
562
822 def _monitor(self, queue, ctx):
563 def _monitor(self, queue, ctx):
823
564
824 import socket
565 import socket
825
566
826 procs = 0
567 procs = 0
827 err_msg = ''
568 err_msg = ''
828
569
829 while True:
570 while True:
830 msg = queue.get()
571 msg = queue.get()
831 if '#_start_#' in msg:
572 if '#_start_#' in msg:
832 procs += 1
573 procs += 1
833 elif '#_end_#' in msg:
574 elif '#_end_#' in msg:
834 procs -=1
575 procs -=1
835 else:
576 else:
836 err_msg = msg
577 err_msg = msg
837
578
838 if procs == 0 or 'Traceback' in err_msg:
579 if procs == 0 or 'Traceback' in err_msg:
839 break
580 break
840 time.sleep(0.1)
581 time.sleep(0.1)
841
582
842 if '|' in err_msg:
583 if '|' in err_msg:
843 name, err = err_msg.split('|')
584 name, err = err_msg.split('|')
844 if 'SchainWarning' in err:
585 if 'SchainWarning' in err:
845 log.warning(err.split('SchainWarning:')[-1].split('\n')[0].strip(), name)
586 log.warning(err.split('SchainWarning:')[-1].split('\n')[0].strip(), name)
846 elif 'SchainError' in err:
587 elif 'SchainError' in err:
847 log.error(err.split('SchainError:')[-1].split('\n')[0].strip(), name)
588 log.error(err.split('SchainError:')[-1].split('\n')[0].strip(), name)
848 else:
589 else:
849 log.error(err, name)
590 log.error(err, name)
850 else:
591 else:
851 name, err = self.name, err_msg
592 name, err = self.name, err_msg
852
593
853 time.sleep(1)
594 time.sleep(1)
854
595
855 ctx.term()
596 ctx.term()
856
597
857 message = ''.join(err)
598 message = ''.join(err)
858
599
859 if err_msg:
600 if err_msg:
860 subject = 'SChain v%s: Error running %s\n' % (
601 subject = 'SChain v%s: Error running %s\n' % (
861 schainpy.__version__, self.name)
602 schainpy.__version__, self.name)
862
603
863 subtitle = 'Hostname: %s\n' % socket.gethostbyname(
604 subtitle = 'Hostname: %s\n' % socket.gethostbyname(
864 socket.gethostname())
605 socket.gethostname())
865 subtitle += 'Working directory: %s\n' % os.path.abspath('./')
606 subtitle += 'Working directory: %s\n' % os.path.abspath('./')
866 subtitle += 'Configuration file: %s\n' % self.filename
607 subtitle += 'Configuration file: %s\n' % self.filename
867 subtitle += 'Time: %s\n' % str(datetime.datetime.now())
608 subtitle += 'Time: %s\n' % str(datetime.datetime.now())
868
609
869 readUnitConfObj = self.getReadUnit()
610 readUnitConfObj = self.getReadUnit()
870 if readUnitConfObj:
611 if readUnitConfObj:
871 subtitle += '\nInput parameters:\n'
612 subtitle += '\nInput parameters:\n'
872 subtitle += '[Data path = %s]\n' % readUnitConfObj.parameters['path']
613 subtitle += '[Data path = %s]\n' % readUnitConfObj.parameters['path']
873 subtitle += '[Start date = %s]\n' % readUnitConfObj.parameters['startDate']
614 subtitle += '[Start date = %s]\n' % readUnitConfObj.parameters['startDate']
874 subtitle += '[End date = %s]\n' % readUnitConfObj.parameters['endDate']
615 subtitle += '[End date = %s]\n' % readUnitConfObj.parameters['endDate']
875 subtitle += '[Start time = %s]\n' % readUnitConfObj.parameters['startTime']
616 subtitle += '[Start time = %s]\n' % readUnitConfObj.parameters['startTime']
876 subtitle += '[End time = %s]\n' % readUnitConfObj.parameters['endTime']
617 subtitle += '[End time = %s]\n' % readUnitConfObj.parameters['endTime']
877
618
878 a = Alarm(
619 a = Alarm(
879 modes=self.alarm,
620 modes=self.alarm,
880 email=self.email,
621 email=self.email,
881 message=message,
622 message=message,
882 subject=subject,
623 subject=subject,
883 subtitle=subtitle,
624 subtitle=subtitle,
884 filename=self.filename
625 filename=self.filename
885 )
626 )
886
627
887 a.start()
628 a.start()
888
629
889 def setFilename(self, filename):
630 def setFilename(self, filename):
890
631
891 self.filename = filename
632 self.filename = filename
892
633
893 def runProcs(self):
634 def runProcs(self):
894
635
895 err = False
636 err = False
896 n = len(self.configurations)
637 n = len(self.configurations)
897
638
898 while not err:
639 while not err:
899 for conf in self.getUnits():
640 for conf in self.getUnits():
900 ok = conf.run()
641 ok = conf.run()
901 if ok == 'Error':
642 if ok == 'Error':
902 n -= 1
643 n -= 1
903 continue
644 continue
904 elif not ok:
645 elif not ok:
905 break
646 break
906 if n == 0:
647 if n == 0:
907 err = True
648 err = True
908
649
909 def run(self):
650 def run(self):
910
651
911 log.success('\nStarting Project {} [id={}]'.format(self.name, self.id), tag='')
652 log.success('\nStarting Project {} [id={}]'.format(self.name, self.id), tag='')
912 self.started = True
653 self.started = True
913 self.start_time = time.time()
654 self.start_time = time.time()
914 self.createObjects()
655 self.createObjects()
915 self.runProcs()
656 self.runProcs()
916 log.success('{} Done (Time: {:4.2f}s)'.format(
657 log.success('{} Done (Time: {:4.2f}s)'.format(
917 self.name,
658 self.name,
918 time.time()-self.start_time), '')
659 time.time()-self.start_time), '')
@@ -1,656 +1,658
1 '''
1 '''
2 Created on Set 9, 2015
2 Created on Set 9, 2015
3
3
4 @author: roj-idl71 Karim Kuyeng
4 @author: roj-idl71 Karim Kuyeng
5 '''
5 '''
6
6
7 import os
7 import os
8 import sys
8 import sys
9 import glob
9 import glob
10 import fnmatch
10 import fnmatch
11 import datetime
11 import datetime
12 import time
12 import time
13 import re
13 import re
14 import h5py
14 import h5py
15 import numpy
15 import numpy
16
16
17 try:
17 try:
18 from gevent import sleep
18 from gevent import sleep
19 except:
19 except:
20 from time import sleep
20 from time import sleep
21
21
22 from schainpy.model.data.jroheaderIO import RadarControllerHeader, SystemHeader
22 from schainpy.model.data.jroheaderIO import RadarControllerHeader, SystemHeader
23 from schainpy.model.data.jrodata import Voltage
23 from schainpy.model.data.jrodata import Voltage
24 from schainpy.model.proc.jroproc_base import ProcessingUnit, Operation, MPDecorator
24 from schainpy.model.proc.jroproc_base import ProcessingUnit, Operation, MPDecorator
25 from numpy import imag
25 from numpy import imag
26
26
27 @MPDecorator
27
28 class AMISRReader(ProcessingUnit):
28 class AMISRReader(ProcessingUnit):
29 '''
29 '''
30 classdocs
30 classdocs
31 '''
31 '''
32
32
33 def __init__(self):
33 def __init__(self):
34 '''
34 '''
35 Constructor
35 Constructor
36 '''
36 '''
37
37
38 ProcessingUnit.__init__(self)
38 ProcessingUnit.__init__(self)
39
39
40 self.set = None
40 self.set = None
41 self.subset = None
41 self.subset = None
42 self.extension_file = '.h5'
42 self.extension_file = '.h5'
43 self.dtc_str = 'dtc'
43 self.dtc_str = 'dtc'
44 self.dtc_id = 0
44 self.dtc_id = 0
45 self.status = True
45 self.status = True
46 self.isConfig = False
46 self.isConfig = False
47 self.dirnameList = []
47 self.dirnameList = []
48 self.filenameList = []
48 self.filenameList = []
49 self.fileIndex = None
49 self.fileIndex = None
50 self.flagNoMoreFiles = False
50 self.flagNoMoreFiles = False
51 self.flagIsNewFile = 0
51 self.flagIsNewFile = 0
52 self.filename = ''
52 self.filename = ''
53 self.amisrFilePointer = None
53 self.amisrFilePointer = None
54 self.realBeamCode = []
54 self.realBeamCode = []
55
55
56 #self.dataset = None
56 #self.dataset = None
57
57
58
58
59
59
60
60
61 self.profileIndex = 0
61 self.profileIndex = 0
62
62
63
63
64 self.beamCodeByFrame = None
64 self.beamCodeByFrame = None
65 self.radacTimeByFrame = None
65 self.radacTimeByFrame = None
66
66
67 self.dataset = None
67 self.dataset = None
68
68
69
69
70
70
71
71
72 self.__firstFile = True
72 self.__firstFile = True
73
73
74 self.buffer = None
74 self.buffer = None
75
75
76
76
77 self.timezone = 'ut'
77 self.timezone = 'ut'
78
78
79 self.__waitForNewFile = 20
79 self.__waitForNewFile = 20
80 self.__filename_online = None
80 self.__filename_online = None
81 #Is really necessary create the output object in the initializer
81 #Is really necessary create the output object in the initializer
82 self.dataOut = Voltage()
82 self.dataOut = Voltage()
83 self.dataOut.error=False
83 self.dataOut.error=False
84
84
85
85 def setup(self,path=None,
86 def setup(self,path=None,
86 startDate=None,
87 startDate=None,
87 endDate=None,
88 endDate=None,
88 startTime=None,
89 startTime=None,
89 endTime=None,
90 endTime=None,
90 walk=True,
91 walk=True,
91 timezone='ut',
92 timezone='ut',
92 all=0,
93 all=0,
93 code = None,
94 code = None,
94 nCode = 0,
95 nCode = 0,
95 nBaud = 0,
96 nBaud = 0,
96 online=False):
97 online=False):
97
98
98 #print ("T",path)
99
99
100
100 self.timezone = timezone
101 self.timezone = timezone
101 self.all = all
102 self.all = all
102 self.online = online
103 self.online = online
103
104
104 self.code = code
105 self.code = code
105 self.nCode = int(nCode)
106 self.nCode = int(nCode)
106 self.nBaud = int(nBaud)
107 self.nBaud = int(nBaud)
107
108
108
109
109
110
110 #self.findFiles()
111 #self.findFiles()
111 if not(online):
112 if not(online):
112 #Busqueda de archivos offline
113 #Busqueda de archivos offline
113 self.searchFilesOffLine(path, startDate, endDate, startTime, endTime, walk)
114 self.searchFilesOffLine(path, startDate, endDate, startTime, endTime, walk)
114 else:
115 else:
115 self.searchFilesOnLine(path, startDate, endDate, startTime,endTime,walk)
116 self.searchFilesOnLine(path, startDate, endDate, startTime,endTime,walk)
116
117
117 if not(self.filenameList):
118 if not(self.filenameList):
118 print("There is no files into the folder: %s"%(path))
119 print("There is no files into the folder: %s"%(path))
119 sys.exit(-1)
120 sys.exit(-1)
120
121
121 self.fileIndex = -1
122 self.fileIndex = -1
122
123
123 self.readNextFile(online)
124 self.readNextFile(online)
124
125
125 '''
126 '''
126 Add code
127 Add code
127 '''
128 '''
128 self.isConfig = True
129 self.isConfig = True
129
130 # print("Setup Done")
130 pass
131 pass
131
132
132
133
133 def readAMISRHeader(self,fp):
134 def readAMISRHeader(self,fp):
134 header = 'Raw11/Data/RadacHeader'
135 header = 'Raw11/Data/RadacHeader'
135 self.beamCodeByPulse = fp.get(header+'/BeamCode') # LIST OF BEAMS PER PROFILE, TO BE USED ON REARRANGE
136 self.beamCodeByPulse = fp.get(header+'/BeamCode') # LIST OF BEAMS PER PROFILE, TO BE USED ON REARRANGE
137 if (self.startDate> datetime.date(2021, 7, 15)): #Se cambió la forma de extracción de Apuntes el 17
136 self.beamcodeFile = fp['Setup/Beamcodefile'][()].decode()
138 self.beamcodeFile = fp['Setup/Beamcodefile'][()].decode()
137 self.trueBeams = self.beamcodeFile.split("\n")
139 self.trueBeams = self.beamcodeFile.split("\n")
138 self.trueBeams.pop()#remove last
140 self.trueBeams.pop()#remove last
139 [self.realBeamCode.append(x) for x in self.trueBeams if x not in self.realBeamCode]
141 [self.realBeamCode.append(x) for x in self.trueBeams if x not in self.realBeamCode]
140 self.beamCode = [int(x, 16) for x in self.realBeamCode]
142 self.beamCode = [int(x, 16) for x in self.realBeamCode]
143 else:
144 _beamCode= fp.get('Raw11/Data/Beamcodes') #se usa la manera previa al cambio de apuntes
145 self.beamCode = _beamCode[0,:]
146
141
147
142 #self.beamCode = fp.get('Raw11/Data/Beamcodes') # NUMBER OF CHANNELS AND IDENTIFY POSITION TO CREATE A FILE WITH THAT INFO
143 #self.code = fp.get(header+'/Code') # NOT USE FOR THIS
148 #self.code = fp.get(header+'/Code') # NOT USE FOR THIS
144 self.frameCount = fp.get(header+'/FrameCount')# NOT USE FOR THIS
149 self.frameCount = fp.get(header+'/FrameCount')# NOT USE FOR THIS
145 self.modeGroup = fp.get(header+'/ModeGroup')# NOT USE FOR THIS
150 self.modeGroup = fp.get(header+'/ModeGroup')# NOT USE FOR THIS
146 self.nsamplesPulse = fp.get(header+'/NSamplesPulse')# TO GET NSA OR USING DATA FOR THAT
151 self.nsamplesPulse = fp.get(header+'/NSamplesPulse')# TO GET NSA OR USING DATA FOR THAT
147 self.pulseCount = fp.get(header+'/PulseCount')# NOT USE FOR THIS
152 self.pulseCount = fp.get(header+'/PulseCount')# NOT USE FOR THIS
148 self.radacTime = fp.get(header+'/RadacTime')# 1st TIME ON FILE ANDE CALCULATE THE REST WITH IPP*nindexprofile
153 self.radacTime = fp.get(header+'/RadacTime')# 1st TIME ON FILE ANDE CALCULATE THE REST WITH IPP*nindexprofile
149 self.timeCount = fp.get(header+'/TimeCount')# NOT USE FOR THIS
154 self.timeCount = fp.get(header+'/TimeCount')# NOT USE FOR THIS
150 self.timeStatus = fp.get(header+'/TimeStatus')# NOT USE FOR THIS
155 self.timeStatus = fp.get(header+'/TimeStatus')# NOT USE FOR THIS
151 self.rangeFromFile = fp.get('Raw11/Data/Samples/Range')
156 self.rangeFromFile = fp.get('Raw11/Data/Samples/Range')
152 self.frequency = fp.get('Rx/Frequency')
157 self.frequency = fp.get('Rx/Frequency')
153 txAus = fp.get('Raw11/Data/Pulsewidth')
158 txAus = fp.get('Raw11/Data/Pulsewidth')
154
159
155
160
156 self.nblocks = self.pulseCount.shape[0] #nblocks
161 self.nblocks = self.pulseCount.shape[0] #nblocks
157
162
158 self.nprofiles = self.pulseCount.shape[1] #nprofile
163 self.nprofiles = self.pulseCount.shape[1] #nprofile
159 self.nsa = self.nsamplesPulse[0,0] #ngates
164 self.nsa = self.nsamplesPulse[0,0] #ngates
160 self.nchannels = len(self.beamCode)
165 self.nchannels = len(self.beamCode)
161 self.ippSeconds = (self.radacTime[0][1] -self.radacTime[0][0]) #Ipp in seconds
166 self.ippSeconds = (self.radacTime[0][1] -self.radacTime[0][0]) #Ipp in seconds
162 #self.__waitForNewFile = self.nblocks # wait depending on the number of blocks since each block is 1 sec
167 #self.__waitForNewFile = self.nblocks # wait depending on the number of blocks since each block is 1 sec
163 self.__waitForNewFile = self.nblocks * self.nprofiles * self.ippSeconds # wait until new file is created
168 self.__waitForNewFile = self.nblocks * self.nprofiles * self.ippSeconds # wait until new file is created
164
169
165 #filling radar controller header parameters
170 #filling radar controller header parameters
166 self.__ippKm = self.ippSeconds *.15*1e6 # in km
171 self.__ippKm = self.ippSeconds *.15*1e6 # in km
167 self.__txA = (txAus.value)*.15 #(ipp[us]*.15km/1us) in km
172 self.__txA = (txAus.value)*.15 #(ipp[us]*.15km/1us) in km
168 self.__txB = 0
173 self.__txB = 0
169 nWindows=1
174 nWindows=1
170 self.__nSamples = self.nsa
175 self.__nSamples = self.nsa
171 self.__firstHeight = self.rangeFromFile[0][0]/1000 #in km
176 self.__firstHeight = self.rangeFromFile[0][0]/1000 #in km
172 self.__deltaHeight = (self.rangeFromFile[0][1] - self.rangeFromFile[0][0])/1000
177 self.__deltaHeight = (self.rangeFromFile[0][1] - self.rangeFromFile[0][0])/1000
173
178
174 #for now until understand why the code saved is different (code included even though code not in tuf file)
179 #for now until understand why the code saved is different (code included even though code not in tuf file)
175 #self.__codeType = 0
180 #self.__codeType = 0
176 # self.__nCode = None
181 # self.__nCode = None
177 # self.__nBaud = None
182 # self.__nBaud = None
178 self.__code = self.code
183 self.__code = self.code
179 self.__codeType = 0
184 self.__codeType = 0
180 if self.code != None:
185 if self.code != None:
181 self.__codeType = 1
186 self.__codeType = 1
182 self.__nCode = self.nCode
187 self.__nCode = self.nCode
183 self.__nBaud = self.nBaud
188 self.__nBaud = self.nBaud
184 #self.__code = 0
189 #self.__code = 0
185
190
186 #filling system header parameters
191 #filling system header parameters
187 self.__nSamples = self.nsa
192 self.__nSamples = self.nsa
188 self.newProfiles = self.nprofiles/self.nchannels
193 self.newProfiles = self.nprofiles/self.nchannels
189 self.__channelList = list(range(self.nchannels))
194 self.__channelList = list(range(self.nchannels))
190
195
191 self.__frequency = self.frequency[0][0]
196 self.__frequency = self.frequency[0][0]
192
197
193
198
194
199
195 def createBuffers(self):
200 def createBuffers(self):
196
201
197 pass
202 pass
198
203
199 def __setParameters(self,path='', startDate='',endDate='',startTime='', endTime='', walk=''):
204 def __setParameters(self,path='', startDate='',endDate='',startTime='', endTime='', walk=''):
200 self.path = path
205 self.path = path
201 self.startDate = startDate
206 self.startDate = startDate
202 self.endDate = endDate
207 self.endDate = endDate
203 self.startTime = startTime
208 self.startTime = startTime
204 self.endTime = endTime
209 self.endTime = endTime
205 self.walk = walk
210 self.walk = walk
206
211
207 def __checkPath(self):
212 def __checkPath(self):
208 if os.path.exists(self.path):
213 if os.path.exists(self.path):
209 self.status = 1
214 self.status = 1
210 else:
215 else:
211 self.status = 0
216 self.status = 0
212 print('Path:%s does not exists'%self.path)
217 print('Path:%s does not exists'%self.path)
213
218
214 return
219 return
215
220
216
221
217 def __selDates(self, amisr_dirname_format):
222 def __selDates(self, amisr_dirname_format):
218 try:
223 try:
219 year = int(amisr_dirname_format[0:4])
224 year = int(amisr_dirname_format[0:4])
220 month = int(amisr_dirname_format[4:6])
225 month = int(amisr_dirname_format[4:6])
221 dom = int(amisr_dirname_format[6:8])
226 dom = int(amisr_dirname_format[6:8])
222 thisDate = datetime.date(year,month,dom)
227 thisDate = datetime.date(year,month,dom)
223
228
224 if (thisDate>=self.startDate and thisDate <= self.endDate):
229 if (thisDate>=self.startDate and thisDate <= self.endDate):
225 return amisr_dirname_format
230 return amisr_dirname_format
226 except:
231 except:
227 return None
232 return None
228
233
229
234
230 def __findDataForDates(self,online=False):
235 def __findDataForDates(self,online=False):
231
236
232 if not(self.status):
237 if not(self.status):
233 return None
238 return None
234
239
235 pat = '\d+.\d+'
240 pat = '\d+.\d+'
236 dirnameList = [re.search(pat,x) for x in os.listdir(self.path)]
241 dirnameList = [re.search(pat,x) for x in os.listdir(self.path)]
237 dirnameList = [x for x in dirnameList if x!=None]
242 dirnameList = [x for x in dirnameList if x!=None]
238 dirnameList = [x.string for x in dirnameList]
243 dirnameList = [x.string for x in dirnameList]
239 if not(online):
244 if not(online):
240 dirnameList = [self.__selDates(x) for x in dirnameList]
245 dirnameList = [self.__selDates(x) for x in dirnameList]
241 dirnameList = [x for x in dirnameList if x!=None]
246 dirnameList = [x for x in dirnameList if x!=None]
242 if len(dirnameList)>0:
247 if len(dirnameList)>0:
243 self.status = 1
248 self.status = 1
244 self.dirnameList = dirnameList
249 self.dirnameList = dirnameList
245 self.dirnameList.sort()
250 self.dirnameList.sort()
246 else:
251 else:
247 self.status = 0
252 self.status = 0
248 return None
253 return None
249
254
250 def __getTimeFromData(self):
255 def __getTimeFromData(self):
251 startDateTime_Reader = datetime.datetime.combine(self.startDate,self.startTime)
256 startDateTime_Reader = datetime.datetime.combine(self.startDate,self.startTime)
252 endDateTime_Reader = datetime.datetime.combine(self.endDate,self.endTime)
257 endDateTime_Reader = datetime.datetime.combine(self.endDate,self.endTime)
253
258
254 print('Filtering Files from %s to %s'%(startDateTime_Reader, endDateTime_Reader))
259 print('Filtering Files from %s to %s'%(startDateTime_Reader, endDateTime_Reader))
255 print('........................................')
260 print('........................................')
256 filter_filenameList = []
261 filter_filenameList = []
257 self.filenameList.sort()
262 self.filenameList.sort()
258 #for i in range(len(self.filenameList)-1):
263 #for i in range(len(self.filenameList)-1):
259 for i in range(len(self.filenameList)):
264 for i in range(len(self.filenameList)):
260 filename = self.filenameList[i]
265 filename = self.filenameList[i]
261 fp = h5py.File(filename,'r')
266 fp = h5py.File(filename,'r')
262 time_str = fp.get('Time/RadacTimeString')
267 time_str = fp.get('Time/RadacTimeString')
263
268
264 startDateTimeStr_File = time_str[0][0].decode('UTF-8').split('.')[0]
269 startDateTimeStr_File = time_str[0][0].decode('UTF-8').split('.')[0]
265 #startDateTimeStr_File = "2019-12-16 09:21:11"
270 #startDateTimeStr_File = "2019-12-16 09:21:11"
266 junk = time.strptime(startDateTimeStr_File, '%Y-%m-%d %H:%M:%S')
271 junk = time.strptime(startDateTimeStr_File, '%Y-%m-%d %H:%M:%S')
267 startDateTime_File = datetime.datetime(junk.tm_year,junk.tm_mon,junk.tm_mday,junk.tm_hour, junk.tm_min, junk.tm_sec)
272 startDateTime_File = datetime.datetime(junk.tm_year,junk.tm_mon,junk.tm_mday,junk.tm_hour, junk.tm_min, junk.tm_sec)
268
273
269 #endDateTimeStr_File = "2019-12-16 11:10:11"
274 #endDateTimeStr_File = "2019-12-16 11:10:11"
270 endDateTimeStr_File = time_str[-1][-1].decode('UTF-8').split('.')[0]
275 endDateTimeStr_File = time_str[-1][-1].decode('UTF-8').split('.')[0]
271 junk = time.strptime(endDateTimeStr_File, '%Y-%m-%d %H:%M:%S')
276 junk = time.strptime(endDateTimeStr_File, '%Y-%m-%d %H:%M:%S')
272 endDateTime_File = datetime.datetime(junk.tm_year,junk.tm_mon,junk.tm_mday,junk.tm_hour, junk.tm_min, junk.tm_sec)
277 endDateTime_File = datetime.datetime(junk.tm_year,junk.tm_mon,junk.tm_mday,junk.tm_hour, junk.tm_min, junk.tm_sec)
273
278
274 fp.close()
279 fp.close()
275
280
276 #print("check time", startDateTime_File)
281 #print("check time", startDateTime_File)
277 if self.timezone == 'lt':
282 if self.timezone == 'lt':
278 startDateTime_File = startDateTime_File - datetime.timedelta(minutes = 300)
283 startDateTime_File = startDateTime_File - datetime.timedelta(minutes = 300)
279 endDateTime_File = endDateTime_File - datetime.timedelta(minutes = 300)
284 endDateTime_File = endDateTime_File - datetime.timedelta(minutes = 300)
280 if (endDateTime_File>=startDateTime_Reader and endDateTime_File<endDateTime_Reader):
285 if (endDateTime_File>=startDateTime_Reader and endDateTime_File<endDateTime_Reader):
281 #self.filenameList.remove(filename)
286 #self.filenameList.remove(filename)
282 filter_filenameList.append(filename)
287 filter_filenameList.append(filename)
283
288
284 if (endDateTime_File>=endDateTime_Reader):
289 if (endDateTime_File>=endDateTime_Reader):
285 break
290 break
286
291
287
292
288 filter_filenameList.sort()
293 filter_filenameList.sort()
289 self.filenameList = filter_filenameList
294 self.filenameList = filter_filenameList
290 return 1
295 return 1
291
296
292 def __filterByGlob1(self, dirName):
297 def __filterByGlob1(self, dirName):
293 filter_files = glob.glob1(dirName, '*.*%s'%self.extension_file)
298 filter_files = glob.glob1(dirName, '*.*%s'%self.extension_file)
294 filter_files.sort()
299 filter_files.sort()
295 filterDict = {}
300 filterDict = {}
296 filterDict.setdefault(dirName)
301 filterDict.setdefault(dirName)
297 filterDict[dirName] = filter_files
302 filterDict[dirName] = filter_files
298 return filterDict
303 return filterDict
299
304
300 def __getFilenameList(self, fileListInKeys, dirList):
305 def __getFilenameList(self, fileListInKeys, dirList):
301 for value in fileListInKeys:
306 for value in fileListInKeys:
302 dirName = list(value.keys())[0]
307 dirName = list(value.keys())[0]
303 for file in value[dirName]:
308 for file in value[dirName]:
304 filename = os.path.join(dirName, file)
309 filename = os.path.join(dirName, file)
305 self.filenameList.append(filename)
310 self.filenameList.append(filename)
306
311
307
312
308 def __selectDataForTimes(self, online=False):
313 def __selectDataForTimes(self, online=False):
309 #aun no esta implementado el filtro for tiempo
314 #aun no esta implementado el filtro for tiempo
310 if not(self.status):
315 if not(self.status):
311 return None
316 return None
312
317
313 dirList = [os.path.join(self.path,x) for x in self.dirnameList]
318 dirList = [os.path.join(self.path,x) for x in self.dirnameList]
314
319
315 fileListInKeys = [self.__filterByGlob1(x) for x in dirList]
320 fileListInKeys = [self.__filterByGlob1(x) for x in dirList]
316
321
317 self.__getFilenameList(fileListInKeys, dirList)
322 self.__getFilenameList(fileListInKeys, dirList)
318 if not(online):
323 if not(online):
319 #filtro por tiempo
324 #filtro por tiempo
320 if not(self.all):
325 if not(self.all):
321 self.__getTimeFromData()
326 self.__getTimeFromData()
322
327
323 if len(self.filenameList)>0:
328 if len(self.filenameList)>0:
324 self.status = 1
329 self.status = 1
325 self.filenameList.sort()
330 self.filenameList.sort()
326 else:
331 else:
327 self.status = 0
332 self.status = 0
328 return None
333 return None
329
334
330 else:
335 else:
331 #get the last file - 1
336 #get the last file - 1
332 self.filenameList = [self.filenameList[-2]]
337 self.filenameList = [self.filenameList[-2]]
333 new_dirnameList = []
338 new_dirnameList = []
334 for dirname in self.dirnameList:
339 for dirname in self.dirnameList:
335 junk = numpy.array([dirname in x for x in self.filenameList])
340 junk = numpy.array([dirname in x for x in self.filenameList])
336 junk_sum = junk.sum()
341 junk_sum = junk.sum()
337 if junk_sum > 0:
342 if junk_sum > 0:
338 new_dirnameList.append(dirname)
343 new_dirnameList.append(dirname)
339 self.dirnameList = new_dirnameList
344 self.dirnameList = new_dirnameList
340 return 1
345 return 1
341
346
342 def searchFilesOnLine(self, path, startDate, endDate, startTime=datetime.time(0,0,0),
347 def searchFilesOnLine(self, path, startDate, endDate, startTime=datetime.time(0,0,0),
343 endTime=datetime.time(23,59,59),walk=True):
348 endTime=datetime.time(23,59,59),walk=True):
344
349
345 if endDate ==None:
350 if endDate ==None:
346 startDate = datetime.datetime.utcnow().date()
351 startDate = datetime.datetime.utcnow().date()
347 endDate = datetime.datetime.utcnow().date()
352 endDate = datetime.datetime.utcnow().date()
348
353
349 self.__setParameters(path=path, startDate=startDate, endDate=endDate,startTime = startTime,endTime=endTime, walk=walk)
354 self.__setParameters(path=path, startDate=startDate, endDate=endDate,startTime = startTime,endTime=endTime, walk=walk)
350
355
351 self.__checkPath()
356 self.__checkPath()
352
357
353 self.__findDataForDates(online=True)
358 self.__findDataForDates(online=True)
354
359
355 self.dirnameList = [self.dirnameList[-1]]
360 self.dirnameList = [self.dirnameList[-1]]
356
361
357 self.__selectDataForTimes(online=True)
362 self.__selectDataForTimes(online=True)
358
363
359 return
364 return
360
365
361
366
362 def searchFilesOffLine(self,
367 def searchFilesOffLine(self,
363 path,
368 path,
364 startDate,
369 startDate,
365 endDate,
370 endDate,
366 startTime=datetime.time(0,0,0),
371 startTime=datetime.time(0,0,0),
367 endTime=datetime.time(23,59,59),
372 endTime=datetime.time(23,59,59),
368 walk=True):
373 walk=True):
369
374
370 self.__setParameters(path, startDate, endDate, startTime, endTime, walk)
375 self.__setParameters(path, startDate, endDate, startTime, endTime, walk)
371
376
372 self.__checkPath()
377 self.__checkPath()
373
378
374 self.__findDataForDates()
379 self.__findDataForDates()
375
380
376 self.__selectDataForTimes()
381 self.__selectDataForTimes()
377
382
378 for i in range(len(self.filenameList)):
383 for i in range(len(self.filenameList)):
379 print("%s" %(self.filenameList[i]))
384 print("%s" %(self.filenameList[i]))
380
385
381 return
386 return
382
387
383 def __setNextFileOffline(self):
388 def __setNextFileOffline(self):
384 idFile = self.fileIndex
389 idFile = self.fileIndex
385
390
386 while (True):
391 while (True):
387 idFile += 1
392 idFile += 1
388 if not(idFile < len(self.filenameList)):
393 if not(idFile < len(self.filenameList)):
389 self.flagNoMoreFiles = 1
394 self.flagNoMoreFiles = 1
390 print("No more Files")
395 print("No more Files")
391 return 0
396 return 0
392
397
393 filename = self.filenameList[idFile]
398 filename = self.filenameList[idFile]
394
399
395 amisrFilePointer = h5py.File(filename,'r')
400 amisrFilePointer = h5py.File(filename,'r')
396
401
397 break
402 break
398
403
399 self.flagIsNewFile = 1
404 self.flagIsNewFile = 1
400 self.fileIndex = idFile
405 self.fileIndex = idFile
401 self.filename = filename
406 self.filename = filename
402
407
403 self.amisrFilePointer = amisrFilePointer
408 self.amisrFilePointer = amisrFilePointer
404
409
405 print("Setting the file: %s"%self.filename)
410 print("Setting the file: %s"%self.filename)
406
411
407 return 1
412 return 1
408
413
409
414
410 def __setNextFileOnline(self):
415 def __setNextFileOnline(self):
411 filename = self.filenameList[0]
416 filename = self.filenameList[0]
412 if self.__filename_online != None:
417 if self.__filename_online != None:
413 self.__selectDataForTimes(online=True)
418 self.__selectDataForTimes(online=True)
414 filename = self.filenameList[0]
419 filename = self.filenameList[0]
415 wait = 0
420 wait = 0
416 #self.__waitForNewFile=5 ## DEBUG:
421 #self.__waitForNewFile=5 ## DEBUG:
417 while self.__filename_online == filename:
422 while self.__filename_online == filename:
418 print('waiting %d seconds to get a new file...'%(self.__waitForNewFile))
423 print('waiting %d seconds to get a new file...'%(self.__waitForNewFile))
419 if wait == 5:
424 if wait == 5:
420 self.flagNoMoreFiles = 1
425 self.flagNoMoreFiles = 1
421 return 0
426 return 0
422 sleep(self.__waitForNewFile)
427 sleep(self.__waitForNewFile)
423 self.__selectDataForTimes(online=True)
428 self.__selectDataForTimes(online=True)
424 filename = self.filenameList[0]
429 filename = self.filenameList[0]
425 wait += 1
430 wait += 1
426
431
427 self.__filename_online = filename
432 self.__filename_online = filename
428
433
429 self.amisrFilePointer = h5py.File(filename,'r')
434 self.amisrFilePointer = h5py.File(filename,'r')
430 self.flagIsNewFile = 1
435 self.flagIsNewFile = 1
431 self.filename = filename
436 self.filename = filename
432 print("Setting the file: %s"%self.filename)
437 print("Setting the file: %s"%self.filename)
433 return 1
438 return 1
434
439
435
440
436 def readData(self):
441 def readData(self):
437 buffer = self.amisrFilePointer.get('Raw11/Data/Samples/Data')
442 buffer = self.amisrFilePointer.get('Raw11/Data/Samples/Data')
438 re = buffer[:,:,:,0]
443 re = buffer[:,:,:,0]
439 im = buffer[:,:,:,1]
444 im = buffer[:,:,:,1]
440 dataset = re + im*1j
445 dataset = re + im*1j
441
446
442 self.radacTime = self.amisrFilePointer.get('Raw11/Data/RadacHeader/RadacTime')
447 self.radacTime = self.amisrFilePointer.get('Raw11/Data/RadacHeader/RadacTime')
443 timeset = self.radacTime[:,0]
448 timeset = self.radacTime[:,0]
444
449
445 return dataset,timeset
450 return dataset,timeset
446
451
447 def reshapeData(self):
452 def reshapeData(self):
448 #self.beamCodeByPulse, self.beamCode, self.nblocks, self.nprofiles, self.nsa,
453 #self.beamCodeByPulse, self.beamCode, self.nblocks, self.nprofiles, self.nsa,
449 channels = self.beamCodeByPulse[0,:]
454 channels = self.beamCodeByPulse[0,:]
450 nchan = self.nchannels
455 nchan = self.nchannels
451 #self.newProfiles = self.nprofiles/nchan #must be defined on filljroheader
456 #self.newProfiles = self.nprofiles/nchan #must be defined on filljroheader
452 nblocks = self.nblocks
457 nblocks = self.nblocks
453 nsamples = self.nsa
458 nsamples = self.nsa
454
459
455 #Dimensions : nChannels, nProfiles, nSamples
460 #Dimensions : nChannels, nProfiles, nSamples
456 new_block = numpy.empty((nblocks, nchan, numpy.int_(self.newProfiles), nsamples), dtype="complex64")
461 new_block = numpy.empty((nblocks, nchan, numpy.int_(self.newProfiles), nsamples), dtype="complex64")
457 ############################################
462 ############################################
458
463
459 for thisChannel in range(nchan):
464 for thisChannel in range(nchan):
460 new_block[:,thisChannel,:,:] = self.dataset[:,numpy.where(channels==self.beamCode[thisChannel])[0],:]
465 new_block[:,thisChannel,:,:] = self.dataset[:,numpy.where(channels==self.beamCode[thisChannel])[0],:]
461
466
462
467
463 new_block = numpy.transpose(new_block, (1,0,2,3))
468 new_block = numpy.transpose(new_block, (1,0,2,3))
464 new_block = numpy.reshape(new_block, (nchan,-1, nsamples))
469 new_block = numpy.reshape(new_block, (nchan,-1, nsamples))
465
470
466 return new_block
471 return new_block
467
472
468 def updateIndexes(self):
473 def updateIndexes(self):
469
474
470 pass
475 pass
471
476
472 def fillJROHeader(self):
477 def fillJROHeader(self):
473
478
474 #fill radar controller header
479 #fill radar controller header
475 self.dataOut.radarControllerHeaderObj = RadarControllerHeader(ipp=self.__ippKm,
480 self.dataOut.radarControllerHeaderObj = RadarControllerHeader(ipp=self.__ippKm,
476 txA=self.__txA,
481 txA=self.__txA,
477 txB=0,
482 txB=0,
478 nWindows=1,
483 nWindows=1,
479 nHeights=self.__nSamples,
484 nHeights=self.__nSamples,
480 firstHeight=self.__firstHeight,
485 firstHeight=self.__firstHeight,
481 deltaHeight=self.__deltaHeight,
486 deltaHeight=self.__deltaHeight,
482 codeType=self.__codeType,
487 codeType=self.__codeType,
483 nCode=self.__nCode, nBaud=self.__nBaud,
488 nCode=self.__nCode, nBaud=self.__nBaud,
484 code = self.__code,
489 code = self.__code,
485 fClock=1)
490 fClock=1)
486
491
487 #fill system header
492 #fill system header
488 self.dataOut.systemHeaderObj = SystemHeader(nSamples=self.__nSamples,
493 self.dataOut.systemHeaderObj = SystemHeader(nSamples=self.__nSamples,
489 nProfiles=self.newProfiles,
494 nProfiles=self.newProfiles,
490 nChannels=len(self.__channelList),
495 nChannels=len(self.__channelList),
491 adcResolution=14,
496 adcResolution=14,
492 pciDioBusWidth=32)
497 pciDioBusWidth=32)
493
498
494 self.dataOut.type = "Voltage"
499 self.dataOut.type = "Voltage"
495
500
496 self.dataOut.data = None
501 self.dataOut.data = None
497
502
498 self.dataOut.dtype = numpy.dtype([('real','<i8'),('imag','<i8')])
503 self.dataOut.dtype = numpy.dtype([('real','<i8'),('imag','<i8')])
499
504
500 # self.dataOut.nChannels = 0
505 # self.dataOut.nChannels = 0
501
506
502 # self.dataOut.nHeights = 0
507 # self.dataOut.nHeights = 0
503
508
504 self.dataOut.nProfiles = self.newProfiles*self.nblocks
509 self.dataOut.nProfiles = self.newProfiles*self.nblocks
505
510
506 #self.dataOut.heightList = self.__firstHeigth + numpy.arange(self.__nSamples, dtype = numpy.float)*self.__deltaHeigth
511 #self.dataOut.heightList = self.__firstHeigth + numpy.arange(self.__nSamples, dtype = numpy.float)*self.__deltaHeigth
507 ranges = numpy.reshape(self.rangeFromFile.value,(-1))
512 ranges = numpy.reshape(self.rangeFromFile.value,(-1))
508 self.dataOut.heightList = ranges/1000.0 #km
513 self.dataOut.heightList = ranges/1000.0 #km
509
514
510
515
511 self.dataOut.channelList = self.__channelList
516 self.dataOut.channelList = self.__channelList
512
517
513 self.dataOut.blocksize = self.dataOut.nChannels * self.dataOut.nHeights
518 self.dataOut.blocksize = self.dataOut.nChannels * self.dataOut.nHeights
514
519
515 # self.dataOut.channelIndexList = None
520 # self.dataOut.channelIndexList = None
516
521
517 self.dataOut.flagNoData = True
522 self.dataOut.flagNoData = True
518
523
519 #Set to TRUE if the data is discontinuous
524 #Set to TRUE if the data is discontinuous
520 self.dataOut.flagDiscontinuousBlock = False
525 self.dataOut.flagDiscontinuousBlock = False
521
526
522 self.dataOut.utctime = None
527 self.dataOut.utctime = None
523
528
524 #self.dataOut.timeZone = -5 #self.__timezone/60 #timezone like jroheader, difference in minutes between UTC and localtime
529 #self.dataOut.timeZone = -5 #self.__timezone/60 #timezone like jroheader, difference in minutes between UTC and localtime
525 if self.timezone == 'lt':
530 if self.timezone == 'lt':
526 self.dataOut.timeZone = time.timezone / 60. #get the timezone in minutes
531 self.dataOut.timeZone = time.timezone / 60. #get the timezone in minutes
527 else:
532 else:
528 self.dataOut.timeZone = 0 #by default time is UTC
533 self.dataOut.timeZone = 0 #by default time is UTC
529
534
530 self.dataOut.dstFlag = 0
535 self.dataOut.dstFlag = 0
531
536
532 self.dataOut.errorCount = 0
537 self.dataOut.errorCount = 0
533
538
534 self.dataOut.nCohInt = 1
539 self.dataOut.nCohInt = 1
535
540
536 self.dataOut.flagDecodeData = False #asumo que la data esta decodificada
541 self.dataOut.flagDecodeData = False #asumo que la data esta decodificada
537
542
538 self.dataOut.flagDeflipData = False #asumo que la data esta sin flip
543 self.dataOut.flagDeflipData = False #asumo que la data esta sin flip
539
544
540 self.dataOut.flagShiftFFT = False
545 self.dataOut.flagShiftFFT = False
541
546
542 self.dataOut.ippSeconds = self.ippSeconds
547 self.dataOut.ippSeconds = self.ippSeconds
543
548
544 #Time interval between profiles
549 #Time interval between profiles
545 #self.dataOut.timeInterval = self.dataOut.ippSeconds * self.dataOut.nCohInt
550 #self.dataOut.timeInterval = self.dataOut.ippSeconds * self.dataOut.nCohInt
546
551
547 self.dataOut.frequency = self.__frequency
552 self.dataOut.frequency = self.__frequency
548 self.dataOut.realtime = self.online
553 self.dataOut.realtime = self.online
549 pass
554 pass
550
555
551 def readNextFile(self,online=False):
556 def readNextFile(self,online=False):
552
557
553 if not(online):
558 if not(online):
554 newFile = self.__setNextFileOffline()
559 newFile = self.__setNextFileOffline()
555 else:
560 else:
556 newFile = self.__setNextFileOnline()
561 newFile = self.__setNextFileOnline()
557
562
558 if not(newFile):
563 if not(newFile):
559 self.dataOut.error = True
564 self.dataOut.error = True
560 return 0
565 return 0
561 #if self.__firstFile:
566 #if self.__firstFile:
562 self.readAMISRHeader(self.amisrFilePointer)
567 self.readAMISRHeader(self.amisrFilePointer)
563
568
564 self.createBuffers()
569 self.createBuffers()
565
570
566 self.fillJROHeader()
571 self.fillJROHeader()
567
572
568 #self.__firstFile = False
573 #self.__firstFile = False
569
574
570
575
571
576
572 self.dataset,self.timeset = self.readData()
577 self.dataset,self.timeset = self.readData()
573
578
574 if self.endDate!=None:
579 if self.endDate!=None:
575 endDateTime_Reader = datetime.datetime.combine(self.endDate,self.endTime)
580 endDateTime_Reader = datetime.datetime.combine(self.endDate,self.endTime)
576 time_str = self.amisrFilePointer.get('Time/RadacTimeString')
581 time_str = self.amisrFilePointer.get('Time/RadacTimeString')
577 startDateTimeStr_File = time_str[0][0].decode('UTF-8').split('.')[0]
582 startDateTimeStr_File = time_str[0][0].decode('UTF-8').split('.')[0]
578 junk = time.strptime(startDateTimeStr_File, '%Y-%m-%d %H:%M:%S')
583 junk = time.strptime(startDateTimeStr_File, '%Y-%m-%d %H:%M:%S')
579 startDateTime_File = datetime.datetime(junk.tm_year,junk.tm_mon,junk.tm_mday,junk.tm_hour, junk.tm_min, junk.tm_sec)
584 startDateTime_File = datetime.datetime(junk.tm_year,junk.tm_mon,junk.tm_mday,junk.tm_hour, junk.tm_min, junk.tm_sec)
580 if self.timezone == 'lt':
585 if self.timezone == 'lt':
581 startDateTime_File = startDateTime_File - datetime.timedelta(minutes = 300)
586 startDateTime_File = startDateTime_File - datetime.timedelta(minutes = 300)
582 if (startDateTime_File>endDateTime_Reader):
587 if (startDateTime_File>endDateTime_Reader):
583 return 0
588 return 0
584
589
585 self.jrodataset = self.reshapeData()
590 self.jrodataset = self.reshapeData()
586 #----self.updateIndexes()
591 #----self.updateIndexes()
587 self.profileIndex = 0
592 self.profileIndex = 0
588
593
589 return 1
594 return 1
590
595
591
596
592 def __hasNotDataInBuffer(self):
597 def __hasNotDataInBuffer(self):
593 if self.profileIndex >= (self.newProfiles*self.nblocks):
598 if self.profileIndex >= (self.newProfiles*self.nblocks):
594 return 1
599 return 1
595 return 0
600 return 0
596
601
597
602
598 def getData(self):
603 def getData(self):
599
604
600 if self.flagNoMoreFiles:
605 if self.flagNoMoreFiles:
601 self.dataOut.flagNoData = True
606 self.dataOut.flagNoData = True
602 return 0
607 return 0
603
608
604 if self.__hasNotDataInBuffer():
609 if self.__hasNotDataInBuffer():
605 if not (self.readNextFile(self.online)):
610 if not (self.readNextFile(self.online)):
606 return 0
611 return 0
607
612
608
613
609 if self.dataset is None: # setear esta condicion cuando no hayan datos por leer
614 if self.dataset is None: # setear esta condicion cuando no hayan datos por leer
610 self.dataOut.flagNoData = True
615 self.dataOut.flagNoData = True
611 return 0
616 return 0
612
617
613 #self.dataOut.data = numpy.reshape(self.jrodataset[self.profileIndex,:],(1,-1))
618 #self.dataOut.data = numpy.reshape(self.jrodataset[self.profileIndex,:],(1,-1))
614
619
615 self.dataOut.data = self.jrodataset[:,self.profileIndex,:]
620 self.dataOut.data = self.jrodataset[:,self.profileIndex,:]
616
621
617 #print("R_t",self.timeset)
622 #print("R_t",self.timeset)
618
623
619 #self.dataOut.utctime = self.jrotimeset[self.profileIndex]
624 #self.dataOut.utctime = self.jrotimeset[self.profileIndex]
620 #verificar basic header de jro data y ver si es compatible con este valor
625 #verificar basic header de jro data y ver si es compatible con este valor
621 #self.dataOut.utctime = self.timeset + (self.profileIndex * self.ippSeconds * self.nchannels)
626 #self.dataOut.utctime = self.timeset + (self.profileIndex * self.ippSeconds * self.nchannels)
622 indexprof = numpy.mod(self.profileIndex, self.newProfiles)
627 indexprof = numpy.mod(self.profileIndex, self.newProfiles)
623 indexblock = self.profileIndex/self.newProfiles
628 indexblock = self.profileIndex/self.newProfiles
624 #print (indexblock, indexprof)
629 #print (indexblock, indexprof)
625 diffUTC = 1.8e4 #UTC diference from peru in seconds --Joab
630 diffUTC = 1.8e4 #UTC diference from peru in seconds --Joab
626 diffUTC = 0
631 diffUTC = 0
627 t_comp = (indexprof * self.ippSeconds * self.nchannels) + diffUTC #
632 t_comp = (indexprof * self.ippSeconds * self.nchannels) + diffUTC #
628 #cambio posible 18/02/2020
629
630
631
633
632 #print("utc :",indexblock," __ ",t_comp)
634 #print("utc :",indexblock," __ ",t_comp)
633 #print(numpy.shape(self.timeset))
635 #print(numpy.shape(self.timeset))
634 self.dataOut.utctime = self.timeset[numpy.int_(indexblock)] + t_comp
636 self.dataOut.utctime = self.timeset[numpy.int_(indexblock)] + t_comp
635 #self.dataOut.utctime = self.timeset[self.profileIndex] + t_comp
637 #self.dataOut.utctime = self.timeset[self.profileIndex] + t_comp
636 #print(self.dataOut.utctime)
638 #print(self.dataOut.utctime)
637 self.dataOut.profileIndex = self.profileIndex
639 self.dataOut.profileIndex = self.profileIndex
638 self.dataOut.flagNoData = False
640 self.dataOut.flagNoData = False
639 # if indexprof == 0:
641 # if indexprof == 0:
640 # print self.dataOut.utctime
642 # print self.dataOut.utctime
641
643
642 self.profileIndex += 1
644 self.profileIndex += 1
643
645
644 return self.dataOut.data
646 return self.dataOut.data
645
647
646
648
647 def run(self, **kwargs):
649 def run(self, **kwargs):
648 '''
650 '''
649 This method will be called many times so here you should put all your code
651 This method will be called many times so here you should put all your code
650 '''
652 '''
651
653 #print("running kamisr")
652 if not self.isConfig:
654 if not self.isConfig:
653 self.setup(**kwargs)
655 self.setup(**kwargs)
654 self.isConfig = True
656 self.isConfig = True
655
657
656 self.getData()
658 self.getData()
1 NO CONTENT: modified file
NO CONTENT: modified file
@@ -1,203 +1,203
1 '''
1 '''
2 Base clases to create Processing units and operations, the MPDecorator
2 Base clases to create Processing units and operations, the MPDecorator
3 must be used in plotting and writing operations to allow to run as an
3 must be used in plotting and writing operations to allow to run as an
4 external process.
4 external process.
5 '''
5 '''
6
6
7 import inspect
7 import inspect
8 import zmq
8 import zmq
9 import time
9 import time
10 import pickle
10 import pickle
11 import traceback
11 import traceback
12 from threading import Thread
12 from threading import Thread
13 from multiprocessing import Process, Queue
13 from multiprocessing import Process, Queue
14 from schainpy.utils import log
14 from schainpy.utils import log
15
15
16
16
17 class ProcessingUnit(object):
17 class ProcessingUnit(object):
18 '''
18 '''
19 Base class to create Signal Chain Units
19 Base class to create Signal Chain Units
20 '''
20 '''
21
21
22 proc_type = 'processing'
22 proc_type = 'processing'
23
23
24 def __init__(self):
24 def __init__(self):
25
25
26 self.dataIn = None
26 self.dataIn = None
27 self.dataOut = None
27 self.dataOut = None
28 self.isConfig = False
28 self.isConfig = False
29 self.operations = []
29 self.operations = []
30
30
31 def setInput(self, unit):
31 def setInput(self, unit):
32
32
33 self.dataIn = unit.dataOut
33 self.dataIn = unit.dataOut
34
34
35 def getAllowedArgs(self):
35 def getAllowedArgs(self):
36 if hasattr(self, '__attrs__'):
36 if hasattr(self, '__attrs__'):
37 return self.__attrs__
37 return self.__attrs__
38 else:
38 else:
39 return inspect.getargspec(self.run).args
39 return inspect.getargspec(self.run).args
40
40
41 def addOperation(self, conf, operation):
41 def addOperation(self, conf, operation):
42 '''
42 '''
43 '''
43 '''
44
44
45 self.operations.append((operation, conf.type, conf.getKwargs()))
45 self.operations.append((operation, conf.type, conf.getKwargs()))
46
46
47 def getOperationObj(self, objId):
47 def getOperationObj(self, objId):
48
48
49 if objId not in list(self.operations.keys()):
49 if objId not in list(self.operations.keys()):
50 return None
50 return None
51
51
52 return self.operations[objId]
52 return self.operations[objId]
53
53
54 def call(self, **kwargs):
54 def call(self, **kwargs):
55 '''
55 '''
56 '''
56 '''
57
57
58 try:
58 try:
59 if self.dataIn is not None and self.dataIn.flagNoData and not self.dataIn.error:
59 if self.dataIn is not None and self.dataIn.flagNoData and not self.dataIn.error:
60 return self.dataIn.isReady()
60 return self.dataIn.isReady()
61 elif self.dataIn is None or not self.dataIn.error:
61 elif self.dataIn is None or not self.dataIn.error:
62 self.run(**kwargs)
62 self.run(**kwargs)
63 elif self.dataIn.error:
63 elif self.dataIn.error:
64 self.dataOut.error = self.dataIn.error
64 self.dataOut.error = self.dataIn.error
65 self.dataOut.flagNoData = True
65 self.dataOut.flagNoData = True
66 except:
66 except:
67 err = traceback.format_exc()
67 err = traceback.format_exc()
68 if 'SchainWarning' in err:
68 if 'SchainWarning' in err:
69 log.warning(err.split('SchainWarning:')[-1].split('\n')[0].strip(), self.name)
69 log.warning(err.split('SchainWarning:')[-1].split('\n')[0].strip(), self.name)
70 elif 'SchainError' in err:
70 elif 'SchainError' in err:
71 log.error(err.split('SchainError:')[-1].split('\n')[0].strip(), self.name)
71 log.error(err.split('SchainError:')[-1].split('\n')[0].strip(), self.name)
72 else:
72 else:
73 log.error(err, self.name)
73 log.error(err, self.name)
74 self.dataOut.error = True
74 self.dataOut.error = True
75
75
76 for op, optype, opkwargs in self.operations:
76 for op, optype, opkwargs in self.operations:
77 if optype == 'other' and not self.dataOut.flagNoData:
77 if optype == 'other' and not self.dataOut.flagNoData:
78 self.dataOut = op.run(self.dataOut, **opkwargs)
78 self.dataOut = op.run(self.dataOut, **opkwargs)
79 elif optype == 'external' and not self.dataOut.flagNoData:
79 elif optype == 'external' and not self.dataOut.flagNoData:
80 op.queue.put(self.dataOut)
80 op.queue.put(self.dataOut)
81 elif optype == 'external' and self.dataOut.error:
81 elif optype == 'external' and self.dataOut.error:
82 op.queue.put(self.dataOut)
82 op.queue.put(self.dataOut)
83
83
84 return 'Error' if self.dataOut.error else self.dataOut.isReady()
84 return 'Error' if self.dataOut.error else self.dataOut.isReady()
85
85
86 def setup(self):
86 def setup(self):
87
87
88 raise NotImplementedError
88 raise NotImplementedError
89
89
90 def run(self):
90 def run(self):
91
91
92 raise NotImplementedError
92 raise NotImplementedError
93
93
94 def close(self):
94 def close(self):
95
95
96 return
96 return
97
97
98
98
99 class Operation(object):
99 class Operation(object):
100
100
101 '''
101 '''
102 '''
102 '''
103
103
104 proc_type = 'operation'
104 proc_type = 'operation'
105
105
106 def __init__(self):
106 def __init__(self):
107
107
108 self.id = None
108 self.id = None
109 self.isConfig = False
109 self.isConfig = False
110
110
111 if not hasattr(self, 'name'):
111 if not hasattr(self, 'name'):
112 self.name = self.__class__.__name__
112 self.name = self.__class__.__name__
113
113
114 def getAllowedArgs(self):
114 def getAllowedArgs(self):
115 if hasattr(self, '__attrs__'):
115 if hasattr(self, '__attrs__'):
116 return self.__attrs__
116 return self.__attrs__
117 else:
117 else:
118 return inspect.getargspec(self.run).args
118 return inspect.getargspec(self.run).args
119
119
120 def setup(self):
120 def setup(self):
121
121
122 self.isConfig = True
122 self.isConfig = True
123
123
124 raise NotImplementedError
124 raise NotImplementedError
125
125
126 def run(self, dataIn, **kwargs):
126 def run(self, dataIn, **kwargs):
127 """
127 """
128 Realiza las operaciones necesarias sobre la dataIn.data y actualiza los
128 Realiza las operaciones necesarias sobre la dataIn.data y actualiza los
129 atributos del objeto dataIn.
129 atributos del objeto dataIn.
130
130
131 Input:
131 Input:
132
132
133 dataIn : objeto del tipo JROData
133 dataIn : objeto del tipo JROData
134
134
135 Return:
135 Return:
136
136
137 None
137 None
138
138
139 Affected:
139 Affected:
140 __buffer : buffer de recepcion de datos.
140 __buffer : buffer de recepcion de datos.
141
141
142 """
142 """
143 if not self.isConfig:
143 if not self.isConfig:
144 self.setup(**kwargs)
144 self.setup(**kwargs)
145
145
146 raise NotImplementedError
146 raise NotImplementedError
147
147
148 def close(self):
148 def close(self):
149
149
150 return
150 return
151
151
152
152
153 def MPDecorator(BaseClass):
153 def MPDecorator(BaseClass):
154 """
154 """
155 Multiprocessing class decorator
155 Multiprocessing class decorator
156
156
157 This function add multiprocessing features to a BaseClass.
157 This function add multiprocessing features to a BaseClass.
158 """
158 """
159
159
160 class MPClass(BaseClass, Process):
160 class MPClass(BaseClass, Process):
161
161
162 def __init__(self, *args, **kwargs):
162 def __init__(self, *args, **kwargs):
163 super(MPClass, self).__init__()
163 super(MPClass, self).__init__()
164 Process.__init__(self)
164 Process.__init__(self)
165
165
166 self.args = args
166 self.args = args
167 self.kwargs = kwargs
167 self.kwargs = kwargs
168 self.t = time.time()
168 self.t = time.time()
169 self.op_type = 'external'
169 self.op_type = 'external'
170 self.name = BaseClass.__name__
170 self.name = BaseClass.__name__
171 self.__doc__ = BaseClass.__doc__
171 self.__doc__ = BaseClass.__doc__
172
172
173 if 'plot' in self.name.lower() and not self.name.endswith('_'):
173 if 'plot' in self.name.lower() and not self.name.endswith('_'):
174 self.name = '{}{}'.format(self.CODE.upper(), 'Plot')
174 self.name = '{}{}'.format(self.CODE.upper(), 'Plot')
175
175
176 self.start_time = time.time()
176 self.start_time = time.time()
177 self.err_queue = args[3]
177 #self.err_queue = args[2]
178 self.queue = Queue(maxsize=1)
178 self.queue = Queue(maxsize=1)
179 self.myrun = BaseClass.run
179 self.myrun = BaseClass.run
180
180
181 def run(self):
181 def run(self):
182
182
183 while True:
183 while True:
184
184
185 dataOut = self.queue.get()
185 dataOut = self.queue.get()
186
186
187 if not dataOut.error:
187 if not dataOut.error:
188 try:
188 try:
189 BaseClass.run(self, dataOut, **self.kwargs)
189 BaseClass.run(self, dataOut, **self.kwargs)
190 except:
190 except:
191 err = traceback.format_exc()
191 err = traceback.format_exc()
192 log.error(err, self.name)
192 log.error(err, self.name)
193 else:
193 else:
194 break
194 break
195
195
196 self.close()
196 self.close()
197
197
198 def close(self):
198 def close(self):
199
199
200 BaseClass.close(self)
200 BaseClass.close(self)
201 log.success('Done...(Time:{:4.2f} secs)'.format(time.time()-self.start_time), self.name)
201 log.success('Done...(Time:{:4.2f} secs)'.format(time.time()-self.start_time), self.name)
202
202
203 return MPClass
203 return MPClass
@@ -1,200 +1,203
1 #!/usr/bin/env python
1
2 import os, sys
2 import os, sys
3 import time
3 import time
4 import datetime
4 import datetime
5
5
6 path = os.path.dirname(os.getcwd())
6 path = os.path.dirname(os.getcwd())
7 path = os.path.dirname(path)
7 path = os.path.dirname(path)
8 sys.path.insert(0, path)
8 sys.path.insert(0, path)
9
9
10 from schainpy.controller import Project
10 from schainpy.controller import Project
11
11
12 def main():
12 def main():
13
13
14
14
15 desc = "AMISR EEJ Experiment"
15 desc = "AMISR EEJ Experiment"
16 filename = "amisr_reader.xml"
16 filename = "amisr_reader.xml"
17 xmin = '07'
17 xmin = '07'
18 xmax = '18' #-> el plot genera +1 en la hora, es decir aparece 18 como máximo
18 xmax = '18' #-> el plot genera +1 en la hora, es decir aparece 18 como máximo
19 ymin = '0'
19 ymin = '0'
20 ymax = '300'
20 ymax = '300'
21 dbmin = '45' #'60'#'55' #'40' #noise esf eej
21 dbmin = '45' #'60'#'55' #'40' #noise esf eej
22 dbmax = '65' #'70' #'55'
22 dbmax = '65' #'70' #'55'
23 showSPC = '0' #view plot Spectra
23 showSPC = '1' #view plot Spectra
24 showRTI = '0' #view plot RTI
24 showRTI = '1' #view plot RTI
25 showNOISE = '0' #view plot NOISE
25 showNOISE = '1' #view plot NOISE
26 localtime='0' #para ajustar el horario en las gráficas '0' para dejar en utc
26 localtime='1' #para ajustar el horario en las gráficas '0' para dejar en utc
27 code = '1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1'
27 code = '1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1'
28 nCode = '1'
28 nCode = '1'
29 nBaud = '28'
29 nBaud = '28'
30 nosamp = '1' # oversample for EEJ
30 nosamp = '1' # oversample for EEJ
31 today = time.strftime("%Y/%m/%d")
31 today = time.strftime("%Y/%m/%d")
32 #startDate=today
32 #startDate=today
33 #endDate=today
33 #endDate=today
34 startDate='2019/12/16'
34 startDate='2021/07/11'
35 endDate='2019/12/16'
35 endDate='2021/07/11'
36 #inPath= '/home/soporte/dataAMISR_test/'
36 #inPath= '/home/soporte/dataAMISR_test/'
37 inPath= '/home/soporte/dataAMISR/'
37 inPath= '/home/soporte/dataAMISR/'
38 inPath= '/media/soporte/UARS_4T_D02/AMISR_DATA/2021/'
38 #inPath = '/mnt/data_amisr'
39 #inPath = '/mnt/data_amisr'
39 outPath = '/home/soporte/Data/EEJ'
40 outPath = '/home/soporte/Data/EEJ'
40
41
41 ##.......................................................................................
42 ##.......................................................................................
42 ##.......................................................................................
43 ##.......................................................................................
43
44
44 #l = startDate.split('/') #adding day of the year to outPath
45 #l = startDate.split('/') #adding day of the year to outPath
45 l = startDate.split('/')
46 l = startDate.split('/')
46 datelist = datetime.date(int(l[0]),int(l[1]),int(l[2]))
47 datelist = datetime.date(int(l[0]),int(l[1]),int(l[2]))
47 DOY = datelist.timetuple().tm_yday
48 DOY = datelist.timetuple().tm_yday
48 outPath= outPath+"/EEJ"+l[0]+str(DOY)
49 outPath= outPath+"/EEJ"+l[0]+str(DOY)
49 if os.path.exists(outPath):
50 if os.path.exists(outPath):
50 print("outPath", outPath)
51 print("outPath", outPath)
51 else :
52 else :
52 os.mkdir(outPath)
53 os.mkdir(outPath)
53 print("Creating...", outPath)
54 print("Creating...", outPath)
54
55
55 ##.......................................................................................
56 ##.......................................................................................
56 ##.......................................................................................
57 ##.......................................................................................
57 controllerObj = Project()
58 controllerObj = Project()
58 controllerObj.setup(id = '11', name='eej_proc', description=desc)
59 controllerObj.setup(id = '11', name='eej_proc', description=desc)
59 ##.......................................................................................
60 ##.......................................................................................
60 ##.......................................................................................
61 ##.......................................................................................
61 readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader',
62 readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader',
62 path=inPath,
63 path=inPath,
63 startDate=startDate,#startDate, #'2014/10/07',
64 startDate=startDate,#startDate, #'2014/10/07',
64 endDate=endDate, #endDate '2014/10/07',
65 endDate=endDate, #endDate '2014/10/07',
65 startTime='07:01:30',#'07:00:00',
66 startTime='07:01:30',#'07:00:00',
66 endTime='19:00:00',#'15:00:00',
67 endTime='19:00:00',#'15:00:00',
67 walk=0,
68 walk=1,
68 code = code,
69 code = code,
69 nCode = nCode,
70 nCode = nCode,
70 nBaud = nBaud,
71 nBaud = nBaud,
71 timezone='ut',
72 timezone='lt',
72 online=0)
73 online=0)
73
74
75
74 #AMISR Processing Unit
76 #AMISR Processing Unit
75 ##.......................................................................................
77 ##.......................................................................................
76 ##.......................................................................................
78 ##.......................................................................................
77 procUnitConfObj0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId())
79 procUnitConfObj0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId())
78 opObj10 = procUnitConfObj0.addOperation(name='setRadarFrequency')
80 opObj10 = procUnitConfObj0.addOperation(name='setAttribute')
79 opObj10.addParameter(name='frequency', value='445e6', format='float')
81 opObj10.addParameter(name='frequency', value='445.09e6')
82 # opObj10 = procUnitConfObj0.addOperation(name='setRadarFrequency')
83 # opObj10.addParameter(name='frequency', value='445e6', format='float')
80
84
81
85
82 opObj01 = procUnitConfObj0.addOperation(name='Decoder', optype='other')
86 opObj01 = procUnitConfObj0.addOperation(name='Decoder', optype='other')
83 opObj01.addParameter(name='code', value=code, format='floatlist')
87 opObj01.addParameter(name='code', value=code, format='floatlist')
84 opObj01.addParameter(name='nCode', value=nCode, format='int')
88 opObj01.addParameter(name='nCode', value=nCode, format='int')
85 opObj01.addParameter(name='nBaud', value=nBaud, format='int')
89 opObj01.addParameter(name='nBaud', value=nBaud, format='int')
86 opObj01.addParameter(name='osamp', value=nosamp, format='int')
90 opObj01.addParameter(name='osamp', value=nosamp, format='int')
87
91
88
92
89 opObj02 = procUnitConfObj0.addOperation(name='CohInt', optype='other')
93 # opObj02 = procUnitConfObj0.addOperation(name='CohInt', optype='other')
90 opObj02.addParameter(name='n', value='2', format='int')
94 # opObj02.addParameter(name='n', value='2', format='int')
91
95
92
96
93
97
94 ##.......................................................................................
98 ##.......................................................................................
95 ##.......................................................................................
99 ##.......................................................................................
96
100
97 procUnitConfObj1 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObj0.getId())
101 procUnitConfObj1 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObj0.getId())
98 procUnitConfObj1.addParameter(name='nFFTPoints', value='16', format='int')
102 procUnitConfObj1.addParameter(name='nFFTPoints', value='16', format='int')
99
103
100
104
101 opObj11 = procUnitConfObj1.addOperation(name='IncohInt', optype='other')
105 opObj11 = procUnitConfObj1.addOperation(name='IncohInt', optype='other')
102 opObj11.addParameter(name='n', value='150', format='int') #300?
106 opObj11.addParameter(name='n', value='150', format='int') #300?
103
107
104 ## Remove DC signal
108 ## Remove DC signal
105 opObj11 = procUnitConfObj1.addOperation(name='removeDC')
109 opObj11 = procUnitConfObj1.addOperation(name='removeDC')
106 ##.......................................................................................
110 ##.......................................................................................
107 ##.......................................................................................
111 ##.......................................................................................
108
112
109 opObj13 = procUnitConfObj1.addOperation(name='getNoise' , optype ='self')
113 # opObj13 = procUnitConfObj1.addOperation(name='getNoise' , optype ='self')
110 opObj13.addParameter(name='minHei', value='100', format='float')
114 # opObj13.addParameter(name='minHei', value='100', format='float')
111 opObj13.addParameter(name='maxHei', value='280', format='float')
115 # opObj13.addParameter(name='maxHei', value='280', format='float')
112
116
113
117
114 #
118 #
115 opObj12 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='external')
119 opObj12 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='external')
116 opObj12.addParameter(name='id', value='21', format='int')
120 opObj12.addParameter(name='id', value='21', format='int')
117 opObj12.addParameter(name= 'xaxis', value='velocity')
121 opObj12.addParameter(name= 'xaxis', value='velocity')
118 opObj12.addParameter(name='ymax', value=ymax, format='int')
122 opObj12.addParameter(name='ymax', value=ymax, format='int')
119 opObj12.addParameter(name='showprofile', value='1', format='int')
123 opObj12.addParameter(name='showprofile', value='1', format='int')
120 opObj12.addParameter(name='wintitle', value='AMISR Beam 0', format='str')
124 opObj12.addParameter(name='wintitle', value='AMISR Beam 0', format='str')
121 opObj12.addParameter(name='zmin', value=dbmin, format='int')
125 opObj12.addParameter(name='zmin', value=dbmin, format='int')
122 opObj12.addParameter(name='zmax', value=dbmax, format='int')
126 opObj12.addParameter(name='zmax', value=dbmax, format='int')
123 opObj12.addParameter(name='save', value=outPath+'/plots', format='str')
127 opObj12.addParameter(name='save', value=outPath+'/plots', format='str')
124 opObj12.addParameter(name='colormap', value='jet', format='str')
128 opObj12.addParameter(name='colormap', value='jet', format='str')
125 opObj12.addParameter(name='localtime', value=localtime,format='int')
129 opObj12.addParameter(name='localtime', value=localtime,format='int')
126 opObj12.addParameter(name='show', value = showSPC, format='int')
130 opObj12.addParameter(name='show', value = showSPC, format='int')
127
131
128
132
129 ##Generate *.pdata from AMISR data
133 ##Generate *.pdata from AMISR data
130 ##.......................................................................................
134 ##.......................................................................................
131 ##.......................................................................................
135 ##.......................................................................................
132 opObj13 = procUnitConfObj1.addOperation(name='SpectraWriter', optype='external')
136 opObj13 = procUnitConfObj1.addOperation(name='SpectraWriter', optype='external')
133 opObj13.addParameter(name='path', value=outPath)
137 opObj13.addParameter(name='path', value=outPath)
134 opObj13.addParameter(name='blocksPerFile', value='10', format='int')
138 opObj13.addParameter(name='blocksPerFile', value='10', format='int')
135
139
136
140
137 opObj14 = procUnitConfObj1.addOperation(name='NoisePlot', optype='external')
141 opObj14 = procUnitConfObj1.addOperation(name='NoisePlot', optype='external')
138 opObj14.addParameter(name='id', value='3', format='int')
142 opObj14.addParameter(name='id', value='3', format='int')
139 opObj14.addParameter(name='wintitle', value='title0', format='str')
143 opObj14.addParameter(name='wintitle', value='title0', format='str')
140 opObj14.addParameter(name='showprofile', value='0', format='int')
144 opObj14.addParameter(name='showprofile', value='0', format='int')
141 opObj14.addParameter(name='xmin', value=xmin, format='int')
145 opObj14.addParameter(name='tmin', value=xmin, format='int')
142 opObj14.addParameter(name='xmax', value=xmax, format='int')
146 opObj14.addParameter(name='tmax', value=xmax, format='int')
143 opObj14.addParameter(name='ymin', value=dbmin, format='int')
147 opObj14.addParameter(name='ymin', value=dbmin, format='int')
144 opObj14.addParameter(name='ymax', value=dbmax, format='int')
148 opObj14.addParameter(name='ymax', value=dbmax, format='int')
145 opObj14.addParameter(name='save', value=outPath, format='str')
149 opObj14.addParameter(name='save', value=outPath, format='str')
146 opObj14.addParameter(name='localtime', value=localtime,format='int')
150 opObj14.addParameter(name='localtime', value=localtime,format='int')
147 opObj14.addParameter(name='show', value = showNOISE, format='int')
151 opObj14.addParameter(name='show', value = showNOISE, format='int')
148
152
149
153 #
150 opObj15 = procUnitConfObj1.addOperation(name='RTIPlot', optype='external')
154 opObj15 = procUnitConfObj1.addOperation(name='RTIPlot', optype='external')
151 opObj15.addParameter(name='id', value='2', format='int')
155 opObj15.addParameter(name='id', value='2', format='int')
152 opObj15.addParameter(name='localtime', value=localtime,format='int')
156 opObj15.addParameter(name='localtime', value=localtime,format='int')
153 opObj15.addParameter(name='wintitle', value='RTI', format='str')
157 opObj15.addParameter(name='wintitle', value='RTI', format='str')
154 opObj15.addParameter(name='xmin', value=xmin, format='int')
158 opObj15.addParameter(name='tmin', value=xmin, format='int')
155 opObj15.addParameter(name='xmax', value=xmax, format='int') #max value =23
159 opObj15.addParameter(name='tmax', value=xmax, format='int') #max value =23
156 opObj15.addParameter(name='ymin', value=ymin, format='int')
160 opObj15.addParameter(name='ymin', value=ymin, format='int')
157 opObj15.addParameter(name='zmin', value=dbmin, format='int')
161 opObj15.addParameter(name='zmin', value=dbmin, format='int')
158 opObj15.addParameter(name='zmax', value=dbmax, format='int')
162 opObj15.addParameter(name='zmax', value=dbmax, format='int')
159 opObj15.addParameter(name='showprofile', value='0', format='int')
163 opObj15.addParameter(name='showprofile', value='0', format='int')
160 opObj15.addParameter(name='save', value=outPath+'/plots', format='str')
164 opObj15.addParameter(name='save', value=outPath+'/plots', format='str')
161 opObj15.addParameter(name='colormap', value='jet', format='str')
165 opObj15.addParameter(name='colormap', value='jet', format='str')
162 opObj15.addParameter(name='show', value = showRTI, format='int')
166 opObj15.addParameter(name='show', value = showRTI, format='int')
163
167
164
168
165
169
166 ##.......................................................................................
170 ##.......................................................................................
167 ##.......................................................................................
171 ##.......................................................................................
168
172
169 procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObj1.getId())
173 procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObj1.getId())
170 opObj16 = procUnitConfObj2.addOperation(name='SpectralMoments', optype='other')
174 opObj16 = procUnitConfObj2.addOperation(name='SpectralMoments', optype='other')
171
175
172
176
173 #Using ParamWriter::::
177 #Using HDFWriter::::
174 ##.......................................................................................
178 ##.......................................................................................
175 ##.......................................................................................
179 ##.......................................................................................
176 opObj17 = procUnitConfObj2.addOperation(name='ParamWriter', optype='external')
180 opObj17 = procUnitConfObj2.addOperation(name='HDFWriter', optype='external')
177 opObj17.addParameter(name='path', value=outPath)
181 opObj17.addParameter(name='path', value=outPath)
178 opObj17.addParameter(name='blocksPerFile', value='10', format='int')
182 opObj17.addParameter(name='blocksPerFile', value='10', format='int')
179 opObj17.addParameter(name='metadataList',value='type,inputUnit,heightList',format='list')
183 opObj17.addParameter(name='metadataList',value='type,inputUnit,heightList',format='list')
180 opObj17.addParameter(name='dataList',value='moments,data_SNR,utctime',format='list')
184 opObj17.addParameter(name='dataList',value='moments,data_SNR,utctime',format='list')
181 opObj17.addParameter(name='mode',value='1',format='int') #'0' channels, '1' parameters, '3' table (for meteors)
185
182 ##opObj17.addParameter(name='setType', value ='anything', format='str')#no usar
183
186
184
187
185 ##.......................................................................................
188 ##.......................................................................................
186 ##.......................................................................................
189 ##.......................................................................................
187 #print("Escribiendo el archivo XML",controllerObj.writeXml(path +'/'+filename))
190 #print("Escribiendo el archivo XML",controllerObj.writeXml(path +'/'+filename))
188
191
189 controllerObj.start()
192 controllerObj.start()
190
193
191 #print("Leyendo el archivo XML",controllerObj.readXml(path +'/'+filename))
194 #print("Leyendo el archivo XML",controllerObj.readXml(path +'/'+filename))
192
195
193 ##.......................................................................................
196 ##.......................................................................................
194 ##.......................................................................................
197 ##.......................................................................................
195
198
196 if __name__ == '__main__':
199 if __name__ == '__main__':
197 import time
200 import time
198 start_time = time.time()
201 start_time = time.time()
199 main()
202 main()
200 print("--- %s seconds ---" % (time.time() - start_time))
203 print("--- %s seconds ---" % (time.time() - start_time))
1 NO CONTENT: file was removed
NO CONTENT: file was removed
General Comments 0
You need to be logged in to leave comments. Login now