##// END OF EJS Templates
25/04/18
ebocanegra -
r1156:b9e1884ee58d
parent child
Show More
@@ -1,2161 +1,2161
1 import os
1 import os
2 import datetime
2 import datetime
3 import numpy
3 import numpy
4 import inspect
4 import inspect
5 from figure import Figure, isRealtime, isTimeInHourRange
5 from figure import Figure, isRealtime, isTimeInHourRange
6 from plotting_codes import *
6 from plotting_codes import *
7
7
8
8
9 class SpcParamPlot(Figure):
9 class SpcParamPlot(Figure):
10
10
11 isConfig = None
11 isConfig = None
12 __nsubplots = None
12 __nsubplots = None
13
13
14 WIDTHPROF = None
14 WIDTHPROF = None
15 HEIGHTPROF = None
15 HEIGHTPROF = None
16 PREFIX = 'SpcParam'
16 PREFIX = 'SpcParam'
17
17
18 def __init__(self, **kwargs):
18 def __init__(self, **kwargs):
19 Figure.__init__(self, **kwargs)
19 Figure.__init__(self, **kwargs)
20 self.isConfig = False
20 self.isConfig = False
21 self.__nsubplots = 1
21 self.__nsubplots = 1
22
22
23 self.WIDTH = 250
23 self.WIDTH = 250
24 self.HEIGHT = 250
24 self.HEIGHT = 250
25 self.WIDTHPROF = 120
25 self.WIDTHPROF = 120
26 self.HEIGHTPROF = 0
26 self.HEIGHTPROF = 0
27 self.counter_imagwr = 0
27 self.counter_imagwr = 0
28
28
29 self.PLOT_CODE = SPEC_CODE
29 self.PLOT_CODE = SPEC_CODE
30
30
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 self.__xfilter_ena = False
36 self.__xfilter_ena = False
37 self.__yfilter_ena = False
37 self.__yfilter_ena = False
38
38
39 def getSubplots(self):
39 def getSubplots(self):
40
40
41 ncol = int(numpy.sqrt(self.nplots)+0.9)
41 ncol = int(numpy.sqrt(self.nplots)+0.9)
42 nrow = int(self.nplots*1./ncol + 0.9)
42 nrow = int(self.nplots*1./ncol + 0.9)
43
43
44 return nrow, ncol
44 return nrow, ncol
45
45
46 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
46 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
47
47
48 self.__showprofile = showprofile
48 self.__showprofile = showprofile
49 self.nplots = nplots
49 self.nplots = nplots
50
50
51 ncolspan = 1
51 ncolspan = 1
52 colspan = 1
52 colspan = 1
53 if showprofile:
53 if showprofile:
54 ncolspan = 3
54 ncolspan = 3
55 colspan = 2
55 colspan = 2
56 self.__nsubplots = 2
56 self.__nsubplots = 2
57
57
58 self.createFigure(id = id,
58 self.createFigure(id = id,
59 wintitle = wintitle,
59 wintitle = wintitle,
60 widthplot = self.WIDTH + self.WIDTHPROF,
60 widthplot = self.WIDTH + self.WIDTHPROF,
61 heightplot = self.HEIGHT + self.HEIGHTPROF,
61 heightplot = self.HEIGHT + self.HEIGHTPROF,
62 show=show)
62 show=show)
63
63
64 nrow, ncol = self.getSubplots()
64 nrow, ncol = self.getSubplots()
65
65
66 counter = 0
66 counter = 0
67 for y in range(nrow):
67 for y in range(nrow):
68 for x in range(ncol):
68 for x in range(ncol):
69
69
70 if counter >= self.nplots:
70 if counter >= self.nplots:
71 break
71 break
72
72
73 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
73 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
74
74
75 if showprofile:
75 if showprofile:
76 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan+colspan, 1, 1)
76 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan+colspan, 1, 1)
77
77
78 counter += 1
78 counter += 1
79
79
80 def run(self, dataOut, id, wintitle="", channelList=None, showprofile=True,
80 def run(self, dataOut, id, wintitle="", channelList=None, showprofile=True,
81 xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None,
81 xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None,
82 save=False, figpath='./', figfile=None, show=True, ftp=False, wr_period=1,
82 save=False, figpath='./', figfile=None, show=True, ftp=False, wr_period=1,
83 server=None, folder=None, username=None, password=None,
83 server=None, folder=None, username=None, password=None,
84 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, realtime=False,
84 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, realtime=False,
85 xaxis="frequency", colormap='jet', normFactor=None , Selector = 0):
85 xaxis="frequency", colormap='jet', normFactor=None , Selector = 0):
86
86
87 """
87 """
88
88
89 Input:
89 Input:
90 dataOut :
90 dataOut :
91 id :
91 id :
92 wintitle :
92 wintitle :
93 channelList :
93 channelList :
94 showProfile :
94 showProfile :
95 xmin : None,
95 xmin : None,
96 xmax : None,
96 xmax : None,
97 ymin : None,
97 ymin : None,
98 ymax : None,
98 ymax : None,
99 zmin : None,
99 zmin : None,
100 zmax : None
100 zmax : 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" %channel
113 raise ValueError, "Channel %d is not in dataOut.channelList" %channel
114 channelIndexList.append(dataOut.channelList.index(channel))
114 channelIndexList.append(dataOut.channelList.index(channel))
115
115
116 # if normFactor is None:
116 # if normFactor is None:
117 # factor = dataOut.normFactor
117 # factor = dataOut.normFactor
118 # else:
118 # else:
119 # factor = normFactor
119 # factor = normFactor
120 if xaxis == "frequency":
120 if xaxis == "frequency":
121 x = dataOut.spcparam_range[0]
121 x = dataOut.spcparam_range[0]
122 xlabel = "Frequency (kHz)"
122 xlabel = "Frequency (kHz)"
123
123
124 elif xaxis == "time":
124 elif xaxis == "time":
125 x = dataOut.spcparam_range[1]
125 x = dataOut.spcparam_range[1]
126 xlabel = "Time (ms)"
126 xlabel = "Time (ms)"
127
127
128 else:
128 else:
129 x = dataOut.spcparam_range[2]
129 x = dataOut.spcparam_range[2]
130 xlabel = "Velocity (m/s)"
130 xlabel = "Velocity (m/s)"
131 print "Vmax=",x[-1]
131 print "Vmax=",x[-1]
132
132
133 ylabel = "Range (Km)"
133 ylabel = "Range (km)"
134
134
135 y = dataOut.getHeiRange()
135 y = dataOut.getHeiRange()
136
136
137 z = dataOut.SPCparam[Selector] /1966080.0#/ dataOut.normFactor#GauSelector] #dataOut.data_spc/factor
137 z = dataOut.SPCparam[Selector] /1966080.0#/ dataOut.normFactor#GauSelector] #dataOut.data_spc/factor
138 #print 'GausSPC', z[0,32,10:40]
138 #print 'GausSPC', z[0,32,10:40]
139 z = numpy.where(numpy.isfinite(z), z, numpy.NAN)
139 z = numpy.where(numpy.isfinite(z), z, numpy.NAN)
140 zdB = 10*numpy.log10(z)
140 zdB = 10*numpy.log10(z)
141
141
142 avg = numpy.average(z, axis=1)
142 avg = numpy.average(z, axis=1)
143 avgdB = 10*numpy.log10(avg)
143 avgdB = 10*numpy.log10(avg)
144
144
145 noise = dataOut.spc_noise
145 noise = dataOut.spc_noise
146 noisedB = 10*numpy.log10(noise)
146 noisedB = 10*numpy.log10(noise)
147
147
148 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0])
148 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0])
149 title = wintitle + " Spectra"
149 title = wintitle + " Spectra"
150 if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)):
150 if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)):
151 title = title + '_' + 'azimuth,zenith=%2.2f,%2.2f'%(dataOut.azimuth, dataOut.zenith)
151 title = title + '_' + 'azimuth,zenith=%2.2f,%2.2f'%(dataOut.azimuth, dataOut.zenith)
152
152
153 if not self.isConfig:
153 if not self.isConfig:
154
154
155 nplots = len(channelIndexList)
155 nplots = len(channelIndexList)
156
156
157 self.setup(id=id,
157 self.setup(id=id,
158 nplots=nplots,
158 nplots=nplots,
159 wintitle=wintitle,
159 wintitle=wintitle,
160 showprofile=showprofile,
160 showprofile=showprofile,
161 show=show)
161 show=show)
162
162
163 if xmin == None: xmin = numpy.nanmin(x)
163 if xmin == None: xmin = numpy.nanmin(x)
164 if xmax == None: xmax = numpy.nanmax(x)
164 if xmax == None: xmax = numpy.nanmax(x)
165 if ymin == None: ymin = numpy.nanmin(y)
165 if ymin == None: ymin = numpy.nanmin(y)
166 if ymax == None: ymax = numpy.nanmax(y)
166 if ymax == None: ymax = numpy.nanmax(y)
167 if zmin == None: zmin = numpy.floor(numpy.nanmin(noisedB)) - 3
167 if zmin == None: zmin = numpy.floor(numpy.nanmin(noisedB)) - 3
168 if zmax == None: zmax = numpy.ceil(numpy.nanmax(avgdB)) + 3
168 if zmax == None: zmax = numpy.ceil(numpy.nanmax(avgdB)) + 3
169
169
170 self.FTP_WEI = ftp_wei
170 self.FTP_WEI = ftp_wei
171 self.EXP_CODE = exp_code
171 self.EXP_CODE = exp_code
172 self.SUB_EXP_CODE = sub_exp_code
172 self.SUB_EXP_CODE = sub_exp_code
173 self.PLOT_POS = plot_pos
173 self.PLOT_POS = plot_pos
174
174
175 self.isConfig = True
175 self.isConfig = True
176
176
177 self.setWinTitle(title)
177 self.setWinTitle(title)
178
178
179 for i in range(self.nplots):
179 for i in range(self.nplots):
180 index = channelIndexList[i]
180 index = channelIndexList[i]
181 str_datetime = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S"))
181 str_datetime = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S"))
182 title = "Channel %d: %4.2fdB: %s" %(dataOut.channelList[index], noisedB[index], str_datetime)
182 title = "Channel %d: %4.2fdB: %s" %(dataOut.channelList[index], noisedB[index], str_datetime)
183 if len(dataOut.beam.codeList) != 0:
183 if len(dataOut.beam.codeList) != 0:
184 title = "Ch%d:%4.2fdB,%2.2f,%2.2f:%s" %(dataOut.channelList[index], noisedB[index], dataOut.beam.azimuthList[index], dataOut.beam.zenithList[index], str_datetime)
184 title = "Ch%d:%4.2fdB,%2.2f,%2.2f:%s" %(dataOut.channelList[index], noisedB[index], dataOut.beam.azimuthList[index], dataOut.beam.zenithList[index], str_datetime)
185
185
186 axes = self.axesList[i*self.__nsubplots]
186 axes = self.axesList[i*self.__nsubplots]
187 axes.pcolor(x, y, zdB[index,:,:],
187 axes.pcolor(x, y, zdB[index,:,:],
188 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
188 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
189 xlabel=xlabel, ylabel=ylabel, title=title, colormap=colormap,
189 xlabel=xlabel, ylabel=ylabel, title=title, colormap=colormap,
190 ticksize=9, cblabel='')
190 ticksize=9, cblabel='')
191
191
192 if self.__showprofile:
192 if self.__showprofile:
193 axes = self.axesList[i*self.__nsubplots +1]
193 axes = self.axesList[i*self.__nsubplots +1]
194 axes.pline(avgdB[index,:], y,
194 axes.pline(avgdB[index,:], y,
195 xmin=zmin, xmax=zmax, ymin=ymin, ymax=ymax,
195 xmin=zmin, xmax=zmax, ymin=ymin, ymax=ymax,
196 xlabel='dB', ylabel='', title='',
196 xlabel='dB', ylabel='', title='',
197 ytick_visible=False,
197 ytick_visible=False,
198 grid='x')
198 grid='x')
199
199
200 noiseline = numpy.repeat(noisedB[index], len(y))
200 noiseline = numpy.repeat(noisedB[index], len(y))
201 axes.addpline(noiseline, y, idline=1, color="black", linestyle="dashed", lw=2)
201 axes.addpline(noiseline, y, idline=1, color="black", linestyle="dashed", lw=2)
202
202
203 self.draw()
203 self.draw()
204
204
205 if figfile == None:
205 if figfile == None:
206 str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S")
206 str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S")
207 name = str_datetime
207 name = str_datetime
208 if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)):
208 if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)):
209 name = name + '_az' + '_%2.2f'%(dataOut.azimuth) + '_zn' + '_%2.2f'%(dataOut.zenith)
209 name = name + '_az' + '_%2.2f'%(dataOut.azimuth) + '_zn' + '_%2.2f'%(dataOut.zenith)
210 figfile = self.getFilename(name)
210 figfile = self.getFilename(name)
211
211
212 self.save(figpath=figpath,
212 self.save(figpath=figpath,
213 figfile=figfile,
213 figfile=figfile,
214 save=save,
214 save=save,
215 ftp=ftp,
215 ftp=ftp,
216 wr_period=wr_period,
216 wr_period=wr_period,
217 thisDatetime=thisDatetime)
217 thisDatetime=thisDatetime)
218
218
219
219
220
220
221 class MomentsPlot(Figure):
221 class MomentsPlot(Figure):
222
222
223 isConfig = None
223 isConfig = None
224 __nsubplots = None
224 __nsubplots = None
225
225
226 WIDTHPROF = None
226 WIDTHPROF = None
227 HEIGHTPROF = None
227 HEIGHTPROF = None
228 PREFIX = 'prm'
228 PREFIX = 'prm'
229
229
230 def __init__(self, **kwargs):
230 def __init__(self, **kwargs):
231 Figure.__init__(self, **kwargs)
231 Figure.__init__(self, **kwargs)
232 self.isConfig = False
232 self.isConfig = False
233 self.__nsubplots = 1
233 self.__nsubplots = 1
234
234
235 self.WIDTH = 280
235 self.WIDTH = 280
236 self.HEIGHT = 250
236 self.HEIGHT = 250
237 self.WIDTHPROF = 120
237 self.WIDTHPROF = 120
238 self.HEIGHTPROF = 0
238 self.HEIGHTPROF = 0
239 self.counter_imagwr = 0
239 self.counter_imagwr = 0
240
240
241 self.PLOT_CODE = MOMENTS_CODE
241 self.PLOT_CODE = MOMENTS_CODE
242
242
243 self.FTP_WEI = None
243 self.FTP_WEI = None
244 self.EXP_CODE = None
244 self.EXP_CODE = None
245 self.SUB_EXP_CODE = None
245 self.SUB_EXP_CODE = None
246 self.PLOT_POS = None
246 self.PLOT_POS = None
247
247
248 def getSubplots(self):
248 def getSubplots(self):
249
249
250 ncol = int(numpy.sqrt(self.nplots)+0.9)
250 ncol = int(numpy.sqrt(self.nplots)+0.9)
251 nrow = int(self.nplots*1./ncol + 0.9)
251 nrow = int(self.nplots*1./ncol + 0.9)
252
252
253 return nrow, ncol
253 return nrow, ncol
254
254
255 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
255 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
256
256
257 self.__showprofile = showprofile
257 self.__showprofile = showprofile
258 self.nplots = nplots
258 self.nplots = nplots
259
259
260 ncolspan = 1
260 ncolspan = 1
261 colspan = 1
261 colspan = 1
262 if showprofile:
262 if showprofile:
263 ncolspan = 3
263 ncolspan = 3
264 colspan = 2
264 colspan = 2
265 self.__nsubplots = 2
265 self.__nsubplots = 2
266
266
267 self.createFigure(id = id,
267 self.createFigure(id = id,
268 wintitle = wintitle,
268 wintitle = wintitle,
269 widthplot = self.WIDTH + self.WIDTHPROF,
269 widthplot = self.WIDTH + self.WIDTHPROF,
270 heightplot = self.HEIGHT + self.HEIGHTPROF,
270 heightplot = self.HEIGHT + self.HEIGHTPROF,
271 show=show)
271 show=show)
272
272
273 nrow, ncol = self.getSubplots()
273 nrow, ncol = self.getSubplots()
274
274
275 counter = 0
275 counter = 0
276 for y in range(nrow):
276 for y in range(nrow):
277 for x in range(ncol):
277 for x in range(ncol):
278
278
279 if counter >= self.nplots:
279 if counter >= self.nplots:
280 break
280 break
281
281
282 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
282 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
283
283
284 if showprofile:
284 if showprofile:
285 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan+colspan, 1, 1)
285 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan+colspan, 1, 1)
286
286
287 counter += 1
287 counter += 1
288
288
289 def run(self, dataOut, id, wintitle="", channelList=None, showprofile=True,
289 def run(self, dataOut, id, wintitle="", channelList=None, showprofile=True,
290 xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None,
290 xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None,
291 save=False, figpath='./', figfile=None, show=True, ftp=False, wr_period=1,
291 save=False, figpath='./', figfile=None, show=True, ftp=False, wr_period=1,
292 server=None, folder=None, username=None, password=None,
292 server=None, folder=None, username=None, password=None,
293 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, realtime=False):
293 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, realtime=False):
294
294
295 """
295 """
296
296
297 Input:
297 Input:
298 dataOut :
298 dataOut :
299 id :
299 id :
300 wintitle :
300 wintitle :
301 channelList :
301 channelList :
302 showProfile :
302 showProfile :
303 xmin : None,
303 xmin : None,
304 xmax : None,
304 xmax : None,
305 ymin : None,
305 ymin : None,
306 ymax : None,
306 ymax : None,
307 zmin : None,
307 zmin : None,
308 zmax : None
308 zmax : None
309 """
309 """
310
310
311 if dataOut.flagNoData:
311 if dataOut.flagNoData:
312 return None
312 return None
313
313
314 if realtime:
314 if realtime:
315 if not(isRealtime(utcdatatime = dataOut.utctime)):
315 if not(isRealtime(utcdatatime = dataOut.utctime)):
316 print 'Skipping this plot function'
316 print 'Skipping this plot function'
317 return
317 return
318
318
319 if channelList == None:
319 if channelList == None:
320 channelIndexList = dataOut.channelIndexList
320 channelIndexList = dataOut.channelIndexList
321 else:
321 else:
322 channelIndexList = []
322 channelIndexList = []
323 for channel in channelList:
323 for channel in channelList:
324 if channel not in dataOut.channelList:
324 if channel not in dataOut.channelList:
325 raise ValueError, "Channel %d is not in dataOut.channelList"
325 raise ValueError, "Channel %d is not in dataOut.channelList"
326 channelIndexList.append(dataOut.channelList.index(channel))
326 channelIndexList.append(dataOut.channelList.index(channel))
327
327
328 factor = dataOut.normFactor
328 factor = dataOut.normFactor
329 x = dataOut.abscissaList
329 x = dataOut.abscissaList
330 y = dataOut.heightList
330 y = dataOut.heightList
331
331
332 z = dataOut.data_pre[channelIndexList,:,:]/factor
332 z = dataOut.data_pre[channelIndexList,:,:]/factor
333 z = numpy.where(numpy.isfinite(z), z, numpy.NAN)
333 z = numpy.where(numpy.isfinite(z), z, numpy.NAN)
334 avg = numpy.average(z, axis=1)
334 avg = numpy.average(z, axis=1)
335 noise = dataOut.noise/factor
335 noise = dataOut.noise/factor
336
336
337 zdB = 10*numpy.log10(z)
337 zdB = 10*numpy.log10(z)
338 avgdB = 10*numpy.log10(avg)
338 avgdB = 10*numpy.log10(avg)
339 noisedB = 10*numpy.log10(noise)
339 noisedB = 10*numpy.log10(noise)
340
340
341 #thisDatetime = dataOut.datatime
341 #thisDatetime = dataOut.datatime
342 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0])
342 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0])
343 title = wintitle + " Parameters"
343 title = wintitle + " Parameters"
344 xlabel = "Velocity (m/s)"
344 xlabel = "Velocity (m/s)"
345 ylabel = "Range (Km)"
345 ylabel = "Range (Km)"
346
346
347 update_figfile = False
347 update_figfile = False
348
348
349 if not self.isConfig:
349 if not self.isConfig:
350
350
351 nplots = len(channelIndexList)
351 nplots = len(channelIndexList)
352
352
353 self.setup(id=id,
353 self.setup(id=id,
354 nplots=nplots,
354 nplots=nplots,
355 wintitle=wintitle,
355 wintitle=wintitle,
356 showprofile=showprofile,
356 showprofile=showprofile,
357 show=show)
357 show=show)
358
358
359 if xmin == None: xmin = numpy.nanmin(x)
359 if xmin == None: xmin = numpy.nanmin(x)
360 if xmax == None: xmax = numpy.nanmax(x)
360 if xmax == None: xmax = numpy.nanmax(x)
361 if ymin == None: ymin = numpy.nanmin(y)
361 if ymin == None: ymin = numpy.nanmin(y)
362 if ymax == None: ymax = numpy.nanmax(y)
362 if ymax == None: ymax = numpy.nanmax(y)
363 if zmin == None: zmin = numpy.nanmin(avgdB)*0.9
363 if zmin == None: zmin = numpy.nanmin(avgdB)*0.9
364 if zmax == None: zmax = numpy.nanmax(avgdB)*0.9
364 if zmax == None: zmax = numpy.nanmax(avgdB)*0.9
365
365
366 self.FTP_WEI = ftp_wei
366 self.FTP_WEI = ftp_wei
367 self.EXP_CODE = exp_code
367 self.EXP_CODE = exp_code
368 self.SUB_EXP_CODE = sub_exp_code
368 self.SUB_EXP_CODE = sub_exp_code
369 self.PLOT_POS = plot_pos
369 self.PLOT_POS = plot_pos
370
370
371 self.isConfig = True
371 self.isConfig = True
372 update_figfile = True
372 update_figfile = True
373
373
374 self.setWinTitle(title)
374 self.setWinTitle(title)
375
375
376 for i in range(self.nplots):
376 for i in range(self.nplots):
377 str_datetime = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S"))
377 str_datetime = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S"))
378 title = "Channel %d: %4.2fdB: %s" %(dataOut.channelList[i], noisedB[i], str_datetime)
378 title = "Channel %d: %4.2fdB: %s" %(dataOut.channelList[i], noisedB[i], str_datetime)
379 axes = self.axesList[i*self.__nsubplots]
379 axes = self.axesList[i*self.__nsubplots]
380 axes.pcolor(x, y, zdB[i,:,:],
380 axes.pcolor(x, y, zdB[i,:,:],
381 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
381 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
382 xlabel=xlabel, ylabel=ylabel, title=title,
382 xlabel=xlabel, ylabel=ylabel, title=title,
383 ticksize=9, cblabel='')
383 ticksize=9, cblabel='')
384 #Mean Line
384 #Mean Line
385 mean = dataOut.data_param[i, 1, :]
385 mean = dataOut.data_param[i, 1, :]
386 axes.addpline(mean, y, idline=0, color="black", linestyle="solid", lw=1)
386 axes.addpline(mean, y, idline=0, color="black", linestyle="solid", lw=1)
387
387
388 if self.__showprofile:
388 if self.__showprofile:
389 axes = self.axesList[i*self.__nsubplots +1]
389 axes = self.axesList[i*self.__nsubplots +1]
390 axes.pline(avgdB[i], y,
390 axes.pline(avgdB[i], y,
391 xmin=zmin, xmax=zmax, ymin=ymin, ymax=ymax,
391 xmin=zmin, xmax=zmax, ymin=ymin, ymax=ymax,
392 xlabel='dB', ylabel='', title='',
392 xlabel='dB', ylabel='', title='',
393 ytick_visible=False,
393 ytick_visible=False,
394 grid='x')
394 grid='x')
395
395
396 noiseline = numpy.repeat(noisedB[i], len(y))
396 noiseline = numpy.repeat(noisedB[i], len(y))
397 axes.addpline(noiseline, y, idline=1, color="black", linestyle="dashed", lw=2)
397 axes.addpline(noiseline, y, idline=1, color="black", linestyle="dashed", lw=2)
398
398
399 self.draw()
399 self.draw()
400
400
401 self.save(figpath=figpath,
401 self.save(figpath=figpath,
402 figfile=figfile,
402 figfile=figfile,
403 save=save,
403 save=save,
404 ftp=ftp,
404 ftp=ftp,
405 wr_period=wr_period,
405 wr_period=wr_period,
406 thisDatetime=thisDatetime)
406 thisDatetime=thisDatetime)
407
407
408
408
409
409
410 class SkyMapPlot(Figure):
410 class SkyMapPlot(Figure):
411
411
412 __isConfig = None
412 __isConfig = None
413 __nsubplots = None
413 __nsubplots = None
414
414
415 WIDTHPROF = None
415 WIDTHPROF = None
416 HEIGHTPROF = None
416 HEIGHTPROF = None
417 PREFIX = 'mmap'
417 PREFIX = 'mmap'
418
418
419 def __init__(self, **kwargs):
419 def __init__(self, **kwargs):
420 Figure.__init__(self, **kwargs)
420 Figure.__init__(self, **kwargs)
421 self.isConfig = False
421 self.isConfig = False
422 self.__nsubplots = 1
422 self.__nsubplots = 1
423
423
424 # self.WIDTH = 280
424 # self.WIDTH = 280
425 # self.HEIGHT = 250
425 # self.HEIGHT = 250
426 self.WIDTH = 600
426 self.WIDTH = 600
427 self.HEIGHT = 600
427 self.HEIGHT = 600
428 self.WIDTHPROF = 120
428 self.WIDTHPROF = 120
429 self.HEIGHTPROF = 0
429 self.HEIGHTPROF = 0
430 self.counter_imagwr = 0
430 self.counter_imagwr = 0
431
431
432 self.PLOT_CODE = MSKYMAP_CODE
432 self.PLOT_CODE = MSKYMAP_CODE
433
433
434 self.FTP_WEI = None
434 self.FTP_WEI = None
435 self.EXP_CODE = None
435 self.EXP_CODE = None
436 self.SUB_EXP_CODE = None
436 self.SUB_EXP_CODE = None
437 self.PLOT_POS = None
437 self.PLOT_POS = None
438
438
439 def getSubplots(self):
439 def getSubplots(self):
440
440
441 ncol = int(numpy.sqrt(self.nplots)+0.9)
441 ncol = int(numpy.sqrt(self.nplots)+0.9)
442 nrow = int(self.nplots*1./ncol + 0.9)
442 nrow = int(self.nplots*1./ncol + 0.9)
443
443
444 return nrow, ncol
444 return nrow, ncol
445
445
446 def setup(self, id, nplots, wintitle, showprofile=False, show=True):
446 def setup(self, id, nplots, wintitle, showprofile=False, show=True):
447
447
448 self.__showprofile = showprofile
448 self.__showprofile = showprofile
449 self.nplots = nplots
449 self.nplots = nplots
450
450
451 ncolspan = 1
451 ncolspan = 1
452 colspan = 1
452 colspan = 1
453
453
454 self.createFigure(id = id,
454 self.createFigure(id = id,
455 wintitle = wintitle,
455 wintitle = wintitle,
456 widthplot = self.WIDTH, #+ self.WIDTHPROF,
456 widthplot = self.WIDTH, #+ self.WIDTHPROF,
457 heightplot = self.HEIGHT,# + self.HEIGHTPROF,
457 heightplot = self.HEIGHT,# + self.HEIGHTPROF,
458 show=show)
458 show=show)
459
459
460 nrow, ncol = 1,1
460 nrow, ncol = 1,1
461 counter = 0
461 counter = 0
462 x = 0
462 x = 0
463 y = 0
463 y = 0
464 self.addAxes(1, 1, 0, 0, 1, 1, True)
464 self.addAxes(1, 1, 0, 0, 1, 1, True)
465
465
466 def run(self, dataOut, id, wintitle="", channelList=None, showprofile=False,
466 def run(self, dataOut, id, wintitle="", channelList=None, showprofile=False,
467 tmin=0, tmax=24, timerange=None,
467 tmin=0, tmax=24, timerange=None,
468 save=False, figpath='./', figfile=None, show=True, ftp=False, wr_period=1,
468 save=False, figpath='./', figfile=None, show=True, ftp=False, wr_period=1,
469 server=None, folder=None, username=None, password=None,
469 server=None, folder=None, username=None, password=None,
470 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, realtime=False):
470 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, realtime=False):
471
471
472 """
472 """
473
473
474 Input:
474 Input:
475 dataOut :
475 dataOut :
476 id :
476 id :
477 wintitle :
477 wintitle :
478 channelList :
478 channelList :
479 showProfile :
479 showProfile :
480 xmin : None,
480 xmin : None,
481 xmax : None,
481 xmax : None,
482 ymin : None,
482 ymin : None,
483 ymax : None,
483 ymax : None,
484 zmin : None,
484 zmin : None,
485 zmax : None
485 zmax : None
486 """
486 """
487
487
488 arrayParameters = dataOut.data_param
488 arrayParameters = dataOut.data_param
489 error = arrayParameters[:,-1]
489 error = arrayParameters[:,-1]
490 indValid = numpy.where(error == 0)[0]
490 indValid = numpy.where(error == 0)[0]
491 finalMeteor = arrayParameters[indValid,:]
491 finalMeteor = arrayParameters[indValid,:]
492 finalAzimuth = finalMeteor[:,3]
492 finalAzimuth = finalMeteor[:,3]
493 finalZenith = finalMeteor[:,4]
493 finalZenith = finalMeteor[:,4]
494
494
495 x = finalAzimuth*numpy.pi/180
495 x = finalAzimuth*numpy.pi/180
496 y = finalZenith
496 y = finalZenith
497 x1 = [dataOut.ltctime, dataOut.ltctime]
497 x1 = [dataOut.ltctime, dataOut.ltctime]
498
498
499 #thisDatetime = dataOut.datatime
499 #thisDatetime = dataOut.datatime
500 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.ltctime)
500 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.ltctime)
501 title = wintitle + " Parameters"
501 title = wintitle + " Parameters"
502 xlabel = "Zonal Zenith Angle (deg) "
502 xlabel = "Zonal Zenith Angle (deg) "
503 ylabel = "Meridional Zenith Angle (deg)"
503 ylabel = "Meridional Zenith Angle (deg)"
504 update_figfile = False
504 update_figfile = False
505
505
506 if not self.isConfig:
506 if not self.isConfig:
507
507
508 nplots = 1
508 nplots = 1
509
509
510 self.setup(id=id,
510 self.setup(id=id,
511 nplots=nplots,
511 nplots=nplots,
512 wintitle=wintitle,
512 wintitle=wintitle,
513 showprofile=showprofile,
513 showprofile=showprofile,
514 show=show)
514 show=show)
515
515
516 if self.xmin is None and self.xmax is None:
516 if self.xmin is None and self.xmax is None:
517 self.xmin, self.xmax = self.getTimeLim(x1, tmin, tmax, timerange)
517 self.xmin, self.xmax = self.getTimeLim(x1, tmin, tmax, timerange)
518
518
519 if timerange != None:
519 if timerange != None:
520 self.timerange = timerange
520 self.timerange = timerange
521 else:
521 else:
522 self.timerange = self.xmax - self.xmin
522 self.timerange = self.xmax - self.xmin
523
523
524 self.FTP_WEI = ftp_wei
524 self.FTP_WEI = ftp_wei
525 self.EXP_CODE = exp_code
525 self.EXP_CODE = exp_code
526 self.SUB_EXP_CODE = sub_exp_code
526 self.SUB_EXP_CODE = sub_exp_code
527 self.PLOT_POS = plot_pos
527 self.PLOT_POS = plot_pos
528 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
528 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
529 self.firstdate = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S"))
529 self.firstdate = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S"))
530 self.isConfig = True
530 self.isConfig = True
531 update_figfile = True
531 update_figfile = True
532
532
533 self.setWinTitle(title)
533 self.setWinTitle(title)
534
534
535 i = 0
535 i = 0
536 str_datetime = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S"))
536 str_datetime = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S"))
537
537
538 axes = self.axesList[i*self.__nsubplots]
538 axes = self.axesList[i*self.__nsubplots]
539 nevents = axes.x_buffer.shape[0] + x.shape[0]
539 nevents = axes.x_buffer.shape[0] + x.shape[0]
540 title = "Meteor Detection Sky Map\n %s - %s \n Number of events: %5.0f\n" %(self.firstdate,str_datetime,nevents)
540 title = "Meteor Detection Sky Map\n %s - %s \n Number of events: %5.0f\n" %(self.firstdate,str_datetime,nevents)
541 axes.polar(x, y,
541 axes.polar(x, y,
542 title=title, xlabel=xlabel, ylabel=ylabel,
542 title=title, xlabel=xlabel, ylabel=ylabel,
543 ticksize=9, cblabel='')
543 ticksize=9, cblabel='')
544
544
545 self.draw()
545 self.draw()
546
546
547 self.save(figpath=figpath,
547 self.save(figpath=figpath,
548 figfile=figfile,
548 figfile=figfile,
549 save=save,
549 save=save,
550 ftp=ftp,
550 ftp=ftp,
551 wr_period=wr_period,
551 wr_period=wr_period,
552 thisDatetime=thisDatetime,
552 thisDatetime=thisDatetime,
553 update_figfile=update_figfile)
553 update_figfile=update_figfile)
554
554
555 if dataOut.ltctime >= self.xmax:
555 if dataOut.ltctime >= self.xmax:
556 self.isConfigmagwr = wr_period
556 self.isConfigmagwr = wr_period
557 self.isConfig = False
557 self.isConfig = False
558 update_figfile = True
558 update_figfile = True
559 axes.__firsttime = True
559 axes.__firsttime = True
560 self.xmin += self.timerange
560 self.xmin += self.timerange
561 self.xmax += self.timerange
561 self.xmax += self.timerange
562
562
563
563
564
564
565
565
566 class WindProfilerPlot(Figure):
566 class WindProfilerPlot(Figure):
567
567
568 __isConfig = None
568 __isConfig = None
569 __nsubplots = None
569 __nsubplots = None
570
570
571 WIDTHPROF = None
571 WIDTHPROF = None
572 HEIGHTPROF = None
572 HEIGHTPROF = None
573 PREFIX = 'wind'
573 PREFIX = 'wind'
574
574
575 def __init__(self, **kwargs):
575 def __init__(self, **kwargs):
576 Figure.__init__(self, **kwargs)
576 Figure.__init__(self, **kwargs)
577 self.timerange = None
577 self.timerange = None
578 self.isConfig = False
578 self.isConfig = False
579 self.__nsubplots = 1
579 self.__nsubplots = 1
580
580
581 self.WIDTH = 800
581 self.WIDTH = 800
582 self.HEIGHT = 300
582 self.HEIGHT = 300
583 self.WIDTHPROF = 120
583 self.WIDTHPROF = 120
584 self.HEIGHTPROF = 0
584 self.HEIGHTPROF = 0
585 self.counter_imagwr = 0
585 self.counter_imagwr = 0
586
586
587 self.PLOT_CODE = WIND_CODE
587 self.PLOT_CODE = WIND_CODE
588
588
589 self.FTP_WEI = None
589 self.FTP_WEI = None
590 self.EXP_CODE = None
590 self.EXP_CODE = None
591 self.SUB_EXP_CODE = None
591 self.SUB_EXP_CODE = None
592 self.PLOT_POS = None
592 self.PLOT_POS = None
593 self.tmin = None
593 self.tmin = None
594 self.tmax = None
594 self.tmax = None
595
595
596 self.xmin = None
596 self.xmin = None
597 self.xmax = None
597 self.xmax = None
598
598
599 self.figfile = None
599 self.figfile = None
600
600
601 def getSubplots(self):
601 def getSubplots(self):
602
602
603 ncol = 1
603 ncol = 1
604 nrow = self.nplots
604 nrow = self.nplots
605
605
606 return nrow, ncol
606 return nrow, ncol
607
607
608 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
608 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
609
609
610 self.__showprofile = showprofile
610 self.__showprofile = showprofile
611 self.nplots = nplots
611 self.nplots = nplots
612
612
613 ncolspan = 1
613 ncolspan = 1
614 colspan = 1
614 colspan = 1
615
615
616 self.createFigure(id = id,
616 self.createFigure(id = id,
617 wintitle = wintitle,
617 wintitle = wintitle,
618 widthplot = self.WIDTH + self.WIDTHPROF,
618 widthplot = self.WIDTH + self.WIDTHPROF,
619 heightplot = self.HEIGHT + self.HEIGHTPROF,
619 heightplot = self.HEIGHT + self.HEIGHTPROF,
620 show=show)
620 show=show)
621
621
622 nrow, ncol = self.getSubplots()
622 nrow, ncol = self.getSubplots()
623
623
624 counter = 0
624 counter = 0
625 for y in range(nrow):
625 for y in range(nrow):
626 if counter >= self.nplots:
626 if counter >= self.nplots:
627 break
627 break
628
628
629 self.addAxes(nrow, ncol*ncolspan, y, 0, colspan, 1)
629 self.addAxes(nrow, ncol*ncolspan, y, 0, colspan, 1)
630 counter += 1
630 counter += 1
631
631
632 def run(self, dataOut, id, wintitle="", channelList=None, showprofile='False',
632 def run(self, dataOut, id, wintitle="", channelList=None, showprofile='False',
633 xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None,
633 xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None,
634 zmax_ver = None, zmin_ver = None, SNRmin = None, SNRmax = None,
634 zmax_ver = None, zmin_ver = None, SNRmin = None, SNRmax = None,
635 timerange=None, SNRthresh = None,
635 timerange=None, SNRthresh = None,
636 save=False, figpath='./', lastone=0,figfile=None, ftp=False, wr_period=1, show=True,
636 save=False, figpath='./', lastone=0,figfile=None, ftp=False, wr_period=1, show=True,
637 server=None, folder=None, username=None, password=None,
637 server=None, folder=None, username=None, password=None,
638 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0):
638 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0):
639 """
639 """
640
640
641 Input:
641 Input:
642 dataOut :
642 dataOut :
643 id :
643 id :
644 wintitle :
644 wintitle :
645 channelList :
645 channelList :
646 showProfile :
646 showProfile :
647 xmin : None,
647 xmin : None,
648 xmax : None,
648 xmax : None,
649 ymin : None,
649 ymin : None,
650 ymax : None,
650 ymax : None,
651 zmin : None,
651 zmin : None,
652 zmax : None
652 zmax : None
653 """
653 """
654
654
655 # if timerange is not None:
655 # if timerange is not None:
656 # self.timerange = timerange
656 # self.timerange = timerange
657 #
657 #
658 # tmin = None
658 # tmin = None
659 # tmax = None
659 # tmax = None
660
660
661 x = dataOut.getTimeRange1(dataOut.paramInterval)
661 x = dataOut.getTimeRange1(dataOut.paramInterval)
662 y = dataOut.heightList
662 y = dataOut.heightList
663 z = dataOut.data_output.copy()
663 z = dataOut.data_output.copy()
664 nplots = z.shape[0] #Number of wind dimensions estimated
664 nplots = z.shape[0] #Number of wind dimensions estimated
665 nplotsw = nplots
665 nplotsw = nplots
666
666
667
667
668 #If there is a SNR function defined
668 #If there is a SNR function defined
669 if dataOut.data_SNR is not None:
669 if dataOut.data_SNR is not None:
670 nplots += 1
670 nplots += 1
671 SNR = dataOut.data_SNR[0]
671 SNR = dataOut.data_SNR[0]
672 SNRavg = SNR#numpy.average(SNR, axis=0)
672 SNRavg = SNR#numpy.average(SNR, axis=0)
673
673
674 SNRdB = 10*numpy.log10(SNR)
674 SNRdB = 10*numpy.log10(SNR)
675 SNRavgdB = 10*numpy.log10(SNRavg)
675 SNRavgdB = 10*numpy.log10(SNRavg)
676
676
677 if SNRthresh == None:
677 if SNRthresh == None:
678 SNRthresh = -5.0
678 SNRthresh = -5.0
679 ind = numpy.where(SNRavg < 10**(SNRthresh/10))[0]
679 ind = numpy.where(SNRavg < 10**(SNRthresh/10))[0]
680
680
681 for i in range(nplotsw):
681 for i in range(nplotsw):
682 z[i,ind] = numpy.nan
682 z[i,ind] = numpy.nan
683
683
684 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.ltctime)
684 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.ltctime)
685 #thisDatetime = datetime.datetime.now()
685 #thisDatetime = datetime.datetime.now()
686 title = wintitle + "Wind"
686 title = wintitle + "Wind"
687 xlabel = ""
687 xlabel = ""
688 ylabel = "Height (km)"
688 ylabel = "Height (km)"
689 update_figfile = False
689 update_figfile = False
690
690
691 if not self.isConfig:
691 if not self.isConfig:
692
692
693 self.setup(id=id,
693 self.setup(id=id,
694 nplots=nplots,
694 nplots=nplots,
695 wintitle=wintitle,
695 wintitle=wintitle,
696 showprofile=showprofile,
696 showprofile=showprofile,
697 show=show)
697 show=show)
698
698
699 if timerange is not None:
699 if timerange is not None:
700 self.timerange = timerange
700 self.timerange = timerange
701
701
702 self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange)
702 self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange)
703
703
704 if ymin == None: ymin = numpy.nanmin(y)
704 if ymin == None: ymin = numpy.nanmin(y)
705 if ymax == None: ymax = numpy.nanmax(y)
705 if ymax == None: ymax = numpy.nanmax(y)
706
706
707 if zmax == None: zmax = numpy.nanmax(abs(z[range(2),:]))
707 if zmax == None: zmax = numpy.nanmax(abs(z[range(2),:]))
708 #if numpy.isnan(zmax): zmax = 50
708 #if numpy.isnan(zmax): zmax = 50
709 if zmin == None: zmin = -zmax
709 if zmin == None: zmin = -zmax
710
710
711 if nplotsw == 3:
711 if nplotsw == 3:
712 if zmax_ver == None: zmax_ver = numpy.nanmax(abs(z[2,:]))
712 if zmax_ver == None: zmax_ver = numpy.nanmax(abs(z[2,:]))
713 if zmin_ver == None: zmin_ver = -zmax_ver
713 if zmin_ver == None: zmin_ver = -zmax_ver
714
714
715 if dataOut.data_SNR is not None:
715 if dataOut.data_SNR is not None:
716 if SNRmin == None: SNRmin = numpy.nanmin(SNRavgdB)
716 if SNRmin == None: SNRmin = numpy.nanmin(SNRavgdB)
717 if SNRmax == None: SNRmax = numpy.nanmax(SNRavgdB)
717 if SNRmax == None: SNRmax = numpy.nanmax(SNRavgdB)
718
718
719
719
720 self.FTP_WEI = ftp_wei
720 self.FTP_WEI = ftp_wei
721 self.EXP_CODE = exp_code
721 self.EXP_CODE = exp_code
722 self.SUB_EXP_CODE = sub_exp_code
722 self.SUB_EXP_CODE = sub_exp_code
723 self.PLOT_POS = plot_pos
723 self.PLOT_POS = plot_pos
724
724
725 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
725 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
726 self.isConfig = True
726 self.isConfig = True
727 self.figfile = figfile
727 self.figfile = figfile
728 update_figfile = True
728 update_figfile = True
729
729
730 self.setWinTitle(title)
730 self.setWinTitle(title)
731
731
732 if ((self.xmax - x[1]) < (x[1]-x[0])):
732 if ((self.xmax - x[1]) < (x[1]-x[0])):
733 x[1] = self.xmax
733 x[1] = self.xmax
734
734
735 strWind = ['Zonal', 'Meridional', 'Vertical']
735 strWind = ['Zonal', 'Meridional', 'Vertical']
736 strCb = ['Velocity (m/s)','Velocity (m/s)','Velocity (cm/s)']
736 strCb = ['Velocity (m/s)','Velocity (m/s)','Velocity (cm/s)']
737 zmaxVector = [zmax, zmax, zmax_ver]
737 zmaxVector = [zmax, zmax, zmax_ver]
738 zminVector = [zmin, zmin, zmin_ver]
738 zminVector = [zmin, zmin, zmin_ver]
739 windFactor = [1,1,100]
739 windFactor = [1,1,100]
740
740
741 for i in range(nplotsw):
741 for i in range(nplotsw):
742
742
743 title = "%s Wind: %s" %(strWind[i], thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
743 title = "%s Wind: %s" %(strWind[i], thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
744 axes = self.axesList[i*self.__nsubplots]
744 axes = self.axesList[i*self.__nsubplots]
745
745
746 z1 = z[i,:].reshape((1,-1))*windFactor[i]
746 z1 = z[i,:].reshape((1,-1))*windFactor[i]
747
747
748 print 'x', x
748 print 'x', x
749 print datetime.datetime.utcfromtimestamp(x[0])
749 print datetime.datetime.utcfromtimestamp(x[0])
750 print datetime.datetime.utcfromtimestamp(x[1])
750 print datetime.datetime.utcfromtimestamp(x[1])
751
751
752 #z1=numpy.ma.masked_where(z1==0.,z1)
752 #z1=numpy.ma.masked_where(z1==0.,z1)
753
753
754 axes.pcolorbuffer(x, y, z1,
754 axes.pcolorbuffer(x, y, z1,
755 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=zminVector[i], zmax=zmaxVector[i],
755 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=zminVector[i], zmax=zmaxVector[i],
756 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
756 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
757 ticksize=9, cblabel=strCb[i], cbsize="1%", colormap="seismic" )
757 ticksize=9, cblabel=strCb[i], cbsize="1%", colormap="seismic" )
758
758
759 if dataOut.data_SNR is not None:
759 if dataOut.data_SNR is not None:
760 i += 1
760 i += 1
761 title = "Signal Noise Ratio (SNR): %s" %(thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
761 title = "Signal Noise Ratio (SNR): %s" %(thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
762 axes = self.axesList[i*self.__nsubplots]
762 axes = self.axesList[i*self.__nsubplots]
763 SNRavgdB = SNRavgdB.reshape((1,-1))
763 SNRavgdB = SNRavgdB.reshape((1,-1))
764 axes.pcolorbuffer(x, y, SNRavgdB,
764 axes.pcolorbuffer(x, y, SNRavgdB,
765 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=SNRmin, zmax=SNRmax,
765 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=SNRmin, zmax=SNRmax,
766 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
766 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
767 ticksize=9, cblabel='', cbsize="1%", colormap="jet")
767 ticksize=9, cblabel='', cbsize="1%", colormap="jet")
768
768
769 self.draw()
769 self.draw()
770
770
771 self.save(figpath=figpath,
771 self.save(figpath=figpath,
772 figfile=figfile,
772 figfile=figfile,
773 save=save,
773 save=save,
774 ftp=ftp,
774 ftp=ftp,
775 wr_period=wr_period,
775 wr_period=wr_period,
776 thisDatetime=thisDatetime,
776 thisDatetime=thisDatetime,
777 update_figfile=update_figfile)
777 update_figfile=update_figfile)
778
778
779 if dataOut.ltctime + dataOut.paramInterval >= self.xmax:
779 if dataOut.ltctime + dataOut.paramInterval >= self.xmax:
780 self.counter_imagwr = wr_period
780 self.counter_imagwr = wr_period
781 self.isConfig = False
781 self.isConfig = False
782 update_figfile = True
782 update_figfile = True
783
783
784
784
785 class ParametersPlot(Figure):
785 class ParametersPlot(Figure):
786
786
787 __isConfig = None
787 __isConfig = None
788 __nsubplots = None
788 __nsubplots = None
789
789
790 WIDTHPROF = None
790 WIDTHPROF = None
791 HEIGHTPROF = None
791 HEIGHTPROF = None
792 PREFIX = 'param'
792 PREFIX = 'param'
793
793
794 nplots = None
794 nplots = None
795 nchan = None
795 nchan = None
796
796
797 def __init__(self, **kwargs):
797 def __init__(self, **kwargs):
798 Figure.__init__(self, **kwargs)
798 Figure.__init__(self, **kwargs)
799 self.timerange = None
799 self.timerange = None
800 self.isConfig = False
800 self.isConfig = False
801 self.__nsubplots = 1
801 self.__nsubplots = 1
802
802
803 self.WIDTH = 800
803 self.WIDTH = 800
804 self.HEIGHT = 180
804 self.HEIGHT = 250
805 self.WIDTHPROF = 120
805 self.WIDTHPROF = 120
806 self.HEIGHTPROF = 0
806 self.HEIGHTPROF = 0
807 self.counter_imagwr = 0
807 self.counter_imagwr = 0
808
808
809 self.PLOT_CODE = RTI_CODE
809 self.PLOT_CODE = RTI_CODE
810
810
811 self.FTP_WEI = None
811 self.FTP_WEI = None
812 self.EXP_CODE = None
812 self.EXP_CODE = None
813 self.SUB_EXP_CODE = None
813 self.SUB_EXP_CODE = None
814 self.PLOT_POS = None
814 self.PLOT_POS = None
815 self.tmin = None
815 self.tmin = None
816 self.tmax = None
816 self.tmax = None
817
817
818 self.xmin = None
818 self.xmin = None
819 self.xmax = None
819 self.xmax = None
820
820
821 self.figfile = None
821 self.figfile = None
822
822
823 def getSubplots(self):
823 def getSubplots(self):
824
824
825 ncol = 1
825 ncol = 1
826 nrow = self.nplots
826 nrow = self.nplots
827
827
828 return nrow, ncol
828 return nrow, ncol
829
829
830 def setup(self, id, nplots, wintitle, show=True):
830 def setup(self, id, nplots, wintitle, show=True):
831
831
832 self.nplots = nplots
832 self.nplots = nplots
833
833
834 ncolspan = 1
834 ncolspan = 1
835 colspan = 1
835 colspan = 1
836
836
837 self.createFigure(id = id,
837 self.createFigure(id = id,
838 wintitle = wintitle,
838 wintitle = wintitle,
839 widthplot = self.WIDTH + self.WIDTHPROF,
839 widthplot = self.WIDTH + self.WIDTHPROF,
840 heightplot = self.HEIGHT + self.HEIGHTPROF,
840 heightplot = self.HEIGHT + self.HEIGHTPROF,
841 show=show)
841 show=show)
842
842
843 nrow, ncol = self.getSubplots()
843 nrow, ncol = self.getSubplots()
844
844
845 counter = 0
845 counter = 0
846 for y in range(nrow):
846 for y in range(nrow):
847 for x in range(ncol):
847 for x in range(ncol):
848
848
849 if counter >= self.nplots:
849 if counter >= self.nplots:
850 break
850 break
851
851
852 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
852 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
853
853
854 counter += 1
854 counter += 1
855
855
856 def run(self, dataOut, id, wintitle="", channelList=None, paramIndex = 0, colormap="jet",
856 def run(self, dataOut, id, wintitle="", channelList=None, paramIndex = 0, colormap="jet",
857 xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None, timerange=None,
857 xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None, timerange=None,
858 showSNR=False, SNRthresh = -numpy.inf, SNRmin=None, SNRmax=None,
858 showSNR=False, SNRthresh = -numpy.inf, SNRmin=None, SNRmax=None,
859 save=False, figpath='./', lastone=0,figfile=None, ftp=False, wr_period=1, show=True,
859 save=False, figpath='./', lastone=0,figfile=None, ftp=False, wr_period=1, show=True,
860 server=None, folder=None, username=None, password=None,
860 server=None, folder=None, username=None, password=None,
861 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, HEIGHT=None):
861 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, HEIGHT=None):
862 """
862 """
863
863
864 Input:
864 Input:
865 dataOut :
865 dataOut :
866 id :
866 id :
867 wintitle :
867 wintitle :
868 channelList :
868 channelList :
869 showProfile :
869 showProfile :
870 xmin : None,
870 xmin : None,
871 xmax : None,
871 xmax : None,
872 ymin : None,
872 ymin : None,
873 ymax : None,
873 ymax : None,
874 zmin : None,
874 zmin : None,
875 zmax : None
875 zmax : None
876 """
876 """
877
877
878 if HEIGHT is not None:
878 if HEIGHT is not None:
879 self.HEIGHT = HEIGHT
879 self.HEIGHT = HEIGHT
880
880
881
881
882 if not isTimeInHourRange(dataOut.datatime, xmin, xmax):
882 if not isTimeInHourRange(dataOut.datatime, xmin, xmax):
883 return
883 return
884
884
885 if channelList == None:
885 if channelList == None:
886 channelIndexList = range(dataOut.data_param.shape[0])
886 channelIndexList = range(dataOut.data_param.shape[0])
887 else:
887 else:
888 channelIndexList = []
888 channelIndexList = []
889 for channel in channelList:
889 for channel in channelList:
890 if channel not in dataOut.channelList:
890 if channel not in dataOut.channelList:
891 raise ValueError, "Channel %d is not in dataOut.channelList"
891 raise ValueError, "Channel %d is not in dataOut.channelList"
892 channelIndexList.append(dataOut.channelList.index(channel))
892 channelIndexList.append(dataOut.channelList.index(channel))
893
893
894 x = dataOut.getTimeRange1(dataOut.paramInterval)
894 x = dataOut.getTimeRange1(dataOut.paramInterval)
895 y = dataOut.getHeiRange()
895 y = dataOut.getHeiRange()
896
896
897 if dataOut.data_param.ndim == 3:
897 if dataOut.data_param.ndim == 3:
898 z = dataOut.data_param[channelIndexList,paramIndex,:]
898 z = dataOut.data_param[channelIndexList,paramIndex,:]
899 else:
899 else:
900 z = dataOut.data_param[channelIndexList,:]
900 z = dataOut.data_param[channelIndexList,:]
901
901
902 if showSNR:
902 if showSNR:
903 #SNR data
903 #SNR data
904 SNRarray = dataOut.data_SNR[channelIndexList,:]
904 SNRarray = dataOut.data_SNR[channelIndexList,:]
905 SNRdB = 10*numpy.log10(SNRarray)
905 SNRdB = 10*numpy.log10(SNRarray)
906 ind = numpy.where(SNRdB < SNRthresh)
906 ind = numpy.where(SNRdB < SNRthresh)
907 z[ind] = numpy.nan
907 z[ind] = numpy.nan
908
908
909 thisDatetime = dataOut.datatime
909 thisDatetime = dataOut.datatime
910 # thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0])
910 # thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0])
911 title = wintitle + " Parameters Plot" #: %s" %(thisDatetime.strftime("%d-%b-%Y"))
911 title = wintitle + " Parameters Plot" #: %s" %(thisDatetime.strftime("%d-%b-%Y"))
912 xlabel = ""
912 xlabel = ""
913 ylabel = "Range (Km)"
913 ylabel = "Range (Km)"
914
914
915 update_figfile = False
915 update_figfile = False
916
916
917 if not self.isConfig:
917 if not self.isConfig:
918
918
919 nchan = len(channelIndexList)
919 nchan = len(channelIndexList)
920 self.nchan = nchan
920 self.nchan = nchan
921 self.plotFact = 1
921 self.plotFact = 1
922 nplots = nchan
922 nplots = nchan
923
923
924 if showSNR:
924 if showSNR:
925 nplots = nchan*2
925 nplots = nchan*2
926 self.plotFact = 2
926 self.plotFact = 2
927 if SNRmin == None: SNRmin = numpy.nanmin(SNRdB)
927 if SNRmin == None: SNRmin = numpy.nanmin(SNRdB)
928 if SNRmax == None: SNRmax = numpy.nanmax(SNRdB)
928 if SNRmax == None: SNRmax = numpy.nanmax(SNRdB)
929
929
930 self.setup(id=id,
930 self.setup(id=id,
931 nplots=nplots,
931 nplots=nplots,
932 wintitle=wintitle,
932 wintitle=wintitle,
933 show=show)
933 show=show)
934
934
935 if timerange != None:
935 if timerange != None:
936 self.timerange = timerange
936 self.timerange = timerange
937
937
938 self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange)
938 self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange)
939
939
940 if ymin == None: ymin = numpy.nanmin(y)
940 if ymin == None: ymin = numpy.nanmin(y)
941 if ymax == None: ymax = numpy.nanmax(y)
941 if ymax == None: ymax = numpy.nanmax(y)
942 if zmin == None: zmin = numpy.nanmin(z)
942 if zmin == None: zmin = numpy.nanmin(z)
943 if zmax == None: zmax = numpy.nanmax(z)
943 if zmax == None: zmax = numpy.nanmax(z)
944
944
945 self.FTP_WEI = ftp_wei
945 self.FTP_WEI = ftp_wei
946 self.EXP_CODE = exp_code
946 self.EXP_CODE = exp_code
947 self.SUB_EXP_CODE = sub_exp_code
947 self.SUB_EXP_CODE = sub_exp_code
948 self.PLOT_POS = plot_pos
948 self.PLOT_POS = plot_pos
949
949
950 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
950 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
951 self.isConfig = True
951 self.isConfig = True
952 self.figfile = figfile
952 self.figfile = figfile
953 update_figfile = True
953 update_figfile = True
954
954
955 self.setWinTitle(title)
955 self.setWinTitle(title)
956
956
957 for i in range(self.nchan):
957 for i in range(self.nchan):
958 index = channelIndexList[i]
958 index = channelIndexList[i]
959 title = "Channel %d: %s" %(dataOut.channelList[index], thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
959 title = "Channel %d: %s" %(dataOut.channelList[index], thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
960 axes = self.axesList[i*self.plotFact]
960 axes = self.axesList[i*self.plotFact]
961 z1 = z[i,:].reshape((1,-1))
961 z1 = z[i,:].reshape((1,-1))
962 axes.pcolorbuffer(x, y, z1,
962 axes.pcolorbuffer(x, y, z1,
963 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
963 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
964 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
964 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
965 ticksize=9, cblabel='', cbsize="1%",colormap=colormap)
965 ticksize=9, cblabel='', cbsize="1%",colormap=colormap)
966
966
967 if showSNR:
967 if showSNR:
968 title = "Channel %d SNR: %s" %(dataOut.channelList[index], thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
968 title = "Channel %d SNR: %s" %(dataOut.channelList[index], thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
969 axes = self.axesList[i*self.plotFact + 1]
969 axes = self.axesList[i*self.plotFact + 1]
970 SNRdB1 = SNRdB[i,:].reshape((1,-1))
970 SNRdB1 = SNRdB[i,:].reshape((1,-1))
971 axes.pcolorbuffer(x, y, SNRdB1,
971 axes.pcolorbuffer(x, y, SNRdB1,
972 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=SNRmin, zmax=SNRmax,
972 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=SNRmin, zmax=SNRmax,
973 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
973 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
974 ticksize=9, cblabel='', cbsize="1%",colormap='jet')
974 ticksize=9, cblabel='', cbsize="1%",colormap='jet')
975
975
976
976
977 self.draw()
977 self.draw()
978
978
979 if dataOut.ltctime >= self.xmax:
979 if dataOut.ltctime >= self.xmax:
980 self.counter_imagwr = wr_period
980 self.counter_imagwr = wr_period
981 self.isConfig = False
981 self.isConfig = False
982 update_figfile = True
982 update_figfile = True
983
983
984 self.save(figpath=figpath,
984 self.save(figpath=figpath,
985 figfile=figfile,
985 figfile=figfile,
986 save=save,
986 save=save,
987 ftp=ftp,
987 ftp=ftp,
988 wr_period=wr_period,
988 wr_period=wr_period,
989 thisDatetime=thisDatetime,
989 thisDatetime=thisDatetime,
990 update_figfile=update_figfile)
990 update_figfile=update_figfile)
991
991
992
992
993
993
994 class Parameters1Plot(Figure):
994 class Parameters1Plot(Figure):
995
995
996 __isConfig = None
996 __isConfig = None
997 __nsubplots = None
997 __nsubplots = None
998
998
999 WIDTHPROF = None
999 WIDTHPROF = None
1000 HEIGHTPROF = None
1000 HEIGHTPROF = None
1001 PREFIX = 'prm'
1001 PREFIX = 'prm'
1002
1002
1003 def __init__(self, **kwargs):
1003 def __init__(self, **kwargs):
1004 Figure.__init__(self, **kwargs)
1004 Figure.__init__(self, **kwargs)
1005 self.timerange = 2*60*60
1005 self.timerange = 2*60*60
1006 self.isConfig = False
1006 self.isConfig = False
1007 self.__nsubplots = 1
1007 self.__nsubplots = 1
1008
1008
1009 self.WIDTH = 800
1009 self.WIDTH = 800
1010 self.HEIGHT = 180
1010 self.HEIGHT = 180
1011 self.WIDTHPROF = 120
1011 self.WIDTHPROF = 120
1012 self.HEIGHTPROF = 0
1012 self.HEIGHTPROF = 0
1013 self.counter_imagwr = 0
1013 self.counter_imagwr = 0
1014
1014
1015 self.PLOT_CODE = PARMS_CODE
1015 self.PLOT_CODE = PARMS_CODE
1016
1016
1017 self.FTP_WEI = None
1017 self.FTP_WEI = None
1018 self.EXP_CODE = None
1018 self.EXP_CODE = None
1019 self.SUB_EXP_CODE = None
1019 self.SUB_EXP_CODE = None
1020 self.PLOT_POS = None
1020 self.PLOT_POS = None
1021 self.tmin = None
1021 self.tmin = None
1022 self.tmax = None
1022 self.tmax = None
1023
1023
1024 self.xmin = None
1024 self.xmin = None
1025 self.xmax = None
1025 self.xmax = None
1026
1026
1027 self.figfile = None
1027 self.figfile = None
1028
1028
1029 def getSubplots(self):
1029 def getSubplots(self):
1030
1030
1031 ncol = 1
1031 ncol = 1
1032 nrow = self.nplots
1032 nrow = self.nplots
1033
1033
1034 return nrow, ncol
1034 return nrow, ncol
1035
1035
1036 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
1036 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
1037
1037
1038 self.__showprofile = showprofile
1038 self.__showprofile = showprofile
1039 self.nplots = nplots
1039 self.nplots = nplots
1040
1040
1041 ncolspan = 1
1041 ncolspan = 1
1042 colspan = 1
1042 colspan = 1
1043
1043
1044 self.createFigure(id = id,
1044 self.createFigure(id = id,
1045 wintitle = wintitle,
1045 wintitle = wintitle,
1046 widthplot = self.WIDTH + self.WIDTHPROF,
1046 widthplot = self.WIDTH + self.WIDTHPROF,
1047 heightplot = self.HEIGHT + self.HEIGHTPROF,
1047 heightplot = self.HEIGHT + self.HEIGHTPROF,
1048 show=show)
1048 show=show)
1049
1049
1050 nrow, ncol = self.getSubplots()
1050 nrow, ncol = self.getSubplots()
1051
1051
1052 counter = 0
1052 counter = 0
1053 for y in range(nrow):
1053 for y in range(nrow):
1054 for x in range(ncol):
1054 for x in range(ncol):
1055
1055
1056 if counter >= self.nplots:
1056 if counter >= self.nplots:
1057 break
1057 break
1058
1058
1059 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
1059 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
1060
1060
1061 if showprofile:
1061 if showprofile:
1062 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan+colspan, 1, 1)
1062 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan+colspan, 1, 1)
1063
1063
1064 counter += 1
1064 counter += 1
1065
1065
1066 def run(self, dataOut, id, wintitle="", channelList=None, showprofile=False,
1066 def run(self, dataOut, id, wintitle="", channelList=None, showprofile=False,
1067 xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None,timerange=None,
1067 xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None,timerange=None,
1068 parameterIndex = None, onlyPositive = False,
1068 parameterIndex = None, onlyPositive = False,
1069 SNRthresh = -numpy.inf, SNR = True, SNRmin = None, SNRmax = None, onlySNR = False,
1069 SNRthresh = -numpy.inf, SNR = True, SNRmin = None, SNRmax = None, onlySNR = False,
1070 DOP = True,
1070 DOP = True,
1071 zlabel = "", parameterName = "", parameterObject = "data_param",
1071 zlabel = "", parameterName = "", parameterObject = "data_param",
1072 save=False, figpath='./', lastone=0,figfile=None, ftp=False, wr_period=1, show=True,
1072 save=False, figpath='./', lastone=0,figfile=None, ftp=False, wr_period=1, show=True,
1073 server=None, folder=None, username=None, password=None,
1073 server=None, folder=None, username=None, password=None,
1074 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0):
1074 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0):
1075 #print inspect.getargspec(self.run).args
1075 #print inspect.getargspec(self.run).args
1076 """
1076 """
1077
1077
1078 Input:
1078 Input:
1079 dataOut :
1079 dataOut :
1080 id :
1080 id :
1081 wintitle :
1081 wintitle :
1082 channelList :
1082 channelList :
1083 showProfile :
1083 showProfile :
1084 xmin : None,
1084 xmin : None,
1085 xmax : None,
1085 xmax : None,
1086 ymin : None,
1086 ymin : None,
1087 ymax : None,
1087 ymax : None,
1088 zmin : None,
1088 zmin : None,
1089 zmax : None
1089 zmax : None
1090 """
1090 """
1091
1091
1092 data_param = getattr(dataOut, parameterObject)
1092 data_param = getattr(dataOut, parameterObject)
1093
1093
1094 if channelList == None:
1094 if channelList == None:
1095 channelIndexList = numpy.arange(data_param.shape[0])
1095 channelIndexList = numpy.arange(data_param.shape[0])
1096 else:
1096 else:
1097 channelIndexList = numpy.array(channelList)
1097 channelIndexList = numpy.array(channelList)
1098
1098
1099 nchan = len(channelIndexList) #Number of channels being plotted
1099 nchan = len(channelIndexList) #Number of channels being plotted
1100
1100
1101 if nchan < 1:
1101 if nchan < 1:
1102 return
1102 return
1103
1103
1104 nGraphsByChannel = 0
1104 nGraphsByChannel = 0
1105
1105
1106 if SNR:
1106 if SNR:
1107 nGraphsByChannel += 1
1107 nGraphsByChannel += 1
1108 if DOP:
1108 if DOP:
1109 nGraphsByChannel += 1
1109 nGraphsByChannel += 1
1110
1110
1111 if nGraphsByChannel < 1:
1111 if nGraphsByChannel < 1:
1112 return
1112 return
1113
1113
1114 nplots = nGraphsByChannel*nchan
1114 nplots = nGraphsByChannel*nchan
1115
1115
1116 if timerange is not None:
1116 if timerange is not None:
1117 self.timerange = timerange
1117 self.timerange = timerange
1118
1118
1119 #tmin = None
1119 #tmin = None
1120 #tmax = None
1120 #tmax = None
1121 if parameterIndex == None:
1121 if parameterIndex == None:
1122 parameterIndex = 1
1122 parameterIndex = 1
1123
1123
1124 x = dataOut.getTimeRange1(dataOut.paramInterval)
1124 x = dataOut.getTimeRange1(dataOut.paramInterval)
1125 y = dataOut.heightList
1125 y = dataOut.heightList
1126 z = data_param[channelIndexList,parameterIndex,:].copy()
1126 z = data_param[channelIndexList,parameterIndex,:].copy()
1127
1127
1128 zRange = dataOut.abscissaList
1128 zRange = dataOut.abscissaList
1129 # nChannels = z.shape[0] #Number of wind dimensions estimated
1129 # nChannels = z.shape[0] #Number of wind dimensions estimated
1130 # thisDatetime = dataOut.datatime
1130 # thisDatetime = dataOut.datatime
1131
1131
1132 if dataOut.data_SNR is not None:
1132 if dataOut.data_SNR is not None:
1133 SNRarray = dataOut.data_SNR[channelIndexList,:]
1133 SNRarray = dataOut.data_SNR[channelIndexList,:]
1134 SNRdB = 10*numpy.log10(SNRarray)
1134 SNRdB = 10*numpy.log10(SNRarray)
1135 # SNRavgdB = 10*numpy.log10(SNRavg)
1135 # SNRavgdB = 10*numpy.log10(SNRavg)
1136 ind = numpy.where(SNRdB < 10**(SNRthresh/10))
1136 ind = numpy.where(SNRdB < 10**(SNRthresh/10))
1137 z[ind] = numpy.nan
1137 z[ind] = numpy.nan
1138
1138
1139 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0])
1139 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0])
1140 title = wintitle + " Parameters Plot" #: %s" %(thisDatetime.strftime("%d-%b-%Y"))
1140 title = wintitle + " Parameters Plot" #: %s" %(thisDatetime.strftime("%d-%b-%Y"))
1141 xlabel = ""
1141 xlabel = ""
1142 ylabel = "Range (Km)"
1142 ylabel = "Range (Km)"
1143
1143
1144 if (SNR and not onlySNR): nplots = 2*nplots
1144 if (SNR and not onlySNR): nplots = 2*nplots
1145
1145
1146 if onlyPositive:
1146 if onlyPositive:
1147 colormap = "jet"
1147 colormap = "jet"
1148 zmin = 0
1148 zmin = 0
1149 else: colormap = "RdBu_r"
1149 else: colormap = "RdBu_r"
1150
1150
1151 if not self.isConfig:
1151 if not self.isConfig:
1152
1152
1153 self.setup(id=id,
1153 self.setup(id=id,
1154 nplots=nplots,
1154 nplots=nplots,
1155 wintitle=wintitle,
1155 wintitle=wintitle,
1156 showprofile=showprofile,
1156 showprofile=showprofile,
1157 show=show)
1157 show=show)
1158
1158
1159 self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange)
1159 self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange)
1160
1160
1161 if ymin == None: ymin = numpy.nanmin(y)
1161 if ymin == None: ymin = numpy.nanmin(y)
1162 if ymax == None: ymax = numpy.nanmax(y)
1162 if ymax == None: ymax = numpy.nanmax(y)
1163 if zmin == None: zmin = numpy.nanmin(zRange)
1163 if zmin == None: zmin = numpy.nanmin(zRange)
1164 if zmax == None: zmax = numpy.nanmax(zRange)
1164 if zmax == None: zmax = numpy.nanmax(zRange)
1165
1165
1166 if SNR:
1166 if SNR:
1167 if SNRmin == None: SNRmin = numpy.nanmin(SNRdB)
1167 if SNRmin == None: SNRmin = numpy.nanmin(SNRdB)
1168 if SNRmax == None: SNRmax = numpy.nanmax(SNRdB)
1168 if SNRmax == None: SNRmax = numpy.nanmax(SNRdB)
1169
1169
1170 self.FTP_WEI = ftp_wei
1170 self.FTP_WEI = ftp_wei
1171 self.EXP_CODE = exp_code
1171 self.EXP_CODE = exp_code
1172 self.SUB_EXP_CODE = sub_exp_code
1172 self.SUB_EXP_CODE = sub_exp_code
1173 self.PLOT_POS = plot_pos
1173 self.PLOT_POS = plot_pos
1174
1174
1175 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
1175 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
1176 self.isConfig = True
1176 self.isConfig = True
1177 self.figfile = figfile
1177 self.figfile = figfile
1178
1178
1179 self.setWinTitle(title)
1179 self.setWinTitle(title)
1180
1180
1181 if ((self.xmax - x[1]) < (x[1]-x[0])):
1181 if ((self.xmax - x[1]) < (x[1]-x[0])):
1182 x[1] = self.xmax
1182 x[1] = self.xmax
1183
1183
1184 for i in range(nchan):
1184 for i in range(nchan):
1185
1185
1186 if (SNR and not onlySNR): j = 2*i
1186 if (SNR and not onlySNR): j = 2*i
1187 else: j = i
1187 else: j = i
1188
1188
1189 j = nGraphsByChannel*i
1189 j = nGraphsByChannel*i
1190
1190
1191 if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)):
1191 if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)):
1192 title = title + '_' + 'azimuth,zenith=%2.2f,%2.2f'%(dataOut.azimuth, dataOut.zenith)
1192 title = title + '_' + 'azimuth,zenith=%2.2f,%2.2f'%(dataOut.azimuth, dataOut.zenith)
1193
1193
1194 if not onlySNR:
1194 if not onlySNR:
1195 axes = self.axesList[j*self.__nsubplots]
1195 axes = self.axesList[j*self.__nsubplots]
1196 z1 = z[i,:].reshape((1,-1))
1196 z1 = z[i,:].reshape((1,-1))
1197 axes.pcolorbuffer(x, y, z1,
1197 axes.pcolorbuffer(x, y, z1,
1198 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
1198 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
1199 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,colormap=colormap,
1199 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,colormap=colormap,
1200 ticksize=9, cblabel=zlabel, cbsize="1%")
1200 ticksize=9, cblabel=zlabel, cbsize="1%")
1201
1201
1202 if DOP:
1202 if DOP:
1203 title = "%s Channel %d: %s" %(parameterName, channelIndexList[i], thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
1203 title = "%s Channel %d: %s" %(parameterName, channelIndexList[i], thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
1204
1204
1205 if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)):
1205 if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)):
1206 title = title + '_' + 'azimuth,zenith=%2.2f,%2.2f'%(dataOut.azimuth, dataOut.zenith)
1206 title = title + '_' + 'azimuth,zenith=%2.2f,%2.2f'%(dataOut.azimuth, dataOut.zenith)
1207 axes = self.axesList[j]
1207 axes = self.axesList[j]
1208 z1 = z[i,:].reshape((1,-1))
1208 z1 = z[i,:].reshape((1,-1))
1209 axes.pcolorbuffer(x, y, z1,
1209 axes.pcolorbuffer(x, y, z1,
1210 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
1210 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
1211 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,colormap=colormap,
1211 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,colormap=colormap,
1212 ticksize=9, cblabel=zlabel, cbsize="1%")
1212 ticksize=9, cblabel=zlabel, cbsize="1%")
1213
1213
1214 if SNR:
1214 if SNR:
1215 title = "Channel %d Signal Noise Ratio (SNR): %s" %(channelIndexList[i], thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
1215 title = "Channel %d Signal Noise Ratio (SNR): %s" %(channelIndexList[i], thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
1216 axes = self.axesList[(j)*self.__nsubplots]
1216 axes = self.axesList[(j)*self.__nsubplots]
1217 if not onlySNR:
1217 if not onlySNR:
1218 axes = self.axesList[(j + 1)*self.__nsubplots]
1218 axes = self.axesList[(j + 1)*self.__nsubplots]
1219
1219
1220 axes = self.axesList[(j + nGraphsByChannel-1)]
1220 axes = self.axesList[(j + nGraphsByChannel-1)]
1221
1221
1222 z1 = SNRdB[i,:].reshape((1,-1))
1222 z1 = SNRdB[i,:].reshape((1,-1))
1223 axes.pcolorbuffer(x, y, z1,
1223 axes.pcolorbuffer(x, y, z1,
1224 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=SNRmin, zmax=SNRmax,
1224 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=SNRmin, zmax=SNRmax,
1225 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,colormap="jet",
1225 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,colormap="jet",
1226 ticksize=9, cblabel=zlabel, cbsize="1%")
1226 ticksize=9, cblabel=zlabel, cbsize="1%")
1227
1227
1228
1228
1229
1229
1230 self.draw()
1230 self.draw()
1231
1231
1232 if x[1] >= self.axesList[0].xmax:
1232 if x[1] >= self.axesList[0].xmax:
1233 self.counter_imagwr = wr_period
1233 self.counter_imagwr = wr_period
1234 self.isConfig = False
1234 self.isConfig = False
1235 self.figfile = None
1235 self.figfile = None
1236
1236
1237 self.save(figpath=figpath,
1237 self.save(figpath=figpath,
1238 figfile=figfile,
1238 figfile=figfile,
1239 save=save,
1239 save=save,
1240 ftp=ftp,
1240 ftp=ftp,
1241 wr_period=wr_period,
1241 wr_period=wr_period,
1242 thisDatetime=thisDatetime,
1242 thisDatetime=thisDatetime,
1243 update_figfile=False)
1243 update_figfile=False)
1244
1244
1245 class SpectralFittingPlot(Figure):
1245 class SpectralFittingPlot(Figure):
1246
1246
1247 __isConfig = None
1247 __isConfig = None
1248 __nsubplots = None
1248 __nsubplots = None
1249
1249
1250 WIDTHPROF = None
1250 WIDTHPROF = None
1251 HEIGHTPROF = None
1251 HEIGHTPROF = None
1252 PREFIX = 'prm'
1252 PREFIX = 'prm'
1253
1253
1254
1254
1255 N = None
1255 N = None
1256 ippSeconds = None
1256 ippSeconds = None
1257
1257
1258 def __init__(self, **kwargs):
1258 def __init__(self, **kwargs):
1259 Figure.__init__(self, **kwargs)
1259 Figure.__init__(self, **kwargs)
1260 self.isConfig = False
1260 self.isConfig = False
1261 self.__nsubplots = 1
1261 self.__nsubplots = 1
1262
1262
1263 self.PLOT_CODE = SPECFIT_CODE
1263 self.PLOT_CODE = SPECFIT_CODE
1264
1264
1265 self.WIDTH = 450
1265 self.WIDTH = 450
1266 self.HEIGHT = 250
1266 self.HEIGHT = 250
1267 self.WIDTHPROF = 0
1267 self.WIDTHPROF = 0
1268 self.HEIGHTPROF = 0
1268 self.HEIGHTPROF = 0
1269
1269
1270 def getSubplots(self):
1270 def getSubplots(self):
1271
1271
1272 ncol = int(numpy.sqrt(self.nplots)+0.9)
1272 ncol = int(numpy.sqrt(self.nplots)+0.9)
1273 nrow = int(self.nplots*1./ncol + 0.9)
1273 nrow = int(self.nplots*1./ncol + 0.9)
1274
1274
1275 return nrow, ncol
1275 return nrow, ncol
1276
1276
1277 def setup(self, id, nplots, wintitle, showprofile=False, show=True):
1277 def setup(self, id, nplots, wintitle, showprofile=False, show=True):
1278
1278
1279 showprofile = False
1279 showprofile = False
1280 self.__showprofile = showprofile
1280 self.__showprofile = showprofile
1281 self.nplots = nplots
1281 self.nplots = nplots
1282
1282
1283 ncolspan = 5
1283 ncolspan = 5
1284 colspan = 4
1284 colspan = 4
1285 if showprofile:
1285 if showprofile:
1286 ncolspan = 5
1286 ncolspan = 5
1287 colspan = 4
1287 colspan = 4
1288 self.__nsubplots = 2
1288 self.__nsubplots = 2
1289
1289
1290 self.createFigure(id = id,
1290 self.createFigure(id = id,
1291 wintitle = wintitle,
1291 wintitle = wintitle,
1292 widthplot = self.WIDTH + self.WIDTHPROF,
1292 widthplot = self.WIDTH + self.WIDTHPROF,
1293 heightplot = self.HEIGHT + self.HEIGHTPROF,
1293 heightplot = self.HEIGHT + self.HEIGHTPROF,
1294 show=show)
1294 show=show)
1295
1295
1296 nrow, ncol = self.getSubplots()
1296 nrow, ncol = self.getSubplots()
1297
1297
1298 counter = 0
1298 counter = 0
1299 for y in range(nrow):
1299 for y in range(nrow):
1300 for x in range(ncol):
1300 for x in range(ncol):
1301
1301
1302 if counter >= self.nplots:
1302 if counter >= self.nplots:
1303 break
1303 break
1304
1304
1305 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
1305 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
1306
1306
1307 if showprofile:
1307 if showprofile:
1308 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan+colspan, 1, 1)
1308 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan+colspan, 1, 1)
1309
1309
1310 counter += 1
1310 counter += 1
1311
1311
1312 def run(self, dataOut, id, cutHeight=None, fit=False, wintitle="", channelList=None, showprofile=True,
1312 def run(self, dataOut, id, cutHeight=None, fit=False, wintitle="", channelList=None, showprofile=True,
1313 xmin=None, xmax=None, ymin=None, ymax=None,
1313 xmin=None, xmax=None, ymin=None, ymax=None,
1314 save=False, figpath='./', figfile=None, show=True):
1314 save=False, figpath='./', figfile=None, show=True):
1315
1315
1316 """
1316 """
1317
1317
1318 Input:
1318 Input:
1319 dataOut :
1319 dataOut :
1320 id :
1320 id :
1321 wintitle :
1321 wintitle :
1322 channelList :
1322 channelList :
1323 showProfile :
1323 showProfile :
1324 xmin : None,
1324 xmin : None,
1325 xmax : None,
1325 xmax : None,
1326 zmin : None,
1326 zmin : None,
1327 zmax : None
1327 zmax : None
1328 """
1328 """
1329
1329
1330 if cutHeight==None:
1330 if cutHeight==None:
1331 h=270
1331 h=270
1332 heightindex = numpy.abs(cutHeight - dataOut.heightList).argmin()
1332 heightindex = numpy.abs(cutHeight - dataOut.heightList).argmin()
1333 cutHeight = dataOut.heightList[heightindex]
1333 cutHeight = dataOut.heightList[heightindex]
1334
1334
1335 factor = dataOut.normFactor
1335 factor = dataOut.normFactor
1336 x = dataOut.abscissaList[:-1]
1336 x = dataOut.abscissaList[:-1]
1337 #y = dataOut.getHeiRange()
1337 #y = dataOut.getHeiRange()
1338
1338
1339 z = dataOut.data_pre[:,:,heightindex]/factor
1339 z = dataOut.data_pre[:,:,heightindex]/factor
1340 z = numpy.where(numpy.isfinite(z), z, numpy.NAN)
1340 z = numpy.where(numpy.isfinite(z), z, numpy.NAN)
1341 avg = numpy.average(z, axis=1)
1341 avg = numpy.average(z, axis=1)
1342 listChannels = z.shape[0]
1342 listChannels = z.shape[0]
1343
1343
1344 #Reconstruct Function
1344 #Reconstruct Function
1345 if fit==True:
1345 if fit==True:
1346 groupArray = dataOut.groupList
1346 groupArray = dataOut.groupList
1347 listChannels = groupArray.reshape((groupArray.size))
1347 listChannels = groupArray.reshape((groupArray.size))
1348 listChannels.sort()
1348 listChannels.sort()
1349 spcFitLine = numpy.zeros(z.shape)
1349 spcFitLine = numpy.zeros(z.shape)
1350 constants = dataOut.constants
1350 constants = dataOut.constants
1351
1351
1352 nGroups = groupArray.shape[0]
1352 nGroups = groupArray.shape[0]
1353 nChannels = groupArray.shape[1]
1353 nChannels = groupArray.shape[1]
1354 nProfiles = z.shape[1]
1354 nProfiles = z.shape[1]
1355
1355
1356 for f in range(nGroups):
1356 for f in range(nGroups):
1357 groupChann = groupArray[f,:]
1357 groupChann = groupArray[f,:]
1358 p = dataOut.data_param[f,:,heightindex]
1358 p = dataOut.data_param[f,:,heightindex]
1359 # p = numpy.array([ 89.343967,0.14036615,0.17086219,18.89835291,1.58388365,1.55099167])
1359 # p = numpy.array([ 89.343967,0.14036615,0.17086219,18.89835291,1.58388365,1.55099167])
1360 fitLineAux = dataOut.library.modelFunction(p, constants)*nProfiles
1360 fitLineAux = dataOut.library.modelFunction(p, constants)*nProfiles
1361 fitLineAux = fitLineAux.reshape((nChannels,nProfiles))
1361 fitLineAux = fitLineAux.reshape((nChannels,nProfiles))
1362 spcFitLine[groupChann,:] = fitLineAux
1362 spcFitLine[groupChann,:] = fitLineAux
1363 # spcFitLine = spcFitLine/factor
1363 # spcFitLine = spcFitLine/factor
1364
1364
1365 z = z[listChannels,:]
1365 z = z[listChannels,:]
1366 spcFitLine = spcFitLine[listChannels,:]
1366 spcFitLine = spcFitLine[listChannels,:]
1367 spcFitLinedB = 10*numpy.log10(spcFitLine)
1367 spcFitLinedB = 10*numpy.log10(spcFitLine)
1368
1368
1369 zdB = 10*numpy.log10(z)
1369 zdB = 10*numpy.log10(z)
1370 #thisDatetime = dataOut.datatime
1370 #thisDatetime = dataOut.datatime
1371 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0])
1371 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0])
1372 title = wintitle + " Doppler Spectra: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S"))
1372 title = wintitle + " Doppler Spectra: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S"))
1373 xlabel = "Velocity (m/s)"
1373 xlabel = "Velocity (m/s)"
1374 ylabel = "Spectrum"
1374 ylabel = "Spectrum"
1375
1375
1376 if not self.isConfig:
1376 if not self.isConfig:
1377
1377
1378 nplots = listChannels.size
1378 nplots = listChannels.size
1379
1379
1380 self.setup(id=id,
1380 self.setup(id=id,
1381 nplots=nplots,
1381 nplots=nplots,
1382 wintitle=wintitle,
1382 wintitle=wintitle,
1383 showprofile=showprofile,
1383 showprofile=showprofile,
1384 show=show)
1384 show=show)
1385
1385
1386 if xmin == None: xmin = numpy.nanmin(x)
1386 if xmin == None: xmin = numpy.nanmin(x)
1387 if xmax == None: xmax = numpy.nanmax(x)
1387 if xmax == None: xmax = numpy.nanmax(x)
1388 if ymin == None: ymin = numpy.nanmin(zdB)
1388 if ymin == None: ymin = numpy.nanmin(zdB)
1389 if ymax == None: ymax = numpy.nanmax(zdB)+2
1389 if ymax == None: ymax = numpy.nanmax(zdB)+2
1390
1390
1391 self.isConfig = True
1391 self.isConfig = True
1392
1392
1393 self.setWinTitle(title)
1393 self.setWinTitle(title)
1394 for i in range(self.nplots):
1394 for i in range(self.nplots):
1395 # title = "Channel %d: %4.2fdB" %(dataOut.channelList[i]+1, noisedB[i])
1395 # title = "Channel %d: %4.2fdB" %(dataOut.channelList[i]+1, noisedB[i])
1396 title = "Height %4.1f km\nChannel %d:" %(cutHeight, listChannels[i])
1396 title = "Height %4.1f km\nChannel %d:" %(cutHeight, listChannels[i])
1397 axes = self.axesList[i*self.__nsubplots]
1397 axes = self.axesList[i*self.__nsubplots]
1398 if fit == False:
1398 if fit == False:
1399 axes.pline(x, zdB[i,:],
1399 axes.pline(x, zdB[i,:],
1400 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax,
1400 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax,
1401 xlabel=xlabel, ylabel=ylabel, title=title
1401 xlabel=xlabel, ylabel=ylabel, title=title
1402 )
1402 )
1403 if fit == True:
1403 if fit == True:
1404 fitline=spcFitLinedB[i,:]
1404 fitline=spcFitLinedB[i,:]
1405 y=numpy.vstack([zdB[i,:],fitline] )
1405 y=numpy.vstack([zdB[i,:],fitline] )
1406 legendlabels=['Data','Fitting']
1406 legendlabels=['Data','Fitting']
1407 axes.pmultilineyaxis(x, y,
1407 axes.pmultilineyaxis(x, y,
1408 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax,
1408 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax,
1409 xlabel=xlabel, ylabel=ylabel, title=title,
1409 xlabel=xlabel, ylabel=ylabel, title=title,
1410 legendlabels=legendlabels, marker=None,
1410 legendlabels=legendlabels, marker=None,
1411 linestyle='solid', grid='both')
1411 linestyle='solid', grid='both')
1412
1412
1413 self.draw()
1413 self.draw()
1414
1414
1415 self.save(figpath=figpath,
1415 self.save(figpath=figpath,
1416 figfile=figfile,
1416 figfile=figfile,
1417 save=save,
1417 save=save,
1418 ftp=ftp,
1418 ftp=ftp,
1419 wr_period=wr_period,
1419 wr_period=wr_period,
1420 thisDatetime=thisDatetime)
1420 thisDatetime=thisDatetime)
1421
1421
1422
1422
1423 class EWDriftsPlot(Figure):
1423 class EWDriftsPlot(Figure):
1424
1424
1425 __isConfig = None
1425 __isConfig = None
1426 __nsubplots = None
1426 __nsubplots = None
1427
1427
1428 WIDTHPROF = None
1428 WIDTHPROF = None
1429 HEIGHTPROF = None
1429 HEIGHTPROF = None
1430 PREFIX = 'drift'
1430 PREFIX = 'drift'
1431
1431
1432 def __init__(self, **kwargs):
1432 def __init__(self, **kwargs):
1433 Figure.__init__(self, **kwargs)
1433 Figure.__init__(self, **kwargs)
1434 self.timerange = 2*60*60
1434 self.timerange = 2*60*60
1435 self.isConfig = False
1435 self.isConfig = False
1436 self.__nsubplots = 1
1436 self.__nsubplots = 1
1437
1437
1438 self.WIDTH = 800
1438 self.WIDTH = 800
1439 self.HEIGHT = 150
1439 self.HEIGHT = 150
1440 self.WIDTHPROF = 120
1440 self.WIDTHPROF = 120
1441 self.HEIGHTPROF = 0
1441 self.HEIGHTPROF = 0
1442 self.counter_imagwr = 0
1442 self.counter_imagwr = 0
1443
1443
1444 self.PLOT_CODE = EWDRIFT_CODE
1444 self.PLOT_CODE = EWDRIFT_CODE
1445
1445
1446 self.FTP_WEI = None
1446 self.FTP_WEI = None
1447 self.EXP_CODE = None
1447 self.EXP_CODE = None
1448 self.SUB_EXP_CODE = None
1448 self.SUB_EXP_CODE = None
1449 self.PLOT_POS = None
1449 self.PLOT_POS = None
1450 self.tmin = None
1450 self.tmin = None
1451 self.tmax = None
1451 self.tmax = None
1452
1452
1453 self.xmin = None
1453 self.xmin = None
1454 self.xmax = None
1454 self.xmax = None
1455
1455
1456 self.figfile = None
1456 self.figfile = None
1457
1457
1458 def getSubplots(self):
1458 def getSubplots(self):
1459
1459
1460 ncol = 1
1460 ncol = 1
1461 nrow = self.nplots
1461 nrow = self.nplots
1462
1462
1463 return nrow, ncol
1463 return nrow, ncol
1464
1464
1465 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
1465 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
1466
1466
1467 self.__showprofile = showprofile
1467 self.__showprofile = showprofile
1468 self.nplots = nplots
1468 self.nplots = nplots
1469
1469
1470 ncolspan = 1
1470 ncolspan = 1
1471 colspan = 1
1471 colspan = 1
1472
1472
1473 self.createFigure(id = id,
1473 self.createFigure(id = id,
1474 wintitle = wintitle,
1474 wintitle = wintitle,
1475 widthplot = self.WIDTH + self.WIDTHPROF,
1475 widthplot = self.WIDTH + self.WIDTHPROF,
1476 heightplot = self.HEIGHT + self.HEIGHTPROF,
1476 heightplot = self.HEIGHT + self.HEIGHTPROF,
1477 show=show)
1477 show=show)
1478
1478
1479 nrow, ncol = self.getSubplots()
1479 nrow, ncol = self.getSubplots()
1480
1480
1481 counter = 0
1481 counter = 0
1482 for y in range(nrow):
1482 for y in range(nrow):
1483 if counter >= self.nplots:
1483 if counter >= self.nplots:
1484 break
1484 break
1485
1485
1486 self.addAxes(nrow, ncol*ncolspan, y, 0, colspan, 1)
1486 self.addAxes(nrow, ncol*ncolspan, y, 0, colspan, 1)
1487 counter += 1
1487 counter += 1
1488
1488
1489 def run(self, dataOut, id, wintitle="", channelList=None,
1489 def run(self, dataOut, id, wintitle="", channelList=None,
1490 xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None,
1490 xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None,
1491 zmaxVertical = None, zminVertical = None, zmaxZonal = None, zminZonal = None,
1491 zmaxVertical = None, zminVertical = None, zmaxZonal = None, zminZonal = None,
1492 timerange=None, SNRthresh = -numpy.inf, SNRmin = None, SNRmax = None, SNR_1 = False,
1492 timerange=None, SNRthresh = -numpy.inf, SNRmin = None, SNRmax = None, SNR_1 = False,
1493 save=False, figpath='./', lastone=0,figfile=None, ftp=False, wr_period=1, show=True,
1493 save=False, figpath='./', lastone=0,figfile=None, ftp=False, wr_period=1, show=True,
1494 server=None, folder=None, username=None, password=None,
1494 server=None, folder=None, username=None, password=None,
1495 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0):
1495 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0):
1496 """
1496 """
1497
1497
1498 Input:
1498 Input:
1499 dataOut :
1499 dataOut :
1500 id :
1500 id :
1501 wintitle :
1501 wintitle :
1502 channelList :
1502 channelList :
1503 showProfile :
1503 showProfile :
1504 xmin : None,
1504 xmin : None,
1505 xmax : None,
1505 xmax : None,
1506 ymin : None,
1506 ymin : None,
1507 ymax : None,
1507 ymax : None,
1508 zmin : None,
1508 zmin : None,
1509 zmax : None
1509 zmax : None
1510 """
1510 """
1511
1511
1512 if timerange is not None:
1512 if timerange is not None:
1513 self.timerange = timerange
1513 self.timerange = timerange
1514
1514
1515 tmin = None
1515 tmin = None
1516 tmax = None
1516 tmax = None
1517
1517
1518 x = dataOut.getTimeRange1(dataOut.outputInterval)
1518 x = dataOut.getTimeRange1(dataOut.outputInterval)
1519 # y = dataOut.heightList
1519 # y = dataOut.heightList
1520 y = dataOut.heightList
1520 y = dataOut.heightList
1521
1521
1522 z = dataOut.data_output
1522 z = dataOut.data_output
1523 nplots = z.shape[0] #Number of wind dimensions estimated
1523 nplots = z.shape[0] #Number of wind dimensions estimated
1524 nplotsw = nplots
1524 nplotsw = nplots
1525
1525
1526 #If there is a SNR function defined
1526 #If there is a SNR function defined
1527 if dataOut.data_SNR is not None:
1527 if dataOut.data_SNR is not None:
1528 nplots += 1
1528 nplots += 1
1529 SNR = dataOut.data_SNR
1529 SNR = dataOut.data_SNR
1530
1530
1531 if SNR_1:
1531 if SNR_1:
1532 SNR += 1
1532 SNR += 1
1533
1533
1534 SNRavg = numpy.average(SNR, axis=0)
1534 SNRavg = numpy.average(SNR, axis=0)
1535
1535
1536 SNRdB = 10*numpy.log10(SNR)
1536 SNRdB = 10*numpy.log10(SNR)
1537 SNRavgdB = 10*numpy.log10(SNRavg)
1537 SNRavgdB = 10*numpy.log10(SNRavg)
1538
1538
1539 ind = numpy.where(SNRavg < 10**(SNRthresh/10))[0]
1539 ind = numpy.where(SNRavg < 10**(SNRthresh/10))[0]
1540
1540
1541 for i in range(nplotsw):
1541 for i in range(nplotsw):
1542 z[i,ind] = numpy.nan
1542 z[i,ind] = numpy.nan
1543
1543
1544
1544
1545 showprofile = False
1545 showprofile = False
1546 # thisDatetime = dataOut.datatime
1546 # thisDatetime = dataOut.datatime
1547 thisDatetime = datetime.datetime.utcfromtimestamp(x[1])
1547 thisDatetime = datetime.datetime.utcfromtimestamp(x[1])
1548 title = wintitle + " EW Drifts"
1548 title = wintitle + " EW Drifts"
1549 xlabel = ""
1549 xlabel = ""
1550 ylabel = "Height (Km)"
1550 ylabel = "Height (Km)"
1551
1551
1552 if not self.isConfig:
1552 if not self.isConfig:
1553
1553
1554 self.setup(id=id,
1554 self.setup(id=id,
1555 nplots=nplots,
1555 nplots=nplots,
1556 wintitle=wintitle,
1556 wintitle=wintitle,
1557 showprofile=showprofile,
1557 showprofile=showprofile,
1558 show=show)
1558 show=show)
1559
1559
1560 self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange)
1560 self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange)
1561
1561
1562 if ymin == None: ymin = numpy.nanmin(y)
1562 if ymin == None: ymin = numpy.nanmin(y)
1563 if ymax == None: ymax = numpy.nanmax(y)
1563 if ymax == None: ymax = numpy.nanmax(y)
1564
1564
1565 if zmaxZonal == None: zmaxZonal = numpy.nanmax(abs(z[0,:]))
1565 if zmaxZonal == None: zmaxZonal = numpy.nanmax(abs(z[0,:]))
1566 if zminZonal == None: zminZonal = -zmaxZonal
1566 if zminZonal == None: zminZonal = -zmaxZonal
1567 if zmaxVertical == None: zmaxVertical = numpy.nanmax(abs(z[1,:]))
1567 if zmaxVertical == None: zmaxVertical = numpy.nanmax(abs(z[1,:]))
1568 if zminVertical == None: zminVertical = -zmaxVertical
1568 if zminVertical == None: zminVertical = -zmaxVertical
1569
1569
1570 if dataOut.data_SNR is not None:
1570 if dataOut.data_SNR is not None:
1571 if SNRmin == None: SNRmin = numpy.nanmin(SNRavgdB)
1571 if SNRmin == None: SNRmin = numpy.nanmin(SNRavgdB)
1572 if SNRmax == None: SNRmax = numpy.nanmax(SNRavgdB)
1572 if SNRmax == None: SNRmax = numpy.nanmax(SNRavgdB)
1573
1573
1574 self.FTP_WEI = ftp_wei
1574 self.FTP_WEI = ftp_wei
1575 self.EXP_CODE = exp_code
1575 self.EXP_CODE = exp_code
1576 self.SUB_EXP_CODE = sub_exp_code
1576 self.SUB_EXP_CODE = sub_exp_code
1577 self.PLOT_POS = plot_pos
1577 self.PLOT_POS = plot_pos
1578
1578
1579 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
1579 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
1580 self.isConfig = True
1580 self.isConfig = True
1581
1581
1582
1582
1583 self.setWinTitle(title)
1583 self.setWinTitle(title)
1584
1584
1585 if ((self.xmax - x[1]) < (x[1]-x[0])):
1585 if ((self.xmax - x[1]) < (x[1]-x[0])):
1586 x[1] = self.xmax
1586 x[1] = self.xmax
1587
1587
1588 strWind = ['Zonal','Vertical']
1588 strWind = ['Zonal','Vertical']
1589 strCb = 'Velocity (m/s)'
1589 strCb = 'Velocity (m/s)'
1590 zmaxVector = [zmaxZonal, zmaxVertical]
1590 zmaxVector = [zmaxZonal, zmaxVertical]
1591 zminVector = [zminZonal, zminVertical]
1591 zminVector = [zminZonal, zminVertical]
1592
1592
1593 for i in range(nplotsw):
1593 for i in range(nplotsw):
1594
1594
1595 title = "%s Drifts: %s" %(strWind[i], thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
1595 title = "%s Drifts: %s" %(strWind[i], thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
1596 axes = self.axesList[i*self.__nsubplots]
1596 axes = self.axesList[i*self.__nsubplots]
1597
1597
1598 z1 = z[i,:].reshape((1,-1))
1598 z1 = z[i,:].reshape((1,-1))
1599
1599
1600 axes.pcolorbuffer(x, y, z1,
1600 axes.pcolorbuffer(x, y, z1,
1601 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=zminVector[i], zmax=zmaxVector[i],
1601 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=zminVector[i], zmax=zmaxVector[i],
1602 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
1602 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
1603 ticksize=9, cblabel=strCb, cbsize="1%", colormap="RdBu_r")
1603 ticksize=9, cblabel=strCb, cbsize="1%", colormap="RdBu_r")
1604
1604
1605 if dataOut.data_SNR is not None:
1605 if dataOut.data_SNR is not None:
1606 i += 1
1606 i += 1
1607 if SNR_1:
1607 if SNR_1:
1608 title = "Signal Noise Ratio + 1 (SNR+1): %s" %(thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
1608 title = "Signal Noise Ratio + 1 (SNR+1): %s" %(thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
1609 else:
1609 else:
1610 title = "Signal Noise Ratio (SNR): %s" %(thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
1610 title = "Signal Noise Ratio (SNR): %s" %(thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
1611 axes = self.axesList[i*self.__nsubplots]
1611 axes = self.axesList[i*self.__nsubplots]
1612 SNRavgdB = SNRavgdB.reshape((1,-1))
1612 SNRavgdB = SNRavgdB.reshape((1,-1))
1613
1613
1614 axes.pcolorbuffer(x, y, SNRavgdB,
1614 axes.pcolorbuffer(x, y, SNRavgdB,
1615 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=SNRmin, zmax=SNRmax,
1615 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=SNRmin, zmax=SNRmax,
1616 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
1616 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
1617 ticksize=9, cblabel='', cbsize="1%", colormap="jet")
1617 ticksize=9, cblabel='', cbsize="1%", colormap="jet")
1618
1618
1619 self.draw()
1619 self.draw()
1620
1620
1621 if x[1] >= self.axesList[0].xmax:
1621 if x[1] >= self.axesList[0].xmax:
1622 self.counter_imagwr = wr_period
1622 self.counter_imagwr = wr_period
1623 self.isConfig = False
1623 self.isConfig = False
1624 self.figfile = None
1624 self.figfile = None
1625
1625
1626
1626
1627
1627
1628
1628
1629 class PhasePlot(Figure):
1629 class PhasePlot(Figure):
1630
1630
1631 __isConfig = None
1631 __isConfig = None
1632 __nsubplots = None
1632 __nsubplots = None
1633
1633
1634 PREFIX = 'mphase'
1634 PREFIX = 'mphase'
1635
1635
1636 def __init__(self, **kwargs):
1636 def __init__(self, **kwargs):
1637 Figure.__init__(self, **kwargs)
1637 Figure.__init__(self, **kwargs)
1638 self.timerange = 24*60*60
1638 self.timerange = 24*60*60
1639 self.isConfig = False
1639 self.isConfig = False
1640 self.__nsubplots = 1
1640 self.__nsubplots = 1
1641 self.counter_imagwr = 0
1641 self.counter_imagwr = 0
1642 self.WIDTH = 600
1642 self.WIDTH = 600
1643 self.HEIGHT = 300
1643 self.HEIGHT = 300
1644 self.WIDTHPROF = 120
1644 self.WIDTHPROF = 120
1645 self.HEIGHTPROF = 0
1645 self.HEIGHTPROF = 0
1646 self.xdata = None
1646 self.xdata = None
1647 self.ydata = None
1647 self.ydata = None
1648
1648
1649 self.PLOT_CODE = MPHASE_CODE
1649 self.PLOT_CODE = MPHASE_CODE
1650
1650
1651 self.FTP_WEI = None
1651 self.FTP_WEI = None
1652 self.EXP_CODE = None
1652 self.EXP_CODE = None
1653 self.SUB_EXP_CODE = None
1653 self.SUB_EXP_CODE = None
1654 self.PLOT_POS = None
1654 self.PLOT_POS = None
1655
1655
1656
1656
1657 self.filename_phase = None
1657 self.filename_phase = None
1658
1658
1659 self.figfile = None
1659 self.figfile = None
1660
1660
1661 def getSubplots(self):
1661 def getSubplots(self):
1662
1662
1663 ncol = 1
1663 ncol = 1
1664 nrow = 1
1664 nrow = 1
1665
1665
1666 return nrow, ncol
1666 return nrow, ncol
1667
1667
1668 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
1668 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
1669
1669
1670 self.__showprofile = showprofile
1670 self.__showprofile = showprofile
1671 self.nplots = nplots
1671 self.nplots = nplots
1672
1672
1673 ncolspan = 7
1673 ncolspan = 7
1674 colspan = 6
1674 colspan = 6
1675 self.__nsubplots = 2
1675 self.__nsubplots = 2
1676
1676
1677 self.createFigure(id = id,
1677 self.createFigure(id = id,
1678 wintitle = wintitle,
1678 wintitle = wintitle,
1679 widthplot = self.WIDTH+self.WIDTHPROF,
1679 widthplot = self.WIDTH+self.WIDTHPROF,
1680 heightplot = self.HEIGHT+self.HEIGHTPROF,
1680 heightplot = self.HEIGHT+self.HEIGHTPROF,
1681 show=show)
1681 show=show)
1682
1682
1683 nrow, ncol = self.getSubplots()
1683 nrow, ncol = self.getSubplots()
1684
1684
1685 self.addAxes(nrow, ncol*ncolspan, 0, 0, colspan, 1)
1685 self.addAxes(nrow, ncol*ncolspan, 0, 0, colspan, 1)
1686
1686
1687
1687
1688 def run(self, dataOut, id, wintitle="", pairsList=None, showprofile='True',
1688 def run(self, dataOut, id, wintitle="", pairsList=None, showprofile='True',
1689 xmin=None, xmax=None, ymin=None, ymax=None,
1689 xmin=None, xmax=None, ymin=None, ymax=None,
1690 timerange=None,
1690 timerange=None,
1691 save=False, figpath='./', figfile=None, show=True, ftp=False, wr_period=1,
1691 save=False, figpath='./', figfile=None, show=True, ftp=False, wr_period=1,
1692 server=None, folder=None, username=None, password=None,
1692 server=None, folder=None, username=None, password=None,
1693 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0):
1693 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0):
1694
1694
1695
1695
1696 tmin = None
1696 tmin = None
1697 tmax = None
1697 tmax = None
1698 x = dataOut.getTimeRange1(dataOut.outputInterval)
1698 x = dataOut.getTimeRange1(dataOut.outputInterval)
1699 y = dataOut.getHeiRange()
1699 y = dataOut.getHeiRange()
1700
1700
1701
1701
1702 #thisDatetime = dataOut.datatime
1702 #thisDatetime = dataOut.datatime
1703 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.ltctime)
1703 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.ltctime)
1704 title = wintitle + " Phase of Beacon Signal" # : %s" %(thisDatetime.strftime("%d-%b-%Y"))
1704 title = wintitle + " Phase of Beacon Signal" # : %s" %(thisDatetime.strftime("%d-%b-%Y"))
1705 xlabel = "Local Time"
1705 xlabel = "Local Time"
1706 ylabel = "Phase"
1706 ylabel = "Phase"
1707
1707
1708
1708
1709 #phase = numpy.zeros((len(pairsIndexList),len(dataOut.beacon_heiIndexList)))
1709 #phase = numpy.zeros((len(pairsIndexList),len(dataOut.beacon_heiIndexList)))
1710 phase_beacon = dataOut.data_output
1710 phase_beacon = dataOut.data_output
1711 update_figfile = False
1711 update_figfile = False
1712
1712
1713 if not self.isConfig:
1713 if not self.isConfig:
1714
1714
1715 self.nplots = phase_beacon.size
1715 self.nplots = phase_beacon.size
1716
1716
1717 self.setup(id=id,
1717 self.setup(id=id,
1718 nplots=self.nplots,
1718 nplots=self.nplots,
1719 wintitle=wintitle,
1719 wintitle=wintitle,
1720 showprofile=showprofile,
1720 showprofile=showprofile,
1721 show=show)
1721 show=show)
1722
1722
1723 if timerange is not None:
1723 if timerange is not None:
1724 self.timerange = timerange
1724 self.timerange = timerange
1725
1725
1726 self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange)
1726 self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange)
1727
1727
1728 if ymin == None: ymin = numpy.nanmin(phase_beacon) - 10.0
1728 if ymin == None: ymin = numpy.nanmin(phase_beacon) - 10.0
1729 if ymax == None: ymax = numpy.nanmax(phase_beacon) + 10.0
1729 if ymax == None: ymax = numpy.nanmax(phase_beacon) + 10.0
1730
1730
1731 self.FTP_WEI = ftp_wei
1731 self.FTP_WEI = ftp_wei
1732 self.EXP_CODE = exp_code
1732 self.EXP_CODE = exp_code
1733 self.SUB_EXP_CODE = sub_exp_code
1733 self.SUB_EXP_CODE = sub_exp_code
1734 self.PLOT_POS = plot_pos
1734 self.PLOT_POS = plot_pos
1735
1735
1736 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
1736 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
1737 self.isConfig = True
1737 self.isConfig = True
1738 self.figfile = figfile
1738 self.figfile = figfile
1739 self.xdata = numpy.array([])
1739 self.xdata = numpy.array([])
1740 self.ydata = numpy.array([])
1740 self.ydata = numpy.array([])
1741
1741
1742 #open file beacon phase
1742 #open file beacon phase
1743 path = '%s%03d' %(self.PREFIX, self.id)
1743 path = '%s%03d' %(self.PREFIX, self.id)
1744 beacon_file = os.path.join(path,'%s.txt'%self.name)
1744 beacon_file = os.path.join(path,'%s.txt'%self.name)
1745 self.filename_phase = os.path.join(figpath,beacon_file)
1745 self.filename_phase = os.path.join(figpath,beacon_file)
1746 update_figfile = True
1746 update_figfile = True
1747
1747
1748
1748
1749 #store data beacon phase
1749 #store data beacon phase
1750 #self.save_data(self.filename_phase, phase_beacon, thisDatetime)
1750 #self.save_data(self.filename_phase, phase_beacon, thisDatetime)
1751
1751
1752 self.setWinTitle(title)
1752 self.setWinTitle(title)
1753
1753
1754
1754
1755 title = "Phase Offset %s" %(thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
1755 title = "Phase Offset %s" %(thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
1756
1756
1757 legendlabels = ["phase %d"%(chan) for chan in numpy.arange(self.nplots)]
1757 legendlabels = ["phase %d"%(chan) for chan in numpy.arange(self.nplots)]
1758
1758
1759 axes = self.axesList[0]
1759 axes = self.axesList[0]
1760
1760
1761 self.xdata = numpy.hstack((self.xdata, x[0:1]))
1761 self.xdata = numpy.hstack((self.xdata, x[0:1]))
1762
1762
1763 if len(self.ydata)==0:
1763 if len(self.ydata)==0:
1764 self.ydata = phase_beacon.reshape(-1,1)
1764 self.ydata = phase_beacon.reshape(-1,1)
1765 else:
1765 else:
1766 self.ydata = numpy.hstack((self.ydata, phase_beacon.reshape(-1,1)))
1766 self.ydata = numpy.hstack((self.ydata, phase_beacon.reshape(-1,1)))
1767
1767
1768
1768
1769 axes.pmultilineyaxis(x=self.xdata, y=self.ydata,
1769 axes.pmultilineyaxis(x=self.xdata, y=self.ydata,
1770 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax,
1770 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax,
1771 xlabel=xlabel, ylabel=ylabel, title=title, legendlabels=legendlabels, marker='x', markersize=8, linestyle="solid",
1771 xlabel=xlabel, ylabel=ylabel, title=title, legendlabels=legendlabels, marker='x', markersize=8, linestyle="solid",
1772 XAxisAsTime=True, grid='both'
1772 XAxisAsTime=True, grid='both'
1773 )
1773 )
1774
1774
1775 self.draw()
1775 self.draw()
1776
1776
1777 self.save(figpath=figpath,
1777 self.save(figpath=figpath,
1778 figfile=figfile,
1778 figfile=figfile,
1779 save=save,
1779 save=save,
1780 ftp=ftp,
1780 ftp=ftp,
1781 wr_period=wr_period,
1781 wr_period=wr_period,
1782 thisDatetime=thisDatetime,
1782 thisDatetime=thisDatetime,
1783 update_figfile=update_figfile)
1783 update_figfile=update_figfile)
1784
1784
1785 if dataOut.ltctime + dataOut.outputInterval >= self.xmax:
1785 if dataOut.ltctime + dataOut.outputInterval >= self.xmax:
1786 self.counter_imagwr = wr_period
1786 self.counter_imagwr = wr_period
1787 self.isConfig = False
1787 self.isConfig = False
1788 update_figfile = True
1788 update_figfile = True
1789
1789
1790
1790
1791
1791
1792 class NSMeteorDetection1Plot(Figure):
1792 class NSMeteorDetection1Plot(Figure):
1793
1793
1794 isConfig = None
1794 isConfig = None
1795 __nsubplots = None
1795 __nsubplots = None
1796
1796
1797 WIDTHPROF = None
1797 WIDTHPROF = None
1798 HEIGHTPROF = None
1798 HEIGHTPROF = None
1799 PREFIX = 'nsm'
1799 PREFIX = 'nsm'
1800
1800
1801 zminList = None
1801 zminList = None
1802 zmaxList = None
1802 zmaxList = None
1803 cmapList = None
1803 cmapList = None
1804 titleList = None
1804 titleList = None
1805 nPairs = None
1805 nPairs = None
1806 nChannels = None
1806 nChannels = None
1807 nParam = None
1807 nParam = None
1808
1808
1809 def __init__(self, **kwargs):
1809 def __init__(self, **kwargs):
1810 Figure.__init__(self, **kwargs)
1810 Figure.__init__(self, **kwargs)
1811 self.isConfig = False
1811 self.isConfig = False
1812 self.__nsubplots = 1
1812 self.__nsubplots = 1
1813
1813
1814 self.WIDTH = 750
1814 self.WIDTH = 750
1815 self.HEIGHT = 250
1815 self.HEIGHT = 250
1816 self.WIDTHPROF = 120
1816 self.WIDTHPROF = 120
1817 self.HEIGHTPROF = 0
1817 self.HEIGHTPROF = 0
1818 self.counter_imagwr = 0
1818 self.counter_imagwr = 0
1819
1819
1820 self.PLOT_CODE = SPEC_CODE
1820 self.PLOT_CODE = SPEC_CODE
1821
1821
1822 self.FTP_WEI = None
1822 self.FTP_WEI = None
1823 self.EXP_CODE = None
1823 self.EXP_CODE = None
1824 self.SUB_EXP_CODE = None
1824 self.SUB_EXP_CODE = None
1825 self.PLOT_POS = None
1825 self.PLOT_POS = None
1826
1826
1827 self.__xfilter_ena = False
1827 self.__xfilter_ena = False
1828 self.__yfilter_ena = False
1828 self.__yfilter_ena = False
1829
1829
1830 def getSubplots(self):
1830 def getSubplots(self):
1831
1831
1832 ncol = 3
1832 ncol = 3
1833 nrow = int(numpy.ceil(self.nplots/3.0))
1833 nrow = int(numpy.ceil(self.nplots/3.0))
1834
1834
1835 return nrow, ncol
1835 return nrow, ncol
1836
1836
1837 def setup(self, id, nplots, wintitle, show=True):
1837 def setup(self, id, nplots, wintitle, show=True):
1838
1838
1839 self.nplots = nplots
1839 self.nplots = nplots
1840
1840
1841 ncolspan = 1
1841 ncolspan = 1
1842 colspan = 1
1842 colspan = 1
1843
1843
1844 self.createFigure(id = id,
1844 self.createFigure(id = id,
1845 wintitle = wintitle,
1845 wintitle = wintitle,
1846 widthplot = self.WIDTH + self.WIDTHPROF,
1846 widthplot = self.WIDTH + self.WIDTHPROF,
1847 heightplot = self.HEIGHT + self.HEIGHTPROF,
1847 heightplot = self.HEIGHT + self.HEIGHTPROF,
1848 show=show)
1848 show=show)
1849
1849
1850 nrow, ncol = self.getSubplots()
1850 nrow, ncol = self.getSubplots()
1851
1851
1852 counter = 0
1852 counter = 0
1853 for y in range(nrow):
1853 for y in range(nrow):
1854 for x in range(ncol):
1854 for x in range(ncol):
1855
1855
1856 if counter >= self.nplots:
1856 if counter >= self.nplots:
1857 break
1857 break
1858
1858
1859 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
1859 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
1860
1860
1861 counter += 1
1861 counter += 1
1862
1862
1863 def run(self, dataOut, id, wintitle="", channelList=None, showprofile=True,
1863 def run(self, dataOut, id, wintitle="", channelList=None, showprofile=True,
1864 xmin=None, xmax=None, ymin=None, ymax=None, SNRmin=None, SNRmax=None,
1864 xmin=None, xmax=None, ymin=None, ymax=None, SNRmin=None, SNRmax=None,
1865 vmin=None, vmax=None, wmin=None, wmax=None, mode = 'SA',
1865 vmin=None, vmax=None, wmin=None, wmax=None, mode = 'SA',
1866 save=False, figpath='./', figfile=None, show=True, ftp=False, wr_period=1,
1866 save=False, figpath='./', figfile=None, show=True, ftp=False, wr_period=1,
1867 server=None, folder=None, username=None, password=None,
1867 server=None, folder=None, username=None, password=None,
1868 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, realtime=False,
1868 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, realtime=False,
1869 xaxis="frequency"):
1869 xaxis="frequency"):
1870
1870
1871 """
1871 """
1872
1872
1873 Input:
1873 Input:
1874 dataOut :
1874 dataOut :
1875 id :
1875 id :
1876 wintitle :
1876 wintitle :
1877 channelList :
1877 channelList :
1878 showProfile :
1878 showProfile :
1879 xmin : None,
1879 xmin : None,
1880 xmax : None,
1880 xmax : None,
1881 ymin : None,
1881 ymin : None,
1882 ymax : None,
1882 ymax : None,
1883 zmin : None,
1883 zmin : None,
1884 zmax : None
1884 zmax : None
1885 """
1885 """
1886 #SEPARAR EN DOS PLOTS
1886 #SEPARAR EN DOS PLOTS
1887 nParam = dataOut.data_param.shape[1] - 3
1887 nParam = dataOut.data_param.shape[1] - 3
1888
1888
1889 utctime = dataOut.data_param[0,0]
1889 utctime = dataOut.data_param[0,0]
1890 tmet = dataOut.data_param[:,1].astype(int)
1890 tmet = dataOut.data_param[:,1].astype(int)
1891 hmet = dataOut.data_param[:,2].astype(int)
1891 hmet = dataOut.data_param[:,2].astype(int)
1892
1892
1893 x = dataOut.abscissaList
1893 x = dataOut.abscissaList
1894 y = dataOut.heightList
1894 y = dataOut.heightList
1895
1895
1896 z = numpy.zeros((nParam, y.size, x.size - 1))
1896 z = numpy.zeros((nParam, y.size, x.size - 1))
1897 z[:,:] = numpy.nan
1897 z[:,:] = numpy.nan
1898 z[:,hmet,tmet] = dataOut.data_param[:,3:].T
1898 z[:,hmet,tmet] = dataOut.data_param[:,3:].T
1899 z[0,:,:] = 10*numpy.log10(z[0,:,:])
1899 z[0,:,:] = 10*numpy.log10(z[0,:,:])
1900
1900
1901 xlabel = "Time (s)"
1901 xlabel = "Time (s)"
1902 ylabel = "Range (km)"
1902 ylabel = "Range (km)"
1903
1903
1904 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.ltctime)
1904 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.ltctime)
1905
1905
1906 if not self.isConfig:
1906 if not self.isConfig:
1907
1907
1908 nplots = nParam
1908 nplots = nParam
1909
1909
1910 self.setup(id=id,
1910 self.setup(id=id,
1911 nplots=nplots,
1911 nplots=nplots,
1912 wintitle=wintitle,
1912 wintitle=wintitle,
1913 show=show)
1913 show=show)
1914
1914
1915 if xmin is None: xmin = numpy.nanmin(x)
1915 if xmin is None: xmin = numpy.nanmin(x)
1916 if xmax is None: xmax = numpy.nanmax(x)
1916 if xmax is None: xmax = numpy.nanmax(x)
1917 if ymin is None: ymin = numpy.nanmin(y)
1917 if ymin is None: ymin = numpy.nanmin(y)
1918 if ymax is None: ymax = numpy.nanmax(y)
1918 if ymax is None: ymax = numpy.nanmax(y)
1919 if SNRmin is None: SNRmin = numpy.nanmin(z[0,:])
1919 if SNRmin is None: SNRmin = numpy.nanmin(z[0,:])
1920 if SNRmax is None: SNRmax = numpy.nanmax(z[0,:])
1920 if SNRmax is None: SNRmax = numpy.nanmax(z[0,:])
1921 if vmax is None: vmax = numpy.nanmax(numpy.abs(z[1,:]))
1921 if vmax is None: vmax = numpy.nanmax(numpy.abs(z[1,:]))
1922 if vmin is None: vmin = -vmax
1922 if vmin is None: vmin = -vmax
1923 if wmin is None: wmin = 0
1923 if wmin is None: wmin = 0
1924 if wmax is None: wmax = 50
1924 if wmax is None: wmax = 50
1925
1925
1926 pairsList = dataOut.groupList
1926 pairsList = dataOut.groupList
1927 self.nPairs = len(dataOut.groupList)
1927 self.nPairs = len(dataOut.groupList)
1928
1928
1929 zminList = [SNRmin, vmin, cmin] + [pmin]*self.nPairs
1929 zminList = [SNRmin, vmin, cmin] + [pmin]*self.nPairs
1930 zmaxList = [SNRmax, vmax, cmax] + [pmax]*self.nPairs
1930 zmaxList = [SNRmax, vmax, cmax] + [pmax]*self.nPairs
1931 titleList = ["SNR","Radial Velocity","Coherence"]
1931 titleList = ["SNR","Radial Velocity","Coherence"]
1932 cmapList = ["jet","RdBu_r","jet"]
1932 cmapList = ["jet","RdBu_r","jet"]
1933
1933
1934 for i in range(self.nPairs):
1934 for i in range(self.nPairs):
1935 strAux1 = "Phase Difference "+ str(pairsList[i][0]) + str(pairsList[i][1])
1935 strAux1 = "Phase Difference "+ str(pairsList[i][0]) + str(pairsList[i][1])
1936 titleList = titleList + [strAux1]
1936 titleList = titleList + [strAux1]
1937 cmapList = cmapList + ["RdBu_r"]
1937 cmapList = cmapList + ["RdBu_r"]
1938
1938
1939 self.zminList = zminList
1939 self.zminList = zminList
1940 self.zmaxList = zmaxList
1940 self.zmaxList = zmaxList
1941 self.cmapList = cmapList
1941 self.cmapList = cmapList
1942 self.titleList = titleList
1942 self.titleList = titleList
1943
1943
1944 self.FTP_WEI = ftp_wei
1944 self.FTP_WEI = ftp_wei
1945 self.EXP_CODE = exp_code
1945 self.EXP_CODE = exp_code
1946 self.SUB_EXP_CODE = sub_exp_code
1946 self.SUB_EXP_CODE = sub_exp_code
1947 self.PLOT_POS = plot_pos
1947 self.PLOT_POS = plot_pos
1948
1948
1949 self.isConfig = True
1949 self.isConfig = True
1950
1950
1951 str_datetime = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S"))
1951 str_datetime = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S"))
1952
1952
1953 for i in range(nParam):
1953 for i in range(nParam):
1954 title = self.titleList[i] + ": " +str_datetime
1954 title = self.titleList[i] + ": " +str_datetime
1955 axes = self.axesList[i]
1955 axes = self.axesList[i]
1956 axes.pcolor(x, y, z[i,:].T,
1956 axes.pcolor(x, y, z[i,:].T,
1957 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=self.zminList[i], zmax=self.zmaxList[i],
1957 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=self.zminList[i], zmax=self.zmaxList[i],
1958 xlabel=xlabel, ylabel=ylabel, title=title, colormap=self.cmapList[i],ticksize=9, cblabel='')
1958 xlabel=xlabel, ylabel=ylabel, title=title, colormap=self.cmapList[i],ticksize=9, cblabel='')
1959 self.draw()
1959 self.draw()
1960
1960
1961 if figfile == None:
1961 if figfile == None:
1962 str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S")
1962 str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S")
1963 name = str_datetime
1963 name = str_datetime
1964 if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)):
1964 if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)):
1965 name = name + '_az' + '_%2.2f'%(dataOut.azimuth) + '_zn' + '_%2.2f'%(dataOut.zenith)
1965 name = name + '_az' + '_%2.2f'%(dataOut.azimuth) + '_zn' + '_%2.2f'%(dataOut.zenith)
1966 figfile = self.getFilename(name)
1966 figfile = self.getFilename(name)
1967
1967
1968 self.save(figpath=figpath,
1968 self.save(figpath=figpath,
1969 figfile=figfile,
1969 figfile=figfile,
1970 save=save,
1970 save=save,
1971 ftp=ftp,
1971 ftp=ftp,
1972 wr_period=wr_period,
1972 wr_period=wr_period,
1973 thisDatetime=thisDatetime)
1973 thisDatetime=thisDatetime)
1974
1974
1975
1975
1976 class NSMeteorDetection2Plot(Figure):
1976 class NSMeteorDetection2Plot(Figure):
1977
1977
1978 isConfig = None
1978 isConfig = None
1979 __nsubplots = None
1979 __nsubplots = None
1980
1980
1981 WIDTHPROF = None
1981 WIDTHPROF = None
1982 HEIGHTPROF = None
1982 HEIGHTPROF = None
1983 PREFIX = 'nsm'
1983 PREFIX = 'nsm'
1984
1984
1985 zminList = None
1985 zminList = None
1986 zmaxList = None
1986 zmaxList = None
1987 cmapList = None
1987 cmapList = None
1988 titleList = None
1988 titleList = None
1989 nPairs = None
1989 nPairs = None
1990 nChannels = None
1990 nChannels = None
1991 nParam = None
1991 nParam = None
1992
1992
1993 def __init__(self, **kwargs):
1993 def __init__(self, **kwargs):
1994 Figure.__init__(self, **kwargs)
1994 Figure.__init__(self, **kwargs)
1995 self.isConfig = False
1995 self.isConfig = False
1996 self.__nsubplots = 1
1996 self.__nsubplots = 1
1997
1997
1998 self.WIDTH = 750
1998 self.WIDTH = 750
1999 self.HEIGHT = 250
1999 self.HEIGHT = 250
2000 self.WIDTHPROF = 120
2000 self.WIDTHPROF = 120
2001 self.HEIGHTPROF = 0
2001 self.HEIGHTPROF = 0
2002 self.counter_imagwr = 0
2002 self.counter_imagwr = 0
2003
2003
2004 self.PLOT_CODE = SPEC_CODE
2004 self.PLOT_CODE = SPEC_CODE
2005
2005
2006 self.FTP_WEI = None
2006 self.FTP_WEI = None
2007 self.EXP_CODE = None
2007 self.EXP_CODE = None
2008 self.SUB_EXP_CODE = None
2008 self.SUB_EXP_CODE = None
2009 self.PLOT_POS = None
2009 self.PLOT_POS = None
2010
2010
2011 self.__xfilter_ena = False
2011 self.__xfilter_ena = False
2012 self.__yfilter_ena = False
2012 self.__yfilter_ena = False
2013
2013
2014 def getSubplots(self):
2014 def getSubplots(self):
2015
2015
2016 ncol = 3
2016 ncol = 3
2017 nrow = int(numpy.ceil(self.nplots/3.0))
2017 nrow = int(numpy.ceil(self.nplots/3.0))
2018
2018
2019 return nrow, ncol
2019 return nrow, ncol
2020
2020
2021 def setup(self, id, nplots, wintitle, show=True):
2021 def setup(self, id, nplots, wintitle, show=True):
2022
2022
2023 self.nplots = nplots
2023 self.nplots = nplots
2024
2024
2025 ncolspan = 1
2025 ncolspan = 1
2026 colspan = 1
2026 colspan = 1
2027
2027
2028 self.createFigure(id = id,
2028 self.createFigure(id = id,
2029 wintitle = wintitle,
2029 wintitle = wintitle,
2030 widthplot = self.WIDTH + self.WIDTHPROF,
2030 widthplot = self.WIDTH + self.WIDTHPROF,
2031 heightplot = self.HEIGHT + self.HEIGHTPROF,
2031 heightplot = self.HEIGHT + self.HEIGHTPROF,
2032 show=show)
2032 show=show)
2033
2033
2034 nrow, ncol = self.getSubplots()
2034 nrow, ncol = self.getSubplots()
2035
2035
2036 counter = 0
2036 counter = 0
2037 for y in range(nrow):
2037 for y in range(nrow):
2038 for x in range(ncol):
2038 for x in range(ncol):
2039
2039
2040 if counter >= self.nplots:
2040 if counter >= self.nplots:
2041 break
2041 break
2042
2042
2043 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
2043 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
2044
2044
2045 counter += 1
2045 counter += 1
2046
2046
2047 def run(self, dataOut, id, wintitle="", channelList=None, showprofile=True,
2047 def run(self, dataOut, id, wintitle="", channelList=None, showprofile=True,
2048 xmin=None, xmax=None, ymin=None, ymax=None, SNRmin=None, SNRmax=None,
2048 xmin=None, xmax=None, ymin=None, ymax=None, SNRmin=None, SNRmax=None,
2049 vmin=None, vmax=None, wmin=None, wmax=None, mode = 'SA',
2049 vmin=None, vmax=None, wmin=None, wmax=None, mode = 'SA',
2050 save=False, figpath='./', figfile=None, show=True, ftp=False, wr_period=1,
2050 save=False, figpath='./', figfile=None, show=True, ftp=False, wr_period=1,
2051 server=None, folder=None, username=None, password=None,
2051 server=None, folder=None, username=None, password=None,
2052 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, realtime=False,
2052 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, realtime=False,
2053 xaxis="frequency"):
2053 xaxis="frequency"):
2054
2054
2055 """
2055 """
2056
2056
2057 Input:
2057 Input:
2058 dataOut :
2058 dataOut :
2059 id :
2059 id :
2060 wintitle :
2060 wintitle :
2061 channelList :
2061 channelList :
2062 showProfile :
2062 showProfile :
2063 xmin : None,
2063 xmin : None,
2064 xmax : None,
2064 xmax : None,
2065 ymin : None,
2065 ymin : None,
2066 ymax : None,
2066 ymax : None,
2067 zmin : None,
2067 zmin : None,
2068 zmax : None
2068 zmax : None
2069 """
2069 """
2070 #Rebuild matrix
2070 #Rebuild matrix
2071 utctime = dataOut.data_param[0,0]
2071 utctime = dataOut.data_param[0,0]
2072 cmet = dataOut.data_param[:,1].astype(int)
2072 cmet = dataOut.data_param[:,1].astype(int)
2073 tmet = dataOut.data_param[:,2].astype(int)
2073 tmet = dataOut.data_param[:,2].astype(int)
2074 hmet = dataOut.data_param[:,3].astype(int)
2074 hmet = dataOut.data_param[:,3].astype(int)
2075
2075
2076 nParam = 3
2076 nParam = 3
2077 nChan = len(dataOut.groupList)
2077 nChan = len(dataOut.groupList)
2078 x = dataOut.abscissaList
2078 x = dataOut.abscissaList
2079 y = dataOut.heightList
2079 y = dataOut.heightList
2080
2080
2081 z = numpy.full((nChan, nParam, y.size, x.size - 1),numpy.nan)
2081 z = numpy.full((nChan, nParam, y.size, x.size - 1),numpy.nan)
2082 z[cmet,:,hmet,tmet] = dataOut.data_param[:,4:]
2082 z[cmet,:,hmet,tmet] = dataOut.data_param[:,4:]
2083 z[:,0,:,:] = 10*numpy.log10(z[:,0,:,:]) #logarithmic scale
2083 z[:,0,:,:] = 10*numpy.log10(z[:,0,:,:]) #logarithmic scale
2084 z = numpy.reshape(z, (nChan*nParam, y.size, x.size-1))
2084 z = numpy.reshape(z, (nChan*nParam, y.size, x.size-1))
2085
2085
2086 xlabel = "Time (s)"
2086 xlabel = "Time (s)"
2087 ylabel = "Range (km)"
2087 ylabel = "Range (km)"
2088
2088
2089 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.ltctime)
2089 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.ltctime)
2090
2090
2091 if not self.isConfig:
2091 if not self.isConfig:
2092
2092
2093 nplots = nParam*nChan
2093 nplots = nParam*nChan
2094
2094
2095 self.setup(id=id,
2095 self.setup(id=id,
2096 nplots=nplots,
2096 nplots=nplots,
2097 wintitle=wintitle,
2097 wintitle=wintitle,
2098 show=show)
2098 show=show)
2099
2099
2100 if xmin is None: xmin = numpy.nanmin(x)
2100 if xmin is None: xmin = numpy.nanmin(x)
2101 if xmax is None: xmax = numpy.nanmax(x)
2101 if xmax is None: xmax = numpy.nanmax(x)
2102 if ymin is None: ymin = numpy.nanmin(y)
2102 if ymin is None: ymin = numpy.nanmin(y)
2103 if ymax is None: ymax = numpy.nanmax(y)
2103 if ymax is None: ymax = numpy.nanmax(y)
2104 if SNRmin is None: SNRmin = numpy.nanmin(z[0,:])
2104 if SNRmin is None: SNRmin = numpy.nanmin(z[0,:])
2105 if SNRmax is None: SNRmax = numpy.nanmax(z[0,:])
2105 if SNRmax is None: SNRmax = numpy.nanmax(z[0,:])
2106 if vmax is None: vmax = numpy.nanmax(numpy.abs(z[1,:]))
2106 if vmax is None: vmax = numpy.nanmax(numpy.abs(z[1,:]))
2107 if vmin is None: vmin = -vmax
2107 if vmin is None: vmin = -vmax
2108 if wmin is None: wmin = 0
2108 if wmin is None: wmin = 0
2109 if wmax is None: wmax = 50
2109 if wmax is None: wmax = 50
2110
2110
2111 self.nChannels = nChan
2111 self.nChannels = nChan
2112
2112
2113 zminList = []
2113 zminList = []
2114 zmaxList = []
2114 zmaxList = []
2115 titleList = []
2115 titleList = []
2116 cmapList = []
2116 cmapList = []
2117 for i in range(self.nChannels):
2117 for i in range(self.nChannels):
2118 strAux1 = "SNR Channel "+ str(i)
2118 strAux1 = "SNR Channel "+ str(i)
2119 strAux2 = "Radial Velocity Channel "+ str(i)
2119 strAux2 = "Radial Velocity Channel "+ str(i)
2120 strAux3 = "Spectral Width Channel "+ str(i)
2120 strAux3 = "Spectral Width Channel "+ str(i)
2121
2121
2122 titleList = titleList + [strAux1,strAux2,strAux3]
2122 titleList = titleList + [strAux1,strAux2,strAux3]
2123 cmapList = cmapList + ["jet","RdBu_r","jet"]
2123 cmapList = cmapList + ["jet","RdBu_r","jet"]
2124 zminList = zminList + [SNRmin,vmin,wmin]
2124 zminList = zminList + [SNRmin,vmin,wmin]
2125 zmaxList = zmaxList + [SNRmax,vmax,wmax]
2125 zmaxList = zmaxList + [SNRmax,vmax,wmax]
2126
2126
2127 self.zminList = zminList
2127 self.zminList = zminList
2128 self.zmaxList = zmaxList
2128 self.zmaxList = zmaxList
2129 self.cmapList = cmapList
2129 self.cmapList = cmapList
2130 self.titleList = titleList
2130 self.titleList = titleList
2131
2131
2132 self.FTP_WEI = ftp_wei
2132 self.FTP_WEI = ftp_wei
2133 self.EXP_CODE = exp_code
2133 self.EXP_CODE = exp_code
2134 self.SUB_EXP_CODE = sub_exp_code
2134 self.SUB_EXP_CODE = sub_exp_code
2135 self.PLOT_POS = plot_pos
2135 self.PLOT_POS = plot_pos
2136
2136
2137 self.isConfig = True
2137 self.isConfig = True
2138
2138
2139 str_datetime = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S"))
2139 str_datetime = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S"))
2140
2140
2141 for i in range(self.nplots):
2141 for i in range(self.nplots):
2142 title = self.titleList[i] + ": " +str_datetime
2142 title = self.titleList[i] + ": " +str_datetime
2143 axes = self.axesList[i]
2143 axes = self.axesList[i]
2144 axes.pcolor(x, y, z[i,:].T,
2144 axes.pcolor(x, y, z[i,:].T,
2145 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=self.zminList[i], zmax=self.zmaxList[i],
2145 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=self.zminList[i], zmax=self.zmaxList[i],
2146 xlabel=xlabel, ylabel=ylabel, title=title, colormap=self.cmapList[i],ticksize=9, cblabel='')
2146 xlabel=xlabel, ylabel=ylabel, title=title, colormap=self.cmapList[i],ticksize=9, cblabel='')
2147 self.draw()
2147 self.draw()
2148
2148
2149 if figfile == None:
2149 if figfile == None:
2150 str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S")
2150 str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S")
2151 name = str_datetime
2151 name = str_datetime
2152 if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)):
2152 if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)):
2153 name = name + '_az' + '_%2.2f'%(dataOut.azimuth) + '_zn' + '_%2.2f'%(dataOut.zenith)
2153 name = name + '_az' + '_%2.2f'%(dataOut.azimuth) + '_zn' + '_%2.2f'%(dataOut.zenith)
2154 figfile = self.getFilename(name)
2154 figfile = self.getFilename(name)
2155
2155
2156 self.save(figpath=figpath,
2156 self.save(figpath=figpath,
2157 figfile=figfile,
2157 figfile=figfile,
2158 save=save,
2158 save=save,
2159 ftp=ftp,
2159 ftp=ftp,
2160 wr_period=wr_period,
2160 wr_period=wr_period,
2161 thisDatetime=thisDatetime)
2161 thisDatetime=thisDatetime)
@@ -1,1605 +1,1605
1 '''
1 '''
2 Created on Jul 9, 2014
2 Created on Jul 9, 2014
3
3
4 @author: roj-idl71
4 @author: roj-idl71
5 '''
5 '''
6 import os
6 import os
7 import datetime
7 import datetime
8 import numpy
8 import numpy
9
9
10 import matplotlib.pyplot as plt
10 import matplotlib.pyplot as plt
11
11
12 from figure import Figure, isRealtime, isTimeInHourRange
12 from figure import Figure, isRealtime, isTimeInHourRange
13 from plotting_codes import *
13 from plotting_codes import *
14 from matplotlib.pyplot import savefig
14 from matplotlib.pyplot import savefig
15
15
16 class SpectraPlot(Figure):
16 class SpectraPlot(Figure):
17
17
18 isConfig = None
18 isConfig = None
19 __nsubplots = None
19 __nsubplots = None
20
20
21 WIDTHPROF = None
21 WIDTHPROF = None
22 HEIGHTPROF = None
22 HEIGHTPROF = None
23 PREFIX = 'spc'
23 PREFIX = 'spc'
24
24
25 def __init__(self, **kwargs):
25 def __init__(self, **kwargs):
26 Figure.__init__(self, **kwargs)
26 Figure.__init__(self, **kwargs)
27 self.isConfig = False
27 self.isConfig = False
28 self.__nsubplots = 1
28 self.__nsubplots = 1
29
29
30 self.WIDTH = 300
30 self.WIDTH = 300
31 self.HEIGHT = 300
31 self.HEIGHT = 300
32 self.WIDTHPROF = 120
32 self.WIDTHPROF = 120
33 self.HEIGHTPROF = 0
33 self.HEIGHTPROF = 0
34 self.counter_imagwr = 0
34 self.counter_imagwr = 0
35
35
36 self.PLOT_CODE = SPEC_CODE
36 self.PLOT_CODE = SPEC_CODE
37
37
38 self.FTP_WEI = None
38 self.FTP_WEI = None
39 self.EXP_CODE = None
39 self.EXP_CODE = None
40 self.SUB_EXP_CODE = None
40 self.SUB_EXP_CODE = None
41 self.PLOT_POS = None
41 self.PLOT_POS = None
42
42
43 self.__xfilter_ena = False
43 self.__xfilter_ena = False
44 self.__yfilter_ena = False
44 self.__yfilter_ena = False
45
45
46 self.indice=1
46 self.indice=1
47
47
48 def getSubplots(self):
48 def getSubplots(self):
49
49
50 ncol = int(numpy.sqrt(self.nplots)+0.9)
50 ncol = int(numpy.sqrt(self.nplots)+0.9)
51 nrow = int(self.nplots*1./ncol + 0.9)
51 nrow = int(self.nplots*1./ncol + 0.9)
52
52
53 return nrow, ncol
53 return nrow, ncol
54
54
55 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
55 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
56
56
57 self.__showprofile = showprofile
57 self.__showprofile = showprofile
58 self.nplots = nplots
58 self.nplots = nplots
59
59
60 ncolspan = 1
60 ncolspan = 1
61 colspan = 1
61 colspan = 1
62 if showprofile:
62 if showprofile:
63 ncolspan = 3
63 ncolspan = 3
64 colspan = 2
64 colspan = 2
65 self.__nsubplots = 2
65 self.__nsubplots = 2
66
66
67 self.createFigure(id = id,
67 self.createFigure(id = id,
68 wintitle = wintitle,
68 wintitle = wintitle,
69 widthplot = self.WIDTH + self.WIDTHPROF,
69 widthplot = self.WIDTH + self.WIDTHPROF,
70 heightplot = self.HEIGHT + self.HEIGHTPROF,
70 heightplot = self.HEIGHT + self.HEIGHTPROF,
71 show=show)
71 show=show)
72
72
73 nrow, ncol = self.getSubplots()
73 nrow, ncol = self.getSubplots()
74
74
75 counter = 0
75 counter = 0
76 for y in range(nrow):
76 for y in range(nrow):
77 for x in range(ncol):
77 for x in range(ncol):
78
78
79 if counter >= self.nplots:
79 if counter >= self.nplots:
80 break
80 break
81
81
82 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
82 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
83
83
84 if showprofile:
84 if showprofile:
85 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan+colspan, 1, 1)
85 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan+colspan, 1, 1)
86
86
87 counter += 1
87 counter += 1
88
88
89 def run(self, dataOut, id, wintitle="", channelList=None, showprofile=True,
89 def run(self, dataOut, id, wintitle="", channelList=None, showprofile=True,
90 xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None,
90 xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None,
91 save=False, figpath='./', figfile=None, show=True, ftp=False, wr_period=1,
91 save=False, figpath='./', figfile=None, show=True, ftp=False, wr_period=1,
92 server=None, folder=None, username=None, password=None,
92 server=None, folder=None, username=None, password=None,
93 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, realtime=False,
93 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, realtime=False,
94 xaxis="frequency", colormap='jet', normFactor=None):
94 xaxis="frequency", colormap='jet', normFactor=None):
95
95
96 """
96 """
97
97
98 Input:
98 Input:
99 dataOut :
99 dataOut :
100 id :
100 id :
101 wintitle :
101 wintitle :
102 channelList :
102 channelList :
103 showProfile :
103 showProfile :
104 xmin : None,
104 xmin : None,
105 xmax : None,
105 xmax : None,
106 ymin : None,
106 ymin : None,
107 ymax : None,
107 ymax : None,
108 zmin : None,
108 zmin : None,
109 zmax : None
109 zmax : None
110 """
110 """
111 if realtime:
111 if realtime:
112 if not(isRealtime(utcdatatime = dataOut.utctime)):
112 if not(isRealtime(utcdatatime = dataOut.utctime)):
113 print 'Skipping this plot function'
113 print 'Skipping this plot function'
114 return
114 return
115
115
116 if channelList == None:
116 if channelList == None:
117 channelIndexList = dataOut.channelIndexList
117 channelIndexList = dataOut.channelIndexList
118 else:
118 else:
119 channelIndexList = []
119 channelIndexList = []
120 for channel in channelList:
120 for channel in channelList:
121 if channel not in dataOut.channelList:
121 if channel not in dataOut.channelList:
122 raise ValueError, "Channel %d is not in dataOut.channelList" %channel
122 raise ValueError, "Channel %d is not in dataOut.channelList" %channel
123 channelIndexList.append(dataOut.channelList.index(channel))
123 channelIndexList.append(dataOut.channelList.index(channel))
124
124
125 if normFactor is None:
125 if normFactor is None:
126 factor = dataOut.normFactor
126 factor = dataOut.normFactor
127 else:
127 else:
128 factor = normFactor
128 factor = normFactor
129 if xaxis == "frequency":
129 if xaxis == "frequency":
130 x = dataOut.getFreqRange(1)/1000.
130 x = dataOut.getFreqRange(1)/1000.
131 xlabel = "Frequency (kHz)"
131 xlabel = "Frequency (kHz)"
132
132
133 elif xaxis == "time":
133 elif xaxis == "time":
134 x = dataOut.getAcfRange(1)
134 x = dataOut.getAcfRange(1)
135 xlabel = "Time (ms)"
135 xlabel = "Time (ms)"
136
136
137 else:
137 else:
138 x = dataOut.getVelRange(1)
138 x = dataOut.getVelRange(1)
139 xlabel = "Velocity (m/s)"
139 xlabel = "Velocity (m/s)"
140
140
141 ylabel = "Range (Km)"
141 ylabel = "Range (km)"
142
142
143 y = dataOut.getHeiRange()
143 y = dataOut.getHeiRange()
144 print 'dataOut.normFactor', dataOut.normFactor
144 print 'dataOut.normFactor', dataOut.normFactor
145 z = dataOut.data_spc/factor
145 z = dataOut.data_spc/factor
146 z = numpy.where(numpy.isfinite(z), z, numpy.NAN)
146 z = numpy.where(numpy.isfinite(z), z, numpy.NAN)
147 zdB = 10*numpy.log10(z)
147 zdB = 10*numpy.log10(z)
148
148
149 avg = numpy.average(z, axis=1)
149 avg = numpy.average(z, axis=1)
150 avgdB = 10*numpy.log10(avg)
150 avgdB = 10*numpy.log10(avg)
151
151
152 noise = dataOut.getNoise()/factor
152 noise = dataOut.getNoise()/factor
153 noisedB = 10*numpy.log10(noise)
153 noisedB = 10*numpy.log10(noise)
154
154
155 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0])
155 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0])
156 title = wintitle + " Spectra"
156 title = wintitle + " Spectra"
157
157
158
158
159
159
160 print 'len de X',len(x), numpy.shape(x), 'len de spc line',len(dataOut.data_spc[1,:,15]), numpy.shape(dataOut.data_spc)
160 print 'len de X',len(x), numpy.shape(x), 'len de spc line',len(dataOut.data_spc[1,:,15]), numpy.shape(dataOut.data_spc)
161 print 'Altura:', y[0], y[1], y[13], y[14], y[10]
161 print 'Altura:', y[0], y[1], y[13], y[14], y[10]
162 #a=z[1,:,15]
162 #a=z[1,:,15]
163
163
164 # fig = plt.figure(10+self.indice)
164 # fig = plt.figure(10+self.indice)
165 # plt.plot( x[0:128], zdB[0,:,10] )
165 # plt.plot( x[0:128], zdB[0,:,10] )
166 # plt.axis([-12, 12, 15, 50])
166 # plt.axis([-12, 12, 15, 50])
167 # plt.title(" %s" %( '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S"))) )
167 # plt.title(" %s" %( '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S"))) )
168 # plt.ylabel('Intensidad [dB]')
168 # plt.ylabel('Intensidad [dB]')
169 # plt.xlabel('Velocidad [m/s]')
169 # plt.xlabel('Velocidad [m/s]')
170 # fig.savefig('/home/erick/Documents/Pics/to{}.png'.format(self.indice))
170 # fig.savefig('/home/erick/Documents/Pics/to{}.png'.format(self.indice))
171 #
171 #
172 # plt.show()
172 # plt.show()
173 #
173 #
174 # self.indice=self.indice+1
174 # self.indice=self.indice+1
175
175
176
176
177
177
178 if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)):
178 if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)):
179 title = title + '_' + 'azimuth,zenith=%2.2f,%2.2f'%(dataOut.azimuth, dataOut.zenith)
179 title = title + '_' + 'azimuth,zenith=%2.2f,%2.2f'%(dataOut.azimuth, dataOut.zenith)
180
180
181 if not self.isConfig:
181 if not self.isConfig:
182
182
183 nplots = len(channelIndexList)
183 nplots = len(channelIndexList)
184
184
185 self.setup(id=id,
185 self.setup(id=id,
186 nplots=nplots,
186 nplots=nplots,
187 wintitle=wintitle,
187 wintitle=wintitle,
188 showprofile=showprofile,
188 showprofile=showprofile,
189 show=show)
189 show=show)
190
190
191 if xmin == None: xmin = numpy.nanmin(x)
191 if xmin == None: xmin = numpy.nanmin(x)
192 if xmax == None: xmax = numpy.nanmax(x)
192 if xmax == None: xmax = numpy.nanmax(x)
193 if ymin == None: ymin = numpy.nanmin(y)
193 if ymin == None: ymin = numpy.nanmin(y)
194 if ymax == None: ymax = numpy.nanmax(y)
194 if ymax == None: ymax = numpy.nanmax(y)
195 if zmin == None: zmin = numpy.floor(numpy.nanmin(noisedB)) - 3
195 if zmin == None: zmin = numpy.floor(numpy.nanmin(noisedB)) - 3
196 if zmax == None: zmax = numpy.ceil(numpy.nanmax(avgdB)) + 3
196 if zmax == None: zmax = numpy.ceil(numpy.nanmax(avgdB)) + 3
197
197
198 self.FTP_WEI = ftp_wei
198 self.FTP_WEI = ftp_wei
199 self.EXP_CODE = exp_code
199 self.EXP_CODE = exp_code
200 self.SUB_EXP_CODE = sub_exp_code
200 self.SUB_EXP_CODE = sub_exp_code
201 self.PLOT_POS = plot_pos
201 self.PLOT_POS = plot_pos
202
202
203 self.isConfig = True
203 self.isConfig = True
204
204
205 self.setWinTitle(title)
205 self.setWinTitle(title)
206
206
207 for i in range(self.nplots):
207 for i in range(self.nplots):
208 index = channelIndexList[i]
208 index = channelIndexList[i]
209 str_datetime = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S"))
209 str_datetime = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S"))
210 title = "Channel %d: %4.2fdB: %s" %(dataOut.channelList[index], noisedB[index], str_datetime)
210 title = "Channel %d: %4.2fdB: %s" %(dataOut.channelList[index], noisedB[index], str_datetime)
211 if len(dataOut.beam.codeList) != 0:
211 if len(dataOut.beam.codeList) != 0:
212 title = "Ch%d:%4.2fdB,%2.2f,%2.2f:%s" %(dataOut.channelList[index], noisedB[index], dataOut.beam.azimuthList[index], dataOut.beam.zenithList[index], str_datetime)
212 title = "Ch%d:%4.2fdB,%2.2f,%2.2f:%s" %(dataOut.channelList[index], noisedB[index], dataOut.beam.azimuthList[index], dataOut.beam.zenithList[index], str_datetime)
213
213
214 axes = self.axesList[i*self.__nsubplots]
214 axes = self.axesList[i*self.__nsubplots]
215 axes.pcolor(x, y, zdB[index,:,:],
215 axes.pcolor(x, y, zdB[index,:,:],
216 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
216 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
217 xlabel=xlabel, ylabel=ylabel, title=title, colormap=colormap,
217 xlabel=xlabel, ylabel=ylabel, title=title, colormap=colormap,
218 ticksize=9, cblabel='')
218 ticksize=9, cblabel='')
219
219
220 if self.__showprofile:
220 if self.__showprofile:
221 axes = self.axesList[i*self.__nsubplots +1]
221 axes = self.axesList[i*self.__nsubplots +1]
222 axes.pline(avgdB[index,:], y,
222 axes.pline(avgdB[index,:], y,
223 xmin=zmin, xmax=zmax, ymin=ymin, ymax=ymax,
223 xmin=zmin, xmax=zmax, ymin=ymin, ymax=ymax,
224 xlabel='dB', ylabel='', title='',
224 xlabel='dB', ylabel='', title='',
225 ytick_visible=False,
225 ytick_visible=False,
226 grid='x')
226 grid='x')
227
227
228 noiseline = numpy.repeat(noisedB[index], len(y))
228 noiseline = numpy.repeat(noisedB[index], len(y))
229 axes.addpline(noiseline, y, idline=1, color="black", linestyle="dashed", lw=2)
229 axes.addpline(noiseline, y, idline=1, color="black", linestyle="dashed", lw=2)
230
230
231 self.draw()
231 self.draw()
232
232
233 if figfile == None:
233 if figfile == None:
234 str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S")
234 str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S")
235 name = str_datetime
235 name = str_datetime
236 if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)):
236 if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)):
237 name = name + '_az' + '_%2.2f'%(dataOut.azimuth) + '_zn' + '_%2.2f'%(dataOut.zenith)
237 name = name + '_az' + '_%2.2f'%(dataOut.azimuth) + '_zn' + '_%2.2f'%(dataOut.zenith)
238 figfile = self.getFilename(name)
238 figfile = self.getFilename(name)
239
239
240 self.save(figpath=figpath,
240 self.save(figpath=figpath,
241 figfile=figfile,
241 figfile=figfile,
242 save=save,
242 save=save,
243 ftp=ftp,
243 ftp=ftp,
244 wr_period=wr_period,
244 wr_period=wr_period,
245 thisDatetime=thisDatetime)
245 thisDatetime=thisDatetime)
246
246
247
247
248 class CrossSpectraPlot(Figure):
248 class CrossSpectraPlot(Figure):
249
249
250 isConfig = None
250 isConfig = None
251 __nsubplots = None
251 __nsubplots = None
252
252
253 WIDTH = None
253 WIDTH = None
254 HEIGHT = None
254 HEIGHT = None
255 WIDTHPROF = None
255 WIDTHPROF = None
256 HEIGHTPROF = None
256 HEIGHTPROF = None
257 PREFIX = 'cspc'
257 PREFIX = 'cspc'
258
258
259 def __init__(self, **kwargs):
259 def __init__(self, **kwargs):
260 Figure.__init__(self, **kwargs)
260 Figure.__init__(self, **kwargs)
261 self.isConfig = False
261 self.isConfig = False
262 self.__nsubplots = 4
262 self.__nsubplots = 4
263 self.counter_imagwr = 0
263 self.counter_imagwr = 0
264 self.WIDTH = 250
264 self.WIDTH = 250
265 self.HEIGHT = 250
265 self.HEIGHT = 250
266 self.WIDTHPROF = 0
266 self.WIDTHPROF = 0
267 self.HEIGHTPROF = 0
267 self.HEIGHTPROF = 0
268
268
269 self.PLOT_CODE = CROSS_CODE
269 self.PLOT_CODE = CROSS_CODE
270 self.FTP_WEI = None
270 self.FTP_WEI = None
271 self.EXP_CODE = None
271 self.EXP_CODE = None
272 self.SUB_EXP_CODE = None
272 self.SUB_EXP_CODE = None
273 self.PLOT_POS = None
273 self.PLOT_POS = None
274
274
275 self.indice=0
275 self.indice=0
276
276
277 def getSubplots(self):
277 def getSubplots(self):
278
278
279 ncol = 4
279 ncol = 4
280 nrow = self.nplots
280 nrow = self.nplots
281
281
282 return nrow, ncol
282 return nrow, ncol
283
283
284 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
284 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
285
285
286 self.__showprofile = showprofile
286 self.__showprofile = showprofile
287 self.nplots = nplots
287 self.nplots = nplots
288
288
289 ncolspan = 1
289 ncolspan = 1
290 colspan = 1
290 colspan = 1
291
291
292 self.createFigure(id = id,
292 self.createFigure(id = id,
293 wintitle = wintitle,
293 wintitle = wintitle,
294 widthplot = self.WIDTH + self.WIDTHPROF,
294 widthplot = self.WIDTH + self.WIDTHPROF,
295 heightplot = self.HEIGHT + self.HEIGHTPROF,
295 heightplot = self.HEIGHT + self.HEIGHTPROF,
296 show=True)
296 show=True)
297
297
298 nrow, ncol = self.getSubplots()
298 nrow, ncol = self.getSubplots()
299
299
300 counter = 0
300 counter = 0
301 for y in range(nrow):
301 for y in range(nrow):
302 for x in range(ncol):
302 for x in range(ncol):
303 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
303 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
304
304
305 counter += 1
305 counter += 1
306
306
307 def run(self, dataOut, id, wintitle="", pairsList=None,
307 def run(self, dataOut, id, wintitle="", pairsList=None,
308 xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None,
308 xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None,
309 coh_min=None, coh_max=None, phase_min=None, phase_max=None,
309 coh_min=None, coh_max=None, phase_min=None, phase_max=None,
310 save=False, figpath='./', figfile=None, ftp=False, wr_period=1,
310 save=False, figpath='./', figfile=None, ftp=False, wr_period=1,
311 power_cmap='jet', coherence_cmap='jet', phase_cmap='RdBu_r', show=True,
311 power_cmap='jet', coherence_cmap='jet', phase_cmap='RdBu_r', show=True,
312 server=None, folder=None, username=None, password=None,
312 server=None, folder=None, username=None, password=None,
313 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, normFactor=None,
313 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, normFactor=None,
314 xaxis='frequency'):
314 xaxis='frequency'):
315
315
316 """
316 """
317
317
318 Input:
318 Input:
319 dataOut :
319 dataOut :
320 id :
320 id :
321 wintitle :
321 wintitle :
322 channelList :
322 channelList :
323 showProfile :
323 showProfile :
324 xmin : None,
324 xmin : None,
325 xmax : None,
325 xmax : None,
326 ymin : None,
326 ymin : None,
327 ymax : None,
327 ymax : None,
328 zmin : None,
328 zmin : None,
329 zmax : None
329 zmax : None
330 """
330 """
331
331
332 if pairsList == None:
332 if pairsList == None:
333 pairsIndexList = dataOut.pairsIndexList
333 pairsIndexList = dataOut.pairsIndexList
334 else:
334 else:
335 pairsIndexList = []
335 pairsIndexList = []
336 for pair in pairsList:
336 for pair in pairsList:
337 if pair not in dataOut.pairsList:
337 if pair not in dataOut.pairsList:
338 raise ValueError, "Pair %s is not in dataOut.pairsList" %str(pair)
338 raise ValueError, "Pair %s is not in dataOut.pairsList" %str(pair)
339 pairsIndexList.append(dataOut.pairsList.index(pair))
339 pairsIndexList.append(dataOut.pairsList.index(pair))
340
340
341 if not pairsIndexList:
341 if not pairsIndexList:
342 return
342 return
343
343
344 if len(pairsIndexList) > 4:
344 if len(pairsIndexList) > 4:
345 pairsIndexList = pairsIndexList[0:4]
345 pairsIndexList = pairsIndexList[0:4]
346
346
347 if normFactor is None:
347 if normFactor is None:
348 factor = dataOut.normFactor
348 factor = dataOut.normFactor
349 else:
349 else:
350 factor = normFactor
350 factor = normFactor
351 x = dataOut.getVelRange(1)
351 x = dataOut.getVelRange(1)
352 y = dataOut.getHeiRange()
352 y = dataOut.getHeiRange()
353 z = dataOut.data_spc[:,:,:]/factor
353 z = dataOut.data_spc[:,:,:]/factor
354 z = numpy.where(numpy.isfinite(z), z, numpy.NAN)
354 z = numpy.where(numpy.isfinite(z), z, numpy.NAN)
355
355
356 noise = dataOut.noise/factor
356 noise = dataOut.noise/factor
357
357
358 zdB = 10*numpy.log10(z)
358 zdB = 10*numpy.log10(z)
359 noisedB = 10*numpy.log10(noise)
359 noisedB = 10*numpy.log10(noise)
360
360
361 if coh_min == None:
361 if coh_min == None:
362 coh_min = 0.0
362 coh_min = 0.0
363 if coh_max == None:
363 if coh_max == None:
364 coh_max = 1.0
364 coh_max = 1.0
365
365
366 if phase_min == None:
366 if phase_min == None:
367 phase_min = -180
367 phase_min = -180
368 if phase_max == None:
368 if phase_max == None:
369 phase_max = 180
369 phase_max = 180
370
370
371 #thisDatetime = dataOut.datatime
371 #thisDatetime = dataOut.datatime
372 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0])
372 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0])
373 title = wintitle + " Cross-Spectra: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S"))
373 title = wintitle + " Cross-Spectra: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S"))
374 # xlabel = "Velocity (m/s)"
374 # xlabel = "Velocity (m/s)"
375 ylabel = "Range (Km)"
375 ylabel = "Range (Km)"
376
376
377 if xaxis == "frequency":
377 if xaxis == "frequency":
378 x = dataOut.getFreqRange(1)/1000.
378 x = dataOut.getFreqRange(1)/1000.
379 xlabel = "Frequency (kHz)"
379 xlabel = "Frequency (kHz)"
380
380
381 elif xaxis == "time":
381 elif xaxis == "time":
382 x = dataOut.getAcfRange(1)
382 x = dataOut.getAcfRange(1)
383 xlabel = "Time (ms)"
383 xlabel = "Time (ms)"
384
384
385 else:
385 else:
386 x = dataOut.getVelRange(1)
386 x = dataOut.getVelRange(1)
387 xlabel = "Velocity (m/s)"
387 xlabel = "Velocity (m/s)"
388
388
389 if not self.isConfig:
389 if not self.isConfig:
390
390
391 nplots = len(pairsIndexList)
391 nplots = len(pairsIndexList)
392
392
393 self.setup(id=id,
393 self.setup(id=id,
394 nplots=nplots,
394 nplots=nplots,
395 wintitle=wintitle,
395 wintitle=wintitle,
396 showprofile=False,
396 showprofile=False,
397 show=show)
397 show=show)
398
398
399 avg = numpy.abs(numpy.average(z, axis=1))
399 avg = numpy.abs(numpy.average(z, axis=1))
400 avgdB = 10*numpy.log10(avg)
400 avgdB = 10*numpy.log10(avg)
401
401
402 if xmin == None: xmin = numpy.nanmin(x)
402 if xmin == None: xmin = numpy.nanmin(x)
403 if xmax == None: xmax = numpy.nanmax(x)
403 if xmax == None: xmax = numpy.nanmax(x)
404 if ymin == None: ymin = numpy.nanmin(y)
404 if ymin == None: ymin = numpy.nanmin(y)
405 if ymax == None: ymax = numpy.nanmax(y)
405 if ymax == None: ymax = numpy.nanmax(y)
406 if zmin == None: zmin = numpy.floor(numpy.nanmin(noisedB)) - 3
406 if zmin == None: zmin = numpy.floor(numpy.nanmin(noisedB)) - 3
407 if zmax == None: zmax = numpy.ceil(numpy.nanmax(avgdB)) + 3
407 if zmax == None: zmax = numpy.ceil(numpy.nanmax(avgdB)) + 3
408
408
409 self.FTP_WEI = ftp_wei
409 self.FTP_WEI = ftp_wei
410 self.EXP_CODE = exp_code
410 self.EXP_CODE = exp_code
411 self.SUB_EXP_CODE = sub_exp_code
411 self.SUB_EXP_CODE = sub_exp_code
412 self.PLOT_POS = plot_pos
412 self.PLOT_POS = plot_pos
413
413
414 self.isConfig = True
414 self.isConfig = True
415
415
416 self.setWinTitle(title)
416 self.setWinTitle(title)
417
417
418
418
419 for i in range(self.nplots):
419 for i in range(self.nplots):
420 pair = dataOut.pairsList[pairsIndexList[i]]
420 pair = dataOut.pairsList[pairsIndexList[i]]
421
421
422 chan_index0 = dataOut.channelList.index(pair[0])
422 chan_index0 = dataOut.channelList.index(pair[0])
423 chan_index1 = dataOut.channelList.index(pair[1])
423 chan_index1 = dataOut.channelList.index(pair[1])
424
424
425 str_datetime = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S"))
425 str_datetime = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S"))
426 title = "Ch%d: %4.2fdB: %s" %(pair[0], noisedB[chan_index0], str_datetime)
426 title = "Ch%d: %4.2fdB: %s" %(pair[0], noisedB[chan_index0], str_datetime)
427 zdB = 10.*numpy.log10(dataOut.data_spc[chan_index0,:,:]/factor)
427 zdB = 10.*numpy.log10(dataOut.data_spc[chan_index0,:,:]/factor)
428 axes0 = self.axesList[i*self.__nsubplots]
428 axes0 = self.axesList[i*self.__nsubplots]
429 axes0.pcolor(x, y, zdB,
429 axes0.pcolor(x, y, zdB,
430 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
430 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
431 xlabel=xlabel, ylabel=ylabel, title=title,
431 xlabel=xlabel, ylabel=ylabel, title=title,
432 ticksize=9, colormap=power_cmap, cblabel='')
432 ticksize=9, colormap=power_cmap, cblabel='')
433
433
434 title = "Ch%d: %4.2fdB: %s" %(pair[1], noisedB[chan_index1], str_datetime)
434 title = "Ch%d: %4.2fdB: %s" %(pair[1], noisedB[chan_index1], str_datetime)
435 zdB = 10.*numpy.log10(dataOut.data_spc[chan_index1,:,:]/factor)
435 zdB = 10.*numpy.log10(dataOut.data_spc[chan_index1,:,:]/factor)
436 axes0 = self.axesList[i*self.__nsubplots+1]
436 axes0 = self.axesList[i*self.__nsubplots+1]
437 axes0.pcolor(x, y, zdB,
437 axes0.pcolor(x, y, zdB,
438 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
438 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
439 xlabel=xlabel, ylabel=ylabel, title=title,
439 xlabel=xlabel, ylabel=ylabel, title=title,
440 ticksize=9, colormap=power_cmap, cblabel='')
440 ticksize=9, colormap=power_cmap, cblabel='')
441
441
442 coherenceComplex = dataOut.data_cspc[pairsIndexList[i],:,:] / numpy.sqrt( dataOut.data_spc[chan_index0,:,:]*dataOut.data_spc[chan_index1,:,:] )
442 coherenceComplex = dataOut.data_cspc[pairsIndexList[i],:,:] / numpy.sqrt( dataOut.data_spc[chan_index0,:,:]*dataOut.data_spc[chan_index1,:,:] )
443 coherence = numpy.abs(coherenceComplex)
443 coherence = numpy.abs(coherenceComplex)
444 # phase = numpy.arctan(-1*coherenceComplex.imag/coherenceComplex.real)*180/numpy.pi
444 # phase = numpy.arctan(-1*coherenceComplex.imag/coherenceComplex.real)*180/numpy.pi
445 phase = numpy.arctan2(coherenceComplex.imag, coherenceComplex.real)*180/numpy.pi
445 phase = numpy.arctan2(coherenceComplex.imag, coherenceComplex.real)*180/numpy.pi
446
446
447
447
448
448
449
449
450 # #print 'FASE', numpy.shape(phase), y[25]
450 # #print 'FASE', numpy.shape(phase), y[25]
451 # fig = plt.figure(10+self.indice)
451 # fig = plt.figure(10+self.indice)
452 # #plt.plot( x[0:256],coherence[:,25] )
452 # #plt.plot( x[0:256],coherence[:,25] )
453 # cohAv = numpy.average(coherence,1)
453 # cohAv = numpy.average(coherence,1)
454 #
454 #
455 # plt.plot( x[0:256],cohAv )
455 # plt.plot( x[0:256],cohAv )
456 # #plt.axis([-12, 12, 15, 50])
456 # #plt.axis([-12, 12, 15, 50])
457 # plt.title("%s" %( '%s %s, Channel %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S") , i)))
457 # plt.title("%s" %( '%s %s, Channel %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S") , i)))
458 # plt.ylabel('Desfase [grados]')
458 # plt.ylabel('Desfase [grados]')
459 # plt.xlabel('Velocidad [m/s]')
459 # plt.xlabel('Velocidad [m/s]')
460 # fig.savefig('/home/erick/Documents/Pics/to{}.png'.format(self.indice))
460 # fig.savefig('/home/erick/Documents/Pics/to{}.png'.format(self.indice))
461 #
461 #
462 # plt.show()
462 # plt.show()
463 # self.indice=self.indice+1
463 # self.indice=self.indice+1
464
464
465
465
466 # print 'FASE', numpy.shape(phase), y[25]
466 # print 'FASE', numpy.shape(phase), y[25]
467 # fig = plt.figure(10+self.indice)
467 # fig = plt.figure(10+self.indice)
468 # plt.plot( x[0:256],phase[:,25] )
468 # plt.plot( x[0:256],phase[:,25] )
469 # #plt.axis([-12, 12, 15, 50])
469 # #plt.axis([-12, 12, 15, 50])
470 # plt.title("%s" %( '%s %s, Channel %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S") , i)))
470 # plt.title("%s" %( '%s %s, Channel %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S") , i)))
471 # plt.ylabel('Desfase [grados]')
471 # plt.ylabel('Desfase [grados]')
472 # plt.xlabel('Velocidad [m/s]')
472 # plt.xlabel('Velocidad [m/s]')
473 # fig.savefig('/home/erick/Documents/Pics/to{}.png'.format(self.indice))
473 # fig.savefig('/home/erick/Documents/Pics/to{}.png'.format(self.indice))
474 #
474 #
475 # plt.show()
475 # plt.show()
476 # self.indice=self.indice+1
476 # self.indice=self.indice+1
477
477
478
478
479
479
480
480
481 title = "Coherence Ch%d * Ch%d" %(pair[0], pair[1])
481 title = "Coherence Ch%d * Ch%d" %(pair[0], pair[1])
482 axes0 = self.axesList[i*self.__nsubplots+2]
482 axes0 = self.axesList[i*self.__nsubplots+2]
483 axes0.pcolor(x, y, coherence,
483 axes0.pcolor(x, y, coherence,
484 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=coh_min, zmax=coh_max,
484 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=coh_min, zmax=coh_max,
485 xlabel=xlabel, ylabel=ylabel, title=title,
485 xlabel=xlabel, ylabel=ylabel, title=title,
486 ticksize=9, colormap=coherence_cmap, cblabel='')
486 ticksize=9, colormap=coherence_cmap, cblabel='')
487
487
488 title = "Phase Ch%d * Ch%d" %(pair[0], pair[1])
488 title = "Phase Ch%d * Ch%d" %(pair[0], pair[1])
489 axes0 = self.axesList[i*self.__nsubplots+3]
489 axes0 = self.axesList[i*self.__nsubplots+3]
490 axes0.pcolor(x, y, phase,
490 axes0.pcolor(x, y, phase,
491 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=phase_min, zmax=phase_max,
491 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=phase_min, zmax=phase_max,
492 xlabel=xlabel, ylabel=ylabel, title=title,
492 xlabel=xlabel, ylabel=ylabel, title=title,
493 ticksize=9, colormap=phase_cmap, cblabel='')
493 ticksize=9, colormap=phase_cmap, cblabel='')
494
494
495
495
496
496
497 self.draw()
497 self.draw()
498
498
499 self.save(figpath=figpath,
499 self.save(figpath=figpath,
500 figfile=figfile,
500 figfile=figfile,
501 save=save,
501 save=save,
502 ftp=ftp,
502 ftp=ftp,
503 wr_period=wr_period,
503 wr_period=wr_period,
504 thisDatetime=thisDatetime)
504 thisDatetime=thisDatetime)
505
505
506
506
507 class RTIPlot(Figure):
507 class RTIPlot(Figure):
508
508
509 __isConfig = None
509 __isConfig = None
510 __nsubplots = None
510 __nsubplots = None
511
511
512 WIDTHPROF = None
512 WIDTHPROF = None
513 HEIGHTPROF = None
513 HEIGHTPROF = None
514 PREFIX = 'rti'
514 PREFIX = 'rti'
515
515
516 def __init__(self, **kwargs):
516 def __init__(self, **kwargs):
517
517
518 Figure.__init__(self, **kwargs)
518 Figure.__init__(self, **kwargs)
519 self.timerange = None
519 self.timerange = None
520 self.isConfig = False
520 self.isConfig = False
521 self.__nsubplots = 1
521 self.__nsubplots = 1
522
522
523 self.WIDTH = 800
523 self.WIDTH = 800
524 self.HEIGHT = 250
524 self.HEIGHT = 250
525 self.WIDTHPROF = 120
525 self.WIDTHPROF = 120
526 self.HEIGHTPROF = 0
526 self.HEIGHTPROF = 0
527 self.counter_imagwr = 0
527 self.counter_imagwr = 0
528
528
529 self.PLOT_CODE = RTI_CODE
529 self.PLOT_CODE = RTI_CODE
530
530
531 self.FTP_WEI = None
531 self.FTP_WEI = None
532 self.EXP_CODE = None
532 self.EXP_CODE = None
533 self.SUB_EXP_CODE = None
533 self.SUB_EXP_CODE = None
534 self.PLOT_POS = None
534 self.PLOT_POS = None
535 self.tmin = None
535 self.tmin = None
536 self.tmax = None
536 self.tmax = None
537
537
538 self.xmin = None
538 self.xmin = None
539 self.xmax = None
539 self.xmax = None
540
540
541 self.figfile = None
541 self.figfile = None
542
542
543 def getSubplots(self):
543 def getSubplots(self):
544
544
545 ncol = 1
545 ncol = 1
546 nrow = self.nplots
546 nrow = self.nplots
547
547
548 return nrow, ncol
548 return nrow, ncol
549
549
550 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
550 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
551
551
552 self.__showprofile = showprofile
552 self.__showprofile = showprofile
553 self.nplots = nplots
553 self.nplots = nplots
554
554
555 ncolspan = 1
555 ncolspan = 1
556 colspan = 1
556 colspan = 1
557 if showprofile:
557 if showprofile:
558 ncolspan = 7
558 ncolspan = 7
559 colspan = 6
559 colspan = 6
560 self.__nsubplots = 2
560 self.__nsubplots = 2
561
561
562 self.createFigure(id = id,
562 self.createFigure(id = id,
563 wintitle = wintitle,
563 wintitle = wintitle,
564 widthplot = self.WIDTH + self.WIDTHPROF,
564 widthplot = self.WIDTH + self.WIDTHPROF,
565 heightplot = self.HEIGHT + self.HEIGHTPROF,
565 heightplot = self.HEIGHT + self.HEIGHTPROF,
566 show=show)
566 show=show)
567
567
568 nrow, ncol = self.getSubplots()
568 nrow, ncol = self.getSubplots()
569
569
570 counter = 0
570 counter = 0
571 for y in range(nrow):
571 for y in range(nrow):
572 for x in range(ncol):
572 for x in range(ncol):
573
573
574 if counter >= self.nplots:
574 if counter >= self.nplots:
575 break
575 break
576
576
577 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
577 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
578
578
579 if showprofile:
579 if showprofile:
580 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan+colspan, 1, 1)
580 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan+colspan, 1, 1)
581
581
582 counter += 1
582 counter += 1
583
583
584 def run(self, dataOut, id, wintitle="", channelList=None, showprofile='True',
584 def run(self, dataOut, id, wintitle="", channelList=None, showprofile='True',
585 xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None,
585 xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None,
586 timerange=None, colormap='jet',
586 timerange=None, colormap='jet',
587 save=False, figpath='./', lastone=0,figfile=None, ftp=False, wr_period=1, show=True,
587 save=False, figpath='./', lastone=0,figfile=None, ftp=False, wr_period=1, show=True,
588 server=None, folder=None, username=None, password=None,
588 server=None, folder=None, username=None, password=None,
589 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, normFactor=None, HEIGHT=None):
589 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, normFactor=None, HEIGHT=None):
590
590
591 """
591 """
592
592
593 Input:
593 Input:
594 dataOut :
594 dataOut :
595 id :
595 id :
596 wintitle :
596 wintitle :
597 channelList :
597 channelList :
598 showProfile :
598 showProfile :
599 xmin : None,
599 xmin : None,
600 xmax : None,
600 xmax : None,
601 ymin : None,
601 ymin : None,
602 ymax : None,
602 ymax : None,
603 zmin : None,
603 zmin : None,
604 zmax : None
604 zmax : None
605 """
605 """
606
606
607 #colormap = kwargs.get('colormap', 'jet')
607 #colormap = kwargs.get('colormap', 'jet')
608 if HEIGHT is not None:
608 if HEIGHT is not None:
609 self.HEIGHT = HEIGHT
609 self.HEIGHT = HEIGHT
610
610
611 if not isTimeInHourRange(dataOut.datatime, xmin, xmax):
611 if not isTimeInHourRange(dataOut.datatime, xmin, xmax):
612 return
612 return
613
613
614 if channelList == None:
614 if channelList == None:
615 channelIndexList = dataOut.channelIndexList
615 channelIndexList = dataOut.channelIndexList
616 else:
616 else:
617 channelIndexList = []
617 channelIndexList = []
618 for channel in channelList:
618 for channel in channelList:
619 if channel not in dataOut.channelList:
619 if channel not in dataOut.channelList:
620 raise ValueError, "Channel %d is not in dataOut.channelList"
620 raise ValueError, "Channel %d is not in dataOut.channelList"
621 channelIndexList.append(dataOut.channelList.index(channel))
621 channelIndexList.append(dataOut.channelList.index(channel))
622
622
623 if normFactor is None:
623 if normFactor is None:
624 factor = dataOut.normFactor
624 factor = dataOut.normFactor
625 else:
625 else:
626 factor = normFactor
626 factor = normFactor
627
627
628 # factor = dataOut.normFactor
628 # factor = dataOut.normFactor
629 x = dataOut.getTimeRange()
629 x = dataOut.getTimeRange()
630 y = dataOut.getHeiRange()
630 y = dataOut.getHeiRange()
631
631
632 z = dataOut.data_spc/factor
632 z = dataOut.data_spc/factor
633 z = numpy.where(numpy.isfinite(z), z, numpy.NAN)
633 z = numpy.where(numpy.isfinite(z), z, numpy.NAN)
634 avg = numpy.average(z, axis=1)
634 avg = numpy.average(z, axis=1)
635 avgdB = 10.*numpy.log10(avg)
635 avgdB = 10.*numpy.log10(avg)
636 # avgdB = dataOut.getPower()
636 # avgdB = dataOut.getPower()
637
637
638
638
639 thisDatetime = dataOut.datatime
639 thisDatetime = dataOut.datatime
640 # thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0])
640 # thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0])
641 title = wintitle + " RTI" #: %s" %(thisDatetime.strftime("%d-%b-%Y"))
641 title = wintitle + " RTI" #: %s" %(thisDatetime.strftime("%d-%b-%Y"))
642 xlabel = ""
642 xlabel = ""
643 ylabel = "Range (Km)"
643 ylabel = "Range (Km)"
644
644
645 update_figfile = False
645 update_figfile = False
646
646
647 if dataOut.ltctime >= self.xmax:
647 if dataOut.ltctime >= self.xmax:
648 self.counter_imagwr = wr_period
648 self.counter_imagwr = wr_period
649 self.isConfig = False
649 self.isConfig = False
650 update_figfile = True
650 update_figfile = True
651
651
652 if not self.isConfig:
652 if not self.isConfig:
653
653
654 nplots = len(channelIndexList)
654 nplots = len(channelIndexList)
655
655
656 self.setup(id=id,
656 self.setup(id=id,
657 nplots=nplots,
657 nplots=nplots,
658 wintitle=wintitle,
658 wintitle=wintitle,
659 showprofile=showprofile,
659 showprofile=showprofile,
660 show=show)
660 show=show)
661
661
662 if timerange != None:
662 if timerange != None:
663 self.timerange = timerange
663 self.timerange = timerange
664
664
665 self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange)
665 self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange)
666
666
667 noise = dataOut.noise/factor
667 noise = dataOut.noise/factor
668 noisedB = 10*numpy.log10(noise)
668 noisedB = 10*numpy.log10(noise)
669
669
670 if ymin == None: ymin = numpy.nanmin(y)
670 if ymin == None: ymin = numpy.nanmin(y)
671 if ymax == None: ymax = numpy.nanmax(y)
671 if ymax == None: ymax = numpy.nanmax(y)
672 if zmin == None: zmin = numpy.floor(numpy.nanmin(noisedB)) - 3
672 if zmin == None: zmin = numpy.floor(numpy.nanmin(noisedB)) - 3
673 if zmax == None: zmax = numpy.ceil(numpy.nanmax(avgdB)) + 3
673 if zmax == None: zmax = numpy.ceil(numpy.nanmax(avgdB)) + 3
674
674
675 self.FTP_WEI = ftp_wei
675 self.FTP_WEI = ftp_wei
676 self.EXP_CODE = exp_code
676 self.EXP_CODE = exp_code
677 self.SUB_EXP_CODE = sub_exp_code
677 self.SUB_EXP_CODE = sub_exp_code
678 self.PLOT_POS = plot_pos
678 self.PLOT_POS = plot_pos
679
679
680 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
680 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
681 self.isConfig = True
681 self.isConfig = True
682 self.figfile = figfile
682 self.figfile = figfile
683 update_figfile = True
683 update_figfile = True
684
684
685 self.setWinTitle(title)
685 self.setWinTitle(title)
686
686
687 for i in range(self.nplots):
687 for i in range(self.nplots):
688 index = channelIndexList[i]
688 index = channelIndexList[i]
689 title = "Channel %d: %s" %(dataOut.channelList[index], thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
689 title = "Channel %d: %s" %(dataOut.channelList[index], thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
690 if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)):
690 if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)):
691 title = title + '_' + 'azimuth,zenith=%2.2f,%2.2f'%(dataOut.azimuth, dataOut.zenith)
691 title = title + '_' + 'azimuth,zenith=%2.2f,%2.2f'%(dataOut.azimuth, dataOut.zenith)
692 axes = self.axesList[i*self.__nsubplots]
692 axes = self.axesList[i*self.__nsubplots]
693 zdB = avgdB[index].reshape((1,-1))
693 zdB = avgdB[index].reshape((1,-1))
694 axes.pcolorbuffer(x, y, zdB,
694 axes.pcolorbuffer(x, y, zdB,
695 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
695 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
696 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
696 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
697 ticksize=9, cblabel='', cbsize="1%", colormap=colormap)
697 ticksize=9, cblabel='', cbsize="1%", colormap=colormap)
698
698
699 if self.__showprofile:
699 if self.__showprofile:
700 axes = self.axesList[i*self.__nsubplots +1]
700 axes = self.axesList[i*self.__nsubplots +1]
701 axes.pline(avgdB[index], y,
701 axes.pline(avgdB[index], y,
702 xmin=zmin, xmax=zmax, ymin=ymin, ymax=ymax,
702 xmin=zmin, xmax=zmax, ymin=ymin, ymax=ymax,
703 xlabel='dB', ylabel='', title='',
703 xlabel='dB', ylabel='', title='',
704 ytick_visible=False,
704 ytick_visible=False,
705 grid='x')
705 grid='x')
706
706
707 self.draw()
707 self.draw()
708
708
709 self.save(figpath=figpath,
709 self.save(figpath=figpath,
710 figfile=figfile,
710 figfile=figfile,
711 save=save,
711 save=save,
712 ftp=ftp,
712 ftp=ftp,
713 wr_period=wr_period,
713 wr_period=wr_period,
714 thisDatetime=thisDatetime,
714 thisDatetime=thisDatetime,
715 update_figfile=update_figfile)
715 update_figfile=update_figfile)
716
716
717 class CoherenceMap(Figure):
717 class CoherenceMap(Figure):
718 isConfig = None
718 isConfig = None
719 __nsubplots = None
719 __nsubplots = None
720
720
721 WIDTHPROF = None
721 WIDTHPROF = None
722 HEIGHTPROF = None
722 HEIGHTPROF = None
723 PREFIX = 'cmap'
723 PREFIX = 'cmap'
724
724
725 def __init__(self, **kwargs):
725 def __init__(self, **kwargs):
726 Figure.__init__(self, **kwargs)
726 Figure.__init__(self, **kwargs)
727 self.timerange = 2*60*60
727 self.timerange = 2*60*60
728 self.isConfig = False
728 self.isConfig = False
729 self.__nsubplots = 1
729 self.__nsubplots = 1
730
730
731 self.WIDTH = 800
731 self.WIDTH = 800
732 self.HEIGHT = 180
732 self.HEIGHT = 180
733 self.WIDTHPROF = 120
733 self.WIDTHPROF = 120
734 self.HEIGHTPROF = 0
734 self.HEIGHTPROF = 0
735 self.counter_imagwr = 0
735 self.counter_imagwr = 0
736
736
737 self.PLOT_CODE = COH_CODE
737 self.PLOT_CODE = COH_CODE
738
738
739 self.FTP_WEI = None
739 self.FTP_WEI = None
740 self.EXP_CODE = None
740 self.EXP_CODE = None
741 self.SUB_EXP_CODE = None
741 self.SUB_EXP_CODE = None
742 self.PLOT_POS = None
742 self.PLOT_POS = None
743 self.counter_imagwr = 0
743 self.counter_imagwr = 0
744
744
745 self.xmin = None
745 self.xmin = None
746 self.xmax = None
746 self.xmax = None
747
747
748 def getSubplots(self):
748 def getSubplots(self):
749 ncol = 1
749 ncol = 1
750 nrow = self.nplots*2
750 nrow = self.nplots*2
751
751
752 return nrow, ncol
752 return nrow, ncol
753
753
754 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
754 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
755 self.__showprofile = showprofile
755 self.__showprofile = showprofile
756 self.nplots = nplots
756 self.nplots = nplots
757
757
758 ncolspan = 1
758 ncolspan = 1
759 colspan = 1
759 colspan = 1
760 if showprofile:
760 if showprofile:
761 ncolspan = 7
761 ncolspan = 7
762 colspan = 6
762 colspan = 6
763 self.__nsubplots = 2
763 self.__nsubplots = 2
764
764
765 self.createFigure(id = id,
765 self.createFigure(id = id,
766 wintitle = wintitle,
766 wintitle = wintitle,
767 widthplot = self.WIDTH + self.WIDTHPROF,
767 widthplot = self.WIDTH + self.WIDTHPROF,
768 heightplot = self.HEIGHT + self.HEIGHTPROF,
768 heightplot = self.HEIGHT + self.HEIGHTPROF,
769 show=True)
769 show=True)
770
770
771 nrow, ncol = self.getSubplots()
771 nrow, ncol = self.getSubplots()
772
772
773 for y in range(nrow):
773 for y in range(nrow):
774 for x in range(ncol):
774 for x in range(ncol):
775
775
776 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
776 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
777
777
778 if showprofile:
778 if showprofile:
779 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan+colspan, 1, 1)
779 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan+colspan, 1, 1)
780
780
781 def run(self, dataOut, id, wintitle="", pairsList=None, showprofile='True',
781 def run(self, dataOut, id, wintitle="", pairsList=None, showprofile='True',
782 xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None,
782 xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None,
783 timerange=None, phase_min=None, phase_max=None,
783 timerange=None, phase_min=None, phase_max=None,
784 save=False, figpath='./', figfile=None, ftp=False, wr_period=1,
784 save=False, figpath='./', figfile=None, ftp=False, wr_period=1,
785 coherence_cmap='jet', phase_cmap='RdBu_r', show=True,
785 coherence_cmap='jet', phase_cmap='RdBu_r', show=True,
786 server=None, folder=None, username=None, password=None,
786 server=None, folder=None, username=None, password=None,
787 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0):
787 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0):
788
788
789 if not isTimeInHourRange(dataOut.datatime, xmin, xmax):
789 if not isTimeInHourRange(dataOut.datatime, xmin, xmax):
790 return
790 return
791
791
792 if pairsList == None:
792 if pairsList == None:
793 pairsIndexList = dataOut.pairsIndexList
793 pairsIndexList = dataOut.pairsIndexList
794 else:
794 else:
795 pairsIndexList = []
795 pairsIndexList = []
796 for pair in pairsList:
796 for pair in pairsList:
797 if pair not in dataOut.pairsList:
797 if pair not in dataOut.pairsList:
798 raise ValueError, "Pair %s is not in dataOut.pairsList" %(pair)
798 raise ValueError, "Pair %s is not in dataOut.pairsList" %(pair)
799 pairsIndexList.append(dataOut.pairsList.index(pair))
799 pairsIndexList.append(dataOut.pairsList.index(pair))
800
800
801 if pairsIndexList == []:
801 if pairsIndexList == []:
802 return
802 return
803
803
804 if len(pairsIndexList) > 4:
804 if len(pairsIndexList) > 4:
805 pairsIndexList = pairsIndexList[0:4]
805 pairsIndexList = pairsIndexList[0:4]
806
806
807 if phase_min == None:
807 if phase_min == None:
808 phase_min = -180
808 phase_min = -180
809 if phase_max == None:
809 if phase_max == None:
810 phase_max = 180
810 phase_max = 180
811
811
812 x = dataOut.getTimeRange()
812 x = dataOut.getTimeRange()
813 y = dataOut.getHeiRange()
813 y = dataOut.getHeiRange()
814
814
815 thisDatetime = dataOut.datatime
815 thisDatetime = dataOut.datatime
816
816
817 title = wintitle + " CoherenceMap" #: %s" %(thisDatetime.strftime("%d-%b-%Y"))
817 title = wintitle + " CoherenceMap" #: %s" %(thisDatetime.strftime("%d-%b-%Y"))
818 xlabel = ""
818 xlabel = ""
819 ylabel = "Range (Km)"
819 ylabel = "Range (Km)"
820 update_figfile = False
820 update_figfile = False
821
821
822 if not self.isConfig:
822 if not self.isConfig:
823 nplots = len(pairsIndexList)
823 nplots = len(pairsIndexList)
824 self.setup(id=id,
824 self.setup(id=id,
825 nplots=nplots,
825 nplots=nplots,
826 wintitle=wintitle,
826 wintitle=wintitle,
827 showprofile=showprofile,
827 showprofile=showprofile,
828 show=show)
828 show=show)
829
829
830 if timerange != None:
830 if timerange != None:
831 self.timerange = timerange
831 self.timerange = timerange
832
832
833 self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange)
833 self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange)
834
834
835 if ymin == None: ymin = numpy.nanmin(y)
835 if ymin == None: ymin = numpy.nanmin(y)
836 if ymax == None: ymax = numpy.nanmax(y)
836 if ymax == None: ymax = numpy.nanmax(y)
837 if zmin == None: zmin = 0.
837 if zmin == None: zmin = 0.
838 if zmax == None: zmax = 1.
838 if zmax == None: zmax = 1.
839
839
840 self.FTP_WEI = ftp_wei
840 self.FTP_WEI = ftp_wei
841 self.EXP_CODE = exp_code
841 self.EXP_CODE = exp_code
842 self.SUB_EXP_CODE = sub_exp_code
842 self.SUB_EXP_CODE = sub_exp_code
843 self.PLOT_POS = plot_pos
843 self.PLOT_POS = plot_pos
844
844
845 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
845 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
846
846
847 self.isConfig = True
847 self.isConfig = True
848 update_figfile = True
848 update_figfile = True
849
849
850 self.setWinTitle(title)
850 self.setWinTitle(title)
851
851
852 for i in range(self.nplots):
852 for i in range(self.nplots):
853
853
854 pair = dataOut.pairsList[pairsIndexList[i]]
854 pair = dataOut.pairsList[pairsIndexList[i]]
855
855
856 ccf = numpy.average(dataOut.data_cspc[pairsIndexList[i],:,:],axis=0)
856 ccf = numpy.average(dataOut.data_cspc[pairsIndexList[i],:,:],axis=0)
857 powa = numpy.average(dataOut.data_spc[pair[0],:,:],axis=0)
857 powa = numpy.average(dataOut.data_spc[pair[0],:,:],axis=0)
858 powb = numpy.average(dataOut.data_spc[pair[1],:,:],axis=0)
858 powb = numpy.average(dataOut.data_spc[pair[1],:,:],axis=0)
859
859
860
860
861 avgcoherenceComplex = ccf/numpy.sqrt(powa*powb)
861 avgcoherenceComplex = ccf/numpy.sqrt(powa*powb)
862 coherence = numpy.abs(avgcoherenceComplex)
862 coherence = numpy.abs(avgcoherenceComplex)
863
863
864 z = coherence.reshape((1,-1))
864 z = coherence.reshape((1,-1))
865
865
866 counter = 0
866 counter = 0
867
867
868 title = "Coherence Ch%d * Ch%d: %s" %(pair[0], pair[1], thisDatetime.strftime("%d-%b-%Y %H:%M:%S"))
868 title = "Coherence Ch%d * Ch%d: %s" %(pair[0], pair[1], thisDatetime.strftime("%d-%b-%Y %H:%M:%S"))
869 axes = self.axesList[i*self.__nsubplots*2]
869 axes = self.axesList[i*self.__nsubplots*2]
870 axes.pcolorbuffer(x, y, z,
870 axes.pcolorbuffer(x, y, z,
871 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
871 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
872 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
872 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
873 ticksize=9, cblabel='', colormap=coherence_cmap, cbsize="1%")
873 ticksize=9, cblabel='', colormap=coherence_cmap, cbsize="1%")
874
874
875 if self.__showprofile:
875 if self.__showprofile:
876 counter += 1
876 counter += 1
877 axes = self.axesList[i*self.__nsubplots*2 + counter]
877 axes = self.axesList[i*self.__nsubplots*2 + counter]
878 axes.pline(coherence, y,
878 axes.pline(coherence, y,
879 xmin=zmin, xmax=zmax, ymin=ymin, ymax=ymax,
879 xmin=zmin, xmax=zmax, ymin=ymin, ymax=ymax,
880 xlabel='', ylabel='', title='', ticksize=7,
880 xlabel='', ylabel='', title='', ticksize=7,
881 ytick_visible=False, nxticks=5,
881 ytick_visible=False, nxticks=5,
882 grid='x')
882 grid='x')
883
883
884 counter += 1
884 counter += 1
885
885
886 phase = numpy.arctan2(avgcoherenceComplex.imag, avgcoherenceComplex.real)*180/numpy.pi
886 phase = numpy.arctan2(avgcoherenceComplex.imag, avgcoherenceComplex.real)*180/numpy.pi
887
887
888 z = phase.reshape((1,-1))
888 z = phase.reshape((1,-1))
889
889
890 title = "Phase Ch%d * Ch%d: %s" %(pair[0], pair[1], thisDatetime.strftime("%d-%b-%Y %H:%M:%S"))
890 title = "Phase Ch%d * Ch%d: %s" %(pair[0], pair[1], thisDatetime.strftime("%d-%b-%Y %H:%M:%S"))
891 axes = self.axesList[i*self.__nsubplots*2 + counter]
891 axes = self.axesList[i*self.__nsubplots*2 + counter]
892 axes.pcolorbuffer(x, y, z,
892 axes.pcolorbuffer(x, y, z,
893 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=phase_min, zmax=phase_max,
893 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=phase_min, zmax=phase_max,
894 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
894 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
895 ticksize=9, cblabel='', colormap=phase_cmap, cbsize="1%")
895 ticksize=9, cblabel='', colormap=phase_cmap, cbsize="1%")
896
896
897 if self.__showprofile:
897 if self.__showprofile:
898 counter += 1
898 counter += 1
899 axes = self.axesList[i*self.__nsubplots*2 + counter]
899 axes = self.axesList[i*self.__nsubplots*2 + counter]
900 axes.pline(phase, y,
900 axes.pline(phase, y,
901 xmin=phase_min, xmax=phase_max, ymin=ymin, ymax=ymax,
901 xmin=phase_min, xmax=phase_max, ymin=ymin, ymax=ymax,
902 xlabel='', ylabel='', title='', ticksize=7,
902 xlabel='', ylabel='', title='', ticksize=7,
903 ytick_visible=False, nxticks=4,
903 ytick_visible=False, nxticks=4,
904 grid='x')
904 grid='x')
905
905
906 self.draw()
906 self.draw()
907
907
908 if dataOut.ltctime >= self.xmax:
908 if dataOut.ltctime >= self.xmax:
909 self.counter_imagwr = wr_period
909 self.counter_imagwr = wr_period
910 self.isConfig = False
910 self.isConfig = False
911 update_figfile = True
911 update_figfile = True
912
912
913 self.save(figpath=figpath,
913 self.save(figpath=figpath,
914 figfile=figfile,
914 figfile=figfile,
915 save=save,
915 save=save,
916 ftp=ftp,
916 ftp=ftp,
917 wr_period=wr_period,
917 wr_period=wr_period,
918 thisDatetime=thisDatetime,
918 thisDatetime=thisDatetime,
919 update_figfile=update_figfile)
919 update_figfile=update_figfile)
920
920
921 class PowerProfilePlot(Figure):
921 class PowerProfilePlot(Figure):
922
922
923 isConfig = None
923 isConfig = None
924 __nsubplots = None
924 __nsubplots = None
925
925
926 WIDTHPROF = None
926 WIDTHPROF = None
927 HEIGHTPROF = None
927 HEIGHTPROF = None
928 PREFIX = 'spcprofile'
928 PREFIX = 'spcprofile'
929
929
930 def __init__(self, **kwargs):
930 def __init__(self, **kwargs):
931 Figure.__init__(self, **kwargs)
931 Figure.__init__(self, **kwargs)
932 self.isConfig = False
932 self.isConfig = False
933 self.__nsubplots = 1
933 self.__nsubplots = 1
934
934
935 self.PLOT_CODE = POWER_CODE
935 self.PLOT_CODE = POWER_CODE
936
936
937 self.WIDTH = 300
937 self.WIDTH = 300
938 self.HEIGHT = 500
938 self.HEIGHT = 500
939 self.counter_imagwr = 0
939 self.counter_imagwr = 0
940
940
941 def getSubplots(self):
941 def getSubplots(self):
942 ncol = 1
942 ncol = 1
943 nrow = 1
943 nrow = 1
944
944
945 return nrow, ncol
945 return nrow, ncol
946
946
947 def setup(self, id, nplots, wintitle, show):
947 def setup(self, id, nplots, wintitle, show):
948
948
949 self.nplots = nplots
949 self.nplots = nplots
950
950
951 ncolspan = 1
951 ncolspan = 1
952 colspan = 1
952 colspan = 1
953
953
954 self.createFigure(id = id,
954 self.createFigure(id = id,
955 wintitle = wintitle,
955 wintitle = wintitle,
956 widthplot = self.WIDTH,
956 widthplot = self.WIDTH,
957 heightplot = self.HEIGHT,
957 heightplot = self.HEIGHT,
958 show=show)
958 show=show)
959
959
960 nrow, ncol = self.getSubplots()
960 nrow, ncol = self.getSubplots()
961
961
962 counter = 0
962 counter = 0
963 for y in range(nrow):
963 for y in range(nrow):
964 for x in range(ncol):
964 for x in range(ncol):
965 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
965 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
966
966
967 def run(self, dataOut, id, wintitle="", channelList=None,
967 def run(self, dataOut, id, wintitle="", channelList=None,
968 xmin=None, xmax=None, ymin=None, ymax=None,
968 xmin=None, xmax=None, ymin=None, ymax=None,
969 save=False, figpath='./', figfile=None, show=True,
969 save=False, figpath='./', figfile=None, show=True,
970 ftp=False, wr_period=1, server=None,
970 ftp=False, wr_period=1, server=None,
971 folder=None, username=None, password=None):
971 folder=None, username=None, password=None):
972
972
973
973
974 if channelList == None:
974 if channelList == None:
975 channelIndexList = dataOut.channelIndexList
975 channelIndexList = dataOut.channelIndexList
976 channelList = dataOut.channelList
976 channelList = dataOut.channelList
977 else:
977 else:
978 channelIndexList = []
978 channelIndexList = []
979 for channel in channelList:
979 for channel in channelList:
980 if channel not in dataOut.channelList:
980 if channel not in dataOut.channelList:
981 raise ValueError, "Channel %d is not in dataOut.channelList"
981 raise ValueError, "Channel %d is not in dataOut.channelList"
982 channelIndexList.append(dataOut.channelList.index(channel))
982 channelIndexList.append(dataOut.channelList.index(channel))
983
983
984 factor = dataOut.normFactor
984 factor = dataOut.normFactor
985
985
986 y = dataOut.getHeiRange()
986 y = dataOut.getHeiRange()
987
987
988 #for voltage
988 #for voltage
989 if dataOut.type == 'Voltage':
989 if dataOut.type == 'Voltage':
990 x = dataOut.data[channelIndexList,:] * numpy.conjugate(dataOut.data[channelIndexList,:])
990 x = dataOut.data[channelIndexList,:] * numpy.conjugate(dataOut.data[channelIndexList,:])
991 x = x.real
991 x = x.real
992 x = numpy.where(numpy.isfinite(x), x, numpy.NAN)
992 x = numpy.where(numpy.isfinite(x), x, numpy.NAN)
993
993
994 #for spectra
994 #for spectra
995 if dataOut.type == 'Spectra':
995 if dataOut.type == 'Spectra':
996 x = dataOut.data_spc[channelIndexList,:,:]/factor
996 x = dataOut.data_spc[channelIndexList,:,:]/factor
997 x = numpy.where(numpy.isfinite(x), x, numpy.NAN)
997 x = numpy.where(numpy.isfinite(x), x, numpy.NAN)
998 x = numpy.average(x, axis=1)
998 x = numpy.average(x, axis=1)
999
999
1000
1000
1001 xdB = 10*numpy.log10(x)
1001 xdB = 10*numpy.log10(x)
1002
1002
1003 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0])
1003 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0])
1004 title = wintitle + " Power Profile %s" %(thisDatetime.strftime("%d-%b-%Y"))
1004 title = wintitle + " Power Profile %s" %(thisDatetime.strftime("%d-%b-%Y"))
1005 xlabel = "dB"
1005 xlabel = "dB"
1006 ylabel = "Range (Km)"
1006 ylabel = "Range (Km)"
1007
1007
1008 if not self.isConfig:
1008 if not self.isConfig:
1009
1009
1010 nplots = 1
1010 nplots = 1
1011
1011
1012 self.setup(id=id,
1012 self.setup(id=id,
1013 nplots=nplots,
1013 nplots=nplots,
1014 wintitle=wintitle,
1014 wintitle=wintitle,
1015 show=show)
1015 show=show)
1016
1016
1017 if ymin == None: ymin = numpy.nanmin(y)
1017 if ymin == None: ymin = numpy.nanmin(y)
1018 if ymax == None: ymax = numpy.nanmax(y)
1018 if ymax == None: ymax = numpy.nanmax(y)
1019 if xmin == None: xmin = numpy.nanmin(xdB)*0.9
1019 if xmin == None: xmin = numpy.nanmin(xdB)*0.9
1020 if xmax == None: xmax = numpy.nanmax(xdB)*1.1
1020 if xmax == None: xmax = numpy.nanmax(xdB)*1.1
1021
1021
1022 self.isConfig = True
1022 self.isConfig = True
1023
1023
1024 self.setWinTitle(title)
1024 self.setWinTitle(title)
1025
1025
1026 title = "Power Profile: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S"))
1026 title = "Power Profile: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S"))
1027 axes = self.axesList[0]
1027 axes = self.axesList[0]
1028
1028
1029 legendlabels = ["channel %d"%x for x in channelList]
1029 legendlabels = ["channel %d"%x for x in channelList]
1030 axes.pmultiline(xdB, y,
1030 axes.pmultiline(xdB, y,
1031 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax,
1031 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax,
1032 xlabel=xlabel, ylabel=ylabel, title=title, legendlabels=legendlabels,
1032 xlabel=xlabel, ylabel=ylabel, title=title, legendlabels=legendlabels,
1033 ytick_visible=True, nxticks=5,
1033 ytick_visible=True, nxticks=5,
1034 grid='x')
1034 grid='x')
1035
1035
1036 self.draw()
1036 self.draw()
1037
1037
1038 self.save(figpath=figpath,
1038 self.save(figpath=figpath,
1039 figfile=figfile,
1039 figfile=figfile,
1040 save=save,
1040 save=save,
1041 ftp=ftp,
1041 ftp=ftp,
1042 wr_period=wr_period,
1042 wr_period=wr_period,
1043 thisDatetime=thisDatetime)
1043 thisDatetime=thisDatetime)
1044
1044
1045 class SpectraCutPlot(Figure):
1045 class SpectraCutPlot(Figure):
1046
1046
1047 isConfig = None
1047 isConfig = None
1048 __nsubplots = None
1048 __nsubplots = None
1049
1049
1050 WIDTHPROF = None
1050 WIDTHPROF = None
1051 HEIGHTPROF = None
1051 HEIGHTPROF = None
1052 PREFIX = 'spc_cut'
1052 PREFIX = 'spc_cut'
1053
1053
1054 def __init__(self, **kwargs):
1054 def __init__(self, **kwargs):
1055 Figure.__init__(self, **kwargs)
1055 Figure.__init__(self, **kwargs)
1056 self.isConfig = False
1056 self.isConfig = False
1057 self.__nsubplots = 1
1057 self.__nsubplots = 1
1058
1058
1059 self.PLOT_CODE = POWER_CODE
1059 self.PLOT_CODE = POWER_CODE
1060
1060
1061 self.WIDTH = 700
1061 self.WIDTH = 700
1062 self.HEIGHT = 500
1062 self.HEIGHT = 500
1063 self.counter_imagwr = 0
1063 self.counter_imagwr = 0
1064
1064
1065 def getSubplots(self):
1065 def getSubplots(self):
1066 ncol = 1
1066 ncol = 1
1067 nrow = 1
1067 nrow = 1
1068
1068
1069 return nrow, ncol
1069 return nrow, ncol
1070
1070
1071 def setup(self, id, nplots, wintitle, show):
1071 def setup(self, id, nplots, wintitle, show):
1072
1072
1073 self.nplots = nplots
1073 self.nplots = nplots
1074
1074
1075 ncolspan = 1
1075 ncolspan = 1
1076 colspan = 1
1076 colspan = 1
1077
1077
1078 self.createFigure(id = id,
1078 self.createFigure(id = id,
1079 wintitle = wintitle,
1079 wintitle = wintitle,
1080 widthplot = self.WIDTH,
1080 widthplot = self.WIDTH,
1081 heightplot = self.HEIGHT,
1081 heightplot = self.HEIGHT,
1082 show=show)
1082 show=show)
1083
1083
1084 nrow, ncol = self.getSubplots()
1084 nrow, ncol = self.getSubplots()
1085
1085
1086 counter = 0
1086 counter = 0
1087 for y in range(nrow):
1087 for y in range(nrow):
1088 for x in range(ncol):
1088 for x in range(ncol):
1089 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
1089 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
1090
1090
1091 def run(self, dataOut, id, wintitle="", channelList=None,
1091 def run(self, dataOut, id, wintitle="", channelList=None,
1092 xmin=None, xmax=None, ymin=None, ymax=None,
1092 xmin=None, xmax=None, ymin=None, ymax=None,
1093 save=False, figpath='./', figfile=None, show=True,
1093 save=False, figpath='./', figfile=None, show=True,
1094 ftp=False, wr_period=1, server=None,
1094 ftp=False, wr_period=1, server=None,
1095 folder=None, username=None, password=None,
1095 folder=None, username=None, password=None,
1096 xaxis="frequency"):
1096 xaxis="frequency"):
1097
1097
1098
1098
1099 if channelList == None:
1099 if channelList == None:
1100 channelIndexList = dataOut.channelIndexList
1100 channelIndexList = dataOut.channelIndexList
1101 channelList = dataOut.channelList
1101 channelList = dataOut.channelList
1102 else:
1102 else:
1103 channelIndexList = []
1103 channelIndexList = []
1104 for channel in channelList:
1104 for channel in channelList:
1105 if channel not in dataOut.channelList:
1105 if channel not in dataOut.channelList:
1106 raise ValueError, "Channel %d is not in dataOut.channelList"
1106 raise ValueError, "Channel %d is not in dataOut.channelList"
1107 channelIndexList.append(dataOut.channelList.index(channel))
1107 channelIndexList.append(dataOut.channelList.index(channel))
1108
1108
1109 factor = dataOut.normFactor
1109 factor = dataOut.normFactor
1110
1110
1111 y = dataOut.getHeiRange()
1111 y = dataOut.getHeiRange()
1112
1112
1113 z = dataOut.data_spc/factor
1113 z = dataOut.data_spc/factor
1114 z = numpy.where(numpy.isfinite(z), z, numpy.NAN)
1114 z = numpy.where(numpy.isfinite(z), z, numpy.NAN)
1115
1115
1116 hei_index = numpy.arange(25)*3 + 20
1116 hei_index = numpy.arange(25)*3 + 20
1117
1117
1118 if xaxis == "frequency":
1118 if xaxis == "frequency":
1119 x = dataOut.getFreqRange()/1000.
1119 x = dataOut.getFreqRange()/1000.
1120 zdB = 10*numpy.log10(z[0,:,hei_index])
1120 zdB = 10*numpy.log10(z[0,:,hei_index])
1121 xlabel = "Frequency (kHz)"
1121 xlabel = "Frequency (kHz)"
1122 ylabel = "Power (dB)"
1122 ylabel = "Power (dB)"
1123
1123
1124 elif xaxis == "time":
1124 elif xaxis == "time":
1125 x = dataOut.getAcfRange()
1125 x = dataOut.getAcfRange()
1126 zdB = z[0,:,hei_index]
1126 zdB = z[0,:,hei_index]
1127 xlabel = "Time (ms)"
1127 xlabel = "Time (ms)"
1128 ylabel = "ACF"
1128 ylabel = "ACF"
1129
1129
1130 else:
1130 else:
1131 x = dataOut.getVelRange()
1131 x = dataOut.getVelRange()
1132 zdB = 10*numpy.log10(z[0,:,hei_index])
1132 zdB = 10*numpy.log10(z[0,:,hei_index])
1133 xlabel = "Velocity (m/s)"
1133 xlabel = "Velocity (m/s)"
1134 ylabel = "Power (dB)"
1134 ylabel = "Power (dB)"
1135
1135
1136 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0])
1136 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0])
1137 title = wintitle + " Range Cuts %s" %(thisDatetime.strftime("%d-%b-%Y"))
1137 title = wintitle + " Range Cuts %s" %(thisDatetime.strftime("%d-%b-%Y"))
1138
1138
1139 if not self.isConfig:
1139 if not self.isConfig:
1140
1140
1141 nplots = 1
1141 nplots = 1
1142
1142
1143 self.setup(id=id,
1143 self.setup(id=id,
1144 nplots=nplots,
1144 nplots=nplots,
1145 wintitle=wintitle,
1145 wintitle=wintitle,
1146 show=show)
1146 show=show)
1147
1147
1148 if xmin == None: xmin = numpy.nanmin(x)*0.9
1148 if xmin == None: xmin = numpy.nanmin(x)*0.9
1149 if xmax == None: xmax = numpy.nanmax(x)*1.1
1149 if xmax == None: xmax = numpy.nanmax(x)*1.1
1150 if ymin == None: ymin = numpy.nanmin(zdB)
1150 if ymin == None: ymin = numpy.nanmin(zdB)
1151 if ymax == None: ymax = numpy.nanmax(zdB)
1151 if ymax == None: ymax = numpy.nanmax(zdB)
1152
1152
1153 self.isConfig = True
1153 self.isConfig = True
1154
1154
1155 self.setWinTitle(title)
1155 self.setWinTitle(title)
1156
1156
1157 title = "Spectra Cuts: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S"))
1157 title = "Spectra Cuts: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S"))
1158 axes = self.axesList[0]
1158 axes = self.axesList[0]
1159
1159
1160 legendlabels = ["Range = %dKm" %y[i] for i in hei_index]
1160 legendlabels = ["Range = %dKm" %y[i] for i in hei_index]
1161
1161
1162 axes.pmultilineyaxis( x, zdB,
1162 axes.pmultilineyaxis( x, zdB,
1163 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax,
1163 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax,
1164 xlabel=xlabel, ylabel=ylabel, title=title, legendlabels=legendlabels,
1164 xlabel=xlabel, ylabel=ylabel, title=title, legendlabels=legendlabels,
1165 ytick_visible=True, nxticks=5,
1165 ytick_visible=True, nxticks=5,
1166 grid='x')
1166 grid='x')
1167
1167
1168 self.draw()
1168 self.draw()
1169
1169
1170 self.save(figpath=figpath,
1170 self.save(figpath=figpath,
1171 figfile=figfile,
1171 figfile=figfile,
1172 save=save,
1172 save=save,
1173 ftp=ftp,
1173 ftp=ftp,
1174 wr_period=wr_period,
1174 wr_period=wr_period,
1175 thisDatetime=thisDatetime)
1175 thisDatetime=thisDatetime)
1176
1176
1177 class Noise(Figure):
1177 class Noise(Figure):
1178
1178
1179 isConfig = None
1179 isConfig = None
1180 __nsubplots = None
1180 __nsubplots = None
1181
1181
1182 PREFIX = 'noise'
1182 PREFIX = 'noise'
1183
1183
1184
1184
1185 def __init__(self, **kwargs):
1185 def __init__(self, **kwargs):
1186 Figure.__init__(self, **kwargs)
1186 Figure.__init__(self, **kwargs)
1187 self.timerange = 24*60*60
1187 self.timerange = 24*60*60
1188 self.isConfig = False
1188 self.isConfig = False
1189 self.__nsubplots = 1
1189 self.__nsubplots = 1
1190 self.counter_imagwr = 0
1190 self.counter_imagwr = 0
1191 self.WIDTH = 800
1191 self.WIDTH = 800
1192 self.HEIGHT = 400
1192 self.HEIGHT = 400
1193 self.WIDTHPROF = 120
1193 self.WIDTHPROF = 120
1194 self.HEIGHTPROF = 0
1194 self.HEIGHTPROF = 0
1195 self.xdata = None
1195 self.xdata = None
1196 self.ydata = None
1196 self.ydata = None
1197
1197
1198 self.PLOT_CODE = NOISE_CODE
1198 self.PLOT_CODE = NOISE_CODE
1199
1199
1200 self.FTP_WEI = None
1200 self.FTP_WEI = None
1201 self.EXP_CODE = None
1201 self.EXP_CODE = None
1202 self.SUB_EXP_CODE = None
1202 self.SUB_EXP_CODE = None
1203 self.PLOT_POS = None
1203 self.PLOT_POS = None
1204 self.figfile = None
1204 self.figfile = None
1205
1205
1206 self.xmin = None
1206 self.xmin = None
1207 self.xmax = None
1207 self.xmax = None
1208
1208
1209 def getSubplots(self):
1209 def getSubplots(self):
1210
1210
1211 ncol = 1
1211 ncol = 1
1212 nrow = 1
1212 nrow = 1
1213
1213
1214 return nrow, ncol
1214 return nrow, ncol
1215
1215
1216 def openfile(self, filename):
1216 def openfile(self, filename):
1217 dirname = os.path.dirname(filename)
1217 dirname = os.path.dirname(filename)
1218
1218
1219 if not os.path.exists(dirname):
1219 if not os.path.exists(dirname):
1220 os.mkdir(dirname)
1220 os.mkdir(dirname)
1221
1221
1222 f = open(filename,'w+')
1222 f = open(filename,'w+')
1223 f.write('\n\n')
1223 f.write('\n\n')
1224 f.write('JICAMARCA RADIO OBSERVATORY - Noise \n')
1224 f.write('JICAMARCA RADIO OBSERVATORY - Noise \n')
1225 f.write('DD MM YYYY HH MM SS Channel0 Channel1 Channel2 Channel3\n\n' )
1225 f.write('DD MM YYYY HH MM SS Channel0 Channel1 Channel2 Channel3\n\n' )
1226 f.close()
1226 f.close()
1227
1227
1228 def save_data(self, filename_phase, data, data_datetime):
1228 def save_data(self, filename_phase, data, data_datetime):
1229
1229
1230 f=open(filename_phase,'a')
1230 f=open(filename_phase,'a')
1231
1231
1232 timetuple_data = data_datetime.timetuple()
1232 timetuple_data = data_datetime.timetuple()
1233 day = str(timetuple_data.tm_mday)
1233 day = str(timetuple_data.tm_mday)
1234 month = str(timetuple_data.tm_mon)
1234 month = str(timetuple_data.tm_mon)
1235 year = str(timetuple_data.tm_year)
1235 year = str(timetuple_data.tm_year)
1236 hour = str(timetuple_data.tm_hour)
1236 hour = str(timetuple_data.tm_hour)
1237 minute = str(timetuple_data.tm_min)
1237 minute = str(timetuple_data.tm_min)
1238 second = str(timetuple_data.tm_sec)
1238 second = str(timetuple_data.tm_sec)
1239
1239
1240 data_msg = ''
1240 data_msg = ''
1241 for i in range(len(data)):
1241 for i in range(len(data)):
1242 data_msg += str(data[i]) + ' '
1242 data_msg += str(data[i]) + ' '
1243
1243
1244 f.write(day+' '+month+' '+year+' '+hour+' '+minute+' '+second+' ' + data_msg + '\n')
1244 f.write(day+' '+month+' '+year+' '+hour+' '+minute+' '+second+' ' + data_msg + '\n')
1245 f.close()
1245 f.close()
1246
1246
1247
1247
1248 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
1248 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
1249
1249
1250 self.__showprofile = showprofile
1250 self.__showprofile = showprofile
1251 self.nplots = nplots
1251 self.nplots = nplots
1252
1252
1253 ncolspan = 7
1253 ncolspan = 7
1254 colspan = 6
1254 colspan = 6
1255 self.__nsubplots = 2
1255 self.__nsubplots = 2
1256
1256
1257 self.createFigure(id = id,
1257 self.createFigure(id = id,
1258 wintitle = wintitle,
1258 wintitle = wintitle,
1259 widthplot = self.WIDTH+self.WIDTHPROF,
1259 widthplot = self.WIDTH+self.WIDTHPROF,
1260 heightplot = self.HEIGHT+self.HEIGHTPROF,
1260 heightplot = self.HEIGHT+self.HEIGHTPROF,
1261 show=show)
1261 show=show)
1262
1262
1263 nrow, ncol = self.getSubplots()
1263 nrow, ncol = self.getSubplots()
1264
1264
1265 self.addAxes(nrow, ncol*ncolspan, 0, 0, colspan, 1)
1265 self.addAxes(nrow, ncol*ncolspan, 0, 0, colspan, 1)
1266
1266
1267
1267
1268 def run(self, dataOut, id, wintitle="", channelList=None, showprofile='True',
1268 def run(self, dataOut, id, wintitle="", channelList=None, showprofile='True',
1269 xmin=None, xmax=None, ymin=None, ymax=None,
1269 xmin=None, xmax=None, ymin=None, ymax=None,
1270 timerange=None,
1270 timerange=None,
1271 save=False, figpath='./', figfile=None, show=True, ftp=False, wr_period=1,
1271 save=False, figpath='./', figfile=None, show=True, ftp=False, wr_period=1,
1272 server=None, folder=None, username=None, password=None,
1272 server=None, folder=None, username=None, password=None,
1273 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0):
1273 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0):
1274
1274
1275 if not isTimeInHourRange(dataOut.datatime, xmin, xmax):
1275 if not isTimeInHourRange(dataOut.datatime, xmin, xmax):
1276 return
1276 return
1277
1277
1278 if channelList == None:
1278 if channelList == None:
1279 channelIndexList = dataOut.channelIndexList
1279 channelIndexList = dataOut.channelIndexList
1280 channelList = dataOut.channelList
1280 channelList = dataOut.channelList
1281 else:
1281 else:
1282 channelIndexList = []
1282 channelIndexList = []
1283 for channel in channelList:
1283 for channel in channelList:
1284 if channel not in dataOut.channelList:
1284 if channel not in dataOut.channelList:
1285 raise ValueError, "Channel %d is not in dataOut.channelList"
1285 raise ValueError, "Channel %d is not in dataOut.channelList"
1286 channelIndexList.append(dataOut.channelList.index(channel))
1286 channelIndexList.append(dataOut.channelList.index(channel))
1287
1287
1288 x = dataOut.getTimeRange()
1288 x = dataOut.getTimeRange()
1289 #y = dataOut.getHeiRange()
1289 #y = dataOut.getHeiRange()
1290 factor = dataOut.normFactor
1290 factor = dataOut.normFactor
1291 noise = dataOut.noise[channelIndexList]/factor
1291 noise = dataOut.noise[channelIndexList]/factor
1292 noisedB = 10*numpy.log10(noise)
1292 noisedB = 10*numpy.log10(noise)
1293
1293
1294 thisDatetime = dataOut.datatime
1294 thisDatetime = dataOut.datatime
1295
1295
1296 title = wintitle + " Noise" # : %s" %(thisDatetime.strftime("%d-%b-%Y"))
1296 title = wintitle + " Noise" # : %s" %(thisDatetime.strftime("%d-%b-%Y"))
1297 xlabel = ""
1297 xlabel = ""
1298 ylabel = "Intensity (dB)"
1298 ylabel = "Intensity (dB)"
1299 update_figfile = False
1299 update_figfile = False
1300
1300
1301 if not self.isConfig:
1301 if not self.isConfig:
1302
1302
1303 nplots = 1
1303 nplots = 1
1304
1304
1305 self.setup(id=id,
1305 self.setup(id=id,
1306 nplots=nplots,
1306 nplots=nplots,
1307 wintitle=wintitle,
1307 wintitle=wintitle,
1308 showprofile=showprofile,
1308 showprofile=showprofile,
1309 show=show)
1309 show=show)
1310
1310
1311 if timerange != None:
1311 if timerange != None:
1312 self.timerange = timerange
1312 self.timerange = timerange
1313
1313
1314 self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange)
1314 self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange)
1315
1315
1316 if ymin == None: ymin = numpy.floor(numpy.nanmin(noisedB)) - 10.0
1316 if ymin == None: ymin = numpy.floor(numpy.nanmin(noisedB)) - 10.0
1317 if ymax == None: ymax = numpy.nanmax(noisedB) + 10.0
1317 if ymax == None: ymax = numpy.nanmax(noisedB) + 10.0
1318
1318
1319 self.FTP_WEI = ftp_wei
1319 self.FTP_WEI = ftp_wei
1320 self.EXP_CODE = exp_code
1320 self.EXP_CODE = exp_code
1321 self.SUB_EXP_CODE = sub_exp_code
1321 self.SUB_EXP_CODE = sub_exp_code
1322 self.PLOT_POS = plot_pos
1322 self.PLOT_POS = plot_pos
1323
1323
1324
1324
1325 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
1325 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
1326 self.isConfig = True
1326 self.isConfig = True
1327 self.figfile = figfile
1327 self.figfile = figfile
1328 self.xdata = numpy.array([])
1328 self.xdata = numpy.array([])
1329 self.ydata = numpy.array([])
1329 self.ydata = numpy.array([])
1330
1330
1331 update_figfile = True
1331 update_figfile = True
1332
1332
1333 #open file beacon phase
1333 #open file beacon phase
1334 path = '%s%03d' %(self.PREFIX, self.id)
1334 path = '%s%03d' %(self.PREFIX, self.id)
1335 noise_file = os.path.join(path,'%s.txt'%self.name)
1335 noise_file = os.path.join(path,'%s.txt'%self.name)
1336 self.filename_noise = os.path.join(figpath,noise_file)
1336 self.filename_noise = os.path.join(figpath,noise_file)
1337
1337
1338 self.setWinTitle(title)
1338 self.setWinTitle(title)
1339
1339
1340 title = "Noise %s" %(thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
1340 title = "Noise %s" %(thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
1341
1341
1342 legendlabels = ["channel %d"%(idchannel) for idchannel in channelList]
1342 legendlabels = ["channel %d"%(idchannel) for idchannel in channelList]
1343 axes = self.axesList[0]
1343 axes = self.axesList[0]
1344
1344
1345 self.xdata = numpy.hstack((self.xdata, x[0:1]))
1345 self.xdata = numpy.hstack((self.xdata, x[0:1]))
1346
1346
1347 if len(self.ydata)==0:
1347 if len(self.ydata)==0:
1348 self.ydata = noisedB.reshape(-1,1)
1348 self.ydata = noisedB.reshape(-1,1)
1349 else:
1349 else:
1350 self.ydata = numpy.hstack((self.ydata, noisedB.reshape(-1,1)))
1350 self.ydata = numpy.hstack((self.ydata, noisedB.reshape(-1,1)))
1351
1351
1352
1352
1353 axes.pmultilineyaxis(x=self.xdata, y=self.ydata,
1353 axes.pmultilineyaxis(x=self.xdata, y=self.ydata,
1354 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax,
1354 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax,
1355 xlabel=xlabel, ylabel=ylabel, title=title, legendlabels=legendlabels, marker='x', markersize=8, linestyle="solid",
1355 xlabel=xlabel, ylabel=ylabel, title=title, legendlabels=legendlabels, marker='x', markersize=8, linestyle="solid",
1356 XAxisAsTime=True, grid='both'
1356 XAxisAsTime=True, grid='both'
1357 )
1357 )
1358
1358
1359 self.draw()
1359 self.draw()
1360
1360
1361 if dataOut.ltctime >= self.xmax:
1361 if dataOut.ltctime >= self.xmax:
1362 self.counter_imagwr = wr_period
1362 self.counter_imagwr = wr_period
1363 self.isConfig = False
1363 self.isConfig = False
1364 update_figfile = True
1364 update_figfile = True
1365
1365
1366 self.save(figpath=figpath,
1366 self.save(figpath=figpath,
1367 figfile=figfile,
1367 figfile=figfile,
1368 save=save,
1368 save=save,
1369 ftp=ftp,
1369 ftp=ftp,
1370 wr_period=wr_period,
1370 wr_period=wr_period,
1371 thisDatetime=thisDatetime,
1371 thisDatetime=thisDatetime,
1372 update_figfile=update_figfile)
1372 update_figfile=update_figfile)
1373
1373
1374 #store data beacon phase
1374 #store data beacon phase
1375 if save:
1375 if save:
1376 self.save_data(self.filename_noise, noisedB, thisDatetime)
1376 self.save_data(self.filename_noise, noisedB, thisDatetime)
1377
1377
1378 class BeaconPhase(Figure):
1378 class BeaconPhase(Figure):
1379
1379
1380 __isConfig = None
1380 __isConfig = None
1381 __nsubplots = None
1381 __nsubplots = None
1382
1382
1383 PREFIX = 'beacon_phase'
1383 PREFIX = 'beacon_phase'
1384
1384
1385 def __init__(self, **kwargs):
1385 def __init__(self, **kwargs):
1386 Figure.__init__(self, **kwargs)
1386 Figure.__init__(self, **kwargs)
1387 self.timerange = 24*60*60
1387 self.timerange = 24*60*60
1388 self.isConfig = False
1388 self.isConfig = False
1389 self.__nsubplots = 1
1389 self.__nsubplots = 1
1390 self.counter_imagwr = 0
1390 self.counter_imagwr = 0
1391 self.WIDTH = 800
1391 self.WIDTH = 800
1392 self.HEIGHT = 400
1392 self.HEIGHT = 400
1393 self.WIDTHPROF = 120
1393 self.WIDTHPROF = 120
1394 self.HEIGHTPROF = 0
1394 self.HEIGHTPROF = 0
1395 self.xdata = None
1395 self.xdata = None
1396 self.ydata = None
1396 self.ydata = None
1397
1397
1398 self.PLOT_CODE = BEACON_CODE
1398 self.PLOT_CODE = BEACON_CODE
1399
1399
1400 self.FTP_WEI = None
1400 self.FTP_WEI = None
1401 self.EXP_CODE = None
1401 self.EXP_CODE = None
1402 self.SUB_EXP_CODE = None
1402 self.SUB_EXP_CODE = None
1403 self.PLOT_POS = None
1403 self.PLOT_POS = None
1404
1404
1405 self.filename_phase = None
1405 self.filename_phase = None
1406
1406
1407 self.figfile = None
1407 self.figfile = None
1408
1408
1409 self.xmin = None
1409 self.xmin = None
1410 self.xmax = None
1410 self.xmax = None
1411
1411
1412 def getSubplots(self):
1412 def getSubplots(self):
1413
1413
1414 ncol = 1
1414 ncol = 1
1415 nrow = 1
1415 nrow = 1
1416
1416
1417 return nrow, ncol
1417 return nrow, ncol
1418
1418
1419 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
1419 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
1420
1420
1421 self.__showprofile = showprofile
1421 self.__showprofile = showprofile
1422 self.nplots = nplots
1422 self.nplots = nplots
1423
1423
1424 ncolspan = 7
1424 ncolspan = 7
1425 colspan = 6
1425 colspan = 6
1426 self.__nsubplots = 2
1426 self.__nsubplots = 2
1427
1427
1428 self.createFigure(id = id,
1428 self.createFigure(id = id,
1429 wintitle = wintitle,
1429 wintitle = wintitle,
1430 widthplot = self.WIDTH+self.WIDTHPROF,
1430 widthplot = self.WIDTH+self.WIDTHPROF,
1431 heightplot = self.HEIGHT+self.HEIGHTPROF,
1431 heightplot = self.HEIGHT+self.HEIGHTPROF,
1432 show=show)
1432 show=show)
1433
1433
1434 nrow, ncol = self.getSubplots()
1434 nrow, ncol = self.getSubplots()
1435
1435
1436 self.addAxes(nrow, ncol*ncolspan, 0, 0, colspan, 1)
1436 self.addAxes(nrow, ncol*ncolspan, 0, 0, colspan, 1)
1437
1437
1438 def save_phase(self, filename_phase):
1438 def save_phase(self, filename_phase):
1439 f = open(filename_phase,'w+')
1439 f = open(filename_phase,'w+')
1440 f.write('\n\n')
1440 f.write('\n\n')
1441 f.write('JICAMARCA RADIO OBSERVATORY - Beacon Phase \n')
1441 f.write('JICAMARCA RADIO OBSERVATORY - Beacon Phase \n')
1442 f.write('DD MM YYYY HH MM SS pair(2,0) pair(2,1) pair(2,3) pair(2,4)\n\n' )
1442 f.write('DD MM YYYY HH MM SS pair(2,0) pair(2,1) pair(2,3) pair(2,4)\n\n' )
1443 f.close()
1443 f.close()
1444
1444
1445 def save_data(self, filename_phase, data, data_datetime):
1445 def save_data(self, filename_phase, data, data_datetime):
1446 f=open(filename_phase,'a')
1446 f=open(filename_phase,'a')
1447 timetuple_data = data_datetime.timetuple()
1447 timetuple_data = data_datetime.timetuple()
1448 day = str(timetuple_data.tm_mday)
1448 day = str(timetuple_data.tm_mday)
1449 month = str(timetuple_data.tm_mon)
1449 month = str(timetuple_data.tm_mon)
1450 year = str(timetuple_data.tm_year)
1450 year = str(timetuple_data.tm_year)
1451 hour = str(timetuple_data.tm_hour)
1451 hour = str(timetuple_data.tm_hour)
1452 minute = str(timetuple_data.tm_min)
1452 minute = str(timetuple_data.tm_min)
1453 second = str(timetuple_data.tm_sec)
1453 second = str(timetuple_data.tm_sec)
1454 f.write(day+' '+month+' '+year+' '+hour+' '+minute+' '+second+' '+str(data[0])+' '+str(data[1])+' '+str(data[2])+' '+str(data[3])+'\n')
1454 f.write(day+' '+month+' '+year+' '+hour+' '+minute+' '+second+' '+str(data[0])+' '+str(data[1])+' '+str(data[2])+' '+str(data[3])+'\n')
1455 f.close()
1455 f.close()
1456
1456
1457
1457
1458 def run(self, dataOut, id, wintitle="", pairsList=None, showprofile='True',
1458 def run(self, dataOut, id, wintitle="", pairsList=None, showprofile='True',
1459 xmin=None, xmax=None, ymin=None, ymax=None, hmin=None, hmax=None,
1459 xmin=None, xmax=None, ymin=None, ymax=None, hmin=None, hmax=None,
1460 timerange=None,
1460 timerange=None,
1461 save=False, figpath='./', figfile=None, show=True, ftp=False, wr_period=1,
1461 save=False, figpath='./', figfile=None, show=True, ftp=False, wr_period=1,
1462 server=None, folder=None, username=None, password=None,
1462 server=None, folder=None, username=None, password=None,
1463 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0):
1463 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0):
1464
1464
1465 if not isTimeInHourRange(dataOut.datatime, xmin, xmax):
1465 if not isTimeInHourRange(dataOut.datatime, xmin, xmax):
1466 return
1466 return
1467
1467
1468 if pairsList == None:
1468 if pairsList == None:
1469 pairsIndexList = dataOut.pairsIndexList[:10]
1469 pairsIndexList = dataOut.pairsIndexList[:10]
1470 else:
1470 else:
1471 pairsIndexList = []
1471 pairsIndexList = []
1472 for pair in pairsList:
1472 for pair in pairsList:
1473 if pair not in dataOut.pairsList:
1473 if pair not in dataOut.pairsList:
1474 raise ValueError, "Pair %s is not in dataOut.pairsList" %(pair)
1474 raise ValueError, "Pair %s is not in dataOut.pairsList" %(pair)
1475 pairsIndexList.append(dataOut.pairsList.index(pair))
1475 pairsIndexList.append(dataOut.pairsList.index(pair))
1476
1476
1477 if pairsIndexList == []:
1477 if pairsIndexList == []:
1478 return
1478 return
1479
1479
1480 # if len(pairsIndexList) > 4:
1480 # if len(pairsIndexList) > 4:
1481 # pairsIndexList = pairsIndexList[0:4]
1481 # pairsIndexList = pairsIndexList[0:4]
1482
1482
1483 hmin_index = None
1483 hmin_index = None
1484 hmax_index = None
1484 hmax_index = None
1485
1485
1486 if hmin != None and hmax != None:
1486 if hmin != None and hmax != None:
1487 indexes = numpy.arange(dataOut.nHeights)
1487 indexes = numpy.arange(dataOut.nHeights)
1488 hmin_list = indexes[dataOut.heightList >= hmin]
1488 hmin_list = indexes[dataOut.heightList >= hmin]
1489 hmax_list = indexes[dataOut.heightList <= hmax]
1489 hmax_list = indexes[dataOut.heightList <= hmax]
1490
1490
1491 if hmin_list.any():
1491 if hmin_list.any():
1492 hmin_index = hmin_list[0]
1492 hmin_index = hmin_list[0]
1493
1493
1494 if hmax_list.any():
1494 if hmax_list.any():
1495 hmax_index = hmax_list[-1]+1
1495 hmax_index = hmax_list[-1]+1
1496
1496
1497 x = dataOut.getTimeRange()
1497 x = dataOut.getTimeRange()
1498 #y = dataOut.getHeiRange()
1498 #y = dataOut.getHeiRange()
1499
1499
1500
1500
1501 thisDatetime = dataOut.datatime
1501 thisDatetime = dataOut.datatime
1502
1502
1503 title = wintitle + " Signal Phase" # : %s" %(thisDatetime.strftime("%d-%b-%Y"))
1503 title = wintitle + " Signal Phase" # : %s" %(thisDatetime.strftime("%d-%b-%Y"))
1504 xlabel = "Local Time"
1504 xlabel = "Local Time"
1505 ylabel = "Phase (degrees)"
1505 ylabel = "Phase (degrees)"
1506
1506
1507 update_figfile = False
1507 update_figfile = False
1508
1508
1509 nplots = len(pairsIndexList)
1509 nplots = len(pairsIndexList)
1510 #phase = numpy.zeros((len(pairsIndexList),len(dataOut.beacon_heiIndexList)))
1510 #phase = numpy.zeros((len(pairsIndexList),len(dataOut.beacon_heiIndexList)))
1511 phase_beacon = numpy.zeros(len(pairsIndexList))
1511 phase_beacon = numpy.zeros(len(pairsIndexList))
1512 for i in range(nplots):
1512 for i in range(nplots):
1513 pair = dataOut.pairsList[pairsIndexList[i]]
1513 pair = dataOut.pairsList[pairsIndexList[i]]
1514 ccf = numpy.average(dataOut.data_cspc[pairsIndexList[i], :, hmin_index:hmax_index], axis=0)
1514 ccf = numpy.average(dataOut.data_cspc[pairsIndexList[i], :, hmin_index:hmax_index], axis=0)
1515 powa = numpy.average(dataOut.data_spc[pair[0], :, hmin_index:hmax_index], axis=0)
1515 powa = numpy.average(dataOut.data_spc[pair[0], :, hmin_index:hmax_index], axis=0)
1516 powb = numpy.average(dataOut.data_spc[pair[1], :, hmin_index:hmax_index], axis=0)
1516 powb = numpy.average(dataOut.data_spc[pair[1], :, hmin_index:hmax_index], axis=0)
1517 avgcoherenceComplex = ccf/numpy.sqrt(powa*powb)
1517 avgcoherenceComplex = ccf/numpy.sqrt(powa*powb)
1518 phase = numpy.arctan2(avgcoherenceComplex.imag, avgcoherenceComplex.real)*180/numpy.pi
1518 phase = numpy.arctan2(avgcoherenceComplex.imag, avgcoherenceComplex.real)*180/numpy.pi
1519
1519
1520 #print "Phase %d%d" %(pair[0], pair[1])
1520 #print "Phase %d%d" %(pair[0], pair[1])
1521 #print phase[dataOut.beacon_heiIndexList]
1521 #print phase[dataOut.beacon_heiIndexList]
1522
1522
1523 if dataOut.beacon_heiIndexList:
1523 if dataOut.beacon_heiIndexList:
1524 phase_beacon[i] = numpy.average(phase[dataOut.beacon_heiIndexList])
1524 phase_beacon[i] = numpy.average(phase[dataOut.beacon_heiIndexList])
1525 else:
1525 else:
1526 phase_beacon[i] = numpy.average(phase)
1526 phase_beacon[i] = numpy.average(phase)
1527
1527
1528 if not self.isConfig:
1528 if not self.isConfig:
1529
1529
1530 nplots = len(pairsIndexList)
1530 nplots = len(pairsIndexList)
1531
1531
1532 self.setup(id=id,
1532 self.setup(id=id,
1533 nplots=nplots,
1533 nplots=nplots,
1534 wintitle=wintitle,
1534 wintitle=wintitle,
1535 showprofile=showprofile,
1535 showprofile=showprofile,
1536 show=show)
1536 show=show)
1537
1537
1538 if timerange != None:
1538 if timerange != None:
1539 self.timerange = timerange
1539 self.timerange = timerange
1540
1540
1541 self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange)
1541 self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange)
1542
1542
1543 if ymin == None: ymin = 0
1543 if ymin == None: ymin = 0
1544 if ymax == None: ymax = 360
1544 if ymax == None: ymax = 360
1545
1545
1546 self.FTP_WEI = ftp_wei
1546 self.FTP_WEI = ftp_wei
1547 self.EXP_CODE = exp_code
1547 self.EXP_CODE = exp_code
1548 self.SUB_EXP_CODE = sub_exp_code
1548 self.SUB_EXP_CODE = sub_exp_code
1549 self.PLOT_POS = plot_pos
1549 self.PLOT_POS = plot_pos
1550
1550
1551 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
1551 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
1552 self.isConfig = True
1552 self.isConfig = True
1553 self.figfile = figfile
1553 self.figfile = figfile
1554 self.xdata = numpy.array([])
1554 self.xdata = numpy.array([])
1555 self.ydata = numpy.array([])
1555 self.ydata = numpy.array([])
1556
1556
1557 update_figfile = True
1557 update_figfile = True
1558
1558
1559 #open file beacon phase
1559 #open file beacon phase
1560 path = '%s%03d' %(self.PREFIX, self.id)
1560 path = '%s%03d' %(self.PREFIX, self.id)
1561 beacon_file = os.path.join(path,'%s.txt'%self.name)
1561 beacon_file = os.path.join(path,'%s.txt'%self.name)
1562 self.filename_phase = os.path.join(figpath,beacon_file)
1562 self.filename_phase = os.path.join(figpath,beacon_file)
1563 #self.save_phase(self.filename_phase)
1563 #self.save_phase(self.filename_phase)
1564
1564
1565
1565
1566 #store data beacon phase
1566 #store data beacon phase
1567 #self.save_data(self.filename_phase, phase_beacon, thisDatetime)
1567 #self.save_data(self.filename_phase, phase_beacon, thisDatetime)
1568
1568
1569 self.setWinTitle(title)
1569 self.setWinTitle(title)
1570
1570
1571
1571
1572 title = "Phase Plot %s" %(thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
1572 title = "Phase Plot %s" %(thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
1573
1573
1574 legendlabels = ["Pair (%d,%d)"%(pair[0], pair[1]) for pair in dataOut.pairsList]
1574 legendlabels = ["Pair (%d,%d)"%(pair[0], pair[1]) for pair in dataOut.pairsList]
1575
1575
1576 axes = self.axesList[0]
1576 axes = self.axesList[0]
1577
1577
1578 self.xdata = numpy.hstack((self.xdata, x[0:1]))
1578 self.xdata = numpy.hstack((self.xdata, x[0:1]))
1579
1579
1580 if len(self.ydata)==0:
1580 if len(self.ydata)==0:
1581 self.ydata = phase_beacon.reshape(-1,1)
1581 self.ydata = phase_beacon.reshape(-1,1)
1582 else:
1582 else:
1583 self.ydata = numpy.hstack((self.ydata, phase_beacon.reshape(-1,1)))
1583 self.ydata = numpy.hstack((self.ydata, phase_beacon.reshape(-1,1)))
1584
1584
1585
1585
1586 axes.pmultilineyaxis(x=self.xdata, y=self.ydata,
1586 axes.pmultilineyaxis(x=self.xdata, y=self.ydata,
1587 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax,
1587 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax,
1588 xlabel=xlabel, ylabel=ylabel, title=title, legendlabels=legendlabels, marker='x', markersize=8, linestyle="solid",
1588 xlabel=xlabel, ylabel=ylabel, title=title, legendlabels=legendlabels, marker='x', markersize=8, linestyle="solid",
1589 XAxisAsTime=True, grid='both'
1589 XAxisAsTime=True, grid='both'
1590 )
1590 )
1591
1591
1592 self.draw()
1592 self.draw()
1593
1593
1594 if dataOut.ltctime >= self.xmax:
1594 if dataOut.ltctime >= self.xmax:
1595 self.counter_imagwr = wr_period
1595 self.counter_imagwr = wr_period
1596 self.isConfig = False
1596 self.isConfig = False
1597 update_figfile = True
1597 update_figfile = True
1598
1598
1599 self.save(figpath=figpath,
1599 self.save(figpath=figpath,
1600 figfile=figfile,
1600 figfile=figfile,
1601 save=save,
1601 save=save,
1602 ftp=ftp,
1602 ftp=ftp,
1603 wr_period=wr_period,
1603 wr_period=wr_period,
1604 thisDatetime=thisDatetime,
1604 thisDatetime=thisDatetime,
1605 update_figfile=update_figfile)
1605 update_figfile=update_figfile)
@@ -1,4025 +1,4027
1 import numpy
1 import numpy
2 import math
2 import math
3 from scipy import optimize, interpolate, signal, stats, ndimage
3 from scipy import optimize, interpolate, signal, stats, ndimage
4 import scipy
4 import scipy
5 import re
5 import re
6 import datetime
6 import datetime
7 import copy
7 import copy
8 import sys
8 import sys
9 import importlib
9 import importlib
10 import itertools
10 import itertools
11 from multiprocessing import Pool, TimeoutError
11 from multiprocessing import Pool, TimeoutError
12 from multiprocessing.pool import ThreadPool
12 from multiprocessing.pool import ThreadPool
13
13
14
14
15
15
16 import time
16 import time
17 #from sklearn.cluster import KMeans
17 #from sklearn.cluster import KMeans
18
18
19 import matplotlib.pyplot as plt
19 import matplotlib.pyplot as plt
20
20
21 from scipy.optimize import fmin_l_bfgs_b #optimize with bounds on state papameters
21 from scipy.optimize import fmin_l_bfgs_b #optimize with bounds on state papameters
22 from jroproc_base import ProcessingUnit, Operation
22 from jroproc_base import ProcessingUnit, Operation
23 from schainpy.model.data.jrodata import Parameters, hildebrand_sekhon
23 from schainpy.model.data.jrodata import Parameters, hildebrand_sekhon
24 from scipy import asarray as ar,exp
24 from scipy import asarray as ar,exp
25 from scipy.optimize import curve_fit
25 from scipy.optimize import curve_fit
26
26
27 import warnings
27 import warnings
28 from numpy import NaN
28 from numpy import NaN
29 from scipy.optimize.optimize import OptimizeWarning
29 from scipy.optimize.optimize import OptimizeWarning
30 warnings.filterwarnings('ignore')
30 warnings.filterwarnings('ignore')
31
31
32
32
33 SPEED_OF_LIGHT = 299792458
33 SPEED_OF_LIGHT = 299792458
34
34
35
35
36 '''solving pickling issue'''
36 '''solving pickling issue'''
37
37
38 def _pickle_method(method):
38 def _pickle_method(method):
39 func_name = method.im_func.__name__
39 func_name = method.im_func.__name__
40 obj = method.im_self
40 obj = method.im_self
41 cls = method.im_class
41 cls = method.im_class
42 return _unpickle_method, (func_name, obj, cls)
42 return _unpickle_method, (func_name, obj, cls)
43
43
44 def _unpickle_method(func_name, obj, cls):
44 def _unpickle_method(func_name, obj, cls):
45 for cls in cls.mro():
45 for cls in cls.mro():
46 try:
46 try:
47 func = cls.__dict__[func_name]
47 func = cls.__dict__[func_name]
48 except KeyError:
48 except KeyError:
49 pass
49 pass
50 else:
50 else:
51 break
51 break
52 return func.__get__(obj, cls)
52 return func.__get__(obj, cls)
53
53
54 class ParametersProc(ProcessingUnit):
54 class ParametersProc(ProcessingUnit):
55
55
56 nSeconds = None
56 nSeconds = None
57
57
58 def __init__(self):
58 def __init__(self):
59 ProcessingUnit.__init__(self)
59 ProcessingUnit.__init__(self)
60
60
61 # self.objectDict = {}
61 # self.objectDict = {}
62 self.buffer = None
62 self.buffer = None
63 self.firstdatatime = None
63 self.firstdatatime = None
64 self.profIndex = 0
64 self.profIndex = 0
65 self.dataOut = Parameters()
65 self.dataOut = Parameters()
66
66
67 def __updateObjFromInput(self):
67 def __updateObjFromInput(self):
68
68
69 self.dataOut.inputUnit = self.dataIn.type
69 self.dataOut.inputUnit = self.dataIn.type
70
70
71 self.dataOut.timeZone = self.dataIn.timeZone
71 self.dataOut.timeZone = self.dataIn.timeZone
72 self.dataOut.dstFlag = self.dataIn.dstFlag
72 self.dataOut.dstFlag = self.dataIn.dstFlag
73 self.dataOut.errorCount = self.dataIn.errorCount
73 self.dataOut.errorCount = self.dataIn.errorCount
74 self.dataOut.useLocalTime = self.dataIn.useLocalTime
74 self.dataOut.useLocalTime = self.dataIn.useLocalTime
75
75
76 self.dataOut.radarControllerHeaderObj = self.dataIn.radarControllerHeaderObj.copy()
76 self.dataOut.radarControllerHeaderObj = self.dataIn.radarControllerHeaderObj.copy()
77 self.dataOut.systemHeaderObj = self.dataIn.systemHeaderObj.copy()
77 self.dataOut.systemHeaderObj = self.dataIn.systemHeaderObj.copy()
78 self.dataOut.channelList = self.dataIn.channelList
78 self.dataOut.channelList = self.dataIn.channelList
79 self.dataOut.heightList = self.dataIn.heightList
79 self.dataOut.heightList = self.dataIn.heightList
80 self.dataOut.dtype = numpy.dtype([('real','<f4'),('imag','<f4')])
80 self.dataOut.dtype = numpy.dtype([('real','<f4'),('imag','<f4')])
81 # self.dataOut.nHeights = self.dataIn.nHeights
81 # self.dataOut.nHeights = self.dataIn.nHeights
82 # self.dataOut.nChannels = self.dataIn.nChannels
82 # self.dataOut.nChannels = self.dataIn.nChannels
83 self.dataOut.nBaud = self.dataIn.nBaud
83 self.dataOut.nBaud = self.dataIn.nBaud
84 self.dataOut.nCode = self.dataIn.nCode
84 self.dataOut.nCode = self.dataIn.nCode
85 self.dataOut.code = self.dataIn.code
85 self.dataOut.code = self.dataIn.code
86 # self.dataOut.nProfiles = self.dataOut.nFFTPoints
86 # self.dataOut.nProfiles = self.dataOut.nFFTPoints
87 self.dataOut.flagDiscontinuousBlock = self.dataIn.flagDiscontinuousBlock
87 self.dataOut.flagDiscontinuousBlock = self.dataIn.flagDiscontinuousBlock
88 # self.dataOut.utctime = self.firstdatatime
88 # self.dataOut.utctime = self.firstdatatime
89 self.dataOut.utctime = self.dataIn.utctime
89 self.dataOut.utctime = self.dataIn.utctime
90 self.dataOut.flagDecodeData = self.dataIn.flagDecodeData #asumo q la data esta decodificada
90 self.dataOut.flagDecodeData = self.dataIn.flagDecodeData #asumo q la data esta decodificada
91 self.dataOut.flagDeflipData = self.dataIn.flagDeflipData #asumo q la data esta sin flip
91 self.dataOut.flagDeflipData = self.dataIn.flagDeflipData #asumo q la data esta sin flip
92 self.dataOut.nCohInt = self.dataIn.nCohInt
92 self.dataOut.nCohInt = self.dataIn.nCohInt
93 # self.dataOut.nIncohInt = 1
93 # self.dataOut.nIncohInt = 1
94 self.dataOut.ippSeconds = self.dataIn.ippSeconds
94 self.dataOut.ippSeconds = self.dataIn.ippSeconds
95 # self.dataOut.windowOfFilter = self.dataIn.windowOfFilter
95 # self.dataOut.windowOfFilter = self.dataIn.windowOfFilter
96 self.dataOut.timeInterval1 = self.dataIn.timeInterval
96 self.dataOut.timeInterval1 = self.dataIn.timeInterval
97 self.dataOut.heightList = self.dataIn.getHeiRange()
97 self.dataOut.heightList = self.dataIn.getHeiRange()
98 self.dataOut.frequency = self.dataIn.frequency
98 self.dataOut.frequency = self.dataIn.frequency
99 self.dataOut.noise = self.dataIn.noise
99 self.dataOut.noise = self.dataIn.noise
100
100
101
101
102
102
103 def run(self):
103 def run(self):
104
104
105 #---------------------- Voltage Data ---------------------------
105 #---------------------- Voltage Data ---------------------------
106
106
107 if self.dataIn.type == "Voltage":
107 if self.dataIn.type == "Voltage":
108
108
109 self.__updateObjFromInput()
109 self.__updateObjFromInput()
110 self.dataOut.data_pre = self.dataIn.data.copy()
110 self.dataOut.data_pre = self.dataIn.data.copy()
111 self.dataOut.flagNoData = False
111 self.dataOut.flagNoData = False
112 self.dataOut.utctimeInit = self.dataIn.utctime
112 self.dataOut.utctimeInit = self.dataIn.utctime
113 self.dataOut.paramInterval = self.dataIn.nProfiles*self.dataIn.nCohInt*self.dataIn.ippSeconds
113 self.dataOut.paramInterval = self.dataIn.nProfiles*self.dataIn.nCohInt*self.dataIn.ippSeconds
114 return
114 return
115
115
116 #---------------------- Spectra Data ---------------------------
116 #---------------------- Spectra Data ---------------------------
117
117
118 if self.dataIn.type == "Spectra":
118 if self.dataIn.type == "Spectra":
119
119
120 self.dataOut.data_pre = (self.dataIn.data_spc , self.dataIn.data_cspc)
120 self.dataOut.data_pre = (self.dataIn.data_spc , self.dataIn.data_cspc)
121 print 'self.dataIn.data_spc', self.dataIn.data_spc.shape
121 print 'self.dataIn.data_spc', self.dataIn.data_spc.shape
122 self.dataOut.abscissaList = self.dataIn.getVelRange(1)
122 self.dataOut.abscissaList = self.dataIn.getVelRange(1)
123 self.dataOut.spc_noise = self.dataIn.getNoise()
123 self.dataOut.spc_noise = self.dataIn.getNoise()
124 self.dataOut.spc_range = numpy.asanyarray((self.dataIn.getFreqRange(1) , self.dataIn.getAcfRange(1) , self.dataIn.getVelRange(1) ))
124 self.dataOut.spc_range = numpy.asanyarray((self.dataIn.getFreqRange(1) , self.dataIn.getAcfRange(1) , self.dataIn.getVelRange(1) ))
125
125
126 self.dataOut.normFactor = self.dataIn.normFactor
126 self.dataOut.normFactor = self.dataIn.normFactor
127 #self.dataOut.outputInterval = self.dataIn.outputInterval
127 #self.dataOut.outputInterval = self.dataIn.outputInterval
128 self.dataOut.groupList = self.dataIn.pairsList
128 self.dataOut.groupList = self.dataIn.pairsList
129 self.dataOut.flagNoData = False
129 self.dataOut.flagNoData = False
130 #print 'datain chandist ',self.dataIn.ChanDist
130 #print 'datain chandist ',self.dataIn.ChanDist
131 if hasattr(self.dataIn, 'ChanDist'): #Distances of receiver channels
131 if hasattr(self.dataIn, 'ChanDist'): #Distances of receiver channels
132 self.dataOut.ChanDist = self.dataIn.ChanDist
132 self.dataOut.ChanDist = self.dataIn.ChanDist
133 else: self.dataOut.ChanDist = None
133 else: self.dataOut.ChanDist = None
134
134
135 print 'datain chandist ',self.dataOut.ChanDist
135 print 'datain chandist ',self.dataOut.ChanDist
136
136
137 #if hasattr(self.dataIn, 'VelRange'): #Velocities range
137 #if hasattr(self.dataIn, 'VelRange'): #Velocities range
138 # self.dataOut.VelRange = self.dataIn.VelRange
138 # self.dataOut.VelRange = self.dataIn.VelRange
139 #else: self.dataOut.VelRange = None
139 #else: self.dataOut.VelRange = None
140
140
141 if hasattr(self.dataIn, 'RadarConst'): #Radar Constant
141 if hasattr(self.dataIn, 'RadarConst'): #Radar Constant
142 self.dataOut.RadarConst = self.dataIn.RadarConst
142 self.dataOut.RadarConst = self.dataIn.RadarConst
143
143
144 if hasattr(self.dataIn, 'NPW'): #NPW
144 if hasattr(self.dataIn, 'NPW'): #NPW
145 self.dataOut.NPW = self.dataIn.NPW
145 self.dataOut.NPW = self.dataIn.NPW
146
146
147 if hasattr(self.dataIn, 'COFA'): #COFA
147 if hasattr(self.dataIn, 'COFA'): #COFA
148 self.dataOut.COFA = self.dataIn.COFA
148 self.dataOut.COFA = self.dataIn.COFA
149
149
150
150
151
151
152 #---------------------- Correlation Data ---------------------------
152 #---------------------- Correlation Data ---------------------------
153
153
154 if self.dataIn.type == "Correlation":
154 if self.dataIn.type == "Correlation":
155 acf_ind, ccf_ind, acf_pairs, ccf_pairs, data_acf, data_ccf = self.dataIn.splitFunctions()
155 acf_ind, ccf_ind, acf_pairs, ccf_pairs, data_acf, data_ccf = self.dataIn.splitFunctions()
156
156
157 self.dataOut.data_pre = (self.dataIn.data_cf[acf_ind,:], self.dataIn.data_cf[ccf_ind,:,:])
157 self.dataOut.data_pre = (self.dataIn.data_cf[acf_ind,:], self.dataIn.data_cf[ccf_ind,:,:])
158 self.dataOut.normFactor = (self.dataIn.normFactor[acf_ind,:], self.dataIn.normFactor[ccf_ind,:])
158 self.dataOut.normFactor = (self.dataIn.normFactor[acf_ind,:], self.dataIn.normFactor[ccf_ind,:])
159 self.dataOut.groupList = (acf_pairs, ccf_pairs)
159 self.dataOut.groupList = (acf_pairs, ccf_pairs)
160
160
161 self.dataOut.abscissaList = self.dataIn.lagRange
161 self.dataOut.abscissaList = self.dataIn.lagRange
162 self.dataOut.noise = self.dataIn.noise
162 self.dataOut.noise = self.dataIn.noise
163 self.dataOut.data_SNR = self.dataIn.SNR
163 self.dataOut.data_SNR = self.dataIn.SNR
164 self.dataOut.flagNoData = False
164 self.dataOut.flagNoData = False
165 self.dataOut.nAvg = self.dataIn.nAvg
165 self.dataOut.nAvg = self.dataIn.nAvg
166
166
167 #---------------------- Parameters Data ---------------------------
167 #---------------------- Parameters Data ---------------------------
168
168
169 if self.dataIn.type == "Parameters":
169 if self.dataIn.type == "Parameters":
170 self.dataOut.copy(self.dataIn)
170 self.dataOut.copy(self.dataIn)
171 self.dataOut.flagNoData = False
171 self.dataOut.flagNoData = False
172
172
173 return True
173 return True
174
174
175 self.__updateObjFromInput()
175 self.__updateObjFromInput()
176 self.dataOut.utctimeInit = self.dataIn.utctime
176 self.dataOut.utctimeInit = self.dataIn.utctime
177 self.dataOut.paramInterval = self.dataIn.timeInterval
177 self.dataOut.paramInterval = self.dataIn.timeInterval
178
178
179 return
179 return
180
180
181
181
182 def target(tups):
182 def target(tups):
183
183
184 obj, args = tups
184 obj, args = tups
185 #print 'TARGETTT', obj, args
185 #print 'TARGETTT', obj, args
186 return obj.FitGau(args)
186 return obj.FitGau(args)
187
187
188
188
189 class SpectralFilters(Operation):
189 class SpectralFilters(Operation):
190
190
191 '''This class allows the Rainfall / Wind Selection for CLAIRE RADAR
191 '''This class allows the Rainfall / Wind Selection for CLAIRE RADAR
192
192
193 LimitR : It is the limit in m/s of Rainfall
193 LimitR : It is the limit in m/s of Rainfall
194 LimitW : It is the limit in m/s for Winds
194 LimitW : It is the limit in m/s for Winds
195
195
196 Input:
196 Input:
197
197
198 self.dataOut.data_pre : SPC and CSPC
198 self.dataOut.data_pre : SPC and CSPC
199 self.dataOut.spc_range : To select wind and rainfall velocities
199 self.dataOut.spc_range : To select wind and rainfall velocities
200
200
201 Affected:
201 Affected:
202
202
203 self.dataOut.data_pre : It is used for the new SPC and CSPC ranges of wind
203 self.dataOut.data_pre : It is used for the new SPC and CSPC ranges of wind
204 self.dataOut.spcparam_range : Used in SpcParamPlot
204 self.dataOut.spcparam_range : Used in SpcParamPlot
205 self.dataOut.SPCparam : Used in PrecipitationProc
205 self.dataOut.SPCparam : Used in PrecipitationProc
206
206
207
207
208 '''
208 '''
209
209
210 def __init__(self, **kwargs):
210 def __init__(self, **kwargs):
211 Operation.__init__(self, **kwargs)
211 Operation.__init__(self, **kwargs)
212 self.i=0
212 self.i=0
213
213
214 def run(self, dataOut, PositiveLimit=1.5, NegativeLimit=2.5):
214 def run(self, dataOut, PositiveLimit=1.5, NegativeLimit=2.5):
215
215
216
216
217 #Limite de vientos
217 #Limite de vientos
218 LimitR = PositiveLimit
218 LimitR = PositiveLimit
219 LimitN = NegativeLimit
219 LimitN = NegativeLimit
220
220
221 self.spc = dataOut.data_pre[0].copy()
221 self.spc = dataOut.data_pre[0].copy()
222 self.cspc = dataOut.data_pre[1].copy()
222 self.cspc = dataOut.data_pre[1].copy()
223
223
224 self.Num_Hei = self.spc.shape[2]
224 self.Num_Hei = self.spc.shape[2]
225 self.Num_Bin = self.spc.shape[1]
225 self.Num_Bin = self.spc.shape[1]
226 self.Num_Chn = self.spc.shape[0]
226 self.Num_Chn = self.spc.shape[0]
227
227
228 VelRange = dataOut.spc_range[2]
228 VelRange = dataOut.spc_range[2]
229 TimeRange = dataOut.spc_range[1]
229 TimeRange = dataOut.spc_range[1]
230 FrecRange = dataOut.spc_range[0]
230 FrecRange = dataOut.spc_range[0]
231
231
232 Vmax= 2*numpy.max(dataOut.spc_range[2])
232 Vmax= 2*numpy.max(dataOut.spc_range[2])
233 Tmax= 2*numpy.max(dataOut.spc_range[1])
233 Tmax= 2*numpy.max(dataOut.spc_range[1])
234 Fmax= 2*numpy.max(dataOut.spc_range[0])
234 Fmax= 2*numpy.max(dataOut.spc_range[0])
235
235
236 Breaker1R=VelRange[numpy.abs(VelRange-(-LimitN)).argmin()]
236 Breaker1R=VelRange[numpy.abs(VelRange-(-LimitN)).argmin()]
237 Breaker1R=numpy.where(VelRange == Breaker1R)
237 Breaker1R=numpy.where(VelRange == Breaker1R)
238
238
239 Delta = self.Num_Bin/2 - Breaker1R[0]
239 Delta = self.Num_Bin/2 - Breaker1R[0]
240
240
241 #Breaker1W=VelRange[numpy.abs(VelRange-(-LimitW)).argmin()]
241 #Breaker1W=VelRange[numpy.abs(VelRange-(-LimitW)).argmin()]
242 #Breaker1W=numpy.where(VelRange == Breaker1W)
242 #Breaker1W=numpy.where(VelRange == Breaker1W)
243
243
244 #Breaker2W=VelRange[numpy.abs(VelRange-(LimitW)).argmin()]
244 #Breaker2W=VelRange[numpy.abs(VelRange-(LimitW)).argmin()]
245 #Breaker2W=numpy.where(VelRange == Breaker2W)
245 #Breaker2W=numpy.where(VelRange == Breaker2W)
246
246
247
247
248 '''Reacomodando SPCrange'''
248 '''Reacomodando SPCrange'''
249
249
250 VelRange=numpy.roll(VelRange,-(self.Num_Bin/2) ,axis=0)
250 VelRange=numpy.roll(VelRange,-(self.Num_Bin/2) ,axis=0)
251
251
252 VelRange[-(self.Num_Bin/2):]+= Vmax
252 VelRange[-(self.Num_Bin/2):]+= Vmax
253
253
254 FrecRange=numpy.roll(FrecRange,-(self.Num_Bin/2),axis=0)
254 FrecRange=numpy.roll(FrecRange,-(self.Num_Bin/2),axis=0)
255
255
256 FrecRange[-(self.Num_Bin/2):]+= Fmax
256 FrecRange[-(self.Num_Bin/2):]+= Fmax
257
257
258 TimeRange=numpy.roll(TimeRange,-(self.Num_Bin/2),axis=0)
258 TimeRange=numpy.roll(TimeRange,-(self.Num_Bin/2),axis=0)
259
259
260 TimeRange[-(self.Num_Bin/2):]+= Tmax
260 TimeRange[-(self.Num_Bin/2):]+= Tmax
261
261
262 ''' ------------------ '''
262 ''' ------------------ '''
263
263
264 Breaker2R=VelRange[numpy.abs(VelRange-(LimitR)).argmin()]
264 Breaker2R=VelRange[numpy.abs(VelRange-(LimitR)).argmin()]
265 Breaker2R=numpy.where(VelRange == Breaker2R)
265 Breaker2R=numpy.where(VelRange == Breaker2R)
266
266
267
267
268 SPCroll = numpy.roll(self.spc,-(self.Num_Bin/2) ,axis=1)
268 SPCroll = numpy.roll(self.spc,-(self.Num_Bin/2) ,axis=1)
269
269
270 SPCcut = SPCroll.copy()
270 SPCcut = SPCroll.copy()
271 for i in range(self.Num_Chn):
271 for i in range(self.Num_Chn):
272
272
273 SPCcut[i,0:int(Breaker2R[0]),:] = dataOut.noise[i]
273 SPCcut[i,0:int(Breaker2R[0]),:] = dataOut.noise[i]
274 SPCcut[i,-int(Delta):,:] = dataOut.noise[i]
274 SPCcut[i,-int(Delta):,:] = dataOut.noise[i]
275
275
276 SPCcut[i]=SPCcut[i]- dataOut.noise[i]
276 SPCcut[i]=SPCcut[i]- dataOut.noise[i]
277 SPCcut[ numpy.where( SPCcut<0 ) ] = 1e-20
277 SPCcut[ numpy.where( SPCcut<0 ) ] = 1e-20
278
278
279 SPCroll[i]=SPCroll[i]-dataOut.noise[i]
279 SPCroll[i]=SPCroll[i]-dataOut.noise[i]
280 SPCroll[ numpy.where( SPCroll<0 ) ] = 1e-20
280 SPCroll[ numpy.where( SPCroll<0 ) ] = 1e-20
281
281
282 #self.spc[i, 0:int(Breaker1W[0]) ,:] = dataOut.noise[i]
282 #self.spc[i, 0:int(Breaker1W[0]) ,:] = dataOut.noise[i]
283 #self.spc[i, int(Breaker2W[0]):self.Num_Bin ,:] = dataOut.noise[i]
283 #self.spc[i, int(Breaker2W[0]):self.Num_Bin ,:] = dataOut.noise[i]
284
284
285 #self.cspc[i, 0:int(Breaker1W[0]) ,:] = dataOut.noise[i]
285 #self.cspc[i, 0:int(Breaker1W[0]) ,:] = dataOut.noise[i]
286 #self.cspc[i, int(Breaker2W[0]):self.Num_Bin ,:] = dataOut.noise[i]
286 #self.cspc[i, int(Breaker2W[0]):self.Num_Bin ,:] = dataOut.noise[i]
287
287
288
288
289
289
290
290
291
291
292 SPC_ch1 = SPCroll
292 SPC_ch1 = SPCroll
293
293
294 SPC_ch2 = SPCcut
294 SPC_ch2 = SPCcut
295
295
296 SPCparam = (SPC_ch1, SPC_ch2, self.spc)
296 SPCparam = (SPC_ch1, SPC_ch2, self.spc)
297 dataOut.SPCparam = numpy.asarray(SPCparam)
297 dataOut.SPCparam = numpy.asarray(SPCparam)
298
298
299 #dataOut.data_pre= (self.spc , self.cspc)
299 #dataOut.data_pre= (self.spc , self.cspc)
300
300
301 #dataOut.data_preParam = (self.spc , self.cspc)
301 #dataOut.data_preParam = (self.spc , self.cspc)
302
302
303 dataOut.spcparam_range=numpy.zeros([self.Num_Chn,self.Num_Bin+1])
303 dataOut.spcparam_range=numpy.zeros([self.Num_Chn,self.Num_Bin+1])
304
304
305 dataOut.spcparam_range[2]=VelRange
305 dataOut.spcparam_range[2]=VelRange
306 dataOut.spcparam_range[1]=TimeRange
306 dataOut.spcparam_range[1]=TimeRange
307 dataOut.spcparam_range[0]=FrecRange
307 dataOut.spcparam_range[0]=FrecRange
308
308
309
309
310
310
311
311
312 class GaussianFit(Operation):
312 class GaussianFit(Operation):
313
313
314 '''
314 '''
315 Function that fit of one and two generalized gaussians (gg) based
315 Function that fit of one and two generalized gaussians (gg) based
316 on the PSD shape across an "power band" identified from a cumsum of
316 on the PSD shape across an "power band" identified from a cumsum of
317 the measured spectrum - noise.
317 the measured spectrum - noise.
318
318
319 Input:
319 Input:
320 self.dataOut.data_pre : SelfSpectra
320 self.dataOut.data_pre : SelfSpectra
321
321
322 Output:
322 Output:
323 self.dataOut.SPCparam : SPC_ch1, SPC_ch2
323 self.dataOut.SPCparam : SPC_ch1, SPC_ch2
324
324
325 '''
325 '''
326 def __init__(self, **kwargs):
326 def __init__(self, **kwargs):
327 Operation.__init__(self, **kwargs)
327 Operation.__init__(self, **kwargs)
328 self.i=0
328 self.i=0
329
329
330
330
331 def run(self, dataOut, num_intg=7, pnoise=1., SNRlimit=-9): #num_intg: Incoherent integrations, pnoise: Noise, vel_arr: range of velocities, similar to the ftt points
331 def run(self, dataOut, num_intg=7, pnoise=1., SNRlimit=-9): #num_intg: Incoherent integrations, pnoise: Noise, vel_arr: range of velocities, similar to the ftt points
332 """This routine will find a couple of generalized Gaussians to a power spectrum
332 """This routine will find a couple of generalized Gaussians to a power spectrum
333 input: spc
333 input: spc
334 output:
334 output:
335 Amplitude0,shift0,width0,p0,Amplitude1,shift1,width1,p1,noise
335 Amplitude0,shift0,width0,p0,Amplitude1,shift1,width1,p1,noise
336 """
336 """
337
337
338 self.spc = dataOut.data_pre[0].copy()
338 self.spc = dataOut.data_pre[0].copy()
339
339
340
340
341 print 'SelfSpectra Shape', numpy.asarray(self.spc).shape
341 print 'SelfSpectra Shape', numpy.asarray(self.spc).shape
342
342
343
343
344 #plt.figure(50)
344 #plt.figure(50)
345 #plt.subplot(121)
345 #plt.subplot(121)
346 #plt.plot(self.spc,'k',label='spc(66)')
346 #plt.plot(self.spc,'k',label='spc(66)')
347 #plt.plot(xFrec,ySamples[1],'g',label='Ch1')
347 #plt.plot(xFrec,ySamples[1],'g',label='Ch1')
348 #plt.plot(xFrec,ySamples[2],'r',label='Ch2')
348 #plt.plot(xFrec,ySamples[2],'r',label='Ch2')
349 #plt.plot(xFrec,FitGauss,'yo:',label='fit')
349 #plt.plot(xFrec,FitGauss,'yo:',label='fit')
350 #plt.legend()
350 #plt.legend()
351 #plt.title('DATOS A ALTURA DE 7500 METROS')
351 #plt.title('DATOS A ALTURA DE 7500 METROS')
352 #plt.show()
352 #plt.show()
353
353
354 self.Num_Hei = self.spc.shape[2]
354 self.Num_Hei = self.spc.shape[2]
355 #self.Num_Bin = len(self.spc)
355 #self.Num_Bin = len(self.spc)
356 self.Num_Bin = self.spc.shape[1]
356 self.Num_Bin = self.spc.shape[1]
357 self.Num_Chn = self.spc.shape[0]
357 self.Num_Chn = self.spc.shape[0]
358 Vrange = dataOut.abscissaList
358 Vrange = dataOut.abscissaList
359
359
360 GauSPC = numpy.empty([self.Num_Chn,self.Num_Bin,self.Num_Hei])
360 GauSPC = numpy.empty([self.Num_Chn,self.Num_Bin,self.Num_Hei])
361 SPC_ch1 = numpy.empty([self.Num_Bin,self.Num_Hei])
361 SPC_ch1 = numpy.empty([self.Num_Bin,self.Num_Hei])
362 SPC_ch2 = numpy.empty([self.Num_Bin,self.Num_Hei])
362 SPC_ch2 = numpy.empty([self.Num_Bin,self.Num_Hei])
363 SPC_ch1[:] = numpy.NaN
363 SPC_ch1[:] = numpy.NaN
364 SPC_ch2[:] = numpy.NaN
364 SPC_ch2[:] = numpy.NaN
365
365
366
366
367 start_time = time.time()
367 start_time = time.time()
368
368
369 noise_ = dataOut.spc_noise[0].copy()
369 noise_ = dataOut.spc_noise[0].copy()
370
370
371
371
372 pool = Pool(processes=self.Num_Chn)
372 pool = Pool(processes=self.Num_Chn)
373 args = [(Vrange, Ch, pnoise, noise_, num_intg, SNRlimit) for Ch in range(self.Num_Chn)]
373 args = [(Vrange, Ch, pnoise, noise_, num_intg, SNRlimit) for Ch in range(self.Num_Chn)]
374 objs = [self for __ in range(self.Num_Chn)]
374 objs = [self for __ in range(self.Num_Chn)]
375 attrs = zip(objs, args)
375 attrs = zip(objs, args)
376 gauSPC = pool.map(target, attrs)
376 gauSPC = pool.map(target, attrs)
377 dataOut.SPCparam = numpy.asarray(SPCparam)
377 dataOut.SPCparam = numpy.asarray(SPCparam)
378
378
379
379
380
380
381 print '========================================================'
381 print '========================================================'
382 print 'total_time: ', time.time()-start_time
382 print 'total_time: ', time.time()-start_time
383
383
384 # re-normalizing spc and noise
384 # re-normalizing spc and noise
385 # This part differs from gg1
385 # This part differs from gg1
386
386
387
387
388
388
389 ''' Parameters:
389 ''' Parameters:
390 1. Amplitude
390 1. Amplitude
391 2. Shift
391 2. Shift
392 3. Width
392 3. Width
393 4. Power
393 4. Power
394 '''
394 '''
395
395
396
396
397 ###############################################################################
397 ###############################################################################
398 def FitGau(self, X):
398 def FitGau(self, X):
399
399
400 Vrange, ch, pnoise, noise_, num_intg, SNRlimit = X
400 Vrange, ch, pnoise, noise_, num_intg, SNRlimit = X
401 #print 'VARSSSS', ch, pnoise, noise, num_intg
401 #print 'VARSSSS', ch, pnoise, noise, num_intg
402
402
403 #print 'HEIGHTS', self.Num_Hei
403 #print 'HEIGHTS', self.Num_Hei
404
404
405 SPCparam = []
405 SPCparam = []
406 SPC_ch1 = numpy.empty([self.Num_Bin,self.Num_Hei])
406 SPC_ch1 = numpy.empty([self.Num_Bin,self.Num_Hei])
407 SPC_ch2 = numpy.empty([self.Num_Bin,self.Num_Hei])
407 SPC_ch2 = numpy.empty([self.Num_Bin,self.Num_Hei])
408 SPC_ch1[:] = 0#numpy.NaN
408 SPC_ch1[:] = 0#numpy.NaN
409 SPC_ch2[:] = 0#numpy.NaN
409 SPC_ch2[:] = 0#numpy.NaN
410
410
411
411
412
412
413 for ht in range(self.Num_Hei):
413 for ht in range(self.Num_Hei):
414 #print (numpy.asarray(self.spc).shape)
414 #print (numpy.asarray(self.spc).shape)
415
415
416 #print 'TTTTT', ch , ht
416 #print 'TTTTT', ch , ht
417 #print self.spc.shape
417 #print self.spc.shape
418
418
419
419
420 spc = numpy.asarray(self.spc)[ch,:,ht]
420 spc = numpy.asarray(self.spc)[ch,:,ht]
421
421
422 #############################################
422 #############################################
423 # normalizing spc and noise
423 # normalizing spc and noise
424 # This part differs from gg1
424 # This part differs from gg1
425 spc_norm_max = max(spc)
425 spc_norm_max = max(spc)
426 #spc = spc / spc_norm_max
426 #spc = spc / spc_norm_max
427 pnoise = pnoise #/ spc_norm_max
427 pnoise = pnoise #/ spc_norm_max
428 #############################################
428 #############################################
429
429
430 fatspectra=1.0
430 fatspectra=1.0
431
431
432 wnoise = noise_ #/ spc_norm_max
432 wnoise = noise_ #/ spc_norm_max
433 #wnoise,stdv,i_max,index =enoise(spc,num_intg) #noise estimate using Hildebrand Sekhon, only wnoise is used
433 #wnoise,stdv,i_max,index =enoise(spc,num_intg) #noise estimate using Hildebrand Sekhon, only wnoise is used
434 #if wnoise>1.1*pnoise: # to be tested later
434 #if wnoise>1.1*pnoise: # to be tested later
435 # wnoise=pnoise
435 # wnoise=pnoise
436 noisebl=wnoise*0.9;
436 noisebl=wnoise*0.9;
437 noisebh=wnoise*1.1
437 noisebh=wnoise*1.1
438 spc=spc-wnoise
438 spc=spc-wnoise
439 # print 'wnoise', noise_[0], spc_norm_max, wnoise
439 # print 'wnoise', noise_[0], spc_norm_max, wnoise
440 minx=numpy.argmin(spc)
440 minx=numpy.argmin(spc)
441 #spcs=spc.copy()
441 #spcs=spc.copy()
442 spcs=numpy.roll(spc,-minx)
442 spcs=numpy.roll(spc,-minx)
443 cum=numpy.cumsum(spcs)
443 cum=numpy.cumsum(spcs)
444 tot_noise=wnoise * self.Num_Bin #64;
444 tot_noise=wnoise * self.Num_Bin #64;
445 #print 'spc' , spcs[5:8] , 'tot_noise', tot_noise
445 #print 'spc' , spcs[5:8] , 'tot_noise', tot_noise
446 #tot_signal=sum(cum[-5:])/5.; ''' How does this line work? '''
446 #tot_signal=sum(cum[-5:])/5.; ''' How does this line work? '''
447 #snr=tot_signal/tot_noise
447 #snr=tot_signal/tot_noise
448 #snr=cum[-1]/tot_noise
448 #snr=cum[-1]/tot_noise
449 snr = sum(spcs)/tot_noise
449 snr = sum(spcs)/tot_noise
450 snrdB=10.*numpy.log10(snr)
450 snrdB=10.*numpy.log10(snr)
451
451
452 if snrdB < SNRlimit :
452 if snrdB < SNRlimit :
453 snr = numpy.NaN
453 snr = numpy.NaN
454 SPC_ch1[:,ht] = 0#numpy.NaN
454 SPC_ch1[:,ht] = 0#numpy.NaN
455 SPC_ch1[:,ht] = 0#numpy.NaN
455 SPC_ch1[:,ht] = 0#numpy.NaN
456 SPCparam = (SPC_ch1,SPC_ch2)
456 SPCparam = (SPC_ch1,SPC_ch2)
457 continue
457 continue
458 #print 'snr',snrdB #, sum(spcs) , tot_noise
458 #print 'snr',snrdB #, sum(spcs) , tot_noise
459
459
460
460
461
461
462 #if snrdB<-18 or numpy.isnan(snrdB) or num_intg<4:
462 #if snrdB<-18 or numpy.isnan(snrdB) or num_intg<4:
463 # return [None,]*4,[None,]*4,None,snrdB,None,None,[None,]*5,[None,]*9,None
463 # return [None,]*4,[None,]*4,None,snrdB,None,None,[None,]*5,[None,]*9,None
464
464
465 cummax=max(cum);
465 cummax=max(cum);
466 epsi=0.08*fatspectra # cumsum to narrow down the energy region
466 epsi=0.08*fatspectra # cumsum to narrow down the energy region
467 cumlo=cummax*epsi;
467 cumlo=cummax*epsi;
468 cumhi=cummax*(1-epsi)
468 cumhi=cummax*(1-epsi)
469 powerindex=numpy.array(numpy.where(numpy.logical_and(cum>cumlo, cum<cumhi))[0])
469 powerindex=numpy.array(numpy.where(numpy.logical_and(cum>cumlo, cum<cumhi))[0])
470
470
471
471
472 if len(powerindex) < 1:# case for powerindex 0
472 if len(powerindex) < 1:# case for powerindex 0
473 continue
473 continue
474 powerlo=powerindex[0]
474 powerlo=powerindex[0]
475 powerhi=powerindex[-1]
475 powerhi=powerindex[-1]
476 powerwidth=powerhi-powerlo
476 powerwidth=powerhi-powerlo
477
477
478 firstpeak=powerlo+powerwidth/10.# first gaussian energy location
478 firstpeak=powerlo+powerwidth/10.# first gaussian energy location
479 secondpeak=powerhi-powerwidth/10.#second gaussian energy location
479 secondpeak=powerhi-powerwidth/10.#second gaussian energy location
480 midpeak=(firstpeak+secondpeak)/2.
480 midpeak=(firstpeak+secondpeak)/2.
481 firstamp=spcs[int(firstpeak)]
481 firstamp=spcs[int(firstpeak)]
482 secondamp=spcs[int(secondpeak)]
482 secondamp=spcs[int(secondpeak)]
483 midamp=spcs[int(midpeak)]
483 midamp=spcs[int(midpeak)]
484
484
485 x=numpy.arange( self.Num_Bin )
485 x=numpy.arange( self.Num_Bin )
486 y_data=spc+wnoise
486 y_data=spc+wnoise
487
487
488 ''' single Gaussian '''
488 ''' single Gaussian '''
489 shift0=numpy.mod(midpeak+minx, self.Num_Bin )
489 shift0=numpy.mod(midpeak+minx, self.Num_Bin )
490 width0=powerwidth/4.#Initialization entire power of spectrum divided by 4
490 width0=powerwidth/4.#Initialization entire power of spectrum divided by 4
491 power0=2.
491 power0=2.
492 amplitude0=midamp
492 amplitude0=midamp
493 state0=[shift0,width0,amplitude0,power0,wnoise]
493 state0=[shift0,width0,amplitude0,power0,wnoise]
494 bnds=(( 0,(self.Num_Bin-1) ),(1,powerwidth),(0,None),(0.5,3.),(noisebl,noisebh))
494 bnds=(( 0,(self.Num_Bin-1) ),(1,powerwidth),(0,None),(0.5,3.),(noisebl,noisebh))
495 lsq1=fmin_l_bfgs_b(self.misfit1,state0,args=(y_data,x,num_intg),bounds=bnds,approx_grad=True)
495 lsq1=fmin_l_bfgs_b(self.misfit1,state0,args=(y_data,x,num_intg),bounds=bnds,approx_grad=True)
496
496
497 chiSq1=lsq1[1];
497 chiSq1=lsq1[1];
498
498
499
499
500 if fatspectra<1.0 and powerwidth<4:
500 if fatspectra<1.0 and powerwidth<4:
501 choice=0
501 choice=0
502 Amplitude0=lsq1[0][2]
502 Amplitude0=lsq1[0][2]
503 shift0=lsq1[0][0]
503 shift0=lsq1[0][0]
504 width0=lsq1[0][1]
504 width0=lsq1[0][1]
505 p0=lsq1[0][3]
505 p0=lsq1[0][3]
506 Amplitude1=0.
506 Amplitude1=0.
507 shift1=0.
507 shift1=0.
508 width1=0.
508 width1=0.
509 p1=0.
509 p1=0.
510 noise=lsq1[0][4]
510 noise=lsq1[0][4]
511 #return (numpy.array([shift0,width0,Amplitude0,p0]),
511 #return (numpy.array([shift0,width0,Amplitude0,p0]),
512 # numpy.array([shift1,width1,Amplitude1,p1]),noise,snrdB,chiSq1,6.,sigmas1,[None,]*9,choice)
512 # numpy.array([shift1,width1,Amplitude1,p1]),noise,snrdB,chiSq1,6.,sigmas1,[None,]*9,choice)
513
513
514 ''' two gaussians '''
514 ''' two gaussians '''
515 #shift0=numpy.mod(firstpeak+minx,64); shift1=numpy.mod(secondpeak+minx,64)
515 #shift0=numpy.mod(firstpeak+minx,64); shift1=numpy.mod(secondpeak+minx,64)
516 shift0=numpy.mod(firstpeak+minx, self.Num_Bin );
516 shift0=numpy.mod(firstpeak+minx, self.Num_Bin );
517 shift1=numpy.mod(secondpeak+minx, self.Num_Bin )
517 shift1=numpy.mod(secondpeak+minx, self.Num_Bin )
518 width0=powerwidth/6.;
518 width0=powerwidth/6.;
519 width1=width0
519 width1=width0
520 power0=2.;
520 power0=2.;
521 power1=power0
521 power1=power0
522 amplitude0=firstamp;
522 amplitude0=firstamp;
523 amplitude1=secondamp
523 amplitude1=secondamp
524 state0=[shift0,width0,amplitude0,power0,shift1,width1,amplitude1,power1,wnoise]
524 state0=[shift0,width0,amplitude0,power0,shift1,width1,amplitude1,power1,wnoise]
525 #bnds=((0,63),(1,powerwidth/2.),(0,None),(0.5,3.),(0,63),(1,powerwidth/2.),(0,None),(0.5,3.),(noisebl,noisebh))
525 #bnds=((0,63),(1,powerwidth/2.),(0,None),(0.5,3.),(0,63),(1,powerwidth/2.),(0,None),(0.5,3.),(noisebl,noisebh))
526 bnds=(( 0,(self.Num_Bin-1) ),(1,powerwidth/2.),(0,None),(0.5,3.),( 0,(self.Num_Bin-1)),(1,powerwidth/2.),(0,None),(0.5,3.),(noisebl,noisebh))
526 bnds=(( 0,(self.Num_Bin-1) ),(1,powerwidth/2.),(0,None),(0.5,3.),( 0,(self.Num_Bin-1)),(1,powerwidth/2.),(0,None),(0.5,3.),(noisebl,noisebh))
527 #bnds=(( 0,(self.Num_Bin-1) ),(1,powerwidth/2.),(0,None),(0.5,3.),( 0,(self.Num_Bin-1)),(1,powerwidth/2.),(0,None),(0.5,3.),(0.1,0.5))
527 #bnds=(( 0,(self.Num_Bin-1) ),(1,powerwidth/2.),(0,None),(0.5,3.),( 0,(self.Num_Bin-1)),(1,powerwidth/2.),(0,None),(0.5,3.),(0.1,0.5))
528
528
529 lsq2 = fmin_l_bfgs_b( self.misfit2 , state0 , args=(y_data,x,num_intg) , bounds=bnds , approx_grad=True )
529 lsq2 = fmin_l_bfgs_b( self.misfit2 , state0 , args=(y_data,x,num_intg) , bounds=bnds , approx_grad=True )
530
530
531
531
532 chiSq2=lsq2[1];
532 chiSq2=lsq2[1];
533
533
534
534
535
535
536 oneG=(chiSq1<5 and chiSq1/chiSq2<2.0) and (abs(lsq2[0][0]-lsq2[0][4])<(lsq2[0][1]+lsq2[0][5])/3. or abs(lsq2[0][0]-lsq2[0][4])<10)
536 oneG=(chiSq1<5 and chiSq1/chiSq2<2.0) and (abs(lsq2[0][0]-lsq2[0][4])<(lsq2[0][1]+lsq2[0][5])/3. or abs(lsq2[0][0]-lsq2[0][4])<10)
537
537
538 if snrdB>-12: # when SNR is strong pick the peak with least shift (LOS velocity) error
538 if snrdB>-12: # when SNR is strong pick the peak with least shift (LOS velocity) error
539 if oneG:
539 if oneG:
540 choice=0
540 choice=0
541 else:
541 else:
542 w1=lsq2[0][1]; w2=lsq2[0][5]
542 w1=lsq2[0][1]; w2=lsq2[0][5]
543 a1=lsq2[0][2]; a2=lsq2[0][6]
543 a1=lsq2[0][2]; a2=lsq2[0][6]
544 p1=lsq2[0][3]; p2=lsq2[0][7]
544 p1=lsq2[0][3]; p2=lsq2[0][7]
545 s1=(2**(1+1./p1))*scipy.special.gamma(1./p1)/p1;
545 s1=(2**(1+1./p1))*scipy.special.gamma(1./p1)/p1;
546 s2=(2**(1+1./p2))*scipy.special.gamma(1./p2)/p2;
546 s2=(2**(1+1./p2))*scipy.special.gamma(1./p2)/p2;
547 gp1=a1*w1*s1; gp2=a2*w2*s2 # power content of each ggaussian with proper p scaling
547 gp1=a1*w1*s1; gp2=a2*w2*s2 # power content of each ggaussian with proper p scaling
548
548
549 if gp1>gp2:
549 if gp1>gp2:
550 if a1>0.7*a2:
550 if a1>0.7*a2:
551 choice=1
551 choice=1
552 else:
552 else:
553 choice=2
553 choice=2
554 elif gp2>gp1:
554 elif gp2>gp1:
555 if a2>0.7*a1:
555 if a2>0.7*a1:
556 choice=2
556 choice=2
557 else:
557 else:
558 choice=1
558 choice=1
559 else:
559 else:
560 choice=numpy.argmax([a1,a2])+1
560 choice=numpy.argmax([a1,a2])+1
561 #else:
561 #else:
562 #choice=argmin([std2a,std2b])+1
562 #choice=argmin([std2a,std2b])+1
563
563
564 else: # with low SNR go to the most energetic peak
564 else: # with low SNR go to the most energetic peak
565 choice=numpy.argmax([lsq1[0][2]*lsq1[0][1],lsq2[0][2]*lsq2[0][1],lsq2[0][6]*lsq2[0][5]])
565 choice=numpy.argmax([lsq1[0][2]*lsq1[0][1],lsq2[0][2]*lsq2[0][1],lsq2[0][6]*lsq2[0][5]])
566
566
567
567
568 shift0=lsq2[0][0];
568 shift0=lsq2[0][0];
569 vel0=Vrange[0] + shift0*(Vrange[1]-Vrange[0])
569 vel0=Vrange[0] + shift0*(Vrange[1]-Vrange[0])
570 shift1=lsq2[0][4];
570 shift1=lsq2[0][4];
571 vel1=Vrange[0] + shift1*(Vrange[1]-Vrange[0])
571 vel1=Vrange[0] + shift1*(Vrange[1]-Vrange[0])
572
572
573 max_vel = 1.0
573 max_vel = 1.0
574
574
575 #first peak will be 0, second peak will be 1
575 #first peak will be 0, second peak will be 1
576 if vel0 > -1.0 and vel0 < max_vel : #first peak is in the correct range
576 if vel0 > -1.0 and vel0 < max_vel : #first peak is in the correct range
577 shift0=lsq2[0][0]
577 shift0=lsq2[0][0]
578 width0=lsq2[0][1]
578 width0=lsq2[0][1]
579 Amplitude0=lsq2[0][2]
579 Amplitude0=lsq2[0][2]
580 p0=lsq2[0][3]
580 p0=lsq2[0][3]
581
581
582 shift1=lsq2[0][4]
582 shift1=lsq2[0][4]
583 width1=lsq2[0][5]
583 width1=lsq2[0][5]
584 Amplitude1=lsq2[0][6]
584 Amplitude1=lsq2[0][6]
585 p1=lsq2[0][7]
585 p1=lsq2[0][7]
586 noise=lsq2[0][8]
586 noise=lsq2[0][8]
587 else:
587 else:
588 shift1=lsq2[0][0]
588 shift1=lsq2[0][0]
589 width1=lsq2[0][1]
589 width1=lsq2[0][1]
590 Amplitude1=lsq2[0][2]
590 Amplitude1=lsq2[0][2]
591 p1=lsq2[0][3]
591 p1=lsq2[0][3]
592
592
593 shift0=lsq2[0][4]
593 shift0=lsq2[0][4]
594 width0=lsq2[0][5]
594 width0=lsq2[0][5]
595 Amplitude0=lsq2[0][6]
595 Amplitude0=lsq2[0][6]
596 p0=lsq2[0][7]
596 p0=lsq2[0][7]
597 noise=lsq2[0][8]
597 noise=lsq2[0][8]
598
598
599 if Amplitude0<0.05: # in case the peak is noise
599 if Amplitude0<0.05: # in case the peak is noise
600 shift0,width0,Amplitude0,p0 = [0,0,0,0]#4*[numpy.NaN]
600 shift0,width0,Amplitude0,p0 = [0,0,0,0]#4*[numpy.NaN]
601 if Amplitude1<0.05:
601 if Amplitude1<0.05:
602 shift1,width1,Amplitude1,p1 = [0,0,0,0]#4*[numpy.NaN]
602 shift1,width1,Amplitude1,p1 = [0,0,0,0]#4*[numpy.NaN]
603
603
604
604
605 # if choice==0: # pick the single gaussian fit
605 # if choice==0: # pick the single gaussian fit
606 # Amplitude0=lsq1[0][2]
606 # Amplitude0=lsq1[0][2]
607 # shift0=lsq1[0][0]
607 # shift0=lsq1[0][0]
608 # width0=lsq1[0][1]
608 # width0=lsq1[0][1]
609 # p0=lsq1[0][3]
609 # p0=lsq1[0][3]
610 # Amplitude1=0.
610 # Amplitude1=0.
611 # shift1=0.
611 # shift1=0.
612 # width1=0.
612 # width1=0.
613 # p1=0.
613 # p1=0.
614 # noise=lsq1[0][4]
614 # noise=lsq1[0][4]
615 # elif choice==1: # take the first one of the 2 gaussians fitted
615 # elif choice==1: # take the first one of the 2 gaussians fitted
616 # Amplitude0 = lsq2[0][2]
616 # Amplitude0 = lsq2[0][2]
617 # shift0 = lsq2[0][0]
617 # shift0 = lsq2[0][0]
618 # width0 = lsq2[0][1]
618 # width0 = lsq2[0][1]
619 # p0 = lsq2[0][3]
619 # p0 = lsq2[0][3]
620 # Amplitude1 = lsq2[0][6] # This is 0 in gg1
620 # Amplitude1 = lsq2[0][6] # This is 0 in gg1
621 # shift1 = lsq2[0][4] # This is 0 in gg1
621 # shift1 = lsq2[0][4] # This is 0 in gg1
622 # width1 = lsq2[0][5] # This is 0 in gg1
622 # width1 = lsq2[0][5] # This is 0 in gg1
623 # p1 = lsq2[0][7] # This is 0 in gg1
623 # p1 = lsq2[0][7] # This is 0 in gg1
624 # noise = lsq2[0][8]
624 # noise = lsq2[0][8]
625 # else: # the second one
625 # else: # the second one
626 # Amplitude0 = lsq2[0][6]
626 # Amplitude0 = lsq2[0][6]
627 # shift0 = lsq2[0][4]
627 # shift0 = lsq2[0][4]
628 # width0 = lsq2[0][5]
628 # width0 = lsq2[0][5]
629 # p0 = lsq2[0][7]
629 # p0 = lsq2[0][7]
630 # Amplitude1 = lsq2[0][2] # This is 0 in gg1
630 # Amplitude1 = lsq2[0][2] # This is 0 in gg1
631 # shift1 = lsq2[0][0] # This is 0 in gg1
631 # shift1 = lsq2[0][0] # This is 0 in gg1
632 # width1 = lsq2[0][1] # This is 0 in gg1
632 # width1 = lsq2[0][1] # This is 0 in gg1
633 # p1 = lsq2[0][3] # This is 0 in gg1
633 # p1 = lsq2[0][3] # This is 0 in gg1
634 # noise = lsq2[0][8]
634 # noise = lsq2[0][8]
635
635
636 #print len(noise + Amplitude0*numpy.exp(-0.5*(abs(x-shift0))/width0)**p0)
636 #print len(noise + Amplitude0*numpy.exp(-0.5*(abs(x-shift0))/width0)**p0)
637 SPC_ch1[:,ht] = noise + Amplitude0*numpy.exp(-0.5*(abs(x-shift0))/width0)**p0
637 SPC_ch1[:,ht] = noise + Amplitude0*numpy.exp(-0.5*(abs(x-shift0))/width0)**p0
638 SPC_ch2[:,ht] = noise + Amplitude1*numpy.exp(-0.5*(abs(x-shift1))/width1)**p1
638 SPC_ch2[:,ht] = noise + Amplitude1*numpy.exp(-0.5*(abs(x-shift1))/width1)**p1
639 #print 'SPC_ch1.shape',SPC_ch1.shape
639 #print 'SPC_ch1.shape',SPC_ch1.shape
640 #print 'SPC_ch2.shape',SPC_ch2.shape
640 #print 'SPC_ch2.shape',SPC_ch2.shape
641 #dataOut.data_param = SPC_ch1
641 #dataOut.data_param = SPC_ch1
642 SPCparam = (SPC_ch1,SPC_ch2)
642 SPCparam = (SPC_ch1,SPC_ch2)
643 #GauSPC[1] = SPC_ch2
643 #GauSPC[1] = SPC_ch2
644
644
645 # print 'shift0', shift0
645 # print 'shift0', shift0
646 # print 'Amplitude0', Amplitude0
646 # print 'Amplitude0', Amplitude0
647 # print 'width0', width0
647 # print 'width0', width0
648 # print 'p0', p0
648 # print 'p0', p0
649 # print '========================'
649 # print '========================'
650 # print 'shift1', shift1
650 # print 'shift1', shift1
651 # print 'Amplitude1', Amplitude1
651 # print 'Amplitude1', Amplitude1
652 # print 'width1', width1
652 # print 'width1', width1
653 # print 'p1', p1
653 # print 'p1', p1
654 # print 'noise', noise
654 # print 'noise', noise
655 # print 's_noise', wnoise
655 # print 's_noise', wnoise
656
656
657 return GauSPC
657 return GauSPC
658
658
659 def y_model1(self,x,state):
659 def y_model1(self,x,state):
660 shift0,width0,amplitude0,power0,noise=state
660 shift0,width0,amplitude0,power0,noise=state
661 model0=amplitude0*numpy.exp(-0.5*abs((x-shift0)/width0)**power0)
661 model0=amplitude0*numpy.exp(-0.5*abs((x-shift0)/width0)**power0)
662
662
663 model0u=amplitude0*numpy.exp(-0.5*abs((x-shift0- self.Num_Bin )/width0)**power0)
663 model0u=amplitude0*numpy.exp(-0.5*abs((x-shift0- self.Num_Bin )/width0)**power0)
664
664
665 model0d=amplitude0*numpy.exp(-0.5*abs((x-shift0+ self.Num_Bin )/width0)**power0)
665 model0d=amplitude0*numpy.exp(-0.5*abs((x-shift0+ self.Num_Bin )/width0)**power0)
666 return model0+model0u+model0d+noise
666 return model0+model0u+model0d+noise
667
667
668 def y_model2(self,x,state): #Equation for two generalized Gaussians with Nyquist
668 def y_model2(self,x,state): #Equation for two generalized Gaussians with Nyquist
669 shift0,width0,amplitude0,power0,shift1,width1,amplitude1,power1,noise=state
669 shift0,width0,amplitude0,power0,shift1,width1,amplitude1,power1,noise=state
670 model0=amplitude0*numpy.exp(-0.5*abs((x-shift0)/width0)**power0)
670 model0=amplitude0*numpy.exp(-0.5*abs((x-shift0)/width0)**power0)
671
671
672 model0u=amplitude0*numpy.exp(-0.5*abs((x-shift0- self.Num_Bin )/width0)**power0)
672 model0u=amplitude0*numpy.exp(-0.5*abs((x-shift0- self.Num_Bin )/width0)**power0)
673
673
674 model0d=amplitude0*numpy.exp(-0.5*abs((x-shift0+ self.Num_Bin )/width0)**power0)
674 model0d=amplitude0*numpy.exp(-0.5*abs((x-shift0+ self.Num_Bin )/width0)**power0)
675 model1=amplitude1*numpy.exp(-0.5*abs((x-shift1)/width1)**power1)
675 model1=amplitude1*numpy.exp(-0.5*abs((x-shift1)/width1)**power1)
676
676
677 model1u=amplitude1*numpy.exp(-0.5*abs((x-shift1- self.Num_Bin )/width1)**power1)
677 model1u=amplitude1*numpy.exp(-0.5*abs((x-shift1- self.Num_Bin )/width1)**power1)
678
678
679 model1d=amplitude1*numpy.exp(-0.5*abs((x-shift1+ self.Num_Bin )/width1)**power1)
679 model1d=amplitude1*numpy.exp(-0.5*abs((x-shift1+ self.Num_Bin )/width1)**power1)
680 return model0+model0u+model0d+model1+model1u+model1d+noise
680 return model0+model0u+model0d+model1+model1u+model1d+noise
681
681
682 def misfit1(self,state,y_data,x,num_intg): # This function compares how close real data is with the model data, the close it is, the better it is.
682 def misfit1(self,state,y_data,x,num_intg): # This function compares how close real data is with the model data, the close it is, the better it is.
683
683
684 return num_intg*sum((numpy.log(y_data)-numpy.log(self.y_model1(x,state)))**2)#/(64-5.) # /(64-5.) can be commented
684 return num_intg*sum((numpy.log(y_data)-numpy.log(self.y_model1(x,state)))**2)#/(64-5.) # /(64-5.) can be commented
685
685
686 def misfit2(self,state,y_data,x,num_intg):
686 def misfit2(self,state,y_data,x,num_intg):
687 return num_intg*sum((numpy.log(y_data)-numpy.log(self.y_model2(x,state)))**2)#/(64-9.)
687 return num_intg*sum((numpy.log(y_data)-numpy.log(self.y_model2(x,state)))**2)#/(64-9.)
688
688
689
689
690
690
691 class PrecipitationProc(Operation):
691 class PrecipitationProc(Operation):
692
692
693 '''
693 '''
694 Operator that estimates Reflectivity factor (Z), and estimates rainfall Rate (R)
694 Operator that estimates Reflectivity factor (Z), and estimates rainfall Rate (R)
695
695
696 Input:
696 Input:
697 self.dataOut.data_pre : SelfSpectra
697 self.dataOut.data_pre : SelfSpectra
698
698
699 Output:
699 Output:
700
700
701 self.dataOut.data_output : Reflectivity factor, rainfall Rate
701 self.dataOut.data_output : Reflectivity factor, rainfall Rate
702
702
703
703
704 Parameters affected:
704 Parameters affected:
705 '''
705 '''
706 def gaus(self,xSamples,Amp,Mu,Sigma):
706 def gaus(self,xSamples,Amp,Mu,Sigma):
707 return ( Amp / ((2*numpy.pi)**0.5 * Sigma) ) * numpy.exp( -( xSamples - Mu )**2 / ( 2 * (Sigma**2) ))
707 return ( Amp / ((2*numpy.pi)**0.5 * Sigma) ) * numpy.exp( -( xSamples - Mu )**2 / ( 2 * (Sigma**2) ))
708
708
709
709
710
710
711 def Moments(self, ySamples, xSamples):
711 def Moments(self, ySamples, xSamples):
712 Pot = numpy.nansum( ySamples ) # Potencia, momento 0
712 Pot = numpy.nansum( ySamples ) # Potencia, momento 0
713 yNorm = ySamples / Pot
713 yNorm = ySamples / Pot
714
714
715 Vr = numpy.nansum( yNorm * xSamples ) # Velocidad radial, mu, corrimiento doppler, primer momento
715 Vr = numpy.nansum( yNorm * xSamples ) # Velocidad radial, mu, corrimiento doppler, primer momento
716 Sigma2 = abs(numpy.nansum( yNorm * ( xSamples - Vr )**2 )) # Segundo Momento
716 Sigma2 = abs(numpy.nansum( yNorm * ( xSamples - Vr )**2 )) # Segundo Momento
717 Desv = Sigma2**0.5 # Desv. Estandar, Ancho espectral
717 Desv = Sigma2**0.5 # Desv. Estandar, Ancho espectral
718
718
719 return numpy.array([Pot, Vr, Desv])
719 return numpy.array([Pot, Vr, Desv])
720
720
721 def run(self, dataOut, radar=None, Pt=5000, Gt=295.1209, Gr=70.7945, Lambda=0.6741, aL=2.5118,
721 def run(self, dataOut, radar=None, Pt=5000, Gt=295.1209, Gr=70.7945, Lambda=0.6741, aL=2.5118,
722 tauW=4e-06, ThetaT=0.1656317, ThetaR=0.36774087, Km = 0.93, Altitude=3350):
722 tauW=4e-06, ThetaT=0.1656317, ThetaR=0.36774087, Km = 0.93, Altitude=3350):
723
723
724
724
725 Velrange = dataOut.spcparam_range[2]
725 Velrange = dataOut.spcparam_range[2]
726 FrecRange = dataOut.spcparam_range[0]
726 FrecRange = dataOut.spcparam_range[0]
727
727
728 dV= Velrange[1]-Velrange[0]
728 dV= Velrange[1]-Velrange[0]
729 dF= FrecRange[1]-FrecRange[0]
729 dF= FrecRange[1]-FrecRange[0]
730
730
731 if radar == "MIRA35C" :
731 if radar == "MIRA35C" :
732
732
733 self.spc = dataOut.data_pre[0].copy()
733 self.spc = dataOut.data_pre[0].copy()
734 self.Num_Hei = self.spc.shape[2]
734 self.Num_Hei = self.spc.shape[2]
735 self.Num_Bin = self.spc.shape[1]
735 self.Num_Bin = self.spc.shape[1]
736 self.Num_Chn = self.spc.shape[0]
736 self.Num_Chn = self.spc.shape[0]
737 Ze = self.dBZeMODE2(dataOut)
737 Ze = self.dBZeMODE2(dataOut)
738
738
739 else:
739 else:
740
740
741 self.spc = dataOut.SPCparam[1].copy() #dataOut.data_pre[0].copy() #
741 self.spc = dataOut.SPCparam[1].copy() #dataOut.data_pre[0].copy() #
742 self.Num_Hei = self.spc.shape[2]
742 self.Num_Hei = self.spc.shape[2]
743 self.Num_Bin = self.spc.shape[1]
743 self.Num_Bin = self.spc.shape[1]
744 self.Num_Chn = self.spc.shape[0]
744 self.Num_Chn = self.spc.shape[0]
745 print '==================== SPC SHAPE',numpy.shape(self.spc)
745 print '==================== SPC SHAPE',numpy.shape(self.spc)
746
746
747
747
748 ''' Se obtiene la constante del RADAR '''
748 ''' Se obtiene la constante del RADAR '''
749
749
750 self.Pt = Pt
750 self.Pt = Pt
751 self.Gt = Gt
751 self.Gt = Gt
752 self.Gr = Gr
752 self.Gr = Gr
753 self.Lambda = Lambda
753 self.Lambda = Lambda
754 self.aL = aL
754 self.aL = aL
755 self.tauW = tauW
755 self.tauW = tauW
756 self.ThetaT = ThetaT
756 self.ThetaT = ThetaT
757 self.ThetaR = ThetaR
757 self.ThetaR = ThetaR
758
758
759 Numerator = ( (4*numpy.pi)**3 * aL**2 * 16 * numpy.log(2) )
759 Numerator = ( (4*numpy.pi)**3 * aL**2 * 16 * numpy.log(2) )
760 Denominator = ( Pt * Gt * Gr * Lambda**2 * SPEED_OF_LIGHT * tauW * numpy.pi * ThetaT * ThetaR)
760 Denominator = ( Pt * Gt * Gr * Lambda**2 * SPEED_OF_LIGHT * tauW * numpy.pi * ThetaT * ThetaR)
761 RadarConstant = 5e-27 * Numerator / Denominator #
761 RadarConstant = 5e-27 * Numerator / Denominator #
762 print '***'
762 print '***'
763 print '*** RadarConstant' , RadarConstant, '****'
763 print '*** RadarConstant' , RadarConstant, '****'
764 print '***'
764 print '***'
765 ''' ============================= '''
765 ''' ============================= '''
766
766
767 self.spc[0] = (self.spc[0]-dataOut.noise[0])
767 self.spc[0] = (self.spc[0]-dataOut.noise[0])
768 self.spc[1] = (self.spc[1]-dataOut.noise[1])
768 self.spc[1] = (self.spc[1]-dataOut.noise[1])
769 self.spc[2] = (self.spc[2]-dataOut.noise[2])
769 self.spc[2] = (self.spc[2]-dataOut.noise[2])
770
770
771 self.spc[ numpy.where(self.spc < 0)] = 0
771 self.spc[ numpy.where(self.spc < 0)] = 0
772
772
773 SPCmean = (numpy.mean(self.spc,0) - numpy.mean(dataOut.noise))
773 SPCmean = (numpy.mean(self.spc,0) - numpy.mean(dataOut.noise))
774 SPCmean[ numpy.where(SPCmean < 0)] = 0
774 SPCmean[ numpy.where(SPCmean < 0)] = 0
775
775
776 ETAn = numpy.zeros([self.Num_Bin,self.Num_Hei])
776 ETAn = numpy.zeros([self.Num_Bin,self.Num_Hei])
777 ETAv = numpy.zeros([self.Num_Bin,self.Num_Hei])
777 ETAv = numpy.zeros([self.Num_Bin,self.Num_Hei])
778 ETAd = numpy.zeros([self.Num_Bin,self.Num_Hei])
778 ETAd = numpy.zeros([self.Num_Bin,self.Num_Hei])
779
779
780 Pr = SPCmean[:,:]
780 Pr = SPCmean[:,:]
781
781
782 VelMeteoro = numpy.mean(SPCmean,axis=0)
782 VelMeteoro = numpy.mean(SPCmean,axis=0)
783
783
784 #print '==================== Vel SHAPE',VelMeteoro
784 #print '==================== Vel SHAPE',VelMeteoro
785
785
786 D_range = numpy.zeros([self.Num_Bin,self.Num_Hei])
786 D_range = numpy.zeros([self.Num_Bin,self.Num_Hei])
787 SIGMA = numpy.zeros([self.Num_Bin,self.Num_Hei])
787 SIGMA = numpy.zeros([self.Num_Bin,self.Num_Hei])
788 N_dist = numpy.zeros([self.Num_Bin,self.Num_Hei])
788 N_dist = numpy.zeros([self.Num_Bin,self.Num_Hei])
789 V_mean = numpy.zeros(self.Num_Hei)
789 V_mean = numpy.zeros(self.Num_Hei)
790 del_V = numpy.zeros(self.Num_Hei)
790 del_V = numpy.zeros(self.Num_Hei)
791 Z = numpy.zeros(self.Num_Hei)
791 Z = numpy.zeros(self.Num_Hei)
792 Ze = numpy.zeros(self.Num_Hei)
792 Ze = numpy.zeros(self.Num_Hei)
793 RR = numpy.zeros(self.Num_Hei)
793 RR = numpy.zeros(self.Num_Hei)
794
794
795 Range = dataOut.heightList*1000.
795 Range = dataOut.heightList*1000.
796
796
797 for R in range(self.Num_Hei):
797 for R in range(self.Num_Hei):
798
798
799 h = Range[R] + Altitude #Range from ground to radar pulse altitude
799 h = Range[R] + Altitude #Range from ground to radar pulse altitude
800 del_V[R] = 1 + 3.68 * 10**-5 * h + 1.71 * 10**-9 * h**2 #Density change correction for velocity
800 del_V[R] = 1 + 3.68 * 10**-5 * h + 1.71 * 10**-9 * h**2 #Density change correction for velocity
801
801
802 D_range[:,R] = numpy.log( (9.65 - (Velrange[0:self.Num_Bin] / del_V[R])) / 10.3 ) / -0.6 #Diameter range [m]x10**-3
802 D_range[:,R] = numpy.log( (9.65 - (Velrange[0:self.Num_Bin] / del_V[R])) / 10.3 ) / -0.6 #Diameter range [m]x10**-3
803
803
804 '''NOTA: ETA(n) dn = ETA(f) df
804 '''NOTA: ETA(n) dn = ETA(f) df
805
805
806 dn = 1 Diferencial de muestreo
806 dn = 1 Diferencial de muestreo
807 df = ETA(n) / ETA(f)
807 df = ETA(n) / ETA(f)
808
808
809 '''
809 '''
810
810
811 ETAn[:,R] = RadarConstant * Pr[:,R] * (Range[R] )**2 #Reflectivity (ETA)
811 ETAn[:,R] = RadarConstant * Pr[:,R] * (Range[R] )**2 #Reflectivity (ETA)
812
812
813 ETAv[:,R]=ETAn[:,R]/dV
813 ETAv[:,R]=ETAn[:,R]/dV
814
814
815 ETAd[:,R]=ETAv[:,R]*6.18*exp(-0.6*D_range[:,R])
815 ETAd[:,R]=ETAv[:,R]*6.18*exp(-0.6*D_range[:,R])
816
816
817 SIGMA[:,R] = Km * (D_range[:,R] * 1e-3 )**6 * numpy.pi**5 / Lambda**4 #Equivalent Section of drops (sigma)
817 SIGMA[:,R] = Km * (D_range[:,R] * 1e-3 )**6 * numpy.pi**5 / Lambda**4 #Equivalent Section of drops (sigma)
818
818
819 N_dist[:,R] = ETAn[:,R] / SIGMA[:,R]
819 N_dist[:,R] = ETAn[:,R] / SIGMA[:,R]
820
820
821 DMoments = self.Moments(Pr[:,R], Velrange[0:self.Num_Bin])
821 DMoments = self.Moments(Pr[:,R], Velrange[0:self.Num_Bin])
822
822
823 try:
823 try:
824 popt01,pcov = curve_fit(self.gaus, Velrange[0:self.Num_Bin] , Pr[:,R] , p0=DMoments)
824 popt01,pcov = curve_fit(self.gaus, Velrange[0:self.Num_Bin] , Pr[:,R] , p0=DMoments)
825 except:
825 except:
826 popt01=numpy.zeros(3)
826 popt01=numpy.zeros(3)
827 popt01[1]= DMoments[1]
827 popt01[1]= DMoments[1]
828
828 if popt01[1]<0 or popt01[1]>20:
829 if popt01[1]<0 or popt01[1]>20:
829 popt01[1]=numpy.NaN
830 popt01[1]=numpy.NaN
830
831
832
831 V_mean[R]=popt01[1]
833 V_mean[R]=popt01[1]
832
834
833 Z[R] = numpy.nansum( N_dist[:,R] * (D_range[:,R])**6 )#*10**-18
835 Z[R] = numpy.nansum( N_dist[:,R] * (D_range[:,R])**6 )#*10**-18
834
836
835 RR[R] = 0.0006*numpy.pi * numpy.nansum( D_range[:,R]**3 * N_dist[:,R] * Velrange[0:self.Num_Bin] ) #Rainfall rate
837 RR[R] = 0.0006*numpy.pi * numpy.nansum( D_range[:,R]**3 * N_dist[:,R] * Velrange[0:self.Num_Bin] ) #Rainfall rate
836
838
837 Ze[R] = (numpy.nansum( ETAn[:,R]) * Lambda**4) / ( 10**-18*numpy.pi**5 * Km)
839 Ze[R] = (numpy.nansum( ETAn[:,R]) * Lambda**4) / ( 10**-18*numpy.pi**5 * Km)
838
840
839
841
840
842
841 RR2 = (Z/200)**(1/1.6)
843 RR2 = (Z/200)**(1/1.6)
842 dBRR = 10*numpy.log10(RR)
844 dBRR = 10*numpy.log10(RR)
843 dBRR2 = 10*numpy.log10(RR2)
845 dBRR2 = 10*numpy.log10(RR2)
844
846
845 dBZe = 10*numpy.log10(Ze)
847 dBZe = 10*numpy.log10(Ze)
846 dBZ = 10*numpy.log10(Z)
848 dBZ = 10*numpy.log10(Z)
847
849
848 dataOut.data_output = Z
850 dataOut.data_output = Z
849 dataOut.data_param = numpy.ones([3,self.Num_Hei])
851 dataOut.data_param = numpy.ones([3,self.Num_Hei])
850 dataOut.channelList = [0,1,2]
852 dataOut.channelList = [0,1,2]
851
853
852 dataOut.data_param[0]=dBZ
854 dataOut.data_param[0]=dBZ
853 dataOut.data_param[1]=V_mean
855 dataOut.data_param[1]=V_mean
854 dataOut.data_param[2]=RR
856 dataOut.data_param[2]=RR
855
857
856 #print 'VELRANGE', Velrange
858 #print 'VELRANGE', Velrange
857 #print 'Range', len(Range)
859 #print 'Range', len(Range)
858 #print 'delv',del_V
860 #print 'delv',del_V
859 # print 'DRANGE', D_range[:,56]
861 # print 'DRANGE', D_range[:,56]
860 # #print 'NOISE', dataOut.noise[0], 10*numpy.log10(dataOut.noise[0])
862 # #print 'NOISE', dataOut.noise[0], 10*numpy.log10(dataOut.noise[0])
861 # print 'radarconstant', RadarConstant
863 # print 'radarconstant', RadarConstant
862 # #print 'ETAn SHAPE', ETAn.shape
864 # #print 'ETAn SHAPE', ETAn.shape
863 # # print 'ETAn ', numpy.nansum(ETAn, axis=0)
865 # # print 'ETAn ', numpy.nansum(ETAn, axis=0)
864 # # print 'ETAd ', numpy.nansum(ETAd, axis=0)
866 # # print 'ETAd ', numpy.nansum(ETAd, axis=0)
865 # print 'Pr ', numpy.nansum(Pr, axis=0)
867 # print 'Pr ', numpy.nansum(Pr, axis=0)
866 # print 'dataOut.SPCparam[1]', numpy.nansum(dataOut.SPCparam[1][0], axis=0)
868 # print 'dataOut.SPCparam[1]', numpy.nansum(dataOut.SPCparam[1][0], axis=0)
867 # print 'Ze ', dBZe
869 # print 'Ze ', dBZe
868 print 'Z ', dBZ
870 print 'Z ', dBZ
869 # print 'Ndist',N_dist[:,56]
871 # print 'Ndist',N_dist[:,56]
870 print 'RR2 ', RR2
872 print 'RR2 ', RR2
871 print 'RR ', RR
873 print 'RR ', RR
872 print 'Vr', V_mean
874 print 'Vr', V_mean
873 #print 'RR2 ', dBRR2
875 #print 'RR2 ', dBRR2
874 #print 'D_mean', D_mean
876 #print 'D_mean', D_mean
875 #print 'del_V', del_V
877 #print 'del_V', del_V
876 #print 'D_range',D_range.shape, D_range[:,30]
878 #print 'D_range',D_range.shape, D_range[:,30]
877 #print 'Velrange', Velrange
879 #print 'Velrange', Velrange
878 #print 'numpy.nansum( N_dist[:,R]', numpy.nansum( N_dist, axis=0)
880 #print 'numpy.nansum( N_dist[:,R]', numpy.nansum( N_dist, axis=0)
879 #print 'dataOut.data_param SHAPE', dataOut.data_param.shape
881 #print 'dataOut.data_param SHAPE', dataOut.data_param.shape
880
882
881
883
882 def dBZeMODE2(self, dataOut): # Processing for MIRA35C
884 def dBZeMODE2(self, dataOut): # Processing for MIRA35C
883
885
884 NPW = dataOut.NPW
886 NPW = dataOut.NPW
885 COFA = dataOut.COFA
887 COFA = dataOut.COFA
886
888
887 SNR = numpy.array([self.spc[0,:,:] / NPW[0]]) #, self.spc[1,:,:] / NPW[1]])
889 SNR = numpy.array([self.spc[0,:,:] / NPW[0]]) #, self.spc[1,:,:] / NPW[1]])
888 RadarConst = dataOut.RadarConst
890 RadarConst = dataOut.RadarConst
889 #frequency = 34.85*10**9
891 #frequency = 34.85*10**9
890
892
891 ETA = numpy.zeros(([self.Num_Chn ,self.Num_Hei]))
893 ETA = numpy.zeros(([self.Num_Chn ,self.Num_Hei]))
892 data_output = numpy.ones([self.Num_Chn , self.Num_Hei])*numpy.NaN
894 data_output = numpy.ones([self.Num_Chn , self.Num_Hei])*numpy.NaN
893
895
894 ETA = numpy.sum(SNR,1)
896 ETA = numpy.sum(SNR,1)
895 print 'ETA' , ETA
897 print 'ETA' , ETA
896 ETA = numpy.where(ETA is not 0. , ETA, numpy.NaN)
898 ETA = numpy.where(ETA is not 0. , ETA, numpy.NaN)
897
899
898 Ze = numpy.ones([self.Num_Chn, self.Num_Hei] )
900 Ze = numpy.ones([self.Num_Chn, self.Num_Hei] )
899
901
900 for r in range(self.Num_Hei):
902 for r in range(self.Num_Hei):
901
903
902 Ze[0,r] = ( ETA[0,r] ) * COFA[0,r][0] * RadarConst * ((r/5000.)**2)
904 Ze[0,r] = ( ETA[0,r] ) * COFA[0,r][0] * RadarConst * ((r/5000.)**2)
903 #Ze[1,r] = ( ETA[1,r] ) * COFA[1,r][0] * RadarConst * ((r/5000.)**2)
905 #Ze[1,r] = ( ETA[1,r] ) * COFA[1,r][0] * RadarConst * ((r/5000.)**2)
904
906
905 return Ze
907 return Ze
906
908
907 # def GetRadarConstant(self):
909 # def GetRadarConstant(self):
908 #
910 #
909 # """
911 # """
910 # Constants:
912 # Constants:
911 #
913 #
912 # Pt: Transmission Power dB 5kW 5000
914 # Pt: Transmission Power dB 5kW 5000
913 # Gt: Transmission Gain dB 24.7 dB 295.1209
915 # Gt: Transmission Gain dB 24.7 dB 295.1209
914 # Gr: Reception Gain dB 18.5 dB 70.7945
916 # Gr: Reception Gain dB 18.5 dB 70.7945
915 # Lambda: Wavelenght m 0.6741 m 0.6741
917 # Lambda: Wavelenght m 0.6741 m 0.6741
916 # aL: Attenuation loses dB 4dB 2.5118
918 # aL: Attenuation loses dB 4dB 2.5118
917 # tauW: Width of transmission pulse s 4us 4e-6
919 # tauW: Width of transmission pulse s 4us 4e-6
918 # ThetaT: Transmission antenna bean angle rad 0.1656317 rad 0.1656317
920 # ThetaT: Transmission antenna bean angle rad 0.1656317 rad 0.1656317
919 # ThetaR: Reception antenna beam angle rad 0.36774087 rad 0.36774087
921 # ThetaR: Reception antenna beam angle rad 0.36774087 rad 0.36774087
920 #
922 #
921 # """
923 # """
922 #
924 #
923 # Numerator = ( (4*numpy.pi)**3 * aL**2 * 16 * numpy.log(2) )
925 # Numerator = ( (4*numpy.pi)**3 * aL**2 * 16 * numpy.log(2) )
924 # Denominator = ( Pt * Gt * Gr * Lambda**2 * SPEED_OF_LIGHT * TauW * numpy.pi * ThetaT * TheraR)
926 # Denominator = ( Pt * Gt * Gr * Lambda**2 * SPEED_OF_LIGHT * TauW * numpy.pi * ThetaT * TheraR)
925 # RadarConstant = Numerator / Denominator
927 # RadarConstant = Numerator / Denominator
926 #
928 #
927 # return RadarConstant
929 # return RadarConstant
928
930
929
931
930
932
931 class FullSpectralAnalysis(Operation):
933 class FullSpectralAnalysis(Operation):
932
934
933 """
935 """
934 Function that implements Full Spectral Analisys technique.
936 Function that implements Full Spectral Analisys technique.
935
937
936 Input:
938 Input:
937 self.dataOut.data_pre : SelfSpectra and CrossSPectra data
939 self.dataOut.data_pre : SelfSpectra and CrossSPectra data
938 self.dataOut.groupList : Pairlist of channels
940 self.dataOut.groupList : Pairlist of channels
939 self.dataOut.ChanDist : Physical distance between receivers
941 self.dataOut.ChanDist : Physical distance between receivers
940
942
941
943
942 Output:
944 Output:
943
945
944 self.dataOut.data_output : Zonal wind, Meridional wind and Vertical wind
946 self.dataOut.data_output : Zonal wind, Meridional wind and Vertical wind
945
947
946
948
947 Parameters affected: Winds, height range, SNR
949 Parameters affected: Winds, height range, SNR
948
950
949 """
951 """
950 def run(self, dataOut, E01=None, E02=None, E12=None, N01=None, N02=None, N12=None, SNRlimit=7):
952 def run(self, dataOut, Xi01=None, Xi02=None, Xi12=None, Eta01=None, Eta02=None, Eta12=None, SNRlimit=7):
951
953
952 self.indice=int(numpy.random.rand()*1000)
954 self.indice=int(numpy.random.rand()*1000)
953
955
954 spc = dataOut.data_pre[0].copy()
956 spc = dataOut.data_pre[0].copy()
955 cspc = dataOut.data_pre[1]
957 cspc = dataOut.data_pre[1]
956
958
957 nChannel = spc.shape[0]
959 nChannel = spc.shape[0]
958 nProfiles = spc.shape[1]
960 nProfiles = spc.shape[1]
959 nHeights = spc.shape[2]
961 nHeights = spc.shape[2]
960
962
961 pairsList = dataOut.groupList
963 pairsList = dataOut.groupList
962 if dataOut.ChanDist is not None :
964 if dataOut.ChanDist is not None :
963 ChanDist = dataOut.ChanDist
965 ChanDist = dataOut.ChanDist
964 else:
966 else:
965 ChanDist = numpy.array([[E01, N01],[E02,N02],[E12,N12]])
967 ChanDist = numpy.array([[Xi01, Eta01],[Xi02,Eta02],[Xi12,Eta12]])
966
968
967 FrecRange = dataOut.spc_range[0]
969 FrecRange = dataOut.spc_range[0]
968
970
969 ySamples=numpy.ones([nChannel,nProfiles])
971 ySamples=numpy.ones([nChannel,nProfiles])
970 phase=numpy.ones([nChannel,nProfiles])
972 phase=numpy.ones([nChannel,nProfiles])
971 CSPCSamples=numpy.ones([nChannel,nProfiles],dtype=numpy.complex_)
973 CSPCSamples=numpy.ones([nChannel,nProfiles],dtype=numpy.complex_)
972 coherence=numpy.ones([nChannel,nProfiles])
974 coherence=numpy.ones([nChannel,nProfiles])
973 PhaseSlope=numpy.ones(nChannel)
975 PhaseSlope=numpy.ones(nChannel)
974 PhaseInter=numpy.ones(nChannel)
976 PhaseInter=numpy.ones(nChannel)
975 data_SNR=numpy.zeros([nProfiles])
977 data_SNR=numpy.zeros([nProfiles])
976
978
977 data = dataOut.data_pre
979 data = dataOut.data_pre
978 noise = dataOut.noise
980 noise = dataOut.noise
979
981
980 dataOut.data_SNR = (numpy.mean(spc,axis=1)- noise[0]) / noise[0]
982 dataOut.data_SNR = (numpy.mean(spc,axis=1)- noise[0]) / noise[0]
981
983
982 dataOut.data_SNR[numpy.where( dataOut.data_SNR <0 )] = 1e-20
984 dataOut.data_SNR[numpy.where( dataOut.data_SNR <0 )] = 1e-20
983
985
984
986
985 #FirstMoment = dataOut.moments[0,1,:]#numpy.average(dataOut.data_param[:,1,:],0)
987 #FirstMoment = dataOut.moments[0,1,:]#numpy.average(dataOut.data_param[:,1,:],0)
986 #SecondMoment = numpy.average(dataOut.moments[:,2,:],0)
988 #SecondMoment = numpy.average(dataOut.moments[:,2,:],0)
987
989
988 #SNRdBMean = []
990 #SNRdBMean = []
989
991
990 data_output=numpy.ones([spc.shape[0],spc.shape[2]])*numpy.NaN
992 data_output=numpy.ones([spc.shape[0],spc.shape[2]])*numpy.NaN
991
993
992 velocityX=[]
994 velocityX=[]
993 velocityY=[]
995 velocityY=[]
994 velocityV=[]
996 velocityV=[]
995 PhaseLine=[]
997 PhaseLine=[]
996
998
997 dbSNR = 10*numpy.log10(dataOut.data_SNR)
999 dbSNR = 10*numpy.log10(dataOut.data_SNR)
998 dbSNR = numpy.average(dbSNR,0)
1000 dbSNR = numpy.average(dbSNR,0)
999
1001
1000 for Height in range(nHeights):
1002 for Height in range(nHeights):
1001
1003
1002 [Vzon,Vmer,Vver, GaussCenter, PhaseSlope, FitGaussCSPC]= self.WindEstimation(spc, cspc, pairsList, ChanDist, Height, noise, dataOut.spc_range.copy(), dbSNR[Height], SNRlimit)
1004 [Vzon,Vmer,Vver, GaussCenter, PhaseSlope, FitGaussCSPC]= self.WindEstimation(spc, cspc, pairsList, ChanDist, Height, noise, dataOut.spc_range.copy(), dbSNR[Height], SNRlimit)
1003 PhaseLine = numpy.append(PhaseLine, PhaseSlope)
1005 PhaseLine = numpy.append(PhaseLine, PhaseSlope)
1004
1006
1005 if abs(Vzon)<100. and abs(Vzon)> 0.:
1007 if abs(Vzon)<100. and abs(Vzon)> 0.:
1006 velocityX=numpy.append(velocityX, -Vzon)#Vmag
1008 velocityX=numpy.append(velocityX, Vzon)#Vmag
1007
1009
1008 else:
1010 else:
1009 #print 'Vzon',Vzon
1011 #print 'Vzon',Vzon
1010 velocityX=numpy.append(velocityX, numpy.NaN)
1012 velocityX=numpy.append(velocityX, numpy.NaN)
1011
1013
1012 if abs(Vmer)<100. and abs(Vmer) > 0.:
1014 if abs(Vmer)<100. and abs(Vmer) > 0.:
1013 velocityY=numpy.append(velocityY, -Vmer)#Vang
1015 velocityY=numpy.append(velocityY, -Vmer)#Vang
1014
1016
1015 else:
1017 else:
1016 #print 'Vmer',Vmer
1018 #print 'Vmer',Vmer
1017 velocityY=numpy.append(velocityY, numpy.NaN)
1019 velocityY=numpy.append(velocityY, numpy.NaN)
1018
1020
1019 if dbSNR[Height] > SNRlimit:
1021 if dbSNR[Height] > SNRlimit:
1020 velocityV=numpy.append(velocityV, -Vver)#FirstMoment[Height])
1022 velocityV=numpy.append(velocityV, -Vver)#FirstMoment[Height])
1021 else:
1023 else:
1022 velocityV=numpy.append(velocityV, numpy.NaN)
1024 velocityV=numpy.append(velocityV, numpy.NaN)
1023 #FirstMoment[Height]= numpy.NaN
1025 #FirstMoment[Height]= numpy.NaN
1024 # if SNRdBMean[Height] <12:
1026 # if SNRdBMean[Height] <12:
1025 # FirstMoment[Height] = numpy.NaN
1027 # FirstMoment[Height] = numpy.NaN
1026 # velocityX[Height] = numpy.NaN
1028 # velocityX[Height] = numpy.NaN
1027 # velocityY[Height] = numpy.NaN
1029 # velocityY[Height] = numpy.NaN
1028
1030
1029
1031
1030
1032
1031 data_output[0] = numpy.array(velocityX) #self.moving_average(numpy.array(velocityX) , N=1)
1033 data_output[0] = numpy.array(velocityX) #self.moving_average(numpy.array(velocityX) , N=1)
1032 data_output[1] = numpy.array(velocityY) #self.moving_average(numpy.array(velocityY) , N=1)
1034 data_output[1] = numpy.array(velocityY) #self.moving_average(numpy.array(velocityY) , N=1)
1033 data_output[2] = -velocityV#FirstMoment
1035 data_output[2] = velocityV#FirstMoment
1034
1036
1035 print 'data_output', data_output.shape
1037 print 'data_output', data_output.shape
1036 #print FirstMoment
1038 #print FirstMoment
1037 # print 'velocityX',numpy.shape(data_output[0])
1039 # print 'velocityX',numpy.shape(data_output[0])
1038 # print 'velocityX',data_output[0]
1040 # print 'velocityX',data_output[0]
1039 # print ' '
1041 # print ' '
1040 # print 'velocityY',numpy.shape(data_output[1])
1042 # print 'velocityY',numpy.shape(data_output[1])
1041 # print 'velocityY',data_output[1]
1043 # print 'velocityY',data_output[1]
1042 # print 'velocityV',data_output[2]
1044 # print 'velocityV',data_output[2]
1043 # print 'PhaseLine',PhaseLine
1045 # print 'PhaseLine',PhaseLine
1044 #print numpy.array(velocityY)
1046 #print numpy.array(velocityY)
1045 #print 'SNR'
1047 #print 'SNR'
1046 #print 10*numpy.log10(dataOut.data_SNR)
1048 #print 10*numpy.log10(dataOut.data_SNR)
1047 #print numpy.shape(10*numpy.log10(dataOut.data_SNR))
1049 #print numpy.shape(10*numpy.log10(dataOut.data_SNR))
1048 print ' '
1050 print ' '
1049
1051
1050 xFrec=FrecRange[0:spc.shape[1]]
1052 xFrec=FrecRange[0:spc.shape[1]]
1051
1053
1052 dataOut.data_output=data_output
1054 dataOut.data_output=data_output
1053
1055
1054 return
1056 return
1055
1057
1056
1058
1057 def moving_average(self,x, N=2):
1059 def moving_average(self,x, N=2):
1058 return numpy.convolve(x, numpy.ones((N,))/N)[(N-1):]
1060 return numpy.convolve(x, numpy.ones((N,))/N)[(N-1):]
1059
1061
1060 def gaus(self,xSamples,Amp,Mu,Sigma):
1062 def gaus(self,xSamples,Amp,Mu,Sigma):
1061 return ( Amp / ((2*numpy.pi)**0.5 * Sigma) ) * numpy.exp( -( xSamples - Mu )**2 / ( 2 * (Sigma**2) ))
1063 return ( Amp / ((2*numpy.pi)**0.5 * Sigma) ) * numpy.exp( -( xSamples - Mu )**2 / ( 2 * (Sigma**2) ))
1062
1064
1063
1065
1064
1066
1065 def Moments(self, ySamples, xSamples):
1067 def Moments(self, ySamples, xSamples):
1066 Pot = numpy.nansum( ySamples ) # Potencia, momento 0
1068 Pot = numpy.nansum( ySamples ) # Potencia, momento 0
1067 yNorm = ySamples / Pot
1069 yNorm = ySamples / Pot
1068 Vr = numpy.nansum( yNorm * xSamples ) # Velocidad radial, mu, corrimiento doppler, primer momento
1070 Vr = numpy.nansum( yNorm * xSamples ) # Velocidad radial, mu, corrimiento doppler, primer momento
1069 Sigma2 = abs(numpy.nansum( yNorm * ( xSamples - Vr )**2 )) # Segundo Momento
1071 Sigma2 = abs(numpy.nansum( yNorm * ( xSamples - Vr )**2 )) # Segundo Momento
1070 Desv = Sigma2**0.5 # Desv. Estandar, Ancho espectral
1072 Desv = Sigma2**0.5 # Desv. Estandar, Ancho espectral
1071
1073
1072 return numpy.array([Pot, Vr, Desv])
1074 return numpy.array([Pot, Vr, Desv])
1073
1075
1074 def WindEstimation(self, spc, cspc, pairsList, ChanDist, Height, noise, AbbsisaRange, dbSNR, SNRlimit):
1076 def WindEstimation(self, spc, cspc, pairsList, ChanDist, Height, noise, AbbsisaRange, dbSNR, SNRlimit):
1075
1077
1076
1078
1077
1079
1078 ySamples=numpy.ones([spc.shape[0],spc.shape[1]])
1080 ySamples=numpy.ones([spc.shape[0],spc.shape[1]])
1079 phase=numpy.ones([spc.shape[0],spc.shape[1]])
1081 phase=numpy.ones([spc.shape[0],spc.shape[1]])
1080 CSPCSamples=numpy.ones([spc.shape[0],spc.shape[1]],dtype=numpy.complex_)
1082 CSPCSamples=numpy.ones([spc.shape[0],spc.shape[1]],dtype=numpy.complex_)
1081 coherence=numpy.ones([spc.shape[0],spc.shape[1]])
1083 coherence=numpy.ones([spc.shape[0],spc.shape[1]])
1082 PhaseSlope=numpy.zeros(spc.shape[0])
1084 PhaseSlope=numpy.zeros(spc.shape[0])
1083 PhaseInter=numpy.ones(spc.shape[0])
1085 PhaseInter=numpy.ones(spc.shape[0])
1084 xFrec=AbbsisaRange[0][0:spc.shape[1]]
1086 xFrec=AbbsisaRange[0][0:spc.shape[1]]
1085 xVel =AbbsisaRange[2][0:spc.shape[1]]
1087 xVel =AbbsisaRange[2][0:spc.shape[1]]
1086 Vv=numpy.empty(spc.shape[2])*0
1088 Vv=numpy.empty(spc.shape[2])*0
1087 SPCav = numpy.average(spc, axis=0)-numpy.average(noise) #spc[0]-noise[0]#
1089 SPCav = numpy.average(spc, axis=0)-numpy.average(noise) #spc[0]-noise[0]#
1088
1090
1089 SPCmoments = self.Moments(SPCav[:,Height], xVel )
1091 SPCmoments = self.Moments(SPCav[:,Height], xVel )
1090 CSPCmoments = []
1092 CSPCmoments = []
1091 cspcNoise = numpy.empty(3)
1093 cspcNoise = numpy.empty(3)
1092
1094
1093 '''Getting Eij and Nij'''
1095 '''Getting Eij and Nij'''
1094
1096
1095 E01=ChanDist[0][0]
1097 Xi01=ChanDist[0][0]
1096 N01=ChanDist[0][1]
1098 Eta01=ChanDist[0][1]
1097
1099
1098 E02=ChanDist[1][0]
1100 Xi02=ChanDist[1][0]
1099 N02=ChanDist[1][1]
1101 Eta02=ChanDist[1][1]
1100
1102
1101 E12=ChanDist[2][0]
1103 Xi12=ChanDist[2][0]
1102 N12=ChanDist[2][1]
1104 Eta12=ChanDist[2][1]
1103
1105
1104 z = spc.copy()
1106 z = spc.copy()
1105 z = numpy.where(numpy.isfinite(z), z, numpy.NAN)
1107 z = numpy.where(numpy.isfinite(z), z, numpy.NAN)
1106
1108
1107 for i in range(spc.shape[0]):
1109 for i in range(spc.shape[0]):
1108
1110
1109 '''****** Line of Data SPC ******'''
1111 '''****** Line of Data SPC ******'''
1110 zline=z[i,:,Height].copy() - noise[i] # Se resta ruido
1112 zline=z[i,:,Height].copy() - noise[i] # Se resta ruido
1111
1113
1112 '''****** SPC is normalized ******'''
1114 '''****** SPC is normalized ******'''
1113 SmoothSPC =self.moving_average(zline.copy(),N=1) # Se suaviza el ruido
1115 SmoothSPC =self.moving_average(zline.copy(),N=1) # Se suaviza el ruido
1114 FactNorm = SmoothSPC/numpy.nansum(SmoothSPC) # SPC Normalizado y suavizado
1116 FactNorm = SmoothSPC/numpy.nansum(SmoothSPC) # SPC Normalizado y suavizado
1115
1117
1116 xSamples = xFrec # Se toma el rango de frecuncias
1118 xSamples = xFrec # Se toma el rango de frecuncias
1117 ySamples[i] = FactNorm # Se toman los valores de SPC normalizado
1119 ySamples[i] = FactNorm # Se toman los valores de SPC normalizado
1118
1120
1119 for i in range(spc.shape[0]):
1121 for i in range(spc.shape[0]):
1120
1122
1121 '''****** Line of Data CSPC ******'''
1123 '''****** Line of Data CSPC ******'''
1122 cspcLine = ( cspc[i,:,Height].copy())# - noise[i] ) # no! Se resta el ruido
1124 cspcLine = ( cspc[i,:,Height].copy())# - noise[i] ) # no! Se resta el ruido
1123 SmoothCSPC =self.moving_average(cspcLine,N=1) # Se suaviza el ruido
1125 SmoothCSPC =self.moving_average(cspcLine,N=1) # Se suaviza el ruido
1124 cspcNorm = SmoothCSPC/numpy.nansum(SmoothCSPC) # CSPC normalizado y suavizado
1126 cspcNorm = SmoothCSPC/numpy.nansum(SmoothCSPC) # CSPC normalizado y suavizado
1125
1127
1126 '''****** CSPC is normalized with respect to Briggs and Vincent ******'''
1128 '''****** CSPC is normalized with respect to Briggs and Vincent ******'''
1127 chan_index0 = pairsList[i][0]
1129 chan_index0 = pairsList[i][0]
1128 chan_index1 = pairsList[i][1]
1130 chan_index1 = pairsList[i][1]
1129
1131
1130 CSPCFactor= numpy.abs(numpy.nansum(ySamples[chan_index0]))**2 * numpy.abs(numpy.nansum(ySamples[chan_index1]))**2
1132 CSPCFactor= numpy.abs(numpy.nansum(ySamples[chan_index0]))**2 * numpy.abs(numpy.nansum(ySamples[chan_index1]))**2
1131 CSPCNorm = cspcNorm / numpy.sqrt(CSPCFactor)
1133 CSPCNorm = cspcNorm / numpy.sqrt(CSPCFactor)
1132
1134
1133 CSPCSamples[i] = CSPCNorm
1135 CSPCSamples[i] = CSPCNorm
1134
1136
1135 coherence[i] = numpy.abs(CSPCSamples[i]) / numpy.sqrt(CSPCFactor)
1137 coherence[i] = numpy.abs(CSPCSamples[i]) / numpy.sqrt(CSPCFactor)
1136
1138
1137 #coherence[i]= self.moving_average(coherence[i],N=1)
1139 #coherence[i]= self.moving_average(coherence[i],N=1)
1138
1140
1139 phase[i] = self.moving_average( numpy.arctan2(CSPCSamples[i].imag, CSPCSamples[i].real),N=1)#*180/numpy.pi
1141 phase[i] = self.moving_average( numpy.arctan2(CSPCSamples[i].imag, CSPCSamples[i].real),N=1)#*180/numpy.pi
1140
1142
1141 CSPCmoments = numpy.vstack([self.Moments(numpy.abs(CSPCSamples[0]), xSamples),
1143 CSPCmoments = numpy.vstack([self.Moments(numpy.abs(CSPCSamples[0]), xSamples),
1142 self.Moments(numpy.abs(CSPCSamples[1]), xSamples),
1144 self.Moments(numpy.abs(CSPCSamples[1]), xSamples),
1143 self.Moments(numpy.abs(CSPCSamples[2]), xSamples)])
1145 self.Moments(numpy.abs(CSPCSamples[2]), xSamples)])
1144
1146
1145 #print '##### SUMA de SPC #####', len(ySamples)
1147 #print '##### SUMA de SPC #####', len(ySamples)
1146 #print numpy.sum(ySamples[0])
1148 #print numpy.sum(ySamples[0])
1147 #print '##### SUMA de CSPC #####', len(coherence)
1149 #print '##### SUMA de CSPC #####', len(coherence)
1148 #print numpy.sum(numpy.abs(CSPCNorm))
1150 #print numpy.sum(numpy.abs(CSPCNorm))
1149 #print numpy.sum(coherence[0])
1151 #print numpy.sum(coherence[0])
1150 # print 'len',len(xSamples)
1152 # print 'len',len(xSamples)
1151 # print 'CSPCmoments', numpy.shape(CSPCmoments)
1153 # print 'CSPCmoments', numpy.shape(CSPCmoments)
1152 # print CSPCmoments
1154 # print CSPCmoments
1153 # print '#######################'
1155 # print '#######################'
1154
1156
1155 popt=[1e-10,0,1e-10]
1157 popt=[1e-10,0,1e-10]
1156 popt01, popt02, popt12 = [1e-10,1e-10,1e-10], [1e-10,1e-10,1e-10] ,[1e-10,1e-10,1e-10]
1158 popt01, popt02, popt12 = [1e-10,1e-10,1e-10], [1e-10,1e-10,1e-10] ,[1e-10,1e-10,1e-10]
1157 FitGauss01, FitGauss02, FitGauss12 = numpy.empty(len(xSamples))*0, numpy.empty(len(xSamples))*0, numpy.empty(len(xSamples))*0
1159 FitGauss01, FitGauss02, FitGauss12 = numpy.empty(len(xSamples))*0, numpy.empty(len(xSamples))*0, numpy.empty(len(xSamples))*0
1158
1160
1159 CSPCMask01 = numpy.abs(CSPCSamples[0])
1161 CSPCMask01 = numpy.abs(CSPCSamples[0])
1160 CSPCMask02 = numpy.abs(CSPCSamples[1])
1162 CSPCMask02 = numpy.abs(CSPCSamples[1])
1161 CSPCMask12 = numpy.abs(CSPCSamples[2])
1163 CSPCMask12 = numpy.abs(CSPCSamples[2])
1162
1164
1163 mask01 = ~numpy.isnan(CSPCMask01)
1165 mask01 = ~numpy.isnan(CSPCMask01)
1164 mask02 = ~numpy.isnan(CSPCMask02)
1166 mask02 = ~numpy.isnan(CSPCMask02)
1165 mask12 = ~numpy.isnan(CSPCMask12)
1167 mask12 = ~numpy.isnan(CSPCMask12)
1166
1168
1167 #mask = ~numpy.isnan(CSPCMask01)
1169 #mask = ~numpy.isnan(CSPCMask01)
1168 CSPCMask01 = CSPCMask01[mask01]
1170 CSPCMask01 = CSPCMask01[mask01]
1169 CSPCMask02 = CSPCMask02[mask02]
1171 CSPCMask02 = CSPCMask02[mask02]
1170 CSPCMask12 = CSPCMask12[mask12]
1172 CSPCMask12 = CSPCMask12[mask12]
1171 #CSPCMask01 = numpy.ma.masked_invalid(CSPCMask01)
1173 #CSPCMask01 = numpy.ma.masked_invalid(CSPCMask01)
1172
1174
1173
1175
1174
1176
1175 '''***Fit Gauss CSPC01***'''
1177 '''***Fit Gauss CSPC01***'''
1176 if dbSNR > SNRlimit and numpy.abs(SPCmoments[1])<3 :
1178 if dbSNR > SNRlimit and numpy.abs(SPCmoments[1])<3 :
1177 try:
1179 try:
1178 popt01,pcov = curve_fit(self.gaus,xSamples[mask01],numpy.abs(CSPCMask01),p0=CSPCmoments[0])
1180 popt01,pcov = curve_fit(self.gaus,xSamples[mask01],numpy.abs(CSPCMask01),p0=CSPCmoments[0])
1179 popt02,pcov = curve_fit(self.gaus,xSamples[mask02],numpy.abs(CSPCMask02),p0=CSPCmoments[1])
1181 popt02,pcov = curve_fit(self.gaus,xSamples[mask02],numpy.abs(CSPCMask02),p0=CSPCmoments[1])
1180 popt12,pcov = curve_fit(self.gaus,xSamples[mask12],numpy.abs(CSPCMask12),p0=CSPCmoments[2])
1182 popt12,pcov = curve_fit(self.gaus,xSamples[mask12],numpy.abs(CSPCMask12),p0=CSPCmoments[2])
1181 FitGauss01 = self.gaus(xSamples,*popt01)
1183 FitGauss01 = self.gaus(xSamples,*popt01)
1182 FitGauss02 = self.gaus(xSamples,*popt02)
1184 FitGauss02 = self.gaus(xSamples,*popt02)
1183 FitGauss12 = self.gaus(xSamples,*popt12)
1185 FitGauss12 = self.gaus(xSamples,*popt12)
1184 except:
1186 except:
1185 FitGauss01=numpy.ones(len(xSamples))*numpy.mean(numpy.abs(CSPCSamples[0]))
1187 FitGauss01=numpy.ones(len(xSamples))*numpy.mean(numpy.abs(CSPCSamples[0]))
1186 FitGauss02=numpy.ones(len(xSamples))*numpy.mean(numpy.abs(CSPCSamples[1]))
1188 FitGauss02=numpy.ones(len(xSamples))*numpy.mean(numpy.abs(CSPCSamples[1]))
1187 FitGauss12=numpy.ones(len(xSamples))*numpy.mean(numpy.abs(CSPCSamples[2]))
1189 FitGauss12=numpy.ones(len(xSamples))*numpy.mean(numpy.abs(CSPCSamples[2]))
1188
1190
1189
1191
1190 CSPCopt = numpy.vstack([popt01,popt02,popt12])
1192 CSPCopt = numpy.vstack([popt01,popt02,popt12])
1191
1193
1192 '''****** Getting fij width ******'''
1194 '''****** Getting fij width ******'''
1193
1195
1194 yMean = numpy.average(ySamples, axis=0) # ySamples[0]
1196 yMean = numpy.average(ySamples, axis=0) # ySamples[0]
1195
1197
1196 '''******* Getting fitting Gaussian *******'''
1198 '''******* Getting fitting Gaussian *******'''
1197 meanGauss = sum(xSamples*yMean) / len(xSamples) # Mu, velocidad radial (frecuencia)
1199 meanGauss = sum(xSamples*yMean) / len(xSamples) # Mu, velocidad radial (frecuencia)
1198 sigma2 = sum(yMean*(xSamples-meanGauss)**2) / len(xSamples) # Varianza, Ancho espectral (frecuencia)
1200 sigma2 = sum(yMean*(xSamples-meanGauss)**2) / len(xSamples) # Varianza, Ancho espectral (frecuencia)
1199
1201
1200 yMoments = self.Moments(yMean, xSamples)
1202 yMoments = self.Moments(yMean, xSamples)
1201
1203
1202 if dbSNR > SNRlimit and numpy.abs(SPCmoments[1])<3: # and abs(meanGauss/sigma2) > 0.00001:
1204 if dbSNR > SNRlimit and numpy.abs(SPCmoments[1])<3: # and abs(meanGauss/sigma2) > 0.00001:
1203 try:
1205 try:
1204 popt,pcov = curve_fit(self.gaus,xSamples,yMean,p0=yMoments)
1206 popt,pcov = curve_fit(self.gaus,xSamples,yMean,p0=yMoments)
1205 FitGauss=self.gaus(xSamples,*popt)
1207 FitGauss=self.gaus(xSamples,*popt)
1206
1208
1207 except :#RuntimeError:
1209 except :#RuntimeError:
1208 FitGauss=numpy.ones(len(xSamples))*numpy.mean(yMean)
1210 FitGauss=numpy.ones(len(xSamples))*numpy.mean(yMean)
1209
1211
1210
1212
1211 else:
1213 else:
1212 FitGauss=numpy.ones(len(xSamples))*numpy.mean(yMean)
1214 FitGauss=numpy.ones(len(xSamples))*numpy.mean(yMean)
1213
1215
1214
1216
1215
1217
1216 '''****** Getting Fij ******'''
1218 '''****** Getting Fij ******'''
1217 Fijcspc = CSPCopt[:,2]/2*3
1219 Fijcspc = CSPCopt[:,2]/2*3
1218
1220
1219
1221
1220 GaussCenter = popt[1] #xFrec[GCpos]
1222 GaussCenter = popt[1] #xFrec[GCpos]
1221 #Punto en Eje X de la Gaussiana donde se encuentra el centro
1223 #Punto en Eje X de la Gaussiana donde se encuentra el centro
1222 ClosestCenter = xSamples[numpy.abs(xSamples-GaussCenter).argmin()]
1224 ClosestCenter = xSamples[numpy.abs(xSamples-GaussCenter).argmin()]
1223 PointGauCenter = numpy.where(xSamples==ClosestCenter)[0][0]
1225 PointGauCenter = numpy.where(xSamples==ClosestCenter)[0][0]
1224
1226
1225 #Punto e^-1 hubicado en la Gaussiana
1227 #Punto e^-1 hubicado en la Gaussiana
1226 PeMinus1 = numpy.max(FitGauss)* numpy.exp(-1)
1228 PeMinus1 = numpy.max(FitGauss)* numpy.exp(-1)
1227 FijClosest = FitGauss[numpy.abs(FitGauss-PeMinus1).argmin()] # El punto mas cercano a "Peminus1" dentro de "FitGauss"
1229 FijClosest = FitGauss[numpy.abs(FitGauss-PeMinus1).argmin()] # El punto mas cercano a "Peminus1" dentro de "FitGauss"
1228 PointFij = numpy.where(FitGauss==FijClosest)[0][0]
1230 PointFij = numpy.where(FitGauss==FijClosest)[0][0]
1229
1231
1230 if xSamples[PointFij] > xSamples[PointGauCenter]:
1232 if xSamples[PointFij] > xSamples[PointGauCenter]:
1231 Fij = xSamples[PointFij] - xSamples[PointGauCenter]
1233 Fij = xSamples[PointFij] - xSamples[PointGauCenter]
1232
1234
1233 else:
1235 else:
1234 Fij = xSamples[PointGauCenter] - xSamples[PointFij]
1236 Fij = xSamples[PointGauCenter] - xSamples[PointFij]
1235
1237
1236 # print 'CSPCopt'
1238 # print 'CSPCopt'
1237 # print CSPCopt
1239 # print CSPCopt
1238 # print 'popt'
1240 # print 'popt'
1239 # print popt
1241 # print popt
1240 # print '#######################################'
1242 # print '#######################################'
1241 #print 'dataOut.data_param', numpy.shape(data_param)
1243 #print 'dataOut.data_param', numpy.shape(data_param)
1242 #print 'dataOut.data_param0', data_param[0,0,Height]
1244 #print 'dataOut.data_param0', data_param[0,0,Height]
1243 #print 'dataOut.data_param1', data_param[0,1,Height]
1245 #print 'dataOut.data_param1', data_param[0,1,Height]
1244 #print 'dataOut.data_param2', data_param[0,2,Height]
1246 #print 'dataOut.data_param2', data_param[0,2,Height]
1245
1247
1246
1248
1247 # print 'yMoments', yMoments
1249 # print 'yMoments', yMoments
1248 # print 'Moments', SPCmoments
1250 # print 'Moments', SPCmoments
1249 # print 'Fij2 Moment', Fij
1251 # print 'Fij2 Moment', Fij
1250 # #print 'Fij', Fij, 'popt[2]/2',popt[2]/2
1252 # #print 'Fij', Fij, 'popt[2]/2',popt[2]/2
1251 # print 'Fijcspc',Fijcspc
1253 # print 'Fijcspc',Fijcspc
1252 # print '#######################################'
1254 # print '#######################################'
1253
1255
1254
1256
1255 '''****** Taking frequency ranges from SPCs ******'''
1257 '''****** Taking frequency ranges from SPCs ******'''
1256
1258
1257
1259
1258 #GaussCenter = popt[1] #Primer momento 01
1260 #GaussCenter = popt[1] #Primer momento 01
1259 GauWidth = popt[2] *3/2 #Ancho de banda de Gau01
1261 GauWidth = popt[2] *3/2 #Ancho de banda de Gau01
1260 Range = numpy.empty(2)
1262 Range = numpy.empty(2)
1261 Range[0] = GaussCenter - GauWidth
1263 Range[0] = GaussCenter - GauWidth
1262 Range[1] = GaussCenter + GauWidth
1264 Range[1] = GaussCenter + GauWidth
1263 #Punto en Eje X de la Gaussiana donde se encuentra ancho de banda (min:max)
1265 #Punto en Eje X de la Gaussiana donde se encuentra ancho de banda (min:max)
1264 ClosRangeMin = xSamples[numpy.abs(xSamples-Range[0]).argmin()]
1266 ClosRangeMin = xSamples[numpy.abs(xSamples-Range[0]).argmin()]
1265 ClosRangeMax = xSamples[numpy.abs(xSamples-Range[1]).argmin()]
1267 ClosRangeMax = xSamples[numpy.abs(xSamples-Range[1]).argmin()]
1266
1268
1267 PointRangeMin = numpy.where(xSamples==ClosRangeMin)[0][0]
1269 PointRangeMin = numpy.where(xSamples==ClosRangeMin)[0][0]
1268 PointRangeMax = numpy.where(xSamples==ClosRangeMax)[0][0]
1270 PointRangeMax = numpy.where(xSamples==ClosRangeMax)[0][0]
1269
1271
1270 Range=numpy.array([ PointRangeMin, PointRangeMax ])
1272 Range=numpy.array([ PointRangeMin, PointRangeMax ])
1271
1273
1272 FrecRange = xFrec[ Range[0] : Range[1] ]
1274 FrecRange = xFrec[ Range[0] : Range[1] ]
1273 VelRange = xVel[ Range[0] : Range[1] ]
1275 VelRange = xVel[ Range[0] : Range[1] ]
1274
1276
1275
1277
1276 #print 'RANGE: ', Range
1278 #print 'RANGE: ', Range
1277 #print 'FrecRange', numpy.shape(FrecRange)#,FrecRange
1279 #print 'FrecRange', numpy.shape(FrecRange)#,FrecRange
1278 #print 'len: ', len(FrecRange)
1280 #print 'len: ', len(FrecRange)
1279
1281
1280 '''****** Getting SCPC Slope ******'''
1282 '''****** Getting SCPC Slope ******'''
1281
1283
1282 for i in range(spc.shape[0]):
1284 for i in range(spc.shape[0]):
1283
1285
1284 if len(FrecRange)>5 and len(FrecRange)<spc.shape[1]*0.3:
1286 if len(FrecRange)>5 and len(FrecRange)<spc.shape[1]*0.3:
1285 PhaseRange=self.moving_average(phase[i,Range[0]:Range[1]],N=3)
1287 PhaseRange=self.moving_average(phase[i,Range[0]:Range[1]],N=3)
1286
1288
1287 #print 'Ancho espectral Frecuencias', FrecRange[-1]-FrecRange[0], 'Hz'
1289 #print 'Ancho espectral Frecuencias', FrecRange[-1]-FrecRange[0], 'Hz'
1288 #print 'Ancho espectral Velocidades', VelRange[-1]-VelRange[0], 'm/s'
1290 #print 'Ancho espectral Velocidades', VelRange[-1]-VelRange[0], 'm/s'
1289 #print 'FrecRange', len(FrecRange) , FrecRange
1291 #print 'FrecRange', len(FrecRange) , FrecRange
1290 #print 'VelRange', len(VelRange) , VelRange
1292 #print 'VelRange', len(VelRange) , VelRange
1291 #print 'PhaseRange', numpy.shape(PhaseRange), PhaseRange
1293 #print 'PhaseRange', numpy.shape(PhaseRange), PhaseRange
1292 #print ' '
1294 #print ' '
1293
1295
1294 '''***********************VelRange******************'''
1296 '''***********************VelRange******************'''
1295
1297
1296 mask = ~numpy.isnan(FrecRange) & ~numpy.isnan(PhaseRange)
1298 mask = ~numpy.isnan(FrecRange) & ~numpy.isnan(PhaseRange)
1297
1299
1298 if len(FrecRange) == len(PhaseRange):
1300 if len(FrecRange) == len(PhaseRange):
1299 try:
1301 try:
1300 slope, intercept, r_value, p_value, std_err = stats.linregress(FrecRange[mask], PhaseRange[mask])
1302 slope, intercept, r_value, p_value, std_err = stats.linregress(FrecRange[mask], PhaseRange[mask])
1301 PhaseSlope[i]=slope
1303 PhaseSlope[i]=slope
1302 PhaseInter[i]=intercept
1304 PhaseInter[i]=intercept
1303 except:
1305 except:
1304 PhaseSlope[i]=0
1306 PhaseSlope[i]=0
1305 PhaseInter[i]=0
1307 PhaseInter[i]=0
1306 else:
1308 else:
1307 PhaseSlope[i]=0
1309 PhaseSlope[i]=0
1308 PhaseInter[i]=0
1310 PhaseInter[i]=0
1309 else:
1311 else:
1310 PhaseSlope[i]=0
1312 PhaseSlope[i]=0
1311 PhaseInter[i]=0
1313 PhaseInter[i]=0
1312
1314
1313
1315
1314 '''Getting constant C'''
1316 '''Getting constant C'''
1315 cC=(Fij*numpy.pi)**2
1317 cC=(Fij*numpy.pi)**2
1316
1318
1317 '''****** Getting constants F and G ******'''
1319 '''****** Getting constants F and G ******'''
1318 MijEijNij=numpy.array([[E02,N02], [E12,N12]])
1320 MijEijNij=numpy.array([[Xi02,Eta02], [Xi12,Eta12]])
1319 MijResult0=(-PhaseSlope[1]*cC) / (2*numpy.pi)
1321 MijResult0=(-PhaseSlope[1]*cC) / (2*numpy.pi)
1320 MijResult1=(-PhaseSlope[2]*cC) / (2*numpy.pi)
1322 MijResult1=(-PhaseSlope[2]*cC) / (2*numpy.pi)
1321 MijResults=numpy.array([MijResult0,MijResult1])
1323 MijResults=numpy.array([MijResult0,MijResult1])
1322 (cF,cG) = numpy.linalg.solve(MijEijNij, MijResults)
1324 (cF,cG) = numpy.linalg.solve(MijEijNij, MijResults)
1323
1325
1324 '''****** Getting constants A, B and H ******'''
1326 '''****** Getting constants A, B and H ******'''
1325 W01=numpy.nanmax( FitGauss01 ) #numpy.abs(CSPCSamples[0]))
1327 W01=numpy.nanmax( FitGauss01 ) #numpy.abs(CSPCSamples[0]))
1326 W02=numpy.nanmax( FitGauss02 ) #numpy.abs(CSPCSamples[1]))
1328 W02=numpy.nanmax( FitGauss02 ) #numpy.abs(CSPCSamples[1]))
1327 W12=numpy.nanmax( FitGauss12 ) #numpy.abs(CSPCSamples[2]))
1329 W12=numpy.nanmax( FitGauss12 ) #numpy.abs(CSPCSamples[2]))
1328
1330
1329 WijResult0=((cF*E01+cG*N01)**2)/cC - numpy.log(W01 / numpy.sqrt(numpy.pi/cC))
1331 WijResult0=((cF*Xi01+cG*Eta01)**2)/cC - numpy.log(W01 / numpy.sqrt(numpy.pi/cC))
1330 WijResult1=((cF*E02+cG*N02)**2)/cC - numpy.log(W02 / numpy.sqrt(numpy.pi/cC))
1332 WijResult1=((cF*Xi02+cG*Eta02)**2)/cC - numpy.log(W02 / numpy.sqrt(numpy.pi/cC))
1331 WijResult2=((cF*E12+cG*N12)**2)/cC - numpy.log(W12 / numpy.sqrt(numpy.pi/cC))
1333 WijResult2=((cF*Xi12+cG*Eta12)**2)/cC - numpy.log(W12 / numpy.sqrt(numpy.pi/cC))
1332
1334
1333 WijResults=numpy.array([WijResult0, WijResult1, WijResult2])
1335 WijResults=numpy.array([WijResult0, WijResult1, WijResult2])
1334
1336
1335 WijEijNij=numpy.array([ [E01**2, N01**2, 2*E01*N01] , [E02**2, N02**2, 2*E02*N02] , [E12**2, N12**2, 2*E12*N12] ])
1337 WijEijNij=numpy.array([ [Xi01**2, Eta01**2, 2*Xi01*Eta01] , [Xi02**2, Eta02**2, 2*Xi02*Eta02] , [Xi12**2, Eta12**2, 2*Xi12*Eta12] ])
1336 (cA,cB,cH) = numpy.linalg.solve(WijEijNij, WijResults)
1338 (cA,cB,cH) = numpy.linalg.solve(WijEijNij, WijResults)
1337
1339
1338 VxVy=numpy.array([[cA,cH],[cH,cB]])
1340 VxVy=numpy.array([[cA,cH],[cH,cB]])
1339 VxVyResults=numpy.array([-cF,-cG])
1341 VxVyResults=numpy.array([-cF,-cG])
1340 (Vx,Vy) = numpy.linalg.solve(VxVy, VxVyResults)
1342 (Vx,Vy) = numpy.linalg.solve(VxVy, VxVyResults)
1341
1343
1342 #print 'MijResults, cC, PhaseSlope', MijResults, cC, PhaseSlope
1344 #print 'MijResults, cC, PhaseSlope', MijResults, cC, PhaseSlope
1343 #print 'W01,02,12', W01, W02, W12
1345 #print 'W01,02,12', W01, W02, W12
1344 #print 'WijResult0,1,2',WijResult0, WijResult1, WijResult2, 'Results', WijResults
1346 #print 'WijResult0,1,2',WijResult0, WijResult1, WijResult2, 'Results', WijResults
1345 #print 'cA,cB,cH, cF, cG', cA, cB, cH, cF, cG
1347 #print 'cA,cB,cH, cF, cG', cA, cB, cH, cF, cG
1346 #print 'VxVy', VxVyResults
1348 #print 'VxVy', VxVyResults
1347 #print '###########################****************************************'
1349 #print '###########################****************************************'
1348 Vzon = Vy
1350 Vzon = Vy
1349 Vmer = Vx
1351 Vmer = Vx
1350 Vmag=numpy.sqrt(Vzon**2+Vmer**2)
1352 Vmag=numpy.sqrt(Vzon**2+Vmer**2)
1351 Vang=numpy.arctan2(Vmer,Vzon)
1353 Vang=numpy.arctan2(Vmer,Vzon)
1352 if numpy.abs( popt[1] ) < 3.5 and len(FrecRange)>4:
1354 if numpy.abs( popt[1] ) < 3.5 and len(FrecRange)>4:
1353 Vver=popt[1]
1355 Vver=popt[1]
1354 else:
1356 else:
1355 Vver=numpy.NaN
1357 Vver=numpy.NaN
1356 FitGaussCSPC = numpy.array([FitGauss01,FitGauss02,FitGauss12])
1358 FitGaussCSPC = numpy.array([FitGauss01,FitGauss02,FitGauss12])
1357
1359
1358
1360
1359 # ''' Ploteo por altura '''
1361 # ''' Ploteo por altura '''
1360 # if Height == 28:
1362 # if Height == 28:
1361 # for i in range(3):
1363 # for i in range(3):
1362 # #print 'FASE', numpy.shape(phase), y[25]
1364 # #print 'FASE', numpy.shape(phase), y[25]
1363 # #print numpy.shape(coherence)
1365 # #print numpy.shape(coherence)
1364 # fig = plt.figure(10+self.indice)
1366 # fig = plt.figure(10+self.indice)
1365 # #plt.plot( x[0:256],coherence[:,25] )
1367 # #plt.plot( x[0:256],coherence[:,25] )
1366 # #cohAv = numpy.average(coherence[i],1)
1368 # #cohAv = numpy.average(coherence[i],1)
1367 # Pendiente = FrecRange * PhaseSlope[i]
1369 # Pendiente = FrecRange * PhaseSlope[i]
1368 # plt.plot( FrecRange, Pendiente)
1370 # plt.plot( FrecRange, Pendiente)
1369 # plt.plot( xFrec,phase[i])
1371 # plt.plot( xFrec,phase[i])
1370 #
1372 #
1371 # CSPCmean = numpy.mean(numpy.abs(CSPCSamples),0)
1373 # CSPCmean = numpy.mean(numpy.abs(CSPCSamples),0)
1372 # #plt.plot(xFrec, FitGauss01)
1374 # #plt.plot(xFrec, FitGauss01)
1373 # #plt.plot(xFrec, CSPCmean)
1375 # #plt.plot(xFrec, CSPCmean)
1374 # #plt.plot(xFrec, numpy.abs(CSPCSamples[0]))
1376 # #plt.plot(xFrec, numpy.abs(CSPCSamples[0]))
1375 # #plt.plot(xFrec, FitGauss)
1377 # #plt.plot(xFrec, FitGauss)
1376 # #plt.plot(xFrec, yMean)
1378 # #plt.plot(xFrec, yMean)
1377 # #plt.plot(xFrec, numpy.abs(coherence[0]))
1379 # #plt.plot(xFrec, numpy.abs(coherence[0]))
1378 #
1380 #
1379 # #plt.axis([-12, 12, 15, 50])
1381 # #plt.axis([-12, 12, 15, 50])
1380 # #plt.title("%s" %( '%s %s, Channel %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S") , i)))
1382 # #plt.title("%s" %( '%s %s, Channel %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S") , i)))
1381 # plt.ylabel('Desfase [rad]')
1383 # plt.ylabel('Desfase [rad]')
1382 # #plt.ylabel('CSPC normalizado')
1384 # #plt.ylabel('CSPC normalizado')
1383 # plt.xlabel('Frec range [Hz]')
1385 # plt.xlabel('Frec range [Hz]')
1384
1386
1385 #fig.savefig('/home/erick/Documents/Pics/to{}.png'.format(self.indice))
1387 #fig.savefig('/home/erick/Documents/Pics/to{}.png'.format(self.indice))
1386
1388
1387 # plt.show()
1389 # plt.show()
1388 # self.indice=self.indice+1
1390 # self.indice=self.indice+1
1389
1391
1390
1392
1391
1393
1392
1394
1393
1395
1394 # print 'vzon y vmer', Vzon, Vmer
1396 # print 'vzon y vmer', Vzon, Vmer
1395 return Vzon, Vmer, Vver, GaussCenter, PhaseSlope, FitGaussCSPC
1397 return Vzon, Vmer, Vver, GaussCenter, PhaseSlope, FitGaussCSPC
1396
1398
1397 class SpectralMoments(Operation):
1399 class SpectralMoments(Operation):
1398
1400
1399 '''
1401 '''
1400 Function SpectralMoments()
1402 Function SpectralMoments()
1401
1403
1402 Calculates moments (power, mean, standard deviation) and SNR of the signal
1404 Calculates moments (power, mean, standard deviation) and SNR of the signal
1403
1405
1404 Type of dataIn: Spectra
1406 Type of dataIn: Spectra
1405
1407
1406 Configuration Parameters:
1408 Configuration Parameters:
1407
1409
1408 dirCosx : Cosine director in X axis
1410 dirCosx : Cosine director in X axis
1409 dirCosy : Cosine director in Y axis
1411 dirCosy : Cosine director in Y axis
1410
1412
1411 elevation :
1413 elevation :
1412 azimuth :
1414 azimuth :
1413
1415
1414 Input:
1416 Input:
1415 channelList : simple channel list to select e.g. [2,3,7]
1417 channelList : simple channel list to select e.g. [2,3,7]
1416 self.dataOut.data_pre : Spectral data
1418 self.dataOut.data_pre : Spectral data
1417 self.dataOut.abscissaList : List of frequencies
1419 self.dataOut.abscissaList : List of frequencies
1418 self.dataOut.noise : Noise level per channel
1420 self.dataOut.noise : Noise level per channel
1419
1421
1420 Affected:
1422 Affected:
1421 self.dataOut.moments : Parameters per channel
1423 self.dataOut.moments : Parameters per channel
1422 self.dataOut.data_SNR : SNR per channel
1424 self.dataOut.data_SNR : SNR per channel
1423
1425
1424 '''
1426 '''
1425
1427
1426 def run(self, dataOut):
1428 def run(self, dataOut):
1427
1429
1428 #dataOut.data_pre = dataOut.data_pre[0]
1430 #dataOut.data_pre = dataOut.data_pre[0]
1429 data = dataOut.data_pre[0]
1431 data = dataOut.data_pre[0]
1430 absc = dataOut.abscissaList[:-1]
1432 absc = dataOut.abscissaList[:-1]
1431 noise = dataOut.noise
1433 noise = dataOut.noise
1432 nChannel = data.shape[0]
1434 nChannel = data.shape[0]
1433 data_param = numpy.zeros((nChannel, 4, data.shape[2]))
1435 data_param = numpy.zeros((nChannel, 4, data.shape[2]))
1434
1436
1435 for ind in range(nChannel):
1437 for ind in range(nChannel):
1436 data_param[ind,:,:] = self.__calculateMoments( data[ind,:,:] , absc , noise[ind] )
1438 data_param[ind,:,:] = self.__calculateMoments( data[ind,:,:] , absc , noise[ind] )
1437
1439
1438 dataOut.moments = data_param[:,1:,:]
1440 dataOut.moments = data_param[:,1:,:]
1439 dataOut.data_SNR = data_param[:,0]
1441 dataOut.data_SNR = data_param[:,0]
1440 return
1442 return
1441
1443
1442 def __calculateMoments(self, oldspec, oldfreq, n0,
1444 def __calculateMoments(self, oldspec, oldfreq, n0,
1443 nicoh = None, graph = None, smooth = None, type1 = None, fwindow = None, snrth = None, dc = None, aliasing = None, oldfd = None, wwauto = None):
1445 nicoh = None, graph = None, smooth = None, type1 = None, fwindow = None, snrth = None, dc = None, aliasing = None, oldfd = None, wwauto = None):
1444
1446
1445 if (nicoh == None): nicoh = 1
1447 if (nicoh == None): nicoh = 1
1446 if (graph == None): graph = 0
1448 if (graph == None): graph = 0
1447 if (smooth == None): smooth = 0
1449 if (smooth == None): smooth = 0
1448 elif (self.smooth < 3): smooth = 0
1450 elif (self.smooth < 3): smooth = 0
1449
1451
1450 if (type1 == None): type1 = 0
1452 if (type1 == None): type1 = 0
1451 if (fwindow == None): fwindow = numpy.zeros(oldfreq.size) + 1
1453 if (fwindow == None): fwindow = numpy.zeros(oldfreq.size) + 1
1452 if (snrth == None): snrth = -3
1454 if (snrth == None): snrth = -3
1453 if (dc == None): dc = 0
1455 if (dc == None): dc = 0
1454 if (aliasing == None): aliasing = 0
1456 if (aliasing == None): aliasing = 0
1455 if (oldfd == None): oldfd = 0
1457 if (oldfd == None): oldfd = 0
1456 if (wwauto == None): wwauto = 0
1458 if (wwauto == None): wwauto = 0
1457
1459
1458 if (n0 < 1.e-20): n0 = 1.e-20
1460 if (n0 < 1.e-20): n0 = 1.e-20
1459
1461
1460 freq = oldfreq
1462 freq = oldfreq
1461 vec_power = numpy.zeros(oldspec.shape[1])
1463 vec_power = numpy.zeros(oldspec.shape[1])
1462 vec_fd = numpy.zeros(oldspec.shape[1])
1464 vec_fd = numpy.zeros(oldspec.shape[1])
1463 vec_w = numpy.zeros(oldspec.shape[1])
1465 vec_w = numpy.zeros(oldspec.shape[1])
1464 vec_snr = numpy.zeros(oldspec.shape[1])
1466 vec_snr = numpy.zeros(oldspec.shape[1])
1465
1467
1466 oldspec = numpy.ma.masked_invalid(oldspec)
1468 oldspec = numpy.ma.masked_invalid(oldspec)
1467
1469
1468 for ind in range(oldspec.shape[1]):
1470 for ind in range(oldspec.shape[1]):
1469
1471
1470 spec = oldspec[:,ind]
1472 spec = oldspec[:,ind]
1471 aux = spec*fwindow
1473 aux = spec*fwindow
1472 max_spec = aux.max()
1474 max_spec = aux.max()
1473 m = list(aux).index(max_spec)
1475 m = list(aux).index(max_spec)
1474
1476
1475 #Smooth
1477 #Smooth
1476 if (smooth == 0): spec2 = spec
1478 if (smooth == 0): spec2 = spec
1477 else: spec2 = scipy.ndimage.filters.uniform_filter1d(spec,size=smooth)
1479 else: spec2 = scipy.ndimage.filters.uniform_filter1d(spec,size=smooth)
1478
1480
1479 # Calculo de Momentos
1481 # Calculo de Momentos
1480 bb = spec2[range(m,spec2.size)]
1482 bb = spec2[range(m,spec2.size)]
1481 bb = (bb<n0).nonzero()
1483 bb = (bb<n0).nonzero()
1482 bb = bb[0]
1484 bb = bb[0]
1483
1485
1484 ss = spec2[range(0,m + 1)]
1486 ss = spec2[range(0,m + 1)]
1485 ss = (ss<n0).nonzero()
1487 ss = (ss<n0).nonzero()
1486 ss = ss[0]
1488 ss = ss[0]
1487
1489
1488 if (bb.size == 0):
1490 if (bb.size == 0):
1489 bb0 = spec.size - 1 - m
1491 bb0 = spec.size - 1 - m
1490 else:
1492 else:
1491 bb0 = bb[0] - 1
1493 bb0 = bb[0] - 1
1492 if (bb0 < 0):
1494 if (bb0 < 0):
1493 bb0 = 0
1495 bb0 = 0
1494
1496
1495 if (ss.size == 0): ss1 = 1
1497 if (ss.size == 0): ss1 = 1
1496 else: ss1 = max(ss) + 1
1498 else: ss1 = max(ss) + 1
1497
1499
1498 if (ss1 > m): ss1 = m
1500 if (ss1 > m): ss1 = m
1499
1501
1500 valid = numpy.asarray(range(int(m + bb0 - ss1 + 1))) + ss1
1502 valid = numpy.asarray(range(int(m + bb0 - ss1 + 1))) + ss1
1501 power = ( (spec2[valid] - n0) * fwindow[valid] ).sum()
1503 power = ( (spec2[valid] - n0) * fwindow[valid] ).sum()
1502 fd = ( (spec2[valid]- n0) * freq[valid] * fwindow[valid] ).sum() / power
1504 fd = ( (spec2[valid]- n0) * freq[valid] * fwindow[valid] ).sum() / power
1503
1505
1504 w = math.sqrt(((spec2[valid] - n0)*fwindow[valid]*(freq[valid]- fd)**2).sum()/power)
1506 w = math.sqrt(((spec2[valid] - n0)*fwindow[valid]*(freq[valid]- fd)**2).sum()/power)
1505 snr = (spec2.mean()-n0)/n0
1507 snr = (spec2.mean()-n0)/n0
1506
1508
1507 if (snr < 1.e-20) :
1509 if (snr < 1.e-20) :
1508 snr = 1.e-20
1510 snr = 1.e-20
1509
1511
1510 vec_power[ind] = power
1512 vec_power[ind] = power
1511 vec_fd[ind] = fd
1513 vec_fd[ind] = fd
1512 vec_w[ind] = w
1514 vec_w[ind] = w
1513 vec_snr[ind] = snr
1515 vec_snr[ind] = snr
1514
1516
1515 moments = numpy.vstack((vec_snr, vec_power, vec_fd, vec_w))
1517 moments = numpy.vstack((vec_snr, vec_power, vec_fd, vec_w))
1516 return moments
1518 return moments
1517
1519
1518 #------------------ Get SA Parameters --------------------------
1520 #------------------ Get SA Parameters --------------------------
1519
1521
1520 def GetSAParameters(self):
1522 def GetSAParameters(self):
1521 #SA en frecuencia
1523 #SA en frecuencia
1522 pairslist = self.dataOut.groupList
1524 pairslist = self.dataOut.groupList
1523 num_pairs = len(pairslist)
1525 num_pairs = len(pairslist)
1524
1526
1525 vel = self.dataOut.abscissaList
1527 vel = self.dataOut.abscissaList
1526 spectra = self.dataOut.data_pre
1528 spectra = self.dataOut.data_pre
1527 cspectra = self.dataIn.data_cspc
1529 cspectra = self.dataIn.data_cspc
1528 delta_v = vel[1] - vel[0]
1530 delta_v = vel[1] - vel[0]
1529
1531
1530 #Calculating the power spectrum
1532 #Calculating the power spectrum
1531 spc_pow = numpy.sum(spectra, 3)*delta_v
1533 spc_pow = numpy.sum(spectra, 3)*delta_v
1532 #Normalizing Spectra
1534 #Normalizing Spectra
1533 norm_spectra = spectra/spc_pow
1535 norm_spectra = spectra/spc_pow
1534 #Calculating the norm_spectra at peak
1536 #Calculating the norm_spectra at peak
1535 max_spectra = numpy.max(norm_spectra, 3)
1537 max_spectra = numpy.max(norm_spectra, 3)
1536
1538
1537 #Normalizing Cross Spectra
1539 #Normalizing Cross Spectra
1538 norm_cspectra = numpy.zeros(cspectra.shape)
1540 norm_cspectra = numpy.zeros(cspectra.shape)
1539
1541
1540 for i in range(num_chan):
1542 for i in range(num_chan):
1541 norm_cspectra[i,:,:] = cspectra[i,:,:]/numpy.sqrt(spc_pow[pairslist[i][0],:]*spc_pow[pairslist[i][1],:])
1543 norm_cspectra[i,:,:] = cspectra[i,:,:]/numpy.sqrt(spc_pow[pairslist[i][0],:]*spc_pow[pairslist[i][1],:])
1542
1544
1543 max_cspectra = numpy.max(norm_cspectra,2)
1545 max_cspectra = numpy.max(norm_cspectra,2)
1544 max_cspectra_index = numpy.argmax(norm_cspectra, 2)
1546 max_cspectra_index = numpy.argmax(norm_cspectra, 2)
1545
1547
1546 for i in range(num_pairs):
1548 for i in range(num_pairs):
1547 cspc_par[i,:,:] = __calculateMoments(norm_cspectra)
1549 cspc_par[i,:,:] = __calculateMoments(norm_cspectra)
1548 #------------------- Get Lags ----------------------------------
1550 #------------------- Get Lags ----------------------------------
1549
1551
1550 class SALags(Operation):
1552 class SALags(Operation):
1551 '''
1553 '''
1552 Function GetMoments()
1554 Function GetMoments()
1553
1555
1554 Input:
1556 Input:
1555 self.dataOut.data_pre
1557 self.dataOut.data_pre
1556 self.dataOut.abscissaList
1558 self.dataOut.abscissaList
1557 self.dataOut.noise
1559 self.dataOut.noise
1558 self.dataOut.normFactor
1560 self.dataOut.normFactor
1559 self.dataOut.data_SNR
1561 self.dataOut.data_SNR
1560 self.dataOut.groupList
1562 self.dataOut.groupList
1561 self.dataOut.nChannels
1563 self.dataOut.nChannels
1562
1564
1563 Affected:
1565 Affected:
1564 self.dataOut.data_param
1566 self.dataOut.data_param
1565
1567
1566 '''
1568 '''
1567 def run(self, dataOut):
1569 def run(self, dataOut):
1568 data_acf = dataOut.data_pre[0]
1570 data_acf = dataOut.data_pre[0]
1569 data_ccf = dataOut.data_pre[1]
1571 data_ccf = dataOut.data_pre[1]
1570 normFactor_acf = dataOut.normFactor[0]
1572 normFactor_acf = dataOut.normFactor[0]
1571 normFactor_ccf = dataOut.normFactor[1]
1573 normFactor_ccf = dataOut.normFactor[1]
1572 pairs_acf = dataOut.groupList[0]
1574 pairs_acf = dataOut.groupList[0]
1573 pairs_ccf = dataOut.groupList[1]
1575 pairs_ccf = dataOut.groupList[1]
1574
1576
1575 nHeights = dataOut.nHeights
1577 nHeights = dataOut.nHeights
1576 absc = dataOut.abscissaList
1578 absc = dataOut.abscissaList
1577 noise = dataOut.noise
1579 noise = dataOut.noise
1578 SNR = dataOut.data_SNR
1580 SNR = dataOut.data_SNR
1579 nChannels = dataOut.nChannels
1581 nChannels = dataOut.nChannels
1580 # pairsList = dataOut.groupList
1582 # pairsList = dataOut.groupList
1581 # pairsAutoCorr, pairsCrossCorr = self.__getPairsAutoCorr(pairsList, nChannels)
1583 # pairsAutoCorr, pairsCrossCorr = self.__getPairsAutoCorr(pairsList, nChannels)
1582
1584
1583 for l in range(len(pairs_acf)):
1585 for l in range(len(pairs_acf)):
1584 data_acf[l,:,:] = data_acf[l,:,:]/normFactor_acf[l,:]
1586 data_acf[l,:,:] = data_acf[l,:,:]/normFactor_acf[l,:]
1585
1587
1586 for l in range(len(pairs_ccf)):
1588 for l in range(len(pairs_ccf)):
1587 data_ccf[l,:,:] = data_ccf[l,:,:]/normFactor_ccf[l,:]
1589 data_ccf[l,:,:] = data_ccf[l,:,:]/normFactor_ccf[l,:]
1588
1590
1589 dataOut.data_param = numpy.zeros((len(pairs_ccf)*2 + 1, nHeights))
1591 dataOut.data_param = numpy.zeros((len(pairs_ccf)*2 + 1, nHeights))
1590 dataOut.data_param[:-1,:] = self.__calculateTaus(data_acf, data_ccf, absc)
1592 dataOut.data_param[:-1,:] = self.__calculateTaus(data_acf, data_ccf, absc)
1591 dataOut.data_param[-1,:] = self.__calculateLag1Phase(data_acf, absc)
1593 dataOut.data_param[-1,:] = self.__calculateLag1Phase(data_acf, absc)
1592 return
1594 return
1593
1595
1594 # def __getPairsAutoCorr(self, pairsList, nChannels):
1596 # def __getPairsAutoCorr(self, pairsList, nChannels):
1595 #
1597 #
1596 # pairsAutoCorr = numpy.zeros(nChannels, dtype = 'int')*numpy.nan
1598 # pairsAutoCorr = numpy.zeros(nChannels, dtype = 'int')*numpy.nan
1597 #
1599 #
1598 # for l in range(len(pairsList)):
1600 # for l in range(len(pairsList)):
1599 # firstChannel = pairsList[l][0]
1601 # firstChannel = pairsList[l][0]
1600 # secondChannel = pairsList[l][1]
1602 # secondChannel = pairsList[l][1]
1601 #
1603 #
1602 # #Obteniendo pares de Autocorrelacion
1604 # #Obteniendo pares de Autocorrelacion
1603 # if firstChannel == secondChannel:
1605 # if firstChannel == secondChannel:
1604 # pairsAutoCorr[firstChannel] = int(l)
1606 # pairsAutoCorr[firstChannel] = int(l)
1605 #
1607 #
1606 # pairsAutoCorr = pairsAutoCorr.astype(int)
1608 # pairsAutoCorr = pairsAutoCorr.astype(int)
1607 #
1609 #
1608 # pairsCrossCorr = range(len(pairsList))
1610 # pairsCrossCorr = range(len(pairsList))
1609 # pairsCrossCorr = numpy.delete(pairsCrossCorr,pairsAutoCorr)
1611 # pairsCrossCorr = numpy.delete(pairsCrossCorr,pairsAutoCorr)
1610 #
1612 #
1611 # return pairsAutoCorr, pairsCrossCorr
1613 # return pairsAutoCorr, pairsCrossCorr
1612
1614
1613 def __calculateTaus(self, data_acf, data_ccf, lagRange):
1615 def __calculateTaus(self, data_acf, data_ccf, lagRange):
1614
1616
1615 lag0 = data_acf.shape[1]/2
1617 lag0 = data_acf.shape[1]/2
1616 #Funcion de Autocorrelacion
1618 #Funcion de Autocorrelacion
1617 mean_acf = stats.nanmean(data_acf, axis = 0)
1619 mean_acf = stats.nanmean(data_acf, axis = 0)
1618
1620
1619 #Obtencion Indice de TauCross
1621 #Obtencion Indice de TauCross
1620 ind_ccf = data_ccf.argmax(axis = 1)
1622 ind_ccf = data_ccf.argmax(axis = 1)
1621 #Obtencion Indice de TauAuto
1623 #Obtencion Indice de TauAuto
1622 ind_acf = numpy.zeros(ind_ccf.shape,dtype = 'int')
1624 ind_acf = numpy.zeros(ind_ccf.shape,dtype = 'int')
1623 ccf_lag0 = data_ccf[:,lag0,:]
1625 ccf_lag0 = data_ccf[:,lag0,:]
1624
1626
1625 for i in range(ccf_lag0.shape[0]):
1627 for i in range(ccf_lag0.shape[0]):
1626 ind_acf[i,:] = numpy.abs(mean_acf - ccf_lag0[i,:]).argmin(axis = 0)
1628 ind_acf[i,:] = numpy.abs(mean_acf - ccf_lag0[i,:]).argmin(axis = 0)
1627
1629
1628 #Obtencion de TauCross y TauAuto
1630 #Obtencion de TauCross y TauAuto
1629 tau_ccf = lagRange[ind_ccf]
1631 tau_ccf = lagRange[ind_ccf]
1630 tau_acf = lagRange[ind_acf]
1632 tau_acf = lagRange[ind_acf]
1631
1633
1632 Nan1, Nan2 = numpy.where(tau_ccf == lagRange[0])
1634 Nan1, Nan2 = numpy.where(tau_ccf == lagRange[0])
1633
1635
1634 tau_ccf[Nan1,Nan2] = numpy.nan
1636 tau_ccf[Nan1,Nan2] = numpy.nan
1635 tau_acf[Nan1,Nan2] = numpy.nan
1637 tau_acf[Nan1,Nan2] = numpy.nan
1636 tau = numpy.vstack((tau_ccf,tau_acf))
1638 tau = numpy.vstack((tau_ccf,tau_acf))
1637
1639
1638 return tau
1640 return tau
1639
1641
1640 def __calculateLag1Phase(self, data, lagTRange):
1642 def __calculateLag1Phase(self, data, lagTRange):
1641 data1 = stats.nanmean(data, axis = 0)
1643 data1 = stats.nanmean(data, axis = 0)
1642 lag1 = numpy.where(lagTRange == 0)[0][0] + 1
1644 lag1 = numpy.where(lagTRange == 0)[0][0] + 1
1643
1645
1644 phase = numpy.angle(data1[lag1,:])
1646 phase = numpy.angle(data1[lag1,:])
1645
1647
1646 return phase
1648 return phase
1647
1649
1648 class SpectralFitting(Operation):
1650 class SpectralFitting(Operation):
1649 '''
1651 '''
1650 Function GetMoments()
1652 Function GetMoments()
1651
1653
1652 Input:
1654 Input:
1653 Output:
1655 Output:
1654 Variables modified:
1656 Variables modified:
1655 '''
1657 '''
1656
1658
1657 def run(self, dataOut, getSNR = True, path=None, file=None, groupList=None):
1659 def run(self, dataOut, getSNR = True, path=None, file=None, groupList=None):
1658
1660
1659
1661
1660 if path != None:
1662 if path != None:
1661 sys.path.append(path)
1663 sys.path.append(path)
1662 self.dataOut.library = importlib.import_module(file)
1664 self.dataOut.library = importlib.import_module(file)
1663
1665
1664 #To be inserted as a parameter
1666 #To be inserted as a parameter
1665 groupArray = numpy.array(groupList)
1667 groupArray = numpy.array(groupList)
1666 # groupArray = numpy.array([[0,1],[2,3]])
1668 # groupArray = numpy.array([[0,1],[2,3]])
1667 self.dataOut.groupList = groupArray
1669 self.dataOut.groupList = groupArray
1668
1670
1669 nGroups = groupArray.shape[0]
1671 nGroups = groupArray.shape[0]
1670 nChannels = self.dataIn.nChannels
1672 nChannels = self.dataIn.nChannels
1671 nHeights=self.dataIn.heightList.size
1673 nHeights=self.dataIn.heightList.size
1672
1674
1673 #Parameters Array
1675 #Parameters Array
1674 self.dataOut.data_param = None
1676 self.dataOut.data_param = None
1675
1677
1676 #Set constants
1678 #Set constants
1677 constants = self.dataOut.library.setConstants(self.dataIn)
1679 constants = self.dataOut.library.setConstants(self.dataIn)
1678 self.dataOut.constants = constants
1680 self.dataOut.constants = constants
1679 M = self.dataIn.normFactor
1681 M = self.dataIn.normFactor
1680 N = self.dataIn.nFFTPoints
1682 N = self.dataIn.nFFTPoints
1681 ippSeconds = self.dataIn.ippSeconds
1683 ippSeconds = self.dataIn.ippSeconds
1682 K = self.dataIn.nIncohInt
1684 K = self.dataIn.nIncohInt
1683 pairsArray = numpy.array(self.dataIn.pairsList)
1685 pairsArray = numpy.array(self.dataIn.pairsList)
1684
1686
1685 #List of possible combinations
1687 #List of possible combinations
1686 listComb = itertools.combinations(numpy.arange(groupArray.shape[1]),2)
1688 listComb = itertools.combinations(numpy.arange(groupArray.shape[1]),2)
1687 indCross = numpy.zeros(len(list(listComb)), dtype = 'int')
1689 indCross = numpy.zeros(len(list(listComb)), dtype = 'int')
1688
1690
1689 if getSNR:
1691 if getSNR:
1690 listChannels = groupArray.reshape((groupArray.size))
1692 listChannels = groupArray.reshape((groupArray.size))
1691 listChannels.sort()
1693 listChannels.sort()
1692 noise = self.dataIn.getNoise()
1694 noise = self.dataIn.getNoise()
1693 self.dataOut.data_SNR = self.__getSNR(self.dataIn.data_spc[listChannels,:,:], noise[listChannels])
1695 self.dataOut.data_SNR = self.__getSNR(self.dataIn.data_spc[listChannels,:,:], noise[listChannels])
1694
1696
1695 for i in range(nGroups):
1697 for i in range(nGroups):
1696 coord = groupArray[i,:]
1698 coord = groupArray[i,:]
1697
1699
1698 #Input data array
1700 #Input data array
1699 data = self.dataIn.data_spc[coord,:,:]/(M*N)
1701 data = self.dataIn.data_spc[coord,:,:]/(M*N)
1700 data = data.reshape((data.shape[0]*data.shape[1],data.shape[2]))
1702 data = data.reshape((data.shape[0]*data.shape[1],data.shape[2]))
1701
1703
1702 #Cross Spectra data array for Covariance Matrixes
1704 #Cross Spectra data array for Covariance Matrixes
1703 ind = 0
1705 ind = 0
1704 for pairs in listComb:
1706 for pairs in listComb:
1705 pairsSel = numpy.array([coord[x],coord[y]])
1707 pairsSel = numpy.array([coord[x],coord[y]])
1706 indCross[ind] = int(numpy.where(numpy.all(pairsArray == pairsSel, axis = 1))[0][0])
1708 indCross[ind] = int(numpy.where(numpy.all(pairsArray == pairsSel, axis = 1))[0][0])
1707 ind += 1
1709 ind += 1
1708 dataCross = self.dataIn.data_cspc[indCross,:,:]/(M*N)
1710 dataCross = self.dataIn.data_cspc[indCross,:,:]/(M*N)
1709 dataCross = dataCross**2/K
1711 dataCross = dataCross**2/K
1710
1712
1711 for h in range(nHeights):
1713 for h in range(nHeights):
1712 # print self.dataOut.heightList[h]
1714 # print self.dataOut.heightList[h]
1713
1715
1714 #Input
1716 #Input
1715 d = data[:,h]
1717 d = data[:,h]
1716
1718
1717 #Covariance Matrix
1719 #Covariance Matrix
1718 D = numpy.diag(d**2/K)
1720 D = numpy.diag(d**2/K)
1719 ind = 0
1721 ind = 0
1720 for pairs in listComb:
1722 for pairs in listComb:
1721 #Coordinates in Covariance Matrix
1723 #Coordinates in Covariance Matrix
1722 x = pairs[0]
1724 x = pairs[0]
1723 y = pairs[1]
1725 y = pairs[1]
1724 #Channel Index
1726 #Channel Index
1725 S12 = dataCross[ind,:,h]
1727 S12 = dataCross[ind,:,h]
1726 D12 = numpy.diag(S12)
1728 D12 = numpy.diag(S12)
1727 #Completing Covariance Matrix with Cross Spectras
1729 #Completing Covariance Matrix with Cross Spectras
1728 D[x*N:(x+1)*N,y*N:(y+1)*N] = D12
1730 D[x*N:(x+1)*N,y*N:(y+1)*N] = D12
1729 D[y*N:(y+1)*N,x*N:(x+1)*N] = D12
1731 D[y*N:(y+1)*N,x*N:(x+1)*N] = D12
1730 ind += 1
1732 ind += 1
1731 Dinv=numpy.linalg.inv(D)
1733 Dinv=numpy.linalg.inv(D)
1732 L=numpy.linalg.cholesky(Dinv)
1734 L=numpy.linalg.cholesky(Dinv)
1733 LT=L.T
1735 LT=L.T
1734
1736
1735 dp = numpy.dot(LT,d)
1737 dp = numpy.dot(LT,d)
1736
1738
1737 #Initial values
1739 #Initial values
1738 data_spc = self.dataIn.data_spc[coord,:,h]
1740 data_spc = self.dataIn.data_spc[coord,:,h]
1739
1741
1740 if (h>0)and(error1[3]<5):
1742 if (h>0)and(error1[3]<5):
1741 p0 = self.dataOut.data_param[i,:,h-1]
1743 p0 = self.dataOut.data_param[i,:,h-1]
1742 else:
1744 else:
1743 p0 = numpy.array(self.dataOut.library.initialValuesFunction(data_spc, constants, i))
1745 p0 = numpy.array(self.dataOut.library.initialValuesFunction(data_spc, constants, i))
1744
1746
1745 try:
1747 try:
1746 #Least Squares
1748 #Least Squares
1747 minp,covp,infodict,mesg,ier = optimize.leastsq(self.__residFunction,p0,args=(dp,LT,constants),full_output=True)
1749 minp,covp,infodict,mesg,ier = optimize.leastsq(self.__residFunction,p0,args=(dp,LT,constants),full_output=True)
1748 # minp,covp = optimize.leastsq(self.__residFunction,p0,args=(dp,LT,constants))
1750 # minp,covp = optimize.leastsq(self.__residFunction,p0,args=(dp,LT,constants))
1749 #Chi square error
1751 #Chi square error
1750 error0 = numpy.sum(infodict['fvec']**2)/(2*N)
1752 error0 = numpy.sum(infodict['fvec']**2)/(2*N)
1751 #Error with Jacobian
1753 #Error with Jacobian
1752 error1 = self.dataOut.library.errorFunction(minp,constants,LT)
1754 error1 = self.dataOut.library.errorFunction(minp,constants,LT)
1753 except:
1755 except:
1754 minp = p0*numpy.nan
1756 minp = p0*numpy.nan
1755 error0 = numpy.nan
1757 error0 = numpy.nan
1756 error1 = p0*numpy.nan
1758 error1 = p0*numpy.nan
1757
1759
1758 #Save
1760 #Save
1759 if self.dataOut.data_param == None:
1761 if self.dataOut.data_param == None:
1760 self.dataOut.data_param = numpy.zeros((nGroups, p0.size, nHeights))*numpy.nan
1762 self.dataOut.data_param = numpy.zeros((nGroups, p0.size, nHeights))*numpy.nan
1761 self.dataOut.data_error = numpy.zeros((nGroups, p0.size + 1, nHeights))*numpy.nan
1763 self.dataOut.data_error = numpy.zeros((nGroups, p0.size + 1, nHeights))*numpy.nan
1762
1764
1763 self.dataOut.data_error[i,:,h] = numpy.hstack((error0,error1))
1765 self.dataOut.data_error[i,:,h] = numpy.hstack((error0,error1))
1764 self.dataOut.data_param[i,:,h] = minp
1766 self.dataOut.data_param[i,:,h] = minp
1765 return
1767 return
1766
1768
1767 def __residFunction(self, p, dp, LT, constants):
1769 def __residFunction(self, p, dp, LT, constants):
1768
1770
1769 fm = self.dataOut.library.modelFunction(p, constants)
1771 fm = self.dataOut.library.modelFunction(p, constants)
1770 fmp=numpy.dot(LT,fm)
1772 fmp=numpy.dot(LT,fm)
1771
1773
1772 return dp-fmp
1774 return dp-fmp
1773
1775
1774 def __getSNR(self, z, noise):
1776 def __getSNR(self, z, noise):
1775
1777
1776 avg = numpy.average(z, axis=1)
1778 avg = numpy.average(z, axis=1)
1777 SNR = (avg.T-noise)/noise
1779 SNR = (avg.T-noise)/noise
1778 SNR = SNR.T
1780 SNR = SNR.T
1779 return SNR
1781 return SNR
1780
1782
1781 def __chisq(p,chindex,hindex):
1783 def __chisq(p,chindex,hindex):
1782 #similar to Resid but calculates CHI**2
1784 #similar to Resid but calculates CHI**2
1783 [LT,d,fm]=setupLTdfm(p,chindex,hindex)
1785 [LT,d,fm]=setupLTdfm(p,chindex,hindex)
1784 dp=numpy.dot(LT,d)
1786 dp=numpy.dot(LT,d)
1785 fmp=numpy.dot(LT,fm)
1787 fmp=numpy.dot(LT,fm)
1786 chisq=numpy.dot((dp-fmp).T,(dp-fmp))
1788 chisq=numpy.dot((dp-fmp).T,(dp-fmp))
1787 return chisq
1789 return chisq
1788
1790
1789 class WindProfiler(Operation):
1791 class WindProfiler(Operation):
1790
1792
1791 __isConfig = False
1793 __isConfig = False
1792
1794
1793 __initime = None
1795 __initime = None
1794 __lastdatatime = None
1796 __lastdatatime = None
1795 __integrationtime = None
1797 __integrationtime = None
1796
1798
1797 __buffer = None
1799 __buffer = None
1798
1800
1799 __dataReady = False
1801 __dataReady = False
1800
1802
1801 __firstdata = None
1803 __firstdata = None
1802
1804
1803 n = None
1805 n = None
1804
1806
1805 def __init__(self, **kwargs):
1807 def __init__(self, **kwargs):
1806 Operation.__init__(self, **kwargs)
1808 Operation.__init__(self, **kwargs)
1807
1809
1808 def __calculateCosDir(self, elev, azim):
1810 def __calculateCosDir(self, elev, azim):
1809 zen = (90 - elev)*numpy.pi/180
1811 zen = (90 - elev)*numpy.pi/180
1810 azim = azim*numpy.pi/180
1812 azim = azim*numpy.pi/180
1811 cosDirX = numpy.sqrt((1-numpy.cos(zen)**2)/((1+numpy.tan(azim)**2)))
1813 cosDirX = numpy.sqrt((1-numpy.cos(zen)**2)/((1+numpy.tan(azim)**2)))
1812 cosDirY = numpy.sqrt(1-numpy.cos(zen)**2-cosDirX**2)
1814 cosDirY = numpy.sqrt(1-numpy.cos(zen)**2-cosDirX**2)
1813
1815
1814 signX = numpy.sign(numpy.cos(azim))
1816 signX = numpy.sign(numpy.cos(azim))
1815 signY = numpy.sign(numpy.sin(azim))
1817 signY = numpy.sign(numpy.sin(azim))
1816
1818
1817 cosDirX = numpy.copysign(cosDirX, signX)
1819 cosDirX = numpy.copysign(cosDirX, signX)
1818 cosDirY = numpy.copysign(cosDirY, signY)
1820 cosDirY = numpy.copysign(cosDirY, signY)
1819 return cosDirX, cosDirY
1821 return cosDirX, cosDirY
1820
1822
1821 def __calculateAngles(self, theta_x, theta_y, azimuth):
1823 def __calculateAngles(self, theta_x, theta_y, azimuth):
1822
1824
1823 dir_cosw = numpy.sqrt(1-theta_x**2-theta_y**2)
1825 dir_cosw = numpy.sqrt(1-theta_x**2-theta_y**2)
1824 zenith_arr = numpy.arccos(dir_cosw)
1826 zenith_arr = numpy.arccos(dir_cosw)
1825 azimuth_arr = numpy.arctan2(theta_x,theta_y) + azimuth*math.pi/180
1827 azimuth_arr = numpy.arctan2(theta_x,theta_y) + azimuth*math.pi/180
1826
1828
1827 dir_cosu = numpy.sin(azimuth_arr)*numpy.sin(zenith_arr)
1829 dir_cosu = numpy.sin(azimuth_arr)*numpy.sin(zenith_arr)
1828 dir_cosv = numpy.cos(azimuth_arr)*numpy.sin(zenith_arr)
1830 dir_cosv = numpy.cos(azimuth_arr)*numpy.sin(zenith_arr)
1829
1831
1830 return azimuth_arr, zenith_arr, dir_cosu, dir_cosv, dir_cosw
1832 return azimuth_arr, zenith_arr, dir_cosu, dir_cosv, dir_cosw
1831
1833
1832 def __calculateMatA(self, dir_cosu, dir_cosv, dir_cosw, horOnly):
1834 def __calculateMatA(self, dir_cosu, dir_cosv, dir_cosw, horOnly):
1833
1835
1834 #
1836 #
1835 if horOnly:
1837 if horOnly:
1836 A = numpy.c_[dir_cosu,dir_cosv]
1838 A = numpy.c_[dir_cosu,dir_cosv]
1837 else:
1839 else:
1838 A = numpy.c_[dir_cosu,dir_cosv,dir_cosw]
1840 A = numpy.c_[dir_cosu,dir_cosv,dir_cosw]
1839 A = numpy.asmatrix(A)
1841 A = numpy.asmatrix(A)
1840 A1 = numpy.linalg.inv(A.transpose()*A)*A.transpose()
1842 A1 = numpy.linalg.inv(A.transpose()*A)*A.transpose()
1841
1843
1842 return A1
1844 return A1
1843
1845
1844 def __correctValues(self, heiRang, phi, velRadial, SNR):
1846 def __correctValues(self, heiRang, phi, velRadial, SNR):
1845 listPhi = phi.tolist()
1847 listPhi = phi.tolist()
1846 maxid = listPhi.index(max(listPhi))
1848 maxid = listPhi.index(max(listPhi))
1847 minid = listPhi.index(min(listPhi))
1849 minid = listPhi.index(min(listPhi))
1848
1850
1849 rango = range(len(phi))
1851 rango = range(len(phi))
1850 # rango = numpy.delete(rango,maxid)
1852 # rango = numpy.delete(rango,maxid)
1851
1853
1852 heiRang1 = heiRang*math.cos(phi[maxid])
1854 heiRang1 = heiRang*math.cos(phi[maxid])
1853 heiRangAux = heiRang*math.cos(phi[minid])
1855 heiRangAux = heiRang*math.cos(phi[minid])
1854 indOut = (heiRang1 < heiRangAux[0]).nonzero()
1856 indOut = (heiRang1 < heiRangAux[0]).nonzero()
1855 heiRang1 = numpy.delete(heiRang1,indOut)
1857 heiRang1 = numpy.delete(heiRang1,indOut)
1856
1858
1857 velRadial1 = numpy.zeros([len(phi),len(heiRang1)])
1859 velRadial1 = numpy.zeros([len(phi),len(heiRang1)])
1858 SNR1 = numpy.zeros([len(phi),len(heiRang1)])
1860 SNR1 = numpy.zeros([len(phi),len(heiRang1)])
1859
1861
1860 for i in rango:
1862 for i in rango:
1861 x = heiRang*math.cos(phi[i])
1863 x = heiRang*math.cos(phi[i])
1862 y1 = velRadial[i,:]
1864 y1 = velRadial[i,:]
1863 f1 = interpolate.interp1d(x,y1,kind = 'cubic')
1865 f1 = interpolate.interp1d(x,y1,kind = 'cubic')
1864
1866
1865 x1 = heiRang1
1867 x1 = heiRang1
1866 y11 = f1(x1)
1868 y11 = f1(x1)
1867
1869
1868 y2 = SNR[i,:]
1870 y2 = SNR[i,:]
1869 f2 = interpolate.interp1d(x,y2,kind = 'cubic')
1871 f2 = interpolate.interp1d(x,y2,kind = 'cubic')
1870 y21 = f2(x1)
1872 y21 = f2(x1)
1871
1873
1872 velRadial1[i,:] = y11
1874 velRadial1[i,:] = y11
1873 SNR1[i,:] = y21
1875 SNR1[i,:] = y21
1874
1876
1875 return heiRang1, velRadial1, SNR1
1877 return heiRang1, velRadial1, SNR1
1876
1878
1877 def __calculateVelUVW(self, A, velRadial):
1879 def __calculateVelUVW(self, A, velRadial):
1878
1880
1879 #Operacion Matricial
1881 #Operacion Matricial
1880 # velUVW = numpy.zeros((velRadial.shape[1],3))
1882 # velUVW = numpy.zeros((velRadial.shape[1],3))
1881 # for ind in range(velRadial.shape[1]):
1883 # for ind in range(velRadial.shape[1]):
1882 # velUVW[ind,:] = numpy.dot(A,velRadial[:,ind])
1884 # velUVW[ind,:] = numpy.dot(A,velRadial[:,ind])
1883 # velUVW = velUVW.transpose()
1885 # velUVW = velUVW.transpose()
1884 velUVW = numpy.zeros((A.shape[0],velRadial.shape[1]))
1886 velUVW = numpy.zeros((A.shape[0],velRadial.shape[1]))
1885 velUVW[:,:] = numpy.dot(A,velRadial)
1887 velUVW[:,:] = numpy.dot(A,velRadial)
1886
1888
1887
1889
1888 return velUVW
1890 return velUVW
1889
1891
1890 # def techniqueDBS(self, velRadial0, dirCosx, disrCosy, azimuth, correct, horizontalOnly, heiRang, SNR0):
1892 # def techniqueDBS(self, velRadial0, dirCosx, disrCosy, azimuth, correct, horizontalOnly, heiRang, SNR0):
1891
1893
1892 def techniqueDBS(self, kwargs):
1894 def techniqueDBS(self, kwargs):
1893 """
1895 """
1894 Function that implements Doppler Beam Swinging (DBS) technique.
1896 Function that implements Doppler Beam Swinging (DBS) technique.
1895
1897
1896 Input: Radial velocities, Direction cosines (x and y) of the Beam, Antenna azimuth,
1898 Input: Radial velocities, Direction cosines (x and y) of the Beam, Antenna azimuth,
1897 Direction correction (if necessary), Ranges and SNR
1899 Direction correction (if necessary), Ranges and SNR
1898
1900
1899 Output: Winds estimation (Zonal, Meridional and Vertical)
1901 Output: Winds estimation (Zonal, Meridional and Vertical)
1900
1902
1901 Parameters affected: Winds, height range, SNR
1903 Parameters affected: Winds, height range, SNR
1902 """
1904 """
1903 velRadial0 = kwargs['velRadial']
1905 velRadial0 = kwargs['velRadial']
1904 heiRang = kwargs['heightList']
1906 heiRang = kwargs['heightList']
1905 SNR0 = kwargs['SNR']
1907 SNR0 = kwargs['SNR']
1906
1908
1907 if kwargs.has_key('dirCosx') and kwargs.has_key('dirCosy'):
1909 if kwargs.has_key('dirCosx') and kwargs.has_key('dirCosy'):
1908 theta_x = numpy.array(kwargs['dirCosx'])
1910 theta_x = numpy.array(kwargs['dirCosx'])
1909 theta_y = numpy.array(kwargs['dirCosy'])
1911 theta_y = numpy.array(kwargs['dirCosy'])
1910 else:
1912 else:
1911 elev = numpy.array(kwargs['elevation'])
1913 elev = numpy.array(kwargs['elevation'])
1912 azim = numpy.array(kwargs['azimuth'])
1914 azim = numpy.array(kwargs['azimuth'])
1913 theta_x, theta_y = self.__calculateCosDir(elev, azim)
1915 theta_x, theta_y = self.__calculateCosDir(elev, azim)
1914 azimuth = kwargs['correctAzimuth']
1916 azimuth = kwargs['correctAzimuth']
1915 if kwargs.has_key('horizontalOnly'):
1917 if kwargs.has_key('horizontalOnly'):
1916 horizontalOnly = kwargs['horizontalOnly']
1918 horizontalOnly = kwargs['horizontalOnly']
1917 else: horizontalOnly = False
1919 else: horizontalOnly = False
1918 if kwargs.has_key('correctFactor'):
1920 if kwargs.has_key('correctFactor'):
1919 correctFactor = kwargs['correctFactor']
1921 correctFactor = kwargs['correctFactor']
1920 else: correctFactor = 1
1922 else: correctFactor = 1
1921 if kwargs.has_key('channelList'):
1923 if kwargs.has_key('channelList'):
1922 channelList = kwargs['channelList']
1924 channelList = kwargs['channelList']
1923 if len(channelList) == 2:
1925 if len(channelList) == 2:
1924 horizontalOnly = True
1926 horizontalOnly = True
1925 arrayChannel = numpy.array(channelList)
1927 arrayChannel = numpy.array(channelList)
1926 param = param[arrayChannel,:,:]
1928 param = param[arrayChannel,:,:]
1927 theta_x = theta_x[arrayChannel]
1929 theta_x = theta_x[arrayChannel]
1928 theta_y = theta_y[arrayChannel]
1930 theta_y = theta_y[arrayChannel]
1929
1931
1930 azimuth_arr, zenith_arr, dir_cosu, dir_cosv, dir_cosw = self.__calculateAngles(theta_x, theta_y, azimuth)
1932 azimuth_arr, zenith_arr, dir_cosu, dir_cosv, dir_cosw = self.__calculateAngles(theta_x, theta_y, azimuth)
1931 heiRang1, velRadial1, SNR1 = self.__correctValues(heiRang, zenith_arr, correctFactor*velRadial0, SNR0)
1933 heiRang1, velRadial1, SNR1 = self.__correctValues(heiRang, zenith_arr, correctFactor*velRadial0, SNR0)
1932 A = self.__calculateMatA(dir_cosu, dir_cosv, dir_cosw, horizontalOnly)
1934 A = self.__calculateMatA(dir_cosu, dir_cosv, dir_cosw, horizontalOnly)
1933
1935
1934 #Calculo de Componentes de la velocidad con DBS
1936 #Calculo de Componentes de la velocidad con DBS
1935 winds = self.__calculateVelUVW(A,velRadial1)
1937 winds = self.__calculateVelUVW(A,velRadial1)
1936
1938
1937 return winds, heiRang1, SNR1
1939 return winds, heiRang1, SNR1
1938
1940
1939 def __calculateDistance(self, posx, posy, pairs_ccf, azimuth = None):
1941 def __calculateDistance(self, posx, posy, pairs_ccf, azimuth = None):
1940
1942
1941 nPairs = len(pairs_ccf)
1943 nPairs = len(pairs_ccf)
1942 posx = numpy.asarray(posx)
1944 posx = numpy.asarray(posx)
1943 posy = numpy.asarray(posy)
1945 posy = numpy.asarray(posy)
1944
1946
1945 #Rotacion Inversa para alinear con el azimuth
1947 #Rotacion Inversa para alinear con el azimuth
1946 if azimuth!= None:
1948 if azimuth!= None:
1947 azimuth = azimuth*math.pi/180
1949 azimuth = azimuth*math.pi/180
1948 posx1 = posx*math.cos(azimuth) + posy*math.sin(azimuth)
1950 posx1 = posx*math.cos(azimuth) + posy*math.sin(azimuth)
1949 posy1 = -posx*math.sin(azimuth) + posy*math.cos(azimuth)
1951 posy1 = -posx*math.sin(azimuth) + posy*math.cos(azimuth)
1950 else:
1952 else:
1951 posx1 = posx
1953 posx1 = posx
1952 posy1 = posy
1954 posy1 = posy
1953
1955
1954 #Calculo de Distancias
1956 #Calculo de Distancias
1955 distx = numpy.zeros(nPairs)
1957 distx = numpy.zeros(nPairs)
1956 disty = numpy.zeros(nPairs)
1958 disty = numpy.zeros(nPairs)
1957 dist = numpy.zeros(nPairs)
1959 dist = numpy.zeros(nPairs)
1958 ang = numpy.zeros(nPairs)
1960 ang = numpy.zeros(nPairs)
1959
1961
1960 for i in range(nPairs):
1962 for i in range(nPairs):
1961 distx[i] = posx1[pairs_ccf[i][1]] - posx1[pairs_ccf[i][0]]
1963 distx[i] = posx1[pairs_ccf[i][1]] - posx1[pairs_ccf[i][0]]
1962 disty[i] = posy1[pairs_ccf[i][1]] - posy1[pairs_ccf[i][0]]
1964 disty[i] = posy1[pairs_ccf[i][1]] - posy1[pairs_ccf[i][0]]
1963 dist[i] = numpy.sqrt(distx[i]**2 + disty[i]**2)
1965 dist[i] = numpy.sqrt(distx[i]**2 + disty[i]**2)
1964 ang[i] = numpy.arctan2(disty[i],distx[i])
1966 ang[i] = numpy.arctan2(disty[i],distx[i])
1965
1967
1966 return distx, disty, dist, ang
1968 return distx, disty, dist, ang
1967 #Calculo de Matrices
1969 #Calculo de Matrices
1968 # nPairs = len(pairs)
1970 # nPairs = len(pairs)
1969 # ang1 = numpy.zeros((nPairs, 2, 1))
1971 # ang1 = numpy.zeros((nPairs, 2, 1))
1970 # dist1 = numpy.zeros((nPairs, 2, 1))
1972 # dist1 = numpy.zeros((nPairs, 2, 1))
1971 #
1973 #
1972 # for j in range(nPairs):
1974 # for j in range(nPairs):
1973 # dist1[j,0,0] = dist[pairs[j][0]]
1975 # dist1[j,0,0] = dist[pairs[j][0]]
1974 # dist1[j,1,0] = dist[pairs[j][1]]
1976 # dist1[j,1,0] = dist[pairs[j][1]]
1975 # ang1[j,0,0] = ang[pairs[j][0]]
1977 # ang1[j,0,0] = ang[pairs[j][0]]
1976 # ang1[j,1,0] = ang[pairs[j][1]]
1978 # ang1[j,1,0] = ang[pairs[j][1]]
1977 #
1979 #
1978 # return distx,disty, dist1,ang1
1980 # return distx,disty, dist1,ang1
1979
1981
1980
1982
1981 def __calculateVelVer(self, phase, lagTRange, _lambda):
1983 def __calculateVelVer(self, phase, lagTRange, _lambda):
1982
1984
1983 Ts = lagTRange[1] - lagTRange[0]
1985 Ts = lagTRange[1] - lagTRange[0]
1984 velW = -_lambda*phase/(4*math.pi*Ts)
1986 velW = -_lambda*phase/(4*math.pi*Ts)
1985
1987
1986 return velW
1988 return velW
1987
1989
1988 def __calculateVelHorDir(self, dist, tau1, tau2, ang):
1990 def __calculateVelHorDir(self, dist, tau1, tau2, ang):
1989 nPairs = tau1.shape[0]
1991 nPairs = tau1.shape[0]
1990 nHeights = tau1.shape[1]
1992 nHeights = tau1.shape[1]
1991 vel = numpy.zeros((nPairs,3,nHeights))
1993 vel = numpy.zeros((nPairs,3,nHeights))
1992 dist1 = numpy.reshape(dist, (dist.size,1))
1994 dist1 = numpy.reshape(dist, (dist.size,1))
1993
1995
1994 angCos = numpy.cos(ang)
1996 angCos = numpy.cos(ang)
1995 angSin = numpy.sin(ang)
1997 angSin = numpy.sin(ang)
1996
1998
1997 vel0 = dist1*tau1/(2*tau2**2)
1999 vel0 = dist1*tau1/(2*tau2**2)
1998 vel[:,0,:] = (vel0*angCos).sum(axis = 1)
2000 vel[:,0,:] = (vel0*angCos).sum(axis = 1)
1999 vel[:,1,:] = (vel0*angSin).sum(axis = 1)
2001 vel[:,1,:] = (vel0*angSin).sum(axis = 1)
2000
2002
2001 ind = numpy.where(numpy.isinf(vel))
2003 ind = numpy.where(numpy.isinf(vel))
2002 vel[ind] = numpy.nan
2004 vel[ind] = numpy.nan
2003
2005
2004 return vel
2006 return vel
2005
2007
2006 # def __getPairsAutoCorr(self, pairsList, nChannels):
2008 # def __getPairsAutoCorr(self, pairsList, nChannels):
2007 #
2009 #
2008 # pairsAutoCorr = numpy.zeros(nChannels, dtype = 'int')*numpy.nan
2010 # pairsAutoCorr = numpy.zeros(nChannels, dtype = 'int')*numpy.nan
2009 #
2011 #
2010 # for l in range(len(pairsList)):
2012 # for l in range(len(pairsList)):
2011 # firstChannel = pairsList[l][0]
2013 # firstChannel = pairsList[l][0]
2012 # secondChannel = pairsList[l][1]
2014 # secondChannel = pairsList[l][1]
2013 #
2015 #
2014 # #Obteniendo pares de Autocorrelacion
2016 # #Obteniendo pares de Autocorrelacion
2015 # if firstChannel == secondChannel:
2017 # if firstChannel == secondChannel:
2016 # pairsAutoCorr[firstChannel] = int(l)
2018 # pairsAutoCorr[firstChannel] = int(l)
2017 #
2019 #
2018 # pairsAutoCorr = pairsAutoCorr.astype(int)
2020 # pairsAutoCorr = pairsAutoCorr.astype(int)
2019 #
2021 #
2020 # pairsCrossCorr = range(len(pairsList))
2022 # pairsCrossCorr = range(len(pairsList))
2021 # pairsCrossCorr = numpy.delete(pairsCrossCorr,pairsAutoCorr)
2023 # pairsCrossCorr = numpy.delete(pairsCrossCorr,pairsAutoCorr)
2022 #
2024 #
2023 # return pairsAutoCorr, pairsCrossCorr
2025 # return pairsAutoCorr, pairsCrossCorr
2024
2026
2025 # def techniqueSA(self, pairsSelected, pairsList, nChannels, tau, azimuth, _lambda, position_x, position_y, lagTRange, correctFactor):
2027 # def techniqueSA(self, pairsSelected, pairsList, nChannels, tau, azimuth, _lambda, position_x, position_y, lagTRange, correctFactor):
2026 def techniqueSA(self, kwargs):
2028 def techniqueSA(self, kwargs):
2027
2029
2028 """
2030 """
2029 Function that implements Spaced Antenna (SA) technique.
2031 Function that implements Spaced Antenna (SA) technique.
2030
2032
2031 Input: Radial velocities, Direction cosines (x and y) of the Beam, Antenna azimuth,
2033 Input: Radial velocities, Direction cosines (x and y) of the Beam, Antenna azimuth,
2032 Direction correction (if necessary), Ranges and SNR
2034 Direction correction (if necessary), Ranges and SNR
2033
2035
2034 Output: Winds estimation (Zonal, Meridional and Vertical)
2036 Output: Winds estimation (Zonal, Meridional and Vertical)
2035
2037
2036 Parameters affected: Winds
2038 Parameters affected: Winds
2037 """
2039 """
2038 position_x = kwargs['positionX']
2040 position_x = kwargs['positionX']
2039 position_y = kwargs['positionY']
2041 position_y = kwargs['positionY']
2040 azimuth = kwargs['azimuth']
2042 azimuth = kwargs['azimuth']
2041
2043
2042 if kwargs.has_key('correctFactor'):
2044 if kwargs.has_key('correctFactor'):
2043 correctFactor = kwargs['correctFactor']
2045 correctFactor = kwargs['correctFactor']
2044 else:
2046 else:
2045 correctFactor = 1
2047 correctFactor = 1
2046
2048
2047 groupList = kwargs['groupList']
2049 groupList = kwargs['groupList']
2048 pairs_ccf = groupList[1]
2050 pairs_ccf = groupList[1]
2049 tau = kwargs['tau']
2051 tau = kwargs['tau']
2050 _lambda = kwargs['_lambda']
2052 _lambda = kwargs['_lambda']
2051
2053
2052 #Cross Correlation pairs obtained
2054 #Cross Correlation pairs obtained
2053 # pairsAutoCorr, pairsCrossCorr = self.__getPairsAutoCorr(pairssList, nChannels)
2055 # pairsAutoCorr, pairsCrossCorr = self.__getPairsAutoCorr(pairssList, nChannels)
2054 # pairsArray = numpy.array(pairsList)[pairsCrossCorr]
2056 # pairsArray = numpy.array(pairsList)[pairsCrossCorr]
2055 # pairsSelArray = numpy.array(pairsSelected)
2057 # pairsSelArray = numpy.array(pairsSelected)
2056 # pairs = []
2058 # pairs = []
2057 #
2059 #
2058 # #Wind estimation pairs obtained
2060 # #Wind estimation pairs obtained
2059 # for i in range(pairsSelArray.shape[0]/2):
2061 # for i in range(pairsSelArray.shape[0]/2):
2060 # ind1 = numpy.where(numpy.all(pairsArray == pairsSelArray[2*i], axis = 1))[0][0]
2062 # ind1 = numpy.where(numpy.all(pairsArray == pairsSelArray[2*i], axis = 1))[0][0]
2061 # ind2 = numpy.where(numpy.all(pairsArray == pairsSelArray[2*i + 1], axis = 1))[0][0]
2063 # ind2 = numpy.where(numpy.all(pairsArray == pairsSelArray[2*i + 1], axis = 1))[0][0]
2062 # pairs.append((ind1,ind2))
2064 # pairs.append((ind1,ind2))
2063
2065
2064 indtau = tau.shape[0]/2
2066 indtau = tau.shape[0]/2
2065 tau1 = tau[:indtau,:]
2067 tau1 = tau[:indtau,:]
2066 tau2 = tau[indtau:-1,:]
2068 tau2 = tau[indtau:-1,:]
2067 # tau1 = tau1[pairs,:]
2069 # tau1 = tau1[pairs,:]
2068 # tau2 = tau2[pairs,:]
2070 # tau2 = tau2[pairs,:]
2069 phase1 = tau[-1,:]
2071 phase1 = tau[-1,:]
2070
2072
2071 #---------------------------------------------------------------------
2073 #---------------------------------------------------------------------
2072 #Metodo Directo
2074 #Metodo Directo
2073 distx, disty, dist, ang = self.__calculateDistance(position_x, position_y, pairs_ccf,azimuth)
2075 distx, disty, dist, ang = self.__calculateDistance(position_x, position_y, pairs_ccf,azimuth)
2074 winds = self.__calculateVelHorDir(dist, tau1, tau2, ang)
2076 winds = self.__calculateVelHorDir(dist, tau1, tau2, ang)
2075 winds = stats.nanmean(winds, axis=0)
2077 winds = stats.nanmean(winds, axis=0)
2076 #---------------------------------------------------------------------
2078 #---------------------------------------------------------------------
2077 #Metodo General
2079 #Metodo General
2078 # distx, disty, dist = self.calculateDistance(position_x,position_y,pairsCrossCorr, pairsList, azimuth)
2080 # distx, disty, dist = self.calculateDistance(position_x,position_y,pairsCrossCorr, pairsList, azimuth)
2079 # #Calculo Coeficientes de Funcion de Correlacion
2081 # #Calculo Coeficientes de Funcion de Correlacion
2080 # F,G,A,B,H = self.calculateCoef(tau1,tau2,distx,disty,n)
2082 # F,G,A,B,H = self.calculateCoef(tau1,tau2,distx,disty,n)
2081 # #Calculo de Velocidades
2083 # #Calculo de Velocidades
2082 # winds = self.calculateVelUV(F,G,A,B,H)
2084 # winds = self.calculateVelUV(F,G,A,B,H)
2083
2085
2084 #---------------------------------------------------------------------
2086 #---------------------------------------------------------------------
2085 winds[2,:] = self.__calculateVelVer(phase1, lagTRange, _lambda)
2087 winds[2,:] = self.__calculateVelVer(phase1, lagTRange, _lambda)
2086 winds = correctFactor*winds
2088 winds = correctFactor*winds
2087 return winds
2089 return winds
2088
2090
2089 def __checkTime(self, currentTime, paramInterval, outputInterval):
2091 def __checkTime(self, currentTime, paramInterval, outputInterval):
2090
2092
2091 dataTime = currentTime + paramInterval
2093 dataTime = currentTime + paramInterval
2092 deltaTime = dataTime - self.__initime
2094 deltaTime = dataTime - self.__initime
2093
2095
2094 if deltaTime >= outputInterval or deltaTime < 0:
2096 if deltaTime >= outputInterval or deltaTime < 0:
2095 self.__dataReady = True
2097 self.__dataReady = True
2096 return
2098 return
2097
2099
2098 def techniqueMeteors(self, arrayMeteor, meteorThresh, heightMin, heightMax):
2100 def techniqueMeteors(self, arrayMeteor, meteorThresh, heightMin, heightMax):
2099 '''
2101 '''
2100 Function that implements winds estimation technique with detected meteors.
2102 Function that implements winds estimation technique with detected meteors.
2101
2103
2102 Input: Detected meteors, Minimum meteor quantity to wind estimation
2104 Input: Detected meteors, Minimum meteor quantity to wind estimation
2103
2105
2104 Output: Winds estimation (Zonal and Meridional)
2106 Output: Winds estimation (Zonal and Meridional)
2105
2107
2106 Parameters affected: Winds
2108 Parameters affected: Winds
2107 '''
2109 '''
2108 # print arrayMeteor.shape
2110 # print arrayMeteor.shape
2109 #Settings
2111 #Settings
2110 nInt = (heightMax - heightMin)/2
2112 nInt = (heightMax - heightMin)/2
2111 # print nInt
2113 # print nInt
2112 nInt = int(nInt)
2114 nInt = int(nInt)
2113 # print nInt
2115 # print nInt
2114 winds = numpy.zeros((2,nInt))*numpy.nan
2116 winds = numpy.zeros((2,nInt))*numpy.nan
2115
2117
2116 #Filter errors
2118 #Filter errors
2117 error = numpy.where(arrayMeteor[:,-1] == 0)[0]
2119 error = numpy.where(arrayMeteor[:,-1] == 0)[0]
2118 finalMeteor = arrayMeteor[error,:]
2120 finalMeteor = arrayMeteor[error,:]
2119
2121
2120 #Meteor Histogram
2122 #Meteor Histogram
2121 finalHeights = finalMeteor[:,2]
2123 finalHeights = finalMeteor[:,2]
2122 hist = numpy.histogram(finalHeights, bins = nInt, range = (heightMin,heightMax))
2124 hist = numpy.histogram(finalHeights, bins = nInt, range = (heightMin,heightMax))
2123 nMeteorsPerI = hist[0]
2125 nMeteorsPerI = hist[0]
2124 heightPerI = hist[1]
2126 heightPerI = hist[1]
2125
2127
2126 #Sort of meteors
2128 #Sort of meteors
2127 indSort = finalHeights.argsort()
2129 indSort = finalHeights.argsort()
2128 finalMeteor2 = finalMeteor[indSort,:]
2130 finalMeteor2 = finalMeteor[indSort,:]
2129
2131
2130 # Calculating winds
2132 # Calculating winds
2131 ind1 = 0
2133 ind1 = 0
2132 ind2 = 0
2134 ind2 = 0
2133
2135
2134 for i in range(nInt):
2136 for i in range(nInt):
2135 nMet = nMeteorsPerI[i]
2137 nMet = nMeteorsPerI[i]
2136 ind1 = ind2
2138 ind1 = ind2
2137 ind2 = ind1 + nMet
2139 ind2 = ind1 + nMet
2138
2140
2139 meteorAux = finalMeteor2[ind1:ind2,:]
2141 meteorAux = finalMeteor2[ind1:ind2,:]
2140
2142
2141 if meteorAux.shape[0] >= meteorThresh:
2143 if meteorAux.shape[0] >= meteorThresh:
2142 vel = meteorAux[:, 6]
2144 vel = meteorAux[:, 6]
2143 zen = meteorAux[:, 4]*numpy.pi/180
2145 zen = meteorAux[:, 4]*numpy.pi/180
2144 azim = meteorAux[:, 3]*numpy.pi/180
2146 azim = meteorAux[:, 3]*numpy.pi/180
2145
2147
2146 n = numpy.cos(zen)
2148 n = numpy.cos(zen)
2147 # m = (1 - n**2)/(1 - numpy.tan(azim)**2)
2149 # m = (1 - n**2)/(1 - numpy.tan(azim)**2)
2148 # l = m*numpy.tan(azim)
2150 # l = m*numpy.tan(azim)
2149 l = numpy.sin(zen)*numpy.sin(azim)
2151 l = numpy.sin(zen)*numpy.sin(azim)
2150 m = numpy.sin(zen)*numpy.cos(azim)
2152 m = numpy.sin(zen)*numpy.cos(azim)
2151
2153
2152 A = numpy.vstack((l, m)).transpose()
2154 A = numpy.vstack((l, m)).transpose()
2153 A1 = numpy.dot(numpy.linalg.inv( numpy.dot(A.transpose(),A) ),A.transpose())
2155 A1 = numpy.dot(numpy.linalg.inv( numpy.dot(A.transpose(),A) ),A.transpose())
2154 windsAux = numpy.dot(A1, vel)
2156 windsAux = numpy.dot(A1, vel)
2155
2157
2156 winds[0,i] = windsAux[0]
2158 winds[0,i] = windsAux[0]
2157 winds[1,i] = windsAux[1]
2159 winds[1,i] = windsAux[1]
2158
2160
2159 return winds, heightPerI[:-1]
2161 return winds, heightPerI[:-1]
2160
2162
2161 def techniqueNSM_SA(self, **kwargs):
2163 def techniqueNSM_SA(self, **kwargs):
2162 metArray = kwargs['metArray']
2164 metArray = kwargs['metArray']
2163 heightList = kwargs['heightList']
2165 heightList = kwargs['heightList']
2164 timeList = kwargs['timeList']
2166 timeList = kwargs['timeList']
2165
2167
2166 rx_location = kwargs['rx_location']
2168 rx_location = kwargs['rx_location']
2167 groupList = kwargs['groupList']
2169 groupList = kwargs['groupList']
2168 azimuth = kwargs['azimuth']
2170 azimuth = kwargs['azimuth']
2169 dfactor = kwargs['dfactor']
2171 dfactor = kwargs['dfactor']
2170 k = kwargs['k']
2172 k = kwargs['k']
2171
2173
2172 azimuth1, dist = self.__calculateAzimuth1(rx_location, groupList, azimuth)
2174 azimuth1, dist = self.__calculateAzimuth1(rx_location, groupList, azimuth)
2173 d = dist*dfactor
2175 d = dist*dfactor
2174 #Phase calculation
2176 #Phase calculation
2175 metArray1 = self.__getPhaseSlope(metArray, heightList, timeList)
2177 metArray1 = self.__getPhaseSlope(metArray, heightList, timeList)
2176
2178
2177 metArray1[:,-2] = metArray1[:,-2]*metArray1[:,2]*1000/(k*d[metArray1[:,1].astype(int)]) #angles into velocities
2179 metArray1[:,-2] = metArray1[:,-2]*metArray1[:,2]*1000/(k*d[metArray1[:,1].astype(int)]) #angles into velocities
2178
2180
2179 velEst = numpy.zeros((heightList.size,2))*numpy.nan
2181 velEst = numpy.zeros((heightList.size,2))*numpy.nan
2180 azimuth1 = azimuth1*numpy.pi/180
2182 azimuth1 = azimuth1*numpy.pi/180
2181
2183
2182 for i in range(heightList.size):
2184 for i in range(heightList.size):
2183 h = heightList[i]
2185 h = heightList[i]
2184 indH = numpy.where((metArray1[:,2] == h)&(numpy.abs(metArray1[:,-2]) < 100))[0]
2186 indH = numpy.where((metArray1[:,2] == h)&(numpy.abs(metArray1[:,-2]) < 100))[0]
2185 metHeight = metArray1[indH,:]
2187 metHeight = metArray1[indH,:]
2186 if metHeight.shape[0] >= 2:
2188 if metHeight.shape[0] >= 2:
2187 velAux = numpy.asmatrix(metHeight[:,-2]).T #Radial Velocities
2189 velAux = numpy.asmatrix(metHeight[:,-2]).T #Radial Velocities
2188 iazim = metHeight[:,1].astype(int)
2190 iazim = metHeight[:,1].astype(int)
2189 azimAux = numpy.asmatrix(azimuth1[iazim]).T #Azimuths
2191 azimAux = numpy.asmatrix(azimuth1[iazim]).T #Azimuths
2190 A = numpy.hstack((numpy.cos(azimAux),numpy.sin(azimAux)))
2192 A = numpy.hstack((numpy.cos(azimAux),numpy.sin(azimAux)))
2191 A = numpy.asmatrix(A)
2193 A = numpy.asmatrix(A)
2192 A1 = numpy.linalg.pinv(A.transpose()*A)*A.transpose()
2194 A1 = numpy.linalg.pinv(A.transpose()*A)*A.transpose()
2193 velHor = numpy.dot(A1,velAux)
2195 velHor = numpy.dot(A1,velAux)
2194
2196
2195 velEst[i,:] = numpy.squeeze(velHor)
2197 velEst[i,:] = numpy.squeeze(velHor)
2196 return velEst
2198 return velEst
2197
2199
2198 def __getPhaseSlope(self, metArray, heightList, timeList):
2200 def __getPhaseSlope(self, metArray, heightList, timeList):
2199 meteorList = []
2201 meteorList = []
2200 #utctime sec1 height SNR velRad ph0 ph1 ph2 coh0 coh1 coh2
2202 #utctime sec1 height SNR velRad ph0 ph1 ph2 coh0 coh1 coh2
2201 #Putting back together the meteor matrix
2203 #Putting back together the meteor matrix
2202 utctime = metArray[:,0]
2204 utctime = metArray[:,0]
2203 uniqueTime = numpy.unique(utctime)
2205 uniqueTime = numpy.unique(utctime)
2204
2206
2205 phaseDerThresh = 0.5
2207 phaseDerThresh = 0.5
2206 ippSeconds = timeList[1] - timeList[0]
2208 ippSeconds = timeList[1] - timeList[0]
2207 sec = numpy.where(timeList>1)[0][0]
2209 sec = numpy.where(timeList>1)[0][0]
2208 nPairs = metArray.shape[1] - 6
2210 nPairs = metArray.shape[1] - 6
2209 nHeights = len(heightList)
2211 nHeights = len(heightList)
2210
2212
2211 for t in uniqueTime:
2213 for t in uniqueTime:
2212 metArray1 = metArray[utctime==t,:]
2214 metArray1 = metArray[utctime==t,:]
2213 # phaseDerThresh = numpy.pi/4 #reducir Phase thresh
2215 # phaseDerThresh = numpy.pi/4 #reducir Phase thresh
2214 tmet = metArray1[:,1].astype(int)
2216 tmet = metArray1[:,1].astype(int)
2215 hmet = metArray1[:,2].astype(int)
2217 hmet = metArray1[:,2].astype(int)
2216
2218
2217 metPhase = numpy.zeros((nPairs, heightList.size, timeList.size - 1))
2219 metPhase = numpy.zeros((nPairs, heightList.size, timeList.size - 1))
2218 metPhase[:,:] = numpy.nan
2220 metPhase[:,:] = numpy.nan
2219 metPhase[:,hmet,tmet] = metArray1[:,6:].T
2221 metPhase[:,hmet,tmet] = metArray1[:,6:].T
2220
2222
2221 #Delete short trails
2223 #Delete short trails
2222 metBool = ~numpy.isnan(metPhase[0,:,:])
2224 metBool = ~numpy.isnan(metPhase[0,:,:])
2223 heightVect = numpy.sum(metBool, axis = 1)
2225 heightVect = numpy.sum(metBool, axis = 1)
2224 metBool[heightVect<sec,:] = False
2226 metBool[heightVect<sec,:] = False
2225 metPhase[:,heightVect<sec,:] = numpy.nan
2227 metPhase[:,heightVect<sec,:] = numpy.nan
2226
2228
2227 #Derivative
2229 #Derivative
2228 metDer = numpy.abs(metPhase[:,:,1:] - metPhase[:,:,:-1])
2230 metDer = numpy.abs(metPhase[:,:,1:] - metPhase[:,:,:-1])
2229 phDerAux = numpy.dstack((numpy.full((nPairs,nHeights,1), False, dtype=bool),metDer > phaseDerThresh))
2231 phDerAux = numpy.dstack((numpy.full((nPairs,nHeights,1), False, dtype=bool),metDer > phaseDerThresh))
2230 metPhase[phDerAux] = numpy.nan
2232 metPhase[phDerAux] = numpy.nan
2231
2233
2232 #--------------------------METEOR DETECTION -----------------------------------------
2234 #--------------------------METEOR DETECTION -----------------------------------------
2233 indMet = numpy.where(numpy.any(metBool,axis=1))[0]
2235 indMet = numpy.where(numpy.any(metBool,axis=1))[0]
2234
2236
2235 for p in numpy.arange(nPairs):
2237 for p in numpy.arange(nPairs):
2236 phase = metPhase[p,:,:]
2238 phase = metPhase[p,:,:]
2237 phDer = metDer[p,:,:]
2239 phDer = metDer[p,:,:]
2238
2240
2239 for h in indMet:
2241 for h in indMet:
2240 height = heightList[h]
2242 height = heightList[h]
2241 phase1 = phase[h,:] #82
2243 phase1 = phase[h,:] #82
2242 phDer1 = phDer[h,:]
2244 phDer1 = phDer[h,:]
2243
2245
2244 phase1[~numpy.isnan(phase1)] = numpy.unwrap(phase1[~numpy.isnan(phase1)]) #Unwrap
2246 phase1[~numpy.isnan(phase1)] = numpy.unwrap(phase1[~numpy.isnan(phase1)]) #Unwrap
2245
2247
2246 indValid = numpy.where(~numpy.isnan(phase1))[0]
2248 indValid = numpy.where(~numpy.isnan(phase1))[0]
2247 initMet = indValid[0]
2249 initMet = indValid[0]
2248 endMet = 0
2250 endMet = 0
2249
2251
2250 for i in range(len(indValid)-1):
2252 for i in range(len(indValid)-1):
2251
2253
2252 #Time difference
2254 #Time difference
2253 inow = indValid[i]
2255 inow = indValid[i]
2254 inext = indValid[i+1]
2256 inext = indValid[i+1]
2255 idiff = inext - inow
2257 idiff = inext - inow
2256 #Phase difference
2258 #Phase difference
2257 phDiff = numpy.abs(phase1[inext] - phase1[inow])
2259 phDiff = numpy.abs(phase1[inext] - phase1[inow])
2258
2260
2259 if idiff>sec or phDiff>numpy.pi/4 or inext==indValid[-1]: #End of Meteor
2261 if idiff>sec or phDiff>numpy.pi/4 or inext==indValid[-1]: #End of Meteor
2260 sizeTrail = inow - initMet + 1
2262 sizeTrail = inow - initMet + 1
2261 if sizeTrail>3*sec: #Too short meteors
2263 if sizeTrail>3*sec: #Too short meteors
2262 x = numpy.arange(initMet,inow+1)*ippSeconds
2264 x = numpy.arange(initMet,inow+1)*ippSeconds
2263 y = phase1[initMet:inow+1]
2265 y = phase1[initMet:inow+1]
2264 ynnan = ~numpy.isnan(y)
2266 ynnan = ~numpy.isnan(y)
2265 x = x[ynnan]
2267 x = x[ynnan]
2266 y = y[ynnan]
2268 y = y[ynnan]
2267 slope, intercept, r_value, p_value, std_err = stats.linregress(x,y)
2269 slope, intercept, r_value, p_value, std_err = stats.linregress(x,y)
2268 ylin = x*slope + intercept
2270 ylin = x*slope + intercept
2269 rsq = r_value**2
2271 rsq = r_value**2
2270 if rsq > 0.5:
2272 if rsq > 0.5:
2271 vel = slope#*height*1000/(k*d)
2273 vel = slope#*height*1000/(k*d)
2272 estAux = numpy.array([utctime,p,height, vel, rsq])
2274 estAux = numpy.array([utctime,p,height, vel, rsq])
2273 meteorList.append(estAux)
2275 meteorList.append(estAux)
2274 initMet = inext
2276 initMet = inext
2275 metArray2 = numpy.array(meteorList)
2277 metArray2 = numpy.array(meteorList)
2276
2278
2277 return metArray2
2279 return metArray2
2278
2280
2279 def __calculateAzimuth1(self, rx_location, pairslist, azimuth0):
2281 def __calculateAzimuth1(self, rx_location, pairslist, azimuth0):
2280
2282
2281 azimuth1 = numpy.zeros(len(pairslist))
2283 azimuth1 = numpy.zeros(len(pairslist))
2282 dist = numpy.zeros(len(pairslist))
2284 dist = numpy.zeros(len(pairslist))
2283
2285
2284 for i in range(len(rx_location)):
2286 for i in range(len(rx_location)):
2285 ch0 = pairslist[i][0]
2287 ch0 = pairslist[i][0]
2286 ch1 = pairslist[i][1]
2288 ch1 = pairslist[i][1]
2287
2289
2288 diffX = rx_location[ch0][0] - rx_location[ch1][0]
2290 diffX = rx_location[ch0][0] - rx_location[ch1][0]
2289 diffY = rx_location[ch0][1] - rx_location[ch1][1]
2291 diffY = rx_location[ch0][1] - rx_location[ch1][1]
2290 azimuth1[i] = numpy.arctan2(diffY,diffX)*180/numpy.pi
2292 azimuth1[i] = numpy.arctan2(diffY,diffX)*180/numpy.pi
2291 dist[i] = numpy.sqrt(diffX**2 + diffY**2)
2293 dist[i] = numpy.sqrt(diffX**2 + diffY**2)
2292
2294
2293 azimuth1 -= azimuth0
2295 azimuth1 -= azimuth0
2294 return azimuth1, dist
2296 return azimuth1, dist
2295
2297
2296 def techniqueNSM_DBS(self, **kwargs):
2298 def techniqueNSM_DBS(self, **kwargs):
2297 metArray = kwargs['metArray']
2299 metArray = kwargs['metArray']
2298 heightList = kwargs['heightList']
2300 heightList = kwargs['heightList']
2299 timeList = kwargs['timeList']
2301 timeList = kwargs['timeList']
2300 zenithList = kwargs['zenithList']
2302 zenithList = kwargs['zenithList']
2301 nChan = numpy.max(cmet) + 1
2303 nChan = numpy.max(cmet) + 1
2302 nHeights = len(heightList)
2304 nHeights = len(heightList)
2303
2305
2304 utctime = metArray[:,0]
2306 utctime = metArray[:,0]
2305 cmet = metArray[:,1]
2307 cmet = metArray[:,1]
2306 hmet = metArray1[:,3].astype(int)
2308 hmet = metArray1[:,3].astype(int)
2307 h1met = heightList[hmet]*zenithList[cmet]
2309 h1met = heightList[hmet]*zenithList[cmet]
2308 vmet = metArray1[:,5]
2310 vmet = metArray1[:,5]
2309
2311
2310 for i in range(nHeights - 1):
2312 for i in range(nHeights - 1):
2311 hmin = heightList[i]
2313 hmin = heightList[i]
2312 hmax = heightList[i + 1]
2314 hmax = heightList[i + 1]
2313
2315
2314 vthisH = vmet[(h1met>=hmin) & (h1met<hmax)]
2316 vthisH = vmet[(h1met>=hmin) & (h1met<hmax)]
2315
2317
2316
2318
2317
2319
2318 return data_output
2320 return data_output
2319
2321
2320 def run(self, dataOut, technique, positionY, positionX, azimuth, **kwargs):
2322 def run(self, dataOut, technique, positionY, positionX, azimuth, **kwargs):
2321
2323
2322 param = dataOut.data_param
2324 param = dataOut.data_param
2323 if dataOut.abscissaList != None:
2325 if dataOut.abscissaList != None:
2324 absc = dataOut.abscissaList[:-1]
2326 absc = dataOut.abscissaList[:-1]
2325 noise = dataOut.noise
2327 noise = dataOut.noise
2326 heightList = dataOut.heightList
2328 heightList = dataOut.heightList
2327 SNR = dataOut.data_SNR
2329 SNR = dataOut.data_SNR
2328
2330
2329 if technique == 'DBS':
2331 if technique == 'DBS':
2330
2332
2331 kwargs['velRadial'] = param[:,1,:] #Radial velocity
2333 kwargs['velRadial'] = param[:,1,:] #Radial velocity
2332 kwargs['heightList'] = heightList
2334 kwargs['heightList'] = heightList
2333 kwargs['SNR'] = SNR
2335 kwargs['SNR'] = SNR
2334
2336
2335 dataOut.data_output, dataOut.heightList, dataOut.data_SNR = self.techniqueDBS(kwargs) #DBS Function
2337 dataOut.data_output, dataOut.heightList, dataOut.data_SNR = self.techniqueDBS(kwargs) #DBS Function
2336 dataOut.utctimeInit = dataOut.utctime
2338 dataOut.utctimeInit = dataOut.utctime
2337 dataOut.outputInterval = dataOut.paramInterval
2339 dataOut.outputInterval = dataOut.paramInterval
2338
2340
2339 elif technique == 'SA':
2341 elif technique == 'SA':
2340
2342
2341 #Parameters
2343 #Parameters
2342 # position_x = kwargs['positionX']
2344 # position_x = kwargs['positionX']
2343 # position_y = kwargs['positionY']
2345 # position_y = kwargs['positionY']
2344 # azimuth = kwargs['azimuth']
2346 # azimuth = kwargs['azimuth']
2345 #
2347 #
2346 # if kwargs.has_key('crosspairsList'):
2348 # if kwargs.has_key('crosspairsList'):
2347 # pairs = kwargs['crosspairsList']
2349 # pairs = kwargs['crosspairsList']
2348 # else:
2350 # else:
2349 # pairs = None
2351 # pairs = None
2350 #
2352 #
2351 # if kwargs.has_key('correctFactor'):
2353 # if kwargs.has_key('correctFactor'):
2352 # correctFactor = kwargs['correctFactor']
2354 # correctFactor = kwargs['correctFactor']
2353 # else:
2355 # else:
2354 # correctFactor = 1
2356 # correctFactor = 1
2355
2357
2356 # tau = dataOut.data_param
2358 # tau = dataOut.data_param
2357 # _lambda = dataOut.C/dataOut.frequency
2359 # _lambda = dataOut.C/dataOut.frequency
2358 # pairsList = dataOut.groupList
2360 # pairsList = dataOut.groupList
2359 # nChannels = dataOut.nChannels
2361 # nChannels = dataOut.nChannels
2360
2362
2361 kwargs['groupList'] = dataOut.groupList
2363 kwargs['groupList'] = dataOut.groupList
2362 kwargs['tau'] = dataOut.data_param
2364 kwargs['tau'] = dataOut.data_param
2363 kwargs['_lambda'] = dataOut.C/dataOut.frequency
2365 kwargs['_lambda'] = dataOut.C/dataOut.frequency
2364 # dataOut.data_output = self.techniqueSA(pairs, pairsList, nChannels, tau, azimuth, _lambda, position_x, position_y, absc, correctFactor)
2366 # dataOut.data_output = self.techniqueSA(pairs, pairsList, nChannels, tau, azimuth, _lambda, position_x, position_y, absc, correctFactor)
2365 dataOut.data_output = self.techniqueSA(kwargs)
2367 dataOut.data_output = self.techniqueSA(kwargs)
2366 dataOut.utctimeInit = dataOut.utctime
2368 dataOut.utctimeInit = dataOut.utctime
2367 dataOut.outputInterval = dataOut.timeInterval
2369 dataOut.outputInterval = dataOut.timeInterval
2368
2370
2369 elif technique == 'Meteors':
2371 elif technique == 'Meteors':
2370 dataOut.flagNoData = True
2372 dataOut.flagNoData = True
2371 self.__dataReady = False
2373 self.__dataReady = False
2372
2374
2373 if kwargs.has_key('nHours'):
2375 if kwargs.has_key('nHours'):
2374 nHours = kwargs['nHours']
2376 nHours = kwargs['nHours']
2375 else:
2377 else:
2376 nHours = 1
2378 nHours = 1
2377
2379
2378 if kwargs.has_key('meteorsPerBin'):
2380 if kwargs.has_key('meteorsPerBin'):
2379 meteorThresh = kwargs['meteorsPerBin']
2381 meteorThresh = kwargs['meteorsPerBin']
2380 else:
2382 else:
2381 meteorThresh = 6
2383 meteorThresh = 6
2382
2384
2383 if kwargs.has_key('hmin'):
2385 if kwargs.has_key('hmin'):
2384 hmin = kwargs['hmin']
2386 hmin = kwargs['hmin']
2385 else: hmin = 70
2387 else: hmin = 70
2386 if kwargs.has_key('hmax'):
2388 if kwargs.has_key('hmax'):
2387 hmax = kwargs['hmax']
2389 hmax = kwargs['hmax']
2388 else: hmax = 110
2390 else: hmax = 110
2389
2391
2390 dataOut.outputInterval = nHours*3600
2392 dataOut.outputInterval = nHours*3600
2391
2393
2392 if self.__isConfig == False:
2394 if self.__isConfig == False:
2393 # self.__initime = dataOut.datatime.replace(minute = 0, second = 0, microsecond = 03)
2395 # self.__initime = dataOut.datatime.replace(minute = 0, second = 0, microsecond = 03)
2394 #Get Initial LTC time
2396 #Get Initial LTC time
2395 self.__initime = datetime.datetime.utcfromtimestamp(dataOut.utctime)
2397 self.__initime = datetime.datetime.utcfromtimestamp(dataOut.utctime)
2396 self.__initime = (self.__initime.replace(minute = 0, second = 0, microsecond = 0) - datetime.datetime(1970, 1, 1)).total_seconds()
2398 self.__initime = (self.__initime.replace(minute = 0, second = 0, microsecond = 0) - datetime.datetime(1970, 1, 1)).total_seconds()
2397
2399
2398 self.__isConfig = True
2400 self.__isConfig = True
2399
2401
2400 if self.__buffer == None:
2402 if self.__buffer == None:
2401 self.__buffer = dataOut.data_param
2403 self.__buffer = dataOut.data_param
2402 self.__firstdata = copy.copy(dataOut)
2404 self.__firstdata = copy.copy(dataOut)
2403
2405
2404 else:
2406 else:
2405 self.__buffer = numpy.vstack((self.__buffer, dataOut.data_param))
2407 self.__buffer = numpy.vstack((self.__buffer, dataOut.data_param))
2406
2408
2407 self.__checkTime(dataOut.utctime, dataOut.paramInterval, dataOut.outputInterval) #Check if the buffer is ready
2409 self.__checkTime(dataOut.utctime, dataOut.paramInterval, dataOut.outputInterval) #Check if the buffer is ready
2408
2410
2409 if self.__dataReady:
2411 if self.__dataReady:
2410 dataOut.utctimeInit = self.__initime
2412 dataOut.utctimeInit = self.__initime
2411
2413
2412 self.__initime += dataOut.outputInterval #to erase time offset
2414 self.__initime += dataOut.outputInterval #to erase time offset
2413
2415
2414 dataOut.data_output, dataOut.heightList = self.techniqueMeteors(self.__buffer, meteorThresh, hmin, hmax)
2416 dataOut.data_output, dataOut.heightList = self.techniqueMeteors(self.__buffer, meteorThresh, hmin, hmax)
2415 dataOut.flagNoData = False
2417 dataOut.flagNoData = False
2416 self.__buffer = None
2418 self.__buffer = None
2417
2419
2418 elif technique == 'Meteors1':
2420 elif technique == 'Meteors1':
2419 dataOut.flagNoData = True
2421 dataOut.flagNoData = True
2420 self.__dataReady = False
2422 self.__dataReady = False
2421
2423
2422 if kwargs.has_key('nMins'):
2424 if kwargs.has_key('nMins'):
2423 nMins = kwargs['nMins']
2425 nMins = kwargs['nMins']
2424 else: nMins = 20
2426 else: nMins = 20
2425 if kwargs.has_key('rx_location'):
2427 if kwargs.has_key('rx_location'):
2426 rx_location = kwargs['rx_location']
2428 rx_location = kwargs['rx_location']
2427 else: rx_location = [(0,1),(1,1),(1,0)]
2429 else: rx_location = [(0,1),(1,1),(1,0)]
2428 if kwargs.has_key('azimuth'):
2430 if kwargs.has_key('azimuth'):
2429 azimuth = kwargs['azimuth']
2431 azimuth = kwargs['azimuth']
2430 else: azimuth = 51
2432 else: azimuth = 51
2431 if kwargs.has_key('dfactor'):
2433 if kwargs.has_key('dfactor'):
2432 dfactor = kwargs['dfactor']
2434 dfactor = kwargs['dfactor']
2433 if kwargs.has_key('mode'):
2435 if kwargs.has_key('mode'):
2434 mode = kwargs['mode']
2436 mode = kwargs['mode']
2435 else: mode = 'SA'
2437 else: mode = 'SA'
2436
2438
2437 #Borrar luego esto
2439 #Borrar luego esto
2438 if dataOut.groupList == None:
2440 if dataOut.groupList == None:
2439 dataOut.groupList = [(0,1),(0,2),(1,2)]
2441 dataOut.groupList = [(0,1),(0,2),(1,2)]
2440 groupList = dataOut.groupList
2442 groupList = dataOut.groupList
2441 C = 3e8
2443 C = 3e8
2442 freq = 50e6
2444 freq = 50e6
2443 lamb = C/freq
2445 lamb = C/freq
2444 k = 2*numpy.pi/lamb
2446 k = 2*numpy.pi/lamb
2445
2447
2446 timeList = dataOut.abscissaList
2448 timeList = dataOut.abscissaList
2447 heightList = dataOut.heightList
2449 heightList = dataOut.heightList
2448
2450
2449 if self.__isConfig == False:
2451 if self.__isConfig == False:
2450 dataOut.outputInterval = nMins*60
2452 dataOut.outputInterval = nMins*60
2451 # self.__initime = dataOut.datatime.replace(minute = 0, second = 0, microsecond = 03)
2453 # self.__initime = dataOut.datatime.replace(minute = 0, second = 0, microsecond = 03)
2452 #Get Initial LTC time
2454 #Get Initial LTC time
2453 initime = datetime.datetime.utcfromtimestamp(dataOut.utctime)
2455 initime = datetime.datetime.utcfromtimestamp(dataOut.utctime)
2454 minuteAux = initime.minute
2456 minuteAux = initime.minute
2455 minuteNew = int(numpy.floor(minuteAux/nMins)*nMins)
2457 minuteNew = int(numpy.floor(minuteAux/nMins)*nMins)
2456 self.__initime = (initime.replace(minute = minuteNew, second = 0, microsecond = 0) - datetime.datetime(1970, 1, 1)).total_seconds()
2458 self.__initime = (initime.replace(minute = minuteNew, second = 0, microsecond = 0) - datetime.datetime(1970, 1, 1)).total_seconds()
2457
2459
2458 self.__isConfig = True
2460 self.__isConfig = True
2459
2461
2460 if self.__buffer == None:
2462 if self.__buffer == None:
2461 self.__buffer = dataOut.data_param
2463 self.__buffer = dataOut.data_param
2462 self.__firstdata = copy.copy(dataOut)
2464 self.__firstdata = copy.copy(dataOut)
2463
2465
2464 else:
2466 else:
2465 self.__buffer = numpy.vstack((self.__buffer, dataOut.data_param))
2467 self.__buffer = numpy.vstack((self.__buffer, dataOut.data_param))
2466
2468
2467 self.__checkTime(dataOut.utctime, dataOut.paramInterval, dataOut.outputInterval) #Check if the buffer is ready
2469 self.__checkTime(dataOut.utctime, dataOut.paramInterval, dataOut.outputInterval) #Check if the buffer is ready
2468
2470
2469 if self.__dataReady:
2471 if self.__dataReady:
2470 dataOut.utctimeInit = self.__initime
2472 dataOut.utctimeInit = self.__initime
2471 self.__initime += dataOut.outputInterval #to erase time offset
2473 self.__initime += dataOut.outputInterval #to erase time offset
2472
2474
2473 metArray = self.__buffer
2475 metArray = self.__buffer
2474 if mode == 'SA':
2476 if mode == 'SA':
2475 dataOut.data_output = self.techniqueNSM_SA(rx_location=rx_location, groupList=groupList, azimuth=azimuth, dfactor=dfactor, k=k,metArray=metArray, heightList=heightList,timeList=timeList)
2477 dataOut.data_output = self.techniqueNSM_SA(rx_location=rx_location, groupList=groupList, azimuth=azimuth, dfactor=dfactor, k=k,metArray=metArray, heightList=heightList,timeList=timeList)
2476 elif mode == 'DBS':
2478 elif mode == 'DBS':
2477 dataOut.data_output = self.techniqueNSM_DBS(metArray=metArray,heightList=heightList,timeList=timeList)
2479 dataOut.data_output = self.techniqueNSM_DBS(metArray=metArray,heightList=heightList,timeList=timeList)
2478 dataOut.data_output = dataOut.data_output.T
2480 dataOut.data_output = dataOut.data_output.T
2479 dataOut.flagNoData = False
2481 dataOut.flagNoData = False
2480 self.__buffer = None
2482 self.__buffer = None
2481
2483
2482 return
2484 return
2483
2485
2484 class EWDriftsEstimation(Operation):
2486 class EWDriftsEstimation(Operation):
2485
2487
2486 def __init__(self):
2488 def __init__(self):
2487 Operation.__init__(self)
2489 Operation.__init__(self)
2488
2490
2489 def __correctValues(self, heiRang, phi, velRadial, SNR):
2491 def __correctValues(self, heiRang, phi, velRadial, SNR):
2490 listPhi = phi.tolist()
2492 listPhi = phi.tolist()
2491 maxid = listPhi.index(max(listPhi))
2493 maxid = listPhi.index(max(listPhi))
2492 minid = listPhi.index(min(listPhi))
2494 minid = listPhi.index(min(listPhi))
2493
2495
2494 rango = range(len(phi))
2496 rango = range(len(phi))
2495 # rango = numpy.delete(rango,maxid)
2497 # rango = numpy.delete(rango,maxid)
2496
2498
2497 heiRang1 = heiRang*math.cos(phi[maxid])
2499 heiRang1 = heiRang*math.cos(phi[maxid])
2498 heiRangAux = heiRang*math.cos(phi[minid])
2500 heiRangAux = heiRang*math.cos(phi[minid])
2499 indOut = (heiRang1 < heiRangAux[0]).nonzero()
2501 indOut = (heiRang1 < heiRangAux[0]).nonzero()
2500 heiRang1 = numpy.delete(heiRang1,indOut)
2502 heiRang1 = numpy.delete(heiRang1,indOut)
2501
2503
2502 velRadial1 = numpy.zeros([len(phi),len(heiRang1)])
2504 velRadial1 = numpy.zeros([len(phi),len(heiRang1)])
2503 SNR1 = numpy.zeros([len(phi),len(heiRang1)])
2505 SNR1 = numpy.zeros([len(phi),len(heiRang1)])
2504
2506
2505 for i in rango:
2507 for i in rango:
2506 x = heiRang*math.cos(phi[i])
2508 x = heiRang*math.cos(phi[i])
2507 y1 = velRadial[i,:]
2509 y1 = velRadial[i,:]
2508 f1 = interpolate.interp1d(x,y1,kind = 'cubic')
2510 f1 = interpolate.interp1d(x,y1,kind = 'cubic')
2509
2511
2510 x1 = heiRang1
2512 x1 = heiRang1
2511 y11 = f1(x1)
2513 y11 = f1(x1)
2512
2514
2513 y2 = SNR[i,:]
2515 y2 = SNR[i,:]
2514 f2 = interpolate.interp1d(x,y2,kind = 'cubic')
2516 f2 = interpolate.interp1d(x,y2,kind = 'cubic')
2515 y21 = f2(x1)
2517 y21 = f2(x1)
2516
2518
2517 velRadial1[i,:] = y11
2519 velRadial1[i,:] = y11
2518 SNR1[i,:] = y21
2520 SNR1[i,:] = y21
2519
2521
2520 return heiRang1, velRadial1, SNR1
2522 return heiRang1, velRadial1, SNR1
2521
2523
2522 def run(self, dataOut, zenith, zenithCorrection):
2524 def run(self, dataOut, zenith, zenithCorrection):
2523 heiRang = dataOut.heightList
2525 heiRang = dataOut.heightList
2524 velRadial = dataOut.data_param[:,3,:]
2526 velRadial = dataOut.data_param[:,3,:]
2525 SNR = dataOut.data_SNR
2527 SNR = dataOut.data_SNR
2526
2528
2527 zenith = numpy.array(zenith)
2529 zenith = numpy.array(zenith)
2528 zenith -= zenithCorrection
2530 zenith -= zenithCorrection
2529 zenith *= numpy.pi/180
2531 zenith *= numpy.pi/180
2530
2532
2531 heiRang1, velRadial1, SNR1 = self.__correctValues(heiRang, numpy.abs(zenith), velRadial, SNR)
2533 heiRang1, velRadial1, SNR1 = self.__correctValues(heiRang, numpy.abs(zenith), velRadial, SNR)
2532
2534
2533 alp = zenith[0]
2535 alp = zenith[0]
2534 bet = zenith[1]
2536 bet = zenith[1]
2535
2537
2536 w_w = velRadial1[0,:]
2538 w_w = velRadial1[0,:]
2537 w_e = velRadial1[1,:]
2539 w_e = velRadial1[1,:]
2538
2540
2539 w = (w_w*numpy.sin(bet) - w_e*numpy.sin(alp))/(numpy.cos(alp)*numpy.sin(bet) - numpy.cos(bet)*numpy.sin(alp))
2541 w = (w_w*numpy.sin(bet) - w_e*numpy.sin(alp))/(numpy.cos(alp)*numpy.sin(bet) - numpy.cos(bet)*numpy.sin(alp))
2540 u = (w_w*numpy.cos(bet) - w_e*numpy.cos(alp))/(numpy.sin(alp)*numpy.cos(bet) - numpy.sin(bet)*numpy.cos(alp))
2542 u = (w_w*numpy.cos(bet) - w_e*numpy.cos(alp))/(numpy.sin(alp)*numpy.cos(bet) - numpy.sin(bet)*numpy.cos(alp))
2541
2543
2542 winds = numpy.vstack((u,w))
2544 winds = numpy.vstack((u,w))
2543
2545
2544 dataOut.heightList = heiRang1
2546 dataOut.heightList = heiRang1
2545 dataOut.data_output = winds
2547 dataOut.data_output = winds
2546 dataOut.data_SNR = SNR1
2548 dataOut.data_SNR = SNR1
2547
2549
2548 dataOut.utctimeInit = dataOut.utctime
2550 dataOut.utctimeInit = dataOut.utctime
2549 dataOut.outputInterval = dataOut.timeInterval
2551 dataOut.outputInterval = dataOut.timeInterval
2550 return
2552 return
2551
2553
2552 #--------------- Non Specular Meteor ----------------
2554 #--------------- Non Specular Meteor ----------------
2553
2555
2554 class NonSpecularMeteorDetection(Operation):
2556 class NonSpecularMeteorDetection(Operation):
2555
2557
2556 def run(self, mode, SNRthresh=8, phaseDerThresh=0.5, cohThresh=0.8, allData = False):
2558 def run(self, mode, SNRthresh=8, phaseDerThresh=0.5, cohThresh=0.8, allData = False):
2557 data_acf = self.dataOut.data_pre[0]
2559 data_acf = self.dataOut.data_pre[0]
2558 data_ccf = self.dataOut.data_pre[1]
2560 data_ccf = self.dataOut.data_pre[1]
2559
2561
2560 lamb = self.dataOut.C/self.dataOut.frequency
2562 lamb = self.dataOut.C/self.dataOut.frequency
2561 tSamp = self.dataOut.ippSeconds*self.dataOut.nCohInt
2563 tSamp = self.dataOut.ippSeconds*self.dataOut.nCohInt
2562 paramInterval = self.dataOut.paramInterval
2564 paramInterval = self.dataOut.paramInterval
2563
2565
2564 nChannels = data_acf.shape[0]
2566 nChannels = data_acf.shape[0]
2565 nLags = data_acf.shape[1]
2567 nLags = data_acf.shape[1]
2566 nProfiles = data_acf.shape[2]
2568 nProfiles = data_acf.shape[2]
2567 nHeights = self.dataOut.nHeights
2569 nHeights = self.dataOut.nHeights
2568 nCohInt = self.dataOut.nCohInt
2570 nCohInt = self.dataOut.nCohInt
2569 sec = numpy.round(nProfiles/self.dataOut.paramInterval)
2571 sec = numpy.round(nProfiles/self.dataOut.paramInterval)
2570 heightList = self.dataOut.heightList
2572 heightList = self.dataOut.heightList
2571 ippSeconds = self.dataOut.ippSeconds*self.dataOut.nCohInt*self.dataOut.nAvg
2573 ippSeconds = self.dataOut.ippSeconds*self.dataOut.nCohInt*self.dataOut.nAvg
2572 utctime = self.dataOut.utctime
2574 utctime = self.dataOut.utctime
2573
2575
2574 self.dataOut.abscissaList = numpy.arange(0,paramInterval+ippSeconds,ippSeconds)
2576 self.dataOut.abscissaList = numpy.arange(0,paramInterval+ippSeconds,ippSeconds)
2575
2577
2576 #------------------------ SNR --------------------------------------
2578 #------------------------ SNR --------------------------------------
2577 power = data_acf[:,0,:,:].real
2579 power = data_acf[:,0,:,:].real
2578 noise = numpy.zeros(nChannels)
2580 noise = numpy.zeros(nChannels)
2579 SNR = numpy.zeros(power.shape)
2581 SNR = numpy.zeros(power.shape)
2580 for i in range(nChannels):
2582 for i in range(nChannels):
2581 noise[i] = hildebrand_sekhon(power[i,:], nCohInt)
2583 noise[i] = hildebrand_sekhon(power[i,:], nCohInt)
2582 SNR[i] = (power[i]-noise[i])/noise[i]
2584 SNR[i] = (power[i]-noise[i])/noise[i]
2583 SNRm = numpy.nanmean(SNR, axis = 0)
2585 SNRm = numpy.nanmean(SNR, axis = 0)
2584 SNRdB = 10*numpy.log10(SNR)
2586 SNRdB = 10*numpy.log10(SNR)
2585
2587
2586 if mode == 'SA':
2588 if mode == 'SA':
2587 nPairs = data_ccf.shape[0]
2589 nPairs = data_ccf.shape[0]
2588 #---------------------- Coherence and Phase --------------------------
2590 #---------------------- Coherence and Phase --------------------------
2589 phase = numpy.zeros(data_ccf[:,0,:,:].shape)
2591 phase = numpy.zeros(data_ccf[:,0,:,:].shape)
2590 # phase1 = numpy.copy(phase)
2592 # phase1 = numpy.copy(phase)
2591 coh1 = numpy.zeros(data_ccf[:,0,:,:].shape)
2593 coh1 = numpy.zeros(data_ccf[:,0,:,:].shape)
2592
2594
2593 for p in range(nPairs):
2595 for p in range(nPairs):
2594 ch0 = self.dataOut.groupList[p][0]
2596 ch0 = self.dataOut.groupList[p][0]
2595 ch1 = self.dataOut.groupList[p][1]
2597 ch1 = self.dataOut.groupList[p][1]
2596 ccf = data_ccf[p,0,:,:]/numpy.sqrt(data_acf[ch0,0,:,:]*data_acf[ch1,0,:,:])
2598 ccf = data_ccf[p,0,:,:]/numpy.sqrt(data_acf[ch0,0,:,:]*data_acf[ch1,0,:,:])
2597 phase[p,:,:] = ndimage.median_filter(numpy.angle(ccf), size = (5,1)) #median filter
2599 phase[p,:,:] = ndimage.median_filter(numpy.angle(ccf), size = (5,1)) #median filter
2598 # phase1[p,:,:] = numpy.angle(ccf) #median filter
2600 # phase1[p,:,:] = numpy.angle(ccf) #median filter
2599 coh1[p,:,:] = ndimage.median_filter(numpy.abs(ccf), 5) #median filter
2601 coh1[p,:,:] = ndimage.median_filter(numpy.abs(ccf), 5) #median filter
2600 # coh1[p,:,:] = numpy.abs(ccf) #median filter
2602 # coh1[p,:,:] = numpy.abs(ccf) #median filter
2601 coh = numpy.nanmax(coh1, axis = 0)
2603 coh = numpy.nanmax(coh1, axis = 0)
2602 # struc = numpy.ones((5,1))
2604 # struc = numpy.ones((5,1))
2603 # coh = ndimage.morphology.grey_dilation(coh, size=(10,1))
2605 # coh = ndimage.morphology.grey_dilation(coh, size=(10,1))
2604 #---------------------- Radial Velocity ----------------------------
2606 #---------------------- Radial Velocity ----------------------------
2605 phaseAux = numpy.mean(numpy.angle(data_acf[:,1,:,:]), axis = 0)
2607 phaseAux = numpy.mean(numpy.angle(data_acf[:,1,:,:]), axis = 0)
2606 velRad = phaseAux*lamb/(4*numpy.pi*tSamp)
2608 velRad = phaseAux*lamb/(4*numpy.pi*tSamp)
2607
2609
2608 if allData:
2610 if allData:
2609 boolMetFin = ~numpy.isnan(SNRm)
2611 boolMetFin = ~numpy.isnan(SNRm)
2610 # coh[:-1,:] = numpy.nanmean(numpy.abs(phase[:,1:,:] - phase[:,:-1,:]),axis=0)
2612 # coh[:-1,:] = numpy.nanmean(numpy.abs(phase[:,1:,:] - phase[:,:-1,:]),axis=0)
2611 else:
2613 else:
2612 #------------------------ Meteor mask ---------------------------------
2614 #------------------------ Meteor mask ---------------------------------
2613 # #SNR mask
2615 # #SNR mask
2614 # boolMet = (SNRdB>SNRthresh)#|(~numpy.isnan(SNRdB))
2616 # boolMet = (SNRdB>SNRthresh)#|(~numpy.isnan(SNRdB))
2615 #
2617 #
2616 # #Erase small objects
2618 # #Erase small objects
2617 # boolMet1 = self.__erase_small(boolMet, 2*sec, 5)
2619 # boolMet1 = self.__erase_small(boolMet, 2*sec, 5)
2618 #
2620 #
2619 # auxEEJ = numpy.sum(boolMet1,axis=0)
2621 # auxEEJ = numpy.sum(boolMet1,axis=0)
2620 # indOver = auxEEJ>nProfiles*0.8 #Use this later
2622 # indOver = auxEEJ>nProfiles*0.8 #Use this later
2621 # indEEJ = numpy.where(indOver)[0]
2623 # indEEJ = numpy.where(indOver)[0]
2622 # indNEEJ = numpy.where(~indOver)[0]
2624 # indNEEJ = numpy.where(~indOver)[0]
2623 #
2625 #
2624 # boolMetFin = boolMet1
2626 # boolMetFin = boolMet1
2625 #
2627 #
2626 # if indEEJ.size > 0:
2628 # if indEEJ.size > 0:
2627 # boolMet1[:,indEEJ] = False #Erase heights with EEJ
2629 # boolMet1[:,indEEJ] = False #Erase heights with EEJ
2628 #
2630 #
2629 # boolMet2 = coh > cohThresh
2631 # boolMet2 = coh > cohThresh
2630 # boolMet2 = self.__erase_small(boolMet2, 2*sec,5)
2632 # boolMet2 = self.__erase_small(boolMet2, 2*sec,5)
2631 #
2633 #
2632 # #Final Meteor mask
2634 # #Final Meteor mask
2633 # boolMetFin = boolMet1|boolMet2
2635 # boolMetFin = boolMet1|boolMet2
2634
2636
2635 #Coherence mask
2637 #Coherence mask
2636 boolMet1 = coh > 0.75
2638 boolMet1 = coh > 0.75
2637 struc = numpy.ones((30,1))
2639 struc = numpy.ones((30,1))
2638 boolMet1 = ndimage.morphology.binary_dilation(boolMet1, structure=struc)
2640 boolMet1 = ndimage.morphology.binary_dilation(boolMet1, structure=struc)
2639
2641
2640 #Derivative mask
2642 #Derivative mask
2641 derPhase = numpy.nanmean(numpy.abs(phase[:,1:,:] - phase[:,:-1,:]),axis=0)
2643 derPhase = numpy.nanmean(numpy.abs(phase[:,1:,:] - phase[:,:-1,:]),axis=0)
2642 boolMet2 = derPhase < 0.2
2644 boolMet2 = derPhase < 0.2
2643 # boolMet2 = ndimage.morphology.binary_opening(boolMet2)
2645 # boolMet2 = ndimage.morphology.binary_opening(boolMet2)
2644 # boolMet2 = ndimage.morphology.binary_closing(boolMet2, structure = numpy.ones((10,1)))
2646 # boolMet2 = ndimage.morphology.binary_closing(boolMet2, structure = numpy.ones((10,1)))
2645 boolMet2 = ndimage.median_filter(boolMet2,size=5)
2647 boolMet2 = ndimage.median_filter(boolMet2,size=5)
2646 boolMet2 = numpy.vstack((boolMet2,numpy.full((1,nHeights), True, dtype=bool)))
2648 boolMet2 = numpy.vstack((boolMet2,numpy.full((1,nHeights), True, dtype=bool)))
2647 # #Final mask
2649 # #Final mask
2648 # boolMetFin = boolMet2
2650 # boolMetFin = boolMet2
2649 boolMetFin = boolMet1&boolMet2
2651 boolMetFin = boolMet1&boolMet2
2650 # boolMetFin = ndimage.morphology.binary_dilation(boolMetFin)
2652 # boolMetFin = ndimage.morphology.binary_dilation(boolMetFin)
2651 #Creating data_param
2653 #Creating data_param
2652 coordMet = numpy.where(boolMetFin)
2654 coordMet = numpy.where(boolMetFin)
2653
2655
2654 tmet = coordMet[0]
2656 tmet = coordMet[0]
2655 hmet = coordMet[1]
2657 hmet = coordMet[1]
2656
2658
2657 data_param = numpy.zeros((tmet.size, 6 + nPairs))
2659 data_param = numpy.zeros((tmet.size, 6 + nPairs))
2658 data_param[:,0] = utctime
2660 data_param[:,0] = utctime
2659 data_param[:,1] = tmet
2661 data_param[:,1] = tmet
2660 data_param[:,2] = hmet
2662 data_param[:,2] = hmet
2661 data_param[:,3] = SNRm[tmet,hmet]
2663 data_param[:,3] = SNRm[tmet,hmet]
2662 data_param[:,4] = velRad[tmet,hmet]
2664 data_param[:,4] = velRad[tmet,hmet]
2663 data_param[:,5] = coh[tmet,hmet]
2665 data_param[:,5] = coh[tmet,hmet]
2664 data_param[:,6:] = phase[:,tmet,hmet].T
2666 data_param[:,6:] = phase[:,tmet,hmet].T
2665
2667
2666 elif mode == 'DBS':
2668 elif mode == 'DBS':
2667 self.dataOut.groupList = numpy.arange(nChannels)
2669 self.dataOut.groupList = numpy.arange(nChannels)
2668
2670
2669 #Radial Velocities
2671 #Radial Velocities
2670 # phase = numpy.angle(data_acf[:,1,:,:])
2672 # phase = numpy.angle(data_acf[:,1,:,:])
2671 phase = ndimage.median_filter(numpy.angle(data_acf[:,1,:,:]), size = (1,5,1))
2673 phase = ndimage.median_filter(numpy.angle(data_acf[:,1,:,:]), size = (1,5,1))
2672 velRad = phase*lamb/(4*numpy.pi*tSamp)
2674 velRad = phase*lamb/(4*numpy.pi*tSamp)
2673
2675
2674 #Spectral width
2676 #Spectral width
2675 acf1 = ndimage.median_filter(numpy.abs(data_acf[:,1,:,:]), size = (1,5,1))
2677 acf1 = ndimage.median_filter(numpy.abs(data_acf[:,1,:,:]), size = (1,5,1))
2676 acf2 = ndimage.median_filter(numpy.abs(data_acf[:,2,:,:]), size = (1,5,1))
2678 acf2 = ndimage.median_filter(numpy.abs(data_acf[:,2,:,:]), size = (1,5,1))
2677
2679
2678 spcWidth = (lamb/(2*numpy.sqrt(6)*numpy.pi*tSamp))*numpy.sqrt(numpy.log(acf1/acf2))
2680 spcWidth = (lamb/(2*numpy.sqrt(6)*numpy.pi*tSamp))*numpy.sqrt(numpy.log(acf1/acf2))
2679 # velRad = ndimage.median_filter(velRad, size = (1,5,1))
2681 # velRad = ndimage.median_filter(velRad, size = (1,5,1))
2680 if allData:
2682 if allData:
2681 boolMetFin = ~numpy.isnan(SNRdB)
2683 boolMetFin = ~numpy.isnan(SNRdB)
2682 else:
2684 else:
2683 #SNR
2685 #SNR
2684 boolMet1 = (SNRdB>SNRthresh) #SNR mask
2686 boolMet1 = (SNRdB>SNRthresh) #SNR mask
2685 boolMet1 = ndimage.median_filter(boolMet1, size=(1,5,5))
2687 boolMet1 = ndimage.median_filter(boolMet1, size=(1,5,5))
2686
2688
2687 #Radial velocity
2689 #Radial velocity
2688 boolMet2 = numpy.abs(velRad) < 30
2690 boolMet2 = numpy.abs(velRad) < 30
2689 boolMet2 = ndimage.median_filter(boolMet2, (1,5,5))
2691 boolMet2 = ndimage.median_filter(boolMet2, (1,5,5))
2690
2692
2691 #Spectral Width
2693 #Spectral Width
2692 boolMet3 = spcWidth < 30
2694 boolMet3 = spcWidth < 30
2693 boolMet3 = ndimage.median_filter(boolMet3, (1,5,5))
2695 boolMet3 = ndimage.median_filter(boolMet3, (1,5,5))
2694 # boolMetFin = self.__erase_small(boolMet1, 10,5)
2696 # boolMetFin = self.__erase_small(boolMet1, 10,5)
2695 boolMetFin = boolMet1&boolMet2&boolMet3
2697 boolMetFin = boolMet1&boolMet2&boolMet3
2696
2698
2697 #Creating data_param
2699 #Creating data_param
2698 coordMet = numpy.where(boolMetFin)
2700 coordMet = numpy.where(boolMetFin)
2699
2701
2700 cmet = coordMet[0]
2702 cmet = coordMet[0]
2701 tmet = coordMet[1]
2703 tmet = coordMet[1]
2702 hmet = coordMet[2]
2704 hmet = coordMet[2]
2703
2705
2704 data_param = numpy.zeros((tmet.size, 7))
2706 data_param = numpy.zeros((tmet.size, 7))
2705 data_param[:,0] = utctime
2707 data_param[:,0] = utctime
2706 data_param[:,1] = cmet
2708 data_param[:,1] = cmet
2707 data_param[:,2] = tmet
2709 data_param[:,2] = tmet
2708 data_param[:,3] = hmet
2710 data_param[:,3] = hmet
2709 data_param[:,4] = SNR[cmet,tmet,hmet].T
2711 data_param[:,4] = SNR[cmet,tmet,hmet].T
2710 data_param[:,5] = velRad[cmet,tmet,hmet].T
2712 data_param[:,5] = velRad[cmet,tmet,hmet].T
2711 data_param[:,6] = spcWidth[cmet,tmet,hmet].T
2713 data_param[:,6] = spcWidth[cmet,tmet,hmet].T
2712
2714
2713 # self.dataOut.data_param = data_int
2715 # self.dataOut.data_param = data_int
2714 if len(data_param) == 0:
2716 if len(data_param) == 0:
2715 self.dataOut.flagNoData = True
2717 self.dataOut.flagNoData = True
2716 else:
2718 else:
2717 self.dataOut.data_param = data_param
2719 self.dataOut.data_param = data_param
2718
2720
2719 def __erase_small(self, binArray, threshX, threshY):
2721 def __erase_small(self, binArray, threshX, threshY):
2720 labarray, numfeat = ndimage.measurements.label(binArray)
2722 labarray, numfeat = ndimage.measurements.label(binArray)
2721 binArray1 = numpy.copy(binArray)
2723 binArray1 = numpy.copy(binArray)
2722
2724
2723 for i in range(1,numfeat + 1):
2725 for i in range(1,numfeat + 1):
2724 auxBin = (labarray==i)
2726 auxBin = (labarray==i)
2725 auxSize = auxBin.sum()
2727 auxSize = auxBin.sum()
2726
2728
2727 x,y = numpy.where(auxBin)
2729 x,y = numpy.where(auxBin)
2728 widthX = x.max() - x.min()
2730 widthX = x.max() - x.min()
2729 widthY = y.max() - y.min()
2731 widthY = y.max() - y.min()
2730
2732
2731 #width X: 3 seg -> 12.5*3
2733 #width X: 3 seg -> 12.5*3
2732 #width Y:
2734 #width Y:
2733
2735
2734 if (auxSize < 50) or (widthX < threshX) or (widthY < threshY):
2736 if (auxSize < 50) or (widthX < threshX) or (widthY < threshY):
2735 binArray1[auxBin] = False
2737 binArray1[auxBin] = False
2736
2738
2737 return binArray1
2739 return binArray1
2738
2740
2739 #--------------- Specular Meteor ----------------
2741 #--------------- Specular Meteor ----------------
2740
2742
2741 class SMDetection(Operation):
2743 class SMDetection(Operation):
2742 '''
2744 '''
2743 Function DetectMeteors()
2745 Function DetectMeteors()
2744 Project developed with paper:
2746 Project developed with paper:
2745 HOLDSWORTH ET AL. 2004
2747 HOLDSWORTH ET AL. 2004
2746
2748
2747 Input:
2749 Input:
2748 self.dataOut.data_pre
2750 self.dataOut.data_pre
2749
2751
2750 centerReceiverIndex: From the channels, which is the center receiver
2752 centerReceiverIndex: From the channels, which is the center receiver
2751
2753
2752 hei_ref: Height reference for the Beacon signal extraction
2754 hei_ref: Height reference for the Beacon signal extraction
2753 tauindex:
2755 tauindex:
2754 predefinedPhaseShifts: Predefined phase offset for the voltge signals
2756 predefinedPhaseShifts: Predefined phase offset for the voltge signals
2755
2757
2756 cohDetection: Whether to user Coherent detection or not
2758 cohDetection: Whether to user Coherent detection or not
2757 cohDet_timeStep: Coherent Detection calculation time step
2759 cohDet_timeStep: Coherent Detection calculation time step
2758 cohDet_thresh: Coherent Detection phase threshold to correct phases
2760 cohDet_thresh: Coherent Detection phase threshold to correct phases
2759
2761
2760 noise_timeStep: Noise calculation time step
2762 noise_timeStep: Noise calculation time step
2761 noise_multiple: Noise multiple to define signal threshold
2763 noise_multiple: Noise multiple to define signal threshold
2762
2764
2763 multDet_timeLimit: Multiple Detection Removal time limit in seconds
2765 multDet_timeLimit: Multiple Detection Removal time limit in seconds
2764 multDet_rangeLimit: Multiple Detection Removal range limit in km
2766 multDet_rangeLimit: Multiple Detection Removal range limit in km
2765
2767
2766 phaseThresh: Maximum phase difference between receiver to be consider a meteor
2768 phaseThresh: Maximum phase difference between receiver to be consider a meteor
2767 SNRThresh: Minimum SNR threshold of the meteor signal to be consider a meteor
2769 SNRThresh: Minimum SNR threshold of the meteor signal to be consider a meteor
2768
2770
2769 hmin: Minimum Height of the meteor to use it in the further wind estimations
2771 hmin: Minimum Height of the meteor to use it in the further wind estimations
2770 hmax: Maximum Height of the meteor to use it in the further wind estimations
2772 hmax: Maximum Height of the meteor to use it in the further wind estimations
2771 azimuth: Azimuth angle correction
2773 azimuth: Azimuth angle correction
2772
2774
2773 Affected:
2775 Affected:
2774 self.dataOut.data_param
2776 self.dataOut.data_param
2775
2777
2776 Rejection Criteria (Errors):
2778 Rejection Criteria (Errors):
2777 0: No error; analysis OK
2779 0: No error; analysis OK
2778 1: SNR < SNR threshold
2780 1: SNR < SNR threshold
2779 2: angle of arrival (AOA) ambiguously determined
2781 2: angle of arrival (AOA) ambiguously determined
2780 3: AOA estimate not feasible
2782 3: AOA estimate not feasible
2781 4: Large difference in AOAs obtained from different antenna baselines
2783 4: Large difference in AOAs obtained from different antenna baselines
2782 5: echo at start or end of time series
2784 5: echo at start or end of time series
2783 6: echo less than 5 examples long; too short for analysis
2785 6: echo less than 5 examples long; too short for analysis
2784 7: echo rise exceeds 0.3s
2786 7: echo rise exceeds 0.3s
2785 8: echo decay time less than twice rise time
2787 8: echo decay time less than twice rise time
2786 9: large power level before echo
2788 9: large power level before echo
2787 10: large power level after echo
2789 10: large power level after echo
2788 11: poor fit to amplitude for estimation of decay time
2790 11: poor fit to amplitude for estimation of decay time
2789 12: poor fit to CCF phase variation for estimation of radial drift velocity
2791 12: poor fit to CCF phase variation for estimation of radial drift velocity
2790 13: height unresolvable echo: not valid height within 70 to 110 km
2792 13: height unresolvable echo: not valid height within 70 to 110 km
2791 14: height ambiguous echo: more then one possible height within 70 to 110 km
2793 14: height ambiguous echo: more then one possible height within 70 to 110 km
2792 15: radial drift velocity or projected horizontal velocity exceeds 200 m/s
2794 15: radial drift velocity or projected horizontal velocity exceeds 200 m/s
2793 16: oscilatory echo, indicating event most likely not an underdense echo
2795 16: oscilatory echo, indicating event most likely not an underdense echo
2794
2796
2795 17: phase difference in meteor Reestimation
2797 17: phase difference in meteor Reestimation
2796
2798
2797 Data Storage:
2799 Data Storage:
2798 Meteors for Wind Estimation (8):
2800 Meteors for Wind Estimation (8):
2799 Utc Time | Range Height
2801 Utc Time | Range Height
2800 Azimuth Zenith errorCosDir
2802 Azimuth Zenith errorCosDir
2801 VelRad errorVelRad
2803 VelRad errorVelRad
2802 Phase0 Phase1 Phase2 Phase3
2804 Phase0 Phase1 Phase2 Phase3
2803 TypeError
2805 TypeError
2804
2806
2805 '''
2807 '''
2806
2808
2807 def run(self, dataOut, hei_ref = None, tauindex = 0,
2809 def run(self, dataOut, hei_ref = None, tauindex = 0,
2808 phaseOffsets = None,
2810 phaseOffsets = None,
2809 cohDetection = False, cohDet_timeStep = 1, cohDet_thresh = 25,
2811 cohDetection = False, cohDet_timeStep = 1, cohDet_thresh = 25,
2810 noise_timeStep = 4, noise_multiple = 4,
2812 noise_timeStep = 4, noise_multiple = 4,
2811 multDet_timeLimit = 1, multDet_rangeLimit = 3,
2813 multDet_timeLimit = 1, multDet_rangeLimit = 3,
2812 phaseThresh = 20, SNRThresh = 5,
2814 phaseThresh = 20, SNRThresh = 5,
2813 hmin = 50, hmax=150, azimuth = 0,
2815 hmin = 50, hmax=150, azimuth = 0,
2814 channelPositions = None) :
2816 channelPositions = None) :
2815
2817
2816
2818
2817 #Getting Pairslist
2819 #Getting Pairslist
2818 if channelPositions == None:
2820 if channelPositions == None:
2819 # channelPositions = [(2.5,0), (0,2.5), (0,0), (0,4.5), (-2,0)] #T
2821 # channelPositions = [(2.5,0), (0,2.5), (0,0), (0,4.5), (-2,0)] #T
2820 channelPositions = [(4.5,2), (2,4.5), (2,2), (2,0), (0,2)] #Estrella
2822 channelPositions = [(4.5,2), (2,4.5), (2,2), (2,0), (0,2)] #Estrella
2821 meteorOps = SMOperations()
2823 meteorOps = SMOperations()
2822 pairslist0, distances = meteorOps.getPhasePairs(channelPositions)
2824 pairslist0, distances = meteorOps.getPhasePairs(channelPositions)
2823 heiRang = dataOut.getHeiRange()
2825 heiRang = dataOut.getHeiRange()
2824 #Get Beacon signal - No Beacon signal anymore
2826 #Get Beacon signal - No Beacon signal anymore
2825 # newheis = numpy.where(self.dataOut.heightList>self.dataOut.radarControllerHeaderObj.Taus[tauindex])
2827 # newheis = numpy.where(self.dataOut.heightList>self.dataOut.radarControllerHeaderObj.Taus[tauindex])
2826 #
2828 #
2827 # if hei_ref != None:
2829 # if hei_ref != None:
2828 # newheis = numpy.where(self.dataOut.heightList>hei_ref)
2830 # newheis = numpy.where(self.dataOut.heightList>hei_ref)
2829 #
2831 #
2830
2832
2831
2833
2832 #****************REMOVING HARDWARE PHASE DIFFERENCES***************
2834 #****************REMOVING HARDWARE PHASE DIFFERENCES***************
2833 # see if the user put in pre defined phase shifts
2835 # see if the user put in pre defined phase shifts
2834 voltsPShift = dataOut.data_pre.copy()
2836 voltsPShift = dataOut.data_pre.copy()
2835
2837
2836 # if predefinedPhaseShifts != None:
2838 # if predefinedPhaseShifts != None:
2837 # hardwarePhaseShifts = numpy.array(predefinedPhaseShifts)*numpy.pi/180
2839 # hardwarePhaseShifts = numpy.array(predefinedPhaseShifts)*numpy.pi/180
2838 #
2840 #
2839 # # elif beaconPhaseShifts:
2841 # # elif beaconPhaseShifts:
2840 # # #get hardware phase shifts using beacon signal
2842 # # #get hardware phase shifts using beacon signal
2841 # # hardwarePhaseShifts = self.__getHardwarePhaseDiff(self.dataOut.data_pre, pairslist, newheis, 10)
2843 # # hardwarePhaseShifts = self.__getHardwarePhaseDiff(self.dataOut.data_pre, pairslist, newheis, 10)
2842 # # hardwarePhaseShifts = numpy.insert(hardwarePhaseShifts,centerReceiverIndex,0)
2844 # # hardwarePhaseShifts = numpy.insert(hardwarePhaseShifts,centerReceiverIndex,0)
2843 #
2845 #
2844 # else:
2846 # else:
2845 # hardwarePhaseShifts = numpy.zeros(5)
2847 # hardwarePhaseShifts = numpy.zeros(5)
2846 #
2848 #
2847 # voltsPShift = numpy.zeros((self.dataOut.data_pre.shape[0],self.dataOut.data_pre.shape[1],self.dataOut.data_pre.shape[2]), dtype = 'complex')
2849 # voltsPShift = numpy.zeros((self.dataOut.data_pre.shape[0],self.dataOut.data_pre.shape[1],self.dataOut.data_pre.shape[2]), dtype = 'complex')
2848 # for i in range(self.dataOut.data_pre.shape[0]):
2850 # for i in range(self.dataOut.data_pre.shape[0]):
2849 # voltsPShift[i,:,:] = self.__shiftPhase(self.dataOut.data_pre[i,:,:], hardwarePhaseShifts[i])
2851 # voltsPShift[i,:,:] = self.__shiftPhase(self.dataOut.data_pre[i,:,:], hardwarePhaseShifts[i])
2850
2852
2851 #******************END OF REMOVING HARDWARE PHASE DIFFERENCES*********
2853 #******************END OF REMOVING HARDWARE PHASE DIFFERENCES*********
2852
2854
2853 #Remove DC
2855 #Remove DC
2854 voltsDC = numpy.mean(voltsPShift,1)
2856 voltsDC = numpy.mean(voltsPShift,1)
2855 voltsDC = numpy.mean(voltsDC,1)
2857 voltsDC = numpy.mean(voltsDC,1)
2856 for i in range(voltsDC.shape[0]):
2858 for i in range(voltsDC.shape[0]):
2857 voltsPShift[i] = voltsPShift[i] - voltsDC[i]
2859 voltsPShift[i] = voltsPShift[i] - voltsDC[i]
2858
2860
2859 #Don't considerate last heights, theyre used to calculate Hardware Phase Shift
2861 #Don't considerate last heights, theyre used to calculate Hardware Phase Shift
2860 # voltsPShift = voltsPShift[:,:,:newheis[0][0]]
2862 # voltsPShift = voltsPShift[:,:,:newheis[0][0]]
2861
2863
2862 #************ FIND POWER OF DATA W/COH OR NON COH DETECTION (3.4) **********
2864 #************ FIND POWER OF DATA W/COH OR NON COH DETECTION (3.4) **********
2863 #Coherent Detection
2865 #Coherent Detection
2864 if cohDetection:
2866 if cohDetection:
2865 #use coherent detection to get the net power
2867 #use coherent detection to get the net power
2866 cohDet_thresh = cohDet_thresh*numpy.pi/180
2868 cohDet_thresh = cohDet_thresh*numpy.pi/180
2867 voltsPShift = self.__coherentDetection(voltsPShift, cohDet_timeStep, dataOut.timeInterval, pairslist0, cohDet_thresh)
2869 voltsPShift = self.__coherentDetection(voltsPShift, cohDet_timeStep, dataOut.timeInterval, pairslist0, cohDet_thresh)
2868
2870
2869 #Non-coherent detection!
2871 #Non-coherent detection!
2870 powerNet = numpy.nansum(numpy.abs(voltsPShift[:,:,:])**2,0)
2872 powerNet = numpy.nansum(numpy.abs(voltsPShift[:,:,:])**2,0)
2871 #********** END OF COH/NON-COH POWER CALCULATION**********************
2873 #********** END OF COH/NON-COH POWER CALCULATION**********************
2872
2874
2873 #********** FIND THE NOISE LEVEL AND POSSIBLE METEORS ****************
2875 #********** FIND THE NOISE LEVEL AND POSSIBLE METEORS ****************
2874 #Get noise
2876 #Get noise
2875 noise, noise1 = self.__getNoise(powerNet, noise_timeStep, dataOut.timeInterval)
2877 noise, noise1 = self.__getNoise(powerNet, noise_timeStep, dataOut.timeInterval)
2876 # noise = self.getNoise1(powerNet, noise_timeStep, self.dataOut.timeInterval)
2878 # noise = self.getNoise1(powerNet, noise_timeStep, self.dataOut.timeInterval)
2877 #Get signal threshold
2879 #Get signal threshold
2878 signalThresh = noise_multiple*noise
2880 signalThresh = noise_multiple*noise
2879 #Meteor echoes detection
2881 #Meteor echoes detection
2880 listMeteors = self.__findMeteors(powerNet, signalThresh)
2882 listMeteors = self.__findMeteors(powerNet, signalThresh)
2881 #******* END OF NOISE LEVEL AND POSSIBLE METEORS CACULATION **********
2883 #******* END OF NOISE LEVEL AND POSSIBLE METEORS CACULATION **********
2882
2884
2883 #************** REMOVE MULTIPLE DETECTIONS (3.5) ***************************
2885 #************** REMOVE MULTIPLE DETECTIONS (3.5) ***************************
2884 #Parameters
2886 #Parameters
2885 heiRange = dataOut.getHeiRange()
2887 heiRange = dataOut.getHeiRange()
2886 rangeInterval = heiRange[1] - heiRange[0]
2888 rangeInterval = heiRange[1] - heiRange[0]
2887 rangeLimit = multDet_rangeLimit/rangeInterval
2889 rangeLimit = multDet_rangeLimit/rangeInterval
2888 timeLimit = multDet_timeLimit/dataOut.timeInterval
2890 timeLimit = multDet_timeLimit/dataOut.timeInterval
2889 #Multiple detection removals
2891 #Multiple detection removals
2890 listMeteors1 = self.__removeMultipleDetections(listMeteors, rangeLimit, timeLimit)
2892 listMeteors1 = self.__removeMultipleDetections(listMeteors, rangeLimit, timeLimit)
2891 #************ END OF REMOVE MULTIPLE DETECTIONS **********************
2893 #************ END OF REMOVE MULTIPLE DETECTIONS **********************
2892
2894
2893 #********************* METEOR REESTIMATION (3.7, 3.8, 3.9, 3.10) ********************
2895 #********************* METEOR REESTIMATION (3.7, 3.8, 3.9, 3.10) ********************
2894 #Parameters
2896 #Parameters
2895 phaseThresh = phaseThresh*numpy.pi/180
2897 phaseThresh = phaseThresh*numpy.pi/180
2896 thresh = [phaseThresh, noise_multiple, SNRThresh]
2898 thresh = [phaseThresh, noise_multiple, SNRThresh]
2897 #Meteor reestimation (Errors N 1, 6, 12, 17)
2899 #Meteor reestimation (Errors N 1, 6, 12, 17)
2898 listMeteors2, listMeteorsPower, listMeteorsVolts = self.__meteorReestimation(listMeteors1, voltsPShift, pairslist0, thresh, noise, dataOut.timeInterval, dataOut.frequency)
2900 listMeteors2, listMeteorsPower, listMeteorsVolts = self.__meteorReestimation(listMeteors1, voltsPShift, pairslist0, thresh, noise, dataOut.timeInterval, dataOut.frequency)
2899 # listMeteors2, listMeteorsPower, listMeteorsVolts = self.meteorReestimation3(listMeteors2, listMeteorsPower, listMeteorsVolts, voltsPShift, pairslist, thresh, noise)
2901 # listMeteors2, listMeteorsPower, listMeteorsVolts = self.meteorReestimation3(listMeteors2, listMeteorsPower, listMeteorsVolts, voltsPShift, pairslist, thresh, noise)
2900 #Estimation of decay times (Errors N 7, 8, 11)
2902 #Estimation of decay times (Errors N 7, 8, 11)
2901 listMeteors3 = self.__estimateDecayTime(listMeteors2, listMeteorsPower, dataOut.timeInterval, dataOut.frequency)
2903 listMeteors3 = self.__estimateDecayTime(listMeteors2, listMeteorsPower, dataOut.timeInterval, dataOut.frequency)
2902 #******************* END OF METEOR REESTIMATION *******************
2904 #******************* END OF METEOR REESTIMATION *******************
2903
2905
2904 #********************* METEOR PARAMETERS CALCULATION (3.11, 3.12, 3.13) **************************
2906 #********************* METEOR PARAMETERS CALCULATION (3.11, 3.12, 3.13) **************************
2905 #Calculating Radial Velocity (Error N 15)
2907 #Calculating Radial Velocity (Error N 15)
2906 radialStdThresh = 10
2908 radialStdThresh = 10
2907 listMeteors4 = self.__getRadialVelocity(listMeteors3, listMeteorsVolts, radialStdThresh, pairslist0, dataOut.timeInterval)
2909 listMeteors4 = self.__getRadialVelocity(listMeteors3, listMeteorsVolts, radialStdThresh, pairslist0, dataOut.timeInterval)
2908
2910
2909 if len(listMeteors4) > 0:
2911 if len(listMeteors4) > 0:
2910 #Setting New Array
2912 #Setting New Array
2911 date = dataOut.utctime
2913 date = dataOut.utctime
2912 arrayParameters = self.__setNewArrays(listMeteors4, date, heiRang)
2914 arrayParameters = self.__setNewArrays(listMeteors4, date, heiRang)
2913
2915
2914 #Correcting phase offset
2916 #Correcting phase offset
2915 if phaseOffsets != None:
2917 if phaseOffsets != None:
2916 phaseOffsets = numpy.array(phaseOffsets)*numpy.pi/180
2918 phaseOffsets = numpy.array(phaseOffsets)*numpy.pi/180
2917 arrayParameters[:,8:12] = numpy.unwrap(arrayParameters[:,8:12] + phaseOffsets)
2919 arrayParameters[:,8:12] = numpy.unwrap(arrayParameters[:,8:12] + phaseOffsets)
2918
2920
2919 #Second Pairslist
2921 #Second Pairslist
2920 pairsList = []
2922 pairsList = []
2921 pairx = (0,1)
2923 pairx = (0,1)
2922 pairy = (2,3)
2924 pairy = (2,3)
2923 pairsList.append(pairx)
2925 pairsList.append(pairx)
2924 pairsList.append(pairy)
2926 pairsList.append(pairy)
2925
2927
2926 jph = numpy.array([0,0,0,0])
2928 jph = numpy.array([0,0,0,0])
2927 h = (hmin,hmax)
2929 h = (hmin,hmax)
2928 arrayParameters = meteorOps.getMeteorParams(arrayParameters, azimuth, h, pairsList, distances, jph)
2930 arrayParameters = meteorOps.getMeteorParams(arrayParameters, azimuth, h, pairsList, distances, jph)
2929
2931
2930 # #Calculate AOA (Error N 3, 4)
2932 # #Calculate AOA (Error N 3, 4)
2931 # #JONES ET AL. 1998
2933 # #JONES ET AL. 1998
2932 # error = arrayParameters[:,-1]
2934 # error = arrayParameters[:,-1]
2933 # AOAthresh = numpy.pi/8
2935 # AOAthresh = numpy.pi/8
2934 # phases = -arrayParameters[:,9:13]
2936 # phases = -arrayParameters[:,9:13]
2935 # arrayParameters[:,4:7], arrayParameters[:,-1] = meteorOps.getAOA(phases, pairsList, error, AOAthresh, azimuth)
2937 # arrayParameters[:,4:7], arrayParameters[:,-1] = meteorOps.getAOA(phases, pairsList, error, AOAthresh, azimuth)
2936 #
2938 #
2937 # #Calculate Heights (Error N 13 and 14)
2939 # #Calculate Heights (Error N 13 and 14)
2938 # error = arrayParameters[:,-1]
2940 # error = arrayParameters[:,-1]
2939 # Ranges = arrayParameters[:,2]
2941 # Ranges = arrayParameters[:,2]
2940 # zenith = arrayParameters[:,5]
2942 # zenith = arrayParameters[:,5]
2941 # arrayParameters[:,3], arrayParameters[:,-1] = meteorOps.getHeights(Ranges, zenith, error, hmin, hmax)
2943 # arrayParameters[:,3], arrayParameters[:,-1] = meteorOps.getHeights(Ranges, zenith, error, hmin, hmax)
2942 # error = arrayParameters[:,-1]
2944 # error = arrayParameters[:,-1]
2943 #********************* END OF PARAMETERS CALCULATION **************************
2945 #********************* END OF PARAMETERS CALCULATION **************************
2944
2946
2945 #***************************+ PASS DATA TO NEXT STEP **********************
2947 #***************************+ PASS DATA TO NEXT STEP **********************
2946 # arrayFinal = arrayParameters.reshape((1,arrayParameters.shape[0],arrayParameters.shape[1]))
2948 # arrayFinal = arrayParameters.reshape((1,arrayParameters.shape[0],arrayParameters.shape[1]))
2947 dataOut.data_param = arrayParameters
2949 dataOut.data_param = arrayParameters
2948
2950
2949 if arrayParameters == None:
2951 if arrayParameters == None:
2950 dataOut.flagNoData = True
2952 dataOut.flagNoData = True
2951 else:
2953 else:
2952 dataOut.flagNoData = True
2954 dataOut.flagNoData = True
2953
2955
2954 return
2956 return
2955
2957
2956 def __getHardwarePhaseDiff(self, voltage0, pairslist, newheis, n):
2958 def __getHardwarePhaseDiff(self, voltage0, pairslist, newheis, n):
2957
2959
2958 minIndex = min(newheis[0])
2960 minIndex = min(newheis[0])
2959 maxIndex = max(newheis[0])
2961 maxIndex = max(newheis[0])
2960
2962
2961 voltage = voltage0[:,:,minIndex:maxIndex+1]
2963 voltage = voltage0[:,:,minIndex:maxIndex+1]
2962 nLength = voltage.shape[1]/n
2964 nLength = voltage.shape[1]/n
2963 nMin = 0
2965 nMin = 0
2964 nMax = 0
2966 nMax = 0
2965 phaseOffset = numpy.zeros((len(pairslist),n))
2967 phaseOffset = numpy.zeros((len(pairslist),n))
2966
2968
2967 for i in range(n):
2969 for i in range(n):
2968 nMax += nLength
2970 nMax += nLength
2969 phaseCCF = -numpy.angle(self.__calculateCCF(voltage[:,nMin:nMax,:], pairslist, [0]))
2971 phaseCCF = -numpy.angle(self.__calculateCCF(voltage[:,nMin:nMax,:], pairslist, [0]))
2970 phaseCCF = numpy.mean(phaseCCF, axis = 2)
2972 phaseCCF = numpy.mean(phaseCCF, axis = 2)
2971 phaseOffset[:,i] = phaseCCF.transpose()
2973 phaseOffset[:,i] = phaseCCF.transpose()
2972 nMin = nMax
2974 nMin = nMax
2973 # phaseDiff, phaseArrival = self.estimatePhaseDifference(voltage, pairslist)
2975 # phaseDiff, phaseArrival = self.estimatePhaseDifference(voltage, pairslist)
2974
2976
2975 #Remove Outliers
2977 #Remove Outliers
2976 factor = 2
2978 factor = 2
2977 wt = phaseOffset - signal.medfilt(phaseOffset,(1,5))
2979 wt = phaseOffset - signal.medfilt(phaseOffset,(1,5))
2978 dw = numpy.std(wt,axis = 1)
2980 dw = numpy.std(wt,axis = 1)
2979 dw = dw.reshape((dw.size,1))
2981 dw = dw.reshape((dw.size,1))
2980 ind = numpy.where(numpy.logical_or(wt>dw*factor,wt<-dw*factor))
2982 ind = numpy.where(numpy.logical_or(wt>dw*factor,wt<-dw*factor))
2981 phaseOffset[ind] = numpy.nan
2983 phaseOffset[ind] = numpy.nan
2982 phaseOffset = stats.nanmean(phaseOffset, axis=1)
2984 phaseOffset = stats.nanmean(phaseOffset, axis=1)
2983
2985
2984 return phaseOffset
2986 return phaseOffset
2985
2987
2986 def __shiftPhase(self, data, phaseShift):
2988 def __shiftPhase(self, data, phaseShift):
2987 #this will shift the phase of a complex number
2989 #this will shift the phase of a complex number
2988 dataShifted = numpy.abs(data) * numpy.exp((numpy.angle(data)+phaseShift)*1j)
2990 dataShifted = numpy.abs(data) * numpy.exp((numpy.angle(data)+phaseShift)*1j)
2989 return dataShifted
2991 return dataShifted
2990
2992
2991 def __estimatePhaseDifference(self, array, pairslist):
2993 def __estimatePhaseDifference(self, array, pairslist):
2992 nChannel = array.shape[0]
2994 nChannel = array.shape[0]
2993 nHeights = array.shape[2]
2995 nHeights = array.shape[2]
2994 numPairs = len(pairslist)
2996 numPairs = len(pairslist)
2995 # phaseCCF = numpy.zeros((nChannel, 5, nHeights))
2997 # phaseCCF = numpy.zeros((nChannel, 5, nHeights))
2996 phaseCCF = numpy.angle(self.__calculateCCF(array, pairslist, [-2,-1,0,1,2]))
2998 phaseCCF = numpy.angle(self.__calculateCCF(array, pairslist, [-2,-1,0,1,2]))
2997
2999
2998 #Correct phases
3000 #Correct phases
2999 derPhaseCCF = phaseCCF[:,1:,:] - phaseCCF[:,0:-1,:]
3001 derPhaseCCF = phaseCCF[:,1:,:] - phaseCCF[:,0:-1,:]
3000 indDer = numpy.where(numpy.abs(derPhaseCCF) > numpy.pi)
3002 indDer = numpy.where(numpy.abs(derPhaseCCF) > numpy.pi)
3001
3003
3002 if indDer[0].shape[0] > 0:
3004 if indDer[0].shape[0] > 0:
3003 for i in range(indDer[0].shape[0]):
3005 for i in range(indDer[0].shape[0]):
3004 signo = -numpy.sign(derPhaseCCF[indDer[0][i],indDer[1][i],indDer[2][i]])
3006 signo = -numpy.sign(derPhaseCCF[indDer[0][i],indDer[1][i],indDer[2][i]])
3005 phaseCCF[indDer[0][i],indDer[1][i]+1:,:] += signo*2*numpy.pi
3007 phaseCCF[indDer[0][i],indDer[1][i]+1:,:] += signo*2*numpy.pi
3006
3008
3007 # for j in range(numSides):
3009 # for j in range(numSides):
3008 # phaseCCFAux = self.calculateCCF(arrayCenter, arraySides[j,:,:], [-2,1,0,1,2])
3010 # phaseCCFAux = self.calculateCCF(arrayCenter, arraySides[j,:,:], [-2,1,0,1,2])
3009 # phaseCCF[j,:,:] = numpy.angle(phaseCCFAux)
3011 # phaseCCF[j,:,:] = numpy.angle(phaseCCFAux)
3010 #
3012 #
3011 #Linear
3013 #Linear
3012 phaseInt = numpy.zeros((numPairs,1))
3014 phaseInt = numpy.zeros((numPairs,1))
3013 angAllCCF = phaseCCF[:,[0,1,3,4],0]
3015 angAllCCF = phaseCCF[:,[0,1,3,4],0]
3014 for j in range(numPairs):
3016 for j in range(numPairs):
3015 fit = stats.linregress([-2,-1,1,2],angAllCCF[j,:])
3017 fit = stats.linregress([-2,-1,1,2],angAllCCF[j,:])
3016 phaseInt[j] = fit[1]
3018 phaseInt[j] = fit[1]
3017 #Phase Differences
3019 #Phase Differences
3018 phaseDiff = phaseInt - phaseCCF[:,2,:]
3020 phaseDiff = phaseInt - phaseCCF[:,2,:]
3019 phaseArrival = phaseInt.reshape(phaseInt.size)
3021 phaseArrival = phaseInt.reshape(phaseInt.size)
3020
3022
3021 #Dealias
3023 #Dealias
3022 phaseArrival = numpy.angle(numpy.exp(1j*phaseArrival))
3024 phaseArrival = numpy.angle(numpy.exp(1j*phaseArrival))
3023 # indAlias = numpy.where(phaseArrival > numpy.pi)
3025 # indAlias = numpy.where(phaseArrival > numpy.pi)
3024 # phaseArrival[indAlias] -= 2*numpy.pi
3026 # phaseArrival[indAlias] -= 2*numpy.pi
3025 # indAlias = numpy.where(phaseArrival < -numpy.pi)
3027 # indAlias = numpy.where(phaseArrival < -numpy.pi)
3026 # phaseArrival[indAlias] += 2*numpy.pi
3028 # phaseArrival[indAlias] += 2*numpy.pi
3027
3029
3028 return phaseDiff, phaseArrival
3030 return phaseDiff, phaseArrival
3029
3031
3030 def __coherentDetection(self, volts, timeSegment, timeInterval, pairslist, thresh):
3032 def __coherentDetection(self, volts, timeSegment, timeInterval, pairslist, thresh):
3031 #this function will run the coherent detection used in Holdworth et al. 2004 and return the net power
3033 #this function will run the coherent detection used in Holdworth et al. 2004 and return the net power
3032 #find the phase shifts of each channel over 1 second intervals
3034 #find the phase shifts of each channel over 1 second intervals
3033 #only look at ranges below the beacon signal
3035 #only look at ranges below the beacon signal
3034 numProfPerBlock = numpy.ceil(timeSegment/timeInterval)
3036 numProfPerBlock = numpy.ceil(timeSegment/timeInterval)
3035 numBlocks = int(volts.shape[1]/numProfPerBlock)
3037 numBlocks = int(volts.shape[1]/numProfPerBlock)
3036 numHeights = volts.shape[2]
3038 numHeights = volts.shape[2]
3037 nChannel = volts.shape[0]
3039 nChannel = volts.shape[0]
3038 voltsCohDet = volts.copy()
3040 voltsCohDet = volts.copy()
3039
3041
3040 pairsarray = numpy.array(pairslist)
3042 pairsarray = numpy.array(pairslist)
3041 indSides = pairsarray[:,1]
3043 indSides = pairsarray[:,1]
3042 # indSides = numpy.array(range(nChannel))
3044 # indSides = numpy.array(range(nChannel))
3043 # indSides = numpy.delete(indSides, indCenter)
3045 # indSides = numpy.delete(indSides, indCenter)
3044 #
3046 #
3045 # listCenter = numpy.array_split(volts[indCenter,:,:], numBlocks, 0)
3047 # listCenter = numpy.array_split(volts[indCenter,:,:], numBlocks, 0)
3046 listBlocks = numpy.array_split(volts, numBlocks, 1)
3048 listBlocks = numpy.array_split(volts, numBlocks, 1)
3047
3049
3048 startInd = 0
3050 startInd = 0
3049 endInd = 0
3051 endInd = 0
3050
3052
3051 for i in range(numBlocks):
3053 for i in range(numBlocks):
3052 startInd = endInd
3054 startInd = endInd
3053 endInd = endInd + listBlocks[i].shape[1]
3055 endInd = endInd + listBlocks[i].shape[1]
3054
3056
3055 arrayBlock = listBlocks[i]
3057 arrayBlock = listBlocks[i]
3056 # arrayBlockCenter = listCenter[i]
3058 # arrayBlockCenter = listCenter[i]
3057
3059
3058 #Estimate the Phase Difference
3060 #Estimate the Phase Difference
3059 phaseDiff, aux = self.__estimatePhaseDifference(arrayBlock, pairslist)
3061 phaseDiff, aux = self.__estimatePhaseDifference(arrayBlock, pairslist)
3060 #Phase Difference RMS
3062 #Phase Difference RMS
3061 arrayPhaseRMS = numpy.abs(phaseDiff)
3063 arrayPhaseRMS = numpy.abs(phaseDiff)
3062 phaseRMSaux = numpy.sum(arrayPhaseRMS < thresh,0)
3064 phaseRMSaux = numpy.sum(arrayPhaseRMS < thresh,0)
3063 indPhase = numpy.where(phaseRMSaux==4)
3065 indPhase = numpy.where(phaseRMSaux==4)
3064 #Shifting
3066 #Shifting
3065 if indPhase[0].shape[0] > 0:
3067 if indPhase[0].shape[0] > 0:
3066 for j in range(indSides.size):
3068 for j in range(indSides.size):
3067 arrayBlock[indSides[j],:,indPhase] = self.__shiftPhase(arrayBlock[indSides[j],:,indPhase], phaseDiff[j,indPhase].transpose())
3069 arrayBlock[indSides[j],:,indPhase] = self.__shiftPhase(arrayBlock[indSides[j],:,indPhase], phaseDiff[j,indPhase].transpose())
3068 voltsCohDet[:,startInd:endInd,:] = arrayBlock
3070 voltsCohDet[:,startInd:endInd,:] = arrayBlock
3069
3071
3070 return voltsCohDet
3072 return voltsCohDet
3071
3073
3072 def __calculateCCF(self, volts, pairslist ,laglist):
3074 def __calculateCCF(self, volts, pairslist ,laglist):
3073
3075
3074 nHeights = volts.shape[2]
3076 nHeights = volts.shape[2]
3075 nPoints = volts.shape[1]
3077 nPoints = volts.shape[1]
3076 voltsCCF = numpy.zeros((len(pairslist), len(laglist), nHeights),dtype = 'complex')
3078 voltsCCF = numpy.zeros((len(pairslist), len(laglist), nHeights),dtype = 'complex')
3077
3079
3078 for i in range(len(pairslist)):
3080 for i in range(len(pairslist)):
3079 volts1 = volts[pairslist[i][0]]
3081 volts1 = volts[pairslist[i][0]]
3080 volts2 = volts[pairslist[i][1]]
3082 volts2 = volts[pairslist[i][1]]
3081
3083
3082 for t in range(len(laglist)):
3084 for t in range(len(laglist)):
3083 idxT = laglist[t]
3085 idxT = laglist[t]
3084 if idxT >= 0:
3086 if idxT >= 0:
3085 vStacked = numpy.vstack((volts2[idxT:,:],
3087 vStacked = numpy.vstack((volts2[idxT:,:],
3086 numpy.zeros((idxT, nHeights),dtype='complex')))
3088 numpy.zeros((idxT, nHeights),dtype='complex')))
3087 else:
3089 else:
3088 vStacked = numpy.vstack((numpy.zeros((-idxT, nHeights),dtype='complex'),
3090 vStacked = numpy.vstack((numpy.zeros((-idxT, nHeights),dtype='complex'),
3089 volts2[:(nPoints + idxT),:]))
3091 volts2[:(nPoints + idxT),:]))
3090 voltsCCF[i,t,:] = numpy.sum((numpy.conjugate(volts1)*vStacked),axis=0)
3092 voltsCCF[i,t,:] = numpy.sum((numpy.conjugate(volts1)*vStacked),axis=0)
3091
3093
3092 vStacked = None
3094 vStacked = None
3093 return voltsCCF
3095 return voltsCCF
3094
3096
3095 def __getNoise(self, power, timeSegment, timeInterval):
3097 def __getNoise(self, power, timeSegment, timeInterval):
3096 numProfPerBlock = numpy.ceil(timeSegment/timeInterval)
3098 numProfPerBlock = numpy.ceil(timeSegment/timeInterval)
3097 numBlocks = int(power.shape[0]/numProfPerBlock)
3099 numBlocks = int(power.shape[0]/numProfPerBlock)
3098 numHeights = power.shape[1]
3100 numHeights = power.shape[1]
3099
3101
3100 listPower = numpy.array_split(power, numBlocks, 0)
3102 listPower = numpy.array_split(power, numBlocks, 0)
3101 noise = numpy.zeros((power.shape[0], power.shape[1]))
3103 noise = numpy.zeros((power.shape[0], power.shape[1]))
3102 noise1 = numpy.zeros((power.shape[0], power.shape[1]))
3104 noise1 = numpy.zeros((power.shape[0], power.shape[1]))
3103
3105
3104 startInd = 0
3106 startInd = 0
3105 endInd = 0
3107 endInd = 0
3106
3108
3107 for i in range(numBlocks): #split por canal
3109 for i in range(numBlocks): #split por canal
3108 startInd = endInd
3110 startInd = endInd
3109 endInd = endInd + listPower[i].shape[0]
3111 endInd = endInd + listPower[i].shape[0]
3110
3112
3111 arrayBlock = listPower[i]
3113 arrayBlock = listPower[i]
3112 noiseAux = numpy.mean(arrayBlock, 0)
3114 noiseAux = numpy.mean(arrayBlock, 0)
3113 # noiseAux = numpy.median(noiseAux)
3115 # noiseAux = numpy.median(noiseAux)
3114 # noiseAux = numpy.mean(arrayBlock)
3116 # noiseAux = numpy.mean(arrayBlock)
3115 noise[startInd:endInd,:] = noise[startInd:endInd,:] + noiseAux
3117 noise[startInd:endInd,:] = noise[startInd:endInd,:] + noiseAux
3116
3118
3117 noiseAux1 = numpy.mean(arrayBlock)
3119 noiseAux1 = numpy.mean(arrayBlock)
3118 noise1[startInd:endInd,:] = noise1[startInd:endInd,:] + noiseAux1
3120 noise1[startInd:endInd,:] = noise1[startInd:endInd,:] + noiseAux1
3119
3121
3120 return noise, noise1
3122 return noise, noise1
3121
3123
3122 def __findMeteors(self, power, thresh):
3124 def __findMeteors(self, power, thresh):
3123 nProf = power.shape[0]
3125 nProf = power.shape[0]
3124 nHeights = power.shape[1]
3126 nHeights = power.shape[1]
3125 listMeteors = []
3127 listMeteors = []
3126
3128
3127 for i in range(nHeights):
3129 for i in range(nHeights):
3128 powerAux = power[:,i]
3130 powerAux = power[:,i]
3129 threshAux = thresh[:,i]
3131 threshAux = thresh[:,i]
3130
3132
3131 indUPthresh = numpy.where(powerAux > threshAux)[0]
3133 indUPthresh = numpy.where(powerAux > threshAux)[0]
3132 indDNthresh = numpy.where(powerAux <= threshAux)[0]
3134 indDNthresh = numpy.where(powerAux <= threshAux)[0]
3133
3135
3134 j = 0
3136 j = 0
3135
3137
3136 while (j < indUPthresh.size - 2):
3138 while (j < indUPthresh.size - 2):
3137 if (indUPthresh[j + 2] == indUPthresh[j] + 2):
3139 if (indUPthresh[j + 2] == indUPthresh[j] + 2):
3138 indDNAux = numpy.where(indDNthresh > indUPthresh[j])
3140 indDNAux = numpy.where(indDNthresh > indUPthresh[j])
3139 indDNthresh = indDNthresh[indDNAux]
3141 indDNthresh = indDNthresh[indDNAux]
3140
3142
3141 if (indDNthresh.size > 0):
3143 if (indDNthresh.size > 0):
3142 indEnd = indDNthresh[0] - 1
3144 indEnd = indDNthresh[0] - 1
3143 indInit = indUPthresh[j]
3145 indInit = indUPthresh[j]
3144
3146
3145 meteor = powerAux[indInit:indEnd + 1]
3147 meteor = powerAux[indInit:indEnd + 1]
3146 indPeak = meteor.argmax() + indInit
3148 indPeak = meteor.argmax() + indInit
3147 FLA = sum(numpy.conj(meteor)*numpy.hstack((meteor[1:],0)))
3149 FLA = sum(numpy.conj(meteor)*numpy.hstack((meteor[1:],0)))
3148
3150
3149 listMeteors.append(numpy.array([i,indInit,indPeak,indEnd,FLA])) #CHEQUEAR!!!!!
3151 listMeteors.append(numpy.array([i,indInit,indPeak,indEnd,FLA])) #CHEQUEAR!!!!!
3150 j = numpy.where(indUPthresh == indEnd)[0] + 1
3152 j = numpy.where(indUPthresh == indEnd)[0] + 1
3151 else: j+=1
3153 else: j+=1
3152 else: j+=1
3154 else: j+=1
3153
3155
3154 return listMeteors
3156 return listMeteors
3155
3157
3156 def __removeMultipleDetections(self,listMeteors, rangeLimit, timeLimit):
3158 def __removeMultipleDetections(self,listMeteors, rangeLimit, timeLimit):
3157
3159
3158 arrayMeteors = numpy.asarray(listMeteors)
3160 arrayMeteors = numpy.asarray(listMeteors)
3159 listMeteors1 = []
3161 listMeteors1 = []
3160
3162
3161 while arrayMeteors.shape[0] > 0:
3163 while arrayMeteors.shape[0] > 0:
3162 FLAs = arrayMeteors[:,4]
3164 FLAs = arrayMeteors[:,4]
3163 maxFLA = FLAs.argmax()
3165 maxFLA = FLAs.argmax()
3164 listMeteors1.append(arrayMeteors[maxFLA,:])
3166 listMeteors1.append(arrayMeteors[maxFLA,:])
3165
3167
3166 MeteorInitTime = arrayMeteors[maxFLA,1]
3168 MeteorInitTime = arrayMeteors[maxFLA,1]
3167 MeteorEndTime = arrayMeteors[maxFLA,3]
3169 MeteorEndTime = arrayMeteors[maxFLA,3]
3168 MeteorHeight = arrayMeteors[maxFLA,0]
3170 MeteorHeight = arrayMeteors[maxFLA,0]
3169
3171
3170 #Check neighborhood
3172 #Check neighborhood
3171 maxHeightIndex = MeteorHeight + rangeLimit
3173 maxHeightIndex = MeteorHeight + rangeLimit
3172 minHeightIndex = MeteorHeight - rangeLimit
3174 minHeightIndex = MeteorHeight - rangeLimit
3173 minTimeIndex = MeteorInitTime - timeLimit
3175 minTimeIndex = MeteorInitTime - timeLimit
3174 maxTimeIndex = MeteorEndTime + timeLimit
3176 maxTimeIndex = MeteorEndTime + timeLimit
3175
3177
3176 #Check Heights
3178 #Check Heights
3177 indHeight = numpy.logical_and(arrayMeteors[:,0] >= minHeightIndex, arrayMeteors[:,0] <= maxHeightIndex)
3179 indHeight = numpy.logical_and(arrayMeteors[:,0] >= minHeightIndex, arrayMeteors[:,0] <= maxHeightIndex)
3178 indTime = numpy.logical_and(arrayMeteors[:,3] >= minTimeIndex, arrayMeteors[:,1] <= maxTimeIndex)
3180 indTime = numpy.logical_and(arrayMeteors[:,3] >= minTimeIndex, arrayMeteors[:,1] <= maxTimeIndex)
3179 indBoth = numpy.where(numpy.logical_and(indTime,indHeight))
3181 indBoth = numpy.where(numpy.logical_and(indTime,indHeight))
3180
3182
3181 arrayMeteors = numpy.delete(arrayMeteors, indBoth, axis = 0)
3183 arrayMeteors = numpy.delete(arrayMeteors, indBoth, axis = 0)
3182
3184
3183 return listMeteors1
3185 return listMeteors1
3184
3186
3185 def __meteorReestimation(self, listMeteors, volts, pairslist, thresh, noise, timeInterval,frequency):
3187 def __meteorReestimation(self, listMeteors, volts, pairslist, thresh, noise, timeInterval,frequency):
3186 numHeights = volts.shape[2]
3188 numHeights = volts.shape[2]
3187 nChannel = volts.shape[0]
3189 nChannel = volts.shape[0]
3188
3190
3189 thresholdPhase = thresh[0]
3191 thresholdPhase = thresh[0]
3190 thresholdNoise = thresh[1]
3192 thresholdNoise = thresh[1]
3191 thresholdDB = float(thresh[2])
3193 thresholdDB = float(thresh[2])
3192
3194
3193 thresholdDB1 = 10**(thresholdDB/10)
3195 thresholdDB1 = 10**(thresholdDB/10)
3194 pairsarray = numpy.array(pairslist)
3196 pairsarray = numpy.array(pairslist)
3195 indSides = pairsarray[:,1]
3197 indSides = pairsarray[:,1]
3196
3198
3197 pairslist1 = list(pairslist)
3199 pairslist1 = list(pairslist)
3198 pairslist1.append((0,1))
3200 pairslist1.append((0,1))
3199 pairslist1.append((3,4))
3201 pairslist1.append((3,4))
3200
3202
3201 listMeteors1 = []
3203 listMeteors1 = []
3202 listPowerSeries = []
3204 listPowerSeries = []
3203 listVoltageSeries = []
3205 listVoltageSeries = []
3204 #volts has the war data
3206 #volts has the war data
3205
3207
3206 if frequency == 30e6:
3208 if frequency == 30e6:
3207 timeLag = 45*10**-3
3209 timeLag = 45*10**-3
3208 else:
3210 else:
3209 timeLag = 15*10**-3
3211 timeLag = 15*10**-3
3210 lag = numpy.ceil(timeLag/timeInterval)
3212 lag = numpy.ceil(timeLag/timeInterval)
3211
3213
3212 for i in range(len(listMeteors)):
3214 for i in range(len(listMeteors)):
3213
3215
3214 ###################### 3.6 - 3.7 PARAMETERS REESTIMATION #########################
3216 ###################### 3.6 - 3.7 PARAMETERS REESTIMATION #########################
3215 meteorAux = numpy.zeros(16)
3217 meteorAux = numpy.zeros(16)
3216
3218
3217 #Loading meteor Data (mHeight, mStart, mPeak, mEnd)
3219 #Loading meteor Data (mHeight, mStart, mPeak, mEnd)
3218 mHeight = listMeteors[i][0]
3220 mHeight = listMeteors[i][0]
3219 mStart = listMeteors[i][1]
3221 mStart = listMeteors[i][1]
3220 mPeak = listMeteors[i][2]
3222 mPeak = listMeteors[i][2]
3221 mEnd = listMeteors[i][3]
3223 mEnd = listMeteors[i][3]
3222
3224
3223 #get the volt data between the start and end times of the meteor
3225 #get the volt data between the start and end times of the meteor
3224 meteorVolts = volts[:,mStart:mEnd+1,mHeight]
3226 meteorVolts = volts[:,mStart:mEnd+1,mHeight]
3225 meteorVolts = meteorVolts.reshape(meteorVolts.shape[0], meteorVolts.shape[1], 1)
3227 meteorVolts = meteorVolts.reshape(meteorVolts.shape[0], meteorVolts.shape[1], 1)
3226
3228
3227 #3.6. Phase Difference estimation
3229 #3.6. Phase Difference estimation
3228 phaseDiff, aux = self.__estimatePhaseDifference(meteorVolts, pairslist)
3230 phaseDiff, aux = self.__estimatePhaseDifference(meteorVolts, pairslist)
3229
3231
3230 #3.7. Phase difference removal & meteor start, peak and end times reestimated
3232 #3.7. Phase difference removal & meteor start, peak and end times reestimated
3231 #meteorVolts0.- all Channels, all Profiles
3233 #meteorVolts0.- all Channels, all Profiles
3232 meteorVolts0 = volts[:,:,mHeight]
3234 meteorVolts0 = volts[:,:,mHeight]
3233 meteorThresh = noise[:,mHeight]*thresholdNoise
3235 meteorThresh = noise[:,mHeight]*thresholdNoise
3234 meteorNoise = noise[:,mHeight]
3236 meteorNoise = noise[:,mHeight]
3235 meteorVolts0[indSides,:] = self.__shiftPhase(meteorVolts0[indSides,:], phaseDiff) #Phase Shifting
3237 meteorVolts0[indSides,:] = self.__shiftPhase(meteorVolts0[indSides,:], phaseDiff) #Phase Shifting
3236 powerNet0 = numpy.nansum(numpy.abs(meteorVolts0)**2, axis = 0) #Power
3238 powerNet0 = numpy.nansum(numpy.abs(meteorVolts0)**2, axis = 0) #Power
3237
3239
3238 #Times reestimation
3240 #Times reestimation
3239 mStart1 = numpy.where(powerNet0[:mPeak] < meteorThresh[:mPeak])[0]
3241 mStart1 = numpy.where(powerNet0[:mPeak] < meteorThresh[:mPeak])[0]
3240 if mStart1.size > 0:
3242 if mStart1.size > 0:
3241 mStart1 = mStart1[-1] + 1
3243 mStart1 = mStart1[-1] + 1
3242
3244
3243 else:
3245 else:
3244 mStart1 = mPeak
3246 mStart1 = mPeak
3245
3247
3246 mEnd1 = numpy.where(powerNet0[mPeak:] < meteorThresh[mPeak:])[0][0] + mPeak - 1
3248 mEnd1 = numpy.where(powerNet0[mPeak:] < meteorThresh[mPeak:])[0][0] + mPeak - 1
3247 mEndDecayTime1 = numpy.where(powerNet0[mPeak:] < meteorNoise[mPeak:])[0]
3249 mEndDecayTime1 = numpy.where(powerNet0[mPeak:] < meteorNoise[mPeak:])[0]
3248 if mEndDecayTime1.size == 0:
3250 if mEndDecayTime1.size == 0:
3249 mEndDecayTime1 = powerNet0.size
3251 mEndDecayTime1 = powerNet0.size
3250 else:
3252 else:
3251 mEndDecayTime1 = mEndDecayTime1[0] + mPeak - 1
3253 mEndDecayTime1 = mEndDecayTime1[0] + mPeak - 1
3252 # mPeak1 = meteorVolts0[mStart1:mEnd1 + 1].argmax()
3254 # mPeak1 = meteorVolts0[mStart1:mEnd1 + 1].argmax()
3253
3255
3254 #meteorVolts1.- all Channels, from start to end
3256 #meteorVolts1.- all Channels, from start to end
3255 meteorVolts1 = meteorVolts0[:,mStart1:mEnd1 + 1]
3257 meteorVolts1 = meteorVolts0[:,mStart1:mEnd1 + 1]
3256 meteorVolts2 = meteorVolts0[:,mPeak + lag:mEnd1 + 1]
3258 meteorVolts2 = meteorVolts0[:,mPeak + lag:mEnd1 + 1]
3257 if meteorVolts2.shape[1] == 0:
3259 if meteorVolts2.shape[1] == 0:
3258 meteorVolts2 = meteorVolts0[:,mPeak:mEnd1 + 1]
3260 meteorVolts2 = meteorVolts0[:,mPeak:mEnd1 + 1]
3259 meteorVolts1 = meteorVolts1.reshape(meteorVolts1.shape[0], meteorVolts1.shape[1], 1)
3261 meteorVolts1 = meteorVolts1.reshape(meteorVolts1.shape[0], meteorVolts1.shape[1], 1)
3260 meteorVolts2 = meteorVolts2.reshape(meteorVolts2.shape[0], meteorVolts2.shape[1], 1)
3262 meteorVolts2 = meteorVolts2.reshape(meteorVolts2.shape[0], meteorVolts2.shape[1], 1)
3261 ##################### END PARAMETERS REESTIMATION #########################
3263 ##################### END PARAMETERS REESTIMATION #########################
3262
3264
3263 ##################### 3.8 PHASE DIFFERENCE REESTIMATION ########################
3265 ##################### 3.8 PHASE DIFFERENCE REESTIMATION ########################
3264 # if mEnd1 - mStart1 > 4: #Error Number 6: echo less than 5 samples long; too short for analysis
3266 # if mEnd1 - mStart1 > 4: #Error Number 6: echo less than 5 samples long; too short for analysis
3265 if meteorVolts2.shape[1] > 0:
3267 if meteorVolts2.shape[1] > 0:
3266 #Phase Difference re-estimation
3268 #Phase Difference re-estimation
3267 phaseDiff1, phaseDiffint = self.__estimatePhaseDifference(meteorVolts2, pairslist1) #Phase Difference Estimation
3269 phaseDiff1, phaseDiffint = self.__estimatePhaseDifference(meteorVolts2, pairslist1) #Phase Difference Estimation
3268 # phaseDiff1, phaseDiffint = self.estimatePhaseDifference(meteorVolts2, pairslist)
3270 # phaseDiff1, phaseDiffint = self.estimatePhaseDifference(meteorVolts2, pairslist)
3269 meteorVolts2 = meteorVolts2.reshape(meteorVolts2.shape[0], meteorVolts2.shape[1])
3271 meteorVolts2 = meteorVolts2.reshape(meteorVolts2.shape[0], meteorVolts2.shape[1])
3270 phaseDiff11 = numpy.reshape(phaseDiff1, (phaseDiff1.shape[0],1))
3272 phaseDiff11 = numpy.reshape(phaseDiff1, (phaseDiff1.shape[0],1))
3271 meteorVolts2[indSides,:] = self.__shiftPhase(meteorVolts2[indSides,:], phaseDiff11[0:4]) #Phase Shifting
3273 meteorVolts2[indSides,:] = self.__shiftPhase(meteorVolts2[indSides,:], phaseDiff11[0:4]) #Phase Shifting
3272
3274
3273 #Phase Difference RMS
3275 #Phase Difference RMS
3274 phaseRMS1 = numpy.sqrt(numpy.mean(numpy.square(phaseDiff1)))
3276 phaseRMS1 = numpy.sqrt(numpy.mean(numpy.square(phaseDiff1)))
3275 powerNet1 = numpy.nansum(numpy.abs(meteorVolts1[:,:])**2,0)
3277 powerNet1 = numpy.nansum(numpy.abs(meteorVolts1[:,:])**2,0)
3276 #Data from Meteor
3278 #Data from Meteor
3277 mPeak1 = powerNet1.argmax() + mStart1
3279 mPeak1 = powerNet1.argmax() + mStart1
3278 mPeakPower1 = powerNet1.max()
3280 mPeakPower1 = powerNet1.max()
3279 noiseAux = sum(noise[mStart1:mEnd1 + 1,mHeight])
3281 noiseAux = sum(noise[mStart1:mEnd1 + 1,mHeight])
3280 mSNR1 = (sum(powerNet1)-noiseAux)/noiseAux
3282 mSNR1 = (sum(powerNet1)-noiseAux)/noiseAux
3281 Meteor1 = numpy.array([mHeight, mStart1, mPeak1, mEnd1, mPeakPower1, mSNR1, phaseRMS1])
3283 Meteor1 = numpy.array([mHeight, mStart1, mPeak1, mEnd1, mPeakPower1, mSNR1, phaseRMS1])
3282 Meteor1 = numpy.hstack((Meteor1,phaseDiffint))
3284 Meteor1 = numpy.hstack((Meteor1,phaseDiffint))
3283 PowerSeries = powerNet0[mStart1:mEndDecayTime1 + 1]
3285 PowerSeries = powerNet0[mStart1:mEndDecayTime1 + 1]
3284 #Vectorize
3286 #Vectorize
3285 meteorAux[0:7] = [mHeight, mStart1, mPeak1, mEnd1, mPeakPower1, mSNR1, phaseRMS1]
3287 meteorAux[0:7] = [mHeight, mStart1, mPeak1, mEnd1, mPeakPower1, mSNR1, phaseRMS1]
3286 meteorAux[7:11] = phaseDiffint[0:4]
3288 meteorAux[7:11] = phaseDiffint[0:4]
3287
3289
3288 #Rejection Criterions
3290 #Rejection Criterions
3289 if phaseRMS1 > thresholdPhase: #Error Number 17: Phase variation
3291 if phaseRMS1 > thresholdPhase: #Error Number 17: Phase variation
3290 meteorAux[-1] = 17
3292 meteorAux[-1] = 17
3291 elif mSNR1 < thresholdDB1: #Error Number 1: SNR < threshold dB
3293 elif mSNR1 < thresholdDB1: #Error Number 1: SNR < threshold dB
3292 meteorAux[-1] = 1
3294 meteorAux[-1] = 1
3293
3295
3294
3296
3295 else:
3297 else:
3296 meteorAux[0:4] = [mHeight, mStart, mPeak, mEnd]
3298 meteorAux[0:4] = [mHeight, mStart, mPeak, mEnd]
3297 meteorAux[-1] = 6 #Error Number 6: echo less than 5 samples long; too short for analysis
3299 meteorAux[-1] = 6 #Error Number 6: echo less than 5 samples long; too short for analysis
3298 PowerSeries = 0
3300 PowerSeries = 0
3299
3301
3300 listMeteors1.append(meteorAux)
3302 listMeteors1.append(meteorAux)
3301 listPowerSeries.append(PowerSeries)
3303 listPowerSeries.append(PowerSeries)
3302 listVoltageSeries.append(meteorVolts1)
3304 listVoltageSeries.append(meteorVolts1)
3303
3305
3304 return listMeteors1, listPowerSeries, listVoltageSeries
3306 return listMeteors1, listPowerSeries, listVoltageSeries
3305
3307
3306 def __estimateDecayTime(self, listMeteors, listPower, timeInterval, frequency):
3308 def __estimateDecayTime(self, listMeteors, listPower, timeInterval, frequency):
3307
3309
3308 threshError = 10
3310 threshError = 10
3309 #Depending if it is 30 or 50 MHz
3311 #Depending if it is 30 or 50 MHz
3310 if frequency == 30e6:
3312 if frequency == 30e6:
3311 timeLag = 45*10**-3
3313 timeLag = 45*10**-3
3312 else:
3314 else:
3313 timeLag = 15*10**-3
3315 timeLag = 15*10**-3
3314 lag = numpy.ceil(timeLag/timeInterval)
3316 lag = numpy.ceil(timeLag/timeInterval)
3315
3317
3316 listMeteors1 = []
3318 listMeteors1 = []
3317
3319
3318 for i in range(len(listMeteors)):
3320 for i in range(len(listMeteors)):
3319 meteorPower = listPower[i]
3321 meteorPower = listPower[i]
3320 meteorAux = listMeteors[i]
3322 meteorAux = listMeteors[i]
3321
3323
3322 if meteorAux[-1] == 0:
3324 if meteorAux[-1] == 0:
3323
3325
3324 try:
3326 try:
3325 indmax = meteorPower.argmax()
3327 indmax = meteorPower.argmax()
3326 indlag = indmax + lag
3328 indlag = indmax + lag
3327
3329
3328 y = meteorPower[indlag:]
3330 y = meteorPower[indlag:]
3329 x = numpy.arange(0, y.size)*timeLag
3331 x = numpy.arange(0, y.size)*timeLag
3330
3332
3331 #first guess
3333 #first guess
3332 a = y[0]
3334 a = y[0]
3333 tau = timeLag
3335 tau = timeLag
3334 #exponential fit
3336 #exponential fit
3335 popt, pcov = optimize.curve_fit(self.__exponential_function, x, y, p0 = [a, tau])
3337 popt, pcov = optimize.curve_fit(self.__exponential_function, x, y, p0 = [a, tau])
3336 y1 = self.__exponential_function(x, *popt)
3338 y1 = self.__exponential_function(x, *popt)
3337 #error estimation
3339 #error estimation
3338 error = sum((y - y1)**2)/(numpy.var(y)*(y.size - popt.size))
3340 error = sum((y - y1)**2)/(numpy.var(y)*(y.size - popt.size))
3339
3341
3340 decayTime = popt[1]
3342 decayTime = popt[1]
3341 riseTime = indmax*timeInterval
3343 riseTime = indmax*timeInterval
3342 meteorAux[11:13] = [decayTime, error]
3344 meteorAux[11:13] = [decayTime, error]
3343
3345
3344 #Table items 7, 8 and 11
3346 #Table items 7, 8 and 11
3345 if (riseTime > 0.3): #Number 7: Echo rise exceeds 0.3s
3347 if (riseTime > 0.3): #Number 7: Echo rise exceeds 0.3s
3346 meteorAux[-1] = 7
3348 meteorAux[-1] = 7
3347 elif (decayTime < 2*riseTime) : #Number 8: Echo decay time less than than twice rise time
3349 elif (decayTime < 2*riseTime) : #Number 8: Echo decay time less than than twice rise time
3348 meteorAux[-1] = 8
3350 meteorAux[-1] = 8
3349 if (error > threshError): #Number 11: Poor fit to amplitude for estimation of decay time
3351 if (error > threshError): #Number 11: Poor fit to amplitude for estimation of decay time
3350 meteorAux[-1] = 11
3352 meteorAux[-1] = 11
3351
3353
3352
3354
3353 except:
3355 except:
3354 meteorAux[-1] = 11
3356 meteorAux[-1] = 11
3355
3357
3356
3358
3357 listMeteors1.append(meteorAux)
3359 listMeteors1.append(meteorAux)
3358
3360
3359 return listMeteors1
3361 return listMeteors1
3360
3362
3361 #Exponential Function
3363 #Exponential Function
3362
3364
3363 def __exponential_function(self, x, a, tau):
3365 def __exponential_function(self, x, a, tau):
3364 y = a*numpy.exp(-x/tau)
3366 y = a*numpy.exp(-x/tau)
3365 return y
3367 return y
3366
3368
3367 def __getRadialVelocity(self, listMeteors, listVolts, radialStdThresh, pairslist, timeInterval):
3369 def __getRadialVelocity(self, listMeteors, listVolts, radialStdThresh, pairslist, timeInterval):
3368
3370
3369 pairslist1 = list(pairslist)
3371 pairslist1 = list(pairslist)
3370 pairslist1.append((0,1))
3372 pairslist1.append((0,1))
3371 pairslist1.append((3,4))
3373 pairslist1.append((3,4))
3372 numPairs = len(pairslist1)
3374 numPairs = len(pairslist1)
3373 #Time Lag
3375 #Time Lag
3374 timeLag = 45*10**-3
3376 timeLag = 45*10**-3
3375 c = 3e8
3377 c = 3e8
3376 lag = numpy.ceil(timeLag/timeInterval)
3378 lag = numpy.ceil(timeLag/timeInterval)
3377 freq = 30e6
3379 freq = 30e6
3378
3380
3379 listMeteors1 = []
3381 listMeteors1 = []
3380
3382
3381 for i in range(len(listMeteors)):
3383 for i in range(len(listMeteors)):
3382 meteorAux = listMeteors[i]
3384 meteorAux = listMeteors[i]
3383 if meteorAux[-1] == 0:
3385 if meteorAux[-1] == 0:
3384 mStart = listMeteors[i][1]
3386 mStart = listMeteors[i][1]
3385 mPeak = listMeteors[i][2]
3387 mPeak = listMeteors[i][2]
3386 mLag = mPeak - mStart + lag
3388 mLag = mPeak - mStart + lag
3387
3389
3388 #get the volt data between the start and end times of the meteor
3390 #get the volt data between the start and end times of the meteor
3389 meteorVolts = listVolts[i]
3391 meteorVolts = listVolts[i]
3390 meteorVolts = meteorVolts.reshape(meteorVolts.shape[0], meteorVolts.shape[1], 1)
3392 meteorVolts = meteorVolts.reshape(meteorVolts.shape[0], meteorVolts.shape[1], 1)
3391
3393
3392 #Get CCF
3394 #Get CCF
3393 allCCFs = self.__calculateCCF(meteorVolts, pairslist1, [-2,-1,0,1,2])
3395 allCCFs = self.__calculateCCF(meteorVolts, pairslist1, [-2,-1,0,1,2])
3394
3396
3395 #Method 2
3397 #Method 2
3396 slopes = numpy.zeros(numPairs)
3398 slopes = numpy.zeros(numPairs)
3397 time = numpy.array([-2,-1,1,2])*timeInterval
3399 time = numpy.array([-2,-1,1,2])*timeInterval
3398 angAllCCF = numpy.angle(allCCFs[:,[0,1,3,4],0])
3400 angAllCCF = numpy.angle(allCCFs[:,[0,1,3,4],0])
3399
3401
3400 #Correct phases
3402 #Correct phases
3401 derPhaseCCF = angAllCCF[:,1:] - angAllCCF[:,0:-1]
3403 derPhaseCCF = angAllCCF[:,1:] - angAllCCF[:,0:-1]
3402 indDer = numpy.where(numpy.abs(derPhaseCCF) > numpy.pi)
3404 indDer = numpy.where(numpy.abs(derPhaseCCF) > numpy.pi)
3403
3405
3404 if indDer[0].shape[0] > 0:
3406 if indDer[0].shape[0] > 0:
3405 for i in range(indDer[0].shape[0]):
3407 for i in range(indDer[0].shape[0]):
3406 signo = -numpy.sign(derPhaseCCF[indDer[0][i],indDer[1][i]])
3408 signo = -numpy.sign(derPhaseCCF[indDer[0][i],indDer[1][i]])
3407 angAllCCF[indDer[0][i],indDer[1][i]+1:] += signo*2*numpy.pi
3409 angAllCCF[indDer[0][i],indDer[1][i]+1:] += signo*2*numpy.pi
3408
3410
3409 # fit = scipy.stats.linregress(numpy.array([-2,-1,1,2])*timeInterval, numpy.array([phaseLagN2s[i],phaseLagN1s[i],phaseLag1s[i],phaseLag2s[i]]))
3411 # fit = scipy.stats.linregress(numpy.array([-2,-1,1,2])*timeInterval, numpy.array([phaseLagN2s[i],phaseLagN1s[i],phaseLag1s[i],phaseLag2s[i]]))
3410 for j in range(numPairs):
3412 for j in range(numPairs):
3411 fit = stats.linregress(time, angAllCCF[j,:])
3413 fit = stats.linregress(time, angAllCCF[j,:])
3412 slopes[j] = fit[0]
3414 slopes[j] = fit[0]
3413
3415
3414 #Remove Outlier
3416 #Remove Outlier
3415 # indOut = numpy.argmax(numpy.abs(slopes - numpy.mean(slopes)))
3417 # indOut = numpy.argmax(numpy.abs(slopes - numpy.mean(slopes)))
3416 # slopes = numpy.delete(slopes,indOut)
3418 # slopes = numpy.delete(slopes,indOut)
3417 # indOut = numpy.argmax(numpy.abs(slopes - numpy.mean(slopes)))
3419 # indOut = numpy.argmax(numpy.abs(slopes - numpy.mean(slopes)))
3418 # slopes = numpy.delete(slopes,indOut)
3420 # slopes = numpy.delete(slopes,indOut)
3419
3421
3420 radialVelocity = -numpy.mean(slopes)*(0.25/numpy.pi)*(c/freq)
3422 radialVelocity = -numpy.mean(slopes)*(0.25/numpy.pi)*(c/freq)
3421 radialError = numpy.std(slopes)*(0.25/numpy.pi)*(c/freq)
3423 radialError = numpy.std(slopes)*(0.25/numpy.pi)*(c/freq)
3422 meteorAux[-2] = radialError
3424 meteorAux[-2] = radialError
3423 meteorAux[-3] = radialVelocity
3425 meteorAux[-3] = radialVelocity
3424
3426
3425 #Setting Error
3427 #Setting Error
3426 #Number 15: Radial Drift velocity or projected horizontal velocity exceeds 200 m/s
3428 #Number 15: Radial Drift velocity or projected horizontal velocity exceeds 200 m/s
3427 if numpy.abs(radialVelocity) > 200:
3429 if numpy.abs(radialVelocity) > 200:
3428 meteorAux[-1] = 15
3430 meteorAux[-1] = 15
3429 #Number 12: Poor fit to CCF variation for estimation of radial drift velocity
3431 #Number 12: Poor fit to CCF variation for estimation of radial drift velocity
3430 elif radialError > radialStdThresh:
3432 elif radialError > radialStdThresh:
3431 meteorAux[-1] = 12
3433 meteorAux[-1] = 12
3432
3434
3433 listMeteors1.append(meteorAux)
3435 listMeteors1.append(meteorAux)
3434 return listMeteors1
3436 return listMeteors1
3435
3437
3436 def __setNewArrays(self, listMeteors, date, heiRang):
3438 def __setNewArrays(self, listMeteors, date, heiRang):
3437
3439
3438 #New arrays
3440 #New arrays
3439 arrayMeteors = numpy.array(listMeteors)
3441 arrayMeteors = numpy.array(listMeteors)
3440 arrayParameters = numpy.zeros((len(listMeteors), 13))
3442 arrayParameters = numpy.zeros((len(listMeteors), 13))
3441
3443
3442 #Date inclusion
3444 #Date inclusion
3443 # date = re.findall(r'\((.*?)\)', date)
3445 # date = re.findall(r'\((.*?)\)', date)
3444 # date = date[0].split(',')
3446 # date = date[0].split(',')
3445 # date = map(int, date)
3447 # date = map(int, date)
3446 #
3448 #
3447 # if len(date)<6:
3449 # if len(date)<6:
3448 # date.append(0)
3450 # date.append(0)
3449 #
3451 #
3450 # date = [date[0]*10000 + date[1]*100 + date[2], date[3]*10000 + date[4]*100 + date[5]]
3452 # date = [date[0]*10000 + date[1]*100 + date[2], date[3]*10000 + date[4]*100 + date[5]]
3451 # arrayDate = numpy.tile(date, (len(listMeteors), 1))
3453 # arrayDate = numpy.tile(date, (len(listMeteors), 1))
3452 arrayDate = numpy.tile(date, (len(listMeteors)))
3454 arrayDate = numpy.tile(date, (len(listMeteors)))
3453
3455
3454 #Meteor array
3456 #Meteor array
3455 # arrayMeteors[:,0] = heiRang[arrayMeteors[:,0].astype(int)]
3457 # arrayMeteors[:,0] = heiRang[arrayMeteors[:,0].astype(int)]
3456 # arrayMeteors = numpy.hstack((arrayDate, arrayMeteors))
3458 # arrayMeteors = numpy.hstack((arrayDate, arrayMeteors))
3457
3459
3458 #Parameters Array
3460 #Parameters Array
3459 arrayParameters[:,0] = arrayDate #Date
3461 arrayParameters[:,0] = arrayDate #Date
3460 arrayParameters[:,1] = heiRang[arrayMeteors[:,0].astype(int)] #Range
3462 arrayParameters[:,1] = heiRang[arrayMeteors[:,0].astype(int)] #Range
3461 arrayParameters[:,6:8] = arrayMeteors[:,-3:-1] #Radial velocity and its error
3463 arrayParameters[:,6:8] = arrayMeteors[:,-3:-1] #Radial velocity and its error
3462 arrayParameters[:,8:12] = arrayMeteors[:,7:11] #Phases
3464 arrayParameters[:,8:12] = arrayMeteors[:,7:11] #Phases
3463 arrayParameters[:,-1] = arrayMeteors[:,-1] #Error
3465 arrayParameters[:,-1] = arrayMeteors[:,-1] #Error
3464
3466
3465
3467
3466 return arrayParameters
3468 return arrayParameters
3467
3469
3468 class CorrectSMPhases(Operation):
3470 class CorrectSMPhases(Operation):
3469
3471
3470 def run(self, dataOut, phaseOffsets, hmin = 50, hmax = 150, azimuth = 45, channelPositions = None):
3472 def run(self, dataOut, phaseOffsets, hmin = 50, hmax = 150, azimuth = 45, channelPositions = None):
3471
3473
3472 arrayParameters = dataOut.data_param
3474 arrayParameters = dataOut.data_param
3473 pairsList = []
3475 pairsList = []
3474 pairx = (0,1)
3476 pairx = (0,1)
3475 pairy = (2,3)
3477 pairy = (2,3)
3476 pairsList.append(pairx)
3478 pairsList.append(pairx)
3477 pairsList.append(pairy)
3479 pairsList.append(pairy)
3478 jph = numpy.zeros(4)
3480 jph = numpy.zeros(4)
3479
3481
3480 phaseOffsets = numpy.array(phaseOffsets)*numpy.pi/180
3482 phaseOffsets = numpy.array(phaseOffsets)*numpy.pi/180
3481 # arrayParameters[:,8:12] = numpy.unwrap(arrayParameters[:,8:12] + phaseOffsets)
3483 # arrayParameters[:,8:12] = numpy.unwrap(arrayParameters[:,8:12] + phaseOffsets)
3482 arrayParameters[:,8:12] = numpy.angle(numpy.exp(1j*(arrayParameters[:,8:12] + phaseOffsets)))
3484 arrayParameters[:,8:12] = numpy.angle(numpy.exp(1j*(arrayParameters[:,8:12] + phaseOffsets)))
3483
3485
3484 meteorOps = SMOperations()
3486 meteorOps = SMOperations()
3485 if channelPositions == None:
3487 if channelPositions == None:
3486 # channelPositions = [(2.5,0), (0,2.5), (0,0), (0,4.5), (-2,0)] #T
3488 # channelPositions = [(2.5,0), (0,2.5), (0,0), (0,4.5), (-2,0)] #T
3487 channelPositions = [(4.5,2), (2,4.5), (2,2), (2,0), (0,2)] #Estrella
3489 channelPositions = [(4.5,2), (2,4.5), (2,2), (2,0), (0,2)] #Estrella
3488
3490
3489 pairslist0, distances = meteorOps.getPhasePairs(channelPositions)
3491 pairslist0, distances = meteorOps.getPhasePairs(channelPositions)
3490 h = (hmin,hmax)
3492 h = (hmin,hmax)
3491
3493
3492 arrayParameters = meteorOps.getMeteorParams(arrayParameters, azimuth, h, pairsList, distances, jph)
3494 arrayParameters = meteorOps.getMeteorParams(arrayParameters, azimuth, h, pairsList, distances, jph)
3493
3495
3494 dataOut.data_param = arrayParameters
3496 dataOut.data_param = arrayParameters
3495 return
3497 return
3496
3498
3497 class SMPhaseCalibration(Operation):
3499 class SMPhaseCalibration(Operation):
3498
3500
3499 __buffer = None
3501 __buffer = None
3500
3502
3501 __initime = None
3503 __initime = None
3502
3504
3503 __dataReady = False
3505 __dataReady = False
3504
3506
3505 __isConfig = False
3507 __isConfig = False
3506
3508
3507 def __checkTime(self, currentTime, initTime, paramInterval, outputInterval):
3509 def __checkTime(self, currentTime, initTime, paramInterval, outputInterval):
3508
3510
3509 dataTime = currentTime + paramInterval
3511 dataTime = currentTime + paramInterval
3510 deltaTime = dataTime - initTime
3512 deltaTime = dataTime - initTime
3511
3513
3512 if deltaTime >= outputInterval or deltaTime < 0:
3514 if deltaTime >= outputInterval or deltaTime < 0:
3513 return True
3515 return True
3514
3516
3515 return False
3517 return False
3516
3518
3517 def __getGammas(self, pairs, d, phases):
3519 def __getGammas(self, pairs, d, phases):
3518 gammas = numpy.zeros(2)
3520 gammas = numpy.zeros(2)
3519
3521
3520 for i in range(len(pairs)):
3522 for i in range(len(pairs)):
3521
3523
3522 pairi = pairs[i]
3524 pairi = pairs[i]
3523
3525
3524 phip3 = phases[:,pairi[1]]
3526 phip3 = phases[:,pairi[1]]
3525 d3 = d[pairi[1]]
3527 d3 = d[pairi[1]]
3526 phip2 = phases[:,pairi[0]]
3528 phip2 = phases[:,pairi[0]]
3527 d2 = d[pairi[0]]
3529 d2 = d[pairi[0]]
3528 #Calculating gamma
3530 #Calculating gamma
3529 # jdcos = alp1/(k*d1)
3531 # jdcos = alp1/(k*d1)
3530 # jgamma = numpy.angle(numpy.exp(1j*(d0*alp1/d1 - alp0)))
3532 # jgamma = numpy.angle(numpy.exp(1j*(d0*alp1/d1 - alp0)))
3531 jgamma = -phip2*d3/d2 - phip3
3533 jgamma = -phip2*d3/d2 - phip3
3532 jgamma = numpy.angle(numpy.exp(1j*jgamma))
3534 jgamma = numpy.angle(numpy.exp(1j*jgamma))
3533 # jgamma[jgamma>numpy.pi] -= 2*numpy.pi
3535 # jgamma[jgamma>numpy.pi] -= 2*numpy.pi
3534 # jgamma[jgamma<-numpy.pi] += 2*numpy.pi
3536 # jgamma[jgamma<-numpy.pi] += 2*numpy.pi
3535
3537
3536 #Revised distribution
3538 #Revised distribution
3537 jgammaArray = numpy.hstack((jgamma,jgamma+0.5*numpy.pi,jgamma-0.5*numpy.pi))
3539 jgammaArray = numpy.hstack((jgamma,jgamma+0.5*numpy.pi,jgamma-0.5*numpy.pi))
3538
3540
3539 #Histogram
3541 #Histogram
3540 nBins = 64.0
3542 nBins = 64.0
3541 rmin = -0.5*numpy.pi
3543 rmin = -0.5*numpy.pi
3542 rmax = 0.5*numpy.pi
3544 rmax = 0.5*numpy.pi
3543 phaseHisto = numpy.histogram(jgammaArray, bins=nBins, range=(rmin,rmax))
3545 phaseHisto = numpy.histogram(jgammaArray, bins=nBins, range=(rmin,rmax))
3544
3546
3545 meteorsY = phaseHisto[0]
3547 meteorsY = phaseHisto[0]
3546 phasesX = phaseHisto[1][:-1]
3548 phasesX = phaseHisto[1][:-1]
3547 width = phasesX[1] - phasesX[0]
3549 width = phasesX[1] - phasesX[0]
3548 phasesX += width/2
3550 phasesX += width/2
3549
3551
3550 #Gaussian aproximation
3552 #Gaussian aproximation
3551 bpeak = meteorsY.argmax()
3553 bpeak = meteorsY.argmax()
3552 peak = meteorsY.max()
3554 peak = meteorsY.max()
3553 jmin = bpeak - 5
3555 jmin = bpeak - 5
3554 jmax = bpeak + 5 + 1
3556 jmax = bpeak + 5 + 1
3555
3557
3556 if jmin<0:
3558 if jmin<0:
3557 jmin = 0
3559 jmin = 0
3558 jmax = 6
3560 jmax = 6
3559 elif jmax > meteorsY.size:
3561 elif jmax > meteorsY.size:
3560 jmin = meteorsY.size - 6
3562 jmin = meteorsY.size - 6
3561 jmax = meteorsY.size
3563 jmax = meteorsY.size
3562
3564
3563 x0 = numpy.array([peak,bpeak,50])
3565 x0 = numpy.array([peak,bpeak,50])
3564 coeff = optimize.leastsq(self.__residualFunction, x0, args=(meteorsY[jmin:jmax], phasesX[jmin:jmax]))
3566 coeff = optimize.leastsq(self.__residualFunction, x0, args=(meteorsY[jmin:jmax], phasesX[jmin:jmax]))
3565
3567
3566 #Gammas
3568 #Gammas
3567 gammas[i] = coeff[0][1]
3569 gammas[i] = coeff[0][1]
3568
3570
3569 return gammas
3571 return gammas
3570
3572
3571 def __residualFunction(self, coeffs, y, t):
3573 def __residualFunction(self, coeffs, y, t):
3572
3574
3573 return y - self.__gauss_function(t, coeffs)
3575 return y - self.__gauss_function(t, coeffs)
3574
3576
3575 def __gauss_function(self, t, coeffs):
3577 def __gauss_function(self, t, coeffs):
3576
3578
3577 return coeffs[0]*numpy.exp(-0.5*((t - coeffs[1]) / coeffs[2])**2)
3579 return coeffs[0]*numpy.exp(-0.5*((t - coeffs[1]) / coeffs[2])**2)
3578
3580
3579 def __getPhases(self, azimuth, h, pairsList, d, gammas, meteorsArray):
3581 def __getPhases(self, azimuth, h, pairsList, d, gammas, meteorsArray):
3580 meteorOps = SMOperations()
3582 meteorOps = SMOperations()
3581 nchan = 4
3583 nchan = 4
3582 pairx = pairsList[0]
3584 pairx = pairsList[0]
3583 pairy = pairsList[1]
3585 pairy = pairsList[1]
3584 center_xangle = 0
3586 center_xangle = 0
3585 center_yangle = 0
3587 center_yangle = 0
3586 range_angle = numpy.array([10*numpy.pi,numpy.pi,numpy.pi/2,numpy.pi/4])
3588 range_angle = numpy.array([10*numpy.pi,numpy.pi,numpy.pi/2,numpy.pi/4])
3587 ntimes = len(range_angle)
3589 ntimes = len(range_angle)
3588
3590
3589 nstepsx = 20.0
3591 nstepsx = 20.0
3590 nstepsy = 20.0
3592 nstepsy = 20.0
3591
3593
3592 for iz in range(ntimes):
3594 for iz in range(ntimes):
3593 min_xangle = -range_angle[iz]/2 + center_xangle
3595 min_xangle = -range_angle[iz]/2 + center_xangle
3594 max_xangle = range_angle[iz]/2 + center_xangle
3596 max_xangle = range_angle[iz]/2 + center_xangle
3595 min_yangle = -range_angle[iz]/2 + center_yangle
3597 min_yangle = -range_angle[iz]/2 + center_yangle
3596 max_yangle = range_angle[iz]/2 + center_yangle
3598 max_yangle = range_angle[iz]/2 + center_yangle
3597
3599
3598 inc_x = (max_xangle-min_xangle)/nstepsx
3600 inc_x = (max_xangle-min_xangle)/nstepsx
3599 inc_y = (max_yangle-min_yangle)/nstepsy
3601 inc_y = (max_yangle-min_yangle)/nstepsy
3600
3602
3601 alpha_y = numpy.arange(nstepsy)*inc_y + min_yangle
3603 alpha_y = numpy.arange(nstepsy)*inc_y + min_yangle
3602 alpha_x = numpy.arange(nstepsx)*inc_x + min_xangle
3604 alpha_x = numpy.arange(nstepsx)*inc_x + min_xangle
3603 penalty = numpy.zeros((nstepsx,nstepsy))
3605 penalty = numpy.zeros((nstepsx,nstepsy))
3604 jph_array = numpy.zeros((nchan,nstepsx,nstepsy))
3606 jph_array = numpy.zeros((nchan,nstepsx,nstepsy))
3605 jph = numpy.zeros(nchan)
3607 jph = numpy.zeros(nchan)
3606
3608
3607 # Iterations looking for the offset
3609 # Iterations looking for the offset
3608 for iy in range(int(nstepsy)):
3610 for iy in range(int(nstepsy)):
3609 for ix in range(int(nstepsx)):
3611 for ix in range(int(nstepsx)):
3610 jph[pairy[1]] = alpha_y[iy]
3612 jph[pairy[1]] = alpha_y[iy]
3611 jph[pairy[0]] = -gammas[1] - alpha_y[iy]*d[pairy[1]]/d[pairy[0]]
3613 jph[pairy[0]] = -gammas[1] - alpha_y[iy]*d[pairy[1]]/d[pairy[0]]
3612
3614
3613 jph[pairx[1]] = alpha_x[ix]
3615 jph[pairx[1]] = alpha_x[ix]
3614 jph[pairx[0]] = -gammas[0] - alpha_x[ix]*d[pairx[1]]/d[pairx[0]]
3616 jph[pairx[0]] = -gammas[0] - alpha_x[ix]*d[pairx[1]]/d[pairx[0]]
3615
3617
3616 jph_array[:,ix,iy] = jph
3618 jph_array[:,ix,iy] = jph
3617
3619
3618 meteorsArray1 = meteorOps.getMeteorParams(meteorsArray, azimuth, h, pairsList, d, jph)
3620 meteorsArray1 = meteorOps.getMeteorParams(meteorsArray, azimuth, h, pairsList, d, jph)
3619 error = meteorsArray1[:,-1]
3621 error = meteorsArray1[:,-1]
3620 ind1 = numpy.where(error==0)[0]
3622 ind1 = numpy.where(error==0)[0]
3621 penalty[ix,iy] = ind1.size
3623 penalty[ix,iy] = ind1.size
3622
3624
3623 i,j = numpy.unravel_index(penalty.argmax(), penalty.shape)
3625 i,j = numpy.unravel_index(penalty.argmax(), penalty.shape)
3624 phOffset = jph_array[:,i,j]
3626 phOffset = jph_array[:,i,j]
3625
3627
3626 center_xangle = phOffset[pairx[1]]
3628 center_xangle = phOffset[pairx[1]]
3627 center_yangle = phOffset[pairy[1]]
3629 center_yangle = phOffset[pairy[1]]
3628
3630
3629 phOffset = numpy.angle(numpy.exp(1j*jph_array[:,i,j]))
3631 phOffset = numpy.angle(numpy.exp(1j*jph_array[:,i,j]))
3630 phOffset = phOffset*180/numpy.pi
3632 phOffset = phOffset*180/numpy.pi
3631 return phOffset
3633 return phOffset
3632
3634
3633
3635
3634 def run(self, dataOut, hmin, hmax, channelPositions=None, nHours = 1):
3636 def run(self, dataOut, hmin, hmax, channelPositions=None, nHours = 1):
3635
3637
3636 dataOut.flagNoData = True
3638 dataOut.flagNoData = True
3637 self.__dataReady = False
3639 self.__dataReady = False
3638 dataOut.outputInterval = nHours*3600
3640 dataOut.outputInterval = nHours*3600
3639
3641
3640 if self.__isConfig == False:
3642 if self.__isConfig == False:
3641 # self.__initime = dataOut.datatime.replace(minute = 0, second = 0, microsecond = 03)
3643 # self.__initime = dataOut.datatime.replace(minute = 0, second = 0, microsecond = 03)
3642 #Get Initial LTC time
3644 #Get Initial LTC time
3643 self.__initime = datetime.datetime.utcfromtimestamp(dataOut.utctime)
3645 self.__initime = datetime.datetime.utcfromtimestamp(dataOut.utctime)
3644 self.__initime = (self.__initime.replace(minute = 0, second = 0, microsecond = 0) - datetime.datetime(1970, 1, 1)).total_seconds()
3646 self.__initime = (self.__initime.replace(minute = 0, second = 0, microsecond = 0) - datetime.datetime(1970, 1, 1)).total_seconds()
3645
3647
3646 self.__isConfig = True
3648 self.__isConfig = True
3647
3649
3648 if self.__buffer == None:
3650 if self.__buffer == None:
3649 self.__buffer = dataOut.data_param.copy()
3651 self.__buffer = dataOut.data_param.copy()
3650
3652
3651 else:
3653 else:
3652 self.__buffer = numpy.vstack((self.__buffer, dataOut.data_param))
3654 self.__buffer = numpy.vstack((self.__buffer, dataOut.data_param))
3653
3655
3654 self.__dataReady = self.__checkTime(dataOut.utctime, self.__initime, dataOut.paramInterval, dataOut.outputInterval) #Check if the buffer is ready
3656 self.__dataReady = self.__checkTime(dataOut.utctime, self.__initime, dataOut.paramInterval, dataOut.outputInterval) #Check if the buffer is ready
3655
3657
3656 if self.__dataReady:
3658 if self.__dataReady:
3657 dataOut.utctimeInit = self.__initime
3659 dataOut.utctimeInit = self.__initime
3658 self.__initime += dataOut.outputInterval #to erase time offset
3660 self.__initime += dataOut.outputInterval #to erase time offset
3659
3661
3660 freq = dataOut.frequency
3662 freq = dataOut.frequency
3661 c = dataOut.C #m/s
3663 c = dataOut.C #m/s
3662 lamb = c/freq
3664 lamb = c/freq
3663 k = 2*numpy.pi/lamb
3665 k = 2*numpy.pi/lamb
3664 azimuth = 0
3666 azimuth = 0
3665 h = (hmin, hmax)
3667 h = (hmin, hmax)
3666 pairs = ((0,1),(2,3))
3668 pairs = ((0,1),(2,3))
3667
3669
3668 if channelPositions == None:
3670 if channelPositions == None:
3669 # channelPositions = [(2.5,0), (0,2.5), (0,0), (0,4.5), (-2,0)] #T
3671 # channelPositions = [(2.5,0), (0,2.5), (0,0), (0,4.5), (-2,0)] #T
3670 channelPositions = [(4.5,2), (2,4.5), (2,2), (2,0), (0,2)] #Estrella
3672 channelPositions = [(4.5,2), (2,4.5), (2,2), (2,0), (0,2)] #Estrella
3671 meteorOps = SMOperations()
3673 meteorOps = SMOperations()
3672 pairslist0, distances = meteorOps.getPhasePairs(channelPositions)
3674 pairslist0, distances = meteorOps.getPhasePairs(channelPositions)
3673
3675
3674 # distances1 = [-distances[0]*lamb, distances[1]*lamb, -distances[2]*lamb, distances[3]*lamb]
3676 # distances1 = [-distances[0]*lamb, distances[1]*lamb, -distances[2]*lamb, distances[3]*lamb]
3675
3677
3676 meteorsArray = self.__buffer
3678 meteorsArray = self.__buffer
3677 error = meteorsArray[:,-1]
3679 error = meteorsArray[:,-1]
3678 boolError = (error==0)|(error==3)|(error==4)|(error==13)|(error==14)
3680 boolError = (error==0)|(error==3)|(error==4)|(error==13)|(error==14)
3679 ind1 = numpy.where(boolError)[0]
3681 ind1 = numpy.where(boolError)[0]
3680 meteorsArray = meteorsArray[ind1,:]
3682 meteorsArray = meteorsArray[ind1,:]
3681 meteorsArray[:,-1] = 0
3683 meteorsArray[:,-1] = 0
3682 phases = meteorsArray[:,8:12]
3684 phases = meteorsArray[:,8:12]
3683
3685
3684 #Calculate Gammas
3686 #Calculate Gammas
3685 gammas = self.__getGammas(pairs, distances, phases)
3687 gammas = self.__getGammas(pairs, distances, phases)
3686 # gammas = numpy.array([-21.70409463,45.76935864])*numpy.pi/180
3688 # gammas = numpy.array([-21.70409463,45.76935864])*numpy.pi/180
3687 #Calculate Phases
3689 #Calculate Phases
3688 phasesOff = self.__getPhases(azimuth, h, pairs, distances, gammas, meteorsArray)
3690 phasesOff = self.__getPhases(azimuth, h, pairs, distances, gammas, meteorsArray)
3689 phasesOff = phasesOff.reshape((1,phasesOff.size))
3691 phasesOff = phasesOff.reshape((1,phasesOff.size))
3690 dataOut.data_output = -phasesOff
3692 dataOut.data_output = -phasesOff
3691 dataOut.flagNoData = False
3693 dataOut.flagNoData = False
3692 self.__buffer = None
3694 self.__buffer = None
3693
3695
3694
3696
3695 return
3697 return
3696
3698
3697 class SMOperations():
3699 class SMOperations():
3698
3700
3699 def __init__(self):
3701 def __init__(self):
3700
3702
3701 return
3703 return
3702
3704
3703 def getMeteorParams(self, arrayParameters0, azimuth, h, pairsList, distances, jph):
3705 def getMeteorParams(self, arrayParameters0, azimuth, h, pairsList, distances, jph):
3704
3706
3705 arrayParameters = arrayParameters0.copy()
3707 arrayParameters = arrayParameters0.copy()
3706 hmin = h[0]
3708 hmin = h[0]
3707 hmax = h[1]
3709 hmax = h[1]
3708
3710
3709 #Calculate AOA (Error N 3, 4)
3711 #Calculate AOA (Error N 3, 4)
3710 #JONES ET AL. 1998
3712 #JONES ET AL. 1998
3711 AOAthresh = numpy.pi/8
3713 AOAthresh = numpy.pi/8
3712 error = arrayParameters[:,-1]
3714 error = arrayParameters[:,-1]
3713 phases = -arrayParameters[:,8:12] + jph
3715 phases = -arrayParameters[:,8:12] + jph
3714 # phases = numpy.unwrap(phases)
3716 # phases = numpy.unwrap(phases)
3715 arrayParameters[:,3:6], arrayParameters[:,-1] = self.__getAOA(phases, pairsList, distances, error, AOAthresh, azimuth)
3717 arrayParameters[:,3:6], arrayParameters[:,-1] = self.__getAOA(phases, pairsList, distances, error, AOAthresh, azimuth)
3716
3718
3717 #Calculate Heights (Error N 13 and 14)
3719 #Calculate Heights (Error N 13 and 14)
3718 error = arrayParameters[:,-1]
3720 error = arrayParameters[:,-1]
3719 Ranges = arrayParameters[:,1]
3721 Ranges = arrayParameters[:,1]
3720 zenith = arrayParameters[:,4]
3722 zenith = arrayParameters[:,4]
3721 arrayParameters[:,2], arrayParameters[:,-1] = self.__getHeights(Ranges, zenith, error, hmin, hmax)
3723 arrayParameters[:,2], arrayParameters[:,-1] = self.__getHeights(Ranges, zenith, error, hmin, hmax)
3722
3724
3723 #----------------------- Get Final data ------------------------------------
3725 #----------------------- Get Final data ------------------------------------
3724 # error = arrayParameters[:,-1]
3726 # error = arrayParameters[:,-1]
3725 # ind1 = numpy.where(error==0)[0]
3727 # ind1 = numpy.where(error==0)[0]
3726 # arrayParameters = arrayParameters[ind1,:]
3728 # arrayParameters = arrayParameters[ind1,:]
3727
3729
3728 return arrayParameters
3730 return arrayParameters
3729
3731
3730 def __getAOA(self, phases, pairsList, directions, error, AOAthresh, azimuth):
3732 def __getAOA(self, phases, pairsList, directions, error, AOAthresh, azimuth):
3731
3733
3732 arrayAOA = numpy.zeros((phases.shape[0],3))
3734 arrayAOA = numpy.zeros((phases.shape[0],3))
3733 cosdir0, cosdir = self.__getDirectionCosines(phases, pairsList,directions)
3735 cosdir0, cosdir = self.__getDirectionCosines(phases, pairsList,directions)
3734
3736
3735 arrayAOA[:,:2] = self.__calculateAOA(cosdir, azimuth)
3737 arrayAOA[:,:2] = self.__calculateAOA(cosdir, azimuth)
3736 cosDirError = numpy.sum(numpy.abs(cosdir0 - cosdir), axis = 1)
3738 cosDirError = numpy.sum(numpy.abs(cosdir0 - cosdir), axis = 1)
3737 arrayAOA[:,2] = cosDirError
3739 arrayAOA[:,2] = cosDirError
3738
3740
3739 azimuthAngle = arrayAOA[:,0]
3741 azimuthAngle = arrayAOA[:,0]
3740 zenithAngle = arrayAOA[:,1]
3742 zenithAngle = arrayAOA[:,1]
3741
3743
3742 #Setting Error
3744 #Setting Error
3743 indError = numpy.where(numpy.logical_or(error == 3, error == 4))[0]
3745 indError = numpy.where(numpy.logical_or(error == 3, error == 4))[0]
3744 error[indError] = 0
3746 error[indError] = 0
3745 #Number 3: AOA not fesible
3747 #Number 3: AOA not fesible
3746 indInvalid = numpy.where(numpy.logical_and((numpy.logical_or(numpy.isnan(zenithAngle), numpy.isnan(azimuthAngle))),error == 0))[0]
3748 indInvalid = numpy.where(numpy.logical_and((numpy.logical_or(numpy.isnan(zenithAngle), numpy.isnan(azimuthAngle))),error == 0))[0]
3747 error[indInvalid] = 3
3749 error[indInvalid] = 3
3748 #Number 4: Large difference in AOAs obtained from different antenna baselines
3750 #Number 4: Large difference in AOAs obtained from different antenna baselines
3749 indInvalid = numpy.where(numpy.logical_and(cosDirError > AOAthresh,error == 0))[0]
3751 indInvalid = numpy.where(numpy.logical_and(cosDirError > AOAthresh,error == 0))[0]
3750 error[indInvalid] = 4
3752 error[indInvalid] = 4
3751 return arrayAOA, error
3753 return arrayAOA, error
3752
3754
3753 def __getDirectionCosines(self, arrayPhase, pairsList, distances):
3755 def __getDirectionCosines(self, arrayPhase, pairsList, distances):
3754
3756
3755 #Initializing some variables
3757 #Initializing some variables
3756 ang_aux = numpy.array([-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8])*2*numpy.pi
3758 ang_aux = numpy.array([-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8])*2*numpy.pi
3757 ang_aux = ang_aux.reshape(1,ang_aux.size)
3759 ang_aux = ang_aux.reshape(1,ang_aux.size)
3758
3760
3759 cosdir = numpy.zeros((arrayPhase.shape[0],2))
3761 cosdir = numpy.zeros((arrayPhase.shape[0],2))
3760 cosdir0 = numpy.zeros((arrayPhase.shape[0],2))
3762 cosdir0 = numpy.zeros((arrayPhase.shape[0],2))
3761
3763
3762
3764
3763 for i in range(2):
3765 for i in range(2):
3764 ph0 = arrayPhase[:,pairsList[i][0]]
3766 ph0 = arrayPhase[:,pairsList[i][0]]
3765 ph1 = arrayPhase[:,pairsList[i][1]]
3767 ph1 = arrayPhase[:,pairsList[i][1]]
3766 d0 = distances[pairsList[i][0]]
3768 d0 = distances[pairsList[i][0]]
3767 d1 = distances[pairsList[i][1]]
3769 d1 = distances[pairsList[i][1]]
3768
3770
3769 ph0_aux = ph0 + ph1
3771 ph0_aux = ph0 + ph1
3770 ph0_aux = numpy.angle(numpy.exp(1j*ph0_aux))
3772 ph0_aux = numpy.angle(numpy.exp(1j*ph0_aux))
3771 # ph0_aux[ph0_aux > numpy.pi] -= 2*numpy.pi
3773 # ph0_aux[ph0_aux > numpy.pi] -= 2*numpy.pi
3772 # ph0_aux[ph0_aux < -numpy.pi] += 2*numpy.pi
3774 # ph0_aux[ph0_aux < -numpy.pi] += 2*numpy.pi
3773 #First Estimation
3775 #First Estimation
3774 cosdir0[:,i] = (ph0_aux)/(2*numpy.pi*(d0 - d1))
3776 cosdir0[:,i] = (ph0_aux)/(2*numpy.pi*(d0 - d1))
3775
3777
3776 #Most-Accurate Second Estimation
3778 #Most-Accurate Second Estimation
3777 phi1_aux = ph0 - ph1
3779 phi1_aux = ph0 - ph1
3778 phi1_aux = phi1_aux.reshape(phi1_aux.size,1)
3780 phi1_aux = phi1_aux.reshape(phi1_aux.size,1)
3779 #Direction Cosine 1
3781 #Direction Cosine 1
3780 cosdir1 = (phi1_aux + ang_aux)/(2*numpy.pi*(d0 + d1))
3782 cosdir1 = (phi1_aux + ang_aux)/(2*numpy.pi*(d0 + d1))
3781
3783
3782 #Searching the correct Direction Cosine
3784 #Searching the correct Direction Cosine
3783 cosdir0_aux = cosdir0[:,i]
3785 cosdir0_aux = cosdir0[:,i]
3784 cosdir0_aux = cosdir0_aux.reshape(cosdir0_aux.size,1)
3786 cosdir0_aux = cosdir0_aux.reshape(cosdir0_aux.size,1)
3785 #Minimum Distance
3787 #Minimum Distance
3786 cosDiff = (cosdir1 - cosdir0_aux)**2
3788 cosDiff = (cosdir1 - cosdir0_aux)**2
3787 indcos = cosDiff.argmin(axis = 1)
3789 indcos = cosDiff.argmin(axis = 1)
3788 #Saving Value obtained
3790 #Saving Value obtained
3789 cosdir[:,i] = cosdir1[numpy.arange(len(indcos)),indcos]
3791 cosdir[:,i] = cosdir1[numpy.arange(len(indcos)),indcos]
3790
3792
3791 return cosdir0, cosdir
3793 return cosdir0, cosdir
3792
3794
3793 def __calculateAOA(self, cosdir, azimuth):
3795 def __calculateAOA(self, cosdir, azimuth):
3794 cosdirX = cosdir[:,0]
3796 cosdirX = cosdir[:,0]
3795 cosdirY = cosdir[:,1]
3797 cosdirY = cosdir[:,1]
3796
3798
3797 zenithAngle = numpy.arccos(numpy.sqrt(1 - cosdirX**2 - cosdirY**2))*180/numpy.pi
3799 zenithAngle = numpy.arccos(numpy.sqrt(1 - cosdirX**2 - cosdirY**2))*180/numpy.pi
3798 azimuthAngle = numpy.arctan2(cosdirX,cosdirY)*180/numpy.pi + azimuth#0 deg north, 90 deg east
3800 azimuthAngle = numpy.arctan2(cosdirX,cosdirY)*180/numpy.pi + azimuth#0 deg north, 90 deg east
3799 angles = numpy.vstack((azimuthAngle, zenithAngle)).transpose()
3801 angles = numpy.vstack((azimuthAngle, zenithAngle)).transpose()
3800
3802
3801 return angles
3803 return angles
3802
3804
3803 def __getHeights(self, Ranges, zenith, error, minHeight, maxHeight):
3805 def __getHeights(self, Ranges, zenith, error, minHeight, maxHeight):
3804
3806
3805 Ramb = 375 #Ramb = c/(2*PRF)
3807 Ramb = 375 #Ramb = c/(2*PRF)
3806 Re = 6371 #Earth Radius
3808 Re = 6371 #Earth Radius
3807 heights = numpy.zeros(Ranges.shape)
3809 heights = numpy.zeros(Ranges.shape)
3808
3810
3809 R_aux = numpy.array([0,1,2])*Ramb
3811 R_aux = numpy.array([0,1,2])*Ramb
3810 R_aux = R_aux.reshape(1,R_aux.size)
3812 R_aux = R_aux.reshape(1,R_aux.size)
3811
3813
3812 Ranges = Ranges.reshape(Ranges.size,1)
3814 Ranges = Ranges.reshape(Ranges.size,1)
3813
3815
3814 Ri = Ranges + R_aux
3816 Ri = Ranges + R_aux
3815 hi = numpy.sqrt(Re**2 + Ri**2 + (2*Re*numpy.cos(zenith*numpy.pi/180)*Ri.transpose()).transpose()) - Re
3817 hi = numpy.sqrt(Re**2 + Ri**2 + (2*Re*numpy.cos(zenith*numpy.pi/180)*Ri.transpose()).transpose()) - Re
3816
3818
3817 #Check if there is a height between 70 and 110 km
3819 #Check if there is a height between 70 and 110 km
3818 h_bool = numpy.sum(numpy.logical_and(hi > minHeight, hi < maxHeight), axis = 1)
3820 h_bool = numpy.sum(numpy.logical_and(hi > minHeight, hi < maxHeight), axis = 1)
3819 ind_h = numpy.where(h_bool == 1)[0]
3821 ind_h = numpy.where(h_bool == 1)[0]
3820
3822
3821 hCorr = hi[ind_h, :]
3823 hCorr = hi[ind_h, :]
3822 ind_hCorr = numpy.where(numpy.logical_and(hi > minHeight, hi < maxHeight))
3824 ind_hCorr = numpy.where(numpy.logical_and(hi > minHeight, hi < maxHeight))
3823
3825
3824 hCorr = hi[ind_hCorr]
3826 hCorr = hi[ind_hCorr]
3825 heights[ind_h] = hCorr
3827 heights[ind_h] = hCorr
3826
3828
3827 #Setting Error
3829 #Setting Error
3828 #Number 13: Height unresolvable echo: not valid height within 70 to 110 km
3830 #Number 13: Height unresolvable echo: not valid height within 70 to 110 km
3829 #Number 14: Height ambiguous echo: more than one possible height within 70 to 110 km
3831 #Number 14: Height ambiguous echo: more than one possible height within 70 to 110 km
3830 indError = numpy.where(numpy.logical_or(error == 13, error == 14))[0]
3832 indError = numpy.where(numpy.logical_or(error == 13, error == 14))[0]
3831 error[indError] = 0
3833 error[indError] = 0
3832 indInvalid2 = numpy.where(numpy.logical_and(h_bool > 1, error == 0))[0]
3834 indInvalid2 = numpy.where(numpy.logical_and(h_bool > 1, error == 0))[0]
3833 error[indInvalid2] = 14
3835 error[indInvalid2] = 14
3834 indInvalid1 = numpy.where(numpy.logical_and(h_bool == 0, error == 0))[0]
3836 indInvalid1 = numpy.where(numpy.logical_and(h_bool == 0, error == 0))[0]
3835 error[indInvalid1] = 13
3837 error[indInvalid1] = 13
3836
3838
3837 return heights, error
3839 return heights, error
3838
3840
3839 def getPhasePairs(self, channelPositions):
3841 def getPhasePairs(self, channelPositions):
3840 chanPos = numpy.array(channelPositions)
3842 chanPos = numpy.array(channelPositions)
3841 listOper = list(itertools.combinations(range(5),2))
3843 listOper = list(itertools.combinations(range(5),2))
3842
3844
3843 distances = numpy.zeros(4)
3845 distances = numpy.zeros(4)
3844 axisX = []
3846 axisX = []
3845 axisY = []
3847 axisY = []
3846 distX = numpy.zeros(3)
3848 distX = numpy.zeros(3)
3847 distY = numpy.zeros(3)
3849 distY = numpy.zeros(3)
3848 ix = 0
3850 ix = 0
3849 iy = 0
3851 iy = 0
3850
3852
3851 pairX = numpy.zeros((2,2))
3853 pairX = numpy.zeros((2,2))
3852 pairY = numpy.zeros((2,2))
3854 pairY = numpy.zeros((2,2))
3853
3855
3854 for i in range(len(listOper)):
3856 for i in range(len(listOper)):
3855 pairi = listOper[i]
3857 pairi = listOper[i]
3856
3858
3857 posDif = numpy.abs(chanPos[pairi[0],:] - chanPos[pairi[1],:])
3859 posDif = numpy.abs(chanPos[pairi[0],:] - chanPos[pairi[1],:])
3858
3860
3859 if posDif[0] == 0:
3861 if posDif[0] == 0:
3860 axisY.append(pairi)
3862 axisY.append(pairi)
3861 distY[iy] = posDif[1]
3863 distY[iy] = posDif[1]
3862 iy += 1
3864 iy += 1
3863 elif posDif[1] == 0:
3865 elif posDif[1] == 0:
3864 axisX.append(pairi)
3866 axisX.append(pairi)
3865 distX[ix] = posDif[0]
3867 distX[ix] = posDif[0]
3866 ix += 1
3868 ix += 1
3867
3869
3868 for i in range(2):
3870 for i in range(2):
3869 if i==0:
3871 if i==0:
3870 dist0 = distX
3872 dist0 = distX
3871 axis0 = axisX
3873 axis0 = axisX
3872 else:
3874 else:
3873 dist0 = distY
3875 dist0 = distY
3874 axis0 = axisY
3876 axis0 = axisY
3875
3877
3876 side = numpy.argsort(dist0)[:-1]
3878 side = numpy.argsort(dist0)[:-1]
3877 axis0 = numpy.array(axis0)[side,:]
3879 axis0 = numpy.array(axis0)[side,:]
3878 chanC = int(numpy.intersect1d(axis0[0,:], axis0[1,:])[0])
3880 chanC = int(numpy.intersect1d(axis0[0,:], axis0[1,:])[0])
3879 axis1 = numpy.unique(numpy.reshape(axis0,4))
3881 axis1 = numpy.unique(numpy.reshape(axis0,4))
3880 side = axis1[axis1 != chanC]
3882 side = axis1[axis1 != chanC]
3881 diff1 = chanPos[chanC,i] - chanPos[side[0],i]
3883 diff1 = chanPos[chanC,i] - chanPos[side[0],i]
3882 diff2 = chanPos[chanC,i] - chanPos[side[1],i]
3884 diff2 = chanPos[chanC,i] - chanPos[side[1],i]
3883 if diff1<0:
3885 if diff1<0:
3884 chan2 = side[0]
3886 chan2 = side[0]
3885 d2 = numpy.abs(diff1)
3887 d2 = numpy.abs(diff1)
3886 chan1 = side[1]
3888 chan1 = side[1]
3887 d1 = numpy.abs(diff2)
3889 d1 = numpy.abs(diff2)
3888 else:
3890 else:
3889 chan2 = side[1]
3891 chan2 = side[1]
3890 d2 = numpy.abs(diff2)
3892 d2 = numpy.abs(diff2)
3891 chan1 = side[0]
3893 chan1 = side[0]
3892 d1 = numpy.abs(diff1)
3894 d1 = numpy.abs(diff1)
3893
3895
3894 if i==0:
3896 if i==0:
3895 chanCX = chanC
3897 chanCX = chanC
3896 chan1X = chan1
3898 chan1X = chan1
3897 chan2X = chan2
3899 chan2X = chan2
3898 distances[0:2] = numpy.array([d1,d2])
3900 distances[0:2] = numpy.array([d1,d2])
3899 else:
3901 else:
3900 chanCY = chanC
3902 chanCY = chanC
3901 chan1Y = chan1
3903 chan1Y = chan1
3902 chan2Y = chan2
3904 chan2Y = chan2
3903 distances[2:4] = numpy.array([d1,d2])
3905 distances[2:4] = numpy.array([d1,d2])
3904 # axisXsides = numpy.reshape(axisX[ix,:],4)
3906 # axisXsides = numpy.reshape(axisX[ix,:],4)
3905 #
3907 #
3906 # channelCentX = int(numpy.intersect1d(pairX[0,:], pairX[1,:])[0])
3908 # channelCentX = int(numpy.intersect1d(pairX[0,:], pairX[1,:])[0])
3907 # channelCentY = int(numpy.intersect1d(pairY[0,:], pairY[1,:])[0])
3909 # channelCentY = int(numpy.intersect1d(pairY[0,:], pairY[1,:])[0])
3908 #
3910 #
3909 # ind25X = numpy.where(pairX[0,:] != channelCentX)[0][0]
3911 # ind25X = numpy.where(pairX[0,:] != channelCentX)[0][0]
3910 # ind20X = numpy.where(pairX[1,:] != channelCentX)[0][0]
3912 # ind20X = numpy.where(pairX[1,:] != channelCentX)[0][0]
3911 # channel25X = int(pairX[0,ind25X])
3913 # channel25X = int(pairX[0,ind25X])
3912 # channel20X = int(pairX[1,ind20X])
3914 # channel20X = int(pairX[1,ind20X])
3913 # ind25Y = numpy.where(pairY[0,:] != channelCentY)[0][0]
3915 # ind25Y = numpy.where(pairY[0,:] != channelCentY)[0][0]
3914 # ind20Y = numpy.where(pairY[1,:] != channelCentY)[0][0]
3916 # ind20Y = numpy.where(pairY[1,:] != channelCentY)[0][0]
3915 # channel25Y = int(pairY[0,ind25Y])
3917 # channel25Y = int(pairY[0,ind25Y])
3916 # channel20Y = int(pairY[1,ind20Y])
3918 # channel20Y = int(pairY[1,ind20Y])
3917
3919
3918 # pairslist = [(channelCentX, channel25X),(channelCentX, channel20X),(channelCentY,channel25Y),(channelCentY, channel20Y)]
3920 # pairslist = [(channelCentX, channel25X),(channelCentX, channel20X),(channelCentY,channel25Y),(channelCentY, channel20Y)]
3919 pairslist = [(chanCX, chan1X),(chanCX, chan2X),(chanCY,chan1Y),(chanCY, chan2Y)]
3921 pairslist = [(chanCX, chan1X),(chanCX, chan2X),(chanCY,chan1Y),(chanCY, chan2Y)]
3920
3922
3921 return pairslist, distances
3923 return pairslist, distances
3922 # def __getAOA(self, phases, pairsList, error, AOAthresh, azimuth):
3924 # def __getAOA(self, phases, pairsList, error, AOAthresh, azimuth):
3923 #
3925 #
3924 # arrayAOA = numpy.zeros((phases.shape[0],3))
3926 # arrayAOA = numpy.zeros((phases.shape[0],3))
3925 # cosdir0, cosdir = self.__getDirectionCosines(phases, pairsList)
3927 # cosdir0, cosdir = self.__getDirectionCosines(phases, pairsList)
3926 #
3928 #
3927 # arrayAOA[:,:2] = self.__calculateAOA(cosdir, azimuth)
3929 # arrayAOA[:,:2] = self.__calculateAOA(cosdir, azimuth)
3928 # cosDirError = numpy.sum(numpy.abs(cosdir0 - cosdir), axis = 1)
3930 # cosDirError = numpy.sum(numpy.abs(cosdir0 - cosdir), axis = 1)
3929 # arrayAOA[:,2] = cosDirError
3931 # arrayAOA[:,2] = cosDirError
3930 #
3932 #
3931 # azimuthAngle = arrayAOA[:,0]
3933 # azimuthAngle = arrayAOA[:,0]
3932 # zenithAngle = arrayAOA[:,1]
3934 # zenithAngle = arrayAOA[:,1]
3933 #
3935 #
3934 # #Setting Error
3936 # #Setting Error
3935 # #Number 3: AOA not fesible
3937 # #Number 3: AOA not fesible
3936 # indInvalid = numpy.where(numpy.logical_and((numpy.logical_or(numpy.isnan(zenithAngle), numpy.isnan(azimuthAngle))),error == 0))[0]
3938 # indInvalid = numpy.where(numpy.logical_and((numpy.logical_or(numpy.isnan(zenithAngle), numpy.isnan(azimuthAngle))),error == 0))[0]
3937 # error[indInvalid] = 3
3939 # error[indInvalid] = 3
3938 # #Number 4: Large difference in AOAs obtained from different antenna baselines
3940 # #Number 4: Large difference in AOAs obtained from different antenna baselines
3939 # indInvalid = numpy.where(numpy.logical_and(cosDirError > AOAthresh,error == 0))[0]
3941 # indInvalid = numpy.where(numpy.logical_and(cosDirError > AOAthresh,error == 0))[0]
3940 # error[indInvalid] = 4
3942 # error[indInvalid] = 4
3941 # return arrayAOA, error
3943 # return arrayAOA, error
3942 #
3944 #
3943 # def __getDirectionCosines(self, arrayPhase, pairsList):
3945 # def __getDirectionCosines(self, arrayPhase, pairsList):
3944 #
3946 #
3945 # #Initializing some variables
3947 # #Initializing some variables
3946 # ang_aux = numpy.array([-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8])*2*numpy.pi
3948 # ang_aux = numpy.array([-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8])*2*numpy.pi
3947 # ang_aux = ang_aux.reshape(1,ang_aux.size)
3949 # ang_aux = ang_aux.reshape(1,ang_aux.size)
3948 #
3950 #
3949 # cosdir = numpy.zeros((arrayPhase.shape[0],2))
3951 # cosdir = numpy.zeros((arrayPhase.shape[0],2))
3950 # cosdir0 = numpy.zeros((arrayPhase.shape[0],2))
3952 # cosdir0 = numpy.zeros((arrayPhase.shape[0],2))
3951 #
3953 #
3952 #
3954 #
3953 # for i in range(2):
3955 # for i in range(2):
3954 # #First Estimation
3956 # #First Estimation
3955 # phi0_aux = arrayPhase[:,pairsList[i][0]] + arrayPhase[:,pairsList[i][1]]
3957 # phi0_aux = arrayPhase[:,pairsList[i][0]] + arrayPhase[:,pairsList[i][1]]
3956 # #Dealias
3958 # #Dealias
3957 # indcsi = numpy.where(phi0_aux > numpy.pi)
3959 # indcsi = numpy.where(phi0_aux > numpy.pi)
3958 # phi0_aux[indcsi] -= 2*numpy.pi
3960 # phi0_aux[indcsi] -= 2*numpy.pi
3959 # indcsi = numpy.where(phi0_aux < -numpy.pi)
3961 # indcsi = numpy.where(phi0_aux < -numpy.pi)
3960 # phi0_aux[indcsi] += 2*numpy.pi
3962 # phi0_aux[indcsi] += 2*numpy.pi
3961 # #Direction Cosine 0
3963 # #Direction Cosine 0
3962 # cosdir0[:,i] = -(phi0_aux)/(2*numpy.pi*0.5)
3964 # cosdir0[:,i] = -(phi0_aux)/(2*numpy.pi*0.5)
3963 #
3965 #
3964 # #Most-Accurate Second Estimation
3966 # #Most-Accurate Second Estimation
3965 # phi1_aux = arrayPhase[:,pairsList[i][0]] - arrayPhase[:,pairsList[i][1]]
3967 # phi1_aux = arrayPhase[:,pairsList[i][0]] - arrayPhase[:,pairsList[i][1]]
3966 # phi1_aux = phi1_aux.reshape(phi1_aux.size,1)
3968 # phi1_aux = phi1_aux.reshape(phi1_aux.size,1)
3967 # #Direction Cosine 1
3969 # #Direction Cosine 1
3968 # cosdir1 = -(phi1_aux + ang_aux)/(2*numpy.pi*4.5)
3970 # cosdir1 = -(phi1_aux + ang_aux)/(2*numpy.pi*4.5)
3969 #
3971 #
3970 # #Searching the correct Direction Cosine
3972 # #Searching the correct Direction Cosine
3971 # cosdir0_aux = cosdir0[:,i]
3973 # cosdir0_aux = cosdir0[:,i]
3972 # cosdir0_aux = cosdir0_aux.reshape(cosdir0_aux.size,1)
3974 # cosdir0_aux = cosdir0_aux.reshape(cosdir0_aux.size,1)
3973 # #Minimum Distance
3975 # #Minimum Distance
3974 # cosDiff = (cosdir1 - cosdir0_aux)**2
3976 # cosDiff = (cosdir1 - cosdir0_aux)**2
3975 # indcos = cosDiff.argmin(axis = 1)
3977 # indcos = cosDiff.argmin(axis = 1)
3976 # #Saving Value obtained
3978 # #Saving Value obtained
3977 # cosdir[:,i] = cosdir1[numpy.arange(len(indcos)),indcos]
3979 # cosdir[:,i] = cosdir1[numpy.arange(len(indcos)),indcos]
3978 #
3980 #
3979 # return cosdir0, cosdir
3981 # return cosdir0, cosdir
3980 #
3982 #
3981 # def __calculateAOA(self, cosdir, azimuth):
3983 # def __calculateAOA(self, cosdir, azimuth):
3982 # cosdirX = cosdir[:,0]
3984 # cosdirX = cosdir[:,0]
3983 # cosdirY = cosdir[:,1]
3985 # cosdirY = cosdir[:,1]
3984 #
3986 #
3985 # zenithAngle = numpy.arccos(numpy.sqrt(1 - cosdirX**2 - cosdirY**2))*180/numpy.pi
3987 # zenithAngle = numpy.arccos(numpy.sqrt(1 - cosdirX**2 - cosdirY**2))*180/numpy.pi
3986 # azimuthAngle = numpy.arctan2(cosdirX,cosdirY)*180/numpy.pi + azimuth #0 deg north, 90 deg east
3988 # azimuthAngle = numpy.arctan2(cosdirX,cosdirY)*180/numpy.pi + azimuth #0 deg north, 90 deg east
3987 # angles = numpy.vstack((azimuthAngle, zenithAngle)).transpose()
3989 # angles = numpy.vstack((azimuthAngle, zenithAngle)).transpose()
3988 #
3990 #
3989 # return angles
3991 # return angles
3990 #
3992 #
3991 # def __getHeights(self, Ranges, zenith, error, minHeight, maxHeight):
3993 # def __getHeights(self, Ranges, zenith, error, minHeight, maxHeight):
3992 #
3994 #
3993 # Ramb = 375 #Ramb = c/(2*PRF)
3995 # Ramb = 375 #Ramb = c/(2*PRF)
3994 # Re = 6371 #Earth Radius
3996 # Re = 6371 #Earth Radius
3995 # heights = numpy.zeros(Ranges.shape)
3997 # heights = numpy.zeros(Ranges.shape)
3996 #
3998 #
3997 # R_aux = numpy.array([0,1,2])*Ramb
3999 # R_aux = numpy.array([0,1,2])*Ramb
3998 # R_aux = R_aux.reshape(1,R_aux.size)
4000 # R_aux = R_aux.reshape(1,R_aux.size)
3999 #
4001 #
4000 # Ranges = Ranges.reshape(Ranges.size,1)
4002 # Ranges = Ranges.reshape(Ranges.size,1)
4001 #
4003 #
4002 # Ri = Ranges + R_aux
4004 # Ri = Ranges + R_aux
4003 # hi = numpy.sqrt(Re**2 + Ri**2 + (2*Re*numpy.cos(zenith*numpy.pi/180)*Ri.transpose()).transpose()) - Re
4005 # hi = numpy.sqrt(Re**2 + Ri**2 + (2*Re*numpy.cos(zenith*numpy.pi/180)*Ri.transpose()).transpose()) - Re
4004 #
4006 #
4005 # #Check if there is a height between 70 and 110 km
4007 # #Check if there is a height between 70 and 110 km
4006 # h_bool = numpy.sum(numpy.logical_and(hi > minHeight, hi < maxHeight), axis = 1)
4008 # h_bool = numpy.sum(numpy.logical_and(hi > minHeight, hi < maxHeight), axis = 1)
4007 # ind_h = numpy.where(h_bool == 1)[0]
4009 # ind_h = numpy.where(h_bool == 1)[0]
4008 #
4010 #
4009 # hCorr = hi[ind_h, :]
4011 # hCorr = hi[ind_h, :]
4010 # ind_hCorr = numpy.where(numpy.logical_and(hi > minHeight, hi < maxHeight))
4012 # ind_hCorr = numpy.where(numpy.logical_and(hi > minHeight, hi < maxHeight))
4011 #
4013 #
4012 # hCorr = hi[ind_hCorr]
4014 # hCorr = hi[ind_hCorr]
4013 # heights[ind_h] = hCorr
4015 # heights[ind_h] = hCorr
4014 #
4016 #
4015 # #Setting Error
4017 # #Setting Error
4016 # #Number 13: Height unresolvable echo: not valid height within 70 to 110 km
4018 # #Number 13: Height unresolvable echo: not valid height within 70 to 110 km
4017 # #Number 14: Height ambiguous echo: more than one possible height within 70 to 110 km
4019 # #Number 14: Height ambiguous echo: more than one possible height within 70 to 110 km
4018 #
4020 #
4019 # indInvalid2 = numpy.where(numpy.logical_and(h_bool > 1, error == 0))[0]
4021 # indInvalid2 = numpy.where(numpy.logical_and(h_bool > 1, error == 0))[0]
4020 # error[indInvalid2] = 14
4022 # error[indInvalid2] = 14
4021 # indInvalid1 = numpy.where(numpy.logical_and(h_bool == 0, error == 0))[0]
4023 # indInvalid1 = numpy.where(numpy.logical_and(h_bool == 0, error == 0))[0]
4022 # error[indInvalid1] = 13
4024 # error[indInvalid1] = 13
4023 #
4025 #
4024 # return heights, error
4026 # return heights, error
4025 No newline at end of file
4027
@@ -1,1 +1,1
1 <Project description="Segundo Test" id="191" name="test01"><ReadUnit datatype="SpectraReader" id="1911" inputId="0" name="SpectraReader"><Operation id="19111" name="run" priority="1" type="self"><Parameter format="str" id="191111" name="datatype" value="SpectraReader" /><Parameter format="str" id="191112" name="path" value="/data/CLAIRE/CLAIRE_WINDS_2MHZ/DATA/pdataCLAIRE/Extra" /><Parameter format="date" id="191113" name="startDate" value="2018/02/01" /><Parameter format="date" id="191114" name="endDate" value="2018/02/01" /><Parameter format="time" id="191115" name="startTime" value="17:00:00" /><Parameter format="time" id="191116" name="endTime" value="20:00:00" /><Parameter format="int" id="191118" name="online" value="0" /><Parameter format="int" id="191119" name="walk" value="1" /></Operation><Operation id="19112" name="printInfo" priority="2" type="self" /><Operation id="19113" name="printNumberOfBlock" priority="3" type="self" /></ReadUnit><ProcUnit datatype="Parameters" id="1913" inputId="1912" name="ParametersProc"><Operation id="19131" name="run" priority="1" type="self" /><Operation id="19132" name="SpectralFilters" priority="2" type="other"><Parameter format="float" id="191321" name="PositiveLimit" value="1.5" /><Parameter format="float" id="191322" name="NegativeLimit" value="3.5" /></Operation><Operation id="19133" name="PrecipitationProc" priority="3" type="other" /><Operation id="19134" name="ParametersPlot" priority="4" type="other"><Parameter format="int" id="191341" name="id" value="10" /><Parameter format="str" id="191342" name="wintitle" value="First_gg" /><Parameter format="str" id="191343" name="colormap" value="ocean_r" /><Parameter format="int" id="191344" name="zmin" value="00" /><Parameter format="int" id="191345" name="zmax" value="40" /><Parameter format="int" id="191346" name="ymin" value="0" /><Parameter format="int" id="191347" name="ymax" value="11" /><Parameter format="int" id="191348" name="xmin" value="17" /><Parameter format="int" id="191349" name="xmax" value="20" /><Parameter format="int" id="191350" name="save" value="1" /><Parameter format="str" id="191351" name="figpath" value="/data/CLAIRE/CLAIRE_WINDS_2MHZ/DATA/pdataCLAIRE/Extra" /></Operation><Operation id="19135" name="ParamWriter" priority="5" type="other"><Parameter format="str" id="191351" name="path" value="/data/CLAIRE/CLAIRE_WINDS_2MHZ/DATA/pdatatest/test1024" /><Parameter format="int" id="191352" name="blocksPerFile" value="100" /><Parameter format="list" id="191353" name="metadataList" value="heightList,timeZone,paramInterval" /><Parameter format="list" id="191354" name="dataList" value="data_output,data_SNR,utctime,utctimeInit" /></Operation></ProcUnit><ProcUnit datatype="SpectraProc" id="1912" inputId="1911" name="SpectraProc"><Operation id="19121" name="run" priority="1" type="self" /><Operation id="19122" name="setRadarFrequency" priority="2" type="self"><Parameter format="float" id="191221" name="frequency" value="445.09e6" /></Operation></ProcUnit></Project> No newline at end of file
1 <Project description="Segundo Test" id="191" name="test01"><ReadUnit datatype="SpectraReader" id="1911" inputId="0" name="SpectraReader"><Operation id="19111" name="run" priority="1" type="self"><Parameter format="str" id="191111" name="datatype" value="SpectraReader" /><Parameter format="str" id="191112" name="path" value="/data/CLAIRE/CLAIRE_WINDS_2MHZ/DATA/pdataCLAIRE/2018" /><Parameter format="date" id="191113" name="startDate" value="2018/01/26" /><Parameter format="date" id="191114" name="endDate" value="2018/01/26" /><Parameter format="time" id="191115" name="startTime" value="17:45:00" /><Parameter format="time" id="191116" name="endTime" value="23:59:00" /><Parameter format="int" id="191118" name="online" value="0" /><Parameter format="int" id="191119" name="walk" value="1" /></Operation><Operation id="19112" name="printInfo" priority="2" type="self" /><Operation id="19113" name="printNumberOfBlock" priority="3" type="self" /></ReadUnit><ProcUnit datatype="Parameters" id="1913" inputId="1912" name="ParametersProc"><Operation id="19131" name="run" priority="1" type="self" /><Operation id="19132" name="SpectralFilters" priority="2" type="other"><Parameter format="float" id="191321" name="PositiveLimit" value="1.5" /><Parameter format="float" id="191322" name="NegativeLimit" value="12.5" /></Operation><Operation id="19133" name="PrecipitationProc" priority="3" type="other" /><Operation id="19134" name="ParametersPlot" priority="4" type="other"><Parameter format="int" id="191341" name="id" value="10" /><Parameter format="str" id="191342" name="wintitle" value="First_gg" /><Parameter format="str" id="191343" name="colormap" value="ocean_r" /><Parameter format="int" id="191344" name="zmin" value="00" /><Parameter format="int" id="191345" name="zmax" value="40" /><Parameter format="int" id="191346" name="ymin" value="0" /><Parameter format="int" id="191347" name="ymax" value="11" /><Parameter format="int" id="191348" name="xmin" value="17" /><Parameter format="int" id="191349" name="xmax" value="24" /><Parameter format="int" id="191350" name="save" value="1" /><Parameter format="str" id="191351" name="figpath" value="/data/CLAIRE/CLAIRE_WINDS_2MHZ/DATA/pdataCLAIRE/2018" /></Operation><Operation id="19135" name="SpcParamPlot" priority="5" type="other"><Parameter format="int" id="191351" name="id" value="21" /><Parameter format="str" id="191352" name="wintitle" value="Primer eco removido" /><Parameter format="str" id="191353" name="xaxis" value="velocity" /><Parameter format="int" id="191354" name="showprofile" value="1" /><Parameter format="int" id="191355" name="zmin" value="10" /><Parameter format="int" id="191356" name="zmax" value="40" /><Parameter format="int" id="191357" name="ymin" value="0" /><Parameter format="int" id="191358" name="ymax" value="10" /><Parameter format="int" id="191359" name="Selector" value="1" /></Operation></ProcUnit><ProcUnit datatype="SpectraProc" id="1912" inputId="1911" name="SpectraProc"><Operation id="19121" name="run" priority="1" type="self" /><Operation id="19122" name="setRadarFrequency" priority="2" type="self"><Parameter format="float" id="191221" name="frequency" value="445.09e6" /></Operation></ProcUnit></Project> No newline at end of file
@@ -1,63 +1,40
1 '''
1 '''
2 Created on Nov 09, 2016
2 Created on Nov 09, 2016
3
3
4 @author: roj- LouVD
4 @author: roj- LouVD
5 '''
5 '''
6 import os, sys
6 import os, sys
7 from time import sleep
7
8
8
9
9 path = os.path.split(os.getcwd())[0]
10 path = os.path.split(os.getcwd())[0]
10 path = os.path.split(path)[0]
11 path = os.path.split(path)[0]
11
12
12 sys.path.insert(0, path)
13 sys.path.insert(0, path)
13
14
14 from schainpy.controller import Project
15 from schainpy.controller import Project
15
16
16 filename = 'test1.xml'
17 filename = 'test1.xml'
17 # path = '/home/jespinoza/workspace/data/bltr/'
18 # path = '/home/jespinoza/workspace/data/bltr/'
18 path = '/home/erick/Documents/Data/BLTR_Data/sswma/'#'/media/erick/6F60F7113095A154/BLTR/'
19 path = '/data/BLTR/nuevos_datos/'#'/media/erick/6F60F7113095A154/BLTR/'
19 desc = "read bltr data sswma file"
20 desc = "read bltr data sswma file"
20 figpath = '/media/erick/6F60F7113095A154/BLTR/'
21 figpath = '/data/BLTR/nuevos_datos/'
21 pathhdf5 = '/tmp/'
22 pathhdf5 = '/tmp/'
22
23
23 controllerObj = Project()
24
24
25 controller = Project()
25 controllerObj.setup(id = '191', name='test1', description=desc)
26 controller.setup(id = '195', name='test1', description=desc)
26 readUnitConfObj = controllerObj.addReadUnit(datatype='BLTRParamReader',
27 receiver = controller.addProcUnit(name='PlotterReceiver')
27 path=path,
28 receiver.addParameter(name='plottypes', value='output')
28 startDate='2017/01/17',
29 receiver.addParameter(name='localtime', value='0', format='int')
29 endDate='2018/01/01',
30
30 startTime='06:00:00',
31 op = receiver.addOperation(name='PlotWindProfilerData', optype='other')
31 endTime='23:59:59',
32 op.addParameter(name='save', value=figpath)
32 verbose=0,
33 op.addParameter(name='bgcolor', value='white')
33 )
34 op.addParameter(name='localtime', value='0', format='int')
34
35 op.addParameter(name='zlimits', value='(-20,20),(-20,20),(-2,2)', format='pairslist')
35 procUnitConfObj1 = controllerObj.addProcUnit(datatype='BLTRParametersProc',
36
36 inputId=readUnitConfObj.getId())
37 controller.start()
37
38
38 procUnitConfObj1.addParameter(name='mode', value='1', format='int')
39
39 # procUnitConfObj1.addParameter(name='snr_threshold', value='10', format='float')
40
41
42 opObj10 = procUnitConfObj1.addOperation(name='WindProfilerPlot', optype='other')
43 opObj10.addParameter(name='id', value='2', format='int')
44 opObj10.addParameter(name='wintitle', value='', format='str')
45
46 # opObj10.addParameter(name='save', value='1', format='bool')
47 # opObj10.addParameter(name='figpath', value=figpath, format='str')
48 opObj10.addParameter(name='SNRmin', value='-20', format='int')
49 opObj10.addParameter(name='SNRmax', value='40', format='int')
50 opObj10.addParameter(name='SNRthresh', value='0', format='float')
51 opObj10.addParameter(name='xmin', value='0', format='float')
52 opObj10.addParameter(name='xmax', value='24', format='float')
53 opObj10.addParameter(name='ymin', value='0', format='float')
54 opObj10.addParameter(name='ymax', value='7', format='float')
55 opObj10.addParameter(name='zmin', value='-4', format='float')
56 opObj10.addParameter(name='zmax', value='4', format='float')
57 opObj10.addParameter(name='zmin_ver', value='-200', format='float')
58 opObj10.addParameter(name='zmax_ver', value='200', format='float')
59 #opObj10.addParameter(name='showprofile', value='1', format='bool')
60 #opObj10.addParameter(name='show', value='1', format='bool')
61
62 controllerObj.start()
63
40
General Comments 0
You need to be logged in to leave comments. Login now