##// END OF EJS Templates
Fix SpectralMoments Plot
Juan C. Espinoza -
r1207:15feaa6e0b57
parent child
Show More

The requested changes are too big and content was truncated. Show full diff

@@ -1,1353 +1,1358
1 '''
1 '''
2
2
3 $Author: murco $
3 $Author: murco $
4 $Id: JROData.py 173 2012-11-20 15:06:21Z murco $
4 $Id: JROData.py 173 2012-11-20 15:06:21Z murco $
5 '''
5 '''
6
6
7 import copy
7 import copy
8 import numpy
8 import numpy
9 import datetime
9 import datetime
10 import json
10 import json
11
11
12 from schainpy.utils import log
12 from schainpy.utils import log
13 from .jroheaderIO import SystemHeader, RadarControllerHeader
13 from .jroheaderIO import SystemHeader, RadarControllerHeader
14
14
15
15
16 def getNumpyDtype(dataTypeCode):
16 def getNumpyDtype(dataTypeCode):
17
17
18 if dataTypeCode == 0:
18 if dataTypeCode == 0:
19 numpyDtype = numpy.dtype([('real', '<i1'), ('imag', '<i1')])
19 numpyDtype = numpy.dtype([('real', '<i1'), ('imag', '<i1')])
20 elif dataTypeCode == 1:
20 elif dataTypeCode == 1:
21 numpyDtype = numpy.dtype([('real', '<i2'), ('imag', '<i2')])
21 numpyDtype = numpy.dtype([('real', '<i2'), ('imag', '<i2')])
22 elif dataTypeCode == 2:
22 elif dataTypeCode == 2:
23 numpyDtype = numpy.dtype([('real', '<i4'), ('imag', '<i4')])
23 numpyDtype = numpy.dtype([('real', '<i4'), ('imag', '<i4')])
24 elif dataTypeCode == 3:
24 elif dataTypeCode == 3:
25 numpyDtype = numpy.dtype([('real', '<i8'), ('imag', '<i8')])
25 numpyDtype = numpy.dtype([('real', '<i8'), ('imag', '<i8')])
26 elif dataTypeCode == 4:
26 elif dataTypeCode == 4:
27 numpyDtype = numpy.dtype([('real', '<f4'), ('imag', '<f4')])
27 numpyDtype = numpy.dtype([('real', '<f4'), ('imag', '<f4')])
28 elif dataTypeCode == 5:
28 elif dataTypeCode == 5:
29 numpyDtype = numpy.dtype([('real', '<f8'), ('imag', '<f8')])
29 numpyDtype = numpy.dtype([('real', '<f8'), ('imag', '<f8')])
30 else:
30 else:
31 raise ValueError('dataTypeCode was not defined')
31 raise ValueError('dataTypeCode was not defined')
32
32
33 return numpyDtype
33 return numpyDtype
34
34
35
35
36 def getDataTypeCode(numpyDtype):
36 def getDataTypeCode(numpyDtype):
37
37
38 if numpyDtype == numpy.dtype([('real', '<i1'), ('imag', '<i1')]):
38 if numpyDtype == numpy.dtype([('real', '<i1'), ('imag', '<i1')]):
39 datatype = 0
39 datatype = 0
40 elif numpyDtype == numpy.dtype([('real', '<i2'), ('imag', '<i2')]):
40 elif numpyDtype == numpy.dtype([('real', '<i2'), ('imag', '<i2')]):
41 datatype = 1
41 datatype = 1
42 elif numpyDtype == numpy.dtype([('real', '<i4'), ('imag', '<i4')]):
42 elif numpyDtype == numpy.dtype([('real', '<i4'), ('imag', '<i4')]):
43 datatype = 2
43 datatype = 2
44 elif numpyDtype == numpy.dtype([('real', '<i8'), ('imag', '<i8')]):
44 elif numpyDtype == numpy.dtype([('real', '<i8'), ('imag', '<i8')]):
45 datatype = 3
45 datatype = 3
46 elif numpyDtype == numpy.dtype([('real', '<f4'), ('imag', '<f4')]):
46 elif numpyDtype == numpy.dtype([('real', '<f4'), ('imag', '<f4')]):
47 datatype = 4
47 datatype = 4
48 elif numpyDtype == numpy.dtype([('real', '<f8'), ('imag', '<f8')]):
48 elif numpyDtype == numpy.dtype([('real', '<f8'), ('imag', '<f8')]):
49 datatype = 5
49 datatype = 5
50 else:
50 else:
51 datatype = None
51 datatype = None
52
52
53 return datatype
53 return datatype
54
54
55
55
56 def hildebrand_sekhon(data, navg):
56 def hildebrand_sekhon(data, navg):
57 """
57 """
58 This method is for the objective determination of the noise level in Doppler spectra. This
58 This method is for the objective determination of the noise level in Doppler spectra. This
59 implementation technique is based on the fact that the standard deviation of the spectral
59 implementation technique is based on the fact that the standard deviation of the spectral
60 densities is equal to the mean spectral density for white Gaussian noise
60 densities is equal to the mean spectral density for white Gaussian noise
61
61
62 Inputs:
62 Inputs:
63 Data : heights
63 Data : heights
64 navg : numbers of averages
64 navg : numbers of averages
65
65
66 Return:
66 Return:
67 mean : noise's level
67 mean : noise's level
68 """
68 """
69
69
70 sortdata = numpy.sort(data, axis=None)
70 sortdata = numpy.sort(data, axis=None)
71 lenOfData = len(sortdata)
71 lenOfData = len(sortdata)
72 nums_min = lenOfData*0.2
72 nums_min = lenOfData*0.2
73
73
74 if nums_min <= 5:
74 if nums_min <= 5:
75
75
76 nums_min = 5
76 nums_min = 5
77
77
78 sump = 0.
78 sump = 0.
79 sumq = 0.
79 sumq = 0.
80
80
81 j = 0
81 j = 0
82 cont = 1
82 cont = 1
83
83
84 while((cont == 1)and(j < lenOfData)):
84 while((cont == 1)and(j < lenOfData)):
85
85
86 sump += sortdata[j]
86 sump += sortdata[j]
87 sumq += sortdata[j]**2
87 sumq += sortdata[j]**2
88
88
89 if j > nums_min:
89 if j > nums_min:
90 rtest = float(j)/(j-1) + 1.0/navg
90 rtest = float(j)/(j-1) + 1.0/navg
91 if ((sumq*j) > (rtest*sump**2)):
91 if ((sumq*j) > (rtest*sump**2)):
92 j = j - 1
92 j = j - 1
93 sump = sump - sortdata[j]
93 sump = sump - sortdata[j]
94 sumq = sumq - sortdata[j]**2
94 sumq = sumq - sortdata[j]**2
95 cont = 0
95 cont = 0
96
96
97 j += 1
97 j += 1
98
98
99 lnoise = sump / j
99 lnoise = sump / j
100
100
101 return lnoise
101 return lnoise
102
102
103
103
104 class Beam:
104 class Beam:
105
105
106 def __init__(self):
106 def __init__(self):
107 self.codeList = []
107 self.codeList = []
108 self.azimuthList = []
108 self.azimuthList = []
109 self.zenithList = []
109 self.zenithList = []
110
110
111
111
112 class GenericData(object):
112 class GenericData(object):
113
113
114 flagNoData = True
114 flagNoData = True
115
115
116 def copy(self, inputObj=None):
116 def copy(self, inputObj=None):
117
117
118 if inputObj == None:
118 if inputObj == None:
119 return copy.deepcopy(self)
119 return copy.deepcopy(self)
120
120
121 for key in list(inputObj.__dict__.keys()):
121 for key in list(inputObj.__dict__.keys()):
122
122
123 attribute = inputObj.__dict__[key]
123 attribute = inputObj.__dict__[key]
124
124
125 # If this attribute is a tuple or list
125 # If this attribute is a tuple or list
126 if type(inputObj.__dict__[key]) in (tuple, list):
126 if type(inputObj.__dict__[key]) in (tuple, list):
127 self.__dict__[key] = attribute[:]
127 self.__dict__[key] = attribute[:]
128 continue
128 continue
129
129
130 # If this attribute is another object or instance
130 # If this attribute is another object or instance
131 if hasattr(attribute, '__dict__'):
131 if hasattr(attribute, '__dict__'):
132 self.__dict__[key] = attribute.copy()
132 self.__dict__[key] = attribute.copy()
133 continue
133 continue
134
134
135 self.__dict__[key] = inputObj.__dict__[key]
135 self.__dict__[key] = inputObj.__dict__[key]
136
136
137 def deepcopy(self):
137 def deepcopy(self):
138
138
139 return copy.deepcopy(self)
139 return copy.deepcopy(self)
140
140
141 def isEmpty(self):
141 def isEmpty(self):
142
142
143 return self.flagNoData
143 return self.flagNoData
144
144
145
145
146 class JROData(GenericData):
146 class JROData(GenericData):
147
147
148 # m_BasicHeader = BasicHeader()
148 # m_BasicHeader = BasicHeader()
149 # m_ProcessingHeader = ProcessingHeader()
149 # m_ProcessingHeader = ProcessingHeader()
150
150
151 systemHeaderObj = SystemHeader()
151 systemHeaderObj = SystemHeader()
152 radarControllerHeaderObj = RadarControllerHeader()
152 radarControllerHeaderObj = RadarControllerHeader()
153 # data = None
153 # data = None
154 type = None
154 type = None
155 datatype = None # dtype but in string
155 datatype = None # dtype but in string
156 # dtype = None
156 # dtype = None
157 # nChannels = None
157 # nChannels = None
158 # nHeights = None
158 # nHeights = None
159 nProfiles = None
159 nProfiles = None
160 heightList = None
160 heightList = None
161 channelList = None
161 channelList = None
162 flagDiscontinuousBlock = False
162 flagDiscontinuousBlock = False
163 useLocalTime = False
163 useLocalTime = False
164 utctime = None
164 utctime = None
165 timeZone = None
165 timeZone = None
166 dstFlag = None
166 dstFlag = None
167 errorCount = None
167 errorCount = None
168 blocksize = None
168 blocksize = None
169 # nCode = None
169 # nCode = None
170 # nBaud = None
170 # nBaud = None
171 # code = None
171 # code = None
172 flagDecodeData = False # asumo q la data no esta decodificada
172 flagDecodeData = False # asumo q la data no esta decodificada
173 flagDeflipData = False # asumo q la data no esta sin flip
173 flagDeflipData = False # asumo q la data no esta sin flip
174 flagShiftFFT = False
174 flagShiftFFT = False
175 # ippSeconds = None
175 # ippSeconds = None
176 # timeInterval = None
176 # timeInterval = None
177 nCohInt = None
177 nCohInt = None
178 # noise = None
178 # noise = None
179 windowOfFilter = 1
179 windowOfFilter = 1
180 # Speed of ligth
180 # Speed of ligth
181 C = 3e8
181 C = 3e8
182 frequency = 49.92e6
182 frequency = 49.92e6
183 realtime = False
183 realtime = False
184 beacon_heiIndexList = None
184 beacon_heiIndexList = None
185 last_block = None
185 last_block = None
186 blocknow = None
186 blocknow = None
187 azimuth = None
187 azimuth = None
188 zenith = None
188 zenith = None
189 beam = Beam()
189 beam = Beam()
190 profileIndex = None
190 profileIndex = None
191 error = None
191 error = None
192 data = None
192 data = None
193 nmodes = None
193 nmodes = None
194
194
195 def __str__(self):
195 def __str__(self):
196
196
197 return '{} - {}'.format(self.type, self.getDatatime())
197 return '{} - {}'.format(self.type, self.getDatatime())
198
198
199 def getNoise(self):
199 def getNoise(self):
200
200
201 raise NotImplementedError
201 raise NotImplementedError
202
202
203 def getNChannels(self):
203 def getNChannels(self):
204
204
205 return len(self.channelList)
205 return len(self.channelList)
206
206
207 def getChannelIndexList(self):
207 def getChannelIndexList(self):
208
208
209 return list(range(self.nChannels))
209 return list(range(self.nChannels))
210
210
211 def getNHeights(self):
211 def getNHeights(self):
212
212
213 return len(self.heightList)
213 return len(self.heightList)
214
214
215 def getHeiRange(self, extrapoints=0):
215 def getHeiRange(self, extrapoints=0):
216
216
217 heis = self.heightList
217 heis = self.heightList
218 # deltah = self.heightList[1] - self.heightList[0]
218 # deltah = self.heightList[1] - self.heightList[0]
219 #
219 #
220 # heis.append(self.heightList[-1])
220 # heis.append(self.heightList[-1])
221
221
222 return heis
222 return heis
223
223
224 def getDeltaH(self):
224 def getDeltaH(self):
225
225
226 delta = self.heightList[1] - self.heightList[0]
226 delta = self.heightList[1] - self.heightList[0]
227
227
228 return delta
228 return delta
229
229
230 def getltctime(self):
230 def getltctime(self):
231
231
232 if self.useLocalTime:
232 if self.useLocalTime:
233 return self.utctime - self.timeZone * 60
233 return self.utctime - self.timeZone * 60
234
234
235 return self.utctime
235 return self.utctime
236
236
237 def getDatatime(self):
237 def getDatatime(self):
238
238
239 datatimeValue = datetime.datetime.utcfromtimestamp(self.ltctime)
239 datatimeValue = datetime.datetime.utcfromtimestamp(self.ltctime)
240 return datatimeValue
240 return datatimeValue
241
241
242 def getTimeRange(self):
242 def getTimeRange(self):
243
243
244 datatime = []
244 datatime = []
245
245
246 datatime.append(self.ltctime)
246 datatime.append(self.ltctime)
247 datatime.append(self.ltctime + self.timeInterval + 1)
247 datatime.append(self.ltctime + self.timeInterval + 1)
248
248
249 datatime = numpy.array(datatime)
249 datatime = numpy.array(datatime)
250
250
251 return datatime
251 return datatime
252
252
253 def getFmaxTimeResponse(self):
253 def getFmaxTimeResponse(self):
254
254
255 period = (10**-6) * self.getDeltaH() / (0.15)
255 period = (10**-6) * self.getDeltaH() / (0.15)
256
256
257 PRF = 1. / (period * self.nCohInt)
257 PRF = 1. / (period * self.nCohInt)
258
258
259 fmax = PRF
259 fmax = PRF
260
260
261 return fmax
261 return fmax
262
262
263 def getFmax(self):
263 def getFmax(self):
264 PRF = 1. / (self.ippSeconds * self.nCohInt)
264 PRF = 1. / (self.ippSeconds * self.nCohInt)
265
265
266 fmax = PRF
266 fmax = PRF
267 return fmax
267 return fmax
268
268
269 def getVmax(self):
269 def getVmax(self):
270
270
271 _lambda = self.C / self.frequency
271 _lambda = self.C / self.frequency
272
272
273 vmax = self.getFmax() * _lambda / 2
273 vmax = self.getFmax() * _lambda / 2
274
274
275 return vmax
275 return vmax
276
276
277 def get_ippSeconds(self):
277 def get_ippSeconds(self):
278 '''
278 '''
279 '''
279 '''
280 return self.radarControllerHeaderObj.ippSeconds
280 return self.radarControllerHeaderObj.ippSeconds
281
281
282 def set_ippSeconds(self, ippSeconds):
282 def set_ippSeconds(self, ippSeconds):
283 '''
283 '''
284 '''
284 '''
285
285
286 self.radarControllerHeaderObj.ippSeconds = ippSeconds
286 self.radarControllerHeaderObj.ippSeconds = ippSeconds
287
287
288 return
288 return
289
289
290 def get_dtype(self):
290 def get_dtype(self):
291 '''
291 '''
292 '''
292 '''
293 return getNumpyDtype(self.datatype)
293 return getNumpyDtype(self.datatype)
294
294
295 def set_dtype(self, numpyDtype):
295 def set_dtype(self, numpyDtype):
296 '''
296 '''
297 '''
297 '''
298
298
299 self.datatype = getDataTypeCode(numpyDtype)
299 self.datatype = getDataTypeCode(numpyDtype)
300
300
301 def get_code(self):
301 def get_code(self):
302 '''
302 '''
303 '''
303 '''
304 return self.radarControllerHeaderObj.code
304 return self.radarControllerHeaderObj.code
305
305
306 def set_code(self, code):
306 def set_code(self, code):
307 '''
307 '''
308 '''
308 '''
309 self.radarControllerHeaderObj.code = code
309 self.radarControllerHeaderObj.code = code
310
310
311 return
311 return
312
312
313 def get_ncode(self):
313 def get_ncode(self):
314 '''
314 '''
315 '''
315 '''
316 return self.radarControllerHeaderObj.nCode
316 return self.radarControllerHeaderObj.nCode
317
317
318 def set_ncode(self, nCode):
318 def set_ncode(self, nCode):
319 '''
319 '''
320 '''
320 '''
321 self.radarControllerHeaderObj.nCode = nCode
321 self.radarControllerHeaderObj.nCode = nCode
322
322
323 return
323 return
324
324
325 def get_nbaud(self):
325 def get_nbaud(self):
326 '''
326 '''
327 '''
327 '''
328 return self.radarControllerHeaderObj.nBaud
328 return self.radarControllerHeaderObj.nBaud
329
329
330 def set_nbaud(self, nBaud):
330 def set_nbaud(self, nBaud):
331 '''
331 '''
332 '''
332 '''
333 self.radarControllerHeaderObj.nBaud = nBaud
333 self.radarControllerHeaderObj.nBaud = nBaud
334
334
335 return
335 return
336
336
337 nChannels = property(getNChannels, "I'm the 'nChannel' property.")
337 nChannels = property(getNChannels, "I'm the 'nChannel' property.")
338 channelIndexList = property(
338 channelIndexList = property(
339 getChannelIndexList, "I'm the 'channelIndexList' property.")
339 getChannelIndexList, "I'm the 'channelIndexList' property.")
340 nHeights = property(getNHeights, "I'm the 'nHeights' property.")
340 nHeights = property(getNHeights, "I'm the 'nHeights' property.")
341 #noise = property(getNoise, "I'm the 'nHeights' property.")
341 #noise = property(getNoise, "I'm the 'nHeights' property.")
342 datatime = property(getDatatime, "I'm the 'datatime' property")
342 datatime = property(getDatatime, "I'm the 'datatime' property")
343 ltctime = property(getltctime, "I'm the 'ltctime' property")
343 ltctime = property(getltctime, "I'm the 'ltctime' property")
344 ippSeconds = property(get_ippSeconds, set_ippSeconds)
344 ippSeconds = property(get_ippSeconds, set_ippSeconds)
345 dtype = property(get_dtype, set_dtype)
345 dtype = property(get_dtype, set_dtype)
346 # timeInterval = property(getTimeInterval, "I'm the 'timeInterval' property")
346 # timeInterval = property(getTimeInterval, "I'm the 'timeInterval' property")
347 code = property(get_code, set_code)
347 code = property(get_code, set_code)
348 nCode = property(get_ncode, set_ncode)
348 nCode = property(get_ncode, set_ncode)
349 nBaud = property(get_nbaud, set_nbaud)
349 nBaud = property(get_nbaud, set_nbaud)
350
350
351
351
352 class Voltage(JROData):
352 class Voltage(JROData):
353
353
354 # data es un numpy array de 2 dmensiones (canales, alturas)
354 # data es un numpy array de 2 dmensiones (canales, alturas)
355 data = None
355 data = None
356
356
357 def __init__(self):
357 def __init__(self):
358 '''
358 '''
359 Constructor
359 Constructor
360 '''
360 '''
361
361
362 self.useLocalTime = True
362 self.useLocalTime = True
363 self.radarControllerHeaderObj = RadarControllerHeader()
363 self.radarControllerHeaderObj = RadarControllerHeader()
364 self.systemHeaderObj = SystemHeader()
364 self.systemHeaderObj = SystemHeader()
365 self.type = "Voltage"
365 self.type = "Voltage"
366 self.data = None
366 self.data = None
367 # self.dtype = None
367 # self.dtype = None
368 # self.nChannels = 0
368 # self.nChannels = 0
369 # self.nHeights = 0
369 # self.nHeights = 0
370 self.nProfiles = None
370 self.nProfiles = None
371 self.heightList = None
371 self.heightList = None
372 self.channelList = None
372 self.channelList = None
373 # self.channelIndexList = None
373 # self.channelIndexList = None
374 self.flagNoData = True
374 self.flagNoData = True
375 self.flagDiscontinuousBlock = False
375 self.flagDiscontinuousBlock = False
376 self.utctime = None
376 self.utctime = None
377 self.timeZone = None
377 self.timeZone = None
378 self.dstFlag = None
378 self.dstFlag = None
379 self.errorCount = None
379 self.errorCount = None
380 self.nCohInt = None
380 self.nCohInt = None
381 self.blocksize = None
381 self.blocksize = None
382 self.flagDecodeData = False # asumo q la data no esta decodificada
382 self.flagDecodeData = False # asumo q la data no esta decodificada
383 self.flagDeflipData = False # asumo q la data no esta sin flip
383 self.flagDeflipData = False # asumo q la data no esta sin flip
384 self.flagShiftFFT = False
384 self.flagShiftFFT = False
385 self.flagDataAsBlock = False # Asumo que la data es leida perfil a perfil
385 self.flagDataAsBlock = False # Asumo que la data es leida perfil a perfil
386 self.profileIndex = 0
386 self.profileIndex = 0
387
387
388 def getNoisebyHildebrand(self, channel=None):
388 def getNoisebyHildebrand(self, channel=None):
389 """
389 """
390 Determino el nivel de ruido usando el metodo Hildebrand-Sekhon
390 Determino el nivel de ruido usando el metodo Hildebrand-Sekhon
391
391
392 Return:
392 Return:
393 noiselevel
393 noiselevel
394 """
394 """
395
395
396 if channel != None:
396 if channel != None:
397 data = self.data[channel]
397 data = self.data[channel]
398 nChannels = 1
398 nChannels = 1
399 else:
399 else:
400 data = self.data
400 data = self.data
401 nChannels = self.nChannels
401 nChannels = self.nChannels
402
402
403 noise = numpy.zeros(nChannels)
403 noise = numpy.zeros(nChannels)
404 power = data * numpy.conjugate(data)
404 power = data * numpy.conjugate(data)
405
405
406 for thisChannel in range(nChannels):
406 for thisChannel in range(nChannels):
407 if nChannels == 1:
407 if nChannels == 1:
408 daux = power[:].real
408 daux = power[:].real
409 else:
409 else:
410 daux = power[thisChannel, :].real
410 daux = power[thisChannel, :].real
411 noise[thisChannel] = hildebrand_sekhon(daux, self.nCohInt)
411 noise[thisChannel] = hildebrand_sekhon(daux, self.nCohInt)
412
412
413 return noise
413 return noise
414
414
415 def getNoise(self, type=1, channel=None):
415 def getNoise(self, type=1, channel=None):
416
416
417 if type == 1:
417 if type == 1:
418 noise = self.getNoisebyHildebrand(channel)
418 noise = self.getNoisebyHildebrand(channel)
419
419
420 return noise
420 return noise
421
421
422 def getPower(self, channel=None):
422 def getPower(self, channel=None):
423
423
424 if channel != None:
424 if channel != None:
425 data = self.data[channel]
425 data = self.data[channel]
426 else:
426 else:
427 data = self.data
427 data = self.data
428
428
429 power = data * numpy.conjugate(data)
429 power = data * numpy.conjugate(data)
430 powerdB = 10 * numpy.log10(power.real)
430 powerdB = 10 * numpy.log10(power.real)
431 powerdB = numpy.squeeze(powerdB)
431 powerdB = numpy.squeeze(powerdB)
432
432
433 return powerdB
433 return powerdB
434
434
435 def getTimeInterval(self):
435 def getTimeInterval(self):
436
436
437 timeInterval = self.ippSeconds * self.nCohInt
437 timeInterval = self.ippSeconds * self.nCohInt
438
438
439 return timeInterval
439 return timeInterval
440
440
441 noise = property(getNoise, "I'm the 'nHeights' property.")
441 noise = property(getNoise, "I'm the 'nHeights' property.")
442 timeInterval = property(getTimeInterval, "I'm the 'timeInterval' property")
442 timeInterval = property(getTimeInterval, "I'm the 'timeInterval' property")
443
443
444
444
445 class Spectra(JROData):
445 class Spectra(JROData):
446
446
447 # data spc es un numpy array de 2 dmensiones (canales, perfiles, alturas)
447 # data spc es un numpy array de 2 dmensiones (canales, perfiles, alturas)
448 data_spc = None
448 data_spc = None
449 # data cspc es un numpy array de 2 dmensiones (canales, pares, alturas)
449 # data cspc es un numpy array de 2 dmensiones (canales, pares, alturas)
450 data_cspc = None
450 data_cspc = None
451 # data dc es un numpy array de 2 dmensiones (canales, alturas)
451 # data dc es un numpy array de 2 dmensiones (canales, alturas)
452 data_dc = None
452 data_dc = None
453 # data power
453 # data power
454 data_pwr = None
454 data_pwr = None
455 nFFTPoints = None
455 nFFTPoints = None
456 # nPairs = None
456 # nPairs = None
457 pairsList = None
457 pairsList = None
458 nIncohInt = None
458 nIncohInt = None
459 wavelength = None # Necesario para cacular el rango de velocidad desde la frecuencia
459 wavelength = None # Necesario para cacular el rango de velocidad desde la frecuencia
460 nCohInt = None # se requiere para determinar el valor de timeInterval
460 nCohInt = None # se requiere para determinar el valor de timeInterval
461 ippFactor = None
461 ippFactor = None
462 profileIndex = 0
462 profileIndex = 0
463 plotting = "spectra"
463 plotting = "spectra"
464
464
465 def __init__(self):
465 def __init__(self):
466 '''
466 '''
467 Constructor
467 Constructor
468 '''
468 '''
469
469
470 self.useLocalTime = True
470 self.useLocalTime = True
471 self.radarControllerHeaderObj = RadarControllerHeader()
471 self.radarControllerHeaderObj = RadarControllerHeader()
472 self.systemHeaderObj = SystemHeader()
472 self.systemHeaderObj = SystemHeader()
473 self.type = "Spectra"
473 self.type = "Spectra"
474 # self.data = None
474 # self.data = None
475 # self.dtype = None
475 # self.dtype = None
476 # self.nChannels = 0
476 # self.nChannels = 0
477 # self.nHeights = 0
477 # self.nHeights = 0
478 self.nProfiles = None
478 self.nProfiles = None
479 self.heightList = None
479 self.heightList = None
480 self.channelList = None
480 self.channelList = None
481 # self.channelIndexList = None
481 # self.channelIndexList = None
482 self.pairsList = None
482 self.pairsList = None
483 self.flagNoData = True
483 self.flagNoData = True
484 self.flagDiscontinuousBlock = False
484 self.flagDiscontinuousBlock = False
485 self.utctime = None
485 self.utctime = None
486 self.nCohInt = None
486 self.nCohInt = None
487 self.nIncohInt = None
487 self.nIncohInt = None
488 self.blocksize = None
488 self.blocksize = None
489 self.nFFTPoints = None
489 self.nFFTPoints = None
490 self.wavelength = None
490 self.wavelength = None
491 self.flagDecodeData = False # asumo q la data no esta decodificada
491 self.flagDecodeData = False # asumo q la data no esta decodificada
492 self.flagDeflipData = False # asumo q la data no esta sin flip
492 self.flagDeflipData = False # asumo q la data no esta sin flip
493 self.flagShiftFFT = False
493 self.flagShiftFFT = False
494 self.ippFactor = 1
494 self.ippFactor = 1
495 #self.noise = None
495 #self.noise = None
496 self.beacon_heiIndexList = []
496 self.beacon_heiIndexList = []
497 self.noise_estimation = None
497 self.noise_estimation = None
498
498
499 def getNoisebyHildebrand(self, xmin_index=None, xmax_index=None, ymin_index=None, ymax_index=None):
499 def getNoisebyHildebrand(self, xmin_index=None, xmax_index=None, ymin_index=None, ymax_index=None):
500 """
500 """
501 Determino el nivel de ruido usando el metodo Hildebrand-Sekhon
501 Determino el nivel de ruido usando el metodo Hildebrand-Sekhon
502
502
503 Return:
503 Return:
504 noiselevel
504 noiselevel
505 """
505 """
506
506
507 noise = numpy.zeros(self.nChannels)
507 noise = numpy.zeros(self.nChannels)
508
508
509 for channel in range(self.nChannels):
509 for channel in range(self.nChannels):
510 daux = self.data_spc[channel,
510 daux = self.data_spc[channel,
511 xmin_index:xmax_index, ymin_index:ymax_index]
511 xmin_index:xmax_index, ymin_index:ymax_index]
512 noise[channel] = hildebrand_sekhon(daux, self.nIncohInt)
512 noise[channel] = hildebrand_sekhon(daux, self.nIncohInt)
513
513
514 return noise
514 return noise
515
515
516 def getNoise(self, xmin_index=None, xmax_index=None, ymin_index=None, ymax_index=None):
516 def getNoise(self, xmin_index=None, xmax_index=None, ymin_index=None, ymax_index=None):
517
517
518 if self.noise_estimation is not None:
518 if self.noise_estimation is not None:
519 # this was estimated by getNoise Operation defined in jroproc_spectra.py
519 # this was estimated by getNoise Operation defined in jroproc_spectra.py
520 return self.noise_estimation
520 return self.noise_estimation
521 else:
521 else:
522 noise = self.getNoisebyHildebrand(
522 noise = self.getNoisebyHildebrand(
523 xmin_index, xmax_index, ymin_index, ymax_index)
523 xmin_index, xmax_index, ymin_index, ymax_index)
524 return noise
524 return noise
525
525
526 def getFreqRangeTimeResponse(self, extrapoints=0):
526 def getFreqRangeTimeResponse(self, extrapoints=0):
527
527
528 deltafreq = self.getFmaxTimeResponse() / (self.nFFTPoints * self.ippFactor)
528 deltafreq = self.getFmaxTimeResponse() / (self.nFFTPoints * self.ippFactor)
529 freqrange = deltafreq * (numpy.arange(self.nFFTPoints + extrapoints) -self.nFFTPoints / 2.) - deltafreq / 2
529 freqrange = deltafreq * (numpy.arange(self.nFFTPoints + extrapoints) -self.nFFTPoints / 2.) - deltafreq / 2
530
530
531 return freqrange
531 return freqrange
532
532
533 def getAcfRange(self, extrapoints=0):
533 def getAcfRange(self, extrapoints=0):
534
534
535 deltafreq = 10. / (self.getFmax() / (self.nFFTPoints * self.ippFactor))
535 deltafreq = 10. / (self.getFmax() / (self.nFFTPoints * self.ippFactor))
536 freqrange = deltafreq * (numpy.arange(self.nFFTPoints + extrapoints) -self.nFFTPoints / 2.) - deltafreq / 2
536 freqrange = deltafreq * (numpy.arange(self.nFFTPoints + extrapoints) -self.nFFTPoints / 2.) - deltafreq / 2
537
537
538 return freqrange
538 return freqrange
539
539
540 def getFreqRange(self, extrapoints=0):
540 def getFreqRange(self, extrapoints=0):
541
541
542 deltafreq = self.getFmax() / (self.nFFTPoints * self.ippFactor)
542 deltafreq = self.getFmax() / (self.nFFTPoints * self.ippFactor)
543 freqrange = deltafreq * (numpy.arange(self.nFFTPoints + extrapoints) -self.nFFTPoints / 2.) - deltafreq / 2
543 freqrange = deltafreq * (numpy.arange(self.nFFTPoints + extrapoints) -self.nFFTPoints / 2.) - deltafreq / 2
544
544
545 return freqrange
545 return freqrange
546
546
547 def getVelRange(self, extrapoints=0):
547 def getVelRange(self, extrapoints=0):
548
548
549 deltav = self.getVmax() / (self.nFFTPoints * self.ippFactor)
549 deltav = self.getVmax() / (self.nFFTPoints * self.ippFactor)
550 velrange = deltav * (numpy.arange(self.nFFTPoints + extrapoints) - self.nFFTPoints / 2.)
550 velrange = deltav * (numpy.arange(self.nFFTPoints + extrapoints) - self.nFFTPoints / 2.)
551
551
552 if self.nmodes:
552 if self.nmodes:
553 return velrange/self.nmodes
553 return velrange/self.nmodes
554 else:
554 else:
555 return velrange
555 return velrange
556
556
557 def getNPairs(self):
557 def getNPairs(self):
558
558
559 return len(self.pairsList)
559 return len(self.pairsList)
560
560
561 def getPairsIndexList(self):
561 def getPairsIndexList(self):
562
562
563 return list(range(self.nPairs))
563 return list(range(self.nPairs))
564
564
565 def getNormFactor(self):
565 def getNormFactor(self):
566
566
567 pwcode = 1
567 pwcode = 1
568
568
569 if self.flagDecodeData:
569 if self.flagDecodeData:
570 pwcode = numpy.sum(self.code[0]**2)
570 pwcode = numpy.sum(self.code[0]**2)
571 #normFactor = min(self.nFFTPoints,self.nProfiles)*self.nIncohInt*self.nCohInt*pwcode*self.windowOfFilter
571 #normFactor = min(self.nFFTPoints,self.nProfiles)*self.nIncohInt*self.nCohInt*pwcode*self.windowOfFilter
572 normFactor = self.nProfiles * self.nIncohInt * self.nCohInt * pwcode * self.windowOfFilter
572 normFactor = self.nProfiles * self.nIncohInt * self.nCohInt * pwcode * self.windowOfFilter
573
573
574 return normFactor
574 return normFactor
575
575
576 def getFlagCspc(self):
576 def getFlagCspc(self):
577
577
578 if self.data_cspc is None:
578 if self.data_cspc is None:
579 return True
579 return True
580
580
581 return False
581 return False
582
582
583 def getFlagDc(self):
583 def getFlagDc(self):
584
584
585 if self.data_dc is None:
585 if self.data_dc is None:
586 return True
586 return True
587
587
588 return False
588 return False
589
589
590 def getTimeInterval(self):
590 def getTimeInterval(self):
591
591
592 timeInterval = self.ippSeconds * self.nCohInt * self.nIncohInt * self.nProfiles * self.ippFactor
592 timeInterval = self.ippSeconds * self.nCohInt * self.nIncohInt * self.nProfiles * self.ippFactor
593
593
594 return timeInterval
594 return timeInterval
595
595
596 def getPower(self):
596 def getPower(self):
597
597
598 factor = self.normFactor
598 factor = self.normFactor
599 z = self.data_spc / factor
599 z = self.data_spc / factor
600 z = numpy.where(numpy.isfinite(z), z, numpy.NAN)
600 z = numpy.where(numpy.isfinite(z), z, numpy.NAN)
601 avg = numpy.average(z, axis=1)
601 avg = numpy.average(z, axis=1)
602
602
603 return 10 * numpy.log10(avg)
603 return 10 * numpy.log10(avg)
604
604
605 def getCoherence(self, pairsList=None, phase=False):
605 def getCoherence(self, pairsList=None, phase=False):
606
606
607 z = []
607 z = []
608 if pairsList is None:
608 if pairsList is None:
609 pairsIndexList = self.pairsIndexList
609 pairsIndexList = self.pairsIndexList
610 else:
610 else:
611 pairsIndexList = []
611 pairsIndexList = []
612 for pair in pairsList:
612 for pair in pairsList:
613 if pair not in self.pairsList:
613 if pair not in self.pairsList:
614 raise ValueError("Pair %s is not in dataOut.pairsList" % (
614 raise ValueError("Pair %s is not in dataOut.pairsList" % (
615 pair))
615 pair))
616 pairsIndexList.append(self.pairsList.index(pair))
616 pairsIndexList.append(self.pairsList.index(pair))
617 for i in range(len(pairsIndexList)):
617 for i in range(len(pairsIndexList)):
618 pair = self.pairsList[pairsIndexList[i]]
618 pair = self.pairsList[pairsIndexList[i]]
619 ccf = numpy.average(self.data_cspc[pairsIndexList[i], :, :], axis=0)
619 ccf = numpy.average(self.data_cspc[pairsIndexList[i], :, :], axis=0)
620 powa = numpy.average(self.data_spc[pair[0], :, :], axis=0)
620 powa = numpy.average(self.data_spc[pair[0], :, :], axis=0)
621 powb = numpy.average(self.data_spc[pair[1], :, :], axis=0)
621 powb = numpy.average(self.data_spc[pair[1], :, :], axis=0)
622 avgcoherenceComplex = ccf / numpy.sqrt(powa * powb)
622 avgcoherenceComplex = ccf / numpy.sqrt(powa * powb)
623 if phase:
623 if phase:
624 data = numpy.arctan2(avgcoherenceComplex.imag,
624 data = numpy.arctan2(avgcoherenceComplex.imag,
625 avgcoherenceComplex.real) * 180 / numpy.pi
625 avgcoherenceComplex.real) * 180 / numpy.pi
626 else:
626 else:
627 data = numpy.abs(avgcoherenceComplex)
627 data = numpy.abs(avgcoherenceComplex)
628
628
629 z.append(data)
629 z.append(data)
630
630
631 return numpy.array(z)
631 return numpy.array(z)
632
632
633 def setValue(self, value):
633 def setValue(self, value):
634
634
635 print("This property should not be initialized")
635 print("This property should not be initialized")
636
636
637 return
637 return
638
638
639 nPairs = property(getNPairs, setValue, "I'm the 'nPairs' property.")
639 nPairs = property(getNPairs, setValue, "I'm the 'nPairs' property.")
640 pairsIndexList = property(
640 pairsIndexList = property(
641 getPairsIndexList, setValue, "I'm the 'pairsIndexList' property.")
641 getPairsIndexList, setValue, "I'm the 'pairsIndexList' property.")
642 normFactor = property(getNormFactor, setValue,
642 normFactor = property(getNormFactor, setValue,
643 "I'm the 'getNormFactor' property.")
643 "I'm the 'getNormFactor' property.")
644 flag_cspc = property(getFlagCspc, setValue)
644 flag_cspc = property(getFlagCspc, setValue)
645 flag_dc = property(getFlagDc, setValue)
645 flag_dc = property(getFlagDc, setValue)
646 noise = property(getNoise, setValue, "I'm the 'nHeights' property.")
646 noise = property(getNoise, setValue, "I'm the 'nHeights' property.")
647 timeInterval = property(getTimeInterval, setValue,
647 timeInterval = property(getTimeInterval, setValue,
648 "I'm the 'timeInterval' property")
648 "I'm the 'timeInterval' property")
649
649
650
650
651 class SpectraHeis(Spectra):
651 class SpectraHeis(Spectra):
652
652
653 data_spc = None
653 data_spc = None
654 data_cspc = None
654 data_cspc = None
655 data_dc = None
655 data_dc = None
656 nFFTPoints = None
656 nFFTPoints = None
657 # nPairs = None
657 # nPairs = None
658 pairsList = None
658 pairsList = None
659 nCohInt = None
659 nCohInt = None
660 nIncohInt = None
660 nIncohInt = None
661
661
662 def __init__(self):
662 def __init__(self):
663
663
664 self.radarControllerHeaderObj = RadarControllerHeader()
664 self.radarControllerHeaderObj = RadarControllerHeader()
665
665
666 self.systemHeaderObj = SystemHeader()
666 self.systemHeaderObj = SystemHeader()
667
667
668 self.type = "SpectraHeis"
668 self.type = "SpectraHeis"
669
669
670 # self.dtype = None
670 # self.dtype = None
671
671
672 # self.nChannels = 0
672 # self.nChannels = 0
673
673
674 # self.nHeights = 0
674 # self.nHeights = 0
675
675
676 self.nProfiles = None
676 self.nProfiles = None
677
677
678 self.heightList = None
678 self.heightList = None
679
679
680 self.channelList = None
680 self.channelList = None
681
681
682 # self.channelIndexList = None
682 # self.channelIndexList = None
683
683
684 self.flagNoData = True
684 self.flagNoData = True
685
685
686 self.flagDiscontinuousBlock = False
686 self.flagDiscontinuousBlock = False
687
687
688 # self.nPairs = 0
688 # self.nPairs = 0
689
689
690 self.utctime = None
690 self.utctime = None
691
691
692 self.blocksize = None
692 self.blocksize = None
693
693
694 self.profileIndex = 0
694 self.profileIndex = 0
695
695
696 self.nCohInt = 1
696 self.nCohInt = 1
697
697
698 self.nIncohInt = 1
698 self.nIncohInt = 1
699
699
700 def getNormFactor(self):
700 def getNormFactor(self):
701 pwcode = 1
701 pwcode = 1
702 if self.flagDecodeData:
702 if self.flagDecodeData:
703 pwcode = numpy.sum(self.code[0]**2)
703 pwcode = numpy.sum(self.code[0]**2)
704
704
705 normFactor = self.nIncohInt * self.nCohInt * pwcode
705 normFactor = self.nIncohInt * self.nCohInt * pwcode
706
706
707 return normFactor
707 return normFactor
708
708
709 def getTimeInterval(self):
709 def getTimeInterval(self):
710
710
711 timeInterval = self.ippSeconds * self.nCohInt * self.nIncohInt
711 timeInterval = self.ippSeconds * self.nCohInt * self.nIncohInt
712
712
713 return timeInterval
713 return timeInterval
714
714
715 normFactor = property(getNormFactor, "I'm the 'getNormFactor' property.")
715 normFactor = property(getNormFactor, "I'm the 'getNormFactor' property.")
716 timeInterval = property(getTimeInterval, "I'm the 'timeInterval' property")
716 timeInterval = property(getTimeInterval, "I'm the 'timeInterval' property")
717
717
718
718
719 class Fits(JROData):
719 class Fits(JROData):
720
720
721 heightList = None
721 heightList = None
722 channelList = None
722 channelList = None
723 flagNoData = True
723 flagNoData = True
724 flagDiscontinuousBlock = False
724 flagDiscontinuousBlock = False
725 useLocalTime = False
725 useLocalTime = False
726 utctime = None
726 utctime = None
727 timeZone = None
727 timeZone = None
728 # ippSeconds = None
728 # ippSeconds = None
729 # timeInterval = None
729 # timeInterval = None
730 nCohInt = None
730 nCohInt = None
731 nIncohInt = None
731 nIncohInt = None
732 noise = None
732 noise = None
733 windowOfFilter = 1
733 windowOfFilter = 1
734 # Speed of ligth
734 # Speed of ligth
735 C = 3e8
735 C = 3e8
736 frequency = 49.92e6
736 frequency = 49.92e6
737 realtime = False
737 realtime = False
738
738
739 def __init__(self):
739 def __init__(self):
740
740
741 self.type = "Fits"
741 self.type = "Fits"
742
742
743 self.nProfiles = None
743 self.nProfiles = None
744
744
745 self.heightList = None
745 self.heightList = None
746
746
747 self.channelList = None
747 self.channelList = None
748
748
749 # self.channelIndexList = None
749 # self.channelIndexList = None
750
750
751 self.flagNoData = True
751 self.flagNoData = True
752
752
753 self.utctime = None
753 self.utctime = None
754
754
755 self.nCohInt = 1
755 self.nCohInt = 1
756
756
757 self.nIncohInt = 1
757 self.nIncohInt = 1
758
758
759 self.useLocalTime = True
759 self.useLocalTime = True
760
760
761 self.profileIndex = 0
761 self.profileIndex = 0
762
762
763 # self.utctime = None
763 # self.utctime = None
764 # self.timeZone = None
764 # self.timeZone = None
765 # self.ltctime = None
765 # self.ltctime = None
766 # self.timeInterval = None
766 # self.timeInterval = None
767 # self.header = None
767 # self.header = None
768 # self.data_header = None
768 # self.data_header = None
769 # self.data = None
769 # self.data = None
770 # self.datatime = None
770 # self.datatime = None
771 # self.flagNoData = False
771 # self.flagNoData = False
772 # self.expName = ''
772 # self.expName = ''
773 # self.nChannels = None
773 # self.nChannels = None
774 # self.nSamples = None
774 # self.nSamples = None
775 # self.dataBlocksPerFile = None
775 # self.dataBlocksPerFile = None
776 # self.comments = ''
776 # self.comments = ''
777 #
777 #
778
778
779 def getltctime(self):
779 def getltctime(self):
780
780
781 if self.useLocalTime:
781 if self.useLocalTime:
782 return self.utctime - self.timeZone * 60
782 return self.utctime - self.timeZone * 60
783
783
784 return self.utctime
784 return self.utctime
785
785
786 def getDatatime(self):
786 def getDatatime(self):
787
787
788 datatime = datetime.datetime.utcfromtimestamp(self.ltctime)
788 datatime = datetime.datetime.utcfromtimestamp(self.ltctime)
789 return datatime
789 return datatime
790
790
791 def getTimeRange(self):
791 def getTimeRange(self):
792
792
793 datatime = []
793 datatime = []
794
794
795 datatime.append(self.ltctime)
795 datatime.append(self.ltctime)
796 datatime.append(self.ltctime + self.timeInterval)
796 datatime.append(self.ltctime + self.timeInterval)
797
797
798 datatime = numpy.array(datatime)
798 datatime = numpy.array(datatime)
799
799
800 return datatime
800 return datatime
801
801
802 def getHeiRange(self):
802 def getHeiRange(self):
803
803
804 heis = self.heightList
804 heis = self.heightList
805
805
806 return heis
806 return heis
807
807
808 def getNHeights(self):
808 def getNHeights(self):
809
809
810 return len(self.heightList)
810 return len(self.heightList)
811
811
812 def getNChannels(self):
812 def getNChannels(self):
813
813
814 return len(self.channelList)
814 return len(self.channelList)
815
815
816 def getChannelIndexList(self):
816 def getChannelIndexList(self):
817
817
818 return list(range(self.nChannels))
818 return list(range(self.nChannels))
819
819
820 def getNoise(self, type=1):
820 def getNoise(self, type=1):
821
821
822 #noise = numpy.zeros(self.nChannels)
822 #noise = numpy.zeros(self.nChannels)
823
823
824 if type == 1:
824 if type == 1:
825 noise = self.getNoisebyHildebrand()
825 noise = self.getNoisebyHildebrand()
826
826
827 if type == 2:
827 if type == 2:
828 noise = self.getNoisebySort()
828 noise = self.getNoisebySort()
829
829
830 if type == 3:
830 if type == 3:
831 noise = self.getNoisebyWindow()
831 noise = self.getNoisebyWindow()
832
832
833 return noise
833 return noise
834
834
835 def getTimeInterval(self):
835 def getTimeInterval(self):
836
836
837 timeInterval = self.ippSeconds * self.nCohInt * self.nIncohInt
837 timeInterval = self.ippSeconds * self.nCohInt * self.nIncohInt
838
838
839 return timeInterval
839 return timeInterval
840
840
841 def get_ippSeconds(self):
841 def get_ippSeconds(self):
842 '''
842 '''
843 '''
843 '''
844 return self.ipp_sec
844 return self.ipp_sec
845
845
846
846
847 datatime = property(getDatatime, "I'm the 'datatime' property")
847 datatime = property(getDatatime, "I'm the 'datatime' property")
848 nHeights = property(getNHeights, "I'm the 'nHeights' property.")
848 nHeights = property(getNHeights, "I'm the 'nHeights' property.")
849 nChannels = property(getNChannels, "I'm the 'nChannel' property.")
849 nChannels = property(getNChannels, "I'm the 'nChannel' property.")
850 channelIndexList = property(
850 channelIndexList = property(
851 getChannelIndexList, "I'm the 'channelIndexList' property.")
851 getChannelIndexList, "I'm the 'channelIndexList' property.")
852 noise = property(getNoise, "I'm the 'nHeights' property.")
852 noise = property(getNoise, "I'm the 'nHeights' property.")
853
853
854 ltctime = property(getltctime, "I'm the 'ltctime' property")
854 ltctime = property(getltctime, "I'm the 'ltctime' property")
855 timeInterval = property(getTimeInterval, "I'm the 'timeInterval' property")
855 timeInterval = property(getTimeInterval, "I'm the 'timeInterval' property")
856 ippSeconds = property(get_ippSeconds, '')
856 ippSeconds = property(get_ippSeconds, '')
857
857
858 class Correlation(JROData):
858 class Correlation(JROData):
859
859
860 noise = None
860 noise = None
861 SNR = None
861 SNR = None
862 #--------------------------------------------------
862 #--------------------------------------------------
863 mode = None
863 mode = None
864 split = False
864 split = False
865 data_cf = None
865 data_cf = None
866 lags = None
866 lags = None
867 lagRange = None
867 lagRange = None
868 pairsList = None
868 pairsList = None
869 normFactor = None
869 normFactor = None
870 #--------------------------------------------------
870 #--------------------------------------------------
871 # calculateVelocity = None
871 # calculateVelocity = None
872 nLags = None
872 nLags = None
873 nPairs = None
873 nPairs = None
874 nAvg = None
874 nAvg = None
875
875
876 def __init__(self):
876 def __init__(self):
877 '''
877 '''
878 Constructor
878 Constructor
879 '''
879 '''
880 self.radarControllerHeaderObj = RadarControllerHeader()
880 self.radarControllerHeaderObj = RadarControllerHeader()
881
881
882 self.systemHeaderObj = SystemHeader()
882 self.systemHeaderObj = SystemHeader()
883
883
884 self.type = "Correlation"
884 self.type = "Correlation"
885
885
886 self.data = None
886 self.data = None
887
887
888 self.dtype = None
888 self.dtype = None
889
889
890 self.nProfiles = None
890 self.nProfiles = None
891
891
892 self.heightList = None
892 self.heightList = None
893
893
894 self.channelList = None
894 self.channelList = None
895
895
896 self.flagNoData = True
896 self.flagNoData = True
897
897
898 self.flagDiscontinuousBlock = False
898 self.flagDiscontinuousBlock = False
899
899
900 self.utctime = None
900 self.utctime = None
901
901
902 self.timeZone = None
902 self.timeZone = None
903
903
904 self.dstFlag = None
904 self.dstFlag = None
905
905
906 self.errorCount = None
906 self.errorCount = None
907
907
908 self.blocksize = None
908 self.blocksize = None
909
909
910 self.flagDecodeData = False # asumo q la data no esta decodificada
910 self.flagDecodeData = False # asumo q la data no esta decodificada
911
911
912 self.flagDeflipData = False # asumo q la data no esta sin flip
912 self.flagDeflipData = False # asumo q la data no esta sin flip
913
913
914 self.pairsList = None
914 self.pairsList = None
915
915
916 self.nPoints = None
916 self.nPoints = None
917
917
918 def getPairsList(self):
918 def getPairsList(self):
919
919
920 return self.pairsList
920 return self.pairsList
921
921
922 def getNoise(self, mode=2):
922 def getNoise(self, mode=2):
923
923
924 indR = numpy.where(self.lagR == 0)[0][0]
924 indR = numpy.where(self.lagR == 0)[0][0]
925 indT = numpy.where(self.lagT == 0)[0][0]
925 indT = numpy.where(self.lagT == 0)[0][0]
926
926
927 jspectra0 = self.data_corr[:, :, indR, :]
927 jspectra0 = self.data_corr[:, :, indR, :]
928 jspectra = copy.copy(jspectra0)
928 jspectra = copy.copy(jspectra0)
929
929
930 num_chan = jspectra.shape[0]
930 num_chan = jspectra.shape[0]
931 num_hei = jspectra.shape[2]
931 num_hei = jspectra.shape[2]
932
932
933 freq_dc = jspectra.shape[1] / 2
933 freq_dc = jspectra.shape[1] / 2
934 ind_vel = numpy.array([-2, -1, 1, 2]) + freq_dc
934 ind_vel = numpy.array([-2, -1, 1, 2]) + freq_dc
935
935
936 if ind_vel[0] < 0:
936 if ind_vel[0] < 0:
937 ind_vel[list(range(0, 1))] = ind_vel[list(
937 ind_vel[list(range(0, 1))] = ind_vel[list(
938 range(0, 1))] + self.num_prof
938 range(0, 1))] + self.num_prof
939
939
940 if mode == 1:
940 if mode == 1:
941 jspectra[:, freq_dc, :] = (
941 jspectra[:, freq_dc, :] = (
942 jspectra[:, ind_vel[1], :] + jspectra[:, ind_vel[2], :]) / 2 # CORRECCION
942 jspectra[:, ind_vel[1], :] + jspectra[:, ind_vel[2], :]) / 2 # CORRECCION
943
943
944 if mode == 2:
944 if mode == 2:
945
945
946 vel = numpy.array([-2, -1, 1, 2])
946 vel = numpy.array([-2, -1, 1, 2])
947 xx = numpy.zeros([4, 4])
947 xx = numpy.zeros([4, 4])
948
948
949 for fil in range(4):
949 for fil in range(4):
950 xx[fil, :] = vel[fil]**numpy.asarray(list(range(4)))
950 xx[fil, :] = vel[fil]**numpy.asarray(list(range(4)))
951
951
952 xx_inv = numpy.linalg.inv(xx)
952 xx_inv = numpy.linalg.inv(xx)
953 xx_aux = xx_inv[0, :]
953 xx_aux = xx_inv[0, :]
954
954
955 for ich in range(num_chan):
955 for ich in range(num_chan):
956 yy = jspectra[ich, ind_vel, :]
956 yy = jspectra[ich, ind_vel, :]
957 jspectra[ich, freq_dc, :] = numpy.dot(xx_aux, yy)
957 jspectra[ich, freq_dc, :] = numpy.dot(xx_aux, yy)
958
958
959 junkid = jspectra[ich, freq_dc, :] <= 0
959 junkid = jspectra[ich, freq_dc, :] <= 0
960 cjunkid = sum(junkid)
960 cjunkid = sum(junkid)
961
961
962 if cjunkid.any():
962 if cjunkid.any():
963 jspectra[ich, freq_dc, junkid.nonzero()] = (
963 jspectra[ich, freq_dc, junkid.nonzero()] = (
964 jspectra[ich, ind_vel[1], junkid] + jspectra[ich, ind_vel[2], junkid]) / 2
964 jspectra[ich, ind_vel[1], junkid] + jspectra[ich, ind_vel[2], junkid]) / 2
965
965
966 noise = jspectra0[:, freq_dc, :] - jspectra[:, freq_dc, :]
966 noise = jspectra0[:, freq_dc, :] - jspectra[:, freq_dc, :]
967
967
968 return noise
968 return noise
969
969
970 def getTimeInterval(self):
970 def getTimeInterval(self):
971
971
972 timeInterval = self.ippSeconds * self.nCohInt * self.nProfiles
972 timeInterval = self.ippSeconds * self.nCohInt * self.nProfiles
973
973
974 return timeInterval
974 return timeInterval
975
975
976 def splitFunctions(self):
976 def splitFunctions(self):
977
977
978 pairsList = self.pairsList
978 pairsList = self.pairsList
979 ccf_pairs = []
979 ccf_pairs = []
980 acf_pairs = []
980 acf_pairs = []
981 ccf_ind = []
981 ccf_ind = []
982 acf_ind = []
982 acf_ind = []
983 for l in range(len(pairsList)):
983 for l in range(len(pairsList)):
984 chan0 = pairsList[l][0]
984 chan0 = pairsList[l][0]
985 chan1 = pairsList[l][1]
985 chan1 = pairsList[l][1]
986
986
987 # Obteniendo pares de Autocorrelacion
987 # Obteniendo pares de Autocorrelacion
988 if chan0 == chan1:
988 if chan0 == chan1:
989 acf_pairs.append(chan0)
989 acf_pairs.append(chan0)
990 acf_ind.append(l)
990 acf_ind.append(l)
991 else:
991 else:
992 ccf_pairs.append(pairsList[l])
992 ccf_pairs.append(pairsList[l])
993 ccf_ind.append(l)
993 ccf_ind.append(l)
994
994
995 data_acf = self.data_cf[acf_ind]
995 data_acf = self.data_cf[acf_ind]
996 data_ccf = self.data_cf[ccf_ind]
996 data_ccf = self.data_cf[ccf_ind]
997
997
998 return acf_ind, ccf_ind, acf_pairs, ccf_pairs, data_acf, data_ccf
998 return acf_ind, ccf_ind, acf_pairs, ccf_pairs, data_acf, data_ccf
999
999
1000 def getNormFactor(self):
1000 def getNormFactor(self):
1001 acf_ind, ccf_ind, acf_pairs, ccf_pairs, data_acf, data_ccf = self.splitFunctions()
1001 acf_ind, ccf_ind, acf_pairs, ccf_pairs, data_acf, data_ccf = self.splitFunctions()
1002 acf_pairs = numpy.array(acf_pairs)
1002 acf_pairs = numpy.array(acf_pairs)
1003 normFactor = numpy.zeros((self.nPairs, self.nHeights))
1003 normFactor = numpy.zeros((self.nPairs, self.nHeights))
1004
1004
1005 for p in range(self.nPairs):
1005 for p in range(self.nPairs):
1006 pair = self.pairsList[p]
1006 pair = self.pairsList[p]
1007
1007
1008 ch0 = pair[0]
1008 ch0 = pair[0]
1009 ch1 = pair[1]
1009 ch1 = pair[1]
1010
1010
1011 ch0_max = numpy.max(data_acf[acf_pairs == ch0, :, :], axis=1)
1011 ch0_max = numpy.max(data_acf[acf_pairs == ch0, :, :], axis=1)
1012 ch1_max = numpy.max(data_acf[acf_pairs == ch1, :, :], axis=1)
1012 ch1_max = numpy.max(data_acf[acf_pairs == ch1, :, :], axis=1)
1013 normFactor[p, :] = numpy.sqrt(ch0_max * ch1_max)
1013 normFactor[p, :] = numpy.sqrt(ch0_max * ch1_max)
1014
1014
1015 return normFactor
1015 return normFactor
1016
1016
1017 timeInterval = property(getTimeInterval, "I'm the 'timeInterval' property")
1017 timeInterval = property(getTimeInterval, "I'm the 'timeInterval' property")
1018 normFactor = property(getNormFactor, "I'm the 'normFactor property'")
1018 normFactor = property(getNormFactor, "I'm the 'normFactor property'")
1019
1019
1020
1020
1021 class Parameters(Spectra):
1021 class Parameters(Spectra):
1022
1022
1023 experimentInfo = None # Information about the experiment
1023 experimentInfo = None # Information about the experiment
1024 # Information from previous data
1024 # Information from previous data
1025 inputUnit = None # Type of data to be processed
1025 inputUnit = None # Type of data to be processed
1026 operation = None # Type of operation to parametrize
1026 operation = None # Type of operation to parametrize
1027 # normFactor = None #Normalization Factor
1027 # normFactor = None #Normalization Factor
1028 groupList = None # List of Pairs, Groups, etc
1028 groupList = None # List of Pairs, Groups, etc
1029 # Parameters
1029 # Parameters
1030 data_param = None # Parameters obtained
1030 data_param = None # Parameters obtained
1031 data_pre = None # Data Pre Parametrization
1031 data_pre = None # Data Pre Parametrization
1032 data_SNR = None # Signal to Noise Ratio
1032 data_SNR = None # Signal to Noise Ratio
1033 # heightRange = None #Heights
1033 # heightRange = None #Heights
1034 abscissaList = None # Abscissa, can be velocities, lags or time
1034 abscissaList = None # Abscissa, can be velocities, lags or time
1035 # noise = None #Noise Potency
1035 # noise = None #Noise Potency
1036 utctimeInit = None # Initial UTC time
1036 utctimeInit = None # Initial UTC time
1037 paramInterval = None # Time interval to calculate Parameters in seconds
1037 paramInterval = None # Time interval to calculate Parameters in seconds
1038 useLocalTime = True
1038 useLocalTime = True
1039 # Fitting
1039 # Fitting
1040 data_error = None # Error of the estimation
1040 data_error = None # Error of the estimation
1041 constants = None
1041 constants = None
1042 library = None
1042 library = None
1043 # Output signal
1043 # Output signal
1044 outputInterval = None # Time interval to calculate output signal in seconds
1044 outputInterval = None # Time interval to calculate output signal in seconds
1045 data_output = None # Out signal
1045 data_output = None # Out signal
1046 nAvg = None
1046 nAvg = None
1047 noise_estimation = None
1047 noise_estimation = None
1048 GauSPC = None # Fit gaussian SPC
1048 GauSPC = None # Fit gaussian SPC
1049
1049
1050 def __init__(self):
1050 def __init__(self):
1051 '''
1051 '''
1052 Constructor
1052 Constructor
1053 '''
1053 '''
1054 self.radarControllerHeaderObj = RadarControllerHeader()
1054 self.radarControllerHeaderObj = RadarControllerHeader()
1055
1055
1056 self.systemHeaderObj = SystemHeader()
1056 self.systemHeaderObj = SystemHeader()
1057
1057
1058 self.type = "Parameters"
1058 self.type = "Parameters"
1059
1059
1060 def getTimeRange1(self, interval):
1060 def getTimeRange1(self, interval):
1061
1061
1062 datatime = []
1062 datatime = []
1063
1063
1064 if self.useLocalTime:
1064 if self.useLocalTime:
1065 time1 = self.utctimeInit - self.timeZone * 60
1065 time1 = self.utctimeInit - self.timeZone * 60
1066 else:
1066 else:
1067 time1 = self.utctimeInit
1067 time1 = self.utctimeInit
1068
1068
1069 datatime.append(time1)
1069 datatime.append(time1)
1070 datatime.append(time1 + interval)
1070 datatime.append(time1 + interval)
1071 datatime = numpy.array(datatime)
1071 datatime = numpy.array(datatime)
1072
1072
1073 return datatime
1073 return datatime
1074
1074
1075 def getTimeInterval(self):
1075 def getTimeInterval(self):
1076
1076
1077 if hasattr(self, 'timeInterval1'):
1077 if hasattr(self, 'timeInterval1'):
1078 return self.timeInterval1
1078 return self.timeInterval1
1079 else:
1079 else:
1080 return self.paramInterval
1080 return self.paramInterval
1081
1081
1082 def setValue(self, value):
1082 def setValue(self, value):
1083
1083
1084 print("This property should not be initialized")
1084 print("This property should not be initialized")
1085
1085
1086 return
1086 return
1087
1087
1088 def getNoise(self):
1088 def getNoise(self):
1089
1089
1090 return self.spc_noise
1090 return self.spc_noise
1091
1091
1092 timeInterval = property(getTimeInterval)
1092 timeInterval = property(getTimeInterval)
1093 noise = property(getNoise, setValue, "I'm the 'Noise' property.")
1093 noise = property(getNoise, setValue, "I'm the 'Noise' property.")
1094
1094
1095
1095
1096 class PlotterData(object):
1096 class PlotterData(object):
1097 '''
1097 '''
1098 Object to hold data to be plotted
1098 Object to hold data to be plotted
1099 '''
1099 '''
1100
1100
1101 MAXNUMX = 100
1101 MAXNUMX = 100
1102 MAXNUMY = 100
1102 MAXNUMY = 100
1103
1103
1104 def __init__(self, code, throttle_value, exp_code, buffering=True):
1104 def __init__(self, code, throttle_value, exp_code, buffering=True):
1105
1105
1106 self.throttle = throttle_value
1106 self.throttle = throttle_value
1107 self.exp_code = exp_code
1107 self.exp_code = exp_code
1108 self.buffering = buffering
1108 self.buffering = buffering
1109 self.ready = False
1109 self.ready = False
1110 self.localtime = False
1110 self.localtime = False
1111 self.data = {}
1111 self.data = {}
1112 self.meta = {}
1112 self.meta = {}
1113 self.__times = []
1113 self.__times = []
1114 self.__heights = []
1114 self.__heights = []
1115
1115
1116 if 'snr' in code:
1116 if 'snr' in code:
1117 self.plottypes = ['snr']
1117 self.plottypes = ['snr']
1118 elif code == 'spc':
1118 elif code == 'spc':
1119 self.plottypes = ['spc', 'noise', 'rti']
1119 self.plottypes = ['spc', 'noise', 'rti']
1120 elif code == 'rti':
1120 elif code == 'rti':
1121 self.plottypes = ['noise', 'rti']
1121 self.plottypes = ['noise', 'rti']
1122 else:
1122 else:
1123 self.plottypes = [code]
1123 self.plottypes = [code]
1124
1124
1125 for plot in self.plottypes:
1125 for plot in self.plottypes:
1126 self.data[plot] = {}
1126 self.data[plot] = {}
1127
1127
1128 def __str__(self):
1128 def __str__(self):
1129 dum = ['{}{}'.format(key, self.shape(key)) for key in self.data]
1129 dum = ['{}{}'.format(key, self.shape(key)) for key in self.data]
1130 return 'Data[{}][{}]'.format(';'.join(dum), len(self.__times))
1130 return 'Data[{}][{}]'.format(';'.join(dum), len(self.__times))
1131
1131
1132 def __len__(self):
1132 def __len__(self):
1133 return len(self.__times)
1133 return len(self.__times)
1134
1134
1135 def __getitem__(self, key):
1135 def __getitem__(self, key):
1136
1136
1137 if key not in self.data:
1137 if key not in self.data:
1138 raise KeyError(log.error('Missing key: {}'.format(key)))
1138 raise KeyError(log.error('Missing key: {}'.format(key)))
1139 if 'spc' in key or not self.buffering:
1139 if 'spc' in key or not self.buffering:
1140 ret = self.data[key]
1140 ret = self.data[key]
1141 elif 'scope' in key:
1141 elif 'scope' in key:
1142 ret = numpy.array(self.data[key][float(self.tm)])
1142 ret = numpy.array(self.data[key][float(self.tm)])
1143 else:
1143 else:
1144 ret = numpy.array([self.data[key][x] for x in self.times])
1144 ret = numpy.array([self.data[key][x] for x in self.times])
1145 if ret.ndim > 1:
1145 if ret.ndim > 1:
1146 ret = numpy.swapaxes(ret, 0, 1)
1146 ret = numpy.swapaxes(ret, 0, 1)
1147 return ret
1147 return ret
1148
1148
1149 def __contains__(self, key):
1149 def __contains__(self, key):
1150 return key in self.data
1150 return key in self.data
1151
1151
1152 def setup(self):
1152 def setup(self):
1153 '''
1153 '''
1154 Configure object
1154 Configure object
1155 '''
1155 '''
1156
1156
1157 self.type = ''
1157 self.type = ''
1158 self.ready = False
1158 self.ready = False
1159 self.data = {}
1159 self.data = {}
1160 self.__times = []
1160 self.__times = []
1161 self.__heights = []
1161 self.__heights = []
1162 self.__all_heights = set()
1162 self.__all_heights = set()
1163 for plot in self.plottypes:
1163 for plot in self.plottypes:
1164 if 'snr' in plot:
1164 if 'snr' in plot:
1165 plot = 'snr'
1165 plot = 'snr'
1166 elif 'spc_moments' == plot:
1167 plot = 'moments'
1166 self.data[plot] = {}
1168 self.data[plot] = {}
1167
1169
1168 if 'spc' in self.data or 'rti' in self.data or 'cspc' in self.data:
1170 if 'spc' in self.data or 'rti' in self.data or 'cspc' in self.data or 'moments' in self.data:
1169 self.data['noise'] = {}
1171 self.data['noise'] = {}
1170 if 'noise' not in self.plottypes:
1172 if 'noise' not in self.plottypes:
1171 self.plottypes.append('noise')
1173 self.plottypes.append('noise')
1172
1174
1173 def shape(self, key):
1175 def shape(self, key):
1174 '''
1176 '''
1175 Get the shape of the one-element data for the given key
1177 Get the shape of the one-element data for the given key
1176 '''
1178 '''
1177
1179
1178 if len(self.data[key]):
1180 if len(self.data[key]):
1179 if 'spc' in key or not self.buffering:
1181 if 'spc' in key or not self.buffering:
1180 return self.data[key].shape
1182 return self.data[key].shape
1181 return self.data[key][self.__times[0]].shape
1183 return self.data[key][self.__times[0]].shape
1182 return (0,)
1184 return (0,)
1183
1185
1184 def update(self, dataOut, tm):
1186 def update(self, dataOut, tm):
1185 '''
1187 '''
1186 Update data object with new dataOut
1188 Update data object with new dataOut
1187 '''
1189 '''
1188
1190
1189 if tm in self.__times:
1191 if tm in self.__times:
1190 return
1192 return
1191 self.profileIndex = dataOut.profileIndex
1193 self.profileIndex = dataOut.profileIndex
1192 self.tm = tm
1194 self.tm = tm
1193 self.type = dataOut.type
1195 self.type = dataOut.type
1194 self.parameters = getattr(dataOut, 'parameters', [])
1196 self.parameters = getattr(dataOut, 'parameters', [])
1195 if hasattr(dataOut, 'pairsList'):
1197 if hasattr(dataOut, 'pairsList'):
1196 self.pairs = dataOut.pairsList
1198 self.pairs = dataOut.pairsList
1197 if hasattr(dataOut, 'meta'):
1199 if hasattr(dataOut, 'meta'):
1198 self.meta = dataOut.meta
1200 self.meta = dataOut.meta
1199 self.channels = dataOut.channelList
1201 self.channels = dataOut.channelList
1200 self.interval = dataOut.getTimeInterval()
1202 self.interval = dataOut.getTimeInterval()
1201 self.localtime = dataOut.useLocalTime
1203 self.localtime = dataOut.useLocalTime
1202 if 'spc' in self.plottypes or 'cspc' in self.plottypes:
1204 if 'spc' in self.plottypes or 'cspc' in self.plottypes or 'spc_moments' in self.plottypes:
1203 self.xrange = (dataOut.getFreqRange(1)/1000.,
1205 self.xrange = (dataOut.getFreqRange(1)/1000.,
1204 dataOut.getAcfRange(1), dataOut.getVelRange(1))
1206 dataOut.getAcfRange(1), dataOut.getVelRange(1))
1205 self.factor = dataOut.normFactor
1207 self.factor = dataOut.normFactor
1206 self.__heights.append(dataOut.heightList)
1208 self.__heights.append(dataOut.heightList)
1207 self.__all_heights.update(dataOut.heightList)
1209 self.__all_heights.update(dataOut.heightList)
1208 self.__times.append(tm)
1210 self.__times.append(tm)
1209
1211
1210 for plot in self.plottypes:
1212 for plot in self.plottypes:
1211 if plot == 'spc':
1213 if plot in ('spc', 'spc_moments'):
1212 z = dataOut.data_spc/dataOut.normFactor
1214 z = dataOut.data_spc/dataOut.normFactor
1213 buffer = 10*numpy.log10(z)
1215 buffer = 10*numpy.log10(z)
1214 if plot == 'cspc':
1216 if plot == 'cspc':
1215 z = dataOut.data_spc/dataOut.normFactor
1217 z = dataOut.data_spc/dataOut.normFactor
1216 buffer = (dataOut.data_spc, dataOut.data_cspc)
1218 buffer = (dataOut.data_spc, dataOut.data_cspc)
1217 if plot == 'noise':
1219 if plot == 'noise':
1218 buffer = 10*numpy.log10(dataOut.getNoise()/dataOut.normFactor)
1220 buffer = 10*numpy.log10(dataOut.getNoise()/dataOut.normFactor)
1219 if plot == 'rti':
1221 if plot == 'rti':
1220 buffer = dataOut.getPower()
1222 buffer = dataOut.getPower()
1221 if plot == 'snr_db':
1223 if plot == 'snr_db':
1222 buffer = dataOut.data_SNR
1224 buffer = dataOut.data_SNR
1223 if plot == 'snr':
1225 if plot == 'snr':
1224 buffer = 10*numpy.log10(dataOut.data_SNR)
1226 buffer = 10*numpy.log10(dataOut.data_SNR)
1225 if plot == 'dop':
1227 if plot == 'dop':
1226 buffer = 10*numpy.log10(dataOut.data_DOP)
1228 buffer = 10*numpy.log10(dataOut.data_DOP)
1227 if plot == 'mean':
1229 if plot == 'mean':
1228 buffer = dataOut.data_MEAN
1230 buffer = dataOut.data_MEAN
1229 if plot == 'std':
1231 if plot == 'std':
1230 buffer = dataOut.data_STD
1232 buffer = dataOut.data_STD
1231 if plot == 'coh':
1233 if plot == 'coh':
1232 buffer = dataOut.getCoherence()
1234 buffer = dataOut.getCoherence()
1233 if plot == 'phase':
1235 if plot == 'phase':
1234 buffer = dataOut.getCoherence(phase=True)
1236 buffer = dataOut.getCoherence(phase=True)
1235 if plot == 'output':
1237 if plot == 'output':
1236 buffer = dataOut.data_output
1238 buffer = dataOut.data_output
1237 if plot == 'param':
1239 if plot == 'param':
1238 buffer = dataOut.data_param
1240 buffer = dataOut.data_param
1239 if plot == 'scope':
1241 if plot == 'scope':
1240 buffer = dataOut.data
1242 buffer = dataOut.data
1241 self.flagDataAsBlock = dataOut.flagDataAsBlock
1243 self.flagDataAsBlock = dataOut.flagDataAsBlock
1242 self.nProfiles = dataOut.nProfiles
1244 self.nProfiles = dataOut.nProfiles
1243
1245
1244 if plot == 'spc':
1246 if plot == 'spc':
1245 self.data[plot] = buffer
1247 self.data[plot] = buffer
1246 elif plot == 'cspc':
1248 elif plot == 'cspc':
1247 self.data['spc'] = buffer[0]
1249 self.data['spc'] = buffer[0]
1248 self.data['cspc'] = buffer[1]
1250 self.data['cspc'] = buffer[1]
1251 elif plot == 'spc_moments':
1252 self.data['spc'] = buffer
1253 self.data['moments'][tm] = dataOut.moments
1249 else:
1254 else:
1250 if self.buffering:
1255 if self.buffering:
1251 self.data[plot][tm] = buffer
1256 self.data[plot][tm] = buffer
1252 else:
1257 else:
1253 self.data[plot] = buffer
1258 self.data[plot] = buffer
1254
1259
1255 def normalize_heights(self):
1260 def normalize_heights(self):
1256 '''
1261 '''
1257 Ensure same-dimension of the data for different heighList
1262 Ensure same-dimension of the data for different heighList
1258 '''
1263 '''
1259
1264
1260 H = numpy.array(list(self.__all_heights))
1265 H = numpy.array(list(self.__all_heights))
1261 H.sort()
1266 H.sort()
1262 for key in self.data:
1267 for key in self.data:
1263 shape = self.shape(key)[:-1] + H.shape
1268 shape = self.shape(key)[:-1] + H.shape
1264 for tm, obj in list(self.data[key].items()):
1269 for tm, obj in list(self.data[key].items()):
1265 h = self.__heights[self.__times.index(tm)]
1270 h = self.__heights[self.__times.index(tm)]
1266 if H.size == h.size:
1271 if H.size == h.size:
1267 continue
1272 continue
1268 index = numpy.where(numpy.in1d(H, h))[0]
1273 index = numpy.where(numpy.in1d(H, h))[0]
1269 dummy = numpy.zeros(shape) + numpy.nan
1274 dummy = numpy.zeros(shape) + numpy.nan
1270 if len(shape) == 2:
1275 if len(shape) == 2:
1271 dummy[:, index] = obj
1276 dummy[:, index] = obj
1272 else:
1277 else:
1273 dummy[index] = obj
1278 dummy[index] = obj
1274 self.data[key][tm] = dummy
1279 self.data[key][tm] = dummy
1275
1280
1276 self.__heights = [H for tm in self.__times]
1281 self.__heights = [H for tm in self.__times]
1277
1282
1278 def jsonify(self, decimate=False):
1283 def jsonify(self, decimate=False):
1279 '''
1284 '''
1280 Convert data to json
1285 Convert data to json
1281 '''
1286 '''
1282
1287
1283 data = {}
1288 data = {}
1284 tm = self.times[-1]
1289 tm = self.times[-1]
1285 dy = int(self.heights.size/self.MAXNUMY) + 1
1290 dy = int(self.heights.size/self.MAXNUMY) + 1
1286 for key in self.data:
1291 for key in self.data:
1287 if key in ('spc', 'cspc') or not self.buffering:
1292 if key in ('spc', 'cspc') or not self.buffering:
1288 dx = int(self.data[key].shape[1]/self.MAXNUMX) + 1
1293 dx = int(self.data[key].shape[1]/self.MAXNUMX) + 1
1289 data[key] = self.roundFloats(
1294 data[key] = self.roundFloats(
1290 self.data[key][::, ::dx, ::dy].tolist())
1295 self.data[key][::, ::dx, ::dy].tolist())
1291 else:
1296 else:
1292 data[key] = self.roundFloats(self.data[key][tm].tolist())
1297 data[key] = self.roundFloats(self.data[key][tm].tolist())
1293
1298
1294 ret = {'data': data}
1299 ret = {'data': data}
1295 ret['exp_code'] = self.exp_code
1300 ret['exp_code'] = self.exp_code
1296 ret['time'] = float(tm)
1301 ret['time'] = float(tm)
1297 ret['interval'] = float(self.interval)
1302 ret['interval'] = float(self.interval)
1298 ret['localtime'] = self.localtime
1303 ret['localtime'] = self.localtime
1299 ret['yrange'] = self.roundFloats(self.heights[::dy].tolist())
1304 ret['yrange'] = self.roundFloats(self.heights[::dy].tolist())
1300 if 'spc' in self.data or 'cspc' in self.data:
1305 if 'spc' in self.data or 'cspc' in self.data:
1301 ret['xrange'] = self.roundFloats(self.xrange[2][::dx].tolist())
1306 ret['xrange'] = self.roundFloats(self.xrange[2][::dx].tolist())
1302 else:
1307 else:
1303 ret['xrange'] = []
1308 ret['xrange'] = []
1304 if hasattr(self, 'pairs'):
1309 if hasattr(self, 'pairs'):
1305 ret['pairs'] = [(int(p[0]), int(p[1])) for p in self.pairs]
1310 ret['pairs'] = [(int(p[0]), int(p[1])) for p in self.pairs]
1306 else:
1311 else:
1307 ret['pairs'] = []
1312 ret['pairs'] = []
1308
1313
1309 for key, value in list(self.meta.items()):
1314 for key, value in list(self.meta.items()):
1310 ret[key] = value
1315 ret[key] = value
1311
1316
1312 return json.dumps(ret)
1317 return json.dumps(ret)
1313
1318
1314 @property
1319 @property
1315 def times(self):
1320 def times(self):
1316 '''
1321 '''
1317 Return the list of times of the current data
1322 Return the list of times of the current data
1318 '''
1323 '''
1319
1324
1320 ret = numpy.array(self.__times)
1325 ret = numpy.array(self.__times)
1321 ret.sort()
1326 ret.sort()
1322 return ret
1327 return ret
1323
1328
1324 @property
1329 @property
1325 def min_time(self):
1330 def min_time(self):
1326 '''
1331 '''
1327 Return the minimun time value
1332 Return the minimun time value
1328 '''
1333 '''
1329
1334
1330 return self.times[0]
1335 return self.times[0]
1331
1336
1332 @property
1337 @property
1333 def max_time(self):
1338 def max_time(self):
1334 '''
1339 '''
1335 Return the maximun time value
1340 Return the maximun time value
1336 '''
1341 '''
1337
1342
1338 return self.times[-1]
1343 return self.times[-1]
1339
1344
1340 @property
1345 @property
1341 def heights(self):
1346 def heights(self):
1342 '''
1347 '''
1343 Return the list of heights of the current data
1348 Return the list of heights of the current data
1344 '''
1349 '''
1345
1350
1346 return numpy.array(self.__heights[-1])
1351 return numpy.array(self.__heights[-1])
1347
1352
1348 @staticmethod
1353 @staticmethod
1349 def roundFloats(obj):
1354 def roundFloats(obj):
1350 if isinstance(obj, list):
1355 if isinstance(obj, list):
1351 return list(map(PlotterData.roundFloats, obj))
1356 return list(map(PlotterData.roundFloats, obj))
1352 elif isinstance(obj, float):
1357 elif isinstance(obj, float):
1353 return round(obj, 2)
1358 return round(obj, 2)
@@ -1,748 +1,747
1 '''
1 '''
2 New Plots Operations
2 New Plots Operations
3
3
4 @author: juan.espinoza@jro.igp.gob.pe
4 @author: juan.espinoza@jro.igp.gob.pe
5 '''
5 '''
6
6
7
7
8 import time
8 import time
9 import datetime
9 import datetime
10 import numpy
10 import numpy
11
11
12 from schainpy.model.graphics.jroplot_base import Plot, plt
12 from schainpy.model.graphics.jroplot_base import Plot, plt
13 from schainpy.utils import log
13 from schainpy.utils import log
14
14
15 EARTH_RADIUS = 6.3710e3
15 EARTH_RADIUS = 6.3710e3
16
16
17
17
18 def ll2xy(lat1, lon1, lat2, lon2):
18 def ll2xy(lat1, lon1, lat2, lon2):
19
19
20 p = 0.017453292519943295
20 p = 0.017453292519943295
21 a = 0.5 - numpy.cos((lat2 - lat1) * p)/2 + numpy.cos(lat1 * p) * \
21 a = 0.5 - numpy.cos((lat2 - lat1) * p)/2 + numpy.cos(lat1 * p) * \
22 numpy.cos(lat2 * p) * (1 - numpy.cos((lon2 - lon1) * p)) / 2
22 numpy.cos(lat2 * p) * (1 - numpy.cos((lon2 - lon1) * p)) / 2
23 r = 12742 * numpy.arcsin(numpy.sqrt(a))
23 r = 12742 * numpy.arcsin(numpy.sqrt(a))
24 theta = numpy.arctan2(numpy.sin((lon2-lon1)*p)*numpy.cos(lat2*p), numpy.cos(lat1*p)
24 theta = numpy.arctan2(numpy.sin((lon2-lon1)*p)*numpy.cos(lat2*p), numpy.cos(lat1*p)
25 * numpy.sin(lat2*p)-numpy.sin(lat1*p)*numpy.cos(lat2*p)*numpy.cos((lon2-lon1)*p))
25 * numpy.sin(lat2*p)-numpy.sin(lat1*p)*numpy.cos(lat2*p)*numpy.cos((lon2-lon1)*p))
26 theta = -theta + numpy.pi/2
26 theta = -theta + numpy.pi/2
27 return r*numpy.cos(theta), r*numpy.sin(theta)
27 return r*numpy.cos(theta), r*numpy.sin(theta)
28
28
29
29
30 def km2deg(km):
30 def km2deg(km):
31 '''
31 '''
32 Convert distance in km to degrees
32 Convert distance in km to degrees
33 '''
33 '''
34
34
35 return numpy.rad2deg(km/EARTH_RADIUS)
35 return numpy.rad2deg(km/EARTH_RADIUS)
36
36
37
37
38 class SpectraPlot(Plot):
38 class SpectraPlot(Plot):
39 '''
39 '''
40 Plot for Spectra data
40 Plot for Spectra data
41 '''
41 '''
42
42
43 CODE = 'spc'
43 CODE = 'spc'
44 colormap = 'jro'
44 colormap = 'jro'
45
45
46 def setup(self):
46 def setup(self):
47 self.nplots = len(self.data.channels)
47 self.nplots = len(self.data.channels)
48 self.ncols = int(numpy.sqrt(self.nplots) + 0.9)
48 self.ncols = int(numpy.sqrt(self.nplots) + 0.9)
49 self.nrows = int((1.0 * self.nplots / self.ncols) + 0.9)
49 self.nrows = int((1.0 * self.nplots / self.ncols) + 0.9)
50 self.width = 3.4 * self.ncols
50 self.width = 3.4 * self.ncols
51 self.height = 3 * self.nrows
51 self.height = 3 * self.nrows
52 self.cb_label = 'dB'
52 self.cb_label = 'dB'
53 if self.showprofile:
53 if self.showprofile:
54 self.width += 0.8 * self.ncols
54 self.width += 0.8 * self.ncols
55
55
56 self.ylabel = 'Range [km]'
56 self.ylabel = 'Range [km]'
57
57
58 def plot(self):
58 def plot(self):
59 if self.xaxis == "frequency":
59 if self.xaxis == "frequency":
60 x = self.data.xrange[0]
60 x = self.data.xrange[0]
61 self.xlabel = "Frequency (kHz)"
61 self.xlabel = "Frequency (kHz)"
62 elif self.xaxis == "time":
62 elif self.xaxis == "time":
63 x = self.data.xrange[1]
63 x = self.data.xrange[1]
64 self.xlabel = "Time (ms)"
64 self.xlabel = "Time (ms)"
65 else:
65 else:
66 x = self.data.xrange[2]
66 x = self.data.xrange[2]
67 self.xlabel = "Velocity (m/s)"
67 self.xlabel = "Velocity (m/s)"
68
68
69 if self.CODE == 'spc_mean':
69 if self.CODE == 'spc_moments':
70 x = self.data.xrange[2]
70 x = self.data.xrange[2]
71 self.xlabel = "Velocity (m/s)"
71 self.xlabel = "Velocity (m/s)"
72
72
73 self.titles = []
73 self.titles = []
74
74
75 y = self.data.heights
75 y = self.data.heights
76 self.y = y
76 self.y = y
77 z = self.data['spc']
77 z = self.data['spc']
78
78
79 for n, ax in enumerate(self.axes):
79 for n, ax in enumerate(self.axes):
80 noise = self.data['noise'][n][-1]
80 noise = self.data['noise'][n][-1]
81 if self.CODE == 'spc_mean':
81 if self.CODE == 'spc_moments':
82 mean = self.data['mean'][n][-1]
82 mean = self.data['moments'][n, :, 1, :][-1]
83 if ax.firsttime:
83 if ax.firsttime:
84 self.xmax = self.xmax if self.xmax else numpy.nanmax(x)
84 self.xmax = self.xmax if self.xmax else numpy.nanmax(x)
85 self.xmin = self.xmin if self.xmin else -self.xmax
85 self.xmin = self.xmin if self.xmin else -self.xmax
86 self.zmin = self.zmin if self.zmin else numpy.nanmin(z)
86 self.zmin = self.zmin if self.zmin else numpy.nanmin(z)
87 self.zmax = self.zmax if self.zmax else numpy.nanmax(z)
87 self.zmax = self.zmax if self.zmax else numpy.nanmax(z)
88 ax.plt = ax.pcolormesh(x, y, z[n].T,
88 ax.plt = ax.pcolormesh(x, y, z[n].T,
89 vmin=self.zmin,
89 vmin=self.zmin,
90 vmax=self.zmax,
90 vmax=self.zmax,
91 cmap=plt.get_cmap(self.colormap)
91 cmap=plt.get_cmap(self.colormap)
92 )
92 )
93
93
94 if self.showprofile:
94 if self.showprofile:
95 ax.plt_profile = self.pf_axes[n].plot(
95 ax.plt_profile = self.pf_axes[n].plot(
96 self.data['rti'][n][-1], y)[0]
96 self.data['rti'][n][-1], y)[0]
97 ax.plt_noise = self.pf_axes[n].plot(numpy.repeat(noise, len(y)), y,
97 ax.plt_noise = self.pf_axes[n].plot(numpy.repeat(noise, len(y)), y,
98 color="k", linestyle="dashed", lw=1)[0]
98 color="k", linestyle="dashed", lw=1)[0]
99 if self.CODE == 'spc_mean':
99 if self.CODE == 'spc_moments':
100 ax.plt_mean = ax.plot(mean, y, color='k')[0]
100 ax.plt_mean = ax.plot(mean, y, color='k')[0]
101 else:
101 else:
102 ax.plt.set_array(z[n].T.ravel())
102 ax.plt.set_array(z[n].T.ravel())
103 if self.showprofile:
103 if self.showprofile:
104 ax.plt_profile.set_data(self.data['rti'][n][-1], y)
104 ax.plt_profile.set_data(self.data['rti'][n][-1], y)
105 ax.plt_noise.set_data(numpy.repeat(noise, len(y)), y)
105 ax.plt_noise.set_data(numpy.repeat(noise, len(y)), y)
106 if self.CODE == 'spc_mean':
106 if self.CODE == 'spc_moments':
107 ax.plt_mean.set_data(mean, y)
107 ax.plt_mean.set_data(mean, y)
108
109 self.titles.append('CH {}: {:3.2f}dB'.format(n, noise))
108 self.titles.append('CH {}: {:3.2f}dB'.format(n, noise))
110
109
111
110
112 class CrossSpectraPlot(Plot):
111 class CrossSpectraPlot(Plot):
113
112
114 CODE = 'cspc'
113 CODE = 'cspc'
115 colormap = 'jet'
114 colormap = 'jet'
116 zmin_coh = None
115 zmin_coh = None
117 zmax_coh = None
116 zmax_coh = None
118 zmin_phase = None
117 zmin_phase = None
119 zmax_phase = None
118 zmax_phase = None
120
119
121 def setup(self):
120 def setup(self):
122
121
123 self.ncols = 4
122 self.ncols = 4
124 self.nrows = len(self.data.pairs)
123 self.nrows = len(self.data.pairs)
125 self.nplots = self.nrows * 4
124 self.nplots = self.nrows * 4
126 self.width = 3.4 * self.ncols
125 self.width = 3.4 * self.ncols
127 self.height = 3 * self.nrows
126 self.height = 3 * self.nrows
128 self.ylabel = 'Range [km]'
127 self.ylabel = 'Range [km]'
129 self.showprofile = False
128 self.showprofile = False
130
129
131 def plot(self):
130 def plot(self):
132
131
133 if self.xaxis == "frequency":
132 if self.xaxis == "frequency":
134 x = self.data.xrange[0]
133 x = self.data.xrange[0]
135 self.xlabel = "Frequency (kHz)"
134 self.xlabel = "Frequency (kHz)"
136 elif self.xaxis == "time":
135 elif self.xaxis == "time":
137 x = self.data.xrange[1]
136 x = self.data.xrange[1]
138 self.xlabel = "Time (ms)"
137 self.xlabel = "Time (ms)"
139 else:
138 else:
140 x = self.data.xrange[2]
139 x = self.data.xrange[2]
141 self.xlabel = "Velocity (m/s)"
140 self.xlabel = "Velocity (m/s)"
142
141
143 self.titles = []
142 self.titles = []
144
143
145 y = self.data.heights
144 y = self.data.heights
146 self.y = y
145 self.y = y
147 spc = self.data['spc']
146 spc = self.data['spc']
148 cspc = self.data['cspc']
147 cspc = self.data['cspc']
149
148
150 for n in range(self.nrows):
149 for n in range(self.nrows):
151 noise = self.data['noise'][n][-1]
150 noise = self.data['noise'][n][-1]
152 pair = self.data.pairs[n]
151 pair = self.data.pairs[n]
153 ax = self.axes[4 * n]
152 ax = self.axes[4 * n]
154 spc0 = 10.*numpy.log10(spc[pair[0]]/self.data.factor)
153 spc0 = 10.*numpy.log10(spc[pair[0]]/self.data.factor)
155 if ax.firsttime:
154 if ax.firsttime:
156 self.xmax = self.xmax if self.xmax else numpy.nanmax(x)
155 self.xmax = self.xmax if self.xmax else numpy.nanmax(x)
157 self.xmin = self.xmin if self.xmin else -self.xmax
156 self.xmin = self.xmin if self.xmin else -self.xmax
158 self.zmin = self.zmin if self.zmin else numpy.nanmin(spc)
157 self.zmin = self.zmin if self.zmin else numpy.nanmin(spc)
159 self.zmax = self.zmax if self.zmax else numpy.nanmax(spc)
158 self.zmax = self.zmax if self.zmax else numpy.nanmax(spc)
160 ax.plt = ax.pcolormesh(x , y , spc0.T,
159 ax.plt = ax.pcolormesh(x , y , spc0.T,
161 vmin=self.zmin,
160 vmin=self.zmin,
162 vmax=self.zmax,
161 vmax=self.zmax,
163 cmap=plt.get_cmap(self.colormap)
162 cmap=plt.get_cmap(self.colormap)
164 )
163 )
165 else:
164 else:
166 ax.plt.set_array(spc0.T.ravel())
165 ax.plt.set_array(spc0.T.ravel())
167 self.titles.append('CH {}: {:3.2f}dB'.format(pair[0], noise))
166 self.titles.append('CH {}: {:3.2f}dB'.format(pair[0], noise))
168
167
169 ax = self.axes[4 * n + 1]
168 ax = self.axes[4 * n + 1]
170 spc1 = 10.*numpy.log10(spc[pair[1]]/self.data.factor)
169 spc1 = 10.*numpy.log10(spc[pair[1]]/self.data.factor)
171 if ax.firsttime:
170 if ax.firsttime:
172 ax.plt = ax.pcolormesh(x , y, spc1.T,
171 ax.plt = ax.pcolormesh(x , y, spc1.T,
173 vmin=self.zmin,
172 vmin=self.zmin,
174 vmax=self.zmax,
173 vmax=self.zmax,
175 cmap=plt.get_cmap(self.colormap)
174 cmap=plt.get_cmap(self.colormap)
176 )
175 )
177 else:
176 else:
178 ax.plt.set_array(spc1.T.ravel())
177 ax.plt.set_array(spc1.T.ravel())
179 self.titles.append('CH {}: {:3.2f}dB'.format(pair[1], noise))
178 self.titles.append('CH {}: {:3.2f}dB'.format(pair[1], noise))
180
179
181 out = cspc[n] / numpy.sqrt(spc[pair[0]] * spc[pair[1]])
180 out = cspc[n] / numpy.sqrt(spc[pair[0]] * spc[pair[1]])
182 coh = numpy.abs(out)
181 coh = numpy.abs(out)
183 phase = numpy.arctan2(out.imag, out.real) * 180 / numpy.pi
182 phase = numpy.arctan2(out.imag, out.real) * 180 / numpy.pi
184
183
185 ax = self.axes[4 * n + 2]
184 ax = self.axes[4 * n + 2]
186 if ax.firsttime:
185 if ax.firsttime:
187 ax.plt = ax.pcolormesh(x, y, coh.T,
186 ax.plt = ax.pcolormesh(x, y, coh.T,
188 vmin=0,
187 vmin=0,
189 vmax=1,
188 vmax=1,
190 cmap=plt.get_cmap(self.colormap_coh)
189 cmap=plt.get_cmap(self.colormap_coh)
191 )
190 )
192 else:
191 else:
193 ax.plt.set_array(coh.T.ravel())
192 ax.plt.set_array(coh.T.ravel())
194 self.titles.append(
193 self.titles.append(
195 'Coherence Ch{} * Ch{}'.format(pair[0], pair[1]))
194 'Coherence Ch{} * Ch{}'.format(pair[0], pair[1]))
196
195
197 ax = self.axes[4 * n + 3]
196 ax = self.axes[4 * n + 3]
198 if ax.firsttime:
197 if ax.firsttime:
199 ax.plt = ax.pcolormesh(x, y, phase.T,
198 ax.plt = ax.pcolormesh(x, y, phase.T,
200 vmin=-180,
199 vmin=-180,
201 vmax=180,
200 vmax=180,
202 cmap=plt.get_cmap(self.colormap_phase)
201 cmap=plt.get_cmap(self.colormap_phase)
203 )
202 )
204 else:
203 else:
205 ax.plt.set_array(phase.T.ravel())
204 ax.plt.set_array(phase.T.ravel())
206 self.titles.append('Phase CH{} * CH{}'.format(pair[0], pair[1]))
205 self.titles.append('Phase CH{} * CH{}'.format(pair[0], pair[1]))
207
206
208
207
209 class SpectraMeanPlot(SpectraPlot):
208 class SpectralMomentsPlot(SpectraPlot):
210 '''
209 '''
211 Plot for Spectra and Mean
210 Plot for Spectral Moments
212 '''
211 '''
213 CODE = 'spc_mean'
212 CODE = 'spc_moments'
214 colormap = 'jro'
213 colormap = 'jro'
215
214
216
215
217 class RTIPlot(Plot):
216 class RTIPlot(Plot):
218 '''
217 '''
219 Plot for RTI data
218 Plot for RTI data
220 '''
219 '''
221
220
222 CODE = 'rti'
221 CODE = 'rti'
223 colormap = 'jro'
222 colormap = 'jro'
224
223
225 def setup(self):
224 def setup(self):
226 self.xaxis = 'time'
225 self.xaxis = 'time'
227 self.ncols = 1
226 self.ncols = 1
228 self.nrows = len(self.data.channels)
227 self.nrows = len(self.data.channels)
229 self.nplots = len(self.data.channels)
228 self.nplots = len(self.data.channels)
230 self.ylabel = 'Range [km]'
229 self.ylabel = 'Range [km]'
231 self.cb_label = 'dB'
230 self.cb_label = 'dB'
232 self.titles = ['{} Channel {}'.format(
231 self.titles = ['{} Channel {}'.format(
233 self.CODE.upper(), x) for x in range(self.nrows)]
232 self.CODE.upper(), x) for x in range(self.nrows)]
234
233
235 def plot(self):
234 def plot(self):
236 self.x = self.data.times
235 self.x = self.data.times
237 self.y = self.data.heights
236 self.y = self.data.heights
238 self.z = self.data[self.CODE]
237 self.z = self.data[self.CODE]
239 self.z = numpy.ma.masked_invalid(self.z)
238 self.z = numpy.ma.masked_invalid(self.z)
240
239
241 if self.decimation is None:
240 if self.decimation is None:
242 x, y, z = self.fill_gaps(self.x, self.y, self.z)
241 x, y, z = self.fill_gaps(self.x, self.y, self.z)
243 else:
242 else:
244 x, y, z = self.fill_gaps(*self.decimate())
243 x, y, z = self.fill_gaps(*self.decimate())
245
244
246 for n, ax in enumerate(self.axes):
245 for n, ax in enumerate(self.axes):
247 self.zmin = self.zmin if self.zmin else numpy.min(self.z)
246 self.zmin = self.zmin if self.zmin else numpy.min(self.z)
248 self.zmax = self.zmax if self.zmax else numpy.max(self.z)
247 self.zmax = self.zmax if self.zmax else numpy.max(self.z)
249 if ax.firsttime:
248 if ax.firsttime:
250 ax.plt = ax.pcolormesh(x, y, z[n].T,
249 ax.plt = ax.pcolormesh(x, y, z[n].T,
251 vmin=self.zmin,
250 vmin=self.zmin,
252 vmax=self.zmax,
251 vmax=self.zmax,
253 cmap=plt.get_cmap(self.colormap)
252 cmap=plt.get_cmap(self.colormap)
254 )
253 )
255 if self.showprofile:
254 if self.showprofile:
256 ax.plot_profile = self.pf_axes[n].plot(
255 ax.plot_profile = self.pf_axes[n].plot(
257 self.data['rti'][n][-1], self.y)[0]
256 self.data['rti'][n][-1], self.y)[0]
258 ax.plot_noise = self.pf_axes[n].plot(numpy.repeat(self.data['noise'][n][-1], len(self.y)), self.y,
257 ax.plot_noise = self.pf_axes[n].plot(numpy.repeat(self.data['noise'][n][-1], len(self.y)), self.y,
259 color="k", linestyle="dashed", lw=1)[0]
258 color="k", linestyle="dashed", lw=1)[0]
260 else:
259 else:
261 ax.collections.remove(ax.collections[0])
260 ax.collections.remove(ax.collections[0])
262 ax.plt = ax.pcolormesh(x, y, z[n].T,
261 ax.plt = ax.pcolormesh(x, y, z[n].T,
263 vmin=self.zmin,
262 vmin=self.zmin,
264 vmax=self.zmax,
263 vmax=self.zmax,
265 cmap=plt.get_cmap(self.colormap)
264 cmap=plt.get_cmap(self.colormap)
266 )
265 )
267 if self.showprofile:
266 if self.showprofile:
268 ax.plot_profile.set_data(self.data['rti'][n][-1], self.y)
267 ax.plot_profile.set_data(self.data['rti'][n][-1], self.y)
269 ax.plot_noise.set_data(numpy.repeat(
268 ax.plot_noise.set_data(numpy.repeat(
270 self.data['noise'][n][-1], len(self.y)), self.y)
269 self.data['noise'][n][-1], len(self.y)), self.y)
271
270
272
271
273 class CoherencePlot(RTIPlot):
272 class CoherencePlot(RTIPlot):
274 '''
273 '''
275 Plot for Coherence data
274 Plot for Coherence data
276 '''
275 '''
277
276
278 CODE = 'coh'
277 CODE = 'coh'
279
278
280 def setup(self):
279 def setup(self):
281 self.xaxis = 'time'
280 self.xaxis = 'time'
282 self.ncols = 1
281 self.ncols = 1
283 self.nrows = len(self.data.pairs)
282 self.nrows = len(self.data.pairs)
284 self.nplots = len(self.data.pairs)
283 self.nplots = len(self.data.pairs)
285 self.ylabel = 'Range [km]'
284 self.ylabel = 'Range [km]'
286 if self.CODE == 'coh':
285 if self.CODE == 'coh':
287 self.cb_label = ''
286 self.cb_label = ''
288 self.titles = [
287 self.titles = [
289 'Coherence Map Ch{} * Ch{}'.format(x[0], x[1]) for x in self.data.pairs]
288 'Coherence Map Ch{} * Ch{}'.format(x[0], x[1]) for x in self.data.pairs]
290 else:
289 else:
291 self.cb_label = 'Degrees'
290 self.cb_label = 'Degrees'
292 self.titles = [
291 self.titles = [
293 'Phase Map Ch{} * Ch{}'.format(x[0], x[1]) for x in self.data.pairs]
292 'Phase Map Ch{} * Ch{}'.format(x[0], x[1]) for x in self.data.pairs]
294
293
295
294
296 class PhasePlot(CoherencePlot):
295 class PhasePlot(CoherencePlot):
297 '''
296 '''
298 Plot for Phase map data
297 Plot for Phase map data
299 '''
298 '''
300
299
301 CODE = 'phase'
300 CODE = 'phase'
302 colormap = 'seismic'
301 colormap = 'seismic'
303
302
304
303
305 class NoisePlot(Plot):
304 class NoisePlot(Plot):
306 '''
305 '''
307 Plot for noise
306 Plot for noise
308 '''
307 '''
309
308
310 CODE = 'noise'
309 CODE = 'noise'
311
310
312 def setup(self):
311 def setup(self):
313 self.xaxis = 'time'
312 self.xaxis = 'time'
314 self.ncols = 1
313 self.ncols = 1
315 self.nrows = 1
314 self.nrows = 1
316 self.nplots = 1
315 self.nplots = 1
317 self.ylabel = 'Intensity [dB]'
316 self.ylabel = 'Intensity [dB]'
318 self.titles = ['Noise']
317 self.titles = ['Noise']
319 self.colorbar = False
318 self.colorbar = False
320
319
321 def plot(self):
320 def plot(self):
322
321
323 x = self.data.times
322 x = self.data.times
324 xmin = self.data.min_time
323 xmin = self.data.min_time
325 xmax = xmin + self.xrange * 60 * 60
324 xmax = xmin + self.xrange * 60 * 60
326 Y = self.data[self.CODE]
325 Y = self.data[self.CODE]
327
326
328 if self.axes[0].firsttime:
327 if self.axes[0].firsttime:
329 for ch in self.data.channels:
328 for ch in self.data.channels:
330 y = Y[ch]
329 y = Y[ch]
331 self.axes[0].plot(x, y, lw=1, label='Ch{}'.format(ch))
330 self.axes[0].plot(x, y, lw=1, label='Ch{}'.format(ch))
332 plt.legend()
331 plt.legend()
333 else:
332 else:
334 for ch in self.data.channels:
333 for ch in self.data.channels:
335 y = Y[ch]
334 y = Y[ch]
336 self.axes[0].lines[ch].set_data(x, y)
335 self.axes[0].lines[ch].set_data(x, y)
337
336
338 self.ymin = numpy.nanmin(Y) - 5
337 self.ymin = numpy.nanmin(Y) - 5
339 self.ymax = numpy.nanmax(Y) + 5
338 self.ymax = numpy.nanmax(Y) + 5
340
339
341
340
342 class SnrPlot(RTIPlot):
341 class SnrPlot(RTIPlot):
343 '''
342 '''
344 Plot for SNR Data
343 Plot for SNR Data
345 '''
344 '''
346
345
347 CODE = 'snr'
346 CODE = 'snr'
348 colormap = 'jet'
347 colormap = 'jet'
349
348
350
349
351 class DopplerPlot(RTIPlot):
350 class DopplerPlot(RTIPlot):
352 '''
351 '''
353 Plot for DOPPLER Data
352 Plot for DOPPLER Data
354 '''
353 '''
355
354
356 CODE = 'dop'
355 CODE = 'dop'
357 colormap = 'jet'
356 colormap = 'jet'
358
357
359
358
360 class SkyMapPlot(Plot):
359 class SkyMapPlot(Plot):
361 '''
360 '''
362 Plot for meteors detection data
361 Plot for meteors detection data
363 '''
362 '''
364
363
365 CODE = 'param'
364 CODE = 'param'
366
365
367 def setup(self):
366 def setup(self):
368
367
369 self.ncols = 1
368 self.ncols = 1
370 self.nrows = 1
369 self.nrows = 1
371 self.width = 7.2
370 self.width = 7.2
372 self.height = 7.2
371 self.height = 7.2
373 self.nplots = 1
372 self.nplots = 1
374 self.xlabel = 'Zonal Zenith Angle (deg)'
373 self.xlabel = 'Zonal Zenith Angle (deg)'
375 self.ylabel = 'Meridional Zenith Angle (deg)'
374 self.ylabel = 'Meridional Zenith Angle (deg)'
376 self.polar = True
375 self.polar = True
377 self.ymin = -180
376 self.ymin = -180
378 self.ymax = 180
377 self.ymax = 180
379 self.colorbar = False
378 self.colorbar = False
380
379
381 def plot(self):
380 def plot(self):
382
381
383 arrayParameters = numpy.concatenate(self.data['param'])
382 arrayParameters = numpy.concatenate(self.data['param'])
384 error = arrayParameters[:, -1]
383 error = arrayParameters[:, -1]
385 indValid = numpy.where(error == 0)[0]
384 indValid = numpy.where(error == 0)[0]
386 finalMeteor = arrayParameters[indValid, :]
385 finalMeteor = arrayParameters[indValid, :]
387 finalAzimuth = finalMeteor[:, 3]
386 finalAzimuth = finalMeteor[:, 3]
388 finalZenith = finalMeteor[:, 4]
387 finalZenith = finalMeteor[:, 4]
389
388
390 x = finalAzimuth * numpy.pi / 180
389 x = finalAzimuth * numpy.pi / 180
391 y = finalZenith
390 y = finalZenith
392
391
393 ax = self.axes[0]
392 ax = self.axes[0]
394
393
395 if ax.firsttime:
394 if ax.firsttime:
396 ax.plot = ax.plot(x, y, 'bo', markersize=5)[0]
395 ax.plot = ax.plot(x, y, 'bo', markersize=5)[0]
397 else:
396 else:
398 ax.plot.set_data(x, y)
397 ax.plot.set_data(x, y)
399
398
400 dt1 = self.getDateTime(self.data.min_time).strftime('%y/%m/%d %H:%M:%S')
399 dt1 = self.getDateTime(self.data.min_time).strftime('%y/%m/%d %H:%M:%S')
401 dt2 = self.getDateTime(self.data.max_time).strftime('%y/%m/%d %H:%M:%S')
400 dt2 = self.getDateTime(self.data.max_time).strftime('%y/%m/%d %H:%M:%S')
402 title = 'Meteor Detection Sky Map\n %s - %s \n Number of events: %5.0f\n' % (dt1,
401 title = 'Meteor Detection Sky Map\n %s - %s \n Number of events: %5.0f\n' % (dt1,
403 dt2,
402 dt2,
404 len(x))
403 len(x))
405 self.titles[0] = title
404 self.titles[0] = title
406
405
407
406
408 class ParametersPlot(RTIPlot):
407 class ParametersPlot(RTIPlot):
409 '''
408 '''
410 Plot for data_param object
409 Plot for data_param object
411 '''
410 '''
412
411
413 CODE = 'param'
412 CODE = 'param'
414 colormap = 'seismic'
413 colormap = 'seismic'
415
414
416 def setup(self):
415 def setup(self):
417 self.xaxis = 'time'
416 self.xaxis = 'time'
418 self.ncols = 1
417 self.ncols = 1
419 self.nrows = self.data.shape(self.CODE)[0]
418 self.nrows = self.data.shape(self.CODE)[0]
420 self.nplots = self.nrows
419 self.nplots = self.nrows
421 if self.showSNR:
420 if self.showSNR:
422 self.nrows += 1
421 self.nrows += 1
423 self.nplots += 1
422 self.nplots += 1
424
423
425 self.ylabel = 'Height [km]'
424 self.ylabel = 'Height [km]'
426 if not self.titles:
425 if not self.titles:
427 self.titles = self.data.parameters \
426 self.titles = self.data.parameters \
428 if self.data.parameters else ['Param {}'.format(x) for x in range(self.nrows)]
427 if self.data.parameters else ['Param {}'.format(x) for x in range(self.nrows)]
429 if self.showSNR:
428 if self.showSNR:
430 self.titles.append('SNR')
429 self.titles.append('SNR')
431
430
432 def plot(self):
431 def plot(self):
433 self.data.normalize_heights()
432 self.data.normalize_heights()
434 self.x = self.data.times
433 self.x = self.data.times
435 self.y = self.data.heights
434 self.y = self.data.heights
436 if self.showSNR:
435 if self.showSNR:
437 self.z = numpy.concatenate(
436 self.z = numpy.concatenate(
438 (self.data[self.CODE], self.data['snr'])
437 (self.data[self.CODE], self.data['snr'])
439 )
438 )
440 else:
439 else:
441 self.z = self.data[self.CODE]
440 self.z = self.data[self.CODE]
442
441
443 self.z = numpy.ma.masked_invalid(self.z)
442 self.z = numpy.ma.masked_invalid(self.z)
444
443
445 if self.decimation is None:
444 if self.decimation is None:
446 x, y, z = self.fill_gaps(self.x, self.y, self.z)
445 x, y, z = self.fill_gaps(self.x, self.y, self.z)
447 else:
446 else:
448 x, y, z = self.fill_gaps(*self.decimate())
447 x, y, z = self.fill_gaps(*self.decimate())
449
448
450 for n, ax in enumerate(self.axes):
449 for n, ax in enumerate(self.axes):
451
450
452 self.zmax = self.zmax if self.zmax is not None else numpy.max(
451 self.zmax = self.zmax if self.zmax is not None else numpy.max(
453 self.z[n])
452 self.z[n])
454 self.zmin = self.zmin if self.zmin is not None else numpy.min(
453 self.zmin = self.zmin if self.zmin is not None else numpy.min(
455 self.z[n])
454 self.z[n])
456
455
457 if ax.firsttime:
456 if ax.firsttime:
458 if self.zlimits is not None:
457 if self.zlimits is not None:
459 self.zmin, self.zmax = self.zlimits[n]
458 self.zmin, self.zmax = self.zlimits[n]
460
459
461 ax.plt = ax.pcolormesh(x, y, z[n].T * self.factors[n],
460 ax.plt = ax.pcolormesh(x, y, z[n].T * self.factors[n],
462 vmin=self.zmin,
461 vmin=self.zmin,
463 vmax=self.zmax,
462 vmax=self.zmax,
464 cmap=self.cmaps[n]
463 cmap=self.cmaps[n]
465 )
464 )
466 else:
465 else:
467 if self.zlimits is not None:
466 if self.zlimits is not None:
468 self.zmin, self.zmax = self.zlimits[n]
467 self.zmin, self.zmax = self.zlimits[n]
469 ax.collections.remove(ax.collections[0])
468 ax.collections.remove(ax.collections[0])
470 ax.plt = ax.pcolormesh(x, y, z[n].T * self.factors[n],
469 ax.plt = ax.pcolormesh(x, y, z[n].T * self.factors[n],
471 vmin=self.zmin,
470 vmin=self.zmin,
472 vmax=self.zmax,
471 vmax=self.zmax,
473 cmap=self.cmaps[n]
472 cmap=self.cmaps[n]
474 )
473 )
475
474
476
475
477 class OutputPlot(ParametersPlot):
476 class OutputPlot(ParametersPlot):
478 '''
477 '''
479 Plot data_output object
478 Plot data_output object
480 '''
479 '''
481
480
482 CODE = 'output'
481 CODE = 'output'
483 colormap = 'seismic'
482 colormap = 'seismic'
484
483
485
484
486 class PolarMapPlot(Plot):
485 class PolarMapPlot(Plot):
487 '''
486 '''
488 Plot for weather radar
487 Plot for weather radar
489 '''
488 '''
490
489
491 CODE = 'param'
490 CODE = 'param'
492 colormap = 'seismic'
491 colormap = 'seismic'
493
492
494 def setup(self):
493 def setup(self):
495 self.ncols = 1
494 self.ncols = 1
496 self.nrows = 1
495 self.nrows = 1
497 self.width = 9
496 self.width = 9
498 self.height = 8
497 self.height = 8
499 self.mode = self.data.meta['mode']
498 self.mode = self.data.meta['mode']
500 if self.channels is not None:
499 if self.channels is not None:
501 self.nplots = len(self.channels)
500 self.nplots = len(self.channels)
502 self.nrows = len(self.channels)
501 self.nrows = len(self.channels)
503 else:
502 else:
504 self.nplots = self.data.shape(self.CODE)[0]
503 self.nplots = self.data.shape(self.CODE)[0]
505 self.nrows = self.nplots
504 self.nrows = self.nplots
506 self.channels = list(range(self.nplots))
505 self.channels = list(range(self.nplots))
507 if self.mode == 'E':
506 if self.mode == 'E':
508 self.xlabel = 'Longitude'
507 self.xlabel = 'Longitude'
509 self.ylabel = 'Latitude'
508 self.ylabel = 'Latitude'
510 else:
509 else:
511 self.xlabel = 'Range (km)'
510 self.xlabel = 'Range (km)'
512 self.ylabel = 'Height (km)'
511 self.ylabel = 'Height (km)'
513 self.bgcolor = 'white'
512 self.bgcolor = 'white'
514 self.cb_labels = self.data.meta['units']
513 self.cb_labels = self.data.meta['units']
515 self.lat = self.data.meta['latitude']
514 self.lat = self.data.meta['latitude']
516 self.lon = self.data.meta['longitude']
515 self.lon = self.data.meta['longitude']
517 self.xmin, self.xmax = float(
516 self.xmin, self.xmax = float(
518 km2deg(self.xmin) + self.lon), float(km2deg(self.xmax) + self.lon)
517 km2deg(self.xmin) + self.lon), float(km2deg(self.xmax) + self.lon)
519 self.ymin, self.ymax = float(
518 self.ymin, self.ymax = float(
520 km2deg(self.ymin) + self.lat), float(km2deg(self.ymax) + self.lat)
519 km2deg(self.ymin) + self.lat), float(km2deg(self.ymax) + self.lat)
521 # self.polar = True
520 # self.polar = True
522
521
523 def plot(self):
522 def plot(self):
524
523
525 for n, ax in enumerate(self.axes):
524 for n, ax in enumerate(self.axes):
526 data = self.data['param'][self.channels[n]]
525 data = self.data['param'][self.channels[n]]
527
526
528 zeniths = numpy.linspace(
527 zeniths = numpy.linspace(
529 0, self.data.meta['max_range'], data.shape[1])
528 0, self.data.meta['max_range'], data.shape[1])
530 if self.mode == 'E':
529 if self.mode == 'E':
531 azimuths = -numpy.radians(self.data.heights)+numpy.pi/2
530 azimuths = -numpy.radians(self.data.heights)+numpy.pi/2
532 r, theta = numpy.meshgrid(zeniths, azimuths)
531 r, theta = numpy.meshgrid(zeniths, azimuths)
533 x, y = r*numpy.cos(theta)*numpy.cos(numpy.radians(self.data.meta['elevation'])), r*numpy.sin(
532 x, y = r*numpy.cos(theta)*numpy.cos(numpy.radians(self.data.meta['elevation'])), r*numpy.sin(
534 theta)*numpy.cos(numpy.radians(self.data.meta['elevation']))
533 theta)*numpy.cos(numpy.radians(self.data.meta['elevation']))
535 x = km2deg(x) + self.lon
534 x = km2deg(x) + self.lon
536 y = km2deg(y) + self.lat
535 y = km2deg(y) + self.lat
537 else:
536 else:
538 azimuths = numpy.radians(self.data.heights)
537 azimuths = numpy.radians(self.data.heights)
539 r, theta = numpy.meshgrid(zeniths, azimuths)
538 r, theta = numpy.meshgrid(zeniths, azimuths)
540 x, y = r*numpy.cos(theta), r*numpy.sin(theta)
539 x, y = r*numpy.cos(theta), r*numpy.sin(theta)
541 self.y = zeniths
540 self.y = zeniths
542
541
543 if ax.firsttime:
542 if ax.firsttime:
544 if self.zlimits is not None:
543 if self.zlimits is not None:
545 self.zmin, self.zmax = self.zlimits[n]
544 self.zmin, self.zmax = self.zlimits[n]
546 ax.plt = ax.pcolormesh( # r, theta, numpy.ma.array(data, mask=numpy.isnan(data)),
545 ax.plt = ax.pcolormesh( # r, theta, numpy.ma.array(data, mask=numpy.isnan(data)),
547 x, y, numpy.ma.array(data, mask=numpy.isnan(data)),
546 x, y, numpy.ma.array(data, mask=numpy.isnan(data)),
548 vmin=self.zmin,
547 vmin=self.zmin,
549 vmax=self.zmax,
548 vmax=self.zmax,
550 cmap=self.cmaps[n])
549 cmap=self.cmaps[n])
551 else:
550 else:
552 if self.zlimits is not None:
551 if self.zlimits is not None:
553 self.zmin, self.zmax = self.zlimits[n]
552 self.zmin, self.zmax = self.zlimits[n]
554 ax.collections.remove(ax.collections[0])
553 ax.collections.remove(ax.collections[0])
555 ax.plt = ax.pcolormesh( # r, theta, numpy.ma.array(data, mask=numpy.isnan(data)),
554 ax.plt = ax.pcolormesh( # r, theta, numpy.ma.array(data, mask=numpy.isnan(data)),
556 x, y, numpy.ma.array(data, mask=numpy.isnan(data)),
555 x, y, numpy.ma.array(data, mask=numpy.isnan(data)),
557 vmin=self.zmin,
556 vmin=self.zmin,
558 vmax=self.zmax,
557 vmax=self.zmax,
559 cmap=self.cmaps[n])
558 cmap=self.cmaps[n])
560
559
561 if self.mode == 'A':
560 if self.mode == 'A':
562 continue
561 continue
563
562
564 # plot district names
563 # plot district names
565 f = open('/data/workspace/schain_scripts/distrito.csv')
564 f = open('/data/workspace/schain_scripts/distrito.csv')
566 for line in f:
565 for line in f:
567 label, lon, lat = [s.strip() for s in line.split(',') if s]
566 label, lon, lat = [s.strip() for s in line.split(',') if s]
568 lat = float(lat)
567 lat = float(lat)
569 lon = float(lon)
568 lon = float(lon)
570 # ax.plot(lon, lat, '.b', ms=2)
569 # ax.plot(lon, lat, '.b', ms=2)
571 ax.text(lon, lat, label.decode('utf8'), ha='center',
570 ax.text(lon, lat, label.decode('utf8'), ha='center',
572 va='bottom', size='8', color='black')
571 va='bottom', size='8', color='black')
573
572
574 # plot limites
573 # plot limites
575 limites = []
574 limites = []
576 tmp = []
575 tmp = []
577 for line in open('/data/workspace/schain_scripts/lima.csv'):
576 for line in open('/data/workspace/schain_scripts/lima.csv'):
578 if '#' in line:
577 if '#' in line:
579 if tmp:
578 if tmp:
580 limites.append(tmp)
579 limites.append(tmp)
581 tmp = []
580 tmp = []
582 continue
581 continue
583 values = line.strip().split(',')
582 values = line.strip().split(',')
584 tmp.append((float(values[0]), float(values[1])))
583 tmp.append((float(values[0]), float(values[1])))
585 for points in limites:
584 for points in limites:
586 ax.add_patch(
585 ax.add_patch(
587 Polygon(points, ec='k', fc='none', ls='--', lw=0.5))
586 Polygon(points, ec='k', fc='none', ls='--', lw=0.5))
588
587
589 # plot Cuencas
588 # plot Cuencas
590 for cuenca in ('rimac', 'lurin', 'mala', 'chillon', 'chilca', 'chancay-huaral'):
589 for cuenca in ('rimac', 'lurin', 'mala', 'chillon', 'chilca', 'chancay-huaral'):
591 f = open('/data/workspace/schain_scripts/{}.csv'.format(cuenca))
590 f = open('/data/workspace/schain_scripts/{}.csv'.format(cuenca))
592 values = [line.strip().split(',') for line in f]
591 values = [line.strip().split(',') for line in f]
593 points = [(float(s[0]), float(s[1])) for s in values]
592 points = [(float(s[0]), float(s[1])) for s in values]
594 ax.add_patch(Polygon(points, ec='b', fc='none'))
593 ax.add_patch(Polygon(points, ec='b', fc='none'))
595
594
596 # plot grid
595 # plot grid
597 for r in (15, 30, 45, 60):
596 for r in (15, 30, 45, 60):
598 ax.add_artist(plt.Circle((self.lon, self.lat),
597 ax.add_artist(plt.Circle((self.lon, self.lat),
599 km2deg(r), color='0.6', fill=False, lw=0.2))
598 km2deg(r), color='0.6', fill=False, lw=0.2))
600 ax.text(
599 ax.text(
601 self.lon + (km2deg(r))*numpy.cos(60*numpy.pi/180),
600 self.lon + (km2deg(r))*numpy.cos(60*numpy.pi/180),
602 self.lat + (km2deg(r))*numpy.sin(60*numpy.pi/180),
601 self.lat + (km2deg(r))*numpy.sin(60*numpy.pi/180),
603 '{}km'.format(r),
602 '{}km'.format(r),
604 ha='center', va='bottom', size='8', color='0.6', weight='heavy')
603 ha='center', va='bottom', size='8', color='0.6', weight='heavy')
605
604
606 if self.mode == 'E':
605 if self.mode == 'E':
607 title = 'El={}$^\circ$'.format(self.data.meta['elevation'])
606 title = 'El={}$^\circ$'.format(self.data.meta['elevation'])
608 label = 'E{:02d}'.format(int(self.data.meta['elevation']))
607 label = 'E{:02d}'.format(int(self.data.meta['elevation']))
609 else:
608 else:
610 title = 'Az={}$^\circ$'.format(self.data.meta['azimuth'])
609 title = 'Az={}$^\circ$'.format(self.data.meta['azimuth'])
611 label = 'A{:02d}'.format(int(self.data.meta['azimuth']))
610 label = 'A{:02d}'.format(int(self.data.meta['azimuth']))
612
611
613 self.save_labels = ['{}-{}'.format(lbl, label) for lbl in self.labels]
612 self.save_labels = ['{}-{}'.format(lbl, label) for lbl in self.labels]
614 self.titles = ['{} {}'.format(
613 self.titles = ['{} {}'.format(
615 self.data.parameters[x], title) for x in self.channels]
614 self.data.parameters[x], title) for x in self.channels]
616
615
617 class ScopePlot(Plot):
616 class ScopePlot(Plot):
618
617
619 '''
618 '''
620 Plot for Scope
619 Plot for Scope
621 '''
620 '''
622
621
623 CODE = 'scope'
622 CODE = 'scope'
624
623
625 def setup(self):
624 def setup(self):
626
625
627 self.xaxis = 'Range (Km)'
626 self.xaxis = 'Range (Km)'
628 self.ncols = 1
627 self.ncols = 1
629 self.nrows = 1
628 self.nrows = 1
630 self.nplots = 1
629 self.nplots = 1
631 self.ylabel = 'Intensity [dB]'
630 self.ylabel = 'Intensity [dB]'
632 self.titles = ['Scope']
631 self.titles = ['Scope']
633 self.colorbar = False
632 self.colorbar = False
634 colspan = 3
633 colspan = 3
635 rowspan = 1
634 rowspan = 1
636
635
637 def plot_iq(self, x, y, channelIndexList, thisDatetime, wintitle):
636 def plot_iq(self, x, y, channelIndexList, thisDatetime, wintitle):
638
637
639 yreal = y[channelIndexList,:].real
638 yreal = y[channelIndexList,:].real
640 yimag = y[channelIndexList,:].imag
639 yimag = y[channelIndexList,:].imag
641 title = wintitle + " Scope: %s" %(thisDatetime.strftime("%d-%b-%Y"))
640 title = wintitle + " Scope: %s" %(thisDatetime.strftime("%d-%b-%Y"))
642 self.xlabel = "Range (Km)"
641 self.xlabel = "Range (Km)"
643 self.ylabel = "Intensity - IQ"
642 self.ylabel = "Intensity - IQ"
644
643
645 self.y = yreal
644 self.y = yreal
646 self.x = x
645 self.x = x
647 self.xmin = min(x)
646 self.xmin = min(x)
648 self.xmax = max(x)
647 self.xmax = max(x)
649
648
650
649
651 self.titles[0] = title
650 self.titles[0] = title
652
651
653 for i,ax in enumerate(self.axes):
652 for i,ax in enumerate(self.axes):
654 title = "Channel %d" %(i)
653 title = "Channel %d" %(i)
655 if ax.firsttime:
654 if ax.firsttime:
656 ax.plt_r = ax.plot(x, yreal[i,:], color='b')[0]
655 ax.plt_r = ax.plot(x, yreal[i,:], color='b')[0]
657 ax.plt_i = ax.plot(x, yimag[i,:], color='r')[0]
656 ax.plt_i = ax.plot(x, yimag[i,:], color='r')[0]
658 else:
657 else:
659 #pass
658 #pass
660 ax.plt_r.set_data(x, yreal[i,:])
659 ax.plt_r.set_data(x, yreal[i,:])
661 ax.plt_i.set_data(x, yimag[i,:])
660 ax.plt_i.set_data(x, yimag[i,:])
662
661
663 def plot_power(self, x, y, channelIndexList, thisDatetime, wintitle):
662 def plot_power(self, x, y, channelIndexList, thisDatetime, wintitle):
664 y = y[channelIndexList,:] * numpy.conjugate(y[channelIndexList,:])
663 y = y[channelIndexList,:] * numpy.conjugate(y[channelIndexList,:])
665 yreal = y.real
664 yreal = y.real
666 self.y = yreal
665 self.y = yreal
667 title = wintitle + " Scope: %s" %(thisDatetime.strftime("%d-%b-%Y"))
666 title = wintitle + " Scope: %s" %(thisDatetime.strftime("%d-%b-%Y"))
668 self.xlabel = "Range (Km)"
667 self.xlabel = "Range (Km)"
669 self.ylabel = "Intensity"
668 self.ylabel = "Intensity"
670 self.xmin = min(x)
669 self.xmin = min(x)
671 self.xmax = max(x)
670 self.xmax = max(x)
672
671
673
672
674 self.titles[0] = title
673 self.titles[0] = title
675
674
676 for i,ax in enumerate(self.axes):
675 for i,ax in enumerate(self.axes):
677 title = "Channel %d" %(i)
676 title = "Channel %d" %(i)
678
677
679 ychannel = yreal[i,:]
678 ychannel = yreal[i,:]
680
679
681 if ax.firsttime:
680 if ax.firsttime:
682 ax.plt_r = ax.plot(x, ychannel)[0]
681 ax.plt_r = ax.plot(x, ychannel)[0]
683 else:
682 else:
684 #pass
683 #pass
685 ax.plt_r.set_data(x, ychannel)
684 ax.plt_r.set_data(x, ychannel)
686
685
687
686
688 def plot(self):
687 def plot(self):
689
688
690 if self.channels:
689 if self.channels:
691 channels = self.channels
690 channels = self.channels
692 else:
691 else:
693 channels = self.data.channels
692 channels = self.data.channels
694
693
695
694
696
695
697 thisDatetime = datetime.datetime.utcfromtimestamp(self.data.times[-1])
696 thisDatetime = datetime.datetime.utcfromtimestamp(self.data.times[-1])
698
697
699 scope = self.data['scope']
698 scope = self.data['scope']
700
699
701
700
702 if self.data.flagDataAsBlock:
701 if self.data.flagDataAsBlock:
703
702
704 for i in range(self.data.nProfiles):
703 for i in range(self.data.nProfiles):
705
704
706 wintitle1 = " [Profile = %d] " %i
705 wintitle1 = " [Profile = %d] " %i
707
706
708 if self.type == "power":
707 if self.type == "power":
709 self.plot_power(self.data.heights,
708 self.plot_power(self.data.heights,
710 scope[:,i,:],
709 scope[:,i,:],
711 channels,
710 channels,
712 thisDatetime,
711 thisDatetime,
713 wintitle1
712 wintitle1
714 )
713 )
715
714
716 if self.type == "iq":
715 if self.type == "iq":
717 self.plot_iq(self.data.heights,
716 self.plot_iq(self.data.heights,
718 scope[:,i,:],
717 scope[:,i,:],
719 channels,
718 channels,
720 thisDatetime,
719 thisDatetime,
721 wintitle1
720 wintitle1
722 )
721 )
723
722
724
723
725
724
726
725
727
726
728 else:
727 else:
729 wintitle = " [Profile = %d] " %self.data.profileIndex
728 wintitle = " [Profile = %d] " %self.data.profileIndex
730
729
731 if self.type == "power":
730 if self.type == "power":
732 self.plot_power(self.data.heights,
731 self.plot_power(self.data.heights,
733 scope,
732 scope,
734 channels,
733 channels,
735 thisDatetime,
734 thisDatetime,
736 wintitle
735 wintitle
737 )
736 )
738
737
739 if self.type == "iq":
738 if self.type == "iq":
740 self.plot_iq(self.data.heights,
739 self.plot_iq(self.data.heights,
741 scope,
740 scope,
742 channels,
741 channels,
743 thisDatetime,
742 thisDatetime,
744 wintitle
743 wintitle
745 )
744 )
746
745
747
746
748 No newline at end of file
747
@@ -1,2394 +1,2394
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 from schainpy.model.proc.jroproc_base import MPDecorator
7 from schainpy.model.proc.jroproc_base import MPDecorator
8 from schainpy.utils import log
8 from schainpy.utils import log
9
9
10 class ParamLine_(Figure):
10 class ParamLine_(Figure):
11
11
12 isConfig = None
12 isConfig = None
13
13
14 def __init__(self):
14 def __init__(self):
15
15
16 self.isConfig = False
16 self.isConfig = False
17 self.WIDTH = 300
17 self.WIDTH = 300
18 self.HEIGHT = 200
18 self.HEIGHT = 200
19 self.counter_imagwr = 0
19 self.counter_imagwr = 0
20
20
21 def getSubplots(self):
21 def getSubplots(self):
22
22
23 nrow = self.nplots
23 nrow = self.nplots
24 ncol = 3
24 ncol = 3
25 return nrow, ncol
25 return nrow, ncol
26
26
27 def setup(self, id, nplots, wintitle, show):
27 def setup(self, id, nplots, wintitle, show):
28
28
29 self.nplots = nplots
29 self.nplots = nplots
30
30
31 self.createFigure(id=id,
31 self.createFigure(id=id,
32 wintitle=wintitle,
32 wintitle=wintitle,
33 show=show)
33 show=show)
34
34
35 nrow,ncol = self.getSubplots()
35 nrow,ncol = self.getSubplots()
36 colspan = 3
36 colspan = 3
37 rowspan = 1
37 rowspan = 1
38
38
39 for i in range(nplots):
39 for i in range(nplots):
40 self.addAxes(nrow, ncol, i, 0, colspan, rowspan)
40 self.addAxes(nrow, ncol, i, 0, colspan, rowspan)
41
41
42 def plot_iq(self, x, y, id, channelIndexList, thisDatetime, wintitle, show, xmin, xmax, ymin, ymax):
42 def plot_iq(self, x, y, id, channelIndexList, thisDatetime, wintitle, show, xmin, xmax, ymin, ymax):
43 yreal = y[channelIndexList,:].real
43 yreal = y[channelIndexList,:].real
44 yimag = y[channelIndexList,:].imag
44 yimag = y[channelIndexList,:].imag
45
45
46 title = wintitle + " Scope: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S"))
46 title = wintitle + " Scope: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S"))
47 xlabel = "Range (Km)"
47 xlabel = "Range (Km)"
48 ylabel = "Intensity - IQ"
48 ylabel = "Intensity - IQ"
49
49
50 if not self.isConfig:
50 if not self.isConfig:
51 nplots = len(channelIndexList)
51 nplots = len(channelIndexList)
52
52
53 self.setup(id=id,
53 self.setup(id=id,
54 nplots=nplots,
54 nplots=nplots,
55 wintitle='',
55 wintitle='',
56 show=show)
56 show=show)
57
57
58 if xmin == None: xmin = numpy.nanmin(x)
58 if xmin == None: xmin = numpy.nanmin(x)
59 if xmax == None: xmax = numpy.nanmax(x)
59 if xmax == None: xmax = numpy.nanmax(x)
60 if ymin == None: ymin = min(numpy.nanmin(yreal),numpy.nanmin(yimag))
60 if ymin == None: ymin = min(numpy.nanmin(yreal),numpy.nanmin(yimag))
61 if ymax == None: ymax = max(numpy.nanmax(yreal),numpy.nanmax(yimag))
61 if ymax == None: ymax = max(numpy.nanmax(yreal),numpy.nanmax(yimag))
62
62
63 self.isConfig = True
63 self.isConfig = True
64
64
65 self.setWinTitle(title)
65 self.setWinTitle(title)
66
66
67 for i in range(len(self.axesList)):
67 for i in range(len(self.axesList)):
68 title = "Channel %d" %(i)
68 title = "Channel %d" %(i)
69 axes = self.axesList[i]
69 axes = self.axesList[i]
70
70
71 axes.pline(x, yreal[i,:],
71 axes.pline(x, yreal[i,:],
72 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax,
72 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax,
73 xlabel=xlabel, ylabel=ylabel, title=title)
73 xlabel=xlabel, ylabel=ylabel, title=title)
74
74
75 axes.addpline(x, yimag[i,:], idline=1, color="red", linestyle="solid", lw=2)
75 axes.addpline(x, yimag[i,:], idline=1, color="red", linestyle="solid", lw=2)
76
76
77 def plot_power(self, x, y, id, channelIndexList, thisDatetime, wintitle, show, xmin, xmax, ymin, ymax):
77 def plot_power(self, x, y, id, channelIndexList, thisDatetime, wintitle, show, xmin, xmax, ymin, ymax):
78 y = y[channelIndexList,:] * numpy.conjugate(y[channelIndexList,:])
78 y = y[channelIndexList,:] * numpy.conjugate(y[channelIndexList,:])
79 yreal = y.real
79 yreal = y.real
80
80
81 title = wintitle + " Scope: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S"))
81 title = wintitle + " Scope: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S"))
82 xlabel = "Range (Km)"
82 xlabel = "Range (Km)"
83 ylabel = "Intensity"
83 ylabel = "Intensity"
84
84
85 if not self.isConfig:
85 if not self.isConfig:
86 nplots = len(channelIndexList)
86 nplots = len(channelIndexList)
87
87
88 self.setup(id=id,
88 self.setup(id=id,
89 nplots=nplots,
89 nplots=nplots,
90 wintitle='',
90 wintitle='',
91 show=show)
91 show=show)
92
92
93 if xmin == None: xmin = numpy.nanmin(x)
93 if xmin == None: xmin = numpy.nanmin(x)
94 if xmax == None: xmax = numpy.nanmax(x)
94 if xmax == None: xmax = numpy.nanmax(x)
95 if ymin == None: ymin = numpy.nanmin(yreal)
95 if ymin == None: ymin = numpy.nanmin(yreal)
96 if ymax == None: ymax = numpy.nanmax(yreal)
96 if ymax == None: ymax = numpy.nanmax(yreal)
97
97
98 self.isConfig = True
98 self.isConfig = True
99
99
100 self.setWinTitle(title)
100 self.setWinTitle(title)
101
101
102 for i in range(len(self.axesList)):
102 for i in range(len(self.axesList)):
103 title = "Channel %d" %(i)
103 title = "Channel %d" %(i)
104 axes = self.axesList[i]
104 axes = self.axesList[i]
105 ychannel = yreal[i,:]
105 ychannel = yreal[i,:]
106 axes.pline(x, ychannel,
106 axes.pline(x, ychannel,
107 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax,
107 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax,
108 xlabel=xlabel, ylabel=ylabel, title=title)
108 xlabel=xlabel, ylabel=ylabel, title=title)
109
109
110
110
111 def run(self, dataOut, id, wintitle="", channelList=None,
111 def run(self, dataOut, id, wintitle="", channelList=None,
112 xmin=None, xmax=None, ymin=None, ymax=None, save=False,
112 xmin=None, xmax=None, ymin=None, ymax=None, save=False,
113 figpath='./', figfile=None, show=True, wr_period=1,
113 figpath='./', figfile=None, show=True, wr_period=1,
114 ftp=False, server=None, folder=None, username=None, password=None):
114 ftp=False, server=None, folder=None, username=None, password=None):
115
115
116 """
116 """
117
117
118 Input:
118 Input:
119 dataOut :
119 dataOut :
120 id :
120 id :
121 wintitle :
121 wintitle :
122 channelList :
122 channelList :
123 xmin : None,
123 xmin : None,
124 xmax : None,
124 xmax : None,
125 ymin : None,
125 ymin : None,
126 ymax : None,
126 ymax : None,
127 """
127 """
128
128
129 if channelList == None:
129 if channelList == None:
130 channelIndexList = dataOut.channelIndexList
130 channelIndexList = dataOut.channelIndexList
131 else:
131 else:
132 channelIndexList = []
132 channelIndexList = []
133 for channel in channelList:
133 for channel in channelList:
134 if channel not in dataOut.channelList:
134 if channel not in dataOut.channelList:
135 raise ValueError("Channel %d is not in dataOut.channelList" % channel)
135 raise ValueError("Channel %d is not in dataOut.channelList" % channel)
136 channelIndexList.append(dataOut.channelList.index(channel))
136 channelIndexList.append(dataOut.channelList.index(channel))
137
137
138 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0])
138 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0])
139
139
140 y = dataOut.RR
140 y = dataOut.RR
141
141
142 title = wintitle + " Scope: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S"))
142 title = wintitle + " Scope: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S"))
143 xlabel = "Range (Km)"
143 xlabel = "Range (Km)"
144 ylabel = "Intensity"
144 ylabel = "Intensity"
145
145
146 if not self.isConfig:
146 if not self.isConfig:
147 nplots = len(channelIndexList)
147 nplots = len(channelIndexList)
148
148
149 self.setup(id=id,
149 self.setup(id=id,
150 nplots=nplots,
150 nplots=nplots,
151 wintitle='',
151 wintitle='',
152 show=show)
152 show=show)
153
153
154 if xmin == None: xmin = numpy.nanmin(x)
154 if xmin == None: xmin = numpy.nanmin(x)
155 if xmax == None: xmax = numpy.nanmax(x)
155 if xmax == None: xmax = numpy.nanmax(x)
156 if ymin == None: ymin = numpy.nanmin(y)
156 if ymin == None: ymin = numpy.nanmin(y)
157 if ymax == None: ymax = numpy.nanmax(y)
157 if ymax == None: ymax = numpy.nanmax(y)
158
158
159 self.isConfig = True
159 self.isConfig = True
160
160
161 self.setWinTitle(title)
161 self.setWinTitle(title)
162
162
163 for i in range(len(self.axesList)):
163 for i in range(len(self.axesList)):
164 title = "Channel %d" %(i)
164 title = "Channel %d" %(i)
165 axes = self.axesList[i]
165 axes = self.axesList[i]
166 ychannel = y[i,:]
166 ychannel = y[i,:]
167 axes.pline(x, ychannel,
167 axes.pline(x, ychannel,
168 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax,
168 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax,
169 xlabel=xlabel, ylabel=ylabel, title=title)
169 xlabel=xlabel, ylabel=ylabel, title=title)
170
170
171
171
172 self.draw()
172 self.draw()
173
173
174 str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S") + "_" + str(dataOut.profileIndex)
174 str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S") + "_" + str(dataOut.profileIndex)
175 figfile = self.getFilename(name = str_datetime)
175 figfile = self.getFilename(name = str_datetime)
176
176
177 self.save(figpath=figpath,
177 self.save(figpath=figpath,
178 figfile=figfile,
178 figfile=figfile,
179 save=save,
179 save=save,
180 ftp=ftp,
180 ftp=ftp,
181 wr_period=wr_period,
181 wr_period=wr_period,
182 thisDatetime=thisDatetime)
182 thisDatetime=thisDatetime)
183
183
184
184
185
185
186 class SpcParamPlot_(Figure):
186 class SpcParamPlot_(Figure):
187
187
188 isConfig = None
188 isConfig = None
189 __nsubplots = None
189 __nsubplots = None
190
190
191 WIDTHPROF = None
191 WIDTHPROF = None
192 HEIGHTPROF = None
192 HEIGHTPROF = None
193 PREFIX = 'SpcParam'
193 PREFIX = 'SpcParam'
194
194
195 def __init__(self, **kwargs):
195 def __init__(self, **kwargs):
196 Figure.__init__(self, **kwargs)
196 Figure.__init__(self, **kwargs)
197 self.isConfig = False
197 self.isConfig = False
198 self.__nsubplots = 1
198 self.__nsubplots = 1
199
199
200 self.WIDTH = 250
200 self.WIDTH = 250
201 self.HEIGHT = 250
201 self.HEIGHT = 250
202 self.WIDTHPROF = 120
202 self.WIDTHPROF = 120
203 self.HEIGHTPROF = 0
203 self.HEIGHTPROF = 0
204 self.counter_imagwr = 0
204 self.counter_imagwr = 0
205
205
206 self.PLOT_CODE = SPEC_CODE
206 self.PLOT_CODE = SPEC_CODE
207
207
208 self.FTP_WEI = None
208 self.FTP_WEI = None
209 self.EXP_CODE = None
209 self.EXP_CODE = None
210 self.SUB_EXP_CODE = None
210 self.SUB_EXP_CODE = None
211 self.PLOT_POS = None
211 self.PLOT_POS = None
212
212
213 self.__xfilter_ena = False
213 self.__xfilter_ena = False
214 self.__yfilter_ena = False
214 self.__yfilter_ena = False
215
215
216 def getSubplots(self):
216 def getSubplots(self):
217
217
218 ncol = int(numpy.sqrt(self.nplots)+0.9)
218 ncol = int(numpy.sqrt(self.nplots)+0.9)
219 nrow = int(self.nplots*1./ncol + 0.9)
219 nrow = int(self.nplots*1./ncol + 0.9)
220
220
221 return nrow, ncol
221 return nrow, ncol
222
222
223 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
223 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
224
224
225 self.__showprofile = showprofile
225 self.__showprofile = showprofile
226 self.nplots = nplots
226 self.nplots = nplots
227
227
228 ncolspan = 1
228 ncolspan = 1
229 colspan = 1
229 colspan = 1
230 if showprofile:
230 if showprofile:
231 ncolspan = 3
231 ncolspan = 3
232 colspan = 2
232 colspan = 2
233 self.__nsubplots = 2
233 self.__nsubplots = 2
234
234
235 self.createFigure(id = id,
235 self.createFigure(id = id,
236 wintitle = wintitle,
236 wintitle = wintitle,
237 widthplot = self.WIDTH + self.WIDTHPROF,
237 widthplot = self.WIDTH + self.WIDTHPROF,
238 heightplot = self.HEIGHT + self.HEIGHTPROF,
238 heightplot = self.HEIGHT + self.HEIGHTPROF,
239 show=show)
239 show=show)
240
240
241 nrow, ncol = self.getSubplots()
241 nrow, ncol = self.getSubplots()
242
242
243 counter = 0
243 counter = 0
244 for y in range(nrow):
244 for y in range(nrow):
245 for x in range(ncol):
245 for x in range(ncol):
246
246
247 if counter >= self.nplots:
247 if counter >= self.nplots:
248 break
248 break
249
249
250 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
250 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
251
251
252 if showprofile:
252 if showprofile:
253 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan+colspan, 1, 1)
253 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan+colspan, 1, 1)
254
254
255 counter += 1
255 counter += 1
256
256
257 def run(self, dataOut, id, wintitle="", channelList=None, showprofile=True,
257 def run(self, dataOut, id, wintitle="", channelList=None, showprofile=True,
258 xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None,
258 xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None,
259 save=False, figpath='./', figfile=None, show=True, ftp=False, wr_period=1,
259 save=False, figpath='./', figfile=None, show=True, ftp=False, wr_period=1,
260 server=None, folder=None, username=None, password=None,
260 server=None, folder=None, username=None, password=None,
261 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, realtime=False,
261 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, realtime=False,
262 xaxis="frequency", colormap='jet', normFactor=None , Selector = 0):
262 xaxis="frequency", colormap='jet', normFactor=None , Selector = 0):
263
263
264 """
264 """
265
265
266 Input:
266 Input:
267 dataOut :
267 dataOut :
268 id :
268 id :
269 wintitle :
269 wintitle :
270 channelList :
270 channelList :
271 showProfile :
271 showProfile :
272 xmin : None,
272 xmin : None,
273 xmax : None,
273 xmax : None,
274 ymin : None,
274 ymin : None,
275 ymax : None,
275 ymax : None,
276 zmin : None,
276 zmin : None,
277 zmax : None
277 zmax : None
278 """
278 """
279 if realtime:
279 if realtime:
280 if not(isRealtime(utcdatatime = dataOut.utctime)):
280 if not(isRealtime(utcdatatime = dataOut.utctime)):
281 print('Skipping this plot function')
281 print('Skipping this plot function')
282 return
282 return
283
283
284 if channelList == None:
284 if channelList == None:
285 channelIndexList = dataOut.channelIndexList
285 channelIndexList = dataOut.channelIndexList
286 else:
286 else:
287 channelIndexList = []
287 channelIndexList = []
288 for channel in channelList:
288 for channel in channelList:
289 if channel not in dataOut.channelList:
289 if channel not in dataOut.channelList:
290 raise ValueError("Channel %d is not in dataOut.channelList" %channel)
290 raise ValueError("Channel %d is not in dataOut.channelList" %channel)
291 channelIndexList.append(dataOut.channelList.index(channel))
291 channelIndexList.append(dataOut.channelList.index(channel))
292
292
293 # if normFactor is None:
293 # if normFactor is None:
294 # factor = dataOut.normFactor
294 # factor = dataOut.normFactor
295 # else:
295 # else:
296 # factor = normFactor
296 # factor = normFactor
297 if xaxis == "frequency":
297 if xaxis == "frequency":
298 x = dataOut.spcparam_range[0]
298 x = dataOut.spcparam_range[0]
299 xlabel = "Frequency (kHz)"
299 xlabel = "Frequency (kHz)"
300
300
301 elif xaxis == "time":
301 elif xaxis == "time":
302 x = dataOut.spcparam_range[1]
302 x = dataOut.spcparam_range[1]
303 xlabel = "Time (ms)"
303 xlabel = "Time (ms)"
304
304
305 else:
305 else:
306 x = dataOut.spcparam_range[2]
306 x = dataOut.spcparam_range[2]
307 xlabel = "Velocity (m/s)"
307 xlabel = "Velocity (m/s)"
308
308
309 ylabel = "Range (km)"
309 ylabel = "Range (km)"
310
310
311 y = dataOut.getHeiRange()
311 y = dataOut.getHeiRange()
312
312
313 z = dataOut.SPCparam[Selector] /1966080.0#/ dataOut.normFactor#GauSelector] #dataOut.data_spc/factor
313 z = dataOut.SPCparam[Selector] /1966080.0#/ dataOut.normFactor#GauSelector] #dataOut.data_spc/factor
314 z = numpy.where(numpy.isfinite(z), z, numpy.NAN)
314 z = numpy.where(numpy.isfinite(z), z, numpy.NAN)
315 zdB = 10*numpy.log10(z)
315 zdB = 10*numpy.log10(z)
316
316
317 avg = numpy.average(z, axis=1)
317 avg = numpy.average(z, axis=1)
318 avgdB = 10*numpy.log10(avg)
318 avgdB = 10*numpy.log10(avg)
319
319
320 noise = dataOut.spc_noise
320 noise = dataOut.spc_noise
321 noisedB = 10*numpy.log10(noise)
321 noisedB = 10*numpy.log10(noise)
322
322
323 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0])
323 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0])
324 title = wintitle + " Spectra"
324 title = wintitle + " Spectra"
325 if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)):
325 if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)):
326 title = title + '_' + 'azimuth,zenith=%2.2f,%2.2f'%(dataOut.azimuth, dataOut.zenith)
326 title = title + '_' + 'azimuth,zenith=%2.2f,%2.2f'%(dataOut.azimuth, dataOut.zenith)
327
327
328 if not self.isConfig:
328 if not self.isConfig:
329
329
330 nplots = len(channelIndexList)
330 nplots = len(channelIndexList)
331
331
332 self.setup(id=id,
332 self.setup(id=id,
333 nplots=nplots,
333 nplots=nplots,
334 wintitle=wintitle,
334 wintitle=wintitle,
335 showprofile=showprofile,
335 showprofile=showprofile,
336 show=show)
336 show=show)
337
337
338 if xmin == None: xmin = numpy.nanmin(x)
338 if xmin == None: xmin = numpy.nanmin(x)
339 if xmax == None: xmax = numpy.nanmax(x)
339 if xmax == None: xmax = numpy.nanmax(x)
340 if ymin == None: ymin = numpy.nanmin(y)
340 if ymin == None: ymin = numpy.nanmin(y)
341 if ymax == None: ymax = numpy.nanmax(y)
341 if ymax == None: ymax = numpy.nanmax(y)
342 if zmin == None: zmin = numpy.floor(numpy.nanmin(noisedB)) - 3
342 if zmin == None: zmin = numpy.floor(numpy.nanmin(noisedB)) - 3
343 if zmax == None: zmax = numpy.ceil(numpy.nanmax(avgdB)) + 3
343 if zmax == None: zmax = numpy.ceil(numpy.nanmax(avgdB)) + 3
344
344
345 self.FTP_WEI = ftp_wei
345 self.FTP_WEI = ftp_wei
346 self.EXP_CODE = exp_code
346 self.EXP_CODE = exp_code
347 self.SUB_EXP_CODE = sub_exp_code
347 self.SUB_EXP_CODE = sub_exp_code
348 self.PLOT_POS = plot_pos
348 self.PLOT_POS = plot_pos
349
349
350 self.isConfig = True
350 self.isConfig = True
351
351
352 self.setWinTitle(title)
352 self.setWinTitle(title)
353
353
354 for i in range(self.nplots):
354 for i in range(self.nplots):
355 index = channelIndexList[i]
355 index = channelIndexList[i]
356 str_datetime = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S"))
356 str_datetime = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S"))
357 title = "Channel %d: %4.2fdB: %s" %(dataOut.channelList[index], noisedB[index], str_datetime)
357 title = "Channel %d: %4.2fdB: %s" %(dataOut.channelList[index], noisedB[index], str_datetime)
358 if len(dataOut.beam.codeList) != 0:
358 if len(dataOut.beam.codeList) != 0:
359 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)
359 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)
360
360
361 axes = self.axesList[i*self.__nsubplots]
361 axes = self.axesList[i*self.__nsubplots]
362 axes.pcolor(x, y, zdB[index,:,:],
362 axes.pcolor(x, y, zdB[index,:,:],
363 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
363 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
364 xlabel=xlabel, ylabel=ylabel, title=title, colormap=colormap,
364 xlabel=xlabel, ylabel=ylabel, title=title, colormap=colormap,
365 ticksize=9, cblabel='')
365 ticksize=9, cblabel='')
366
366
367 if self.__showprofile:
367 if self.__showprofile:
368 axes = self.axesList[i*self.__nsubplots +1]
368 axes = self.axesList[i*self.__nsubplots +1]
369 axes.pline(avgdB[index,:], y,
369 axes.pline(avgdB[index,:], y,
370 xmin=zmin, xmax=zmax, ymin=ymin, ymax=ymax,
370 xmin=zmin, xmax=zmax, ymin=ymin, ymax=ymax,
371 xlabel='dB', ylabel='', title='',
371 xlabel='dB', ylabel='', title='',
372 ytick_visible=False,
372 ytick_visible=False,
373 grid='x')
373 grid='x')
374
374
375 noiseline = numpy.repeat(noisedB[index], len(y))
375 noiseline = numpy.repeat(noisedB[index], len(y))
376 axes.addpline(noiseline, y, idline=1, color="black", linestyle="dashed", lw=2)
376 axes.addpline(noiseline, y, idline=1, color="black", linestyle="dashed", lw=2)
377
377
378 self.draw()
378 self.draw()
379
379
380 if figfile == None:
380 if figfile == None:
381 str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S")
381 str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S")
382 name = str_datetime
382 name = str_datetime
383 if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)):
383 if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)):
384 name = name + '_az' + '_%2.2f'%(dataOut.azimuth) + '_zn' + '_%2.2f'%(dataOut.zenith)
384 name = name + '_az' + '_%2.2f'%(dataOut.azimuth) + '_zn' + '_%2.2f'%(dataOut.zenith)
385 figfile = self.getFilename(name)
385 figfile = self.getFilename(name)
386
386
387 self.save(figpath=figpath,
387 self.save(figpath=figpath,
388 figfile=figfile,
388 figfile=figfile,
389 save=save,
389 save=save,
390 ftp=ftp,
390 ftp=ftp,
391 wr_period=wr_period,
391 wr_period=wr_period,
392 thisDatetime=thisDatetime)
392 thisDatetime=thisDatetime)
393
393
394
394
395
395
396 class MomentsPlot_(Figure):
396 class MomentsPlot_(Figure):
397
397
398 isConfig = None
398 isConfig = None
399 __nsubplots = None
399 __nsubplots = None
400
400
401 WIDTHPROF = None
401 WIDTHPROF = None
402 HEIGHTPROF = None
402 HEIGHTPROF = None
403 PREFIX = 'prm'
403 PREFIX = 'prm'
404 def __init__(self):
404 def __init__(self):
405 Figure.__init__(self)
405 Figure.__init__(self)
406 self.isConfig = False
406 self.isConfig = False
407 self.__nsubplots = 1
407 self.__nsubplots = 1
408
408
409 self.WIDTH = 280
409 self.WIDTH = 280
410 self.HEIGHT = 250
410 self.HEIGHT = 250
411 self.WIDTHPROF = 120
411 self.WIDTHPROF = 120
412 self.HEIGHTPROF = 0
412 self.HEIGHTPROF = 0
413 self.counter_imagwr = 0
413 self.counter_imagwr = 0
414
414
415 self.PLOT_CODE = MOMENTS_CODE
415 self.PLOT_CODE = MOMENTS_CODE
416
416
417 self.FTP_WEI = None
417 self.FTP_WEI = None
418 self.EXP_CODE = None
418 self.EXP_CODE = None
419 self.SUB_EXP_CODE = None
419 self.SUB_EXP_CODE = None
420 self.PLOT_POS = None
420 self.PLOT_POS = None
421
421
422 def getSubplots(self):
422 def getSubplots(self):
423
423
424 ncol = int(numpy.sqrt(self.nplots)+0.9)
424 ncol = int(numpy.sqrt(self.nplots)+0.9)
425 nrow = int(self.nplots*1./ncol + 0.9)
425 nrow = int(self.nplots*1./ncol + 0.9)
426
426
427 return nrow, ncol
427 return nrow, ncol
428
428
429 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
429 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
430
430
431 self.__showprofile = showprofile
431 self.__showprofile = showprofile
432 self.nplots = nplots
432 self.nplots = nplots
433
433
434 ncolspan = 1
434 ncolspan = 1
435 colspan = 1
435 colspan = 1
436 if showprofile:
436 if showprofile:
437 ncolspan = 3
437 ncolspan = 3
438 colspan = 2
438 colspan = 2
439 self.__nsubplots = 2
439 self.__nsubplots = 2
440
440
441 self.createFigure(id = id,
441 self.createFigure(id = id,
442 wintitle = wintitle,
442 wintitle = wintitle,
443 widthplot = self.WIDTH + self.WIDTHPROF,
443 widthplot = self.WIDTH + self.WIDTHPROF,
444 heightplot = self.HEIGHT + self.HEIGHTPROF,
444 heightplot = self.HEIGHT + self.HEIGHTPROF,
445 show=show)
445 show=show)
446
446
447 nrow, ncol = self.getSubplots()
447 nrow, ncol = self.getSubplots()
448
448
449 counter = 0
449 counter = 0
450 for y in range(nrow):
450 for y in range(nrow):
451 for x in range(ncol):
451 for x in range(ncol):
452
452
453 if counter >= self.nplots:
453 if counter >= self.nplots:
454 break
454 break
455
455
456 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
456 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
457
457
458 if showprofile:
458 if showprofile:
459 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan+colspan, 1, 1)
459 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan+colspan, 1, 1)
460
460
461 counter += 1
461 counter += 1
462
462
463 def run(self, dataOut, id, wintitle="", channelList=None, showprofile=True,
463 def run(self, dataOut, id, wintitle="", channelList=None, showprofile=True,
464 xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None,
464 xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None,
465 save=False, figpath='./', figfile=None, show=True, ftp=False, wr_period=1,
465 save=False, figpath='./', figfile=None, show=True, ftp=False, wr_period=1,
466 server=None, folder=None, username=None, password=None,
466 server=None, folder=None, username=None, password=None,
467 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, realtime=False):
467 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, realtime=False):
468
468
469 """
469 """
470
470
471 Input:
471 Input:
472 dataOut :
472 dataOut :
473 id :
473 id :
474 wintitle :
474 wintitle :
475 channelList :
475 channelList :
476 showProfile :
476 showProfile :
477 xmin : None,
477 xmin : None,
478 xmax : None,
478 xmax : None,
479 ymin : None,
479 ymin : None,
480 ymax : None,
480 ymax : None,
481 zmin : None,
481 zmin : None,
482 zmax : None
482 zmax : None
483 """
483 """
484
484
485 if dataOut.flagNoData:
485 if dataOut.flagNoData:
486 return None
486 return None
487
487
488 if realtime:
488 if realtime:
489 if not(isRealtime(utcdatatime = dataOut.utctime)):
489 if not(isRealtime(utcdatatime = dataOut.utctime)):
490 print('Skipping this plot function')
490 print('Skipping this plot function')
491 return
491 return
492
492
493 if channelList == None:
493 if channelList == None:
494 channelIndexList = dataOut.channelIndexList
494 channelIndexList = dataOut.channelIndexList
495 else:
495 else:
496 channelIndexList = []
496 channelIndexList = []
497 for channel in channelList:
497 for channel in channelList:
498 if channel not in dataOut.channelList:
498 if channel not in dataOut.channelList:
499 raise ValueError("Channel %d is not in dataOut.channelList")
499 raise ValueError("Channel %d is not in dataOut.channelList")
500 channelIndexList.append(dataOut.channelList.index(channel))
500 channelIndexList.append(dataOut.channelList.index(channel))
501
501
502 factor = dataOut.normFactor
502 factor = dataOut.normFactor
503 x = dataOut.abscissaList
503 x = dataOut.abscissaList
504 y = dataOut.heightList
504 y = dataOut.heightList
505
505
506 z = dataOut.data_pre[channelIndexList,:,:]/factor
506 z = dataOut.data_pre[channelIndexList,:,:]/factor
507 z = numpy.where(numpy.isfinite(z), z, numpy.NAN)
507 z = numpy.where(numpy.isfinite(z), z, numpy.NAN)
508 avg = numpy.average(z, axis=1)
508 avg = numpy.average(z, axis=1)
509 noise = dataOut.noise/factor
509 noise = dataOut.noise/factor
510
510
511 zdB = 10*numpy.log10(z)
511 zdB = 10*numpy.log10(z)
512 avgdB = 10*numpy.log10(avg)
512 avgdB = 10*numpy.log10(avg)
513 noisedB = 10*numpy.log10(noise)
513 noisedB = 10*numpy.log10(noise)
514
514
515 #thisDatetime = dataOut.datatime
515 #thisDatetime = dataOut.datatime
516 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0])
516 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0])
517 title = wintitle + " Parameters"
517 title = wintitle + " Parameters"
518 xlabel = "Velocity (m/s)"
518 xlabel = "Velocity (m/s)"
519 ylabel = "Range (Km)"
519 ylabel = "Range (Km)"
520
520
521 update_figfile = False
521 update_figfile = False
522
522
523 if not self.isConfig:
523 if not self.isConfig:
524
524
525 nplots = len(channelIndexList)
525 nplots = len(channelIndexList)
526
526
527 self.setup(id=id,
527 self.setup(id=id,
528 nplots=nplots,
528 nplots=nplots,
529 wintitle=wintitle,
529 wintitle=wintitle,
530 showprofile=showprofile,
530 showprofile=showprofile,
531 show=show)
531 show=show)
532
532
533 if xmin == None: xmin = numpy.nanmin(x)
533 if xmin == None: xmin = numpy.nanmin(x)
534 if xmax == None: xmax = numpy.nanmax(x)
534 if xmax == None: xmax = numpy.nanmax(x)
535 if ymin == None: ymin = numpy.nanmin(y)
535 if ymin == None: ymin = numpy.nanmin(y)
536 if ymax == None: ymax = numpy.nanmax(y)
536 if ymax == None: ymax = numpy.nanmax(y)
537 if zmin == None: zmin = numpy.nanmin(avgdB)*0.9
537 if zmin == None: zmin = numpy.nanmin(avgdB)*0.9
538 if zmax == None: zmax = numpy.nanmax(avgdB)*0.9
538 if zmax == None: zmax = numpy.nanmax(avgdB)*0.9
539
539
540 self.FTP_WEI = ftp_wei
540 self.FTP_WEI = ftp_wei
541 self.EXP_CODE = exp_code
541 self.EXP_CODE = exp_code
542 self.SUB_EXP_CODE = sub_exp_code
542 self.SUB_EXP_CODE = sub_exp_code
543 self.PLOT_POS = plot_pos
543 self.PLOT_POS = plot_pos
544
544
545 self.isConfig = True
545 self.isConfig = True
546 update_figfile = True
546 update_figfile = True
547
547
548 self.setWinTitle(title)
548 self.setWinTitle(title)
549
549
550 for i in range(self.nplots):
550 for i in range(self.nplots):
551 str_datetime = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S"))
551 str_datetime = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S"))
552 title = "Channel %d: %4.2fdB: %s" %(dataOut.channelList[i], noisedB[i], str_datetime)
552 title = "Channel %d: %4.2fdB: %s" %(dataOut.channelList[i], noisedB[i], str_datetime)
553 axes = self.axesList[i*self.__nsubplots]
553 axes = self.axesList[i*self.__nsubplots]
554 axes.pcolor(x, y, zdB[i,:,:],
554 axes.pcolor(x, y, zdB[i,:,:],
555 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
555 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
556 xlabel=xlabel, ylabel=ylabel, title=title,
556 xlabel=xlabel, ylabel=ylabel, title=title,
557 ticksize=9, cblabel='')
557 ticksize=9, cblabel='')
558 #Mean Line
558 #Mean Line
559 mean = dataOut.data_param[i, 1, :]
559 mean = dataOut.data_param[i, 1, :]
560 axes.addpline(mean, y, idline=0, color="black", linestyle="solid", lw=1)
560 axes.addpline(mean, y, idline=0, color="black", linestyle="solid", lw=1)
561
561
562 if self.__showprofile:
562 if self.__showprofile:
563 axes = self.axesList[i*self.__nsubplots +1]
563 axes = self.axesList[i*self.__nsubplots +1]
564 axes.pline(avgdB[i], y,
564 axes.pline(avgdB[i], y,
565 xmin=zmin, xmax=zmax, ymin=ymin, ymax=ymax,
565 xmin=zmin, xmax=zmax, ymin=ymin, ymax=ymax,
566 xlabel='dB', ylabel='', title='',
566 xlabel='dB', ylabel='', title='',
567 ytick_visible=False,
567 ytick_visible=False,
568 grid='x')
568 grid='x')
569
569
570 noiseline = numpy.repeat(noisedB[i], len(y))
570 noiseline = numpy.repeat(noisedB[i], len(y))
571 axes.addpline(noiseline, y, idline=1, color="black", linestyle="dashed", lw=2)
571 axes.addpline(noiseline, y, idline=1, color="black", linestyle="dashed", lw=2)
572
572
573 self.draw()
573 self.draw()
574
574
575 self.save(figpath=figpath,
575 self.save(figpath=figpath,
576 figfile=figfile,
576 figfile=figfile,
577 save=save,
577 save=save,
578 ftp=ftp,
578 ftp=ftp,
579 wr_period=wr_period,
579 wr_period=wr_period,
580 thisDatetime=thisDatetime)
580 thisDatetime=thisDatetime)
581
581
582
582
583 class SkyMapPlot_(Figure):
583 class SkyMapPlot_(Figure):
584
584
585 __isConfig = None
585 __isConfig = None
586 __nsubplots = None
586 __nsubplots = None
587
587
588 WIDTHPROF = None
588 WIDTHPROF = None
589 HEIGHTPROF = None
589 HEIGHTPROF = None
590 PREFIX = 'mmap'
590 PREFIX = 'mmap'
591
591
592 def __init__(self, **kwargs):
592 def __init__(self, **kwargs):
593 Figure.__init__(self, **kwargs)
593 Figure.__init__(self, **kwargs)
594 self.isConfig = False
594 self.isConfig = False
595 self.__nsubplots = 1
595 self.__nsubplots = 1
596
596
597 # self.WIDTH = 280
597 # self.WIDTH = 280
598 # self.HEIGHT = 250
598 # self.HEIGHT = 250
599 self.WIDTH = 600
599 self.WIDTH = 600
600 self.HEIGHT = 600
600 self.HEIGHT = 600
601 self.WIDTHPROF = 120
601 self.WIDTHPROF = 120
602 self.HEIGHTPROF = 0
602 self.HEIGHTPROF = 0
603 self.counter_imagwr = 0
603 self.counter_imagwr = 0
604
604
605 self.PLOT_CODE = MSKYMAP_CODE
605 self.PLOT_CODE = MSKYMAP_CODE
606
606
607 self.FTP_WEI = None
607 self.FTP_WEI = None
608 self.EXP_CODE = None
608 self.EXP_CODE = None
609 self.SUB_EXP_CODE = None
609 self.SUB_EXP_CODE = None
610 self.PLOT_POS = None
610 self.PLOT_POS = None
611
611
612 def getSubplots(self):
612 def getSubplots(self):
613
613
614 ncol = int(numpy.sqrt(self.nplots)+0.9)
614 ncol = int(numpy.sqrt(self.nplots)+0.9)
615 nrow = int(self.nplots*1./ncol + 0.9)
615 nrow = int(self.nplots*1./ncol + 0.9)
616
616
617 return nrow, ncol
617 return nrow, ncol
618
618
619 def setup(self, id, nplots, wintitle, showprofile=False, show=True):
619 def setup(self, id, nplots, wintitle, showprofile=False, show=True):
620
620
621 self.__showprofile = showprofile
621 self.__showprofile = showprofile
622 self.nplots = nplots
622 self.nplots = nplots
623
623
624 ncolspan = 1
624 ncolspan = 1
625 colspan = 1
625 colspan = 1
626
626
627 self.createFigure(id = id,
627 self.createFigure(id = id,
628 wintitle = wintitle,
628 wintitle = wintitle,
629 widthplot = self.WIDTH, #+ self.WIDTHPROF,
629 widthplot = self.WIDTH, #+ self.WIDTHPROF,
630 heightplot = self.HEIGHT,# + self.HEIGHTPROF,
630 heightplot = self.HEIGHT,# + self.HEIGHTPROF,
631 show=show)
631 show=show)
632
632
633 nrow, ncol = 1,1
633 nrow, ncol = 1,1
634 counter = 0
634 counter = 0
635 x = 0
635 x = 0
636 y = 0
636 y = 0
637 self.addAxes(1, 1, 0, 0, 1, 1, True)
637 self.addAxes(1, 1, 0, 0, 1, 1, True)
638
638
639 def run(self, dataOut, id, wintitle="", channelList=None, showprofile=False,
639 def run(self, dataOut, id, wintitle="", channelList=None, showprofile=False,
640 tmin=0, tmax=24, timerange=None,
640 tmin=0, tmax=24, timerange=None,
641 save=False, figpath='./', figfile=None, show=True, ftp=False, wr_period=1,
641 save=False, figpath='./', figfile=None, show=True, ftp=False, wr_period=1,
642 server=None, folder=None, username=None, password=None,
642 server=None, folder=None, username=None, password=None,
643 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, realtime=False):
643 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, realtime=False):
644
644
645 """
645 """
646
646
647 Input:
647 Input:
648 dataOut :
648 dataOut :
649 id :
649 id :
650 wintitle :
650 wintitle :
651 channelList :
651 channelList :
652 showProfile :
652 showProfile :
653 xmin : None,
653 xmin : None,
654 xmax : None,
654 xmax : None,
655 ymin : None,
655 ymin : None,
656 ymax : None,
656 ymax : None,
657 zmin : None,
657 zmin : None,
658 zmax : None
658 zmax : None
659 """
659 """
660
660
661 arrayParameters = dataOut.data_param
661 arrayParameters = dataOut.data_param
662 error = arrayParameters[:,-1]
662 error = arrayParameters[:,-1]
663 indValid = numpy.where(error == 0)[0]
663 indValid = numpy.where(error == 0)[0]
664 finalMeteor = arrayParameters[indValid,:]
664 finalMeteor = arrayParameters[indValid,:]
665 finalAzimuth = finalMeteor[:,3]
665 finalAzimuth = finalMeteor[:,3]
666 finalZenith = finalMeteor[:,4]
666 finalZenith = finalMeteor[:,4]
667
667
668 x = finalAzimuth*numpy.pi/180
668 x = finalAzimuth*numpy.pi/180
669 y = finalZenith
669 y = finalZenith
670 x1 = [dataOut.ltctime, dataOut.ltctime]
670 x1 = [dataOut.ltctime, dataOut.ltctime]
671
671
672 #thisDatetime = dataOut.datatime
672 #thisDatetime = dataOut.datatime
673 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.ltctime)
673 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.ltctime)
674 title = wintitle + " Parameters"
674 title = wintitle + " Parameters"
675 xlabel = "Zonal Zenith Angle (deg) "
675 xlabel = "Zonal Zenith Angle (deg) "
676 ylabel = "Meridional Zenith Angle (deg)"
676 ylabel = "Meridional Zenith Angle (deg)"
677 update_figfile = False
677 update_figfile = False
678
678
679 if not self.isConfig:
679 if not self.isConfig:
680
680
681 nplots = 1
681 nplots = 1
682
682
683 self.setup(id=id,
683 self.setup(id=id,
684 nplots=nplots,
684 nplots=nplots,
685 wintitle=wintitle,
685 wintitle=wintitle,
686 showprofile=showprofile,
686 showprofile=showprofile,
687 show=show)
687 show=show)
688
688
689 if self.xmin is None and self.xmax is None:
689 if self.xmin is None and self.xmax is None:
690 self.xmin, self.xmax = self.getTimeLim(x1, tmin, tmax, timerange)
690 self.xmin, self.xmax = self.getTimeLim(x1, tmin, tmax, timerange)
691
691
692 if timerange != None:
692 if timerange != None:
693 self.timerange = timerange
693 self.timerange = timerange
694 else:
694 else:
695 self.timerange = self.xmax - self.xmin
695 self.timerange = self.xmax - self.xmin
696
696
697 self.FTP_WEI = ftp_wei
697 self.FTP_WEI = ftp_wei
698 self.EXP_CODE = exp_code
698 self.EXP_CODE = exp_code
699 self.SUB_EXP_CODE = sub_exp_code
699 self.SUB_EXP_CODE = sub_exp_code
700 self.PLOT_POS = plot_pos
700 self.PLOT_POS = plot_pos
701 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
701 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
702 self.firstdate = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S"))
702 self.firstdate = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S"))
703 self.isConfig = True
703 self.isConfig = True
704 update_figfile = True
704 update_figfile = True
705
705
706 self.setWinTitle(title)
706 self.setWinTitle(title)
707
707
708 i = 0
708 i = 0
709 str_datetime = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S"))
709 str_datetime = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S"))
710
710
711 axes = self.axesList[i*self.__nsubplots]
711 axes = self.axesList[i*self.__nsubplots]
712 nevents = axes.x_buffer.shape[0] + x.shape[0]
712 nevents = axes.x_buffer.shape[0] + x.shape[0]
713 title = "Meteor Detection Sky Map\n %s - %s \n Number of events: %5.0f\n" %(self.firstdate,str_datetime,nevents)
713 title = "Meteor Detection Sky Map\n %s - %s \n Number of events: %5.0f\n" %(self.firstdate,str_datetime,nevents)
714 axes.polar(x, y,
714 axes.polar(x, y,
715 title=title, xlabel=xlabel, ylabel=ylabel,
715 title=title, xlabel=xlabel, ylabel=ylabel,
716 ticksize=9, cblabel='')
716 ticksize=9, cblabel='')
717
717
718 self.draw()
718 self.draw()
719
719
720 self.save(figpath=figpath,
720 self.save(figpath=figpath,
721 figfile=figfile,
721 figfile=figfile,
722 save=save,
722 save=save,
723 ftp=ftp,
723 ftp=ftp,
724 wr_period=wr_period,
724 wr_period=wr_period,
725 thisDatetime=thisDatetime,
725 thisDatetime=thisDatetime,
726 update_figfile=update_figfile)
726 update_figfile=update_figfile)
727
727
728 if dataOut.ltctime >= self.xmax:
728 if dataOut.ltctime >= self.xmax:
729 self.isConfigmagwr = wr_period
729 self.isConfigmagwr = wr_period
730 self.isConfig = False
730 self.isConfig = False
731 update_figfile = True
731 update_figfile = True
732 axes.__firsttime = True
732 axes.__firsttime = True
733 self.xmin += self.timerange
733 self.xmin += self.timerange
734 self.xmax += self.timerange
734 self.xmax += self.timerange
735
735
736
736
737
737
738 @MPDecorator
738 @MPDecorator
739 class WindProfilerPlot_(Figure):
739 class WindProfilerPlot_(Figure):
740
740
741 __isConfig = None
741 __isConfig = None
742 __nsubplots = None
742 __nsubplots = None
743
743
744 WIDTHPROF = None
744 WIDTHPROF = None
745 HEIGHTPROF = None
745 HEIGHTPROF = None
746 PREFIX = 'wind'
746 PREFIX = 'wind'
747
747
748 def __init__(self):
748 def __init__(self):
749 Figure.__init__(self)
749 Figure.__init__(self)
750 self.timerange = None
750 self.timerange = None
751 self.isConfig = False
751 self.isConfig = False
752 self.__nsubplots = 1
752 self.__nsubplots = 1
753
753
754 self.WIDTH = 800
754 self.WIDTH = 800
755 self.HEIGHT = 300
755 self.HEIGHT = 300
756 self.WIDTHPROF = 120
756 self.WIDTHPROF = 120
757 self.HEIGHTPROF = 0
757 self.HEIGHTPROF = 0
758 self.counter_imagwr = 0
758 self.counter_imagwr = 0
759
759
760 self.PLOT_CODE = WIND_CODE
760 self.PLOT_CODE = WIND_CODE
761
761
762 self.FTP_WEI = None
762 self.FTP_WEI = None
763 self.EXP_CODE = None
763 self.EXP_CODE = None
764 self.SUB_EXP_CODE = None
764 self.SUB_EXP_CODE = None
765 self.PLOT_POS = None
765 self.PLOT_POS = None
766 self.tmin = None
766 self.tmin = None
767 self.tmax = None
767 self.tmax = None
768
768
769 self.xmin = None
769 self.xmin = None
770 self.xmax = None
770 self.xmax = None
771
771
772 self.figfile = None
772 self.figfile = None
773
773
774 def getSubplots(self):
774 def getSubplots(self):
775
775
776 ncol = 1
776 ncol = 1
777 nrow = self.nplots
777 nrow = self.nplots
778
778
779 return nrow, ncol
779 return nrow, ncol
780
780
781 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
781 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
782
782
783 self.__showprofile = showprofile
783 self.__showprofile = showprofile
784 self.nplots = nplots
784 self.nplots = nplots
785
785
786 ncolspan = 1
786 ncolspan = 1
787 colspan = 1
787 colspan = 1
788
788
789 self.createFigure(id = id,
789 self.createFigure(id = id,
790 wintitle = wintitle,
790 wintitle = wintitle,
791 widthplot = self.WIDTH + self.WIDTHPROF,
791 widthplot = self.WIDTH + self.WIDTHPROF,
792 heightplot = self.HEIGHT + self.HEIGHTPROF,
792 heightplot = self.HEIGHT + self.HEIGHTPROF,
793 show=show)
793 show=show)
794
794
795 nrow, ncol = self.getSubplots()
795 nrow, ncol = self.getSubplots()
796
796
797 counter = 0
797 counter = 0
798 for y in range(nrow):
798 for y in range(nrow):
799 if counter >= self.nplots:
799 if counter >= self.nplots:
800 break
800 break
801
801
802 self.addAxes(nrow, ncol*ncolspan, y, 0, colspan, 1)
802 self.addAxes(nrow, ncol*ncolspan, y, 0, colspan, 1)
803 counter += 1
803 counter += 1
804
804
805 def run(self, dataOut, id, wintitle="", channelList=None, showprofile='False',
805 def run(self, dataOut, id, wintitle="", channelList=None, showprofile='False',
806 xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None,
806 xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None,
807 zmax_ver = None, zmin_ver = None, SNRmin = None, SNRmax = None,
807 zmax_ver = None, zmin_ver = None, SNRmin = None, SNRmax = None,
808 timerange=None, SNRthresh = None,
808 timerange=None, SNRthresh = None,
809 save=False, figpath='./', lastone=0,figfile=None, ftp=False, wr_period=1, show=True,
809 save=False, figpath='./', lastone=0,figfile=None, ftp=False, wr_period=1, show=True,
810 server=None, folder=None, username=None, password=None,
810 server=None, folder=None, username=None, password=None,
811 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0):
811 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0):
812 """
812 """
813
813
814 Input:
814 Input:
815 dataOut :
815 dataOut :
816 id :
816 id :
817 wintitle :
817 wintitle :
818 channelList :
818 channelList :
819 showProfile :
819 showProfile :
820 xmin : None,
820 xmin : None,
821 xmax : None,
821 xmax : None,
822 ymin : None,
822 ymin : None,
823 ymax : None,
823 ymax : None,
824 zmin : None,
824 zmin : None,
825 zmax : None
825 zmax : None
826 """
826 """
827
827
828 if dataOut.flagNoData:
828 if dataOut.flagNoData:
829 return dataOut
829 return dataOut
830
830
831 # if timerange is not None:
831 # if timerange is not None:
832 # self.timerange = timerange
832 # self.timerange = timerange
833 #
833 #
834 # tmin = None
834 # tmin = None
835 # tmax = None
835 # tmax = None
836
836
837 x = dataOut.getTimeRange1(dataOut.paramInterval)
837 x = dataOut.getTimeRange1(dataOut.paramInterval)
838 y = dataOut.heightList
838 y = dataOut.heightList
839 z = dataOut.data_output.copy()
839 z = dataOut.data_output.copy()
840 nplots = z.shape[0] #Number of wind dimensions estimated
840 nplots = z.shape[0] #Number of wind dimensions estimated
841 nplotsw = nplots
841 nplotsw = nplots
842
842
843
843
844 #If there is a SNR function defined
844 #If there is a SNR function defined
845 if dataOut.data_SNR is not None:
845 if dataOut.data_SNR is not None:
846 nplots += 1
846 nplots += 1
847 SNR = dataOut.data_SNR[0]
847 SNR = dataOut.data_SNR[0]
848 SNRavg = SNR#numpy.average(SNR, axis=0)
848 SNRavg = SNR#numpy.average(SNR, axis=0)
849
849
850 SNRdB = 10*numpy.log10(SNR)
850 SNRdB = 10*numpy.log10(SNR)
851 SNRavgdB = 10*numpy.log10(SNRavg)
851 SNRavgdB = 10*numpy.log10(SNRavg)
852
852
853 if SNRthresh == None:
853 if SNRthresh == None:
854 SNRthresh = -5.0
854 SNRthresh = -5.0
855 ind = numpy.where(SNRavg < 10**(SNRthresh/10))[0]
855 ind = numpy.where(SNRavg < 10**(SNRthresh/10))[0]
856
856
857 for i in range(nplotsw):
857 for i in range(nplotsw):
858 z[i,ind] = numpy.nan
858 z[i,ind] = numpy.nan
859
859
860 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.ltctime)
860 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.ltctime)
861 #thisDatetime = datetime.datetime.now()
861 #thisDatetime = datetime.datetime.now()
862 title = wintitle + "Wind"
862 title = wintitle + "Wind"
863 xlabel = ""
863 xlabel = ""
864 ylabel = "Height (km)"
864 ylabel = "Height (km)"
865 update_figfile = False
865 update_figfile = False
866
866
867 if not self.isConfig:
867 if not self.isConfig:
868
868
869 self.setup(id=id,
869 self.setup(id=id,
870 nplots=nplots,
870 nplots=nplots,
871 wintitle=wintitle,
871 wintitle=wintitle,
872 showprofile=showprofile,
872 showprofile=showprofile,
873 show=show)
873 show=show)
874
874
875 if timerange is not None:
875 if timerange is not None:
876 self.timerange = timerange
876 self.timerange = timerange
877
877
878 self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange)
878 self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange)
879
879
880 if ymin == None: ymin = numpy.nanmin(y)
880 if ymin == None: ymin = numpy.nanmin(y)
881 if ymax == None: ymax = numpy.nanmax(y)
881 if ymax == None: ymax = numpy.nanmax(y)
882
882
883 if zmax == None: zmax = numpy.nanmax(abs(z[list(range(2)),:]))
883 if zmax == None: zmax = numpy.nanmax(abs(z[list(range(2)),:]))
884 #if numpy.isnan(zmax): zmax = 50
884 #if numpy.isnan(zmax): zmax = 50
885 if zmin == None: zmin = -zmax
885 if zmin == None: zmin = -zmax
886
886
887 if nplotsw == 3:
887 if nplotsw == 3:
888 if zmax_ver == None: zmax_ver = numpy.nanmax(abs(z[2,:]))
888 if zmax_ver == None: zmax_ver = numpy.nanmax(abs(z[2,:]))
889 if zmin_ver == None: zmin_ver = -zmax_ver
889 if zmin_ver == None: zmin_ver = -zmax_ver
890
890
891 if dataOut.data_SNR is not None:
891 if dataOut.data_SNR is not None:
892 if SNRmin == None: SNRmin = numpy.nanmin(SNRavgdB)
892 if SNRmin == None: SNRmin = numpy.nanmin(SNRavgdB)
893 if SNRmax == None: SNRmax = numpy.nanmax(SNRavgdB)
893 if SNRmax == None: SNRmax = numpy.nanmax(SNRavgdB)
894
894
895
895
896 self.FTP_WEI = ftp_wei
896 self.FTP_WEI = ftp_wei
897 self.EXP_CODE = exp_code
897 self.EXP_CODE = exp_code
898 self.SUB_EXP_CODE = sub_exp_code
898 self.SUB_EXP_CODE = sub_exp_code
899 self.PLOT_POS = plot_pos
899 self.PLOT_POS = plot_pos
900
900
901 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
901 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
902 self.isConfig = True
902 self.isConfig = True
903 self.figfile = figfile
903 self.figfile = figfile
904 update_figfile = True
904 update_figfile = True
905
905
906 self.setWinTitle(title)
906 self.setWinTitle(title)
907
907
908 if ((self.xmax - x[1]) < (x[1]-x[0])):
908 if ((self.xmax - x[1]) < (x[1]-x[0])):
909 x[1] = self.xmax
909 x[1] = self.xmax
910
910
911 strWind = ['Zonal', 'Meridional', 'Vertical']
911 strWind = ['Zonal', 'Meridional', 'Vertical']
912 strCb = ['Velocity (m/s)','Velocity (m/s)','Velocity (cm/s)']
912 strCb = ['Velocity (m/s)','Velocity (m/s)','Velocity (cm/s)']
913 zmaxVector = [zmax, zmax, zmax_ver]
913 zmaxVector = [zmax, zmax, zmax_ver]
914 zminVector = [zmin, zmin, zmin_ver]
914 zminVector = [zmin, zmin, zmin_ver]
915 windFactor = [1,1,100]
915 windFactor = [1,1,100]
916
916
917 for i in range(nplotsw):
917 for i in range(nplotsw):
918
918
919 title = "%s Wind: %s" %(strWind[i], thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
919 title = "%s Wind: %s" %(strWind[i], thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
920 axes = self.axesList[i*self.__nsubplots]
920 axes = self.axesList[i*self.__nsubplots]
921
921
922 z1 = z[i,:].reshape((1,-1))*windFactor[i]
922 z1 = z[i,:].reshape((1,-1))*windFactor[i]
923
923
924 axes.pcolorbuffer(x, y, z1,
924 axes.pcolorbuffer(x, y, z1,
925 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=zminVector[i], zmax=zmaxVector[i],
925 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=zminVector[i], zmax=zmaxVector[i],
926 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
926 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
927 ticksize=9, cblabel=strCb[i], cbsize="1%", colormap="seismic" )
927 ticksize=9, cblabel=strCb[i], cbsize="1%", colormap="seismic" )
928
928
929 if dataOut.data_SNR is not None:
929 if dataOut.data_SNR is not None:
930 i += 1
930 i += 1
931 title = "Signal Noise Ratio (SNR): %s" %(thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
931 title = "Signal Noise Ratio (SNR): %s" %(thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
932 axes = self.axesList[i*self.__nsubplots]
932 axes = self.axesList[i*self.__nsubplots]
933 SNRavgdB = SNRavgdB.reshape((1,-1))
933 SNRavgdB = SNRavgdB.reshape((1,-1))
934 axes.pcolorbuffer(x, y, SNRavgdB,
934 axes.pcolorbuffer(x, y, SNRavgdB,
935 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=SNRmin, zmax=SNRmax,
935 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=SNRmin, zmax=SNRmax,
936 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
936 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
937 ticksize=9, cblabel='', cbsize="1%", colormap="jet")
937 ticksize=9, cblabel='', cbsize="1%", colormap="jet")
938
938
939 self.draw()
939 self.draw()
940
940
941 self.save(figpath=figpath,
941 self.save(figpath=figpath,
942 figfile=figfile,
942 figfile=figfile,
943 save=save,
943 save=save,
944 ftp=ftp,
944 ftp=ftp,
945 wr_period=wr_period,
945 wr_period=wr_period,
946 thisDatetime=thisDatetime,
946 thisDatetime=thisDatetime,
947 update_figfile=update_figfile)
947 update_figfile=update_figfile)
948
948
949 if dataOut.ltctime + dataOut.paramInterval >= self.xmax:
949 if dataOut.ltctime + dataOut.paramInterval >= self.xmax:
950 self.counter_imagwr = wr_period
950 self.counter_imagwr = wr_period
951 self.isConfig = False
951 self.isConfig = False
952 update_figfile = True
952 update_figfile = True
953
953
954 return dataOut
954 return dataOut
955
955
956 @MPDecorator
956 @MPDecorator
957 class ParametersPlot_(Figure):
957 class ParametersPlot_(Figure):
958
958
959 __isConfig = None
959 __isConfig = None
960 __nsubplots = None
960 __nsubplots = None
961
961
962 WIDTHPROF = None
962 WIDTHPROF = None
963 HEIGHTPROF = None
963 HEIGHTPROF = None
964 PREFIX = 'param'
964 PREFIX = 'param'
965
965
966 nplots = None
966 nplots = None
967 nchan = None
967 nchan = None
968
968
969 def __init__(self):#, **kwargs):
969 def __init__(self):#, **kwargs):
970 Figure.__init__(self)#, **kwargs)
970 Figure.__init__(self)#, **kwargs)
971 self.timerange = None
971 self.timerange = None
972 self.isConfig = False
972 self.isConfig = False
973 self.__nsubplots = 1
973 self.__nsubplots = 1
974
974
975 self.WIDTH = 300
975 self.WIDTH = 300
976 self.HEIGHT = 550
976 self.HEIGHT = 550
977 self.WIDTHPROF = 120
977 self.WIDTHPROF = 120
978 self.HEIGHTPROF = 0
978 self.HEIGHTPROF = 0
979 self.counter_imagwr = 0
979 self.counter_imagwr = 0
980
980
981 self.PLOT_CODE = RTI_CODE
981 self.PLOT_CODE = RTI_CODE
982
982
983 self.FTP_WEI = None
983 self.FTP_WEI = None
984 self.EXP_CODE = None
984 self.EXP_CODE = None
985 self.SUB_EXP_CODE = None
985 self.SUB_EXP_CODE = None
986 self.PLOT_POS = None
986 self.PLOT_POS = None
987 self.tmin = None
987 self.tmin = None
988 self.tmax = None
988 self.tmax = None
989
989
990 self.xmin = None
990 self.xmin = None
991 self.xmax = None
991 self.xmax = None
992
992
993 self.figfile = None
993 self.figfile = None
994
994
995 def getSubplots(self):
995 def getSubplots(self):
996
996
997 ncol = 1
997 ncol = 1
998 nrow = self.nplots
998 nrow = self.nplots
999
999
1000 return nrow, ncol
1000 return nrow, ncol
1001
1001
1002 def setup(self, id, nplots, wintitle, show=True):
1002 def setup(self, id, nplots, wintitle, show=True):
1003
1003
1004 self.nplots = nplots
1004 self.nplots = nplots
1005
1005
1006 ncolspan = 1
1006 ncolspan = 1
1007 colspan = 1
1007 colspan = 1
1008
1008
1009 self.createFigure(id = id,
1009 self.createFigure(id = id,
1010 wintitle = wintitle,
1010 wintitle = wintitle,
1011 widthplot = self.WIDTH + self.WIDTHPROF,
1011 widthplot = self.WIDTH + self.WIDTHPROF,
1012 heightplot = self.HEIGHT + self.HEIGHTPROF,
1012 heightplot = self.HEIGHT + self.HEIGHTPROF,
1013 show=show)
1013 show=show)
1014
1014
1015 nrow, ncol = self.getSubplots()
1015 nrow, ncol = self.getSubplots()
1016
1016
1017 counter = 0
1017 counter = 0
1018 for y in range(nrow):
1018 for y in range(nrow):
1019 for x in range(ncol):
1019 for x in range(ncol):
1020
1020
1021 if counter >= self.nplots:
1021 if counter >= self.nplots:
1022 break
1022 break
1023
1023
1024 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
1024 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
1025
1025
1026 counter += 1
1026 counter += 1
1027
1027
1028 def run(self, dataOut, id, wintitle="", channelList=None, paramIndex = 0, colormap="jet",
1028 def run(self, dataOut, id, wintitle="", channelList=None, paramIndex = 0, colormap="jet",
1029 xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None, timerange=None,
1029 xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None, timerange=None,
1030 showSNR=False, SNRthresh = -numpy.inf, SNRmin=None, SNRmax=None,
1030 showSNR=False, SNRthresh = -numpy.inf, SNRmin=None, SNRmax=None,
1031 save=False, figpath='./', lastone=0,figfile=None, ftp=False, wr_period=1, show=True,
1031 save=False, figpath='./', lastone=0,figfile=None, ftp=False, wr_period=1, show=True,
1032 server=None, folder=None, username=None, password=None,
1032 server=None, folder=None, username=None, password=None,
1033 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, HEIGHT=None):
1033 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, HEIGHT=None):
1034 """
1034 """
1035
1035
1036 Input:
1036 Input:
1037 dataOut :
1037 dataOut :
1038 id :
1038 id :
1039 wintitle :
1039 wintitle :
1040 channelList :
1040 channelList :
1041 showProfile :
1041 showProfile :
1042 xmin : None,
1042 xmin : None,
1043 xmax : None,
1043 xmax : None,
1044 ymin : None,
1044 ymin : None,
1045 ymax : None,
1045 ymax : None,
1046 zmin : None,
1046 zmin : None,
1047 zmax : None
1047 zmax : None
1048 """
1048 """
1049 if dataOut.flagNoData:
1049 if dataOut.flagNoData:
1050 return dataOut
1050 return dataOut
1051
1051
1052
1052
1053 if HEIGHT is not None:
1053 if HEIGHT is not None:
1054 self.HEIGHT = HEIGHT
1054 self.HEIGHT = HEIGHT
1055
1055
1056
1056
1057 if not isTimeInHourRange(dataOut.datatime, xmin, xmax):
1057 if not isTimeInHourRange(dataOut.datatime, xmin, xmax):
1058 return
1058 return
1059
1059
1060 if channelList == None:
1060 if channelList == None:
1061 channelIndexList = list(range(dataOut.data_param.shape[0]))
1061 channelIndexList = list(range(dataOut.data_param.shape[0]))
1062 else:
1062 else:
1063 channelIndexList = []
1063 channelIndexList = []
1064 for channel in channelList:
1064 for channel in channelList:
1065 if channel not in dataOut.channelList:
1065 if channel not in dataOut.channelList:
1066 raise ValueError("Channel %d is not in dataOut.channelList")
1066 raise ValueError("Channel %d is not in dataOut.channelList")
1067 channelIndexList.append(dataOut.channelList.index(channel))
1067 channelIndexList.append(dataOut.channelList.index(channel))
1068
1068
1069 x = dataOut.getTimeRange1(dataOut.paramInterval)
1069 x = dataOut.getTimeRange1(dataOut.paramInterval)
1070 y = dataOut.getHeiRange()
1070 y = dataOut.getHeiRange()
1071
1071
1072 if dataOut.data_param.ndim == 3:
1072 if dataOut.data_param.ndim == 3:
1073 z = dataOut.data_param[channelIndexList,paramIndex,:]
1073 z = dataOut.data_param[channelIndexList,paramIndex,:]
1074 else:
1074 else:
1075 z = dataOut.data_param[channelIndexList,:]
1075 z = dataOut.data_param[channelIndexList,:]
1076
1076
1077 if showSNR:
1077 if showSNR:
1078 #SNR data
1078 #SNR data
1079 SNRarray = dataOut.data_SNR[channelIndexList,:]
1079 SNRarray = dataOut.data_SNR[channelIndexList,:]
1080 SNRdB = 10*numpy.log10(SNRarray)
1080 SNRdB = 10*numpy.log10(SNRarray)
1081 ind = numpy.where(SNRdB < SNRthresh)
1081 ind = numpy.where(SNRdB < SNRthresh)
1082 z[ind] = numpy.nan
1082 z[ind] = numpy.nan
1083
1083
1084 thisDatetime = dataOut.datatime
1084 thisDatetime = dataOut.datatime
1085 # thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0])
1085 # thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0])
1086 title = wintitle + " Parameters Plot" #: %s" %(thisDatetime.strftime("%d-%b-%Y"))
1086 title = wintitle + " Parameters Plot" #: %s" %(thisDatetime.strftime("%d-%b-%Y"))
1087 xlabel = ""
1087 xlabel = ""
1088 ylabel = "Range (km)"
1088 ylabel = "Range (km)"
1089
1089
1090 update_figfile = False
1090 update_figfile = False
1091
1091
1092 if not self.isConfig:
1092 if not self.isConfig:
1093
1093
1094 nchan = len(channelIndexList)
1094 nchan = len(channelIndexList)
1095 self.nchan = nchan
1095 self.nchan = nchan
1096 self.plotFact = 1
1096 self.plotFact = 1
1097 nplots = nchan
1097 nplots = nchan
1098
1098
1099 if showSNR:
1099 if showSNR:
1100 nplots = nchan*2
1100 nplots = nchan*2
1101 self.plotFact = 2
1101 self.plotFact = 2
1102 if SNRmin == None: SNRmin = numpy.nanmin(SNRdB)
1102 if SNRmin == None: SNRmin = numpy.nanmin(SNRdB)
1103 if SNRmax == None: SNRmax = numpy.nanmax(SNRdB)
1103 if SNRmax == None: SNRmax = numpy.nanmax(SNRdB)
1104
1104
1105 self.setup(id=id,
1105 self.setup(id=id,
1106 nplots=nplots,
1106 nplots=nplots,
1107 wintitle=wintitle,
1107 wintitle=wintitle,
1108 show=show)
1108 show=show)
1109
1109
1110 if timerange != None:
1110 if timerange != None:
1111 self.timerange = timerange
1111 self.timerange = timerange
1112
1112
1113 self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange)
1113 self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange)
1114
1114
1115 if ymin == None: ymin = numpy.nanmin(y)
1115 if ymin == None: ymin = numpy.nanmin(y)
1116 if ymax == None: ymax = numpy.nanmax(y)
1116 if ymax == None: ymax = numpy.nanmax(y)
1117 if zmin == None: zmin = numpy.nanmin(z)
1117 if zmin == None: zmin = numpy.nanmin(z)
1118 if zmax == None: zmax = numpy.nanmax(z)
1118 if zmax == None: zmax = numpy.nanmax(z)
1119
1119
1120 self.FTP_WEI = ftp_wei
1120 self.FTP_WEI = ftp_wei
1121 self.EXP_CODE = exp_code
1121 self.EXP_CODE = exp_code
1122 self.SUB_EXP_CODE = sub_exp_code
1122 self.SUB_EXP_CODE = sub_exp_code
1123 self.PLOT_POS = plot_pos
1123 self.PLOT_POS = plot_pos
1124
1124
1125 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
1125 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
1126 self.isConfig = True
1126 self.isConfig = True
1127 self.figfile = figfile
1127 self.figfile = figfile
1128 update_figfile = True
1128 update_figfile = True
1129
1129
1130 self.setWinTitle(title)
1130 self.setWinTitle(title)
1131
1131
1132 # for i in range(self.nchan):
1132 # for i in range(self.nchan):
1133 # index = channelIndexList[i]
1133 # index = channelIndexList[i]
1134 # title = "Channel %d: %s" %(dataOut.channelList[index], thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
1134 # title = "Channel %d: %s" %(dataOut.channelList[index], thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
1135 # axes = self.axesList[i*self.plotFact]
1135 # axes = self.axesList[i*self.plotFact]
1136 # z1 = z[i,:].reshape((1,-1))
1136 # z1 = z[i,:].reshape((1,-1))
1137 # axes.pcolorbuffer(x, y, z1,
1137 # axes.pcolorbuffer(x, y, z1,
1138 # xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
1138 # xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
1139 # xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
1139 # xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
1140 # ticksize=9, cblabel='', cbsize="1%",colormap=colormap)
1140 # ticksize=9, cblabel='', cbsize="1%",colormap=colormap)
1141 #
1141 #
1142 # if showSNR:
1142 # if showSNR:
1143 # title = "Channel %d SNR: %s" %(dataOut.channelList[index], thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
1143 # title = "Channel %d SNR: %s" %(dataOut.channelList[index], thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
1144 # axes = self.axesList[i*self.plotFact + 1]
1144 # axes = self.axesList[i*self.plotFact + 1]
1145 # SNRdB1 = SNRdB[i,:].reshape((1,-1))
1145 # SNRdB1 = SNRdB[i,:].reshape((1,-1))
1146 # axes.pcolorbuffer(x, y, SNRdB1,
1146 # axes.pcolorbuffer(x, y, SNRdB1,
1147 # xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=SNRmin, zmax=SNRmax,
1147 # xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=SNRmin, zmax=SNRmax,
1148 # xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
1148 # xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
1149 # ticksize=9, cblabel='', cbsize="1%",colormap='jet')
1149 # ticksize=9, cblabel='', cbsize="1%",colormap='jet')
1150
1150
1151 i=0
1151 i=0
1152 index = channelIndexList[i]
1152 index = channelIndexList[i]
1153 title = "Factor de reflectividad Z [dBZ]"
1153 title = "Factor de reflectividad Z [dBZ]"
1154 axes = self.axesList[i*self.plotFact]
1154 axes = self.axesList[i*self.plotFact]
1155 z1 = z[i,:].reshape((1,-1))
1155 z1 = z[i,:].reshape((1,-1))
1156 axes.pcolorbuffer(x, y, z1,
1156 axes.pcolorbuffer(x, y, z1,
1157 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
1157 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
1158 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
1158 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
1159 ticksize=9, cblabel='', cbsize="1%",colormap=colormap)
1159 ticksize=9, cblabel='', cbsize="1%",colormap=colormap)
1160
1160
1161 if showSNR:
1161 if showSNR:
1162 title = "Channel %d SNR: %s" %(dataOut.channelList[index], thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
1162 title = "Channel %d SNR: %s" %(dataOut.channelList[index], thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
1163 axes = self.axesList[i*self.plotFact + 1]
1163 axes = self.axesList[i*self.plotFact + 1]
1164 SNRdB1 = SNRdB[i,:].reshape((1,-1))
1164 SNRdB1 = SNRdB[i,:].reshape((1,-1))
1165 axes.pcolorbuffer(x, y, SNRdB1,
1165 axes.pcolorbuffer(x, y, SNRdB1,
1166 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=SNRmin, zmax=SNRmax,
1166 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=SNRmin, zmax=SNRmax,
1167 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
1167 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
1168 ticksize=9, cblabel='', cbsize="1%",colormap='jet')
1168 ticksize=9, cblabel='', cbsize="1%",colormap='jet')
1169
1169
1170 i=1
1170 i=1
1171 index = channelIndexList[i]
1171 index = channelIndexList[i]
1172 title = "Velocidad vertical Doppler [m/s]"
1172 title = "Velocidad vertical Doppler [m/s]"
1173 axes = self.axesList[i*self.plotFact]
1173 axes = self.axesList[i*self.plotFact]
1174 z1 = z[i,:].reshape((1,-1))
1174 z1 = z[i,:].reshape((1,-1))
1175 axes.pcolorbuffer(x, y, z1,
1175 axes.pcolorbuffer(x, y, z1,
1176 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=-10, zmax=10,
1176 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=-10, zmax=10,
1177 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
1177 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
1178 ticksize=9, cblabel='', cbsize="1%",colormap='seismic_r')
1178 ticksize=9, cblabel='', cbsize="1%",colormap='seismic_r')
1179
1179
1180 if showSNR:
1180 if showSNR:
1181 title = "Channel %d SNR: %s" %(dataOut.channelList[index], thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
1181 title = "Channel %d SNR: %s" %(dataOut.channelList[index], thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
1182 axes = self.axesList[i*self.plotFact + 1]
1182 axes = self.axesList[i*self.plotFact + 1]
1183 SNRdB1 = SNRdB[i,:].reshape((1,-1))
1183 SNRdB1 = SNRdB[i,:].reshape((1,-1))
1184 axes.pcolorbuffer(x, y, SNRdB1,
1184 axes.pcolorbuffer(x, y, SNRdB1,
1185 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=SNRmin, zmax=SNRmax,
1185 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=SNRmin, zmax=SNRmax,
1186 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
1186 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
1187 ticksize=9, cblabel='', cbsize="1%",colormap='jet')
1187 ticksize=9, cblabel='', cbsize="1%",colormap='jet')
1188
1188
1189 i=2
1189 i=2
1190 index = channelIndexList[i]
1190 index = channelIndexList[i]
1191 title = "Intensidad de lluvia [mm/h]"
1191 title = "Intensidad de lluvia [mm/h]"
1192 axes = self.axesList[i*self.plotFact]
1192 axes = self.axesList[i*self.plotFact]
1193 z1 = z[i,:].reshape((1,-1))
1193 z1 = z[i,:].reshape((1,-1))
1194 axes.pcolorbuffer(x, y, z1,
1194 axes.pcolorbuffer(x, y, z1,
1195 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=0, zmax=40,
1195 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=0, zmax=40,
1196 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
1196 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
1197 ticksize=9, cblabel='', cbsize="1%",colormap='ocean_r')
1197 ticksize=9, cblabel='', cbsize="1%",colormap='ocean_r')
1198
1198
1199 if showSNR:
1199 if showSNR:
1200 title = "Channel %d SNR: %s" %(dataOut.channelList[index], thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
1200 title = "Channel %d SNR: %s" %(dataOut.channelList[index], thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
1201 axes = self.axesList[i*self.plotFact + 1]
1201 axes = self.axesList[i*self.plotFact + 1]
1202 SNRdB1 = SNRdB[i,:].reshape((1,-1))
1202 SNRdB1 = SNRdB[i,:].reshape((1,-1))
1203 axes.pcolorbuffer(x, y, SNRdB1,
1203 axes.pcolorbuffer(x, y, SNRdB1,
1204 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=SNRmin, zmax=SNRmax,
1204 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=SNRmin, zmax=SNRmax,
1205 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
1205 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
1206 ticksize=9, cblabel='', cbsize="1%",colormap='jet')
1206 ticksize=9, cblabel='', cbsize="1%",colormap='jet')
1207
1207
1208
1208
1209 self.draw()
1209 self.draw()
1210
1210
1211 if dataOut.ltctime >= self.xmax:
1211 if dataOut.ltctime >= self.xmax:
1212 self.counter_imagwr = wr_period
1212 self.counter_imagwr = wr_period
1213 self.isConfig = False
1213 self.isConfig = False
1214 update_figfile = True
1214 update_figfile = True
1215
1215
1216 self.save(figpath=figpath,
1216 self.save(figpath=figpath,
1217 figfile=figfile,
1217 figfile=figfile,
1218 save=save,
1218 save=save,
1219 ftp=ftp,
1219 ftp=ftp,
1220 wr_period=wr_period,
1220 wr_period=wr_period,
1221 thisDatetime=thisDatetime,
1221 thisDatetime=thisDatetime,
1222 update_figfile=update_figfile)
1222 update_figfile=update_figfile)
1223
1223
1224 return dataOut
1224 return dataOut
1225 @MPDecorator
1225 @MPDecorator
1226 class Parameters1Plot_(Figure):
1226 class Parameters1Plot_(Figure):
1227
1227
1228 __isConfig = None
1228 __isConfig = None
1229 __nsubplots = None
1229 __nsubplots = None
1230
1230
1231 WIDTHPROF = None
1231 WIDTHPROF = None
1232 HEIGHTPROF = None
1232 HEIGHTPROF = None
1233 PREFIX = 'prm'
1233 PREFIX = 'prm'
1234
1234
1235 def __init__(self):
1235 def __init__(self):
1236 Figure.__init__(self)
1236 Figure.__init__(self)
1237 self.timerange = 2*60*60
1237 self.timerange = 2*60*60
1238 self.isConfig = False
1238 self.isConfig = False
1239 self.__nsubplots = 1
1239 self.__nsubplots = 1
1240
1240
1241 self.WIDTH = 800
1241 self.WIDTH = 800
1242 self.HEIGHT = 180
1242 self.HEIGHT = 180
1243 self.WIDTHPROF = 120
1243 self.WIDTHPROF = 120
1244 self.HEIGHTPROF = 0
1244 self.HEIGHTPROF = 0
1245 self.counter_imagwr = 0
1245 self.counter_imagwr = 0
1246
1246
1247 self.PLOT_CODE = PARMS_CODE
1247 self.PLOT_CODE = PARMS_CODE
1248
1248
1249 self.FTP_WEI = None
1249 self.FTP_WEI = None
1250 self.EXP_CODE = None
1250 self.EXP_CODE = None
1251 self.SUB_EXP_CODE = None
1251 self.SUB_EXP_CODE = None
1252 self.PLOT_POS = None
1252 self.PLOT_POS = None
1253 self.tmin = None
1253 self.tmin = None
1254 self.tmax = None
1254 self.tmax = None
1255
1255
1256 self.xmin = None
1256 self.xmin = None
1257 self.xmax = None
1257 self.xmax = None
1258
1258
1259 self.figfile = None
1259 self.figfile = None
1260
1260
1261 def getSubplots(self):
1261 def getSubplots(self):
1262
1262
1263 ncol = 1
1263 ncol = 1
1264 nrow = self.nplots
1264 nrow = self.nplots
1265
1265
1266 return nrow, ncol
1266 return nrow, ncol
1267
1267
1268 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
1268 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
1269
1269
1270 self.__showprofile = showprofile
1270 self.__showprofile = showprofile
1271 self.nplots = nplots
1271 self.nplots = nplots
1272
1272
1273 ncolspan = 1
1273 ncolspan = 1
1274 colspan = 1
1274 colspan = 1
1275
1275
1276 self.createFigure(id = id,
1276 self.createFigure(id = id,
1277 wintitle = wintitle,
1277 wintitle = wintitle,
1278 widthplot = self.WIDTH + self.WIDTHPROF,
1278 widthplot = self.WIDTH + self.WIDTHPROF,
1279 heightplot = self.HEIGHT + self.HEIGHTPROF,
1279 heightplot = self.HEIGHT + self.HEIGHTPROF,
1280 show=show)
1280 show=show)
1281
1281
1282 nrow, ncol = self.getSubplots()
1282 nrow, ncol = self.getSubplots()
1283
1283
1284 counter = 0
1284 counter = 0
1285 for y in range(nrow):
1285 for y in range(nrow):
1286 for x in range(ncol):
1286 for x in range(ncol):
1287
1287
1288 if counter >= self.nplots:
1288 if counter >= self.nplots:
1289 break
1289 break
1290
1290
1291 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
1291 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
1292
1292
1293 if showprofile:
1293 if showprofile:
1294 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan+colspan, 1, 1)
1294 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan+colspan, 1, 1)
1295
1295
1296 counter += 1
1296 counter += 1
1297
1297
1298 def run(self, dataOut, id, wintitle="", channelList=None, showprofile=False,
1298 def run(self, dataOut, id, wintitle="", channelList=None, showprofile=False,
1299 xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None,timerange=None,
1299 xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None,timerange=None,
1300 parameterIndex = None, onlyPositive = False,
1300 parameterIndex = None, onlyPositive = False,
1301 SNRthresh = -numpy.inf, SNR = True, SNRmin = None, SNRmax = None, onlySNR = False,
1301 SNRthresh = -numpy.inf, SNR = True, SNRmin = None, SNRmax = None, onlySNR = False,
1302 DOP = True,
1302 DOP = True,
1303 zlabel = "", parameterName = "", parameterObject = "data_param",
1303 zlabel = "", parameterName = "", parameterObject = "data_param",
1304 save=False, figpath='./', lastone=0,figfile=None, ftp=False, wr_period=1, show=True,
1304 save=False, figpath='./', lastone=0,figfile=None, ftp=False, wr_period=1, show=True,
1305 server=None, folder=None, username=None, password=None,
1305 server=None, folder=None, username=None, password=None,
1306 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0):
1306 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0):
1307
1307
1308 """
1308 """
1309 Input:
1309 Input:
1310 dataOut :
1310 dataOut :
1311 id :
1311 id :
1312 wintitle :
1312 wintitle :
1313 channelList :
1313 channelList :
1314 showProfile :
1314 showProfile :
1315 xmin : None,
1315 xmin : None,
1316 xmax : None,
1316 xmax : None,
1317 ymin : None,
1317 ymin : None,
1318 ymax : None,
1318 ymax : None,
1319 zmin : None,
1319 zmin : None,
1320 zmax : None
1320 zmax : None
1321 """
1321 """
1322 if dataOut.flagNoData:
1322 if dataOut.flagNoData:
1323 return dataOut
1323 return dataOut
1324
1324
1325 data_param = getattr(dataOut, parameterObject)
1325 data_param = getattr(dataOut, parameterObject)
1326
1326
1327 if channelList == None:
1327 if channelList == None:
1328 channelIndexList = numpy.arange(data_param.shape[0])
1328 channelIndexList = numpy.arange(data_param.shape[0])
1329 else:
1329 else:
1330 channelIndexList = numpy.array(channelList)
1330 channelIndexList = numpy.array(channelList)
1331
1331
1332 nchan = len(channelIndexList) #Number of channels being plotted
1332 nchan = len(channelIndexList) #Number of channels being plotted
1333
1333
1334 if nchan < 1:
1334 if nchan < 1:
1335 return
1335 return
1336
1336
1337 nGraphsByChannel = 0
1337 nGraphsByChannel = 0
1338
1338
1339 if SNR:
1339 if SNR:
1340 nGraphsByChannel += 1
1340 nGraphsByChannel += 1
1341 if DOP:
1341 if DOP:
1342 nGraphsByChannel += 1
1342 nGraphsByChannel += 1
1343
1343
1344 if nGraphsByChannel < 1:
1344 if nGraphsByChannel < 1:
1345 return
1345 return
1346
1346
1347 nplots = nGraphsByChannel*nchan
1347 nplots = nGraphsByChannel*nchan
1348
1348
1349 if timerange is not None:
1349 if timerange is not None:
1350 self.timerange = timerange
1350 self.timerange = timerange
1351
1351
1352 #tmin = None
1352 #tmin = None
1353 #tmax = None
1353 #tmax = None
1354 if parameterIndex == None:
1354 if parameterIndex == None:
1355 parameterIndex = 1
1355 parameterIndex = 1
1356
1356
1357 x = dataOut.getTimeRange1(dataOut.paramInterval)
1357 x = dataOut.getTimeRange1(dataOut.paramInterval)
1358 y = dataOut.heightList
1358 y = dataOut.heightList
1359
1359
1360 if dataOut.data_param.ndim == 3:
1360 if dataOut.data_param.ndim == 3:
1361 z = dataOut.data_param[channelIndexList,parameterIndex,:]
1361 z = dataOut.data_param[channelIndexList,parameterIndex,:]
1362 else:
1362 else:
1363 z = dataOut.data_param[channelIndexList,:]
1363 z = dataOut.data_param[channelIndexList,:]
1364
1364
1365 if dataOut.data_SNR is not None:
1365 if dataOut.data_SNR is not None:
1366 if dataOut.data_SNR.ndim == 2:
1366 if dataOut.data_SNR.ndim == 2:
1367 SNRavg = numpy.average(dataOut.data_SNR, axis=0)
1367 SNRavg = numpy.average(dataOut.data_SNR, axis=0)
1368 else:
1368 else:
1369 SNRavg = dataOut.data_SNR
1369 SNRavg = dataOut.data_SNR
1370 SNRdB = 10*numpy.log10(SNRavg)
1370 SNRdB = 10*numpy.log10(SNRavg)
1371
1371
1372 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0])
1372 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0])
1373 title = wintitle + " Parameters Plot" #: %s" %(thisDatetime.strftime("%d-%b-%Y"))
1373 title = wintitle + " Parameters Plot" #: %s" %(thisDatetime.strftime("%d-%b-%Y"))
1374 xlabel = ""
1374 xlabel = ""
1375 ylabel = "Range (Km)"
1375 ylabel = "Range (Km)"
1376
1376
1377 if onlyPositive:
1377 if onlyPositive:
1378 colormap = "jet"
1378 colormap = "jet"
1379 zmin = 0
1379 zmin = 0
1380 else: colormap = "RdBu_r"
1380 else: colormap = "RdBu_r"
1381
1381
1382 if not self.isConfig:
1382 if not self.isConfig:
1383
1383
1384 self.setup(id=id,
1384 self.setup(id=id,
1385 nplots=nplots,
1385 nplots=nplots,
1386 wintitle=wintitle,
1386 wintitle=wintitle,
1387 showprofile=showprofile,
1387 showprofile=showprofile,
1388 show=show)
1388 show=show)
1389
1389
1390 self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange)
1390 self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange)
1391
1391
1392 if ymin == None: ymin = numpy.nanmin(y)
1392 if ymin == None: ymin = numpy.nanmin(y)
1393 if ymax == None: ymax = numpy.nanmax(y)
1393 if ymax == None: ymax = numpy.nanmax(y)
1394 if zmin == None: zmin = numpy.nanmin(z)
1394 if zmin == None: zmin = numpy.nanmin(z)
1395 if zmax == None: zmax = numpy.nanmax(z)
1395 if zmax == None: zmax = numpy.nanmax(z)
1396
1396
1397 if SNR:
1397 if SNR:
1398 if SNRmin == None: SNRmin = numpy.nanmin(SNRdB)
1398 if SNRmin == None: SNRmin = numpy.nanmin(SNRdB)
1399 if SNRmax == None: SNRmax = numpy.nanmax(SNRdB)
1399 if SNRmax == None: SNRmax = numpy.nanmax(SNRdB)
1400
1400
1401 self.FTP_WEI = ftp_wei
1401 self.FTP_WEI = ftp_wei
1402 self.EXP_CODE = exp_code
1402 self.EXP_CODE = exp_code
1403 self.SUB_EXP_CODE = sub_exp_code
1403 self.SUB_EXP_CODE = sub_exp_code
1404 self.PLOT_POS = plot_pos
1404 self.PLOT_POS = plot_pos
1405
1405
1406 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
1406 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
1407 self.isConfig = True
1407 self.isConfig = True
1408 self.figfile = figfile
1408 self.figfile = figfile
1409
1409
1410 self.setWinTitle(title)
1410 self.setWinTitle(title)
1411
1411
1412 if ((self.xmax - x[1]) < (x[1]-x[0])):
1412 if ((self.xmax - x[1]) < (x[1]-x[0])):
1413 x[1] = self.xmax
1413 x[1] = self.xmax
1414
1414
1415 for i in range(nchan):
1415 for i in range(nchan):
1416
1416
1417 if (SNR and not onlySNR): j = 2*i
1417 if (SNR and not onlySNR): j = 2*i
1418 else: j = i
1418 else: j = i
1419
1419
1420 j = nGraphsByChannel*i
1420 j = nGraphsByChannel*i
1421
1421
1422 if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)):
1422 if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)):
1423 title = title + '_' + 'azimuth,zenith=%2.2f,%2.2f'%(dataOut.azimuth, dataOut.zenith)
1423 title = title + '_' + 'azimuth,zenith=%2.2f,%2.2f'%(dataOut.azimuth, dataOut.zenith)
1424
1424
1425 if not onlySNR:
1425 if not onlySNR:
1426 axes = self.axesList[j*self.__nsubplots]
1426 axes = self.axesList[j*self.__nsubplots]
1427 z1 = z[i,:].reshape((1,-1))
1427 z1 = z[i,:].reshape((1,-1))
1428 axes.pcolorbuffer(x, y, z1,
1428 axes.pcolorbuffer(x, y, z1,
1429 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
1429 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
1430 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,colormap=colormap,
1430 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,colormap=colormap,
1431 ticksize=9, cblabel=zlabel, cbsize="1%")
1431 ticksize=9, cblabel=zlabel, cbsize="1%")
1432
1432
1433 if DOP:
1433 if DOP:
1434 title = "%s Channel %d: %s" %(parameterName, channelIndexList[i], thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
1434 title = "%s Channel %d: %s" %(parameterName, channelIndexList[i], thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
1435
1435
1436 if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)):
1436 if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)):
1437 title = title + '_' + 'azimuth,zenith=%2.2f,%2.2f'%(dataOut.azimuth, dataOut.zenith)
1437 title = title + '_' + 'azimuth,zenith=%2.2f,%2.2f'%(dataOut.azimuth, dataOut.zenith)
1438 axes = self.axesList[j]
1438 axes = self.axesList[j]
1439 z1 = z[i,:].reshape((1,-1))
1439 z1 = z[i,:].reshape((1,-1))
1440 axes.pcolorbuffer(x, y, z1,
1440 axes.pcolorbuffer(x, y, z1,
1441 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
1441 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
1442 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,colormap=colormap,
1442 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,colormap=colormap,
1443 ticksize=9, cblabel=zlabel, cbsize="1%")
1443 ticksize=9, cblabel=zlabel, cbsize="1%")
1444
1444
1445 if SNR:
1445 if SNR:
1446 title = "Channel %d Signal Noise Ratio (SNR): %s" %(channelIndexList[i], thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
1446 title = "Channel %d Signal Noise Ratio (SNR): %s" %(channelIndexList[i], thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
1447 axes = self.axesList[(j)*self.__nsubplots]
1447 axes = self.axesList[(j)*self.__nsubplots]
1448 if not onlySNR:
1448 if not onlySNR:
1449 axes = self.axesList[(j + 1)*self.__nsubplots]
1449 axes = self.axesList[(j + 1)*self.__nsubplots]
1450
1450
1451 axes = self.axesList[(j + nGraphsByChannel-1)]
1451 axes = self.axesList[(j + nGraphsByChannel-1)]
1452 z1 = SNRdB.reshape((1,-1))
1452 z1 = SNRdB.reshape((1,-1))
1453 axes.pcolorbuffer(x, y, z1,
1453 axes.pcolorbuffer(x, y, z1,
1454 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=SNRmin, zmax=SNRmax,
1454 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=SNRmin, zmax=SNRmax,
1455 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,colormap="jet",
1455 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,colormap="jet",
1456 ticksize=9, cblabel=zlabel, cbsize="1%")
1456 ticksize=9, cblabel=zlabel, cbsize="1%")
1457
1457
1458
1458
1459
1459
1460 self.draw()
1460 self.draw()
1461
1461
1462 if x[1] >= self.axesList[0].xmax:
1462 if x[1] >= self.axesList[0].xmax:
1463 self.counter_imagwr = wr_period
1463 self.counter_imagwr = wr_period
1464 self.isConfig = False
1464 self.isConfig = False
1465 self.figfile = None
1465 self.figfile = None
1466
1466
1467 self.save(figpath=figpath,
1467 self.save(figpath=figpath,
1468 figfile=figfile,
1468 figfile=figfile,
1469 save=save,
1469 save=save,
1470 ftp=ftp,
1470 ftp=ftp,
1471 wr_period=wr_period,
1471 wr_period=wr_period,
1472 thisDatetime=thisDatetime,
1472 thisDatetime=thisDatetime,
1473 update_figfile=False)
1473 update_figfile=False)
1474 return dataOut
1474 return dataOut
1475
1475
1476 class SpectralFittingPlot_(Figure):
1476 class SpectralFittingPlot_(Figure):
1477
1477
1478 __isConfig = None
1478 __isConfig = None
1479 __nsubplots = None
1479 __nsubplots = None
1480
1480
1481 WIDTHPROF = None
1481 WIDTHPROF = None
1482 HEIGHTPROF = None
1482 HEIGHTPROF = None
1483 PREFIX = 'prm'
1483 PREFIX = 'prm'
1484
1484
1485
1485
1486 N = None
1486 N = None
1487 ippSeconds = None
1487 ippSeconds = None
1488
1488
1489 def __init__(self, **kwargs):
1489 def __init__(self, **kwargs):
1490 Figure.__init__(self, **kwargs)
1490 Figure.__init__(self, **kwargs)
1491 self.isConfig = False
1491 self.isConfig = False
1492 self.__nsubplots = 1
1492 self.__nsubplots = 1
1493
1493
1494 self.PLOT_CODE = SPECFIT_CODE
1494 self.PLOT_CODE = SPECFIT_CODE
1495
1495
1496 self.WIDTH = 450
1496 self.WIDTH = 450
1497 self.HEIGHT = 250
1497 self.HEIGHT = 250
1498 self.WIDTHPROF = 0
1498 self.WIDTHPROF = 0
1499 self.HEIGHTPROF = 0
1499 self.HEIGHTPROF = 0
1500
1500
1501 def getSubplots(self):
1501 def getSubplots(self):
1502
1502
1503 ncol = int(numpy.sqrt(self.nplots)+0.9)
1503 ncol = int(numpy.sqrt(self.nplots)+0.9)
1504 nrow = int(self.nplots*1./ncol + 0.9)
1504 nrow = int(self.nplots*1./ncol + 0.9)
1505
1505
1506 return nrow, ncol
1506 return nrow, ncol
1507
1507
1508 def setup(self, id, nplots, wintitle, showprofile=False, show=True):
1508 def setup(self, id, nplots, wintitle, showprofile=False, show=True):
1509
1509
1510 showprofile = False
1510 showprofile = False
1511 self.__showprofile = showprofile
1511 self.__showprofile = showprofile
1512 self.nplots = nplots
1512 self.nplots = nplots
1513
1513
1514 ncolspan = 5
1514 ncolspan = 5
1515 colspan = 4
1515 colspan = 4
1516 if showprofile:
1516 if showprofile:
1517 ncolspan = 5
1517 ncolspan = 5
1518 colspan = 4
1518 colspan = 4
1519 self.__nsubplots = 2
1519 self.__nsubplots = 2
1520
1520
1521 self.createFigure(id = id,
1521 self.createFigure(id = id,
1522 wintitle = wintitle,
1522 wintitle = wintitle,
1523 widthplot = self.WIDTH + self.WIDTHPROF,
1523 widthplot = self.WIDTH + self.WIDTHPROF,
1524 heightplot = self.HEIGHT + self.HEIGHTPROF,
1524 heightplot = self.HEIGHT + self.HEIGHTPROF,
1525 show=show)
1525 show=show)
1526
1526
1527 nrow, ncol = self.getSubplots()
1527 nrow, ncol = self.getSubplots()
1528
1528
1529 counter = 0
1529 counter = 0
1530 for y in range(nrow):
1530 for y in range(nrow):
1531 for x in range(ncol):
1531 for x in range(ncol):
1532
1532
1533 if counter >= self.nplots:
1533 if counter >= self.nplots:
1534 break
1534 break
1535
1535
1536 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
1536 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
1537
1537
1538 if showprofile:
1538 if showprofile:
1539 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan+colspan, 1, 1)
1539 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan+colspan, 1, 1)
1540
1540
1541 counter += 1
1541 counter += 1
1542
1542
1543 def run(self, dataOut, id, cutHeight=None, fit=False, wintitle="", channelList=None, showprofile=True,
1543 def run(self, dataOut, id, cutHeight=None, fit=False, wintitle="", channelList=None, showprofile=True,
1544 xmin=None, xmax=None, ymin=None, ymax=None,
1544 xmin=None, xmax=None, ymin=None, ymax=None,
1545 save=False, figpath='./', figfile=None, show=True):
1545 save=False, figpath='./', figfile=None, show=True):
1546
1546
1547 """
1547 """
1548
1548
1549 Input:
1549 Input:
1550 dataOut :
1550 dataOut :
1551 id :
1551 id :
1552 wintitle :
1552 wintitle :
1553 channelList :
1553 channelList :
1554 showProfile :
1554 showProfile :
1555 xmin : None,
1555 xmin : None,
1556 xmax : None,
1556 xmax : None,
1557 zmin : None,
1557 zmin : None,
1558 zmax : None
1558 zmax : None
1559 """
1559 """
1560
1560
1561 if cutHeight==None:
1561 if cutHeight==None:
1562 h=270
1562 h=270
1563 heightindex = numpy.abs(cutHeight - dataOut.heightList).argmin()
1563 heightindex = numpy.abs(cutHeight - dataOut.heightList).argmin()
1564 cutHeight = dataOut.heightList[heightindex]
1564 cutHeight = dataOut.heightList[heightindex]
1565
1565
1566 factor = dataOut.normFactor
1566 factor = dataOut.normFactor
1567 x = dataOut.abscissaList[:-1]
1567 x = dataOut.abscissaList[:-1]
1568 #y = dataOut.getHeiRange()
1568 #y = dataOut.getHeiRange()
1569
1569
1570 z = dataOut.data_pre[:,:,heightindex]/factor
1570 z = dataOut.data_pre[:,:,heightindex]/factor
1571 z = numpy.where(numpy.isfinite(z), z, numpy.NAN)
1571 z = numpy.where(numpy.isfinite(z), z, numpy.NAN)
1572 avg = numpy.average(z, axis=1)
1572 avg = numpy.average(z, axis=1)
1573 listChannels = z.shape[0]
1573 listChannels = z.shape[0]
1574
1574
1575 #Reconstruct Function
1575 #Reconstruct Function
1576 if fit==True:
1576 if fit==True:
1577 groupArray = dataOut.groupList
1577 groupArray = dataOut.groupList
1578 listChannels = groupArray.reshape((groupArray.size))
1578 listChannels = groupArray.reshape((groupArray.size))
1579 listChannels.sort()
1579 listChannels.sort()
1580 spcFitLine = numpy.zeros(z.shape)
1580 spcFitLine = numpy.zeros(z.shape)
1581 constants = dataOut.constants
1581 constants = dataOut.constants
1582
1582
1583 nGroups = groupArray.shape[0]
1583 nGroups = groupArray.shape[0]
1584 nChannels = groupArray.shape[1]
1584 nChannels = groupArray.shape[1]
1585 nProfiles = z.shape[1]
1585 nProfiles = z.shape[1]
1586
1586
1587 for f in range(nGroups):
1587 for f in range(nGroups):
1588 groupChann = groupArray[f,:]
1588 groupChann = groupArray[f,:]
1589 p = dataOut.data_param[f,:,heightindex]
1589 p = dataOut.data_param[f,:,heightindex]
1590 # p = numpy.array([ 89.343967,0.14036615,0.17086219,18.89835291,1.58388365,1.55099167])
1590 # p = numpy.array([ 89.343967,0.14036615,0.17086219,18.89835291,1.58388365,1.55099167])
1591 fitLineAux = dataOut.library.modelFunction(p, constants)*nProfiles
1591 fitLineAux = dataOut.library.modelFunction(p, constants)*nProfiles
1592 fitLineAux = fitLineAux.reshape((nChannels,nProfiles))
1592 fitLineAux = fitLineAux.reshape((nChannels,nProfiles))
1593 spcFitLine[groupChann,:] = fitLineAux
1593 spcFitLine[groupChann,:] = fitLineAux
1594 # spcFitLine = spcFitLine/factor
1594 # spcFitLine = spcFitLine/factor
1595
1595
1596 z = z[listChannels,:]
1596 z = z[listChannels,:]
1597 spcFitLine = spcFitLine[listChannels,:]
1597 spcFitLine = spcFitLine[listChannels,:]
1598 spcFitLinedB = 10*numpy.log10(spcFitLine)
1598 spcFitLinedB = 10*numpy.log10(spcFitLine)
1599
1599
1600 zdB = 10*numpy.log10(z)
1600 zdB = 10*numpy.log10(z)
1601 #thisDatetime = dataOut.datatime
1601 #thisDatetime = dataOut.datatime
1602 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0])
1602 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0])
1603 title = wintitle + " Doppler Spectra: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S"))
1603 title = wintitle + " Doppler Spectra: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S"))
1604 xlabel = "Velocity (m/s)"
1604 xlabel = "Velocity (m/s)"
1605 ylabel = "Spectrum"
1605 ylabel = "Spectrum"
1606
1606
1607 if not self.isConfig:
1607 if not self.isConfig:
1608
1608
1609 nplots = listChannels.size
1609 nplots = listChannels.size
1610
1610
1611 self.setup(id=id,
1611 self.setup(id=id,
1612 nplots=nplots,
1612 nplots=nplots,
1613 wintitle=wintitle,
1613 wintitle=wintitle,
1614 showprofile=showprofile,
1614 showprofile=showprofile,
1615 show=show)
1615 show=show)
1616
1616
1617 if xmin == None: xmin = numpy.nanmin(x)
1617 if xmin == None: xmin = numpy.nanmin(x)
1618 if xmax == None: xmax = numpy.nanmax(x)
1618 if xmax == None: xmax = numpy.nanmax(x)
1619 if ymin == None: ymin = numpy.nanmin(zdB)
1619 if ymin == None: ymin = numpy.nanmin(zdB)
1620 if ymax == None: ymax = numpy.nanmax(zdB)+2
1620 if ymax == None: ymax = numpy.nanmax(zdB)+2
1621
1621
1622 self.isConfig = True
1622 self.isConfig = True
1623
1623
1624 self.setWinTitle(title)
1624 self.setWinTitle(title)
1625 for i in range(self.nplots):
1625 for i in range(self.nplots):
1626 # title = "Channel %d: %4.2fdB" %(dataOut.channelList[i]+1, noisedB[i])
1626 # title = "Channel %d: %4.2fdB" %(dataOut.channelList[i]+1, noisedB[i])
1627 title = "Height %4.1f km\nChannel %d:" %(cutHeight, listChannels[i])
1627 title = "Height %4.1f km\nChannel %d:" %(cutHeight, listChannels[i])
1628 axes = self.axesList[i*self.__nsubplots]
1628 axes = self.axesList[i*self.__nsubplots]
1629 if fit == False:
1629 if fit == False:
1630 axes.pline(x, zdB[i,:],
1630 axes.pline(x, zdB[i,:],
1631 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax,
1631 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax,
1632 xlabel=xlabel, ylabel=ylabel, title=title
1632 xlabel=xlabel, ylabel=ylabel, title=title
1633 )
1633 )
1634 if fit == True:
1634 if fit == True:
1635 fitline=spcFitLinedB[i,:]
1635 fitline=spcFitLinedB[i,:]
1636 y=numpy.vstack([zdB[i,:],fitline] )
1636 y=numpy.vstack([zdB[i,:],fitline] )
1637 legendlabels=['Data','Fitting']
1637 legendlabels=['Data','Fitting']
1638 axes.pmultilineyaxis(x, y,
1638 axes.pmultilineyaxis(x, y,
1639 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax,
1639 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax,
1640 xlabel=xlabel, ylabel=ylabel, title=title,
1640 xlabel=xlabel, ylabel=ylabel, title=title,
1641 legendlabels=legendlabels, marker=None,
1641 legendlabels=legendlabels, marker=None,
1642 linestyle='solid', grid='both')
1642 linestyle='solid', grid='both')
1643
1643
1644 self.draw()
1644 self.draw()
1645
1645
1646 self.save(figpath=figpath,
1646 self.save(figpath=figpath,
1647 figfile=figfile,
1647 figfile=figfile,
1648 save=save,
1648 save=save,
1649 ftp=ftp,
1649 ftp=ftp,
1650 wr_period=wr_period,
1650 wr_period=wr_period,
1651 thisDatetime=thisDatetime)
1651 thisDatetime=thisDatetime)
1652
1652
1653
1653
1654 class EWDriftsPlot_(Figure):
1654 class EWDriftsPlot_(Figure):
1655
1655
1656 __isConfig = None
1656 __isConfig = None
1657 __nsubplots = None
1657 __nsubplots = None
1658
1658
1659 WIDTHPROF = None
1659 WIDTHPROF = None
1660 HEIGHTPROF = None
1660 HEIGHTPROF = None
1661 PREFIX = 'drift'
1661 PREFIX = 'drift'
1662
1662
1663 def __init__(self, **kwargs):
1663 def __init__(self, **kwargs):
1664 Figure.__init__(self, **kwargs)
1664 Figure.__init__(self, **kwargs)
1665 self.timerange = 2*60*60
1665 self.timerange = 2*60*60
1666 self.isConfig = False
1666 self.isConfig = False
1667 self.__nsubplots = 1
1667 self.__nsubplots = 1
1668
1668
1669 self.WIDTH = 800
1669 self.WIDTH = 800
1670 self.HEIGHT = 150
1670 self.HEIGHT = 150
1671 self.WIDTHPROF = 120
1671 self.WIDTHPROF = 120
1672 self.HEIGHTPROF = 0
1672 self.HEIGHTPROF = 0
1673 self.counter_imagwr = 0
1673 self.counter_imagwr = 0
1674
1674
1675 self.PLOT_CODE = EWDRIFT_CODE
1675 self.PLOT_CODE = EWDRIFT_CODE
1676
1676
1677 self.FTP_WEI = None
1677 self.FTP_WEI = None
1678 self.EXP_CODE = None
1678 self.EXP_CODE = None
1679 self.SUB_EXP_CODE = None
1679 self.SUB_EXP_CODE = None
1680 self.PLOT_POS = None
1680 self.PLOT_POS = None
1681 self.tmin = None
1681 self.tmin = None
1682 self.tmax = None
1682 self.tmax = None
1683
1683
1684 self.xmin = None
1684 self.xmin = None
1685 self.xmax = None
1685 self.xmax = None
1686
1686
1687 self.figfile = None
1687 self.figfile = None
1688
1688
1689 def getSubplots(self):
1689 def getSubplots(self):
1690
1690
1691 ncol = 1
1691 ncol = 1
1692 nrow = self.nplots
1692 nrow = self.nplots
1693
1693
1694 return nrow, ncol
1694 return nrow, ncol
1695
1695
1696 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
1696 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
1697
1697
1698 self.__showprofile = showprofile
1698 self.__showprofile = showprofile
1699 self.nplots = nplots
1699 self.nplots = nplots
1700
1700
1701 ncolspan = 1
1701 ncolspan = 1
1702 colspan = 1
1702 colspan = 1
1703
1703
1704 self.createFigure(id = id,
1704 self.createFigure(id = id,
1705 wintitle = wintitle,
1705 wintitle = wintitle,
1706 widthplot = self.WIDTH + self.WIDTHPROF,
1706 widthplot = self.WIDTH + self.WIDTHPROF,
1707 heightplot = self.HEIGHT + self.HEIGHTPROF,
1707 heightplot = self.HEIGHT + self.HEIGHTPROF,
1708 show=show)
1708 show=show)
1709
1709
1710 nrow, ncol = self.getSubplots()
1710 nrow, ncol = self.getSubplots()
1711
1711
1712 counter = 0
1712 counter = 0
1713 for y in range(nrow):
1713 for y in range(nrow):
1714 if counter >= self.nplots:
1714 if counter >= self.nplots:
1715 break
1715 break
1716
1716
1717 self.addAxes(nrow, ncol*ncolspan, y, 0, colspan, 1)
1717 self.addAxes(nrow, ncol*ncolspan, y, 0, colspan, 1)
1718 counter += 1
1718 counter += 1
1719
1719
1720 def run(self, dataOut, id, wintitle="", channelList=None,
1720 def run(self, dataOut, id, wintitle="", channelList=None,
1721 xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None,
1721 xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None,
1722 zmaxVertical = None, zminVertical = None, zmaxZonal = None, zminZonal = None,
1722 zmaxVertical = None, zminVertical = None, zmaxZonal = None, zminZonal = None,
1723 timerange=None, SNRthresh = -numpy.inf, SNRmin = None, SNRmax = None, SNR_1 = False,
1723 timerange=None, SNRthresh = -numpy.inf, SNRmin = None, SNRmax = None, SNR_1 = False,
1724 save=False, figpath='./', lastone=0,figfile=None, ftp=False, wr_period=1, show=True,
1724 save=False, figpath='./', lastone=0,figfile=None, ftp=False, wr_period=1, show=True,
1725 server=None, folder=None, username=None, password=None,
1725 server=None, folder=None, username=None, password=None,
1726 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0):
1726 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0):
1727 """
1727 """
1728
1728
1729 Input:
1729 Input:
1730 dataOut :
1730 dataOut :
1731 id :
1731 id :
1732 wintitle :
1732 wintitle :
1733 channelList :
1733 channelList :
1734 showProfile :
1734 showProfile :
1735 xmin : None,
1735 xmin : None,
1736 xmax : None,
1736 xmax : None,
1737 ymin : None,
1737 ymin : None,
1738 ymax : None,
1738 ymax : None,
1739 zmin : None,
1739 zmin : None,
1740 zmax : None
1740 zmax : None
1741 """
1741 """
1742
1742
1743 if timerange is not None:
1743 if timerange is not None:
1744 self.timerange = timerange
1744 self.timerange = timerange
1745
1745
1746 tmin = None
1746 tmin = None
1747 tmax = None
1747 tmax = None
1748
1748
1749 x = dataOut.getTimeRange1(dataOut.outputInterval)
1749 x = dataOut.getTimeRange1(dataOut.outputInterval)
1750 # y = dataOut.heightList
1750 # y = dataOut.heightList
1751 y = dataOut.heightList
1751 y = dataOut.heightList
1752
1752
1753 z = dataOut.data_output
1753 z = dataOut.data_output
1754 nplots = z.shape[0] #Number of wind dimensions estimated
1754 nplots = z.shape[0] #Number of wind dimensions estimated
1755 nplotsw = nplots
1755 nplotsw = nplots
1756
1756
1757 #If there is a SNR function defined
1757 #If there is a SNR function defined
1758 if dataOut.data_SNR is not None:
1758 if dataOut.data_SNR is not None:
1759 nplots += 1
1759 nplots += 1
1760 SNR = dataOut.data_SNR
1760 SNR = dataOut.data_SNR
1761
1761
1762 if SNR_1:
1762 if SNR_1:
1763 SNR += 1
1763 SNR += 1
1764
1764
1765 SNRavg = numpy.average(SNR, axis=0)
1765 SNRavg = numpy.average(SNR, axis=0)
1766
1766
1767 SNRdB = 10*numpy.log10(SNR)
1767 SNRdB = 10*numpy.log10(SNR)
1768 SNRavgdB = 10*numpy.log10(SNRavg)
1768 SNRavgdB = 10*numpy.log10(SNRavg)
1769
1769
1770 ind = numpy.where(SNRavg < 10**(SNRthresh/10))[0]
1770 ind = numpy.where(SNRavg < 10**(SNRthresh/10))[0]
1771
1771
1772 for i in range(nplotsw):
1772 for i in range(nplotsw):
1773 z[i,ind] = numpy.nan
1773 z[i,ind] = numpy.nan
1774
1774
1775
1775
1776 showprofile = False
1776 showprofile = False
1777 # thisDatetime = dataOut.datatime
1777 # thisDatetime = dataOut.datatime
1778 thisDatetime = datetime.datetime.utcfromtimestamp(x[1])
1778 thisDatetime = datetime.datetime.utcfromtimestamp(x[1])
1779 title = wintitle + " EW Drifts"
1779 title = wintitle + " EW Drifts"
1780 xlabel = ""
1780 xlabel = ""
1781 ylabel = "Height (Km)"
1781 ylabel = "Height (Km)"
1782
1782
1783 if not self.isConfig:
1783 if not self.isConfig:
1784
1784
1785 self.setup(id=id,
1785 self.setup(id=id,
1786 nplots=nplots,
1786 nplots=nplots,
1787 wintitle=wintitle,
1787 wintitle=wintitle,
1788 showprofile=showprofile,
1788 showprofile=showprofile,
1789 show=show)
1789 show=show)
1790
1790
1791 self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange)
1791 self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange)
1792
1792
1793 if ymin == None: ymin = numpy.nanmin(y)
1793 if ymin == None: ymin = numpy.nanmin(y)
1794 if ymax == None: ymax = numpy.nanmax(y)
1794 if ymax == None: ymax = numpy.nanmax(y)
1795
1795
1796 if zmaxZonal == None: zmaxZonal = numpy.nanmax(abs(z[0,:]))
1796 if zmaxZonal == None: zmaxZonal = numpy.nanmax(abs(z[0,:]))
1797 if zminZonal == None: zminZonal = -zmaxZonal
1797 if zminZonal == None: zminZonal = -zmaxZonal
1798 if zmaxVertical == None: zmaxVertical = numpy.nanmax(abs(z[1,:]))
1798 if zmaxVertical == None: zmaxVertical = numpy.nanmax(abs(z[1,:]))
1799 if zminVertical == None: zminVertical = -zmaxVertical
1799 if zminVertical == None: zminVertical = -zmaxVertical
1800
1800
1801 if dataOut.data_SNR is not None:
1801 if dataOut.data_SNR is not None:
1802 if SNRmin == None: SNRmin = numpy.nanmin(SNRavgdB)
1802 if SNRmin == None: SNRmin = numpy.nanmin(SNRavgdB)
1803 if SNRmax == None: SNRmax = numpy.nanmax(SNRavgdB)
1803 if SNRmax == None: SNRmax = numpy.nanmax(SNRavgdB)
1804
1804
1805 self.FTP_WEI = ftp_wei
1805 self.FTP_WEI = ftp_wei
1806 self.EXP_CODE = exp_code
1806 self.EXP_CODE = exp_code
1807 self.SUB_EXP_CODE = sub_exp_code
1807 self.SUB_EXP_CODE = sub_exp_code
1808 self.PLOT_POS = plot_pos
1808 self.PLOT_POS = plot_pos
1809
1809
1810 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
1810 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
1811 self.isConfig = True
1811 self.isConfig = True
1812
1812
1813
1813
1814 self.setWinTitle(title)
1814 self.setWinTitle(title)
1815
1815
1816 if ((self.xmax - x[1]) < (x[1]-x[0])):
1816 if ((self.xmax - x[1]) < (x[1]-x[0])):
1817 x[1] = self.xmax
1817 x[1] = self.xmax
1818
1818
1819 strWind = ['Zonal','Vertical']
1819 strWind = ['Zonal','Vertical']
1820 strCb = 'Velocity (m/s)'
1820 strCb = 'Velocity (m/s)'
1821 zmaxVector = [zmaxZonal, zmaxVertical]
1821 zmaxVector = [zmaxZonal, zmaxVertical]
1822 zminVector = [zminZonal, zminVertical]
1822 zminVector = [zminZonal, zminVertical]
1823
1823
1824 for i in range(nplotsw):
1824 for i in range(nplotsw):
1825
1825
1826 title = "%s Drifts: %s" %(strWind[i], thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
1826 title = "%s Drifts: %s" %(strWind[i], thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
1827 axes = self.axesList[i*self.__nsubplots]
1827 axes = self.axesList[i*self.__nsubplots]
1828
1828
1829 z1 = z[i,:].reshape((1,-1))
1829 z1 = z[i,:].reshape((1,-1))
1830
1830
1831 axes.pcolorbuffer(x, y, z1,
1831 axes.pcolorbuffer(x, y, z1,
1832 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=zminVector[i], zmax=zmaxVector[i],
1832 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=zminVector[i], zmax=zmaxVector[i],
1833 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
1833 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
1834 ticksize=9, cblabel=strCb, cbsize="1%", colormap="RdBu_r")
1834 ticksize=9, cblabel=strCb, cbsize="1%", colormap="RdBu_r")
1835
1835
1836 if dataOut.data_SNR is not None:
1836 if dataOut.data_SNR is not None:
1837 i += 1
1837 i += 1
1838 if SNR_1:
1838 if SNR_1:
1839 title = "Signal Noise Ratio + 1 (SNR+1): %s" %(thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
1839 title = "Signal Noise Ratio + 1 (SNR+1): %s" %(thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
1840 else:
1840 else:
1841 title = "Signal Noise Ratio (SNR): %s" %(thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
1841 title = "Signal Noise Ratio (SNR): %s" %(thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
1842 axes = self.axesList[i*self.__nsubplots]
1842 axes = self.axesList[i*self.__nsubplots]
1843 SNRavgdB = SNRavgdB.reshape((1,-1))
1843 SNRavgdB = SNRavgdB.reshape((1,-1))
1844
1844
1845 axes.pcolorbuffer(x, y, SNRavgdB,
1845 axes.pcolorbuffer(x, y, SNRavgdB,
1846 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=SNRmin, zmax=SNRmax,
1846 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=SNRmin, zmax=SNRmax,
1847 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
1847 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
1848 ticksize=9, cblabel='', cbsize="1%", colormap="jet")
1848 ticksize=9, cblabel='', cbsize="1%", colormap="jet")
1849
1849
1850 self.draw()
1850 self.draw()
1851
1851
1852 if x[1] >= self.axesList[0].xmax:
1852 if x[1] >= self.axesList[0].xmax:
1853 self.counter_imagwr = wr_period
1853 self.counter_imagwr = wr_period
1854 self.isConfig = False
1854 self.isConfig = False
1855 self.figfile = None
1855 self.figfile = None
1856
1856
1857
1857
1858
1858
1859
1859
1860 class PhasePlot_(Figure):
1860 class PhasePlot_(Figure):
1861
1861
1862 __isConfig = None
1862 __isConfig = None
1863 __nsubplots = None
1863 __nsubplots = None
1864
1864
1865 PREFIX = 'mphase'
1865 PREFIX = 'mphase'
1866
1866
1867
1867
1868 def __init__(self, **kwargs):
1868 def __init__(self, **kwargs):
1869 Figure.__init__(self, **kwargs)
1869 Figure.__init__(self, **kwargs)
1870 self.timerange = 24*60*60
1870 self.timerange = 24*60*60
1871 self.isConfig = False
1871 self.isConfig = False
1872 self.__nsubplots = 1
1872 self.__nsubplots = 1
1873 self.counter_imagwr = 0
1873 self.counter_imagwr = 0
1874 self.WIDTH = 600
1874 self.WIDTH = 600
1875 self.HEIGHT = 300
1875 self.HEIGHT = 300
1876 self.WIDTHPROF = 120
1876 self.WIDTHPROF = 120
1877 self.HEIGHTPROF = 0
1877 self.HEIGHTPROF = 0
1878 self.xdata = None
1878 self.xdata = None
1879 self.ydata = None
1879 self.ydata = None
1880
1880
1881 self.PLOT_CODE = MPHASE_CODE
1881 self.PLOT_CODE = MPHASE_CODE
1882
1882
1883 self.FTP_WEI = None
1883 self.FTP_WEI = None
1884 self.EXP_CODE = None
1884 self.EXP_CODE = None
1885 self.SUB_EXP_CODE = None
1885 self.SUB_EXP_CODE = None
1886 self.PLOT_POS = None
1886 self.PLOT_POS = None
1887
1887
1888
1888
1889 self.filename_phase = None
1889 self.filename_phase = None
1890
1890
1891 self.figfile = None
1891 self.figfile = None
1892
1892
1893 def getSubplots(self):
1893 def getSubplots(self):
1894
1894
1895 ncol = 1
1895 ncol = 1
1896 nrow = 1
1896 nrow = 1
1897
1897
1898 return nrow, ncol
1898 return nrow, ncol
1899
1899
1900 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
1900 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
1901
1901
1902 self.__showprofile = showprofile
1902 self.__showprofile = showprofile
1903 self.nplots = nplots
1903 self.nplots = nplots
1904
1904
1905 ncolspan = 7
1905 ncolspan = 7
1906 colspan = 6
1906 colspan = 6
1907 self.__nsubplots = 2
1907 self.__nsubplots = 2
1908
1908
1909 self.createFigure(id = id,
1909 self.createFigure(id = id,
1910 wintitle = wintitle,
1910 wintitle = wintitle,
1911 widthplot = self.WIDTH+self.WIDTHPROF,
1911 widthplot = self.WIDTH+self.WIDTHPROF,
1912 heightplot = self.HEIGHT+self.HEIGHTPROF,
1912 heightplot = self.HEIGHT+self.HEIGHTPROF,
1913 show=show)
1913 show=show)
1914
1914
1915 nrow, ncol = self.getSubplots()
1915 nrow, ncol = self.getSubplots()
1916
1916
1917 self.addAxes(nrow, ncol*ncolspan, 0, 0, colspan, 1)
1917 self.addAxes(nrow, ncol*ncolspan, 0, 0, colspan, 1)
1918
1918
1919
1919
1920 def run(self, dataOut, id, wintitle="", pairsList=None, showprofile='True',
1920 def run(self, dataOut, id, wintitle="", pairsList=None, showprofile='True',
1921 xmin=None, xmax=None, ymin=None, ymax=None,
1921 xmin=None, xmax=None, ymin=None, ymax=None,
1922 timerange=None,
1922 timerange=None,
1923 save=False, figpath='./', figfile=None, show=True, ftp=False, wr_period=1,
1923 save=False, figpath='./', figfile=None, show=True, ftp=False, wr_period=1,
1924 server=None, folder=None, username=None, password=None,
1924 server=None, folder=None, username=None, password=None,
1925 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0):
1925 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0):
1926
1926
1927
1927
1928 tmin = None
1928 tmin = None
1929 tmax = None
1929 tmax = None
1930 x = dataOut.getTimeRange1(dataOut.outputInterval)
1930 x = dataOut.getTimeRange1(dataOut.outputInterval)
1931 y = dataOut.getHeiRange()
1931 y = dataOut.getHeiRange()
1932
1932
1933
1933
1934 #thisDatetime = dataOut.datatime
1934 #thisDatetime = dataOut.datatime
1935 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.ltctime)
1935 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.ltctime)
1936 title = wintitle + " Phase of Beacon Signal" # : %s" %(thisDatetime.strftime("%d-%b-%Y"))
1936 title = wintitle + " Phase of Beacon Signal" # : %s" %(thisDatetime.strftime("%d-%b-%Y"))
1937 xlabel = "Local Time"
1937 xlabel = "Local Time"
1938 ylabel = "Phase"
1938 ylabel = "Phase"
1939
1939
1940
1940
1941 #phase = numpy.zeros((len(pairsIndexList),len(dataOut.beacon_heiIndexList)))
1941 #phase = numpy.zeros((len(pairsIndexList),len(dataOut.beacon_heiIndexList)))
1942 phase_beacon = dataOut.data_output
1942 phase_beacon = dataOut.data_output
1943 update_figfile = False
1943 update_figfile = False
1944
1944
1945 if not self.isConfig:
1945 if not self.isConfig:
1946
1946
1947 self.nplots = phase_beacon.size
1947 self.nplots = phase_beacon.size
1948
1948
1949 self.setup(id=id,
1949 self.setup(id=id,
1950 nplots=self.nplots,
1950 nplots=self.nplots,
1951 wintitle=wintitle,
1951 wintitle=wintitle,
1952 showprofile=showprofile,
1952 showprofile=showprofile,
1953 show=show)
1953 show=show)
1954
1954
1955 if timerange is not None:
1955 if timerange is not None:
1956 self.timerange = timerange
1956 self.timerange = timerange
1957
1957
1958 self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange)
1958 self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange)
1959
1959
1960 if ymin == None: ymin = numpy.nanmin(phase_beacon) - 10.0
1960 if ymin == None: ymin = numpy.nanmin(phase_beacon) - 10.0
1961 if ymax == None: ymax = numpy.nanmax(phase_beacon) + 10.0
1961 if ymax == None: ymax = numpy.nanmax(phase_beacon) + 10.0
1962
1962
1963 self.FTP_WEI = ftp_wei
1963 self.FTP_WEI = ftp_wei
1964 self.EXP_CODE = exp_code
1964 self.EXP_CODE = exp_code
1965 self.SUB_EXP_CODE = sub_exp_code
1965 self.SUB_EXP_CODE = sub_exp_code
1966 self.PLOT_POS = plot_pos
1966 self.PLOT_POS = plot_pos
1967
1967
1968 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
1968 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
1969 self.isConfig = True
1969 self.isConfig = True
1970 self.figfile = figfile
1970 self.figfile = figfile
1971 self.xdata = numpy.array([])
1971 self.xdata = numpy.array([])
1972 self.ydata = numpy.array([])
1972 self.ydata = numpy.array([])
1973
1973
1974 #open file beacon phase
1974 #open file beacon phase
1975 path = '%s%03d' %(self.PREFIX, self.id)
1975 path = '%s%03d' %(self.PREFIX, self.id)
1976 beacon_file = os.path.join(path,'%s.txt'%self.name)
1976 beacon_file = os.path.join(path,'%s.txt'%self.name)
1977 self.filename_phase = os.path.join(figpath,beacon_file)
1977 self.filename_phase = os.path.join(figpath,beacon_file)
1978 update_figfile = True
1978 update_figfile = True
1979
1979
1980
1980
1981 #store data beacon phase
1981 #store data beacon phase
1982 #self.save_data(self.filename_phase, phase_beacon, thisDatetime)
1982 #self.save_data(self.filename_phase, phase_beacon, thisDatetime)
1983
1983
1984 self.setWinTitle(title)
1984 self.setWinTitle(title)
1985
1985
1986
1986
1987 title = "Phase Offset %s" %(thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
1987 title = "Phase Offset %s" %(thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
1988
1988
1989 legendlabels = ["phase %d"%(chan) for chan in numpy.arange(self.nplots)]
1989 legendlabels = ["phase %d"%(chan) for chan in numpy.arange(self.nplots)]
1990
1990
1991 axes = self.axesList[0]
1991 axes = self.axesList[0]
1992
1992
1993 self.xdata = numpy.hstack((self.xdata, x[0:1]))
1993 self.xdata = numpy.hstack((self.xdata, x[0:1]))
1994
1994
1995 if len(self.ydata)==0:
1995 if len(self.ydata)==0:
1996 self.ydata = phase_beacon.reshape(-1,1)
1996 self.ydata = phase_beacon.reshape(-1,1)
1997 else:
1997 else:
1998 self.ydata = numpy.hstack((self.ydata, phase_beacon.reshape(-1,1)))
1998 self.ydata = numpy.hstack((self.ydata, phase_beacon.reshape(-1,1)))
1999
1999
2000
2000
2001 axes.pmultilineyaxis(x=self.xdata, y=self.ydata,
2001 axes.pmultilineyaxis(x=self.xdata, y=self.ydata,
2002 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax,
2002 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax,
2003 xlabel=xlabel, ylabel=ylabel, title=title, legendlabels=legendlabels, marker='x', markersize=8, linestyle="solid",
2003 xlabel=xlabel, ylabel=ylabel, title=title, legendlabels=legendlabels, marker='x', markersize=8, linestyle="solid",
2004 XAxisAsTime=True, grid='both'
2004 XAxisAsTime=True, grid='both'
2005 )
2005 )
2006
2006
2007 self.draw()
2007 self.draw()
2008
2008
2009 self.save(figpath=figpath,
2009 self.save(figpath=figpath,
2010 figfile=figfile,
2010 figfile=figfile,
2011 save=save,
2011 save=save,
2012 ftp=ftp,
2012 ftp=ftp,
2013 wr_period=wr_period,
2013 wr_period=wr_period,
2014 thisDatetime=thisDatetime,
2014 thisDatetime=thisDatetime,
2015 update_figfile=update_figfile)
2015 update_figfile=update_figfile)
2016
2016
2017 if dataOut.ltctime + dataOut.outputInterval >= self.xmax:
2017 if dataOut.ltctime + dataOut.outputInterval >= self.xmax:
2018 self.counter_imagwr = wr_period
2018 self.counter_imagwr = wr_period
2019 self.isConfig = False
2019 self.isConfig = False
2020 update_figfile = True
2020 update_figfile = True
2021
2021
2022
2022
2023
2023
2024 class NSMeteorDetection1Plot_(Figure):
2024 class NSMeteorDetection1Plot_(Figure):
2025
2025
2026 isConfig = None
2026 isConfig = None
2027 __nsubplots = None
2027 __nsubplots = None
2028
2028
2029 WIDTHPROF = None
2029 WIDTHPROF = None
2030 HEIGHTPROF = None
2030 HEIGHTPROF = None
2031 PREFIX = 'nsm'
2031 PREFIX = 'nsm'
2032
2032
2033 zminList = None
2033 zminList = None
2034 zmaxList = None
2034 zmaxList = None
2035 cmapList = None
2035 cmapList = None
2036 titleList = None
2036 titleList = None
2037 nPairs = None
2037 nPairs = None
2038 nChannels = None
2038 nChannels = None
2039 nParam = None
2039 nParam = None
2040
2040
2041 def __init__(self, **kwargs):
2041 def __init__(self, **kwargs):
2042 Figure.__init__(self, **kwargs)
2042 Figure.__init__(self, **kwargs)
2043 self.isConfig = False
2043 self.isConfig = False
2044 self.__nsubplots = 1
2044 self.__nsubplots = 1
2045
2045
2046 self.WIDTH = 750
2046 self.WIDTH = 750
2047 self.HEIGHT = 250
2047 self.HEIGHT = 250
2048 self.WIDTHPROF = 120
2048 self.WIDTHPROF = 120
2049 self.HEIGHTPROF = 0
2049 self.HEIGHTPROF = 0
2050 self.counter_imagwr = 0
2050 self.counter_imagwr = 0
2051
2051
2052 self.PLOT_CODE = SPEC_CODE
2052 self.PLOT_CODE = SPEC_CODE
2053
2053
2054 self.FTP_WEI = None
2054 self.FTP_WEI = None
2055 self.EXP_CODE = None
2055 self.EXP_CODE = None
2056 self.SUB_EXP_CODE = None
2056 self.SUB_EXP_CODE = None
2057 self.PLOT_POS = None
2057 self.PLOT_POS = None
2058
2058
2059 self.__xfilter_ena = False
2059 self.__xfilter_ena = False
2060 self.__yfilter_ena = False
2060 self.__yfilter_ena = False
2061
2061
2062 def getSubplots(self):
2062 def getSubplots(self):
2063
2063
2064 ncol = 3
2064 ncol = 3
2065 nrow = int(numpy.ceil(self.nplots/3.0))
2065 nrow = int(numpy.ceil(self.nplots/3.0))
2066
2066
2067 return nrow, ncol
2067 return nrow, ncol
2068
2068
2069 def setup(self, id, nplots, wintitle, show=True):
2069 def setup(self, id, nplots, wintitle, show=True):
2070
2070
2071 self.nplots = nplots
2071 self.nplots = nplots
2072
2072
2073 ncolspan = 1
2073 ncolspan = 1
2074 colspan = 1
2074 colspan = 1
2075
2075
2076 self.createFigure(id = id,
2076 self.createFigure(id = id,
2077 wintitle = wintitle,
2077 wintitle = wintitle,
2078 widthplot = self.WIDTH + self.WIDTHPROF,
2078 widthplot = self.WIDTH + self.WIDTHPROF,
2079 heightplot = self.HEIGHT + self.HEIGHTPROF,
2079 heightplot = self.HEIGHT + self.HEIGHTPROF,
2080 show=show)
2080 show=show)
2081
2081
2082 nrow, ncol = self.getSubplots()
2082 nrow, ncol = self.getSubplots()
2083
2083
2084 counter = 0
2084 counter = 0
2085 for y in range(nrow):
2085 for y in range(nrow):
2086 for x in range(ncol):
2086 for x in range(ncol):
2087
2087
2088 if counter >= self.nplots:
2088 if counter >= self.nplots:
2089 break
2089 break
2090
2090
2091 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
2091 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
2092
2092
2093 counter += 1
2093 counter += 1
2094
2094
2095 def run(self, dataOut, id, wintitle="", channelList=None, showprofile=True,
2095 def run(self, dataOut, id, wintitle="", channelList=None, showprofile=True,
2096 xmin=None, xmax=None, ymin=None, ymax=None, SNRmin=None, SNRmax=None,
2096 xmin=None, xmax=None, ymin=None, ymax=None, SNRmin=None, SNRmax=None,
2097 vmin=None, vmax=None, wmin=None, wmax=None, mode = 'SA',
2097 vmin=None, vmax=None, wmin=None, wmax=None, mode = 'SA',
2098 save=False, figpath='./', figfile=None, show=True, ftp=False, wr_period=1,
2098 save=False, figpath='./', figfile=None, show=True, ftp=False, wr_period=1,
2099 server=None, folder=None, username=None, password=None,
2099 server=None, folder=None, username=None, password=None,
2100 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, realtime=False,
2100 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, realtime=False,
2101 xaxis="frequency"):
2101 xaxis="frequency"):
2102
2102
2103 """
2103 """
2104
2104
2105 Input:
2105 Input:
2106 dataOut :
2106 dataOut :
2107 id :
2107 id :
2108 wintitle :
2108 wintitle :
2109 channelList :
2109 channelList :
2110 showProfile :
2110 showProfile :
2111 xmin : None,
2111 xmin : None,
2112 xmax : None,
2112 xmax : None,
2113 ymin : None,
2113 ymin : None,
2114 ymax : None,
2114 ymax : None,
2115 zmin : None,
2115 zmin : None,
2116 zmax : None
2116 zmax : None
2117 """
2117 """
2118 #SEPARAR EN DOS PLOTS
2118 #SEPARAR EN DOS PLOTS
2119 nParam = dataOut.data_param.shape[1] - 3
2119 nParam = dataOut.data_param.shape[1] - 3
2120
2120
2121 utctime = dataOut.data_param[0,0]
2121 utctime = dataOut.data_param[0,0]
2122 tmet = dataOut.data_param[:,1].astype(int)
2122 tmet = dataOut.data_param[:,1].astype(int)
2123 hmet = dataOut.data_param[:,2].astype(int)
2123 hmet = dataOut.data_param[:,2].astype(int)
2124
2124
2125 x = dataOut.abscissaList
2125 x = dataOut.abscissaList
2126 y = dataOut.heightList
2126 y = dataOut.heightList
2127
2127
2128 z = numpy.zeros((nParam, y.size, x.size - 1))
2128 z = numpy.zeros((nParam, y.size, x.size - 1))
2129 z[:,:] = numpy.nan
2129 z[:,:] = numpy.nan
2130 z[:,hmet,tmet] = dataOut.data_param[:,3:].T
2130 z[:,hmet,tmet] = dataOut.data_param[:,3:].T
2131 z[0,:,:] = 10*numpy.log10(z[0,:,:])
2131 z[0,:,:] = 10*numpy.log10(z[0,:,:])
2132
2132
2133 xlabel = "Time (s)"
2133 xlabel = "Time (s)"
2134 ylabel = "Range (km)"
2134 ylabel = "Range (km)"
2135
2135
2136 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.ltctime)
2136 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.ltctime)
2137
2137
2138 if not self.isConfig:
2138 if not self.isConfig:
2139
2139
2140 nplots = nParam
2140 nplots = nParam
2141
2141
2142 self.setup(id=id,
2142 self.setup(id=id,
2143 nplots=nplots,
2143 nplots=nplots,
2144 wintitle=wintitle,
2144 wintitle=wintitle,
2145 show=show)
2145 show=show)
2146
2146
2147 if xmin is None: xmin = numpy.nanmin(x)
2147 if xmin is None: xmin = numpy.nanmin(x)
2148 if xmax is None: xmax = numpy.nanmax(x)
2148 if xmax is None: xmax = numpy.nanmax(x)
2149 if ymin is None: ymin = numpy.nanmin(y)
2149 if ymin is None: ymin = numpy.nanmin(y)
2150 if ymax is None: ymax = numpy.nanmax(y)
2150 if ymax is None: ymax = numpy.nanmax(y)
2151 if SNRmin is None: SNRmin = numpy.nanmin(z[0,:])
2151 if SNRmin is None: SNRmin = numpy.nanmin(z[0,:])
2152 if SNRmax is None: SNRmax = numpy.nanmax(z[0,:])
2152 if SNRmax is None: SNRmax = numpy.nanmax(z[0,:])
2153 if vmax is None: vmax = numpy.nanmax(numpy.abs(z[1,:]))
2153 if vmax is None: vmax = numpy.nanmax(numpy.abs(z[1,:]))
2154 if vmin is None: vmin = -vmax
2154 if vmin is None: vmin = -vmax
2155 if wmin is None: wmin = 0
2155 if wmin is None: wmin = 0
2156 if wmax is None: wmax = 50
2156 if wmax is None: wmax = 50
2157
2157
2158 pairsList = dataOut.groupList
2158 pairsList = dataOut.groupList
2159 self.nPairs = len(dataOut.groupList)
2159 self.nPairs = len(dataOut.groupList)
2160
2160
2161 zminList = [SNRmin, vmin, cmin] + [pmin]*self.nPairs
2161 zminList = [SNRmin, vmin, cmin] + [pmin]*self.nPairs
2162 zmaxList = [SNRmax, vmax, cmax] + [pmax]*self.nPairs
2162 zmaxList = [SNRmax, vmax, cmax] + [pmax]*self.nPairs
2163 titleList = ["SNR","Radial Velocity","Coherence"]
2163 titleList = ["SNR","Radial Velocity","Coherence"]
2164 cmapList = ["jet","RdBu_r","jet"]
2164 cmapList = ["jet","RdBu_r","jet"]
2165
2165
2166 for i in range(self.nPairs):
2166 for i in range(self.nPairs):
2167 strAux1 = "Phase Difference "+ str(pairsList[i][0]) + str(pairsList[i][1])
2167 strAux1 = "Phase Difference "+ str(pairsList[i][0]) + str(pairsList[i][1])
2168 titleList = titleList + [strAux1]
2168 titleList = titleList + [strAux1]
2169 cmapList = cmapList + ["RdBu_r"]
2169 cmapList = cmapList + ["RdBu_r"]
2170
2170
2171 self.zminList = zminList
2171 self.zminList = zminList
2172 self.zmaxList = zmaxList
2172 self.zmaxList = zmaxList
2173 self.cmapList = cmapList
2173 self.cmapList = cmapList
2174 self.titleList = titleList
2174 self.titleList = titleList
2175
2175
2176 self.FTP_WEI = ftp_wei
2176 self.FTP_WEI = ftp_wei
2177 self.EXP_CODE = exp_code
2177 self.EXP_CODE = exp_code
2178 self.SUB_EXP_CODE = sub_exp_code
2178 self.SUB_EXP_CODE = sub_exp_code
2179 self.PLOT_POS = plot_pos
2179 self.PLOT_POS = plot_pos
2180
2180
2181 self.isConfig = True
2181 self.isConfig = True
2182
2182
2183 str_datetime = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S"))
2183 str_datetime = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S"))
2184
2184
2185 for i in range(nParam):
2185 for i in range(nParam):
2186 title = self.titleList[i] + ": " +str_datetime
2186 title = self.titleList[i] + ": " +str_datetime
2187 axes = self.axesList[i]
2187 axes = self.axesList[i]
2188 axes.pcolor(x, y, z[i,:].T,
2188 axes.pcolor(x, y, z[i,:].T,
2189 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=self.zminList[i], zmax=self.zmaxList[i],
2189 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=self.zminList[i], zmax=self.zmaxList[i],
2190 xlabel=xlabel, ylabel=ylabel, title=title, colormap=self.cmapList[i],ticksize=9, cblabel='')
2190 xlabel=xlabel, ylabel=ylabel, title=title, colormap=self.cmapList[i],ticksize=9, cblabel='')
2191 self.draw()
2191 self.draw()
2192
2192
2193 if figfile == None:
2193 if figfile == None:
2194 str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S")
2194 str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S")
2195 name = str_datetime
2195 name = str_datetime
2196 if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)):
2196 if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)):
2197 name = name + '_az' + '_%2.2f'%(dataOut.azimuth) + '_zn' + '_%2.2f'%(dataOut.zenith)
2197 name = name + '_az' + '_%2.2f'%(dataOut.azimuth) + '_zn' + '_%2.2f'%(dataOut.zenith)
2198 figfile = self.getFilename(name)
2198 figfile = self.getFilename(name)
2199
2199
2200 self.save(figpath=figpath,
2200 self.save(figpath=figpath,
2201 figfile=figfile,
2201 figfile=figfile,
2202 save=save,
2202 save=save,
2203 ftp=ftp,
2203 ftp=ftp,
2204 wr_period=wr_period,
2204 wr_period=wr_period,
2205 thisDatetime=thisDatetime)
2205 thisDatetime=thisDatetime)
2206
2206
2207
2207
2208 class NSMeteorDetection2Plot_(Figure):
2208 class NSMeteorDetection2Plot_(Figure):
2209
2209
2210 isConfig = None
2210 isConfig = None
2211 __nsubplots = None
2211 __nsubplots = None
2212
2212
2213 WIDTHPROF = None
2213 WIDTHPROF = None
2214 HEIGHTPROF = None
2214 HEIGHTPROF = None
2215 PREFIX = 'nsm'
2215 PREFIX = 'nsm'
2216
2216
2217 zminList = None
2217 zminList = None
2218 zmaxList = None
2218 zmaxList = None
2219 cmapList = None
2219 cmapList = None
2220 titleList = None
2220 titleList = None
2221 nPairs = None
2221 nPairs = None
2222 nChannels = None
2222 nChannels = None
2223 nParam = None
2223 nParam = None
2224
2224
2225 def __init__(self, **kwargs):
2225 def __init__(self, **kwargs):
2226 Figure.__init__(self, **kwargs)
2226 Figure.__init__(self, **kwargs)
2227 self.isConfig = False
2227 self.isConfig = False
2228 self.__nsubplots = 1
2228 self.__nsubplots = 1
2229
2229
2230 self.WIDTH = 750
2230 self.WIDTH = 750
2231 self.HEIGHT = 250
2231 self.HEIGHT = 250
2232 self.WIDTHPROF = 120
2232 self.WIDTHPROF = 120
2233 self.HEIGHTPROF = 0
2233 self.HEIGHTPROF = 0
2234 self.counter_imagwr = 0
2234 self.counter_imagwr = 0
2235
2235
2236 self.PLOT_CODE = SPEC_CODE
2236 self.PLOT_CODE = SPEC_CODE
2237
2237
2238 self.FTP_WEI = None
2238 self.FTP_WEI = None
2239 self.EXP_CODE = None
2239 self.EXP_CODE = None
2240 self.SUB_EXP_CODE = None
2240 self.SUB_EXP_CODE = None
2241 self.PLOT_POS = None
2241 self.PLOT_POS = None
2242
2242
2243 self.__xfilter_ena = False
2243 self.__xfilter_ena = False
2244 self.__yfilter_ena = False
2244 self.__yfilter_ena = False
2245
2245
2246 def getSubplots(self):
2246 def getSubplots(self):
2247
2247
2248 ncol = 3
2248 ncol = 3
2249 nrow = int(numpy.ceil(self.nplots/3.0))
2249 nrow = int(numpy.ceil(self.nplots/3.0))
2250
2250
2251 return nrow, ncol
2251 return nrow, ncol
2252
2252
2253 def setup(self, id, nplots, wintitle, show=True):
2253 def setup(self, id, nplots, wintitle, show=True):
2254
2254
2255 self.nplots = nplots
2255 self.nplots = nplots
2256
2256
2257 ncolspan = 1
2257 ncolspan = 1
2258 colspan = 1
2258 colspan = 1
2259
2259
2260 self.createFigure(id = id,
2260 self.createFigure(id = id,
2261 wintitle = wintitle,
2261 wintitle = wintitle,
2262 widthplot = self.WIDTH + self.WIDTHPROF,
2262 widthplot = self.WIDTH + self.WIDTHPROF,
2263 heightplot = self.HEIGHT + self.HEIGHTPROF,
2263 heightplot = self.HEIGHT + self.HEIGHTPROF,
2264 show=show)
2264 show=show)
2265
2265
2266 nrow, ncol = self.getSubplots()
2266 nrow, ncol = self.getSubplots()
2267
2267
2268 counter = 0
2268 counter = 0
2269 for y in range(nrow):
2269 for y in range(nrow):
2270 for x in range(ncol):
2270 for x in range(ncol):
2271
2271
2272 if counter >= self.nplots:
2272 if counter >= self.nplots:
2273 break
2273 break
2274
2274
2275 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
2275 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
2276
2276
2277 counter += 1
2277 counter += 1
2278
2278
2279 def run(self, dataOut, id, wintitle="", channelList=None, showprofile=True,
2279 def run(self, dataOut, id, wintitle="", channelList=None, showprofile=True,
2280 xmin=None, xmax=None, ymin=None, ymax=None, SNRmin=None, SNRmax=None,
2280 xmin=None, xmax=None, ymin=None, ymax=None, SNRmin=None, SNRmax=None,
2281 vmin=None, vmax=None, wmin=None, wmax=None, mode = 'SA',
2281 vmin=None, vmax=None, wmin=None, wmax=None, mode = 'SA',
2282 save=False, figpath='./', figfile=None, show=True, ftp=False, wr_period=1,
2282 save=False, figpath='./', figfile=None, show=True, ftp=False, wr_period=1,
2283 server=None, folder=None, username=None, password=None,
2283 server=None, folder=None, username=None, password=None,
2284 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, realtime=False,
2284 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, realtime=False,
2285 xaxis="frequency"):
2285 xaxis="frequency"):
2286
2286
2287 """
2287 """
2288
2288
2289 Input:
2289 Input:
2290 dataOut :
2290 dataOut :
2291 id :
2291 id :
2292 wintitle :
2292 wintitle :
2293 channelList :
2293 channelList :
2294 showProfile :
2294 showProfile :
2295 xmin : None,
2295 xmin : None,
2296 xmax : None,
2296 xmax : None,
2297 ymin : None,
2297 ymin : None,
2298 ymax : None,
2298 ymax : None,
2299 zmin : None,
2299 zmin : None,
2300 zmax : None
2300 zmax : None
2301 """
2301 """
2302 #Rebuild matrix
2302 #Rebuild matrix
2303 utctime = dataOut.data_param[0,0]
2303 utctime = dataOut.data_param[0,0]
2304 cmet = dataOut.data_param[:,1].astype(int)
2304 cmet = dataOut.data_param[:,1].astype(int)
2305 tmet = dataOut.data_param[:,2].astype(int)
2305 tmet = dataOut.data_param[:,2].astype(int)
2306 hmet = dataOut.data_param[:,3].astype(int)
2306 hmet = dataOut.data_param[:,3].astype(int)
2307
2307
2308 nParam = 3
2308 nParam = 3
2309 nChan = len(dataOut.groupList)
2309 nChan = len(dataOut.groupList)
2310 x = dataOut.abscissaList
2310 x = dataOut.abscissaList
2311 y = dataOut.heightList
2311 y = dataOut.heightList
2312
2312
2313 z = numpy.full((nChan, nParam, y.size, x.size - 1),numpy.nan)
2313 z = numpy.full((nChan, nParam, y.size, x.size - 1),numpy.nan)
2314 z[cmet,:,hmet,tmet] = dataOut.data_param[:,4:]
2314 z[cmet,:,hmet,tmet] = dataOut.data_param[:,4:]
2315 z[:,0,:,:] = 10*numpy.log10(z[:,0,:,:]) #logarithmic scale
2315 z[:,0,:,:] = 10*numpy.log10(z[:,0,:,:]) #logarithmic scale
2316 z = numpy.reshape(z, (nChan*nParam, y.size, x.size-1))
2316 z = numpy.reshape(z, (nChan*nParam, y.size, x.size-1))
2317
2317
2318 xlabel = "Time (s)"
2318 xlabel = "Time (s)"
2319 ylabel = "Range (km)"
2319 ylabel = "Range (km)"
2320
2320
2321 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.ltctime)
2321 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.ltctime)
2322
2322
2323 if not self.isConfig:
2323 if not self.isConfig:
2324
2324
2325 nplots = nParam*nChan
2325 nplots = nParam*nChan
2326
2326
2327 self.setup(id=id,
2327 self.setup(id=id,
2328 nplots=nplots,
2328 nplots=nplots,
2329 wintitle=wintitle,
2329 wintitle=wintitle,
2330 show=show)
2330 show=show)
2331
2331
2332 if xmin is None: xmin = numpy.nanmin(x)
2332 if xmin is None: xmin = numpy.nanmin(x)
2333 if xmax is None: xmax = numpy.nanmax(x)
2333 if xmax is None: xmax = numpy.nanmax(x)
2334 if ymin is None: ymin = numpy.nanmin(y)
2334 if ymin is None: ymin = numpy.nanmin(y)
2335 if ymax is None: ymax = numpy.nanmax(y)
2335 if ymax is None: ymax = numpy.nanmax(y)
2336 if SNRmin is None: SNRmin = numpy.nanmin(z[0,:])
2336 if SNRmin is None: SNRmin = numpy.nanmin(z[0,:])
2337 if SNRmax is None: SNRmax = numpy.nanmax(z[0,:])
2337 if SNRmax is None: SNRmax = numpy.nanmax(z[0,:])
2338 if vmax is None: vmax = numpy.nanmax(numpy.abs(z[1,:]))
2338 if vmax is None: vmax = numpy.nanmax(numpy.abs(z[1,:]))
2339 if vmin is None: vmin = -vmax
2339 if vmin is None: vmin = -vmax
2340 if wmin is None: wmin = 0
2340 if wmin is None: wmin = 0
2341 if wmax is None: wmax = 50
2341 if wmax is None: wmax = 50
2342
2342
2343 self.nChannels = nChan
2343 self.nChannels = nChan
2344
2344
2345 zminList = []
2345 zminList = []
2346 zmaxList = []
2346 zmaxList = []
2347 titleList = []
2347 titleList = []
2348 cmapList = []
2348 cmapList = []
2349 for i in range(self.nChannels):
2349 for i in range(self.nChannels):
2350 strAux1 = "SNR Channel "+ str(i)
2350 strAux1 = "SNR Channel "+ str(i)
2351 strAux2 = "Radial Velocity Channel "+ str(i)
2351 strAux2 = "Radial Velocity Channel "+ str(i)
2352 strAux3 = "Spectral Width Channel "+ str(i)
2352 strAux3 = "Spectral Width Channel "+ str(i)
2353
2353
2354 titleList = titleList + [strAux1,strAux2,strAux3]
2354 titleList = titleList + [strAux1,strAux2,strAux3]
2355 cmapList = cmapList + ["jet","RdBu_r","jet"]
2355 cmapList = cmapList + ["jet","RdBu_r","jet"]
2356 zminList = zminList + [SNRmin,vmin,wmin]
2356 zminList = zminList + [SNRmin,vmin,wmin]
2357 zmaxList = zmaxList + [SNRmax,vmax,wmax]
2357 zmaxList = zmaxList + [SNRmax,vmax,wmax]
2358
2358
2359 self.zminList = zminList
2359 self.zminList = zminList
2360 self.zmaxList = zmaxList
2360 self.zmaxList = zmaxList
2361 self.cmapList = cmapList
2361 self.cmapList = cmapList
2362 self.titleList = titleList
2362 self.titleList = titleList
2363
2363
2364 self.FTP_WEI = ftp_wei
2364 self.FTP_WEI = ftp_wei
2365 self.EXP_CODE = exp_code
2365 self.EXP_CODE = exp_code
2366 self.SUB_EXP_CODE = sub_exp_code
2366 self.SUB_EXP_CODE = sub_exp_code
2367 self.PLOT_POS = plot_pos
2367 self.PLOT_POS = plot_pos
2368
2368
2369 self.isConfig = True
2369 self.isConfig = True
2370
2370
2371 str_datetime = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S"))
2371 str_datetime = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S"))
2372
2372
2373 for i in range(self.nplots):
2373 for i in range(self.nplots):
2374 title = self.titleList[i] + ": " +str_datetime
2374 title = self.titleList[i] + ": " +str_datetime
2375 axes = self.axesList[i]
2375 axes = self.axesList[i]
2376 axes.pcolor(x, y, z[i,:].T,
2376 axes.pcolor(x, y, z[i,:].T,
2377 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=self.zminList[i], zmax=self.zmaxList[i],
2377 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=self.zminList[i], zmax=self.zmaxList[i],
2378 xlabel=xlabel, ylabel=ylabel, title=title, colormap=self.cmapList[i],ticksize=9, cblabel='')
2378 xlabel=xlabel, ylabel=ylabel, title=title, colormap=self.cmapList[i],ticksize=9, cblabel='')
2379 self.draw()
2379 self.draw()
2380
2380
2381 if figfile == None:
2381 if figfile == None:
2382 str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S")
2382 str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S")
2383 name = str_datetime
2383 name = str_datetime
2384 if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)):
2384 if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)):
2385 name = name + '_az' + '_%2.2f'%(dataOut.azimuth) + '_zn' + '_%2.2f'%(dataOut.zenith)
2385 name = name + '_az' + '_%2.2f'%(dataOut.azimuth) + '_zn' + '_%2.2f'%(dataOut.zenith)
2386 figfile = self.getFilename(name)
2386 figfile = self.getFilename(name)
2387
2387
2388 self.save(figpath=figpath,
2388 self.save(figpath=figpath,
2389 figfile=figfile,
2389 figfile=figfile,
2390 save=save,
2390 save=save,
2391 ftp=ftp,
2391 ftp=ftp,
2392 wr_period=wr_period,
2392 wr_period=wr_period,
2393 thisDatetime=thisDatetime)
2393 thisDatetime=thisDatetime)
2394 No newline at end of file
2394
@@ -1,1588 +1,1589
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 from .figure import Figure, isRealtime, isTimeInHourRange
10 from .figure import Figure, isRealtime, isTimeInHourRange
11 from .plotting_codes import *
11 from .plotting_codes import *
12 from schainpy.model.proc.jroproc_base import MPDecorator
12 from schainpy.model.proc.jroproc_base import MPDecorator
13
13
14 from schainpy.utils import log
14 from schainpy.utils import log
15
15
16 @MPDecorator
16 @MPDecorator
17 class SpectraPlot_(Figure):
17 class SpectraPlot_(Figure):
18
18
19 isConfig = None
19 isConfig = None
20 __nsubplots = None
20 __nsubplots = None
21
21
22 WIDTHPROF = None
22 WIDTHPROF = None
23 HEIGHTPROF = None
23 HEIGHTPROF = None
24 PREFIX = 'spc'
24 PREFIX = 'spc'
25
25
26 def __init__(self):
26 def __init__(self):
27 Figure.__init__(self)
27 Figure.__init__(self)
28 self.isConfig = False
28 self.isConfig = False
29 self.__nsubplots = 1
29 self.__nsubplots = 1
30 self.WIDTH = 250
30 self.WIDTH = 250
31 self.HEIGHT = 250
31 self.HEIGHT = 250
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 dataOut.flagNoData:
111 if dataOut.flagNoData:
112 return dataOut
112 return dataOut
113
113
114 if realtime:
114 if realtime:
115 if not(isRealtime(utcdatatime = dataOut.utctime)):
115 if not(isRealtime(utcdatatime = dataOut.utctime)):
116 print('Skipping this plot function')
116 print('Skipping this plot function')
117 return
117 return
118
118
119 if channelList == None:
119 if channelList == None:
120 channelIndexList = dataOut.channelIndexList
120 channelIndexList = dataOut.channelIndexList
121 else:
121 else:
122 channelIndexList = []
122 channelIndexList = []
123 for channel in channelList:
123 for channel in channelList:
124 if channel not in dataOut.channelList:
124 if channel not in dataOut.channelList:
125 raise ValueError("Channel %d is not in dataOut.channelList" %channel)
125 raise ValueError("Channel %d is not in dataOut.channelList" %channel)
126 channelIndexList.append(dataOut.channelList.index(channel))
126 channelIndexList.append(dataOut.channelList.index(channel))
127
127
128 if normFactor is None:
128 if normFactor is None:
129 factor = dataOut.normFactor
129 factor = dataOut.normFactor
130 else:
130 else:
131 factor = normFactor
131 factor = normFactor
132 if xaxis == "frequency":
132 if xaxis == "frequency":
133 x = dataOut.getFreqRange(1)/1000.
133 x = dataOut.getFreqRange(1)/1000.
134 xlabel = "Frequency (kHz)"
134 xlabel = "Frequency (kHz)"
135
135
136 elif xaxis == "time":
136 elif xaxis == "time":
137 x = dataOut.getAcfRange(1)
137 x = dataOut.getAcfRange(1)
138 xlabel = "Time (ms)"
138 xlabel = "Time (ms)"
139
139
140 else:
140 else:
141 x = dataOut.getVelRange(1)
141 x = dataOut.getVelRange(1)
142 xlabel = "Velocity (m/s)"
142 xlabel = "Velocity (m/s)"
143
143
144 ylabel = "Range (km)"
144 ylabel = "Range (km)"
145
145
146 y = dataOut.getHeiRange()
146 y = dataOut.getHeiRange()
147 z = dataOut.data_spc/factor
147 z = dataOut.data_spc/factor
148 z = numpy.where(numpy.isfinite(z), z, numpy.NAN)
148 z = numpy.where(numpy.isfinite(z), z, numpy.NAN)
149 zdB = 10*numpy.log10(z)
149 zdB = 10*numpy.log10(z)
150
150
151 avg = numpy.average(z, axis=1)
151 avg = numpy.average(z, axis=1)
152 avgdB = 10*numpy.log10(avg)
152 avgdB = 10*numpy.log10(avg)
153
153
154 noise = dataOut.getNoise()/factor
154 noise = dataOut.getNoise()/factor
155 noisedB = 10*numpy.log10(noise)
155 noisedB = 10*numpy.log10(noise)
156
156
157 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0])
157 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0])
158 title = wintitle + " Spectra"
158 title = wintitle + " Spectra"
159
159
160 if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)):
160 if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)):
161 title = title + '_' + 'azimuth,zenith=%2.2f,%2.2f'%(dataOut.azimuth, dataOut.zenith)
161 title = title + '_' + 'azimuth,zenith=%2.2f,%2.2f'%(dataOut.azimuth, dataOut.zenith)
162
162
163 if not self.isConfig:
163 if not self.isConfig:
164
164
165 nplots = len(channelIndexList)
165 nplots = len(channelIndexList)
166
166
167 self.setup(id=id,
167 self.setup(id=id,
168 nplots=nplots,
168 nplots=nplots,
169 wintitle=wintitle,
169 wintitle=wintitle,
170 showprofile=showprofile,
170 showprofile=showprofile,
171 show=show)
171 show=show)
172
172
173 if xmin == None: xmin = numpy.nanmin(x)
173 if xmin == None: xmin = numpy.nanmin(x)
174 if xmax == None: xmax = numpy.nanmax(x)
174 if xmax == None: xmax = numpy.nanmax(x)
175 if ymin == None: ymin = numpy.nanmin(y)
175 if ymin == None: ymin = numpy.nanmin(y)
176 if ymax == None: ymax = numpy.nanmax(y)
176 if ymax == None: ymax = numpy.nanmax(y)
177 if zmin == None: zmin = numpy.floor(numpy.nanmin(noisedB)) - 3
177 if zmin == None: zmin = numpy.floor(numpy.nanmin(noisedB)) - 3
178 if zmax == None: zmax = numpy.ceil(numpy.nanmax(avgdB)) + 3
178 if zmax == None: zmax = numpy.ceil(numpy.nanmax(avgdB)) + 3
179
179
180 self.FTP_WEI = ftp_wei
180 self.FTP_WEI = ftp_wei
181 self.EXP_CODE = exp_code
181 self.EXP_CODE = exp_code
182 self.SUB_EXP_CODE = sub_exp_code
182 self.SUB_EXP_CODE = sub_exp_code
183 self.PLOT_POS = plot_pos
183 self.PLOT_POS = plot_pos
184
184
185 self.isConfig = True
185 self.isConfig = True
186
186
187 self.setWinTitle(title)
187 self.setWinTitle(title)
188
188
189 for i in range(self.nplots):
189 for i in range(self.nplots):
190 index = channelIndexList[i]
190 index = channelIndexList[i]
191 str_datetime = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S"))
191 str_datetime = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S"))
192 title = "Channel %d: %4.2fdB: %s" %(dataOut.channelList[index], noisedB[index], str_datetime)
192 title = "Channel %d: %4.2fdB: %s" %(dataOut.channelList[index], noisedB[index], str_datetime)
193 if len(dataOut.beam.codeList) != 0:
193 if len(dataOut.beam.codeList) != 0:
194 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)
194 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)
195
195
196 axes = self.axesList[i*self.__nsubplots]
196 axes = self.axesList[i*self.__nsubplots]
197 axes.pcolor(x, y, zdB[index,:,:],
197 axes.pcolor(x, y, zdB[index,:,:],
198 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
198 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
199 xlabel=xlabel, ylabel=ylabel, title=title, colormap=colormap,
199 xlabel=xlabel, ylabel=ylabel, title=title, colormap=colormap,
200 ticksize=9, cblabel='')
200 ticksize=9, cblabel='')
201
201
202 if self.__showprofile:
202 if self.__showprofile:
203 axes = self.axesList[i*self.__nsubplots +1]
203 axes = self.axesList[i*self.__nsubplots +1]
204 axes.pline(avgdB[index,:], y,
204 axes.pline(avgdB[index,:], y,
205 xmin=zmin, xmax=zmax, ymin=ymin, ymax=ymax,
205 xmin=zmin, xmax=zmax, ymin=ymin, ymax=ymax,
206 xlabel='dB', ylabel='', title='',
206 xlabel='dB', ylabel='', title='',
207 ytick_visible=False,
207 ytick_visible=False,
208 grid='x')
208 grid='x')
209
209
210 noiseline = numpy.repeat(noisedB[index], len(y))
210 noiseline = numpy.repeat(noisedB[index], len(y))
211 axes.addpline(noiseline, y, idline=1, color="black", linestyle="dashed", lw=2)
211 axes.addpline(noiseline, y, idline=1, color="black", linestyle="dashed", lw=2)
212
212
213 self.draw()
213 self.draw()
214
214
215 if figfile == None:
215 if figfile == None:
216 str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S")
216 str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S")
217 name = str_datetime
217 name = str_datetime
218 if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)):
218 if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)):
219 name = name + '_az' + '_%2.2f'%(dataOut.azimuth) + '_zn' + '_%2.2f'%(dataOut.zenith)
219 name = name + '_az' + '_%2.2f'%(dataOut.azimuth) + '_zn' + '_%2.2f'%(dataOut.zenith)
220 figfile = self.getFilename(name)
220 figfile = self.getFilename(name)
221
221
222 self.save(figpath=figpath,
222 self.save(figpath=figpath,
223 figfile=figfile,
223 figfile=figfile,
224 save=save,
224 save=save,
225 ftp=ftp,
225 ftp=ftp,
226 wr_period=wr_period,
226 wr_period=wr_period,
227 thisDatetime=thisDatetime)
227 thisDatetime=thisDatetime)
228
228
229
229
230 return dataOut
230 return dataOut
231
231 @MPDecorator
232 @MPDecorator
232 class CrossSpectraPlot_(Figure):
233 class CrossSpectraPlot_(Figure):
233
234
234 isConfig = None
235 isConfig = None
235 __nsubplots = None
236 __nsubplots = None
236
237
237 WIDTH = None
238 WIDTH = None
238 HEIGHT = None
239 HEIGHT = None
239 WIDTHPROF = None
240 WIDTHPROF = None
240 HEIGHTPROF = None
241 HEIGHTPROF = None
241 PREFIX = 'cspc'
242 PREFIX = 'cspc'
242
243
243 def __init__(self):
244 def __init__(self):
244 Figure.__init__(self)
245 Figure.__init__(self)
245 self.isConfig = False
246 self.isConfig = False
246 self.__nsubplots = 4
247 self.__nsubplots = 4
247 self.counter_imagwr = 0
248 self.counter_imagwr = 0
248 self.WIDTH = 250
249 self.WIDTH = 250
249 self.HEIGHT = 250
250 self.HEIGHT = 250
250 self.WIDTHPROF = 0
251 self.WIDTHPROF = 0
251 self.HEIGHTPROF = 0
252 self.HEIGHTPROF = 0
252
253
253 self.PLOT_CODE = CROSS_CODE
254 self.PLOT_CODE = CROSS_CODE
254 self.FTP_WEI = None
255 self.FTP_WEI = None
255 self.EXP_CODE = None
256 self.EXP_CODE = None
256 self.SUB_EXP_CODE = None
257 self.SUB_EXP_CODE = None
257 self.PLOT_POS = None
258 self.PLOT_POS = None
258
259
259 self.indice=0
260 self.indice=0
260
261
261 def getSubplots(self):
262 def getSubplots(self):
262
263
263 ncol = 4
264 ncol = 4
264 nrow = self.nplots
265 nrow = self.nplots
265
266
266 return nrow, ncol
267 return nrow, ncol
267
268
268 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
269 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
269
270
270 self.__showprofile = showprofile
271 self.__showprofile = showprofile
271 self.nplots = nplots
272 self.nplots = nplots
272
273
273 ncolspan = 1
274 ncolspan = 1
274 colspan = 1
275 colspan = 1
275
276
276 self.createFigure(id = id,
277 self.createFigure(id = id,
277 wintitle = wintitle,
278 wintitle = wintitle,
278 widthplot = self.WIDTH + self.WIDTHPROF,
279 widthplot = self.WIDTH + self.WIDTHPROF,
279 heightplot = self.HEIGHT + self.HEIGHTPROF,
280 heightplot = self.HEIGHT + self.HEIGHTPROF,
280 show=True)
281 show=True)
281
282
282 nrow, ncol = self.getSubplots()
283 nrow, ncol = self.getSubplots()
283
284
284 counter = 0
285 counter = 0
285 for y in range(nrow):
286 for y in range(nrow):
286 for x in range(ncol):
287 for x in range(ncol):
287 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
288 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
288
289
289 counter += 1
290 counter += 1
290
291
291 def run(self, dataOut, id, wintitle="", pairsList=None,
292 def run(self, dataOut, id, wintitle="", pairsList=None,
292 xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None,
293 xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None,
293 coh_min=None, coh_max=None, phase_min=None, phase_max=None,
294 coh_min=None, coh_max=None, phase_min=None, phase_max=None,
294 save=False, figpath='./', figfile=None, ftp=False, wr_period=1,
295 save=False, figpath='./', figfile=None, ftp=False, wr_period=1,
295 power_cmap='jet', coherence_cmap='jet', phase_cmap='RdBu_r', show=True,
296 power_cmap='jet', coherence_cmap='jet', phase_cmap='RdBu_r', show=True,
296 server=None, folder=None, username=None, password=None,
297 server=None, folder=None, username=None, password=None,
297 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, normFactor=None,
298 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, normFactor=None,
298 xaxis='frequency'):
299 xaxis='frequency'):
299
300
300 """
301 """
301
302
302 Input:
303 Input:
303 dataOut :
304 dataOut :
304 id :
305 id :
305 wintitle :
306 wintitle :
306 channelList :
307 channelList :
307 showProfile :
308 showProfile :
308 xmin : None,
309 xmin : None,
309 xmax : None,
310 xmax : None,
310 ymin : None,
311 ymin : None,
311 ymax : None,
312 ymax : None,
312 zmin : None,
313 zmin : None,
313 zmax : None
314 zmax : None
314 """
315 """
315
316
316 if dataOut.flagNoData:
317 if dataOut.flagNoData:
317 return dataOut
318 return dataOut
318
319
319 if pairsList == None:
320 if pairsList == None:
320 pairsIndexList = dataOut.pairsIndexList
321 pairsIndexList = dataOut.pairsIndexList
321 else:
322 else:
322 pairsIndexList = []
323 pairsIndexList = []
323 for pair in pairsList:
324 for pair in pairsList:
324 if pair not in dataOut.pairsList:
325 if pair not in dataOut.pairsList:
325 raise ValueError("Pair %s is not in dataOut.pairsList" %str(pair))
326 raise ValueError("Pair %s is not in dataOut.pairsList" %str(pair))
326 pairsIndexList.append(dataOut.pairsList.index(pair))
327 pairsIndexList.append(dataOut.pairsList.index(pair))
327
328
328 if not pairsIndexList:
329 if not pairsIndexList:
329 return
330 return
330
331
331 if len(pairsIndexList) > 4:
332 if len(pairsIndexList) > 4:
332 pairsIndexList = pairsIndexList[0:4]
333 pairsIndexList = pairsIndexList[0:4]
333
334
334 if normFactor is None:
335 if normFactor is None:
335 factor = dataOut.normFactor
336 factor = dataOut.normFactor
336 else:
337 else:
337 factor = normFactor
338 factor = normFactor
338 x = dataOut.getVelRange(1)
339 x = dataOut.getVelRange(1)
339 y = dataOut.getHeiRange()
340 y = dataOut.getHeiRange()
340 z = dataOut.data_spc[:,:,:]/factor
341 z = dataOut.data_spc[:,:,:]/factor
341 z = numpy.where(numpy.isfinite(z), z, numpy.NAN)
342 z = numpy.where(numpy.isfinite(z), z, numpy.NAN)
342
343
343 noise = dataOut.noise/factor
344 noise = dataOut.noise/factor
344
345
345 zdB = 10*numpy.log10(z)
346 zdB = 10*numpy.log10(z)
346 noisedB = 10*numpy.log10(noise)
347 noisedB = 10*numpy.log10(noise)
347
348
348 if coh_min == None:
349 if coh_min == None:
349 coh_min = 0.0
350 coh_min = 0.0
350 if coh_max == None:
351 if coh_max == None:
351 coh_max = 1.0
352 coh_max = 1.0
352
353
353 if phase_min == None:
354 if phase_min == None:
354 phase_min = -180
355 phase_min = -180
355 if phase_max == None:
356 if phase_max == None:
356 phase_max = 180
357 phase_max = 180
357
358
358 #thisDatetime = dataOut.datatime
359 #thisDatetime = dataOut.datatime
359 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0])
360 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0])
360 title = wintitle + " Cross-Spectra: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S"))
361 title = wintitle + " Cross-Spectra: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S"))
361 # xlabel = "Velocity (m/s)"
362 # xlabel = "Velocity (m/s)"
362 ylabel = "Range (Km)"
363 ylabel = "Range (Km)"
363
364
364 if xaxis == "frequency":
365 if xaxis == "frequency":
365 x = dataOut.getFreqRange(1)/1000.
366 x = dataOut.getFreqRange(1)/1000.
366 xlabel = "Frequency (kHz)"
367 xlabel = "Frequency (kHz)"
367
368
368 elif xaxis == "time":
369 elif xaxis == "time":
369 x = dataOut.getAcfRange(1)
370 x = dataOut.getAcfRange(1)
370 xlabel = "Time (ms)"
371 xlabel = "Time (ms)"
371
372
372 else:
373 else:
373 x = dataOut.getVelRange(1)
374 x = dataOut.getVelRange(1)
374 xlabel = "Velocity (m/s)"
375 xlabel = "Velocity (m/s)"
375
376
376 if not self.isConfig:
377 if not self.isConfig:
377
378
378 nplots = len(pairsIndexList)
379 nplots = len(pairsIndexList)
379
380
380 self.setup(id=id,
381 self.setup(id=id,
381 nplots=nplots,
382 nplots=nplots,
382 wintitle=wintitle,
383 wintitle=wintitle,
383 showprofile=False,
384 showprofile=False,
384 show=show)
385 show=show)
385
386
386 avg = numpy.abs(numpy.average(z, axis=1))
387 avg = numpy.abs(numpy.average(z, axis=1))
387 avgdB = 10*numpy.log10(avg)
388 avgdB = 10*numpy.log10(avg)
388
389
389 if xmin == None: xmin = numpy.nanmin(x)
390 if xmin == None: xmin = numpy.nanmin(x)
390 if xmax == None: xmax = numpy.nanmax(x)
391 if xmax == None: xmax = numpy.nanmax(x)
391 if ymin == None: ymin = numpy.nanmin(y)
392 if ymin == None: ymin = numpy.nanmin(y)
392 if ymax == None: ymax = numpy.nanmax(y)
393 if ymax == None: ymax = numpy.nanmax(y)
393 if zmin == None: zmin = numpy.floor(numpy.nanmin(noisedB)) - 3
394 if zmin == None: zmin = numpy.floor(numpy.nanmin(noisedB)) - 3
394 if zmax == None: zmax = numpy.ceil(numpy.nanmax(avgdB)) + 3
395 if zmax == None: zmax = numpy.ceil(numpy.nanmax(avgdB)) + 3
395
396
396 self.FTP_WEI = ftp_wei
397 self.FTP_WEI = ftp_wei
397 self.EXP_CODE = exp_code
398 self.EXP_CODE = exp_code
398 self.SUB_EXP_CODE = sub_exp_code
399 self.SUB_EXP_CODE = sub_exp_code
399 self.PLOT_POS = plot_pos
400 self.PLOT_POS = plot_pos
400
401
401 self.isConfig = True
402 self.isConfig = True
402
403
403 self.setWinTitle(title)
404 self.setWinTitle(title)
404
405
405
406
406 for i in range(self.nplots):
407 for i in range(self.nplots):
407 pair = dataOut.pairsList[pairsIndexList[i]]
408 pair = dataOut.pairsList[pairsIndexList[i]]
408
409
409 chan_index0 = dataOut.channelList.index(pair[0])
410 chan_index0 = dataOut.channelList.index(pair[0])
410 chan_index1 = dataOut.channelList.index(pair[1])
411 chan_index1 = dataOut.channelList.index(pair[1])
411
412
412 str_datetime = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S"))
413 str_datetime = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S"))
413 title = "Ch%d: %4.2fdB: %s" %(pair[0], noisedB[chan_index0], str_datetime)
414 title = "Ch%d: %4.2fdB: %s" %(pair[0], noisedB[chan_index0], str_datetime)
414 zdB = 10.*numpy.log10(dataOut.data_spc[chan_index0,:,:]/factor)
415 zdB = 10.*numpy.log10(dataOut.data_spc[chan_index0,:,:]/factor)
415 axes0 = self.axesList[i*self.__nsubplots]
416 axes0 = self.axesList[i*self.__nsubplots]
416 axes0.pcolor(x, y, zdB,
417 axes0.pcolor(x, y, zdB,
417 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
418 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
418 xlabel=xlabel, ylabel=ylabel, title=title,
419 xlabel=xlabel, ylabel=ylabel, title=title,
419 ticksize=9, colormap=power_cmap, cblabel='')
420 ticksize=9, colormap=power_cmap, cblabel='')
420
421
421 title = "Ch%d: %4.2fdB: %s" %(pair[1], noisedB[chan_index1], str_datetime)
422 title = "Ch%d: %4.2fdB: %s" %(pair[1], noisedB[chan_index1], str_datetime)
422 zdB = 10.*numpy.log10(dataOut.data_spc[chan_index1,:,:]/factor)
423 zdB = 10.*numpy.log10(dataOut.data_spc[chan_index1,:,:]/factor)
423 axes0 = self.axesList[i*self.__nsubplots+1]
424 axes0 = self.axesList[i*self.__nsubplots+1]
424 axes0.pcolor(x, y, zdB,
425 axes0.pcolor(x, y, zdB,
425 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
426 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
426 xlabel=xlabel, ylabel=ylabel, title=title,
427 xlabel=xlabel, ylabel=ylabel, title=title,
427 ticksize=9, colormap=power_cmap, cblabel='')
428 ticksize=9, colormap=power_cmap, cblabel='')
428
429
429 coherenceComplex = dataOut.data_cspc[pairsIndexList[i],:,:] / numpy.sqrt( dataOut.data_spc[chan_index0,:,:]*dataOut.data_spc[chan_index1,:,:] )
430 coherenceComplex = dataOut.data_cspc[pairsIndexList[i],:,:] / numpy.sqrt( dataOut.data_spc[chan_index0,:,:]*dataOut.data_spc[chan_index1,:,:] )
430 coherence = numpy.abs(coherenceComplex)
431 coherence = numpy.abs(coherenceComplex)
431 # phase = numpy.arctan(-1*coherenceComplex.imag/coherenceComplex.real)*180/numpy.pi
432 # phase = numpy.arctan(-1*coherenceComplex.imag/coherenceComplex.real)*180/numpy.pi
432 phase = numpy.arctan2(coherenceComplex.imag, coherenceComplex.real)*180/numpy.pi
433 phase = numpy.arctan2(coherenceComplex.imag, coherenceComplex.real)*180/numpy.pi
433
434
434 title = "Coherence Ch%d * Ch%d" %(pair[0], pair[1])
435 title = "Coherence Ch%d * Ch%d" %(pair[0], pair[1])
435 axes0 = self.axesList[i*self.__nsubplots+2]
436 axes0 = self.axesList[i*self.__nsubplots+2]
436 axes0.pcolor(x, y, coherence,
437 axes0.pcolor(x, y, coherence,
437 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=coh_min, zmax=coh_max,
438 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=coh_min, zmax=coh_max,
438 xlabel=xlabel, ylabel=ylabel, title=title,
439 xlabel=xlabel, ylabel=ylabel, title=title,
439 ticksize=9, colormap=coherence_cmap, cblabel='')
440 ticksize=9, colormap=coherence_cmap, cblabel='')
440
441
441 title = "Phase Ch%d * Ch%d" %(pair[0], pair[1])
442 title = "Phase Ch%d * Ch%d" %(pair[0], pair[1])
442 axes0 = self.axesList[i*self.__nsubplots+3]
443 axes0 = self.axesList[i*self.__nsubplots+3]
443 axes0.pcolor(x, y, phase,
444 axes0.pcolor(x, y, phase,
444 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=phase_min, zmax=phase_max,
445 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=phase_min, zmax=phase_max,
445 xlabel=xlabel, ylabel=ylabel, title=title,
446 xlabel=xlabel, ylabel=ylabel, title=title,
446 ticksize=9, colormap=phase_cmap, cblabel='')
447 ticksize=9, colormap=phase_cmap, cblabel='')
447
448
448 self.draw()
449 self.draw()
449
450
450 self.save(figpath=figpath,
451 self.save(figpath=figpath,
451 figfile=figfile,
452 figfile=figfile,
452 save=save,
453 save=save,
453 ftp=ftp,
454 ftp=ftp,
454 wr_period=wr_period,
455 wr_period=wr_period,
455 thisDatetime=thisDatetime)
456 thisDatetime=thisDatetime)
456
457
457 return dataOut
458 return dataOut
458
459
459 @MPDecorator
460 @MPDecorator
460 class RTIPlot_(Figure):
461 class RTIPlot_(Figure):
461
462
462 __isConfig = None
463 __isConfig = None
463 __nsubplots = None
464 __nsubplots = None
464
465
465 WIDTHPROF = None
466 WIDTHPROF = None
466 HEIGHTPROF = None
467 HEIGHTPROF = None
467 PREFIX = 'rti'
468 PREFIX = 'rti'
468
469
469 def __init__(self):
470 def __init__(self):
470
471
471 Figure.__init__(self)
472 Figure.__init__(self)
472 self.timerange = None
473 self.timerange = None
473 self.isConfig = False
474 self.isConfig = False
474 self.__nsubplots = 1
475 self.__nsubplots = 1
475
476
476 self.WIDTH = 800
477 self.WIDTH = 800
477 self.HEIGHT = 250
478 self.HEIGHT = 250
478 self.WIDTHPROF = 120
479 self.WIDTHPROF = 120
479 self.HEIGHTPROF = 0
480 self.HEIGHTPROF = 0
480 self.counter_imagwr = 0
481 self.counter_imagwr = 0
481
482
482 self.PLOT_CODE = RTI_CODE
483 self.PLOT_CODE = RTI_CODE
483
484
484 self.FTP_WEI = None
485 self.FTP_WEI = None
485 self.EXP_CODE = None
486 self.EXP_CODE = None
486 self.SUB_EXP_CODE = None
487 self.SUB_EXP_CODE = None
487 self.PLOT_POS = None
488 self.PLOT_POS = None
488 self.tmin = None
489 self.tmin = None
489 self.tmax = None
490 self.tmax = None
490
491
491 self.xmin = None
492 self.xmin = None
492 self.xmax = None
493 self.xmax = None
493
494
494 self.figfile = None
495 self.figfile = None
495
496
496 def getSubplots(self):
497 def getSubplots(self):
497
498
498 ncol = 1
499 ncol = 1
499 nrow = self.nplots
500 nrow = self.nplots
500
501
501 return nrow, ncol
502 return nrow, ncol
502
503
503 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
504 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
504
505
505 self.__showprofile = showprofile
506 self.__showprofile = showprofile
506 self.nplots = nplots
507 self.nplots = nplots
507
508
508 ncolspan = 1
509 ncolspan = 1
509 colspan = 1
510 colspan = 1
510 if showprofile:
511 if showprofile:
511 ncolspan = 7
512 ncolspan = 7
512 colspan = 6
513 colspan = 6
513 self.__nsubplots = 2
514 self.__nsubplots = 2
514
515
515 self.createFigure(id = id,
516 self.createFigure(id = id,
516 wintitle = wintitle,
517 wintitle = wintitle,
517 widthplot = self.WIDTH + self.WIDTHPROF,
518 widthplot = self.WIDTH + self.WIDTHPROF,
518 heightplot = self.HEIGHT + self.HEIGHTPROF,
519 heightplot = self.HEIGHT + self.HEIGHTPROF,
519 show=show)
520 show=show)
520
521
521 nrow, ncol = self.getSubplots()
522 nrow, ncol = self.getSubplots()
522
523
523 counter = 0
524 counter = 0
524 for y in range(nrow):
525 for y in range(nrow):
525 for x in range(ncol):
526 for x in range(ncol):
526
527
527 if counter >= self.nplots:
528 if counter >= self.nplots:
528 break
529 break
529
530
530 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
531 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
531
532
532 if showprofile:
533 if showprofile:
533 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan+colspan, 1, 1)
534 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan+colspan, 1, 1)
534
535
535 counter += 1
536 counter += 1
536
537
537 def run(self, dataOut, id, wintitle="", channelList=None, showprofile='True',
538 def run(self, dataOut, id, wintitle="", channelList=None, showprofile='True',
538 xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None,
539 xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None,
539 timerange=None, colormap='jet',
540 timerange=None, colormap='jet',
540 save=False, figpath='./', lastone=0,figfile=None, ftp=False, wr_period=1, show=True,
541 save=False, figpath='./', lastone=0,figfile=None, ftp=False, wr_period=1, show=True,
541 server=None, folder=None, username=None, password=None,
542 server=None, folder=None, username=None, password=None,
542 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, normFactor=None, HEIGHT=None):
543 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, normFactor=None, HEIGHT=None):
543
544
544 """
545 """
545
546
546 Input:
547 Input:
547 dataOut :
548 dataOut :
548 id :
549 id :
549 wintitle :
550 wintitle :
550 channelList :
551 channelList :
551 showProfile :
552 showProfile :
552 xmin : None,
553 xmin : None,
553 xmax : None,
554 xmax : None,
554 ymin : None,
555 ymin : None,
555 ymax : None,
556 ymax : None,
556 zmin : None,
557 zmin : None,
557 zmax : None
558 zmax : None
558 """
559 """
559 if dataOut.flagNoData:
560 if dataOut.flagNoData:
560 return dataOut
561 return dataOut
561
562
562 #colormap = kwargs.get('colormap', 'jet')
563 #colormap = kwargs.get('colormap', 'jet')
563 if HEIGHT is not None:
564 if HEIGHT is not None:
564 self.HEIGHT = HEIGHT
565 self.HEIGHT = HEIGHT
565
566
566 if not isTimeInHourRange(dataOut.datatime, xmin, xmax):
567 if not isTimeInHourRange(dataOut.datatime, xmin, xmax):
567 return
568 return
568
569
569 if channelList == None:
570 if channelList == None:
570 channelIndexList = dataOut.channelIndexList
571 channelIndexList = dataOut.channelIndexList
571 else:
572 else:
572 channelIndexList = []
573 channelIndexList = []
573 for channel in channelList:
574 for channel in channelList:
574 if channel not in dataOut.channelList:
575 if channel not in dataOut.channelList:
575 raise ValueError("Channel %d is not in dataOut.channelList")
576 raise ValueError("Channel %d is not in dataOut.channelList")
576 channelIndexList.append(dataOut.channelList.index(channel))
577 channelIndexList.append(dataOut.channelList.index(channel))
577
578
578 if normFactor is None:
579 if normFactor is None:
579 factor = dataOut.normFactor
580 factor = dataOut.normFactor
580 else:
581 else:
581 factor = normFactor
582 factor = normFactor
582
583
583 #factor = dataOut.normFactor
584 #factor = dataOut.normFactor
584 x = dataOut.getTimeRange()
585 x = dataOut.getTimeRange()
585 y = dataOut.getHeiRange()
586 y = dataOut.getHeiRange()
586
587
587 z = dataOut.data_spc/factor
588 z = dataOut.data_spc/factor
588 z = numpy.where(numpy.isfinite(z), z, numpy.NAN)
589 z = numpy.where(numpy.isfinite(z), z, numpy.NAN)
589 avg = numpy.average(z, axis=1)
590 avg = numpy.average(z, axis=1)
590 avgdB = 10.*numpy.log10(avg)
591 avgdB = 10.*numpy.log10(avg)
591 # avgdB = dataOut.getPower()
592 # avgdB = dataOut.getPower()
592
593
593
594
594 thisDatetime = dataOut.datatime
595 thisDatetime = dataOut.datatime
595 #thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0])
596 #thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0])
596 title = wintitle + " RTI" #: %s" %(thisDatetime.strftime("%d-%b-%Y"))
597 title = wintitle + " RTI" #: %s" %(thisDatetime.strftime("%d-%b-%Y"))
597 xlabel = ""
598 xlabel = ""
598 ylabel = "Range (Km)"
599 ylabel = "Range (Km)"
599
600
600 update_figfile = False
601 update_figfile = False
601
602
602 if self.xmax is not None and dataOut.ltctime >= self.xmax: #yong
603 if self.xmax is not None and dataOut.ltctime >= self.xmax: #yong
603 self.counter_imagwr = wr_period
604 self.counter_imagwr = wr_period
604 self.isConfig = False
605 self.isConfig = False
605 update_figfile = True
606 update_figfile = True
606
607
607 if not self.isConfig:
608 if not self.isConfig:
608
609
609 nplots = len(channelIndexList)
610 nplots = len(channelIndexList)
610
611
611 self.setup(id=id,
612 self.setup(id=id,
612 nplots=nplots,
613 nplots=nplots,
613 wintitle=wintitle,
614 wintitle=wintitle,
614 showprofile=showprofile,
615 showprofile=showprofile,
615 show=show)
616 show=show)
616
617
617 if timerange != None:
618 if timerange != None:
618 self.timerange = timerange
619 self.timerange = timerange
619
620
620 self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange)
621 self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange)
621
622
622 noise = dataOut.noise/factor
623 noise = dataOut.noise/factor
623 noisedB = 10*numpy.log10(noise)
624 noisedB = 10*numpy.log10(noise)
624
625
625 if ymin == None: ymin = numpy.nanmin(y)
626 if ymin == None: ymin = numpy.nanmin(y)
626 if ymax == None: ymax = numpy.nanmax(y)
627 if ymax == None: ymax = numpy.nanmax(y)
627 if zmin == None: zmin = numpy.floor(numpy.nanmin(noisedB)) - 3
628 if zmin == None: zmin = numpy.floor(numpy.nanmin(noisedB)) - 3
628 if zmax == None: zmax = numpy.ceil(numpy.nanmax(avgdB)) + 3
629 if zmax == None: zmax = numpy.ceil(numpy.nanmax(avgdB)) + 3
629
630
630 self.FTP_WEI = ftp_wei
631 self.FTP_WEI = ftp_wei
631 self.EXP_CODE = exp_code
632 self.EXP_CODE = exp_code
632 self.SUB_EXP_CODE = sub_exp_code
633 self.SUB_EXP_CODE = sub_exp_code
633 self.PLOT_POS = plot_pos
634 self.PLOT_POS = plot_pos
634
635
635 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
636 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
636 self.isConfig = True
637 self.isConfig = True
637 self.figfile = figfile
638 self.figfile = figfile
638 update_figfile = True
639 update_figfile = True
639
640
640 self.setWinTitle(title)
641 self.setWinTitle(title)
641
642
642 for i in range(self.nplots):
643 for i in range(self.nplots):
643 index = channelIndexList[i]
644 index = channelIndexList[i]
644 title = "Channel %d: %s" %(dataOut.channelList[index], thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
645 title = "Channel %d: %s" %(dataOut.channelList[index], thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
645 if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)):
646 if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)):
646 title = title + '_' + 'azimuth,zenith=%2.2f,%2.2f'%(dataOut.azimuth, dataOut.zenith)
647 title = title + '_' + 'azimuth,zenith=%2.2f,%2.2f'%(dataOut.azimuth, dataOut.zenith)
647 axes = self.axesList[i*self.__nsubplots]
648 axes = self.axesList[i*self.__nsubplots]
648 zdB = avgdB[index].reshape((1,-1))
649 zdB = avgdB[index].reshape((1,-1))
649 axes.pcolorbuffer(x, y, zdB,
650 axes.pcolorbuffer(x, y, zdB,
650 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
651 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
651 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
652 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
652 ticksize=9, cblabel='', cbsize="1%", colormap=colormap)
653 ticksize=9, cblabel='', cbsize="1%", colormap=colormap)
653
654
654 if self.__showprofile:
655 if self.__showprofile:
655 axes = self.axesList[i*self.__nsubplots +1]
656 axes = self.axesList[i*self.__nsubplots +1]
656 axes.pline(avgdB[index], y,
657 axes.pline(avgdB[index], y,
657 xmin=zmin, xmax=zmax, ymin=ymin, ymax=ymax,
658 xmin=zmin, xmax=zmax, ymin=ymin, ymax=ymax,
658 xlabel='dB', ylabel='', title='',
659 xlabel='dB', ylabel='', title='',
659 ytick_visible=False,
660 ytick_visible=False,
660 grid='x')
661 grid='x')
661
662
662 self.draw()
663 self.draw()
663
664
664 self.save(figpath=figpath,
665 self.save(figpath=figpath,
665 figfile=figfile,
666 figfile=figfile,
666 save=save,
667 save=save,
667 ftp=ftp,
668 ftp=ftp,
668 wr_period=wr_period,
669 wr_period=wr_period,
669 thisDatetime=thisDatetime,
670 thisDatetime=thisDatetime,
670 update_figfile=update_figfile)
671 update_figfile=update_figfile)
671 return dataOut
672 return dataOut
672
673
673 @MPDecorator
674 @MPDecorator
674 class CoherenceMap_(Figure):
675 class CoherenceMap_(Figure):
675 isConfig = None
676 isConfig = None
676 __nsubplots = None
677 __nsubplots = None
677
678
678 WIDTHPROF = None
679 WIDTHPROF = None
679 HEIGHTPROF = None
680 HEIGHTPROF = None
680 PREFIX = 'cmap'
681 PREFIX = 'cmap'
681
682
682 def __init__(self):
683 def __init__(self):
683 Figure.__init__(self)
684 Figure.__init__(self)
684 self.timerange = 2*60*60
685 self.timerange = 2*60*60
685 self.isConfig = False
686 self.isConfig = False
686 self.__nsubplots = 1
687 self.__nsubplots = 1
687
688
688 self.WIDTH = 800
689 self.WIDTH = 800
689 self.HEIGHT = 180
690 self.HEIGHT = 180
690 self.WIDTHPROF = 120
691 self.WIDTHPROF = 120
691 self.HEIGHTPROF = 0
692 self.HEIGHTPROF = 0
692 self.counter_imagwr = 0
693 self.counter_imagwr = 0
693
694
694 self.PLOT_CODE = COH_CODE
695 self.PLOT_CODE = COH_CODE
695
696
696 self.FTP_WEI = None
697 self.FTP_WEI = None
697 self.EXP_CODE = None
698 self.EXP_CODE = None
698 self.SUB_EXP_CODE = None
699 self.SUB_EXP_CODE = None
699 self.PLOT_POS = None
700 self.PLOT_POS = None
700 self.counter_imagwr = 0
701 self.counter_imagwr = 0
701
702
702 self.xmin = None
703 self.xmin = None
703 self.xmax = None
704 self.xmax = None
704
705
705 def getSubplots(self):
706 def getSubplots(self):
706 ncol = 1
707 ncol = 1
707 nrow = self.nplots*2
708 nrow = self.nplots*2
708
709
709 return nrow, ncol
710 return nrow, ncol
710
711
711 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
712 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
712 self.__showprofile = showprofile
713 self.__showprofile = showprofile
713 self.nplots = nplots
714 self.nplots = nplots
714
715
715 ncolspan = 1
716 ncolspan = 1
716 colspan = 1
717 colspan = 1
717 if showprofile:
718 if showprofile:
718 ncolspan = 7
719 ncolspan = 7
719 colspan = 6
720 colspan = 6
720 self.__nsubplots = 2
721 self.__nsubplots = 2
721
722
722 self.createFigure(id = id,
723 self.createFigure(id = id,
723 wintitle = wintitle,
724 wintitle = wintitle,
724 widthplot = self.WIDTH + self.WIDTHPROF,
725 widthplot = self.WIDTH + self.WIDTHPROF,
725 heightplot = self.HEIGHT + self.HEIGHTPROF,
726 heightplot = self.HEIGHT + self.HEIGHTPROF,
726 show=True)
727 show=True)
727
728
728 nrow, ncol = self.getSubplots()
729 nrow, ncol = self.getSubplots()
729
730
730 for y in range(nrow):
731 for y in range(nrow):
731 for x in range(ncol):
732 for x in range(ncol):
732
733
733 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
734 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
734
735
735 if showprofile:
736 if showprofile:
736 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan+colspan, 1, 1)
737 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan+colspan, 1, 1)
737
738
738 def run(self, dataOut, id, wintitle="", pairsList=None, showprofile='True',
739 def run(self, dataOut, id, wintitle="", pairsList=None, showprofile='True',
739 xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None,
740 xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None,
740 timerange=None, phase_min=None, phase_max=None,
741 timerange=None, phase_min=None, phase_max=None,
741 save=False, figpath='./', figfile=None, ftp=False, wr_period=1,
742 save=False, figpath='./', figfile=None, ftp=False, wr_period=1,
742 coherence_cmap='jet', phase_cmap='RdBu_r', show=True,
743 coherence_cmap='jet', phase_cmap='RdBu_r', show=True,
743 server=None, folder=None, username=None, password=None,
744 server=None, folder=None, username=None, password=None,
744 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0):
745 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0):
745
746
746
747
747 if dataOut.flagNoData:
748 if dataOut.flagNoData:
748 return dataOut
749 return dataOut
749
750
750 if not isTimeInHourRange(dataOut.datatime, xmin, xmax):
751 if not isTimeInHourRange(dataOut.datatime, xmin, xmax):
751 return
752 return
752
753
753 if pairsList == None:
754 if pairsList == None:
754 pairsIndexList = dataOut.pairsIndexList
755 pairsIndexList = dataOut.pairsIndexList
755 else:
756 else:
756 pairsIndexList = []
757 pairsIndexList = []
757 for pair in pairsList:
758 for pair in pairsList:
758 if pair not in dataOut.pairsList:
759 if pair not in dataOut.pairsList:
759 raise ValueError("Pair %s is not in dataOut.pairsList" %(pair))
760 raise ValueError("Pair %s is not in dataOut.pairsList" %(pair))
760 pairsIndexList.append(dataOut.pairsList.index(pair))
761 pairsIndexList.append(dataOut.pairsList.index(pair))
761
762
762 if pairsIndexList == []:
763 if pairsIndexList == []:
763 return
764 return
764
765
765 if len(pairsIndexList) > 4:
766 if len(pairsIndexList) > 4:
766 pairsIndexList = pairsIndexList[0:4]
767 pairsIndexList = pairsIndexList[0:4]
767
768
768 if phase_min == None:
769 if phase_min == None:
769 phase_min = -180
770 phase_min = -180
770 if phase_max == None:
771 if phase_max == None:
771 phase_max = 180
772 phase_max = 180
772
773
773 x = dataOut.getTimeRange()
774 x = dataOut.getTimeRange()
774 y = dataOut.getHeiRange()
775 y = dataOut.getHeiRange()
775
776
776 thisDatetime = dataOut.datatime
777 thisDatetime = dataOut.datatime
777
778
778 title = wintitle + " CoherenceMap" #: %s" %(thisDatetime.strftime("%d-%b-%Y"))
779 title = wintitle + " CoherenceMap" #: %s" %(thisDatetime.strftime("%d-%b-%Y"))
779 xlabel = ""
780 xlabel = ""
780 ylabel = "Range (Km)"
781 ylabel = "Range (Km)"
781 update_figfile = False
782 update_figfile = False
782
783
783 if not self.isConfig:
784 if not self.isConfig:
784 nplots = len(pairsIndexList)
785 nplots = len(pairsIndexList)
785 self.setup(id=id,
786 self.setup(id=id,
786 nplots=nplots,
787 nplots=nplots,
787 wintitle=wintitle,
788 wintitle=wintitle,
788 showprofile=showprofile,
789 showprofile=showprofile,
789 show=show)
790 show=show)
790
791
791 if timerange != None:
792 if timerange != None:
792 self.timerange = timerange
793 self.timerange = timerange
793
794
794 self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange)
795 self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange)
795
796
796 if ymin == None: ymin = numpy.nanmin(y)
797 if ymin == None: ymin = numpy.nanmin(y)
797 if ymax == None: ymax = numpy.nanmax(y)
798 if ymax == None: ymax = numpy.nanmax(y)
798 if zmin == None: zmin = 0.
799 if zmin == None: zmin = 0.
799 if zmax == None: zmax = 1.
800 if zmax == None: zmax = 1.
800
801
801 self.FTP_WEI = ftp_wei
802 self.FTP_WEI = ftp_wei
802 self.EXP_CODE = exp_code
803 self.EXP_CODE = exp_code
803 self.SUB_EXP_CODE = sub_exp_code
804 self.SUB_EXP_CODE = sub_exp_code
804 self.PLOT_POS = plot_pos
805 self.PLOT_POS = plot_pos
805
806
806 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
807 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
807
808
808 self.isConfig = True
809 self.isConfig = True
809 update_figfile = True
810 update_figfile = True
810
811
811 self.setWinTitle(title)
812 self.setWinTitle(title)
812
813
813 for i in range(self.nplots):
814 for i in range(self.nplots):
814
815
815 pair = dataOut.pairsList[pairsIndexList[i]]
816 pair = dataOut.pairsList[pairsIndexList[i]]
816
817
817 ccf = numpy.average(dataOut.data_cspc[pairsIndexList[i],:,:],axis=0)
818 ccf = numpy.average(dataOut.data_cspc[pairsIndexList[i],:,:],axis=0)
818 powa = numpy.average(dataOut.data_spc[pair[0],:,:],axis=0)
819 powa = numpy.average(dataOut.data_spc[pair[0],:,:],axis=0)
819 powb = numpy.average(dataOut.data_spc[pair[1],:,:],axis=0)
820 powb = numpy.average(dataOut.data_spc[pair[1],:,:],axis=0)
820
821
821
822
822 avgcoherenceComplex = ccf/numpy.sqrt(powa*powb)
823 avgcoherenceComplex = ccf/numpy.sqrt(powa*powb)
823 coherence = numpy.abs(avgcoherenceComplex)
824 coherence = numpy.abs(avgcoherenceComplex)
824
825
825 z = coherence.reshape((1,-1))
826 z = coherence.reshape((1,-1))
826
827
827 counter = 0
828 counter = 0
828
829
829 title = "Coherence Ch%d * Ch%d: %s" %(pair[0], pair[1], thisDatetime.strftime("%d-%b-%Y %H:%M:%S"))
830 title = "Coherence Ch%d * Ch%d: %s" %(pair[0], pair[1], thisDatetime.strftime("%d-%b-%Y %H:%M:%S"))
830 axes = self.axesList[i*self.__nsubplots*2]
831 axes = self.axesList[i*self.__nsubplots*2]
831 axes.pcolorbuffer(x, y, z,
832 axes.pcolorbuffer(x, y, z,
832 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
833 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax,
833 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
834 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
834 ticksize=9, cblabel='', colormap=coherence_cmap, cbsize="1%")
835 ticksize=9, cblabel='', colormap=coherence_cmap, cbsize="1%")
835
836
836 if self.__showprofile:
837 if self.__showprofile:
837 counter += 1
838 counter += 1
838 axes = self.axesList[i*self.__nsubplots*2 + counter]
839 axes = self.axesList[i*self.__nsubplots*2 + counter]
839 axes.pline(coherence, y,
840 axes.pline(coherence, y,
840 xmin=zmin, xmax=zmax, ymin=ymin, ymax=ymax,
841 xmin=zmin, xmax=zmax, ymin=ymin, ymax=ymax,
841 xlabel='', ylabel='', title='', ticksize=7,
842 xlabel='', ylabel='', title='', ticksize=7,
842 ytick_visible=False, nxticks=5,
843 ytick_visible=False, nxticks=5,
843 grid='x')
844 grid='x')
844
845
845 counter += 1
846 counter += 1
846
847
847 phase = numpy.arctan2(avgcoherenceComplex.imag, avgcoherenceComplex.real)*180/numpy.pi
848 phase = numpy.arctan2(avgcoherenceComplex.imag, avgcoherenceComplex.real)*180/numpy.pi
848
849
849 z = phase.reshape((1,-1))
850 z = phase.reshape((1,-1))
850
851
851 title = "Phase Ch%d * Ch%d: %s" %(pair[0], pair[1], thisDatetime.strftime("%d-%b-%Y %H:%M:%S"))
852 title = "Phase Ch%d * Ch%d: %s" %(pair[0], pair[1], thisDatetime.strftime("%d-%b-%Y %H:%M:%S"))
852 axes = self.axesList[i*self.__nsubplots*2 + counter]
853 axes = self.axesList[i*self.__nsubplots*2 + counter]
853 axes.pcolorbuffer(x, y, z,
854 axes.pcolorbuffer(x, y, z,
854 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=phase_min, zmax=phase_max,
855 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=phase_min, zmax=phase_max,
855 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
856 xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,
856 ticksize=9, cblabel='', colormap=phase_cmap, cbsize="1%")
857 ticksize=9, cblabel='', colormap=phase_cmap, cbsize="1%")
857
858
858 if self.__showprofile:
859 if self.__showprofile:
859 counter += 1
860 counter += 1
860 axes = self.axesList[i*self.__nsubplots*2 + counter]
861 axes = self.axesList[i*self.__nsubplots*2 + counter]
861 axes.pline(phase, y,
862 axes.pline(phase, y,
862 xmin=phase_min, xmax=phase_max, ymin=ymin, ymax=ymax,
863 xmin=phase_min, xmax=phase_max, ymin=ymin, ymax=ymax,
863 xlabel='', ylabel='', title='', ticksize=7,
864 xlabel='', ylabel='', title='', ticksize=7,
864 ytick_visible=False, nxticks=4,
865 ytick_visible=False, nxticks=4,
865 grid='x')
866 grid='x')
866
867
867 self.draw()
868 self.draw()
868
869
869 if dataOut.ltctime >= self.xmax:
870 if dataOut.ltctime >= self.xmax:
870 self.counter_imagwr = wr_period
871 self.counter_imagwr = wr_period
871 self.isConfig = False
872 self.isConfig = False
872 update_figfile = True
873 update_figfile = True
873
874
874 self.save(figpath=figpath,
875 self.save(figpath=figpath,
875 figfile=figfile,
876 figfile=figfile,
876 save=save,
877 save=save,
877 ftp=ftp,
878 ftp=ftp,
878 wr_period=wr_period,
879 wr_period=wr_period,
879 thisDatetime=thisDatetime,
880 thisDatetime=thisDatetime,
880 update_figfile=update_figfile)
881 update_figfile=update_figfile)
881
882
882 return dataOut
883 return dataOut
883
884
884 @MPDecorator
885 @MPDecorator
885 class PowerProfilePlot_(Figure):
886 class PowerProfilePlot_(Figure):
886
887
887 isConfig = None
888 isConfig = None
888 __nsubplots = None
889 __nsubplots = None
889
890
890 WIDTHPROF = None
891 WIDTHPROF = None
891 HEIGHTPROF = None
892 HEIGHTPROF = None
892 PREFIX = 'spcprofile'
893 PREFIX = 'spcprofile'
893
894
894 def __init__(self):
895 def __init__(self):
895 Figure.__init__(self)
896 Figure.__init__(self)
896 self.isConfig = False
897 self.isConfig = False
897 self.__nsubplots = 1
898 self.__nsubplots = 1
898
899
899 self.PLOT_CODE = POWER_CODE
900 self.PLOT_CODE = POWER_CODE
900
901
901 self.WIDTH = 300
902 self.WIDTH = 300
902 self.HEIGHT = 500
903 self.HEIGHT = 500
903 self.counter_imagwr = 0
904 self.counter_imagwr = 0
904
905
905 def getSubplots(self):
906 def getSubplots(self):
906 ncol = 1
907 ncol = 1
907 nrow = 1
908 nrow = 1
908
909
909 return nrow, ncol
910 return nrow, ncol
910
911
911 def setup(self, id, nplots, wintitle, show):
912 def setup(self, id, nplots, wintitle, show):
912
913
913 self.nplots = nplots
914 self.nplots = nplots
914
915
915 ncolspan = 1
916 ncolspan = 1
916 colspan = 1
917 colspan = 1
917
918
918 self.createFigure(id = id,
919 self.createFigure(id = id,
919 wintitle = wintitle,
920 wintitle = wintitle,
920 widthplot = self.WIDTH,
921 widthplot = self.WIDTH,
921 heightplot = self.HEIGHT,
922 heightplot = self.HEIGHT,
922 show=show)
923 show=show)
923
924
924 nrow, ncol = self.getSubplots()
925 nrow, ncol = self.getSubplots()
925
926
926 counter = 0
927 counter = 0
927 for y in range(nrow):
928 for y in range(nrow):
928 for x in range(ncol):
929 for x in range(ncol):
929 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
930 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
930
931
931 def run(self, dataOut, id, wintitle="", channelList=None,
932 def run(self, dataOut, id, wintitle="", channelList=None,
932 xmin=None, xmax=None, ymin=None, ymax=None,
933 xmin=None, xmax=None, ymin=None, ymax=None,
933 save=False, figpath='./', figfile=None, show=True,
934 save=False, figpath='./', figfile=None, show=True,
934 ftp=False, wr_period=1, server=None,
935 ftp=False, wr_period=1, server=None,
935 folder=None, username=None, password=None):
936 folder=None, username=None, password=None):
936
937
937 if dataOut.flagNoData:
938 if dataOut.flagNoData:
938 return dataOut
939 return dataOut
939
940
940
941
941 if channelList == None:
942 if channelList == None:
942 channelIndexList = dataOut.channelIndexList
943 channelIndexList = dataOut.channelIndexList
943 channelList = dataOut.channelList
944 channelList = dataOut.channelList
944 else:
945 else:
945 channelIndexList = []
946 channelIndexList = []
946 for channel in channelList:
947 for channel in channelList:
947 if channel not in dataOut.channelList:
948 if channel not in dataOut.channelList:
948 raise ValueError("Channel %d is not in dataOut.channelList")
949 raise ValueError("Channel %d is not in dataOut.channelList")
949 channelIndexList.append(dataOut.channelList.index(channel))
950 channelIndexList.append(dataOut.channelList.index(channel))
950
951
951 factor = dataOut.normFactor
952 factor = dataOut.normFactor
952
953
953 y = dataOut.getHeiRange()
954 y = dataOut.getHeiRange()
954
955
955 #for voltage
956 #for voltage
956 if dataOut.type == 'Voltage':
957 if dataOut.type == 'Voltage':
957 x = dataOut.data[channelIndexList,:] * numpy.conjugate(dataOut.data[channelIndexList,:])
958 x = dataOut.data[channelIndexList,:] * numpy.conjugate(dataOut.data[channelIndexList,:])
958 x = x.real
959 x = x.real
959 x = numpy.where(numpy.isfinite(x), x, numpy.NAN)
960 x = numpy.where(numpy.isfinite(x), x, numpy.NAN)
960
961
961 #for spectra
962 #for spectra
962 if dataOut.type == 'Spectra':
963 if dataOut.type == 'Spectra':
963 x = dataOut.data_spc[channelIndexList,:,:]/factor
964 x = dataOut.data_spc[channelIndexList,:,:]/factor
964 x = numpy.where(numpy.isfinite(x), x, numpy.NAN)
965 x = numpy.where(numpy.isfinite(x), x, numpy.NAN)
965 x = numpy.average(x, axis=1)
966 x = numpy.average(x, axis=1)
966
967
967
968
968 xdB = 10*numpy.log10(x)
969 xdB = 10*numpy.log10(x)
969
970
970 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0])
971 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0])
971 title = wintitle + " Power Profile %s" %(thisDatetime.strftime("%d-%b-%Y"))
972 title = wintitle + " Power Profile %s" %(thisDatetime.strftime("%d-%b-%Y"))
972 xlabel = "dB"
973 xlabel = "dB"
973 ylabel = "Range (Km)"
974 ylabel = "Range (Km)"
974
975
975 if not self.isConfig:
976 if not self.isConfig:
976
977
977 nplots = 1
978 nplots = 1
978
979
979 self.setup(id=id,
980 self.setup(id=id,
980 nplots=nplots,
981 nplots=nplots,
981 wintitle=wintitle,
982 wintitle=wintitle,
982 show=show)
983 show=show)
983
984
984 if ymin == None: ymin = numpy.nanmin(y)
985 if ymin == None: ymin = numpy.nanmin(y)
985 if ymax == None: ymax = numpy.nanmax(y)
986 if ymax == None: ymax = numpy.nanmax(y)
986 if xmin == None: xmin = numpy.nanmin(xdB)*0.9
987 if xmin == None: xmin = numpy.nanmin(xdB)*0.9
987 if xmax == None: xmax = numpy.nanmax(xdB)*1.1
988 if xmax == None: xmax = numpy.nanmax(xdB)*1.1
988
989
989 self.isConfig = True
990 self.isConfig = True
990
991
991 self.setWinTitle(title)
992 self.setWinTitle(title)
992
993
993 title = "Power Profile: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S"))
994 title = "Power Profile: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S"))
994 axes = self.axesList[0]
995 axes = self.axesList[0]
995
996
996 legendlabels = ["channel %d"%x for x in channelList]
997 legendlabels = ["channel %d"%x for x in channelList]
997 axes.pmultiline(xdB, y,
998 axes.pmultiline(xdB, y,
998 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax,
999 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax,
999 xlabel=xlabel, ylabel=ylabel, title=title, legendlabels=legendlabels,
1000 xlabel=xlabel, ylabel=ylabel, title=title, legendlabels=legendlabels,
1000 ytick_visible=True, nxticks=5,
1001 ytick_visible=True, nxticks=5,
1001 grid='x')
1002 grid='x')
1002
1003
1003 self.draw()
1004 self.draw()
1004
1005
1005 self.save(figpath=figpath,
1006 self.save(figpath=figpath,
1006 figfile=figfile,
1007 figfile=figfile,
1007 save=save,
1008 save=save,
1008 ftp=ftp,
1009 ftp=ftp,
1009 wr_period=wr_period,
1010 wr_period=wr_period,
1010 thisDatetime=thisDatetime)
1011 thisDatetime=thisDatetime)
1011
1012
1012 return dataOut
1013 return dataOut
1013
1014
1014 @MPDecorator
1015 @MPDecorator
1015 class SpectraCutPlot_(Figure):
1016 class SpectraCutPlot_(Figure):
1016
1017
1017 isConfig = None
1018 isConfig = None
1018 __nsubplots = None
1019 __nsubplots = None
1019
1020
1020 WIDTHPROF = None
1021 WIDTHPROF = None
1021 HEIGHTPROF = None
1022 HEIGHTPROF = None
1022 PREFIX = 'spc_cut'
1023 PREFIX = 'spc_cut'
1023
1024
1024 def __init__(self):
1025 def __init__(self):
1025 Figure.__init__(self)
1026 Figure.__init__(self)
1026 self.isConfig = False
1027 self.isConfig = False
1027 self.__nsubplots = 1
1028 self.__nsubplots = 1
1028
1029
1029 self.PLOT_CODE = POWER_CODE
1030 self.PLOT_CODE = POWER_CODE
1030
1031
1031 self.WIDTH = 700
1032 self.WIDTH = 700
1032 self.HEIGHT = 500
1033 self.HEIGHT = 500
1033 self.counter_imagwr = 0
1034 self.counter_imagwr = 0
1034
1035
1035 def getSubplots(self):
1036 def getSubplots(self):
1036 ncol = 1
1037 ncol = 1
1037 nrow = 1
1038 nrow = 1
1038
1039
1039 return nrow, ncol
1040 return nrow, ncol
1040
1041
1041 def setup(self, id, nplots, wintitle, show):
1042 def setup(self, id, nplots, wintitle, show):
1042
1043
1043 self.nplots = nplots
1044 self.nplots = nplots
1044
1045
1045 ncolspan = 1
1046 ncolspan = 1
1046 colspan = 1
1047 colspan = 1
1047
1048
1048 self.createFigure(id = id,
1049 self.createFigure(id = id,
1049 wintitle = wintitle,
1050 wintitle = wintitle,
1050 widthplot = self.WIDTH,
1051 widthplot = self.WIDTH,
1051 heightplot = self.HEIGHT,
1052 heightplot = self.HEIGHT,
1052 show=show)
1053 show=show)
1053
1054
1054 nrow, ncol = self.getSubplots()
1055 nrow, ncol = self.getSubplots()
1055
1056
1056 counter = 0
1057 counter = 0
1057 for y in range(nrow):
1058 for y in range(nrow):
1058 for x in range(ncol):
1059 for x in range(ncol):
1059 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
1060 self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1)
1060
1061
1061 def run(self, dataOut, id, wintitle="", channelList=None,
1062 def run(self, dataOut, id, wintitle="", channelList=None,
1062 xmin=None, xmax=None, ymin=None, ymax=None,
1063 xmin=None, xmax=None, ymin=None, ymax=None,
1063 save=False, figpath='./', figfile=None, show=True,
1064 save=False, figpath='./', figfile=None, show=True,
1064 ftp=False, wr_period=1, server=None,
1065 ftp=False, wr_period=1, server=None,
1065 folder=None, username=None, password=None,
1066 folder=None, username=None, password=None,
1066 xaxis="frequency"):
1067 xaxis="frequency"):
1067
1068
1068 if dataOut.flagNoData:
1069 if dataOut.flagNoData:
1069 return dataOut
1070 return dataOut
1070
1071
1071 if channelList == None:
1072 if channelList == None:
1072 channelIndexList = dataOut.channelIndexList
1073 channelIndexList = dataOut.channelIndexList
1073 channelList = dataOut.channelList
1074 channelList = dataOut.channelList
1074 else:
1075 else:
1075 channelIndexList = []
1076 channelIndexList = []
1076 for channel in channelList:
1077 for channel in channelList:
1077 if channel not in dataOut.channelList:
1078 if channel not in dataOut.channelList:
1078 raise ValueError("Channel %d is not in dataOut.channelList")
1079 raise ValueError("Channel %d is not in dataOut.channelList")
1079 channelIndexList.append(dataOut.channelList.index(channel))
1080 channelIndexList.append(dataOut.channelList.index(channel))
1080
1081
1081 factor = dataOut.normFactor
1082 factor = dataOut.normFactor
1082
1083
1083 y = dataOut.getHeiRange()
1084 y = dataOut.getHeiRange()
1084
1085
1085 z = dataOut.data_spc/factor
1086 z = dataOut.data_spc/factor
1086 z = numpy.where(numpy.isfinite(z), z, numpy.NAN)
1087 z = numpy.where(numpy.isfinite(z), z, numpy.NAN)
1087
1088
1088 hei_index = numpy.arange(25)*3 + 20
1089 hei_index = numpy.arange(25)*3 + 20
1089
1090
1090 if xaxis == "frequency":
1091 if xaxis == "frequency":
1091 x = dataOut.getFreqRange()/1000.
1092 x = dataOut.getFreqRange()/1000.
1092 zdB = 10*numpy.log10(z[0,:,hei_index])
1093 zdB = 10*numpy.log10(z[0,:,hei_index])
1093 xlabel = "Frequency (kHz)"
1094 xlabel = "Frequency (kHz)"
1094 ylabel = "Power (dB)"
1095 ylabel = "Power (dB)"
1095
1096
1096 elif xaxis == "time":
1097 elif xaxis == "time":
1097 x = dataOut.getAcfRange()
1098 x = dataOut.getAcfRange()
1098 zdB = z[0,:,hei_index]
1099 zdB = z[0,:,hei_index]
1099 xlabel = "Time (ms)"
1100 xlabel = "Time (ms)"
1100 ylabel = "ACF"
1101 ylabel = "ACF"
1101
1102
1102 else:
1103 else:
1103 x = dataOut.getVelRange()
1104 x = dataOut.getVelRange()
1104 zdB = 10*numpy.log10(z[0,:,hei_index])
1105 zdB = 10*numpy.log10(z[0,:,hei_index])
1105 xlabel = "Velocity (m/s)"
1106 xlabel = "Velocity (m/s)"
1106 ylabel = "Power (dB)"
1107 ylabel = "Power (dB)"
1107
1108
1108 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0])
1109 thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0])
1109 title = wintitle + " Range Cuts %s" %(thisDatetime.strftime("%d-%b-%Y"))
1110 title = wintitle + " Range Cuts %s" %(thisDatetime.strftime("%d-%b-%Y"))
1110
1111
1111 if not self.isConfig:
1112 if not self.isConfig:
1112
1113
1113 nplots = 1
1114 nplots = 1
1114
1115
1115 self.setup(id=id,
1116 self.setup(id=id,
1116 nplots=nplots,
1117 nplots=nplots,
1117 wintitle=wintitle,
1118 wintitle=wintitle,
1118 show=show)
1119 show=show)
1119
1120
1120 if xmin == None: xmin = numpy.nanmin(x)*0.9
1121 if xmin == None: xmin = numpy.nanmin(x)*0.9
1121 if xmax == None: xmax = numpy.nanmax(x)*1.1
1122 if xmax == None: xmax = numpy.nanmax(x)*1.1
1122 if ymin == None: ymin = numpy.nanmin(zdB)
1123 if ymin == None: ymin = numpy.nanmin(zdB)
1123 if ymax == None: ymax = numpy.nanmax(zdB)
1124 if ymax == None: ymax = numpy.nanmax(zdB)
1124
1125
1125 self.isConfig = True
1126 self.isConfig = True
1126
1127
1127 self.setWinTitle(title)
1128 self.setWinTitle(title)
1128
1129
1129 title = "Spectra Cuts: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S"))
1130 title = "Spectra Cuts: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S"))
1130 axes = self.axesList[0]
1131 axes = self.axesList[0]
1131
1132
1132 legendlabels = ["Range = %dKm" %y[i] for i in hei_index]
1133 legendlabels = ["Range = %dKm" %y[i] for i in hei_index]
1133
1134
1134 axes.pmultilineyaxis( x, zdB,
1135 axes.pmultilineyaxis( x, zdB,
1135 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax,
1136 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax,
1136 xlabel=xlabel, ylabel=ylabel, title=title, legendlabels=legendlabels,
1137 xlabel=xlabel, ylabel=ylabel, title=title, legendlabels=legendlabels,
1137 ytick_visible=True, nxticks=5,
1138 ytick_visible=True, nxticks=5,
1138 grid='x')
1139 grid='x')
1139
1140
1140 self.draw()
1141 self.draw()
1141
1142
1142 self.save(figpath=figpath,
1143 self.save(figpath=figpath,
1143 figfile=figfile,
1144 figfile=figfile,
1144 save=save,
1145 save=save,
1145 ftp=ftp,
1146 ftp=ftp,
1146 wr_period=wr_period,
1147 wr_period=wr_period,
1147 thisDatetime=thisDatetime)
1148 thisDatetime=thisDatetime)
1148
1149
1149 return dataOut
1150 return dataOut
1150
1151
1151 @MPDecorator
1152 @MPDecorator
1152 class Noise_(Figure):
1153 class Noise_(Figure):
1153
1154
1154 isConfig = None
1155 isConfig = None
1155 __nsubplots = None
1156 __nsubplots = None
1156
1157
1157 PREFIX = 'noise'
1158 PREFIX = 'noise'
1158
1159
1159
1160
1160 def __init__(self):
1161 def __init__(self):
1161 Figure.__init__(self)
1162 Figure.__init__(self)
1162 self.timerange = 24*60*60
1163 self.timerange = 24*60*60
1163 self.isConfig = False
1164 self.isConfig = False
1164 self.__nsubplots = 1
1165 self.__nsubplots = 1
1165 self.counter_imagwr = 0
1166 self.counter_imagwr = 0
1166 self.WIDTH = 800
1167 self.WIDTH = 800
1167 self.HEIGHT = 400
1168 self.HEIGHT = 400
1168 self.WIDTHPROF = 120
1169 self.WIDTHPROF = 120
1169 self.HEIGHTPROF = 0
1170 self.HEIGHTPROF = 0
1170 self.xdata = None
1171 self.xdata = None
1171 self.ydata = None
1172 self.ydata = None
1172
1173
1173 self.PLOT_CODE = NOISE_CODE
1174 self.PLOT_CODE = NOISE_CODE
1174
1175
1175 self.FTP_WEI = None
1176 self.FTP_WEI = None
1176 self.EXP_CODE = None
1177 self.EXP_CODE = None
1177 self.SUB_EXP_CODE = None
1178 self.SUB_EXP_CODE = None
1178 self.PLOT_POS = None
1179 self.PLOT_POS = None
1179 self.figfile = None
1180 self.figfile = None
1180
1181
1181 self.xmin = None
1182 self.xmin = None
1182 self.xmax = None
1183 self.xmax = None
1183
1184
1184 def getSubplots(self):
1185 def getSubplots(self):
1185
1186
1186 ncol = 1
1187 ncol = 1
1187 nrow = 1
1188 nrow = 1
1188
1189
1189 return nrow, ncol
1190 return nrow, ncol
1190
1191
1191 def openfile(self, filename):
1192 def openfile(self, filename):
1192 dirname = os.path.dirname(filename)
1193 dirname = os.path.dirname(filename)
1193
1194
1194 if not os.path.exists(dirname):
1195 if not os.path.exists(dirname):
1195 os.mkdir(dirname)
1196 os.mkdir(dirname)
1196
1197
1197 f = open(filename,'w+')
1198 f = open(filename,'w+')
1198 f.write('\n\n')
1199 f.write('\n\n')
1199 f.write('JICAMARCA RADIO OBSERVATORY - Noise \n')
1200 f.write('JICAMARCA RADIO OBSERVATORY - Noise \n')
1200 f.write('DD MM YYYY HH MM SS Channel0 Channel1 Channel2 Channel3\n\n' )
1201 f.write('DD MM YYYY HH MM SS Channel0 Channel1 Channel2 Channel3\n\n' )
1201 f.close()
1202 f.close()
1202
1203
1203 def save_data(self, filename_phase, data, data_datetime):
1204 def save_data(self, filename_phase, data, data_datetime):
1204
1205
1205 f=open(filename_phase,'a')
1206 f=open(filename_phase,'a')
1206
1207
1207 timetuple_data = data_datetime.timetuple()
1208 timetuple_data = data_datetime.timetuple()
1208 day = str(timetuple_data.tm_mday)
1209 day = str(timetuple_data.tm_mday)
1209 month = str(timetuple_data.tm_mon)
1210 month = str(timetuple_data.tm_mon)
1210 year = str(timetuple_data.tm_year)
1211 year = str(timetuple_data.tm_year)
1211 hour = str(timetuple_data.tm_hour)
1212 hour = str(timetuple_data.tm_hour)
1212 minute = str(timetuple_data.tm_min)
1213 minute = str(timetuple_data.tm_min)
1213 second = str(timetuple_data.tm_sec)
1214 second = str(timetuple_data.tm_sec)
1214
1215
1215 data_msg = ''
1216 data_msg = ''
1216 for i in range(len(data)):
1217 for i in range(len(data)):
1217 data_msg += str(data[i]) + ' '
1218 data_msg += str(data[i]) + ' '
1218
1219
1219 f.write(day+' '+month+' '+year+' '+hour+' '+minute+' '+second+' ' + data_msg + '\n')
1220 f.write(day+' '+month+' '+year+' '+hour+' '+minute+' '+second+' ' + data_msg + '\n')
1220 f.close()
1221 f.close()
1221
1222
1222
1223
1223 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
1224 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
1224
1225
1225 self.__showprofile = showprofile
1226 self.__showprofile = showprofile
1226 self.nplots = nplots
1227 self.nplots = nplots
1227
1228
1228 ncolspan = 7
1229 ncolspan = 7
1229 colspan = 6
1230 colspan = 6
1230 self.__nsubplots = 2
1231 self.__nsubplots = 2
1231
1232
1232 self.createFigure(id = id,
1233 self.createFigure(id = id,
1233 wintitle = wintitle,
1234 wintitle = wintitle,
1234 widthplot = self.WIDTH+self.WIDTHPROF,
1235 widthplot = self.WIDTH+self.WIDTHPROF,
1235 heightplot = self.HEIGHT+self.HEIGHTPROF,
1236 heightplot = self.HEIGHT+self.HEIGHTPROF,
1236 show=show)
1237 show=show)
1237
1238
1238 nrow, ncol = self.getSubplots()
1239 nrow, ncol = self.getSubplots()
1239
1240
1240 self.addAxes(nrow, ncol*ncolspan, 0, 0, colspan, 1)
1241 self.addAxes(nrow, ncol*ncolspan, 0, 0, colspan, 1)
1241
1242
1242
1243
1243 def run(self, dataOut, id, wintitle="", channelList=None, showprofile='True',
1244 def run(self, dataOut, id, wintitle="", channelList=None, showprofile='True',
1244 xmin=None, xmax=None, ymin=None, ymax=None,
1245 xmin=None, xmax=None, ymin=None, ymax=None,
1245 timerange=None,
1246 timerange=None,
1246 save=False, figpath='./', figfile=None, show=True, ftp=False, wr_period=1,
1247 save=False, figpath='./', figfile=None, show=True, ftp=False, wr_period=1,
1247 server=None, folder=None, username=None, password=None,
1248 server=None, folder=None, username=None, password=None,
1248 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0):
1249 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0):
1249
1250
1250 if dataOut.flagNoData:
1251 if dataOut.flagNoData:
1251 return dataOut
1252 return dataOut
1252
1253
1253 if not isTimeInHourRange(dataOut.datatime, xmin, xmax):
1254 if not isTimeInHourRange(dataOut.datatime, xmin, xmax):
1254 return
1255 return
1255
1256
1256 if channelList == None:
1257 if channelList == None:
1257 channelIndexList = dataOut.channelIndexList
1258 channelIndexList = dataOut.channelIndexList
1258 channelList = dataOut.channelList
1259 channelList = dataOut.channelList
1259 else:
1260 else:
1260 channelIndexList = []
1261 channelIndexList = []
1261 for channel in channelList:
1262 for channel in channelList:
1262 if channel not in dataOut.channelList:
1263 if channel not in dataOut.channelList:
1263 raise ValueError("Channel %d is not in dataOut.channelList")
1264 raise ValueError("Channel %d is not in dataOut.channelList")
1264 channelIndexList.append(dataOut.channelList.index(channel))
1265 channelIndexList.append(dataOut.channelList.index(channel))
1265
1266
1266 x = dataOut.getTimeRange()
1267 x = dataOut.getTimeRange()
1267 #y = dataOut.getHeiRange()
1268 #y = dataOut.getHeiRange()
1268 factor = dataOut.normFactor
1269 factor = dataOut.normFactor
1269 noise = dataOut.noise[channelIndexList]/factor
1270 noise = dataOut.noise[channelIndexList]/factor
1270 noisedB = 10*numpy.log10(noise)
1271 noisedB = 10*numpy.log10(noise)
1271
1272
1272 thisDatetime = dataOut.datatime
1273 thisDatetime = dataOut.datatime
1273
1274
1274 title = wintitle + " Noise" # : %s" %(thisDatetime.strftime("%d-%b-%Y"))
1275 title = wintitle + " Noise" # : %s" %(thisDatetime.strftime("%d-%b-%Y"))
1275 xlabel = ""
1276 xlabel = ""
1276 ylabel = "Intensity (dB)"
1277 ylabel = "Intensity (dB)"
1277 update_figfile = False
1278 update_figfile = False
1278
1279
1279 if not self.isConfig:
1280 if not self.isConfig:
1280
1281
1281 nplots = 1
1282 nplots = 1
1282
1283
1283 self.setup(id=id,
1284 self.setup(id=id,
1284 nplots=nplots,
1285 nplots=nplots,
1285 wintitle=wintitle,
1286 wintitle=wintitle,
1286 showprofile=showprofile,
1287 showprofile=showprofile,
1287 show=show)
1288 show=show)
1288
1289
1289 if timerange != None:
1290 if timerange != None:
1290 self.timerange = timerange
1291 self.timerange = timerange
1291
1292
1292 self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange)
1293 self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange)
1293
1294
1294 if ymin == None: ymin = numpy.floor(numpy.nanmin(noisedB)) - 10.0
1295 if ymin == None: ymin = numpy.floor(numpy.nanmin(noisedB)) - 10.0
1295 if ymax == None: ymax = numpy.nanmax(noisedB) + 10.0
1296 if ymax == None: ymax = numpy.nanmax(noisedB) + 10.0
1296
1297
1297 self.FTP_WEI = ftp_wei
1298 self.FTP_WEI = ftp_wei
1298 self.EXP_CODE = exp_code
1299 self.EXP_CODE = exp_code
1299 self.SUB_EXP_CODE = sub_exp_code
1300 self.SUB_EXP_CODE = sub_exp_code
1300 self.PLOT_POS = plot_pos
1301 self.PLOT_POS = plot_pos
1301
1302
1302
1303
1303 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
1304 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
1304 self.isConfig = True
1305 self.isConfig = True
1305 self.figfile = figfile
1306 self.figfile = figfile
1306 self.xdata = numpy.array([])
1307 self.xdata = numpy.array([])
1307 self.ydata = numpy.array([])
1308 self.ydata = numpy.array([])
1308
1309
1309 update_figfile = True
1310 update_figfile = True
1310
1311
1311 #open file beacon phase
1312 #open file beacon phase
1312 path = '%s%03d' %(self.PREFIX, self.id)
1313 path = '%s%03d' %(self.PREFIX, self.id)
1313 noise_file = os.path.join(path,'%s.txt'%self.name)
1314 noise_file = os.path.join(path,'%s.txt'%self.name)
1314 self.filename_noise = os.path.join(figpath,noise_file)
1315 self.filename_noise = os.path.join(figpath,noise_file)
1315
1316
1316 self.setWinTitle(title)
1317 self.setWinTitle(title)
1317
1318
1318 title = "Noise %s" %(thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
1319 title = "Noise %s" %(thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
1319
1320
1320 legendlabels = ["channel %d"%(idchannel) for idchannel in channelList]
1321 legendlabels = ["channel %d"%(idchannel) for idchannel in channelList]
1321 axes = self.axesList[0]
1322 axes = self.axesList[0]
1322
1323
1323 self.xdata = numpy.hstack((self.xdata, x[0:1]))
1324 self.xdata = numpy.hstack((self.xdata, x[0:1]))
1324
1325
1325 if len(self.ydata)==0:
1326 if len(self.ydata)==0:
1326 self.ydata = noisedB.reshape(-1,1)
1327 self.ydata = noisedB.reshape(-1,1)
1327 else:
1328 else:
1328 self.ydata = numpy.hstack((self.ydata, noisedB.reshape(-1,1)))
1329 self.ydata = numpy.hstack((self.ydata, noisedB.reshape(-1,1)))
1329
1330
1330
1331
1331 axes.pmultilineyaxis(x=self.xdata, y=self.ydata,
1332 axes.pmultilineyaxis(x=self.xdata, y=self.ydata,
1332 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax,
1333 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax,
1333 xlabel=xlabel, ylabel=ylabel, title=title, legendlabels=legendlabels, marker='x', markersize=8, linestyle="solid",
1334 xlabel=xlabel, ylabel=ylabel, title=title, legendlabels=legendlabels, marker='x', markersize=8, linestyle="solid",
1334 XAxisAsTime=True, grid='both'
1335 XAxisAsTime=True, grid='both'
1335 )
1336 )
1336
1337
1337 self.draw()
1338 self.draw()
1338
1339
1339 if dataOut.ltctime >= self.xmax:
1340 if dataOut.ltctime >= self.xmax:
1340 self.counter_imagwr = wr_period
1341 self.counter_imagwr = wr_period
1341 self.isConfig = False
1342 self.isConfig = False
1342 update_figfile = True
1343 update_figfile = True
1343
1344
1344 self.save(figpath=figpath,
1345 self.save(figpath=figpath,
1345 figfile=figfile,
1346 figfile=figfile,
1346 save=save,
1347 save=save,
1347 ftp=ftp,
1348 ftp=ftp,
1348 wr_period=wr_period,
1349 wr_period=wr_period,
1349 thisDatetime=thisDatetime,
1350 thisDatetime=thisDatetime,
1350 update_figfile=update_figfile)
1351 update_figfile=update_figfile)
1351
1352
1352 #store data beacon phase
1353 #store data beacon phase
1353 if save:
1354 if save:
1354 self.save_data(self.filename_noise, noisedB, thisDatetime)
1355 self.save_data(self.filename_noise, noisedB, thisDatetime)
1355
1356
1356 return dataOut
1357 return dataOut
1357
1358
1358 @MPDecorator
1359 @MPDecorator
1359 class BeaconPhase_(Figure):
1360 class BeaconPhase_(Figure):
1360
1361
1361 __isConfig = None
1362 __isConfig = None
1362 __nsubplots = None
1363 __nsubplots = None
1363
1364
1364 PREFIX = 'beacon_phase'
1365 PREFIX = 'beacon_phase'
1365
1366
1366 def __init__(self):
1367 def __init__(self):
1367 Figure.__init__(self)
1368 Figure.__init__(self)
1368 self.timerange = 24*60*60
1369 self.timerange = 24*60*60
1369 self.isConfig = False
1370 self.isConfig = False
1370 self.__nsubplots = 1
1371 self.__nsubplots = 1
1371 self.counter_imagwr = 0
1372 self.counter_imagwr = 0
1372 self.WIDTH = 800
1373 self.WIDTH = 800
1373 self.HEIGHT = 400
1374 self.HEIGHT = 400
1374 self.WIDTHPROF = 120
1375 self.WIDTHPROF = 120
1375 self.HEIGHTPROF = 0
1376 self.HEIGHTPROF = 0
1376 self.xdata = None
1377 self.xdata = None
1377 self.ydata = None
1378 self.ydata = None
1378
1379
1379 self.PLOT_CODE = BEACON_CODE
1380 self.PLOT_CODE = BEACON_CODE
1380
1381
1381 self.FTP_WEI = None
1382 self.FTP_WEI = None
1382 self.EXP_CODE = None
1383 self.EXP_CODE = None
1383 self.SUB_EXP_CODE = None
1384 self.SUB_EXP_CODE = None
1384 self.PLOT_POS = None
1385 self.PLOT_POS = None
1385
1386
1386 self.filename_phase = None
1387 self.filename_phase = None
1387
1388
1388 self.figfile = None
1389 self.figfile = None
1389
1390
1390 self.xmin = None
1391 self.xmin = None
1391 self.xmax = None
1392 self.xmax = None
1392
1393
1393 def getSubplots(self):
1394 def getSubplots(self):
1394
1395
1395 ncol = 1
1396 ncol = 1
1396 nrow = 1
1397 nrow = 1
1397
1398
1398 return nrow, ncol
1399 return nrow, ncol
1399
1400
1400 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
1401 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
1401
1402
1402 self.__showprofile = showprofile
1403 self.__showprofile = showprofile
1403 self.nplots = nplots
1404 self.nplots = nplots
1404
1405
1405 ncolspan = 7
1406 ncolspan = 7
1406 colspan = 6
1407 colspan = 6
1407 self.__nsubplots = 2
1408 self.__nsubplots = 2
1408
1409
1409 self.createFigure(id = id,
1410 self.createFigure(id = id,
1410 wintitle = wintitle,
1411 wintitle = wintitle,
1411 widthplot = self.WIDTH+self.WIDTHPROF,
1412 widthplot = self.WIDTH+self.WIDTHPROF,
1412 heightplot = self.HEIGHT+self.HEIGHTPROF,
1413 heightplot = self.HEIGHT+self.HEIGHTPROF,
1413 show=show)
1414 show=show)
1414
1415
1415 nrow, ncol = self.getSubplots()
1416 nrow, ncol = self.getSubplots()
1416
1417
1417 self.addAxes(nrow, ncol*ncolspan, 0, 0, colspan, 1)
1418 self.addAxes(nrow, ncol*ncolspan, 0, 0, colspan, 1)
1418
1419
1419 def save_phase(self, filename_phase):
1420 def save_phase(self, filename_phase):
1420 f = open(filename_phase,'w+')
1421 f = open(filename_phase,'w+')
1421 f.write('\n\n')
1422 f.write('\n\n')
1422 f.write('JICAMARCA RADIO OBSERVATORY - Beacon Phase \n')
1423 f.write('JICAMARCA RADIO OBSERVATORY - Beacon Phase \n')
1423 f.write('DD MM YYYY HH MM SS pair(2,0) pair(2,1) pair(2,3) pair(2,4)\n\n' )
1424 f.write('DD MM YYYY HH MM SS pair(2,0) pair(2,1) pair(2,3) pair(2,4)\n\n' )
1424 f.close()
1425 f.close()
1425
1426
1426 def save_data(self, filename_phase, data, data_datetime):
1427 def save_data(self, filename_phase, data, data_datetime):
1427 f=open(filename_phase,'a')
1428 f=open(filename_phase,'a')
1428 timetuple_data = data_datetime.timetuple()
1429 timetuple_data = data_datetime.timetuple()
1429 day = str(timetuple_data.tm_mday)
1430 day = str(timetuple_data.tm_mday)
1430 month = str(timetuple_data.tm_mon)
1431 month = str(timetuple_data.tm_mon)
1431 year = str(timetuple_data.tm_year)
1432 year = str(timetuple_data.tm_year)
1432 hour = str(timetuple_data.tm_hour)
1433 hour = str(timetuple_data.tm_hour)
1433 minute = str(timetuple_data.tm_min)
1434 minute = str(timetuple_data.tm_min)
1434 second = str(timetuple_data.tm_sec)
1435 second = str(timetuple_data.tm_sec)
1435 f.write(day+' '+month+' '+year+' '+hour+' '+minute+' '+second+' '+str(data[0])+' '+str(data[1])+' '+str(data[2])+' '+str(data[3])+'\n')
1436 f.write(day+' '+month+' '+year+' '+hour+' '+minute+' '+second+' '+str(data[0])+' '+str(data[1])+' '+str(data[2])+' '+str(data[3])+'\n')
1436 f.close()
1437 f.close()
1437
1438
1438
1439
1439 def run(self, dataOut, id, wintitle="", pairsList=None, showprofile='True',
1440 def run(self, dataOut, id, wintitle="", pairsList=None, showprofile='True',
1440 xmin=None, xmax=None, ymin=None, ymax=None, hmin=None, hmax=None,
1441 xmin=None, xmax=None, ymin=None, ymax=None, hmin=None, hmax=None,
1441 timerange=None,
1442 timerange=None,
1442 save=False, figpath='./', figfile=None, show=True, ftp=False, wr_period=1,
1443 save=False, figpath='./', figfile=None, show=True, ftp=False, wr_period=1,
1443 server=None, folder=None, username=None, password=None,
1444 server=None, folder=None, username=None, password=None,
1444 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0):
1445 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0):
1445
1446
1446 if dataOut.flagNoData:
1447 if dataOut.flagNoData:
1447 return dataOut
1448 return dataOut
1448
1449
1449 if not isTimeInHourRange(dataOut.datatime, xmin, xmax):
1450 if not isTimeInHourRange(dataOut.datatime, xmin, xmax):
1450 return
1451 return
1451
1452
1452 if pairsList == None:
1453 if pairsList == None:
1453 pairsIndexList = dataOut.pairsIndexList[:10]
1454 pairsIndexList = dataOut.pairsIndexList[:10]
1454 else:
1455 else:
1455 pairsIndexList = []
1456 pairsIndexList = []
1456 for pair in pairsList:
1457 for pair in pairsList:
1457 if pair not in dataOut.pairsList:
1458 if pair not in dataOut.pairsList:
1458 raise ValueError("Pair %s is not in dataOut.pairsList" %(pair))
1459 raise ValueError("Pair %s is not in dataOut.pairsList" %(pair))
1459 pairsIndexList.append(dataOut.pairsList.index(pair))
1460 pairsIndexList.append(dataOut.pairsList.index(pair))
1460
1461
1461 if pairsIndexList == []:
1462 if pairsIndexList == []:
1462 return
1463 return
1463
1464
1464 # if len(pairsIndexList) > 4:
1465 # if len(pairsIndexList) > 4:
1465 # pairsIndexList = pairsIndexList[0:4]
1466 # pairsIndexList = pairsIndexList[0:4]
1466
1467
1467 hmin_index = None
1468 hmin_index = None
1468 hmax_index = None
1469 hmax_index = None
1469
1470
1470 if hmin != None and hmax != None:
1471 if hmin != None and hmax != None:
1471 indexes = numpy.arange(dataOut.nHeights)
1472 indexes = numpy.arange(dataOut.nHeights)
1472 hmin_list = indexes[dataOut.heightList >= hmin]
1473 hmin_list = indexes[dataOut.heightList >= hmin]
1473 hmax_list = indexes[dataOut.heightList <= hmax]
1474 hmax_list = indexes[dataOut.heightList <= hmax]
1474
1475
1475 if hmin_list.any():
1476 if hmin_list.any():
1476 hmin_index = hmin_list[0]
1477 hmin_index = hmin_list[0]
1477
1478
1478 if hmax_list.any():
1479 if hmax_list.any():
1479 hmax_index = hmax_list[-1]+1
1480 hmax_index = hmax_list[-1]+1
1480
1481
1481 x = dataOut.getTimeRange()
1482 x = dataOut.getTimeRange()
1482 #y = dataOut.getHeiRange()
1483 #y = dataOut.getHeiRange()
1483
1484
1484
1485
1485 thisDatetime = dataOut.datatime
1486 thisDatetime = dataOut.datatime
1486
1487
1487 title = wintitle + " Signal Phase" # : %s" %(thisDatetime.strftime("%d-%b-%Y"))
1488 title = wintitle + " Signal Phase" # : %s" %(thisDatetime.strftime("%d-%b-%Y"))
1488 xlabel = "Local Time"
1489 xlabel = "Local Time"
1489 ylabel = "Phase (degrees)"
1490 ylabel = "Phase (degrees)"
1490
1491
1491 update_figfile = False
1492 update_figfile = False
1492
1493
1493 nplots = len(pairsIndexList)
1494 nplots = len(pairsIndexList)
1494 #phase = numpy.zeros((len(pairsIndexList),len(dataOut.beacon_heiIndexList)))
1495 #phase = numpy.zeros((len(pairsIndexList),len(dataOut.beacon_heiIndexList)))
1495 phase_beacon = numpy.zeros(len(pairsIndexList))
1496 phase_beacon = numpy.zeros(len(pairsIndexList))
1496 for i in range(nplots):
1497 for i in range(nplots):
1497 pair = dataOut.pairsList[pairsIndexList[i]]
1498 pair = dataOut.pairsList[pairsIndexList[i]]
1498 ccf = numpy.average(dataOut.data_cspc[pairsIndexList[i], :, hmin_index:hmax_index], axis=0)
1499 ccf = numpy.average(dataOut.data_cspc[pairsIndexList[i], :, hmin_index:hmax_index], axis=0)
1499 powa = numpy.average(dataOut.data_spc[pair[0], :, hmin_index:hmax_index], axis=0)
1500 powa = numpy.average(dataOut.data_spc[pair[0], :, hmin_index:hmax_index], axis=0)
1500 powb = numpy.average(dataOut.data_spc[pair[1], :, hmin_index:hmax_index], axis=0)
1501 powb = numpy.average(dataOut.data_spc[pair[1], :, hmin_index:hmax_index], axis=0)
1501 avgcoherenceComplex = ccf/numpy.sqrt(powa*powb)
1502 avgcoherenceComplex = ccf/numpy.sqrt(powa*powb)
1502 phase = numpy.arctan2(avgcoherenceComplex.imag, avgcoherenceComplex.real)*180/numpy.pi
1503 phase = numpy.arctan2(avgcoherenceComplex.imag, avgcoherenceComplex.real)*180/numpy.pi
1503
1504
1504 if dataOut.beacon_heiIndexList:
1505 if dataOut.beacon_heiIndexList:
1505 phase_beacon[i] = numpy.average(phase[dataOut.beacon_heiIndexList])
1506 phase_beacon[i] = numpy.average(phase[dataOut.beacon_heiIndexList])
1506 else:
1507 else:
1507 phase_beacon[i] = numpy.average(phase)
1508 phase_beacon[i] = numpy.average(phase)
1508
1509
1509 if not self.isConfig:
1510 if not self.isConfig:
1510
1511
1511 nplots = len(pairsIndexList)
1512 nplots = len(pairsIndexList)
1512
1513
1513 self.setup(id=id,
1514 self.setup(id=id,
1514 nplots=nplots,
1515 nplots=nplots,
1515 wintitle=wintitle,
1516 wintitle=wintitle,
1516 showprofile=showprofile,
1517 showprofile=showprofile,
1517 show=show)
1518 show=show)
1518
1519
1519 if timerange != None:
1520 if timerange != None:
1520 self.timerange = timerange
1521 self.timerange = timerange
1521
1522
1522 self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange)
1523 self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange)
1523
1524
1524 if ymin == None: ymin = 0
1525 if ymin == None: ymin = 0
1525 if ymax == None: ymax = 360
1526 if ymax == None: ymax = 360
1526
1527
1527 self.FTP_WEI = ftp_wei
1528 self.FTP_WEI = ftp_wei
1528 self.EXP_CODE = exp_code
1529 self.EXP_CODE = exp_code
1529 self.SUB_EXP_CODE = sub_exp_code
1530 self.SUB_EXP_CODE = sub_exp_code
1530 self.PLOT_POS = plot_pos
1531 self.PLOT_POS = plot_pos
1531
1532
1532 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
1533 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
1533 self.isConfig = True
1534 self.isConfig = True
1534 self.figfile = figfile
1535 self.figfile = figfile
1535 self.xdata = numpy.array([])
1536 self.xdata = numpy.array([])
1536 self.ydata = numpy.array([])
1537 self.ydata = numpy.array([])
1537
1538
1538 update_figfile = True
1539 update_figfile = True
1539
1540
1540 #open file beacon phase
1541 #open file beacon phase
1541 path = '%s%03d' %(self.PREFIX, self.id)
1542 path = '%s%03d' %(self.PREFIX, self.id)
1542 beacon_file = os.path.join(path,'%s.txt'%self.name)
1543 beacon_file = os.path.join(path,'%s.txt'%self.name)
1543 self.filename_phase = os.path.join(figpath,beacon_file)
1544 self.filename_phase = os.path.join(figpath,beacon_file)
1544 #self.save_phase(self.filename_phase)
1545 #self.save_phase(self.filename_phase)
1545
1546
1546
1547
1547 #store data beacon phase
1548 #store data beacon phase
1548 #self.save_data(self.filename_phase, phase_beacon, thisDatetime)
1549 #self.save_data(self.filename_phase, phase_beacon, thisDatetime)
1549
1550
1550 self.setWinTitle(title)
1551 self.setWinTitle(title)
1551
1552
1552
1553
1553 title = "Phase Plot %s" %(thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
1554 title = "Phase Plot %s" %(thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
1554
1555
1555 legendlabels = ["Pair (%d,%d)"%(pair[0], pair[1]) for pair in dataOut.pairsList]
1556 legendlabels = ["Pair (%d,%d)"%(pair[0], pair[1]) for pair in dataOut.pairsList]
1556
1557
1557 axes = self.axesList[0]
1558 axes = self.axesList[0]
1558
1559
1559 self.xdata = numpy.hstack((self.xdata, x[0:1]))
1560 self.xdata = numpy.hstack((self.xdata, x[0:1]))
1560
1561
1561 if len(self.ydata)==0:
1562 if len(self.ydata)==0:
1562 self.ydata = phase_beacon.reshape(-1,1)
1563 self.ydata = phase_beacon.reshape(-1,1)
1563 else:
1564 else:
1564 self.ydata = numpy.hstack((self.ydata, phase_beacon.reshape(-1,1)))
1565 self.ydata = numpy.hstack((self.ydata, phase_beacon.reshape(-1,1)))
1565
1566
1566
1567
1567 axes.pmultilineyaxis(x=self.xdata, y=self.ydata,
1568 axes.pmultilineyaxis(x=self.xdata, y=self.ydata,
1568 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax,
1569 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax,
1569 xlabel=xlabel, ylabel=ylabel, title=title, legendlabels=legendlabels, marker='x', markersize=8, linestyle="solid",
1570 xlabel=xlabel, ylabel=ylabel, title=title, legendlabels=legendlabels, marker='x', markersize=8, linestyle="solid",
1570 XAxisAsTime=True, grid='both'
1571 XAxisAsTime=True, grid='both'
1571 )
1572 )
1572
1573
1573 self.draw()
1574 self.draw()
1574
1575
1575 if dataOut.ltctime >= self.xmax:
1576 if dataOut.ltctime >= self.xmax:
1576 self.counter_imagwr = wr_period
1577 self.counter_imagwr = wr_period
1577 self.isConfig = False
1578 self.isConfig = False
1578 update_figfile = True
1579 update_figfile = True
1579
1580
1580 self.save(figpath=figpath,
1581 self.save(figpath=figpath,
1581 figfile=figfile,
1582 figfile=figfile,
1582 save=save,
1583 save=save,
1583 ftp=ftp,
1584 ftp=ftp,
1584 wr_period=wr_period,
1585 wr_period=wr_period,
1585 thisDatetime=thisDatetime,
1586 thisDatetime=thisDatetime,
1586 update_figfile=update_figfile)
1587 update_figfile=update_figfile)
1587
1588
1588 return dataOut No newline at end of file
1589 return dataOut
@@ -1,500 +1,470
1 import os
1 import os
2 import sys
2 import sys
3 import datetime
3 import datetime
4 import numpy
4 import numpy
5 import matplotlib
5 from .jroplot_base import matplotlib, make_axes_locatable, FuncFormatter, LinearLocator
6
7 if 'BACKEND' in os.environ:
8 matplotlib.use(os.environ['BACKEND'])
9 elif 'linux' in sys.platform:
10 matplotlib.use("TkAgg")
11 elif 'darwin' in sys.platform:
12 matplotlib.use('TkAgg')
13 else:
14 from schainpy.utils import log
15 log.warning('Using default Backend="Agg"', 'INFO')
16 matplotlib.use('Agg')
17 # Qt4Agg', 'GTK', 'GTKAgg', 'ps', 'agg', 'cairo', 'MacOSX', 'GTKCairo', 'WXAgg', 'template', 'TkAgg', 'GTK3Cairo', 'GTK3Agg', 'svg', 'WebAgg', 'CocoaAgg', 'emf', 'gdk', 'WX'
18 import matplotlib.pyplot
19
20 from mpl_toolkits.axes_grid1 import make_axes_locatable
21 from matplotlib.ticker import FuncFormatter, LinearLocator
22
23 ###########################################
24 # Actualizacion de las funciones del driver
25 ###########################################
26
27 # create jro colormap
28
29 jet_values = matplotlib.pyplot.get_cmap("jet", 100)(numpy.arange(100))[10:90]
30 blu_values = matplotlib.pyplot.get_cmap(
31 "seismic_r", 20)(numpy.arange(20))[10:15]
32 ncmap = matplotlib.colors.LinearSegmentedColormap.from_list(
33 "jro", numpy.vstack((blu_values, jet_values)))
34 matplotlib.pyplot.register_cmap(cmap=ncmap)
35
36
6
37 def createFigure(id, wintitle, width, height, facecolor="w", show=True, dpi=80):
7 def createFigure(id, wintitle, width, height, facecolor="w", show=True, dpi=80):
38
8
39 matplotlib.pyplot.ioff()
9 matplotlib.pyplot.ioff()
40
10
41 fig = matplotlib.pyplot.figure(num=id, facecolor=facecolor, figsize=(
11 fig = matplotlib.pyplot.figure(num=id, facecolor=facecolor, figsize=(
42 1.0 * width / dpi, 1.0 * height / dpi))
12 1.0 * width / dpi, 1.0 * height / dpi))
43 fig.canvas.manager.set_window_title(wintitle)
13 fig.canvas.manager.set_window_title(wintitle)
44 # fig.canvas.manager.resize(width, height)
14 # fig.canvas.manager.resize(width, height)
45 matplotlib.pyplot.ion()
15 matplotlib.pyplot.ion()
46
16
47 if show:
17 if show:
48 matplotlib.pyplot.show()
18 matplotlib.pyplot.show()
49
19
50 return fig
20 return fig
51
21
52
22
53 def closeFigure(show=False, fig=None):
23 def closeFigure(show=False, fig=None):
54
24
55 # matplotlib.pyplot.ioff()
25 # matplotlib.pyplot.ioff()
56 # matplotlib.pyplot.pause(0)
26 # matplotlib.pyplot.pause(0)
57
27
58 if show:
28 if show:
59 matplotlib.pyplot.show()
29 matplotlib.pyplot.show()
60
30
61 if fig != None:
31 if fig != None:
62 matplotlib.pyplot.close(fig)
32 matplotlib.pyplot.close(fig)
63 # matplotlib.pyplot.pause(0)
33 # matplotlib.pyplot.pause(0)
64 # matplotlib.pyplot.ion()
34 # matplotlib.pyplot.ion()
65
35
66 return
36 return
67
37
68 matplotlib.pyplot.close("all")
38 matplotlib.pyplot.close("all")
69 # matplotlib.pyplot.pause(0)
39 # matplotlib.pyplot.pause(0)
70 # matplotlib.pyplot.ion()
40 # matplotlib.pyplot.ion()
71
41
72 return
42 return
73
43
74
44
75 def saveFigure(fig, filename):
45 def saveFigure(fig, filename):
76
46
77 # matplotlib.pyplot.ioff()
47 # matplotlib.pyplot.ioff()
78 fig.savefig(filename, dpi=matplotlib.pyplot.gcf().dpi)
48 fig.savefig(filename, dpi=matplotlib.pyplot.gcf().dpi)
79 # matplotlib.pyplot.ion()
49 # matplotlib.pyplot.ion()
80
50
81
51
82 def clearFigure(fig):
52 def clearFigure(fig):
83
53
84 fig.clf()
54 fig.clf()
85
55
86
56
87 def setWinTitle(fig, title):
57 def setWinTitle(fig, title):
88
58
89 fig.canvas.manager.set_window_title(title)
59 fig.canvas.manager.set_window_title(title)
90
60
91
61
92 def setTitle(fig, title):
62 def setTitle(fig, title):
93
63
94 fig.suptitle(title)
64 fig.suptitle(title)
95
65
96
66
97 def createAxes(fig, nrow, ncol, xpos, ypos, colspan, rowspan, polar=False):
67 def createAxes(fig, nrow, ncol, xpos, ypos, colspan, rowspan, polar=False):
98
68
99 matplotlib.pyplot.ioff()
69 matplotlib.pyplot.ioff()
100 matplotlib.pyplot.figure(fig.number)
70 matplotlib.pyplot.figure(fig.number)
101 axes = matplotlib.pyplot.subplot2grid((nrow, ncol),
71 axes = matplotlib.pyplot.subplot2grid((nrow, ncol),
102 (xpos, ypos),
72 (xpos, ypos),
103 colspan=colspan,
73 colspan=colspan,
104 rowspan=rowspan,
74 rowspan=rowspan,
105 polar=polar)
75 polar=polar)
106
76
107 matplotlib.pyplot.ion()
77 matplotlib.pyplot.ion()
108 return axes
78 return axes
109
79
110
80
111 def setAxesText(ax, text):
81 def setAxesText(ax, text):
112
82
113 ax.annotate(text,
83 ax.annotate(text,
114 xy=(.1, .99),
84 xy=(.1, .99),
115 xycoords='figure fraction',
85 xycoords='figure fraction',
116 horizontalalignment='left',
86 horizontalalignment='left',
117 verticalalignment='top',
87 verticalalignment='top',
118 fontsize=10)
88 fontsize=10)
119
89
120
90
121 def printLabels(ax, xlabel, ylabel, title):
91 def printLabels(ax, xlabel, ylabel, title):
122
92
123 ax.set_xlabel(xlabel, size=11)
93 ax.set_xlabel(xlabel, size=11)
124 ax.set_ylabel(ylabel, size=11)
94 ax.set_ylabel(ylabel, size=11)
125 ax.set_title(title, size=8)
95 ax.set_title(title, size=8)
126
96
127
97
128 def createPline(ax, x, y, xmin, xmax, ymin, ymax, xlabel='', ylabel='', title='',
98 def createPline(ax, x, y, xmin, xmax, ymin, ymax, xlabel='', ylabel='', title='',
129 ticksize=9, xtick_visible=True, ytick_visible=True,
99 ticksize=9, xtick_visible=True, ytick_visible=True,
130 nxticks=4, nyticks=10,
100 nxticks=4, nyticks=10,
131 grid=None, color='blue'):
101 grid=None, color='blue'):
132 """
102 """
133
103
134 Input:
104 Input:
135 grid : None, 'both', 'x', 'y'
105 grid : None, 'both', 'x', 'y'
136 """
106 """
137
107
138 matplotlib.pyplot.ioff()
108 matplotlib.pyplot.ioff()
139
109
140 ax.set_xlim([xmin, xmax])
110 ax.set_xlim([xmin, xmax])
141 ax.set_ylim([ymin, ymax])
111 ax.set_ylim([ymin, ymax])
142
112
143 printLabels(ax, xlabel, ylabel, title)
113 printLabels(ax, xlabel, ylabel, title)
144
114
145 ######################################################
115 ######################################################
146 if (xmax - xmin) <= 1:
116 if (xmax - xmin) <= 1:
147 xtickspos = numpy.linspace(xmin, xmax, nxticks)
117 xtickspos = numpy.linspace(xmin, xmax, nxticks)
148 xtickspos = numpy.array([float("%.1f" % i) for i in xtickspos])
118 xtickspos = numpy.array([float("%.1f" % i) for i in xtickspos])
149 ax.set_xticks(xtickspos)
119 ax.set_xticks(xtickspos)
150 else:
120 else:
151 xtickspos = numpy.arange(nxticks) * \
121 xtickspos = numpy.arange(nxticks) * \
152 int((xmax - xmin) / (nxticks)) + int(xmin)
122 int((xmax - xmin) / (nxticks)) + int(xmin)
153 # xtickspos = numpy.arange(nxticks)*float(xmax-xmin)/float(nxticks) + int(xmin)
123 # xtickspos = numpy.arange(nxticks)*float(xmax-xmin)/float(nxticks) + int(xmin)
154 ax.set_xticks(xtickspos)
124 ax.set_xticks(xtickspos)
155
125
156 for tick in ax.get_xticklabels():
126 for tick in ax.get_xticklabels():
157 tick.set_visible(xtick_visible)
127 tick.set_visible(xtick_visible)
158
128
159 for tick in ax.xaxis.get_major_ticks():
129 for tick in ax.xaxis.get_major_ticks():
160 tick.label.set_fontsize(ticksize)
130 tick.label.set_fontsize(ticksize)
161
131
162 ######################################################
132 ######################################################
163 for tick in ax.get_yticklabels():
133 for tick in ax.get_yticklabels():
164 tick.set_visible(ytick_visible)
134 tick.set_visible(ytick_visible)
165
135
166 for tick in ax.yaxis.get_major_ticks():
136 for tick in ax.yaxis.get_major_ticks():
167 tick.label.set_fontsize(ticksize)
137 tick.label.set_fontsize(ticksize)
168
138
169 ax.plot(x, y, color=color)
139 ax.plot(x, y, color=color)
170 iplot = ax.lines[-1]
140 iplot = ax.lines[-1]
171
141
172 ######################################################
142 ######################################################
173 if '0.' in matplotlib.__version__[0:2]:
143 if '0.' in matplotlib.__version__[0:2]:
174 print("The matplotlib version has to be updated to 1.1 or newer")
144 print("The matplotlib version has to be updated to 1.1 or newer")
175 return iplot
145 return iplot
176
146
177 if '1.0.' in matplotlib.__version__[0:4]:
147 if '1.0.' in matplotlib.__version__[0:4]:
178 print("The matplotlib version has to be updated to 1.1 or newer")
148 print("The matplotlib version has to be updated to 1.1 or newer")
179 return iplot
149 return iplot
180
150
181 if grid != None:
151 if grid != None:
182 ax.grid(b=True, which='major', axis=grid)
152 ax.grid(b=True, which='major', axis=grid)
183
153
184 matplotlib.pyplot.tight_layout()
154 matplotlib.pyplot.tight_layout()
185
155
186 matplotlib.pyplot.ion()
156 matplotlib.pyplot.ion()
187
157
188 return iplot
158 return iplot
189
159
190
160
191 def set_linedata(ax, x, y, idline):
161 def set_linedata(ax, x, y, idline):
192
162
193 ax.lines[idline].set_data(x, y)
163 ax.lines[idline].set_data(x, y)
194
164
195
165
196 def pline(iplot, x, y, xlabel='', ylabel='', title=''):
166 def pline(iplot, x, y, xlabel='', ylabel='', title=''):
197
167
198 ax = iplot.axes
168 ax = iplot.axes
199
169
200 printLabels(ax, xlabel, ylabel, title)
170 printLabels(ax, xlabel, ylabel, title)
201
171
202 set_linedata(ax, x, y, idline=0)
172 set_linedata(ax, x, y, idline=0)
203
173
204
174
205 def addpline(ax, x, y, color, linestyle, lw):
175 def addpline(ax, x, y, color, linestyle, lw):
206
176
207 ax.plot(x, y, color=color, linestyle=linestyle, lw=lw)
177 ax.plot(x, y, color=color, linestyle=linestyle, lw=lw)
208
178
209
179
210 def createPcolor(ax, x, y, z, xmin, xmax, ymin, ymax, zmin, zmax,
180 def createPcolor(ax, x, y, z, xmin, xmax, ymin, ymax, zmin, zmax,
211 xlabel='', ylabel='', title='', ticksize=9,
181 xlabel='', ylabel='', title='', ticksize=9,
212 colormap='jet', cblabel='', cbsize="5%",
182 colormap='jet', cblabel='', cbsize="5%",
213 XAxisAsTime=False):
183 XAxisAsTime=False):
214
184
215 matplotlib.pyplot.ioff()
185 matplotlib.pyplot.ioff()
216
186
217 divider = make_axes_locatable(ax)
187 divider = make_axes_locatable(ax)
218 ax_cb = divider.new_horizontal(size=cbsize, pad=0.05)
188 ax_cb = divider.new_horizontal(size=cbsize, pad=0.05)
219 fig = ax.get_figure()
189 fig = ax.get_figure()
220 fig.add_axes(ax_cb)
190 fig.add_axes(ax_cb)
221
191
222 ax.set_xlim([xmin, xmax])
192 ax.set_xlim([xmin, xmax])
223 ax.set_ylim([ymin, ymax])
193 ax.set_ylim([ymin, ymax])
224
194
225 printLabels(ax, xlabel, ylabel, title)
195 printLabels(ax, xlabel, ylabel, title)
226
196
227 z = numpy.ma.masked_invalid(z)
197 z = numpy.ma.masked_invalid(z)
228 cmap = matplotlib.pyplot.get_cmap(colormap)
198 cmap = matplotlib.pyplot.get_cmap(colormap)
229 cmap.set_bad('white', 1.)
199 cmap.set_bad('white', 1.)
230 imesh = ax.pcolormesh(x, y, z.T, vmin=zmin, vmax=zmax, cmap=cmap)
200 imesh = ax.pcolormesh(x, y, z.T, vmin=zmin, vmax=zmax, cmap=cmap)
231 cb = matplotlib.pyplot.colorbar(imesh, cax=ax_cb)
201 cb = matplotlib.pyplot.colorbar(imesh, cax=ax_cb)
232 cb.set_label(cblabel)
202 cb.set_label(cblabel)
233
203
234 # for tl in ax_cb.get_yticklabels():
204 # for tl in ax_cb.get_yticklabels():
235 # tl.set_visible(True)
205 # tl.set_visible(True)
236
206
237 for tick in ax.yaxis.get_major_ticks():
207 for tick in ax.yaxis.get_major_ticks():
238 tick.label.set_fontsize(ticksize)
208 tick.label.set_fontsize(ticksize)
239
209
240 for tick in ax.xaxis.get_major_ticks():
210 for tick in ax.xaxis.get_major_ticks():
241 tick.label.set_fontsize(ticksize)
211 tick.label.set_fontsize(ticksize)
242
212
243 for tick in cb.ax.get_yticklabels():
213 for tick in cb.ax.get_yticklabels():
244 tick.set_fontsize(ticksize)
214 tick.set_fontsize(ticksize)
245
215
246 ax_cb.yaxis.tick_right()
216 ax_cb.yaxis.tick_right()
247
217
248 if '0.' in matplotlib.__version__[0:2]:
218 if '0.' in matplotlib.__version__[0:2]:
249 print("The matplotlib version has to be updated to 1.1 or newer")
219 print("The matplotlib version has to be updated to 1.1 or newer")
250 return imesh
220 return imesh
251
221
252 if '1.0.' in matplotlib.__version__[0:4]:
222 if '1.0.' in matplotlib.__version__[0:4]:
253 print("The matplotlib version has to be updated to 1.1 or newer")
223 print("The matplotlib version has to be updated to 1.1 or newer")
254 return imesh
224 return imesh
255
225
256 matplotlib.pyplot.tight_layout()
226 matplotlib.pyplot.tight_layout()
257
227
258 if XAxisAsTime:
228 if XAxisAsTime:
259
229
260 def func(x, pos): return ('%s') % (
230 def func(x, pos): return ('%s') % (
261 datetime.datetime.utcfromtimestamp(x).strftime("%H:%M:%S"))
231 datetime.datetime.utcfromtimestamp(x).strftime("%H:%M:%S"))
262 ax.xaxis.set_major_formatter(FuncFormatter(func))
232 ax.xaxis.set_major_formatter(FuncFormatter(func))
263 ax.xaxis.set_major_locator(LinearLocator(7))
233 ax.xaxis.set_major_locator(LinearLocator(7))
264
234
265 matplotlib.pyplot.ion()
235 matplotlib.pyplot.ion()
266 return imesh
236 return imesh
267
237
268
238
269 def pcolor(imesh, z, xlabel='', ylabel='', title=''):
239 def pcolor(imesh, z, xlabel='', ylabel='', title=''):
270
240
271 z = z.T
241 z = z.T
272 ax = imesh.axes
242 ax = imesh.axes
273 printLabels(ax, xlabel, ylabel, title)
243 printLabels(ax, xlabel, ylabel, title)
274 imesh.set_array(z.ravel())
244 imesh.set_array(z.ravel())
275
245
276
246
277 def addpcolor(ax, x, y, z, zmin, zmax, xlabel='', ylabel='', title='', colormap='jet'):
247 def addpcolor(ax, x, y, z, zmin, zmax, xlabel='', ylabel='', title='', colormap='jet'):
278
248
279 printLabels(ax, xlabel, ylabel, title)
249 printLabels(ax, xlabel, ylabel, title)
280
250
281 ax.pcolormesh(x, y, z.T, vmin=zmin, vmax=zmax,
251 ax.pcolormesh(x, y, z.T, vmin=zmin, vmax=zmax,
282 cmap=matplotlib.pyplot.get_cmap(colormap))
252 cmap=matplotlib.pyplot.get_cmap(colormap))
283
253
284
254
285 def addpcolorbuffer(ax, x, y, z, zmin, zmax, xlabel='', ylabel='', title='', colormap='jet'):
255 def addpcolorbuffer(ax, x, y, z, zmin, zmax, xlabel='', ylabel='', title='', colormap='jet'):
286
256
287 printLabels(ax, xlabel, ylabel, title)
257 printLabels(ax, xlabel, ylabel, title)
288
258
289 ax.collections.remove(ax.collections[0])
259 ax.collections.remove(ax.collections[0])
290
260
291 z = numpy.ma.masked_invalid(z)
261 z = numpy.ma.masked_invalid(z)
292
262
293 cmap = matplotlib.pyplot.get_cmap(colormap)
263 cmap = matplotlib.pyplot.get_cmap(colormap)
294 cmap.set_bad('white', 1.)
264 cmap.set_bad('white', 1.)
295
265
296 ax.pcolormesh(x, y, z.T, vmin=zmin, vmax=zmax, cmap=cmap)
266 ax.pcolormesh(x, y, z.T, vmin=zmin, vmax=zmax, cmap=cmap)
297
267
298
268
299 def createPmultiline(ax, x, y, xmin, xmax, ymin, ymax, xlabel='', ylabel='', title='', legendlabels=None,
269 def createPmultiline(ax, x, y, xmin, xmax, ymin, ymax, xlabel='', ylabel='', title='', legendlabels=None,
300 ticksize=9, xtick_visible=True, ytick_visible=True,
270 ticksize=9, xtick_visible=True, ytick_visible=True,
301 nxticks=4, nyticks=10,
271 nxticks=4, nyticks=10,
302 grid=None):
272 grid=None):
303 """
273 """
304
274
305 Input:
275 Input:
306 grid : None, 'both', 'x', 'y'
276 grid : None, 'both', 'x', 'y'
307 """
277 """
308
278
309 matplotlib.pyplot.ioff()
279 matplotlib.pyplot.ioff()
310
280
311 lines = ax.plot(x.T, y)
281 lines = ax.plot(x.T, y)
312 leg = ax.legend(lines, legendlabels, loc='upper right')
282 leg = ax.legend(lines, legendlabels, loc='upper right')
313 leg.get_frame().set_alpha(0.5)
283 leg.get_frame().set_alpha(0.5)
314 ax.set_xlim([xmin, xmax])
284 ax.set_xlim([xmin, xmax])
315 ax.set_ylim([ymin, ymax])
285 ax.set_ylim([ymin, ymax])
316 printLabels(ax, xlabel, ylabel, title)
286 printLabels(ax, xlabel, ylabel, title)
317
287
318 xtickspos = numpy.arange(nxticks) * \
288 xtickspos = numpy.arange(nxticks) * \
319 int((xmax - xmin) / (nxticks)) + int(xmin)
289 int((xmax - xmin) / (nxticks)) + int(xmin)
320 ax.set_xticks(xtickspos)
290 ax.set_xticks(xtickspos)
321
291
322 for tick in ax.get_xticklabels():
292 for tick in ax.get_xticklabels():
323 tick.set_visible(xtick_visible)
293 tick.set_visible(xtick_visible)
324
294
325 for tick in ax.xaxis.get_major_ticks():
295 for tick in ax.xaxis.get_major_ticks():
326 tick.label.set_fontsize(ticksize)
296 tick.label.set_fontsize(ticksize)
327
297
328 for tick in ax.get_yticklabels():
298 for tick in ax.get_yticklabels():
329 tick.set_visible(ytick_visible)
299 tick.set_visible(ytick_visible)
330
300
331 for tick in ax.yaxis.get_major_ticks():
301 for tick in ax.yaxis.get_major_ticks():
332 tick.label.set_fontsize(ticksize)
302 tick.label.set_fontsize(ticksize)
333
303
334 iplot = ax.lines[-1]
304 iplot = ax.lines[-1]
335
305
336 if '0.' in matplotlib.__version__[0:2]:
306 if '0.' in matplotlib.__version__[0:2]:
337 print("The matplotlib version has to be updated to 1.1 or newer")
307 print("The matplotlib version has to be updated to 1.1 or newer")
338 return iplot
308 return iplot
339
309
340 if '1.0.' in matplotlib.__version__[0:4]:
310 if '1.0.' in matplotlib.__version__[0:4]:
341 print("The matplotlib version has to be updated to 1.1 or newer")
311 print("The matplotlib version has to be updated to 1.1 or newer")
342 return iplot
312 return iplot
343
313
344 if grid != None:
314 if grid != None:
345 ax.grid(b=True, which='major', axis=grid)
315 ax.grid(b=True, which='major', axis=grid)
346
316
347 matplotlib.pyplot.tight_layout()
317 matplotlib.pyplot.tight_layout()
348
318
349 matplotlib.pyplot.ion()
319 matplotlib.pyplot.ion()
350
320
351 return iplot
321 return iplot
352
322
353
323
354 def pmultiline(iplot, x, y, xlabel='', ylabel='', title=''):
324 def pmultiline(iplot, x, y, xlabel='', ylabel='', title=''):
355
325
356 ax = iplot.axes
326 ax = iplot.axes
357
327
358 printLabels(ax, xlabel, ylabel, title)
328 printLabels(ax, xlabel, ylabel, title)
359
329
360 for i in range(len(ax.lines)):
330 for i in range(len(ax.lines)):
361 line = ax.lines[i]
331 line = ax.lines[i]
362 line.set_data(x[i, :], y)
332 line.set_data(x[i, :], y)
363
333
364
334
365 def createPmultilineYAxis(ax, x, y, xmin, xmax, ymin, ymax, xlabel='', ylabel='', title='', legendlabels=None,
335 def createPmultilineYAxis(ax, x, y, xmin, xmax, ymin, ymax, xlabel='', ylabel='', title='', legendlabels=None,
366 ticksize=9, xtick_visible=True, ytick_visible=True,
336 ticksize=9, xtick_visible=True, ytick_visible=True,
367 nxticks=4, nyticks=10, marker='.', markersize=10, linestyle="None",
337 nxticks=4, nyticks=10, marker='.', markersize=10, linestyle="None",
368 grid=None, XAxisAsTime=False):
338 grid=None, XAxisAsTime=False):
369 """
339 """
370
340
371 Input:
341 Input:
372 grid : None, 'both', 'x', 'y'
342 grid : None, 'both', 'x', 'y'
373 """
343 """
374
344
375 matplotlib.pyplot.ioff()
345 matplotlib.pyplot.ioff()
376
346
377 # lines = ax.plot(x, y.T, marker=marker,markersize=markersize,linestyle=linestyle)
347 # lines = ax.plot(x, y.T, marker=marker,markersize=markersize,linestyle=linestyle)
378 lines = ax.plot(x, y.T)
348 lines = ax.plot(x, y.T)
379 # leg = ax.legend(lines, legendlabels, loc=2, bbox_to_anchor=(1.01, 1.00), numpoints=1, handlelength=1.5, \
349 # leg = ax.legend(lines, legendlabels, loc=2, bbox_to_anchor=(1.01, 1.00), numpoints=1, handlelength=1.5, \
380 # handletextpad=0.5, borderpad=0.5, labelspacing=0.5, borderaxespad=0.)
350 # handletextpad=0.5, borderpad=0.5, labelspacing=0.5, borderaxespad=0.)
381
351
382 leg = ax.legend(lines, legendlabels,
352 leg = ax.legend(lines, legendlabels,
383 loc='upper right', bbox_to_anchor=(1.16, 1), borderaxespad=0)
353 loc='upper right', bbox_to_anchor=(1.16, 1), borderaxespad=0)
384
354
385 for label in leg.get_texts():
355 for label in leg.get_texts():
386 label.set_fontsize(9)
356 label.set_fontsize(9)
387
357
388 ax.set_xlim([xmin, xmax])
358 ax.set_xlim([xmin, xmax])
389 ax.set_ylim([ymin, ymax])
359 ax.set_ylim([ymin, ymax])
390 printLabels(ax, xlabel, ylabel, title)
360 printLabels(ax, xlabel, ylabel, title)
391
361
392 # xtickspos = numpy.arange(nxticks)*int((xmax-xmin)/(nxticks)) + int(xmin)
362 # xtickspos = numpy.arange(nxticks)*int((xmax-xmin)/(nxticks)) + int(xmin)
393 # ax.set_xticks(xtickspos)
363 # ax.set_xticks(xtickspos)
394
364
395 for tick in ax.get_xticklabels():
365 for tick in ax.get_xticklabels():
396 tick.set_visible(xtick_visible)
366 tick.set_visible(xtick_visible)
397
367
398 for tick in ax.xaxis.get_major_ticks():
368 for tick in ax.xaxis.get_major_ticks():
399 tick.label.set_fontsize(ticksize)
369 tick.label.set_fontsize(ticksize)
400
370
401 for tick in ax.get_yticklabels():
371 for tick in ax.get_yticklabels():
402 tick.set_visible(ytick_visible)
372 tick.set_visible(ytick_visible)
403
373
404 for tick in ax.yaxis.get_major_ticks():
374 for tick in ax.yaxis.get_major_ticks():
405 tick.label.set_fontsize(ticksize)
375 tick.label.set_fontsize(ticksize)
406
376
407 iplot = ax.lines[-1]
377 iplot = ax.lines[-1]
408
378
409 if '0.' in matplotlib.__version__[0:2]:
379 if '0.' in matplotlib.__version__[0:2]:
410 print("The matplotlib version has to be updated to 1.1 or newer")
380 print("The matplotlib version has to be updated to 1.1 or newer")
411 return iplot
381 return iplot
412
382
413 if '1.0.' in matplotlib.__version__[0:4]:
383 if '1.0.' in matplotlib.__version__[0:4]:
414 print("The matplotlib version has to be updated to 1.1 or newer")
384 print("The matplotlib version has to be updated to 1.1 or newer")
415 return iplot
385 return iplot
416
386
417 if grid != None:
387 if grid != None:
418 ax.grid(b=True, which='major', axis=grid)
388 ax.grid(b=True, which='major', axis=grid)
419
389
420 matplotlib.pyplot.tight_layout()
390 matplotlib.pyplot.tight_layout()
421
391
422 if XAxisAsTime:
392 if XAxisAsTime:
423
393
424 def func(x, pos): return ('%s') % (
394 def func(x, pos): return ('%s') % (
425 datetime.datetime.utcfromtimestamp(x).strftime("%H:%M:%S"))
395 datetime.datetime.utcfromtimestamp(x).strftime("%H:%M:%S"))
426 ax.xaxis.set_major_formatter(FuncFormatter(func))
396 ax.xaxis.set_major_formatter(FuncFormatter(func))
427 ax.xaxis.set_major_locator(LinearLocator(7))
397 ax.xaxis.set_major_locator(LinearLocator(7))
428
398
429 matplotlib.pyplot.ion()
399 matplotlib.pyplot.ion()
430
400
431 return iplot
401 return iplot
432
402
433
403
434 def pmultilineyaxis(iplot, x, y, xlabel='', ylabel='', title=''):
404 def pmultilineyaxis(iplot, x, y, xlabel='', ylabel='', title=''):
435
405
436 ax = iplot.axes
406 ax = iplot.axes
437 printLabels(ax, xlabel, ylabel, title)
407 printLabels(ax, xlabel, ylabel, title)
438
408
439 for i in range(len(ax.lines)):
409 for i in range(len(ax.lines)):
440 line = ax.lines[i]
410 line = ax.lines[i]
441 line.set_data(x, y[i, :])
411 line.set_data(x, y[i, :])
442
412
443
413
444 def createPolar(ax, x, y,
414 def createPolar(ax, x, y,
445 xlabel='', ylabel='', title='', ticksize=9,
415 xlabel='', ylabel='', title='', ticksize=9,
446 colormap='jet', cblabel='', cbsize="5%",
416 colormap='jet', cblabel='', cbsize="5%",
447 XAxisAsTime=False):
417 XAxisAsTime=False):
448
418
449 matplotlib.pyplot.ioff()
419 matplotlib.pyplot.ioff()
450
420
451 ax.plot(x, y, 'bo', markersize=5)
421 ax.plot(x, y, 'bo', markersize=5)
452 # ax.set_rmax(90)
422 # ax.set_rmax(90)
453 ax.set_ylim(0, 90)
423 ax.set_ylim(0, 90)
454 ax.set_yticks(numpy.arange(0, 90, 20))
424 ax.set_yticks(numpy.arange(0, 90, 20))
455 # ax.text(0, -110, ylabel, rotation='vertical', va ='center', ha = 'center' ,size='11')
425 # ax.text(0, -110, ylabel, rotation='vertical', va ='center', ha = 'center' ,size='11')
456 # ax.text(0, 50, ylabel, rotation='vertical', va ='center', ha = 'left' ,size='11')
426 # ax.text(0, 50, ylabel, rotation='vertical', va ='center', ha = 'left' ,size='11')
457 # ax.text(100, 100, 'example', ha='left', va='center', rotation='vertical')
427 # ax.text(100, 100, 'example', ha='left', va='center', rotation='vertical')
458 ax.yaxis.labelpad = 40
428 ax.yaxis.labelpad = 40
459 printLabels(ax, xlabel, ylabel, title)
429 printLabels(ax, xlabel, ylabel, title)
460 iplot = ax.lines[-1]
430 iplot = ax.lines[-1]
461
431
462 if '0.' in matplotlib.__version__[0:2]:
432 if '0.' in matplotlib.__version__[0:2]:
463 print("The matplotlib version has to be updated to 1.1 or newer")
433 print("The matplotlib version has to be updated to 1.1 or newer")
464 return iplot
434 return iplot
465
435
466 if '1.0.' in matplotlib.__version__[0:4]:
436 if '1.0.' in matplotlib.__version__[0:4]:
467 print("The matplotlib version has to be updated to 1.1 or newer")
437 print("The matplotlib version has to be updated to 1.1 or newer")
468 return iplot
438 return iplot
469
439
470 # if grid != None:
440 # if grid != None:
471 # ax.grid(b=True, which='major', axis=grid)
441 # ax.grid(b=True, which='major', axis=grid)
472
442
473 matplotlib.pyplot.tight_layout()
443 matplotlib.pyplot.tight_layout()
474
444
475 matplotlib.pyplot.ion()
445 matplotlib.pyplot.ion()
476
446
477 return iplot
447 return iplot
478
448
479
449
480 def polar(iplot, x, y, xlabel='', ylabel='', title=''):
450 def polar(iplot, x, y, xlabel='', ylabel='', title=''):
481
451
482 ax = iplot.axes
452 ax = iplot.axes
483
453
484 # ax.text(0, -110, ylabel, rotation='vertical', va ='center', ha = 'center',size='11')
454 # ax.text(0, -110, ylabel, rotation='vertical', va ='center', ha = 'center',size='11')
485 printLabels(ax, xlabel, ylabel, title)
455 printLabels(ax, xlabel, ylabel, title)
486
456
487 set_linedata(ax, x, y, idline=0)
457 set_linedata(ax, x, y, idline=0)
488
458
489
459
490 def draw(fig):
460 def draw(fig):
491
461
492 if type(fig) == 'int':
462 if type(fig) == 'int':
493 raise ValueError("Error drawing: Fig parameter should be a matplotlib figure object figure")
463 raise ValueError("Error drawing: Fig parameter should be a matplotlib figure object figure")
494
464
495 fig.canvas.draw()
465 fig.canvas.draw()
496
466
497
467
498 def pause(interval=0.000001):
468 def pause(interval=0.000001):
499
469
500 matplotlib.pyplot.pause(interval) No newline at end of file
470 matplotlib.pyplot.pause(interval)
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
General Comments 0
You need to be logged in to leave comments. Login now