##// END OF EJS Templates
Last general script
avaldezp -
r1518:868e4873d2a0
parent child
Show More
@@ -0,0 +1,366
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
10 PARAM = {
11 'S': {'zmin': -45, 'zmax': -25, 'colormap': 'jet', 'label': 'Power', 'wrname': 'power','cb_label': 'dBm', 'ch':0},
12 'SNR': {'zmin': -40, 'zmax': -20, 'colormap': 'jet', 'label': 'SNR', 'wrname': 'snr','cb_label': 'dB', 'ch':0},
13 'V': {'zmin': -12, 'zmax': 12, 'colormap': 'sophy_v', 'label': 'Velocity', 'wrname': 'velocity', 'cb_label': 'm/s', 'ch':0},
14 'R': {'zmin': 0, 'zmax': 1, 'colormap': 'jet', 'label': 'RhoHV', 'wrname':'rhoHV', 'cb_label': '*', 'ch':0},
15 'P': {'zmin': -180,'zmax': 180,'colormap': 'RdBu_r', 'label': 'PhiDP', 'wrname':'phiDP' , 'cb_label': 'ΒΊ', 'ch':0},
16 'D': {'zmin': -30, 'zmax': 80, 'colormap': 'sophy_r','label': 'ZDR','wrname':'differential_reflectivity' , 'cb_label': 'dBz','ch':0},
17 'Z': {'zmin': -30, 'zmax': 80, 'colormap': 'sophy_r','label': 'Reflectivity ', 'wrname':'reflectivity', 'cb_label': 'dBz','ch':0},
18 'W': {'zmin': 0, 'zmax': 15, 'colormap': 'sophy_w','label': 'Spectral Width', 'wrname':'spectral_width', 'cb_label': 'hz', 'ch':0}
19 }
20
21 def max_index(r, sample_rate, ipp):
22
23 return int(sample_rate*ipp*1e6 * r / 60) + int(sample_rate*ipp*1e6 * 1.2 / 60)
24
25 def main(args):
26
27 experiment = args.experiment
28 fp = open(os.path.join(PATH, experiment, 'experiment.conf'))
29 conf = json.loads(fp.read())
30
31 ipp_km = conf['usrp_tx']['ipp']
32 ipp = ipp_km * 2 /300000
33 sample_rate = conf['usrp_rx']['sample_rate']
34 axis = ['0' if x=='elevation' else '1' for x in conf['pedestal']['axis']] # AZIMUTH 1 ELEVACION 0
35 speed_axis = conf['pedestal']['speed']
36 steps = conf['pedestal']['table']
37 time_offset = args.time_offset
38 parameters = args.parameters
39 start_date = experiment.split('@')[1].split('T')[0].replace('-', '/')
40 end_date = start_date
41 if args.start_time:
42 start_time = args.start_time
43 else:
44 start_time = experiment.split('@')[1].split('T')[1].replace('-', ':')
45 end_time = '23:59:59'
46 N = int(1/(speed_axis[0]*ipp)) # 1 GRADO DE RESOLUCION
47 path = os.path.join(PATH, experiment, 'rawdata')
48 path_ped = os.path.join(PATH, experiment, 'position')
49 path_plots = os.path.join(PATH, experiment, 'plots')
50 path_save = os.path.join(PATH, experiment, 'param')
51 RMIX = 1.62
52 H0 = -1.68
53 MASK = 0.3
54
55 from schainpy.controller import Project
56
57 project = Project()
58 project.setup(id='1', name='Sophy', description='sophy proc')
59
60 reader = project.addReadUnit(datatype='DigitalRFReader',
61 path=path,
62 startDate=start_date,
63 endDate=end_date,
64 startTime=start_time,
65 endTime=end_time,
66 delay=30,
67 online=args.online,
68 walk=1,
69 ippKm = ipp_km,
70 getByBlock = 1,
71 nProfileBlocks = N,
72 )
73
74 if not conf['usrp_tx']['enable_2']: # One Pulse
75 voltage = project.addProcUnit(datatype='VoltageProc', inputId=reader.getId())
76
77 if conf['usrp_tx']['code_type_1'] != 'None':
78 codes = [ c.strip() for c in conf['usrp_tx']['code_1'].split(',')]
79 code = []
80 for c in codes:
81 code.append([int(x) for x in c])
82 op = voltage.addOperation(name='Decoder', optype='other')
83 op.addParameter(name='code', value=code)
84 op.addParameter(name='nCode', value=len(code), format='int')
85 op.addParameter(name='nBaud', value=len(code[0]), format='int')
86
87 op = voltage.addOperation(name='CohInt', optype='other') #Minimo integrar 2 perfiles por ser codigo complementario
88 op.addParameter(name='n', value=len(code), format='int')
89 ncode = len(code)
90 else:
91 ncode = 1
92 code = ['0']
93
94 op = voltage.addOperation(name='setH0')
95 op.addParameter(name='h0', value=H0)
96
97 if args.range > 0:
98 op = voltage.addOperation(name='selectHeights')
99 op.addParameter(name='minIndex', value='0', format='int')
100 op.addParameter(name='maxIndex', value=max_index(args.range, sample_rate, ipp), format='int')
101
102 op = voltage.addOperation(name='PulsePair_vRF', optype='other')
103 op.addParameter(name='n', value=int(N)/ncode, format='int')
104
105 proc = project.addProcUnit(datatype='ParametersProc', inputId=voltage.getId())
106
107 opObj10 = proc.addOperation(name="WeatherRadar")
108 opObj10.addParameter(name='tauW',value=(1e-6/sample_rate)*len(code[0]))
109 opObj10.addParameter(name='Pt',value=((1e-6/sample_rate)*len(code[0])/ipp)*200)
110
111 op = proc.addOperation(name='PedestalInformation')
112 op.addParameter(name='path', value=path_ped, format='str')
113 op.addParameter(name='interval', value='0.04')
114 op.addParameter(name='time_offset', value=time_offset)
115 op.addParameter(name='mode', value='PPI')
116
117 for param in parameters:
118 op = proc.addOperation(name='Block360')
119 op.addParameter(name='runNextOp', value=True)
120
121 op= proc.addOperation(name='WeatherParamsPlot')
122 if args.save: op.addParameter(name='save', value=path_plots, format='str')
123 op.addParameter(name='save_period', value=-1)
124 op.addParameter(name='show', value=args.show)
125 op.addParameter(name='channels', value='1,')
126 op.addParameter(name='zmin', value=PARAM[param]['zmin'])
127 op.addParameter(name='zmax', value=PARAM[param]['zmax'])
128 op.addParameter(name='attr_data', value=param, format='str')
129 op.addParameter(name='labels', value=[PARAM[param]['label']])
130 op.addParameter(name='save_code', value=param)
131 op.addParameter(name='cb_label', value=PARAM[param]['cb_label'])
132 op.addParameter(name='colormap', value=PARAM[param]['colormap'])
133 op.addParameter(name='bgcolor', value='black')
134 if MASK: op.addParameter(name='mask', value=MASK, format='float')
135 if args.server:
136 op.addParameter(name='server', value='0.0.0.0:4444')
137 op.addParameter(name='exp_code', value='400')
138
139 desc = {
140 'Data': {
141 param: PARAM[param]['wrname'],
142 'utctime': 'time'
143 },
144 'Metadata': {
145 'heightList': 'range',
146 'data_azi': 'azimuth',
147 'data_ele': 'elevation',
148 'mode_op': 'scan_type',
149 'h0': 'range_correction',
150 }
151 }
152
153 if args.save:
154 opObj10 = proc.addOperation(name='HDFWriter')
155 writer.addParameter(name='path', value=path_save, format='str')
156 writer.addParameter(name='Reset', value=True)
157 writer.addParameter(name='setType', value='weather')
158 writer.addParameter(name='description', value=json.dumps(desc))
159 writer.addParameter(name='blocksPerFile', value='1',format='int')
160 writer.addParameter(name='metadataList', value='heightList,data_azi,data_ele,mode_op,latitude,longitude,altitude,heading,radar_name,institution,contact,h0,range_unit')
161 writer.addParameter(name='dataList', value='{},utctime'.format(param))
162 writer.addParameter(name='mask', value=MASK, format='float')
163 # meta
164 writer.addParameter(name='latitude', value='-12.040436')
165 writer.addParameter(name='longitude', value='-75.295893')
166 writer.addParameter(name='altitude', value='3379.2147')
167 writer.addParameter(name='heading', value='0')
168 writer.addParameter(name='radar_name', value='SOPHy')
169 writer.addParameter(name='institution', value='IGP')
170 writer.addParameter(name='contact', value='dscipion@igp.gob.pe')
171 writer.addParameter(name='created_by', value='Signal Chain (https://pypi.org/project/schainpy/)')
172 writer.addParameter(name='range_unit', value='km')
173
174 else: #Two pulses
175
176 voltage1 = project.addProcUnit(datatype='VoltageProc', inputId=reader.getId())
177
178 op = voltage1.addOperation(name='ProfileSelector')
179 op.addParameter(name='profileRangeList', value='0,{}'.format(conf['usrp_tx']['repetitions_1']-1))
180
181 if conf['usrp_tx']['code_type_1'] != 'None':
182 codes = [ c.strip() for c in conf['usrp_tx']['code_1'].split(',')]
183 code = []
184 for c in codes:
185 code.append([int(x) for x in c])
186 op = voltage1.addOperation(name='Decoder', optype='other')
187 op.addParameter(name='code', value=code)
188 op.addParameter(name='nCode', value=len(code), format='int')
189 op.addParameter(name='nBaud', value=len(code[0]), format='int')
190 else:
191 code = ['0']
192
193 op = voltage1.addOperation(name='CohInt', optype='other') #Minimo integrar 2 perfiles por ser codigo complementario
194 op.addParameter(name='n', value=2, format='int')
195
196 if args.range > 0:
197 op = voltage1.addOperation(name='selectHeights')
198 op.addParameter(name='minIndex', value='0', format='int')
199 op.addParameter(name='maxIndex', value=max_index(RMIX, sample_rate, ipp), format='int')
200
201 op = voltage1.addOperation(name='setH0')
202 op.addParameter(name='h0', value=H0, format='float')
203
204 op = voltage1.addOperation(name='PulsePair_vRF', optype='other')
205 op.addParameter(name='n', value=int(conf['usrp_tx']['repetitions_1'])/2, format='int')
206
207 proc1 = project.addProcUnit(datatype='ParametersProc', inputId=voltage1.getId())
208 proc1.addParameter(name='runNextUnit', value=True)
209
210 opObj10 = proc1.addOperation(name="WeatherRadar")
211 opObj10.addParameter(name='tauW',value=(1e-6/sample_rate)*len(code[0]))
212 opObj10.addParameter(name='Pt',value=((1e-6/sample_rate)*len(code[0])/ipp)*200)
213
214 op = proc1.addOperation(name='PedestalInformation')
215 op.addParameter(name='path', value=path_ped, format='str')
216 op.addParameter(name='interval', value='0.04')
217 op.addParameter(name='time_offset', value=time_offset)
218 op.addParameter(name='mode', value='PPI')
219
220 op = proc1.addOperation(name='Block360')
221 op.addParameter(name='attr_data', value='data_param')
222 op.addParameter(name='runNextOp', value=True)
223
224
225 voltage2 = project.addProcUnit(datatype='VoltageProc', inputId=reader.getId())
226
227 op = voltage2.addOperation(name='ProfileSelector')
228 op.addParameter(name='profileRangeList', value='{},{}'.format(conf['usrp_tx']['repetitions_1'], conf['usrp_tx']['repetitions_1']+conf['usrp_tx']['repetitions_2']-1))
229
230 if conf['usrp_tx']['code_type_2']:
231 codes = [ c.strip() for c in conf['usrp_tx']['code_2'].split(',')]
232 code = []
233 for c in codes:
234 code.append([int(x) for x in c])
235 op = voltage2.addOperation(name='Decoder', optype='other')
236 op.addParameter(name='code', value=code)
237 op.addParameter(name='nCode', value=len(code), format='int')
238 op.addParameter(name='nBaud', value=len(code[0]), format='int')
239
240 op = voltage2.addOperation(name='CohInt', optype='other') #Minimo integrar 2 perfiles por ser codigo complementario
241 op.addParameter(name='n', value=len(code), format='int')
242 ncode = len(code)
243 else:
244 ncode = 1
245
246 if args.range > 0:
247 op = voltage2.addOperation(name='selectHeights')
248 op.addParameter(name='minIndex', value=max_index(RMIX, sample_rate, ipp), format='int')
249 op.addParameter(name='maxIndex', value=max_index(args.range, sample_rate, ipp), format='int')
250
251 op = voltage2.addOperation(name='setH0')
252 op.addParameter(name='h0', value=H0, format='float')
253
254 op = voltage2.addOperation(name='PulsePair_vRF', optype='other')
255 op.addParameter(name='n', value=int(conf['usrp_tx']['repetitions_2'])/ncode, format='int')
256
257 proc2 = project.addProcUnit(datatype='ParametersProc', inputId=voltage2.getId())
258 proc2.addParameter(name='runNextUnit', value=True)
259
260 opObj10 = proc2.addOperation(name="WeatherRadar")
261 opObj10.addParameter(name='tauW',value=(1e-6/sample_rate)*len(code[0]))
262 opObj10.addParameter(name='Pt',value=((1e-6/sample_rate)*len(code[0])/ipp)*200)
263
264 op = proc2.addOperation(name='PedestalInformation')
265 op.addParameter(name='path', value=path_ped, format='str')
266 op.addParameter(name='interval', value='0.04')
267 op.addParameter(name='time_offset', value=time_offset)
268 op.addParameter(name='mode', value='PPI')
269
270 op = proc2.addOperation(name='Block360')
271 op.addParameter(name='attr_data', value='data_param')
272 op.addParameter(name='runNextOp', value=True)
273
274 merge = project.addProcUnit(datatype='MergeProc', inputId=[proc1.getId(), proc2.getId()])
275 merge.addParameter(name='attr_data', value='data_param')
276 merge.addParameter(name='mode', value='7') #RM
277
278
279 for param in parameters:
280
281 if args.plot:
282 op= merge.addOperation(name='WeatherParamsPlot')
283 if args.save:
284 op.addParameter(name='save', value=path_plots, format='str')
285 op.addParameter(name='save_period', value=-1)
286 op.addParameter(name='show', value=args.show)
287 op.addParameter(name='channels', value='0,')
288 op.addParameter(name='zmin', value=PARAM[param]['zmin'], format='int')
289 op.addParameter(name='zmax', value=PARAM[param]['zmax'], format='int')
290 op.addParameter(name='attr_data', value=param, format='str')
291 op.addParameter(name='labels', value=[PARAM[param]['label']])
292 op.addParameter(name='save_code', value=param)
293 op.addParameter(name='cb_label', value=PARAM[param]['cb_label'])
294 op.addParameter(name='colormap', value=PARAM[param]['colormap'])
295 op.addParameter(name='bgcolor', value='black')
296 if MASK: op.addParameter(name='mask', value=MASK, format='float')
297 if args.server:
298 op.addParameter(name='server', value='0.0.0.0:4444')
299 op.addParameter(name='exp_code', value='400')
300
301 desc = {
302 'Data': {
303 'data_param': {PARAM[param]['wrname']: ['H', 'V']},
304 'utctime': 'time'
305 },
306 'Metadata': {
307 'heightList': 'range',
308 'data_azi': 'azimuth',
309 'data_ele': 'elevation',
310 'mode_op': 'scan_type',
311 'h0': 'range_correction',
312 }
313 }
314
315 if args.save:
316 writer = merge.addOperation(name='HDFWriter')
317 writer.addParameter(name='path', value=path_save, format='str')
318 writer.addParameter(name='Reset', value=True)
319 writer.addParameter(name='setType', value='weather')
320 writer.addParameter(name='description', value=json.dumps(desc))
321 writer.addParameter(name='blocksPerFile', value='1',format='int')
322 writer.addParameter(name='metadataList', value='heightList,data_azi,data_ele,mode_op,latitude,longitude,altitude,heading,radar_name,institution,contact,h0,range_unit')
323 writer.addParameter(name='dataList', value='data_param,utctime')
324 writer.addParameter(name='weather_var', value=param)
325 writer.addParameter(name='mask', value=MASK, format='float')
326 # meta
327 writer.addParameter(name='latitude', value='-12.040436')
328 writer.addParameter(name='longitude', value='-75.295893')
329 writer.addParameter(name='altitude', value='3379.2147')
330 writer.addParameter(name='heading', value='0')
331 writer.addParameter(name='radar_name', value='SOPHy')
332 writer.addParameter(name='institution', value='IGP')
333 writer.addParameter(name='contact', value='dscipion@igp.gob.pe')
334 writer.addParameter(name='created_by', value='Signal Chain (https://pypi.org/project/schainpy/)')
335 writer.addParameter(name='range_unit', value='km')
336
337 project.start()
338
339 if __name__ == '__main__':
340
341 parser = argparse.ArgumentParser(description='Script to process SOPHy data.')
342 parser.add_argument('experiment',
343 help='Experiment name')
344 parser.add_argument('--parameters', nargs='*', default=['S'],
345 help='Variables to process: P, Z, V')
346 parser.add_argument('--time_offset', default=0,
347 help='Fix time offset')
348 parser.add_argument('--range', default=0, type=float,
349 help='Max range to plot')
350 parser.add_argument('--save', action='store_true',
351 help='Create output files')
352 parser.add_argument('--plot', action='store_true',
353 help='Create plot files')
354 parser.add_argument('--show', action='store_true',
355 help='Show matplotlib plot.')
356 parser.add_argument('--online', action='store_true',
357 help='Set online mode.')
358 parser.add_argument('--server', action='store_true',
359 help='Send to realtime')
360 parser.add_argument('--start_time', default='',
361 help='Set start time.')
362
363
364 args = parser.parse_args()
365
366 main(args)
General Comments 0
You need to be logged in to leave comments. Login now