##// END OF EJS Templates
Merge branch 'v3.0-WR' of http://intranet.igp.gob.pe:8082/schain into v3.0-WR
Juan C. Espinoza -
r1539:03a9c71b14ee merge
parent child
Show More
@@ -0,0 +1,418
1 # SOPHY PROC script
2 import os, sys, json, argparse
3 import datetime
4 import time
5
6 PATH = '/DATA_RM/DATA'
7 PATH = '/media/jespinoza/Elements'
8 PATH = '/media/jespinoza/data/SOPHY'
9 PATH = '/home/soporte/Documents/EVENTO/'
10
11 # NOTA: EL GRABADO ESTA EN PARAM
12 PARAM = {
13 'S': {'zmin': -45, 'zmax': -25, 'colormap': 'jet', 'label': 'Power', 'wrname': 'power','cb_label': 'dBm', 'ch':0},
14 'SNR': {'zmin': -40, 'zmax': -20, 'colormap': 'jet', 'label': 'SNR', 'wrname': 'snr','cb_label': 'dB', 'ch':0},
15 'V': {'zmin': -12, 'zmax': 12, 'colormap': 'sophy_v', 'label': 'Velocity', 'wrname': 'velocity', 'cb_label': 'm/s', 'ch':0},
16 'R': {'zmin': 0, 'zmax': 1, 'colormap': 'jet', 'label': 'RhoHV', 'wrname':'rhoHV', 'cb_label': '', 'ch':0},
17 'P': {'zmin': -180,'zmax': 180,'colormap': 'RdBu_r', 'label': 'PhiDP', 'wrname':'phiDP' , 'cb_label': 'degrees', 'ch':0},
18 'D': {'zmin': -30, 'zmax': 80, 'colormap': 'sophy_r','label': 'ZDR','wrname':'differential_reflectivity' , 'cb_label': 'dBz','ch':0},
19 'Z': {'zmin': -30, 'zmax': 80, 'colormap': 'sophy_r','label': 'Reflectivity ', 'wrname':'reflectivity', 'cb_label': 'dBz','ch':0},
20 'W': {'zmin': 0, 'zmax': 15, 'colormap': 'sophy_w','label': 'Spectral Width', 'wrname':'spectral_width', 'cb_label': 'm/s', 'ch':0}
21 }
22
23 META = ['heightList', 'data_azi', 'data_ele', 'mode_op', 'latitude', 'longitude', 'altitude', 'heading', 'radar_name',
24 'institution', 'contact', 'h0', 'range_unit', 'prf', 'prf_unit', 'variable', 'variable_unit', 'n_pulses',
25 'pulse1_range', 'pulse1_width', 'pulse2_width', 'pulse1_repetitions', 'pulse2_repetitions', 'pulse_width_unit',
26 'snr_threshold','dataPP_NOISE']
27
28
29 def max_index(r, sample_rate, ipp):
30
31 return int(sample_rate*ipp*1e6 * r / 60) + int(sample_rate*ipp*1e6 * 1.2 / 60)
32
33 def main(args):
34
35 experiment = args.experiment
36 fp = open(os.path.join(PATH, experiment, 'experiment.conf'))
37 conf = json.loads(fp.read())
38
39 ipp_km = conf['usrp_tx']['ipp']
40 ipp = ipp_km * 2 /300000
41 sample_rate = conf['usrp_rx']['sample_rate']
42 axis = ['0' if x=='elevation' else '1' for x in conf['pedestal']['axis']] # AZIMUTH 1 ELEVACION 0
43 speed_axis = conf['pedestal']['speed']
44 steps = conf['pedestal']['table']
45 time_offset = args.time_offset
46 parameters = args.parameters
47 start_date = experiment.split('@')[1].split('T')[0].replace('-', '/')
48 end_date = start_date
49 if args.start_time:
50 start_time = args.start_time
51 else:
52 start_time = experiment.split('@')[1].split('T')[1].replace('-', ':')
53 end_time = '23:59:59'
54 N = int(1/(speed_axis[0]*ipp)) # 1 GRADO DE RESOLUCION
55 path = os.path.join(PATH, experiment, 'rawdata')
56 path_ped = os.path.join(PATH, experiment, 'position')
57 if args.label:
58 label = '-{}'.format(args.label)
59 else:
60 label = ''
61 path_plots = os.path.join(PATH, experiment, 'plots{}'.format(label))
62 path_save = os.path.join(PATH, experiment, 'param{}'.format(label))
63 RMIX = 1.62
64 H0 = -1.68
65 MASK = 0.3
66
67 from schainpy.controller import Project
68
69 project = Project()
70 project.setup(id='1', name='Sophy', description='sophy proc')
71
72 reader = project.addReadUnit(datatype='DigitalRFReader',
73 path=path,
74 startDate=start_date,
75 endDate=end_date,
76 startTime=start_time,
77 endTime=end_time,
78 delay=30,
79 online=args.online,
80 walk=1,
81 ippKm = ipp_km,
82 getByBlock = 1,
83 nProfileBlocks = N,
84 )
85
86 if not conf['usrp_tx']['enable_2']: # One Pulse
87 n_pulses = 1
88 pulse_1_width = conf['usrp_tx']['pulse_1']
89 pulse_1_repetitions = conf['usrp_tx']['repetitions_1']
90 pulse_2_width = 0
91 pulse_2_repetitions = 0
92
93 voltage = project.addProcUnit(datatype='VoltageProc', inputId=reader.getId())
94
95 if conf['usrp_tx']['code_type_1'] != 'None':
96 codes = [ c.strip() for c in conf['usrp_tx']['code_1'].split(',')]
97 code = []
98 for c in codes:
99 code.append([int(x) for x in c])
100 op = voltage.addOperation(name='Decoder', optype='other')
101 op.addParameter(name='code', value=code)
102 op.addParameter(name='nCode', value=len(code), format='int')
103 op.addParameter(name='nBaud', value=len(code[0]), format='int')
104
105 op = voltage.addOperation(name='CohInt', optype='other') #Minimo integrar 2 perfiles por ser codigo complementario
106 op.addParameter(name='n', value=len(code), format='int')
107 ncode = len(code)
108 else:
109 ncode = 1
110 code = ['0']
111
112 op = voltage.addOperation(name='setH0')
113 op.addParameter(name='h0', value=H0)
114
115 if args.range > 0:
116 op = voltage.addOperation(name='selectHeights')
117 op.addParameter(name='minIndex', value='0', format='int')
118 op.addParameter(name='maxIndex', value=max_index(args.range, sample_rate, ipp), format='int')
119
120 op = voltage.addOperation(name='PulsePair_vRF', optype='other')
121 op.addParameter(name='n', value=int(N)/ncode, format='int')
122
123 proc = project.addProcUnit(datatype='ParametersProc', inputId=voltage.getId())
124
125 opObj10 = proc.addOperation(name="WeatherRadar")
126 opObj10.addParameter(name='tauW',value=(1e-6/sample_rate)*len(code[0]))
127 opObj10.addParameter(name='Pt',value=((1e-6/sample_rate)*len(code[0])/ipp)*200)
128
129 op = proc.addOperation(name='PedestalInformation')
130 op.addParameter(name='path', value=path_ped, format='str')
131 op.addParameter(name='interval', value='0.04')
132 op.addParameter(name='time_offset', value=time_offset)
133 op.addParameter(name='mode', value='PPI')
134
135 for param in parameters:
136 op = proc.addOperation(name='Block360')
137 op.addParameter(name='runNextOp', value=True)
138
139 op= proc.addOperation(name='WeatherParamsPlot')
140 if args.save: op.addParameter(name='save', value=path_plots, format='str')
141 op.addParameter(name='save_period', value=-1)
142 op.addParameter(name='show', value=args.show)
143 op.addParameter(name='channels', value='1,')
144 op.addParameter(name='zmin', value=PARAM[param]['zmin'])
145 op.addParameter(name='zmax', value=PARAM[param]['zmax'])
146 op.addParameter(name='attr_data', value=param, format='str')
147 op.addParameter(name='labels', value=[PARAM[param]['label']])
148 op.addParameter(name='save_code', value=param)
149 op.addParameter(name='cb_label', value=PARAM[param]['cb_label'])
150 op.addParameter(name='colormap', value=PARAM[param]['colormap'])
151 op.addParameter(name='bgcolor', value='black')
152 if MASK: op.addParameter(name='mask', value=MASK, format='float')
153 if args.server:
154 op.addParameter(name='server', value='0.0.0.0:4444')
155 op.addParameter(name='exp_code', value='400')
156
157 desc = {
158 'Data': {
159 param: PARAM[param]['wrname'],
160 'utctime': 'time'
161 },
162 'Metadata': {
163 'heightList': 'range',
164 'data_azi': 'azimuth',
165 'data_ele': 'elevation',
166 'mode_op': 'scan_type',
167 'h0': 'range_correction',
168 }
169 }
170
171 if args.save:
172 writer = merge.addOperation(name='HDFWriter')
173 writer.addParameter(name='path', value=path_save, format='str')
174 writer.addParameter(name='Reset', value=True)
175 writer.addParameter(name='setType', value='weather')
176 writer.addParameter(name='description', value=json.dumps(desc))
177 writer.addParameter(name='blocksPerFile', value='1',format='int')
178 writer.addParameter(name='metadataList', value=','.join(META))
179 writer.addParameter(name='dataList', value='data_param,utctime')
180 writer.addParameter(name='weather_var', value=param)
181 writer.addParameter(name='mask', value=MASK, format='float')
182 # meta
183 writer.addParameter(name='latitude', value='-12.040436')
184 writer.addParameter(name='longitude', value='-75.295893')
185 writer.addParameter(name='altitude', value='3379.2147')
186 writer.addParameter(name='heading', value='0')
187 writer.addParameter(name='radar_name', value='SOPHy')
188 writer.addParameter(name='institution', value='IGP')
189 writer.addParameter(name='contact', value='dscipion@igp.gob.pe')
190 writer.addParameter(name='created_by', value='Signal Chain (https://pypi.org/project/schainpy/)')
191 writer.addParameter(name='range_unit', value='km')
192 writer.addParameter(name='prf', value=1/ipp)
193 writer.addParameter(name='prf_unit', value='hertz')
194 writer.addParameter(name='variable', value=PARAM[param]['label'])
195 writer.addParameter(name='variable_unit', value=PARAM[param]['cb_label'])
196 writer.addParameter(name='n_pulses', value=n_pulses)
197 writer.addParameter(name='pulse1_range', value=RMIX)
198 writer.addParameter(name='pulse1_width', value=pulse_1_width)
199 writer.addParameter(name='pulse2_width', value=pulse_2_width)
200 writer.addParameter(name='pulse1_repetitions', value=pulse_1_repetitions)
201 writer.addParameter(name='pulse2_repetitions', value=pulse_2_repetitions)
202 writer.addParameter(name='pulse_width_unit', value='microseconds')
203 writer.addParameter(name='snr_threshold', value=MASK)
204
205
206 else: #Two pulses
207 n_pulses = 1
208 pulse_1_width = conf['usrp_tx']['pulse_1']
209 pulse_1_repetitions = conf['usrp_tx']['repetitions_1']
210 pulse_2_width = conf['usrp_tx']['pulse_2']
211 pulse_2_repetitions = conf['usrp_tx']['repetitions_2']
212
213 voltage1 = project.addProcUnit(datatype='VoltageProc', inputId=reader.getId())
214
215 op = voltage1.addOperation(name='ProfileSelector')
216 op.addParameter(name='profileRangeList', value='0,{}'.format(conf['usrp_tx']['repetitions_1']-1))
217
218 if conf['usrp_tx']['code_type_1'] != 'None':
219 codes = [ c.strip() for c in conf['usrp_tx']['code_1'].split(',')]
220 code = []
221 for c in codes:
222 code.append([int(x) for x in c])
223 op = voltage1.addOperation(name='Decoder', optype='other')
224 op.addParameter(name='code', value=code)
225 op.addParameter(name='nCode', value=len(code), format='int')
226 op.addParameter(name='nBaud', value=len(code[0]), format='int')
227 else:
228 code = ['0']
229
230 op = voltage1.addOperation(name='CohInt', optype='other') #Minimo integrar 2 perfiles por ser codigo complementario
231 op.addParameter(name='n', value=2, format='int')
232
233 if args.range > 0:
234 op = voltage1.addOperation(name='selectHeights')
235 op.addParameter(name='minIndex', value='0', format='int')
236 op.addParameter(name='maxIndex', value=max_index(RMIX, sample_rate, ipp), format='int')
237
238 op = voltage1.addOperation(name='setH0')
239 op.addParameter(name='h0', value=H0, format='float')
240
241 op = voltage1.addOperation(name='PulsePair_vRF', optype='other')
242 op.addParameter(name='n', value=int(conf['usrp_tx']['repetitions_1'])/2, format='int')
243
244 proc1 = project.addProcUnit(datatype='ParametersProc', inputId=voltage1.getId())
245 proc1.addParameter(name='runNextUnit', value=True)
246
247 opObj10 = proc1.addOperation(name="WeatherRadar")
248 opObj10.addParameter(name='tauW',value=(1e-6/sample_rate)*len(code[0]))
249 opObj10.addParameter(name='Pt',value=((1e-6/sample_rate)*len(code[0])/ipp)*200)
250
251 op = proc1.addOperation(name='PedestalInformation')
252 op.addParameter(name='path', value=path_ped, format='str')
253 op.addParameter(name='interval', value='0.04')
254 op.addParameter(name='time_offset', value=time_offset)
255 op.addParameter(name='mode', value='PPI')
256
257 op = proc1.addOperation(name='Block360')
258 op.addParameter(name='attr_data', value='data_param')
259 op.addParameter(name='runNextOp', value=True)
260
261
262 voltage2 = project.addProcUnit(datatype='VoltageProc', inputId=reader.getId())
263
264 op = voltage2.addOperation(name='ProfileSelector')
265 op.addParameter(name='profileRangeList', value='{},{}'.format(conf['usrp_tx']['repetitions_1'], conf['usrp_tx']['repetitions_1']+conf['usrp_tx']['repetitions_2']-1))
266
267 if conf['usrp_tx']['code_type_2']:
268 codes = [ c.strip() for c in conf['usrp_tx']['code_2'].split(',')]
269 code = []
270 for c in codes:
271 code.append([int(x) for x in c])
272 op = voltage2.addOperation(name='Decoder', optype='other')
273 op.addParameter(name='code', value=code)
274 op.addParameter(name='nCode', value=len(code), format='int')
275 op.addParameter(name='nBaud', value=len(code[0]), format='int')
276
277 op = voltage2.addOperation(name='CohInt', optype='other') #Minimo integrar 2 perfiles por ser codigo complementario
278 op.addParameter(name='n', value=len(code), format='int')
279 ncode = len(code)
280 else:
281 ncode = 1
282
283 if args.range > 0:
284 op = voltage2.addOperation(name='selectHeights')
285 op.addParameter(name='minIndex', value=max_index(RMIX, sample_rate, ipp), format='int')
286 op.addParameter(name='maxIndex', value=max_index(args.range, sample_rate, ipp), format='int')
287
288 op = voltage2.addOperation(name='setH0')
289 op.addParameter(name='h0', value=H0, format='float')
290
291 op = voltage2.addOperation(name='PulsePair_vRF', optype='other')
292 op.addParameter(name='n', value=int(conf['usrp_tx']['repetitions_2'])/ncode, format='int')
293
294 proc2 = project.addProcUnit(datatype='ParametersProc', inputId=voltage2.getId())
295 proc2.addParameter(name='runNextUnit', value=True)
296
297 opObj10 = proc2.addOperation(name="WeatherRadar")
298 opObj10.addParameter(name='tauW',value=(1e-6/sample_rate)*len(code[0]))
299 opObj10.addParameter(name='Pt',value=((1e-6/sample_rate)*len(code[0])/ipp)*200)
300
301 op = proc2.addOperation(name='PedestalInformation')
302 op.addParameter(name='path', value=path_ped, format='str')
303 op.addParameter(name='interval', value='0.04')
304 op.addParameter(name='time_offset', value=time_offset)
305 op.addParameter(name='mode', value='PPI')
306
307 op = proc2.addOperation(name='Block360')
308 op.addParameter(name='attr_data', value='data_param')
309 op.addParameter(name='runNextOp', value=True)
310
311 merge = project.addProcUnit(datatype='MergeProc', inputId=[proc1.getId(), proc2.getId()])
312 merge.addParameter(name='attr_data', value='data_param')
313 merge.addParameter(name='mode', value='7') #RM
314
315
316 for param in parameters:
317
318 if args.plot:
319 op= merge.addOperation(name='WeatherParamsPlot')
320 if args.save:
321 op.addParameter(name='save', value=path_plots, format='str')
322 op.addParameter(name='save_period', value=-1)
323 op.addParameter(name='show', value=args.show)
324 op.addParameter(name='channels', value='0,')
325 op.addParameter(name='zmin', value=PARAM[param]['zmin'], format='int')
326 op.addParameter(name='zmax', value=PARAM[param]['zmax'], format='int')
327 op.addParameter(name='attr_data', value=param, format='str')
328 op.addParameter(name='labels', value=[PARAM[param]['label']])
329 op.addParameter(name='save_code', value=param)
330 op.addParameter(name='cb_label', value=PARAM[param]['cb_label'])
331 op.addParameter(name='colormap', value=PARAM[param]['colormap'])
332 op.addParameter(name='bgcolor', value='black')
333 if MASK: op.addParameter(name='mask', value=MASK, format='float')
334 if args.server:
335 op.addParameter(name='server', value='0.0.0.0:4444')
336 op.addParameter(name='exp_code', value='400')
337
338 desc = {
339 'Data': {
340 'data_param': {PARAM[param]['wrname']: ['H', 'V']},
341 'utctime': 'time'
342 },
343 'Metadata': {
344 'heightList': 'range',
345 'data_azi': 'azimuth',
346 'data_ele': 'elevation',
347 'mode_op': 'scan_type',
348 'h0': 'range_correction',
349 'dataPP_NOISE': 'noise',
350 }
351 }
352
353 if args.save:
354 writer = merge.addOperation(name='HDFWriter')
355 writer.addParameter(name='path', value=path_save, format='str')
356 writer.addParameter(name='Reset', value=True)
357 writer.addParameter(name='setType', value='weather')
358 writer.addParameter(name='description', value=json.dumps(desc))
359 writer.addParameter(name='blocksPerFile', value='1',format='int')
360 writer.addParameter(name='metadataList', value=','.join(META))
361 writer.addParameter(name='dataList', value='data_param,utctime')
362 writer.addParameter(name='weather_var', value=param)
363 writer.addParameter(name='mask', value=MASK, format='float')
364 # meta
365 writer.addParameter(name='latitude', value='-12.040436')
366 writer.addParameter(name='longitude', value='-75.295893')
367 writer.addParameter(name='altitude', value='3379.2147')
368 writer.addParameter(name='heading', value='0')
369 writer.addParameter(name='radar_name', value='SOPHy')
370 writer.addParameter(name='institution', value='IGP')
371 writer.addParameter(name='contact', value='dscipion@igp.gob.pe')
372 writer.addParameter(name='created_by', value='Signal Chain (https://pypi.org/project/schainpy/)')
373 writer.addParameter(name='range_unit', value='km')
374 writer.addParameter(name='prf', value=1/ipp)
375 writer.addParameter(name='prf_unit', value='hertz')
376 writer.addParameter(name='variable', value=PARAM[param]['label'])
377 writer.addParameter(name='variable_unit', value=PARAM[param]['cb_label'])
378 writer.addParameter(name='n_pulses', value=n_pulses)
379 writer.addParameter(name='pulse1_range', value=RMIX)
380 writer.addParameter(name='pulse1_width', value=pulse_1_width)
381 writer.addParameter(name='pulse2_width', value=pulse_2_width)
382 writer.addParameter(name='pulse1_repetitions', value=pulse_1_repetitions)
383 writer.addParameter(name='pulse2_repetitions', value=pulse_2_repetitions)
384 writer.addParameter(name='pulse_width_unit', value='microseconds')
385 writer.addParameter(name='snr_threshold', value=MASK)
386
387
388 project.start()
389
390 if __name__ == '__main__':
391
392 parser = argparse.ArgumentParser(description='Script to process SOPHy data.')
393 parser.add_argument('experiment',
394 help='Experiment name')
395 parser.add_argument('--parameters', nargs='*', default=['S'],
396 help='Variables to process: P, Z, V')
397 parser.add_argument('--time_offset', default=0,
398 help='Fix time offset')
399 parser.add_argument('--range', default=0, type=float,
400 help='Max range to plot')
401 parser.add_argument('--save', action='store_true',
402 help='Create output files')
403 parser.add_argument('--plot', action='store_true',
404 help='Create plot files')
405 parser.add_argument('--show', action='store_true',
406 help='Show matplotlib plot.')
407 parser.add_argument('--online', action='store_true',
408 help='Set online mode.')
409 parser.add_argument('--server', action='store_true',
410 help='Send to realtime')
411 parser.add_argument('--start_time', default='',
412 help='Set start time.')
413 parser.add_argument('--label', default='',
414 help='Label for plot & param folder')
415
416 args = parser.parse_args()
417
418 main(args)
@@ -0,0 +1,117
1 import os,sys,json
2 import datetime
3 import time
4 import argparse
5
6 from schainpy.controller import Project
7 '''
8 NOTA:
9 Este script de prueba.
10 - Unidad del lectura 'HDFReader'.
11 - Unidad de procesamiento ParametersProc
12 '''
13 PATH = "/home/soporte/Documents/EVENTO/HYO_PM@2022-06-09T15-05-12/paramC0N36.0/2022-06-09T18-00-00/"
14 #PATH = "/home/soporte/Documents/EVENTO/HYO_PM@2022-06-09T15-05-12/param/2022-06-09T18-00-00/"
15
16 #PATH = "/home/soporte/Documents/EVENTO/HYO_PM@2022-06-09T15-05-12/paramC0N36.0/2022-06-09T19-00-00/"
17 #PATH = "/home/soporte/Documents/EVENTO/HYO_PM@2022-05-31T12-00-17/paramC0N36.0/2022-05-31T16-00-00/"
18 path = PATH
19 PARAM = {
20 'S': {'zmin': -45, 'zmax': -25, 'colormap': 'jet', 'label': 'Power', 'wrname': 'power','cb_label': 'dBm', 'ch':0},
21 'SNR': {'zmin': -40, 'zmax': -20, 'colormap': 'jet', 'label': 'SNR', 'wrname': 'snr','cb_label': 'dB', 'ch':0},
22 'V': {'zmin': -12, 'zmax': 12, 'colormap': 'sophy_v', 'label': 'Velocity', 'wrname': 'velocity', 'cb_label': 'm/s', 'ch':0},
23 'R': {'zmin': 0, 'zmax': 1, 'colormap': 'jet', 'label': 'RhoHV', 'wrname':'rhoHV', 'cb_label': '*', 'ch':0},
24 'P': {'zmin': -180,'zmax': 180,'colormap': 'RdBu_r', 'label': 'PhiDP', 'wrname':'phiDP' , 'cb_label': 'ΒΊ', 'ch':0},
25 'D': {'zmin': -30, 'zmax': 80, 'colormap': 'sophy_r','label': 'ZDR','wrname':'differential_reflectivity' , 'cb_label': 'dBz','ch':0},
26 'Z': {'zmin': -30, 'zmax': 80, 'colormap': 'sophy_r','label': 'Reflectivity ', 'wrname':'reflectivity', 'cb_label': 'dBz','ch':0},
27 'W': {'zmin': 0, 'zmax': 15, 'colormap': 'sophy_w','label': 'Spectral Width', 'wrname':'spectral_width', 'cb_label': 'm/s', 'ch':0}
28 }
29
30 def main(args):
31 #filefmt="******%Y%m%d*%H%M%S*******"
32 #filefmt="SOPHY_20220609_184620_E8.0_Z"
33 parameters = args.parameters
34 grado = args.grado
35 MASK = None
36
37 for param in parameters:
38 filefmt ="******%Y%m%d*%H%M%S*******"
39 filter= "_E"+str(grado)+".0_"+param
40 variable = 'Data/'+PARAM[param]['wrname']+'/H'
41 desc = {
42 'Data': {
43 'data_param': [variable],
44 'utctime' : 'Data/time'
45 },
46 'Metadata': {
47 'heightList': 'Metadata/range',
48 'data_azi' : 'Metadata/azimuth',
49 'data_ele' : 'Metadata/elevation',
50 'mode_op' : 'Metadata/scan_type',
51 'h0' : 'Metadata/range_correction',
52 }
53 }
54
55 project = Project()
56
57 project.setup(id='10',name='Test Simulator',description=desc)
58
59 readUnitConfObj = project.addReadUnit(datatype='HDFReader',
60 path=path,
61 startDate="2022/01/01", #"2020/01/01",#today,
62 endDate= "2022/12/01", #"2020/12/30",#today,
63 startTime='00:00:00',
64 endTime='23:59:59',
65 delay=0,
66 #set=0,
67 online=0,
68 walk=0,
69 filefmt=filefmt,
70 filter=filter,
71 dparam= 1,
72 description= json.dumps(desc))#1
73
74 proc1 = project.addProcUnit(datatype='ParametersProc',inputId=readUnitConfObj.getId())
75
76 if args.plot:
77 print("plotea")
78 op= proc1.addOperation(name='WeatherParamsPlot')
79 if args.save:
80 op.addParameter(name='save', value=path_plots, format='str')
81 op.addParameter(name='save_period', value=-1)
82 op.addParameter(name='show', value=args.show)
83 op.addParameter(name='channels', value='0,')
84 op.addParameter(name='zmin', value=PARAM[param]['zmin'], format='int')
85 op.addParameter(name='zmax', value=PARAM[param]['zmax'], format='int')
86 op.addParameter(name='attr_data', value=param, format='str')
87 op.addParameter(name='labels', value=[PARAM[param]['label']])
88 op.addParameter(name='save_code', value=param)
89 op.addParameter(name='cb_label', value=PARAM[param]['cb_label'])
90 op.addParameter(name='colormap', value=PARAM[param]['colormap'])
91 op.addParameter(name='bgcolor', value='black')
92 if MASK: op.addParameter(name='mask', value=MASK, format='float')
93 if args.server:
94 op.addParameter(name='server', value='0.0.0.0:4444')
95 op.addParameter(name='exp_code', value='400')
96 project.start()
97
98 if __name__ == '__main__':
99
100 parser = argparse.ArgumentParser(description='Script to process SOPHy data.')
101 parser.add_argument('--parameters', nargs='*', default=['S'],
102 help='Variables to process: P, Z, V ,W')
103 parser.add_argument('--grado', default=2,
104 help='Angle in Elev to plot')
105 parser.add_argument('--save', default=0,
106 help='Save plot')
107 parser.add_argument('--range', default=0, type=float,
108 help='Max range to plot')
109 parser.add_argument('--plot', action='store_true',
110 help='Create plot files')
111 parser.add_argument('--show', action='store_true',
112 help='Show matplotlib plot.')
113 parser.add_argument('--server', action='store_true',
114 help='Send to realtime')
115 args = parser.parse_args()
116
117 main(args)
@@ -557,20 +557,23 class WeatherParamsPlot(Plot):
557 'P' : 6,
557 'P' : 6,
558 'R' : 7,
558 'R' : 7,
559 }
559 }
560
560
561 data = {}
561 data = {}
562 meta = {}
562 meta = {}
563
563
564 if hasattr(dataOut, 'nFFTPoints'):
564 if hasattr(dataOut, 'nFFTPoints'):
565 factor = dataOut.normFactor
565 factor = dataOut.normFactor
566 else:
566 else:
567 factor = 1
567 factor = 1
568
568
569 if 'S' in self.attr_data[0]:
569 if hasattr(dataOut, 'dparam'):
570 tmp = 10*numpy.log10(10.0*getattr(dataOut, 'data_param')[:,0,:]/(factor))
570 tmp = getattr(dataOut, 'data_param')
571 else:
571 else:
572 tmp = getattr(dataOut, 'data_param')[:,vars[self.attr_data[0]],:]
572
573
573 if 'S' in self.attr_data[0]:
574 tmp = 10*numpy.log10(10.0*getattr(dataOut, 'data_param')[:,0,:]/(factor))
575 else:
576 tmp = getattr(dataOut, 'data_param')[:,vars[self.attr_data[0]],:]
574
577
575 if self.mask:
578 if self.mask:
576 mask = dataOut.data_param[:,3,:] < self.mask
579 mask = dataOut.data_param[:,3,:] < self.mask
@@ -603,7 +606,7 class WeatherParamsPlot(Plot):
603 el = numpy.repeat(data['ele'], data['data'].shape[1])
606 el = numpy.repeat(data['ele'], data['data'].shape[1])
604
607
605 # lla = georef.spherical_to_proj(r, data['azi'], data['ele'], (-75.295893, -12.040436, 3379.2147))
608 # lla = georef.spherical_to_proj(r, data['azi'], data['ele'], (-75.295893, -12.040436, 3379.2147))
606
609
607 latlon = antenna_to_geographic(r, az, el, (-75.295893, -12.040436))
610 latlon = antenna_to_geographic(r, az, el, (-75.295893, -12.040436))
608
611
609 if self.mask:
612 if self.mask:
@@ -628,6 +631,9 class WeatherParamsPlot(Plot):
628 self.zmax = self.zmax if self.zmax else numpy.nanmax(z)
631 self.zmax = self.zmax if self.zmax else numpy.nanmax(z)
629 self.zmin = self.zmin if self.zmin is not None else numpy.nanmin(z)
632 self.zmin = self.zmin if self.zmin is not None else numpy.nanmin(z)
630
633
634 if isinstance(data['mode_op'], bytes):
635 data['mode_op'] = data['mode_op'].decode()
636
631 if data['mode_op'] == 'RHI':
637 if data['mode_op'] == 'RHI':
632 try:
638 try:
633 if self.data['mode_op'][-2] == 'PPI':
639 if self.data['mode_op'][-2] == 'PPI':
@@ -481,6 +481,7 class Reader(object):
481 folderfmt = None
481 folderfmt = None
482 open_file = open
482 open_file = open
483 open_mode = 'rb'
483 open_mode = 'rb'
484 filter =None
484
485
485 def run(self):
486 def run(self):
486
487
@@ -519,11 +520,13 class Reader(object):
519 return
520 return
520
521
521 def find_files(self, folders, ext, filefmt, startDate=None, endDate=None,
522 def find_files(self, folders, ext, filefmt, startDate=None, endDate=None,
522 expLabel='', last=False):
523 expLabel='', filter=None,last=False):
523
524
524 for path in folders:
525 for path in folders:
525 files = glob.glob1(path, '*{}'.format(ext))
526 files = glob.glob1(path, '*{}'.format(ext))
526 files.sort()
527 files.sort()
528 if filter is not None:
529 files= [ file for file in files if os.path.splitext(file)[0][-len(filter):] == filter]
527 if last:
530 if last:
528 if files:
531 if files:
529 fo = files[-1]
532 fo = files[-1]
@@ -549,7 +552,7 class Reader(object):
549
552
550 def searchFilesOffLine(self, path, startDate, endDate,
553 def searchFilesOffLine(self, path, startDate, endDate,
551 expLabel, ext, walk,
554 expLabel, ext, walk,
552 filefmt, folderfmt):
555 filefmt, folderfmt,filter):
553 """Search files in offline mode for the given arguments
556 """Search files in offline mode for the given arguments
554
557
555 Return:
558 Return:
@@ -563,11 +566,11 class Reader(object):
563 folders = path.split(',')
566 folders = path.split(',')
564
567
565 return self.find_files(
568 return self.find_files(
566 folders, ext, filefmt, startDate, endDate, expLabel)
569 folders, ext, filefmt, startDate, endDate, expLabel,filter)
567
570
568 def searchFilesOnLine(self, path, startDate, endDate,
571 def searchFilesOnLine(self, path, startDate, endDate,
569 expLabel, ext, walk,
572 expLabel, ext, walk,
570 filefmt, folderfmt):
573 filefmt, folderfmt,filter):
571 """Search for the last file of the last folder
574 """Search for the last file of the last folder
572
575
573 Arguments:
576 Arguments:
@@ -586,8 +589,7 class Reader(object):
586 else:
589 else:
587 folders = path.split(',')
590 folders = path.split(',')
588
591
589 return self.find_files(
592 return self.find_files(folders, ext, filefmt, startDate, endDate, expLabel, filter,last=True)
590 folders, ext, filefmt, startDate, endDate, expLabel, last=True)
591
593
592 def setNextFile(self):
594 def setNextFile(self):
593 """Set the next file to be readed open it and parse de file header"""
595 """Set the next file to be readed open it and parse de file header"""
@@ -95,6 +95,8 class HDFReader(Reader, ProcessingUnit):
95 self.filefmt = "*%Y%j***"
95 self.filefmt = "*%Y%j***"
96 self.folderfmt = "*%Y%j"
96 self.folderfmt = "*%Y%j"
97 self.utcoffset = 0
97 self.utcoffset = 0
98 self.filter = None
99 self.dparam = None
98
100
99 def setup(self, **kwargs):
101 def setup(self, **kwargs):
100
102
@@ -108,7 +110,7 class HDFReader(Reader, ProcessingUnit):
108 for nTries in range(self.nTries):
110 for nTries in range(self.nTries):
109 fullpath = self.searchFilesOnLine(self.path, self.startDate,
111 fullpath = self.searchFilesOnLine(self.path, self.startDate,
110 self.endDate, self.expLabel, self.ext, self.walk,
112 self.endDate, self.expLabel, self.ext, self.walk,
111 self.filefmt, self.folderfmt)
113 self.filefmt, self.folderfmt,self.filter)
112 try:
114 try:
113 fullpath = next(fullpath)
115 fullpath = next(fullpath)
114 except:
116 except:
@@ -134,7 +136,7 class HDFReader(Reader, ProcessingUnit):
134 else:
136 else:
135 log.log("Searching files in {}".format(self.path), self.name)
137 log.log("Searching files in {}".format(self.path), self.name)
136 self.filenameList = self.searchFilesOffLine(self.path, self.startDate,
138 self.filenameList = self.searchFilesOffLine(self.path, self.startDate,
137 self.endDate, self.expLabel, self.ext, self.walk, self.filefmt, self.folderfmt)
139 self.endDate, self.expLabel, self.ext, self.walk, self.filefmt, self.folderfmt,self.filter)
138
140
139 self.setNextFile()
141 self.setNextFile()
140
142
@@ -150,6 +152,9 class HDFReader(Reader, ProcessingUnit):
150 if 'type' in self.meta:
152 if 'type' in self.meta:
151 self.dataOut = eval(self.meta['type'])()
153 self.dataOut = eval(self.meta['type'])()
152
154
155 if self.dparam:
156 setattr(self.dataOut, "dparam", 1)
157
153 for attr in self.meta:
158 for attr in self.meta:
154 setattr(self.dataOut, attr, self.meta[attr])
159 setattr(self.dataOut, attr, self.meta[attr])
155
160
@@ -172,7 +177,10 class HDFReader(Reader, ProcessingUnit):
172 startTime = self.startTime
177 startTime = self.startTime
173 endTime = self.endTime
178 endTime = self.endTime
174 thisUtcTime = self.data['utctime'] + self.utcoffset
179 thisUtcTime = self.data['utctime'] + self.utcoffset
175 self.interval = numpy.min(thisUtcTime[1:] - thisUtcTime[:-1])
180 try:
181 self.interval = numpy.min(thisUtcTime[1:] - thisUtcTime[:-1])
182 except:
183 self.interval = 0
176 thisDatetime = datetime.datetime.utcfromtimestamp(thisUtcTime[0])
184 thisDatetime = datetime.datetime.utcfromtimestamp(thisUtcTime[0])
177
185
178 thisDate = thisDatetime.date()
186 thisDate = thisDatetime.date()
@@ -256,7 +264,10 class HDFReader(Reader, ProcessingUnit):
256 if self.data[attr].ndim == 1:
264 if self.data[attr].ndim == 1:
257 setattr(self.dataOut, attr, self.data[attr][self.blockIndex])
265 setattr(self.dataOut, attr, self.data[attr][self.blockIndex])
258 else:
266 else:
259 setattr(self.dataOut, attr, self.data[attr][:, self.blockIndex])
267 if self.dparam:
268 setattr(self.dataOut, attr, self.data[attr])
269 else:
270 setattr(self.dataOut, attr, self.data[attr][:, self.blockIndex])
260
271
261 self.dataOut.flagNoData = False
272 self.dataOut.flagNoData = False
262 self.blockIndex += 1
273 self.blockIndex += 1
@@ -409,7 +420,7 class HDFWriter(Operation):
409 self.metadataList = self.dataOut.metadata_list
420 self.metadataList = self.dataOut.metadata_list
410
421
411 dsList = []
422 dsList = []
412
423
413 for i in range(len(self.dataList)):
424 for i in range(len(self.dataList)):
414 dsDict = {}
425 dsDict = {}
415 if hasattr(self.dataOut, self.dataList[i]):
426 if hasattr(self.dataOut, self.dataList[i]):
@@ -682,7 +693,7 class HDFWriter(Operation):
682 return
693 return
683
694
684 def putData(self):
695 def putData(self):
685
696
686 if (self.blockIndex == self.blocksPerFile) or self.timeFlag():
697 if (self.blockIndex == self.blocksPerFile) or self.timeFlag():
687 self.closeFile()
698 self.closeFile()
688 self.setNextFile()
699 self.setNextFile()
@@ -697,7 +708,7 class HDFWriter(Operation):
697 tmp = getattr(self.dataOut, attr)[:,self.weather_vars[self.weather_var],:][ch]
708 tmp = getattr(self.dataOut, attr)[:,self.weather_vars[self.weather_var],:][ch]
698 if self.mask:
709 if self.mask:
699 tmp[mask] = numpy.nan
710 tmp[mask] = numpy.nan
700 ds[:] = tmp
711 ds[:] = tmp
701 else:
712 else:
702 ds[self.blockIndex] = getattr(self.dataOut, attr)[ch]
713 ds[self.blockIndex] = getattr(self.dataOut, attr)[ch]
703
714
General Comments 0
You need to be logged in to leave comments. Login now