##// END OF EJS Templates
Fix SpectralMoments Plot
Juan C. Espinoza -
r1207:15feaa6e0b57
parent child
Show More
@@ -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 NO CONTENT: modified file
NO CONTENT: modified file
@@ -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
General Comments 0
You need to be logged in to leave comments. Login now