##// END OF EJS Templates
UPDATE de operaciones en el Dominio de la Frecuencia y 2 scripts de prueba
sebastianVP -
r1778:799ea06d41f3
parent child
Show More
@@ -0,0 +1,386
1 #!python
2 '''
3 '''
4
5 import os, sys, json, argparse
6 import datetime
7 import time
8
9 from schainpy.controller import Project
10
11 PATH = "/home/pc-igp-179/Documentos/SOPHy"
12
13
14 PARAM = {
15 'S': {'zmin': -80, 'zmax':-45, 'colormap': 'jet' , 'label': 'Power', 'wrname': 'power','cb_label': 'dBm', 'ch':0},
16 'SNR':{'zmin': -10, 'zmax': 15, 'colormap': 'jet' , 'label': 'SNR', 'wrname': 'snr','cb_label': 'dB', 'ch':0},
17 'V': {'zmin': -12, 'zmax': 12, 'colormap': 'sophy_v', 'label': 'Velocity', 'wrname': 'velocity', 'cb_label': 'm/s', 'ch':0},
18 'R': {'zmin': 0.5, 'zmax': 1 , 'colormap': 'sophy_r', 'label': 'RhoHV', 'wrname':'rhoHV', 'cb_label': '', 'ch':0},
19 'P': {'zmin': -180,'zmax': 180,'colormap': 'sophy_p', 'label': 'PhiDP', 'wrname':'phiDP' , 'cb_label': 'degrees', 'ch':0},
20 'D': {'zmin': -9 , 'zmax': 12, 'colormap': 'sophy_d', 'label': 'ZDR','wrname':'differential_reflectivity' , 'cb_label': 'dB','ch':0},
21 'Z': {'zmin': -20, 'zmax': 80, 'colormap': 'sophy_z', 'label': 'Reflectivity ', 'wrname':'reflectivity', 'cb_label': 'dBz','ch':0},
22 'W': {'zmin': 0 , 'zmax': 12, 'colormap': 'sophy_w', 'label': 'Spectral Width', 'wrname':'spectral_width', 'cb_label': 'm/s', 'ch':0}
23 }
24
25 META = ['heightList', 'data_azi', 'data_ele', 'mode_op', 'latitude', 'longitude', 'altitude', 'heading', 'radar_name',
26 'institution', 'contact', 'h0', 'range_unit', 'prf', 'prf_unit', 'variable', 'variable_unit', 'n_pulses',
27 'pulse1_range', 'pulse1_width', 'pulse2_width', 'pulse1_repetitions', 'pulse2_repetitions', 'pulse_width_unit',
28 'snr_threshold', 'data_noise']
29
30
31 def max_index(r, sample_rate, ipp, h0,ipp_km):
32
33 return int(sample_rate*ipp*1e6 * r / ipp_km) + int(sample_rate*ipp*1e6 * -h0 / ipp_km)
34
35
36 def main(args):
37 experiment = args.experiment
38
39 fp = open(os.path.join(PATH, experiment, 'experiment.json'))
40 conf = json.loads(fp.read())
41
42 ipp_km = conf['usrp_tx']['ipp']
43 bottom = conf['pedestal']['bottom']
44 ipp = ipp_km * 2 /300000
45 sample_rate = conf['usrp_rx']['sample_rate']
46 speed_axis = conf['pedestal']['speed']
47
48 if args.angles:
49 angles = args.angles
50 else:
51 angles = conf['pedestal']['table']
52
53
54
55 start_date = conf['name'].split('@')[1].split('T')[0].replace('-', '/')
56 end_date = start_date
57 if args.start_time:
58 start_time = args.start_time
59 else:
60 start_time = conf['name'].split('@')[1].split('T')[1].replace('-', ':')
61
62 if args.end_time:
63 end_time = args.end_time
64 else:
65 end_time = '23:59:59'
66
67
68 if args.label:
69 label = '-{}'.format(args.label)
70 else:
71 label = ''
72
73 path_plots = os.path.join(PATH, experiment, 'plots{}'.format(label))
74 path_save = os.path.join(PATH, experiment, 'param{}'.format(label))
75
76
77 time_offset = args.time_offset
78 parameters = args.parameters
79
80 N = int(1.0/(abs(speed_axis[0])*ipp))
81 RMIX = 6.0
82 H0 = -1.33
83 MASK = args.mask
84
85 path = os.path.join(PATH, experiment, 'rawdata')
86 path_ped = os.path.join(PATH, experiment, 'position')
87
88 proyecto = Project()
89 proyecto.setup(id = '2', name='Test_2025', description="PRUEBA")
90
91 lectura = proyecto.addReadUnit(datatype='DigitalRFReader',
92 path=path,
93 startDate= "2025/01/06",#today,
94 endDate= "2025/01/06",#today,
95 startTime= start_time,
96 endTime= end_time,
97 delay=30,
98 #set=0,
99 online=0,
100 walk=1,
101 ippKm = ipp_km,
102 getByBlock = 1,
103 nProfileBlocks = N
104 )
105
106 n_pulses = 1
107 pulse_1_width = conf['usrp_tx']['pulse_1']
108 pulse_1_repetitions = conf['usrp_tx']['repetitions_1']
109 pulse_2_width = conf['usrp_tx']['pulse_2']
110 pulse_2_repetitions = conf['usrp_tx']['repetitions_2']
111
112 if '1' in args.pulses:
113 voltage1 = proyecto.addProcUnit(
114 datatype='VoltageProc',
115 inputId=lectura.getId()
116 )
117
118 op = voltage1.addOperation(
119 name='ProfileSelector'
120 )
121 op.addParameter(
122 name='profileRangeList',
123 value='0,{}'.format(conf['usrp_tx']['repetitions_1']-1)
124 )
125
126 if conf['usrp_tx']['code_type_1'] != 'None':
127 codes = [ c.strip() for c in conf['usrp_tx']['code_1'].split(',')]
128 code = []
129 for c in codes:
130 code.append([int(x) for x in c])
131 op = voltage1.addOperation(name='Decoder', optype='other')
132 op.addParameter(name='code', value=code)
133 op.addParameter(name='nCode', value=len(code), format='int')
134 op.addParameter(name='nBaud', value=len(code[0]), format='int')
135 ncode = len(code)
136 else:
137 ncode = 1
138 code = ['0']
139
140 op = voltage1.addOperation(name='CohInt', optype='other')
141 op.addParameter(name='n', value=ncode, format='int')
142
143 op = voltage1.addOperation(name='setH0')
144 op.addParameter(name='h0', value=H0, format='float')
145
146 if args.range > 0:
147 op = voltage1.addOperation(name='selectHeights')
148 op.addParameter(name='minIndex', value=max_index(0, sample_rate, ipp, H0,ipp_km), format='int')
149 op.addParameter(name='maxIndex', value=max_index(args.range, sample_rate, ipp, H0,ipp_km), format='int')
150
151
152 op = voltage1.addOperation(name='PulsePair_vRF', optype='other')
153 op.addParameter(name='n', value=int(conf['usrp_tx']['repetitions_1'])/ncode, format='int')
154
155 if args.rmDC:
156 op.addParameter(name='removeDC', value=1, format='int')
157
158 proc1 = proyecto.addProcUnit(datatype='ParametersProc', inputId=voltage1.getId())
159 proc1.addParameter(name='runNextUnit', value=True)
160
161 opObj10 = proc1.addOperation(name="WeatherRadar")
162 opObj10.addParameter(name='CR_Flag',value=True)
163 print(1, len(code[0]))
164 opObj10.addParameter(name='tauW',value=(1e-6/sample_rate)*len(code[0]))
165 opObj10.addParameter(name='Pt',value=200)
166 opObj10.addParameter(name='min_index',value=max_index(0, sample_rate, ipp, H0,ipp_km))
167
168
169 op = proc1.addOperation(name='PedestalInformation')
170 op.addParameter(name='path', value=path_ped, format='str')
171 op.addParameter(name='interval', value='0.04')
172 op.addParameter(name='time_offset', value=time_offset)
173 op.addParameter(name='mode', value=args.mode)
174
175 op = proc1.addOperation(name='Block360')
176 op.addParameter(name='attr_data', value='data_param')
177 op.addParameter(name='runNextOp', value=True)
178 op.addParameter(name='angles', value=angles)
179 op.addParameter(name='heading', value=conf['heading'])
180
181
182 if '2' in args.pulses:
183 voltage2 = proyecto.addProcUnit(
184 datatype='VoltageProc',
185 inputId=lectura.getId()
186 )
187
188 op = voltage2.addOperation(
189 name='ProfileSelector'
190 )
191 op.addParameter(
192 name='profileRangeList',
193 value='{},{}'.format(conf['usrp_tx']['repetitions_1'], conf['usrp_tx']['repetitions_1']+conf['usrp_tx']['repetitions_2']-1)
194 )
195
196 if conf['usrp_tx']['code_type_2']:
197 codes = [ c.strip() for c in conf['usrp_tx']['code_2'].split(',')]
198 code = []
199 for c in codes:
200 code.append([int(x) for x in c])
201 op = voltage2.addOperation(name='Decoder', optype='other')
202 op.addParameter(name='code', value=code)
203 op.addParameter(name='nCode', value=len(code), format='int')
204 op.addParameter(name='nBaud', value=len(code[0]), format='int')
205
206 op = voltage2.addOperation(name='CohInt', optype='other')
207 op.addParameter(name='n', value=len(code), format='int')
208
209 ncode = len(code)
210 else:
211 ncode = 1
212
213 op = voltage2.addOperation(name='setH0')
214 op.addParameter(name='h0', value=H0, format='float')
215
216 if args.range > 0:
217 op = voltage2.addOperation(name='selectHeights')
218 op.addParameter(name='minIndex', value=max_index(0, sample_rate, ipp, H0,ipp_km), format='int')
219 op.addParameter(name='maxIndex', value=max_index(args.range, sample_rate, ipp, H0,ipp_km), format='int')
220
221
222 op = voltage2.addOperation(name='PulsePair_vRF', optype='other')
223 op.addParameter(name='n', value=int(conf['usrp_tx']['repetitions_1'])/ncode, format='int')
224
225 proc2 = proyecto.addProcUnit(datatype='ParametersProc', inputId=voltage2.getId())
226 proc2.addParameter(name='runNextUnit', value=True)
227
228 opObj10 = proc2.addOperation(name="WeatherRadar")
229 opObj10.addParameter(name='CR_Flag',value=True,format='bool')
230 print(2, len(code[0]))
231 opObj10.addParameter(name='tauW',value=(1e-6/sample_rate)*len(code[0]))
232 opObj10.addParameter(name='Pt',value=200)
233 opObj10.addParameter(name='min_index',value=max_index(RMIX, sample_rate, ipp, H0,ipp_km))
234
235 op = proc2.addOperation(name='PedestalInformation')
236 op.addParameter(name='path', value=path_ped, format='str')
237 op.addParameter(name='interval', value='0.04')
238 op.addParameter(name='time_offset', value=time_offset)
239 op.addParameter(name='mode', value=args.mode)
240 op.addParameter(name='heading', value=conf['heading'])
241
242 op = proc2.addOperation(name='Block360')
243 op.addParameter(name='attr_data', value='data_param')
244 op.addParameter(name='runNextOp', value=True)
245 op.addParameter(name='angles', value=angles)
246 op.addParameter(name='heading', value=conf['heading'])
247
248 if '1' in args.pulses and '2' in args.pulses:
249 merge = proyecto.addProcUnit(datatype='MergeProc', inputId=[proc1.getId(), proc2.getId()])
250 merge.addParameter(name='attr_data', value='data_param')
251 merge.addParameter(name='mode', value='7')
252 merge.addParameter(name='index', value=max_index(RMIX, sample_rate, ipp, H0,ipp_km))
253
254 elif '1' in args.pulses:
255 merge = proc1
256 elif '2' in args.pulses:
257 merge = proc2
258
259 for param in parameters:
260
261 if args.plot:
262 op= merge.addOperation(name='WeatherParamsPlot')
263 if args.save:
264 op.addParameter(name='save', value=path_plots, format='str')
265 op.addParameter(name='save_period', value=-1)
266 op.addParameter(name='show', value=args.show)
267 op.addParameter(name='channels', value='0,')
268 op.addParameter(name='zmin', value=PARAM[param]['zmin'], format='int')
269 op.addParameter(name='zmax', value=PARAM[param]['zmax'], format='int')
270 op.addParameter(name='yrange', value=20, format='int')
271 op.addParameter(name='xrange', value=args.range, format='int')
272 op.addParameter(name='attr_data', value=param, format='str')
273 op.addParameter(name='labels', value=[[PARAM[param]['label']], [PARAM[param]['label']]])
274 op.addParameter(name='save_code', value=param)
275 op.addParameter(name='cb_label', value=PARAM[param]['cb_label'])
276 op.addParameter(name='colormap', value=PARAM[param]['colormap'])
277 op.addParameter(name='bgcolor', value='black')
278 op.addParameter(name='localtime', value=False)
279 op.addParameter(name='shapes', value='./shapes')
280 op.addParameter(name='latitude', value=conf['latitude'], format='float')
281 op.addParameter(name='longitude', value=conf['longitude'], format='float')
282 op.addParameter(name='map', value=True)
283
284 if MASK: op.addParameter(name='mask', value=MASK, format='float')
285 if args.server:
286 op.addParameter(name='server', value='190.187.237.239:4444')
287 op.addParameter(name='exp_code', value='400')
288
289 desc = {
290 'Data': {
291 'data_param': {PARAM[param]['wrname']: ['H', 'V']},
292 'utctime': 'time'
293 },
294 'Metadata': {
295 'heightList': 'range',
296 'data_azi': 'azimuth',
297 'data_ele': 'elevation',
298 'mode_op': 'scan_type',
299 'h0': 'range_correction',
300 'dataPP_NOISE': 'noise',
301 }
302 }
303
304 if args.save:
305 writer = merge.addOperation(name='HDFWriter')
306 writer.addParameter(name='path', value=path_save, format='str')
307 writer.addParameter(name='Reset', value=True)
308 writer.addParameter(name='setType', value='weather')
309 writer.addParameter(name='setChannel', value='0') #new parameter choose ch 0 H or ch 1 V
310 writer.addParameter(name='description', value=json.dumps(desc))
311 writer.addParameter(name='blocksPerFile', value='1',format='int')
312 writer.addParameter(name='metadataList', value=','.join(META))
313 writer.addParameter(name='dataList', value='data_param,utctime')
314 writer.addParameter(name='weather_var', value=param)
315 writer.addParameter(name='mask', value=MASK, format='float')
316 writer.addParameter(name='localtime', value=False)
317 # meta
318 writer.addParameter(name='latitude', value=conf['latitude'])
319 writer.addParameter(name='longitude', value=conf['longitude'])
320 writer.addParameter(name='altitude', value=conf['altitude'])
321 writer.addParameter(name='heading', value=conf['heading'])
322 writer.addParameter(name='radar_name', value='SOPHy')
323 writer.addParameter(name='institution', value='IGP')
324 writer.addParameter(name='contact', value='dscipion@igp.gob.pe')
325 writer.addParameter(name='created_by', value='Signal Chain (https://pypi.org/project/schainpy/)')
326 writer.addParameter(name='range_unit', value='km')
327 writer.addParameter(name='prf', value=1/ipp)
328 writer.addParameter(name='prf_unit', value='hertz')
329 writer.addParameter(name='variable', value=PARAM[param]['label'])
330 writer.addParameter(name='variable_unit', value=PARAM[param]['cb_label'])
331 writer.addParameter(name='n_pulses', value=n_pulses)
332 writer.addParameter(name='pulse1_range', value=RMIX)
333 writer.addParameter(name='pulse1_width', value=pulse_1_width)
334 writer.addParameter(name='pulse2_width', value=pulse_2_width)
335 writer.addParameter(name='pulse1_repetitions', value=pulse_1_repetitions)
336 writer.addParameter(name='pulse2_repetitions', value=pulse_2_repetitions)
337 writer.addParameter(name='pulse_width_unit', value='microseconds')
338 writer.addParameter(name='snr_threshold', value=MASK)
339 writer.addParameter(name='cr_hv', value=[67.41,67.17]) #new parameter
340
341
342 return proyecto
343
344
345
346
347 if __name__ == '__main__':
348
349 parser = argparse.ArgumentParser(description='Script to process SOPHy data.')
350 parser.add_argument('experiment',
351 help='Experiment name')
352 parser.add_argument('--parameters', nargs='*', default=['S'],
353 help='Variables to process: P, Z, V')
354 parser.add_argument('--pulses', nargs='*', default=['1', '2'],
355 help='Variables to process: 1, 2')
356 parser.add_argument('--range', default=60, type=float,
357 help='Max range to plot')
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 parser.add_argument('--end_time', default='',
363 help='Set end time.')
364 parser.add_argument('--rmDC', action='store_true',
365 help='Apply remove DC.')
366 parser.add_argument('--time_offset', default=0,
367 help='Fix time offset')
368 parser.add_argument('--mode', default=None,
369 help='Type of scan')
370 parser.add_argument('--angles', nargs='*', default=[], type=int,
371 help='Angles to process')
372 parser.add_argument('--plot', action='store_true',
373 help='Create plot files')
374 parser.add_argument('--save', action='store_true',
375 help='Create output files')
376 parser.add_argument('--show', action='store_true',
377 help='Show matplotlib plot.')
378 parser.add_argument('--mask', default=0.36, type=float,
379 help='Filter mask over SNR')
380 parser.add_argument('--label', default='',
381 help='Label for plot & param folder')
382
383 args = parser.parse_args()
384
385 proyecto= main(args)
386 proyecto.start() No newline at end of file
@@ -0,0 +1,381
1 import os, sys, json, argparse
2 import multiprocessing
3 import datetime
4 import time
5
6 PATH = "/home/pc-igp-179/Documentos/SOPHy"
7
8 PARAM = {
9 'S': {'zmin': -80, 'zmax':-45, 'colormap': 'jet' , 'label': 'Power', 'wrname': 'power','cb_label': 'dBm', 'ch':0},
10 'SNR':{'zmin': -10, 'zmax': 15, 'colormap': 'jet' , 'label': 'SNR', 'wrname': 'snr','cb_label': 'dB', 'ch':0},
11 'V': {'zmin': -12, 'zmax': 12, 'colormap': 'sophy_v', 'label': 'Velocity', 'wrname': 'velocity', 'cb_label': 'm/s', 'ch':0},
12 'R': {'zmin': 0.5, 'zmax': 1 , 'colormap': 'sophy_r', 'label': 'RhoHV', 'wrname':'rhoHV', 'cb_label': '', 'ch':0},
13 'P': {'zmin': -180,'zmax': 180,'colormap': 'sophy_p', 'label': 'PhiDP', 'wrname':'phiDP' , 'cb_label': 'degrees', 'ch':0},
14 'D': {'zmin': -9 , 'zmax': 12, 'colormap': 'sophy_d', 'label': 'ZDR','wrname':'differential_reflectivity' , 'cb_label': 'dB','ch':0},
15 'Z': {'zmin': -20, 'zmax': 80, 'colormap': 'sophy_z', 'label': 'Reflectivity ', 'wrname':'reflectivity', 'cb_label': 'dBz','ch':0},
16 'W': {'zmin': 0 , 'zmax': 12, 'colormap': 'sophy_w', 'label': 'Spectral Width', 'wrname':'spectral_width', 'cb_label': 'm/s', 'ch':0}
17 }
18
19 META = ['heightList', 'data_azi', 'data_ele', 'mode_op', 'latitude', 'longitude', 'altitude', 'heading', 'radar_name',
20 'institution', 'contact', 'h0', 'range_unit', 'prf', 'prf_unit', 'variable', 'variable_unit', 'n_pulses',
21 'pulse1_range', 'pulse1_width', 'pulse2_width', 'pulse1_repetitions', 'pulse2_repetitions', 'pulse_width_unit',
22 'snr_threshold', 'data_noise']
23
24
25 def max_index(r, sample_rate, ipp, h0,ipp_km):
26
27 return int(sample_rate*ipp*1e6 * r / ipp_km) + int(sample_rate*ipp*1e6 * -h0 / ipp_km)
28
29 def main(args):
30
31 experiment = args.experiment
32 fp = open(os.path.join(PATH, experiment, 'experiment.json'))
33 conf = json.loads(fp.read())
34
35 ipp_km = conf['usrp_tx']['ipp']
36 bottom = conf['pedestal']['bottom']
37 ipp = ipp_km * 2 /300000
38 sample_rate = conf['usrp_rx']['sample_rate']
39 speed_axis = conf['pedestal']['speed']
40 if args.angles:
41 angles = args.angles
42 else:
43 angles = conf['pedestal']['table']
44 time_offset = args.time_offset
45 parameters = args.parameters
46 start_date = conf['name'].split('@')[1].split('T')[0].replace('-', '/')
47 end_date = start_date
48 if args.start_time:
49 start_time = args.start_time
50 else:
51 start_time = conf['name'].split('@')[1].split('T')[1].replace('-', ':')
52
53 if args.end_time:
54 end_time = args.end_time
55 else:
56 end_time = '23:59:59'
57
58 N = int(1.0/(abs(speed_axis[0])*ipp))
59
60 path = os.path.join(PATH, experiment, 'rawdata')
61
62 path_ped = os.path.join(PATH, experiment, 'position')
63 if args.label:
64 label = '-{}'.format(args.label)
65 else:
66 label = ''
67 path_plots = os.path.join(PATH, experiment, 'plots{}'.format(label))
68 path_save = os.path.join(PATH, experiment, 'param{}'.format(label))
69 RMIX = 6.0
70 H0 = -1.33
71 MASK = args.mask
72
73 from schainpy.controller import Project
74
75 project = Project()
76 project.setup(id='1', name='Sophy', description='sophy proc')
77
78 reader = project.addReadUnit(datatype='DigitalRFReader',
79 path=path,
80 startDate=start_date,
81 endDate=end_date,
82 startTime=start_time,
83 endTime=end_time,
84 delay=0,
85 online=args.online,
86 walk=0,
87 ippKm = ipp_km,
88 getByBlock = 1,
89 nProfileBlocks = N,
90 )
91
92
93 n_pulses = 1
94 pulse_1_width = conf['usrp_tx']['pulse_1']
95 pulse_1_repetitions = conf['usrp_tx']['repetitions_1']
96 pulse_2_width = conf['usrp_tx']['pulse_2']
97 pulse_2_repetitions = conf['usrp_tx']['repetitions_2']
98
99 if '1' in args.pulses:
100 voltage1 = project.addProcUnit(datatype='VoltageProc', inputId=reader.getId())
101
102 op = voltage1.addOperation(name='ProfileSelector')
103 op.addParameter(name='profileRangeList', value='0,{}'.format(conf['usrp_tx']['repetitions_1']-1))
104
105 if conf['usrp_tx']['code_type_1'] != 'None':
106 codes = [ c.strip() for c in conf['usrp_tx']['code_1'].split(',')]
107 code = []
108 for c in codes:
109 code.append([int(x) for x in c])
110 op = voltage1.addOperation(name='Decoder', optype='other')
111 op.addParameter(name='code', value=code)
112 op.addParameter(name='nCode', value=len(code), format='int')
113 op.addParameter(name='nBaud', value=len(code[0]), format='int')
114 ncode = len(code)
115 else:
116 ncode = 1
117 code = ['0']
118
119
120 op = voltage1.addOperation(name='CohInt', optype='other')
121 op.addParameter(name='n', value=ncode, format='int')
122
123 op = voltage1.addOperation(name='setH0')
124 op.addParameter(name='h0', value=H0, format='float')
125
126 if args.range > 0:
127 op = voltage1.addOperation(name='selectHeights')
128 op.addParameter(name='minIndex', value=max_index(0, sample_rate, ipp, H0,ipp_km), format='int')
129 op.addParameter(name='maxIndex', value=max_index(args.range, sample_rate, ipp, H0,ipp_km), format='int')
130
131
132
133 #op = voltage1.addOperation(name='PulsePair_vRF', optype='other')
134 #op.addParameter(name='n', value=int(conf['usrp_tx']['repetitions_1'])/ncode, format='int')
135
136 procUnitConfObjA = project.addProcUnit(datatype='SpectraProc', inputId=voltage1.getId())
137 procUnitConfObjA.addParameter(name='nFFTPoints', value=int(conf['usrp_tx']['repetitions_1'])/ncode, format='int')
138 procUnitConfObjA.addParameter(name='nProfiles', value=int(conf['usrp_tx']['repetitions_1'])/ncode, format='int')
139
140
141 #opObj11 = procUnitConfObjA.addOperation(name='setRadarFrequency')
142 #opObj11.addParameter(name='frequency', value='9.345e9', format='float')
143 #procUnitConfObjA.addOperation(name='removeDC')
144 #if args.rmDC:
145 # op.addParameter(name='removeDC', value=1, format='int')
146
147 proc1 = project.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObjA.getId())
148 proc1.addOperation(name='SpectralMoments')
149
150 proc1.addParameter(name='runNextUnit', value=True)
151
152 opObj10 = proc1.addOperation(name="WeatherRadar")
153 opObj10.addParameter(name='CR_Flag',value=True)
154 #print(1, len(code[0]))
155 opObj10.addParameter(name='tauW',value=(1e-6/sample_rate)*len(code[0]))
156 opObj10.addParameter(name='Pt',value=200)
157 opObj10.addParameter(name='min_index',value=max_index(0, sample_rate, ipp, H0,ipp_km))
158
159
160 op = proc1.addOperation(name='PedestalInformation')
161 op.addParameter(name='path', value=path_ped, format='str')
162 op.addParameter(name='interval', value='0.04')
163 op.addParameter(name='time_offset', value=time_offset)
164 op.addParameter(name='mode', value=args.mode)
165
166 op = proc1.addOperation(name='Block360')
167 op.addParameter(name='attr_data', value='data_param')
168 op.addParameter(name='runNextOp', value=True)
169 op.addParameter(name='angles', value=angles)
170 op.addParameter(name='heading', value=conf['heading'])
171
172
173 if '2' in args.pulses:
174 voltage2 = project.addProcUnit(datatype='VoltageProc', inputId=reader.getId())
175
176 op = voltage2.addOperation(name='ProfileSelector')
177 op.addParameter(name='profileRangeList', value='{},{}'.format(conf['usrp_tx']['repetitions_1'], conf['usrp_tx']['repetitions_1']+conf['usrp_tx']['repetitions_2']-1))
178
179 if conf['usrp_tx']['code_type_2']:
180 codes = [ c.strip() for c in conf['usrp_tx']['code_2'].split(',')]
181 code = []
182 for c in codes:
183 code.append([int(x) for x in c])
184 op = voltage2.addOperation(name='Decoder', optype='other')
185 op.addParameter(name='code', value=code)
186 op.addParameter(name='nCode', value=len(code), format='int')
187 op.addParameter(name='nBaud', value=len(code[0]), format='int')
188
189 op = voltage2.addOperation(name='CohInt', optype='other')
190 op.addParameter(name='n', value=len(code), format='int')
191
192 ncode = len(code)
193 else:
194 ncode = 1
195
196 op = voltage2.addOperation(name='setH0')
197 op.addParameter(name='h0', value=H0, format='float')
198
199 if args.range > 0:
200 op = voltage2.addOperation(name='selectHeights')
201 op.addParameter(name='minIndex', value=max_index(0, sample_rate, ipp, H0,ipp_km), format='int')
202 op.addParameter(name='maxIndex', value=max_index(args.range, sample_rate, ipp, H0,ipp_km), format='int')
203
204
205
206
207 procUnitConfObjB = project.addProcUnit(datatype='SpectraProc', inputId=voltage2.getId())
208 procUnitConfObjB.addParameter(name='nFFTPoints', value=int(conf['usrp_tx']['repetitions_2'])/ncode, format='int')
209 procUnitConfObjB.addParameter(name='nProfiles', value=int(conf['usrp_tx']['repetitions_2'])/ncode, format='int')
210
211
212
213 #opObj11 = procUnitConfObjB.addOperation(name='setRadarFrequency')
214 #opObj11.addParameter(name='frequency', value='9.345e9', format='float')
215 #procUnitConfObjB.addOperation(name='removeDC')
216
217 #if args.rmDC:
218 # op.addParameter(name='removeDC', value=1, format='int')
219
220 proc2 = project.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObjB.getId())
221 proc2.addOperation(name='SpectralMoments')
222 proc2.addParameter(name='runNextUnit', value=True)
223
224 opObj10 = proc2.addOperation(name="WeatherRadar")
225 opObj10.addParameter(name='CR_Flag',value=True,format='bool')
226 opObj10.addParameter(name='tauW',value=(1e-6/sample_rate)*len(code[0]))
227 opObj10.addParameter(name='Pt',value=200)
228 opObj10.addParameter(name='min_index',value=max_index(RMIX, sample_rate, ipp, H0,ipp_km))
229
230 op = proc2.addOperation(name='PedestalInformation')
231 op.addParameter(name='path', value=path_ped, format='str')
232 op.addParameter(name='interval', value='0.04')
233 op.addParameter(name='time_offset', value=time_offset)
234 op.addParameter(name='mode', value=args.mode)
235 op.addParameter(name='heading', value=conf['heading'])
236
237 op = proc2.addOperation(name='Block360')
238 op.addParameter(name='attr_data', value='data_param')
239 op.addParameter(name='runNextOp', value=True)
240 op.addParameter(name='angles', value=angles)
241 op.addParameter(name='heading', value=conf['heading'])
242
243
244 if '1' in args.pulses and '2' in args.pulses:
245 merge = project.addProcUnit(datatype='MergeProc', inputId=[proc1.getId(), proc2.getId()])
246 merge.addParameter(name='attr_data', value='data_param')
247 merge.addParameter(name='mode', value='7')
248 merge.addParameter(name='index', value=max_index(RMIX, sample_rate, ipp, H0,ipp_km))
249
250 elif '1' in args.pulses:
251 merge = proc1
252 elif '2' in args.pulses:
253 merge = proc2
254
255
256 for param in parameters:
257
258 if args.plot:
259 op= merge.addOperation(name='WeatherParamsPlot')
260 if args.save:
261 op.addParameter(name='save', value=path_plots, format='str')
262 op.addParameter(name='save_period', value=-1)
263 op.addParameter(name='show', value=args.show)
264 op.addParameter(name='channels', value='0,')
265 op.addParameter(name='zmin', value=PARAM[param]['zmin'], format='int')
266 op.addParameter(name='zmax', value=PARAM[param]['zmax'], format='int')
267 op.addParameter(name='yrange', value=20, format='int')
268 op.addParameter(name='xrange', value=args.range, format='int')
269 op.addParameter(name='attr_data', value=param, format='str')
270 op.addParameter(name='labels', value=[[PARAM[param]['label']], [PARAM[param]['label']]])
271 op.addParameter(name='save_code', value=param)
272 op.addParameter(name='cb_label', value=PARAM[param]['cb_label'])
273 op.addParameter(name='colormap', value=PARAM[param]['colormap'])
274 op.addParameter(name='bgcolor', value='black')
275 op.addParameter(name='localtime', value=False)
276 op.addParameter(name='shapes', value='./shapes')
277 op.addParameter(name='latitude', value=conf['latitude'], format='float')
278 op.addParameter(name='longitude', value=conf['longitude'], format='float')
279 op.addParameter(name='map', value=True)
280
281 if MASK: op.addParameter(name='mask', value=MASK, format='float')
282 #if args.server:
283 # op.addParameter(name='server', value='190.187.237.239:4444')
284 # op.addParameter(name='exp_code', value='400')
285
286 desc = {
287 'Data': {
288 'data_param': {PARAM[param]['wrname']: ['H', 'V']},
289 'utctime': 'time'
290 },
291 'Metadata': {
292 'heightList': 'range',
293 'data_azi': 'azimuth',
294 'data_ele': 'elevation',
295 'mode_op': 'scan_type',
296 'h0': 'range_correction',
297 'dataPP_NOISE': 'noise',
298 }
299 }
300
301 if args.save:
302 writer = merge.addOperation(name='HDFWriter')
303 writer.addParameter(name='path', value=path_save, format='str')
304 writer.addParameter(name='Reset', value=True)
305 writer.addParameter(name='setType', value='weather')
306 writer.addParameter(name='setChannel', value='0') #new parameter choose ch 0 H or ch 1 V
307 writer.addParameter(name='description', value=json.dumps(desc))
308 writer.addParameter(name='blocksPerFile', value='1',format='int')
309 writer.addParameter(name='metadataList', value=','.join(META))
310 writer.addParameter(name='dataList', value='data_param,utctime')
311 writer.addParameter(name='weather_var', value=param)
312 writer.addParameter(name='mask', value=MASK, format='float')
313 writer.addParameter(name='localtime', value=False)
314 # meta
315 writer.addParameter(name='latitude', value=conf['latitude'])
316 writer.addParameter(name='longitude', value=conf['longitude'])
317 writer.addParameter(name='altitude', value=conf['altitude'])
318 writer.addParameter(name='heading', value=conf['heading'])
319 writer.addParameter(name='radar_name', value='SOPHy')
320 writer.addParameter(name='institution', value='IGP')
321 writer.addParameter(name='contact', value='dscipion@igp.gob.pe')
322 writer.addParameter(name='created_by', value='Signal Chain (https://pypi.org/project/schainpy/)')
323 writer.addParameter(name='range_unit', value='km')
324 writer.addParameter(name='prf', value=1/ipp)
325 writer.addParameter(name='prf_unit', value='hertz')
326 writer.addParameter(name='variable', value=PARAM[param]['label'])
327 writer.addParameter(name='variable_unit', value=PARAM[param]['cb_label'])
328 writer.addParameter(name='n_pulses', value=n_pulses)
329 writer.addParameter(name='pulse1_range', value=RMIX)
330 writer.addParameter(name='pulse1_width', value=pulse_1_width)
331 writer.addParameter(name='pulse2_width', value=pulse_2_width)
332 writer.addParameter(name='pulse1_repetitions', value=pulse_1_repetitions)
333 writer.addParameter(name='pulse2_repetitions', value=pulse_2_repetitions)
334 writer.addParameter(name='pulse_width_unit', value='microseconds')
335 writer.addParameter(name='snr_threshold', value=MASK)
336 writer.addParameter(name='cr_hv', value=[67.41,67.17]) #new parameter
337
338 return project
339
340 if __name__ == '__main__':
341
342 parser = argparse.ArgumentParser(description='Script to process SOPHy data.')
343 parser.add_argument('experiment',
344 help='Experiment name')
345 parser.add_argument('--parameters', nargs='*', default=['S'],
346 help='Variables to process: P, Z, V')
347 parser.add_argument('--pulses', nargs='*', default=['1', '2'],
348 help='Variables to process: 1, 2')
349 parser.add_argument('--angles', nargs='*', default=[], type=int,
350 help='Angles to process')
351 parser.add_argument('--time_offset', default=0,
352 help='Fix time offset')
353 parser.add_argument('--range', default=60, type=float,
354 help='Max range to plot')
355
356 parser.add_argument('--save', action='store_true',
357 help='Create output files')
358 parser.add_argument('--plot', action='store_true',
359 help='Create plot files')
360 parser.add_argument('--show', action='store_true',
361 help='Show matplotlib plot.')
362 parser.add_argument('--online', action='store_true',
363 help='Set online mode.')
364 parser.add_argument('--server', action='store_true',
365 help='Send to realtime')
366 parser.add_argument('--start_time', default='',
367 help='Set start time.')
368 parser.add_argument('--end_time', default='',
369 help='Set end time.')
370 parser.add_argument('--label', default='',
371 help='Label for plot & param folder')
372 parser.add_argument('--mode', default=None,
373 help='Type of scan')
374 #parser.add_argument('--rmDC', action='store_true',
375 # help='Apply remove DC.')
376 parser.add_argument('--mask', default=0, type=float,
377 help='Set SNR threshold.')
378 args = parser.parse_args()
379
380 project = main(args)
381 project.start() No newline at end of file
@@ -513,8 +513,10 class PolarMapPlot(Plot):
513 self.titles = ['{} {}'.format(
513 self.titles = ['{} {}'.format(
514 self.data.parameters[x], title) for x in self.channels]
514 self.data.parameters[x], title) for x in self.channels]
515
515
516
517
516 class WeatherParamsPlot(Plot):
518 class WeatherParamsPlot(Plot):
517
519
518 plot_type = 'scattermap'
520 plot_type = 'scattermap'
519 buffering = False
521 buffering = False
520
522
@@ -564,10 +566,10 class WeatherParamsPlot(Plot):
564 data = {}
566 data = {}
565 meta = {}
567 meta = {}
566
568
567 if hasattr(dataOut, 'nFFTPoints'):
569 ##if hasattr(dataOut, 'nFFTPoints'):
568 factor = dataOut.normFactor
570 ## factor = dataOut.normFactor*10.0 # CONSIDERACION ENTRE PULSE PAIR Y FFT
569 else:
571 ##else:
570 factor = 1
572 ## factor = 1
571
573
572 if hasattr(dataOut, 'dparam'):
574 if hasattr(dataOut, 'dparam'):
573 tmp = getattr(dataOut, 'data_param')
575 tmp = getattr(dataOut, 'data_param')
@@ -575,7 +577,7 class WeatherParamsPlot(Plot):
575 #print("-------------------self.attr_data[0]",self.attr_data[0])
577 #print("-------------------self.attr_data[0]",self.attr_data[0])
576 if 'S' in self.attr_data[0]:
578 if 'S' in self.attr_data[0]:
577 if self.attr_data[0]=='S':
579 if self.attr_data[0]=='S':
578 tmp = 10*numpy.log10(10.0*getattr(dataOut, 'data_param')[:,0,:]/(factor))
580 tmp = 10*numpy.log10(10.0*getattr(dataOut, 'data_param')[:,0,:]) ## /(factor)) ya no considerar factor se aplica factor jroproc_parametrs
579 if self.attr_data[0]=='SNR':
581 if self.attr_data[0]=='SNR':
580 tmp = 10*numpy.log10(getattr(dataOut, 'data_param')[:,3,:])
582 tmp = 10*numpy.log10(getattr(dataOut, 'data_param')[:,3,:])
581 else:
583 else:
@@ -586,7 +588,20 class WeatherParamsPlot(Plot):
586 tmp[mask] = numpy.nan
588 tmp[mask] = numpy.nan
587 mask = numpy.nansum((tmp, numpy.roll(tmp, 1),numpy.roll(tmp, -1)), axis=0) == tmp
589 mask = numpy.nansum((tmp, numpy.roll(tmp, 1),numpy.roll(tmp, -1)), axis=0) == tmp
588 tmp[mask] = numpy.nan
590 tmp[mask] = numpy.nan
591
592 ####################################################################
593 #SE GUARDAN LOS DATOS DE LOS PARAMETROS YA SEA PP O SPECTRA EN UN ARCHIVO .npy
594 ##elapsed_time = time.time() - self.start_time
595 ##filename = f'{dataOut.inputUnit}_{self.attr_data[0]}_{elapsed_time:.0f}.npy' # Nombre ΓΊnico con timestamp
596
597 # Guardar el array en el nuevo archivo
598 ##with open(filename, 'wb') as f:
599 ## numpy.save(f, tmp)
600
601 ##print("Se creΓ³ el archivo:", filename)
602
589
603
604 #####################################################################
590 r = dataOut.heightList
605 r = dataOut.heightList
591 delta_height = r[1]-r[0]
606 delta_height = r[1]-r[0]
592 valid = numpy.where(r>=0)[0]
607 valid = numpy.where(r>=0)[0]
@@ -320,6 +320,8 class DigitalRFReader(ProcessingUnit):
320
320
321 self.__frequency = self.fixed_metadata_dict.get('frequency', 1)
321 self.__frequency = self.fixed_metadata_dict.get('frequency', 1)
322
322
323 self.__frequency = 9.345e9
324
323 self.__timezone = self.fixed_metadata_dict.get('timezone', 18000)
325 self.__timezone = self.fixed_metadata_dict.get('timezone', 18000)
324
326
325 try:
327 try:
@@ -28,7 +28,6 from scipy import optimize, interpolate, signal, stats, ndimage
28 from scipy.optimize.optimize import OptimizeWarning
28 from scipy.optimize.optimize import OptimizeWarning
29 warnings.filterwarnings('ignore')
29 warnings.filterwarnings('ignore')
30
30
31
32 SPEED_OF_LIGHT = 299792458
31 SPEED_OF_LIGHT = 299792458
33
32
34 '''solving pickling issue'''
33 '''solving pickling issue'''
@@ -3986,12 +3985,14 class WeatherRadar(Operation):
3986 data_param[:,1,:] = dataOut.dataPP_DOP
3985 data_param[:,1,:] = dataOut.dataPP_DOP
3987 data_param[:,2,:] = dataOut.dataPP_WIDTH
3986 data_param[:,2,:] = dataOut.dataPP_WIDTH
3988 data_param[:,3,:] = dataOut.dataPP_SNR
3987 data_param[:,3,:] = dataOut.dataPP_SNR
3988
3989 if type == "Spectra":
3989 if type == "Spectra":
3990 factor = dataOut.normFactor
3990 factor = dataOut.normFactor
3991 data_param[:,0,:] = dataOut.data_pow/(factor)
3991 data_param[:,0,:] = dataOut.data_pow/(factor)
3992 data_param[:,1,:] = dataOut.data_dop
3992 data_param[:,1,:] = dataOut.data_dop
3993 data_param[:,2,:] = dataOut.data_width
3993 data_param[:,2,:] = dataOut.data_width
3994 data_param[:,3,:] = dataOut.data_snr
3994 data_param[:,3,:] = dataOut.data_snr
3995
3995 return data_param
3996 return data_param
3996
3997
3997 def getCoeficienteCorrelacionROhv_R(self,dataOut):
3998 def getCoeficienteCorrelacionROhv_R(self,dataOut):
@@ -4024,6 +4025,7 class WeatherRadar(Operation):
4024 '''-----------------------------Potencia de Radar -Signal S-----------------------------'''
4025 '''-----------------------------Potencia de Radar -Signal S-----------------------------'''
4025
4026
4026 Pr = dataOut.data_param[:,0,:]
4027 Pr = dataOut.data_param[:,0,:]
4028
4027 '''---------------------------- Calculo de Noise y threshold para Reflectividad---------'''
4029 '''---------------------------- Calculo de Noise y threshold para Reflectividad---------'''
4028
4030
4029 Pr = Pr/100.0 # Conversion Watt
4031 Pr = Pr/100.0 # Conversion Watt
@@ -4272,7 +4274,12 class Block360(Operation):
4272 self.__buffer.append(tmp)
4274 self.__buffer.append(tmp)
4273 self.azi.append(data.azimuth)
4275 self.azi.append(data.azimuth)
4274 self.ele.append(data.elevation)
4276 self.ele.append(data.elevation)
4275 self.__noise.append(data.dataPP_NOISE)
4277 try:
4278 #print("SHOW ------", type(data.dataPP_NOISE),data.dataPP_NOISE.shape,"value:",data.dataPP_NOISE)
4279 self.__noise.append(data.dataPP_NOISE)
4280 except:
4281 #print("SHOW ------", type(data.noise),data.noise.shape,"value:",data.noise)
4282 self.__noise.append(data.noise)
4276 self.__profIndex += 1
4283 self.__profIndex += 1
4277
4284
4278 def pushData(self, data, case_flag):
4285 def pushData(self, data, case_flag):
@@ -4497,4 +4504,4 class MergeProc(ProcessingUnit):
4497 # dh = self.dataOut.heightList[1]-self.dataOut.heightList[0]
4504 # dh = self.dataOut.heightList[1]-self.dataOut.heightList[0]
4498 # heightList_2 = (self.dataOut.heightList[-1]+dh) + numpy.arange(g.shape[-1], dtype=numpy.float) * dh
4505 # heightList_2 = (self.dataOut.heightList[-1]+dh) + numpy.arange(g.shape[-1], dtype=numpy.float) * dh
4499
4506
4500 # self.dataOut.heightList = numpy.concatenate((self.dataOut.heightList,heightList_2)) No newline at end of file
4507 # self.dataOut.heightList = numpy.concatenate((self.dataOut.heightList,heightList_2))
General Comments 0
You need to be logged in to leave comments. Login now