##// 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 557 'P' : 6,
558 558 'R' : 7,
559 559 }
560
560
561 561 data = {}
562 562 meta = {}
563
563
564 564 if hasattr(dataOut, 'nFFTPoints'):
565 565 factor = dataOut.normFactor
566 566 else:
567 567 factor = 1
568 568
569 if 'S' in self.attr_data[0]:
570 tmp = 10*numpy.log10(10.0*getattr(dataOut, 'data_param')[:,0,:]/(factor))
569 if hasattr(dataOut, 'dparam'):
570 tmp = getattr(dataOut, 'data_param')
571 571 else:
572 tmp = getattr(dataOut, 'data_param')[:,vars[self.attr_data[0]],:]
573
572
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 578 if self.mask:
576 579 mask = dataOut.data_param[:,3,:] < self.mask
@@ -603,7 +606,7 class WeatherParamsPlot(Plot):
603 606 el = numpy.repeat(data['ele'], data['data'].shape[1])
604 607
605 608 # lla = georef.spherical_to_proj(r, data['azi'], data['ele'], (-75.295893, -12.040436, 3379.2147))
606
609
607 610 latlon = antenna_to_geographic(r, az, el, (-75.295893, -12.040436))
608 611
609 612 if self.mask:
@@ -628,6 +631,9 class WeatherParamsPlot(Plot):
628 631 self.zmax = self.zmax if self.zmax else numpy.nanmax(z)
629 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 637 if data['mode_op'] == 'RHI':
632 638 try:
633 639 if self.data['mode_op'][-2] == 'PPI':
@@ -481,6 +481,7 class Reader(object):
481 481 folderfmt = None
482 482 open_file = open
483 483 open_mode = 'rb'
484 filter =None
484 485
485 486 def run(self):
486 487
@@ -519,11 +520,13 class Reader(object):
519 520 return
520 521
521 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 525 for path in folders:
525 526 files = glob.glob1(path, '*{}'.format(ext))
526 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 530 if last:
528 531 if files:
529 532 fo = files[-1]
@@ -549,7 +552,7 class Reader(object):
549 552
550 553 def searchFilesOffLine(self, path, startDate, endDate,
551 554 expLabel, ext, walk,
552 filefmt, folderfmt):
555 filefmt, folderfmt,filter):
553 556 """Search files in offline mode for the given arguments
554 557
555 558 Return:
@@ -563,11 +566,11 class Reader(object):
563 566 folders = path.split(',')
564 567
565 568 return self.find_files(
566 folders, ext, filefmt, startDate, endDate, expLabel)
569 folders, ext, filefmt, startDate, endDate, expLabel,filter)
567 570
568 571 def searchFilesOnLine(self, path, startDate, endDate,
569 572 expLabel, ext, walk,
570 filefmt, folderfmt):
573 filefmt, folderfmt,filter):
571 574 """Search for the last file of the last folder
572 575
573 576 Arguments:
@@ -586,8 +589,7 class Reader(object):
586 589 else:
587 590 folders = path.split(',')
588 591
589 return self.find_files(
590 folders, ext, filefmt, startDate, endDate, expLabel, last=True)
592 return self.find_files(folders, ext, filefmt, startDate, endDate, expLabel, filter,last=True)
591 593
592 594 def setNextFile(self):
593 595 """Set the next file to be readed open it and parse de file header"""
@@ -95,6 +95,8 class HDFReader(Reader, ProcessingUnit):
95 95 self.filefmt = "*%Y%j***"
96 96 self.folderfmt = "*%Y%j"
97 97 self.utcoffset = 0
98 self.filter = None
99 self.dparam = None
98 100
99 101 def setup(self, **kwargs):
100 102
@@ -108,7 +110,7 class HDFReader(Reader, ProcessingUnit):
108 110 for nTries in range(self.nTries):
109 111 fullpath = self.searchFilesOnLine(self.path, self.startDate,
110 112 self.endDate, self.expLabel, self.ext, self.walk,
111 self.filefmt, self.folderfmt)
113 self.filefmt, self.folderfmt,self.filter)
112 114 try:
113 115 fullpath = next(fullpath)
114 116 except:
@@ -134,7 +136,7 class HDFReader(Reader, ProcessingUnit):
134 136 else:
135 137 log.log("Searching files in {}".format(self.path), self.name)
136 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 141 self.setNextFile()
140 142
@@ -150,6 +152,9 class HDFReader(Reader, ProcessingUnit):
150 152 if 'type' in self.meta:
151 153 self.dataOut = eval(self.meta['type'])()
152 154
155 if self.dparam:
156 setattr(self.dataOut, "dparam", 1)
157
153 158 for attr in self.meta:
154 159 setattr(self.dataOut, attr, self.meta[attr])
155 160
@@ -172,7 +177,10 class HDFReader(Reader, ProcessingUnit):
172 177 startTime = self.startTime
173 178 endTime = self.endTime
174 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 184 thisDatetime = datetime.datetime.utcfromtimestamp(thisUtcTime[0])
177 185
178 186 thisDate = thisDatetime.date()
@@ -256,7 +264,10 class HDFReader(Reader, ProcessingUnit):
256 264 if self.data[attr].ndim == 1:
257 265 setattr(self.dataOut, attr, self.data[attr][self.blockIndex])
258 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 272 self.dataOut.flagNoData = False
262 273 self.blockIndex += 1
@@ -409,7 +420,7 class HDFWriter(Operation):
409 420 self.metadataList = self.dataOut.metadata_list
410 421
411 422 dsList = []
412
423
413 424 for i in range(len(self.dataList)):
414 425 dsDict = {}
415 426 if hasattr(self.dataOut, self.dataList[i]):
@@ -682,7 +693,7 class HDFWriter(Operation):
682 693 return
683 694
684 695 def putData(self):
685
696
686 697 if (self.blockIndex == self.blocksPerFile) or self.timeFlag():
687 698 self.closeFile()
688 699 self.setNextFile()
@@ -697,7 +708,7 class HDFWriter(Operation):
697 708 tmp = getattr(self.dataOut, attr)[:,self.weather_vars[self.weather_var],:][ch]
698 709 if self.mask:
699 710 tmp[mask] = numpy.nan
700 ds[:] = tmp
711 ds[:] = tmp
701 712 else:
702 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