##// END OF EJS Templates
Processing Modules added:...
Julio Valdez -
r502:8b1242a708e8
parent child
Show More
@@ -0,0 +1,196
1 import os
2 import datetime
3 import numpy
4 import copy
5
6 from figure import Figure, isRealtime
7
8 class CorrelationPlot(Figure):
9
10 isConfig = None
11 __nsubplots = None
12
13 WIDTHPROF = None
14 HEIGHTPROF = None
15 PREFIX = 'corr'
16
17 def __init__(self):
18
19 self.isConfig = False
20 self.__nsubplots = 1
21
22 self.WIDTH = 280
23 self.HEIGHT = 250
24 self.WIDTHPROF = 120
25 self.HEIGHTPROF = 0
26 self.counter_imagwr = 0
27
28 self.PLOT_CODE = 1
29 self.FTP_WEI = None
30 self.EXP_CODE = None
31 self.SUB_EXP_CODE = None
32 self.PLOT_POS = None
33
34 def getSubplots(self):
35
36 ncol = int(numpy.sqrt(self.nplots)+0.9)
37 nrow = int(self.nplots*1./ncol + 0.9)
38
39 return nrow, ncol
40
41 def setup(self, id, nplots, wintitle, showprofile=False, show=True):
42
43 showprofile = False
44 self.__showprofile = showprofile
45 self.nplots = nplots
46
47 ncolspan = 1
48 colspan = 1
49 if showprofile:
50 ncolspan = 3
51 colspan = 2
52 self.__nsubplots = 2
53
54 self.createFigure(id = id,
55 wintitle = wintitle,
56 widthplot = self.WIDTH + self.WIDTHPROF,
57 heightplot = self.HEIGHT + self.HEIGHTPROF,
58 show=show)
59
60 nrow, ncol = self.getSubplots()
61
62 counter = 0
63 for y in range(nrow):
64 for x in range(ncol):
65
66 if counter >= self.nplots:
67 break
68
69 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
70
71 if showprofile:
72 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan+colspan, 1, 1)
73
74 counter += 1
75
76 def run(self, dataOut, id, wintitle="", channelList=None, showprofile=False,
77 xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None,
78 save=False, figpath='', figfile=None, show=True, ftp=False, wr_period=1,
79 server=None, folder=None, username=None, password=None,
80 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, realtime=False):
81
82 """
83
84 Input:
85 dataOut :
86 id :
87 wintitle :
88 channelList :
89 showProfile :
90 xmin : None,
91 xmax : None,
92 ymin : None,
93 ymax : None,
94 zmin : None,
95 zmax : None
96 """
97
98 if dataOut.flagNoData:
99 return None
100
101 if realtime:
102 if not(isRealtime(utcdatatime = dataOut.utctime)):
103 print 'Skipping this plot function'
104 return
105
106 if channelList == None:
107 channelIndexList = dataOut.channelIndexList
108 else:
109 channelIndexList = []
110 for channel in channelList:
111 if channel not in dataOut.channelList:
112 raise ValueError, "Channel %d is not in dataOut.channelList"
113 channelIndexList.append(dataOut.channelList.index(channel))
114
115 factor = dataOut.normFactor
116 lenfactor = factor.shape[1]
117 x = dataOut.getLagTRange(1)
118 y = dataOut.getHeiRange()
119
120 z = copy.copy(dataOut.data_corr[:,:,0,:])
121 for i in range(dataOut.data_corr.shape[0]):
122 z[i,:,:] = z[i,:,:]/factor[i,:]
123 zdB = numpy.abs(z)
124
125 avg = numpy.average(z, axis=1)
126 # avg = numpy.nanmean(z, axis=1)
127 # noise = dataOut.noise/factor
128
129 #thisDatetime = dataOut.datatime
130 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[1])
131 title = wintitle + " Correlation"
132 xlabel = "Lag T (s)"
133 ylabel = "Range (Km)"
134
135 if not self.isConfig:
136
137 nplots = dataOut.data_corr.shape[0]
138
139 self.setup(id=id,
140 nplots=nplots,
141 wintitle=wintitle,
142 showprofile=showprofile,
143 show=show)
144
145 if xmin == None: xmin = numpy.nanmin(x)
146 if xmax == None: xmax = numpy.nanmax(x)
147 if ymin == None: ymin = numpy.nanmin(y)
148 if ymax == None: ymax = numpy.nanmax(y)
149 if zmin == None: zmin = 0
150 if zmax == None: zmax = 1
151
152 self.FTP_WEI = ftp_wei
153 self.EXP_CODE = exp_code
154 self.SUB_EXP_CODE = sub_exp_code
155 self.PLOT_POS = plot_pos
156
157 self.isConfig = True
158
159 self.setWinTitle(title)
160
161 for i in range(self.nplots):
162 str_datetime = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S"))
163 title = "Channel %d and %d: : %s" %(dataOut.pairsList[i][0]+1,dataOut.pairsList[i][1]+1 , str_datetime)
164 axes = self.axesList[i*self.__nsubplots]
165 axes.pcolor(x, y, zdB[i,:,:],
166 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
167 xlabel=xlabel, ylabel=ylabel, title=title,
168 ticksize=9, cblabel='')
169
170 # if self.__showprofile:
171 # axes = self.axesList[i*self.__nsubplots +1]
172 # axes.pline(avgdB[i], y,
173 # xmin=zmin, xmax=zmax, ymin=ymin, ymax=ymax,
174 # xlabel='dB', ylabel='', title='',
175 # ytick_visible=False,
176 # grid='x')
177 #
178 # noiseline = numpy.repeat(noisedB[i], len(y))
179 # axes.addpline(noiseline, y, idline=1, color="black", linestyle="dashed", lw=2)
180
181 self.draw()
182
183 if figfile == None:
184 str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S")
185 figfile = self.getFilename(name = str_datetime)
186
187 if figpath != '':
188 self.counter_imagwr += 1
189 if (self.counter_imagwr>=wr_period):
190 # store png plot to local folder
191 self.saveFigure(figpath, figfile)
192 # store png plot to FTP server according to RT-Web format
193 name = self.getNameToFtp(thisDatetime, self.FTP_WEI, self.EXP_CODE, self.SUB_EXP_CODE, self.PLOT_CODE, self.PLOT_POS)
194 ftp_filename = os.path.join(figpath, name)
195 self.saveFigure(figpath, ftp_filename)
196 self.counter_imagwr = 0
This diff has been collapsed as it changes many lines, (579 lines changed) Show them Hide them
@@ -0,0 +1,579
1 import os
2 import datetime
3 import numpy
4
5 from figure import Figure, isRealtime
6
7 class MomentsPlot(Figure):
8
9 isConfig = None
10 __nsubplots = None
11
12 WIDTHPROF = None
13 HEIGHTPROF = None
14 PREFIX = 'prm'
15
16 def __init__(self):
17
18 self.isConfig = False
19 self.__nsubplots = 1
20
21 self.WIDTH = 280
22 self.HEIGHT = 250
23 self.WIDTHPROF = 120
24 self.HEIGHTPROF = 0
25 self.counter_imagwr = 0
26
27 self.PLOT_CODE = 1
28 self.FTP_WEI = None
29 self.EXP_CODE = None
30 self.SUB_EXP_CODE = None
31 self.PLOT_POS = None
32
33 def getSubplots(self):
34
35 ncol = int(numpy.sqrt(self.nplots)+0.9)
36 nrow = int(self.nplots*1./ncol + 0.9)
37
38 return nrow, ncol
39
40 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
41
42 self.__showprofile = showprofile
43 self.nplots = nplots
44
45 ncolspan = 1
46 colspan = 1
47 if showprofile:
48 ncolspan = 3
49 colspan = 2
50 self.__nsubplots = 2
51
52 self.createFigure(id = id,
53 wintitle = wintitle,
54 widthplot = self.WIDTH + self.WIDTHPROF,
55 heightplot = self.HEIGHT + self.HEIGHTPROF,
56 show=show)
57
58 nrow, ncol = self.getSubplots()
59
60 counter = 0
61 for y in range(nrow):
62 for x in range(ncol):
63
64 if counter >= self.nplots:
65 break
66
67 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
68
69 if showprofile:
70 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan+colspan, 1, 1)
71
72 counter += 1
73
74 def run(self, dataOut, id, wintitle="", channelList=None, showprofile=True,
75 xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None,
76 save=False, figpath='', figfile=None, show=True, ftp=False, wr_period=1,
77 server=None, folder=None, username=None, password=None,
78 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, realtime=False):
79
80 """
81
82 Input:
83 dataOut :
84 id :
85 wintitle :
86 channelList :
87 showProfile :
88 xmin : None,
89 xmax : None,
90 ymin : None,
91 ymax : None,
92 zmin : None,
93 zmax : None
94 """
95
96 if dataOut.flagNoData:
97 return None
98
99 if realtime:
100 if not(isRealtime(utcdatatime = dataOut.utctime)):
101 print 'Skipping this plot function'
102 return
103
104 if channelList == None:
105 channelIndexList = dataOut.channelIndexList
106 else:
107 channelIndexList = []
108 for channel in channelList:
109 if channel not in dataOut.channelList:
110 raise ValueError, "Channel %d is not in dataOut.channelList"
111 channelIndexList.append(dataOut.channelList.index(channel))
112
113 factor = dataOut.normFactor
114 x = dataOut.abscissaRange
115 y = dataOut.heightRange
116
117 z = dataOut.data_pre[channelIndexList,:,:]/factor
118 z = numpy.where(numpy.isfinite(z), z, numpy.NAN)
119 avg = numpy.average(z, axis=1)
120 noise = dataOut.noise/factor
121
122 zdB = 10*numpy.log10(z)
123 avgdB = 10*numpy.log10(avg)
124 noisedB = 10*numpy.log10(noise)
125
126 #thisDatetime = dataOut.datatime
127 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[1])
128 title = wintitle + " Parameters"
129 xlabel = "Velocity (m/s)"
130 ylabel = "Range (Km)"
131
132 if not self.isConfig:
133
134 nplots = len(channelIndexList)
135
136 self.setup(id=id,
137 nplots=nplots,
138 wintitle=wintitle,
139 showprofile=showprofile,
140 show=show)
141
142 if xmin == None: xmin = numpy.nanmin(x)
143 if xmax == None: xmax = numpy.nanmax(x)
144 if ymin == None: ymin = numpy.nanmin(y)
145 if ymax == None: ymax = numpy.nanmax(y)
146 if zmin == None: zmin = numpy.nanmin(avgdB)*0.9
147 if zmax == None: zmax = numpy.nanmax(avgdB)*0.9
148
149 self.FTP_WEI = ftp_wei
150 self.EXP_CODE = exp_code
151 self.SUB_EXP_CODE = sub_exp_code
152 self.PLOT_POS = plot_pos
153
154 self.isConfig = True
155
156 self.setWinTitle(title)
157
158 for i in range(self.nplots):
159 str_datetime = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S"))
160 title = "Channel %d: %4.2fdB: %s" %(dataOut.channelList[i]+1, noisedB[i], str_datetime)
161 axes = self.axesList[i*self.__nsubplots]
162 axes.pcolor(x, y, zdB[i,:,:],
163 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
164 xlabel=xlabel, ylabel=ylabel, title=title,
165 ticksize=9, cblabel='')
166 #Mean Line
167 mean = dataOut.data_param[i, 1, :]
168 axes.addpline(mean, y, idline=0, color="black", linestyle="solid", lw=1)
169
170 if self.__showprofile:
171 axes = self.axesList[i*self.__nsubplots +1]
172 axes.pline(avgdB[i], y,
173 xmin=zmin, xmax=zmax, ymin=ymin, ymax=ymax,
174 xlabel='dB', ylabel='', title='',
175 ytick_visible=False,
176 grid='x')
177
178 noiseline = numpy.repeat(noisedB[i], len(y))
179 axes.addpline(noiseline, y, idline=1, color="black", linestyle="dashed", lw=2)
180
181 self.draw()
182
183 if figfile == None:
184 str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S")
185 figfile = self.getFilename(name = str_datetime)
186
187 if figpath != '':
188 self.counter_imagwr += 1
189 if (self.counter_imagwr>=wr_period):
190 # store png plot to local folder
191 self.saveFigure(figpath, figfile)
192 # store png plot to FTP server according to RT-Web format
193 name = self.getNameToFtp(thisDatetime, self.FTP_WEI, self.EXP_CODE, self.SUB_EXP_CODE, self.PLOT_CODE, self.PLOT_POS)
194 ftp_filename = os.path.join(figpath, name)
195 self.saveFigure(figpath, ftp_filename)
196 self.counter_imagwr = 0
197
198 class SkyMapPlot(Figure):
199
200 __isConfig = None
201 __nsubplots = None
202
203 WIDTHPROF = None
204 HEIGHTPROF = None
205 PREFIX = 'prm'
206
207 def __init__(self):
208
209 self.__isConfig = False
210 self.__nsubplots = 1
211
212 # self.WIDTH = 280
213 # self.HEIGHT = 250
214 self.WIDTH = 600
215 self.HEIGHT = 600
216 self.WIDTHPROF = 120
217 self.HEIGHTPROF = 0
218 self.counter_imagwr = 0
219
220 self.PLOT_CODE = 1
221 self.FTP_WEI = None
222 self.EXP_CODE = None
223 self.SUB_EXP_CODE = None
224 self.PLOT_POS = None
225
226 def getSubplots(self):
227
228 ncol = int(numpy.sqrt(self.nplots)+0.9)
229 nrow = int(self.nplots*1./ncol + 0.9)
230
231 return nrow, ncol
232
233 def setup(self, id, nplots, wintitle, showprofile=False, show=True):
234
235 self.__showprofile = showprofile
236 self.nplots = nplots
237
238 ncolspan = 1
239 colspan = 1
240
241 self.createFigure(id = id,
242 wintitle = wintitle,
243 widthplot = self.WIDTH, #+ self.WIDTHPROF,
244 heightplot = self.HEIGHT,# + self.HEIGHTPROF,
245 show=show)
246
247 nrow, ncol = 1,1
248 counter = 0
249 x = 0
250 y = 0
251 self.addAxes(1, 1, 0, 0, 1, 1, True)
252
253 def run(self, dataOut, id, wintitle="", channelList=None, showprofile=False,
254 xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None,
255 save=False, figpath='./', figfile=None, show=True, ftp=False, wr_period=1,
256 server=None, folder=None, username=None, password=None,
257 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, realtime=False):
258
259 """
260
261 Input:
262 dataOut :
263 id :
264 wintitle :
265 channelList :
266 showProfile :
267 xmin : None,
268 xmax : None,
269 ymin : None,
270 ymax : None,
271 zmin : None,
272 zmax : None
273 """
274
275 arrayParameters = dataOut.data_param
276 error = arrayParameters[:,-1]
277 indValid = numpy.where(error == 0)[0]
278 finalMeteor = arrayParameters[indValid,:]
279 finalAzimuth = finalMeteor[:,4]
280 finalZenith = finalMeteor[:,5]
281
282 x = finalAzimuth*numpy.pi/180
283 y = finalZenith
284
285
286 #thisDatetime = dataOut.datatime
287 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[1])
288 title = wintitle + " Parameters"
289 xlabel = "Zonal Zenith Angle (deg) "
290 ylabel = "Meridional Zenith Angle (deg)"
291
292 if not self.__isConfig:
293
294 nplots = 1
295
296 self.setup(id=id,
297 nplots=nplots,
298 wintitle=wintitle,
299 showprofile=showprofile,
300 show=show)
301
302 self.FTP_WEI = ftp_wei
303 self.EXP_CODE = exp_code
304 self.SUB_EXP_CODE = sub_exp_code
305 self.PLOT_POS = plot_pos
306 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
307 self.firstdate = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S"))
308 self.__isConfig = True
309
310 self.setWinTitle(title)
311
312 i = 0
313 str_datetime = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S"))
314
315 axes = self.axesList[i*self.__nsubplots]
316 nevents = axes.x_buffer.shape[0] + x.shape[0]
317 title = "Meteor Detection Sky Map\n %s - %s \n Number of events: %5.0f\n" %(self.firstdate,str_datetime,nevents)
318 axes.polar(x, y,
319 title=title, xlabel=xlabel, ylabel=ylabel,
320 ticksize=9, cblabel='')
321
322 self.draw()
323
324 if save:
325
326 self.counter_imagwr += 1
327 if (self.counter_imagwr==wr_period):
328
329 if figfile == None:
330 figfile = self.getFilename(name = self.name)
331 self.saveFigure(figpath, figfile)
332
333 if ftp:
334 #provisionalmente envia archivos en el formato de la web en tiempo real
335 name = self.getNameToFtp(thisDatetime, self.FTP_WEI, self.EXP_CODE, self.SUB_EXP_CODE, self.PLOT_CODE, self.PLOT_POS)
336 path = '%s%03d' %(self.PREFIX, self.id)
337 ftp_file = os.path.join(path,'ftp','%s.png'%name)
338 self.saveFigure(figpath, ftp_file)
339 ftp_filename = os.path.join(figpath,ftp_file)
340
341
342 try:
343 self.sendByFTP(ftp_filename, server, folder, username, password)
344 except:
345 self.counter_imagwr = 0
346 raise ValueError, 'Error FTP'
347
348 self.counter_imagwr = 0
349
350
351 class WindProfilerPlot(Figure):
352
353 __isConfig = None
354 __nsubplots = None
355
356 WIDTHPROF = None
357 HEIGHTPROF = None
358 PREFIX = 'wind'
359
360 def __init__(self):
361
362 self.timerange = 2*60*60
363 self.isConfig = False
364 self.__nsubplots = 1
365
366 self.WIDTH = 800
367 self.HEIGHT = 150
368 self.WIDTHPROF = 120
369 self.HEIGHTPROF = 0
370 self.counter_imagwr = 0
371
372 self.PLOT_CODE = 0
373 self.FTP_WEI = None
374 self.EXP_CODE = None
375 self.SUB_EXP_CODE = None
376 self.PLOT_POS = None
377 self.tmin = None
378 self.tmax = None
379
380 self.xmin = None
381 self.xmax = None
382
383 self.figfile = None
384
385 def getSubplots(self):
386
387 ncol = 1
388 nrow = self.nplots
389
390 return nrow, ncol
391
392 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
393
394 self.__showprofile = showprofile
395 self.nplots = nplots
396
397 ncolspan = 1
398 colspan = 1
399
400 self.createFigure(id = id,
401 wintitle = wintitle,
402 widthplot = self.WIDTH + self.WIDTHPROF,
403 heightplot = self.HEIGHT + self.HEIGHTPROF,
404 show=show)
405
406 nrow, ncol = self.getSubplots()
407
408 counter = 0
409 for y in range(nrow):
410 if counter >= self.nplots:
411 break
412
413 self.addAxes(nrow, ncol*ncolspan, y, 0, colspan, 1)
414 counter += 1
415
416 def run(self, dataOut, id, wintitle="", channelList=None,
417 xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None,
418 zmax_ver = None, zmin_ver = None, SNRmin = None, SNRmax = None,
419 timerange=None, SNRthresh = None,
420 save=False, figpath='', lastone=0,figfile=None, ftp=False, wr_period=1, show=True,
421 server=None, folder=None, username=None, password=None,
422 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0):
423 """
424
425 Input:
426 dataOut :
427 id :
428 wintitle :
429 channelList :
430 showProfile :
431 xmin : None,
432 xmax : None,
433 ymin : None,
434 ymax : None,
435 zmin : None,
436 zmax : None
437 """
438
439 if channelList == None:
440 channelIndexList = dataOut.channelIndexList
441 else:
442 channelIndexList = []
443 for channel in channelList:
444 if channel not in dataOut.channelList:
445 raise ValueError, "Channel %d is not in dataOut.channelList"
446 channelIndexList.append(dataOut.channelList.index(channel))
447
448 if timerange != None:
449 self.timerange = timerange
450
451 tmin = None
452 tmax = None
453
454 x = dataOut.getTimeRange1()
455 y = dataOut.heightRange
456
457 z = dataOut.winds
458 nplots = z.shape[0] #Number of wind dimensions estimated
459 nplotsw = nplots
460
461 #If there is a SNR function defined
462 if dataOut.SNR != None:
463 nplots += 1
464 SNR = dataOut.SNR
465 SNRavg = numpy.average(SNR, axis=0)
466
467 SNRdB = 10*numpy.log10(SNR)
468 SNRavgdB = 10*numpy.log10(SNRavg)
469
470 if SNRthresh == None: SNRthresh = -5.0
471 ind = numpy.where(SNRavg < 10**(SNRthresh/10))[0]
472
473 for i in range(nplotsw):
474 z[i,ind] = numpy.nan
475
476
477 showprofile = False
478 # thisDatetime = dataOut.datatime
479 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[1])
480 title = wintitle + "Wind"
481 xlabel = ""
482 ylabel = "Range (Km)"
483
484 if not self.__isConfig:
485
486
487
488 self.setup(id=id,
489 nplots=nplots,
490 wintitle=wintitle,
491 showprofile=showprofile,
492 show=show)
493
494 self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange)
495
496 if ymin == None: ymin = numpy.nanmin(y)
497 if ymax == None: ymax = numpy.nanmax(y)
498
499 if zmax == None: zmax = numpy.nanmax(abs(z[range(2),:]))
500 #if numpy.isnan(zmax): zmax = 50
501 if zmin == None: zmin = -zmax
502
503 if nplotsw == 3:
504 if zmax_ver == None: zmax_ver = numpy.nanmax(abs(z[2,:]))
505 if zmin_ver == None: zmin_ver = -zmax_ver
506
507 if dataOut.SNR != None:
508 if SNRmin == None: SNRmin = numpy.nanmin(SNRavgdB)
509 if SNRmax == None: SNRmax = numpy.nanmax(SNRavgdB)
510
511 self.FTP_WEI = ftp_wei
512 self.EXP_CODE = exp_code
513 self.SUB_EXP_CODE = sub_exp_code
514 self.PLOT_POS = plot_pos
515
516 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
517 self.__isConfig = True
518
519
520 self.setWinTitle(title)
521
522 if ((self.xmax - x[1]) < (x[1]-x[0])):
523 x[1] = self.xmax
524
525 strWind = ['Zonal', 'Meridional', 'Vertical']
526 strCb = ['Velocity (m/s)','Velocity (m/s)','Velocity (cm/s)']
527 zmaxVector = [zmax, zmax, zmax_ver]
528 zminVector = [zmin, zmin, zmin_ver]
529 windFactor = [1,1,100]
530
531 for i in range(nplotsw):
532
533 title = "%s Wind: %s" %(strWind[i], thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
534 axes = self.axesList[i*self.__nsubplots]
535
536 z1 = z[i,:].reshape((1,-1))*windFactor[i]
537
538 axes.pcolorbuffer(x, y, z1,
539 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=zminVector[i], zmax=zmaxVector[i],
540 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
541 ticksize=9, cblabel=strCb[i], cbsize="1%", colormap="RdBu_r" )
542
543 if dataOut.SNR != None:
544 i += 1
545 title = "Signal Noise Ratio (SNR): %s" %(thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
546 axes = self.axesList[i*self.__nsubplots]
547
548 SNRavgdB = SNRavgdB.reshape((1,-1))
549
550 axes.pcolorbuffer(x, y, SNRavgdB,
551 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=SNRmin, zmax=SNRmax,
552 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
553 ticksize=9, cblabel='', cbsize="1%", colormap="jet")
554
555 self.draw()
556
557 if x[1] >= self.axesList[0].xmax:
558 self.counter_imagwr = wr_period
559 self.__isConfig = False
560
561
562 if self.figfile == None:
563 str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S")
564 self.figfile = self.getFilename(name = str_datetime)
565
566 if figpath != '':
567
568 self.counter_imagwr += 1
569 if (self.counter_imagwr>=wr_period):
570 # store png plot to local folder
571 self.saveFigure(figpath, self.figfile)
572 # store png plot to FTP server according to RT-Web format
573 name = self.getNameToFtp(thisDatetime, self.FTP_WEI, self.EXP_CODE, self.SUB_EXP_CODE, self.PLOT_CODE, self.PLOT_POS)
574 ftp_filename = os.path.join(figpath, name)
575 self.saveFigure(figpath, ftp_filename)
576
577 self.counter_imagwr = 0
578
579 No newline at end of file
@@ -0,0 +1,246
1 import numpy
2
3 from jroproc_base import ProcessingUnit, Operation
4 from model.data.jrodata import Correlation
5
6 class CorrelationProc(ProcessingUnit):
7
8 def __init__(self):
9
10 ProcessingUnit.__init__(self)
11
12 self.objectDict = {}
13 self.buffer = None
14 self.firstdatatime = None
15 self.profIndex = 0
16 self.dataOut = Correlation()
17
18 def __updateObjFromInput(self):
19
20 self.dataOut.timeZone = self.dataIn.timeZone
21 self.dataOut.dstFlag = self.dataIn.dstFlag
22 self.dataOut.errorCount = self.dataIn.errorCount
23 self.dataOut.useLocalTime = self.dataIn.useLocalTime
24
25 self.dataOut.radarControllerHeaderObj = self.dataIn.radarControllerHeaderObj.copy()
26 self.dataOut.systemHeaderObj = self.dataIn.systemHeaderObj.copy()
27 self.dataOut.channelList = self.dataIn.channelList
28 self.dataOut.heightList = self.dataIn.heightList
29 self.dataOut.dtype = numpy.dtype([('real','<f4'),('imag','<f4')])
30 # self.dataOut.nHeights = self.dataIn.nHeights
31 # self.dataOut.nChannels = self.dataIn.nChannels
32 self.dataOut.nBaud = self.dataIn.nBaud
33 self.dataOut.nCode = self.dataIn.nCode
34 self.dataOut.code = self.dataIn.code
35 # self.dataOut.nProfiles = self.dataOut.nFFTPoints
36 self.dataOut.flagTimeBlock = self.dataIn.flagTimeBlock
37 self.dataOut.utctime = self.firstdatatime
38 self.dataOut.flagDecodeData = self.dataIn.flagDecodeData #asumo q la data esta decodificada
39 self.dataOut.flagDeflipData = self.dataIn.flagDeflipData #asumo q la data esta sin flip
40 # self.dataOut.nCohInt = self.dataIn.nCohInt
41 # self.dataOut.nIncohInt = 1
42 self.dataOut.ippSeconds = self.dataIn.ippSeconds
43 # self.dataOut.windowOfFilter = self.dataIn.windowOfFilter
44
45 self.dataOut.timeInterval = self.dataIn.timeInterval*self.dataOut.nPoints
46
47
48 def removeDC(self, jspectra):
49
50 nChannel = jspectra.shape[0]
51
52 for i in range(nChannel):
53 jspectra_tmp = jspectra[i,:,:]
54 jspectra_DC = numpy.mean(jspectra_tmp,axis = 0)
55
56 jspectra_tmp = jspectra_tmp - jspectra_DC
57 jspectra[i,:,:] = jspectra_tmp
58
59 return jspectra
60
61
62 def removeNoise(self, mode = 2):
63 indR = numpy.where(self.dataOut.lagR == 0)[0][0]
64 indT = numpy.where(self.dataOut.lagT == 0)[0][0]
65
66 jspectra = self.dataOut.data_corr[:,:,indR,:]
67
68 num_chan = jspectra.shape[0]
69 num_hei = jspectra.shape[2]
70
71 freq_dc = indT
72 ind_vel = numpy.array([-2,-1,1,2]) + freq_dc
73
74 NPot = self.dataOut.getNoise(mode)
75 jspectra[:,freq_dc,:] = jspectra[:,freq_dc,:] - NPot
76 SPot = jspectra[:,freq_dc,:]
77 pairsAutoCorr = self.dataOut.getPairsAutoCorr()
78 # self.dataOut.signalPotency = SPot
79 self.dataOut.noise = NPot
80 self.dataOut.SNR = (SPot/NPot)[pairsAutoCorr]
81 self.dataOut.data_corr[:,:,indR,:] = jspectra
82
83 return 1
84
85
86 def calculateNormFactor(self):
87
88 pairsList = self.dataOut.pairsList
89 pairsAutoCorr = self.dataOut.pairsAutoCorr
90 nHeights = self.dataOut.nHeights
91 nPairs = len(pairsList)
92 normFactor = numpy.zeros((nPairs,nHeights))
93
94 indR = numpy.where(self.dataOut.lagR == 0)[0][0]
95 indT = numpy.where(self.dataOut.lagT == 0)[0][0]
96
97 for l in range(len(pairsList)):
98 firstChannel = pairsList[l][0]
99 secondChannel = pairsList[l][1]
100
101 AC1 = pairsAutoCorr[firstChannel]
102 AC2 = pairsAutoCorr[secondChannel]
103
104 if (AC1 >= 0 and AC2 >= 0):
105
106 data1 = numpy.abs(self.dataOut.data_corr[AC1,:,indR,:])
107 data2 = numpy.abs(self.dataOut.data_corr[AC2,:,indR,:])
108 maxim1 = data1.max(axis = 0)
109 maxim2 = data1.max(axis = 0)
110 maxim = numpy.sqrt(maxim1*maxim2)
111 else:
112 #In case there is no autocorrelation for the pair
113 data = numpy.abs(self.dataOut.data_corr[l,:,indR,:])
114 maxim = numpy.max(data, axis = 0)
115
116 normFactor[l,:] = maxim
117
118 self.dataOut.normFactor = normFactor
119
120 return 1
121
122 def run(self, lagT=None, lagR=None, pairsList=None,
123 nPoints=None, nAvg=None, bufferSize=None,
124 fullT = False, fullR = False, removeDC = False):
125
126 self.dataOut.flagNoData = True
127
128 if self.dataIn.type == "Correlation":
129
130 self.dataOut.copy(self.dataIn)
131
132 return
133
134 if self.dataIn.type == "Voltage":
135
136 if pairsList == None:
137 pairsList = [numpy.array([0,0])]
138
139 if nPoints == None:
140 nPoints = 128
141 #------------------------------------------------------------
142 #Condicionales para calcular Correlaciones en Tiempo y Rango
143 if fullT:
144 lagT = numpy.arange(nPoints*2 - 1) - nPoints + 1
145 elif lagT == None:
146 lagT = numpy.array([0])
147 else:
148 lagT = numpy.array(lagT)
149
150 if fullR:
151 lagR = numpy.arange(self.dataOut.nHeights)
152 elif lagR == None:
153 lagR = numpy.array([0])
154 #-------------------------------------------------------------
155
156 if nAvg == None:
157 nAvg = 1
158
159 if bufferSize == None:
160 bufferSize = 0
161
162 deltaH = self.dataIn.heightList[1] - self.dataIn.heightList[0]
163 self.dataOut.lagR = numpy.round(numpy.array(lagR)/deltaH)
164 self.dataOut.pairsList = pairsList
165 self.dataOut.nPoints = nPoints
166 # channels = numpy.sort(list(set(list(itertools.chain.from_iterable(pairsList)))))
167
168 if self.buffer == None:
169
170 self.buffer = numpy.zeros((self.dataIn.nChannels,self.dataIn.nProfiles,self.dataIn.nHeights),dtype='complex')
171
172
173 self.buffer[:,self.profIndex,:] = self.dataIn.data.copy()[:,:]
174
175 self.profIndex += 1
176
177 if self.firstdatatime == None:
178
179 self.firstdatatime = self.dataIn.utctime
180
181 if self.profIndex == nPoints:
182
183 tmp = self.buffer[:,0:nPoints,:]
184 self.buffer = None
185 self.buffer = tmp
186
187 #--------------- Remover DC ------------
188 if removeDC:
189 self.buffer = self.removeDC(self.buffer)
190 #---------------------------------------------
191 self.dataOut.data_volts = self.buffer
192 self.__updateObjFromInput()
193 self.dataOut.data_corr = numpy.zeros((len(pairsList),
194 len(lagT),len(lagR),
195 self.dataIn.nHeights),
196 dtype='complex')
197
198 for l in range(len(pairsList)):
199
200 firstChannel = pairsList[l][0]
201 secondChannel = pairsList[l][1]
202
203 tmp = None
204 tmp = numpy.zeros((len(lagT),len(lagR),self.dataIn.nHeights),dtype='complex')
205
206 for t in range(len(lagT)):
207
208 for r in range(len(lagR)):
209
210 idxT = lagT[t]
211 idxR = lagR[r]
212
213 if idxT >= 0:
214 vStacked = numpy.vstack((self.buffer[secondChannel,idxT:,:],
215 numpy.zeros((idxT,self.dataIn.nHeights),dtype='complex')))
216 else:
217 vStacked = numpy.vstack((numpy.zeros((-idxT,self.dataIn.nHeights),dtype='complex'),
218 self.buffer[secondChannel,:(nPoints + idxT),:]))
219
220 if idxR >= 0:
221 hStacked = numpy.hstack((vStacked[:,idxR:],numpy.zeros((nPoints,idxR),dtype='complex')))
222 else:
223 hStacked = numpy.hstack((numpy.zeros((nPoints,-idxR),dtype='complex'),vStacked[:,(self.dataOut.nHeights + idxR)]))
224
225
226 tmp[t,r,:] = numpy.sum((numpy.conjugate(self.buffer[firstChannel,:,:])*hStacked),axis=0)
227
228
229 hStacked = None
230 vStacked = None
231
232 self.dataOut.data_corr[l,:,:,:] = tmp[:,:,:]
233
234 #Se Calcula los factores de Normalizacion
235 self.dataOut.pairsAutoCorr = self.dataOut.getPairsAutoCorr()
236 self.dataOut.lagT = lagT*self.dataIn.ippSeconds*self.dataIn.nCohInt
237 self.dataOut.lagR = lagR
238
239 self.calculateNormFactor()
240
241 self.dataOut.flagNoData = False
242 self.buffer = None
243 self.firstdatatime = None
244 self.profIndex = 0
245
246 return No newline at end of file
This diff has been collapsed as it changes many lines, (1521 lines changed) Show them Hide them
@@ -0,0 +1,1521
1 import numpy
2 import math
3 from scipy import optimize
4 from scipy import interpolate
5 from scipy import signal
6 from scipy import stats
7 import re
8 import datetime
9 import copy
10
11
12 from jroproc_base import ProcessingUnit, Operation
13 from model.data.jrodata import Parameters
14
15
16 class ParametersProc(ProcessingUnit):
17
18 nSeconds = None
19
20 def __init__(self):
21 ProcessingUnit.__init__(self)
22
23 self.objectDict = {}
24 self.buffer = None
25 self.firstdatatime = None
26 self.profIndex = 0
27 self.dataOut = Parameters()
28
29 def __updateObjFromInput(self):
30
31 self.dataOut.inputUnit = self.dataIn.type
32
33 self.dataOut.timeZone = self.dataIn.timeZone
34 self.dataOut.dstFlag = self.dataIn.dstFlag
35 self.dataOut.errorCount = self.dataIn.errorCount
36 self.dataOut.useLocalTime = self.dataIn.useLocalTime
37
38 self.dataOut.radarControllerHeaderObj = self.dataIn.radarControllerHeaderObj.copy()
39 self.dataOut.systemHeaderObj = self.dataIn.systemHeaderObj.copy()
40 self.dataOut.channelList = self.dataIn.channelList
41 self.dataOut.heightList = self.dataIn.heightList
42 self.dataOut.dtype = numpy.dtype([('real','<f4'),('imag','<f4')])
43 # self.dataOut.nHeights = self.dataIn.nHeights
44 # self.dataOut.nChannels = self.dataIn.nChannels
45 self.dataOut.nBaud = self.dataIn.nBaud
46 self.dataOut.nCode = self.dataIn.nCode
47 self.dataOut.code = self.dataIn.code
48 # self.dataOut.nProfiles = self.dataOut.nFFTPoints
49 self.dataOut.flagTimeBlock = self.dataIn.flagTimeBlock
50 self.dataOut.utctime = self.firstdatatime
51 self.dataOut.flagDecodeData = self.dataIn.flagDecodeData #asumo q la data esta decodificada
52 self.dataOut.flagDeflipData = self.dataIn.flagDeflipData #asumo q la data esta sin flip
53 # self.dataOut.nCohInt = self.dataIn.nCohInt
54 # self.dataOut.nIncohInt = 1
55 self.dataOut.ippSeconds = self.dataIn.ippSeconds
56 # self.dataOut.windowOfFilter = self.dataIn.windowOfFilter
57 self.dataOut.timeInterval = self.dataIn.timeInterval
58 self.dataOut.heightRange = self.dataIn.getHeiRange()
59 self.dataOut.frequency = self.dataIn.frequency
60
61 def run(self, nSeconds = None, nProfiles = None):
62
63 self.dataOut.flagNoData = True
64
65 if self.firstdatatime == None:
66 self.firstdatatime = self.dataIn.utctime
67
68 #---------------------- Voltage Data ---------------------------
69
70 if self.dataIn.type == "Voltage":
71 if nSeconds != None:
72 self.nSeconds = nSeconds
73 self.nProfiles= int(numpy.floor(nSeconds/(self.dataIn.ippSeconds*self.dataIn.nCohInt)))
74
75 if self.buffer == None:
76 self.buffer = numpy.zeros((self.dataIn.nChannels,
77 self.nProfiles,
78 self.dataIn.nHeights),
79 dtype='complex')
80
81 self.buffer[:,self.profIndex,:] = self.dataIn.data.copy()
82 self.profIndex += 1
83
84 if self.profIndex == self.nProfiles:
85
86 self.__updateObjFromInput()
87 self.dataOut.data_pre = self.buffer.copy()
88 self.dataOut.paramInterval = nSeconds
89 self.dataOut.flagNoData = False
90
91 self.buffer = None
92 self.firstdatatime = None
93 self.profIndex = 0
94
95 #---------------------- Spectra Data ---------------------------
96
97 if self.dataIn.type == "Spectra":
98 self.dataOut.data_pre = self.dataIn.data_spc.copy()
99 self.dataOut.abscissaRange = self.dataIn.getVelRange(1)
100 self.dataOut.noise = self.dataIn.getNoise()
101 self.dataOut.normFactor = self.dataIn.normFactor
102
103 self.__updateObjFromInput()
104 self.dataOut.flagNoData = False
105 self.firstdatatime = None
106
107 #---------------------- Correlation Data ---------------------------
108
109 if self.dataIn.type == "Correlation":
110 lagRRange = self.dataIn.lagR
111 indR = numpy.where(lagRRange == 0)[0][0]
112
113 self.dataOut.data_pre = self.dataIn.data_corr.copy()[:,:,indR,:]
114 self.dataOut.abscissaRange = self.dataIn.getLagTRange(1)
115 self.dataOut.noise = self.dataIn.noise
116 self.dataOut.normFactor = self.dataIn.normFactor
117 self.dataOut.SNR = self.dataIn.SNR
118 self.dataOut.pairsList = self.dataIn.pairsList
119
120 self.__updateObjFromInput()
121 self.dataOut.flagNoData = False
122 self.firstdatatime = None
123
124 #------------------- Get Moments ----------------------------------
125 def GetMoments(self, channelList = None):
126 '''
127 Function GetMoments()
128
129 Input:
130 channelList : simple channel list to select e.g. [2,3,7]
131 self.dataOut.data_pre
132 self.dataOut.abscissaRange
133 self.dataOut.noise
134
135 Affected:
136 self.dataOut.data_param
137 self.dataOut.SNR
138
139 '''
140 data = self.dataOut.data_pre
141 absc = self.dataOut.abscissaRange[:-1]
142 noise = self.dataOut.noise
143
144 data_param = numpy.zeros((data.shape[0], 4, data.shape[2]))
145
146 if channelList== None: channelList = self.dataOut.channelList
147
148 for ind in channelList:
149 data_param[ind,:,:] = self.__calculateMoments(data[ind,:,:], absc, noise[ind])
150
151 self.dataOut.data_param = data_param[:,1:]
152 self.dataOut.SNR = data_param[:,0]
153 return
154
155 def __calculateMoments(self, oldspec, oldfreq, n0, nicoh = None, graph = None, smooth = None, type1 = None, fwindow = None, snrth = None, dc = None, aliasing = None, oldfd = None, wwauto = None):
156
157 if (nicoh == None): nicoh = 1
158 if (graph == None): graph = 0
159 if (smooth == None): smooth = 0
160 elif (self.smooth < 3): smooth = 0
161
162 if (type1 == None): type1 = 0
163 if (fwindow == None): fwindow = numpy.zeros(oldfreq.size) + 1
164 if (snrth == None): snrth = -3
165 if (dc == None): dc = 0
166 if (aliasing == None): aliasing = 0
167 if (oldfd == None): oldfd = 0
168 if (wwauto == None): wwauto = 0
169
170 if (n0 < 1.e-20): n0 = 1.e-20
171
172 freq = oldfreq
173 vec_power = numpy.zeros(oldspec.shape[1])
174 vec_fd = numpy.zeros(oldspec.shape[1])
175 vec_w = numpy.zeros(oldspec.shape[1])
176 vec_snr = numpy.zeros(oldspec.shape[1])
177
178 for ind in range(oldspec.shape[1]):
179
180 spec = oldspec[:,ind]
181 aux = spec*fwindow
182 max_spec = aux.max()
183 m = list(aux).index(max_spec)
184
185 #Smooth
186 if (smooth == 0): spec2 = spec
187 else: spec2 = scipy.ndimage.filters.uniform_filter1d(spec,size=smooth)
188
189 # Calculo de Momentos
190 bb = spec2[range(m,spec2.size)]
191 bb = (bb<n0).nonzero()
192 bb = bb[0]
193
194 ss = spec2[range(0,m + 1)]
195 ss = (ss<n0).nonzero()
196 ss = ss[0]
197
198 if (bb.size == 0):
199 bb0 = spec.size - 1 - m
200 else:
201 bb0 = bb[0] - 1
202 if (bb0 < 0):
203 bb0 = 0
204
205 if (ss.size == 0): ss1 = 1
206 else: ss1 = max(ss) + 1
207
208 if (ss1 > m): ss1 = m
209
210 valid = numpy.asarray(range(int(m + bb0 - ss1 + 1))) + ss1
211 power = ((spec2[valid] - n0)*fwindow[valid]).sum()
212 fd = ((spec2[valid]- n0)*freq[valid]*fwindow[valid]).sum()/power
213 w = math.sqrt(((spec2[valid] - n0)*fwindow[valid]*(freq[valid]- fd)**2).sum()/power)
214 snr = (spec2.mean()-n0)/n0
215
216 if (snr < 1.e-20) :
217 snr = 1.e-20
218
219 vec_power[ind] = power
220 vec_fd[ind] = fd
221 vec_w[ind] = w
222 vec_snr[ind] = snr
223
224 moments = numpy.vstack((vec_snr, vec_power, vec_fd, vec_w))
225 return moments
226
227 #------------------- Get Lags ----------------------------------
228
229 def GetLags(self):
230 '''
231 Function GetMoments()
232
233 Input:
234 self.dataOut.data_pre
235 self.dataOut.abscissaRange
236 self.dataOut.noise
237 self.dataOut.normFactor
238 self.dataOut.SNR
239 self.dataOut.pairsList
240 self.dataOut.nChannels
241
242 Affected:
243 self.dataOut.data_param
244
245 '''
246 data = self.dataOut.data_pre
247 normFactor = self.dataOut.normFactor
248 nHeights = self.dataOut.nHeights
249 absc = self.dataOut.abscissaRange[:-1]
250 noise = self.dataOut.noise
251 SNR = self.dataOut.SNR
252 pairsList = self.dataOut.pairsList
253 nChannels = self.dataOut.nChannels
254 pairsAutoCorr, pairsCrossCorr = self.__getPairsAutoCorr(pairsList, nChannels)
255 self.dataOut.data_param = numpy.zeros((len(pairsCrossCorr)*2 + 1, nHeights))
256
257 dataNorm = numpy.abs(data)
258 for l in range(len(pairsList)):
259 dataNorm[l,:,:] = dataNorm[l,:,:]/normFactor[l,:]
260
261 self.dataOut.data_param[:-1,:] = self.__calculateTaus(dataNorm, pairsCrossCorr, pairsAutoCorr, absc)
262 self.dataOut.data_param[-1,:] = self.__calculateLag1Phase(data, pairsAutoCorr, absc)
263 return
264
265 def __getPairsAutoCorr(self, pairsList, nChannels):
266
267 pairsAutoCorr = numpy.zeros(nChannels, dtype = 'int')*numpy.nan
268
269 for l in range(len(pairsList)):
270 firstChannel = pairsList[l][0]
271 secondChannel = pairsList[l][1]
272
273 #Obteniendo pares de Autocorrelacion
274 if firstChannel == secondChannel:
275 pairsAutoCorr[firstChannel] = int(l)
276
277 pairsAutoCorr = pairsAutoCorr.astype(int)
278
279 pairsCrossCorr = range(len(pairsList))
280 pairsCrossCorr = numpy.delete(pairsCrossCorr,pairsAutoCorr)
281
282 return pairsAutoCorr, pairsCrossCorr
283
284 def __calculateTaus(self, data, pairsCrossCorr, pairsAutoCorr, lagTRange):
285
286 Pt0 = data.shape[1]/2
287 #Funcion de Autocorrelacion
288 dataAutoCorr = stats.nanmean(data[pairsAutoCorr,:,:], axis = 0)
289
290 #Obtencion Indice de TauCross
291 indCross = data[pairsCrossCorr,:,:].argmax(axis = 1)
292 #Obtencion Indice de TauAuto
293 indAuto = numpy.zeros(indCross.shape,dtype = 'int')
294 CCValue = data[pairsCrossCorr,Pt0,:]
295 for i in range(pairsCrossCorr.size):
296 indAuto[i,:] = numpy.abs(dataAutoCorr - CCValue[i,:]).argmin(axis = 0)
297
298 #Obtencion de TauCross y TauAuto
299 tauCross = lagTRange[indCross]
300 tauAuto = lagTRange[indAuto]
301
302 Nan1, Nan2 = numpy.where(tauCross == lagTRange[0])
303
304 tauCross[Nan1,Nan2] = numpy.nan
305 tauAuto[Nan1,Nan2] = numpy.nan
306 tau = numpy.vstack((tauCross,tauAuto))
307
308 return tau
309
310 def __calculateLag1Phase(self, data, pairs, lagTRange):
311 data1 = stats.nanmean(data[pairs,:,:], axis = 0)
312 lag1 = numpy.where(lagTRange == 0)[0][0] + 1
313
314 phase = numpy.angle(data1[lag1,:])
315
316 return phase
317 #------------------- Detect Meteors ------------------------------
318
319 def DetectMeteors(self, hei_ref = None, tauindex = 0,
320 predefinedPhaseShifts = None, centerReceiverIndex = 2,
321 cohDetection = False, cohDet_timeStep = 1, cohDet_thresh = 25,
322 noise_timeStep = 4, noise_multiple = 4,
323 multDet_timeLimit = 1, multDet_rangeLimit = 3,
324 phaseThresh = 20, SNRThresh = 8,
325 hmin = 70, hmax=110, azimuth = 0) :
326
327 '''
328 Function DetectMeteors()
329 Project developed with paper:
330 HOLDSWORTH ET AL. 2004
331
332 Input:
333 self.dataOut.data_pre
334
335 centerReceiverIndex: From the channels, which is the center receiver
336
337 hei_ref: Height reference for the Beacon signal extraction
338 tauindex:
339 predefinedPhaseShifts: Predefined phase offset for the voltge signals
340
341 cohDetection: Whether to user Coherent detection or not
342 cohDet_timeStep: Coherent Detection calculation time step
343 cohDet_thresh: Coherent Detection phase threshold to correct phases
344
345 noise_timeStep: Noise calculation time step
346 noise_multiple: Noise multiple to define signal threshold
347
348 multDet_timeLimit: Multiple Detection Removal time limit in seconds
349 multDet_rangeLimit: Multiple Detection Removal range limit in km
350
351 phaseThresh: Maximum phase difference between receiver to be consider a meteor
352 SNRThresh: Minimum SNR threshold of the meteor signal to be consider a meteor
353
354 hmin: Minimum Height of the meteor to use it in the further wind estimations
355 hmax: Maximum Height of the meteor to use it in the further wind estimations
356 azimuth: Azimuth angle correction
357
358 Affected:
359 self.dataOut.data_param
360
361 Rejection Criteria (Errors):
362 0: No error; analysis OK
363 1: SNR < SNR threshold
364 2: angle of arrival (AOA) ambiguously determined
365 3: AOA estimate not feasible
366 4: Large difference in AOAs obtained from different antenna baselines
367 5: echo at start or end of time series
368 6: echo less than 5 examples long; too short for analysis
369 7: echo rise exceeds 0.3s
370 8: echo decay time less than twice rise time
371 9: large power level before echo
372 10: large power level after echo
373 11: poor fit to amplitude for estimation of decay time
374 12: poor fit to CCF phase variation for estimation of radial drift velocity
375 13: height unresolvable echo: not valid height within 70 to 110 km
376 14: height ambiguous echo: more then one possible height within 70 to 110 km
377 15: radial drift velocity or projected horizontal velocity exceeds 200 m/s
378 16: oscilatory echo, indicating event most likely not an underdense echo
379
380 17: phase difference in meteor Reestimation
381
382 Data Storage:
383 Meteors for Wind Estimation (8):
384 Day Hour | Range Height
385 Azimuth Zenith errorCosDir
386 VelRad errorVelRad
387 TypeError
388
389 '''
390 #Get Beacon signal
391 newheis = numpy.where(self.dataOut.heightList>self.dataOut.radarControllerHeaderObj.Taus[tauindex])
392
393 if hei_ref != None:
394 newheis = numpy.where(self.dataOut.heightList>hei_ref)
395
396 heiRang = self.dataOut.getHeiRange()
397 #Pairs List
398 pairslist = []
399 nChannel = self.dataOut.nChannels
400 for i in range(nChannel):
401 if i != centerReceiverIndex:
402 pairslist.append((centerReceiverIndex,i))
403
404 #****************REMOVING HARDWARE PHASE DIFFERENCES***************
405 # see if the user put in pre defined phase shifts
406 voltsPShift = self.dataOut.data_pre.copy()
407
408 if predefinedPhaseShifts != None:
409 hardwarePhaseShifts = numpy.array(predefinedPhaseShifts)*numpy.pi/180
410 else:
411 #get hardware phase shifts using beacon signal
412 hardwarePhaseShifts = self.__getHardwarePhaseDiff(self.dataOut.data_pre, pairslist, newheis, 10)
413 hardwarePhaseShifts = numpy.insert(hardwarePhaseShifts,centerReceiverIndex,0)
414
415 voltsPShift = numpy.zeros((self.dataOut.data_pre.shape[0],self.dataOut.data_pre.shape[1],self.dataOut.data_pre.shape[2]), dtype = 'complex')
416 for i in range(self.dataOut.data_pre.shape[0]):
417 voltsPShift[i,:,:] = self.__shiftPhase(self.dataOut.data_pre[i,:,:], hardwarePhaseShifts[i])
418 #******************END OF REMOVING HARDWARE PHASE DIFFERENCES*********
419
420 #Remove DC
421 voltsDC = numpy.mean(voltsPShift,1)
422 voltsDC = numpy.mean(voltsDC,1)
423 for i in range(voltsDC.shape[0]):
424 voltsPShift[i] = voltsPShift[i] - voltsDC[i]
425
426 #Don't considerate last heights, theyre used to calculate Hardware Phase Shift
427 voltsPShift = voltsPShift[:,:,:newheis[0][0]]
428
429 #************ FIND POWER OF DATA W/COH OR NON COH DETECTION (3.4) **********
430 #Coherent Detection
431 if cohDetection:
432 #use coherent detection to get the net power
433 cohDet_thresh = cohDet_thresh*numpy.pi/180
434 voltsPShift = self.__coherentDetection(voltsPShift, cohDet_timeStep, self.dataOut.timeInterval, pairslist, cohDet_thresh)
435
436 #Non-coherent detection!
437 powerNet = numpy.nansum(numpy.abs(voltsPShift[:,:,:])**2,0)
438 #********** END OF COH/NON-COH POWER CALCULATION**********************
439
440 #********** FIND THE NOISE LEVEL AND POSSIBLE METEORS ****************
441 #Get noise
442 noise, noise1 = self.__getNoise(powerNet, noise_timeStep, self.dataOut.timeInterval)
443 # noise = self.getNoise1(powerNet, noise_timeStep, self.dataOut.timeInterval)
444 #Get signal threshold
445 signalThresh = noise_multiple*noise
446 #Meteor echoes detection
447 listMeteors = self.__findMeteors(powerNet, signalThresh)
448 #******* END OF NOISE LEVEL AND POSSIBLE METEORS CACULATION **********
449
450 #************** REMOVE MULTIPLE DETECTIONS (3.5) ***************************
451 #Parameters
452 heiRange = self.dataOut.getHeiRange()
453 rangeInterval = heiRange[1] - heiRange[0]
454 rangeLimit = multDet_rangeLimit/rangeInterval
455 timeLimit = multDet_timeLimit/self.dataOut.timeInterval
456 #Multiple detection removals
457 listMeteors1 = self.__removeMultipleDetections(listMeteors, rangeLimit, timeLimit)
458 #************ END OF REMOVE MULTIPLE DETECTIONS **********************
459
460 #********************* METEOR REESTIMATION (3.7, 3.8, 3.9, 3.10) ********************
461 #Parameters
462 phaseThresh = phaseThresh*numpy.pi/180
463 thresh = [phaseThresh, noise_multiple, SNRThresh]
464 #Meteor reestimation (Errors N 1, 6, 12, 17)
465 listMeteors2, listMeteorsPower, listMeteorsVolts = self.__meteorReestimation(listMeteors1, voltsPShift, pairslist, thresh, noise, self.dataOut.timeInterval, self.dataOut.frequency)
466 # listMeteors2, listMeteorsPower, listMeteorsVolts = self.meteorReestimation3(listMeteors2, listMeteorsPower, listMeteorsVolts, voltsPShift, pairslist, thresh, noise)
467 #Estimation of decay times (Errors N 7, 8, 11)
468 listMeteors3 = self.__estimateDecayTime(listMeteors2, listMeteorsPower, self.dataOut.timeInterval, self.dataOut.frequency)
469 #******************* END OF METEOR REESTIMATION *******************
470
471 #********************* METEOR PARAMETERS CALCULATION (3.11, 3.12, 3.13) **************************
472 #Calculating Radial Velocity (Error N 15)
473 radialStdThresh = 10
474 listMeteors4 = self.__getRadialVelocity(listMeteors3, listMeteorsVolts, radialStdThresh, pairslist, self.dataOut.timeInterval)
475
476 if len(listMeteors4) > 0:
477 #Setting New Array
478 date = repr(self.dataOut.datatime)
479 arrayMeteors4, arrayParameters = self.__setNewArrays(listMeteors4, date, heiRang)
480
481 #Calculate AOA (Error N 3, 4)
482 #JONES ET AL. 1998
483 AOAthresh = numpy.pi/8
484 error = arrayParameters[:,-1]
485 phases = -arrayMeteors4[:,9:13]
486 pairsList = []
487 pairsList.append((0,3))
488 pairsList.append((1,2))
489 arrayParameters[:,4:7], arrayParameters[:,-1] = self.__getAOA(phases, pairsList, error, AOAthresh, azimuth)
490
491 #Calculate Heights (Error N 13 and 14)
492 error = arrayParameters[:,-1]
493 Ranges = arrayParameters[:,2]
494 zenith = arrayParameters[:,5]
495 arrayParameters[:,3], arrayParameters[:,-1] = self.__getHeights(Ranges, zenith, error, hmin, hmax)
496 #********************* END OF PARAMETERS CALCULATION **************************
497
498 #***************************+ SAVE DATA IN HDF5 FORMAT **********************
499 self.dataOut.data_param = arrayParameters
500
501 return
502
503 def __getHardwarePhaseDiff(self, voltage0, pairslist, newheis, n):
504
505 minIndex = min(newheis[0])
506 maxIndex = max(newheis[0])
507
508 voltage = voltage0[:,:,minIndex:maxIndex+1]
509 nLength = voltage.shape[1]/n
510 nMin = 0
511 nMax = 0
512 phaseOffset = numpy.zeros((len(pairslist),n))
513
514 for i in range(n):
515 nMax += nLength
516 phaseCCF = -numpy.angle(self.__calculateCCF(voltage[:,nMin:nMax,:], pairslist, [0]))
517 phaseCCF = numpy.mean(phaseCCF, axis = 2)
518 phaseOffset[:,i] = phaseCCF.transpose()
519 nMin = nMax
520 # phaseDiff, phaseArrival = self.estimatePhaseDifference(voltage, pairslist)
521
522 #Remove Outliers
523 factor = 2
524 wt = phaseOffset - signal.medfilt(phaseOffset,(1,5))
525 dw = numpy.std(wt,axis = 1)
526 dw = dw.reshape((dw.size,1))
527 ind = numpy.where(numpy.logical_or(wt>dw*factor,wt<-dw*factor))
528 phaseOffset[ind] = numpy.nan
529 phaseOffset = stats.nanmean(phaseOffset, axis=1)
530
531 return phaseOffset
532
533 def __shiftPhase(self, data, phaseShift):
534 #this will shift the phase of a complex number
535 dataShifted = numpy.abs(data) * numpy.exp((numpy.angle(data)+phaseShift)*1j)
536 return dataShifted
537
538 def __estimatePhaseDifference(self, array, pairslist):
539 nChannel = array.shape[0]
540 nHeights = array.shape[2]
541 numPairs = len(pairslist)
542 # phaseCCF = numpy.zeros((nChannel, 5, nHeights))
543 phaseCCF = numpy.angle(self.__calculateCCF(array, pairslist, [-2,-1,0,1,2]))
544
545 #Correct phases
546 derPhaseCCF = phaseCCF[:,1:,:] - phaseCCF[:,0:-1,:]
547 indDer = numpy.where(numpy.abs(derPhaseCCF) > numpy.pi)
548
549 if indDer[0].shape[0] > 0:
550 for i in range(indDer[0].shape[0]):
551 signo = -numpy.sign(derPhaseCCF[indDer[0][i],indDer[1][i],indDer[2][i]])
552 phaseCCF[indDer[0][i],indDer[1][i]+1:,:] += signo*2*numpy.pi
553
554 # for j in range(numSides):
555 # phaseCCFAux = self.calculateCCF(arrayCenter, arraySides[j,:,:], [-2,1,0,1,2])
556 # phaseCCF[j,:,:] = numpy.angle(phaseCCFAux)
557 #
558 #Linear
559 phaseInt = numpy.zeros((numPairs,1))
560 angAllCCF = phaseCCF[:,[0,1,3,4],0]
561 for j in range(numPairs):
562 fit = stats.linregress([-2,-1,1,2],angAllCCF[j,:])
563 phaseInt[j] = fit[1]
564 #Phase Differences
565 phaseDiff = phaseInt - phaseCCF[:,2,:]
566 phaseArrival = phaseInt.reshape(phaseInt.size)
567
568 #Dealias
569 indAlias = numpy.where(phaseArrival > numpy.pi)
570 phaseArrival[indAlias] -= 2*numpy.pi
571 indAlias = numpy.where(phaseArrival < -numpy.pi)
572 phaseArrival[indAlias] += 2*numpy.pi
573
574 return phaseDiff, phaseArrival
575
576 def __coherentDetection(self, volts, timeSegment, timeInterval, pairslist, thresh):
577 #this function will run the coherent detection used in Holdworth et al. 2004 and return the net power
578 #find the phase shifts of each channel over 1 second intervals
579 #only look at ranges below the beacon signal
580 numProfPerBlock = numpy.ceil(timeSegment/timeInterval)
581 numBlocks = int(volts.shape[1]/numProfPerBlock)
582 numHeights = volts.shape[2]
583 nChannel = volts.shape[0]
584 voltsCohDet = volts.copy()
585
586 pairsarray = numpy.array(pairslist)
587 indSides = pairsarray[:,1]
588 # indSides = numpy.array(range(nChannel))
589 # indSides = numpy.delete(indSides, indCenter)
590 #
591 # listCenter = numpy.array_split(volts[indCenter,:,:], numBlocks, 0)
592 listBlocks = numpy.array_split(volts, numBlocks, 1)
593
594 startInd = 0
595 endInd = 0
596
597 for i in range(numBlocks):
598 startInd = endInd
599 endInd = endInd + listBlocks[i].shape[1]
600
601 arrayBlock = listBlocks[i]
602 # arrayBlockCenter = listCenter[i]
603
604 #Estimate the Phase Difference
605 phaseDiff, aux = self.__estimatePhaseDifference(arrayBlock, pairslist)
606 #Phase Difference RMS
607 arrayPhaseRMS = numpy.abs(phaseDiff)
608 phaseRMSaux = numpy.sum(arrayPhaseRMS < thresh,0)
609 indPhase = numpy.where(phaseRMSaux==4)
610 #Shifting
611 if indPhase[0].shape[0] > 0:
612 for j in range(indSides.size):
613 arrayBlock[indSides[j],:,indPhase] = self.__shiftPhase(arrayBlock[indSides[j],:,indPhase], phaseDiff[j,indPhase].transpose())
614 voltsCohDet[:,startInd:endInd,:] = arrayBlock
615
616 return voltsCohDet
617
618 def __calculateCCF(self, volts, pairslist ,laglist):
619
620 nHeights = volts.shape[2]
621 nPoints = volts.shape[1]
622 voltsCCF = numpy.zeros((len(pairslist), len(laglist), nHeights),dtype = 'complex')
623
624 for i in range(len(pairslist)):
625 volts1 = volts[pairslist[i][0]]
626 volts2 = volts[pairslist[i][1]]
627
628 for t in range(len(laglist)):
629 idxT = laglist[t]
630 if idxT >= 0:
631 vStacked = numpy.vstack((volts2[idxT:,:],
632 numpy.zeros((idxT, nHeights),dtype='complex')))
633 else:
634 vStacked = numpy.vstack((numpy.zeros((-idxT, nHeights),dtype='complex'),
635 volts2[:(nPoints + idxT),:]))
636 voltsCCF[i,t,:] = numpy.sum((numpy.conjugate(volts1)*vStacked),axis=0)
637
638 vStacked = None
639 return voltsCCF
640
641 def __getNoise(self, power, timeSegment, timeInterval):
642 numProfPerBlock = numpy.ceil(timeSegment/timeInterval)
643 numBlocks = int(power.shape[0]/numProfPerBlock)
644 numHeights = power.shape[1]
645
646 listPower = numpy.array_split(power, numBlocks, 0)
647 noise = numpy.zeros((power.shape[0], power.shape[1]))
648 noise1 = numpy.zeros((power.shape[0], power.shape[1]))
649
650 startInd = 0
651 endInd = 0
652
653 for i in range(numBlocks): #split por canal
654 startInd = endInd
655 endInd = endInd + listPower[i].shape[0]
656
657 arrayBlock = listPower[i]
658 noiseAux = numpy.mean(arrayBlock, 0)
659 # noiseAux = numpy.median(noiseAux)
660 # noiseAux = numpy.mean(arrayBlock)
661 noise[startInd:endInd,:] = noise[startInd:endInd,:] + noiseAux
662
663 noiseAux1 = numpy.mean(arrayBlock)
664 noise1[startInd:endInd,:] = noise1[startInd:endInd,:] + noiseAux1
665
666 return noise, noise1
667
668 def __findMeteors(self, power, thresh):
669 nProf = power.shape[0]
670 nHeights = power.shape[1]
671 listMeteors = []
672
673 for i in range(nHeights):
674 powerAux = power[:,i]
675 threshAux = thresh[:,i]
676
677 indUPthresh = numpy.where(powerAux > threshAux)[0]
678 indDNthresh = numpy.where(powerAux <= threshAux)[0]
679
680 j = 0
681
682 while (j < indUPthresh.size - 2):
683 if (indUPthresh[j + 2] == indUPthresh[j] + 2):
684 indDNAux = numpy.where(indDNthresh > indUPthresh[j])
685 indDNthresh = indDNthresh[indDNAux]
686
687 if (indDNthresh.size > 0):
688 indEnd = indDNthresh[0] - 1
689 indInit = indUPthresh[j]
690
691 meteor = powerAux[indInit:indEnd + 1]
692 indPeak = meteor.argmax() + indInit
693 FLA = sum(numpy.conj(meteor)*numpy.hstack((meteor[1:],0)))
694
695 listMeteors.append(numpy.array([i,indInit,indPeak,indEnd,FLA])) #CHEQUEAR!!!!!
696 j = numpy.where(indUPthresh == indEnd)[0] + 1
697 else: j+=1
698 else: j+=1
699
700 return listMeteors
701
702 def __removeMultipleDetections(self,listMeteors, rangeLimit, timeLimit):
703
704 arrayMeteors = numpy.asarray(listMeteors)
705 listMeteors1 = []
706
707 while arrayMeteors.shape[0] > 0:
708 FLAs = arrayMeteors[:,4]
709 maxFLA = FLAs.argmax()
710 listMeteors1.append(arrayMeteors[maxFLA,:])
711
712 MeteorInitTime = arrayMeteors[maxFLA,1]
713 MeteorEndTime = arrayMeteors[maxFLA,3]
714 MeteorHeight = arrayMeteors[maxFLA,0]
715
716 #Check neighborhood
717 maxHeightIndex = MeteorHeight + rangeLimit
718 minHeightIndex = MeteorHeight - rangeLimit
719 minTimeIndex = MeteorInitTime - timeLimit
720 maxTimeIndex = MeteorEndTime + timeLimit
721
722 #Check Heights
723 indHeight = numpy.logical_and(arrayMeteors[:,0] >= minHeightIndex, arrayMeteors[:,0] <= maxHeightIndex)
724 indTime = numpy.logical_and(arrayMeteors[:,3] >= minTimeIndex, arrayMeteors[:,1] <= maxTimeIndex)
725 indBoth = numpy.where(numpy.logical_and(indTime,indHeight))
726
727 arrayMeteors = numpy.delete(arrayMeteors, indBoth, axis = 0)
728
729 return listMeteors1
730
731 def __meteorReestimation(self, listMeteors, volts, pairslist, thresh, noise, timeInterval,frequency):
732 numHeights = volts.shape[2]
733 nChannel = volts.shape[0]
734
735 thresholdPhase = thresh[0]
736 thresholdNoise = thresh[1]
737 thresholdDB = float(thresh[2])
738
739 thresholdDB1 = 10**(thresholdDB/10)
740 pairsarray = numpy.array(pairslist)
741 indSides = pairsarray[:,1]
742
743 pairslist1 = list(pairslist)
744 pairslist1.append((0,1))
745 pairslist1.append((3,4))
746
747 listMeteors1 = []
748 listPowerSeries = []
749 listVoltageSeries = []
750 #volts has the war data
751
752 if frequency == 30e6:
753 timeLag = 45*10**-3
754 else:
755 timeLag = 15*10**-3
756 lag = numpy.ceil(timeLag/timeInterval)
757
758 for i in range(len(listMeteors)):
759
760 ###################### 3.6 - 3.7 PARAMETERS REESTIMATION #########################
761 meteorAux = numpy.zeros(16)
762
763 #Loading meteor Data (mHeight, mStart, mPeak, mEnd)
764 mHeight = listMeteors[i][0]
765 mStart = listMeteors[i][1]
766 mPeak = listMeteors[i][2]
767 mEnd = listMeteors[i][3]
768
769 #get the volt data between the start and end times of the meteor
770 meteorVolts = volts[:,mStart:mEnd+1,mHeight]
771 meteorVolts = meteorVolts.reshape(meteorVolts.shape[0], meteorVolts.shape[1], 1)
772
773 #3.6. Phase Difference estimation
774 phaseDiff, aux = self.__estimatePhaseDifference(meteorVolts, pairslist)
775
776 #3.7. Phase difference removal & meteor start, peak and end times reestimated
777 #meteorVolts0.- all Channels, all Profiles
778 meteorVolts0 = volts[:,:,mHeight]
779 meteorThresh = noise[:,mHeight]*thresholdNoise
780 meteorNoise = noise[:,mHeight]
781 meteorVolts0[indSides,:] = self.__shiftPhase(meteorVolts0[indSides,:], phaseDiff) #Phase Shifting
782 powerNet0 = numpy.nansum(numpy.abs(meteorVolts0)**2, axis = 0) #Power
783
784 #Times reestimation
785 mStart1 = numpy.where(powerNet0[:mPeak] < meteorThresh[:mPeak])[0]
786 if mStart1.size > 0:
787 mStart1 = mStart1[-1] + 1
788
789 else:
790 mStart1 = mPeak
791
792 mEnd1 = numpy.where(powerNet0[mPeak:] < meteorThresh[mPeak:])[0][0] + mPeak - 1
793 mEndDecayTime1 = numpy.where(powerNet0[mPeak:] < meteorNoise[mPeak:])[0]
794 if mEndDecayTime1.size == 0:
795 mEndDecayTime1 = powerNet0.size
796 else:
797 mEndDecayTime1 = mEndDecayTime1[0] + mPeak - 1
798 # mPeak1 = meteorVolts0[mStart1:mEnd1 + 1].argmax()
799
800 #meteorVolts1.- all Channels, from start to end
801 meteorVolts1 = meteorVolts0[:,mStart1:mEnd1 + 1]
802 meteorVolts2 = meteorVolts0[:,mPeak + lag:mEnd1 + 1]
803 if meteorVolts2.shape[1] == 0:
804 meteorVolts2 = meteorVolts0[:,mPeak:mEnd1 + 1]
805 meteorVolts1 = meteorVolts1.reshape(meteorVolts1.shape[0], meteorVolts1.shape[1], 1)
806 meteorVolts2 = meteorVolts2.reshape(meteorVolts2.shape[0], meteorVolts2.shape[1], 1)
807 ##################### END PARAMETERS REESTIMATION #########################
808
809 ##################### 3.8 PHASE DIFFERENCE REESTIMATION ########################
810 # if mEnd1 - mStart1 > 4: #Error Number 6: echo less than 5 samples long; too short for analysis
811 if meteorVolts2.shape[1] > 0:
812 #Phase Difference re-estimation
813 phaseDiff1, phaseDiffint = self.__estimatePhaseDifference(meteorVolts2, pairslist1) #Phase Difference Estimation
814 # phaseDiff1, phaseDiffint = self.estimatePhaseDifference(meteorVolts2, pairslist)
815 meteorVolts2 = meteorVolts2.reshape(meteorVolts2.shape[0], meteorVolts2.shape[1])
816 phaseDiff11 = numpy.reshape(phaseDiff1, (phaseDiff1.shape[0],1))
817 meteorVolts2[indSides,:] = self.__shiftPhase(meteorVolts2[indSides,:], phaseDiff11[0:4]) #Phase Shifting
818
819 #Phase Difference RMS
820 phaseRMS1 = numpy.sqrt(numpy.mean(numpy.square(phaseDiff1)))
821 powerNet1 = numpy.nansum(numpy.abs(meteorVolts1[:,:])**2,0)
822 #Data from Meteor
823 mPeak1 = powerNet1.argmax() + mStart1
824 mPeakPower1 = powerNet1.max()
825 noiseAux = sum(noise[mStart1:mEnd1 + 1,mHeight])
826 mSNR1 = (sum(powerNet1)-noiseAux)/noiseAux
827 Meteor1 = numpy.array([mHeight, mStart1, mPeak1, mEnd1, mPeakPower1, mSNR1, phaseRMS1])
828 Meteor1 = numpy.hstack((Meteor1,phaseDiffint))
829 PowerSeries = powerNet0[mStart1:mEndDecayTime1 + 1]
830 #Vectorize
831 meteorAux[0:7] = [mHeight, mStart1, mPeak1, mEnd1, mPeakPower1, mSNR1, phaseRMS1]
832 meteorAux[7:11] = phaseDiffint[0:4]
833
834 #Rejection Criterions
835 if phaseRMS1 > thresholdPhase: #Error Number 17: Phase variation
836 meteorAux[-1] = 17
837 elif mSNR1 < thresholdDB1: #Error Number 1: SNR < threshold dB
838 meteorAux[-1] = 1
839
840
841 else:
842 meteorAux[0:4] = [mHeight, mStart, mPeak, mEnd]
843 meteorAux[-1] = 6 #Error Number 6: echo less than 5 samples long; too short for analysis
844 PowerSeries = 0
845
846 listMeteors1.append(meteorAux)
847 listPowerSeries.append(PowerSeries)
848 listVoltageSeries.append(meteorVolts1)
849
850 return listMeteors1, listPowerSeries, listVoltageSeries
851
852 def __estimateDecayTime(self, listMeteors, listPower, timeInterval, frequency):
853
854 threshError = 10
855 #Depending if it is 30 or 50 MHz
856 if frequency == 30e6:
857 timeLag = 45*10**-3
858 else:
859 timeLag = 15*10**-3
860 lag = numpy.ceil(timeLag/timeInterval)
861
862 listMeteors1 = []
863
864 for i in range(len(listMeteors)):
865 meteorPower = listPower[i]
866 meteorAux = listMeteors[i]
867
868 if meteorAux[-1] == 0:
869
870 try:
871 indmax = meteorPower.argmax()
872 indlag = indmax + lag
873
874 y = meteorPower[indlag:]
875 x = numpy.arange(0, y.size)*timeLag
876
877 #first guess
878 a = y[0]
879 tau = timeLag
880 #exponential fit
881 popt, pcov = optimize.curve_fit(self.__exponential_function, x, y, p0 = [a, tau])
882 y1 = self.__exponential_function(x, *popt)
883 #error estimation
884 error = sum((y - y1)**2)/(numpy.var(y)*(y.size - popt.size))
885
886 decayTime = popt[1]
887 riseTime = indmax*timeInterval
888 meteorAux[11:13] = [decayTime, error]
889
890 #Table items 7, 8 and 11
891 if (riseTime > 0.3): #Number 7: Echo rise exceeds 0.3s
892 meteorAux[-1] = 7
893 elif (decayTime < 2*riseTime) : #Number 8: Echo decay time less than than twice rise time
894 meteorAux[-1] = 8
895 if (error > threshError): #Number 11: Poor fit to amplitude for estimation of decay time
896 meteorAux[-1] = 11
897
898
899 except:
900 meteorAux[-1] = 11
901
902
903 listMeteors1.append(meteorAux)
904
905 return listMeteors1
906
907 #Exponential Function
908
909 def __exponential_function(self, x, a, tau):
910 y = a*numpy.exp(-x/tau)
911 return y
912
913 def __getRadialVelocity(self, listMeteors, listVolts, radialStdThresh, pairslist, timeInterval):
914
915 pairslist1 = list(pairslist)
916 pairslist1.append((0,1))
917 pairslist1.append((3,4))
918 numPairs = len(pairslist1)
919 #Time Lag
920 timeLag = 45*10**-3
921 c = 3e8
922 lag = numpy.ceil(timeLag/timeInterval)
923 freq = 30e6
924
925 listMeteors1 = []
926
927 for i in range(len(listMeteors)):
928 meteor = listMeteors[i]
929 meteorAux = numpy.hstack((meteor[:-1], 0, 0, meteor[-1]))
930 if meteor[-1] == 0:
931 mStart = listMeteors[i][1]
932 mPeak = listMeteors[i][2]
933 mLag = mPeak - mStart + lag
934
935 #get the volt data between the start and end times of the meteor
936 meteorVolts = listVolts[i]
937 meteorVolts = meteorVolts.reshape(meteorVolts.shape[0], meteorVolts.shape[1], 1)
938
939 #Get CCF
940 allCCFs = self.__calculateCCF(meteorVolts, pairslist1, [-2,-1,0,1,2])
941
942 #Method 2
943 slopes = numpy.zeros(numPairs)
944 time = numpy.array([-2,-1,1,2])*timeInterval
945 angAllCCF = numpy.angle(allCCFs[:,[0,1,3,4],0])
946
947 #Correct phases
948 derPhaseCCF = angAllCCF[:,1:] - angAllCCF[:,0:-1]
949 indDer = numpy.where(numpy.abs(derPhaseCCF) > numpy.pi)
950
951 if indDer[0].shape[0] > 0:
952 for i in range(indDer[0].shape[0]):
953 signo = -numpy.sign(derPhaseCCF[indDer[0][i],indDer[1][i]])
954 angAllCCF[indDer[0][i],indDer[1][i]+1:] += signo*2*numpy.pi
955
956 # fit = scipy.stats.linregress(numpy.array([-2,-1,1,2])*timeInterval, numpy.array([phaseLagN2s[i],phaseLagN1s[i],phaseLag1s[i],phaseLag2s[i]]))
957 for j in range(numPairs):
958 fit = stats.linregress(time, angAllCCF[j,:])
959 slopes[j] = fit[0]
960
961 #Remove Outlier
962 # indOut = numpy.argmax(numpy.abs(slopes - numpy.mean(slopes)))
963 # slopes = numpy.delete(slopes,indOut)
964 # indOut = numpy.argmax(numpy.abs(slopes - numpy.mean(slopes)))
965 # slopes = numpy.delete(slopes,indOut)
966
967 radialVelocity = -numpy.mean(slopes)*(0.25/numpy.pi)*(c/freq)
968 radialError = numpy.std(slopes)*(0.25/numpy.pi)*(c/freq)
969 meteorAux[-2] = radialError
970 meteorAux[-3] = radialVelocity
971
972 #Setting Error
973 #Number 15: Radial Drift velocity or projected horizontal velocity exceeds 200 m/s
974 if numpy.abs(radialVelocity) > 200:
975 meteorAux[-1] = 15
976 #Number 12: Poor fit to CCF variation for estimation of radial drift velocity
977 elif radialError > radialStdThresh:
978 meteorAux[-1] = 12
979
980 listMeteors1.append(meteorAux)
981 return listMeteors1
982
983 def __setNewArrays(self, listMeteors, date, heiRang):
984
985 #New arrays
986 arrayMeteors = numpy.array(listMeteors)
987 arrayParameters = numpy.zeros((len(listMeteors),10))
988
989 #Date inclusion
990 date = re.findall(r'\((.*?)\)', date)
991 date = date[0].split(',')
992 date = map(int, date)
993 date = [date[0]*10000 + date[1]*100 + date[2], date[3]*10000 + date[4]*100 + date[5]]
994 arrayDate = numpy.tile(date, (len(listMeteors), 1))
995
996 #Meteor array
997 arrayMeteors[:,0] = heiRang[arrayMeteors[:,0].astype(int)]
998 arrayMeteors = numpy.hstack((arrayDate, arrayMeteors))
999
1000 #Parameters Array
1001 arrayParameters[:,0:3] = arrayMeteors[:,0:3]
1002 arrayParameters[:,-3:] = arrayMeteors[:,-3:]
1003
1004 return arrayMeteors, arrayParameters
1005
1006 def __getAOA(self, phases, pairsList, error, AOAthresh, azimuth):
1007
1008 arrayAOA = numpy.zeros((phases.shape[0],3))
1009 cosdir0, cosdir = self.__getDirectionCosines(phases, pairsList)
1010
1011 arrayAOA[:,:2] = self.__calculateAOA(cosdir, azimuth)
1012 cosDirError = numpy.sum(numpy.abs(cosdir0 - cosdir), axis = 1)
1013 arrayAOA[:,2] = cosDirError
1014
1015 azimuthAngle = arrayAOA[:,0]
1016 zenithAngle = arrayAOA[:,1]
1017
1018 #Setting Error
1019 #Number 3: AOA not fesible
1020 indInvalid = numpy.where(numpy.logical_and((numpy.logical_or(numpy.isnan(zenithAngle), numpy.isnan(azimuthAngle))),error == 0))[0]
1021 error[indInvalid] = 3
1022 #Number 4: Large difference in AOAs obtained from different antenna baselines
1023 indInvalid = numpy.where(numpy.logical_and(cosDirError > AOAthresh,error == 0))[0]
1024 error[indInvalid] = 4
1025 return arrayAOA, error
1026
1027 def __getDirectionCosines(self, arrayPhase, pairsList):
1028
1029 #Initializing some variables
1030 ang_aux = numpy.array([-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8])*2*numpy.pi
1031 ang_aux = ang_aux.reshape(1,ang_aux.size)
1032
1033 cosdir = numpy.zeros((arrayPhase.shape[0],2))
1034 cosdir0 = numpy.zeros((arrayPhase.shape[0],2))
1035
1036
1037 for i in range(2):
1038 #First Estimation
1039 phi0_aux = arrayPhase[:,pairsList[i][0]] + arrayPhase[:,pairsList[i][1]]
1040 #Dealias
1041 indcsi = numpy.where(phi0_aux > numpy.pi)
1042 phi0_aux[indcsi] -= 2*numpy.pi
1043 indcsi = numpy.where(phi0_aux < -numpy.pi)
1044 phi0_aux[indcsi] += 2*numpy.pi
1045 #Direction Cosine 0
1046 cosdir0[:,i] = -(phi0_aux)/(2*numpy.pi*0.5)
1047
1048 #Most-Accurate Second Estimation
1049 phi1_aux = arrayPhase[:,pairsList[i][0]] - arrayPhase[:,pairsList[i][1]]
1050 phi1_aux = phi1_aux.reshape(phi1_aux.size,1)
1051 #Direction Cosine 1
1052 cosdir1 = -(phi1_aux + ang_aux)/(2*numpy.pi*4.5)
1053
1054 #Searching the correct Direction Cosine
1055 cosdir0_aux = cosdir0[:,i]
1056 cosdir0_aux = cosdir0_aux.reshape(cosdir0_aux.size,1)
1057 #Minimum Distance
1058 cosDiff = (cosdir1 - cosdir0_aux)**2
1059 indcos = cosDiff.argmin(axis = 1)
1060 #Saving Value obtained
1061 cosdir[:,i] = cosdir1[numpy.arange(len(indcos)),indcos]
1062
1063 return cosdir0, cosdir
1064
1065 def __calculateAOA(self, cosdir, azimuth):
1066 cosdirX = cosdir[:,0]
1067 cosdirY = cosdir[:,1]
1068
1069 zenithAngle = numpy.arccos(numpy.sqrt(1 - cosdirX**2 - cosdirY**2))*180/numpy.pi
1070 azimuthAngle = numpy.arctan2(cosdirX,cosdirY)*180/numpy.pi + azimuth #0 deg north, 90 deg east
1071 angles = numpy.vstack((azimuthAngle, zenithAngle)).transpose()
1072
1073 return angles
1074
1075 def __getHeights(self, Ranges, zenith, error, minHeight, maxHeight):
1076
1077 Ramb = 375 #Ramb = c/(2*PRF)
1078 Re = 6371 #Earth Radius
1079 heights = numpy.zeros(Ranges.shape)
1080
1081 R_aux = numpy.array([0,1,2])*Ramb
1082 R_aux = R_aux.reshape(1,R_aux.size)
1083
1084 Ranges = Ranges.reshape(Ranges.size,1)
1085
1086 Ri = Ranges + R_aux
1087 hi = numpy.sqrt(Re**2 + Ri**2 + (2*Re*numpy.cos(zenith*numpy.pi/180)*Ri.transpose()).transpose()) - Re
1088
1089 #Check if there is a height between 70 and 110 km
1090 h_bool = numpy.sum(numpy.logical_and(hi > minHeight, hi < maxHeight), axis = 1)
1091 ind_h = numpy.where(h_bool == 1)[0]
1092
1093 hCorr = hi[ind_h, :]
1094 ind_hCorr = numpy.where(numpy.logical_and(hi > minHeight, hi < maxHeight))
1095
1096 hCorr = hi[ind_hCorr]
1097 heights[ind_h] = hCorr
1098
1099 #Setting Error
1100 #Number 13: Height unresolvable echo: not valid height within 70 to 110 km
1101 #Number 14: Height ambiguous echo: more than one possible height within 70 to 110 km
1102
1103 indInvalid2 = numpy.where(numpy.logical_and(h_bool > 1, error == 0))[0]
1104 error[indInvalid2] = 14
1105 indInvalid1 = numpy.where(numpy.logical_and(h_bool == 0, error == 0))[0]
1106 error[indInvalid1] = 13
1107
1108 return heights, error
1109
1110
1111 class WindProfiler(Operation):
1112
1113 __isConfig = False
1114
1115 __initime = None
1116 __lastdatatime = None
1117 __integrationtime = None
1118
1119 __buffer = None
1120
1121 __dataReady = False
1122
1123 __firstdata = None
1124
1125 n = None
1126
1127 def __init__(self):
1128 Operation.__init__(self)
1129
1130 def __calculateAngles(self, theta_x, theta_y, azimuth):
1131
1132 dir_cosw = numpy.sqrt(1-theta_x**2-theta_y**2)
1133 zenith_arr = numpy.arccos(dir_cosw)
1134 azimuth_arr = numpy.arctan2(theta_x,theta_y) + azimuth*math.pi/180
1135
1136 dir_cosu = numpy.sin(azimuth_arr)*numpy.sin(zenith_arr)
1137 dir_cosv = numpy.cos(azimuth_arr)*numpy.sin(zenith_arr)
1138
1139 return azimuth_arr, zenith_arr, dir_cosu, dir_cosv, dir_cosw
1140
1141 def __calculateMatA(self, dir_cosu, dir_cosv, dir_cosw, horOnly):
1142
1143 #
1144 if horOnly:
1145 A = numpy.c_[dir_cosu,dir_cosv]
1146 else:
1147 A = numpy.c_[dir_cosu,dir_cosv,dir_cosw]
1148 A = numpy.asmatrix(A)
1149 A1 = numpy.linalg.inv(A.transpose()*A)*A.transpose()
1150
1151 return A1
1152
1153 def __correctValues(self, heiRang, phi, velRadial, SNR):
1154 listPhi = phi.tolist()
1155 maxid = listPhi.index(max(listPhi))
1156 minid = listPhi.index(min(listPhi))
1157
1158 rango = range(len(phi))
1159 # rango = numpy.delete(rango,maxid)
1160
1161 heiRang1 = heiRang*math.cos(phi[maxid])
1162 heiRangAux = heiRang*math.cos(phi[minid])
1163 indOut = (heiRang1 < heiRangAux[0]).nonzero()
1164 heiRang1 = numpy.delete(heiRang1,indOut)
1165
1166 velRadial1 = numpy.zeros([len(phi),len(heiRang1)])
1167 SNR1 = numpy.zeros([len(phi),len(heiRang1)])
1168
1169 for i in rango:
1170 x = heiRang*math.cos(phi[i])
1171 y1 = velRadial[i,:]
1172 f1 = interpolate.interp1d(x,y1,kind = 'cubic')
1173
1174 x1 = heiRang1
1175 y11 = f1(x1)
1176
1177 y2 = SNR[i,:]
1178 f2 = interpolate.interp1d(x,y2,kind = 'cubic')
1179 y21 = f2(x1)
1180
1181 velRadial1[i,:] = y11
1182 SNR1[i,:] = y21
1183
1184 return heiRang1, velRadial1, SNR1
1185
1186 def __calculateVelUVW(self, A, velRadial):
1187
1188 #Operacion Matricial
1189 # velUVW = numpy.zeros((velRadial.shape[1],3))
1190 # for ind in range(velRadial.shape[1]):
1191 # velUVW[ind,:] = numpy.dot(A,velRadial[:,ind])
1192 # velUVW = velUVW.transpose()
1193 velUVW = numpy.zeros((A.shape[0],velRadial.shape[1]))
1194 velUVW[:,:] = numpy.dot(A,velRadial)
1195
1196
1197 return velUVW
1198
1199 def techniqueDBS(self, velRadial0, dirCosx, disrCosy, azimuth, correct, horizontalOnly, heiRang, SNR0):
1200 """
1201 Function that implements Doppler Beam Swinging (DBS) technique.
1202
1203 Input: Radial velocities, Direction cosines (x and y) of the Beam, Antenna azimuth,
1204 Direction correction (if necessary), Ranges and SNR
1205
1206 Output: Winds estimation (Zonal, Meridional and Vertical)
1207
1208 Parameters affected: Winds, height range, SNR
1209 """
1210 azimuth_arr, zenith_arr, dir_cosu, dir_cosv, dir_cosw = self.__calculateAngles(dirCosx, disrCosy, azimuth)
1211 heiRang1, velRadial1, SNR1 = self.__correctValues(heiRang, zenith_arr, correct*velRadial0, SNR0)
1212 A = self.__calculateMatA(dir_cosu, dir_cosv, dir_cosw, horizontalOnly)
1213
1214 #Calculo de Componentes de la velocidad con DBS
1215 winds = self.__calculateVelUVW(A,velRadial1)
1216
1217 return winds, heiRang1, SNR1
1218
1219 def __calculateDistance(self, posx, posy, pairsCrossCorr, pairsList, pairs, azimuth = None):
1220
1221 posx = numpy.asarray(posx)
1222 posy = numpy.asarray(posy)
1223
1224 #Rotacion Inversa para alinear con el azimuth
1225 if azimuth!= None:
1226 azimuth = azimuth*math.pi/180
1227 posx1 = posx*math.cos(azimuth) + posy*math.sin(azimuth)
1228 posy1 = -posx*math.sin(azimuth) + posy*math.cos(azimuth)
1229 else:
1230 posx1 = posx
1231 posy1 = posy
1232
1233 #Calculo de Distancias
1234 distx = numpy.zeros(pairsCrossCorr.size)
1235 disty = numpy.zeros(pairsCrossCorr.size)
1236 dist = numpy.zeros(pairsCrossCorr.size)
1237 ang = numpy.zeros(pairsCrossCorr.size)
1238
1239 for i in range(pairsCrossCorr.size):
1240 distx[i] = posx1[pairsList[pairsCrossCorr[i]][1]] - posx1[pairsList[pairsCrossCorr[i]][0]]
1241 disty[i] = posy1[pairsList[pairsCrossCorr[i]][1]] - posy1[pairsList[pairsCrossCorr[i]][0]]
1242 dist[i] = numpy.sqrt(distx[i]**2 + disty[i]**2)
1243 ang[i] = numpy.arctan2(disty[i],distx[i])
1244 #Calculo de Matrices
1245 nPairs = len(pairs)
1246 ang1 = numpy.zeros((nPairs, 2, 1))
1247 dist1 = numpy.zeros((nPairs, 2, 1))
1248
1249 for j in range(nPairs):
1250 dist1[j,0,0] = dist[pairs[j][0]]
1251 dist1[j,1,0] = dist[pairs[j][1]]
1252 ang1[j,0,0] = ang[pairs[j][0]]
1253 ang1[j,1,0] = ang[pairs[j][1]]
1254
1255 return distx,disty, dist1,ang1
1256
1257 def __calculateVelVer(self, phase, lagTRange, _lambda):
1258
1259 Ts = lagTRange[1] - lagTRange[0]
1260 velW = -_lambda*phase/(4*math.pi*Ts)
1261
1262 return velW
1263
1264 def __calculateVelHorDir(self, dist, tau1, tau2, ang):
1265 nPairs = tau1.shape[0]
1266 vel = numpy.zeros((nPairs,3,tau1.shape[2]))
1267
1268 angCos = numpy.cos(ang)
1269 angSin = numpy.sin(ang)
1270
1271 vel0 = dist*tau1/(2*tau2**2)
1272 vel[:,0,:] = (vel0*angCos).sum(axis = 1)
1273 vel[:,1,:] = (vel0*angSin).sum(axis = 1)
1274
1275 ind = numpy.where(numpy.isinf(vel))
1276 vel[ind] = numpy.nan
1277
1278 return vel
1279
1280 def __getPairsAutoCorr(self, pairsList, nChannels):
1281
1282 pairsAutoCorr = numpy.zeros(nChannels, dtype = 'int')*numpy.nan
1283
1284 for l in range(len(pairsList)):
1285 firstChannel = pairsList[l][0]
1286 secondChannel = pairsList[l][1]
1287
1288 #Obteniendo pares de Autocorrelacion
1289 if firstChannel == secondChannel:
1290 pairsAutoCorr[firstChannel] = int(l)
1291
1292 pairsAutoCorr = pairsAutoCorr.astype(int)
1293
1294 pairsCrossCorr = range(len(pairsList))
1295 pairsCrossCorr = numpy.delete(pairsCrossCorr,pairsAutoCorr)
1296
1297 return pairsAutoCorr, pairsCrossCorr
1298
1299 def techniqueSA(self, pairsSelected, pairsList, nChannels, tau, azimuth, _lambda, position_x, position_y, lagTRange, correctFactor):
1300 """
1301 Function that implements Spaced Antenna (SA) technique.
1302
1303 Input: Radial velocities, Direction cosines (x and y) of the Beam, Antenna azimuth,
1304 Direction correction (if necessary), Ranges and SNR
1305
1306 Output: Winds estimation (Zonal, Meridional and Vertical)
1307
1308 Parameters affected: Winds
1309 """
1310 #Cross Correlation pairs obtained
1311 pairsAutoCorr, pairsCrossCorr = self.__getPairsAutoCorr(pairsList, nChannels)
1312 pairsArray = numpy.array(pairsList)[pairsCrossCorr]
1313 pairsSelArray = numpy.array(pairsSelected)
1314 pairs = []
1315
1316 #Wind estimation pairs obtained
1317 for i in range(pairsSelArray.shape[0]/2):
1318 ind1 = numpy.where(numpy.all(pairsArray == pairsSelArray[2*i], axis = 1))[0][0]
1319 ind2 = numpy.where(numpy.all(pairsArray == pairsSelArray[2*i + 1], axis = 1))[0][0]
1320 pairs.append((ind1,ind2))
1321
1322 indtau = tau.shape[0]/2
1323 tau1 = tau[:indtau,:]
1324 tau2 = tau[indtau:-1,:]
1325 tau1 = tau1[pairs,:]
1326 tau2 = tau2[pairs,:]
1327 phase1 = tau[-1,:]
1328
1329 #---------------------------------------------------------------------
1330 #Metodo Directo
1331 distx, disty, dist, ang = self.__calculateDistance(position_x, position_y, pairsCrossCorr, pairsList, pairs,azimuth)
1332 winds = self.__calculateVelHorDir(dist, tau1, tau2, ang)
1333 winds = stats.nanmean(winds, axis=0)
1334 #---------------------------------------------------------------------
1335 #Metodo General
1336 # distx, disty, dist = self.calculateDistance(position_x,position_y,pairsCrossCorr, pairsList, azimuth)
1337 # #Calculo Coeficientes de Funcion de Correlacion
1338 # F,G,A,B,H = self.calculateCoef(tau1,tau2,distx,disty,n)
1339 # #Calculo de Velocidades
1340 # winds = self.calculateVelUV(F,G,A,B,H)
1341
1342 #---------------------------------------------------------------------
1343 winds[2,:] = self.__calculateVelVer(phase1, lagTRange, _lambda)
1344 winds = correctFactor*winds
1345 return winds
1346
1347 def __checkTime(self, currentTime, paramInterval, windsInterval):
1348
1349 dataTime = currentTime + paramInterval
1350 deltaTime = dataTime - self.__initime
1351
1352 if deltaTime >= windsInterval or deltaTime < 0:
1353 self.__dataReady = True
1354 return
1355
1356 def techniqueMeteors(self, arrayMeteor, meteorThresh, heightMin, heightMax):
1357 '''
1358 Function that implements winds estimation technique with detected meteors.
1359
1360 Input: Detected meteors, Minimum meteor quantity to wind estimation
1361
1362 Output: Winds estimation (Zonal and Meridional)
1363
1364 Parameters affected: Winds
1365 '''
1366 #Settings
1367 nInt = (heightMax - heightMin)/2
1368 winds = numpy.zeros((2,nInt))*numpy.nan
1369
1370 #Filter errors
1371 error = numpy.where(arrayMeteor[:,-1] == 0)[0]
1372 finalMeteor = arrayMeteor[error,:]
1373
1374 #Meteor Histogram
1375 finalHeights = finalMeteor[:,3]
1376 hist = numpy.histogram(finalHeights, bins = nInt, range = (heightMin,heightMax))
1377 nMeteorsPerI = hist[0]
1378 heightPerI = hist[1]
1379
1380 #Sort of meteors
1381 indSort = finalHeights.argsort()
1382 finalMeteor2 = finalMeteor[indSort,:]
1383
1384 # Calculating winds
1385 ind1 = 0
1386 ind2 = 0
1387
1388 for i in range(nInt):
1389 nMet = nMeteorsPerI[i]
1390 ind1 = ind2
1391 ind2 = ind1 + nMet
1392
1393 meteorAux = finalMeteor2[ind1:ind2,:]
1394
1395 if meteorAux.shape[0] >= meteorThresh:
1396 vel = meteorAux[:, 7]
1397 zen = meteorAux[:, 5]*numpy.pi/180
1398 azim = meteorAux[:, 4]*numpy.pi/180
1399
1400 n = numpy.cos(zen)
1401 # m = (1 - n**2)/(1 - numpy.tan(azim)**2)
1402 # l = m*numpy.tan(azim)
1403 l = numpy.sin(zen)*numpy.sin(azim)
1404 m = numpy.sin(zen)*numpy.cos(azim)
1405
1406 A = numpy.vstack((l, m)).transpose()
1407 A1 = numpy.dot(numpy.linalg.inv( numpy.dot(A.transpose(),A) ),A.transpose())
1408 windsAux = numpy.dot(A1, vel)
1409
1410 winds[0,i] = windsAux[0]
1411 winds[1,i] = windsAux[1]
1412
1413 return winds, heightPerI[:-1]
1414
1415 def run(self, dataOut, technique, **kwargs):
1416
1417 param = dataOut.data_param
1418 if dataOut.abscissaRange != None:
1419 absc = dataOut.abscissaRange[:-1]
1420 noise = dataOut.noise
1421 heightRange = dataOut.getHeiRange()
1422 SNR = dataOut.SNR
1423
1424 if technique == 'DBS':
1425
1426 theta_x = numpy.array(kwargs['dirCosx'])
1427 theta_y = numpy.array(kwargs['dirCosy'])
1428 azimuth = kwargs['azimuth']
1429 if kwargs.has_key('horizontalOnly'):
1430 horizontalOnly = kwargs['horizontalOnly']
1431 else: horizontalOnly = False
1432 if kwargs.has_key('correctFactor'):
1433 correctFactor = kwargs['correctFactor']
1434 else: correctFactor = 1
1435 if kwargs.has_key('channelList'):
1436 channelList = kwargs['channelList']
1437 if len(channelList) == 2:
1438 horizontalOnly = True
1439 arrayChannel = numpy.array(channelList)
1440 param = param[arrayChannel,:,:]
1441 theta_x = theta_x[arrayChannel]
1442 theta_y = theta_y[arrayChannel]
1443
1444 velRadial0 = param[:,1,:] #Radial velocity
1445 dataOut.winds, dataOut.heightRange, dataOut.SNR = self.techniqueDBS(velRadial0, theta_x, theta_y, azimuth, correctFactor, horizontalOnly, heightRange, SNR) #DBS Function
1446 dataOut.initUtcTime = dataOut.ltctime
1447 dataOut.windsInterval = dataOut.timeInterval
1448
1449 elif technique == 'SA':
1450
1451 #Parameters
1452 position_x = kwargs['positionX']
1453 position_y = kwargs['positionY']
1454 azimuth = kwargs['azimuth']
1455
1456 if kwargs.has_key('crosspairsList'):
1457 pairs = kwargs['crosspairsList']
1458 else:
1459 pairs = None
1460
1461 if kwargs.has_key('correctFactor'):
1462 correctFactor = kwargs['correctFactor']
1463 else:
1464 correctFactor = 1
1465
1466 tau = dataOut.data_param
1467 _lambda = dataOut.C/dataOut.frequency
1468 pairsList = dataOut.pairsList
1469 nChannels = dataOut.nChannels
1470
1471 dataOut.winds = self.techniqueSA(pairs, pairsList, nChannels, tau, azimuth, _lambda, position_x, position_y, absc, correctFactor)
1472 dataOut.initUtcTime = dataOut.ltctime
1473 dataOut.windsInterval = dataOut.timeInterval
1474
1475 elif technique == 'Meteors':
1476 dataOut.flagNoData = True
1477 self.__dataReady = False
1478
1479 if kwargs.has_key('nHours'):
1480 nHours = kwargs['nHours']
1481 else:
1482 nHours = 1
1483
1484 if kwargs.has_key('meteorsPerBin'):
1485 meteorThresh = kwargs['meteorsPerBin']
1486 else:
1487 meteorThresh = 6
1488
1489 if kwargs.has_key('hmin'):
1490 hmin = kwargs['hmin']
1491 else: hmin = 70
1492 if kwargs.has_key('hmax'):
1493 hmax = kwargs['hmax']
1494 else: hmax = 110
1495
1496 dataOut.windsInterval = nHours*3600
1497
1498 if self.__isConfig == False:
1499 # self.__initime = dataOut.datatime.replace(minute = 0, second = 0, microsecond = 03)
1500 #Get Initial LTC time
1501 self.__initime = (dataOut.datatime.replace(minute = 0, second = 0, microsecond = 0) - datetime.datetime(1970, 1, 1)).total_seconds()
1502 self.__isConfig = True
1503
1504 if self.__buffer == None:
1505 self.__buffer = dataOut.data_param
1506 self.__firstdata = copy.copy(dataOut)
1507
1508 else:
1509 self.__buffer = numpy.vstack((self.__buffer, dataOut.data_param))
1510
1511 self.__checkTime(dataOut.ltctime, dataOut.paramInterval, dataOut.windsInterval) #Check if the buffer is ready
1512
1513 if self.__dataReady:
1514 dataOut.initUtcTime = self.__initime
1515 self.__initime = self.__initime + dataOut.windsInterval #to erase time offset
1516
1517 dataOut.winds, dataOut.heightRange = self.techniqueMeteors(self.__buffer, meteorThresh, hmin, hmax)
1518 dataOut.flagNoData = False
1519 self.__buffer = None
1520
1521 return No newline at end of file
@@ -0,0 +1,103
1 # DIAS 19 Y 20 FEB 2014
2 # Comprobacion de Resultados DBS con SA
3
4 import os, sys
5
6 path = os.path.split(os.getcwd())[0]
7 sys.path.append(path)
8
9 from controller import *
10
11 desc = "JASMET Experiment Test"
12 filename = "JASMETtest.xml"
13
14 controllerObj = Project()
15
16 controllerObj.setup(id = '191', name='test01', description=desc)
17
18 #Experimentos
19
20 #2014051 20 Feb 2014
21 path = '/home/soporte/Data/JASMET/JASMET_30/2014106'
22 pathFigure = '/home/soporte/workspace/Graficos/JASMET/prueba1'
23
24 startTime = '00:00:00'
25 endTime = '23:59:59'
26 xmin ='19.0'
27 xmax = '34.0'
28
29 #------------------------------------------------------------------------------------------------
30 readUnitConfObj = controllerObj.addReadUnit(datatype='VoltageReader',
31 path=path,
32 startDate='2014/04/15',
33 endDate='2014/04/16',
34 startTime=startTime,
35 endTime=endTime,
36 online=0,
37 delay=5,
38 walk=0)
39
40 opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock')
41
42
43 #--------------------------------------------------------------------------------------------------
44
45 procUnitConfObj0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId())
46
47 opObj00 = procUnitConfObj0.addOperation(name='selectChannels')
48 opObj00.addParameter(name='channelList', value='0, 1, 2, 3, 4', format='intlist')
49
50 opObj01 = procUnitConfObj0.addOperation(name='setRadarFrequency')
51 opObj01.addParameter(name='frequency', value='30.e6', format='float')
52
53 #opObj11 = procUnitConfObj0.addOperation(name='Decoder', optype='other')
54 #--------------------------------------------------------------------------------------------------
55
56 procUnitConfObj1 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObj0.getId())
57 procUnitConfObj1.addParameter(name='nSeconds', value='100', format='int')
58
59 opObj10 = procUnitConfObj1.addOperation(name='DetectMeteors')
60 opObj10.addParameter(name='predefinedPhaseShifts', value='-89.5, 41.5, 0.0, -138.0, -85.5', format='floatlist')
61 opObj10.addParameter(name='cohDetection', value='0', format='bool')
62 opObj10.addParameter(name='noise_multiple', value='4', format='int')
63 opObj10.addParameter(name='SNRThresh', value='5', format='float')
64 opObj10.addParameter(name='phaseThresh', value='20', format='float')
65 opObj10.addParameter(name='azimuth', value='45', format='float')
66 opObj10.addParameter(name='hmin', value='68', format='float')
67 opObj10.addParameter(name='hmax', value='112', format='float')
68
69 opObj13 = procUnitConfObj1.addOperation(name='SkyMapPlot', optype='other')
70 opObj13.addParameter(name='id', value='1', format='int')
71 opObj13.addParameter(name='wintitle', value='Sky Map', format='str')
72 opObj13.addParameter(name='save', value='1', format='bool')
73 opObj13.addParameter(name='figpath', value=pathFigure, format='str')
74
75 opObj11 = procUnitConfObj1.addOperation(name='WindProfiler', optype='other')
76 opObj11.addParameter(name='technique', value='Meteors', format='str')
77 opObj11.addParameter(name='nHours', value='1.0', format='float')
78 opObj11.addParameter(name='SNRThresh', value='12.0', format='float')
79
80 opObj12 = procUnitConfObj1.addOperation(name='WindProfilerPlot', optype='other')
81 opObj12.addParameter(name='id', value='2', format='int')
82 opObj12.addParameter(name='wintitle', value='Wind Profiler', format='str')
83 opObj12.addParameter(name='save', value='1', format='bool')
84 opObj12.addParameter(name='figpath', value = pathFigure, format='str')
85 opObj12.addParameter(name='zmin', value='-120', format='int')
86 opObj12.addParameter(name='zmax', value='120', format='int')
87 # opObj12.addParameter(name='zmin_ver', value='-0.8', format='float')
88 # opObj12.addParameter(name='zmax_ver', value='0.8', format='float')
89 # opObj23.addParameter(name='SNRmin', value='-10', format='int')
90 # opObj23.addParameter(name='SNRmax', value='60', format='int')
91 # opObj23.addParameter(name='SNRthresh', value='0', format='float')
92 opObj12.addParameter(name='xmin', value=xmin, format='float')
93 opObj12.addParameter(name='xmax', value=xmax, format='float')
94
95 #--------------------------------------------------------------------------------------------------
96 print "Escribiendo el archivo XML"
97 controllerObj.writeXml(filename)
98 print "Leyendo el archivo XML"
99 controllerObj.readXml(filename)
100
101 controllerObj.createObjects()
102 controllerObj.connectObjects()
103 controllerObj.run() No newline at end of file
@@ -0,0 +1,105
1 # DIAS 19 Y 20 FEB 2014
2 # Comprobacion de Resultados DBS con SA
3
4 import os, sys
5
6 path = os.path.split(os.getcwd())[0]
7 sys.path.append(path)
8
9 from controller import *
10
11 desc = "JASMET Experiment Test"
12 filename = "JASMETtest.xml"
13
14 controllerObj = Project()
15
16 controllerObj.setup(id = '191', name='test01', description=desc)
17
18 #Experimentos
19
20 #2014051 20 Feb 2014
21 path = '/home/soporte/Data/JASMET/JASMET_50/2014106'
22 pathFigure = '/home/soporte/workspace/Graficos/JASMET'
23
24 startTime = '00:00:00'
25 endTime = '23:59:59'
26 xmin ='19.0'
27 xmax = '33.0'
28
29
30 #------------------------------------------------------------------------------------------------
31 readUnitConfObj = controllerObj.addReadUnit(datatype='Voltage',
32 path=path,
33 startDate='2014/04/15',
34 endDate='2014/04/16',
35 startTime=startTime,
36 endTime=endTime,
37 online=0,
38 delay=5,
39 walk=0)
40
41 opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock')
42
43
44 #--------------------------------------------------------------------------------------------------
45
46 procUnitConfObj0 = controllerObj.addProcUnit(datatype='Voltage', inputId=readUnitConfObj.getId())
47
48 opObj00 = procUnitConfObj0.addOperation(name='selectChannels')
49 opObj00.addParameter(name='channelList', value='0, 1, 2, 3, 4', format='intlist')
50
51 opObj01 = procUnitConfObj0.addOperation(name='setRadarFrequency')
52 opObj01.addParameter(name='frequency', value='50.e6', format='float')
53
54 #opObj11 = procUnitConfObj0.addOperation(name='Decoder', optype='other')
55 #--------------------------------------------------------------------------------------------------
56
57 procUnitConfObj1 = controllerObj.addProcUnit(datatype='Parameters', inputId=procUnitConfObj0.getId())
58 procUnitConfObj1.addParameter(name='nSeconds', value='100', format='int')
59
60 opObj10 = procUnitConfObj1.addOperation(name='DetectMeteors')
61 opObj10.addParameter(name='predefinedPhaseShifts', value='-17.0, -139.0, 0.0, 48.0, -130.0', format='floatlist')
62 opObj10.addParameter(name='cohDetection', value='0', format='bool')
63 opObj10.addParameter(name='noise_multiple', value='4', format='int')
64 opObj10.addParameter(name='SNRThresh', value='5', format='float')
65 opObj10.addParameter(name='phaseThresh', value='20', format='float')
66 opObj10.addParameter(name='azimuth', value='45', format='float')
67 opObj10.addParameter(name='hmin', value='68', format='float')
68 opObj10.addParameter(name='hmax', value='112', format='float')
69 opObj10.addParameter(name='savefile', value='1', format='bool')
70 opObj10.addParameter(name='filename', value=filehdf5, format='str')
71
72 opObj13 = procUnitConfObj1.addOperation(name='SkyMapPlot', optype='other')
73 opObj13.addParameter(name='id', value='1', format='int')
74 opObj13.addParameter(name='wintitle', value='Sky Map', format='str')
75 opObj13.addParameter(name='save', value='1', format='bool')
76 opObj13.addParameter(name='figpath', value=pathFigure, format='str')
77
78 opObj11 = procUnitConfObj1.addOperation(name='WindProfiler', optype='other')
79 opObj11.addParameter(name='technique', value='Meteors', format='str')
80 opObj11.addParameter(name='nHours', value='1.0', format='float')
81
82 opObj12 = procUnitConfObj1.addOperation(name='WindProfilerPlot', optype='other')
83 opObj12.addParameter(name='id', value='2', format='int')
84 opObj12.addParameter(name='wintitle', value='Wind Profiler', format='str')
85 opObj12.addParameter(name='save', value='1', format='bool')
86 opObj12.addParameter(name='figpath', value = pathFigure, format='str')
87 opObj12.addParameter(name='zmin', value='-120', format='int')
88 opObj12.addParameter(name='zmax', value='120', format='int')
89 # opObj12.addParameter(name='zmin_ver', value='-0.8', format='float')
90 # opObj12.addParameter(name='zmax_ver', value='0.8', format='float')
91 # opObj23.addParameter(name='SNRmin', value='-10', format='int')
92 # opObj23.addParameter(name='SNRmax', value='60', format='int')
93 # opObj23.addParameter(name='SNRthresh', value='0', format='float')
94 opObj12.addParameter(name='xmin', value=xmin, format='float')
95 opObj12.addParameter(name='xmax', value=xmax, format='float')
96
97 #--------------------------------------------------------------------------------------------------
98 print "Escribiendo el archivo XML"
99 controllerObj.writeXml(filename)
100 print "Leyendo el archivo XML"
101 controllerObj.readXml(filename)
102
103 controllerObj.createObjects()
104 controllerObj.connectObjects()
105 controllerObj.run() No newline at end of file
@@ -0,0 +1,144
1 # DIAS 19 Y 20 FEB 2014
2 # Comprobacion de Resultados DBS con SA
3
4 import os, sys
5
6 path = os.path.split(os.getcwd())[0]
7 sys.path.append(path)
8
9 from controller import *
10
11 desc = "DBS Experiment Test"
12 filename = "DBStest.xml"
13
14 controllerObj = Project()
15
16 controllerObj.setup(id = '191', name='test01', description=desc)
17
18 #Experimentos
19
20 #2014050 19 Feb 2014
21 # path = '/home/soporte/Documents/MST_Data/DBS/d2014050'
22 # pathFigure = '/home/soporte/workspace/Graficos/DBS/d2014050p/'
23 # xmin = '15.5'
24 # xmax = '23.99999999'
25 # startTime = '17:25:00'
26 # filehdf5 = "DBS_2014050.hdf5"
27
28 #2014051 20 Feb 2014
29 path = '/home/soporte/Data/MST/DBS/d2014051'
30 pathFigure = '/home/soporte/workspace/Graficos/DBS/prueba1/'
31 xmin = '0.0'
32 xmax = '8.0'
33 startTime = '00:00:00'
34 filehdf5 = "DBS_2014051.hdf5"
35
36
37
38 #------------------------------------------------------------------------------------------------
39 readUnitConfObj = controllerObj.addReadUnit(datatype='VoltageReader',
40 path=path,
41 startDate='2014/01/31',
42 endDate='2014/03/31',
43 startTime=startTime,
44 endTime='23:59:59',
45 online=0,
46 delay=5,
47 walk=0)
48
49 opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock')
50
51
52 #--------------------------------------------------------------------------------------------------
53
54 procUnitConfObj0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId())
55
56 opObj11 = procUnitConfObj0.addOperation(name='Decoder', optype='other')
57
58 opObj11 = procUnitConfObj0.addOperation(name='CohInt', optype='other')
59 opObj11.addParameter(name='n', value='256', format='int')
60 # opObj11.addParameter(name='n', value='16', format='int')
61
62 opObj11 = procUnitConfObj0.addOperation(name='selectHeightsByIndex')
63 opObj11.addParameter(name='minIndex', value='10', format='float')
64 opObj11.addParameter(name='maxIndex', value='60', format='float')
65
66 #---------------------------------------------------------------------------------------------------
67
68 procUnitConfObj1 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObj0.getId())
69 procUnitConfObj1.addParameter(name='nFFTPoints', value='64', format='int')
70 procUnitConfObj1.addParameter(name='nProfiles', value='64', format='int')
71 # procUnitConfObj1.addParameter(name='ippFactor', value='2', format='int')
72 procUnitConfObj1.addParameter(name='pairsList', value='(0,0),(0,1),(2,1)', format='pairsList')
73
74 opObj11 = procUnitConfObj1.addOperation(name='IncohInt', optype='other')
75 opObj11.addParameter(name='n', value='5', format='int')
76
77 opObj14 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='other')
78 opObj14.addParameter(name='id', value='1', format='int')
79 opObj14.addParameter(name='wintitle', value='Con interf', format='str')
80 opObj14.addParameter(name='save', value='1', format='bool')
81 opObj14.addParameter(name='figpath', value=pathFigure, format='str')
82 opObj14.addParameter(name='zmin', value='5', format='int')
83 opObj14.addParameter(name='zmax', value='90', format='int')
84
85 opObj12 = procUnitConfObj1.addOperation(name='removeInterference')
86 opObj13 = procUnitConfObj1.addOperation(name='removeDC')
87 opObj13.addParameter(name='mode', value='1', format='int')
88
89 opObj12 = procUnitConfObj1.addOperation(name='RTIPlot', optype='other')
90 opObj12.addParameter(name='id', value='2', format='int')
91 opObj12.addParameter(name='wintitle', value='RTI Plot', format='str')
92 opObj12.addParameter(name='save', value='1', format='bool')
93 opObj12.addParameter(name='figpath', value = pathFigure, format='str')
94 opObj12.addParameter(name='xmin', value=xmin, format='float')
95 opObj12.addParameter(name='xmax', value=xmax, format='float')
96 opObj12.addParameter(name='zmin', value='5', format='int')
97 opObj12.addParameter(name='zmax', value='90', format='int')
98
99 #--------------------------------------------------------------------------------------------------
100
101 procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObj1.getId())
102 opObj20 = procUnitConfObj2.addOperation(name='GetMoments')
103
104 opObj21 = procUnitConfObj2.addOperation(name='MomentsPlot', optype='other')
105 opObj21.addParameter(name='id', value='3', format='int')
106 opObj21.addParameter(name='wintitle', value='Moments Plot', format='str')
107 opObj21.addParameter(name='save', value='1', format='bool')
108 opObj21.addParameter(name='figpath', value=pathFigure, format='str')
109 opObj21.addParameter(name='zmin', value='5', format='int')
110 opObj21.addParameter(name='zmax', value='90', format='int')
111
112 opObj22 = procUnitConfObj2.addOperation(name='WindProfiler', optype='other')
113 opObj22.addParameter(name='technique', value='DBS', format='str')
114 opObj22.addParameter(name='azimuth', value='51.06', format='float')
115 opObj22.addParameter(name='correctFactor', value='-1', format='float')
116 opObj22.addParameter(name='dirCosx', value='0.041016, 0, -0.054688', format='floatlist')
117 opObj22.addParameter(name='dirCosy', value='-0.041016, 0.025391, -0.023438', format='floatlist')
118 # opObj22.addParameter(name='horizontalOnly', value='1', format='bool')
119 # opObj22.addParameter(name='channelList', value='1,2', format='intlist')
120
121 opObj23 = procUnitConfObj2.addOperation(name='WindProfilerPlot', optype='other')
122 opObj23.addParameter(name='id', value='4', format='int')
123 opObj23.addParameter(name='wintitle', value='Wind Profiler', format='str')
124 opObj23.addParameter(name='save', value='1', format='bool')
125 opObj23.addParameter(name='figpath', value = pathFigure, format='str')
126 opObj23.addParameter(name='zmin', value='-10', format='int')
127 opObj23.addParameter(name='zmax', value='10', format='int')
128 opObj23.addParameter(name='zmin_ver', value='-80', format='float')
129 opObj23.addParameter(name='zmax_ver', value='80', format='float')
130 opObj23.addParameter(name='SNRmin', value='-10', format='int')
131 opObj23.addParameter(name='SNRmax', value='60', format='int')
132 opObj23.addParameter(name='SNRthresh', value='0', format='float')
133 opObj23.addParameter(name='xmin', value=xmin, format='float')
134 opObj23.addParameter(name='xmax', value=xmax, format='float')
135
136 #--------------------------------------------------------------------------------------------------
137 print "Escribiendo el archivo XML"
138 controllerObj.writeXml(filename)
139 print "Leyendo el archivo XML"
140 controllerObj.readXml(filename)
141
142 controllerObj.createObjects()
143 controllerObj.connectObjects()
144 controllerObj.run() No newline at end of file
@@ -0,0 +1,139
1 # DIAS 19 Y 20 FEB 2014
2 # Comprobacion de Resultados DBS con SA
3
4 import os, sys
5
6 path = os.path.split(os.getcwd())[0]
7 sys.path.append(path)
8
9 from controller import *
10
11 desc = "SA Experiment Test"
12 filename = "SA2014050.xml"
13
14 controllerObj = Project()
15
16 controllerObj.setup(id = '191', name='test01', description=desc)
17
18
19 #Experimentos
20
21 #2014050 19 Feb 2014
22 # path = '/home/soporte/Documents/MST_Data/SA/d2014050'
23 # pathFigure = '/home/soporte/workspace/Graficos/SA/d2014050_prueba/'
24 # xmin = '15.5'
25 # xmax = '23.99999999'
26 # startTime = '15:30:00'
27 # filehdf5 = "SA_2014050.hdf5"
28
29 #2014051 20 Feb 2014
30 path = '/home/soporte/Data/MST/SA/d2014051'
31 pathFigure = '/home/soporte/workspace/Graficos/SA/prueba1/'
32 xmin = '0.0'
33 xmax = '8.0'
34 startTime = '06:00:00'
35 filehdf5 = "SA_2014051.hdf5"
36
37 readUnitConfObj = controllerObj.addReadUnit(datatype='VoltageReader',
38 path=path,
39 startDate='2014/01/01',
40 endDate='2014/03/31',
41 startTime=startTime,
42 endTime='23:59:59',
43 online=0,
44 delay=5,
45 walk=0)
46
47 opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock')
48
49
50 #--------------------------------------------------------------------------------------------------
51
52 procUnitConfObj0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId())
53
54 opObj11 = procUnitConfObj0.addOperation(name='Decoder', optype='other')
55
56 opObj11 = procUnitConfObj0.addOperation(name='CohInt', optype='other')
57 opObj11.addParameter(name='n', value='600', format='int')
58 # opObj11.addParameter(name='n', value='10', format='int')
59
60 opObj11 = procUnitConfObj0.addOperation(name='selectHeightsByIndex')
61 opObj11.addParameter(name='minIndex', value='10', format='float')
62 opObj11.addParameter(name='maxIndex', value='60', format='float')
63 #---------------------------------------------------------------------------------------------------
64 procUnitConfObj1 = controllerObj.addProcUnit(datatype='CorrelationProc', inputId=procUnitConfObj0.getId())
65 # procUnitConfObj1.addParameter(name='pairsList', value='(0,0),(1,1),(2,2),(3,3),(1,0),(2,3)', format='pairsList')
66 procUnitConfObj1.addParameter(name='pairsList', value='(0,0),(1,1),(2,2),(3,3),(0,3),(0,2),(1,3),(1,2)', format='pairsList')
67 procUnitConfObj1.addParameter(name='fullT', value='1', format='bool')
68 procUnitConfObj1.addParameter(name='removeDC', value='1', format='bool')
69 #procUnitConfObj1.addParameter(name='lagT', value='0,1,2,3', format='intlist')
70
71 opObj12 = procUnitConfObj1.addOperation(name='CorrelationPlot', optype='other')
72 opObj12.addParameter(name='id', value='1', format='int')
73 opObj12.addParameter(name='wintitle', value='CrossCorrelation Plot', format='str')
74 opObj12.addParameter(name='save', value='1', format='bool')
75 opObj12.addParameter(name='zmin', value='0', format='int')
76 opObj12.addParameter(name='zmax', value='1', format='int')
77 opObj12.addParameter(name='figpath', value = pathFigure, format='str')
78
79 opObj12 = procUnitConfObj1.addOperation(name='removeNoise')
80 opObj12.addParameter(name='mode', value='2', format='int')
81 opObj12 = procUnitConfObj1.addOperation(name='calculateNormFactor')
82
83 opObj12 = procUnitConfObj1.addOperation(name='CorrelationPlot', optype='other')
84 opObj12.addParameter(name='id', value='2', format='int')
85 opObj12.addParameter(name='wintitle', value='CrossCorrelation Plot', format='str')
86 opObj12.addParameter(name='save', value='1', format='bool')
87 opObj12.addParameter(name='zmin', value='0', format='int')
88 opObj12.addParameter(name='zmax', value='1', format='int')
89 opObj12.addParameter(name='figpath', value = pathFigure, format='str')
90
91 #---------------------------------------------------------------------------------------------------
92 procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObj1.getId())
93 opObj20 = procUnitConfObj2.addOperation(name='GetLags')
94
95 opObj21 = procUnitConfObj2.addOperation(name='WindProfiler', optype='other')
96 opObj21.addParameter(name='technique', value='SA', format='str')
97 # opObj21.addParameter(name='correctFactor', value='-1', format='float')
98 opObj21.addParameter(name='positionX', value='36,0,36,0', format='floatlist')
99 opObj21.addParameter(name='positionY', value='36,0,0,36', format='floatlist')
100 opObj21.addParameter(name='azimuth', value='51.06', format='float')
101 opObj21.addParameter(name='crosspairsList', value='(0,3),(0,2),(1,3),(1,2)', format='pairsList')#COrregir
102 #
103 opObj22 = procUnitConfObj2.addOperation(name='WindProfilerPlot', optype='other')
104 opObj22.addParameter(name='id', value='4', format='int')
105 opObj22.addParameter(name='wintitle', value='Wind Profiler', format='str')
106 opObj22.addParameter(name='save', value='1', format='bool')
107 opObj22.addParameter(name='figpath', value = pathFigure, format='str')
108 opObj22.addParameter(name='zmin', value='-15', format='int')
109 opObj22.addParameter(name='zmax', value='15', format='int')
110 opObj22.addParameter(name='zmin_ver', value='-80', format='float')
111 opObj22.addParameter(name='zmax_ver', value='80', format='float')
112 opObj22.addParameter(name='SNRmin', value='-20', format='int')
113 opObj22.addParameter(name='SNRmax', value='40', format='int')
114 opObj22.addParameter(name='SNRthresh', value='-3.5', format='float')
115 opObj22.addParameter(name='xmin', value=xmin, format='float')
116 opObj22.addParameter(name='xmax', value=xmax, format='float')
117 # #-----------------------------------------------------------------------------------
118 #
119 # procUnitConfObj2 = controllerObj.addProcUnit(datatype='Spectra', inputId=procUnitConfObj0.getId())
120 # procUnitConfObj2.addParameter(name='nFFTPoints', value='128', format='int')
121 # procUnitConfObj2.addParameter(name='nProfiles', value='128', format='int')
122 # procUnitConfObj2.addParameter(name='pairsList', value='(0,0),(0,1),(2,1)', format='pairsList')
123 #
124 # opObj22 = procUnitConfObj2.addOperation(name='SpectraPlot', optype='other')
125 # opObj22.addParameter(name='id', value='5', format='int')
126 # opObj22.addParameter(name='wintitle', value='Spectra Plot', format='str')
127 # opObj22.addParameter(name='save', value='1', format='bool')
128 # opObj22.addParameter(name='figpath', value = pathFigure, format='str')
129
130 #-----------------------------------------------------------------------------------
131
132 print "Escribiendo el archivo XML"
133 controllerObj.writeXml(filename)
134 print "Leyendo el archivo XML"
135 controllerObj.readXml(filename)
136
137 controllerObj.createObjects()
138 controllerObj.connectObjects()
139 controllerObj.run() No newline at end of file
@@ -0,0 +1,131
1 import os, sys
2
3 path = os.path.split(os.getcwd())[0]
4 sys.path.append(path)
5
6 from controller import *
7
8 desc = "AMISR Experiment"
9
10 filename = "amisr_reader.xml"
11
12 controllerObj = Project()
13
14 controllerObj.setup(id = '191', name='test01', description=desc)
15
16
17 path = os.path.join(os.environ['HOME'],'Development/amisr/data')
18 path = '/home/soporte/Data/AMISR'
19 figpath = os.path.join(os.environ['HOME'],'Pictures/amisr')
20
21 pathFigure = '/home/soporte/workspace/Graficos/DBS/amisr/'
22 xmin = '12.0'
23 xmax = '14.0'
24
25 readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader',
26 path=path,
27 startDate='2014/10/21',
28 endDate='2014/10/21',
29 startTime='00:00:00',
30 endTime='23:59:59',
31 walk=1,
32 timezone='lt')
33
34 #AMISR Processing Unit
35 procUnitAMISRBeam0 = controllerObj.addProcUnit(datatype='AMISRProc', inputId=readUnitConfObj.getId())
36
37 opObj11 = procUnitAMISRBeam0.addOperation(name='PrintInfo', optype='other')
38
39 #Reshaper
40 opObj11 = procUnitAMISRBeam0.addOperation(name='ProfileToChannels', optype='other')
41
42
43 #Beam Selector
44 #opObj11 = procUnitAMISRBeam0.addOperation(name='BeamSelector', optype='other')
45 #opObj11.addParameter(name='beam', value='0', format='int')
46
47 #Voltage Processing Unit
48 procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=procUnitAMISRBeam0.getId())
49 #Coherent Integration
50 opObj11 = procUnitConfObjBeam0.addOperation(name='CohInt', optype='other')
51 opObj11.addParameter(name='n', value='8', format='int')
52 #Spectra Unit Processing, getting spectras with nProfiles and nFFTPoints
53 procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjBeam0.getId())
54 procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value=32, format='int')
55 procUnitConfObjSpectraBeam0.addParameter(name='nProfiles', value=32, format='int')
56 #RemoveDc
57 opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='removeDC')
58
59 #Noise Estimation
60 opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise')
61 opObj11.addParameter(name='minHei', value='5', format='float')
62 opObj11.addParameter(name='maxHei', value='20', format='float')
63
64 #SpectraPlot
65 opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='other')
66 opObj11.addParameter(name='id', value='100', format='int')
67 opObj11.addParameter(name='wintitle', value='AMISR Beam 0', format='str')
68 opObj11.addParameter(name='zmin', value='30', format='int')
69 opObj11.addParameter(name='zmax', value='80', format='int')
70
71 #RTIPlot
72 #title0 = 'RTI AMISR Beam 0'
73 #opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='other')
74 #opObj11.addParameter(name='id', value='200', format='int')
75 #opObj11.addParameter(name='wintitle', value=title0, format='str')
76 #opObj11.addParameter(name='showprofile', value='0', format='int')
77 ##Setting RTI time using xmin,xmax
78 #opObj11.addParameter(name='xmin', value='15', format='int')
79 #opObj11.addParameter(name='xmax', value='23', format='int')
80 #Setting dB range with zmin, zmax
81 #opObj11.addParameter(name='zmin', value='45', format='int')
82 #opObj11.addParameter(name='zmax', value='70', format='int')
83 #Save RTI
84 #figfile0 = 'amisr_rti_beam0.png'
85 #opObj11.addParameter(name='figpath', value=figpath, format='str')
86 #opObj11.addParameter(name='figfile', value=figfile0, format='str')
87
88 #-----------------------------------------------------------------------------------------------
89 procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObjSpectraBeam0 .getId())
90 opObj20 = procUnitConfObj2.addOperation(name='GetMoments')
91
92 # opObj21 = procUnitConfObj2.addOperation(name='MomentsPlot', optype='other')
93 # opObj21.addParameter(name='id', value='3', format='int')
94 # opObj21.addParameter(name='wintitle', value='Moments Plot', format='str')
95 # opObj21.addParameter(name='save', value='1', format='bool')
96 # opObj21.addParameter(name='figpath', value=pathFigure, format='str')
97 # opObj21.addParameter(name='zmin', value='5', format='int')
98 # opObj21.addParameter(name='zmax', value='90', format='int')
99
100 opObj22 = procUnitConfObj2.addOperation(name='WindProfiler', optype='other')
101 opObj22.addParameter(name='technique', value='DBS', format='str')
102 opObj22.addParameter(name='azimuth', value='51.06', format='float')
103 opObj22.addParameter(name='correctFactor', value='-1', format='float')
104 opObj22.addParameter(name='dirCosx', value='9.63770247e-01, 5.93066547e-17, 1, 5.93066547e-17,-9.68583161e-01', format='floatlist')
105 opObj22.addParameter(name='dirCosy', value=' 0,-0.96858316,0,0.96858316,0', format='floatlist')
106 # opObj22.addParameter(name='horizontalOnly', value='1', format='bool')
107 # opObj22.addParameter(name='channelList', value='1,2', format='intlist')
108
109 opObj23 = procUnitConfObj2.addOperation(name='WindProfilerPlot', optype='other')
110 opObj23.addParameter(name='id', value='4', format='int')
111 opObj23.addParameter(name='wintitle', value='Wind Profiler', format='str')
112 opObj23.addParameter(name='save', value='1', format='bool')
113 opObj23.addParameter(name='figpath', value = pathFigure, format='str')
114 opObj23.addParameter(name='zmin', value='-10', format='int')
115 opObj23.addParameter(name='zmax', value='10', format='int')
116 opObj23.addParameter(name='zmin_ver', value='-80', format='float')
117 opObj23.addParameter(name='zmax_ver', value='80', format='float')
118 opObj23.addParameter(name='SNRmin', value='-10', format='int')
119 opObj23.addParameter(name='SNRmax', value='60', format='int')
120 opObj23.addParameter(name='SNRthresh', value='0', format='float')
121 opObj23.addParameter(name='xmin', value=xmin, format='float')
122 opObj23.addParameter(name='xmax', value=xmax, format='float')
123
124 print "Escribiendo el archivo XML"
125 controllerObj.writeXml(filename)
126 print "Leyendo el archivo XML"
127 controllerObj.readXml(filename)
128
129 controllerObj.createObjects()
130 controllerObj.connectObjects()
131 controllerObj.run()
@@ -1,746 +1,967
1 '''
1 '''
2
2
3 $Author: murco $
3 $Author: murco $
4 $Id: JROData.py 173 2012-11-20 15:06:21Z murco $
4 $Id: JROData.py 173 2012-11-20 15:06:21Z murco $
5 '''
5 '''
6
6
7 import copy
7 import copy
8 import numpy
8 import numpy
9 import datetime
9 import datetime
10
10
11 from jroheaderIO import SystemHeader, RadarControllerHeader
11 from jroheaderIO import SystemHeader, RadarControllerHeader
12
12
13 def getNumpyDtype(dataTypeCode):
13 def getNumpyDtype(dataTypeCode):
14
14
15 if dataTypeCode == 0:
15 if dataTypeCode == 0:
16 numpyDtype = numpy.dtype([('real','<i1'),('imag','<i1')])
16 numpyDtype = numpy.dtype([('real','<i1'),('imag','<i1')])
17 elif dataTypeCode == 1:
17 elif dataTypeCode == 1:
18 numpyDtype = numpy.dtype([('real','<i2'),('imag','<i2')])
18 numpyDtype = numpy.dtype([('real','<i2'),('imag','<i2')])
19 elif dataTypeCode == 2:
19 elif dataTypeCode == 2:
20 numpyDtype = numpy.dtype([('real','<i4'),('imag','<i4')])
20 numpyDtype = numpy.dtype([('real','<i4'),('imag','<i4')])
21 elif dataTypeCode == 3:
21 elif dataTypeCode == 3:
22 numpyDtype = numpy.dtype([('real','<i8'),('imag','<i8')])
22 numpyDtype = numpy.dtype([('real','<i8'),('imag','<i8')])
23 elif dataTypeCode == 4:
23 elif dataTypeCode == 4:
24 numpyDtype = numpy.dtype([('real','<f4'),('imag','<f4')])
24 numpyDtype = numpy.dtype([('real','<f4'),('imag','<f4')])
25 elif dataTypeCode == 5:
25 elif dataTypeCode == 5:
26 numpyDtype = numpy.dtype([('real','<f8'),('imag','<f8')])
26 numpyDtype = numpy.dtype([('real','<f8'),('imag','<f8')])
27 else:
27 else:
28 raise ValueError, 'dataTypeCode was not defined'
28 raise ValueError, 'dataTypeCode was not defined'
29
29
30 return numpyDtype
30 return numpyDtype
31
31
32 def getDataTypeCode(numpyDtype):
32 def getDataTypeCode(numpyDtype):
33
33
34 if numpyDtype == numpy.dtype([('real','<i1'),('imag','<i1')]):
34 if numpyDtype == numpy.dtype([('real','<i1'),('imag','<i1')]):
35 datatype = 0
35 datatype = 0
36 elif numpyDtype == numpy.dtype([('real','<i2'),('imag','<i2')]):
36 elif numpyDtype == numpy.dtype([('real','<i2'),('imag','<i2')]):
37 datatype = 1
37 datatype = 1
38 elif numpyDtype == numpy.dtype([('real','<i4'),('imag','<i4')]):
38 elif numpyDtype == numpy.dtype([('real','<i4'),('imag','<i4')]):
39 datatype = 2
39 datatype = 2
40 elif numpyDtype == numpy.dtype([('real','<i8'),('imag','<i8')]):
40 elif numpyDtype == numpy.dtype([('real','<i8'),('imag','<i8')]):
41 datatype = 3
41 datatype = 3
42 elif numpyDtype == numpy.dtype([('real','<f4'),('imag','<f4')]):
42 elif numpyDtype == numpy.dtype([('real','<f4'),('imag','<f4')]):
43 datatype = 4
43 datatype = 4
44 elif numpyDtype == numpy.dtype([('real','<f8'),('imag','<f8')]):
44 elif numpyDtype == numpy.dtype([('real','<f8'),('imag','<f8')]):
45 datatype = 5
45 datatype = 5
46 else:
46 else:
47 datatype = None
47 datatype = None
48
48
49 return datatype
49 return datatype
50
50
51 def hildebrand_sekhon(data, navg):
51 def hildebrand_sekhon(data, navg):
52
52
53 data = data.copy()
53 data = data.copy()
54
54
55 sortdata = numpy.sort(data,axis=None)
55 sortdata = numpy.sort(data,axis=None)
56 lenOfData = len(sortdata)
56 lenOfData = len(sortdata)
57 nums_min = lenOfData/10
57 nums_min = lenOfData/10
58
58
59 if (lenOfData/10) > 2:
59 if (lenOfData/10) > 2:
60 nums_min = lenOfData/10
60 nums_min = lenOfData/10
61 else:
61 else:
62 nums_min = 2
62 nums_min = 2
63
63
64 sump = 0.
64 sump = 0.
65
65
66 sumq = 0.
66 sumq = 0.
67
67
68 j = 0
68 j = 0
69
69
70 cont = 1
70 cont = 1
71
71
72 while((cont==1)and(j<lenOfData)):
72 while((cont==1)and(j<lenOfData)):
73
73
74 sump += sortdata[j]
74 sump += sortdata[j]
75
75
76 sumq += sortdata[j]**2
76 sumq += sortdata[j]**2
77
77
78 j += 1
78 j += 1
79
79
80 if j > nums_min:
80 if j > nums_min:
81 rtest = float(j)/(j-1) + 1.0/navg
81 rtest = float(j)/(j-1) + 1.0/navg
82 if ((sumq*j) > (rtest*sump**2)):
82 if ((sumq*j) > (rtest*sump**2)):
83 j = j - 1
83 j = j - 1
84 sump = sump - sortdata[j]
84 sump = sump - sortdata[j]
85 sumq = sumq - sortdata[j]**2
85 sumq = sumq - sortdata[j]**2
86 cont = 0
86 cont = 0
87
87
88 lnoise = sump /j
88 lnoise = sump /j
89 stdv = numpy.sqrt((sumq - lnoise**2)/(j - 1))
89 stdv = numpy.sqrt((sumq - lnoise**2)/(j - 1))
90 return lnoise
90 return lnoise
91
91
92 class Beam:
92 class Beam:
93 def __init__(self):
93 def __init__(self):
94 self.codeList = []
94 self.codeList = []
95 self.azimuthList = []
95 self.azimuthList = []
96 self.zenithList = []
96 self.zenithList = []
97
97
98 class GenericData(object):
98 class GenericData(object):
99
99
100 flagNoData = True
100 flagNoData = True
101
101
102 def __init__(self):
102 def __init__(self):
103
103
104 raise ValueError, "This class has not been implemented"
104 raise ValueError, "This class has not been implemented"
105
105
106 def copy(self, inputObj=None):
106 def copy(self, inputObj=None):
107
107
108 if inputObj == None:
108 if inputObj == None:
109 return copy.deepcopy(self)
109 return copy.deepcopy(self)
110
110
111 for key in inputObj.__dict__.keys():
111 for key in inputObj.__dict__.keys():
112 self.__dict__[key] = inputObj.__dict__[key]
112 self.__dict__[key] = inputObj.__dict__[key]
113
113
114 def deepcopy(self):
114 def deepcopy(self):
115
115
116 return copy.deepcopy(self)
116 return copy.deepcopy(self)
117
117
118 def isEmpty(self):
118 def isEmpty(self):
119
119
120 return self.flagNoData
120 return self.flagNoData
121
121
122 class JROData(GenericData):
122 class JROData(GenericData):
123
123
124 # m_BasicHeader = BasicHeader()
124 # m_BasicHeader = BasicHeader()
125 # m_ProcessingHeader = ProcessingHeader()
125 # m_ProcessingHeader = ProcessingHeader()
126
126
127 systemHeaderObj = SystemHeader()
127 systemHeaderObj = SystemHeader()
128
128
129 radarControllerHeaderObj = RadarControllerHeader()
129 radarControllerHeaderObj = RadarControllerHeader()
130
130
131 # data = None
131 # data = None
132
132
133 type = None
133 type = None
134
134
135 datatype = None #dtype but in string
135 datatype = None #dtype but in string
136
136
137 # dtype = None
137 # dtype = None
138
138
139 # nChannels = None
139 # nChannels = None
140
140
141 # nHeights = None
141 # nHeights = None
142
142
143 nProfiles = None
143 nProfiles = None
144
144
145 heightList = None
145 heightList = None
146
146
147 channelList = None
147 channelList = None
148
148
149 flagTimeBlock = False
149 flagTimeBlock = False
150
150
151 useLocalTime = False
151 useLocalTime = False
152
152
153 utctime = None
153 utctime = None
154
154
155 timeZone = None
155 timeZone = None
156
156
157 dstFlag = None
157 dstFlag = None
158
158
159 errorCount = None
159 errorCount = None
160
160
161 blocksize = None
161 blocksize = None
162
162
163 nCode = None
163 nCode = None
164
164
165 nBaud = None
165 nBaud = None
166
166
167 code = None
167 code = None
168
168
169 flagDecodeData = False #asumo q la data no esta decodificada
169 flagDecodeData = False #asumo q la data no esta decodificada
170
170
171 flagDeflipData = False #asumo q la data no esta sin flip
171 flagDeflipData = False #asumo q la data no esta sin flip
172
172
173 flagShiftFFT = False
173 flagShiftFFT = False
174
174
175 # ippSeconds = None
175 # ippSeconds = None
176
176
177 timeInterval = None
177 timeInterval = None
178
178
179 nCohInt = None
179 nCohInt = None
180
180
181 noise = None
181 noise = None
182
182
183 windowOfFilter = 1
183 windowOfFilter = 1
184
184
185 #Speed of ligth
185 #Speed of ligth
186 C = 3e8
186 C = 3e8
187
187
188 frequency = 49.92e6
188 frequency = 49.92e6
189
189
190 realtime = False
190 realtime = False
191
191
192 beacon_heiIndexList = None
192 beacon_heiIndexList = None
193
193
194 last_block = None
194 last_block = None
195
195
196 blocknow = None
196 blocknow = None
197
197
198 azimuth = None
198 azimuth = None
199
199
200 zenith = None
200 zenith = None
201
201
202 beam = Beam()
202 beam = Beam()
203
203
204 def __init__(self):
204 def __init__(self):
205
205
206 raise ValueError, "This class has not been implemented"
206 raise ValueError, "This class has not been implemented"
207
207
208 def getNoise(self):
208 def getNoise(self):
209
209
210 raise ValueError, "Not implemented"
210 raise ValueError, "Not implemented"
211
211
212 def getNChannels(self):
212 def getNChannels(self):
213
213
214 return len(self.channelList)
214 return len(self.channelList)
215
215
216 def getChannelIndexList(self):
216 def getChannelIndexList(self):
217
217
218 return range(self.nChannels)
218 return range(self.nChannels)
219
219
220 def getNHeights(self):
220 def getNHeights(self):
221
221
222 return len(self.heightList)
222 return len(self.heightList)
223
223
224 def getHeiRange(self, extrapoints=0):
224 def getHeiRange(self, extrapoints=0):
225
225
226 heis = self.heightList
226 heis = self.heightList
227 # deltah = self.heightList[1] - self.heightList[0]
227 # deltah = self.heightList[1] - self.heightList[0]
228 #
228 #
229 # heis.append(self.heightList[-1])
229 # heis.append(self.heightList[-1])
230
230
231 return heis
231 return heis
232
232
233 def getltctime(self):
233 def getltctime(self):
234
234
235 if self.useLocalTime:
235 if self.useLocalTime:
236 return self.utctime - self.timeZone*60
236 return self.utctime - self.timeZone*60
237
237
238 return self.utctime
238 return self.utctime
239
239
240 def getDatatime(self):
240 def getDatatime(self):
241
241
242 datatimeValue = datetime.datetime.utcfromtimestamp(self.ltctime)
242 datatimeValue = datetime.datetime.utcfromtimestamp(self.ltctime)
243 return datatimeValue
243 return datatimeValue
244
244
245 def getTimeRange(self):
245 def getTimeRange(self):
246
246
247 datatime = []
247 datatime = []
248
248
249 datatime.append(self.ltctime)
249 datatime.append(self.ltctime)
250 datatime.append(self.ltctime + self.timeInterval)
250 datatime.append(self.ltctime + self.timeInterval)
251
251
252 datatime = numpy.array(datatime)
252 datatime = numpy.array(datatime)
253
253
254 return datatime
254 return datatime
255
255
256 def getFmax(self):
256 def getFmax(self):
257
257
258 PRF = 1./(self.ippSeconds * self.nCohInt)
258 PRF = 1./(self.ippSeconds * self.nCohInt)
259
259
260 fmax = PRF/2.
260 fmax = PRF/2.
261
261
262 return fmax
262 return fmax
263
263
264 def getVmax(self):
264 def getVmax(self):
265
265
266 _lambda = self.C/self.frequency
266 _lambda = self.C/self.frequency
267
267
268 vmax = self.getFmax() * _lambda
268 vmax = self.getFmax() * _lambda
269
269
270 return vmax
270 return vmax
271
271
272 def get_ippSeconds(self):
272 def get_ippSeconds(self):
273 '''
273 '''
274 '''
274 '''
275 return self.radarControllerHeaderObj.ippSeconds
275 return self.radarControllerHeaderObj.ippSeconds
276
276
277 def set_ippSeconds(self, ippSeconds):
277 def set_ippSeconds(self, ippSeconds):
278 '''
278 '''
279 '''
279 '''
280
280
281 self.radarControllerHeaderObj.ippSeconds = ippSeconds
281 self.radarControllerHeaderObj.ippSeconds = ippSeconds
282
282
283 return
283 return
284
284
285 def get_dtype(self):
285 def get_dtype(self):
286 '''
286 '''
287 '''
287 '''
288 return getNumpyDtype(self.datatype)
288 return getNumpyDtype(self.datatype)
289
289
290 def set_dtype(self, numpyDtype):
290 def set_dtype(self, numpyDtype):
291 '''
291 '''
292 '''
292 '''
293
293
294 self.datatype = getDataTypeCode(numpyDtype)
294 self.datatype = getDataTypeCode(numpyDtype)
295
295
296 nChannels = property(getNChannels, "I'm the 'nChannel' property.")
296 nChannels = property(getNChannels, "I'm the 'nChannel' property.")
297 channelIndexList = property(getChannelIndexList, "I'm the 'channelIndexList' property.")
297 channelIndexList = property(getChannelIndexList, "I'm the 'channelIndexList' property.")
298 nHeights = property(getNHeights, "I'm the 'nHeights' property.")
298 nHeights = property(getNHeights, "I'm the 'nHeights' property.")
299 #noise = property(getNoise, "I'm the 'nHeights' property.")
299 #noise = property(getNoise, "I'm the 'nHeights' property.")
300 datatime = property(getDatatime, "I'm the 'datatime' property")
300 datatime = property(getDatatime, "I'm the 'datatime' property")
301 ltctime = property(getltctime, "I'm the 'ltctime' property")
301 ltctime = property(getltctime, "I'm the 'ltctime' property")
302 ippSeconds = property(get_ippSeconds, set_ippSeconds)
302 ippSeconds = property(get_ippSeconds, set_ippSeconds)
303 dtype = property(get_dtype, set_dtype)
303 dtype = property(get_dtype, set_dtype)
304
304
305 class Voltage(JROData):
305 class Voltage(JROData):
306
306
307 #data es un numpy array de 2 dmensiones (canales, alturas)
307 #data es un numpy array de 2 dmensiones (canales, alturas)
308 data = None
308 data = None
309
309
310 def __init__(self):
310 def __init__(self):
311 '''
311 '''
312 Constructor
312 Constructor
313 '''
313 '''
314
314
315 self.radarControllerHeaderObj = RadarControllerHeader()
315 self.radarControllerHeaderObj = RadarControllerHeader()
316
316
317 self.systemHeaderObj = SystemHeader()
317 self.systemHeaderObj = SystemHeader()
318
318
319 self.type = "Voltage"
319 self.type = "Voltage"
320
320
321 self.data = None
321 self.data = None
322
322
323 # self.dtype = None
323 # self.dtype = None
324
324
325 # self.nChannels = 0
325 # self.nChannels = 0
326
326
327 # self.nHeights = 0
327 # self.nHeights = 0
328
328
329 self.nProfiles = None
329 self.nProfiles = None
330
330
331 self.heightList = None
331 self.heightList = None
332
332
333 self.channelList = None
333 self.channelList = None
334
334
335 # self.channelIndexList = None
335 # self.channelIndexList = None
336
336
337 self.flagNoData = True
337 self.flagNoData = True
338
338
339 self.flagTimeBlock = False
339 self.flagTimeBlock = False
340
340
341 self.utctime = None
341 self.utctime = None
342
342
343 self.timeZone = None
343 self.timeZone = None
344
344
345 self.dstFlag = None
345 self.dstFlag = None
346
346
347 self.errorCount = None
347 self.errorCount = None
348
348
349 self.nCohInt = None
349 self.nCohInt = None
350
350
351 self.blocksize = None
351 self.blocksize = None
352
352
353 self.flagDecodeData = False #asumo q la data no esta decodificada
353 self.flagDecodeData = False #asumo q la data no esta decodificada
354
354
355 self.flagDeflipData = False #asumo q la data no esta sin flip
355 self.flagDeflipData = False #asumo q la data no esta sin flip
356
356
357 self.flagShiftFFT = False
357 self.flagShiftFFT = False
358
358
359
359
360 def getNoisebyHildebrand(self):
360 def getNoisebyHildebrand(self):
361 """
361 """
362 Determino el nivel de ruido usando el metodo Hildebrand-Sekhon
362 Determino el nivel de ruido usando el metodo Hildebrand-Sekhon
363
363
364 Return:
364 Return:
365 noiselevel
365 noiselevel
366 """
366 """
367
367
368 for channel in range(self.nChannels):
368 for channel in range(self.nChannels):
369 daux = self.data_spc[channel,:,:]
369 daux = self.data_spc[channel,:,:]
370 self.noise[channel] = hildebrand_sekhon(daux, self.nCohInt)
370 self.noise[channel] = hildebrand_sekhon(daux, self.nCohInt)
371
371
372 return self.noise
372 return self.noise
373
373
374 def getNoise(self, type = 1):
374 def getNoise(self, type = 1):
375
375
376 self.noise = numpy.zeros(self.nChannels)
376 self.noise = numpy.zeros(self.nChannels)
377
377
378 if type == 1:
378 if type == 1:
379 noise = self.getNoisebyHildebrand()
379 noise = self.getNoisebyHildebrand()
380
380
381 return 10*numpy.log10(noise)
381 return 10*numpy.log10(noise)
382
382
383 noise = property(getNoise, "I'm the 'nHeights' property.")
383 noise = property(getNoise, "I'm the 'nHeights' property.")
384
384
385 class Spectra(JROData):
385 class Spectra(JROData):
386
386
387 #data es un numpy array de 2 dmensiones (canales, perfiles, alturas)
387 #data es un numpy array de 2 dmensiones (canales, perfiles, alturas)
388 data_spc = None
388 data_spc = None
389
389
390 #data es un numpy array de 2 dmensiones (canales, pares, alturas)
390 #data es un numpy array de 2 dmensiones (canales, pares, alturas)
391 data_cspc = None
391 data_cspc = None
392
392
393 #data es un numpy array de 2 dmensiones (canales, alturas)
393 #data es un numpy array de 2 dmensiones (canales, alturas)
394 data_dc = None
394 data_dc = None
395
395
396 nFFTPoints = None
396 nFFTPoints = None
397
397
398 # nPairs = None
398 # nPairs = None
399
399
400 pairsList = None
400 pairsList = None
401
401
402 nIncohInt = None
402 nIncohInt = None
403
403
404 wavelength = None #Necesario para cacular el rango de velocidad desde la frecuencia
404 wavelength = None #Necesario para cacular el rango de velocidad desde la frecuencia
405
405
406 nCohInt = None #se requiere para determinar el valor de timeInterval
406 nCohInt = None #se requiere para determinar el valor de timeInterval
407
407
408 ippFactor = None
408 ippFactor = None
409
409
410 def __init__(self):
410 def __init__(self):
411 '''
411 '''
412 Constructor
412 Constructor
413 '''
413 '''
414
414
415 self.radarControllerHeaderObj = RadarControllerHeader()
415 self.radarControllerHeaderObj = RadarControllerHeader()
416
416
417 self.systemHeaderObj = SystemHeader()
417 self.systemHeaderObj = SystemHeader()
418
418
419 self.type = "Spectra"
419 self.type = "Spectra"
420
420
421 # self.data = None
421 # self.data = None
422
422
423 # self.dtype = None
423 # self.dtype = None
424
424
425 # self.nChannels = 0
425 # self.nChannels = 0
426
426
427 # self.nHeights = 0
427 # self.nHeights = 0
428
428
429 self.nProfiles = None
429 self.nProfiles = None
430
430
431 self.heightList = None
431 self.heightList = None
432
432
433 self.channelList = None
433 self.channelList = None
434
434
435 # self.channelIndexList = None
435 # self.channelIndexList = None
436
436
437 self.pairsList = None
437 self.pairsList = None
438
438
439 self.flagNoData = True
439 self.flagNoData = True
440
440
441 self.flagTimeBlock = False
441 self.flagTimeBlock = False
442
442
443 self.utctime = None
443 self.utctime = None
444
444
445 self.nCohInt = None
445 self.nCohInt = None
446
446
447 self.nIncohInt = None
447 self.nIncohInt = None
448
448
449 self.blocksize = None
449 self.blocksize = None
450
450
451 self.nFFTPoints = None
451 self.nFFTPoints = None
452
452
453 self.wavelength = None
453 self.wavelength = None
454
454
455 self.flagDecodeData = False #asumo q la data no esta decodificada
455 self.flagDecodeData = False #asumo q la data no esta decodificada
456
456
457 self.flagDeflipData = False #asumo q la data no esta sin flip
457 self.flagDeflipData = False #asumo q la data no esta sin flip
458
458
459 self.flagShiftFFT = False
459 self.flagShiftFFT = False
460
460
461 self.ippFactor = 1
461 self.ippFactor = 1
462
462
463 #self.noise = None
463 #self.noise = None
464
464
465 self.beacon_heiIndexList = []
465 self.beacon_heiIndexList = []
466
466
467 self.noise_estimation = None
467 self.noise_estimation = None
468
468
469
469
470 def getNoisebyHildebrand(self):
470 def getNoisebyHildebrand(self):
471 """
471 """
472 Determino el nivel de ruido usando el metodo Hildebrand-Sekhon
472 Determino el nivel de ruido usando el metodo Hildebrand-Sekhon
473
473
474 Return:
474 Return:
475 noiselevel
475 noiselevel
476 """
476 """
477
477
478 noise = numpy.zeros(self.nChannels)
478 noise = numpy.zeros(self.nChannels)
479 for channel in range(self.nChannels):
479 for channel in range(self.nChannels):
480 daux = self.data_spc[channel,:,:]
480 daux = self.data_spc[channel,:,:]
481 noise[channel] = hildebrand_sekhon(daux, self.nIncohInt)
481 noise[channel] = hildebrand_sekhon(daux, self.nIncohInt)
482
482
483 return noise
483 return noise
484
484
485 def getNoise(self):
485 def getNoise(self):
486 if self.noise_estimation != None:
486 if self.noise_estimation != None:
487 return self.noise_estimation #this was estimated by getNoise Operation defined in jroproc_spectra.py
487 return self.noise_estimation #this was estimated by getNoise Operation defined in jroproc_spectra.py
488 else:
488 else:
489 noise = self.getNoisebyHildebrand()
489 noise = self.getNoisebyHildebrand()
490 return noise
490 return noise
491
491
492
492
493 def getFreqRange(self, extrapoints=0):
493 def getFreqRange(self, extrapoints=0):
494
494
495 deltafreq = self.getFmax() / (self.nFFTPoints*self.ippFactor)
495 deltafreq = self.getFmax() / (self.nFFTPoints*self.ippFactor)
496 freqrange = deltafreq*(numpy.arange(self.nFFTPoints+extrapoints)-self.nFFTPoints/2.) - deltafreq/2
496 freqrange = deltafreq*(numpy.arange(self.nFFTPoints+extrapoints)-self.nFFTPoints/2.) - deltafreq/2
497
497
498 return freqrange
498 return freqrange
499
499
500 def getVelRange(self, extrapoints=0):
500 def getVelRange(self, extrapoints=0):
501
501
502 deltav = self.getVmax() / (self.nFFTPoints*self.ippFactor)
502 deltav = self.getVmax() / (self.nFFTPoints*self.ippFactor)
503 velrange = deltav*(numpy.arange(self.nFFTPoints+extrapoints)-self.nFFTPoints/2.) - deltav/2
503 velrange = deltav*(numpy.arange(self.nFFTPoints+extrapoints)-self.nFFTPoints/2.) - deltav/2
504
504
505 return velrange
505 return velrange
506
506
507 def getNPairs(self):
507 def getNPairs(self):
508
508
509 return len(self.pairsList)
509 return len(self.pairsList)
510
510
511 def getPairsIndexList(self):
511 def getPairsIndexList(self):
512
512
513 return range(self.nPairs)
513 return range(self.nPairs)
514
514
515 def getNormFactor(self):
515 def getNormFactor(self):
516 pwcode = 1
516 pwcode = 1
517 if self.flagDecodeData:
517 if self.flagDecodeData:
518 pwcode = numpy.sum(self.code[0]**2)
518 pwcode = numpy.sum(self.code[0]**2)
519 #normFactor = min(self.nFFTPoints,self.nProfiles)*self.nIncohInt*self.nCohInt*pwcode*self.windowOfFilter
519 #normFactor = min(self.nFFTPoints,self.nProfiles)*self.nIncohInt*self.nCohInt*pwcode*self.windowOfFilter
520 normFactor = self.nProfiles*self.nIncohInt*self.nCohInt*pwcode*self.windowOfFilter
520 normFactor = self.nProfiles*self.nIncohInt*self.nCohInt*pwcode*self.windowOfFilter
521
521
522 return normFactor
522 return normFactor
523
523
524 def getFlagCspc(self):
524 def getFlagCspc(self):
525
525
526 if self.data_cspc == None:
526 if self.data_cspc == None:
527 return True
527 return True
528
528
529 return False
529 return False
530
530
531 def getFlagDc(self):
531 def getFlagDc(self):
532
532
533 if self.data_dc == None:
533 if self.data_dc == None:
534 return True
534 return True
535
535
536 return False
536 return False
537
537
538 nPairs = property(getNPairs, "I'm the 'nPairs' property.")
538 nPairs = property(getNPairs, "I'm the 'nPairs' property.")
539 pairsIndexList = property(getPairsIndexList, "I'm the 'pairsIndexList' property.")
539 pairsIndexList = property(getPairsIndexList, "I'm the 'pairsIndexList' property.")
540 normFactor = property(getNormFactor, "I'm the 'getNormFactor' property.")
540 normFactor = property(getNormFactor, "I'm the 'getNormFactor' property.")
541 flag_cspc = property(getFlagCspc)
541 flag_cspc = property(getFlagCspc)
542 flag_dc = property(getFlagDc)
542 flag_dc = property(getFlagDc)
543 noise = property(getNoise, "I'm the 'nHeights' property.")
543 noise = property(getNoise, "I'm the 'nHeights' property.")
544
544
545 class SpectraHeis(Spectra):
545 class SpectraHeis(Spectra):
546
546
547 data_spc = None
547 data_spc = None
548
548
549 data_cspc = None
549 data_cspc = None
550
550
551 data_dc = None
551 data_dc = None
552
552
553 nFFTPoints = None
553 nFFTPoints = None
554
554
555 # nPairs = None
555 # nPairs = None
556
556
557 pairsList = None
557 pairsList = None
558
558
559 nIncohInt = None
559 nIncohInt = None
560
560
561 def __init__(self):
561 def __init__(self):
562
562
563 self.radarControllerHeaderObj = RadarControllerHeader()
563 self.radarControllerHeaderObj = RadarControllerHeader()
564
564
565 self.systemHeaderObj = SystemHeader()
565 self.systemHeaderObj = SystemHeader()
566
566
567 self.type = "SpectraHeis"
567 self.type = "SpectraHeis"
568
568
569 # self.dtype = None
569 # self.dtype = None
570
570
571 # self.nChannels = 0
571 # self.nChannels = 0
572
572
573 # self.nHeights = 0
573 # self.nHeights = 0
574
574
575 self.nProfiles = None
575 self.nProfiles = None
576
576
577 self.heightList = None
577 self.heightList = None
578
578
579 self.channelList = None
579 self.channelList = None
580
580
581 # self.channelIndexList = None
581 # self.channelIndexList = None
582
582
583 self.flagNoData = True
583 self.flagNoData = True
584
584
585 self.flagTimeBlock = False
585 self.flagTimeBlock = False
586
586
587 # self.nPairs = 0
587 # self.nPairs = 0
588
588
589 self.utctime = None
589 self.utctime = None
590
590
591 self.blocksize = None
591 self.blocksize = None
592
592
593 def getNormFactor(self):
593 def getNormFactor(self):
594 pwcode = 1
594 pwcode = 1
595 if self.flagDecodeData:
595 if self.flagDecodeData:
596 pwcode = numpy.sum(self.code[0]**2)
596 pwcode = numpy.sum(self.code[0]**2)
597
597
598 normFactor = self.nIncohInt*self.nCohInt*pwcode
598 normFactor = self.nIncohInt*self.nCohInt*pwcode
599
599
600 return normFactor
600 return normFactor
601
601
602 normFactor = property(getNormFactor, "I'm the 'getNormFactor' property.")
602 normFactor = property(getNormFactor, "I'm the 'getNormFactor' property.")
603
603
604 class Fits:
604 class Fits:
605
605
606 heightList = None
606 heightList = None
607
607
608 channelList = None
608 channelList = None
609
609
610 flagNoData = True
610 flagNoData = True
611
611
612 flagTimeBlock = False
612 flagTimeBlock = False
613
613
614 useLocalTime = False
614 useLocalTime = False
615
615
616 utctime = None
616 utctime = None
617
617
618 timeZone = None
618 timeZone = None
619
619
620 # ippSeconds = None
620 # ippSeconds = None
621
621
622 timeInterval = None
622 timeInterval = None
623
623
624 nCohInt = None
624 nCohInt = None
625
625
626 nIncohInt = None
626 nIncohInt = None
627
627
628 noise = None
628 noise = None
629
629
630 windowOfFilter = 1
630 windowOfFilter = 1
631
631
632 #Speed of ligth
632 #Speed of ligth
633 C = 3e8
633 C = 3e8
634
634
635 frequency = 49.92e6
635 frequency = 49.92e6
636
636
637 realtime = False
637 realtime = False
638
638
639
639
640 def __init__(self):
640 def __init__(self):
641
641
642 self.type = "Fits"
642 self.type = "Fits"
643
643
644 self.nProfiles = None
644 self.nProfiles = None
645
645
646 self.heightList = None
646 self.heightList = None
647
647
648 self.channelList = None
648 self.channelList = None
649
649
650 # self.channelIndexList = None
650 # self.channelIndexList = None
651
651
652 self.flagNoData = True
652 self.flagNoData = True
653
653
654 self.utctime = None
654 self.utctime = None
655
655
656 self.nCohInt = None
656 self.nCohInt = None
657
657
658 self.nIncohInt = None
658 self.nIncohInt = None
659
659
660 self.useLocalTime = True
660 self.useLocalTime = True
661
661
662 # self.utctime = None
662 # self.utctime = None
663 # self.timeZone = None
663 # self.timeZone = None
664 # self.ltctime = None
664 # self.ltctime = None
665 # self.timeInterval = None
665 # self.timeInterval = None
666 # self.header = None
666 # self.header = None
667 # self.data_header = None
667 # self.data_header = None
668 # self.data = None
668 # self.data = None
669 # self.datatime = None
669 # self.datatime = None
670 # self.flagNoData = False
670 # self.flagNoData = False
671 # self.expName = ''
671 # self.expName = ''
672 # self.nChannels = None
672 # self.nChannels = None
673 # self.nSamples = None
673 # self.nSamples = None
674 # self.dataBlocksPerFile = None
674 # self.dataBlocksPerFile = None
675 # self.comments = ''
675 # self.comments = ''
676 #
676 #
677
677
678
678
679 def getltctime(self):
679 def getltctime(self):
680
680
681 if self.useLocalTime:
681 if self.useLocalTime:
682 return self.utctime - self.timeZone*60
682 return self.utctime - self.timeZone*60
683
683
684 return self.utctime
684 return self.utctime
685
685
686 def getDatatime(self):
686 def getDatatime(self):
687
687
688 datatime = datetime.datetime.utcfromtimestamp(self.ltctime)
688 datatime = datetime.datetime.utcfromtimestamp(self.ltctime)
689 return datatime
689 return datatime
690
690
691 def getTimeRange(self):
691 def getTimeRange(self):
692
692
693 datatime = []
693 datatime = []
694
694
695 datatime.append(self.ltctime)
695 datatime.append(self.ltctime)
696 datatime.append(self.ltctime + self.timeInterval)
696 datatime.append(self.ltctime + self.timeInterval)
697
697
698 datatime = numpy.array(datatime)
698 datatime = numpy.array(datatime)
699
699
700 return datatime
700 return datatime
701
701
702 def getHeiRange(self):
702 def getHeiRange(self):
703
703
704 heis = self.heightList
704 heis = self.heightList
705
705
706 return heis
706 return heis
707
707
708 def isEmpty(self):
708 def isEmpty(self):
709
709
710 return self.flagNoData
710 return self.flagNoData
711
711
712 def getNHeights(self):
712 def getNHeights(self):
713
713
714 return len(self.heightList)
714 return len(self.heightList)
715
715
716 def getNChannels(self):
716 def getNChannels(self):
717
717
718 return len(self.channelList)
718 return len(self.channelList)
719
719
720 def getChannelIndexList(self):
720 def getChannelIndexList(self):
721
721
722 return range(self.nChannels)
722 return range(self.nChannels)
723
723
724 def getNoise(self, type = 1):
724 def getNoise(self, type = 1):
725
725
726 self.noise = numpy.zeros(self.nChannels)
726 self.noise = numpy.zeros(self.nChannels)
727
727
728 if type == 1:
728 if type == 1:
729 noise = self.getNoisebyHildebrand()
729 noise = self.getNoisebyHildebrand()
730
730
731 if type == 2:
731 if type == 2:
732 noise = self.getNoisebySort()
732 noise = self.getNoisebySort()
733
733
734 if type == 3:
734 if type == 3:
735 noise = self.getNoisebyWindow()
735 noise = self.getNoisebyWindow()
736
736
737 return noise
737 return noise
738
738
739 datatime = property(getDatatime, "I'm the 'datatime' property")
739 datatime = property(getDatatime, "I'm the 'datatime' property")
740 nHeights = property(getNHeights, "I'm the 'nHeights' property.")
740 nHeights = property(getNHeights, "I'm the 'nHeights' property.")
741 nChannels = property(getNChannels, "I'm the 'nChannel' property.")
741 nChannels = property(getNChannels, "I'm the 'nChannel' property.")
742 channelIndexList = property(getChannelIndexList, "I'm the 'channelIndexList' property.")
742 channelIndexList = property(getChannelIndexList, "I'm the 'channelIndexList' property.")
743 noise = property(getNoise, "I'm the 'nHeights' property.")
743 noise = property(getNoise, "I'm the 'nHeights' property.")
744 datatime = property(getDatatime, "I'm the 'datatime' property")
744 datatime = property(getDatatime, "I'm the 'datatime' property")
745 ltctime = property(getltctime, "I'm the 'ltctime' property")
745 ltctime = property(getltctime, "I'm the 'ltctime' property")
746
747 class Correlation(JROData):
748
749 noise = None
750
751 SNR = None
752
753 pairsAutoCorr = None #Pairs of Autocorrelation
754
755 #--------------------------------------------------
756
757 data_corr = None
758
759 data_volt = None
760
761 lagT = None # each element value is a profileIndex
762
763 lagR = None # each element value is in km
764
765 pairsList = None
766
767 calculateVelocity = None
768
769 nPoints = None
770
771 nAvg = None
772
773 bufferSize = None
774
775 def __init__(self):
776 '''
777 Constructor
778 '''
779 self.radarControllerHeaderObj = RadarControllerHeader()
780
781 self.systemHeaderObj = SystemHeader()
782
783 self.type = "Correlation"
784
785 self.data = None
786
787 self.dtype = None
788
789 self.nProfiles = None
790
791 self.heightList = None
792
793 self.channelList = None
794
795 self.flagNoData = True
796
797 self.flagTimeBlock = False
798
799 self.utctime = None
800
801 self.timeZone = None
802
803 self.dstFlag = None
804
805 self.errorCount = None
806
807 self.blocksize = None
808
809 self.flagDecodeData = False #asumo q la data no esta decodificada
810
811 self.flagDeflipData = False #asumo q la data no esta sin flip
812
813 self.pairsList = None
814
815 self.nPoints = None
816
817 def getLagTRange(self, extrapoints=0):
818
819 lagTRange = self.lagT
820 diff = lagTRange[1] - lagTRange[0]
821 extra = numpy.arange(1,extrapoints + 1)*diff + lagTRange[-1]
822 lagTRange = numpy.hstack((lagTRange, extra))
823
824 return lagTRange
825
826 def getLagRRange(self, extrapoints=0):
827
828 return self.lagR
829
830 def getPairsList(self):
831
832 return self.pairsList
833
834 def getCalculateVelocity(self):
835
836 return self.calculateVelocity
837
838 def getNPoints(self):
839
840 return self.nPoints
841
842 def getNAvg(self):
843
844 return self.nAvg
845
846 def getBufferSize(self):
847
848 return self.bufferSize
849
850 def getPairsAutoCorr(self):
851 pairsList = self.pairsList
852 pairsAutoCorr = numpy.zeros(self.nChannels, dtype = 'int')*numpy.nan
853
854 for l in range(len(pairsList)):
855 firstChannel = pairsList[l][0]
856 secondChannel = pairsList[l][1]
857
858 #Obteniendo pares de Autocorrelacion
859 if firstChannel == secondChannel:
860 pairsAutoCorr[firstChannel] = int(l)
861
862 pairsAutoCorr = pairsAutoCorr.astype(int)
863
864 return pairsAutoCorr
865
866 def getNoise(self, mode = 2):
867
868 indR = numpy.where(self.lagR == 0)[0][0]
869 indT = numpy.where(self.lagT == 0)[0][0]
870
871 jspectra0 = self.data_corr[:,:,indR,:]
872 jspectra = copy.copy(jspectra0)
873
874 num_chan = jspectra.shape[0]
875 num_hei = jspectra.shape[2]
876
877 freq_dc = jspectra.shape[1]/2
878 ind_vel = numpy.array([-2,-1,1,2]) + freq_dc
879
880 if ind_vel[0]<0:
881 ind_vel[range(0,1)] = ind_vel[range(0,1)] + self.num_prof
882
883 if mode == 1:
884 jspectra[:,freq_dc,:] = (jspectra[:,ind_vel[1],:] + jspectra[:,ind_vel[2],:])/2 #CORRECCION
885
886 if mode == 2:
887
888 vel = numpy.array([-2,-1,1,2])
889 xx = numpy.zeros([4,4])
890
891 for fil in range(4):
892 xx[fil,:] = vel[fil]**numpy.asarray(range(4))
893
894 xx_inv = numpy.linalg.inv(xx)
895 xx_aux = xx_inv[0,:]
896
897 for ich in range(num_chan):
898 yy = jspectra[ich,ind_vel,:]
899 jspectra[ich,freq_dc,:] = numpy.dot(xx_aux,yy)
900
901 junkid = jspectra[ich,freq_dc,:]<=0
902 cjunkid = sum(junkid)
903
904 if cjunkid.any():
905 jspectra[ich,freq_dc,junkid.nonzero()] = (jspectra[ich,ind_vel[1],junkid] + jspectra[ich,ind_vel[2],junkid])/2
906
907 noise = jspectra0[:,freq_dc,:] - jspectra[:,freq_dc,:]
908
909 return noise
910
911 # pairsList = property(getPairsList, "I'm the 'pairsList' property.")
912 # nPoints = property(getNPoints, "I'm the 'nPoints' property.")
913 calculateVelocity = property(getCalculateVelocity, "I'm the 'calculateVelocity' property.")
914 nAvg = property(getNAvg, "I'm the 'nAvg' property.")
915 bufferSize = property(getBufferSize, "I'm the 'bufferSize' property.")
916
917
918 class Parameters(JROData):
919
920 inputUnit = None #Type of data to be processed
921
922 operation = None #Type of operation to parametrize
923
924 data_param = None #Parameters obtained
925
926 data_pre = None #Data Pre Parametrization
746
927
928 heightRange = None #Heights
929
930 abscissaRange = None #Abscissa, can be velocities, lags or time
931
932 noise = None #Noise Potency
933
934 SNR = None #Signal to Noise Ratio
935
936 pairsList = None #List of Pairs for Cross correlations or Cross spectrum
937
938 initUtcTime = None #Initial UTC time
939
940 paramInterval = None #Time interval to calculate Parameters in seconds
941
942 windsInterval = None #Time interval to calculate Winds in seconds
943
944 normFactor = None #Normalization Factor
945
946 winds = None #Wind estimations
947
948 def __init__(self):
949 '''
950 Constructor
951 '''
952 self.radarControllerHeaderObj = RadarControllerHeader()
953
954 self.systemHeaderObj = SystemHeader()
955
956 self.type = "Parameters"
957
958 def getTimeRange1(self):
959
960 datatime = []
961
962 datatime.append(self.initUtcTime)
963 datatime.append(self.initUtcTime + self.windsInterval - 1)
964
965 datatime = numpy.array(datatime)
966
967 return datatime
@@ -1,590 +1,607
1 import os
1 import os
2 import numpy
2 import numpy
3 import time, datetime
3 import time, datetime
4 import mpldriver
4 import mpldriver
5
5
6
6
7 import Queue
7 import Queue
8 import threading
8 import threading
9
9
10 def isRealtime(utcdatatime):
10 def isRealtime(utcdatatime):
11 utcnow = time.mktime(time.localtime())
11 utcnow = time.mktime(time.localtime())
12 delta = abs(utcnow - utcdatatime) # abs
12 delta = abs(utcnow - utcdatatime) # abs
13 if delta >= 30.:
13 if delta >= 30.:
14 return False
14 return False
15 return True
15 return True
16
16
17
17
18
18
19
19
20 class Figure:
20 class Figure:
21
21
22 __driver = mpldriver
22 __driver = mpldriver
23 __isConfigThread = False
23 __isConfigThread = False
24 fig = None
24 fig = None
25
25
26 id = None
26 id = None
27 wintitle = None
27 wintitle = None
28 width = None
28 width = None
29 height = None
29 height = None
30 nplots = None
30 nplots = None
31 timerange = None
31 timerange = None
32
32
33 axesObjList = []
33 axesObjList = []
34
34
35 WIDTH = None
35 WIDTH = None
36 HEIGHT = None
36 HEIGHT = None
37 PREFIX = 'fig'
37 PREFIX = 'fig'
38
38
39 xmin = None
39 xmin = None
40 xmax = None
40 xmax = None
41
41
42 def __init__(self):
42 def __init__(self):
43
43
44 raise ValueError, "This method is not implemented"
44 raise ValueError, "This method is not implemented"
45
45
46 def __del__(self):
46 def __del__(self):
47
47
48 self.__driver.closeFigure()
48 self.__driver.closeFigure()
49
49
50 def getFilename(self, name, ext='.png'):
50 def getFilename(self, name, ext='.png'):
51
51
52 path = '%s%03d' %(self.PREFIX, self.id)
52 path = '%s%03d' %(self.PREFIX, self.id)
53 filename = '%s_%s%s' %(self.PREFIX, name, ext)
53 filename = '%s_%s%s' %(self.PREFIX, name, ext)
54 return os.path.join(path, filename)
54 return os.path.join(path, filename)
55
55
56 def getAxesObjList(self):
56 def getAxesObjList(self):
57
57
58 return self.axesObjList
58 return self.axesObjList
59
59
60 def getSubplots(self):
60 def getSubplots(self):
61
61
62 raise ValueError, "Abstract method: This method should be defined"
62 raise ValueError, "Abstract method: This method should be defined"
63
63
64 def getScreenDim(self, widthplot, heightplot):
64 def getScreenDim(self, widthplot, heightplot):
65
65
66 nrow, ncol = self.getSubplots()
66 nrow, ncol = self.getSubplots()
67
67
68 widthscreen = widthplot*ncol
68 widthscreen = widthplot*ncol
69 heightscreen = heightplot*nrow
69 heightscreen = heightplot*nrow
70
70
71 return widthscreen, heightscreen
71 return widthscreen, heightscreen
72
72
73 def getTimeLim(self, x, xmin=None, xmax=None, timerange=None):
73 def getTimeLim(self, x, xmin=None, xmax=None, timerange=None):
74
74
75 if self.xmin != None and self.xmax != None:
75 if self.xmin != None and self.xmax != None:
76 if timerange == None:
76 if timerange == None:
77 timerange = self.xmax - self.xmin
77 timerange = self.xmax - self.xmin
78 xmin = self.xmin + timerange
78 xmin = self.xmin + timerange
79 xmax = self.xmax + timerange
79 xmax = self.xmax + timerange
80
80
81 return xmin, xmax
81 return xmin, xmax
82
82
83
83
84 if timerange != None and self.xmin == None and self.xmax == None:
84 if timerange != None and self.xmin == None and self.xmax == None:
85 txmin = x[0] - x[0]%timerange
85 txmin = x[0] - x[0]%timerange
86 thisdatetime = datetime.datetime.utcfromtimestamp(txmin)
86 thisdatetime = datetime.datetime.utcfromtimestamp(txmin)
87 thisdate = datetime.datetime.combine(thisdatetime.date(), datetime.time(0,0,0))
87 thisdate = datetime.datetime.combine(thisdatetime.date(), datetime.time(0,0,0))
88 xmin = (thisdatetime - thisdate).seconds/(60*60.)
88 xmin = (thisdatetime - thisdate).seconds/(60*60.)
89 xmax = xmin + timerange/(60*60.)
89 xmax = xmin + timerange/(60*60.)
90
90
91
91
92 if timerange == None:
92 if timerange == None:
93 txmin = numpy.min(x)
93 txmin = numpy.min(x)
94 thisdatetime = datetime.datetime.utcfromtimestamp(txmin)
94 thisdatetime = datetime.datetime.utcfromtimestamp(txmin)
95 thisdate = datetime.datetime.combine(thisdatetime.date(), datetime.time(0,0,0))
95 thisdate = datetime.datetime.combine(thisdatetime.date(), datetime.time(0,0,0))
96
96
97 mindt = thisdate + datetime.timedelta(hours=xmin) - datetime.timedelta(seconds=time.timezone)
97 mindt = thisdate + datetime.timedelta(hours=xmin) - datetime.timedelta(seconds=time.timezone)
98 xmin_sec = time.mktime(mindt.timetuple())
98 xmin_sec = time.mktime(mindt.timetuple())
99
99
100 maxdt = thisdate + datetime.timedelta(hours=xmax) - datetime.timedelta(seconds=time.timezone)
100 maxdt = thisdate + datetime.timedelta(hours=xmax) - datetime.timedelta(seconds=time.timezone)
101 xmax_sec = time.mktime(maxdt.timetuple())
101 xmax_sec = time.mktime(maxdt.timetuple())
102
102
103 return xmin_sec, xmax_sec
103 return xmin_sec, xmax_sec
104
104
105
105
106
106
107
107
108
108
109 # if timerange != None:
109 # if timerange != None:
110 # txmin = x[0] - x[0]%timerange
110 # txmin = x[0] - x[0]%timerange
111 # else:
111 # else:
112 # txmin = numpy.min(x)
112 # txmin = numpy.min(x)
113 #
113 #
114 # thisdatetime = datetime.datetime.utcfromtimestamp(txmin)
114 # thisdatetime = datetime.datetime.utcfromtimestamp(txmin)
115 # thisdate = datetime.datetime.combine(thisdatetime.date(), datetime.time(0,0,0))
115 # thisdate = datetime.datetime.combine(thisdatetime.date(), datetime.time(0,0,0))
116 #
116 #
117 # ####################################################
117 # ####################################################
118 # #If the x is out of xrange
118 # #If the x is out of xrange
119 # if xmax != None:
119 # if xmax != None:
120 # if xmax < (thisdatetime - thisdate).seconds/(60*60.):
120 # if xmax < (thisdatetime - thisdate).seconds/(60*60.):
121 # xmin = None
121 # xmin = None
122 # xmax = None
122 # xmax = None
123 #
123 #
124 # if xmin == None:
124 # if xmin == None:
125 # td = thisdatetime - thisdate
125 # td = thisdatetime - thisdate
126 # xmin = td.seconds/(60*60.)
126 # xmin = td.seconds/(60*60.)
127 #
127 #
128 # if xmax == None:
128 # if xmax == None:
129 # xmax = xmin + self.timerange/(60*60.)
129 # xmax = xmin + self.timerange/(60*60.)
130 #
130 #
131 # mindt = thisdate + datetime.timedelta(hours=xmin) - datetime.timedelta(seconds=time.timezone)
131 # mindt = thisdate + datetime.timedelta(hours=xmin) - datetime.timedelta(seconds=time.timezone)
132 # tmin = time.mktime(mindt.timetuple())
132 # tmin = time.mktime(mindt.timetuple())
133 #
133 #
134 # maxdt = thisdate + datetime.timedelta(hours=xmax) - datetime.timedelta(seconds=time.timezone)
134 # maxdt = thisdate + datetime.timedelta(hours=xmax) - datetime.timedelta(seconds=time.timezone)
135 # tmax = time.mktime(maxdt.timetuple())
135 # tmax = time.mktime(maxdt.timetuple())
136 #
136 #
137 # #self.timerange = tmax - tmin
137 # #self.timerange = tmax - tmin
138 #
138 #
139 # return tmin, tmax
139 # return tmin, tmax
140
140
141 def init(self, id, nplots, wintitle):
141 def init(self, id, nplots, wintitle):
142
142
143 raise ValueError, "This method has been replaced with createFigure"
143 raise ValueError, "This method has been replaced with createFigure"
144
144
145 def createFigure(self, id, wintitle, widthplot=None, heightplot=None, show=True):
145 def createFigure(self, id, wintitle, widthplot=None, heightplot=None, show=True):
146
146
147 """
147 """
148 Crea la figura de acuerdo al driver y parametros seleccionados seleccionados.
148 Crea la figura de acuerdo al driver y parametros seleccionados seleccionados.
149 Las dimensiones de la pantalla es calculada a partir de los atributos self.WIDTH
149 Las dimensiones de la pantalla es calculada a partir de los atributos self.WIDTH
150 y self.HEIGHT y el numero de subplots (nrow, ncol)
150 y self.HEIGHT y el numero de subplots (nrow, ncol)
151
151
152 Input:
152 Input:
153 id : Los parametros necesarios son
153 id : Los parametros necesarios son
154 wintitle :
154 wintitle :
155
155
156 """
156 """
157
157
158 if widthplot == None:
158 if widthplot == None:
159 widthplot = self.WIDTH
159 widthplot = self.WIDTH
160
160
161 if heightplot == None:
161 if heightplot == None:
162 heightplot = self.HEIGHT
162 heightplot = self.HEIGHT
163
163
164 self.id = id
164 self.id = id
165
165
166 self.wintitle = wintitle
166 self.wintitle = wintitle
167
167
168 self.widthscreen, self.heightscreen = self.getScreenDim(widthplot, heightplot)
168 self.widthscreen, self.heightscreen = self.getScreenDim(widthplot, heightplot)
169
169
170 self.fig = self.__driver.createFigure(id=self.id,
170 self.fig = self.__driver.createFigure(id=self.id,
171 wintitle=self.wintitle,
171 wintitle=self.wintitle,
172 width=self.widthscreen,
172 width=self.widthscreen,
173 height=self.heightscreen,
173 height=self.heightscreen,
174 show=show)
174 show=show)
175
175
176 self.axesObjList = []
176 self.axesObjList = []
177
177
178
178
179 def setDriver(self, driver=mpldriver):
179 def setDriver(self, driver=mpldriver):
180
180
181 self.__driver = driver
181 self.__driver = driver
182
182
183 def setTitle(self, title):
183 def setTitle(self, title):
184
184
185 self.__driver.setTitle(self.fig, title)
185 self.__driver.setTitle(self.fig, title)
186
186
187 def setWinTitle(self, title):
187 def setWinTitle(self, title):
188
188
189 self.__driver.setWinTitle(self.fig, title=title)
189 self.__driver.setWinTitle(self.fig, title=title)
190
190
191 def setTextFromAxes(self, text):
191 def setTextFromAxes(self, text):
192
192
193 raise ValueError, "Este metodo ha sido reemplazaado con el metodo setText de la clase Axes"
193 raise ValueError, "Este metodo ha sido reemplazaado con el metodo setText de la clase Axes"
194
194
195 def makeAxes(self, nrow, ncol, xpos, ypos, colspan, rowspan):
195 def makeAxes(self, nrow, ncol, xpos, ypos, colspan, rowspan):
196
196
197 raise ValueError, "Este metodo ha sido reemplazaado con el metodo addAxes"
197 raise ValueError, "Este metodo ha sido reemplazaado con el metodo addAxes"
198
198
199 def addAxes(self, *args):
199 def addAxes(self, *args):
200 """
200 """
201
201
202 Input:
202 Input:
203 *args : Los parametros necesarios son
203 *args : Los parametros necesarios son
204 nrow, ncol, xpos, ypos, colspan, rowspan
204 nrow, ncol, xpos, ypos, colspan, rowspan
205 """
205 """
206
206
207 axesObj = Axes(self.fig, *args)
207 axesObj = Axes(self.fig, *args)
208 self.axesObjList.append(axesObj)
208 self.axesObjList.append(axesObj)
209
209
210 def saveFigure(self, figpath, figfile, *args):
210 def saveFigure(self, figpath, figfile, *args):
211
211
212 filename = os.path.join(figpath, figfile)
212 filename = os.path.join(figpath, figfile)
213
213
214 fullpath = os.path.split(filename)[0]
214 fullpath = os.path.split(filename)[0]
215
215
216 if not os.path.exists(fullpath):
216 if not os.path.exists(fullpath):
217 subpath = os.path.split(fullpath)[0]
217 subpath = os.path.split(fullpath)[0]
218
218
219 if not os.path.exists(subpath):
219 if not os.path.exists(subpath):
220 os.mkdir(subpath)
220 os.mkdir(subpath)
221
221
222 os.mkdir(fullpath)
222 os.mkdir(fullpath)
223
223
224 self.__driver.saveFigure(self.fig, filename, *args)
224 self.__driver.saveFigure(self.fig, filename, *args)
225
225
226
226
227
227
228
228
229 def getNameToFtp(self, thisDatetime, FTP_WEI, EXP_CODE, SUB_EXP_CODE, PLOT_CODE, PLOT_POS):
229 def getNameToFtp(self, thisDatetime, FTP_WEI, EXP_CODE, SUB_EXP_CODE, PLOT_CODE, PLOT_POS):
230 YEAR_STR = '%4.4d'%thisDatetime.timetuple().tm_year
230 YEAR_STR = '%4.4d'%thisDatetime.timetuple().tm_year
231 DOY_STR = '%3.3d'%thisDatetime.timetuple().tm_yday
231 DOY_STR = '%3.3d'%thisDatetime.timetuple().tm_yday
232 FTP_WEI = '%2.2d'%FTP_WEI
232 FTP_WEI = '%2.2d'%FTP_WEI
233 EXP_CODE = '%3.3d'%EXP_CODE
233 EXP_CODE = '%3.3d'%EXP_CODE
234 SUB_EXP_CODE = '%2.2d'%SUB_EXP_CODE
234 SUB_EXP_CODE = '%2.2d'%SUB_EXP_CODE
235 PLOT_CODE = '%2.2d'%PLOT_CODE
235 PLOT_CODE = '%2.2d'%PLOT_CODE
236 PLOT_POS = '%2.2d'%PLOT_POS
236 PLOT_POS = '%2.2d'%PLOT_POS
237 name = YEAR_STR + DOY_STR + FTP_WEI + EXP_CODE + SUB_EXP_CODE + PLOT_CODE + PLOT_POS
237 name = YEAR_STR + DOY_STR + FTP_WEI + EXP_CODE + SUB_EXP_CODE + PLOT_CODE + PLOT_POS
238 return name
238 return name
239
239
240 def draw(self):
240 def draw(self):
241
241
242 self.__driver.draw(self.fig)
242 self.__driver.draw(self.fig)
243
243
244 def run(self):
244 def run(self):
245
245
246 raise ValueError, "This method is not implemented"
246 raise ValueError, "This method is not implemented"
247
247
248 def close(self):
248 def close(self):
249
249
250 self.__driver.show(True)
250 self.__driver.show(True)
251
251
252 axesList = property(getAxesObjList)
252 axesList = property(getAxesObjList)
253
253
254
254
255 class Axes:
255 class Axes:
256
256
257 __driver = mpldriver
257 __driver = mpldriver
258 fig = None
258 fig = None
259 ax = None
259 ax = None
260 plot = None
260 plot = None
261 __missing = 1E30
261 __missing = 1E30
262 __firsttime = None
262 __firsttime = None
263
263
264 __showprofile = False
264 __showprofile = False
265
265
266 xmin = None
266 xmin = None
267 xmax = None
267 xmax = None
268 ymin = None
268 ymin = None
269 ymax = None
269 ymax = None
270 zmin = None
270 zmin = None
271 zmax = None
271 zmax = None
272
272
273 x_buffer = None
273 x_buffer = None
274 z_buffer = None
274 z_buffer = None
275
275
276 decimationx = None
276 decimationx = None
277 decimationy = None
277 decimationy = None
278
278
279 __MAXNUMX = 300
279 __MAXNUMX = 300
280 __MAXNUMY = 150
280 __MAXNUMY = 150
281
281
282 def __init__(self, *args):
282 def __init__(self, *args):
283
283
284 """
284 """
285
285
286 Input:
286 Input:
287 *args : Los parametros necesarios son
287 *args : Los parametros necesarios son
288 fig, nrow, ncol, xpos, ypos, colspan, rowspan
288 fig, nrow, ncol, xpos, ypos, colspan, rowspan
289 """
289 """
290
290
291 ax = self.__driver.createAxes(*args)
291 ax = self.__driver.createAxes(*args)
292 self.fig = args[0]
292 self.fig = args[0]
293 self.ax = ax
293 self.ax = ax
294 self.plot = None
294 self.plot = None
295
295
296 self.__firsttime = True
296 self.__firsttime = True
297 self.idlineList = []
297 self.idlineList = []
298
298
299 self.x_buffer = numpy.array([])
299 self.x_buffer = numpy.array([])
300 self.z_buffer = numpy.array([])
300 self.z_buffer = numpy.array([])
301
301
302 def setText(self, text):
302 def setText(self, text):
303
303
304 self.__driver.setAxesText(self.ax, text)
304 self.__driver.setAxesText(self.ax, text)
305
305
306 def setXAxisAsTime(self):
306 def setXAxisAsTime(self):
307 pass
307 pass
308
308
309 def pline(self, x, y,
309 def pline(self, x, y,
310 xmin=None, xmax=None,
310 xmin=None, xmax=None,
311 ymin=None, ymax=None,
311 ymin=None, ymax=None,
312 xlabel='', ylabel='',
312 xlabel='', ylabel='',
313 title='',
313 title='',
314 **kwargs):
314 **kwargs):
315
315
316 """
316 """
317
317
318 Input:
318 Input:
319 x :
319 x :
320 y :
320 y :
321 xmin :
321 xmin :
322 xmax :
322 xmax :
323 ymin :
323 ymin :
324 ymax :
324 ymax :
325 xlabel :
325 xlabel :
326 ylabel :
326 ylabel :
327 title :
327 title :
328 **kwargs : Los parametros aceptados son
328 **kwargs : Los parametros aceptados son
329
329
330 ticksize
330 ticksize
331 ytick_visible
331 ytick_visible
332 """
332 """
333
333
334 if self.__firsttime:
334 if self.__firsttime:
335
335
336 if xmin == None: xmin = numpy.nanmin(x)
336 if xmin == None: xmin = numpy.nanmin(x)
337 if xmax == None: xmax = numpy.nanmax(x)
337 if xmax == None: xmax = numpy.nanmax(x)
338 if ymin == None: ymin = numpy.nanmin(y)
338 if ymin == None: ymin = numpy.nanmin(y)
339 if ymax == None: ymax = numpy.nanmax(y)
339 if ymax == None: ymax = numpy.nanmax(y)
340
340
341 self.plot = self.__driver.createPline(self.ax, x, y,
341 self.plot = self.__driver.createPline(self.ax, x, y,
342 xmin, xmax,
342 xmin, xmax,
343 ymin, ymax,
343 ymin, ymax,
344 xlabel=xlabel,
344 xlabel=xlabel,
345 ylabel=ylabel,
345 ylabel=ylabel,
346 title=title,
346 title=title,
347 **kwargs)
347 **kwargs)
348
348
349 self.idlineList.append(0)
349 self.idlineList.append(0)
350 self.__firsttime = False
350 self.__firsttime = False
351 return
351 return
352
352
353 self.__driver.pline(self.plot, x, y, xlabel=xlabel,
353 self.__driver.pline(self.plot, x, y, xlabel=xlabel,
354 ylabel=ylabel,
354 ylabel=ylabel,
355 title=title)
355 title=title)
356
356
357 def addpline(self, x, y, idline, **kwargs):
357 def addpline(self, x, y, idline, **kwargs):
358 lines = self.ax.lines
358 lines = self.ax.lines
359
359
360 if idline in self.idlineList:
360 if idline in self.idlineList:
361 self.__driver.set_linedata(self.ax, x, y, idline)
361 self.__driver.set_linedata(self.ax, x, y, idline)
362
362
363 if idline not in(self.idlineList):
363 if idline not in(self.idlineList):
364 self.__driver.addpline(self.ax, x, y, **kwargs)
364 self.__driver.addpline(self.ax, x, y, **kwargs)
365 self.idlineList.append(idline)
365 self.idlineList.append(idline)
366
366
367 return
367 return
368
368
369 def pmultiline(self, x, y,
369 def pmultiline(self, x, y,
370 xmin=None, xmax=None,
370 xmin=None, xmax=None,
371 ymin=None, ymax=None,
371 ymin=None, ymax=None,
372 xlabel='', ylabel='',
372 xlabel='', ylabel='',
373 title='',
373 title='',
374 **kwargs):
374 **kwargs):
375
375
376 if self.__firsttime:
376 if self.__firsttime:
377
377
378 if xmin == None: xmin = numpy.nanmin(x)
378 if xmin == None: xmin = numpy.nanmin(x)
379 if xmax == None: xmax = numpy.nanmax(x)
379 if xmax == None: xmax = numpy.nanmax(x)
380 if ymin == None: ymin = numpy.nanmin(y)
380 if ymin == None: ymin = numpy.nanmin(y)
381 if ymax == None: ymax = numpy.nanmax(y)
381 if ymax == None: ymax = numpy.nanmax(y)
382
382
383 self.plot = self.__driver.createPmultiline(self.ax, x, y,
383 self.plot = self.__driver.createPmultiline(self.ax, x, y,
384 xmin, xmax,
384 xmin, xmax,
385 ymin, ymax,
385 ymin, ymax,
386 xlabel=xlabel,
386 xlabel=xlabel,
387 ylabel=ylabel,
387 ylabel=ylabel,
388 title=title,
388 title=title,
389 **kwargs)
389 **kwargs)
390 self.__firsttime = False
390 self.__firsttime = False
391 return
391 return
392
392
393 self.__driver.pmultiline(self.plot, x, y, xlabel=xlabel,
393 self.__driver.pmultiline(self.plot, x, y, xlabel=xlabel,
394 ylabel=ylabel,
394 ylabel=ylabel,
395 title=title)
395 title=title)
396
396
397 def pmultilineyaxis(self, x, y,
397 def pmultilineyaxis(self, x, y,
398 xmin=None, xmax=None,
398 xmin=None, xmax=None,
399 ymin=None, ymax=None,
399 ymin=None, ymax=None,
400 xlabel='', ylabel='',
400 xlabel='', ylabel='',
401 title='',
401 title='',
402 **kwargs):
402 **kwargs):
403
403
404 if self.__firsttime:
404 if self.__firsttime:
405
405
406 if xmin == None: xmin = numpy.nanmin(x)
406 if xmin == None: xmin = numpy.nanmin(x)
407 if xmax == None: xmax = numpy.nanmax(x)
407 if xmax == None: xmax = numpy.nanmax(x)
408 if ymin == None: ymin = numpy.nanmin(y)
408 if ymin == None: ymin = numpy.nanmin(y)
409 if ymax == None: ymax = numpy.nanmax(y)
409 if ymax == None: ymax = numpy.nanmax(y)
410
410
411 self.plot = self.__driver.createPmultilineYAxis(self.ax, x, y,
411 self.plot = self.__driver.createPmultilineYAxis(self.ax, x, y,
412 xmin, xmax,
412 xmin, xmax,
413 ymin, ymax,
413 ymin, ymax,
414 xlabel=xlabel,
414 xlabel=xlabel,
415 ylabel=ylabel,
415 ylabel=ylabel,
416 title=title,
416 title=title,
417 **kwargs)
417 **kwargs)
418 if self.xmin == None: self.xmin = xmin
418 if self.xmin == None: self.xmin = xmin
419 if self.xmax == None: self.xmax = xmax
419 if self.xmax == None: self.xmax = xmax
420 if self.ymin == None: self.ymin = ymin
420 if self.ymin == None: self.ymin = ymin
421 if self.ymax == None: self.ymax = ymax
421 if self.ymax == None: self.ymax = ymax
422
422
423 self.__firsttime = False
423 self.__firsttime = False
424 return
424 return
425
425
426 self.__driver.pmultilineyaxis(self.plot, x, y, xlabel=xlabel,
426 self.__driver.pmultilineyaxis(self.plot, x, y, xlabel=xlabel,
427 ylabel=ylabel,
427 ylabel=ylabel,
428 title=title)
428 title=title)
429
429
430 def pcolor(self, x, y, z,
430 def pcolor(self, x, y, z,
431 xmin=None, xmax=None,
431 xmin=None, xmax=None,
432 ymin=None, ymax=None,
432 ymin=None, ymax=None,
433 zmin=None, zmax=None,
433 zmin=None, zmax=None,
434 xlabel='', ylabel='',
434 xlabel='', ylabel='',
435 title='', rti = False, colormap='jet',
435 title='', rti = False, colormap='jet',
436 **kwargs):
436 **kwargs):
437
437
438 """
438 """
439 Input:
439 Input:
440 x :
440 x :
441 y :
441 y :
442 x :
442 x :
443 xmin :
443 xmin :
444 xmax :
444 xmax :
445 ymin :
445 ymin :
446 ymax :
446 ymax :
447 zmin :
447 zmin :
448 zmax :
448 zmax :
449 xlabel :
449 xlabel :
450 ylabel :
450 ylabel :
451 title :
451 title :
452 **kwargs : Los parametros aceptados son
452 **kwargs : Los parametros aceptados son
453 ticksize=9,
453 ticksize=9,
454 cblabel=''
454 cblabel=''
455 rti = True or False
455 rti = True or False
456 """
456 """
457
457
458 if self.__firsttime:
458 if self.__firsttime:
459
459
460 if xmin == None: xmin = numpy.nanmin(x)
460 if xmin == None: xmin = numpy.nanmin(x)
461 if xmax == None: xmax = numpy.nanmax(x)
461 if xmax == None: xmax = numpy.nanmax(x)
462 if ymin == None: ymin = numpy.nanmin(y)
462 if ymin == None: ymin = numpy.nanmin(y)
463 if ymax == None: ymax = numpy.nanmax(y)
463 if ymax == None: ymax = numpy.nanmax(y)
464 if zmin == None: zmin = numpy.nanmin(z)
464 if zmin == None: zmin = numpy.nanmin(z)
465 if zmax == None: zmax = numpy.nanmax(z)
465 if zmax == None: zmax = numpy.nanmax(z)
466
466
467
467
468 self.plot = self.__driver.createPcolor(self.ax, x, y, z,
468 self.plot = self.__driver.createPcolor(self.ax, x, y, z,
469 xmin, xmax,
469 xmin, xmax,
470 ymin, ymax,
470 ymin, ymax,
471 zmin, zmax,
471 zmin, zmax,
472 xlabel=xlabel,
472 xlabel=xlabel,
473 ylabel=ylabel,
473 ylabel=ylabel,
474 title=title,
474 title=title,
475 colormap=colormap,
475 colormap=colormap,
476 **kwargs)
476 **kwargs)
477
477
478 if self.xmin == None: self.xmin = xmin
478 if self.xmin == None: self.xmin = xmin
479 if self.xmax == None: self.xmax = xmax
479 if self.xmax == None: self.xmax = xmax
480 if self.ymin == None: self.ymin = ymin
480 if self.ymin == None: self.ymin = ymin
481 if self.ymax == None: self.ymax = ymax
481 if self.ymax == None: self.ymax = ymax
482 if self.zmin == None: self.zmin = zmin
482 if self.zmin == None: self.zmin = zmin
483 if self.zmax == None: self.zmax = zmax
483 if self.zmax == None: self.zmax = zmax
484
484
485 self.__firsttime = False
485 self.__firsttime = False
486 return
486 return
487
487
488 if rti:
488 if rti:
489 self.__driver.addpcolor(self.ax, x, y, z, self.zmin, self.zmax,
489 self.__driver.addpcolor(self.ax, x, y, z, self.zmin, self.zmax,
490 xlabel=xlabel,
490 xlabel=xlabel,
491 ylabel=ylabel,
491 ylabel=ylabel,
492 title=title,
492 title=title,
493 colormap=colormap)
493 colormap=colormap)
494 return
494 return
495
495
496 self.__driver.pcolor(self.plot, z,
496 self.__driver.pcolor(self.plot, z,
497 xlabel=xlabel,
497 xlabel=xlabel,
498 ylabel=ylabel,
498 ylabel=ylabel,
499 title=title)
499 title=title)
500
500
501 def pcolorbuffer(self, x, y, z,
501 def pcolorbuffer(self, x, y, z,
502 xmin=None, xmax=None,
502 xmin=None, xmax=None,
503 ymin=None, ymax=None,
503 ymin=None, ymax=None,
504 zmin=None, zmax=None,
504 zmin=None, zmax=None,
505 xlabel='', ylabel='',
505 xlabel='', ylabel='',
506 title='', rti = True, colormap='jet',
506 title='', rti = True, colormap='jet',
507 maxNumX = None, maxNumY = None,
507 maxNumX = None, maxNumY = None,
508 **kwargs):
508 **kwargs):
509
509
510 if maxNumX == None:
510 if maxNumX == None:
511 maxNumX = self.__MAXNUMX
511 maxNumX = self.__MAXNUMX
512
512
513 if maxNumY == None:
513 if maxNumY == None:
514 maxNumY = self.__MAXNUMY
514 maxNumY = self.__MAXNUMY
515
515
516 if self.__firsttime:
516 if self.__firsttime:
517 self.z_buffer = z
517 self.z_buffer = z
518 self.x_buffer = numpy.hstack((self.x_buffer, x))
518 self.x_buffer = numpy.hstack((self.x_buffer, x))
519
519
520 if xmin == None: xmin = numpy.nanmin(x)
520 if xmin == None: xmin = numpy.nanmin(x)
521 if xmax == None: xmax = numpy.nanmax(x)
521 if xmax == None: xmax = numpy.nanmax(x)
522 if ymin == None: ymin = numpy.nanmin(y)
522 if ymin == None: ymin = numpy.nanmin(y)
523 if ymax == None: ymax = numpy.nanmax(y)
523 if ymax == None: ymax = numpy.nanmax(y)
524 if zmin == None: zmin = numpy.nanmin(z)
524 if zmin == None: zmin = numpy.nanmin(z)
525 if zmax == None: zmax = numpy.nanmax(z)
525 if zmax == None: zmax = numpy.nanmax(z)
526
526
527
527
528 self.plot = self.__driver.createPcolor(self.ax, self.x_buffer, y, z,
528 self.plot = self.__driver.createPcolor(self.ax, self.x_buffer, y, z,
529 xmin, xmax,
529 xmin, xmax,
530 ymin, ymax,
530 ymin, ymax,
531 zmin, zmax,
531 zmin, zmax,
532 xlabel=xlabel,
532 xlabel=xlabel,
533 ylabel=ylabel,
533 ylabel=ylabel,
534 title=title,
534 title=title,
535 colormap=colormap,
535 colormap=colormap,
536 **kwargs)
536 **kwargs)
537
537
538 if self.xmin == None: self.xmin = xmin
538 if self.xmin == None: self.xmin = xmin
539 if self.xmax == None: self.xmax = xmax
539 if self.xmax == None: self.xmax = xmax
540 if self.ymin == None: self.ymin = ymin
540 if self.ymin == None: self.ymin = ymin
541 if self.ymax == None: self.ymax = ymax
541 if self.ymax == None: self.ymax = ymax
542 if self.zmin == None: self.zmin = zmin
542 if self.zmin == None: self.zmin = zmin
543 if self.zmax == None: self.zmax = zmax
543 if self.zmax == None: self.zmax = zmax
544
544
545 self.__firsttime = False
545 self.__firsttime = False
546 return
546 return
547
547
548 self.x_buffer = numpy.hstack((self.x_buffer, x[-1]))
548 self.x_buffer = numpy.hstack((self.x_buffer, x[-1]))
549 self.z_buffer = numpy.hstack((self.z_buffer, z))
549 self.z_buffer = numpy.hstack((self.z_buffer, z))
550
550
551 if self.decimationx == None:
551 if self.decimationx == None:
552 deltax = float(self.xmax - self.xmin)/maxNumX
552 deltax = float(self.xmax - self.xmin)/maxNumX
553 deltay = float(self.ymax - self.ymin)/maxNumY
553 deltay = float(self.ymax - self.ymin)/maxNumY
554
554
555 resolutionx = self.x_buffer[2]-self.x_buffer[0]
555 resolutionx = self.x_buffer[2]-self.x_buffer[0]
556 resolutiony = y[1]-y[0]
556 resolutiony = y[1]-y[0]
557
557
558 self.decimationx = numpy.ceil(deltax / resolutionx)
558 self.decimationx = numpy.ceil(deltax / resolutionx)
559 self.decimationy = numpy.ceil(deltay / resolutiony)
559 self.decimationy = numpy.ceil(deltay / resolutiony)
560
560
561 z_buffer = self.z_buffer.reshape(-1,len(y))
561 z_buffer = self.z_buffer.reshape(-1,len(y))
562
562
563 x_buffer = self.x_buffer[::self.decimationx]
563 x_buffer = self.x_buffer[::self.decimationx]
564 y_buffer = y[::self.decimationy]
564 y_buffer = y[::self.decimationy]
565 z_buffer = z_buffer[::self.decimationx, ::self.decimationy]
565 z_buffer = z_buffer[::self.decimationx, ::self.decimationy]
566 #===================================================
566 #===================================================
567
567
568 x_buffer, y_buffer, z_buffer = self.__fillGaps(x_buffer, y_buffer, z_buffer)
568 x_buffer, y_buffer, z_buffer = self.__fillGaps(x_buffer, y_buffer, z_buffer)
569
569
570 self.__driver.addpcolorbuffer(self.ax, x_buffer, y_buffer, z_buffer, self.zmin, self.zmax,
570 self.__driver.addpcolorbuffer(self.ax, x_buffer, y_buffer, z_buffer, self.zmin, self.zmax,
571 xlabel=xlabel,
571 xlabel=xlabel,
572 ylabel=ylabel,
572 ylabel=ylabel,
573 title=title,
573 title=title,
574 colormap=colormap)
574 colormap=colormap)
575
576 def polar(self, x, y,
577 title='', xlabel='',ylabel='',**kwargs):
578
579 if self.__firsttime:
580 self.plot = self.__driver.createPolar(self.ax, x, y, title = title, xlabel = xlabel, ylabel = ylabel)
581 self.__firsttime = False
582 self.x_buffer = x
583 self.y_buffer = y
584 return
585
586 self.x_buffer = numpy.hstack((self.x_buffer,x))
587 self.y_buffer = numpy.hstack((self.y_buffer,y))
588 self.__driver.polar(self.plot, self.x_buffer, self.y_buffer, xlabel=xlabel,
589 ylabel=ylabel,
590 title=title)
591
575 def __fillGaps(self, x_buffer, y_buffer, z_buffer):
592 def __fillGaps(self, x_buffer, y_buffer, z_buffer):
576
593
577 deltas = x_buffer[1:] - x_buffer[0:-1]
594 deltas = x_buffer[1:] - x_buffer[0:-1]
578 x_median = numpy.median(deltas)
595 x_median = numpy.median(deltas)
579
596
580 index = numpy.where(deltas >= 2*x_median)
597 index = numpy.where(deltas >= 2*x_median)
581
598
582 if len(index[0]) != 0:
599 if len(index[0]) != 0:
583 z_buffer[index[0],::] = self.__missing
600 z_buffer[index[0],::] = self.__missing
584 z_buffer = numpy.ma.masked_inside(z_buffer,0.99*self.__missing,1.01*self.__missing)
601 z_buffer = numpy.ma.masked_inside(z_buffer,0.99*self.__missing,1.01*self.__missing)
585
602
586 return x_buffer, y_buffer, z_buffer
603 return x_buffer, y_buffer, z_buffer
587
604
588
605
589
606
590 No newline at end of file
607
@@ -1,3 +1,5
1 from jroplot_voltage import *
1 from jroplot_voltage import *
2 from jroplot_spectra import *
2 from jroplot_spectra import *
3 from jroplot_heispectra import *
3 from jroplot_heispectra import *
4 from jroplot_correlation import *
5 from jroplot_parameters import * No newline at end of file
@@ -1,1357 +1,1357
1 '''
1 '''
2 @author: Daniel Suarez
2 @author: Daniel Suarez
3 '''
3 '''
4 import os
4 import os
5 import datetime
5 import datetime
6 import numpy
6 import numpy
7
7
8 from figure import Figure, isRealtime
8 from figure import Figure, isRealtime
9
9
10 class SpectraPlot(Figure):
10 class SpectraPlot(Figure):
11
11
12 isConfig = None
12 isConfig = None
13 __nsubplots = None
13 __nsubplots = None
14
14
15 WIDTHPROF = None
15 WIDTHPROF = None
16 HEIGHTPROF = None
16 HEIGHTPROF = None
17 PREFIX = 'spc'
17 PREFIX = 'spc'
18
18
19 def __init__(self):
19 def __init__(self):
20
20
21 self.isConfig = False
21 self.isConfig = False
22 self.__nsubplots = 1
22 self.__nsubplots = 1
23
23
24 self.WIDTH = 280
24 self.WIDTH = 280
25 self.HEIGHT = 250
25 self.HEIGHT = 250
26 self.WIDTHPROF = 120
26 self.WIDTHPROF = 120
27 self.HEIGHTPROF = 0
27 self.HEIGHTPROF = 0
28 self.counter_imagwr = 0
28 self.counter_imagwr = 0
29
29
30 self.PLOT_CODE = 1
30 self.PLOT_CODE = 1
31 self.FTP_WEI = None
31 self.FTP_WEI = None
32 self.EXP_CODE = None
32 self.EXP_CODE = None
33 self.SUB_EXP_CODE = None
33 self.SUB_EXP_CODE = None
34 self.PLOT_POS = None
34 self.PLOT_POS = None
35
35
36 def getSubplots(self):
36 def getSubplots(self):
37
37
38 ncol = int(numpy.sqrt(self.nplots)+0.9)
38 ncol = int(numpy.sqrt(self.nplots)+0.9)
39 nrow = int(self.nplots*1./ncol + 0.9)
39 nrow = int(self.nplots*1./ncol + 0.9)
40
40
41 return nrow, ncol
41 return nrow, ncol
42
42
43 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
43 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
44
44
45 self.__showprofile = showprofile
45 self.__showprofile = showprofile
46 self.nplots = nplots
46 self.nplots = nplots
47
47
48 ncolspan = 1
48 ncolspan = 1
49 colspan = 1
49 colspan = 1
50 if showprofile:
50 if showprofile:
51 ncolspan = 3
51 ncolspan = 3
52 colspan = 2
52 colspan = 2
53 self.__nsubplots = 2
53 self.__nsubplots = 2
54
54
55 self.createFigure(id = id,
55 self.createFigure(id = id,
56 wintitle = wintitle,
56 wintitle = wintitle,
57 widthplot = self.WIDTH + self.WIDTHPROF,
57 widthplot = self.WIDTH + self.WIDTHPROF,
58 heightplot = self.HEIGHT + self.HEIGHTPROF,
58 heightplot = self.HEIGHT + self.HEIGHTPROF,
59 show=show)
59 show=show)
60
60
61 nrow, ncol = self.getSubplots()
61 nrow, ncol = self.getSubplots()
62
62
63 counter = 0
63 counter = 0
64 for y in range(nrow):
64 for y in range(nrow):
65 for x in range(ncol):
65 for x in range(ncol):
66
66
67 if counter >= self.nplots:
67 if counter >= self.nplots:
68 break
68 break
69
69
70 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
70 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
71
71
72 if showprofile:
72 if showprofile:
73 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan+colspan, 1, 1)
73 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan+colspan, 1, 1)
74
74
75 counter += 1
75 counter += 1
76
76
77 def run(self, dataOut, id, wintitle="", channelList=None, showprofile=True,
77 def run(self, dataOut, id, wintitle="", channelList=None, showprofile=True,
78 xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None,
78 xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None,
79 save=False, figpath='', figfile=None, show=True, ftp=False, wr_period=1,
79 save=False, figpath='', figfile=None, show=True, ftp=False, wr_period=1,
80 server=None, folder=None, username=None, password=None,
80 server=None, folder=None, username=None, password=None,
81 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, realtime=False):
81 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, realtime=False):
82
82
83 """
83 """
84
84
85 Input:
85 Input:
86 dataOut :
86 dataOut :
87 id :
87 id :
88 wintitle :
88 wintitle :
89 channelList :
89 channelList :
90 showProfile :
90 showProfile :
91 xmin : None,
91 xmin : None,
92 xmax : None,
92 xmax : None,
93 ymin : None,
93 ymin : None,
94 ymax : None,
94 ymax : None,
95 zmin : None,
95 zmin : None,
96 zmax : None
96 zmax : None
97 """
97 """
98
98
99 if dataOut.flagNoData:
99 if dataOut.flagNoData:
100 return None
100 return None
101
101
102 if realtime:
102 if realtime:
103 if not(isRealtime(utcdatatime = dataOut.utctime)):
103 if not(isRealtime(utcdatatime = dataOut.utctime)):
104 print 'Skipping this plot function'
104 print 'Skipping this plot function'
105 return
105 return
106
106
107 if channelList == None:
107 if channelList == None:
108 channelIndexList = dataOut.channelIndexList
108 channelIndexList = dataOut.channelIndexList
109 else:
109 else:
110 channelIndexList = []
110 channelIndexList = []
111 for channel in channelList:
111 for channel in channelList:
112 if channel not in dataOut.channelList:
112 if channel not in dataOut.channelList:
113 raise ValueError, "Channel %d is not in dataOut.channelList"
113 raise ValueError, "Channel %d is not in dataOut.channelList"
114 channelIndexList.append(dataOut.channelList.index(channel))
114 channelIndexList.append(dataOut.channelList.index(channel))
115
115
116 factor = dataOut.normFactor
116 factor = dataOut.normFactor
117
117
118 x = dataOut.getVelRange(1)
118 x = dataOut.getVelRange(1)
119 y = dataOut.getHeiRange()
119 y = dataOut.getHeiRange()
120
120
121 z = dataOut.data_spc[channelIndexList,:,:]/factor
121 z = dataOut.data_spc[channelIndexList,:,:]/factor
122 z = numpy.where(numpy.isfinite(z), z, numpy.NAN)
122 z = numpy.where(numpy.isfinite(z), z, numpy.NAN)
123 avg = numpy.average(z, axis=1)
123 avg = numpy.average(z, axis=1)
124 avg = numpy.nanmean(z, axis=1)
124 #avg = numpy.nanmean(z, axis=1)
125 noise = dataOut.noise/factor
125 noise = dataOut.noise/factor
126
126
127 zdB = 10*numpy.log10(z)
127 zdB = 10*numpy.log10(z)
128 avgdB = 10*numpy.log10(avg)
128 avgdB = 10*numpy.log10(avg)
129 noisedB = 10*numpy.log10(noise)
129 noisedB = 10*numpy.log10(noise)
130
130
131 #thisDatetime = dataOut.datatime
131 #thisDatetime = dataOut.datatime
132 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[1])
132 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[1])
133 title = wintitle + " Spectra"
133 title = wintitle + " Spectra"
134 if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)):
134 if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)):
135 title = title + '_' + 'azimuth,zenith=%2.2f,%2.2f'%(dataOut.azimuth, dataOut.zenith)
135 title = title + '_' + 'azimuth,zenith=%2.2f,%2.2f'%(dataOut.azimuth, dataOut.zenith)
136
136
137 xlabel = "Velocity (m/s)"
137 xlabel = "Velocity (m/s)"
138 ylabel = "Range (Km)"
138 ylabel = "Range (Km)"
139
139
140 if not self.isConfig:
140 if not self.isConfig:
141
141
142 nplots = len(channelIndexList)
142 nplots = len(channelIndexList)
143
143
144 self.setup(id=id,
144 self.setup(id=id,
145 nplots=nplots,
145 nplots=nplots,
146 wintitle=wintitle,
146 wintitle=wintitle,
147 showprofile=showprofile,
147 showprofile=showprofile,
148 show=show)
148 show=show)
149
149
150 if xmin == None: xmin = numpy.nanmin(x)
150 if xmin == None: xmin = numpy.nanmin(x)
151 if xmax == None: xmax = numpy.nanmax(x)
151 if xmax == None: xmax = numpy.nanmax(x)
152 if ymin == None: ymin = numpy.nanmin(y)
152 if ymin == None: ymin = numpy.nanmin(y)
153 if ymax == None: ymax = numpy.nanmax(y)
153 if ymax == None: ymax = numpy.nanmax(y)
154 if zmin == None: zmin = numpy.nanmin(avgdB)*0.9
154 if zmin == None: zmin = numpy.nanmin(avgdB)*0.9
155 if zmax == None: zmax = numpy.nanmax(avgdB)*0.9
155 if zmax == None: zmax = numpy.nanmax(avgdB)*0.9
156
156
157 self.FTP_WEI = ftp_wei
157 self.FTP_WEI = ftp_wei
158 self.EXP_CODE = exp_code
158 self.EXP_CODE = exp_code
159 self.SUB_EXP_CODE = sub_exp_code
159 self.SUB_EXP_CODE = sub_exp_code
160 self.PLOT_POS = plot_pos
160 self.PLOT_POS = plot_pos
161
161
162 self.isConfig = True
162 self.isConfig = True
163
163
164 self.setWinTitle(title)
164 self.setWinTitle(title)
165
165
166 for i in range(self.nplots):
166 for i in range(self.nplots):
167 str_datetime = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S"))
167 str_datetime = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S"))
168 title = "Channel %d: %4.2fdB: %s" %(dataOut.channelList[i]+1, noisedB[i], str_datetime)
168 title = "Channel %d: %4.2fdB: %s" %(dataOut.channelList[i]+1, noisedB[i], str_datetime)
169 if len(dataOut.beam.codeList) != 0:
169 if len(dataOut.beam.codeList) != 0:
170 title = "Ch%d:%4.2fdB,%2.2f,%2.2f:%s" %(dataOut.channelList[i]+1, noisedB[i], dataOut.beam.azimuthList[i], dataOut.beam.zenithList[i], str_datetime)
170 title = "Ch%d:%4.2fdB,%2.2f,%2.2f:%s" %(dataOut.channelList[i]+1, noisedB[i], dataOut.beam.azimuthList[i], dataOut.beam.zenithList[i], str_datetime)
171
171
172 axes = self.axesList[i*self.__nsubplots]
172 axes = self.axesList[i*self.__nsubplots]
173 axes.pcolor(x, y, zdB[i,:,:],
173 axes.pcolor(x, y, zdB[i,:,:],
174 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
174 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
175 xlabel=xlabel, ylabel=ylabel, title=title,
175 xlabel=xlabel, ylabel=ylabel, title=title,
176 ticksize=9, cblabel='')
176 ticksize=9, cblabel='')
177
177
178 if self.__showprofile:
178 if self.__showprofile:
179 axes = self.axesList[i*self.__nsubplots +1]
179 axes = self.axesList[i*self.__nsubplots +1]
180 axes.pline(avgdB[i], y,
180 axes.pline(avgdB[i], y,
181 xmin=zmin, xmax=zmax, ymin=ymin, ymax=ymax,
181 xmin=zmin, xmax=zmax, ymin=ymin, ymax=ymax,
182 xlabel='dB', ylabel='', title='',
182 xlabel='dB', ylabel='', title='',
183 ytick_visible=False,
183 ytick_visible=False,
184 grid='x')
184 grid='x')
185
185
186 noiseline = numpy.repeat(noisedB[i], len(y))
186 noiseline = numpy.repeat(noisedB[i], len(y))
187 axes.addpline(noiseline, y, idline=1, color="black", linestyle="dashed", lw=2)
187 axes.addpline(noiseline, y, idline=1, color="black", linestyle="dashed", lw=2)
188
188
189 self.draw()
189 self.draw()
190
190
191 if figfile == None:
191 if figfile == None:
192 str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S")
192 str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S")
193 figfile = self.getFilename(name = str_datetime)
193 figfile = self.getFilename(name = str_datetime)
194 name = str_datetime
194 name = str_datetime
195 if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)):
195 if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)):
196 name = name + '_az' + '_%2.2f'%(dataOut.azimuth) + '_zn' + '_%2.2f'%(dataOut.zenith)
196 name = name + '_az' + '_%2.2f'%(dataOut.azimuth) + '_zn' + '_%2.2f'%(dataOut.zenith)
197 figfile = self.getFilename(name)
197 figfile = self.getFilename(name)
198 if figpath != '':
198 if figpath != '':
199 self.counter_imagwr += 1
199 self.counter_imagwr += 1
200 if (self.counter_imagwr>=wr_period):
200 if (self.counter_imagwr>=wr_period):
201 # store png plot to local folder
201 # store png plot to local folder
202 self.saveFigure(figpath, figfile)
202 self.saveFigure(figpath, figfile)
203 # store png plot to FTP server according to RT-Web format
203 # store png plot to FTP server according to RT-Web format
204 name = self.getNameToFtp(thisDatetime, self.FTP_WEI, self.EXP_CODE, self.SUB_EXP_CODE, self.PLOT_CODE, self.PLOT_POS)
204 name = self.getNameToFtp(thisDatetime, self.FTP_WEI, self.EXP_CODE, self.SUB_EXP_CODE, self.PLOT_CODE, self.PLOT_POS)
205 ftp_filename = os.path.join(figpath, name)
205 ftp_filename = os.path.join(figpath, name)
206 self.saveFigure(figpath, ftp_filename)
206 self.saveFigure(figpath, ftp_filename)
207 self.counter_imagwr = 0
207 self.counter_imagwr = 0
208
208
209
209
210 class CrossSpectraPlot(Figure):
210 class CrossSpectraPlot(Figure):
211
211
212 isConfig = None
212 isConfig = None
213 __nsubplots = None
213 __nsubplots = None
214
214
215 WIDTH = None
215 WIDTH = None
216 HEIGHT = None
216 HEIGHT = None
217 WIDTHPROF = None
217 WIDTHPROF = None
218 HEIGHTPROF = None
218 HEIGHTPROF = None
219 PREFIX = 'cspc'
219 PREFIX = 'cspc'
220
220
221 def __init__(self):
221 def __init__(self):
222
222
223 self.isConfig = False
223 self.isConfig = False
224 self.__nsubplots = 4
224 self.__nsubplots = 4
225 self.counter_imagwr = 0
225 self.counter_imagwr = 0
226 self.WIDTH = 250
226 self.WIDTH = 250
227 self.HEIGHT = 250
227 self.HEIGHT = 250
228 self.WIDTHPROF = 0
228 self.WIDTHPROF = 0
229 self.HEIGHTPROF = 0
229 self.HEIGHTPROF = 0
230
230
231 self.PLOT_CODE = 1
231 self.PLOT_CODE = 1
232 self.FTP_WEI = None
232 self.FTP_WEI = None
233 self.EXP_CODE = None
233 self.EXP_CODE = None
234 self.SUB_EXP_CODE = None
234 self.SUB_EXP_CODE = None
235 self.PLOT_POS = None
235 self.PLOT_POS = None
236
236
237 def getSubplots(self):
237 def getSubplots(self):
238
238
239 ncol = 4
239 ncol = 4
240 nrow = self.nplots
240 nrow = self.nplots
241
241
242 return nrow, ncol
242 return nrow, ncol
243
243
244 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
244 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
245
245
246 self.__showprofile = showprofile
246 self.__showprofile = showprofile
247 self.nplots = nplots
247 self.nplots = nplots
248
248
249 ncolspan = 1
249 ncolspan = 1
250 colspan = 1
250 colspan = 1
251
251
252 self.createFigure(id = id,
252 self.createFigure(id = id,
253 wintitle = wintitle,
253 wintitle = wintitle,
254 widthplot = self.WIDTH + self.WIDTHPROF,
254 widthplot = self.WIDTH + self.WIDTHPROF,
255 heightplot = self.HEIGHT + self.HEIGHTPROF,
255 heightplot = self.HEIGHT + self.HEIGHTPROF,
256 show=True)
256 show=True)
257
257
258 nrow, ncol = self.getSubplots()
258 nrow, ncol = self.getSubplots()
259
259
260 counter = 0
260 counter = 0
261 for y in range(nrow):
261 for y in range(nrow):
262 for x in range(ncol):
262 for x in range(ncol):
263 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
263 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
264
264
265 counter += 1
265 counter += 1
266
266
267 def run(self, dataOut, id, wintitle="", pairsList=None,
267 def run(self, dataOut, id, wintitle="", pairsList=None,
268 xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None,
268 xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None,
269 save=False, figpath='', figfile=None, ftp=False, wr_period=1,
269 save=False, figpath='', figfile=None, ftp=False, wr_period=1,
270 power_cmap='jet', coherence_cmap='jet', phase_cmap='RdBu_r', show=True,
270 power_cmap='jet', coherence_cmap='jet', phase_cmap='RdBu_r', show=True,
271 server=None, folder=None, username=None, password=None,
271 server=None, folder=None, username=None, password=None,
272 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0):
272 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0):
273
273
274 """
274 """
275
275
276 Input:
276 Input:
277 dataOut :
277 dataOut :
278 id :
278 id :
279 wintitle :
279 wintitle :
280 channelList :
280 channelList :
281 showProfile :
281 showProfile :
282 xmin : None,
282 xmin : None,
283 xmax : None,
283 xmax : None,
284 ymin : None,
284 ymin : None,
285 ymax : None,
285 ymax : None,
286 zmin : None,
286 zmin : None,
287 zmax : None
287 zmax : None
288 """
288 """
289
289
290 if pairsList == None:
290 if pairsList == None:
291 pairsIndexList = dataOut.pairsIndexList
291 pairsIndexList = dataOut.pairsIndexList
292 else:
292 else:
293 pairsIndexList = []
293 pairsIndexList = []
294 for pair in pairsList:
294 for pair in pairsList:
295 if pair not in dataOut.pairsList:
295 if pair not in dataOut.pairsList:
296 raise ValueError, "Pair %s is not in dataOut.pairsList" %(pair)
296 raise ValueError, "Pair %s is not in dataOut.pairsList" %(pair)
297 pairsIndexList.append(dataOut.pairsList.index(pair))
297 pairsIndexList.append(dataOut.pairsList.index(pair))
298
298
299 if pairsIndexList == []:
299 if pairsIndexList == []:
300 return
300 return
301
301
302 if len(pairsIndexList) > 4:
302 if len(pairsIndexList) > 4:
303 pairsIndexList = pairsIndexList[0:4]
303 pairsIndexList = pairsIndexList[0:4]
304 factor = dataOut.normFactor
304 factor = dataOut.normFactor
305 x = dataOut.getVelRange(1)
305 x = dataOut.getVelRange(1)
306 y = dataOut.getHeiRange()
306 y = dataOut.getHeiRange()
307 z = dataOut.data_spc[:,:,:]/factor
307 z = dataOut.data_spc[:,:,:]/factor
308 # z = numpy.where(numpy.isfinite(z), z, numpy.NAN)
308 # z = numpy.where(numpy.isfinite(z), z, numpy.NAN)
309 avg = numpy.abs(numpy.average(z, axis=1))
309 avg = numpy.abs(numpy.average(z, axis=1))
310 noise = dataOut.noise()/factor
310 noise = dataOut.noise()/factor
311
311
312 zdB = 10*numpy.log10(z)
312 zdB = 10*numpy.log10(z)
313 avgdB = 10*numpy.log10(avg)
313 avgdB = 10*numpy.log10(avg)
314 noisedB = 10*numpy.log10(noise)
314 noisedB = 10*numpy.log10(noise)
315
315
316
316
317 #thisDatetime = dataOut.datatime
317 #thisDatetime = dataOut.datatime
318 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[1])
318 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[1])
319 title = wintitle + " Cross-Spectra: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S"))
319 title = wintitle + " Cross-Spectra: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S"))
320 xlabel = "Velocity (m/s)"
320 xlabel = "Velocity (m/s)"
321 ylabel = "Range (Km)"
321 ylabel = "Range (Km)"
322
322
323 if not self.isConfig:
323 if not self.isConfig:
324
324
325 nplots = len(pairsIndexList)
325 nplots = len(pairsIndexList)
326
326
327 self.setup(id=id,
327 self.setup(id=id,
328 nplots=nplots,
328 nplots=nplots,
329 wintitle=wintitle,
329 wintitle=wintitle,
330 showprofile=False,
330 showprofile=False,
331 show=show)
331 show=show)
332
332
333 if xmin == None: xmin = numpy.nanmin(x)
333 if xmin == None: xmin = numpy.nanmin(x)
334 if xmax == None: xmax = numpy.nanmax(x)
334 if xmax == None: xmax = numpy.nanmax(x)
335 if ymin == None: ymin = numpy.nanmin(y)
335 if ymin == None: ymin = numpy.nanmin(y)
336 if ymax == None: ymax = numpy.nanmax(y)
336 if ymax == None: ymax = numpy.nanmax(y)
337 if zmin == None: zmin = numpy.nanmin(avgdB)*0.9
337 if zmin == None: zmin = numpy.nanmin(avgdB)*0.9
338 if zmax == None: zmax = numpy.nanmax(avgdB)*0.9
338 if zmax == None: zmax = numpy.nanmax(avgdB)*0.9
339
339
340 self.FTP_WEI = ftp_wei
340 self.FTP_WEI = ftp_wei
341 self.EXP_CODE = exp_code
341 self.EXP_CODE = exp_code
342 self.SUB_EXP_CODE = sub_exp_code
342 self.SUB_EXP_CODE = sub_exp_code
343 self.PLOT_POS = plot_pos
343 self.PLOT_POS = plot_pos
344
344
345 self.isConfig = True
345 self.isConfig = True
346
346
347 self.setWinTitle(title)
347 self.setWinTitle(title)
348
348
349 for i in range(self.nplots):
349 for i in range(self.nplots):
350 pair = dataOut.pairsList[pairsIndexList[i]]
350 pair = dataOut.pairsList[pairsIndexList[i]]
351 str_datetime = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S"))
351 str_datetime = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S"))
352 title = "Ch%d: %4.2fdB: %s" %(pair[0], noisedB[pair[0]], str_datetime)
352 title = "Ch%d: %4.2fdB: %s" %(pair[0], noisedB[pair[0]], str_datetime)
353 zdB = 10.*numpy.log10(dataOut.data_spc[pair[0],:,:]/factor)
353 zdB = 10.*numpy.log10(dataOut.data_spc[pair[0],:,:]/factor)
354 axes0 = self.axesList[i*self.__nsubplots]
354 axes0 = self.axesList[i*self.__nsubplots]
355 axes0.pcolor(x, y, zdB,
355 axes0.pcolor(x, y, zdB,
356 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
356 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
357 xlabel=xlabel, ylabel=ylabel, title=title,
357 xlabel=xlabel, ylabel=ylabel, title=title,
358 ticksize=9, colormap=power_cmap, cblabel='')
358 ticksize=9, colormap=power_cmap, cblabel='')
359
359
360 title = "Ch%d: %4.2fdB: %s" %(pair[1], noisedB[pair[1]], str_datetime)
360 title = "Ch%d: %4.2fdB: %s" %(pair[1], noisedB[pair[1]], str_datetime)
361 zdB = 10.*numpy.log10(dataOut.data_spc[pair[1],:,:]/factor)
361 zdB = 10.*numpy.log10(dataOut.data_spc[pair[1],:,:]/factor)
362 axes0 = self.axesList[i*self.__nsubplots+1]
362 axes0 = self.axesList[i*self.__nsubplots+1]
363 axes0.pcolor(x, y, zdB,
363 axes0.pcolor(x, y, zdB,
364 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
364 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
365 xlabel=xlabel, ylabel=ylabel, title=title,
365 xlabel=xlabel, ylabel=ylabel, title=title,
366 ticksize=9, colormap=power_cmap, cblabel='')
366 ticksize=9, colormap=power_cmap, cblabel='')
367
367
368 coherenceComplex = dataOut.data_cspc[pairsIndexList[i],:,:]/numpy.sqrt(dataOut.data_spc[pair[0],:,:]*dataOut.data_spc[pair[1],:,:])
368 coherenceComplex = dataOut.data_cspc[pairsIndexList[i],:,:]/numpy.sqrt(dataOut.data_spc[pair[0],:,:]*dataOut.data_spc[pair[1],:,:])
369 coherence = numpy.abs(coherenceComplex)
369 coherence = numpy.abs(coherenceComplex)
370 # phase = numpy.arctan(-1*coherenceComplex.imag/coherenceComplex.real)*180/numpy.pi
370 # phase = numpy.arctan(-1*coherenceComplex.imag/coherenceComplex.real)*180/numpy.pi
371 phase = numpy.arctan2(coherenceComplex.imag, coherenceComplex.real)*180/numpy.pi
371 phase = numpy.arctan2(coherenceComplex.imag, coherenceComplex.real)*180/numpy.pi
372
372
373 title = "Coherence %d%d" %(pair[0], pair[1])
373 title = "Coherence %d%d" %(pair[0], pair[1])
374 axes0 = self.axesList[i*self.__nsubplots+2]
374 axes0 = self.axesList[i*self.__nsubplots+2]
375 axes0.pcolor(x, y, coherence,
375 axes0.pcolor(x, y, coherence,
376 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=0, zmax=1,
376 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=0, zmax=1,
377 xlabel=xlabel, ylabel=ylabel, title=title,
377 xlabel=xlabel, ylabel=ylabel, title=title,
378 ticksize=9, colormap=coherence_cmap, cblabel='')
378 ticksize=9, colormap=coherence_cmap, cblabel='')
379
379
380 title = "Phase %d%d" %(pair[0], pair[1])
380 title = "Phase %d%d" %(pair[0], pair[1])
381 axes0 = self.axesList[i*self.__nsubplots+3]
381 axes0 = self.axesList[i*self.__nsubplots+3]
382 axes0.pcolor(x, y, phase,
382 axes0.pcolor(x, y, phase,
383 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=-180, zmax=180,
383 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=-180, zmax=180,
384 xlabel=xlabel, ylabel=ylabel, title=title,
384 xlabel=xlabel, ylabel=ylabel, title=title,
385 ticksize=9, colormap=phase_cmap, cblabel='')
385 ticksize=9, colormap=phase_cmap, cblabel='')
386
386
387
387
388
388
389 self.draw()
389 self.draw()
390
390
391 if figfile == None:
391 if figfile == None:
392 str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S")
392 str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S")
393 figfile = self.getFilename(name = str_datetime)
393 figfile = self.getFilename(name = str_datetime)
394
394
395 if figpath != '':
395 if figpath != '':
396 self.counter_imagwr += 1
396 self.counter_imagwr += 1
397 if (self.counter_imagwr>=wr_period):
397 if (self.counter_imagwr>=wr_period):
398 # store png plot to local folder
398 # store png plot to local folder
399 self.saveFigure(figpath, figfile)
399 self.saveFigure(figpath, figfile)
400 # store png plot to FTP server according to RT-Web format
400 # store png plot to FTP server according to RT-Web format
401 name = self.getNameToFtp(thisDatetime, self.FTP_WEI, self.EXP_CODE, self.SUB_EXP_CODE, self.PLOT_CODE, self.PLOT_POS)
401 name = self.getNameToFtp(thisDatetime, self.FTP_WEI, self.EXP_CODE, self.SUB_EXP_CODE, self.PLOT_CODE, self.PLOT_POS)
402 ftp_filename = os.path.join(figpath, name)
402 ftp_filename = os.path.join(figpath, name)
403 self.saveFigure(figpath, ftp_filename)
403 self.saveFigure(figpath, ftp_filename)
404 self.counter_imagwr = 0
404 self.counter_imagwr = 0
405
405
406
406
407 class RTIPlot(Figure):
407 class RTIPlot(Figure):
408
408
409 isConfig = None
409 isConfig = None
410 __nsubplots = None
410 __nsubplots = None
411
411
412 WIDTHPROF = None
412 WIDTHPROF = None
413 HEIGHTPROF = None
413 HEIGHTPROF = None
414 PREFIX = 'rti'
414 PREFIX = 'rti'
415
415
416 def __init__(self):
416 def __init__(self):
417
417
418 self.timerange = 2*60*60
418 self.timerange = 2*60*60
419 self.isConfig = False
419 self.isConfig = False
420 self.__nsubplots = 1
420 self.__nsubplots = 1
421
421
422 self.WIDTH = 800
422 self.WIDTH = 800
423 self.HEIGHT = 150
423 self.HEIGHT = 150
424 self.WIDTHPROF = 120
424 self.WIDTHPROF = 120
425 self.HEIGHTPROF = 0
425 self.HEIGHTPROF = 0
426 self.counter_imagwr = 0
426 self.counter_imagwr = 0
427
427
428 self.PLOT_CODE = 0
428 self.PLOT_CODE = 0
429 self.FTP_WEI = None
429 self.FTP_WEI = None
430 self.EXP_CODE = None
430 self.EXP_CODE = None
431 self.SUB_EXP_CODE = None
431 self.SUB_EXP_CODE = None
432 self.PLOT_POS = None
432 self.PLOT_POS = None
433 self.tmin = None
433 self.tmin = None
434 self.tmax = None
434 self.tmax = None
435
435
436 self.xmin = None
436 self.xmin = None
437 self.xmax = None
437 self.xmax = None
438
438
439 self.figfile = None
439 self.figfile = None
440
440
441 def getSubplots(self):
441 def getSubplots(self):
442
442
443 ncol = 1
443 ncol = 1
444 nrow = self.nplots
444 nrow = self.nplots
445
445
446 return nrow, ncol
446 return nrow, ncol
447
447
448 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
448 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
449
449
450 self.__showprofile = showprofile
450 self.__showprofile = showprofile
451 self.nplots = nplots
451 self.nplots = nplots
452
452
453 ncolspan = 1
453 ncolspan = 1
454 colspan = 1
454 colspan = 1
455 if showprofile:
455 if showprofile:
456 ncolspan = 7
456 ncolspan = 7
457 colspan = 6
457 colspan = 6
458 self.__nsubplots = 2
458 self.__nsubplots = 2
459
459
460 self.createFigure(id = id,
460 self.createFigure(id = id,
461 wintitle = wintitle,
461 wintitle = wintitle,
462 widthplot = self.WIDTH + self.WIDTHPROF,
462 widthplot = self.WIDTH + self.WIDTHPROF,
463 heightplot = self.HEIGHT + self.HEIGHTPROF,
463 heightplot = self.HEIGHT + self.HEIGHTPROF,
464 show=show)
464 show=show)
465
465
466 nrow, ncol = self.getSubplots()
466 nrow, ncol = self.getSubplots()
467
467
468 counter = 0
468 counter = 0
469 for y in range(nrow):
469 for y in range(nrow):
470 for x in range(ncol):
470 for x in range(ncol):
471
471
472 if counter >= self.nplots:
472 if counter >= self.nplots:
473 break
473 break
474
474
475 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
475 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
476
476
477 if showprofile:
477 if showprofile:
478 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan+colspan, 1, 1)
478 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan+colspan, 1, 1)
479
479
480 counter += 1
480 counter += 1
481
481
482 def run(self, dataOut, id, wintitle="", channelList=None, showprofile='True',
482 def run(self, dataOut, id, wintitle="", channelList=None, showprofile='True',
483 xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None,
483 xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None,
484 timerange=None,
484 timerange=None,
485 save=False, figpath='', lastone=0,figfile=None, ftp=False, wr_period=1, show=True,
485 save=False, figpath='', lastone=0,figfile=None, ftp=False, wr_period=1, show=True,
486 server=None, folder=None, username=None, password=None,
486 server=None, folder=None, username=None, password=None,
487 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0):
487 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0):
488
488
489 """
489 """
490
490
491 Input:
491 Input:
492 dataOut :
492 dataOut :
493 id :
493 id :
494 wintitle :
494 wintitle :
495 channelList :
495 channelList :
496 showProfile :
496 showProfile :
497 xmin : None,
497 xmin : None,
498 xmax : None,
498 xmax : None,
499 ymin : None,
499 ymin : None,
500 ymax : None,
500 ymax : None,
501 zmin : None,
501 zmin : None,
502 zmax : None
502 zmax : None
503 """
503 """
504
504
505 if channelList == None:
505 if channelList == None:
506 channelIndexList = dataOut.channelIndexList
506 channelIndexList = dataOut.channelIndexList
507 else:
507 else:
508 channelIndexList = []
508 channelIndexList = []
509 for channel in channelList:
509 for channel in channelList:
510 if channel not in dataOut.channelList:
510 if channel not in dataOut.channelList:
511 raise ValueError, "Channel %d is not in dataOut.channelList"
511 raise ValueError, "Channel %d is not in dataOut.channelList"
512 channelIndexList.append(dataOut.channelList.index(channel))
512 channelIndexList.append(dataOut.channelList.index(channel))
513
513
514 if timerange != None:
514 if timerange != None:
515 self.timerange = timerange
515 self.timerange = timerange
516
516
517 #tmin = None
517 #tmin = None
518 #tmax = None
518 #tmax = None
519 factor = dataOut.normFactor
519 factor = dataOut.normFactor
520 x = dataOut.getTimeRange()
520 x = dataOut.getTimeRange()
521 y = dataOut.getHeiRange()
521 y = dataOut.getHeiRange()
522
522
523 z = dataOut.data_spc[channelIndexList,:,:]/factor
523 z = dataOut.data_spc[channelIndexList,:,:]/factor
524 z = numpy.where(numpy.isfinite(z), z, numpy.NAN)
524 z = numpy.where(numpy.isfinite(z), z, numpy.NAN)
525 avg = numpy.average(z, axis=1)
525 avg = numpy.average(z, axis=1)
526
526
527 avgdB = 10.*numpy.log10(avg)
527 avgdB = 10.*numpy.log10(avg)
528
528
529
529
530 # thisDatetime = dataOut.datatime
530 # thisDatetime = dataOut.datatime
531 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[1])
531 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[1])
532 title = wintitle + " RTI" #: %s" %(thisDatetime.strftime("%d-%b-%Y"))
532 title = wintitle + " RTI" #: %s" %(thisDatetime.strftime("%d-%b-%Y"))
533 xlabel = ""
533 xlabel = ""
534 ylabel = "Range (Km)"
534 ylabel = "Range (Km)"
535
535
536 if not self.isConfig:
536 if not self.isConfig:
537
537
538 nplots = len(channelIndexList)
538 nplots = len(channelIndexList)
539
539
540 self.setup(id=id,
540 self.setup(id=id,
541 nplots=nplots,
541 nplots=nplots,
542 wintitle=wintitle,
542 wintitle=wintitle,
543 showprofile=showprofile,
543 showprofile=showprofile,
544 show=show)
544 show=show)
545
545
546 self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange)
546 self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange)
547
547
548 # if timerange != None:
548 # if timerange != None:
549 # self.timerange = timerange
549 # self.timerange = timerange
550 # self.xmin, self.tmax = self.getTimeLim(x, xmin, xmax, timerange)
550 # self.xmin, self.tmax = self.getTimeLim(x, xmin, xmax, timerange)
551
551
552
552
553
553
554 if ymin == None: ymin = numpy.nanmin(y)
554 if ymin == None: ymin = numpy.nanmin(y)
555 if ymax == None: ymax = numpy.nanmax(y)
555 if ymax == None: ymax = numpy.nanmax(y)
556 if zmin == None: zmin = numpy.nanmin(avgdB)*0.9
556 if zmin == None: zmin = numpy.nanmin(avgdB)*0.9
557 if zmax == None: zmax = numpy.nanmax(avgdB)*0.9
557 if zmax == None: zmax = numpy.nanmax(avgdB)*0.9
558
558
559 self.FTP_WEI = ftp_wei
559 self.FTP_WEI = ftp_wei
560 self.EXP_CODE = exp_code
560 self.EXP_CODE = exp_code
561 self.SUB_EXP_CODE = sub_exp_code
561 self.SUB_EXP_CODE = sub_exp_code
562 self.PLOT_POS = plot_pos
562 self.PLOT_POS = plot_pos
563
563
564 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
564 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
565 self.isConfig = True
565 self.isConfig = True
566 self.figfile = figfile
566 self.figfile = figfile
567
567
568 self.setWinTitle(title)
568 self.setWinTitle(title)
569
569
570 if ((self.xmax - x[1]) < (x[1]-x[0])):
570 if ((self.xmax - x[1]) < (x[1]-x[0])):
571 x[1] = self.xmax
571 x[1] = self.xmax
572
572
573 for i in range(self.nplots):
573 for i in range(self.nplots):
574 title = "Channel %d: %s" %(dataOut.channelList[i]+1, thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
574 title = "Channel %d: %s" %(dataOut.channelList[i]+1, thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
575 if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)):
575 if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)):
576 title = title + '_' + 'azimuth,zenith=%2.2f,%2.2f'%(dataOut.azimuth, dataOut.zenith)
576 title = title + '_' + 'azimuth,zenith=%2.2f,%2.2f'%(dataOut.azimuth, dataOut.zenith)
577 axes = self.axesList[i*self.__nsubplots]
577 axes = self.axesList[i*self.__nsubplots]
578 zdB = avgdB[i].reshape((1,-1))
578 zdB = avgdB[i].reshape((1,-1))
579 axes.pcolorbuffer(x, y, zdB,
579 axes.pcolorbuffer(x, y, zdB,
580 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
580 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
581 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
581 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
582 ticksize=9, cblabel='', cbsize="1%")
582 ticksize=9, cblabel='', cbsize="1%")
583
583
584 if self.__showprofile:
584 if self.__showprofile:
585 axes = self.axesList[i*self.__nsubplots +1]
585 axes = self.axesList[i*self.__nsubplots +1]
586 axes.pline(avgdB[i], y,
586 axes.pline(avgdB[i], y,
587 xmin=zmin, xmax=zmax, ymin=ymin, ymax=ymax,
587 xmin=zmin, xmax=zmax, ymin=ymin, ymax=ymax,
588 xlabel='dB', ylabel='', title='',
588 xlabel='dB', ylabel='', title='',
589 ytick_visible=False,
589 ytick_visible=False,
590 grid='x')
590 grid='x')
591
591
592 self.draw()
592 self.draw()
593
593
594 if x[1] >= self.axesList[0].xmax:
594 if x[1] >= self.axesList[0].xmax:
595 self.counter_imagwr = wr_period
595 self.counter_imagwr = wr_period
596 self.__isConfig = False
596 self.__isConfig = False
597
597
598
598
599 if self.figfile == None:
599 if self.figfile == None:
600 str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S")
600 str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S")
601 self.figfile = self.getFilename(name = str_datetime)
601 self.figfile = self.getFilename(name = str_datetime)
602
602
603 if figpath != '':
603 if figpath != '':
604
604
605 self.counter_imagwr += 1
605 self.counter_imagwr += 1
606 if (self.counter_imagwr>=wr_period):
606 if (self.counter_imagwr>=wr_period):
607 # store png plot to local folder
607 # store png plot to local folder
608 self.saveFigure(figpath, self.figfile)
608 self.saveFigure(figpath, self.figfile)
609 # store png plot to FTP server according to RT-Web format
609 # store png plot to FTP server according to RT-Web format
610 name = self.getNameToFtp(thisDatetime, self.FTP_WEI, self.EXP_CODE, self.SUB_EXP_CODE, self.PLOT_CODE, self.PLOT_POS)
610 name = self.getNameToFtp(thisDatetime, self.FTP_WEI, self.EXP_CODE, self.SUB_EXP_CODE, self.PLOT_CODE, self.PLOT_POS)
611 ftp_filename = os.path.join(figpath, name)
611 ftp_filename = os.path.join(figpath, name)
612 self.saveFigure(figpath, ftp_filename)
612 self.saveFigure(figpath, ftp_filename)
613
613
614 self.counter_imagwr = 0
614 self.counter_imagwr = 0
615
615
616
616
617 class CoherenceMap(Figure):
617 class CoherenceMap(Figure):
618 isConfig = None
618 isConfig = None
619 __nsubplots = None
619 __nsubplots = None
620
620
621 WIDTHPROF = None
621 WIDTHPROF = None
622 HEIGHTPROF = None
622 HEIGHTPROF = None
623 PREFIX = 'cmap'
623 PREFIX = 'cmap'
624
624
625 def __init__(self):
625 def __init__(self):
626 self.timerange = 2*60*60
626 self.timerange = 2*60*60
627 self.isConfig = False
627 self.isConfig = False
628 self.__nsubplots = 1
628 self.__nsubplots = 1
629
629
630 self.WIDTH = 800
630 self.WIDTH = 800
631 self.HEIGHT = 150
631 self.HEIGHT = 150
632 self.WIDTHPROF = 120
632 self.WIDTHPROF = 120
633 self.HEIGHTPROF = 0
633 self.HEIGHTPROF = 0
634 self.counter_imagwr = 0
634 self.counter_imagwr = 0
635
635
636 self.PLOT_CODE = 3
636 self.PLOT_CODE = 3
637 self.FTP_WEI = None
637 self.FTP_WEI = None
638 self.EXP_CODE = None
638 self.EXP_CODE = None
639 self.SUB_EXP_CODE = None
639 self.SUB_EXP_CODE = None
640 self.PLOT_POS = None
640 self.PLOT_POS = None
641 self.counter_imagwr = 0
641 self.counter_imagwr = 0
642
642
643 self.xmin = None
643 self.xmin = None
644 self.xmax = None
644 self.xmax = None
645
645
646 def getSubplots(self):
646 def getSubplots(self):
647 ncol = 1
647 ncol = 1
648 nrow = self.nplots*2
648 nrow = self.nplots*2
649
649
650 return nrow, ncol
650 return nrow, ncol
651
651
652 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
652 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
653 self.__showprofile = showprofile
653 self.__showprofile = showprofile
654 self.nplots = nplots
654 self.nplots = nplots
655
655
656 ncolspan = 1
656 ncolspan = 1
657 colspan = 1
657 colspan = 1
658 if showprofile:
658 if showprofile:
659 ncolspan = 7
659 ncolspan = 7
660 colspan = 6
660 colspan = 6
661 self.__nsubplots = 2
661 self.__nsubplots = 2
662
662
663 self.createFigure(id = id,
663 self.createFigure(id = id,
664 wintitle = wintitle,
664 wintitle = wintitle,
665 widthplot = self.WIDTH + self.WIDTHPROF,
665 widthplot = self.WIDTH + self.WIDTHPROF,
666 heightplot = self.HEIGHT + self.HEIGHTPROF,
666 heightplot = self.HEIGHT + self.HEIGHTPROF,
667 show=True)
667 show=True)
668
668
669 nrow, ncol = self.getSubplots()
669 nrow, ncol = self.getSubplots()
670
670
671 for y in range(nrow):
671 for y in range(nrow):
672 for x in range(ncol):
672 for x in range(ncol):
673
673
674 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
674 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
675
675
676 if showprofile:
676 if showprofile:
677 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan+colspan, 1, 1)
677 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan+colspan, 1, 1)
678
678
679 def run(self, dataOut, id, wintitle="", pairsList=None, showprofile='True',
679 def run(self, dataOut, id, wintitle="", pairsList=None, showprofile='True',
680 xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None,
680 xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None,
681 timerange=None,
681 timerange=None,
682 save=False, figpath='', figfile=None, ftp=False, wr_period=1,
682 save=False, figpath='', figfile=None, ftp=False, wr_period=1,
683 coherence_cmap='jet', phase_cmap='RdBu_r', show=True,
683 coherence_cmap='jet', phase_cmap='RdBu_r', show=True,
684 server=None, folder=None, username=None, password=None,
684 server=None, folder=None, username=None, password=None,
685 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0):
685 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0):
686
686
687 if pairsList == None:
687 if pairsList == None:
688 pairsIndexList = dataOut.pairsIndexList
688 pairsIndexList = dataOut.pairsIndexList
689 else:
689 else:
690 pairsIndexList = []
690 pairsIndexList = []
691 for pair in pairsList:
691 for pair in pairsList:
692 if pair not in dataOut.pairsList:
692 if pair not in dataOut.pairsList:
693 raise ValueError, "Pair %s is not in dataOut.pairsList" %(pair)
693 raise ValueError, "Pair %s is not in dataOut.pairsList" %(pair)
694 pairsIndexList.append(dataOut.pairsList.index(pair))
694 pairsIndexList.append(dataOut.pairsList.index(pair))
695
695
696 if timerange != None:
696 if timerange != None:
697 self.timerange = timerange
697 self.timerange = timerange
698
698
699 if pairsIndexList == []:
699 if pairsIndexList == []:
700 return
700 return
701
701
702 if len(pairsIndexList) > 4:
702 if len(pairsIndexList) > 4:
703 pairsIndexList = pairsIndexList[0:4]
703 pairsIndexList = pairsIndexList[0:4]
704
704
705 # tmin = None
705 # tmin = None
706 # tmax = None
706 # tmax = None
707 x = dataOut.getTimeRange()
707 x = dataOut.getTimeRange()
708 y = dataOut.getHeiRange()
708 y = dataOut.getHeiRange()
709
709
710 #thisDatetime = dataOut.datatime
710 #thisDatetime = dataOut.datatime
711 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[1])
711 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[1])
712 title = wintitle + " CoherenceMap" #: %s" %(thisDatetime.strftime("%d-%b-%Y"))
712 title = wintitle + " CoherenceMap" #: %s" %(thisDatetime.strftime("%d-%b-%Y"))
713 xlabel = ""
713 xlabel = ""
714 ylabel = "Range (Km)"
714 ylabel = "Range (Km)"
715
715
716 if not self.isConfig:
716 if not self.isConfig:
717 nplots = len(pairsIndexList)
717 nplots = len(pairsIndexList)
718 self.setup(id=id,
718 self.setup(id=id,
719 nplots=nplots,
719 nplots=nplots,
720 wintitle=wintitle,
720 wintitle=wintitle,
721 showprofile=showprofile,
721 showprofile=showprofile,
722 show=show)
722 show=show)
723
723
724 #tmin, tmax = self.getTimeLim(x, xmin, xmax)
724 #tmin, tmax = self.getTimeLim(x, xmin, xmax)
725
725
726 self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange)
726 self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange)
727
727
728 if ymin == None: ymin = numpy.nanmin(y)
728 if ymin == None: ymin = numpy.nanmin(y)
729 if ymax == None: ymax = numpy.nanmax(y)
729 if ymax == None: ymax = numpy.nanmax(y)
730 if zmin == None: zmin = 0.
730 if zmin == None: zmin = 0.
731 if zmax == None: zmax = 1.
731 if zmax == None: zmax = 1.
732
732
733 self.FTP_WEI = ftp_wei
733 self.FTP_WEI = ftp_wei
734 self.EXP_CODE = exp_code
734 self.EXP_CODE = exp_code
735 self.SUB_EXP_CODE = sub_exp_code
735 self.SUB_EXP_CODE = sub_exp_code
736 self.PLOT_POS = plot_pos
736 self.PLOT_POS = plot_pos
737
737
738 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
738 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
739
739
740 self.isConfig = True
740 self.isConfig = True
741
741
742 self.setWinTitle(title)
742 self.setWinTitle(title)
743
743
744 if ((self.xmax - x[1]) < (x[1]-x[0])):
744 if ((self.xmax - x[1]) < (x[1]-x[0])):
745 x[1] = self.xmax
745 x[1] = self.xmax
746
746
747 for i in range(self.nplots):
747 for i in range(self.nplots):
748
748
749 pair = dataOut.pairsList[pairsIndexList[i]]
749 pair = dataOut.pairsList[pairsIndexList[i]]
750
750
751 ccf = numpy.average(dataOut.data_cspc[pairsIndexList[i],:,:],axis=0)
751 ccf = numpy.average(dataOut.data_cspc[pairsIndexList[i],:,:],axis=0)
752 powa = numpy.average(dataOut.data_spc[pair[0],:,:],axis=0)
752 powa = numpy.average(dataOut.data_spc[pair[0],:,:],axis=0)
753 powb = numpy.average(dataOut.data_spc[pair[1],:,:],axis=0)
753 powb = numpy.average(dataOut.data_spc[pair[1],:,:],axis=0)
754
754
755
755
756 avgcoherenceComplex = ccf/numpy.sqrt(powa*powb)
756 avgcoherenceComplex = ccf/numpy.sqrt(powa*powb)
757 coherence = numpy.abs(avgcoherenceComplex)
757 coherence = numpy.abs(avgcoherenceComplex)
758
758
759 z = coherence.reshape((1,-1))
759 z = coherence.reshape((1,-1))
760
760
761 counter = 0
761 counter = 0
762
762
763 title = "Coherence %d%d: %s" %(pair[0], pair[1], thisDatetime.strftime("%d-%b-%Y %H:%M:%S"))
763 title = "Coherence %d%d: %s" %(pair[0], pair[1], thisDatetime.strftime("%d-%b-%Y %H:%M:%S"))
764 axes = self.axesList[i*self.__nsubplots*2]
764 axes = self.axesList[i*self.__nsubplots*2]
765 axes.pcolorbuffer(x, y, z,
765 axes.pcolorbuffer(x, y, z,
766 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
766 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
767 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
767 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
768 ticksize=9, cblabel='', colormap=coherence_cmap, cbsize="1%")
768 ticksize=9, cblabel='', colormap=coherence_cmap, cbsize="1%")
769
769
770 if self.__showprofile:
770 if self.__showprofile:
771 counter += 1
771 counter += 1
772 axes = self.axesList[i*self.__nsubplots*2 + counter]
772 axes = self.axesList[i*self.__nsubplots*2 + counter]
773 axes.pline(coherence, y,
773 axes.pline(coherence, y,
774 xmin=zmin, xmax=zmax, ymin=ymin, ymax=ymax,
774 xmin=zmin, xmax=zmax, ymin=ymin, ymax=ymax,
775 xlabel='', ylabel='', title='', ticksize=7,
775 xlabel='', ylabel='', title='', ticksize=7,
776 ytick_visible=False, nxticks=5,
776 ytick_visible=False, nxticks=5,
777 grid='x')
777 grid='x')
778
778
779 counter += 1
779 counter += 1
780
780
781 phase = numpy.arctan2(avgcoherenceComplex.imag, avgcoherenceComplex.real)*180/numpy.pi
781 phase = numpy.arctan2(avgcoherenceComplex.imag, avgcoherenceComplex.real)*180/numpy.pi
782
782
783 z = phase.reshape((1,-1))
783 z = phase.reshape((1,-1))
784
784
785 title = "Phase %d%d: %s" %(pair[0], pair[1], thisDatetime.strftime("%d-%b-%Y %H:%M:%S"))
785 title = "Phase %d%d: %s" %(pair[0], pair[1], thisDatetime.strftime("%d-%b-%Y %H:%M:%S"))
786 axes = self.axesList[i*self.__nsubplots*2 + counter]
786 axes = self.axesList[i*self.__nsubplots*2 + counter]
787 axes.pcolorbuffer(x, y, z,
787 axes.pcolorbuffer(x, y, z,
788 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=-180, zmax=180,
788 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=-180, zmax=180,
789 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
789 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
790 ticksize=9, cblabel='', colormap=phase_cmap, cbsize="1%")
790 ticksize=9, cblabel='', colormap=phase_cmap, cbsize="1%")
791
791
792 if self.__showprofile:
792 if self.__showprofile:
793 counter += 1
793 counter += 1
794 axes = self.axesList[i*self.__nsubplots*2 + counter]
794 axes = self.axesList[i*self.__nsubplots*2 + counter]
795 axes.pline(phase, y,
795 axes.pline(phase, y,
796 xmin=-180, xmax=180, ymin=ymin, ymax=ymax,
796 xmin=-180, xmax=180, ymin=ymin, ymax=ymax,
797 xlabel='', ylabel='', title='', ticksize=7,
797 xlabel='', ylabel='', title='', ticksize=7,
798 ytick_visible=False, nxticks=4,
798 ytick_visible=False, nxticks=4,
799 grid='x')
799 grid='x')
800
800
801 self.draw()
801 self.draw()
802
802
803 if x[1] >= self.axesList[0].xmax:
803 if x[1] >= self.axesList[0].xmax:
804 self.counter_imagwr = wr_period
804 self.counter_imagwr = wr_period
805 self.__isConfig = False
805 self.__isConfig = False
806
806
807 if figfile == None:
807 if figfile == None:
808 str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S")
808 str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S")
809 figfile = self.getFilename(name = str_datetime)
809 figfile = self.getFilename(name = str_datetime)
810
810
811 if figpath != '':
811 if figpath != '':
812
812
813 self.counter_imagwr += 1
813 self.counter_imagwr += 1
814 if (self.counter_imagwr>=wr_period):
814 if (self.counter_imagwr>=wr_period):
815 # store png plot to local folder
815 # store png plot to local folder
816 self.saveFigure(figpath, figfile)
816 self.saveFigure(figpath, figfile)
817 # store png plot to FTP server according to RT-Web format
817 # store png plot to FTP server according to RT-Web format
818 name = self.getNameToFtp(thisDatetime, self.FTP_WEI, self.EXP_CODE, self.SUB_EXP_CODE, self.PLOT_CODE, self.PLOT_POS)
818 name = self.getNameToFtp(thisDatetime, self.FTP_WEI, self.EXP_CODE, self.SUB_EXP_CODE, self.PLOT_CODE, self.PLOT_POS)
819 ftp_filename = os.path.join(figpath, name)
819 ftp_filename = os.path.join(figpath, name)
820 self.saveFigure(figpath, ftp_filename)
820 self.saveFigure(figpath, ftp_filename)
821
821
822 self.counter_imagwr = 0
822 self.counter_imagwr = 0
823
823
824 class PowerProfile(Figure):
824 class PowerProfile(Figure):
825 isConfig = None
825 isConfig = None
826 __nsubplots = None
826 __nsubplots = None
827
827
828 WIDTHPROF = None
828 WIDTHPROF = None
829 HEIGHTPROF = None
829 HEIGHTPROF = None
830 PREFIX = 'spcprofile'
830 PREFIX = 'spcprofile'
831
831
832 def __init__(self):
832 def __init__(self):
833 self.isConfig = False
833 self.isConfig = False
834 self.__nsubplots = 1
834 self.__nsubplots = 1
835
835
836 self.WIDTH = 300
836 self.WIDTH = 300
837 self.HEIGHT = 500
837 self.HEIGHT = 500
838 self.counter_imagwr = 0
838 self.counter_imagwr = 0
839
839
840 def getSubplots(self):
840 def getSubplots(self):
841 ncol = 1
841 ncol = 1
842 nrow = 1
842 nrow = 1
843
843
844 return nrow, ncol
844 return nrow, ncol
845
845
846 def setup(self, id, nplots, wintitle, show):
846 def setup(self, id, nplots, wintitle, show):
847
847
848 self.nplots = nplots
848 self.nplots = nplots
849
849
850 ncolspan = 1
850 ncolspan = 1
851 colspan = 1
851 colspan = 1
852
852
853 self.createFigure(id = id,
853 self.createFigure(id = id,
854 wintitle = wintitle,
854 wintitle = wintitle,
855 widthplot = self.WIDTH,
855 widthplot = self.WIDTH,
856 heightplot = self.HEIGHT,
856 heightplot = self.HEIGHT,
857 show=show)
857 show=show)
858
858
859 nrow, ncol = self.getSubplots()
859 nrow, ncol = self.getSubplots()
860
860
861 counter = 0
861 counter = 0
862 for y in range(nrow):
862 for y in range(nrow):
863 for x in range(ncol):
863 for x in range(ncol):
864 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
864 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
865
865
866 def run(self, dataOut, id, wintitle="", channelList=None,
866 def run(self, dataOut, id, wintitle="", channelList=None,
867 xmin=None, xmax=None, ymin=None, ymax=None,
867 xmin=None, xmax=None, ymin=None, ymax=None,
868 save=False, figpath='', figfile=None, show=True, wr_period=1,
868 save=False, figpath='', figfile=None, show=True, wr_period=1,
869 server=None, folder=None, username=None, password=None,):
869 server=None, folder=None, username=None, password=None,):
870
870
871 if dataOut.flagNoData:
871 if dataOut.flagNoData:
872 return None
872 return None
873
873
874 if channelList == None:
874 if channelList == None:
875 channelIndexList = dataOut.channelIndexList
875 channelIndexList = dataOut.channelIndexList
876 channelList = dataOut.channelList
876 channelList = dataOut.channelList
877 else:
877 else:
878 channelIndexList = []
878 channelIndexList = []
879 for channel in channelList:
879 for channel in channelList:
880 if channel not in dataOut.channelList:
880 if channel not in dataOut.channelList:
881 raise ValueError, "Channel %d is not in dataOut.channelList"
881 raise ValueError, "Channel %d is not in dataOut.channelList"
882 channelIndexList.append(dataOut.channelList.index(channel))
882 channelIndexList.append(dataOut.channelList.index(channel))
883
883
884 try:
884 try:
885 factor = dataOut.normFactor
885 factor = dataOut.normFactor
886 except:
886 except:
887 factor = 1
887 factor = 1
888
888
889 y = dataOut.getHeiRange()
889 y = dataOut.getHeiRange()
890
890
891 #for voltage
891 #for voltage
892 if dataOut.type == 'Voltage':
892 if dataOut.type == 'Voltage':
893 x = dataOut.data[channelIndexList,:] * numpy.conjugate(dataOut.data[channelIndexList,:])
893 x = dataOut.data[channelIndexList,:] * numpy.conjugate(dataOut.data[channelIndexList,:])
894 x = x.real
894 x = x.real
895 x = numpy.where(numpy.isfinite(x), x, numpy.NAN)
895 x = numpy.where(numpy.isfinite(x), x, numpy.NAN)
896
896
897 #for spectra
897 #for spectra
898 if dataOut.type == 'Spectra':
898 if dataOut.type == 'Spectra':
899 x = dataOut.data_spc[channelIndexList,:,:]/factor
899 x = dataOut.data_spc[channelIndexList,:,:]/factor
900 x = numpy.where(numpy.isfinite(x), x, numpy.NAN)
900 x = numpy.where(numpy.isfinite(x), x, numpy.NAN)
901 x = numpy.average(x, axis=1)
901 x = numpy.average(x, axis=1)
902
902
903
903
904 xdB = 10*numpy.log10(x)
904 xdB = 10*numpy.log10(x)
905
905
906 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[1])
906 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[1])
907 title = wintitle + " Power Profile %s" %(thisDatetime.strftime("%d-%b-%Y"))
907 title = wintitle + " Power Profile %s" %(thisDatetime.strftime("%d-%b-%Y"))
908 xlabel = "dB"
908 xlabel = "dB"
909 ylabel = "Range (Km)"
909 ylabel = "Range (Km)"
910
910
911 if not self.isConfig:
911 if not self.isConfig:
912
912
913 nplots = 1
913 nplots = 1
914
914
915 self.setup(id=id,
915 self.setup(id=id,
916 nplots=nplots,
916 nplots=nplots,
917 wintitle=wintitle,
917 wintitle=wintitle,
918 show=show)
918 show=show)
919
919
920 if ymin == None: ymin = numpy.nanmin(y)
920 if ymin == None: ymin = numpy.nanmin(y)
921 if ymax == None: ymax = numpy.nanmax(y)
921 if ymax == None: ymax = numpy.nanmax(y)
922 if xmin == None: xmin = numpy.nanmin(xdB)*0.9
922 if xmin == None: xmin = numpy.nanmin(xdB)*0.9
923 if xmax == None: xmax = numpy.nanmax(xdB)*0.9
923 if xmax == None: xmax = numpy.nanmax(xdB)*0.9
924
924
925 self.__isConfig = True
925 self.__isConfig = True
926
926
927 self.setWinTitle(title)
927 self.setWinTitle(title)
928
928
929 title = "Power Profile: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S"))
929 title = "Power Profile: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S"))
930 axes = self.axesList[0]
930 axes = self.axesList[0]
931
931
932 legendlabels = ["channel %d"%x for x in channelList]
932 legendlabels = ["channel %d"%x for x in channelList]
933 axes.pmultiline(xdB, y,
933 axes.pmultiline(xdB, y,
934 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax,
934 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax,
935 xlabel=xlabel, ylabel=ylabel, title=title, legendlabels=legendlabels,
935 xlabel=xlabel, ylabel=ylabel, title=title, legendlabels=legendlabels,
936 ytick_visible=True, nxticks=5,
936 ytick_visible=True, nxticks=5,
937 grid='x')
937 grid='x')
938
938
939 self.draw()
939 self.draw()
940
940
941 if figfile == None:
941 if figfile == None:
942 str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S")
942 str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S")
943 figfile = self.getFilename(name = str_datetime)
943 figfile = self.getFilename(name = str_datetime)
944
944
945 if figpath != '':
945 if figpath != '':
946 self.counter_imagwr += 1
946 self.counter_imagwr += 1
947 if (self.counter_imagwr>=wr_period):
947 if (self.counter_imagwr>=wr_period):
948 # store png plot to local folder
948 # store png plot to local folder
949 self.saveFigure(figpath, figfile)
949 self.saveFigure(figpath, figfile)
950 # store png plot to FTP server according to RT-Web format
950 # store png plot to FTP server according to RT-Web format
951 #name = self.getNameToFtp(thisDatetime, self.FTP_WEI, self.EXP_CODE, self.SUB_EXP_CODE, self.PLOT_CODE, self.PLOT_POS)
951 #name = self.getNameToFtp(thisDatetime, self.FTP_WEI, self.EXP_CODE, self.SUB_EXP_CODE, self.PLOT_CODE, self.PLOT_POS)
952 #ftp_filename = os.path.join(figpath, name)
952 #ftp_filename = os.path.join(figpath, name)
953 #self.saveFigure(figpath, ftp_filename)
953 #self.saveFigure(figpath, ftp_filename)
954 self.counter_imagwr = 0
954 self.counter_imagwr = 0
955
955
956
956
957
957
958 class Noise(Figure):
958 class Noise(Figure):
959
959
960 isConfig = None
960 isConfig = None
961 __nsubplots = None
961 __nsubplots = None
962
962
963 PREFIX = 'noise'
963 PREFIX = 'noise'
964
964
965 def __init__(self):
965 def __init__(self):
966
966
967 self.timerange = 24*60*60
967 self.timerange = 24*60*60
968 self.isConfig = False
968 self.isConfig = False
969 self.__nsubplots = 1
969 self.__nsubplots = 1
970 self.counter_imagwr = 0
970 self.counter_imagwr = 0
971 self.WIDTH = 600
971 self.WIDTH = 600
972 self.HEIGHT = 300
972 self.HEIGHT = 300
973 self.WIDTHPROF = 120
973 self.WIDTHPROF = 120
974 self.HEIGHTPROF = 0
974 self.HEIGHTPROF = 0
975 self.xdata = None
975 self.xdata = None
976 self.ydata = None
976 self.ydata = None
977
977
978 self.PLOT_CODE = 17
978 self.PLOT_CODE = 17
979 self.FTP_WEI = None
979 self.FTP_WEI = None
980 self.EXP_CODE = None
980 self.EXP_CODE = None
981 self.SUB_EXP_CODE = None
981 self.SUB_EXP_CODE = None
982 self.PLOT_POS = None
982 self.PLOT_POS = None
983 self.figfile = None
983 self.figfile = None
984
984
985 def getSubplots(self):
985 def getSubplots(self):
986
986
987 ncol = 1
987 ncol = 1
988 nrow = 1
988 nrow = 1
989
989
990 return nrow, ncol
990 return nrow, ncol
991
991
992 def openfile(self, filename):
992 def openfile(self, filename):
993 f = open(filename,'w+')
993 f = open(filename,'w+')
994 f.write('\n\n')
994 f.write('\n\n')
995 f.write('JICAMARCA RADIO OBSERVATORY - Noise \n')
995 f.write('JICAMARCA RADIO OBSERVATORY - Noise \n')
996 f.write('DD MM YYYY HH MM SS Channel0 Channel1 Channel2 Channel3\n\n' )
996 f.write('DD MM YYYY HH MM SS Channel0 Channel1 Channel2 Channel3\n\n' )
997 f.close()
997 f.close()
998
998
999 def save_data(self, filename_phase, data, data_datetime):
999 def save_data(self, filename_phase, data, data_datetime):
1000 f=open(filename_phase,'a')
1000 f=open(filename_phase,'a')
1001 timetuple_data = data_datetime.timetuple()
1001 timetuple_data = data_datetime.timetuple()
1002 day = str(timetuple_data.tm_mday)
1002 day = str(timetuple_data.tm_mday)
1003 month = str(timetuple_data.tm_mon)
1003 month = str(timetuple_data.tm_mon)
1004 year = str(timetuple_data.tm_year)
1004 year = str(timetuple_data.tm_year)
1005 hour = str(timetuple_data.tm_hour)
1005 hour = str(timetuple_data.tm_hour)
1006 minute = str(timetuple_data.tm_min)
1006 minute = str(timetuple_data.tm_min)
1007 second = str(timetuple_data.tm_sec)
1007 second = str(timetuple_data.tm_sec)
1008 f.write(day+' '+month+' '+year+' '+hour+' '+minute+' '+second+' '+str(data[0])+' '+str(data[1])+' '+str(data[2])+' '+str(data[3])+'\n')
1008 f.write(day+' '+month+' '+year+' '+hour+' '+minute+' '+second+' '+str(data[0])+' '+str(data[1])+' '+str(data[2])+' '+str(data[3])+'\n')
1009 f.close()
1009 f.close()
1010
1010
1011
1011
1012 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
1012 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
1013
1013
1014 self.__showprofile = showprofile
1014 self.__showprofile = showprofile
1015 self.nplots = nplots
1015 self.nplots = nplots
1016
1016
1017 ncolspan = 7
1017 ncolspan = 7
1018 colspan = 6
1018 colspan = 6
1019 self.__nsubplots = 2
1019 self.__nsubplots = 2
1020
1020
1021 self.createFigure(id = id,
1021 self.createFigure(id = id,
1022 wintitle = wintitle,
1022 wintitle = wintitle,
1023 widthplot = self.WIDTH+self.WIDTHPROF,
1023 widthplot = self.WIDTH+self.WIDTHPROF,
1024 heightplot = self.HEIGHT+self.HEIGHTPROF,
1024 heightplot = self.HEIGHT+self.HEIGHTPROF,
1025 show=show)
1025 show=show)
1026
1026
1027 nrow, ncol = self.getSubplots()
1027 nrow, ncol = self.getSubplots()
1028
1028
1029 self.addAxes(nrow, ncol*ncolspan, 0, 0, colspan, 1)
1029 self.addAxes(nrow, ncol*ncolspan, 0, 0, colspan, 1)
1030
1030
1031
1031
1032 def run(self, dataOut, id, wintitle="", channelList=None, showprofile='True',
1032 def run(self, dataOut, id, wintitle="", channelList=None, showprofile='True',
1033 xmin=None, xmax=None, ymin=None, ymax=None,
1033 xmin=None, xmax=None, ymin=None, ymax=None,
1034 timerange=None,
1034 timerange=None,
1035 save=False, figpath='', figfile=None, show=True, ftp=False, wr_period=1,
1035 save=False, figpath='', figfile=None, show=True, ftp=False, wr_period=1,
1036 server=None, folder=None, username=None, password=None,
1036 server=None, folder=None, username=None, password=None,
1037 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0):
1037 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0):
1038
1038
1039 if channelList == None:
1039 if channelList == None:
1040 channelIndexList = dataOut.channelIndexList
1040 channelIndexList = dataOut.channelIndexList
1041 channelList = dataOut.channelList
1041 channelList = dataOut.channelList
1042 else:
1042 else:
1043 channelIndexList = []
1043 channelIndexList = []
1044 for channel in channelList:
1044 for channel in channelList:
1045 if channel not in dataOut.channelList:
1045 if channel not in dataOut.channelList:
1046 raise ValueError, "Channel %d is not in dataOut.channelList"
1046 raise ValueError, "Channel %d is not in dataOut.channelList"
1047 channelIndexList.append(dataOut.channelList.index(channel))
1047 channelIndexList.append(dataOut.channelList.index(channel))
1048
1048
1049 if timerange != None:
1049 if timerange != None:
1050 self.timerange = timerange
1050 self.timerange = timerange
1051
1051
1052 tmin = None
1052 tmin = None
1053 tmax = None
1053 tmax = None
1054 x = dataOut.getTimeRange()
1054 x = dataOut.getTimeRange()
1055 y = dataOut.getHeiRange()
1055 y = dataOut.getHeiRange()
1056 factor = dataOut.normFactor
1056 factor = dataOut.normFactor
1057 noise = dataOut.noise()/factor
1057 noise = dataOut.noise()/factor
1058 noisedB = 10*numpy.log10(noise)
1058 noisedB = 10*numpy.log10(noise)
1059
1059
1060 #thisDatetime = dataOut.datatime
1060 #thisDatetime = dataOut.datatime
1061 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[1])
1061 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[1])
1062 title = wintitle + " Noise" # : %s" %(thisDatetime.strftime("%d-%b-%Y"))
1062 title = wintitle + " Noise" # : %s" %(thisDatetime.strftime("%d-%b-%Y"))
1063 xlabel = ""
1063 xlabel = ""
1064 ylabel = "Intensity (dB)"
1064 ylabel = "Intensity (dB)"
1065
1065
1066 if not self.isConfig:
1066 if not self.isConfig:
1067
1067
1068 nplots = 1
1068 nplots = 1
1069
1069
1070 self.setup(id=id,
1070 self.setup(id=id,
1071 nplots=nplots,
1071 nplots=nplots,
1072 wintitle=wintitle,
1072 wintitle=wintitle,
1073 showprofile=showprofile,
1073 showprofile=showprofile,
1074 show=show)
1074 show=show)
1075
1075
1076 tmin, tmax = self.getTimeLim(x, xmin, xmax)
1076 tmin, tmax = self.getTimeLim(x, xmin, xmax)
1077 if ymin == None: ymin = numpy.nanmin(noisedB) - 10.0
1077 if ymin == None: ymin = numpy.nanmin(noisedB) - 10.0
1078 if ymax == None: ymax = numpy.nanmax(noisedB) + 10.0
1078 if ymax == None: ymax = numpy.nanmax(noisedB) + 10.0
1079
1079
1080 self.FTP_WEI = ftp_wei
1080 self.FTP_WEI = ftp_wei
1081 self.EXP_CODE = exp_code
1081 self.EXP_CODE = exp_code
1082 self.SUB_EXP_CODE = sub_exp_code
1082 self.SUB_EXP_CODE = sub_exp_code
1083 self.PLOT_POS = plot_pos
1083 self.PLOT_POS = plot_pos
1084
1084
1085
1085
1086 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
1086 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
1087 self.isConfig = True
1087 self.isConfig = True
1088 self.figfile = figfile
1088 self.figfile = figfile
1089 self.xdata = numpy.array([])
1089 self.xdata = numpy.array([])
1090 self.ydata = numpy.array([])
1090 self.ydata = numpy.array([])
1091
1091
1092 #open file beacon phase
1092 #open file beacon phase
1093 path = '%s%03d' %(self.PREFIX, self.id)
1093 path = '%s%03d' %(self.PREFIX, self.id)
1094 noise_file = os.path.join(path,'%s.txt'%self.name)
1094 noise_file = os.path.join(path,'%s.txt'%self.name)
1095 self.filename_noise = os.path.join(figpath,noise_file)
1095 self.filename_noise = os.path.join(figpath,noise_file)
1096 self.openfile(self.filename_noise)
1096 self.openfile(self.filename_noise)
1097
1097
1098
1098
1099 #store data beacon phase
1099 #store data beacon phase
1100 self.save_data(self.filename_noise, noisedB, thisDatetime)
1100 self.save_data(self.filename_noise, noisedB, thisDatetime)
1101
1101
1102
1102
1103 self.setWinTitle(title)
1103 self.setWinTitle(title)
1104
1104
1105
1105
1106 title = "Noise %s" %(thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
1106 title = "Noise %s" %(thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
1107
1107
1108 legendlabels = ["channel %d"%(idchannel+1) for idchannel in channelList]
1108 legendlabels = ["channel %d"%(idchannel+1) for idchannel in channelList]
1109 axes = self.axesList[0]
1109 axes = self.axesList[0]
1110
1110
1111 self.xdata = numpy.hstack((self.xdata, x[0:1]))
1111 self.xdata = numpy.hstack((self.xdata, x[0:1]))
1112
1112
1113 if len(self.ydata)==0:
1113 if len(self.ydata)==0:
1114 self.ydata = noisedB[channelIndexList].reshape(-1,1)
1114 self.ydata = noisedB[channelIndexList].reshape(-1,1)
1115 else:
1115 else:
1116 self.ydata = numpy.hstack((self.ydata, noisedB[channelIndexList].reshape(-1,1)))
1116 self.ydata = numpy.hstack((self.ydata, noisedB[channelIndexList].reshape(-1,1)))
1117
1117
1118
1118
1119 axes.pmultilineyaxis(x=self.xdata, y=self.ydata,
1119 axes.pmultilineyaxis(x=self.xdata, y=self.ydata,
1120 xmin=tmin, xmax=tmax, ymin=ymin, ymax=ymax,
1120 xmin=tmin, xmax=tmax, ymin=ymin, ymax=ymax,
1121 xlabel=xlabel, ylabel=ylabel, title=title, legendlabels=legendlabels, marker='x', markersize=8, linestyle="solid",
1121 xlabel=xlabel, ylabel=ylabel, title=title, legendlabels=legendlabels, marker='x', markersize=8, linestyle="solid",
1122 XAxisAsTime=True, grid='both'
1122 XAxisAsTime=True, grid='both'
1123 )
1123 )
1124
1124
1125 self.draw()
1125 self.draw()
1126
1126
1127 if x[1] >= self.axesList[0].xmax:
1127 if x[1] >= self.axesList[0].xmax:
1128 self.counter_imagwr = wr_period
1128 self.counter_imagwr = wr_period
1129 del self.xdata
1129 del self.xdata
1130 del self.ydata
1130 del self.ydata
1131 self.__isConfig = False
1131 self.__isConfig = False
1132
1132
1133 if self.figfile == None:
1133 if self.figfile == None:
1134 str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S")
1134 str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S")
1135 self.figfile = self.getFilename(name = str_datetime)
1135 self.figfile = self.getFilename(name = str_datetime)
1136
1136
1137 if figpath != '':
1137 if figpath != '':
1138 self.counter_imagwr += 1
1138 self.counter_imagwr += 1
1139 if (self.counter_imagwr>=wr_period):
1139 if (self.counter_imagwr>=wr_period):
1140 # store png plot to local folder
1140 # store png plot to local folder
1141 self.saveFigure(figpath, self.figfile)
1141 self.saveFigure(figpath, self.figfile)
1142 # store png plot to FTP server according to RT-Web format
1142 # store png plot to FTP server according to RT-Web format
1143 name = self.getNameToFtp(thisDatetime, self.FTP_WEI, self.EXP_CODE, self.SUB_EXP_CODE, self.PLOT_CODE, self.PLOT_POS)
1143 name = self.getNameToFtp(thisDatetime, self.FTP_WEI, self.EXP_CODE, self.SUB_EXP_CODE, self.PLOT_CODE, self.PLOT_POS)
1144 ftp_filename = os.path.join(figpath, name)
1144 ftp_filename = os.path.join(figpath, name)
1145 self.saveFigure(figpath, ftp_filename)
1145 self.saveFigure(figpath, ftp_filename)
1146 self.counter_imagwr = 0
1146 self.counter_imagwr = 0
1147
1147
1148
1148
1149 class BeaconPhase(Figure):
1149 class BeaconPhase(Figure):
1150
1150
1151 __isConfig = None
1151 __isConfig = None
1152 __nsubplots = None
1152 __nsubplots = None
1153
1153
1154 PREFIX = 'beacon_phase'
1154 PREFIX = 'beacon_phase'
1155
1155
1156 def __init__(self):
1156 def __init__(self):
1157
1157
1158 self.timerange = 24*60*60
1158 self.timerange = 24*60*60
1159 self.__isConfig = False
1159 self.__isConfig = False
1160 self.__nsubplots = 1
1160 self.__nsubplots = 1
1161 self.counter_imagwr = 0
1161 self.counter_imagwr = 0
1162 self.WIDTH = 600
1162 self.WIDTH = 600
1163 self.HEIGHT = 300
1163 self.HEIGHT = 300
1164 self.WIDTHPROF = 120
1164 self.WIDTHPROF = 120
1165 self.HEIGHTPROF = 0
1165 self.HEIGHTPROF = 0
1166 self.xdata = None
1166 self.xdata = None
1167 self.ydata = None
1167 self.ydata = None
1168
1168
1169 self.PLOT_CODE = 18
1169 self.PLOT_CODE = 18
1170 self.FTP_WEI = None
1170 self.FTP_WEI = None
1171 self.EXP_CODE = None
1171 self.EXP_CODE = None
1172 self.SUB_EXP_CODE = None
1172 self.SUB_EXP_CODE = None
1173 self.PLOT_POS = None
1173 self.PLOT_POS = None
1174
1174
1175 self.filename_phase = None
1175 self.filename_phase = None
1176
1176
1177 self.figfile = None
1177 self.figfile = None
1178
1178
1179 def getSubplots(self):
1179 def getSubplots(self):
1180
1180
1181 ncol = 1
1181 ncol = 1
1182 nrow = 1
1182 nrow = 1
1183
1183
1184 return nrow, ncol
1184 return nrow, ncol
1185
1185
1186 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
1186 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
1187
1187
1188 self.__showprofile = showprofile
1188 self.__showprofile = showprofile
1189 self.nplots = nplots
1189 self.nplots = nplots
1190
1190
1191 ncolspan = 7
1191 ncolspan = 7
1192 colspan = 6
1192 colspan = 6
1193 self.__nsubplots = 2
1193 self.__nsubplots = 2
1194
1194
1195 self.createFigure(id = id,
1195 self.createFigure(id = id,
1196 wintitle = wintitle,
1196 wintitle = wintitle,
1197 widthplot = self.WIDTH+self.WIDTHPROF,
1197 widthplot = self.WIDTH+self.WIDTHPROF,
1198 heightplot = self.HEIGHT+self.HEIGHTPROF,
1198 heightplot = self.HEIGHT+self.HEIGHTPROF,
1199 show=show)
1199 show=show)
1200
1200
1201 nrow, ncol = self.getSubplots()
1201 nrow, ncol = self.getSubplots()
1202
1202
1203 self.addAxes(nrow, ncol*ncolspan, 0, 0, colspan, 1)
1203 self.addAxes(nrow, ncol*ncolspan, 0, 0, colspan, 1)
1204
1204
1205 def save_phase(self, filename_phase):
1205 def save_phase(self, filename_phase):
1206 f = open(filename_phase,'w+')
1206 f = open(filename_phase,'w+')
1207 f.write('\n\n')
1207 f.write('\n\n')
1208 f.write('JICAMARCA RADIO OBSERVATORY - Beacon Phase \n')
1208 f.write('JICAMARCA RADIO OBSERVATORY - Beacon Phase \n')
1209 f.write('DD MM YYYY HH MM SS pair(2,0) pair(2,1) pair(2,3) pair(2,4)\n\n' )
1209 f.write('DD MM YYYY HH MM SS pair(2,0) pair(2,1) pair(2,3) pair(2,4)\n\n' )
1210 f.close()
1210 f.close()
1211
1211
1212 def save_data(self, filename_phase, data, data_datetime):
1212 def save_data(self, filename_phase, data, data_datetime):
1213 f=open(filename_phase,'a')
1213 f=open(filename_phase,'a')
1214 timetuple_data = data_datetime.timetuple()
1214 timetuple_data = data_datetime.timetuple()
1215 day = str(timetuple_data.tm_mday)
1215 day = str(timetuple_data.tm_mday)
1216 month = str(timetuple_data.tm_mon)
1216 month = str(timetuple_data.tm_mon)
1217 year = str(timetuple_data.tm_year)
1217 year = str(timetuple_data.tm_year)
1218 hour = str(timetuple_data.tm_hour)
1218 hour = str(timetuple_data.tm_hour)
1219 minute = str(timetuple_data.tm_min)
1219 minute = str(timetuple_data.tm_min)
1220 second = str(timetuple_data.tm_sec)
1220 second = str(timetuple_data.tm_sec)
1221 f.write(day+' '+month+' '+year+' '+hour+' '+minute+' '+second+' '+str(data[0])+' '+str(data[1])+' '+str(data[2])+' '+str(data[3])+'\n')
1221 f.write(day+' '+month+' '+year+' '+hour+' '+minute+' '+second+' '+str(data[0])+' '+str(data[1])+' '+str(data[2])+' '+str(data[3])+'\n')
1222 f.close()
1222 f.close()
1223
1223
1224
1224
1225 def run(self, dataOut, id, wintitle="", pairsList=None, showprofile='True',
1225 def run(self, dataOut, id, wintitle="", pairsList=None, showprofile='True',
1226 xmin=None, xmax=None, ymin=None, ymax=None,
1226 xmin=None, xmax=None, ymin=None, ymax=None,
1227 timerange=None,
1227 timerange=None,
1228 save=False, figpath='', figfile=None, show=True, ftp=False, wr_period=1,
1228 save=False, figpath='', figfile=None, show=True, ftp=False, wr_period=1,
1229 server=None, folder=None, username=None, password=None,
1229 server=None, folder=None, username=None, password=None,
1230 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0):
1230 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0):
1231
1231
1232 if pairsList == None:
1232 if pairsList == None:
1233 pairsIndexList = dataOut.pairsIndexList
1233 pairsIndexList = dataOut.pairsIndexList
1234 else:
1234 else:
1235 pairsIndexList = []
1235 pairsIndexList = []
1236 for pair in pairsList:
1236 for pair in pairsList:
1237 if pair not in dataOut.pairsList:
1237 if pair not in dataOut.pairsList:
1238 raise ValueError, "Pair %s is not in dataOut.pairsList" %(pair)
1238 raise ValueError, "Pair %s is not in dataOut.pairsList" %(pair)
1239 pairsIndexList.append(dataOut.pairsList.index(pair))
1239 pairsIndexList.append(dataOut.pairsList.index(pair))
1240
1240
1241 if pairsIndexList == []:
1241 if pairsIndexList == []:
1242 return
1242 return
1243
1243
1244 # if len(pairsIndexList) > 4:
1244 # if len(pairsIndexList) > 4:
1245 # pairsIndexList = pairsIndexList[0:4]
1245 # pairsIndexList = pairsIndexList[0:4]
1246
1246
1247 if timerange != None:
1247 if timerange != None:
1248 self.timerange = timerange
1248 self.timerange = timerange
1249
1249
1250 tmin = None
1250 tmin = None
1251 tmax = None
1251 tmax = None
1252 x = dataOut.getTimeRange()
1252 x = dataOut.getTimeRange()
1253 y = dataOut.getHeiRange()
1253 y = dataOut.getHeiRange()
1254
1254
1255
1255
1256 #thisDatetime = dataOut.datatime
1256 #thisDatetime = dataOut.datatime
1257 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[1])
1257 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[1])
1258 title = wintitle + " Phase of Beacon Signal" # : %s" %(thisDatetime.strftime("%d-%b-%Y"))
1258 title = wintitle + " Phase of Beacon Signal" # : %s" %(thisDatetime.strftime("%d-%b-%Y"))
1259 xlabel = "Local Time"
1259 xlabel = "Local Time"
1260 ylabel = "Phase"
1260 ylabel = "Phase"
1261
1261
1262 nplots = len(pairsIndexList)
1262 nplots = len(pairsIndexList)
1263 #phase = numpy.zeros((len(pairsIndexList),len(dataOut.beacon_heiIndexList)))
1263 #phase = numpy.zeros((len(pairsIndexList),len(dataOut.beacon_heiIndexList)))
1264 phase_beacon = numpy.zeros(len(pairsIndexList))
1264 phase_beacon = numpy.zeros(len(pairsIndexList))
1265 for i in range(nplots):
1265 for i in range(nplots):
1266 pair = dataOut.pairsList[pairsIndexList[i]]
1266 pair = dataOut.pairsList[pairsIndexList[i]]
1267 ccf = numpy.average(dataOut.data_cspc[pairsIndexList[i],:,:],axis=0)
1267 ccf = numpy.average(dataOut.data_cspc[pairsIndexList[i],:,:],axis=0)
1268 powa = numpy.average(dataOut.data_spc[pair[0],:,:],axis=0)
1268 powa = numpy.average(dataOut.data_spc[pair[0],:,:],axis=0)
1269 powb = numpy.average(dataOut.data_spc[pair[1],:,:],axis=0)
1269 powb = numpy.average(dataOut.data_spc[pair[1],:,:],axis=0)
1270 avgcoherenceComplex = ccf/numpy.sqrt(powa*powb)
1270 avgcoherenceComplex = ccf/numpy.sqrt(powa*powb)
1271 phase = numpy.arctan2(avgcoherenceComplex.imag, avgcoherenceComplex.real)*180/numpy.pi
1271 phase = numpy.arctan2(avgcoherenceComplex.imag, avgcoherenceComplex.real)*180/numpy.pi
1272
1272
1273 #print "Phase %d%d" %(pair[0], pair[1])
1273 #print "Phase %d%d" %(pair[0], pair[1])
1274 #print phase[dataOut.beacon_heiIndexList]
1274 #print phase[dataOut.beacon_heiIndexList]
1275
1275
1276 phase_beacon[i] = numpy.average(phase[dataOut.beacon_heiIndexList])
1276 phase_beacon[i] = numpy.average(phase[dataOut.beacon_heiIndexList])
1277
1277
1278 if not self.__isConfig:
1278 if not self.__isConfig:
1279
1279
1280 nplots = len(pairsIndexList)
1280 nplots = len(pairsIndexList)
1281
1281
1282 self.setup(id=id,
1282 self.setup(id=id,
1283 nplots=nplots,
1283 nplots=nplots,
1284 wintitle=wintitle,
1284 wintitle=wintitle,
1285 showprofile=showprofile,
1285 showprofile=showprofile,
1286 show=show)
1286 show=show)
1287
1287
1288 tmin, tmax = self.getTimeLim(x, xmin, xmax)
1288 tmin, tmax = self.getTimeLim(x, xmin, xmax)
1289 if ymin == None: ymin = numpy.nanmin(phase_beacon) - 10.0
1289 if ymin == None: ymin = numpy.nanmin(phase_beacon) - 10.0
1290 if ymax == None: ymax = numpy.nanmax(phase_beacon) + 10.0
1290 if ymax == None: ymax = numpy.nanmax(phase_beacon) + 10.0
1291
1291
1292 self.FTP_WEI = ftp_wei
1292 self.FTP_WEI = ftp_wei
1293 self.EXP_CODE = exp_code
1293 self.EXP_CODE = exp_code
1294 self.SUB_EXP_CODE = sub_exp_code
1294 self.SUB_EXP_CODE = sub_exp_code
1295 self.PLOT_POS = plot_pos
1295 self.PLOT_POS = plot_pos
1296
1296
1297 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
1297 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
1298 self.__isConfig = True
1298 self.__isConfig = True
1299 self.figfile = figfile
1299 self.figfile = figfile
1300 self.xdata = numpy.array([])
1300 self.xdata = numpy.array([])
1301 self.ydata = numpy.array([])
1301 self.ydata = numpy.array([])
1302
1302
1303 #open file beacon phase
1303 #open file beacon phase
1304 path = '%s%03d' %(self.PREFIX, self.id)
1304 path = '%s%03d' %(self.PREFIX, self.id)
1305 beacon_file = os.path.join(path,'%s.txt'%self.name)
1305 beacon_file = os.path.join(path,'%s.txt'%self.name)
1306 self.filename_phase = os.path.join(figpath,beacon_file)
1306 self.filename_phase = os.path.join(figpath,beacon_file)
1307 #self.save_phase(self.filename_phase)
1307 #self.save_phase(self.filename_phase)
1308
1308
1309
1309
1310 #store data beacon phase
1310 #store data beacon phase
1311 #self.save_data(self.filename_phase, phase_beacon, thisDatetime)
1311 #self.save_data(self.filename_phase, phase_beacon, thisDatetime)
1312
1312
1313 self.setWinTitle(title)
1313 self.setWinTitle(title)
1314
1314
1315
1315
1316 title = "Beacon Signal %s" %(thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
1316 title = "Beacon Signal %s" %(thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
1317
1317
1318 legendlabels = ["pairs %d%d"%(pair[0], pair[1]) for pair in dataOut.pairsList]
1318 legendlabels = ["pairs %d%d"%(pair[0], pair[1]) for pair in dataOut.pairsList]
1319
1319
1320 axes = self.axesList[0]
1320 axes = self.axesList[0]
1321
1321
1322 self.xdata = numpy.hstack((self.xdata, x[0:1]))
1322 self.xdata = numpy.hstack((self.xdata, x[0:1]))
1323
1323
1324 if len(self.ydata)==0:
1324 if len(self.ydata)==0:
1325 self.ydata = phase_beacon.reshape(-1,1)
1325 self.ydata = phase_beacon.reshape(-1,1)
1326 else:
1326 else:
1327 self.ydata = numpy.hstack((self.ydata, phase_beacon.reshape(-1,1)))
1327 self.ydata = numpy.hstack((self.ydata, phase_beacon.reshape(-1,1)))
1328
1328
1329
1329
1330 axes.pmultilineyaxis(x=self.xdata, y=self.ydata,
1330 axes.pmultilineyaxis(x=self.xdata, y=self.ydata,
1331 xmin=tmin, xmax=tmax, ymin=ymin, ymax=ymax,
1331 xmin=tmin, xmax=tmax, ymin=ymin, ymax=ymax,
1332 xlabel=xlabel, ylabel=ylabel, title=title, legendlabels=legendlabels, marker='x', markersize=8, linestyle="solid",
1332 xlabel=xlabel, ylabel=ylabel, title=title, legendlabels=legendlabels, marker='x', markersize=8, linestyle="solid",
1333 XAxisAsTime=True, grid='both'
1333 XAxisAsTime=True, grid='both'
1334 )
1334 )
1335
1335
1336 self.draw()
1336 self.draw()
1337
1337
1338 if x[1] >= self.axesList[0].xmax:
1338 if x[1] >= self.axesList[0].xmax:
1339 self.counter_imagwr = wr_period
1339 self.counter_imagwr = wr_period
1340 del self.xdata
1340 del self.xdata
1341 del self.ydata
1341 del self.ydata
1342 self.__isConfig = False
1342 self.__isConfig = False
1343
1343
1344 if self.figfile == None:
1344 if self.figfile == None:
1345 str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S")
1345 str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S")
1346 self.figfile = self.getFilename(name = str_datetime)
1346 self.figfile = self.getFilename(name = str_datetime)
1347
1347
1348 if figpath != '':
1348 if figpath != '':
1349 self.counter_imagwr += 1
1349 self.counter_imagwr += 1
1350 if (self.counter_imagwr>=wr_period):
1350 if (self.counter_imagwr>=wr_period):
1351 # store png plot to local folder
1351 # store png plot to local folder
1352 self.saveFigure(figpath, self.figfile)
1352 self.saveFigure(figpath, self.figfile)
1353 # store png plot to FTP server according to RT-Web format
1353 # store png plot to FTP server according to RT-Web format
1354 name = self.getNameToFtp(thisDatetime, self.FTP_WEI, self.EXP_CODE, self.SUB_EXP_CODE, self.PLOT_CODE, self.PLOT_POS)
1354 name = self.getNameToFtp(thisDatetime, self.FTP_WEI, self.EXP_CODE, self.SUB_EXP_CODE, self.PLOT_CODE, self.PLOT_POS)
1355 ftp_filename = os.path.join(figpath, name)
1355 ftp_filename = os.path.join(figpath, name)
1356 self.saveFigure(figpath, ftp_filename)
1356 self.saveFigure(figpath, ftp_filename)
1357 self.counter_imagwr = 0
1357 self.counter_imagwr = 0
@@ -1,383 +1,427
1 import numpy
1 import numpy
2 import datetime
2 import datetime
3 import sys
3 import sys
4 import matplotlib
4 import matplotlib
5
5
6 if 'linux' in sys.platform:
6 if 'linux' in sys.platform:
7 matplotlib.use("TKAgg")
7 matplotlib.use("TKAgg")
8
8
9 if 'darwin' in sys.platform:
9 if 'darwin' in sys.platform:
10 matplotlib.use("TKAgg")
10 matplotlib.use("TKAgg")
11
11
12 import matplotlib.pyplot
12 import matplotlib.pyplot
13
13
14 from mpl_toolkits.axes_grid1 import make_axes_locatable
14 from mpl_toolkits.axes_grid1 import make_axes_locatable
15 from matplotlib.ticker import *
15 from matplotlib.ticker import *
16
16
17 ###########################################
17 ###########################################
18 #Actualizacion de las funciones del driver
18 #Actualizacion de las funciones del driver
19 ###########################################
19 ###########################################
20
20
21 def createFigure(id, wintitle, width, height, facecolor="w", show=True):
21 def createFigure(id, wintitle, width, height, facecolor="w", show=True):
22
22
23 matplotlib.pyplot.ioff()
23 matplotlib.pyplot.ioff()
24 fig = matplotlib.pyplot.figure(num=id, facecolor=facecolor)
24 fig = matplotlib.pyplot.figure(num=id, facecolor=facecolor)
25 fig.canvas.manager.set_window_title(wintitle)
25 fig.canvas.manager.set_window_title(wintitle)
26 fig.canvas.manager.resize(width, height)
26 fig.canvas.manager.resize(width, height)
27 matplotlib.pyplot.ion()
27 matplotlib.pyplot.ion()
28 if show:
28 if show:
29 matplotlib.pyplot.show()
29 matplotlib.pyplot.show()
30
30
31 return fig
31 return fig
32
32
33 def closeFigure(show=True):
33 def closeFigure(show=True):
34
34
35 matplotlib.pyplot.ioff()
35 matplotlib.pyplot.ioff()
36 if show:
36 if show:
37 matplotlib.pyplot.show()
37 matplotlib.pyplot.show()
38
38
39 return
39 return
40
40
41 def saveFigure(fig, filename):
41 def saveFigure(fig, filename):
42
42
43 matplotlib.pyplot.ioff()
43 matplotlib.pyplot.ioff()
44 fig.savefig(filename)
44 fig.savefig(filename)
45 matplotlib.pyplot.ion()
45 matplotlib.pyplot.ion()
46
46
47 def setWinTitle(fig, title):
47 def setWinTitle(fig, title):
48
48
49 fig.canvas.manager.set_window_title(title)
49 fig.canvas.manager.set_window_title(title)
50
50
51 def setTitle(fig, title):
51 def setTitle(fig, title):
52
52
53 fig.suptitle(title)
53 fig.suptitle(title)
54
54
55 def createAxes(fig, nrow, ncol, xpos, ypos, colspan, rowspan):
55 def createAxes(fig, nrow, ncol, xpos, ypos, colspan, rowspan, polar=False):
56
56
57 matplotlib.pyplot.ioff()
57 matplotlib.pyplot.ioff()
58 matplotlib.pyplot.figure(fig.number)
58 matplotlib.pyplot.figure(fig.number)
59 axes = matplotlib.pyplot.subplot2grid((nrow, ncol),
59 axes = matplotlib.pyplot.subplot2grid((nrow, ncol),
60 (xpos, ypos),
60 (xpos, ypos),
61 colspan=colspan,
61 colspan=colspan,
62 rowspan=rowspan)
62 rowspan=rowspan,
63 polar=polar)
63
64
64 matplotlib.pyplot.ion()
65 matplotlib.pyplot.ion()
65 return axes
66 return axes
66
67
67 def setAxesText(ax, text):
68 def setAxesText(ax, text):
68
69
69 ax.annotate(text,
70 ax.annotate(text,
70 xy = (.1, .99),
71 xy = (.1, .99),
71 xycoords = 'figure fraction',
72 xycoords = 'figure fraction',
72 horizontalalignment = 'left',
73 horizontalalignment = 'left',
73 verticalalignment = 'top',
74 verticalalignment = 'top',
74 fontsize = 10)
75 fontsize = 10)
75
76
76 def printLabels(ax, xlabel, ylabel, title):
77 def printLabels(ax, xlabel, ylabel, title):
77
78
78 ax.set_xlabel(xlabel, size=11)
79 ax.set_xlabel(xlabel, size=11)
79 ax.set_ylabel(ylabel, size=11)
80 ax.set_ylabel(ylabel, size=11)
80 ax.set_title(title, size=8)
81 ax.set_title(title, size=8)
81
82
82 def createPline(ax, x, y, xmin, xmax, ymin, ymax, xlabel='', ylabel='', title='',
83 def createPline(ax, x, y, xmin, xmax, ymin, ymax, xlabel='', ylabel='', title='',
83 ticksize=9, xtick_visible=True, ytick_visible=True,
84 ticksize=9, xtick_visible=True, ytick_visible=True,
84 nxticks=4, nyticks=10,
85 nxticks=4, nyticks=10,
85 grid=None,color='blue'):
86 grid=None,color='blue'):
86
87
87 """
88 """
88
89
89 Input:
90 Input:
90 grid : None, 'both', 'x', 'y'
91 grid : None, 'both', 'x', 'y'
91 """
92 """
92
93
93 matplotlib.pyplot.ioff()
94 matplotlib.pyplot.ioff()
94
95
95 ax.set_xlim([xmin,xmax])
96 ax.set_xlim([xmin,xmax])
96 ax.set_ylim([ymin,ymax])
97 ax.set_ylim([ymin,ymax])
97
98
98 printLabels(ax, xlabel, ylabel, title)
99 printLabels(ax, xlabel, ylabel, title)
99
100
100 ######################################################
101 ######################################################
101 if (xmax-xmin)<=1:
102 if (xmax-xmin)<=1:
102 xtickspos = numpy.linspace(xmin,xmax,nxticks)
103 xtickspos = numpy.linspace(xmin,xmax,nxticks)
103 xtickspos = numpy.array([float("%.1f"%i) for i in xtickspos])
104 xtickspos = numpy.array([float("%.1f"%i) for i in xtickspos])
104 ax.set_xticks(xtickspos)
105 ax.set_xticks(xtickspos)
105 else:
106 else:
106 xtickspos = numpy.arange(nxticks)*int((xmax-xmin)/(nxticks)) + int(xmin)
107 xtickspos = numpy.arange(nxticks)*int((xmax-xmin)/(nxticks)) + int(xmin)
107 # xtickspos = numpy.arange(nxticks)*float(xmax-xmin)/float(nxticks) + int(xmin)
108 # xtickspos = numpy.arange(nxticks)*float(xmax-xmin)/float(nxticks) + int(xmin)
108 ax.set_xticks(xtickspos)
109 ax.set_xticks(xtickspos)
109
110
110 for tick in ax.get_xticklabels():
111 for tick in ax.get_xticklabels():
111 tick.set_visible(xtick_visible)
112 tick.set_visible(xtick_visible)
112
113
113 for tick in ax.xaxis.get_major_ticks():
114 for tick in ax.xaxis.get_major_ticks():
114 tick.label.set_fontsize(ticksize)
115 tick.label.set_fontsize(ticksize)
115
116
116 ######################################################
117 ######################################################
117 for tick in ax.get_yticklabels():
118 for tick in ax.get_yticklabels():
118 tick.set_visible(ytick_visible)
119 tick.set_visible(ytick_visible)
119
120
120 for tick in ax.yaxis.get_major_ticks():
121 for tick in ax.yaxis.get_major_ticks():
121 tick.label.set_fontsize(ticksize)
122 tick.label.set_fontsize(ticksize)
122
123
123 ax.plot(x, y, color=color)
124 ax.plot(x, y, color=color)
124 iplot = ax.lines[-1]
125 iplot = ax.lines[-1]
125
126
126 ######################################################
127 ######################################################
127 if '0.' in matplotlib.__version__[0:2]:
128 if '0.' in matplotlib.__version__[0:2]:
128 print "The matplotlib version has to be updated to 1.1 or newer"
129 print "The matplotlib version has to be updated to 1.1 or newer"
129 return iplot
130 return iplot
130
131
131 if '1.0.' in matplotlib.__version__[0:4]:
132 if '1.0.' in matplotlib.__version__[0:4]:
132 print "The matplotlib version has to be updated to 1.1 or newer"
133 print "The matplotlib version has to be updated to 1.1 or newer"
133 return iplot
134 return iplot
134
135
135 if grid != None:
136 if grid != None:
136 ax.grid(b=True, which='major', axis=grid)
137 ax.grid(b=True, which='major', axis=grid)
137
138
138 matplotlib.pyplot.tight_layout()
139 matplotlib.pyplot.tight_layout()
139
140
140 matplotlib.pyplot.ion()
141 matplotlib.pyplot.ion()
141
142
142 return iplot
143 return iplot
143
144
144 def set_linedata(ax, x, y, idline):
145 def set_linedata(ax, x, y, idline):
145
146
146 ax.lines[idline].set_data(x,y)
147 ax.lines[idline].set_data(x,y)
147
148
148 def pline(iplot, x, y, xlabel='', ylabel='', title=''):
149 def pline(iplot, x, y, xlabel='', ylabel='', title=''):
149
150
150 ax = iplot.get_axes()
151 ax = iplot.get_axes()
151
152
152 printLabels(ax, xlabel, ylabel, title)
153 printLabels(ax, xlabel, ylabel, title)
153
154
154 set_linedata(ax, x, y, idline=0)
155 set_linedata(ax, x, y, idline=0)
155
156
156 def addpline(ax, x, y, color, linestyle, lw):
157 def addpline(ax, x, y, color, linestyle, lw):
157
158
158 ax.plot(x,y,color=color,linestyle=linestyle,lw=lw)
159 ax.plot(x,y,color=color,linestyle=linestyle,lw=lw)
159
160
160
161
161 def createPcolor(ax, x, y, z, xmin, xmax, ymin, ymax, zmin, zmax,
162 def createPcolor(ax, x, y, z, xmin, xmax, ymin, ymax, zmin, zmax,
162 xlabel='', ylabel='', title='', ticksize = 9,
163 xlabel='', ylabel='', title='', ticksize = 9,
163 colormap='jet',cblabel='', cbsize="5%",
164 colormap='jet',cblabel='', cbsize="5%",
164 XAxisAsTime=False):
165 XAxisAsTime=False):
165
166
166 matplotlib.pyplot.ioff()
167 matplotlib.pyplot.ioff()
167
168
168 divider = make_axes_locatable(ax)
169 divider = make_axes_locatable(ax)
169 ax_cb = divider.new_horizontal(size=cbsize, pad=0.05)
170 ax_cb = divider.new_horizontal(size=cbsize, pad=0.05)
170 fig = ax.get_figure()
171 fig = ax.get_figure()
171 fig.add_axes(ax_cb)
172 fig.add_axes(ax_cb)
172
173
173 ax.set_xlim([xmin,xmax])
174 ax.set_xlim([xmin,xmax])
174 ax.set_ylim([ymin,ymax])
175 ax.set_ylim([ymin,ymax])
175
176
176 printLabels(ax, xlabel, ylabel, title)
177 printLabels(ax, xlabel, ylabel, title)
177
178
178 imesh = ax.pcolormesh(x,y,z.T, vmin=zmin, vmax=zmax, cmap=matplotlib.pyplot.get_cmap(colormap))
179 imesh = ax.pcolormesh(x,y,z.T, vmin=zmin, vmax=zmax, cmap=matplotlib.pyplot.get_cmap(colormap))
179 cb = matplotlib.pyplot.colorbar(imesh, cax=ax_cb)
180 cb = matplotlib.pyplot.colorbar(imesh, cax=ax_cb)
180 cb.set_label(cblabel)
181 cb.set_label(cblabel)
181
182
182 # for tl in ax_cb.get_yticklabels():
183 # for tl in ax_cb.get_yticklabels():
183 # tl.set_visible(True)
184 # tl.set_visible(True)
184
185
185 for tick in ax.yaxis.get_major_ticks():
186 for tick in ax.yaxis.get_major_ticks():
186 tick.label.set_fontsize(ticksize)
187 tick.label.set_fontsize(ticksize)
187
188
188 for tick in ax.xaxis.get_major_ticks():
189 for tick in ax.xaxis.get_major_ticks():
189 tick.label.set_fontsize(ticksize)
190 tick.label.set_fontsize(ticksize)
190
191
191 for tick in cb.ax.get_yticklabels():
192 for tick in cb.ax.get_yticklabels():
192 tick.set_fontsize(ticksize)
193 tick.set_fontsize(ticksize)
193
194
194 ax_cb.yaxis.tick_right()
195 ax_cb.yaxis.tick_right()
195
196
196 if '0.' in matplotlib.__version__[0:2]:
197 if '0.' in matplotlib.__version__[0:2]:
197 print "The matplotlib version has to be updated to 1.1 or newer"
198 print "The matplotlib version has to be updated to 1.1 or newer"
198 return imesh
199 return imesh
199
200
200 if '1.0.' in matplotlib.__version__[0:4]:
201 if '1.0.' in matplotlib.__version__[0:4]:
201 print "The matplotlib version has to be updated to 1.1 or newer"
202 print "The matplotlib version has to be updated to 1.1 or newer"
202 return imesh
203 return imesh
203
204
204 matplotlib.pyplot.tight_layout()
205 matplotlib.pyplot.tight_layout()
205
206
206 if XAxisAsTime:
207 if XAxisAsTime:
207
208
208 func = lambda x, pos: ('%s') %(datetime.datetime.utcfromtimestamp(x).strftime("%H:%M:%S"))
209 func = lambda x, pos: ('%s') %(datetime.datetime.utcfromtimestamp(x).strftime("%H:%M:%S"))
209 ax.xaxis.set_major_formatter(FuncFormatter(func))
210 ax.xaxis.set_major_formatter(FuncFormatter(func))
210 ax.xaxis.set_major_locator(LinearLocator(7))
211 ax.xaxis.set_major_locator(LinearLocator(7))
211
212
212 matplotlib.pyplot.ion()
213 matplotlib.pyplot.ion()
213 return imesh
214 return imesh
214
215
215 def pcolor(imesh, z, xlabel='', ylabel='', title=''):
216 def pcolor(imesh, z, xlabel='', ylabel='', title=''):
216
217
217 z = z.T
218 z = z.T
218
219
219 ax = imesh.get_axes()
220 ax = imesh.get_axes()
220
221
221 printLabels(ax, xlabel, ylabel, title)
222 printLabels(ax, xlabel, ylabel, title)
222
223
223 imesh.set_array(z.ravel())
224 imesh.set_array(z.ravel())
224
225
225 def addpcolor(ax, x, y, z, zmin, zmax, xlabel='', ylabel='', title='', colormap='jet'):
226 def addpcolor(ax, x, y, z, zmin, zmax, xlabel='', ylabel='', title='', colormap='jet'):
226
227
227 printLabels(ax, xlabel, ylabel, title)
228 printLabels(ax, xlabel, ylabel, title)
228
229
229 ax.pcolormesh(x,y,z.T,vmin=zmin,vmax=zmax, cmap=matplotlib.pyplot.get_cmap(colormap))
230 ax.pcolormesh(x,y,z.T,vmin=zmin,vmax=zmax, cmap=matplotlib.pyplot.get_cmap(colormap))
230
231
231 def addpcolorbuffer(ax, x, y, z, zmin, zmax, xlabel='', ylabel='', title='', colormap='jet'):
232 def addpcolorbuffer(ax, x, y, z, zmin, zmax, xlabel='', ylabel='', title='', colormap='jet'):
232
233
233 printLabels(ax, xlabel, ylabel, title)
234 printLabels(ax, xlabel, ylabel, title)
234
235
235 ax.collections.remove(ax.collections[0])
236 ax.collections.remove(ax.collections[0])
236
237
237 ax.pcolormesh(x,y,z.T,vmin=zmin,vmax=zmax, cmap=matplotlib.pyplot.get_cmap(colormap))
238 ax.pcolormesh(x,y,z.T,vmin=zmin,vmax=zmax, cmap=matplotlib.pyplot.get_cmap(colormap))
238
239
239 def createPmultiline(ax, x, y, xmin, xmax, ymin, ymax, xlabel='', ylabel='', title='', legendlabels=None,
240 def createPmultiline(ax, x, y, xmin, xmax, ymin, ymax, xlabel='', ylabel='', title='', legendlabels=None,
240 ticksize=9, xtick_visible=True, ytick_visible=True,
241 ticksize=9, xtick_visible=True, ytick_visible=True,
241 nxticks=4, nyticks=10,
242 nxticks=4, nyticks=10,
242 grid=None):
243 grid=None):
243
244
244 """
245 """
245
246
246 Input:
247 Input:
247 grid : None, 'both', 'x', 'y'
248 grid : None, 'both', 'x', 'y'
248 """
249 """
249
250
250 matplotlib.pyplot.ioff()
251 matplotlib.pyplot.ioff()
251
252
252 lines = ax.plot(x.T, y)
253 lines = ax.plot(x.T, y)
253 leg = ax.legend(lines, legendlabels, loc='upper right')
254 leg = ax.legend(lines, legendlabels, loc='upper right')
254 leg.get_frame().set_alpha(0.5)
255 leg.get_frame().set_alpha(0.5)
255 ax.set_xlim([xmin,xmax])
256 ax.set_xlim([xmin,xmax])
256 ax.set_ylim([ymin,ymax])
257 ax.set_ylim([ymin,ymax])
257 printLabels(ax, xlabel, ylabel, title)
258 printLabels(ax, xlabel, ylabel, title)
258
259
259 xtickspos = numpy.arange(nxticks)*int((xmax-xmin)/(nxticks)) + int(xmin)
260 xtickspos = numpy.arange(nxticks)*int((xmax-xmin)/(nxticks)) + int(xmin)
260 ax.set_xticks(xtickspos)
261 ax.set_xticks(xtickspos)
261
262
262 for tick in ax.get_xticklabels():
263 for tick in ax.get_xticklabels():
263 tick.set_visible(xtick_visible)
264 tick.set_visible(xtick_visible)
264
265
265 for tick in ax.xaxis.get_major_ticks():
266 for tick in ax.xaxis.get_major_ticks():
266 tick.label.set_fontsize(ticksize)
267 tick.label.set_fontsize(ticksize)
267
268
268 for tick in ax.get_yticklabels():
269 for tick in ax.get_yticklabels():
269 tick.set_visible(ytick_visible)
270 tick.set_visible(ytick_visible)
270
271
271 for tick in ax.yaxis.get_major_ticks():
272 for tick in ax.yaxis.get_major_ticks():
272 tick.label.set_fontsize(ticksize)
273 tick.label.set_fontsize(ticksize)
273
274
274 iplot = ax.lines[-1]
275 iplot = ax.lines[-1]
275
276
276 if '0.' in matplotlib.__version__[0:2]:
277 if '0.' in matplotlib.__version__[0:2]:
277 print "The matplotlib version has to be updated to 1.1 or newer"
278 print "The matplotlib version has to be updated to 1.1 or newer"
278 return iplot
279 return iplot
279
280
280 if '1.0.' in matplotlib.__version__[0:4]:
281 if '1.0.' in matplotlib.__version__[0:4]:
281 print "The matplotlib version has to be updated to 1.1 or newer"
282 print "The matplotlib version has to be updated to 1.1 or newer"
282 return iplot
283 return iplot
283
284
284 if grid != None:
285 if grid != None:
285 ax.grid(b=True, which='major', axis=grid)
286 ax.grid(b=True, which='major', axis=grid)
286
287
287 matplotlib.pyplot.tight_layout()
288 matplotlib.pyplot.tight_layout()
288
289
289 matplotlib.pyplot.ion()
290 matplotlib.pyplot.ion()
290
291
291 return iplot
292 return iplot
292
293
293
294
294 def pmultiline(iplot, x, y, xlabel='', ylabel='', title=''):
295 def pmultiline(iplot, x, y, xlabel='', ylabel='', title=''):
295
296
296 ax = iplot.get_axes()
297 ax = iplot.get_axes()
297
298
298 printLabels(ax, xlabel, ylabel, title)
299 printLabels(ax, xlabel, ylabel, title)
299
300
300 for i in range(len(ax.lines)):
301 for i in range(len(ax.lines)):
301 line = ax.lines[i]
302 line = ax.lines[i]
302 line.set_data(x[i,:],y)
303 line.set_data(x[i,:],y)
303
304
304 def createPmultilineYAxis(ax, x, y, xmin, xmax, ymin, ymax, xlabel='', ylabel='', title='', legendlabels=None,
305 def createPmultilineYAxis(ax, x, y, xmin, xmax, ymin, ymax, xlabel='', ylabel='', title='', legendlabels=None,
305 ticksize=9, xtick_visible=True, ytick_visible=True,
306 ticksize=9, xtick_visible=True, ytick_visible=True,
306 nxticks=4, nyticks=10, marker='.', markersize=10, linestyle="None",
307 nxticks=4, nyticks=10, marker='.', markersize=10, linestyle="None",
307 grid=None, XAxisAsTime=False):
308 grid=None, XAxisAsTime=False):
308
309
309 """
310 """
310
311
311 Input:
312 Input:
312 grid : None, 'both', 'x', 'y'
313 grid : None, 'both', 'x', 'y'
313 """
314 """
314
315
315 matplotlib.pyplot.ioff()
316 matplotlib.pyplot.ioff()
316
317
317 # lines = ax.plot(x, y.T, marker=marker,markersize=markersize,linestyle=linestyle)
318 # lines = ax.plot(x, y.T, marker=marker,markersize=markersize,linestyle=linestyle)
318 lines = ax.plot(x, y.T, linestyle='None', marker='.', markersize=markersize)
319 lines = ax.plot(x, y.T, linestyle='None', marker='.', markersize=markersize)
319 leg = ax.legend(lines, legendlabels, loc='upper left', bbox_to_anchor=(1.01, 1.00), numpoints=1, handlelength=1.5, \
320 leg = ax.legend(lines, legendlabels, loc='upper left', bbox_to_anchor=(1.01, 1.00), numpoints=1, handlelength=1.5, \
320 handletextpad=0.5, borderpad=0.5, labelspacing=0.5, borderaxespad=0.)
321 handletextpad=0.5, borderpad=0.5, labelspacing=0.5, borderaxespad=0.)
321
322
322 for label in leg.get_texts(): label.set_fontsize(9)
323 for label in leg.get_texts(): label.set_fontsize(9)
323
324
324 ax.set_xlim([xmin,xmax])
325 ax.set_xlim([xmin,xmax])
325 ax.set_ylim([ymin,ymax])
326 ax.set_ylim([ymin,ymax])
326 printLabels(ax, xlabel, ylabel, title)
327 printLabels(ax, xlabel, ylabel, title)
327
328
328 # xtickspos = numpy.arange(nxticks)*int((xmax-xmin)/(nxticks)) + int(xmin)
329 # xtickspos = numpy.arange(nxticks)*int((xmax-xmin)/(nxticks)) + int(xmin)
329 # ax.set_xticks(xtickspos)
330 # ax.set_xticks(xtickspos)
330
331
331 for tick in ax.get_xticklabels():
332 for tick in ax.get_xticklabels():
332 tick.set_visible(xtick_visible)
333 tick.set_visible(xtick_visible)
333
334
334 for tick in ax.xaxis.get_major_ticks():
335 for tick in ax.xaxis.get_major_ticks():
335 tick.label.set_fontsize(ticksize)
336 tick.label.set_fontsize(ticksize)
336
337
337 for tick in ax.get_yticklabels():
338 for tick in ax.get_yticklabels():
338 tick.set_visible(ytick_visible)
339 tick.set_visible(ytick_visible)
339
340
340 for tick in ax.yaxis.get_major_ticks():
341 for tick in ax.yaxis.get_major_ticks():
341 tick.label.set_fontsize(ticksize)
342 tick.label.set_fontsize(ticksize)
342
343
343 iplot = ax.lines[-1]
344 iplot = ax.lines[-1]
344
345
345 if '0.' in matplotlib.__version__[0:2]:
346 if '0.' in matplotlib.__version__[0:2]:
346 print "The matplotlib version has to be updated to 1.1 or newer"
347 print "The matplotlib version has to be updated to 1.1 or newer"
347 return iplot
348 return iplot
348
349
349 if '1.0.' in matplotlib.__version__[0:4]:
350 if '1.0.' in matplotlib.__version__[0:4]:
350 print "The matplotlib version has to be updated to 1.1 or newer"
351 print "The matplotlib version has to be updated to 1.1 or newer"
351 return iplot
352 return iplot
352
353
353 if grid != None:
354 if grid != None:
354 ax.grid(b=True, which='major', axis=grid)
355 ax.grid(b=True, which='major', axis=grid)
355
356
356 matplotlib.pyplot.tight_layout()
357 matplotlib.pyplot.tight_layout()
357
358
358 if XAxisAsTime:
359 if XAxisAsTime:
359
360
360 func = lambda x, pos: ('%s') %(datetime.datetime.utcfromtimestamp(x).strftime("%H:%M:%S"))
361 func = lambda x, pos: ('%s') %(datetime.datetime.utcfromtimestamp(x).strftime("%H:%M:%S"))
361 ax.xaxis.set_major_formatter(FuncFormatter(func))
362 ax.xaxis.set_major_formatter(FuncFormatter(func))
362 ax.xaxis.set_major_locator(LinearLocator(7))
363 ax.xaxis.set_major_locator(LinearLocator(7))
363
364
364 matplotlib.pyplot.ion()
365 matplotlib.pyplot.ion()
365
366
366 return iplot
367 return iplot
367
368
368 def pmultilineyaxis(iplot, x, y, xlabel='', ylabel='', title=''):
369 def pmultilineyaxis(iplot, x, y, xlabel='', ylabel='', title=''):
369
370
370 ax = iplot.get_axes()
371 ax = iplot.get_axes()
371
372
372 printLabels(ax, xlabel, ylabel, title)
373 printLabels(ax, xlabel, ylabel, title)
373
374
374 for i in range(len(ax.lines)):
375 for i in range(len(ax.lines)):
375 line = ax.lines[i]
376 line = ax.lines[i]
376 line.set_data(x,y[i,:])
377 line.set_data(x,y[i,:])
378
379 def createPolar(ax, x, y,
380 xlabel='', ylabel='', title='', ticksize = 9,
381 colormap='jet',cblabel='', cbsize="5%",
382 XAxisAsTime=False):
383
384 matplotlib.pyplot.ioff()
385
386 ax.plot(x,y,'bo', markersize=5)
387 # ax.set_rmax(90)
388 ax.set_ylim(0,90)
389 ax.set_yticks(numpy.arange(0,90,20))
390 ax.text(0, -110, ylabel, rotation='vertical', va ='center', ha = 'center' ,size='11')
391 # ax.text(100, 100, 'example', ha='left', va='center', rotation='vertical')
392 printLabels(ax, xlabel, '', title)
393 iplot = ax.lines[-1]
394
395 if '0.' in matplotlib.__version__[0:2]:
396 print "The matplotlib version has to be updated to 1.1 or newer"
397 return iplot
398
399 if '1.0.' in matplotlib.__version__[0:4]:
400 print "The matplotlib version has to be updated to 1.1 or newer"
401 return iplot
402
403 # if grid != None:
404 # ax.grid(b=True, which='major', axis=grid)
405
406 matplotlib.pyplot.tight_layout()
407
408 matplotlib.pyplot.ion()
409
410
411 return iplot
412
413 def polar(iplot, x, y, xlabel='', ylabel='', title=''):
414
415 ax = iplot.get_axes()
416
417 # ax.text(0, -110, ylabel, rotation='vertical', va ='center', ha = 'center',size='11')
418 printLabels(ax, xlabel, '', title)
419
420 set_linedata(ax, x, y, idline=0)
377
421
378 def draw(fig):
422 def draw(fig):
379
423
380 if type(fig) == 'int':
424 if type(fig) == 'int':
381 raise ValueError, "This parameter should be of tpye matplotlib figure"
425 raise ValueError, "This parameter should be of tpye matplotlib figure"
382
426
383 fig.canvas.draw()
427 fig.canvas.draw()
@@ -1,934 +1,935
1 import numpy
1 import numpy
2 import math
2
3
3 from jroproc_base import ProcessingUnit, Operation
4 from jroproc_base import ProcessingUnit, Operation
4 from model.data.jrodata import Spectra
5 from model.data.jrodata import Spectra
5 from model.data.jrodata import hildebrand_sekhon
6 from model.data.jrodata import hildebrand_sekhon
6
7
7 class SpectraProc(ProcessingUnit):
8 class SpectraProc(ProcessingUnit):
8
9
9 def __init__(self):
10 def __init__(self):
10
11
11 ProcessingUnit.__init__(self)
12 ProcessingUnit.__init__(self)
12
13
13 self.buffer = None
14 self.buffer = None
14 self.firstdatatime = None
15 self.firstdatatime = None
15 self.profIndex = 0
16 self.profIndex = 0
16 self.dataOut = Spectra()
17 self.dataOut = Spectra()
17 self.id_min = None
18 self.id_min = None
18 self.id_max = None
19 self.id_max = None
19
20
20 def __updateObjFromInput(self):
21 def __updateObjFromInput(self):
21
22
22 self.dataOut.timeZone = self.dataIn.timeZone
23 self.dataOut.timeZone = self.dataIn.timeZone
23 self.dataOut.dstFlag = self.dataIn.dstFlag
24 self.dataOut.dstFlag = self.dataIn.dstFlag
24 self.dataOut.errorCount = self.dataIn.errorCount
25 self.dataOut.errorCount = self.dataIn.errorCount
25 self.dataOut.useLocalTime = self.dataIn.useLocalTime
26 self.dataOut.useLocalTime = self.dataIn.useLocalTime
26
27
27 self.dataOut.radarControllerHeaderObj = self.dataIn.radarControllerHeaderObj.copy()
28 self.dataOut.radarControllerHeaderObj = self.dataIn.radarControllerHeaderObj.copy()
28 self.dataOut.systemHeaderObj = self.dataIn.systemHeaderObj.copy()
29 self.dataOut.systemHeaderObj = self.dataIn.systemHeaderObj.copy()
29 self.dataOut.channelList = self.dataIn.channelList
30 self.dataOut.channelList = self.dataIn.channelList
30 self.dataOut.heightList = self.dataIn.heightList
31 self.dataOut.heightList = self.dataIn.heightList
31 self.dataOut.dtype = numpy.dtype([('real','<f4'),('imag','<f4')])
32 self.dataOut.dtype = numpy.dtype([('real','<f4'),('imag','<f4')])
32 # self.dataOut.nHeights = self.dataIn.nHeights
33 # self.dataOut.nHeights = self.dataIn.nHeights
33 # self.dataOut.nChannels = self.dataIn.nChannels
34 # self.dataOut.nChannels = self.dataIn.nChannels
34 self.dataOut.nBaud = self.dataIn.nBaud
35 self.dataOut.nBaud = self.dataIn.nBaud
35 self.dataOut.nCode = self.dataIn.nCode
36 self.dataOut.nCode = self.dataIn.nCode
36 self.dataOut.code = self.dataIn.code
37 self.dataOut.code = self.dataIn.code
37 self.dataOut.nProfiles = self.dataOut.nFFTPoints
38 self.dataOut.nProfiles = self.dataOut.nFFTPoints
38 # self.dataOut.channelIndexList = self.dataIn.channelIndexList
39 # self.dataOut.channelIndexList = self.dataIn.channelIndexList
39 self.dataOut.flagTimeBlock = self.dataIn.flagTimeBlock
40 self.dataOut.flagTimeBlock = self.dataIn.flagTimeBlock
40 self.dataOut.utctime = self.firstdatatime
41 self.dataOut.utctime = self.firstdatatime
41 self.dataOut.flagDecodeData = self.dataIn.flagDecodeData #asumo q la data esta decodificada
42 self.dataOut.flagDecodeData = self.dataIn.flagDecodeData #asumo q la data esta decodificada
42 self.dataOut.flagDeflipData = self.dataIn.flagDeflipData #asumo q la data esta sin flip
43 self.dataOut.flagDeflipData = self.dataIn.flagDeflipData #asumo q la data esta sin flip
43 # self.dataOut.flagShiftFFT = self.dataIn.flagShiftFFT
44 # self.dataOut.flagShiftFFT = self.dataIn.flagShiftFFT
44 self.dataOut.nCohInt = self.dataIn.nCohInt
45 self.dataOut.nCohInt = self.dataIn.nCohInt
45 self.dataOut.nIncohInt = 1
46 self.dataOut.nIncohInt = 1
46 # self.dataOut.ippSeconds = self.dataIn.ippSeconds
47 # self.dataOut.ippSeconds = self.dataIn.ippSeconds
47 self.dataOut.windowOfFilter = self.dataIn.windowOfFilter
48 self.dataOut.windowOfFilter = self.dataIn.windowOfFilter
48
49
49 self.dataOut.timeInterval = self.dataIn.timeInterval*self.dataOut.nFFTPoints*self.dataOut.nIncohInt
50 self.dataOut.timeInterval = self.dataIn.timeInterval*self.dataOut.nFFTPoints*self.dataOut.nIncohInt
50 self.dataOut.frequency = self.dataIn.frequency
51 self.dataOut.frequency = self.dataIn.frequency
51 self.dataOut.realtime = self.dataIn.realtime
52 self.dataOut.realtime = self.dataIn.realtime
52
53
53 self.dataOut.azimuth = self.dataIn.azimuth
54 self.dataOut.azimuth = self.dataIn.azimuth
54 self.dataOut.zenith = self.dataIn.zenith
55 self.dataOut.zenith = self.dataIn.zenith
55
56
56 self.dataOut.beam.codeList = self.dataIn.beam.codeList
57 self.dataOut.beam.codeList = self.dataIn.beam.codeList
57 self.dataOut.beam.azimuthList = self.dataIn.beam.azimuthList
58 self.dataOut.beam.azimuthList = self.dataIn.beam.azimuthList
58 self.dataOut.beam.zenithList = self.dataIn.beam.zenithList
59 self.dataOut.beam.zenithList = self.dataIn.beam.zenithList
59
60
60 def __getFft(self):
61 def __getFft(self):
61 """
62 """
62 Convierte valores de Voltaje a Spectra
63 Convierte valores de Voltaje a Spectra
63
64
64 Affected:
65 Affected:
65 self.dataOut.data_spc
66 self.dataOut.data_spc
66 self.dataOut.data_cspc
67 self.dataOut.data_cspc
67 self.dataOut.data_dc
68 self.dataOut.data_dc
68 self.dataOut.heightList
69 self.dataOut.heightList
69 self.profIndex
70 self.profIndex
70 self.buffer
71 self.buffer
71 self.dataOut.flagNoData
72 self.dataOut.flagNoData
72 """
73 """
73 fft_volt = numpy.fft.fft(self.buffer,n=self.dataOut.nFFTPoints,axis=1)
74 fft_volt = numpy.fft.fft(self.buffer,n=self.dataOut.nFFTPoints,axis=1)
74 fft_volt = fft_volt.astype(numpy.dtype('complex'))
75 fft_volt = fft_volt.astype(numpy.dtype('complex'))
75 dc = fft_volt[:,0,:]
76 dc = fft_volt[:,0,:]
76
77
77 #calculo de self-spectra
78 #calculo de self-spectra
78 fft_volt = numpy.fft.fftshift(fft_volt,axes=(1,))
79 fft_volt = numpy.fft.fftshift(fft_volt,axes=(1,))
79 spc = fft_volt * numpy.conjugate(fft_volt)
80 spc = fft_volt * numpy.conjugate(fft_volt)
80 spc = spc.real
81 spc = spc.real
81
82
82 blocksize = 0
83 blocksize = 0
83 blocksize += dc.size
84 blocksize += dc.size
84 blocksize += spc.size
85 blocksize += spc.size
85
86
86 cspc = None
87 cspc = None
87 pairIndex = 0
88 pairIndex = 0
88 if self.dataOut.pairsList != None:
89 if self.dataOut.pairsList != None:
89 #calculo de cross-spectra
90 #calculo de cross-spectra
90 cspc = numpy.zeros((self.dataOut.nPairs, self.dataOut.nFFTPoints, self.dataOut.nHeights), dtype='complex')
91 cspc = numpy.zeros((self.dataOut.nPairs, self.dataOut.nFFTPoints, self.dataOut.nHeights), dtype='complex')
91 for pair in self.dataOut.pairsList:
92 for pair in self.dataOut.pairsList:
92 cspc[pairIndex,:,:] = fft_volt[pair[0],:,:] * numpy.conjugate(fft_volt[pair[1],:,:])
93 cspc[pairIndex,:,:] = fft_volt[pair[0],:,:] * numpy.conjugate(fft_volt[pair[1],:,:])
93 pairIndex += 1
94 pairIndex += 1
94 blocksize += cspc.size
95 blocksize += cspc.size
95
96
96 self.dataOut.data_spc = spc
97 self.dataOut.data_spc = spc
97 self.dataOut.data_cspc = cspc
98 self.dataOut.data_cspc = cspc
98 self.dataOut.data_dc = dc
99 self.dataOut.data_dc = dc
99 self.dataOut.blockSize = blocksize
100 self.dataOut.blockSize = blocksize
100 self.dataOut.flagShiftFFT = False
101 self.dataOut.flagShiftFFT = False
101
102
102 def run(self, nProfiles=None, nFFTPoints=None, pairsList=[], ippFactor=None):
103 def run(self, nProfiles=None, nFFTPoints=None, pairsList=[], ippFactor=None):
103
104
104 self.dataOut.flagNoData = True
105 self.dataOut.flagNoData = True
105
106
106 if self.dataIn.type == "Spectra":
107 if self.dataIn.type == "Spectra":
107 self.dataOut.copy(self.dataIn)
108 self.dataOut.copy(self.dataIn)
108 return True
109 return True
109
110
110 if self.dataIn.type == "Voltage":
111 if self.dataIn.type == "Voltage":
111
112
112 if nFFTPoints == None:
113 if nFFTPoints == None:
113 raise ValueError, "This SpectraProc.run() need nFFTPoints input variable"
114 raise ValueError, "This SpectraProc.run() need nFFTPoints input variable"
114
115
115 if nProfiles == None:
116 if nProfiles == None:
116 raise ValueError, "This SpectraProc.run() need nProfiles input variable"
117 raise ValueError, "This SpectraProc.run() need nProfiles input variable"
117
118
118
119
119 if ippFactor == None:
120 if ippFactor == None:
120 ippFactor = 1
121 ippFactor = 1
121 self.dataOut.ippFactor = ippFactor
122 self.dataOut.ippFactor = ippFactor
122
123
123 self.dataOut.nFFTPoints = nFFTPoints
124 self.dataOut.nFFTPoints = nFFTPoints
124 self.dataOut.pairsList = pairsList
125 self.dataOut.pairsList = pairsList
125
126
126 if self.buffer == None:
127 if self.buffer == None:
127 self.buffer = numpy.zeros((self.dataIn.nChannels,
128 self.buffer = numpy.zeros((self.dataIn.nChannels,
128 nProfiles,
129 nProfiles,
129 self.dataIn.nHeights),
130 self.dataIn.nHeights),
130 dtype='complex')
131 dtype='complex')
131 self.id_min = 0
132 self.id_min = 0
132 self.id_max = self.dataIn.data.shape[1]
133 self.id_max = self.dataIn.data.shape[1]
133
134
134 if len(self.dataIn.data.shape) == 2:
135 if len(self.dataIn.data.shape) == 2:
135 self.buffer[:,self.profIndex,:] = self.dataIn.data.copy()
136 self.buffer[:,self.profIndex,:] = self.dataIn.data.copy()
136 self.profIndex += 1
137 self.profIndex += 1
137 else:
138 else:
138 if self.dataIn.data.shape[1] == nProfiles:
139 if self.dataIn.data.shape[1] == nProfiles:
139 self.buffer = self.dataIn.data.copy()
140 self.buffer = self.dataIn.data.copy()
140 self.profIndex = nProfiles
141 self.profIndex = nProfiles
141 elif self.dataIn.data.shape[1] < nProfiles:
142 elif self.dataIn.data.shape[1] < nProfiles:
142 self.buffer[:,self.id_min:self.id_max,:] = self.dataIn.data
143 self.buffer[:,self.id_min:self.id_max,:] = self.dataIn.data
143 self.profIndex += self.dataIn.data.shape[1]
144 self.profIndex += self.dataIn.data.shape[1]
144 self.id_min += self.dataIn.data.shape[1]
145 self.id_min += self.dataIn.data.shape[1]
145 self.id_max += self.dataIn.data.shape[1]
146 self.id_max += self.dataIn.data.shape[1]
146 else:
147 else:
147 raise ValueError, "The type object %s has %d profiles, it should be equal to %d profiles"%(self.dataIn.type,self.dataIn.data.shape[1],nProfiles)
148 raise ValueError, "The type object %s has %d profiles, it should be equal to %d profiles"%(self.dataIn.type,self.dataIn.data.shape[1],nProfiles)
148 self.dataOut.flagNoData = True
149 self.dataOut.flagNoData = True
149 return 0
150 return 0
150
151
151
152
152 if self.firstdatatime == None:
153 if self.firstdatatime == None:
153 self.firstdatatime = self.dataIn.utctime
154 self.firstdatatime = self.dataIn.utctime
154
155
155 if self.profIndex == nProfiles:
156 if self.profIndex == nProfiles:
156 self.__updateObjFromInput()
157 self.__updateObjFromInput()
157 self.__getFft()
158 self.__getFft()
158
159
159 self.dataOut.flagNoData = False
160 self.dataOut.flagNoData = False
160
161
161 self.buffer = None
162 self.buffer = None
162 self.firstdatatime = None
163 self.firstdatatime = None
163 self.profIndex = 0
164 self.profIndex = 0
164
165
165 return True
166 return True
166
167
167 raise ValueError, "The type object %s is not valid"%(self.dataIn.type)
168 raise ValueError, "The type object %s is not valid"%(self.dataIn.type)
168
169
169 def selectChannels(self, channelList):
170 def selectChannels(self, channelList):
170
171
171 channelIndexList = []
172 channelIndexList = []
172
173
173 for channel in channelList:
174 for channel in channelList:
174 index = self.dataOut.channelList.index(channel)
175 index = self.dataOut.channelList.index(channel)
175 channelIndexList.append(index)
176 channelIndexList.append(index)
176
177
177 self.selectChannelsByIndex(channelIndexList)
178 self.selectChannelsByIndex(channelIndexList)
178
179
179 def selectChannelsByIndex(self, channelIndexList):
180 def selectChannelsByIndex(self, channelIndexList):
180 """
181 """
181 Selecciona un bloque de datos en base a canales segun el channelIndexList
182 Selecciona un bloque de datos en base a canales segun el channelIndexList
182
183
183 Input:
184 Input:
184 channelIndexList : lista sencilla de canales a seleccionar por ej. [2,3,7]
185 channelIndexList : lista sencilla de canales a seleccionar por ej. [2,3,7]
185
186
186 Affected:
187 Affected:
187 self.dataOut.data_spc
188 self.dataOut.data_spc
188 self.dataOut.channelIndexList
189 self.dataOut.channelIndexList
189 self.dataOut.nChannels
190 self.dataOut.nChannels
190
191
191 Return:
192 Return:
192 None
193 None
193 """
194 """
194
195
195 for channelIndex in channelIndexList:
196 for channelIndex in channelIndexList:
196 if channelIndex not in self.dataOut.channelIndexList:
197 if channelIndex not in self.dataOut.channelIndexList:
197 print channelIndexList
198 print channelIndexList
198 raise ValueError, "The value %d in channelIndexList is not valid" %channelIndex
199 raise ValueError, "The value %d in channelIndexList is not valid" %channelIndex
199
200
200 # nChannels = len(channelIndexList)
201 # nChannels = len(channelIndexList)
201
202
202 data_spc = self.dataOut.data_spc[channelIndexList,:]
203 data_spc = self.dataOut.data_spc[channelIndexList,:]
203
204
204 self.dataOut.data_spc = data_spc
205 self.dataOut.data_spc = data_spc
205 self.dataOut.channelList = [self.dataOut.channelList[i] for i in channelIndexList]
206 self.dataOut.channelList = [self.dataOut.channelList[i] for i in channelIndexList]
206 # self.dataOut.nChannels = nChannels
207 # self.dataOut.nChannels = nChannels
207
208
208 return 1
209 return 1
209
210
210 def selectHeights(self, minHei, maxHei):
211 def selectHeights(self, minHei, maxHei):
211 """
212 """
212 Selecciona un bloque de datos en base a un grupo de valores de alturas segun el rango
213 Selecciona un bloque de datos en base a un grupo de valores de alturas segun el rango
213 minHei <= height <= maxHei
214 minHei <= height <= maxHei
214
215
215 Input:
216 Input:
216 minHei : valor minimo de altura a considerar
217 minHei : valor minimo de altura a considerar
217 maxHei : valor maximo de altura a considerar
218 maxHei : valor maximo de altura a considerar
218
219
219 Affected:
220 Affected:
220 Indirectamente son cambiados varios valores a travez del metodo selectHeightsByIndex
221 Indirectamente son cambiados varios valores a travez del metodo selectHeightsByIndex
221
222
222 Return:
223 Return:
223 1 si el metodo se ejecuto con exito caso contrario devuelve 0
224 1 si el metodo se ejecuto con exito caso contrario devuelve 0
224 """
225 """
225 if (minHei < self.dataOut.heightList[0]) or (minHei > maxHei):
226 if (minHei < self.dataOut.heightList[0]) or (minHei > maxHei):
226 raise ValueError, "some value in (%d,%d) is not valid" % (minHei, maxHei)
227 raise ValueError, "some value in (%d,%d) is not valid" % (minHei, maxHei)
227
228
228 if (maxHei > self.dataOut.heightList[-1]):
229 if (maxHei > self.dataOut.heightList[-1]):
229 maxHei = self.dataOut.heightList[-1]
230 maxHei = self.dataOut.heightList[-1]
230 # raise ValueError, "some value in (%d,%d) is not valid" % (minHei, maxHei)
231 # raise ValueError, "some value in (%d,%d) is not valid" % (minHei, maxHei)
231
232
232 minIndex = 0
233 minIndex = 0
233 maxIndex = 0
234 maxIndex = 0
234 heights = self.dataOut.heightList
235 heights = self.dataOut.heightList
235
236
236 inda = numpy.where(heights >= minHei)
237 inda = numpy.where(heights >= minHei)
237 indb = numpy.where(heights <= maxHei)
238 indb = numpy.where(heights <= maxHei)
238
239
239 try:
240 try:
240 minIndex = inda[0][0]
241 minIndex = inda[0][0]
241 except:
242 except:
242 minIndex = 0
243 minIndex = 0
243
244
244 try:
245 try:
245 maxIndex = indb[0][-1]
246 maxIndex = indb[0][-1]
246 except:
247 except:
247 maxIndex = len(heights)
248 maxIndex = len(heights)
248
249
249 self.selectHeightsByIndex(minIndex, maxIndex)
250 self.selectHeightsByIndex(minIndex, maxIndex)
250
251
251 return 1
252 return 1
252
253
253 def getBeaconSignal(self, tauindex = 0, channelindex = 0, hei_ref=None):
254 def getBeaconSignal(self, tauindex = 0, channelindex = 0, hei_ref=None):
254 newheis = numpy.where(self.dataOut.heightList>self.dataOut.radarControllerHeaderObj.Taus[tauindex])
255 newheis = numpy.where(self.dataOut.heightList>self.dataOut.radarControllerHeaderObj.Taus[tauindex])
255
256
256 if hei_ref != None:
257 if hei_ref != None:
257 newheis = numpy.where(self.dataOut.heightList>hei_ref)
258 newheis = numpy.where(self.dataOut.heightList>hei_ref)
258
259
259 minIndex = min(newheis[0])
260 minIndex = min(newheis[0])
260 maxIndex = max(newheis[0])
261 maxIndex = max(newheis[0])
261 data_spc = self.dataOut.data_spc[:,:,minIndex:maxIndex+1]
262 data_spc = self.dataOut.data_spc[:,:,minIndex:maxIndex+1]
262 heightList = self.dataOut.heightList[minIndex:maxIndex+1]
263 heightList = self.dataOut.heightList[minIndex:maxIndex+1]
263
264
264 # determina indices
265 # determina indices
265 nheis = int(self.dataOut.radarControllerHeaderObj.txB/(self.dataOut.heightList[1]-self.dataOut.heightList[0]))
266 nheis = int(self.dataOut.radarControllerHeaderObj.txB/(self.dataOut.heightList[1]-self.dataOut.heightList[0]))
266 avg_dB = 10*numpy.log10(numpy.sum(data_spc[channelindex,:,:],axis=0))
267 avg_dB = 10*numpy.log10(numpy.sum(data_spc[channelindex,:,:],axis=0))
267 beacon_dB = numpy.sort(avg_dB)[-nheis:]
268 beacon_dB = numpy.sort(avg_dB)[-nheis:]
268 beacon_heiIndexList = []
269 beacon_heiIndexList = []
269 for val in avg_dB.tolist():
270 for val in avg_dB.tolist():
270 if val >= beacon_dB[0]:
271 if val >= beacon_dB[0]:
271 beacon_heiIndexList.append(avg_dB.tolist().index(val))
272 beacon_heiIndexList.append(avg_dB.tolist().index(val))
272
273
273 #data_spc = data_spc[:,:,beacon_heiIndexList]
274 #data_spc = data_spc[:,:,beacon_heiIndexList]
274 data_cspc = None
275 data_cspc = None
275 if self.dataOut.data_cspc != None:
276 if self.dataOut.data_cspc != None:
276 data_cspc = self.dataOut.data_cspc[:,:,minIndex:maxIndex+1]
277 data_cspc = self.dataOut.data_cspc[:,:,minIndex:maxIndex+1]
277 #data_cspc = data_cspc[:,:,beacon_heiIndexList]
278 #data_cspc = data_cspc[:,:,beacon_heiIndexList]
278
279
279 data_dc = None
280 data_dc = None
280 if self.dataOut.data_dc != None:
281 if self.dataOut.data_dc != None:
281 data_dc = self.dataOut.data_dc[:,minIndex:maxIndex+1]
282 data_dc = self.dataOut.data_dc[:,minIndex:maxIndex+1]
282 #data_dc = data_dc[:,beacon_heiIndexList]
283 #data_dc = data_dc[:,beacon_heiIndexList]
283
284
284 self.dataOut.data_spc = data_spc
285 self.dataOut.data_spc = data_spc
285 self.dataOut.data_cspc = data_cspc
286 self.dataOut.data_cspc = data_cspc
286 self.dataOut.data_dc = data_dc
287 self.dataOut.data_dc = data_dc
287 self.dataOut.heightList = heightList
288 self.dataOut.heightList = heightList
288 self.dataOut.beacon_heiIndexList = beacon_heiIndexList
289 self.dataOut.beacon_heiIndexList = beacon_heiIndexList
289
290
290 return 1
291 return 1
291
292
292
293
293 def selectHeightsByIndex(self, minIndex, maxIndex):
294 def selectHeightsByIndex(self, minIndex, maxIndex):
294 """
295 """
295 Selecciona un bloque de datos en base a un grupo indices de alturas segun el rango
296 Selecciona un bloque de datos en base a un grupo indices de alturas segun el rango
296 minIndex <= index <= maxIndex
297 minIndex <= index <= maxIndex
297
298
298 Input:
299 Input:
299 minIndex : valor de indice minimo de altura a considerar
300 minIndex : valor de indice minimo de altura a considerar
300 maxIndex : valor de indice maximo de altura a considerar
301 maxIndex : valor de indice maximo de altura a considerar
301
302
302 Affected:
303 Affected:
303 self.dataOut.data_spc
304 self.dataOut.data_spc
304 self.dataOut.data_cspc
305 self.dataOut.data_cspc
305 self.dataOut.data_dc
306 self.dataOut.data_dc
306 self.dataOut.heightList
307 self.dataOut.heightList
307
308
308 Return:
309 Return:
309 1 si el metodo se ejecuto con exito caso contrario devuelve 0
310 1 si el metodo se ejecuto con exito caso contrario devuelve 0
310 """
311 """
311
312
312 if (minIndex < 0) or (minIndex > maxIndex):
313 if (minIndex < 0) or (minIndex > maxIndex):
313 raise ValueError, "some value in (%d,%d) is not valid" % (minIndex, maxIndex)
314 raise ValueError, "some value in (%d,%d) is not valid" % (minIndex, maxIndex)
314
315
315 if (maxIndex >= self.dataOut.nHeights):
316 if (maxIndex >= self.dataOut.nHeights):
316 maxIndex = self.dataOut.nHeights-1
317 maxIndex = self.dataOut.nHeights-1
317 # raise ValueError, "some value in (%d,%d) is not valid" % (minIndex, maxIndex)
318 # raise ValueError, "some value in (%d,%d) is not valid" % (minIndex, maxIndex)
318
319
319 # nHeights = maxIndex - minIndex + 1
320 # nHeights = maxIndex - minIndex + 1
320
321
321 #Spectra
322 #Spectra
322 data_spc = self.dataOut.data_spc[:,:,minIndex:maxIndex+1]
323 data_spc = self.dataOut.data_spc[:,:,minIndex:maxIndex+1]
323
324
324 data_cspc = None
325 data_cspc = None
325 if self.dataOut.data_cspc != None:
326 if self.dataOut.data_cspc != None:
326 data_cspc = self.dataOut.data_cspc[:,:,minIndex:maxIndex+1]
327 data_cspc = self.dataOut.data_cspc[:,:,minIndex:maxIndex+1]
327
328
328 data_dc = None
329 data_dc = None
329 if self.dataOut.data_dc != None:
330 if self.dataOut.data_dc != None:
330 data_dc = self.dataOut.data_dc[:,minIndex:maxIndex+1]
331 data_dc = self.dataOut.data_dc[:,minIndex:maxIndex+1]
331
332
332 self.dataOut.data_spc = data_spc
333 self.dataOut.data_spc = data_spc
333 self.dataOut.data_cspc = data_cspc
334 self.dataOut.data_cspc = data_cspc
334 self.dataOut.data_dc = data_dc
335 self.dataOut.data_dc = data_dc
335
336
336 self.dataOut.heightList = self.dataOut.heightList[minIndex:maxIndex+1]
337 self.dataOut.heightList = self.dataOut.heightList[minIndex:maxIndex+1]
337
338
338 return 1
339 return 1
339
340
340 def removeDC(self, mode = 2):
341 def removeDC(self, mode = 2):
341 jspectra = self.dataOut.data_spc
342 jspectra = self.dataOut.data_spc
342 jcspectra = self.dataOut.data_cspc
343 jcspectra = self.dataOut.data_cspc
343
344
344
345
345 num_chan = jspectra.shape[0]
346 num_chan = jspectra.shape[0]
346 num_hei = jspectra.shape[2]
347 num_hei = jspectra.shape[2]
347
348
348 if jcspectra != None:
349 if jcspectra != None:
349 jcspectraExist = True
350 jcspectraExist = True
350 num_pairs = jcspectra.shape[0]
351 num_pairs = jcspectra.shape[0]
351 else: jcspectraExist = False
352 else: jcspectraExist = False
352
353
353 freq_dc = jspectra.shape[1]/2
354 freq_dc = jspectra.shape[1]/2
354 ind_vel = numpy.array([-2,-1,1,2]) + freq_dc
355 ind_vel = numpy.array([-2,-1,1,2]) + freq_dc
355
356
356 if ind_vel[0]<0:
357 if ind_vel[0]<0:
357 ind_vel[range(0,1)] = ind_vel[range(0,1)] + self.num_prof
358 ind_vel[range(0,1)] = ind_vel[range(0,1)] + self.num_prof
358
359
359 if mode == 1:
360 if mode == 1:
360 jspectra[:,freq_dc,:] = (jspectra[:,ind_vel[1],:] + jspectra[:,ind_vel[2],:])/2 #CORRECCION
361 jspectra[:,freq_dc,:] = (jspectra[:,ind_vel[1],:] + jspectra[:,ind_vel[2],:])/2 #CORRECCION
361
362
362 if jcspectraExist:
363 if jcspectraExist:
363 jcspectra[:,freq_dc,:] = (jcspectra[:,ind_vel[1],:] + jcspectra[:,ind_vel[2],:])/2
364 jcspectra[:,freq_dc,:] = (jcspectra[:,ind_vel[1],:] + jcspectra[:,ind_vel[2],:])/2
364
365
365 if mode == 2:
366 if mode == 2:
366
367
367 vel = numpy.array([-2,-1,1,2])
368 vel = numpy.array([-2,-1,1,2])
368 xx = numpy.zeros([4,4])
369 xx = numpy.zeros([4,4])
369
370
370 for fil in range(4):
371 for fil in range(4):
371 xx[fil,:] = vel[fil]**numpy.asarray(range(4))
372 xx[fil,:] = vel[fil]**numpy.asarray(range(4))
372
373
373 xx_inv = numpy.linalg.inv(xx)
374 xx_inv = numpy.linalg.inv(xx)
374 xx_aux = xx_inv[0,:]
375 xx_aux = xx_inv[0,:]
375
376
376 for ich in range(num_chan):
377 for ich in range(num_chan):
377 yy = jspectra[ich,ind_vel,:]
378 yy = jspectra[ich,ind_vel,:]
378 jspectra[ich,freq_dc,:] = numpy.dot(xx_aux,yy)
379 jspectra[ich,freq_dc,:] = numpy.dot(xx_aux,yy)
379
380
380 junkid = jspectra[ich,freq_dc,:]<=0
381 junkid = jspectra[ich,freq_dc,:]<=0
381 cjunkid = sum(junkid)
382 cjunkid = sum(junkid)
382
383
383 if cjunkid.any():
384 if cjunkid.any():
384 jspectra[ich,freq_dc,junkid.nonzero()] = (jspectra[ich,ind_vel[1],junkid] + jspectra[ich,ind_vel[2],junkid])/2
385 jspectra[ich,freq_dc,junkid.nonzero()] = (jspectra[ich,ind_vel[1],junkid] + jspectra[ich,ind_vel[2],junkid])/2
385
386
386 if jcspectraExist:
387 if jcspectraExist:
387 for ip in range(num_pairs):
388 for ip in range(num_pairs):
388 yy = jcspectra[ip,ind_vel,:]
389 yy = jcspectra[ip,ind_vel,:]
389 jcspectra[ip,freq_dc,:] = numpy.dot(xx_aux,yy)
390 jcspectra[ip,freq_dc,:] = numpy.dot(xx_aux,yy)
390
391
391
392
392 self.dataOut.data_spc = jspectra
393 self.dataOut.data_spc = jspectra
393 self.dataOut.data_cspc = jcspectra
394 self.dataOut.data_cspc = jcspectra
394
395
395 return 1
396 return 1
396
397
397 def removeInterference(self, interf = 2,hei_interf = None, nhei_interf = None, offhei_interf = None):
398 def removeInterference(self, interf = 2,hei_interf = None, nhei_interf = None, offhei_interf = None):
398
399
399 jspectra = self.dataOut.data_spc
400 jspectra = self.dataOut.data_spc
400 jcspectra = self.dataOut.data_cspc
401 jcspectra = self.dataOut.data_cspc
401 jnoise = self.dataOut.getNoise()
402 jnoise = self.dataOut.getNoise()
402 num_incoh = self.dataOut.nIncohInt
403 num_incoh = self.dataOut.nIncohInt
403
404
404 num_channel = jspectra.shape[0]
405 num_channel = jspectra.shape[0]
405 num_prof = jspectra.shape[1]
406 num_prof = jspectra.shape[1]
406 num_hei = jspectra.shape[2]
407 num_hei = jspectra.shape[2]
407
408
408 #hei_interf
409 #hei_interf
409 if hei_interf == None:
410 if hei_interf == None:
410 count_hei = num_hei/2 #Como es entero no importa
411 count_hei = num_hei/2 #Como es entero no importa
411 hei_interf = numpy.asmatrix(range(count_hei)) + num_hei - count_hei
412 hei_interf = numpy.asmatrix(range(count_hei)) + num_hei - count_hei
412 hei_interf = numpy.asarray(hei_interf)[0]
413 hei_interf = numpy.asarray(hei_interf)[0]
413 #nhei_interf
414 #nhei_interf
414 if (nhei_interf == None):
415 if (nhei_interf == None):
415 nhei_interf = 5
416 nhei_interf = 5
416 if (nhei_interf < 1):
417 if (nhei_interf < 1):
417 nhei_interf = 1
418 nhei_interf = 1
418 if (nhei_interf > count_hei):
419 if (nhei_interf > count_hei):
419 nhei_interf = count_hei
420 nhei_interf = count_hei
420 if (offhei_interf == None):
421 if (offhei_interf == None):
421 offhei_interf = 0
422 offhei_interf = 0
422
423
423 ind_hei = range(num_hei)
424 ind_hei = range(num_hei)
424 # mask_prof = numpy.asarray(range(num_prof - 2)) + 1
425 # mask_prof = numpy.asarray(range(num_prof - 2)) + 1
425 # mask_prof[range(num_prof/2 - 1,len(mask_prof))] += 1
426 # mask_prof[range(num_prof/2 - 1,len(mask_prof))] += 1
426 mask_prof = numpy.asarray(range(num_prof))
427 mask_prof = numpy.asarray(range(num_prof))
427 num_mask_prof = mask_prof.size
428 num_mask_prof = mask_prof.size
428 comp_mask_prof = [0, num_prof/2]
429 comp_mask_prof = [0, num_prof/2]
429
430
430
431
431 #noise_exist: Determina si la variable jnoise ha sido definida y contiene la informacion del ruido de cada canal
432 #noise_exist: Determina si la variable jnoise ha sido definida y contiene la informacion del ruido de cada canal
432 if (jnoise.size < num_channel or numpy.isnan(jnoise).any()):
433 if (jnoise.size < num_channel or numpy.isnan(jnoise).any()):
433 jnoise = numpy.nan
434 jnoise = numpy.nan
434 noise_exist = jnoise[0] < numpy.Inf
435 noise_exist = jnoise[0] < numpy.Inf
435
436
436 #Subrutina de Remocion de la Interferencia
437 #Subrutina de Remocion de la Interferencia
437 for ich in range(num_channel):
438 for ich in range(num_channel):
438 #Se ordena los espectros segun su potencia (menor a mayor)
439 #Se ordena los espectros segun su potencia (menor a mayor)
439 power = jspectra[ich,mask_prof,:]
440 power = jspectra[ich,mask_prof,:]
440 power = power[:,hei_interf]
441 power = power[:,hei_interf]
441 power = power.sum(axis = 0)
442 power = power.sum(axis = 0)
442 psort = power.ravel().argsort()
443 psort = power.ravel().argsort()
443
444
444 #Se estima la interferencia promedio en los Espectros de Potencia empleando
445 #Se estima la interferencia promedio en los Espectros de Potencia empleando
445 junkspc_interf = jspectra[ich,:,hei_interf[psort[range(offhei_interf, nhei_interf + offhei_interf)]]]
446 junkspc_interf = jspectra[ich,:,hei_interf[psort[range(offhei_interf, nhei_interf + offhei_interf)]]]
446
447
447 if noise_exist:
448 if noise_exist:
448 # tmp_noise = jnoise[ich] / num_prof
449 # tmp_noise = jnoise[ich] / num_prof
449 tmp_noise = jnoise[ich]
450 tmp_noise = jnoise[ich]
450 junkspc_interf = junkspc_interf - tmp_noise
451 junkspc_interf = junkspc_interf - tmp_noise
451 #junkspc_interf[:,comp_mask_prof] = 0
452 #junkspc_interf[:,comp_mask_prof] = 0
452
453
453 jspc_interf = junkspc_interf.sum(axis = 0) / nhei_interf
454 jspc_interf = junkspc_interf.sum(axis = 0) / nhei_interf
454 jspc_interf = jspc_interf.transpose()
455 jspc_interf = jspc_interf.transpose()
455 #Calculando el espectro de interferencia promedio
456 #Calculando el espectro de interferencia promedio
456 noiseid = numpy.where(jspc_interf <= tmp_noise/ math.sqrt(num_incoh))
457 noiseid = numpy.where(jspc_interf <= tmp_noise/ math.sqrt(num_incoh))
457 noiseid = noiseid[0]
458 noiseid = noiseid[0]
458 cnoiseid = noiseid.size
459 cnoiseid = noiseid.size
459 interfid = numpy.where(jspc_interf > tmp_noise/ math.sqrt(num_incoh))
460 interfid = numpy.where(jspc_interf > tmp_noise/ math.sqrt(num_incoh))
460 interfid = interfid[0]
461 interfid = interfid[0]
461 cinterfid = interfid.size
462 cinterfid = interfid.size
462
463
463 if (cnoiseid > 0): jspc_interf[noiseid] = 0
464 if (cnoiseid > 0): jspc_interf[noiseid] = 0
464
465
465 #Expandiendo los perfiles a limpiar
466 #Expandiendo los perfiles a limpiar
466 if (cinterfid > 0):
467 if (cinterfid > 0):
467 new_interfid = (numpy.r_[interfid - 1, interfid, interfid + 1] + num_prof)%num_prof
468 new_interfid = (numpy.r_[interfid - 1, interfid, interfid + 1] + num_prof)%num_prof
468 new_interfid = numpy.asarray(new_interfid)
469 new_interfid = numpy.asarray(new_interfid)
469 new_interfid = {x for x in new_interfid}
470 new_interfid = {x for x in new_interfid}
470 new_interfid = numpy.array(list(new_interfid))
471 new_interfid = numpy.array(list(new_interfid))
471 new_cinterfid = new_interfid.size
472 new_cinterfid = new_interfid.size
472 else: new_cinterfid = 0
473 else: new_cinterfid = 0
473
474
474 for ip in range(new_cinterfid):
475 for ip in range(new_cinterfid):
475 ind = junkspc_interf[:,new_interfid[ip]].ravel().argsort()
476 ind = junkspc_interf[:,new_interfid[ip]].ravel().argsort()
476 jspc_interf[new_interfid[ip]] = junkspc_interf[ind[nhei_interf/2],new_interfid[ip]]
477 jspc_interf[new_interfid[ip]] = junkspc_interf[ind[nhei_interf/2],new_interfid[ip]]
477
478
478
479
479 jspectra[ich,:,ind_hei] = jspectra[ich,:,ind_hei] - jspc_interf #Corregir indices
480 jspectra[ich,:,ind_hei] = jspectra[ich,:,ind_hei] - jspc_interf #Corregir indices
480
481
481 #Removiendo la interferencia del punto de mayor interferencia
482 #Removiendo la interferencia del punto de mayor interferencia
482 ListAux = jspc_interf[mask_prof].tolist()
483 ListAux = jspc_interf[mask_prof].tolist()
483 maxid = ListAux.index(max(ListAux))
484 maxid = ListAux.index(max(ListAux))
484
485
485
486
486 if cinterfid > 0:
487 if cinterfid > 0:
487 for ip in range(cinterfid*(interf == 2) - 1):
488 for ip in range(cinterfid*(interf == 2) - 1):
488 ind = (jspectra[ich,interfid[ip],:] < tmp_noise*(1 + 1/math.sqrt(num_incoh))).nonzero()
489 ind = (jspectra[ich,interfid[ip],:] < tmp_noise*(1 + 1/math.sqrt(num_incoh))).nonzero()
489 cind = len(ind)
490 cind = len(ind)
490
491
491 if (cind > 0):
492 if (cind > 0):
492 jspectra[ich,interfid[ip],ind] = tmp_noise*(1 + (numpy.random.uniform(cind) - 0.5)/math.sqrt(num_incoh))
493 jspectra[ich,interfid[ip],ind] = tmp_noise*(1 + (numpy.random.uniform(cind) - 0.5)/math.sqrt(num_incoh))
493
494
494 ind = numpy.array([-2,-1,1,2])
495 ind = numpy.array([-2,-1,1,2])
495 xx = numpy.zeros([4,4])
496 xx = numpy.zeros([4,4])
496
497
497 for id1 in range(4):
498 for id1 in range(4):
498 xx[:,id1] = ind[id1]**numpy.asarray(range(4))
499 xx[:,id1] = ind[id1]**numpy.asarray(range(4))
499
500
500 xx_inv = numpy.linalg.inv(xx)
501 xx_inv = numpy.linalg.inv(xx)
501 xx = xx_inv[:,0]
502 xx = xx_inv[:,0]
502 ind = (ind + maxid + num_mask_prof)%num_mask_prof
503 ind = (ind + maxid + num_mask_prof)%num_mask_prof
503 yy = jspectra[ich,mask_prof[ind],:]
504 yy = jspectra[ich,mask_prof[ind],:]
504 jspectra[ich,mask_prof[maxid],:] = numpy.dot(yy.transpose(),xx)
505 jspectra[ich,mask_prof[maxid],:] = numpy.dot(yy.transpose(),xx)
505
506
506
507
507 indAux = (jspectra[ich,:,:] < tmp_noise*(1-1/math.sqrt(num_incoh))).nonzero()
508 indAux = (jspectra[ich,:,:] < tmp_noise*(1-1/math.sqrt(num_incoh))).nonzero()
508 jspectra[ich,indAux[0],indAux[1]] = tmp_noise * (1 - 1/math.sqrt(num_incoh))
509 jspectra[ich,indAux[0],indAux[1]] = tmp_noise * (1 - 1/math.sqrt(num_incoh))
509
510
510 #Remocion de Interferencia en el Cross Spectra
511 #Remocion de Interferencia en el Cross Spectra
511 if jcspectra == None: return jspectra, jcspectra
512 if jcspectra == None: return jspectra, jcspectra
512 num_pairs = jcspectra.size/(num_prof*num_hei)
513 num_pairs = jcspectra.size/(num_prof*num_hei)
513 jcspectra = jcspectra.reshape(num_pairs, num_prof, num_hei)
514 jcspectra = jcspectra.reshape(num_pairs, num_prof, num_hei)
514
515
515 for ip in range(num_pairs):
516 for ip in range(num_pairs):
516
517
517 #-------------------------------------------
518 #-------------------------------------------
518
519
519 cspower = numpy.abs(jcspectra[ip,mask_prof,:])
520 cspower = numpy.abs(jcspectra[ip,mask_prof,:])
520 cspower = cspower[:,hei_interf]
521 cspower = cspower[:,hei_interf]
521 cspower = cspower.sum(axis = 0)
522 cspower = cspower.sum(axis = 0)
522
523
523 cspsort = cspower.ravel().argsort()
524 cspsort = cspower.ravel().argsort()
524 junkcspc_interf = jcspectra[ip,:,hei_interf[cspsort[range(offhei_interf, nhei_interf + offhei_interf)]]]
525 junkcspc_interf = jcspectra[ip,:,hei_interf[cspsort[range(offhei_interf, nhei_interf + offhei_interf)]]]
525 junkcspc_interf = junkcspc_interf.transpose()
526 junkcspc_interf = junkcspc_interf.transpose()
526 jcspc_interf = junkcspc_interf.sum(axis = 1)/nhei_interf
527 jcspc_interf = junkcspc_interf.sum(axis = 1)/nhei_interf
527
528
528 ind = numpy.abs(jcspc_interf[mask_prof]).ravel().argsort()
529 ind = numpy.abs(jcspc_interf[mask_prof]).ravel().argsort()
529
530
530 median_real = numpy.median(numpy.real(junkcspc_interf[mask_prof[ind[range(3*num_prof/4)]],:]))
531 median_real = numpy.median(numpy.real(junkcspc_interf[mask_prof[ind[range(3*num_prof/4)]],:]))
531 median_imag = numpy.median(numpy.imag(junkcspc_interf[mask_prof[ind[range(3*num_prof/4)]],:]))
532 median_imag = numpy.median(numpy.imag(junkcspc_interf[mask_prof[ind[range(3*num_prof/4)]],:]))
532 junkcspc_interf[comp_mask_prof,:] = numpy.complex(median_real, median_imag)
533 junkcspc_interf[comp_mask_prof,:] = numpy.complex(median_real, median_imag)
533
534
534 for iprof in range(num_prof):
535 for iprof in range(num_prof):
535 ind = numpy.abs(junkcspc_interf[iprof,:]).ravel().argsort()
536 ind = numpy.abs(junkcspc_interf[iprof,:]).ravel().argsort()
536 jcspc_interf[iprof] = junkcspc_interf[iprof, ind[nhei_interf/2]]
537 jcspc_interf[iprof] = junkcspc_interf[iprof, ind[nhei_interf/2]]
537
538
538 #Removiendo la Interferencia
539 #Removiendo la Interferencia
539 jcspectra[ip,:,ind_hei] = jcspectra[ip,:,ind_hei] - jcspc_interf
540 jcspectra[ip,:,ind_hei] = jcspectra[ip,:,ind_hei] - jcspc_interf
540
541
541 ListAux = numpy.abs(jcspc_interf[mask_prof]).tolist()
542 ListAux = numpy.abs(jcspc_interf[mask_prof]).tolist()
542 maxid = ListAux.index(max(ListAux))
543 maxid = ListAux.index(max(ListAux))
543
544
544 ind = numpy.array([-2,-1,1,2])
545 ind = numpy.array([-2,-1,1,2])
545 xx = numpy.zeros([4,4])
546 xx = numpy.zeros([4,4])
546
547
547 for id1 in range(4):
548 for id1 in range(4):
548 xx[:,id1] = ind[id1]**numpy.asarray(range(4))
549 xx[:,id1] = ind[id1]**numpy.asarray(range(4))
549
550
550 xx_inv = numpy.linalg.inv(xx)
551 xx_inv = numpy.linalg.inv(xx)
551 xx = xx_inv[:,0]
552 xx = xx_inv[:,0]
552
553
553 ind = (ind + maxid + num_mask_prof)%num_mask_prof
554 ind = (ind + maxid + num_mask_prof)%num_mask_prof
554 yy = jcspectra[ip,mask_prof[ind],:]
555 yy = jcspectra[ip,mask_prof[ind],:]
555 jcspectra[ip,mask_prof[maxid],:] = numpy.dot(yy.transpose(),xx)
556 jcspectra[ip,mask_prof[maxid],:] = numpy.dot(yy.transpose(),xx)
556
557
557 #Guardar Resultados
558 #Guardar Resultados
558 self.dataOut.data_spc = jspectra
559 self.dataOut.data_spc = jspectra
559 self.dataOut.data_cspc = jcspectra
560 self.dataOut.data_cspc = jcspectra
560
561
561 return 1
562 return 1
562
563
563 def setRadarFrequency(self, frequency=None):
564 def setRadarFrequency(self, frequency=None):
564 if frequency != None:
565 if frequency != None:
565 self.dataOut.frequency = frequency
566 self.dataOut.frequency = frequency
566
567
567 return 1
568 return 1
568
569
569 def getNoise(self, minHei=None, maxHei=None, minVel=None, maxVel=None):
570 def getNoise(self, minHei=None, maxHei=None, minVel=None, maxVel=None):
570 #validacion de rango
571 #validacion de rango
571 if minHei == None:
572 if minHei == None:
572 minHei = self.dataOut.heightList[0]
573 minHei = self.dataOut.heightList[0]
573
574
574 if maxHei == None:
575 if maxHei == None:
575 maxHei = self.dataOut.heightList[-1]
576 maxHei = self.dataOut.heightList[-1]
576
577
577 if (minHei < self.dataOut.heightList[0]) or (minHei > maxHei):
578 if (minHei < self.dataOut.heightList[0]) or (minHei > maxHei):
578 print 'minHei: %.2f is out of the heights range'%(minHei)
579 print 'minHei: %.2f is out of the heights range'%(minHei)
579 print 'minHei is setting to %.2f'%(self.dataOut.heightList[0])
580 print 'minHei is setting to %.2f'%(self.dataOut.heightList[0])
580 minHei = self.dataOut.heightList[0]
581 minHei = self.dataOut.heightList[0]
581
582
582 if (maxHei > self.dataOut.heightList[-1]) or (maxHei < minHei):
583 if (maxHei > self.dataOut.heightList[-1]) or (maxHei < minHei):
583 print 'maxHei: %.2f is out of the heights range'%(maxHei)
584 print 'maxHei: %.2f is out of the heights range'%(maxHei)
584 print 'maxHei is setting to %.2f'%(self.dataOut.heightList[-1])
585 print 'maxHei is setting to %.2f'%(self.dataOut.heightList[-1])
585 maxHei = self.dataOut.heightList[-1]
586 maxHei = self.dataOut.heightList[-1]
586
587
587 # validacion de velocidades
588 # validacion de velocidades
588 velrange = self.dataOut.getVelRange(1)
589 velrange = self.dataOut.getVelRange(1)
589
590
590 if minVel == None:
591 if minVel == None:
591 minVel = velrange[0]
592 minVel = velrange[0]
592
593
593 if maxVel == None:
594 if maxVel == None:
594 maxVel = velrange[-1]
595 maxVel = velrange[-1]
595
596
596 if (minVel < velrange[0]) or (minVel > maxVel):
597 if (minVel < velrange[0]) or (minVel > maxVel):
597 print 'minVel: %.2f is out of the velocity range'%(minVel)
598 print 'minVel: %.2f is out of the velocity range'%(minVel)
598 print 'minVel is setting to %.2f'%(velrange[0])
599 print 'minVel is setting to %.2f'%(velrange[0])
599 minVel = velrange[0]
600 minVel = velrange[0]
600
601
601 if (maxVel > velrange[-1]) or (maxVel < minVel):
602 if (maxVel > velrange[-1]) or (maxVel < minVel):
602 print 'maxVel: %.2f is out of the velocity range'%(maxVel)
603 print 'maxVel: %.2f is out of the velocity range'%(maxVel)
603 print 'maxVel is setting to %.2f'%(velrange[-1])
604 print 'maxVel is setting to %.2f'%(velrange[-1])
604 maxVel = velrange[-1]
605 maxVel = velrange[-1]
605
606
606 # seleccion de indices para rango
607 # seleccion de indices para rango
607 minIndex = 0
608 minIndex = 0
608 maxIndex = 0
609 maxIndex = 0
609 heights = self.dataOut.heightList
610 heights = self.dataOut.heightList
610
611
611 inda = numpy.where(heights >= minHei)
612 inda = numpy.where(heights >= minHei)
612 indb = numpy.where(heights <= maxHei)
613 indb = numpy.where(heights <= maxHei)
613
614
614 try:
615 try:
615 minIndex = inda[0][0]
616 minIndex = inda[0][0]
616 except:
617 except:
617 minIndex = 0
618 minIndex = 0
618
619
619 try:
620 try:
620 maxIndex = indb[0][-1]
621 maxIndex = indb[0][-1]
621 except:
622 except:
622 maxIndex = len(heights)
623 maxIndex = len(heights)
623
624
624 if (minIndex < 0) or (minIndex > maxIndex):
625 if (minIndex < 0) or (minIndex > maxIndex):
625 raise ValueError, "some value in (%d,%d) is not valid" % (minIndex, maxIndex)
626 raise ValueError, "some value in (%d,%d) is not valid" % (minIndex, maxIndex)
626
627
627 if (maxIndex >= self.dataOut.nHeights):
628 if (maxIndex >= self.dataOut.nHeights):
628 maxIndex = self.dataOut.nHeights-1
629 maxIndex = self.dataOut.nHeights-1
629
630
630 # seleccion de indices para velocidades
631 # seleccion de indices para velocidades
631 indminvel = numpy.where(velrange >= minVel)
632 indminvel = numpy.where(velrange >= minVel)
632 indmaxvel = numpy.where(velrange <= maxVel)
633 indmaxvel = numpy.where(velrange <= maxVel)
633 try:
634 try:
634 minIndexVel = indminvel[0][0]
635 minIndexVel = indminvel[0][0]
635 except:
636 except:
636 minIndexVel = 0
637 minIndexVel = 0
637
638
638 try:
639 try:
639 maxIndexVel = indmaxvel[0][-1]
640 maxIndexVel = indmaxvel[0][-1]
640 except:
641 except:
641 maxIndexVel = len(velrange)
642 maxIndexVel = len(velrange)
642
643
643 #seleccion del espectro
644 #seleccion del espectro
644 data_spc = self.dataOut.data_spc[:,minIndexVel:maxIndexVel+1,minIndex:maxIndex+1]
645 data_spc = self.dataOut.data_spc[:,minIndexVel:maxIndexVel+1,minIndex:maxIndex+1]
645 #estimacion de ruido
646 #estimacion de ruido
646 noise = numpy.zeros(self.dataOut.nChannels)
647 noise = numpy.zeros(self.dataOut.nChannels)
647
648
648 for channel in range(self.dataOut.nChannels):
649 for channel in range(self.dataOut.nChannels):
649 daux = data_spc[channel,:,:]
650 daux = data_spc[channel,:,:]
650 noise[channel] = hildebrand_sekhon(daux, self.dataOut.nIncohInt)
651 noise[channel] = hildebrand_sekhon(daux, self.dataOut.nIncohInt)
651
652
652 self.dataOut.noise_estimation = noise.copy()
653 self.dataOut.noise_estimation = noise.copy()
653
654
654 return 1
655 return 1
655
656
656 class IncohInt(Operation):
657 class IncohInt(Operation):
657
658
658
659
659 __profIndex = 0
660 __profIndex = 0
660 __withOverapping = False
661 __withOverapping = False
661
662
662 __byTime = False
663 __byTime = False
663 __initime = None
664 __initime = None
664 __lastdatatime = None
665 __lastdatatime = None
665 __integrationtime = None
666 __integrationtime = None
666
667
667 __buffer_spc = None
668 __buffer_spc = None
668 __buffer_cspc = None
669 __buffer_cspc = None
669 __buffer_dc = None
670 __buffer_dc = None
670
671
671 __dataReady = False
672 __dataReady = False
672
673
673 __timeInterval = None
674 __timeInterval = None
674
675
675 n = None
676 n = None
676
677
677
678
678
679
679 def __init__(self):
680 def __init__(self):
680
681
681 Operation.__init__(self)
682 Operation.__init__(self)
682 # self.isConfig = False
683 # self.isConfig = False
683
684
684 def setup(self, n=None, timeInterval=None, overlapping=False):
685 def setup(self, n=None, timeInterval=None, overlapping=False):
685 """
686 """
686 Set the parameters of the integration class.
687 Set the parameters of the integration class.
687
688
688 Inputs:
689 Inputs:
689
690
690 n : Number of coherent integrations
691 n : Number of coherent integrations
691 timeInterval : Time of integration. If the parameter "n" is selected this one does not work
692 timeInterval : Time of integration. If the parameter "n" is selected this one does not work
692 overlapping :
693 overlapping :
693
694
694 """
695 """
695
696
696 self.__initime = None
697 self.__initime = None
697 self.__lastdatatime = 0
698 self.__lastdatatime = 0
698 self.__buffer_spc = None
699 self.__buffer_spc = None
699 self.__buffer_cspc = None
700 self.__buffer_cspc = None
700 self.__buffer_dc = None
701 self.__buffer_dc = None
701 self.__dataReady = False
702 self.__dataReady = False
702
703
703
704
704 if n == None and timeInterval == None:
705 if n == None and timeInterval == None:
705 raise ValueError, "n or timeInterval should be specified ..."
706 raise ValueError, "n or timeInterval should be specified ..."
706
707
707 if n != None:
708 if n != None:
708 self.n = n
709 self.n = n
709 self.__byTime = False
710 self.__byTime = False
710 else:
711 else:
711 self.__integrationtime = timeInterval #if (type(timeInterval)!=integer) -> change this line
712 self.__integrationtime = timeInterval #if (type(timeInterval)!=integer) -> change this line
712 self.n = 9999
713 self.n = 9999
713 self.__byTime = True
714 self.__byTime = True
714
715
715 if overlapping:
716 if overlapping:
716 self.__withOverapping = True
717 self.__withOverapping = True
717 else:
718 else:
718 self.__withOverapping = False
719 self.__withOverapping = False
719 self.__buffer_spc = 0
720 self.__buffer_spc = 0
720 self.__buffer_cspc = 0
721 self.__buffer_cspc = 0
721 self.__buffer_dc = 0
722 self.__buffer_dc = 0
722
723
723 self.__profIndex = 0
724 self.__profIndex = 0
724
725
725 def putData(self, data_spc, data_cspc, data_dc):
726 def putData(self, data_spc, data_cspc, data_dc):
726
727
727 """
728 """
728 Add a profile to the __buffer_spc and increase in one the __profileIndex
729 Add a profile to the __buffer_spc and increase in one the __profileIndex
729
730
730 """
731 """
731
732
732 if not self.__withOverapping:
733 if not self.__withOverapping:
733 self.__buffer_spc += data_spc
734 self.__buffer_spc += data_spc
734
735
735 if data_cspc == None:
736 if data_cspc == None:
736 self.__buffer_cspc = None
737 self.__buffer_cspc = None
737 else:
738 else:
738 self.__buffer_cspc += data_cspc
739 self.__buffer_cspc += data_cspc
739
740
740 if data_dc == None:
741 if data_dc == None:
741 self.__buffer_dc = None
742 self.__buffer_dc = None
742 else:
743 else:
743 self.__buffer_dc += data_dc
744 self.__buffer_dc += data_dc
744
745
745 self.__profIndex += 1
746 self.__profIndex += 1
746 return
747 return
747
748
748 #Overlapping data
749 #Overlapping data
749 nChannels, nFFTPoints, nHeis = data_spc.shape
750 nChannels, nFFTPoints, nHeis = data_spc.shape
750 data_spc = numpy.reshape(data_spc, (1, nChannels, nFFTPoints, nHeis))
751 data_spc = numpy.reshape(data_spc, (1, nChannels, nFFTPoints, nHeis))
751 if data_cspc != None:
752 if data_cspc != None:
752 data_cspc = numpy.reshape(data_cspc, (1, -1, nFFTPoints, nHeis))
753 data_cspc = numpy.reshape(data_cspc, (1, -1, nFFTPoints, nHeis))
753 if data_dc != None:
754 if data_dc != None:
754 data_dc = numpy.reshape(data_dc, (1, -1, nHeis))
755 data_dc = numpy.reshape(data_dc, (1, -1, nHeis))
755
756
756 #If the buffer is empty then it takes the data value
757 #If the buffer is empty then it takes the data value
757 if self.__buffer_spc == None:
758 if self.__buffer_spc == None:
758 self.__buffer_spc = data_spc
759 self.__buffer_spc = data_spc
759
760
760 if data_cspc == None:
761 if data_cspc == None:
761 self.__buffer_cspc = None
762 self.__buffer_cspc = None
762 else:
763 else:
763 self.__buffer_cspc += data_cspc
764 self.__buffer_cspc += data_cspc
764
765
765 if data_dc == None:
766 if data_dc == None:
766 self.__buffer_dc = None
767 self.__buffer_dc = None
767 else:
768 else:
768 self.__buffer_dc += data_dc
769 self.__buffer_dc += data_dc
769
770
770 self.__profIndex += 1
771 self.__profIndex += 1
771 return
772 return
772
773
773 #If the buffer length is lower than n then stakcing the data value
774 #If the buffer length is lower than n then stakcing the data value
774 if self.__profIndex < self.n:
775 if self.__profIndex < self.n:
775 self.__buffer_spc = numpy.vstack((self.__buffer_spc, data_spc))
776 self.__buffer_spc = numpy.vstack((self.__buffer_spc, data_spc))
776
777
777 if data_cspc != None:
778 if data_cspc != None:
778 self.__buffer_cspc = numpy.vstack((self.__buffer_cspc, data_cspc))
779 self.__buffer_cspc = numpy.vstack((self.__buffer_cspc, data_cspc))
779
780
780 if data_dc != None:
781 if data_dc != None:
781 self.__buffer_dc = numpy.vstack((self.__buffer_dc, data_dc))
782 self.__buffer_dc = numpy.vstack((self.__buffer_dc, data_dc))
782
783
783 self.__profIndex += 1
784 self.__profIndex += 1
784 return
785 return
785
786
786 #If the buffer length is equal to n then replacing the last buffer value with the data value
787 #If the buffer length is equal to n then replacing the last buffer value with the data value
787 self.__buffer_spc = numpy.roll(self.__buffer_spc, -1, axis=0)
788 self.__buffer_spc = numpy.roll(self.__buffer_spc, -1, axis=0)
788 self.__buffer_spc[self.n-1] = data_spc
789 self.__buffer_spc[self.n-1] = data_spc
789
790
790 if data_cspc != None:
791 if data_cspc != None:
791 self.__buffer_cspc = numpy.roll(self.__buffer_cspc, -1, axis=0)
792 self.__buffer_cspc = numpy.roll(self.__buffer_cspc, -1, axis=0)
792 self.__buffer_cspc[self.n-1] = data_cspc
793 self.__buffer_cspc[self.n-1] = data_cspc
793
794
794 if data_dc != None:
795 if data_dc != None:
795 self.__buffer_dc = numpy.roll(self.__buffer_dc, -1, axis=0)
796 self.__buffer_dc = numpy.roll(self.__buffer_dc, -1, axis=0)
796 self.__buffer_dc[self.n-1] = data_dc
797 self.__buffer_dc[self.n-1] = data_dc
797
798
798 self.__profIndex = self.n
799 self.__profIndex = self.n
799 return
800 return
800
801
801
802
802 def pushData(self):
803 def pushData(self):
803 """
804 """
804 Return the sum of the last profiles and the profiles used in the sum.
805 Return the sum of the last profiles and the profiles used in the sum.
805
806
806 Affected:
807 Affected:
807
808
808 self.__profileIndex
809 self.__profileIndex
809
810
810 """
811 """
811 data_spc = None
812 data_spc = None
812 data_cspc = None
813 data_cspc = None
813 data_dc = None
814 data_dc = None
814
815
815 if not self.__withOverapping:
816 if not self.__withOverapping:
816 data_spc = self.__buffer_spc
817 data_spc = self.__buffer_spc
817 data_cspc = self.__buffer_cspc
818 data_cspc = self.__buffer_cspc
818 data_dc = self.__buffer_dc
819 data_dc = self.__buffer_dc
819
820
820 n = self.__profIndex
821 n = self.__profIndex
821
822
822 self.__buffer_spc = 0
823 self.__buffer_spc = 0
823 self.__buffer_cspc = 0
824 self.__buffer_cspc = 0
824 self.__buffer_dc = 0
825 self.__buffer_dc = 0
825 self.__profIndex = 0
826 self.__profIndex = 0
826
827
827 return data_spc, data_cspc, data_dc, n
828 return data_spc, data_cspc, data_dc, n
828
829
829 #Integration with Overlapping
830 #Integration with Overlapping
830 data_spc = numpy.sum(self.__buffer_spc, axis=0)
831 data_spc = numpy.sum(self.__buffer_spc, axis=0)
831
832
832 if self.__buffer_cspc != None:
833 if self.__buffer_cspc != None:
833 data_cspc = numpy.sum(self.__buffer_cspc, axis=0)
834 data_cspc = numpy.sum(self.__buffer_cspc, axis=0)
834
835
835 if self.__buffer_dc != None:
836 if self.__buffer_dc != None:
836 data_dc = numpy.sum(self.__buffer_dc, axis=0)
837 data_dc = numpy.sum(self.__buffer_dc, axis=0)
837
838
838 n = self.__profIndex
839 n = self.__profIndex
839
840
840 return data_spc, data_cspc, data_dc, n
841 return data_spc, data_cspc, data_dc, n
841
842
842 def byProfiles(self, *args):
843 def byProfiles(self, *args):
843
844
844 self.__dataReady = False
845 self.__dataReady = False
845 avgdata_spc = None
846 avgdata_spc = None
846 avgdata_cspc = None
847 avgdata_cspc = None
847 avgdata_dc = None
848 avgdata_dc = None
848 # n = None
849 # n = None
849
850
850 self.putData(*args)
851 self.putData(*args)
851
852
852 if self.__profIndex == self.n:
853 if self.__profIndex == self.n:
853
854
854 avgdata_spc, avgdata_cspc, avgdata_dc, n = self.pushData()
855 avgdata_spc, avgdata_cspc, avgdata_dc, n = self.pushData()
855 self.__dataReady = True
856 self.__dataReady = True
856
857
857 return avgdata_spc, avgdata_cspc, avgdata_dc
858 return avgdata_spc, avgdata_cspc, avgdata_dc
858
859
859 def byTime(self, datatime, *args):
860 def byTime(self, datatime, *args):
860
861
861 self.__dataReady = False
862 self.__dataReady = False
862 avgdata_spc = None
863 avgdata_spc = None
863 avgdata_cspc = None
864 avgdata_cspc = None
864 avgdata_dc = None
865 avgdata_dc = None
865 n = None
866 n = None
866
867
867 self.putData(*args)
868 self.putData(*args)
868
869
869 if (datatime - self.__initime) >= self.__integrationtime:
870 if (datatime - self.__initime) >= self.__integrationtime:
870 avgdata_spc, avgdata_cspc, avgdata_dc, n = self.pushData()
871 avgdata_spc, avgdata_cspc, avgdata_dc, n = self.pushData()
871 self.n = n
872 self.n = n
872 self.__dataReady = True
873 self.__dataReady = True
873
874
874 return avgdata_spc, avgdata_cspc, avgdata_dc
875 return avgdata_spc, avgdata_cspc, avgdata_dc
875
876
876 def integrate(self, datatime, *args):
877 def integrate(self, datatime, *args):
877
878
878 if self.__initime == None:
879 if self.__initime == None:
879 self.__initime = datatime
880 self.__initime = datatime
880
881
881 if self.__byTime:
882 if self.__byTime:
882 avgdata_spc, avgdata_cspc, avgdata_dc = self.byTime(datatime, *args)
883 avgdata_spc, avgdata_cspc, avgdata_dc = self.byTime(datatime, *args)
883 else:
884 else:
884 avgdata_spc, avgdata_cspc, avgdata_dc = self.byProfiles(*args)
885 avgdata_spc, avgdata_cspc, avgdata_dc = self.byProfiles(*args)
885
886
886 self.__lastdatatime = datatime
887 self.__lastdatatime = datatime
887
888
888 if avgdata_spc == None:
889 if avgdata_spc == None:
889 return None, None, None, None
890 return None, None, None, None
890
891
891 avgdatatime = self.__initime
892 avgdatatime = self.__initime
892 try:
893 try:
893 self.__timeInterval = (self.__lastdatatime - self.__initime)/(self.n - 1)
894 self.__timeInterval = (self.__lastdatatime - self.__initime)/(self.n - 1)
894 except:
895 except:
895 self.__timeInterval = self.__lastdatatime - self.__initime
896 self.__timeInterval = self.__lastdatatime - self.__initime
896
897
897 deltatime = datatime -self.__lastdatatime
898 deltatime = datatime -self.__lastdatatime
898
899
899 if not self.__withOverapping:
900 if not self.__withOverapping:
900 self.__initime = datatime
901 self.__initime = datatime
901 else:
902 else:
902 self.__initime += deltatime
903 self.__initime += deltatime
903
904
904 return avgdatatime, avgdata_spc, avgdata_cspc, avgdata_dc
905 return avgdatatime, avgdata_spc, avgdata_cspc, avgdata_dc
905
906
906 def run(self, dataOut, n=None, timeInterval=None, overlapping=False):
907 def run(self, dataOut, n=None, timeInterval=None, overlapping=False):
907
908
908 if n==1:
909 if n==1:
909 dataOut.flagNoData = False
910 dataOut.flagNoData = False
910 return
911 return
911
912
912 if not self.isConfig:
913 if not self.isConfig:
913 self.setup(n, timeInterval, overlapping)
914 self.setup(n, timeInterval, overlapping)
914 self.isConfig = True
915 self.isConfig = True
915
916
916 avgdatatime, avgdata_spc, avgdata_cspc, avgdata_dc = self.integrate(dataOut.utctime,
917 avgdatatime, avgdata_spc, avgdata_cspc, avgdata_dc = self.integrate(dataOut.utctime,
917 dataOut.data_spc,
918 dataOut.data_spc,
918 dataOut.data_cspc,
919 dataOut.data_cspc,
919 dataOut.data_dc)
920 dataOut.data_dc)
920
921
921 # dataOut.timeInterval *= n
922 # dataOut.timeInterval *= n
922 dataOut.flagNoData = True
923 dataOut.flagNoData = True
923
924
924 if self.__dataReady:
925 if self.__dataReady:
925
926
926 dataOut.data_spc = avgdata_spc
927 dataOut.data_spc = avgdata_spc
927 dataOut.data_cspc = avgdata_cspc
928 dataOut.data_cspc = avgdata_cspc
928 dataOut.data_dc = avgdata_dc
929 dataOut.data_dc = avgdata_dc
929
930
930 dataOut.nIncohInt *= self.n
931 dataOut.nIncohInt *= self.n
931 dataOut.utctime = avgdatatime
932 dataOut.utctime = avgdatatime
932 #dataOut.timeInterval = dataOut.ippSeconds * dataOut.nCohInt * dataOut.nIncohInt * dataOut.nFFTPoints
933 #dataOut.timeInterval = dataOut.ippSeconds * dataOut.nCohInt * dataOut.nIncohInt * dataOut.nFFTPoints
933 dataOut.timeInterval = self.__timeInterval*self.n
934 dataOut.timeInterval = self.__timeInterval*self.n
934 dataOut.flagNoData = False
935 dataOut.flagNoData = False
@@ -1,4 +1,6
1 from jroproc_voltage import *
1 from jroproc_voltage import *
2 from jroproc_spectra import *
2 from jroproc_spectra import *
3 from jroproc_heispectra import *
3 from jroproc_heispectra import *
4 from jroproc_amisr import * No newline at end of file
4 from jroproc_amisr import *
5 from jroproc_correlation import *
6 from jroproc_parameters import * No newline at end of file
@@ -1,78 +1,81
1 """
1 """
2 Se debe verficar que el disco de datos se encuentra montado en el sistema
2 Se debe verficar que el disco de datos se encuentra montado en el sistema
3 """
3 """
4 import os, sys
4 import os, sys
5
5
6 path = os.path.split(os.getcwd())[0]
6 path = os.path.split(os.getcwd())[0]
7 sys.path.append(path)
7 sys.path.append(path)
8
8
9 from controller import *
9 from controller import *
10
10
11 desc = "Meteor Experiment Test"
11 desc = "Meteor Experiment Test"
12 filename = "meteor20130812.xml"
12 filename = "meteor20130812.xml"
13
13
14 controllerObj = Project()
14 controllerObj = Project()
15 controllerObj.setup(id = '191', name='meteor_test01', description=desc)
15 controllerObj.setup(id = '191', name='meteor_test01', description=desc)
16
16
17 path = '/home/dsuarez/.gvfs/data on 10.10.20.13/Jasmet50'
17 path = '/home/dsuarez/.gvfs/data on 10.10.20.13/Jasmet50'
18 pathFigure = '/home/jasmet/jasmet30_phase'
19 path = '/home/soporte/Data/JASMET/JASMET_30/2014106'
20 pathFigure = '/home/soporte/workspace/Graficos/JASMET/prueba1'
18
21
19
22
20 readUnitConfObj = controllerObj.addReadUnit(datatype='Voltage',
23 readUnitConfObj = controllerObj.addReadUnit(datatype='VoltageReader',
21 path=path,
24 path=path,
22 startDate='2014/04/15',
25 startDate='2014/04/15',
23 endDate='2014/04/15',
26 endDate='2014/04/15',
24 startTime='17:00:00',
27 startTime='20:00:00',
25 endTime='23:59:59',
28 endTime='23:59:59',
26 online=0,
29 online=0,
27 walk=1)
30 walk=0)
28
31
29 opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock')
32 opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock')
30
33
31 procUnitConfObj0 = controllerObj.addProcUnit(datatype='Voltage', inputId=readUnitConfObj.getId())
34 procUnitConfObj0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId())
32
35
33
36
34 opObj11 = procUnitConfObj0.addOperation(name='Decoder', optype='other')
37 # opObj11 = procUnitConfObj0.addOperation(name='Decoder', optype='other')
38 #
39 #
40 # opObj11 = procUnitConfObj0.addOperation(name='CohInt', optype='other')
41 # opObj11.addParameter(name='n', value='2', format='int')
35
42
36
43 # opObj11 = procUnitConfObj0.addOperation(name='VoltageWriter', optype='other')
37 opObj11 = procUnitConfObj0.addOperation(name='CohInt', optype='other')
44 # opObj11.addParameter(name='path', value='/home/jasmet/jasmet30_abril')
38 opObj11.addParameter(name='n', value='2', format='int')
45 # opObj11.addParameter(name='blocksPerFile', value='100', format='int')
39
46 # opObj11.addParameter(name='profilesPerBlock', value='200', format='int')
40 opObj11 = procUnitConfObj0.addOperation(name='VoltageWriter', optype='other')
41 opObj11.addParameter(name='path', value='/home/jasmet/jasmet30_abril')
42 opObj11.addParameter(name='blocksPerFile', value='100', format='int')
43 opObj11.addParameter(name='profilesPerBlock', value='200', format='int')
44
47
45
48
46 """
49 """
47 ########################################### BEACON ##########################################
50 ########################################### BEACON ##########################################
48 """
51 """
49
52
50 procUnitConfObjBeacon = controllerObj.addProcUnit(datatype='Spectra', inputId=procUnitConfObj0.getId())
53 procUnitConfObjBeacon = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObj0.getId())
51 procUnitConfObjBeacon.addParameter(name='nProfiles', value='200', format='int')
54 procUnitConfObjBeacon.addParameter(name='nProfiles', value='200', format='int')
52 procUnitConfObjBeacon.addParameter(name='nFFTPoints', value='200', format='int')
55 procUnitConfObjBeacon.addParameter(name='nFFTPoints', value='200', format='int')
53 procUnitConfObjBeacon.addParameter(name='pairsList', value='(2,0),(2,1),(2,3),(2,4)', format='pairsList')
56 procUnitConfObjBeacon.addParameter(name='pairsList', value='(2,0),(2,1),(2,3),(2,4)', format='pairsList')
54
57
55 opObj11 = procUnitConfObjBeacon.addOperation(name='IncohInt', optype='other')
58 opObj11 = procUnitConfObjBeacon.addOperation(name='IncohInt', optype='other')
56 opObj11.addParameter(name='n', value='4', format='int')
59 opObj11.addParameter(name='n', value='4', format='int')
57
60
58 opObj11 = procUnitConfObjBeacon.addOperation(name='getBeaconSignal')
61 opObj11 = procUnitConfObjBeacon.addOperation(name='getBeaconSignal')
59
62
60 opObj11 = procUnitConfObjBeacon.addOperation(name='BeaconPhase', optype='other')
63 opObj11 = procUnitConfObjBeacon.addOperation(name='BeaconPhase', optype='other')
61 opObj11.addParameter(name='id', value='201', format='int')
64 opObj11.addParameter(name='id', value='201', format='int')
62 opObj11.addParameter(name='wintitle', value='Beacon Phase', format='str')
65 opObj11.addParameter(name='wintitle', value='Beacon Phase', format='str')
63 opObj11.addParameter(name='timerange', value='300', format='int')
66 opObj11.addParameter(name='timerange', value='300', format='int')
64 opObj11.addParameter(name='xmin', value='0', format='float')
67 opObj11.addParameter(name='xmin', value='20', format='float')
65 opObj11.addParameter(name='xmax', value='24', format='float')
68 opObj11.addParameter(name='xmax', value='22', format='float')
66 opObj11.addParameter(name='ymin', value='-180', format='float')
69 opObj11.addParameter(name='ymin', value='-180', format='float')
67 opObj11.addParameter(name='ymax', value='180', format='float')
70 opObj11.addParameter(name='ymax', value='180', format='float')
68 opObj11.addParameter(name='figpath', value='/home/jasmet/jasmet30_phase', format='str')
71 opObj11.addParameter(name='figpath', value=pathFigure, format='str')
69
72
70
73
71 print "Escribiendo el archivo XML"
74 print "Escribiendo el archivo XML"
72 controllerObj.writeXml(filename)
75 controllerObj.writeXml(filename)
73 print "Leyendo el archivo XML"
76 print "Leyendo el archivo XML"
74 controllerObj.readXml(filename)
77 controllerObj.readXml(filename)
75
78
76 controllerObj.createObjects()
79 controllerObj.createObjects()
77 controllerObj.connectObjects()
80 controllerObj.connectObjects()
78 controllerObj.run()
81 controllerObj.run()
1 NO CONTENT: file renamed from schainpy/test/Meteor_JASMET_50mhz.py to schainpy/test/Meteor_JASMET50Mhz_Beacon.py
NO CONTENT: file renamed from schainpy/test/Meteor_JASMET_50mhz.py to schainpy/test/Meteor_JASMET50Mhz_Beacon.py
General Comments 0
You need to be logged in to leave comments. Login now