##// END OF EJS Templates
Affected:...
Miguel Valdez -
r534:e42d2b934f89
parent child
Show More
@@ -1,1015 +1,1025
1 '''
1 '''
2
2
3 $Author: murco $
3 $Author: murco $
4 $Id: JROData.py 173 2012-11-20 15:06:21Z murco $
4 $Id: JROData.py 173 2012-11-20 15:06:21Z murco $
5 '''
5 '''
6
6
7 import copy
7 import copy
8 import numpy
8 import numpy
9 import datetime
9 import datetime
10
10
11 from jroheaderIO import SystemHeader, RadarControllerHeader
11 from jroheaderIO import SystemHeader, RadarControllerHeader
12
12
13 def getNumpyDtype(dataTypeCode):
13 def getNumpyDtype(dataTypeCode):
14
14
15 if dataTypeCode == 0:
15 if dataTypeCode == 0:
16 numpyDtype = numpy.dtype([('real','<i1'),('imag','<i1')])
16 numpyDtype = numpy.dtype([('real','<i1'),('imag','<i1')])
17 elif dataTypeCode == 1:
17 elif dataTypeCode == 1:
18 numpyDtype = numpy.dtype([('real','<i2'),('imag','<i2')])
18 numpyDtype = numpy.dtype([('real','<i2'),('imag','<i2')])
19 elif dataTypeCode == 2:
19 elif dataTypeCode == 2:
20 numpyDtype = numpy.dtype([('real','<i4'),('imag','<i4')])
20 numpyDtype = numpy.dtype([('real','<i4'),('imag','<i4')])
21 elif dataTypeCode == 3:
21 elif dataTypeCode == 3:
22 numpyDtype = numpy.dtype([('real','<i8'),('imag','<i8')])
22 numpyDtype = numpy.dtype([('real','<i8'),('imag','<i8')])
23 elif dataTypeCode == 4:
23 elif dataTypeCode == 4:
24 numpyDtype = numpy.dtype([('real','<f4'),('imag','<f4')])
24 numpyDtype = numpy.dtype([('real','<f4'),('imag','<f4')])
25 elif dataTypeCode == 5:
25 elif dataTypeCode == 5:
26 numpyDtype = numpy.dtype([('real','<f8'),('imag','<f8')])
26 numpyDtype = numpy.dtype([('real','<f8'),('imag','<f8')])
27 else:
27 else:
28 raise ValueError, 'dataTypeCode was not defined'
28 raise ValueError, 'dataTypeCode was not defined'
29
29
30 return numpyDtype
30 return numpyDtype
31
31
32 def getDataTypeCode(numpyDtype):
32 def getDataTypeCode(numpyDtype):
33
33
34 if numpyDtype == numpy.dtype([('real','<i1'),('imag','<i1')]):
34 if numpyDtype == numpy.dtype([('real','<i1'),('imag','<i1')]):
35 datatype = 0
35 datatype = 0
36 elif numpyDtype == numpy.dtype([('real','<i2'),('imag','<i2')]):
36 elif numpyDtype == numpy.dtype([('real','<i2'),('imag','<i2')]):
37 datatype = 1
37 datatype = 1
38 elif numpyDtype == numpy.dtype([('real','<i4'),('imag','<i4')]):
38 elif numpyDtype == numpy.dtype([('real','<i4'),('imag','<i4')]):
39 datatype = 2
39 datatype = 2
40 elif numpyDtype == numpy.dtype([('real','<i8'),('imag','<i8')]):
40 elif numpyDtype == numpy.dtype([('real','<i8'),('imag','<i8')]):
41 datatype = 3
41 datatype = 3
42 elif numpyDtype == numpy.dtype([('real','<f4'),('imag','<f4')]):
42 elif numpyDtype == numpy.dtype([('real','<f4'),('imag','<f4')]):
43 datatype = 4
43 datatype = 4
44 elif numpyDtype == numpy.dtype([('real','<f8'),('imag','<f8')]):
44 elif numpyDtype == numpy.dtype([('real','<f8'),('imag','<f8')]):
45 datatype = 5
45 datatype = 5
46 else:
46 else:
47 datatype = None
47 datatype = None
48
48
49 return datatype
49 return datatype
50
50
51 def hildebrand_sekhon(data, navg):
51 def hildebrand_sekhon(data, navg):
52
52
53 data = data.copy()
53 data = data.copy()
54
54
55 sortdata = numpy.sort(data,axis=None)
55 sortdata = numpy.sort(data,axis=None)
56 lenOfData = len(sortdata)
56 lenOfData = len(sortdata)
57 nums_min = lenOfData/10
57 nums_min = lenOfData/10
58
58
59 if (lenOfData/10) > 2:
59 if (lenOfData/10) > 2:
60 nums_min = lenOfData/10
60 nums_min = lenOfData/10
61 else:
61 else:
62 nums_min = 2
62 nums_min = 2
63
63
64 sump = 0.
64 sump = 0.
65
65
66 sumq = 0.
66 sumq = 0.
67
67
68 j = 0
68 j = 0
69
69
70 cont = 1
70 cont = 1
71
71
72 while((cont==1)and(j<lenOfData)):
72 while((cont==1)and(j<lenOfData)):
73
73
74 sump += sortdata[j]
74 sump += sortdata[j]
75
75
76 sumq += sortdata[j]**2
76 sumq += sortdata[j]**2
77
77
78 j += 1
78 j += 1
79
79
80 if j > nums_min:
80 if j > nums_min:
81 rtest = float(j)/(j-1) + 1.0/navg
81 rtest = float(j)/(j-1) + 1.0/navg
82 if ((sumq*j) > (rtest*sump**2)):
82 if ((sumq*j) > (rtest*sump**2)):
83 j = j - 1
83 j = j - 1
84 sump = sump - sortdata[j]
84 sump = sump - sortdata[j]
85 sumq = sumq - sortdata[j]**2
85 sumq = sumq - sortdata[j]**2
86 cont = 0
86 cont = 0
87
87
88 lnoise = sump /j
88 lnoise = sump /j
89 stdv = numpy.sqrt((sumq - lnoise**2)/(j - 1))
89 stdv = numpy.sqrt((sumq - lnoise**2)/(j - 1))
90 return lnoise
90 return lnoise
91
91
92 class Beam:
92 class Beam:
93 def __init__(self):
93 def __init__(self):
94 self.codeList = []
94 self.codeList = []
95 self.azimuthList = []
95 self.azimuthList = []
96 self.zenithList = []
96 self.zenithList = []
97
97
98 class GenericData(object):
98 class GenericData(object):
99
99
100 flagNoData = True
100 flagNoData = True
101
101
102 def __init__(self):
102 def __init__(self):
103
103
104 raise ValueError, "This class has not been implemented"
104 raise ValueError, "This class has not been implemented"
105
105
106 def copy(self, inputObj=None):
106 def copy(self, inputObj=None):
107
107
108 if inputObj == None:
108 if inputObj == None:
109 return copy.deepcopy(self)
109 return copy.deepcopy(self)
110
110
111 for key in inputObj.__dict__.keys():
111 for key in inputObj.__dict__.keys():
112 self.__dict__[key] = inputObj.__dict__[key]
112 self.__dict__[key] = inputObj.__dict__[key]
113
113
114 def deepcopy(self):
114 def deepcopy(self):
115
115
116 return copy.deepcopy(self)
116 return copy.deepcopy(self)
117
117
118 def isEmpty(self):
118 def isEmpty(self):
119
119
120 return self.flagNoData
120 return self.flagNoData
121
121
122 class JROData(GenericData):
122 class JROData(GenericData):
123
123
124 # m_BasicHeader = BasicHeader()
124 # m_BasicHeader = BasicHeader()
125 # m_ProcessingHeader = ProcessingHeader()
125 # m_ProcessingHeader = ProcessingHeader()
126
126
127 systemHeaderObj = SystemHeader()
127 systemHeaderObj = SystemHeader()
128
128
129 radarControllerHeaderObj = RadarControllerHeader()
129 radarControllerHeaderObj = RadarControllerHeader()
130
130
131 # data = None
131 # data = None
132
132
133 type = None
133 type = None
134
134
135 datatype = None #dtype but in string
135 datatype = None #dtype but in string
136
136
137 # dtype = None
137 # dtype = None
138
138
139 # nChannels = None
139 # nChannels = None
140
140
141 # nHeights = None
141 # nHeights = None
142
142
143 nProfiles = None
143 nProfiles = None
144
144
145 heightList = None
145 heightList = None
146
146
147 channelList = None
147 channelList = None
148
148
149 flagTimeBlock = False
149 flagTimeBlock = False
150
150
151 useLocalTime = False
151 useLocalTime = False
152
152
153 utctime = None
153 utctime = None
154
154
155 timeZone = None
155 timeZone = None
156
156
157 dstFlag = None
157 dstFlag = None
158
158
159 errorCount = None
159 errorCount = None
160
160
161 blocksize = None
161 blocksize = None
162
162
163 nCode = None
163 nCode = None
164
164
165 nBaud = None
165 nBaud = None
166
166
167 code = None
167 code = None
168
168
169 flagDecodeData = False #asumo q la data no esta decodificada
169 flagDecodeData = False #asumo q la data no esta decodificada
170
170
171 flagDeflipData = False #asumo q la data no esta sin flip
171 flagDeflipData = False #asumo q la data no esta sin flip
172
172
173 flagShiftFFT = False
173 flagShiftFFT = False
174
174
175 # ippSeconds = None
175 # ippSeconds = None
176
176
177 # timeInterval = None
177 # timeInterval = None
178
178
179 nCohInt = None
179 nCohInt = None
180
180
181 noise = None
181 noise = None
182
182
183 windowOfFilter = 1
183 windowOfFilter = 1
184
184
185 #Speed of ligth
185 #Speed of ligth
186 C = 3e8
186 C = 3e8
187
187
188 frequency = 49.92e6
188 frequency = 49.92e6
189
189
190 realtime = False
190 realtime = False
191
191
192 beacon_heiIndexList = None
192 beacon_heiIndexList = None
193
193
194 last_block = None
194 last_block = None
195
195
196 blocknow = None
196 blocknow = None
197
197
198 azimuth = None
198 azimuth = None
199
199
200 zenith = None
200 zenith = None
201
201
202 beam = Beam()
202 beam = Beam()
203
203
204 profileIndex = None
205
204 def __init__(self):
206 def __init__(self):
205
207
206 raise ValueError, "This class has not been implemented"
208 raise ValueError, "This class has not been implemented"
207
209
208 def getNoise(self):
210 def getNoise(self):
209
211
210 raise ValueError, "Not implemented"
212 raise ValueError, "Not implemented"
211
213
212 def getNChannels(self):
214 def getNChannels(self):
213
215
214 return len(self.channelList)
216 return len(self.channelList)
215
217
216 def getChannelIndexList(self):
218 def getChannelIndexList(self):
217
219
218 return range(self.nChannels)
220 return range(self.nChannels)
219
221
220 def getNHeights(self):
222 def getNHeights(self):
221
223
222 return len(self.heightList)
224 return len(self.heightList)
223
225
224 def getHeiRange(self, extrapoints=0):
226 def getHeiRange(self, extrapoints=0):
225
227
226 heis = self.heightList
228 heis = self.heightList
227 # deltah = self.heightList[1] - self.heightList[0]
229 # deltah = self.heightList[1] - self.heightList[0]
228 #
230 #
229 # heis.append(self.heightList[-1])
231 # heis.append(self.heightList[-1])
230
232
231 return heis
233 return heis
232
234
233 def getltctime(self):
235 def getltctime(self):
234
236
235 if self.useLocalTime:
237 if self.useLocalTime:
236 return self.utctime - self.timeZone*60
238 return self.utctime - self.timeZone*60
237
239
238 return self.utctime
240 return self.utctime
239
241
240 def getDatatime(self):
242 def getDatatime(self):
241
243
242 datatimeValue = datetime.datetime.utcfromtimestamp(self.ltctime)
244 datatimeValue = datetime.datetime.utcfromtimestamp(self.ltctime)
243 return datatimeValue
245 return datatimeValue
244
246
245 def getTimeRange(self):
247 def getTimeRange(self):
246
248
247 datatime = []
249 datatime = []
248
250
249 datatime.append(self.ltctime)
251 datatime.append(self.ltctime)
250 datatime.append(self.ltctime + self.timeInterval)
252 datatime.append(self.ltctime + self.timeInterval)
251
253
252 datatime = numpy.array(datatime)
254 datatime = numpy.array(datatime)
253
255
254 return datatime
256 return datatime
255
257
256 def getFmax(self):
258 def getFmax(self):
257
259
258 PRF = 1./(self.ippSeconds * self.nCohInt)
260 PRF = 1./(self.ippSeconds * self.nCohInt)
259
261
260 fmax = PRF/2.
262 fmax = PRF/2.
261
263
262 return fmax
264 return fmax
263
265
264 def getVmax(self):
266 def getVmax(self):
265
267
266 _lambda = self.C/self.frequency
268 _lambda = self.C/self.frequency
267
269
268 vmax = self.getFmax() * _lambda
270 vmax = self.getFmax() * _lambda
269
271
270 return vmax
272 return vmax
271
273
272 def get_ippSeconds(self):
274 def get_ippSeconds(self):
273 '''
275 '''
274 '''
276 '''
275 return self.radarControllerHeaderObj.ippSeconds
277 return self.radarControllerHeaderObj.ippSeconds
276
278
277 def set_ippSeconds(self, ippSeconds):
279 def set_ippSeconds(self, ippSeconds):
278 '''
280 '''
279 '''
281 '''
280
282
281 self.radarControllerHeaderObj.ippSeconds = ippSeconds
283 self.radarControllerHeaderObj.ippSeconds = ippSeconds
282
284
283 return
285 return
284
286
285 def get_dtype(self):
287 def get_dtype(self):
286 '''
288 '''
287 '''
289 '''
288 return getNumpyDtype(self.datatype)
290 return getNumpyDtype(self.datatype)
289
291
290 def set_dtype(self, numpyDtype):
292 def set_dtype(self, numpyDtype):
291 '''
293 '''
292 '''
294 '''
293
295
294 self.datatype = getDataTypeCode(numpyDtype)
296 self.datatype = getDataTypeCode(numpyDtype)
295
297
296 # def getTimeInterval(self):
298 # def getTimeInterval(self):
297 #
299 #
298 # raise IOError, "This method should be implemented inside each Class"
300 # raise IOError, "This method should be implemented inside each Class"
299
301
300 nChannels = property(getNChannels, "I'm the 'nChannel' property.")
302 nChannels = property(getNChannels, "I'm the 'nChannel' property.")
301 channelIndexList = property(getChannelIndexList, "I'm the 'channelIndexList' property.")
303 channelIndexList = property(getChannelIndexList, "I'm the 'channelIndexList' property.")
302 nHeights = property(getNHeights, "I'm the 'nHeights' property.")
304 nHeights = property(getNHeights, "I'm the 'nHeights' property.")
303 #noise = property(getNoise, "I'm the 'nHeights' property.")
305 #noise = property(getNoise, "I'm the 'nHeights' property.")
304 datatime = property(getDatatime, "I'm the 'datatime' property")
306 datatime = property(getDatatime, "I'm the 'datatime' property")
305 ltctime = property(getltctime, "I'm the 'ltctime' property")
307 ltctime = property(getltctime, "I'm the 'ltctime' property")
306 ippSeconds = property(get_ippSeconds, set_ippSeconds)
308 ippSeconds = property(get_ippSeconds, set_ippSeconds)
307 dtype = property(get_dtype, set_dtype)
309 dtype = property(get_dtype, set_dtype)
308 # timeInterval = property(getTimeInterval, "I'm the 'timeInterval' property")
310 # timeInterval = property(getTimeInterval, "I'm the 'timeInterval' property")
309
311
310 class Voltage(JROData):
312 class Voltage(JROData):
311
313
312 #data es un numpy array de 2 dmensiones (canales, alturas)
314 #data es un numpy array de 2 dmensiones (canales, alturas)
313 data = None
315 data = None
314
316
315 def __init__(self):
317 def __init__(self):
316 '''
318 '''
317 Constructor
319 Constructor
318 '''
320 '''
319
321
320 self.radarControllerHeaderObj = RadarControllerHeader()
322 self.radarControllerHeaderObj = RadarControllerHeader()
321
323
322 self.systemHeaderObj = SystemHeader()
324 self.systemHeaderObj = SystemHeader()
323
325
324 self.type = "Voltage"
326 self.type = "Voltage"
325
327
326 self.data = None
328 self.data = None
327
329
328 # self.dtype = None
330 # self.dtype = None
329
331
330 # self.nChannels = 0
332 # self.nChannels = 0
331
333
332 # self.nHeights = 0
334 # self.nHeights = 0
333
335
334 self.nProfiles = None
336 self.nProfiles = None
335
337
336 self.heightList = None
338 self.heightList = None
337
339
338 self.channelList = None
340 self.channelList = None
339
341
340 # self.channelIndexList = None
342 # self.channelIndexList = None
341
343
342 self.flagNoData = True
344 self.flagNoData = True
343
345
344 self.flagTimeBlock = False
346 self.flagTimeBlock = False
345
347
346 self.utctime = None
348 self.utctime = None
347
349
348 self.timeZone = None
350 self.timeZone = None
349
351
350 self.dstFlag = None
352 self.dstFlag = None
351
353
352 self.errorCount = None
354 self.errorCount = None
353
355
354 self.nCohInt = None
356 self.nCohInt = None
355
357
356 self.blocksize = None
358 self.blocksize = None
357
359
358 self.flagDecodeData = False #asumo q la data no esta decodificada
360 self.flagDecodeData = False #asumo q la data no esta decodificada
359
361
360 self.flagDeflipData = False #asumo q la data no esta sin flip
362 self.flagDeflipData = False #asumo q la data no esta sin flip
361
363
362 self.flagShiftFFT = False
364 self.flagShiftFFT = False
363
365
364 self.flagDataAsBlock = False #Asumo que la data es leida perfil a perfil
366 self.flagDataAsBlock = False #Asumo que la data es leida perfil a perfil
365
367
368 self.profileIndex = 0
369
366 def getNoisebyHildebrand(self):
370 def getNoisebyHildebrand(self):
367 """
371 """
368 Determino el nivel de ruido usando el metodo Hildebrand-Sekhon
372 Determino el nivel de ruido usando el metodo Hildebrand-Sekhon
369
373
370 Return:
374 Return:
371 noiselevel
375 noiselevel
372 """
376 """
373
377
374 for channel in range(self.nChannels):
378 for channel in range(self.nChannels):
375 daux = self.data_spc[channel,:,:]
379 daux = self.data_spc[channel,:,:]
376 self.noise[channel] = hildebrand_sekhon(daux, self.nCohInt)
380 self.noise[channel] = hildebrand_sekhon(daux, self.nCohInt)
377
381
378 return self.noise
382 return self.noise
379
383
380 def getNoise(self, type = 1):
384 def getNoise(self, type = 1):
381
385
382 self.noise = numpy.zeros(self.nChannels)
386 self.noise = numpy.zeros(self.nChannels)
383
387
384 if type == 1:
388 if type == 1:
385 noise = self.getNoisebyHildebrand()
389 noise = self.getNoisebyHildebrand()
386
390
387 return 10*numpy.log10(noise)
391 return 10*numpy.log10(noise)
388
392
389 def getTimeInterval(self):
393 def getTimeInterval(self):
390
394
391 timeInterval = self.ippSeconds * self.nCohInt
395 timeInterval = self.ippSeconds * self.nCohInt
392
396
393 return timeInterval
397 return timeInterval
394
398
395 noise = property(getNoise, "I'm the 'nHeights' property.")
399 noise = property(getNoise, "I'm the 'nHeights' property.")
396 timeInterval = property(getTimeInterval, "I'm the 'timeInterval' property")
400 timeInterval = property(getTimeInterval, "I'm the 'timeInterval' property")
397
401
398 class Spectra(JROData):
402 class Spectra(JROData):
399
403
400 #data es un numpy array de 2 dmensiones (canales, perfiles, alturas)
404 #data es un numpy array de 2 dmensiones (canales, perfiles, alturas)
401 data_spc = None
405 data_spc = None
402
406
403 #data es un numpy array de 2 dmensiones (canales, pares, alturas)
407 #data es un numpy array de 2 dmensiones (canales, pares, alturas)
404 data_cspc = None
408 data_cspc = None
405
409
406 #data es un numpy array de 2 dmensiones (canales, alturas)
410 #data es un numpy array de 2 dmensiones (canales, alturas)
407 data_dc = None
411 data_dc = None
408
412
409 nFFTPoints = None
413 nFFTPoints = None
410
414
411 # nPairs = None
415 # nPairs = None
412
416
413 pairsList = None
417 pairsList = None
414
418
415 nIncohInt = None
419 nIncohInt = None
416
420
417 wavelength = None #Necesario para cacular el rango de velocidad desde la frecuencia
421 wavelength = None #Necesario para cacular el rango de velocidad desde la frecuencia
418
422
419 nCohInt = None #se requiere para determinar el valor de timeInterval
423 nCohInt = None #se requiere para determinar el valor de timeInterval
420
424
421 ippFactor = None
425 ippFactor = None
422
426
427 profileIndex = 0
428
423 def __init__(self):
429 def __init__(self):
424 '''
430 '''
425 Constructor
431 Constructor
426 '''
432 '''
427
433
428 self.radarControllerHeaderObj = RadarControllerHeader()
434 self.radarControllerHeaderObj = RadarControllerHeader()
429
435
430 self.systemHeaderObj = SystemHeader()
436 self.systemHeaderObj = SystemHeader()
431
437
432 self.type = "Spectra"
438 self.type = "Spectra"
433
439
434 # self.data = None
440 # self.data = None
435
441
436 # self.dtype = None
442 # self.dtype = None
437
443
438 # self.nChannels = 0
444 # self.nChannels = 0
439
445
440 # self.nHeights = 0
446 # self.nHeights = 0
441
447
442 self.nProfiles = None
448 self.nProfiles = None
443
449
444 self.heightList = None
450 self.heightList = None
445
451
446 self.channelList = None
452 self.channelList = None
447
453
448 # self.channelIndexList = None
454 # self.channelIndexList = None
449
455
450 self.pairsList = None
456 self.pairsList = None
451
457
452 self.flagNoData = True
458 self.flagNoData = True
453
459
454 self.flagTimeBlock = False
460 self.flagTimeBlock = False
455
461
456 self.utctime = None
462 self.utctime = None
457
463
458 self.nCohInt = None
464 self.nCohInt = None
459
465
460 self.nIncohInt = None
466 self.nIncohInt = None
461
467
462 self.blocksize = None
468 self.blocksize = None
463
469
464 self.nFFTPoints = None
470 self.nFFTPoints = None
465
471
466 self.wavelength = None
472 self.wavelength = None
467
473
468 self.flagDecodeData = False #asumo q la data no esta decodificada
474 self.flagDecodeData = False #asumo q la data no esta decodificada
469
475
470 self.flagDeflipData = False #asumo q la data no esta sin flip
476 self.flagDeflipData = False #asumo q la data no esta sin flip
471
477
472 self.flagShiftFFT = False
478 self.flagShiftFFT = False
473
479
474 self.ippFactor = 1
480 self.ippFactor = 1
475
481
476 #self.noise = None
482 #self.noise = None
477
483
478 self.beacon_heiIndexList = []
484 self.beacon_heiIndexList = []
479
485
480 self.noise_estimation = None
486 self.noise_estimation = None
481
487
482
488
483 def getNoisebyHildebrand(self):
489 def getNoisebyHildebrand(self):
484 """
490 """
485 Determino el nivel de ruido usando el metodo Hildebrand-Sekhon
491 Determino el nivel de ruido usando el metodo Hildebrand-Sekhon
486
492
487 Return:
493 Return:
488 noiselevel
494 noiselevel
489 """
495 """
490
496
491 noise = numpy.zeros(self.nChannels)
497 noise = numpy.zeros(self.nChannels)
492 for channel in range(self.nChannels):
498 for channel in range(self.nChannels):
493 daux = self.data_spc[channel,:,:]
499 daux = self.data_spc[channel,:,:]
494 noise[channel] = hildebrand_sekhon(daux, self.nIncohInt)
500 noise[channel] = hildebrand_sekhon(daux, self.nIncohInt)
495
501
496 return noise
502 return noise
497
503
498 def getNoise(self):
504 def getNoise(self):
499 if self.noise_estimation != None:
505 if self.noise_estimation != None:
500 return self.noise_estimation #this was estimated by getNoise Operation defined in jroproc_spectra.py
506 return self.noise_estimation #this was estimated by getNoise Operation defined in jroproc_spectra.py
501 else:
507 else:
502 noise = self.getNoisebyHildebrand()
508 noise = self.getNoisebyHildebrand()
503 return noise
509 return noise
504
510
505
511
506 def getFreqRange(self, extrapoints=0):
512 def getFreqRange(self, extrapoints=0):
507
513
508 deltafreq = self.getFmax() / (self.nFFTPoints*self.ippFactor)
514 deltafreq = self.getFmax() / (self.nFFTPoints*self.ippFactor)
509 freqrange = deltafreq*(numpy.arange(self.nFFTPoints+extrapoints)-self.nFFTPoints/2.) - deltafreq/2
515 freqrange = deltafreq*(numpy.arange(self.nFFTPoints+extrapoints)-self.nFFTPoints/2.) - deltafreq/2
510
516
511 return freqrange
517 return freqrange
512
518
513 def getVelRange(self, extrapoints=0):
519 def getVelRange(self, extrapoints=0):
514
520
515 deltav = self.getVmax() / (self.nFFTPoints*self.ippFactor)
521 deltav = self.getVmax() / (self.nFFTPoints*self.ippFactor)
516 velrange = deltav*(numpy.arange(self.nFFTPoints+extrapoints)-self.nFFTPoints/2.) - deltav/2
522 velrange = deltav*(numpy.arange(self.nFFTPoints+extrapoints)-self.nFFTPoints/2.) - deltav/2
517
523
518 return velrange
524 return velrange
519
525
520 def getNPairs(self):
526 def getNPairs(self):
521
527
522 return len(self.pairsList)
528 return len(self.pairsList)
523
529
524 def getPairsIndexList(self):
530 def getPairsIndexList(self):
525
531
526 return range(self.nPairs)
532 return range(self.nPairs)
527
533
528 def getNormFactor(self):
534 def getNormFactor(self):
529 pwcode = 1
535 pwcode = 1
530 if self.flagDecodeData:
536 if self.flagDecodeData:
531 pwcode = numpy.sum(self.code[0]**2)
537 pwcode = numpy.sum(self.code[0]**2)
532 #normFactor = min(self.nFFTPoints,self.nProfiles)*self.nIncohInt*self.nCohInt*pwcode*self.windowOfFilter
538 #normFactor = min(self.nFFTPoints,self.nProfiles)*self.nIncohInt*self.nCohInt*pwcode*self.windowOfFilter
533 normFactor = self.nProfiles*self.nIncohInt*self.nCohInt*pwcode*self.windowOfFilter
539 normFactor = self.nProfiles*self.nIncohInt*self.nCohInt*pwcode*self.windowOfFilter
534
540
535 return normFactor
541 return normFactor
536
542
537 def getFlagCspc(self):
543 def getFlagCspc(self):
538
544
539 if self.data_cspc == None:
545 if self.data_cspc == None:
540 return True
546 return True
541
547
542 return False
548 return False
543
549
544 def getFlagDc(self):
550 def getFlagDc(self):
545
551
546 if self.data_dc == None:
552 if self.data_dc == None:
547 return True
553 return True
548
554
549 return False
555 return False
550
556
551 def getTimeInterval(self):
557 def getTimeInterval(self):
552
558
553 timeInterval = self.ippSeconds * self.nCohInt * self.nIncohInt * self.nProfiles
559 timeInterval = self.ippSeconds * self.nCohInt * self.nIncohInt * self.nProfiles
554
560
555 return timeInterval
561 return timeInterval
556
562
557 nPairs = property(getNPairs, "I'm the 'nPairs' property.")
563 nPairs = property(getNPairs, "I'm the 'nPairs' property.")
558 pairsIndexList = property(getPairsIndexList, "I'm the 'pairsIndexList' property.")
564 pairsIndexList = property(getPairsIndexList, "I'm the 'pairsIndexList' property.")
559 normFactor = property(getNormFactor, "I'm the 'getNormFactor' property.")
565 normFactor = property(getNormFactor, "I'm the 'getNormFactor' property.")
560 flag_cspc = property(getFlagCspc)
566 flag_cspc = property(getFlagCspc)
561 flag_dc = property(getFlagDc)
567 flag_dc = property(getFlagDc)
562 noise = property(getNoise, "I'm the 'nHeights' property.")
568 noise = property(getNoise, "I'm the 'nHeights' property.")
563 timeInterval = property(getTimeInterval, "I'm the 'timeInterval' property")
569 timeInterval = property(getTimeInterval, "I'm the 'timeInterval' property")
564
570
565 class SpectraHeis(Spectra):
571 class SpectraHeis(Spectra):
566
572
567 data_spc = None
573 data_spc = None
568
574
569 data_cspc = None
575 data_cspc = None
570
576
571 data_dc = None
577 data_dc = None
572
578
573 nFFTPoints = None
579 nFFTPoints = None
574
580
575 # nPairs = None
581 # nPairs = None
576
582
577 pairsList = None
583 pairsList = None
578
584
579 nIncohInt = None
585 nIncohInt = None
580
586
581 def __init__(self):
587 def __init__(self):
582
588
583 self.radarControllerHeaderObj = RadarControllerHeader()
589 self.radarControllerHeaderObj = RadarControllerHeader()
584
590
585 self.systemHeaderObj = SystemHeader()
591 self.systemHeaderObj = SystemHeader()
586
592
587 self.type = "SpectraHeis"
593 self.type = "SpectraHeis"
588
594
589 # self.dtype = None
595 # self.dtype = None
590
596
591 # self.nChannels = 0
597 # self.nChannels = 0
592
598
593 # self.nHeights = 0
599 # self.nHeights = 0
594
600
595 self.nProfiles = None
601 self.nProfiles = None
596
602
597 self.heightList = None
603 self.heightList = None
598
604
599 self.channelList = None
605 self.channelList = None
600
606
601 # self.channelIndexList = None
607 # self.channelIndexList = None
602
608
603 self.flagNoData = True
609 self.flagNoData = True
604
610
605 self.flagTimeBlock = False
611 self.flagTimeBlock = False
606
612
607 # self.nPairs = 0
613 # self.nPairs = 0
608
614
609 self.utctime = None
615 self.utctime = None
610
616
611 self.blocksize = None
617 self.blocksize = None
612
618
619 self.profileIndex = 0
620
613 def getNormFactor(self):
621 def getNormFactor(self):
614 pwcode = 1
622 pwcode = 1
615 if self.flagDecodeData:
623 if self.flagDecodeData:
616 pwcode = numpy.sum(self.code[0]**2)
624 pwcode = numpy.sum(self.code[0]**2)
617
625
618 normFactor = self.nIncohInt*self.nCohInt*pwcode
626 normFactor = self.nIncohInt*self.nCohInt*pwcode
619
627
620 return normFactor
628 return normFactor
621
629
622 def getTimeInterval(self):
630 def getTimeInterval(self):
623
631
624 timeInterval = self.ippSeconds * self.nCohInt * self.nIncohInt
632 timeInterval = self.ippSeconds * self.nCohInt * self.nIncohInt
625
633
626 return timeInterval
634 return timeInterval
627
635
628 normFactor = property(getNormFactor, "I'm the 'getNormFactor' property.")
636 normFactor = property(getNormFactor, "I'm the 'getNormFactor' property.")
629 timeInterval = property(getTimeInterval, "I'm the 'timeInterval' property")
637 timeInterval = property(getTimeInterval, "I'm the 'timeInterval' property")
630
638
631 class Fits:
639 class Fits:
632
640
633 heightList = None
641 heightList = None
634
642
635 channelList = None
643 channelList = None
636
644
637 flagNoData = True
645 flagNoData = True
638
646
639 flagTimeBlock = False
647 flagTimeBlock = False
640
648
641 useLocalTime = False
649 useLocalTime = False
642
650
643 utctime = None
651 utctime = None
644
652
645 timeZone = None
653 timeZone = None
646
654
647 # ippSeconds = None
655 # ippSeconds = None
648
656
649 # timeInterval = None
657 # timeInterval = None
650
658
651 nCohInt = None
659 nCohInt = None
652
660
653 nIncohInt = None
661 nIncohInt = None
654
662
655 noise = None
663 noise = None
656
664
657 windowOfFilter = 1
665 windowOfFilter = 1
658
666
659 #Speed of ligth
667 #Speed of ligth
660 C = 3e8
668 C = 3e8
661
669
662 frequency = 49.92e6
670 frequency = 49.92e6
663
671
664 realtime = False
672 realtime = False
665
673
666
674
667 def __init__(self):
675 def __init__(self):
668
676
669 self.type = "Fits"
677 self.type = "Fits"
670
678
671 self.nProfiles = None
679 self.nProfiles = None
672
680
673 self.heightList = None
681 self.heightList = None
674
682
675 self.channelList = None
683 self.channelList = None
676
684
677 # self.channelIndexList = None
685 # self.channelIndexList = None
678
686
679 self.flagNoData = True
687 self.flagNoData = True
680
688
681 self.utctime = None
689 self.utctime = None
682
690
683 self.nCohInt = None
691 self.nCohInt = None
684
692
685 self.nIncohInt = None
693 self.nIncohInt = None
686
694
687 self.useLocalTime = True
695 self.useLocalTime = True
688
696
697 self.profileIndex = 0
698
689 # self.utctime = None
699 # self.utctime = None
690 # self.timeZone = None
700 # self.timeZone = None
691 # self.ltctime = None
701 # self.ltctime = None
692 # self.timeInterval = None
702 # self.timeInterval = None
693 # self.header = None
703 # self.header = None
694 # self.data_header = None
704 # self.data_header = None
695 # self.data = None
705 # self.data = None
696 # self.datatime = None
706 # self.datatime = None
697 # self.flagNoData = False
707 # self.flagNoData = False
698 # self.expName = ''
708 # self.expName = ''
699 # self.nChannels = None
709 # self.nChannels = None
700 # self.nSamples = None
710 # self.nSamples = None
701 # self.dataBlocksPerFile = None
711 # self.dataBlocksPerFile = None
702 # self.comments = ''
712 # self.comments = ''
703 #
713 #
704
714
705
715
706 def getltctime(self):
716 def getltctime(self):
707
717
708 if self.useLocalTime:
718 if self.useLocalTime:
709 return self.utctime - self.timeZone*60
719 return self.utctime - self.timeZone*60
710
720
711 return self.utctime
721 return self.utctime
712
722
713 def getDatatime(self):
723 def getDatatime(self):
714
724
715 datatime = datetime.datetime.utcfromtimestamp(self.ltctime)
725 datatime = datetime.datetime.utcfromtimestamp(self.ltctime)
716 return datatime
726 return datatime
717
727
718 def getTimeRange(self):
728 def getTimeRange(self):
719
729
720 datatime = []
730 datatime = []
721
731
722 datatime.append(self.ltctime)
732 datatime.append(self.ltctime)
723 datatime.append(self.ltctime + self.timeInterval)
733 datatime.append(self.ltctime + self.timeInterval)
724
734
725 datatime = numpy.array(datatime)
735 datatime = numpy.array(datatime)
726
736
727 return datatime
737 return datatime
728
738
729 def getHeiRange(self):
739 def getHeiRange(self):
730
740
731 heis = self.heightList
741 heis = self.heightList
732
742
733 return heis
743 return heis
734
744
735 def isEmpty(self):
745 def isEmpty(self):
736
746
737 return self.flagNoData
747 return self.flagNoData
738
748
739 def getNHeights(self):
749 def getNHeights(self):
740
750
741 return len(self.heightList)
751 return len(self.heightList)
742
752
743 def getNChannels(self):
753 def getNChannels(self):
744
754
745 return len(self.channelList)
755 return len(self.channelList)
746
756
747 def getChannelIndexList(self):
757 def getChannelIndexList(self):
748
758
749 return range(self.nChannels)
759 return range(self.nChannels)
750
760
751 def getNoise(self, type = 1):
761 def getNoise(self, type = 1):
752
762
753 self.noise = numpy.zeros(self.nChannels)
763 self.noise = numpy.zeros(self.nChannels)
754
764
755 if type == 1:
765 if type == 1:
756 noise = self.getNoisebyHildebrand()
766 noise = self.getNoisebyHildebrand()
757
767
758 if type == 2:
768 if type == 2:
759 noise = self.getNoisebySort()
769 noise = self.getNoisebySort()
760
770
761 if type == 3:
771 if type == 3:
762 noise = self.getNoisebyWindow()
772 noise = self.getNoisebyWindow()
763
773
764 return noise
774 return noise
765
775
766 def getTimeInterval(self):
776 def getTimeInterval(self):
767
777
768 raise ValueError, "This method is not implemented yet"
778 raise ValueError, "This method is not implemented yet"
769
779
770 datatime = property(getDatatime, "I'm the 'datatime' property")
780 datatime = property(getDatatime, "I'm the 'datatime' property")
771 nHeights = property(getNHeights, "I'm the 'nHeights' property.")
781 nHeights = property(getNHeights, "I'm the 'nHeights' property.")
772 nChannels = property(getNChannels, "I'm the 'nChannel' property.")
782 nChannels = property(getNChannels, "I'm the 'nChannel' property.")
773 channelIndexList = property(getChannelIndexList, "I'm the 'channelIndexList' property.")
783 channelIndexList = property(getChannelIndexList, "I'm the 'channelIndexList' property.")
774 noise = property(getNoise, "I'm the 'nHeights' property.")
784 noise = property(getNoise, "I'm the 'nHeights' property.")
775 datatime = property(getDatatime, "I'm the 'datatime' property")
785 datatime = property(getDatatime, "I'm the 'datatime' property")
776 ltctime = property(getltctime, "I'm the 'ltctime' property")
786 ltctime = property(getltctime, "I'm the 'ltctime' property")
777 timeInterval = property(getTimeInterval, "I'm the 'timeInterval' property")
787 timeInterval = property(getTimeInterval, "I'm the 'timeInterval' property")
778
788
779 class Correlation(JROData):
789 class Correlation(JROData):
780
790
781 noise = None
791 noise = None
782
792
783 SNR = None
793 SNR = None
784
794
785 pairsAutoCorr = None #Pairs of Autocorrelation
795 pairsAutoCorr = None #Pairs of Autocorrelation
786
796
787 #--------------------------------------------------
797 #--------------------------------------------------
788
798
789 data_corr = None
799 data_corr = None
790
800
791 data_volt = None
801 data_volt = None
792
802
793 lagT = None # each element value is a profileIndex
803 lagT = None # each element value is a profileIndex
794
804
795 lagR = None # each element value is in km
805 lagR = None # each element value is in km
796
806
797 pairsList = None
807 pairsList = None
798
808
799 calculateVelocity = None
809 calculateVelocity = None
800
810
801 nPoints = None
811 nPoints = None
802
812
803 nAvg = None
813 nAvg = None
804
814
805 bufferSize = None
815 bufferSize = None
806
816
807 def __init__(self):
817 def __init__(self):
808 '''
818 '''
809 Constructor
819 Constructor
810 '''
820 '''
811 self.radarControllerHeaderObj = RadarControllerHeader()
821 self.radarControllerHeaderObj = RadarControllerHeader()
812
822
813 self.systemHeaderObj = SystemHeader()
823 self.systemHeaderObj = SystemHeader()
814
824
815 self.type = "Correlation"
825 self.type = "Correlation"
816
826
817 self.data = None
827 self.data = None
818
828
819 self.dtype = None
829 self.dtype = None
820
830
821 self.nProfiles = None
831 self.nProfiles = None
822
832
823 self.heightList = None
833 self.heightList = None
824
834
825 self.channelList = None
835 self.channelList = None
826
836
827 self.flagNoData = True
837 self.flagNoData = True
828
838
829 self.flagTimeBlock = False
839 self.flagTimeBlock = False
830
840
831 self.utctime = None
841 self.utctime = None
832
842
833 self.timeZone = None
843 self.timeZone = None
834
844
835 self.dstFlag = None
845 self.dstFlag = None
836
846
837 self.errorCount = None
847 self.errorCount = None
838
848
839 self.blocksize = None
849 self.blocksize = None
840
850
841 self.flagDecodeData = False #asumo q la data no esta decodificada
851 self.flagDecodeData = False #asumo q la data no esta decodificada
842
852
843 self.flagDeflipData = False #asumo q la data no esta sin flip
853 self.flagDeflipData = False #asumo q la data no esta sin flip
844
854
845 self.pairsList = None
855 self.pairsList = None
846
856
847 self.nPoints = None
857 self.nPoints = None
848
858
849 def getLagTRange(self, extrapoints=0):
859 def getLagTRange(self, extrapoints=0):
850
860
851 lagTRange = self.lagT
861 lagTRange = self.lagT
852 diff = lagTRange[1] - lagTRange[0]
862 diff = lagTRange[1] - lagTRange[0]
853 extra = numpy.arange(1,extrapoints + 1)*diff + lagTRange[-1]
863 extra = numpy.arange(1,extrapoints + 1)*diff + lagTRange[-1]
854 lagTRange = numpy.hstack((lagTRange, extra))
864 lagTRange = numpy.hstack((lagTRange, extra))
855
865
856 return lagTRange
866 return lagTRange
857
867
858 def getLagRRange(self, extrapoints=0):
868 def getLagRRange(self, extrapoints=0):
859
869
860 return self.lagR
870 return self.lagR
861
871
862 def getPairsList(self):
872 def getPairsList(self):
863
873
864 return self.pairsList
874 return self.pairsList
865
875
866 def getCalculateVelocity(self):
876 def getCalculateVelocity(self):
867
877
868 return self.calculateVelocity
878 return self.calculateVelocity
869
879
870 def getNPoints(self):
880 def getNPoints(self):
871
881
872 return self.nPoints
882 return self.nPoints
873
883
874 def getNAvg(self):
884 def getNAvg(self):
875
885
876 return self.nAvg
886 return self.nAvg
877
887
878 def getBufferSize(self):
888 def getBufferSize(self):
879
889
880 return self.bufferSize
890 return self.bufferSize
881
891
882 def getPairsAutoCorr(self):
892 def getPairsAutoCorr(self):
883 pairsList = self.pairsList
893 pairsList = self.pairsList
884 pairsAutoCorr = numpy.zeros(self.nChannels, dtype = 'int')*numpy.nan
894 pairsAutoCorr = numpy.zeros(self.nChannels, dtype = 'int')*numpy.nan
885
895
886 for l in range(len(pairsList)):
896 for l in range(len(pairsList)):
887 firstChannel = pairsList[l][0]
897 firstChannel = pairsList[l][0]
888 secondChannel = pairsList[l][1]
898 secondChannel = pairsList[l][1]
889
899
890 #Obteniendo pares de Autocorrelacion
900 #Obteniendo pares de Autocorrelacion
891 if firstChannel == secondChannel:
901 if firstChannel == secondChannel:
892 pairsAutoCorr[firstChannel] = int(l)
902 pairsAutoCorr[firstChannel] = int(l)
893
903
894 pairsAutoCorr = pairsAutoCorr.astype(int)
904 pairsAutoCorr = pairsAutoCorr.astype(int)
895
905
896 return pairsAutoCorr
906 return pairsAutoCorr
897
907
898 def getNoise(self, mode = 2):
908 def getNoise(self, mode = 2):
899
909
900 indR = numpy.where(self.lagR == 0)[0][0]
910 indR = numpy.where(self.lagR == 0)[0][0]
901 indT = numpy.where(self.lagT == 0)[0][0]
911 indT = numpy.where(self.lagT == 0)[0][0]
902
912
903 jspectra0 = self.data_corr[:,:,indR,:]
913 jspectra0 = self.data_corr[:,:,indR,:]
904 jspectra = copy.copy(jspectra0)
914 jspectra = copy.copy(jspectra0)
905
915
906 num_chan = jspectra.shape[0]
916 num_chan = jspectra.shape[0]
907 num_hei = jspectra.shape[2]
917 num_hei = jspectra.shape[2]
908
918
909 freq_dc = jspectra.shape[1]/2
919 freq_dc = jspectra.shape[1]/2
910 ind_vel = numpy.array([-2,-1,1,2]) + freq_dc
920 ind_vel = numpy.array([-2,-1,1,2]) + freq_dc
911
921
912 if ind_vel[0]<0:
922 if ind_vel[0]<0:
913 ind_vel[range(0,1)] = ind_vel[range(0,1)] + self.num_prof
923 ind_vel[range(0,1)] = ind_vel[range(0,1)] + self.num_prof
914
924
915 if mode == 1:
925 if mode == 1:
916 jspectra[:,freq_dc,:] = (jspectra[:,ind_vel[1],:] + jspectra[:,ind_vel[2],:])/2 #CORRECCION
926 jspectra[:,freq_dc,:] = (jspectra[:,ind_vel[1],:] + jspectra[:,ind_vel[2],:])/2 #CORRECCION
917
927
918 if mode == 2:
928 if mode == 2:
919
929
920 vel = numpy.array([-2,-1,1,2])
930 vel = numpy.array([-2,-1,1,2])
921 xx = numpy.zeros([4,4])
931 xx = numpy.zeros([4,4])
922
932
923 for fil in range(4):
933 for fil in range(4):
924 xx[fil,:] = vel[fil]**numpy.asarray(range(4))
934 xx[fil,:] = vel[fil]**numpy.asarray(range(4))
925
935
926 xx_inv = numpy.linalg.inv(xx)
936 xx_inv = numpy.linalg.inv(xx)
927 xx_aux = xx_inv[0,:]
937 xx_aux = xx_inv[0,:]
928
938
929 for ich in range(num_chan):
939 for ich in range(num_chan):
930 yy = jspectra[ich,ind_vel,:]
940 yy = jspectra[ich,ind_vel,:]
931 jspectra[ich,freq_dc,:] = numpy.dot(xx_aux,yy)
941 jspectra[ich,freq_dc,:] = numpy.dot(xx_aux,yy)
932
942
933 junkid = jspectra[ich,freq_dc,:]<=0
943 junkid = jspectra[ich,freq_dc,:]<=0
934 cjunkid = sum(junkid)
944 cjunkid = sum(junkid)
935
945
936 if cjunkid.any():
946 if cjunkid.any():
937 jspectra[ich,freq_dc,junkid.nonzero()] = (jspectra[ich,ind_vel[1],junkid] + jspectra[ich,ind_vel[2],junkid])/2
947 jspectra[ich,freq_dc,junkid.nonzero()] = (jspectra[ich,ind_vel[1],junkid] + jspectra[ich,ind_vel[2],junkid])/2
938
948
939 noise = jspectra0[:,freq_dc,:] - jspectra[:,freq_dc,:]
949 noise = jspectra0[:,freq_dc,:] - jspectra[:,freq_dc,:]
940
950
941 return noise
951 return noise
942
952
943 # pairsList = property(getPairsList, "I'm the 'pairsList' property.")
953 # pairsList = property(getPairsList, "I'm the 'pairsList' property.")
944 # nPoints = property(getNPoints, "I'm the 'nPoints' property.")
954 # nPoints = property(getNPoints, "I'm the 'nPoints' property.")
945 calculateVelocity = property(getCalculateVelocity, "I'm the 'calculateVelocity' property.")
955 calculateVelocity = property(getCalculateVelocity, "I'm the 'calculateVelocity' property.")
946 nAvg = property(getNAvg, "I'm the 'nAvg' property.")
956 nAvg = property(getNAvg, "I'm the 'nAvg' property.")
947 bufferSize = property(getBufferSize, "I'm the 'bufferSize' property.")
957 bufferSize = property(getBufferSize, "I'm the 'bufferSize' property.")
948
958
949
959
950 class Parameters(JROData):
960 class Parameters(JROData):
951
961
952 #Information from previous data
962 #Information from previous data
953
963
954 inputUnit = None #Type of data to be processed
964 inputUnit = None #Type of data to be processed
955
965
956 operation = None #Type of operation to parametrize
966 operation = None #Type of operation to parametrize
957
967
958 normFactor = None #Normalization Factor
968 normFactor = None #Normalization Factor
959
969
960 groupList = None #List of Pairs, Groups, etc
970 groupList = None #List of Pairs, Groups, etc
961
971
962 #Parameters
972 #Parameters
963
973
964 data_param = None #Parameters obtained
974 data_param = None #Parameters obtained
965
975
966 data_pre = None #Data Pre Parametrization
976 data_pre = None #Data Pre Parametrization
967
977
968 data_SNR = None #Signal to Noise Ratio
978 data_SNR = None #Signal to Noise Ratio
969
979
970 heightRange = None #Heights
980 heightRange = None #Heights
971
981
972 abscissaRange = None #Abscissa, can be velocities, lags or time
982 abscissaRange = None #Abscissa, can be velocities, lags or time
973
983
974 noise = None #Noise Potency
984 noise = None #Noise Potency
975
985
976 initUtcTime = None #Initial UTC time
986 initUtcTime = None #Initial UTC time
977
987
978 paramInterval = None #Time interval to calculate Parameters in seconds
988 paramInterval = None #Time interval to calculate Parameters in seconds
979
989
980 #Fitting
990 #Fitting
981
991
982 data_error = None #Error of the estimation
992 data_error = None #Error of the estimation
983
993
984 constants = None
994 constants = None
985
995
986 library = None
996 library = None
987
997
988 #Output signal
998 #Output signal
989
999
990 outputInterval = None #Time interval to calculate output signal in seconds
1000 outputInterval = None #Time interval to calculate output signal in seconds
991
1001
992 data_output = None #Out signal
1002 data_output = None #Out signal
993
1003
994
1004
995
1005
996 def __init__(self):
1006 def __init__(self):
997 '''
1007 '''
998 Constructor
1008 Constructor
999 '''
1009 '''
1000 self.radarControllerHeaderObj = RadarControllerHeader()
1010 self.radarControllerHeaderObj = RadarControllerHeader()
1001
1011
1002 self.systemHeaderObj = SystemHeader()
1012 self.systemHeaderObj = SystemHeader()
1003
1013
1004 self.type = "Parameters"
1014 self.type = "Parameters"
1005
1015
1006 def getTimeRange1(self):
1016 def getTimeRange1(self):
1007
1017
1008 datatime = []
1018 datatime = []
1009
1019
1010 datatime.append(self.initUtcTime)
1020 datatime.append(self.initUtcTime)
1011 datatime.append(self.initUtcTime + self.outputInterval - 1)
1021 datatime.append(self.initUtcTime + self.outputInterval - 1)
1012
1022
1013 datatime = numpy.array(datatime)
1023 datatime = numpy.array(datatime)
1014
1024
1015 return datatime
1025 return datatime
@@ -1,1338 +1,1344
1 '''
1 '''
2
2
3 '''
3 '''
4 import os
4 import os
5 import sys
5 import sys
6 import glob
6 import glob
7 import time
7 import time
8 import numpy
8 import numpy
9 import fnmatch
9 import fnmatch
10 import time, datetime
10 import time, datetime
11 #import h5py
11 #import h5py
12 import traceback
12 import traceback
13
13
14 #try:
14 #try:
15 # import pyfits
15 # import pyfits
16 #except:
16 #except:
17 # print "pyfits module has not been imported, it should be installed to save files in fits format"
17 # print "pyfits module has not been imported, it should be installed to save files in fits format"
18
18
19 #from jrodata import *
19 #from jrodata import *
20 #from jroheaderIO import *
20 #from jroheaderIO import *
21 #from jroprocessing import *
21 #from jroprocessing import *
22
22
23 #import re
23 #import re
24 #from xml.etree.ElementTree import Element, SubElement, ElementTree
24 #from xml.etree.ElementTree import Element, SubElement, ElementTree
25
25
26
26
27 LOCALTIME = True #-18000
27 LOCALTIME = True #-18000
28
28
29 from model.data.jroheaderIO import PROCFLAG, BasicHeader, SystemHeader, RadarControllerHeader, ProcessingHeader
29 from model.data.jroheaderIO import PROCFLAG, BasicHeader, SystemHeader, RadarControllerHeader, ProcessingHeader
30
30
31 def isNumber(str):
31 def isNumber(str):
32 """
32 """
33 Chequea si el conjunto de caracteres que componen un string puede ser convertidos a un numero.
33 Chequea si el conjunto de caracteres que componen un string puede ser convertidos a un numero.
34
34
35 Excepciones:
35 Excepciones:
36 Si un determinado string no puede ser convertido a numero
36 Si un determinado string no puede ser convertido a numero
37 Input:
37 Input:
38 str, string al cual se le analiza para determinar si convertible a un numero o no
38 str, string al cual se le analiza para determinar si convertible a un numero o no
39
39
40 Return:
40 Return:
41 True : si el string es uno numerico
41 True : si el string es uno numerico
42 False : no es un string numerico
42 False : no es un string numerico
43 """
43 """
44 try:
44 try:
45 float( str )
45 float( str )
46 return True
46 return True
47 except:
47 except:
48 return False
48 return False
49
49
50 def isThisFileinRange(filename, startUTSeconds, endUTSeconds):
50 def isThisFileinRange(filename, startUTSeconds, endUTSeconds):
51 """
51 """
52 Esta funcion determina si un archivo de datos se encuentra o no dentro del rango de fecha especificado.
52 Esta funcion determina si un archivo de datos se encuentra o no dentro del rango de fecha especificado.
53
53
54 Inputs:
54 Inputs:
55 filename : nombre completo del archivo de datos en formato Jicamarca (.r)
55 filename : nombre completo del archivo de datos en formato Jicamarca (.r)
56
56
57 startUTSeconds : fecha inicial del rango seleccionado. La fecha esta dada en
57 startUTSeconds : fecha inicial del rango seleccionado. La fecha esta dada en
58 segundos contados desde 01/01/1970.
58 segundos contados desde 01/01/1970.
59 endUTSeconds : fecha final del rango seleccionado. La fecha esta dada en
59 endUTSeconds : fecha final del rango seleccionado. La fecha esta dada en
60 segundos contados desde 01/01/1970.
60 segundos contados desde 01/01/1970.
61
61
62 Return:
62 Return:
63 Boolean : Retorna True si el archivo de datos contiene datos en el rango de
63 Boolean : Retorna True si el archivo de datos contiene datos en el rango de
64 fecha especificado, de lo contrario retorna False.
64 fecha especificado, de lo contrario retorna False.
65
65
66 Excepciones:
66 Excepciones:
67 Si el archivo no existe o no puede ser abierto
67 Si el archivo no existe o no puede ser abierto
68 Si la cabecera no puede ser leida.
68 Si la cabecera no puede ser leida.
69
69
70 """
70 """
71 basicHeaderObj = BasicHeader(LOCALTIME)
71 basicHeaderObj = BasicHeader(LOCALTIME)
72
72
73 try:
73 try:
74 fp = open(filename,'rb')
74 fp = open(filename,'rb')
75 except IOError:
75 except IOError:
76 traceback.print_exc()
76 traceback.print_exc()
77 raise IOError, "The file %s can't be opened" %(filename)
77 raise IOError, "The file %s can't be opened" %(filename)
78
78
79 sts = basicHeaderObj.read(fp)
79 sts = basicHeaderObj.read(fp)
80 fp.close()
80 fp.close()
81
81
82 if not(sts):
82 if not(sts):
83 print "Skipping the file %s because it has not a valid header" %(filename)
83 print "Skipping the file %s because it has not a valid header" %(filename)
84 return 0
84 return 0
85
85
86 if not ((startUTSeconds <= basicHeaderObj.utc) and (endUTSeconds > basicHeaderObj.utc)):
86 if not ((startUTSeconds <= basicHeaderObj.utc) and (endUTSeconds > basicHeaderObj.utc)):
87 return 0
87 return 0
88
88
89 return 1
89 return 1
90
90
91 def isFileinThisTime(filename, startTime, endTime):
91 def isFileinThisTime(filename, startTime, endTime):
92 """
92 """
93 Retorna 1 si el archivo de datos se encuentra dentro del rango de horas especificado.
93 Retorna 1 si el archivo de datos se encuentra dentro del rango de horas especificado.
94
94
95 Inputs:
95 Inputs:
96 filename : nombre completo del archivo de datos en formato Jicamarca (.r)
96 filename : nombre completo del archivo de datos en formato Jicamarca (.r)
97
97
98 startTime : tiempo inicial del rango seleccionado en formato datetime.time
98 startTime : tiempo inicial del rango seleccionado en formato datetime.time
99
99
100 endTime : tiempo final del rango seleccionado en formato datetime.time
100 endTime : tiempo final del rango seleccionado en formato datetime.time
101
101
102 Return:
102 Return:
103 Boolean : Retorna True si el archivo de datos contiene datos en el rango de
103 Boolean : Retorna True si el archivo de datos contiene datos en el rango de
104 fecha especificado, de lo contrario retorna False.
104 fecha especificado, de lo contrario retorna False.
105
105
106 Excepciones:
106 Excepciones:
107 Si el archivo no existe o no puede ser abierto
107 Si el archivo no existe o no puede ser abierto
108 Si la cabecera no puede ser leida.
108 Si la cabecera no puede ser leida.
109
109
110 """
110 """
111
111
112
112
113 try:
113 try:
114 fp = open(filename,'rb')
114 fp = open(filename,'rb')
115 except IOError:
115 except IOError:
116 traceback.print_exc()
116 traceback.print_exc()
117 raise IOError, "The file %s can't be opened" %(filename)
117 raise IOError, "The file %s can't be opened" %(filename)
118
118
119 basicHeaderObj = BasicHeader(LOCALTIME)
119 basicHeaderObj = BasicHeader(LOCALTIME)
120 sts = basicHeaderObj.read(fp)
120 sts = basicHeaderObj.read(fp)
121 fp.close()
121 fp.close()
122
122
123 thisDatetime = basicHeaderObj.datatime
123 thisDatetime = basicHeaderObj.datatime
124 thisTime = thisDatetime.time()
124 thisTime = thisDatetime.time()
125
125
126 if not(sts):
126 if not(sts):
127 print "Skipping the file %s because it has not a valid header" %(filename)
127 print "Skipping the file %s because it has not a valid header" %(filename)
128 return None
128 return None
129
129
130 if not ((startTime <= thisTime) and (endTime > thisTime)):
130 if not ((startTime <= thisTime) and (endTime > thisTime)):
131 return None
131 return None
132
132
133 return thisDatetime
133 return thisDatetime
134
134
135 def getFileFromSet(path, ext, set):
135 def getFileFromSet(path, ext, set):
136 validFilelist = []
136 validFilelist = []
137 fileList = os.listdir(path)
137 fileList = os.listdir(path)
138
138
139 # 0 1234 567 89A BCDE
139 # 0 1234 567 89A BCDE
140 # H YYYY DDD SSS .ext
140 # H YYYY DDD SSS .ext
141
141
142 for thisFile in fileList:
142 for thisFile in fileList:
143 try:
143 try:
144 year = int(thisFile[1:5])
144 year = int(thisFile[1:5])
145 doy = int(thisFile[5:8])
145 doy = int(thisFile[5:8])
146 except:
146 except:
147 continue
147 continue
148
148
149 if (os.path.splitext(thisFile)[-1].lower() != ext.lower()):
149 if (os.path.splitext(thisFile)[-1].lower() != ext.lower()):
150 continue
150 continue
151
151
152 validFilelist.append(thisFile)
152 validFilelist.append(thisFile)
153
153
154 myfile = fnmatch.filter(validFilelist,'*%4.4d%3.3d%3.3d*'%(year,doy,set))
154 myfile = fnmatch.filter(validFilelist,'*%4.4d%3.3d%3.3d*'%(year,doy,set))
155
155
156 if len(myfile)!= 0:
156 if len(myfile)!= 0:
157 return myfile[0]
157 return myfile[0]
158 else:
158 else:
159 filename = '*%4.4d%3.3d%3.3d%s'%(year,doy,set,ext.lower())
159 filename = '*%4.4d%3.3d%3.3d%s'%(year,doy,set,ext.lower())
160 print 'the filename %s does not exist'%filename
160 print 'the filename %s does not exist'%filename
161 print '...going to the last file: '
161 print '...going to the last file: '
162
162
163 if validFilelist:
163 if validFilelist:
164 validFilelist = sorted( validFilelist, key=str.lower )
164 validFilelist = sorted( validFilelist, key=str.lower )
165 return validFilelist[-1]
165 return validFilelist[-1]
166
166
167 return None
167 return None
168
168
169 def getlastFileFromPath(path, ext):
169 def getlastFileFromPath(path, ext):
170 """
170 """
171 Depura el fileList dejando solo los que cumplan el formato de "PYYYYDDDSSS.ext"
171 Depura el fileList dejando solo los que cumplan el formato de "PYYYYDDDSSS.ext"
172 al final de la depuracion devuelve el ultimo file de la lista que quedo.
172 al final de la depuracion devuelve el ultimo file de la lista que quedo.
173
173
174 Input:
174 Input:
175 fileList : lista conteniendo todos los files (sin path) que componen una determinada carpeta
175 fileList : lista conteniendo todos los files (sin path) que componen una determinada carpeta
176 ext : extension de los files contenidos en una carpeta
176 ext : extension de los files contenidos en una carpeta
177
177
178 Return:
178 Return:
179 El ultimo file de una determinada carpeta, no se considera el path.
179 El ultimo file de una determinada carpeta, no se considera el path.
180 """
180 """
181 validFilelist = []
181 validFilelist = []
182 fileList = os.listdir(path)
182 fileList = os.listdir(path)
183
183
184 # 0 1234 567 89A BCDE
184 # 0 1234 567 89A BCDE
185 # H YYYY DDD SSS .ext
185 # H YYYY DDD SSS .ext
186
186
187 for thisFile in fileList:
187 for thisFile in fileList:
188
188
189 year = thisFile[1:5]
189 year = thisFile[1:5]
190 if not isNumber(year):
190 if not isNumber(year):
191 continue
191 continue
192
192
193 doy = thisFile[5:8]
193 doy = thisFile[5:8]
194 if not isNumber(doy):
194 if not isNumber(doy):
195 continue
195 continue
196
196
197 year = int(year)
197 year = int(year)
198 doy = int(doy)
198 doy = int(doy)
199
199
200 if (os.path.splitext(thisFile)[-1].lower() != ext.lower()):
200 if (os.path.splitext(thisFile)[-1].lower() != ext.lower()):
201 continue
201 continue
202
202
203 validFilelist.append(thisFile)
203 validFilelist.append(thisFile)
204
204
205 if validFilelist:
205 if validFilelist:
206 validFilelist = sorted( validFilelist, key=str.lower )
206 validFilelist = sorted( validFilelist, key=str.lower )
207 return validFilelist[-1]
207 return validFilelist[-1]
208
208
209 return None
209 return None
210
210
211 def checkForRealPath(path, foldercounter, year, doy, set, ext):
211 def checkForRealPath(path, foldercounter, year, doy, set, ext):
212 """
212 """
213 Por ser Linux Case Sensitive entonces checkForRealPath encuentra el nombre correcto de un path,
213 Por ser Linux Case Sensitive entonces checkForRealPath encuentra el nombre correcto de un path,
214 Prueba por varias combinaciones de nombres entre mayusculas y minusculas para determinar
214 Prueba por varias combinaciones de nombres entre mayusculas y minusculas para determinar
215 el path exacto de un determinado file.
215 el path exacto de un determinado file.
216
216
217 Example :
217 Example :
218 nombre correcto del file es .../.../D2009307/P2009307367.ext
218 nombre correcto del file es .../.../D2009307/P2009307367.ext
219
219
220 Entonces la funcion prueba con las siguientes combinaciones
220 Entonces la funcion prueba con las siguientes combinaciones
221 .../.../y2009307367.ext
221 .../.../y2009307367.ext
222 .../.../Y2009307367.ext
222 .../.../Y2009307367.ext
223 .../.../x2009307/y2009307367.ext
223 .../.../x2009307/y2009307367.ext
224 .../.../x2009307/Y2009307367.ext
224 .../.../x2009307/Y2009307367.ext
225 .../.../X2009307/y2009307367.ext
225 .../.../X2009307/y2009307367.ext
226 .../.../X2009307/Y2009307367.ext
226 .../.../X2009307/Y2009307367.ext
227 siendo para este caso, la ultima combinacion de letras, identica al file buscado
227 siendo para este caso, la ultima combinacion de letras, identica al file buscado
228
228
229 Return:
229 Return:
230 Si encuentra la cobinacion adecuada devuelve el path completo y el nombre del file
230 Si encuentra la cobinacion adecuada devuelve el path completo y el nombre del file
231 caso contrario devuelve None como path y el la ultima combinacion de nombre en mayusculas
231 caso contrario devuelve None como path y el la ultima combinacion de nombre en mayusculas
232 para el filename
232 para el filename
233 """
233 """
234 fullfilename = None
234 fullfilename = None
235 find_flag = False
235 find_flag = False
236 filename = None
236 filename = None
237
237
238 prefixDirList = [None,'d','D']
238 prefixDirList = [None,'d','D']
239 if ext.lower() == ".r": #voltage
239 if ext.lower() == ".r": #voltage
240 prefixFileList = ['d','D']
240 prefixFileList = ['d','D']
241 elif ext.lower() == ".pdata": #spectra
241 elif ext.lower() == ".pdata": #spectra
242 prefixFileList = ['p','P']
242 prefixFileList = ['p','P']
243 else:
243 else:
244 return None, filename
244 return None, filename
245
245
246 #barrido por las combinaciones posibles
246 #barrido por las combinaciones posibles
247 for prefixDir in prefixDirList:
247 for prefixDir in prefixDirList:
248 thispath = path
248 thispath = path
249 if prefixDir != None:
249 if prefixDir != None:
250 #formo el nombre del directorio xYYYYDDD (x=d o x=D)
250 #formo el nombre del directorio xYYYYDDD (x=d o x=D)
251 if foldercounter == 0:
251 if foldercounter == 0:
252 thispath = os.path.join(path, "%s%04d%03d" % ( prefixDir, year, doy ))
252 thispath = os.path.join(path, "%s%04d%03d" % ( prefixDir, year, doy ))
253 else:
253 else:
254 thispath = os.path.join(path, "%s%04d%03d_%02d" % ( prefixDir, year, doy , foldercounter))
254 thispath = os.path.join(path, "%s%04d%03d_%02d" % ( prefixDir, year, doy , foldercounter))
255 for prefixFile in prefixFileList: #barrido por las dos combinaciones posibles de "D"
255 for prefixFile in prefixFileList: #barrido por las dos combinaciones posibles de "D"
256 filename = "%s%04d%03d%03d%s" % ( prefixFile, year, doy, set, ext ) #formo el nombre del file xYYYYDDDSSS.ext
256 filename = "%s%04d%03d%03d%s" % ( prefixFile, year, doy, set, ext ) #formo el nombre del file xYYYYDDDSSS.ext
257 fullfilename = os.path.join( thispath, filename ) #formo el path completo
257 fullfilename = os.path.join( thispath, filename ) #formo el path completo
258
258
259 if os.path.exists( fullfilename ): #verifico que exista
259 if os.path.exists( fullfilename ): #verifico que exista
260 find_flag = True
260 find_flag = True
261 break
261 break
262 if find_flag:
262 if find_flag:
263 break
263 break
264
264
265 if not(find_flag):
265 if not(find_flag):
266 return None, filename
266 return None, filename
267
267
268 return fullfilename, filename
268 return fullfilename, filename
269
269
270 def isDoyFolder(folder):
270 def isDoyFolder(folder):
271 try:
271 try:
272 year = int(folder[1:5])
272 year = int(folder[1:5])
273 except:
273 except:
274 return 0
274 return 0
275
275
276 try:
276 try:
277 doy = int(folder[5:8])
277 doy = int(folder[5:8])
278 except:
278 except:
279 return 0
279 return 0
280
280
281 return 1
281 return 1
282
282
283 class JRODataIO:
283 class JRODataIO:
284
284
285 c = 3E8
285 c = 3E8
286
286
287 isConfig = False
287 isConfig = False
288
288
289 basicHeaderObj = None
289 basicHeaderObj = None
290
290
291 systemHeaderObj = None
291 systemHeaderObj = None
292
292
293 radarControllerHeaderObj = None
293 radarControllerHeaderObj = None
294
294
295 processingHeaderObj = None
295 processingHeaderObj = None
296
296
297 online = 0
297 online = 0
298
298
299 dtype = None
299 dtype = None
300
300
301 pathList = []
301 pathList = []
302
302
303 filenameList = []
303 filenameList = []
304
304
305 filename = None
305 filename = None
306
306
307 ext = None
307 ext = None
308
308
309 flagIsNewFile = 1
309 flagIsNewFile = 1
310
310
311 flagTimeBlock = 0
311 flagTimeBlock = 0
312
312
313 flagIsNewBlock = 0
313 flagIsNewBlock = 0
314
314
315 fp = None
315 fp = None
316
316
317 firstHeaderSize = 0
317 firstHeaderSize = 0
318
318
319 basicHeaderSize = 24
319 basicHeaderSize = 24
320
320
321 versionFile = 1103
321 versionFile = 1103
322
322
323 fileSize = None
323 fileSize = None
324
324
325 # ippSeconds = None
325 # ippSeconds = None
326
326
327 fileSizeByHeader = None
327 fileSizeByHeader = None
328
328
329 fileIndex = None
329 fileIndex = None
330
330
331 profileIndex = None
331 profileIndex = None
332
332
333 blockIndex = None
333 blockIndex = None
334
334
335 nTotalBlocks = None
335 nTotalBlocks = None
336
336
337 maxTimeStep = 30
337 maxTimeStep = 30
338
338
339 lastUTTime = None
339 lastUTTime = None
340
340
341 datablock = None
341 datablock = None
342
342
343 dataOut = None
343 dataOut = None
344
344
345 blocksize = None
345 blocksize = None
346
346
347 getByBlock = False
347 getByBlock = False
348
348
349 def __init__(self):
349 def __init__(self):
350
350
351 raise ValueError, "Not implemented"
351 raise ValueError, "Not implemented"
352
352
353 def run(self):
353 def run(self):
354
354
355 raise ValueError, "Not implemented"
355 raise ValueError, "Not implemented"
356
356
357 class JRODataReader(JRODataIO):
357 class JRODataReader(JRODataIO):
358
358
359 nReadBlocks = 0
359 nReadBlocks = 0
360
360
361 delay = 10 #number of seconds waiting a new file
361 delay = 10 #number of seconds waiting a new file
362
362
363 nTries = 3 #quantity tries
363 nTries = 3 #quantity tries
364
364
365 nFiles = 3 #number of files for searching
365 nFiles = 3 #number of files for searching
366
366
367 path = None
367 path = None
368
368
369 foldercounter = 0
369 foldercounter = 0
370
370
371 flagNoMoreFiles = 0
371 flagNoMoreFiles = 0
372
372
373 datetimeList = []
373 datetimeList = []
374
374
375 __isFirstTimeOnline = 1
375 __isFirstTimeOnline = 1
376
376
377 __printInfo = True
377 __printInfo = True
378
378
379 profileIndex = None
379 profileIndex = None
380
380
381 nTxs = 1
382
383 txIndex = None
384
381 def __init__(self):
385 def __init__(self):
382
386
383 """
387 """
384
388
385 """
389 """
386
390
387 raise ValueError, "This method has not been implemented"
391 raise ValueError, "This method has not been implemented"
388
392
389
393
390 def createObjByDefault(self):
394 def createObjByDefault(self):
391 """
395 """
392
396
393 """
397 """
394 raise ValueError, "This method has not been implemented"
398 raise ValueError, "This method has not been implemented"
395
399
396 def getBlockDimension(self):
400 def getBlockDimension(self):
397
401
398 raise ValueError, "No implemented"
402 raise ValueError, "No implemented"
399
403
400 def __searchFilesOffLine(self,
404 def __searchFilesOffLine(self,
401 path,
405 path,
402 startDate,
406 startDate,
403 endDate,
407 endDate,
404 startTime=datetime.time(0,0,0),
408 startTime=datetime.time(0,0,0),
405 endTime=datetime.time(23,59,59),
409 endTime=datetime.time(23,59,59),
406 set=None,
410 set=None,
407 expLabel='',
411 expLabel='',
408 ext='.r',
412 ext='.r',
409 walk=True):
413 walk=True):
410
414
411 pathList = []
415 pathList = []
412
416
413 if not walk:
417 if not walk:
414 #pathList.append(path)
418 #pathList.append(path)
415 multi_path = path.split(',')
419 multi_path = path.split(',')
416 for single_path in multi_path:
420 for single_path in multi_path:
417 pathList.append(single_path)
421 pathList.append(single_path)
418
422
419 else:
423 else:
420 #dirList = []
424 #dirList = []
421 multi_path = path.split(',')
425 multi_path = path.split(',')
422 for single_path in multi_path:
426 for single_path in multi_path:
423 dirList = []
427 dirList = []
424 for thisPath in os.listdir(single_path):
428 for thisPath in os.listdir(single_path):
425 if not os.path.isdir(os.path.join(single_path,thisPath)):
429 if not os.path.isdir(os.path.join(single_path,thisPath)):
426 continue
430 continue
427 if not isDoyFolder(thisPath):
431 if not isDoyFolder(thisPath):
428 continue
432 continue
429
433
430 dirList.append(thisPath)
434 dirList.append(thisPath)
431
435
432 if not(dirList):
436 if not(dirList):
433 return None, None
437 return None, None
434
438
435 thisDate = startDate
439 thisDate = startDate
436
440
437 while(thisDate <= endDate):
441 while(thisDate <= endDate):
438 year = thisDate.timetuple().tm_year
442 year = thisDate.timetuple().tm_year
439 doy = thisDate.timetuple().tm_yday
443 doy = thisDate.timetuple().tm_yday
440
444
441 matchlist = fnmatch.filter(dirList, '?' + '%4.4d%3.3d' % (year,doy) + '*')
445 matchlist = fnmatch.filter(dirList, '?' + '%4.4d%3.3d' % (year,doy) + '*')
442 if len(matchlist) == 0:
446 if len(matchlist) == 0:
443 thisDate += datetime.timedelta(1)
447 thisDate += datetime.timedelta(1)
444 continue
448 continue
445 for match in matchlist:
449 for match in matchlist:
446 pathList.append(os.path.join(single_path,match,expLabel))
450 pathList.append(os.path.join(single_path,match,expLabel))
447
451
448 thisDate += datetime.timedelta(1)
452 thisDate += datetime.timedelta(1)
449
453
450 if pathList == []:
454 if pathList == []:
451 print "Any folder was found for the date range: %s-%s" %(startDate, endDate)
455 print "Any folder was found for the date range: %s-%s" %(startDate, endDate)
452 return None, None
456 return None, None
453
457
454 print "%d folder(s) was(were) found for the date range: %s - %s" %(len(pathList), startDate, endDate)
458 print "%d folder(s) was(were) found for the date range: %s - %s" %(len(pathList), startDate, endDate)
455
459
456 filenameList = []
460 filenameList = []
457 datetimeList = []
461 datetimeList = []
458 pathDict = {}
462 pathDict = {}
459 filenameList_to_sort = []
463 filenameList_to_sort = []
460
464
461 for i in range(len(pathList)):
465 for i in range(len(pathList)):
462
466
463 thisPath = pathList[i]
467 thisPath = pathList[i]
464
468
465 fileList = glob.glob1(thisPath, "*%s" %ext)
469 fileList = glob.glob1(thisPath, "*%s" %ext)
466 fileList.sort()
470 fileList.sort()
467 pathDict.setdefault(fileList[0])
471 pathDict.setdefault(fileList[0])
468 pathDict[fileList[0]] = i
472 pathDict[fileList[0]] = i
469 filenameList_to_sort.append(fileList[0])
473 filenameList_to_sort.append(fileList[0])
470
474
471 filenameList_to_sort.sort()
475 filenameList_to_sort.sort()
472
476
473 for file in filenameList_to_sort:
477 for file in filenameList_to_sort:
474 thisPath = pathList[pathDict[file]]
478 thisPath = pathList[pathDict[file]]
475
479
476 fileList = glob.glob1(thisPath, "*%s" %ext)
480 fileList = glob.glob1(thisPath, "*%s" %ext)
477 fileList.sort()
481 fileList.sort()
478
482
479 for file in fileList:
483 for file in fileList:
480
484
481 filename = os.path.join(thisPath,file)
485 filename = os.path.join(thisPath,file)
482 thisDatetime = isFileinThisTime(filename, startTime, endTime)
486 thisDatetime = isFileinThisTime(filename, startTime, endTime)
483
487
484 if not(thisDatetime):
488 if not(thisDatetime):
485 continue
489 continue
486
490
487 filenameList.append(filename)
491 filenameList.append(filename)
488 datetimeList.append(thisDatetime)
492 datetimeList.append(thisDatetime)
489
493
490 if not(filenameList):
494 if not(filenameList):
491 print "Any file was found for the time range %s - %s" %(startTime, endTime)
495 print "Any file was found for the time range %s - %s" %(startTime, endTime)
492 return None, None
496 return None, None
493
497
494 print "%d file(s) was(were) found for the time range: %s - %s" %(len(filenameList), startTime, endTime)
498 print "%d file(s) was(were) found for the time range: %s - %s" %(len(filenameList), startTime, endTime)
495 print
499 print
496
500
497 for i in range(len(filenameList)):
501 for i in range(len(filenameList)):
498 print "%s -> [%s]" %(filenameList[i], datetimeList[i].ctime())
502 print "%s -> [%s]" %(filenameList[i], datetimeList[i].ctime())
499
503
500 self.filenameList = filenameList
504 self.filenameList = filenameList
501 self.datetimeList = datetimeList
505 self.datetimeList = datetimeList
502
506
503 return pathList, filenameList
507 return pathList, filenameList
504
508
505 def __searchFilesOnLine(self, path, expLabel = "", ext = None, walk=True, set=None):
509 def __searchFilesOnLine(self, path, expLabel = "", ext = None, walk=True, set=None):
506
510
507 """
511 """
508 Busca el ultimo archivo de la ultima carpeta (determinada o no por startDateTime) y
512 Busca el ultimo archivo de la ultima carpeta (determinada o no por startDateTime) y
509 devuelve el archivo encontrado ademas de otros datos.
513 devuelve el archivo encontrado ademas de otros datos.
510
514
511 Input:
515 Input:
512 path : carpeta donde estan contenidos los files que contiene data
516 path : carpeta donde estan contenidos los files que contiene data
513
517
514 expLabel : Nombre del subexperimento (subfolder)
518 expLabel : Nombre del subexperimento (subfolder)
515
519
516 ext : extension de los files
520 ext : extension de los files
517
521
518 walk : Si es habilitado no realiza busquedas dentro de los ubdirectorios (doypath)
522 walk : Si es habilitado no realiza busquedas dentro de los ubdirectorios (doypath)
519
523
520 Return:
524 Return:
521 directory : eL directorio donde esta el file encontrado
525 directory : eL directorio donde esta el file encontrado
522 filename : el ultimo file de una determinada carpeta
526 filename : el ultimo file de una determinada carpeta
523 year : el anho
527 year : el anho
524 doy : el numero de dia del anho
528 doy : el numero de dia del anho
525 set : el set del archivo
529 set : el set del archivo
526
530
527
531
528 """
532 """
529 dirList = []
533 dirList = []
530
534
531 if not walk:
535 if not walk:
532 fullpath = path
536 fullpath = path
533 foldercounter = 0
537 foldercounter = 0
534 else:
538 else:
535 #Filtra solo los directorios
539 #Filtra solo los directorios
536 for thisPath in os.listdir(path):
540 for thisPath in os.listdir(path):
537 if not os.path.isdir(os.path.join(path,thisPath)):
541 if not os.path.isdir(os.path.join(path,thisPath)):
538 continue
542 continue
539 if not isDoyFolder(thisPath):
543 if not isDoyFolder(thisPath):
540 continue
544 continue
541
545
542 dirList.append(thisPath)
546 dirList.append(thisPath)
543
547
544 if not(dirList):
548 if not(dirList):
545 return None, None, None, None, None, None
549 return None, None, None, None, None, None
546
550
547 dirList = sorted( dirList, key=str.lower )
551 dirList = sorted( dirList, key=str.lower )
548
552
549 doypath = dirList[-1]
553 doypath = dirList[-1]
550 foldercounter = int(doypath.split('_')[1]) if len(doypath.split('_'))>1 else 0
554 foldercounter = int(doypath.split('_')[1]) if len(doypath.split('_'))>1 else 0
551 fullpath = os.path.join(path, doypath, expLabel)
555 fullpath = os.path.join(path, doypath, expLabel)
552
556
553
557
554 print "%s folder was found: " %(fullpath )
558 print "%s folder was found: " %(fullpath )
555
559
556 if set == None:
560 if set == None:
557 filename = getlastFileFromPath(fullpath, ext)
561 filename = getlastFileFromPath(fullpath, ext)
558 else:
562 else:
559 filename = getFileFromSet(fullpath, ext, set)
563 filename = getFileFromSet(fullpath, ext, set)
560
564
561 if not(filename):
565 if not(filename):
562 return None, None, None, None, None, None
566 return None, None, None, None, None, None
563
567
564 print "%s file was found" %(filename)
568 print "%s file was found" %(filename)
565
569
566 if not(self.__verifyFile(os.path.join(fullpath, filename))):
570 if not(self.__verifyFile(os.path.join(fullpath, filename))):
567 return None, None, None, None, None, None
571 return None, None, None, None, None, None
568
572
569 year = int( filename[1:5] )
573 year = int( filename[1:5] )
570 doy = int( filename[5:8] )
574 doy = int( filename[5:8] )
571 set = int( filename[8:11] )
575 set = int( filename[8:11] )
572
576
573 return fullpath, foldercounter, filename, year, doy, set
577 return fullpath, foldercounter, filename, year, doy, set
574
578
575 def __setNextFileOffline(self):
579 def __setNextFileOffline(self):
576
580
577 idFile = self.fileIndex
581 idFile = self.fileIndex
578
582
579 while (True):
583 while (True):
580 idFile += 1
584 idFile += 1
581 if not(idFile < len(self.filenameList)):
585 if not(idFile < len(self.filenameList)):
582 self.flagNoMoreFiles = 1
586 self.flagNoMoreFiles = 1
583 print "No more Files"
587 print "No more Files"
584 return 0
588 return 0
585
589
586 filename = self.filenameList[idFile]
590 filename = self.filenameList[idFile]
587
591
588 if not(self.__verifyFile(filename)):
592 if not(self.__verifyFile(filename)):
589 continue
593 continue
590
594
591 fileSize = os.path.getsize(filename)
595 fileSize = os.path.getsize(filename)
592 fp = open(filename,'rb')
596 fp = open(filename,'rb')
593 break
597 break
594
598
595 self.flagIsNewFile = 1
599 self.flagIsNewFile = 1
596 self.fileIndex = idFile
600 self.fileIndex = idFile
597 self.filename = filename
601 self.filename = filename
598 self.fileSize = fileSize
602 self.fileSize = fileSize
599 self.fp = fp
603 self.fp = fp
600
604
601 print "Setting the file: %s"%self.filename
605 print "Setting the file: %s"%self.filename
602
606
603 return 1
607 return 1
604
608
605 def __setNextFileOnline(self):
609 def __setNextFileOnline(self):
606 """
610 """
607 Busca el siguiente file que tenga suficiente data para ser leida, dentro de un folder especifico, si
611 Busca el siguiente file que tenga suficiente data para ser leida, dentro de un folder especifico, si
608 no encuentra un file valido espera un tiempo determinado y luego busca en los posibles n files
612 no encuentra un file valido espera un tiempo determinado y luego busca en los posibles n files
609 siguientes.
613 siguientes.
610
614
611 Affected:
615 Affected:
612 self.flagIsNewFile
616 self.flagIsNewFile
613 self.filename
617 self.filename
614 self.fileSize
618 self.fileSize
615 self.fp
619 self.fp
616 self.set
620 self.set
617 self.flagNoMoreFiles
621 self.flagNoMoreFiles
618
622
619 Return:
623 Return:
620 0 : si luego de una busqueda del siguiente file valido este no pudo ser encontrado
624 0 : si luego de una busqueda del siguiente file valido este no pudo ser encontrado
621 1 : si el file fue abierto con exito y esta listo a ser leido
625 1 : si el file fue abierto con exito y esta listo a ser leido
622
626
623 Excepciones:
627 Excepciones:
624 Si un determinado file no puede ser abierto
628 Si un determinado file no puede ser abierto
625 """
629 """
626 nFiles = 0
630 nFiles = 0
627 fileOk_flag = False
631 fileOk_flag = False
628 firstTime_flag = True
632 firstTime_flag = True
629
633
630 self.set += 1
634 self.set += 1
631
635
632 if self.set > 999:
636 if self.set > 999:
633 self.set = 0
637 self.set = 0
634 self.foldercounter += 1
638 self.foldercounter += 1
635
639
636 #busca el 1er file disponible
640 #busca el 1er file disponible
637 fullfilename, filename = checkForRealPath( self.path, self.foldercounter, self.year, self.doy, self.set, self.ext )
641 fullfilename, filename = checkForRealPath( self.path, self.foldercounter, self.year, self.doy, self.set, self.ext )
638 if fullfilename:
642 if fullfilename:
639 if self.__verifyFile(fullfilename, False):
643 if self.__verifyFile(fullfilename, False):
640 fileOk_flag = True
644 fileOk_flag = True
641
645
642 #si no encuentra un file entonces espera y vuelve a buscar
646 #si no encuentra un file entonces espera y vuelve a buscar
643 if not(fileOk_flag):
647 if not(fileOk_flag):
644 for nFiles in range(self.nFiles+1): #busco en los siguientes self.nFiles+1 files posibles
648 for nFiles in range(self.nFiles+1): #busco en los siguientes self.nFiles+1 files posibles
645
649
646 if firstTime_flag: #si es la 1era vez entonces hace el for self.nTries veces
650 if firstTime_flag: #si es la 1era vez entonces hace el for self.nTries veces
647 tries = self.nTries
651 tries = self.nTries
648 else:
652 else:
649 tries = 1 #si no es la 1era vez entonces solo lo hace una vez
653 tries = 1 #si no es la 1era vez entonces solo lo hace una vez
650
654
651 for nTries in range( tries ):
655 for nTries in range( tries ):
652 if firstTime_flag:
656 if firstTime_flag:
653 print "\tWaiting %0.2f sec for the file \"%s\" , try %03d ..." % ( self.delay, filename, nTries+1 )
657 print "\tWaiting %0.2f sec for the file \"%s\" , try %03d ..." % ( self.delay, filename, nTries+1 )
654 time.sleep( self.delay )
658 time.sleep( self.delay )
655 else:
659 else:
656 print "\tSearching next \"%s%04d%03d%03d%s\" file ..." % (self.optchar, self.year, self.doy, self.set, self.ext)
660 print "\tSearching next \"%s%04d%03d%03d%s\" file ..." % (self.optchar, self.year, self.doy, self.set, self.ext)
657
661
658 fullfilename, filename = checkForRealPath( self.path, self.foldercounter, self.year, self.doy, self.set, self.ext )
662 fullfilename, filename = checkForRealPath( self.path, self.foldercounter, self.year, self.doy, self.set, self.ext )
659 if fullfilename:
663 if fullfilename:
660 if self.__verifyFile(fullfilename):
664 if self.__verifyFile(fullfilename):
661 fileOk_flag = True
665 fileOk_flag = True
662 break
666 break
663
667
664 if fileOk_flag:
668 if fileOk_flag:
665 break
669 break
666
670
667 firstTime_flag = False
671 firstTime_flag = False
668
672
669 print "\tSkipping the file \"%s\" due to this file doesn't exist" % filename
673 print "\tSkipping the file \"%s\" due to this file doesn't exist" % filename
670 self.set += 1
674 self.set += 1
671
675
672 if nFiles == (self.nFiles-1): #si no encuentro el file buscado cambio de carpeta y busco en la siguiente carpeta
676 if nFiles == (self.nFiles-1): #si no encuentro el file buscado cambio de carpeta y busco en la siguiente carpeta
673 self.set = 0
677 self.set = 0
674 self.doy += 1
678 self.doy += 1
675 self.foldercounter = 0
679 self.foldercounter = 0
676
680
677 if fileOk_flag:
681 if fileOk_flag:
678 self.fileSize = os.path.getsize( fullfilename )
682 self.fileSize = os.path.getsize( fullfilename )
679 self.filename = fullfilename
683 self.filename = fullfilename
680 self.flagIsNewFile = 1
684 self.flagIsNewFile = 1
681 if self.fp != None: self.fp.close()
685 if self.fp != None: self.fp.close()
682 self.fp = open(fullfilename, 'rb')
686 self.fp = open(fullfilename, 'rb')
683 self.flagNoMoreFiles = 0
687 self.flagNoMoreFiles = 0
684 print 'Setting the file: %s' % fullfilename
688 print 'Setting the file: %s' % fullfilename
685 else:
689 else:
686 self.fileSize = 0
690 self.fileSize = 0
687 self.filename = None
691 self.filename = None
688 self.flagIsNewFile = 0
692 self.flagIsNewFile = 0
689 self.fp = None
693 self.fp = None
690 self.flagNoMoreFiles = 1
694 self.flagNoMoreFiles = 1
691 print 'No more Files'
695 print 'No more Files'
692
696
693 return fileOk_flag
697 return fileOk_flag
694
698
695 def setNextFile(self):
699 def setNextFile(self):
696 if self.fp != None:
700 if self.fp != None:
697 self.fp.close()
701 self.fp.close()
698
702
699 if self.online:
703 if self.online:
700 newFile = self.__setNextFileOnline()
704 newFile = self.__setNextFileOnline()
701 else:
705 else:
702 newFile = self.__setNextFileOffline()
706 newFile = self.__setNextFileOffline()
703
707
704 if not(newFile):
708 if not(newFile):
705 return 0
709 return 0
706
710
707 self.__readFirstHeader()
711 self.__readFirstHeader()
708 self.nReadBlocks = 0
712 self.nReadBlocks = 0
709 return 1
713 return 1
710
714
711 def __waitNewBlock(self):
715 def __waitNewBlock(self):
712 """
716 """
713 Return 1 si se encontro un nuevo bloque de datos, 0 de otra forma.
717 Return 1 si se encontro un nuevo bloque de datos, 0 de otra forma.
714
718
715 Si el modo de lectura es OffLine siempre retorn 0
719 Si el modo de lectura es OffLine siempre retorn 0
716 """
720 """
717 if not self.online:
721 if not self.online:
718 return 0
722 return 0
719
723
720 if (self.nReadBlocks >= self.processingHeaderObj.dataBlocksPerFile):
724 if (self.nReadBlocks >= self.processingHeaderObj.dataBlocksPerFile):
721 return 0
725 return 0
722
726
723 currentPointer = self.fp.tell()
727 currentPointer = self.fp.tell()
724
728
725 neededSize = self.processingHeaderObj.blockSize + self.basicHeaderSize
729 neededSize = self.processingHeaderObj.blockSize + self.basicHeaderSize
726
730
727 for nTries in range( self.nTries ):
731 for nTries in range( self.nTries ):
728
732
729 self.fp.close()
733 self.fp.close()
730 self.fp = open( self.filename, 'rb' )
734 self.fp = open( self.filename, 'rb' )
731 self.fp.seek( currentPointer )
735 self.fp.seek( currentPointer )
732
736
733 self.fileSize = os.path.getsize( self.filename )
737 self.fileSize = os.path.getsize( self.filename )
734 currentSize = self.fileSize - currentPointer
738 currentSize = self.fileSize - currentPointer
735
739
736 if ( currentSize >= neededSize ):
740 if ( currentSize >= neededSize ):
737 self.basicHeaderObj.read(self.fp)
741 self.basicHeaderObj.read(self.fp)
738 return 1
742 return 1
739
743
740 if self.fileSize == self.fileSizeByHeader:
744 if self.fileSize == self.fileSizeByHeader:
741 # self.flagEoF = True
745 # self.flagEoF = True
742 return 0
746 return 0
743
747
744 print "\tWaiting %0.2f seconds for the next block, try %03d ..." % (self.delay, nTries+1)
748 print "\tWaiting %0.2f seconds for the next block, try %03d ..." % (self.delay, nTries+1)
745 time.sleep( self.delay )
749 time.sleep( self.delay )
746
750
747
751
748 return 0
752 return 0
749
753
750 def waitDataBlock(self,pointer_location):
754 def waitDataBlock(self,pointer_location):
751
755
752 currentPointer = pointer_location
756 currentPointer = pointer_location
753
757
754 neededSize = self.processingHeaderObj.blockSize #+ self.basicHeaderSize
758 neededSize = self.processingHeaderObj.blockSize #+ self.basicHeaderSize
755
759
756 for nTries in range( self.nTries ):
760 for nTries in range( self.nTries ):
757 self.fp.close()
761 self.fp.close()
758 self.fp = open( self.filename, 'rb' )
762 self.fp = open( self.filename, 'rb' )
759 self.fp.seek( currentPointer )
763 self.fp.seek( currentPointer )
760
764
761 self.fileSize = os.path.getsize( self.filename )
765 self.fileSize = os.path.getsize( self.filename )
762 currentSize = self.fileSize - currentPointer
766 currentSize = self.fileSize - currentPointer
763
767
764 if ( currentSize >= neededSize ):
768 if ( currentSize >= neededSize ):
765 return 1
769 return 1
766
770
767 print "\tWaiting %0.2f seconds for the next block, try %03d ..." % (self.delay, nTries+1)
771 print "\tWaiting %0.2f seconds for the next block, try %03d ..." % (self.delay, nTries+1)
768 time.sleep( self.delay )
772 time.sleep( self.delay )
769
773
770 return 0
774 return 0
771
775
772 def __jumpToLastBlock(self):
776 def __jumpToLastBlock(self):
773
777
774 if not(self.__isFirstTimeOnline):
778 if not(self.__isFirstTimeOnline):
775 return
779 return
776
780
777 csize = self.fileSize - self.fp.tell()
781 csize = self.fileSize - self.fp.tell()
778 blocksize = self.processingHeaderObj.blockSize
782 blocksize = self.processingHeaderObj.blockSize
779
783
780 #salta el primer bloque de datos
784 #salta el primer bloque de datos
781 if csize > self.processingHeaderObj.blockSize:
785 if csize > self.processingHeaderObj.blockSize:
782 self.fp.seek(self.fp.tell() + blocksize)
786 self.fp.seek(self.fp.tell() + blocksize)
783 else:
787 else:
784 return
788 return
785
789
786 csize = self.fileSize - self.fp.tell()
790 csize = self.fileSize - self.fp.tell()
787 neededsize = self.processingHeaderObj.blockSize + self.basicHeaderSize
791 neededsize = self.processingHeaderObj.blockSize + self.basicHeaderSize
788 while True:
792 while True:
789
793
790 if self.fp.tell()<self.fileSize:
794 if self.fp.tell()<self.fileSize:
791 self.fp.seek(self.fp.tell() + neededsize)
795 self.fp.seek(self.fp.tell() + neededsize)
792 else:
796 else:
793 self.fp.seek(self.fp.tell() - neededsize)
797 self.fp.seek(self.fp.tell() - neededsize)
794 break
798 break
795
799
796 # csize = self.fileSize - self.fp.tell()
800 # csize = self.fileSize - self.fp.tell()
797 # neededsize = self.processingHeaderObj.blockSize + self.basicHeaderSize
801 # neededsize = self.processingHeaderObj.blockSize + self.basicHeaderSize
798 # factor = int(csize/neededsize)
802 # factor = int(csize/neededsize)
799 # if factor > 0:
803 # if factor > 0:
800 # self.fp.seek(self.fp.tell() + factor*neededsize)
804 # self.fp.seek(self.fp.tell() + factor*neededsize)
801
805
802 self.flagIsNewFile = 0
806 self.flagIsNewFile = 0
803 self.__isFirstTimeOnline = 0
807 self.__isFirstTimeOnline = 0
804
808
805 def __setNewBlock(self):
809 def __setNewBlock(self):
806
810
807 if self.fp == None:
811 if self.fp == None:
808 return 0
812 return 0
809
813
810 if self.online:
814 if self.online:
811 self.__jumpToLastBlock()
815 self.__jumpToLastBlock()
812
816
813 if self.flagIsNewFile:
817 if self.flagIsNewFile:
814 return 1
818 return 1
815
819
816 self.lastUTTime = self.basicHeaderObj.utc
820 self.lastUTTime = self.basicHeaderObj.utc
817 currentSize = self.fileSize - self.fp.tell()
821 currentSize = self.fileSize - self.fp.tell()
818 neededSize = self.processingHeaderObj.blockSize + self.basicHeaderSize
822 neededSize = self.processingHeaderObj.blockSize + self.basicHeaderSize
819
823
820 if (currentSize >= neededSize):
824 if (currentSize >= neededSize):
821 self.basicHeaderObj.read(self.fp)
825 self.basicHeaderObj.read(self.fp)
822 return 1
826 return 1
823
827
824 if self.__waitNewBlock():
828 if self.__waitNewBlock():
825 return 1
829 return 1
826
830
827 if not(self.setNextFile()):
831 if not(self.setNextFile()):
828 return 0
832 return 0
829
833
830 deltaTime = self.basicHeaderObj.utc - self.lastUTTime #
834 deltaTime = self.basicHeaderObj.utc - self.lastUTTime #
831
835
832 self.flagTimeBlock = 0
836 self.flagTimeBlock = 0
833
837
834 if deltaTime > self.maxTimeStep:
838 if deltaTime > self.maxTimeStep:
835 self.flagTimeBlock = 1
839 self.flagTimeBlock = 1
836
840
837 return 1
841 return 1
838
842
839 def readNextBlock(self):
843 def readNextBlock(self):
840 if not(self.__setNewBlock()):
844 if not(self.__setNewBlock()):
841 return 0
845 return 0
842
846
843 if not(self.readBlock()):
847 if not(self.readBlock()):
844 return 0
848 return 0
845
849
846 return 1
850 return 1
847
851
848 def __readFirstHeader(self):
852 def __readFirstHeader(self):
849
853
850 self.basicHeaderObj.read(self.fp)
854 self.basicHeaderObj.read(self.fp)
851 self.systemHeaderObj.read(self.fp)
855 self.systemHeaderObj.read(self.fp)
852 self.radarControllerHeaderObj.read(self.fp)
856 self.radarControllerHeaderObj.read(self.fp)
853 self.processingHeaderObj.read(self.fp)
857 self.processingHeaderObj.read(self.fp)
854
858
855 self.firstHeaderSize = self.basicHeaderObj.size
859 self.firstHeaderSize = self.basicHeaderObj.size
856
860
857 datatype = int(numpy.log2((self.processingHeaderObj.processFlags & PROCFLAG.DATATYPE_MASK))-numpy.log2(PROCFLAG.DATATYPE_CHAR))
861 datatype = int(numpy.log2((self.processingHeaderObj.processFlags & PROCFLAG.DATATYPE_MASK))-numpy.log2(PROCFLAG.DATATYPE_CHAR))
858 if datatype == 0:
862 if datatype == 0:
859 datatype_str = numpy.dtype([('real','<i1'),('imag','<i1')])
863 datatype_str = numpy.dtype([('real','<i1'),('imag','<i1')])
860 elif datatype == 1:
864 elif datatype == 1:
861 datatype_str = numpy.dtype([('real','<i2'),('imag','<i2')])
865 datatype_str = numpy.dtype([('real','<i2'),('imag','<i2')])
862 elif datatype == 2:
866 elif datatype == 2:
863 datatype_str = numpy.dtype([('real','<i4'),('imag','<i4')])
867 datatype_str = numpy.dtype([('real','<i4'),('imag','<i4')])
864 elif datatype == 3:
868 elif datatype == 3:
865 datatype_str = numpy.dtype([('real','<i8'),('imag','<i8')])
869 datatype_str = numpy.dtype([('real','<i8'),('imag','<i8')])
866 elif datatype == 4:
870 elif datatype == 4:
867 datatype_str = numpy.dtype([('real','<f4'),('imag','<f4')])
871 datatype_str = numpy.dtype([('real','<f4'),('imag','<f4')])
868 elif datatype == 5:
872 elif datatype == 5:
869 datatype_str = numpy.dtype([('real','<f8'),('imag','<f8')])
873 datatype_str = numpy.dtype([('real','<f8'),('imag','<f8')])
870 else:
874 else:
871 raise ValueError, 'Data type was not defined'
875 raise ValueError, 'Data type was not defined'
872
876
873 self.dtype = datatype_str
877 self.dtype = datatype_str
874 #self.ippSeconds = 2 * 1000 * self.radarControllerHeaderObj.ipp / self.c
878 #self.ippSeconds = 2 * 1000 * self.radarControllerHeaderObj.ipp / self.c
875 self.fileSizeByHeader = self.processingHeaderObj.dataBlocksPerFile * self.processingHeaderObj.blockSize + self.firstHeaderSize + self.basicHeaderSize*(self.processingHeaderObj.dataBlocksPerFile - 1)
879 self.fileSizeByHeader = self.processingHeaderObj.dataBlocksPerFile * self.processingHeaderObj.blockSize + self.firstHeaderSize + self.basicHeaderSize*(self.processingHeaderObj.dataBlocksPerFile - 1)
876 # self.dataOut.channelList = numpy.arange(self.systemHeaderObj.numChannels)
880 # self.dataOut.channelList = numpy.arange(self.systemHeaderObj.numChannels)
877 # self.dataOut.channelIndexList = numpy.arange(self.systemHeaderObj.numChannels)
881 # self.dataOut.channelIndexList = numpy.arange(self.systemHeaderObj.numChannels)
878 self.getBlockDimension()
882 self.getBlockDimension()
879
883
880 def __verifyFile(self, filename, msgFlag=True):
884 def __verifyFile(self, filename, msgFlag=True):
881 msg = None
885 msg = None
882 try:
886 try:
883 fp = open(filename, 'rb')
887 fp = open(filename, 'rb')
884 currentPosition = fp.tell()
888 currentPosition = fp.tell()
885 except IOError:
889 except IOError:
886 traceback.print_exc()
890 traceback.print_exc()
887 if msgFlag:
891 if msgFlag:
888 print "The file %s can't be opened" % (filename)
892 print "The file %s can't be opened" % (filename)
889 return False
893 return False
890
894
891 neededSize = self.processingHeaderObj.blockSize + self.firstHeaderSize
895 neededSize = self.processingHeaderObj.blockSize + self.firstHeaderSize
892
896
893 if neededSize == 0:
897 if neededSize == 0:
894 basicHeaderObj = BasicHeader(LOCALTIME)
898 basicHeaderObj = BasicHeader(LOCALTIME)
895 systemHeaderObj = SystemHeader()
899 systemHeaderObj = SystemHeader()
896 radarControllerHeaderObj = RadarControllerHeader()
900 radarControllerHeaderObj = RadarControllerHeader()
897 processingHeaderObj = ProcessingHeader()
901 processingHeaderObj = ProcessingHeader()
898
902
899 try:
903 try:
900 if not( basicHeaderObj.read(fp) ): raise IOError
904 if not( basicHeaderObj.read(fp) ): raise IOError
901 if not( systemHeaderObj.read(fp) ): raise IOError
905 if not( systemHeaderObj.read(fp) ): raise IOError
902 if not( radarControllerHeaderObj.read(fp) ): raise IOError
906 if not( radarControllerHeaderObj.read(fp) ): raise IOError
903 if not( processingHeaderObj.read(fp) ): raise IOError
907 if not( processingHeaderObj.read(fp) ): raise IOError
904 # data_type = int(numpy.log2((processingHeaderObj.processFlags & PROCFLAG.DATATYPE_MASK))-numpy.log2(PROCFLAG.DATATYPE_CHAR))
908 # data_type = int(numpy.log2((processingHeaderObj.processFlags & PROCFLAG.DATATYPE_MASK))-numpy.log2(PROCFLAG.DATATYPE_CHAR))
905
909
906 neededSize = processingHeaderObj.blockSize + basicHeaderObj.size
910 neededSize = processingHeaderObj.blockSize + basicHeaderObj.size
907
911
908 except IOError:
912 except IOError:
909 traceback.print_exc()
913 traceback.print_exc()
910 if msgFlag:
914 if msgFlag:
911 print "\tThe file %s is empty or it hasn't enough data" % filename
915 print "\tThe file %s is empty or it hasn't enough data" % filename
912
916
913 fp.close()
917 fp.close()
914 return False
918 return False
915 else:
919 else:
916 msg = "\tSkipping the file %s due to it hasn't enough data" %filename
920 msg = "\tSkipping the file %s due to it hasn't enough data" %filename
917
921
918 fp.close()
922 fp.close()
919 fileSize = os.path.getsize(filename)
923 fileSize = os.path.getsize(filename)
920 currentSize = fileSize - currentPosition
924 currentSize = fileSize - currentPosition
921 if currentSize < neededSize:
925 if currentSize < neededSize:
922 if msgFlag and (msg != None):
926 if msgFlag and (msg != None):
923 print msg #print"\tSkipping the file %s due to it hasn't enough data" %filename
927 print msg #print"\tSkipping the file %s due to it hasn't enough data" %filename
924 return False
928 return False
925
929
926 return True
930 return True
927
931
928 def setup(self,
932 def setup(self,
929 path=None,
933 path=None,
930 startDate=None,
934 startDate=None,
931 endDate=None,
935 endDate=None,
932 startTime=datetime.time(0,0,0),
936 startTime=datetime.time(0,0,0),
933 endTime=datetime.time(23,59,59),
937 endTime=datetime.time(23,59,59),
934 set=None,
938 set=None,
935 expLabel = "",
939 expLabel = "",
936 ext = None,
940 ext = None,
937 online = False,
941 online = False,
938 delay = 60,
942 delay = 60,
939 walk = True,
943 walk = True,
940 getblock = False):
944 getblock = False,
945 nTxs = 1):
941
946
942 if path == None:
947 if path == None:
943 raise ValueError, "The path is not valid"
948 raise ValueError, "The path is not valid"
944
949
945 if ext == None:
950 if ext == None:
946 ext = self.ext
951 ext = self.ext
947
952
948 if online:
953 if online:
949 print "Searching files in online mode..."
954 print "Searching files in online mode..."
950
955
951 for nTries in range( self.nTries ):
956 for nTries in range( self.nTries ):
952 fullpath, foldercounter, file, year, doy, set = self.__searchFilesOnLine(path=path, expLabel=expLabel, ext=ext, walk=walk, set=set)
957 fullpath, foldercounter, file, year, doy, set = self.__searchFilesOnLine(path=path, expLabel=expLabel, ext=ext, walk=walk, set=set)
953
958
954 if fullpath:
959 if fullpath:
955 break
960 break
956
961
957 print '\tWaiting %0.2f sec for an valid file in %s: try %02d ...' % (self.delay, path, nTries+1)
962 print '\tWaiting %0.2f sec for an valid file in %s: try %02d ...' % (self.delay, path, nTries+1)
958 time.sleep( self.delay )
963 time.sleep( self.delay )
959
964
960 if not(fullpath):
965 if not(fullpath):
961 print "There 'isn't valied files in %s" % path
966 print "There 'isn't valied files in %s" % path
962 return None
967 return None
963
968
964 self.year = year
969 self.year = year
965 self.doy = doy
970 self.doy = doy
966 self.set = set - 1
971 self.set = set - 1
967 self.path = path
972 self.path = path
968 self.foldercounter = foldercounter
973 self.foldercounter = foldercounter
969 last_set = None
974 last_set = None
970
975
971 else:
976 else:
972 print "Searching files in offline mode ..."
977 print "Searching files in offline mode ..."
973 pathList, filenameList = self.__searchFilesOffLine(path, startDate=startDate, endDate=endDate,
978 pathList, filenameList = self.__searchFilesOffLine(path, startDate=startDate, endDate=endDate,
974 startTime=startTime, endTime=endTime,
979 startTime=startTime, endTime=endTime,
975 set=set, expLabel=expLabel, ext=ext,
980 set=set, expLabel=expLabel, ext=ext,
976 walk=walk)
981 walk=walk)
977
982
978 if not(pathList):
983 if not(pathList):
979 print "No *%s files into the folder %s \nfor the range: %s - %s"%(ext, path,
984 print "No *%s files into the folder %s \nfor the range: %s - %s"%(ext, path,
980 datetime.datetime.combine(startDate,startTime).ctime(),
985 datetime.datetime.combine(startDate,startTime).ctime(),
981 datetime.datetime.combine(endDate,endTime).ctime())
986 datetime.datetime.combine(endDate,endTime).ctime())
982
987
983 sys.exit(-1)
988 sys.exit(-1)
984
989
985
990
986 self.fileIndex = -1
991 self.fileIndex = -1
987 self.pathList = pathList
992 self.pathList = pathList
988 self.filenameList = filenameList
993 self.filenameList = filenameList
989 file_name = os.path.basename(filenameList[-1])
994 file_name = os.path.basename(filenameList[-1])
990 basename, ext = os.path.splitext(file_name)
995 basename, ext = os.path.splitext(file_name)
991 last_set = int(basename[-3:])
996 last_set = int(basename[-3:])
992
997
993 self.online = online
998 self.online = online
994 self.delay = delay
999 self.delay = delay
995 ext = ext.lower()
1000 ext = ext.lower()
996 self.ext = ext
1001 self.ext = ext
997 self.getByBlock = getblock
1002 self.getByBlock = getblock
1003 self.nTxs = int(nTxs)
998
1004
999 if not(self.setNextFile()):
1005 if not(self.setNextFile()):
1000 if (startDate!=None) and (endDate!=None):
1006 if (startDate!=None) and (endDate!=None):
1001 print "No files in range: %s - %s" %(datetime.datetime.combine(startDate,startTime).ctime(), datetime.datetime.combine(endDate,endTime).ctime())
1007 print "No files in range: %s - %s" %(datetime.datetime.combine(startDate,startTime).ctime(), datetime.datetime.combine(endDate,endTime).ctime())
1002 elif startDate != None:
1008 elif startDate != None:
1003 print "No files in range: %s" %(datetime.datetime.combine(startDate,startTime).ctime())
1009 print "No files in range: %s" %(datetime.datetime.combine(startDate,startTime).ctime())
1004 else:
1010 else:
1005 print "No files"
1011 print "No files"
1006
1012
1007 sys.exit(-1)
1013 sys.exit(-1)
1008
1014
1009 # self.updateDataHeader()
1015 # self.updateDataHeader()
1010 if last_set != None:
1016 if last_set != None:
1011 self.dataOut.last_block = last_set * self.processingHeaderObj.dataBlocksPerFile + self.basicHeaderObj.dataBlock
1017 self.dataOut.last_block = last_set * self.processingHeaderObj.dataBlocksPerFile + self.basicHeaderObj.dataBlock
1012 return
1018 return
1013
1019
1014 def getBasicHeader(self):
1020 def getBasicHeader(self):
1015
1021
1016 self.dataOut.utctime = self.basicHeaderObj.utc + self.basicHeaderObj.miliSecond/1000. + self.profileIndex * self.radarControllerHeaderObj.ippSeconds
1022 self.dataOut.utctime = self.basicHeaderObj.utc + self.basicHeaderObj.miliSecond/1000. + self.profileIndex * self.radarControllerHeaderObj.ippSeconds
1017
1023
1018 self.dataOut.flagTimeBlock = self.flagTimeBlock
1024 self.dataOut.flagTimeBlock = self.flagTimeBlock
1019
1025
1020 self.dataOut.timeZone = self.basicHeaderObj.timeZone
1026 self.dataOut.timeZone = self.basicHeaderObj.timeZone
1021
1027
1022 self.dataOut.dstFlag = self.basicHeaderObj.dstFlag
1028 self.dataOut.dstFlag = self.basicHeaderObj.dstFlag
1023
1029
1024 self.dataOut.errorCount = self.basicHeaderObj.errorCount
1030 self.dataOut.errorCount = self.basicHeaderObj.errorCount
1025
1031
1026 self.dataOut.useLocalTime = self.basicHeaderObj.useLocalTime
1032 self.dataOut.useLocalTime = self.basicHeaderObj.useLocalTime
1027
1033
1028 def getFirstHeader(self):
1034 def getFirstHeader(self):
1029
1035
1030 raise ValueError, "This method has not been implemented"
1036 raise ValueError, "This method has not been implemented"
1031
1037
1032 def getData(self):
1038 def getData(self):
1033
1039
1034 raise ValueError, "This method has not been implemented"
1040 raise ValueError, "This method has not been implemented"
1035
1041
1036 def hasNotDataInBuffer(self):
1042 def hasNotDataInBuffer(self):
1037
1043
1038 raise ValueError, "This method has not been implemented"
1044 raise ValueError, "This method has not been implemented"
1039
1045
1040 def readBlock(self):
1046 def readBlock(self):
1041
1047
1042 raise ValueError, "This method has not been implemented"
1048 raise ValueError, "This method has not been implemented"
1043
1049
1044 def isEndProcess(self):
1050 def isEndProcess(self):
1045
1051
1046 return self.flagNoMoreFiles
1052 return self.flagNoMoreFiles
1047
1053
1048 def printReadBlocks(self):
1054 def printReadBlocks(self):
1049
1055
1050 print "Number of read blocks per file %04d" %self.nReadBlocks
1056 print "Number of read blocks per file %04d" %self.nReadBlocks
1051
1057
1052 def printTotalBlocks(self):
1058 def printTotalBlocks(self):
1053
1059
1054 print "Number of read blocks %04d" %self.nTotalBlocks
1060 print "Number of read blocks %04d" %self.nTotalBlocks
1055
1061
1056 def printNumberOfBlock(self):
1062 def printNumberOfBlock(self):
1057
1063
1058 if self.flagIsNewBlock:
1064 if self.flagIsNewBlock:
1059 print "Block No. %04d, Total blocks %04d -> %s" %(self.basicHeaderObj.dataBlock, self.nTotalBlocks, self.dataOut.datatime.ctime())
1065 print "Block No. %04d, Total blocks %04d -> %s" %(self.basicHeaderObj.dataBlock, self.nTotalBlocks, self.dataOut.datatime.ctime())
1060 self.dataOut.blocknow = self.basicHeaderObj.dataBlock
1066 self.dataOut.blocknow = self.basicHeaderObj.dataBlock
1061
1067
1062 def printInfo(self):
1068 def printInfo(self):
1063
1069
1064 if self.__printInfo == False:
1070 if self.__printInfo == False:
1065 return
1071 return
1066
1072
1067 self.basicHeaderObj.printInfo()
1073 self.basicHeaderObj.printInfo()
1068 self.systemHeaderObj.printInfo()
1074 self.systemHeaderObj.printInfo()
1069 self.radarControllerHeaderObj.printInfo()
1075 self.radarControllerHeaderObj.printInfo()
1070 self.processingHeaderObj.printInfo()
1076 self.processingHeaderObj.printInfo()
1071
1077
1072 self.__printInfo = False
1078 self.__printInfo = False
1073
1079
1074
1080
1075 def run(self, **kwargs):
1081 def run(self, **kwargs):
1076
1082
1077 if not(self.isConfig):
1083 if not(self.isConfig):
1078
1084
1079 # self.dataOut = dataOut
1085 # self.dataOut = dataOut
1080 self.setup(**kwargs)
1086 self.setup(**kwargs)
1081 self.isConfig = True
1087 self.isConfig = True
1082
1088
1083 self.getData()
1089 self.getData()
1084
1090
1085 class JRODataWriter(JRODataIO):
1091 class JRODataWriter(JRODataIO):
1086
1092
1087 """
1093 """
1088 Esta clase permite escribir datos a archivos procesados (.r o ,pdata). La escritura
1094 Esta clase permite escribir datos a archivos procesados (.r o ,pdata). La escritura
1089 de los datos siempre se realiza por bloques.
1095 de los datos siempre se realiza por bloques.
1090 """
1096 """
1091
1097
1092 blockIndex = 0
1098 blockIndex = 0
1093
1099
1094 path = None
1100 path = None
1095
1101
1096 setFile = None
1102 setFile = None
1097
1103
1098 profilesPerBlock = None
1104 profilesPerBlock = None
1099
1105
1100 blocksPerFile = None
1106 blocksPerFile = None
1101
1107
1102 nWriteBlocks = 0
1108 nWriteBlocks = 0
1103
1109
1104 def __init__(self, dataOut=None):
1110 def __init__(self, dataOut=None):
1105 raise ValueError, "Not implemented"
1111 raise ValueError, "Not implemented"
1106
1112
1107
1113
1108 def hasAllDataInBuffer(self):
1114 def hasAllDataInBuffer(self):
1109 raise ValueError, "Not implemented"
1115 raise ValueError, "Not implemented"
1110
1116
1111
1117
1112 def setBlockDimension(self):
1118 def setBlockDimension(self):
1113 raise ValueError, "Not implemented"
1119 raise ValueError, "Not implemented"
1114
1120
1115
1121
1116 def writeBlock(self):
1122 def writeBlock(self):
1117 raise ValueError, "No implemented"
1123 raise ValueError, "No implemented"
1118
1124
1119
1125
1120 def putData(self):
1126 def putData(self):
1121 raise ValueError, "No implemented"
1127 raise ValueError, "No implemented"
1122
1128
1123
1129
1124 def setBasicHeader(self):
1130 def setBasicHeader(self):
1125
1131
1126 self.basicHeaderObj.size = self.basicHeaderSize #bytes
1132 self.basicHeaderObj.size = self.basicHeaderSize #bytes
1127 self.basicHeaderObj.version = self.versionFile
1133 self.basicHeaderObj.version = self.versionFile
1128 self.basicHeaderObj.dataBlock = self.nTotalBlocks
1134 self.basicHeaderObj.dataBlock = self.nTotalBlocks
1129
1135
1130 utc = numpy.floor(self.dataOut.utctime)
1136 utc = numpy.floor(self.dataOut.utctime)
1131 milisecond = (self.dataOut.utctime - utc)* 1000.0
1137 milisecond = (self.dataOut.utctime - utc)* 1000.0
1132
1138
1133 self.basicHeaderObj.utc = utc
1139 self.basicHeaderObj.utc = utc
1134 self.basicHeaderObj.miliSecond = milisecond
1140 self.basicHeaderObj.miliSecond = milisecond
1135 self.basicHeaderObj.timeZone = self.dataOut.timeZone
1141 self.basicHeaderObj.timeZone = self.dataOut.timeZone
1136 self.basicHeaderObj.dstFlag = self.dataOut.dstFlag
1142 self.basicHeaderObj.dstFlag = self.dataOut.dstFlag
1137 self.basicHeaderObj.errorCount = self.dataOut.errorCount
1143 self.basicHeaderObj.errorCount = self.dataOut.errorCount
1138
1144
1139 def setFirstHeader(self):
1145 def setFirstHeader(self):
1140 """
1146 """
1141 Obtiene una copia del First Header
1147 Obtiene una copia del First Header
1142
1148
1143 Affected:
1149 Affected:
1144
1150
1145 self.basicHeaderObj
1151 self.basicHeaderObj
1146 self.systemHeaderObj
1152 self.systemHeaderObj
1147 self.radarControllerHeaderObj
1153 self.radarControllerHeaderObj
1148 self.processingHeaderObj self.
1154 self.processingHeaderObj self.
1149
1155
1150 Return:
1156 Return:
1151 None
1157 None
1152 """
1158 """
1153
1159
1154 raise ValueError, "No implemented"
1160 raise ValueError, "No implemented"
1155
1161
1156 def __writeFirstHeader(self):
1162 def __writeFirstHeader(self):
1157 """
1163 """
1158 Escribe el primer header del file es decir el Basic header y el Long header (SystemHeader, RadarControllerHeader, ProcessingHeader)
1164 Escribe el primer header del file es decir el Basic header y el Long header (SystemHeader, RadarControllerHeader, ProcessingHeader)
1159
1165
1160 Affected:
1166 Affected:
1161 __dataType
1167 __dataType
1162
1168
1163 Return:
1169 Return:
1164 None
1170 None
1165 """
1171 """
1166
1172
1167 # CALCULAR PARAMETROS
1173 # CALCULAR PARAMETROS
1168
1174
1169 sizeLongHeader = self.systemHeaderObj.size + self.radarControllerHeaderObj.size + self.processingHeaderObj.size
1175 sizeLongHeader = self.systemHeaderObj.size + self.radarControllerHeaderObj.size + self.processingHeaderObj.size
1170 self.basicHeaderObj.size = self.basicHeaderSize + sizeLongHeader
1176 self.basicHeaderObj.size = self.basicHeaderSize + sizeLongHeader
1171
1177
1172 self.basicHeaderObj.write(self.fp)
1178 self.basicHeaderObj.write(self.fp)
1173 self.systemHeaderObj.write(self.fp)
1179 self.systemHeaderObj.write(self.fp)
1174 self.radarControllerHeaderObj.write(self.fp)
1180 self.radarControllerHeaderObj.write(self.fp)
1175 self.processingHeaderObj.write(self.fp)
1181 self.processingHeaderObj.write(self.fp)
1176
1182
1177 self.dtype = self.dataOut.dtype
1183 self.dtype = self.dataOut.dtype
1178
1184
1179 def __setNewBlock(self):
1185 def __setNewBlock(self):
1180 """
1186 """
1181 Si es un nuevo file escribe el First Header caso contrario escribe solo el Basic Header
1187 Si es un nuevo file escribe el First Header caso contrario escribe solo el Basic Header
1182
1188
1183 Return:
1189 Return:
1184 0 : si no pudo escribir nada
1190 0 : si no pudo escribir nada
1185 1 : Si escribio el Basic el First Header
1191 1 : Si escribio el Basic el First Header
1186 """
1192 """
1187 if self.fp == None:
1193 if self.fp == None:
1188 self.setNextFile()
1194 self.setNextFile()
1189
1195
1190 if self.flagIsNewFile:
1196 if self.flagIsNewFile:
1191 return 1
1197 return 1
1192
1198
1193 if self.blockIndex < self.processingHeaderObj.dataBlocksPerFile:
1199 if self.blockIndex < self.processingHeaderObj.dataBlocksPerFile:
1194 self.basicHeaderObj.write(self.fp)
1200 self.basicHeaderObj.write(self.fp)
1195 return 1
1201 return 1
1196
1202
1197 if not( self.setNextFile() ):
1203 if not( self.setNextFile() ):
1198 return 0
1204 return 0
1199
1205
1200 return 1
1206 return 1
1201
1207
1202
1208
1203 def writeNextBlock(self):
1209 def writeNextBlock(self):
1204 """
1210 """
1205 Selecciona el bloque siguiente de datos y los escribe en un file
1211 Selecciona el bloque siguiente de datos y los escribe en un file
1206
1212
1207 Return:
1213 Return:
1208 0 : Si no hizo pudo escribir el bloque de datos
1214 0 : Si no hizo pudo escribir el bloque de datos
1209 1 : Si no pudo escribir el bloque de datos
1215 1 : Si no pudo escribir el bloque de datos
1210 """
1216 """
1211 if not( self.__setNewBlock() ):
1217 if not( self.__setNewBlock() ):
1212 return 0
1218 return 0
1213
1219
1214 self.writeBlock()
1220 self.writeBlock()
1215
1221
1216 return 1
1222 return 1
1217
1223
1218 def setNextFile(self):
1224 def setNextFile(self):
1219 """
1225 """
1220 Determina el siguiente file que sera escrito
1226 Determina el siguiente file que sera escrito
1221
1227
1222 Affected:
1228 Affected:
1223 self.filename
1229 self.filename
1224 self.subfolder
1230 self.subfolder
1225 self.fp
1231 self.fp
1226 self.setFile
1232 self.setFile
1227 self.flagIsNewFile
1233 self.flagIsNewFile
1228
1234
1229 Return:
1235 Return:
1230 0 : Si el archivo no puede ser escrito
1236 0 : Si el archivo no puede ser escrito
1231 1 : Si el archivo esta listo para ser escrito
1237 1 : Si el archivo esta listo para ser escrito
1232 """
1238 """
1233 ext = self.ext
1239 ext = self.ext
1234 path = self.path
1240 path = self.path
1235
1241
1236 if self.fp != None:
1242 if self.fp != None:
1237 self.fp.close()
1243 self.fp.close()
1238
1244
1239 timeTuple = time.localtime( self.dataOut.utctime)
1245 timeTuple = time.localtime( self.dataOut.utctime)
1240 subfolder = 'd%4.4d%3.3d' % (timeTuple.tm_year,timeTuple.tm_yday)
1246 subfolder = 'd%4.4d%3.3d' % (timeTuple.tm_year,timeTuple.tm_yday)
1241
1247
1242 fullpath = os.path.join( path, subfolder )
1248 fullpath = os.path.join( path, subfolder )
1243 if not( os.path.exists(fullpath) ):
1249 if not( os.path.exists(fullpath) ):
1244 os.mkdir(fullpath)
1250 os.mkdir(fullpath)
1245 self.setFile = -1 #inicializo mi contador de seteo
1251 self.setFile = -1 #inicializo mi contador de seteo
1246 else:
1252 else:
1247 filesList = os.listdir( fullpath )
1253 filesList = os.listdir( fullpath )
1248 if len( filesList ) > 0:
1254 if len( filesList ) > 0:
1249 filesList = sorted( filesList, key=str.lower )
1255 filesList = sorted( filesList, key=str.lower )
1250 filen = filesList[-1]
1256 filen = filesList[-1]
1251 # el filename debera tener el siguiente formato
1257 # el filename debera tener el siguiente formato
1252 # 0 1234 567 89A BCDE (hex)
1258 # 0 1234 567 89A BCDE (hex)
1253 # x YYYY DDD SSS .ext
1259 # x YYYY DDD SSS .ext
1254 if isNumber( filen[8:11] ):
1260 if isNumber( filen[8:11] ):
1255 self.setFile = int( filen[8:11] ) #inicializo mi contador de seteo al seteo del ultimo file
1261 self.setFile = int( filen[8:11] ) #inicializo mi contador de seteo al seteo del ultimo file
1256 else:
1262 else:
1257 self.setFile = -1
1263 self.setFile = -1
1258 else:
1264 else:
1259 self.setFile = -1 #inicializo mi contador de seteo
1265 self.setFile = -1 #inicializo mi contador de seteo
1260
1266
1261 setFile = self.setFile
1267 setFile = self.setFile
1262 setFile += 1
1268 setFile += 1
1263
1269
1264 file = '%s%4.4d%3.3d%3.3d%s' % (self.optchar,
1270 file = '%s%4.4d%3.3d%3.3d%s' % (self.optchar,
1265 timeTuple.tm_year,
1271 timeTuple.tm_year,
1266 timeTuple.tm_yday,
1272 timeTuple.tm_yday,
1267 setFile,
1273 setFile,
1268 ext )
1274 ext )
1269
1275
1270 filename = os.path.join( path, subfolder, file )
1276 filename = os.path.join( path, subfolder, file )
1271
1277
1272 fp = open( filename,'wb' )
1278 fp = open( filename,'wb' )
1273
1279
1274 self.blockIndex = 0
1280 self.blockIndex = 0
1275
1281
1276 #guardando atributos
1282 #guardando atributos
1277 self.filename = filename
1283 self.filename = filename
1278 self.subfolder = subfolder
1284 self.subfolder = subfolder
1279 self.fp = fp
1285 self.fp = fp
1280 self.setFile = setFile
1286 self.setFile = setFile
1281 self.flagIsNewFile = 1
1287 self.flagIsNewFile = 1
1282
1288
1283 self.setFirstHeader()
1289 self.setFirstHeader()
1284
1290
1285 print 'Writing the file: %s'%self.filename
1291 print 'Writing the file: %s'%self.filename
1286
1292
1287 self.__writeFirstHeader()
1293 self.__writeFirstHeader()
1288
1294
1289 return 1
1295 return 1
1290
1296
1291 def setup(self, dataOut, path, blocksPerFile, profilesPerBlock=64, set=0, ext=None):
1297 def setup(self, dataOut, path, blocksPerFile, profilesPerBlock=64, set=0, ext=None):
1292 """
1298 """
1293 Setea el tipo de formato en la cual sera guardada la data y escribe el First Header
1299 Setea el tipo de formato en la cual sera guardada la data y escribe el First Header
1294
1300
1295 Inputs:
1301 Inputs:
1296 path : el path destino en el cual se escribiran los files a crear
1302 path : el path destino en el cual se escribiran los files a crear
1297 format : formato en el cual sera salvado un file
1303 format : formato en el cual sera salvado un file
1298 set : el setebo del file
1304 set : el setebo del file
1299
1305
1300 Return:
1306 Return:
1301 0 : Si no realizo un buen seteo
1307 0 : Si no realizo un buen seteo
1302 1 : Si realizo un buen seteo
1308 1 : Si realizo un buen seteo
1303 """
1309 """
1304
1310
1305 if ext == None:
1311 if ext == None:
1306 ext = self.ext
1312 ext = self.ext
1307
1313
1308 ext = ext.lower()
1314 ext = ext.lower()
1309
1315
1310 self.ext = ext
1316 self.ext = ext
1311
1317
1312 self.path = path
1318 self.path = path
1313
1319
1314 self.setFile = set - 1
1320 self.setFile = set - 1
1315
1321
1316 self.blocksPerFile = blocksPerFile
1322 self.blocksPerFile = blocksPerFile
1317
1323
1318 self.profilesPerBlock = profilesPerBlock
1324 self.profilesPerBlock = profilesPerBlock
1319
1325
1320 self.dataOut = dataOut
1326 self.dataOut = dataOut
1321
1327
1322 if not(self.setNextFile()):
1328 if not(self.setNextFile()):
1323 print "There isn't a next file"
1329 print "There isn't a next file"
1324 return 0
1330 return 0
1325
1331
1326 self.setBlockDimension()
1332 self.setBlockDimension()
1327
1333
1328 return 1
1334 return 1
1329
1335
1330 def run(self, dataOut, **kwargs):
1336 def run(self, dataOut, **kwargs):
1331
1337
1332 if not(self.isConfig):
1338 if not(self.isConfig):
1333
1339
1334 self.setup(dataOut, **kwargs)
1340 self.setup(dataOut, **kwargs)
1335 self.isConfig = True
1341 self.isConfig = True
1336
1342
1337 self.putData()
1343 self.putData()
1338
1344
@@ -1,609 +1,650
1 '''
1 '''
2
2
3 '''
3 '''
4 import numpy
4 import numpy
5
5
6 from jroIO_base import LOCALTIME, JRODataReader, JRODataWriter
6 from jroIO_base import LOCALTIME, JRODataReader, JRODataWriter
7 from model.proc.jroproc_base import ProcessingUnit, Operation
7 from model.proc.jroproc_base import ProcessingUnit, Operation
8 from model.data.jroheaderIO import PROCFLAG, BasicHeader, SystemHeader, RadarControllerHeader, ProcessingHeader
8 from model.data.jroheaderIO import PROCFLAG, BasicHeader, SystemHeader, RadarControllerHeader, ProcessingHeader
9 from model.data.jrodata import Voltage
9 from model.data.jrodata import Voltage
10
10
11 class VoltageReader(JRODataReader, ProcessingUnit):
11 class VoltageReader(JRODataReader, ProcessingUnit):
12 """
12 """
13 Esta clase permite leer datos de voltage desde archivos en formato rawdata (.r). La lectura
13 Esta clase permite leer datos de voltage desde archivos en formato rawdata (.r). La lectura
14 de los datos siempre se realiza por bloques. Los datos leidos (array de 3 dimensiones:
14 de los datos siempre se realiza por bloques. Los datos leidos (array de 3 dimensiones:
15 perfiles*alturas*canales) son almacenados en la variable "buffer".
15 perfiles*alturas*canales) son almacenados en la variable "buffer".
16
16
17 perfiles * alturas * canales
17 perfiles * alturas * canales
18
18
19 Esta clase contiene instancias (objetos) de las clases BasicHeader, SystemHeader,
19 Esta clase contiene instancias (objetos) de las clases BasicHeader, SystemHeader,
20 RadarControllerHeader y Voltage. Los tres primeros se usan para almacenar informacion de la
20 RadarControllerHeader y Voltage. Los tres primeros se usan para almacenar informacion de la
21 cabecera de datos (metadata), y el cuarto (Voltage) para obtener y almacenar un perfil de
21 cabecera de datos (metadata), y el cuarto (Voltage) para obtener y almacenar un perfil de
22 datos desde el "buffer" cada vez que se ejecute el metodo "getData".
22 datos desde el "buffer" cada vez que se ejecute el metodo "getData".
23
23
24 Example:
24 Example:
25
25
26 dpath = "/home/myuser/data"
26 dpath = "/home/myuser/data"
27
27
28 startTime = datetime.datetime(2010,1,20,0,0,0,0,0,0)
28 startTime = datetime.datetime(2010,1,20,0,0,0,0,0,0)
29
29
30 endTime = datetime.datetime(2010,1,21,23,59,59,0,0,0)
30 endTime = datetime.datetime(2010,1,21,23,59,59,0,0,0)
31
31
32 readerObj = VoltageReader()
32 readerObj = VoltageReader()
33
33
34 readerObj.setup(dpath, startTime, endTime)
34 readerObj.setup(dpath, startTime, endTime)
35
35
36 while(True):
36 while(True):
37
37
38 #to get one profile
38 #to get one profile
39 profile = readerObj.getData()
39 profile = readerObj.getData()
40
40
41 #print the profile
41 #print the profile
42 print profile
42 print profile
43
43
44 #If you want to see all datablock
44 #If you want to see all datablock
45 print readerObj.datablock
45 print readerObj.datablock
46
46
47 if readerObj.flagNoMoreFiles:
47 if readerObj.flagNoMoreFiles:
48 break
48 break
49
49
50 """
50 """
51
51
52 ext = ".r"
52 ext = ".r"
53
53
54 optchar = "D"
54 optchar = "D"
55 dataOut = None
55 dataOut = None
56
56
57
57
58 def __init__(self):
58 def __init__(self):
59 """
59 """
60 Inicializador de la clase VoltageReader para la lectura de datos de voltage.
60 Inicializador de la clase VoltageReader para la lectura de datos de voltage.
61
61
62 Input:
62 Input:
63 dataOut : Objeto de la clase Voltage. Este objeto sera utilizado para
63 dataOut : Objeto de la clase Voltage. Este objeto sera utilizado para
64 almacenar un perfil de datos cada vez que se haga un requerimiento
64 almacenar un perfil de datos cada vez que se haga un requerimiento
65 (getData). El perfil sera obtenido a partir del buffer de datos,
65 (getData). El perfil sera obtenido a partir del buffer de datos,
66 si el buffer esta vacio se hara un nuevo proceso de lectura de un
66 si el buffer esta vacio se hara un nuevo proceso de lectura de un
67 bloque de datos.
67 bloque de datos.
68 Si este parametro no es pasado se creara uno internamente.
68 Si este parametro no es pasado se creara uno internamente.
69
69
70 Variables afectadas:
70 Variables afectadas:
71 self.dataOut
71 self.dataOut
72
72
73 Return:
73 Return:
74 None
74 None
75 """
75 """
76
76
77 ProcessingUnit.__init__(self)
77 ProcessingUnit.__init__(self)
78
78
79 self.isConfig = False
79 self.isConfig = False
80
80
81 self.datablock = None
81 self.datablock = None
82
82
83 self.utc = 0
83 self.utc = 0
84
84
85 self.ext = ".r"
85 self.ext = ".r"
86
86
87 self.optchar = "D"
87 self.optchar = "D"
88
88
89 self.basicHeaderObj = BasicHeader(LOCALTIME)
89 self.basicHeaderObj = BasicHeader(LOCALTIME)
90
90
91 self.systemHeaderObj = SystemHeader()
91 self.systemHeaderObj = SystemHeader()
92
92
93 self.radarControllerHeaderObj = RadarControllerHeader()
93 self.radarControllerHeaderObj = RadarControllerHeader()
94
94
95 self.processingHeaderObj = ProcessingHeader()
95 self.processingHeaderObj = ProcessingHeader()
96
96
97 self.online = 0
97 self.online = 0
98
98
99 self.fp = None
99 self.fp = None
100
100
101 self.idFile = None
101 self.idFile = None
102
102
103 self.dtype = None
103 self.dtype = None
104
104
105 self.fileSizeByHeader = None
105 self.fileSizeByHeader = None
106
106
107 self.filenameList = []
107 self.filenameList = []
108
108
109 self.filename = None
109 self.filename = None
110
110
111 self.fileSize = None
111 self.fileSize = None
112
112
113 self.firstHeaderSize = 0
113 self.firstHeaderSize = 0
114
114
115 self.basicHeaderSize = 24
115 self.basicHeaderSize = 24
116
116
117 self.pathList = []
117 self.pathList = []
118
118
119 self.filenameList = []
119 self.filenameList = []
120
120
121 self.lastUTTime = 0
121 self.lastUTTime = 0
122
122
123 self.maxTimeStep = 30
123 self.maxTimeStep = 30
124
124
125 self.flagNoMoreFiles = 0
125 self.flagNoMoreFiles = 0
126
126
127 self.set = 0
127 self.set = 0
128
128
129 self.path = None
129 self.path = None
130
130
131 self.profileIndex = 2**32-1
131 self.profileIndex = 2**32-1
132
132
133 self.delay = 3 #seconds
133 self.delay = 3 #seconds
134
134
135 self.nTries = 3 #quantity tries
135 self.nTries = 3 #quantity tries
136
136
137 self.nFiles = 3 #number of files for searching
137 self.nFiles = 3 #number of files for searching
138
138
139 self.nReadBlocks = 0
139 self.nReadBlocks = 0
140
140
141 self.flagIsNewFile = 1
141 self.flagIsNewFile = 1
142
142
143 self.__isFirstTimeOnline = 1
143 self.__isFirstTimeOnline = 1
144
144
145 # self.ippSeconds = 0
145 # self.ippSeconds = 0
146
146
147 self.flagTimeBlock = 0
147 self.flagTimeBlock = 0
148
148
149 self.flagIsNewBlock = 0
149 self.flagIsNewBlock = 0
150
150
151 self.nTotalBlocks = 0
151 self.nTotalBlocks = 0
152
152
153 self.blocksize = 0
153 self.blocksize = 0
154
154
155 self.dataOut = self.createObjByDefault()
155 self.dataOut = self.createObjByDefault()
156
156
157 self.nTxs = 1
158
159 self.txIndex = 0
160
157 def createObjByDefault(self):
161 def createObjByDefault(self):
158
162
159 dataObj = Voltage()
163 dataObj = Voltage()
160
164
161 return dataObj
165 return dataObj
162
166
163 def __hasNotDataInBuffer(self):
167 def __hasNotDataInBuffer(self):
168
164 if self.profileIndex >= self.processingHeaderObj.profilesPerBlock:
169 if self.profileIndex >= self.processingHeaderObj.profilesPerBlock:
165 return 1
170 return 1
171
166 return 0
172 return 0
167
173
168
174
169 def getBlockDimension(self):
175 def getBlockDimension(self):
170 """
176 """
171 Obtiene la cantidad de puntos a leer por cada bloque de datos
177 Obtiene la cantidad de puntos a leer por cada bloque de datos
172
178
173 Affected:
179 Affected:
174 self.blocksize
180 self.blocksize
175
181
176 Return:
182 Return:
177 None
183 None
178 """
184 """
179 pts2read = self.processingHeaderObj.profilesPerBlock * self.processingHeaderObj.nHeights * self.systemHeaderObj.nChannels
185 pts2read = self.processingHeaderObj.profilesPerBlock * self.processingHeaderObj.nHeights * self.systemHeaderObj.nChannels
180 self.blocksize = pts2read
186 self.blocksize = pts2read
181
187
182
188
183 def readBlock(self):
189 def readBlock(self):
184 """
190 """
185 readBlock lee el bloque de datos desde la posicion actual del puntero del archivo
191 readBlock lee el bloque de datos desde la posicion actual del puntero del archivo
186 (self.fp) y actualiza todos los parametros relacionados al bloque de datos
192 (self.fp) y actualiza todos los parametros relacionados al bloque de datos
187 (metadata + data). La data leida es almacenada en el buffer y el contador del buffer
193 (metadata + data). La data leida es almacenada en el buffer y el contador del buffer
188 es seteado a 0
194 es seteado a 0
189
195
190 Inputs:
196 Inputs:
191 None
197 None
192
198
193 Return:
199 Return:
194 None
200 None
195
201
196 Affected:
202 Affected:
197 self.profileIndex
203 self.profileIndex
198 self.datablock
204 self.datablock
199 self.flagIsNewFile
205 self.flagIsNewFile
200 self.flagIsNewBlock
206 self.flagIsNewBlock
201 self.nTotalBlocks
207 self.nTotalBlocks
202
208
203 Exceptions:
209 Exceptions:
204 Si un bloque leido no es un bloque valido
210 Si un bloque leido no es un bloque valido
205 """
211 """
206 current_pointer_location = self.fp.tell()
212 current_pointer_location = self.fp.tell()
207 junk = numpy.fromfile( self.fp, self.dtype, self.blocksize )
213 junk = numpy.fromfile( self.fp, self.dtype, self.blocksize )
208
214
209 try:
215 try:
210 junk = junk.reshape( (self.processingHeaderObj.profilesPerBlock, self.processingHeaderObj.nHeights, self.systemHeaderObj.nChannels) )
216 junk = junk.reshape( (self.processingHeaderObj.profilesPerBlock, self.processingHeaderObj.nHeights, self.systemHeaderObj.nChannels) )
211 except:
217 except:
212 #print "The read block (%3d) has not enough data" %self.nReadBlocks
218 #print "The read block (%3d) has not enough data" %self.nReadBlocks
213
219
214 if self.waitDataBlock(pointer_location=current_pointer_location):
220 if self.waitDataBlock(pointer_location=current_pointer_location):
215 junk = numpy.fromfile( self.fp, self.dtype, self.blocksize )
221 junk = numpy.fromfile( self.fp, self.dtype, self.blocksize )
216 junk = junk.reshape( (self.processingHeaderObj.profilesPerBlock, self.processingHeaderObj.nHeights, self.systemHeaderObj.nChannels) )
222 junk = junk.reshape( (self.processingHeaderObj.profilesPerBlock, self.processingHeaderObj.nHeights, self.systemHeaderObj.nChannels) )
217 # return 0
223 # return 0
218
224
219 junk = numpy.transpose(junk, (2,0,1))
225 junk = numpy.transpose(junk, (2,0,1))
220 self.datablock = junk['real'] + junk['imag']*1j
226 self.datablock = junk['real'] + junk['imag']*1j
221
227
222 self.profileIndex = 0
228 self.profileIndex = 0
223
229
224 self.flagIsNewFile = 0
230 self.flagIsNewFile = 0
225 self.flagIsNewBlock = 1
231 self.flagIsNewBlock = 1
226
232
227 self.nTotalBlocks += 1
233 self.nTotalBlocks += 1
228 self.nReadBlocks += 1
234 self.nReadBlocks += 1
229
235
230 return 1
236 return 1
231
237
232 def getFirstHeader(self):
238 def getFirstHeader(self):
233
239
234 self.dataOut.systemHeaderObj = self.systemHeaderObj.copy()
240 self.dataOut.systemHeaderObj = self.systemHeaderObj.copy()
235
241
236 self.dataOut.radarControllerHeaderObj = self.radarControllerHeaderObj.copy()
242 self.dataOut.radarControllerHeaderObj = self.radarControllerHeaderObj.copy()
237
243
238 # self.dataOut.ippSeconds = self.ippSeconds
244 if self.nTxs > 1:
245 self.dataOut.radarControllerHeaderObj.ippSeconds /= self.nTxs
239
246
240 # self.dataOut.timeInterval = self.radarControllerHeaderObj.ippSeconds * self.processingHeaderObj.nCohInt
247 # self.dataOut.timeInterval = self.radarControllerHeaderObj.ippSeconds * self.processingHeaderObj.nCohInt
241
248
242 if self.radarControllerHeaderObj.code != None:
249 if self.radarControllerHeaderObj.code != None:
243
250
244 self.dataOut.nCode = self.radarControllerHeaderObj.nCode
251 self.dataOut.nCode = self.radarControllerHeaderObj.nCode
245
252
246 self.dataOut.nBaud = self.radarControllerHeaderObj.nBaud
253 self.dataOut.nBaud = self.radarControllerHeaderObj.nBaud
247
254
248 self.dataOut.code = self.radarControllerHeaderObj.code
255 self.dataOut.code = self.radarControllerHeaderObj.code
249
256
250 self.dataOut.dtype = self.dtype
257 self.dataOut.dtype = self.dtype
251
258
252 self.dataOut.nProfiles = self.processingHeaderObj.profilesPerBlock
259 self.dataOut.nProfiles = self.processingHeaderObj.profilesPerBlock*self.nTxs
253
260
254 xf = self.processingHeaderObj.firstHeight + self.processingHeaderObj.nHeights*self.processingHeaderObj.deltaHeight
261 if self.processingHeaderObj.nHeights % self.nTxs != 0:
262 raise ValueError, "nTxs (%d) should be a multiple of nHeights (%d)" %(self.nTxs, self.processingHeaderObj.nHeights)
263
264 xf = self.processingHeaderObj.firstHeight + int(self.processingHeaderObj.nHeights/self.nTxs)*self.processingHeaderObj.deltaHeight
255
265
256 self.dataOut.heightList = numpy.arange(self.processingHeaderObj.firstHeight, xf, self.processingHeaderObj.deltaHeight)
266 self.dataOut.heightList = numpy.arange(self.processingHeaderObj.firstHeight, xf, self.processingHeaderObj.deltaHeight)
257
267
258 self.dataOut.channelList = range(self.systemHeaderObj.nChannels)
268 self.dataOut.channelList = range(self.systemHeaderObj.nChannels)
259
269
260 self.dataOut.nCohInt = self.processingHeaderObj.nCohInt
270 self.dataOut.nCohInt = self.processingHeaderObj.nCohInt
261
271
262 self.dataOut.flagShiftFFT = False
272 self.dataOut.flagShiftFFT = False
263
273
264 self.dataOut.flagDecodeData = False #asumo q la data no esta decodificada
274 self.dataOut.flagDecodeData = False #asumo q la data no esta decodificada
265
275
266 self.dataOut.flagDeflipData = False #asumo q la data no esta sin flip
276 self.dataOut.flagDeflipData = False #asumo q la data no esta sin flip
267
277
268 self.dataOut.flagShiftFFT = False
278 self.dataOut.flagShiftFFT = False
269
279
270 def getData(self):
280 def getData(self):
271 """
281 """
272 getData obtiene una unidad de datos del buffer de lectura, un perfil, y la copia al objeto self.dataOut
282 getData obtiene una unidad de datos del buffer de lectura, un perfil, y la copia al objeto self.dataOut
273 del tipo "Voltage" con todos los parametros asociados a este (metadata). cuando no hay datos
283 del tipo "Voltage" con todos los parametros asociados a este (metadata). cuando no hay datos
274 en el buffer de lectura es necesario hacer una nueva lectura de los bloques de datos usando
284 en el buffer de lectura es necesario hacer una nueva lectura de los bloques de datos usando
275 "readNextBlock"
285 "readNextBlock"
276
286
277 Ademas incrementa el contador del buffer "self.profileIndex" en 1.
287 Ademas incrementa el contador del buffer "self.profileIndex" en 1.
278
288
279 Return:
289 Return:
280
290
281 Si el flag self.getByBlock ha sido seteado el bloque completo es copiado a self.dataOut y el self.profileIndex
291 Si el flag self.getByBlock ha sido seteado el bloque completo es copiado a self.dataOut y el self.profileIndex
282 es igual al total de perfiles leidos desde el archivo.
292 es igual al total de perfiles leidos desde el archivo.
283
293
284 Si self.getByBlock == False:
294 Si self.getByBlock == False:
285
295
286 self.dataOut.data = buffer[:, thisProfile, :]
296 self.dataOut.data = buffer[:, thisProfile, :]
287
297
288 shape = [nChannels, nHeis]
298 shape = [nChannels, nHeis]
289
299
290 Si self.getByBlock == True:
300 Si self.getByBlock == True:
291
301
292 self.dataOut.data = buffer[:, :, :]
302 self.dataOut.data = buffer[:, :, :]
293
303
294 shape = [nChannels, nProfiles, nHeis]
304 shape = [nChannels, nProfiles, nHeis]
295
305
296 Variables afectadas:
306 Variables afectadas:
297 self.dataOut
307 self.dataOut
298 self.profileIndex
308 self.profileIndex
299
309
300 Affected:
310 Affected:
301 self.dataOut
311 self.dataOut
302 self.profileIndex
312 self.profileIndex
303 self.flagTimeBlock
313 self.flagTimeBlock
304 self.flagIsNewBlock
314 self.flagIsNewBlock
305 """
315 """
306
316
307 if self.flagNoMoreFiles:
317 if self.flagNoMoreFiles:
308 self.dataOut.flagNoData = True
318 self.dataOut.flagNoData = True
309 print 'Process finished'
319 print 'Process finished'
310 return 0
320 return 0
311
321
312 self.flagTimeBlock = 0
322 self.flagTimeBlock = 0
313 self.flagIsNewBlock = 0
323 self.flagIsNewBlock = 0
314
324
315 if self.__hasNotDataInBuffer():
325 if self.__hasNotDataInBuffer():
316
326
317 if not( self.readNextBlock() ):
327 if not( self.readNextBlock() ):
318 return 0
328 return 0
319
329
320 self.getFirstHeader()
330 self.getFirstHeader()
321
331
322 if self.datablock == None:
332 if self.datablock == None:
323 self.dataOut.flagNoData = True
333 self.dataOut.flagNoData = True
324 return 0
334 return 0
325
335
326 if self.getByBlock:
336 if not self.getByBlock:
327 self.dataOut.flagDataAsBlock = True
337
328 self.dataOut.data = self.datablock
338 """
329 self.profileIndex = self.processingHeaderObj.profilesPerBlock
339 Return profile by profile
330 else:
340
341 If nTxs > 1 then one profile is divided by nTxs and number of total
342 blocks is increased by nTxs (nProfiles *= nTxs)
343 """
344 if self.nTxs == 1:
331 self.dataOut.flagDataAsBlock = False
345 self.dataOut.flagDataAsBlock = False
332 self.dataOut.data = self.datablock[:,self.profileIndex,:]
346 self.dataOut.data = self.datablock[:,self.profileIndex,:]
347 self.dataOut.profileIndex = self.profileIndex
348
333 self.profileIndex += 1
349 self.profileIndex += 1
334
350
335 self.dataOut.flagNoData = False
351 else:
352 self.dataOut.flagDataAsBlock = False
336
353
337 self.getBasicHeader()
354 iniHei_ForThisTx = (self.txIndex)*int(self.processingHeaderObj.nHeights/self.nTxs)
355 endHei_ForThisTx = (self.txIndex+1)*int(self.processingHeaderObj.nHeights/self.nTxs)
356
357 # print iniHei_ForThisTx, endHei_ForThisTx
358
359 self.dataOut.data = self.datablock[:, self.profileIndex, iniHei_ForThisTx:endHei_ForThisTx]
360 self.dataOut.profileIndex = self.profileIndex*self.nTxs + self.txIndex
361
362 self.txIndex += 1
338
363
364 if self.txIndex == self.nTxs:
365 self.txIndex = 0
366 self.profileIndex += 1
339
367
368 else:
369 """
370 Return all block
371 """
372 self.dataOut.flagDataAsBlock = True
373 self.dataOut.data = self.datablock
374 self.dataOut.profileIndex = self.processingHeaderObj.profilesPerBlock - 1
375
376 self.profileIndex = self.processingHeaderObj.profilesPerBlock - 1
377
378 self.dataOut.flagNoData = False
379
380 self.getBasicHeader()
340
381
341 self.dataOut.realtime = self.online
382 self.dataOut.realtime = self.online
342
383
343 return self.dataOut.data
384 return self.dataOut.data
344
385
345 class VoltageWriter(JRODataWriter, Operation):
386 class VoltageWriter(JRODataWriter, Operation):
346 """
387 """
347 Esta clase permite escribir datos de voltajes a archivos procesados (.r). La escritura
388 Esta clase permite escribir datos de voltajes a archivos procesados (.r). La escritura
348 de los datos siempre se realiza por bloques.
389 de los datos siempre se realiza por bloques.
349 """
390 """
350
391
351 ext = ".r"
392 ext = ".r"
352
393
353 optchar = "D"
394 optchar = "D"
354
395
355 shapeBuffer = None
396 shapeBuffer = None
356
397
357
398
358 def __init__(self):
399 def __init__(self):
359 """
400 """
360 Inicializador de la clase VoltageWriter para la escritura de datos de espectros.
401 Inicializador de la clase VoltageWriter para la escritura de datos de espectros.
361
402
362 Affected:
403 Affected:
363 self.dataOut
404 self.dataOut
364
405
365 Return: None
406 Return: None
366 """
407 """
367 Operation.__init__(self)
408 Operation.__init__(self)
368
409
369 self.nTotalBlocks = 0
410 self.nTotalBlocks = 0
370
411
371 self.profileIndex = 0
412 self.profileIndex = 0
372
413
373 self.isConfig = False
414 self.isConfig = False
374
415
375 self.fp = None
416 self.fp = None
376
417
377 self.flagIsNewFile = 1
418 self.flagIsNewFile = 1
378
419
379 self.nTotalBlocks = 0
420 self.nTotalBlocks = 0
380
421
381 self.flagIsNewBlock = 0
422 self.flagIsNewBlock = 0
382
423
383 self.setFile = None
424 self.setFile = None
384
425
385 self.dtype = None
426 self.dtype = None
386
427
387 self.path = None
428 self.path = None
388
429
389 self.filename = None
430 self.filename = None
390
431
391 self.basicHeaderObj = BasicHeader(LOCALTIME)
432 self.basicHeaderObj = BasicHeader(LOCALTIME)
392
433
393 self.systemHeaderObj = SystemHeader()
434 self.systemHeaderObj = SystemHeader()
394
435
395 self.radarControllerHeaderObj = RadarControllerHeader()
436 self.radarControllerHeaderObj = RadarControllerHeader()
396
437
397 self.processingHeaderObj = ProcessingHeader()
438 self.processingHeaderObj = ProcessingHeader()
398
439
399 def hasAllDataInBuffer(self):
440 def hasAllDataInBuffer(self):
400 if self.profileIndex >= self.processingHeaderObj.profilesPerBlock:
441 if self.profileIndex >= self.processingHeaderObj.profilesPerBlock:
401 return 1
442 return 1
402 return 0
443 return 0
403
444
404
445
405 def setBlockDimension(self):
446 def setBlockDimension(self):
406 """
447 """
407 Obtiene las formas dimensionales del los subbloques de datos que componen un bloque
448 Obtiene las formas dimensionales del los subbloques de datos que componen un bloque
408
449
409 Affected:
450 Affected:
410 self.shape_spc_Buffer
451 self.shape_spc_Buffer
411 self.shape_cspc_Buffer
452 self.shape_cspc_Buffer
412 self.shape_dc_Buffer
453 self.shape_dc_Buffer
413
454
414 Return: None
455 Return: None
415 """
456 """
416 self.shapeBuffer = (self.processingHeaderObj.profilesPerBlock,
457 self.shapeBuffer = (self.processingHeaderObj.profilesPerBlock,
417 self.processingHeaderObj.nHeights,
458 self.processingHeaderObj.nHeights,
418 self.systemHeaderObj.nChannels)
459 self.systemHeaderObj.nChannels)
419
460
420 self.datablock = numpy.zeros((self.systemHeaderObj.nChannels,
461 self.datablock = numpy.zeros((self.systemHeaderObj.nChannels,
421 self.processingHeaderObj.profilesPerBlock,
462 self.processingHeaderObj.profilesPerBlock,
422 self.processingHeaderObj.nHeights),
463 self.processingHeaderObj.nHeights),
423 dtype=numpy.dtype('complex64'))
464 dtype=numpy.dtype('complex64'))
424
465
425
466
426 def writeBlock(self):
467 def writeBlock(self):
427 """
468 """
428 Escribe el buffer en el file designado
469 Escribe el buffer en el file designado
429
470
430 Affected:
471 Affected:
431 self.profileIndex
472 self.profileIndex
432 self.flagIsNewFile
473 self.flagIsNewFile
433 self.flagIsNewBlock
474 self.flagIsNewBlock
434 self.nTotalBlocks
475 self.nTotalBlocks
435 self.blockIndex
476 self.blockIndex
436
477
437 Return: None
478 Return: None
438 """
479 """
439 data = numpy.zeros( self.shapeBuffer, self.dtype )
480 data = numpy.zeros( self.shapeBuffer, self.dtype )
440
481
441 junk = numpy.transpose(self.datablock, (1,2,0))
482 junk = numpy.transpose(self.datablock, (1,2,0))
442
483
443 data['real'] = junk.real
484 data['real'] = junk.real
444 data['imag'] = junk.imag
485 data['imag'] = junk.imag
445
486
446 data = data.reshape( (-1) )
487 data = data.reshape( (-1) )
447
488
448 data.tofile( self.fp )
489 data.tofile( self.fp )
449
490
450 self.datablock.fill(0)
491 self.datablock.fill(0)
451
492
452 self.profileIndex = 0
493 self.profileIndex = 0
453 self.flagIsNewFile = 0
494 self.flagIsNewFile = 0
454 self.flagIsNewBlock = 1
495 self.flagIsNewBlock = 1
455
496
456 self.blockIndex += 1
497 self.blockIndex += 1
457 self.nTotalBlocks += 1
498 self.nTotalBlocks += 1
458
499
459 def putData(self):
500 def putData(self):
460 """
501 """
461 Setea un bloque de datos y luego los escribe en un file
502 Setea un bloque de datos y luego los escribe en un file
462
503
463 Affected:
504 Affected:
464 self.flagIsNewBlock
505 self.flagIsNewBlock
465 self.profileIndex
506 self.profileIndex
466
507
467 Return:
508 Return:
468 0 : Si no hay data o no hay mas files que puedan escribirse
509 0 : Si no hay data o no hay mas files que puedan escribirse
469 1 : Si se escribio la data de un bloque en un file
510 1 : Si se escribio la data de un bloque en un file
470 """
511 """
471 if self.dataOut.flagNoData:
512 if self.dataOut.flagNoData:
472 return 0
513 return 0
473
514
474 self.flagIsNewBlock = 0
515 self.flagIsNewBlock = 0
475
516
476 if self.dataOut.flagTimeBlock:
517 if self.dataOut.flagTimeBlock:
477
518
478 self.datablock.fill(0)
519 self.datablock.fill(0)
479 self.profileIndex = 0
520 self.profileIndex = 0
480 self.setNextFile()
521 self.setNextFile()
481
522
482 if self.profileIndex == 0:
523 if self.profileIndex == 0:
483 self.setBasicHeader()
524 self.setBasicHeader()
484
525
485 self.datablock[:,self.profileIndex,:] = self.dataOut.data
526 self.datablock[:,self.profileIndex,:] = self.dataOut.data
486
527
487 self.profileIndex += 1
528 self.profileIndex += 1
488
529
489 if self.hasAllDataInBuffer():
530 if self.hasAllDataInBuffer():
490 #if self.flagIsNewFile:
531 #if self.flagIsNewFile:
491 self.writeNextBlock()
532 self.writeNextBlock()
492 # self.setFirstHeader()
533 # self.setFirstHeader()
493
534
494 return 1
535 return 1
495
536
496 def __getProcessFlags(self):
537 def __getProcessFlags(self):
497
538
498 processFlags = 0
539 processFlags = 0
499
540
500 dtype0 = numpy.dtype([('real','<i1'),('imag','<i1')])
541 dtype0 = numpy.dtype([('real','<i1'),('imag','<i1')])
501 dtype1 = numpy.dtype([('real','<i2'),('imag','<i2')])
542 dtype1 = numpy.dtype([('real','<i2'),('imag','<i2')])
502 dtype2 = numpy.dtype([('real','<i4'),('imag','<i4')])
543 dtype2 = numpy.dtype([('real','<i4'),('imag','<i4')])
503 dtype3 = numpy.dtype([('real','<i8'),('imag','<i8')])
544 dtype3 = numpy.dtype([('real','<i8'),('imag','<i8')])
504 dtype4 = numpy.dtype([('real','<f4'),('imag','<f4')])
545 dtype4 = numpy.dtype([('real','<f4'),('imag','<f4')])
505 dtype5 = numpy.dtype([('real','<f8'),('imag','<f8')])
546 dtype5 = numpy.dtype([('real','<f8'),('imag','<f8')])
506
547
507 dtypeList = [dtype0, dtype1, dtype2, dtype3, dtype4, dtype5]
548 dtypeList = [dtype0, dtype1, dtype2, dtype3, dtype4, dtype5]
508
549
509
550
510
551
511 datatypeValueList = [PROCFLAG.DATATYPE_CHAR,
552 datatypeValueList = [PROCFLAG.DATATYPE_CHAR,
512 PROCFLAG.DATATYPE_SHORT,
553 PROCFLAG.DATATYPE_SHORT,
513 PROCFLAG.DATATYPE_LONG,
554 PROCFLAG.DATATYPE_LONG,
514 PROCFLAG.DATATYPE_INT64,
555 PROCFLAG.DATATYPE_INT64,
515 PROCFLAG.DATATYPE_FLOAT,
556 PROCFLAG.DATATYPE_FLOAT,
516 PROCFLAG.DATATYPE_DOUBLE]
557 PROCFLAG.DATATYPE_DOUBLE]
517
558
518
559
519 for index in range(len(dtypeList)):
560 for index in range(len(dtypeList)):
520 if self.dataOut.dtype == dtypeList[index]:
561 if self.dataOut.dtype == dtypeList[index]:
521 dtypeValue = datatypeValueList[index]
562 dtypeValue = datatypeValueList[index]
522 break
563 break
523
564
524 processFlags += dtypeValue
565 processFlags += dtypeValue
525
566
526 if self.dataOut.flagDecodeData:
567 if self.dataOut.flagDecodeData:
527 processFlags += PROCFLAG.DECODE_DATA
568 processFlags += PROCFLAG.DECODE_DATA
528
569
529 if self.dataOut.flagDeflipData:
570 if self.dataOut.flagDeflipData:
530 processFlags += PROCFLAG.DEFLIP_DATA
571 processFlags += PROCFLAG.DEFLIP_DATA
531
572
532 if self.dataOut.code != None:
573 if self.dataOut.code != None:
533 processFlags += PROCFLAG.DEFINE_PROCESS_CODE
574 processFlags += PROCFLAG.DEFINE_PROCESS_CODE
534
575
535 if self.dataOut.nCohInt > 1:
576 if self.dataOut.nCohInt > 1:
536 processFlags += PROCFLAG.COHERENT_INTEGRATION
577 processFlags += PROCFLAG.COHERENT_INTEGRATION
537
578
538 return processFlags
579 return processFlags
539
580
540
581
541 def __getBlockSize(self):
582 def __getBlockSize(self):
542 '''
583 '''
543 Este metodos determina el cantidad de bytes para un bloque de datos de tipo Voltage
584 Este metodos determina el cantidad de bytes para un bloque de datos de tipo Voltage
544 '''
585 '''
545
586
546 dtype0 = numpy.dtype([('real','<i1'),('imag','<i1')])
587 dtype0 = numpy.dtype([('real','<i1'),('imag','<i1')])
547 dtype1 = numpy.dtype([('real','<i2'),('imag','<i2')])
588 dtype1 = numpy.dtype([('real','<i2'),('imag','<i2')])
548 dtype2 = numpy.dtype([('real','<i4'),('imag','<i4')])
589 dtype2 = numpy.dtype([('real','<i4'),('imag','<i4')])
549 dtype3 = numpy.dtype([('real','<i8'),('imag','<i8')])
590 dtype3 = numpy.dtype([('real','<i8'),('imag','<i8')])
550 dtype4 = numpy.dtype([('real','<f4'),('imag','<f4')])
591 dtype4 = numpy.dtype([('real','<f4'),('imag','<f4')])
551 dtype5 = numpy.dtype([('real','<f8'),('imag','<f8')])
592 dtype5 = numpy.dtype([('real','<f8'),('imag','<f8')])
552
593
553 dtypeList = [dtype0, dtype1, dtype2, dtype3, dtype4, dtype5]
594 dtypeList = [dtype0, dtype1, dtype2, dtype3, dtype4, dtype5]
554 datatypeValueList = [1,2,4,8,4,8]
595 datatypeValueList = [1,2,4,8,4,8]
555 for index in range(len(dtypeList)):
596 for index in range(len(dtypeList)):
556 if self.dataOut.dtype == dtypeList[index]:
597 if self.dataOut.dtype == dtypeList[index]:
557 datatypeValue = datatypeValueList[index]
598 datatypeValue = datatypeValueList[index]
558 break
599 break
559
600
560 blocksize = int(self.dataOut.nHeights * self.dataOut.nChannels * self.profilesPerBlock * datatypeValue * 2)
601 blocksize = int(self.dataOut.nHeights * self.dataOut.nChannels * self.profilesPerBlock * datatypeValue * 2)
561
602
562 return blocksize
603 return blocksize
563
604
564 def setFirstHeader(self):
605 def setFirstHeader(self):
565
606
566 """
607 """
567 Obtiene una copia del First Header
608 Obtiene una copia del First Header
568
609
569 Affected:
610 Affected:
570 self.systemHeaderObj
611 self.systemHeaderObj
571 self.radarControllerHeaderObj
612 self.radarControllerHeaderObj
572 self.dtype
613 self.dtype
573
614
574 Return:
615 Return:
575 None
616 None
576 """
617 """
577
618
578 self.systemHeaderObj = self.dataOut.systemHeaderObj.copy()
619 self.systemHeaderObj = self.dataOut.systemHeaderObj.copy()
579 self.systemHeaderObj.nChannels = self.dataOut.nChannels
620 self.systemHeaderObj.nChannels = self.dataOut.nChannels
580 self.radarControllerHeaderObj = self.dataOut.radarControllerHeaderObj.copy()
621 self.radarControllerHeaderObj = self.dataOut.radarControllerHeaderObj.copy()
581
622
582 self.setBasicHeader()
623 self.setBasicHeader()
583
624
584 processingHeaderSize = 40 # bytes
625 processingHeaderSize = 40 # bytes
585 self.processingHeaderObj.dtype = 0 # Voltage
626 self.processingHeaderObj.dtype = 0 # Voltage
586 self.processingHeaderObj.blockSize = self.__getBlockSize()
627 self.processingHeaderObj.blockSize = self.__getBlockSize()
587 self.processingHeaderObj.profilesPerBlock = self.profilesPerBlock
628 self.processingHeaderObj.profilesPerBlock = self.profilesPerBlock
588 self.processingHeaderObj.dataBlocksPerFile = self.blocksPerFile
629 self.processingHeaderObj.dataBlocksPerFile = self.blocksPerFile
589 self.processingHeaderObj.nWindows = 1 #podria ser 1 o self.dataOut.processingHeaderObj.nWindows
630 self.processingHeaderObj.nWindows = 1 #podria ser 1 o self.dataOut.processingHeaderObj.nWindows
590 self.processingHeaderObj.processFlags = self.__getProcessFlags()
631 self.processingHeaderObj.processFlags = self.__getProcessFlags()
591 self.processingHeaderObj.nCohInt = self.dataOut.nCohInt
632 self.processingHeaderObj.nCohInt = self.dataOut.nCohInt
592 self.processingHeaderObj.nIncohInt = 1 # Cuando la data de origen es de tipo Voltage
633 self.processingHeaderObj.nIncohInt = 1 # Cuando la data de origen es de tipo Voltage
593 self.processingHeaderObj.totalSpectra = 0 # Cuando la data de origen es de tipo Voltage
634 self.processingHeaderObj.totalSpectra = 0 # Cuando la data de origen es de tipo Voltage
594
635
595 # if self.dataOut.code != None:
636 # if self.dataOut.code != None:
596 # self.processingHeaderObj.code = self.dataOut.code
637 # self.processingHeaderObj.code = self.dataOut.code
597 # self.processingHeaderObj.nCode = self.dataOut.nCode
638 # self.processingHeaderObj.nCode = self.dataOut.nCode
598 # self.processingHeaderObj.nBaud = self.dataOut.nBaud
639 # self.processingHeaderObj.nBaud = self.dataOut.nBaud
599 # codesize = int(8 + 4 * self.dataOut.nCode * self.dataOut.nBaud)
640 # codesize = int(8 + 4 * self.dataOut.nCode * self.dataOut.nBaud)
600 # processingHeaderSize += codesize
641 # processingHeaderSize += codesize
601
642
602 if self.processingHeaderObj.nWindows != 0:
643 if self.processingHeaderObj.nWindows != 0:
603 self.processingHeaderObj.firstHeight = self.dataOut.heightList[0]
644 self.processingHeaderObj.firstHeight = self.dataOut.heightList[0]
604 self.processingHeaderObj.deltaHeight = self.dataOut.heightList[1] - self.dataOut.heightList[0]
645 self.processingHeaderObj.deltaHeight = self.dataOut.heightList[1] - self.dataOut.heightList[0]
605 self.processingHeaderObj.nHeights = self.dataOut.nHeights
646 self.processingHeaderObj.nHeights = self.dataOut.nHeights
606 self.processingHeaderObj.samplesWin = self.dataOut.nHeights
647 self.processingHeaderObj.samplesWin = self.dataOut.nHeights
607 processingHeaderSize += 12
648 processingHeaderSize += 12
608
649
609 self.processingHeaderObj.size = processingHeaderSize No newline at end of file
650 self.processingHeaderObj.size = processingHeaderSize
@@ -1,841 +1,890
1 import numpy
1 import numpy
2
2
3 from jroproc_base import ProcessingUnit, Operation
3 from jroproc_base import ProcessingUnit, Operation
4 from model.data.jrodata import Voltage
4 from model.data.jrodata import Voltage
5
5
6
6
7 class VoltageProc(ProcessingUnit):
7 class VoltageProc(ProcessingUnit):
8
8
9
9
10 def __init__(self):
10 def __init__(self):
11
11
12 ProcessingUnit.__init__(self)
12 ProcessingUnit.__init__(self)
13
13
14 # self.objectDict = {}
14 # self.objectDict = {}
15 self.dataOut = Voltage()
15 self.dataOut = Voltage()
16 self.flip = 1
16 self.flip = 1
17
17
18 def run(self):
18 def run(self):
19 if self.dataIn.type == 'AMISR':
19 if self.dataIn.type == 'AMISR':
20 self.__updateObjFromAmisrInput()
20 self.__updateObjFromAmisrInput()
21
21
22 if self.dataIn.type == 'Voltage':
22 if self.dataIn.type == 'Voltage':
23 self.dataOut.copy(self.dataIn)
23 self.dataOut.copy(self.dataIn)
24
24
25 # self.dataOut.copy(self.dataIn)
25 # self.dataOut.copy(self.dataIn)
26
26
27 def __updateObjFromAmisrInput(self):
27 def __updateObjFromAmisrInput(self):
28
28
29 self.dataOut.timeZone = self.dataIn.timeZone
29 self.dataOut.timeZone = self.dataIn.timeZone
30 self.dataOut.dstFlag = self.dataIn.dstFlag
30 self.dataOut.dstFlag = self.dataIn.dstFlag
31 self.dataOut.errorCount = self.dataIn.errorCount
31 self.dataOut.errorCount = self.dataIn.errorCount
32 self.dataOut.useLocalTime = self.dataIn.useLocalTime
32 self.dataOut.useLocalTime = self.dataIn.useLocalTime
33
33
34 self.dataOut.flagNoData = self.dataIn.flagNoData
34 self.dataOut.flagNoData = self.dataIn.flagNoData
35 self.dataOut.data = self.dataIn.data
35 self.dataOut.data = self.dataIn.data
36 self.dataOut.utctime = self.dataIn.utctime
36 self.dataOut.utctime = self.dataIn.utctime
37 self.dataOut.channelList = self.dataIn.channelList
37 self.dataOut.channelList = self.dataIn.channelList
38 self.dataOut.timeInterval = self.dataIn.timeInterval
38 self.dataOut.timeInterval = self.dataIn.timeInterval
39 self.dataOut.heightList = self.dataIn.heightList
39 self.dataOut.heightList = self.dataIn.heightList
40 self.dataOut.nProfiles = self.dataIn.nProfiles
40 self.dataOut.nProfiles = self.dataIn.nProfiles
41
41
42 self.dataOut.nCohInt = self.dataIn.nCohInt
42 self.dataOut.nCohInt = self.dataIn.nCohInt
43 self.dataOut.ippSeconds = self.dataIn.ippSeconds
43 self.dataOut.ippSeconds = self.dataIn.ippSeconds
44 self.dataOut.frequency = self.dataIn.frequency
44 self.dataOut.frequency = self.dataIn.frequency
45
45
46 self.dataOut.azimuth = self.dataIn.azimuth
46 self.dataOut.azimuth = self.dataIn.azimuth
47 self.dataOut.zenith = self.dataIn.zenith
47 self.dataOut.zenith = self.dataIn.zenith
48
48
49 self.dataOut.beam.codeList = self.dataIn.beam.codeList
49 self.dataOut.beam.codeList = self.dataIn.beam.codeList
50 self.dataOut.beam.azimuthList = self.dataIn.beam.azimuthList
50 self.dataOut.beam.azimuthList = self.dataIn.beam.azimuthList
51 self.dataOut.beam.zenithList = self.dataIn.beam.zenithList
51 self.dataOut.beam.zenithList = self.dataIn.beam.zenithList
52 #
52 #
53 # pass#
53 # pass#
54 #
54 #
55 # def init(self):
55 # def init(self):
56 #
56 #
57 #
57 #
58 # if self.dataIn.type == 'AMISR':
58 # if self.dataIn.type == 'AMISR':
59 # self.__updateObjFromAmisrInput()
59 # self.__updateObjFromAmisrInput()
60 #
60 #
61 # if self.dataIn.type == 'Voltage':
61 # if self.dataIn.type == 'Voltage':
62 # self.dataOut.copy(self.dataIn)
62 # self.dataOut.copy(self.dataIn)
63 # # No necesita copiar en cada init() los atributos de dataIn
63 # # No necesita copiar en cada init() los atributos de dataIn
64 # # la copia deberia hacerse por cada nuevo bloque de datos
64 # # la copia deberia hacerse por cada nuevo bloque de datos
65
65
66 def selectChannels(self, channelList):
66 def selectChannels(self, channelList):
67
67
68 channelIndexList = []
68 channelIndexList = []
69
69
70 for channel in channelList:
70 for channel in channelList:
71 index = self.dataOut.channelList.index(channel)
71 index = self.dataOut.channelList.index(channel)
72 channelIndexList.append(index)
72 channelIndexList.append(index)
73
73
74 self.selectChannelsByIndex(channelIndexList)
74 self.selectChannelsByIndex(channelIndexList)
75
75
76 def selectChannelsByIndex(self, channelIndexList):
76 def selectChannelsByIndex(self, channelIndexList):
77 """
77 """
78 Selecciona un bloque de datos en base a canales segun el channelIndexList
78 Selecciona un bloque de datos en base a canales segun el channelIndexList
79
79
80 Input:
80 Input:
81 channelIndexList : lista sencilla de canales a seleccionar por ej. [2,3,7]
81 channelIndexList : lista sencilla de canales a seleccionar por ej. [2,3,7]
82
82
83 Affected:
83 Affected:
84 self.dataOut.data
84 self.dataOut.data
85 self.dataOut.channelIndexList
85 self.dataOut.channelIndexList
86 self.dataOut.nChannels
86 self.dataOut.nChannels
87 self.dataOut.m_ProcessingHeader.totalSpectra
87 self.dataOut.m_ProcessingHeader.totalSpectra
88 self.dataOut.systemHeaderObj.numChannels
88 self.dataOut.systemHeaderObj.numChannels
89 self.dataOut.m_ProcessingHeader.blockSize
89 self.dataOut.m_ProcessingHeader.blockSize
90
90
91 Return:
91 Return:
92 None
92 None
93 """
93 """
94
94
95 for channelIndex in channelIndexList:
95 for channelIndex in channelIndexList:
96 if channelIndex not in self.dataOut.channelIndexList:
96 if channelIndex not in self.dataOut.channelIndexList:
97 print channelIndexList
97 print channelIndexList
98 raise ValueError, "The value %d in channelIndexList is not valid" %channelIndex
98 raise ValueError, "The value %d in channelIndexList is not valid" %channelIndex
99
99
100 # nChannels = len(channelIndexList)
100 # nChannels = len(channelIndexList)
101 if dataOut.flagDataAsBlock:
101 if dataOut.flagDataAsBlock:
102 """
102 """
103 Si la data es obtenida por bloques, dimension = [nChannels, nProfiles, nHeis]
103 Si la data es obtenida por bloques, dimension = [nChannels, nProfiles, nHeis]
104 """
104 """
105 data = self.dataOut.data[channelIndexList,:,:]
105 data = self.dataOut.data[channelIndexList,:,:]
106 else:
106 else:
107 data = self.dataOut.data[channelIndexList,:]
107 data = self.dataOut.data[channelIndexList,:]
108
108
109 self.dataOut.data = data
109 self.dataOut.data = data
110 self.dataOut.channelList = [self.dataOut.channelList[i] for i in channelIndexList]
110 self.dataOut.channelList = [self.dataOut.channelList[i] for i in channelIndexList]
111 # self.dataOut.nChannels = nChannels
111 # self.dataOut.nChannels = nChannels
112
112
113 return 1
113 return 1
114
114
115 def selectHeights(self, minHei=None, maxHei=None):
115 def selectHeights(self, minHei=None, maxHei=None):
116 """
116 """
117 Selecciona un bloque de datos en base a un grupo de valores de alturas segun el rango
117 Selecciona un bloque de datos en base a un grupo de valores de alturas segun el rango
118 minHei <= height <= maxHei
118 minHei <= height <= maxHei
119
119
120 Input:
120 Input:
121 minHei : valor minimo de altura a considerar
121 minHei : valor minimo de altura a considerar
122 maxHei : valor maximo de altura a considerar
122 maxHei : valor maximo de altura a considerar
123
123
124 Affected:
124 Affected:
125 Indirectamente son cambiados varios valores a travez del metodo selectHeightsByIndex
125 Indirectamente son cambiados varios valores a travez del metodo selectHeightsByIndex
126
126
127 Return:
127 Return:
128 1 si el metodo se ejecuto con exito caso contrario devuelve 0
128 1 si el metodo se ejecuto con exito caso contrario devuelve 0
129 """
129 """
130
130
131 if minHei == None:
131 if minHei == None:
132 minHei = self.dataOut.heightList[0]
132 minHei = self.dataOut.heightList[0]
133
133
134 if maxHei == None:
134 if maxHei == None:
135 maxHei = self.dataOut.heightList[-1]
135 maxHei = self.dataOut.heightList[-1]
136
136
137 if (minHei < self.dataOut.heightList[0]) or (minHei > maxHei):
137 if (minHei < self.dataOut.heightList[0]) or (minHei > maxHei):
138 raise ValueError, "some value in (%d,%d) is not valid" % (minHei, maxHei)
138 raise ValueError, "some value in (%d,%d) is not valid" % (minHei, maxHei)
139
139
140
140
141 if (maxHei > self.dataOut.heightList[-1]):
141 if (maxHei > self.dataOut.heightList[-1]):
142 maxHei = self.dataOut.heightList[-1]
142 maxHei = self.dataOut.heightList[-1]
143 # raise ValueError, "some value in (%d,%d) is not valid" % (minHei, maxHei)
143 # raise ValueError, "some value in (%d,%d) is not valid" % (minHei, maxHei)
144
144
145 minIndex = 0
145 minIndex = 0
146 maxIndex = 0
146 maxIndex = 0
147 heights = self.dataOut.heightList
147 heights = self.dataOut.heightList
148
148
149 inda = numpy.where(heights >= minHei)
149 inda = numpy.where(heights >= minHei)
150 indb = numpy.where(heights <= maxHei)
150 indb = numpy.where(heights <= maxHei)
151
151
152 try:
152 try:
153 minIndex = inda[0][0]
153 minIndex = inda[0][0]
154 except:
154 except:
155 minIndex = 0
155 minIndex = 0
156
156
157 try:
157 try:
158 maxIndex = indb[0][-1]
158 maxIndex = indb[0][-1]
159 except:
159 except:
160 maxIndex = len(heights)
160 maxIndex = len(heights)
161
161
162 self.selectHeightsByIndex(minIndex, maxIndex)
162 self.selectHeightsByIndex(minIndex, maxIndex)
163
163
164 return 1
164 return 1
165
165
166
166
167 def selectHeightsByIndex(self, minIndex, maxIndex):
167 def selectHeightsByIndex(self, minIndex, maxIndex):
168 """
168 """
169 Selecciona un bloque de datos en base a un grupo indices de alturas segun el rango
169 Selecciona un bloque de datos en base a un grupo indices de alturas segun el rango
170 minIndex <= index <= maxIndex
170 minIndex <= index <= maxIndex
171
171
172 Input:
172 Input:
173 minIndex : valor de indice minimo de altura a considerar
173 minIndex : valor de indice minimo de altura a considerar
174 maxIndex : valor de indice maximo de altura a considerar
174 maxIndex : valor de indice maximo de altura a considerar
175
175
176 Affected:
176 Affected:
177 self.dataOut.data
177 self.dataOut.data
178 self.dataOut.heightList
178 self.dataOut.heightList
179
179
180 Return:
180 Return:
181 1 si el metodo se ejecuto con exito caso contrario devuelve 0
181 1 si el metodo se ejecuto con exito caso contrario devuelve 0
182 """
182 """
183
183
184 if (minIndex < 0) or (minIndex > maxIndex):
184 if (minIndex < 0) or (minIndex > maxIndex):
185 raise ValueError, "some value in (%d,%d) is not valid" % (minIndex, maxIndex)
185 raise ValueError, "some value in (%d,%d) is not valid" % (minIndex, maxIndex)
186
186
187 if (maxIndex >= self.dataOut.nHeights):
187 if (maxIndex >= self.dataOut.nHeights):
188 maxIndex = self.dataOut.nHeights-1
188 maxIndex = self.dataOut.nHeights
189 # raise ValueError, "some value in (%d,%d) is not valid" % (minIndex, maxIndex)
189 # raise ValueError, "some value in (%d,%d) is not valid" % (minIndex, maxIndex)
190
190
191 # nHeights = maxIndex - minIndex + 1
191 # nHeights = maxIndex - minIndex + 1
192
192
193 #voltage
193 #voltage
194 if self.dataOut.flagDataAsBlock:
194 if self.dataOut.flagDataAsBlock:
195 """
195 """
196 Si la data es obtenida por bloques, dimension = [nChannels, nProfiles, nHeis]
196 Si la data es obtenida por bloques, dimension = [nChannels, nProfiles, nHeis]
197 """
197 """
198 data = self.dataOut.data[:,minIndex:maxIndex+1,:]
198 data = self.dataOut.data[:,minIndex:maxIndex,:]
199 else:
199 else:
200 data = self.dataOut.data[:,minIndex:maxIndex+1]
200 data = self.dataOut.data[:,minIndex:maxIndex]
201
201
202 # firstHeight = self.dataOut.heightList[minIndex]
202 # firstHeight = self.dataOut.heightList[minIndex]
203
203
204 self.dataOut.data = data
204 self.dataOut.data = data
205 self.dataOut.heightList = self.dataOut.heightList[minIndex:maxIndex+1]
205 self.dataOut.heightList = self.dataOut.heightList[minIndex:maxIndex]
206
206
207 return 1
207 return 1
208
208
209
209
210 def filterByHeights(self, window, axis=1):
210 def filterByHeights(self, window, axis=1):
211
211
212 deltaHeight = self.dataOut.heightList[1] - self.dataOut.heightList[0]
212 deltaHeight = self.dataOut.heightList[1] - self.dataOut.heightList[0]
213
213
214 if window == None:
214 if window == None:
215 window = (self.dataOut.radarControllerHeaderObj.txA/self.dataOut.radarControllerHeaderObj.nBaud) / deltaHeight
215 window = (self.dataOut.radarControllerHeaderObj.txA/self.dataOut.radarControllerHeaderObj.nBaud) / deltaHeight
216
216
217 newdelta = deltaHeight * window
217 newdelta = deltaHeight * window
218 r = self.dataOut.nHeights % window
218 r = self.dataOut.nHeights % window
219
219
220 if dataOut.flagDataAsBlock:
220 if dataOut.flagDataAsBlock:
221 """
221 """
222 Si la data es obtenida por bloques, dimension = [nChannels, nProfiles, nHeis]
222 Si la data es obtenida por bloques, dimension = [nChannels, nProfiles, nHeis]
223 """
223 """
224 buffer = self.dataOut.data[:, :, 0:self.dataOut.nHeights-r]
224 buffer = self.dataOut.data[:, :, 0:self.dataOut.nHeights-r]
225 buffer = buffer.reshape(self.dataOut.nChannels,self.dataOut.nHeights,self.dataOut.nHeights/window,window)
225 buffer = buffer.reshape(self.dataOut.nChannels,self.dataOut.nHeights,self.dataOut.nHeights/window,window)
226 buffer = numpy.sum(buffer,3)
226 buffer = numpy.sum(buffer,3)
227
227
228 else:
228 else:
229 buffer = self.dataOut.data[:,0:self.dataOut.nHeights-r]
229 buffer = self.dataOut.data[:,0:self.dataOut.nHeights-r]
230 buffer = buffer.reshape(self.dataOut.nChannels,self.dataOut.nHeights/window,window)
230 buffer = buffer.reshape(self.dataOut.nChannels,self.dataOut.nHeights/window,window)
231 buffer = numpy.sum(buffer,2)
231 buffer = numpy.sum(buffer,2)
232
232
233 self.dataOut.data = buffer.copy()
233 self.dataOut.data = buffer.copy()
234 self.dataOut.heightList = numpy.arange(self.dataOut.heightList[0],newdelta*(self.dataOut.nHeights-r)/window,newdelta)
234 self.dataOut.heightList = numpy.arange(self.dataOut.heightList[0],newdelta*(self.dataOut.nHeights-r)/window,newdelta)
235 self.dataOut.windowOfFilter = window
235 self.dataOut.windowOfFilter = window
236
236
237 return 1
237 return 1
238
238
239 def deFlip(self, channelList = []):
239 def deFlip(self, channelList = []):
240
240
241 data = self.dataOut.data.copy()
241 data = self.dataOut.data.copy()
242
242
243 if self.dataOut.flagDataAsBlock:
243 if self.dataOut.flagDataAsBlock:
244 flip = self.flip
244 flip = self.flip
245 profileList = range(self.dataOut.nProfiles)
245 profileList = range(self.dataOut.nProfiles)
246
246
247 if channelList == []:
247 if channelList == []:
248 for thisProfile in profileList:
248 for thisProfile in profileList:
249 data[:,thisProfile,:] = data[:,thisProfile,:]*flip
249 data[:,thisProfile,:] = data[:,thisProfile,:]*flip
250 flip *= -1.0
250 flip *= -1.0
251 else:
251 else:
252 for thisChannel in channelList:
252 for thisChannel in channelList:
253 for thisProfile in profileList:
253 for thisProfile in profileList:
254 data[thisChannel,thisProfile,:] = data[thisChannel,thisProfile,:]*flip
254 data[thisChannel,thisProfile,:] = data[thisChannel,thisProfile,:]*flip
255 flip *= -1.0
255 flip *= -1.0
256
256
257 self.flip = flip
257 self.flip = flip
258
258
259 else:
259 else:
260 if channelList == []:
260 if channelList == []:
261 data[:,:] = data[:,:]*self.flip
261 data[:,:] = data[:,:]*self.flip
262 else:
262 else:
263 for thisChannel in channelList:
263 for thisChannel in channelList:
264 data[thisChannel,:] = data[thisChannel,:]*self.flip
264 data[thisChannel,:] = data[thisChannel,:]*self.flip
265
265
266 self.flip *= -1.
266 self.flip *= -1.
267
267
268 self.dataOut.data = data
268 self.dataOut.data = data
269
269
270
270
271
271
272 def setRadarFrequency(self, frequency=None):
272 def setRadarFrequency(self, frequency=None):
273
273
274 if frequency != None:
274 if frequency != None:
275 self.dataOut.frequency = frequency
275 self.dataOut.frequency = frequency
276
276
277 return 1
277 return 1
278
278
279 class CohInt(Operation):
279 class CohInt(Operation):
280
280
281 isConfig = False
281 isConfig = False
282
282
283 __profIndex = 0
283 __profIndex = 0
284 __withOverapping = False
284 __withOverapping = False
285
285
286 __byTime = False
286 __byTime = False
287 __initime = None
287 __initime = None
288 __lastdatatime = None
288 __lastdatatime = None
289 __integrationtime = None
289 __integrationtime = None
290
290
291 __buffer = None
291 __buffer = None
292
292
293 __dataReady = False
293 __dataReady = False
294
294
295 n = None
295 n = None
296
296
297
297
298 def __init__(self):
298 def __init__(self):
299
299
300 Operation.__init__(self)
300 Operation.__init__(self)
301
301
302 # self.isConfig = False
302 # self.isConfig = False
303
303
304 def setup(self, n=None, timeInterval=None, overlapping=False, byblock=False):
304 def setup(self, n=None, timeInterval=None, overlapping=False, byblock=False):
305 """
305 """
306 Set the parameters of the integration class.
306 Set the parameters of the integration class.
307
307
308 Inputs:
308 Inputs:
309
309
310 n : Number of coherent integrations
310 n : Number of coherent integrations
311 timeInterval : Time of integration. If the parameter "n" is selected this one does not work
311 timeInterval : Time of integration. If the parameter "n" is selected this one does not work
312 overlapping :
312 overlapping :
313
313
314 """
314 """
315
315
316 self.__initime = None
316 self.__initime = None
317 self.__lastdatatime = 0
317 self.__lastdatatime = 0
318 self.__buffer = None
318 self.__buffer = None
319 self.__dataReady = False
319 self.__dataReady = False
320 self.byblock = byblock
320 self.byblock = byblock
321
321
322 if n == None and timeInterval == None:
322 if n == None and timeInterval == None:
323 raise ValueError, "n or timeInterval should be specified ..."
323 raise ValueError, "n or timeInterval should be specified ..."
324
324
325 if n != None:
325 if n != None:
326 self.n = n
326 self.n = n
327 self.__byTime = False
327 self.__byTime = False
328 else:
328 else:
329 self.__integrationtime = timeInterval #* 60. #if (type(timeInterval)!=integer) -> change this line
329 self.__integrationtime = timeInterval #* 60. #if (type(timeInterval)!=integer) -> change this line
330 self.n = 9999
330 self.n = 9999
331 self.__byTime = True
331 self.__byTime = True
332
332
333 if overlapping:
333 if overlapping:
334 self.__withOverapping = True
334 self.__withOverapping = True
335 self.__buffer = None
335 self.__buffer = None
336 else:
336 else:
337 self.__withOverapping = False
337 self.__withOverapping = False
338 self.__buffer = 0
338 self.__buffer = 0
339
339
340 self.__profIndex = 0
340 self.__profIndex = 0
341
341
342 def putData(self, data):
342 def putData(self, data):
343
343
344 """
344 """
345 Add a profile to the __buffer and increase in one the __profileIndex
345 Add a profile to the __buffer and increase in one the __profileIndex
346
346
347 """
347 """
348
348
349 if not self.__withOverapping:
349 if not self.__withOverapping:
350 self.__buffer += data.copy()
350 self.__buffer += data.copy()
351 self.__profIndex += 1
351 self.__profIndex += 1
352 return
352 return
353
353
354 #Overlapping data
354 #Overlapping data
355 nChannels, nHeis = data.shape
355 nChannels, nHeis = data.shape
356 data = numpy.reshape(data, (1, nChannels, nHeis))
356 data = numpy.reshape(data, (1, nChannels, nHeis))
357
357
358 #If the buffer is empty then it takes the data value
358 #If the buffer is empty then it takes the data value
359 if self.__buffer == None:
359 if self.__buffer == None:
360 self.__buffer = data
360 self.__buffer = data
361 self.__profIndex += 1
361 self.__profIndex += 1
362 return
362 return
363
363
364 #If the buffer length is lower than n then stakcing the data value
364 #If the buffer length is lower than n then stakcing the data value
365 if self.__profIndex < self.n:
365 if self.__profIndex < self.n:
366 self.__buffer = numpy.vstack((self.__buffer, data))
366 self.__buffer = numpy.vstack((self.__buffer, data))
367 self.__profIndex += 1
367 self.__profIndex += 1
368 return
368 return
369
369
370 #If the buffer length is equal to n then replacing the last buffer value with the data value
370 #If the buffer length is equal to n then replacing the last buffer value with the data value
371 self.__buffer = numpy.roll(self.__buffer, -1, axis=0)
371 self.__buffer = numpy.roll(self.__buffer, -1, axis=0)
372 self.__buffer[self.n-1] = data
372 self.__buffer[self.n-1] = data
373 self.__profIndex = self.n
373 self.__profIndex = self.n
374 return
374 return
375
375
376
376
377 def pushData(self):
377 def pushData(self):
378 """
378 """
379 Return the sum of the last profiles and the profiles used in the sum.
379 Return the sum of the last profiles and the profiles used in the sum.
380
380
381 Affected:
381 Affected:
382
382
383 self.__profileIndex
383 self.__profileIndex
384
384
385 """
385 """
386
386
387 if not self.__withOverapping:
387 if not self.__withOverapping:
388 data = self.__buffer
388 data = self.__buffer
389 n = self.__profIndex
389 n = self.__profIndex
390
390
391 self.__buffer = 0
391 self.__buffer = 0
392 self.__profIndex = 0
392 self.__profIndex = 0
393
393
394 return data, n
394 return data, n
395
395
396 #Integration with Overlapping
396 #Integration with Overlapping
397 data = numpy.sum(self.__buffer, axis=0)
397 data = numpy.sum(self.__buffer, axis=0)
398 n = self.__profIndex
398 n = self.__profIndex
399
399
400 return data, n
400 return data, n
401
401
402 def byProfiles(self, data):
402 def byProfiles(self, data):
403
403
404 self.__dataReady = False
404 self.__dataReady = False
405 avgdata = None
405 avgdata = None
406 # n = None
406 # n = None
407
407
408 self.putData(data)
408 self.putData(data)
409
409
410 if self.__profIndex == self.n:
410 if self.__profIndex == self.n:
411
411
412 avgdata, n = self.pushData()
412 avgdata, n = self.pushData()
413 self.__dataReady = True
413 self.__dataReady = True
414
414
415 return avgdata
415 return avgdata
416
416
417 def byTime(self, data, datatime):
417 def byTime(self, data, datatime):
418
418
419 self.__dataReady = False
419 self.__dataReady = False
420 avgdata = None
420 avgdata = None
421 n = None
421 n = None
422
422
423 self.putData(data)
423 self.putData(data)
424
424
425 if (datatime - self.__initime) >= self.__integrationtime:
425 if (datatime - self.__initime) >= self.__integrationtime:
426 avgdata, n = self.pushData()
426 avgdata, n = self.pushData()
427 self.n = n
427 self.n = n
428 self.__dataReady = True
428 self.__dataReady = True
429
429
430 return avgdata
430 return avgdata
431
431
432 def integrate(self, data, datatime=None):
432 def integrate(self, data, datatime=None):
433
433
434 if self.__initime == None:
434 if self.__initime == None:
435 self.__initime = datatime
435 self.__initime = datatime
436
436
437 if self.__byTime:
437 if self.__byTime:
438 avgdata = self.byTime(data, datatime)
438 avgdata = self.byTime(data, datatime)
439 else:
439 else:
440 avgdata = self.byProfiles(data)
440 avgdata = self.byProfiles(data)
441
441
442
442
443 self.__lastdatatime = datatime
443 self.__lastdatatime = datatime
444
444
445 if avgdata == None:
445 if avgdata == None:
446 return None, None
446 return None, None
447
447
448 avgdatatime = self.__initime
448 avgdatatime = self.__initime
449
449
450 deltatime = datatime -self.__lastdatatime
450 deltatime = datatime -self.__lastdatatime
451
451
452 if not self.__withOverapping:
452 if not self.__withOverapping:
453 self.__initime = datatime
453 self.__initime = datatime
454 else:
454 else:
455 self.__initime += deltatime
455 self.__initime += deltatime
456
456
457 return avgdata, avgdatatime
457 return avgdata, avgdatatime
458
458
459 def integrateByBlock(self, dataOut):
459 def integrateByBlock(self, dataOut):
460
460
461 times = int(dataOut.data.shape[1]/self.n)
461 times = int(dataOut.data.shape[1]/self.n)
462 avgdata = numpy.zeros((dataOut.nChannels, times, dataOut.nHeights), dtype=numpy.complex)
462 avgdata = numpy.zeros((dataOut.nChannels, times, dataOut.nHeights), dtype=numpy.complex)
463
463
464 id_min = 0
464 id_min = 0
465 id_max = self.n
465 id_max = self.n
466
466
467 for i in range(times):
467 for i in range(times):
468 junk = dataOut.data[:,id_min:id_max,:]
468 junk = dataOut.data[:,id_min:id_max,:]
469 avgdata[:,i,:] = junk.sum(axis=1)
469 avgdata[:,i,:] = junk.sum(axis=1)
470 id_min += self.n
470 id_min += self.n
471 id_max += self.n
471 id_max += self.n
472
472
473 timeInterval = dataOut.ippSeconds*self.n
473 timeInterval = dataOut.ippSeconds*self.n
474 avgdatatime = (times - 1) * timeInterval + dataOut.utctime
474 avgdatatime = (times - 1) * timeInterval + dataOut.utctime
475 self.__dataReady = True
475 self.__dataReady = True
476 return avgdata, avgdatatime
476 return avgdata, avgdatatime
477
477
478 def run(self, dataOut, **kwargs):
478 def run(self, dataOut, **kwargs):
479
479
480 if not self.isConfig:
480 if not self.isConfig:
481 self.setup(**kwargs)
481 self.setup(**kwargs)
482 self.isConfig = True
482 self.isConfig = True
483
483
484 if dataOut.flagDataAsBlock:
484 if dataOut.flagDataAsBlock:
485 """
485 """
486 Si la data es leida por bloques, dimension = [nChannels, nProfiles, nHeis]
486 Si la data es leida por bloques, dimension = [nChannels, nProfiles, nHeis]
487 """
487 """
488 avgdata, avgdatatime = self.integrateByBlock(dataOut)
488 avgdata, avgdatatime = self.integrateByBlock(dataOut)
489 else:
489 else:
490 avgdata, avgdatatime = self.integrate(dataOut.data, dataOut.utctime)
490 avgdata, avgdatatime = self.integrate(dataOut.data, dataOut.utctime)
491
491
492 # dataOut.timeInterval *= n
492 # dataOut.timeInterval *= n
493 dataOut.flagNoData = True
493 dataOut.flagNoData = True
494
494
495 if self.__dataReady:
495 if self.__dataReady:
496 dataOut.data = avgdata
496 dataOut.data = avgdata
497 dataOut.nCohInt *= self.n
497 dataOut.nCohInt *= self.n
498 dataOut.utctime = avgdatatime
498 dataOut.utctime = avgdatatime
499 # dataOut.timeInterval = dataOut.ippSeconds * dataOut.nCohInt
499 # dataOut.timeInterval = dataOut.ippSeconds * dataOut.nCohInt
500 dataOut.flagNoData = False
500 dataOut.flagNoData = False
501
501
502 class Decoder(Operation):
502 class Decoder(Operation):
503
503
504 isConfig = False
504 isConfig = False
505 __profIndex = 0
505 __profIndex = 0
506
506
507 code = None
507 code = None
508
508
509 nCode = None
509 nCode = None
510 nBaud = None
510 nBaud = None
511
511
512
512
513 def __init__(self):
513 def __init__(self):
514
514
515 Operation.__init__(self)
515 Operation.__init__(self)
516
516
517 self.times = None
517 self.times = None
518 self.osamp = None
518 self.osamp = None
519 # self.__setValues = False
519 # self.__setValues = False
520 self.isConfig = False
520 self.isConfig = False
521
521
522 def setup(self, code, osamp, dataOut):
522 def setup(self, code, osamp, dataOut):
523
523
524 self.__profIndex = 0
524 self.__profIndex = 0
525
525
526 self.code = code
526 self.code = code
527
527
528 self.nCode = len(code)
528 self.nCode = len(code)
529 self.nBaud = len(code[0])
529 self.nBaud = len(code[0])
530
530
531 if (osamp != None) and (osamp >1):
531 if (osamp != None) and (osamp >1):
532 self.osamp = osamp
532 self.osamp = osamp
533 self.code = numpy.repeat(code, repeats=self.osamp, axis=1)
533 self.code = numpy.repeat(code, repeats=self.osamp, axis=1)
534 self.nBaud = self.nBaud*self.osamp
534 self.nBaud = self.nBaud*self.osamp
535
535
536 self.__nChannels = dataOut.nChannels
536 self.__nChannels = dataOut.nChannels
537 self.__nProfiles = dataOut.nProfiles
537 self.__nProfiles = dataOut.nProfiles
538 self.__nHeis = dataOut.nHeights
538 self.__nHeis = dataOut.nHeights
539
539
540 if dataOut.flagDataAsBlock:
540 if dataOut.flagDataAsBlock:
541
541
542 self.ndatadec = self.__nHeis - self.nBaud + 1
542 self.ndatadec = self.__nHeis #- self.nBaud + 1
543
543
544 self.datadecTime = numpy.zeros((self.__nChannels, self.__nProfiles, self.ndatadec), dtype=numpy.complex)
544 self.datadecTime = numpy.zeros((self.__nChannels, self.__nProfiles, self.ndatadec), dtype=numpy.complex)
545
545
546 else:
546 else:
547
547
548 __codeBuffer = numpy.zeros((self.nCode, self.__nHeis), dtype=numpy.complex)
548 __codeBuffer = numpy.zeros((self.nCode, self.__nHeis), dtype=numpy.complex)
549
549
550 __codeBuffer[:,0:self.nBaud] = self.code
550 __codeBuffer[:,0:self.nBaud] = self.code
551
551
552 self.fft_code = numpy.conj(numpy.fft.fft(__codeBuffer, axis=1))
552 self.fft_code = numpy.conj(numpy.fft.fft(__codeBuffer, axis=1))
553
553
554 self.ndatadec = self.__nHeis - self.nBaud + 1
554 self.ndatadec = self.__nHeis #- self.nBaud + 1
555
555
556 self.datadecTime = numpy.zeros((self.__nChannels, self.ndatadec), dtype=numpy.complex)
556 self.datadecTime = numpy.zeros((self.__nChannels, self.ndatadec), dtype=numpy.complex)
557
557
558 def convolutionInFreq(self, data):
558 def convolutionInFreq(self, data):
559
559
560 fft_code = self.fft_code[self.__profIndex].reshape(1,-1)
560 fft_code = self.fft_code[self.__profIndex].reshape(1,-1)
561
561
562 fft_data = numpy.fft.fft(data, axis=1)
562 fft_data = numpy.fft.fft(data, axis=1)
563
563
564 conv = fft_data*fft_code
564 conv = fft_data*fft_code
565
565
566 data = numpy.fft.ifft(conv,axis=1)
566 data = numpy.fft.ifft(conv,axis=1)
567
567
568 datadec = data[:,:-self.nBaud+1]
568 datadec = data#[:,:]
569
569
570 return datadec
570 return datadec
571
571
572 def convolutionInFreqOpt(self, data):
572 def convolutionInFreqOpt(self, data):
573
573
574 fft_code = self.fft_code[self.__profIndex].reshape(1,-1)
574 fft_code = self.fft_code[self.__profIndex].reshape(1,-1)
575
575
576 data = cfunctions.decoder(fft_code, data)
576 data = cfunctions.decoder(fft_code, data)
577
577
578 datadec = data[:,:-self.nBaud+1]
578 datadec = data#[:,:]
579
579
580 return datadec
580 return datadec
581
581
582 def convolutionInTime(self, data):
582 def convolutionInTime(self, data):
583
583
584 code = self.code[self.__profIndex]
584 code = self.code[self.__profIndex]
585
585
586 for i in range(self.__nChannels):
586 for i in range(self.__nChannels):
587 self.datadecTime[i,:] = numpy.correlate(data[i,:], code, mode='valid')
587 self.datadecTime[i,:] = numpy.correlate(data[i,:], code, mode='same')
588
588
589 return self.datadecTime
589 return self.datadecTime
590
590
591 def convolutionByBlockInTime(self, data):
591 def convolutionByBlockInTime(self, data):
592
592
593 repetitions = self.__nProfiles / self.nCode
593 repetitions = self.__nProfiles / self.nCode
594
594
595 junk = numpy.lib.stride_tricks.as_strided(self.code, (repetitions, self.code.size), (0, self.code.itemsize))
595 junk = numpy.lib.stride_tricks.as_strided(self.code, (repetitions, self.code.size), (0, self.code.itemsize))
596 junk = junk.flatten()
596 junk = junk.flatten()
597 code_block = numpy.reshape(junk, (self.nCode*repetitions, self.nBaud))
597 code_block = numpy.reshape(junk, (self.nCode*repetitions, self.nBaud))
598
598
599 for i in range(self.__nChannels):
599 for i in range(self.__nChannels):
600 for j in range(self.__nProfiles):
600 for j in range(self.__nProfiles):
601 self.datadecTime[i,j,:] = numpy.correlate(data[i,j,:], code_block[j,:], mode='valid')
601 self.datadecTime[i,j,:] = numpy.correlate(data[i,j,:], code_block[j,:], mode='same')
602
602
603 return self.datadecTime
603 return self.datadecTime
604
604
605 def run(self, dataOut, code=None, nCode=None, nBaud=None, mode = 0, times=None, osamp=None):
605 def run(self, dataOut, code=None, nCode=None, nBaud=None, mode = 0, times=None, osamp=None):
606
606
607 if not self.isConfig:
607 if not self.isConfig:
608
608
609 if code == None:
609 if code == None:
610 code = dataOut.code
610 code = dataOut.code
611 else:
611 else:
612 code = numpy.array(code).reshape(nCode,nBaud)
612 code = numpy.array(code).reshape(nCode,nBaud)
613
613
614 self.setup(code, osamp, dataOut)
614 self.setup(code, osamp, dataOut)
615
615
616 self.isConfig = True
616 self.isConfig = True
617
617
618 if dataOut.flagDataAsBlock:
618 if dataOut.flagDataAsBlock:
619 """
619 """
620 Decoding when data have been read as block,
620 Decoding when data have been read as block,
621 """
621 """
622 datadec = self.convolutionByBlockInTime(dataOut.data)
622 datadec = self.convolutionByBlockInTime(dataOut.data)
623
623
624 else:
624 else:
625 """
625 """
626 Decoding when data have been read profile by profile
626 Decoding when data have been read profile by profile
627 """
627 """
628 if mode == 0:
628 if mode == 0:
629 datadec = self.convolutionInTime(dataOut.data)
629 datadec = self.convolutionInTime(dataOut.data)
630
630
631 if mode == 1:
631 if mode == 1:
632 datadec = self.convolutionInFreq(dataOut.data)
632 datadec = self.convolutionInFreq(dataOut.data)
633
633
634 if mode == 2:
634 if mode == 2:
635 datadec = self.convolutionInFreqOpt(dataOut.data)
635 datadec = self.convolutionInFreqOpt(dataOut.data)
636
636
637 dataOut.code = code
637 dataOut.code = code
638 dataOut.nCode = nCode
638 dataOut.nCode = nCode
639 dataOut.nBaud = nBaud
639 dataOut.nBaud = nBaud
640 dataOut.radarControllerHeaderObj.code = code
640 dataOut.radarControllerHeaderObj.code = code
641 dataOut.radarControllerHeaderObj.nCode = nCode
641 dataOut.radarControllerHeaderObj.nCode = nCode
642 dataOut.radarControllerHeaderObj.nBaud = nBaud
642 dataOut.radarControllerHeaderObj.nBaud = nBaud
643
643
644 dataOut.data = datadec
644 dataOut.data = datadec
645
645
646 dataOut.heightList = dataOut.heightList[0:self.ndatadec]
646 dataOut.heightList = dataOut.heightList[0:self.ndatadec]
647
647
648 dataOut.flagDecodeData = True #asumo q la data esta decodificada
648 dataOut.flagDecodeData = True #asumo q la data esta decodificada
649
649
650 if self.__profIndex == self.nCode-1:
650 if self.__profIndex == self.nCode-1:
651 self.__profIndex = 0
651 self.__profIndex = 0
652 return 1
652 return 1
653
653
654 self.__profIndex += 1
654 self.__profIndex += 1
655
655
656 return 1
656 return 1
657 # dataOut.flagDeflipData = True #asumo q la data no esta sin flip
657 # dataOut.flagDeflipData = True #asumo q la data no esta sin flip
658
658
659
659
660 class ProfileConcat(Operation):
660 class ProfileConcat(Operation):
661
661
662 isConfig = False
662 isConfig = False
663 buffer = None
663 buffer = None
664
664
665 def __init__(self):
665 def __init__(self):
666
666
667 Operation.__init__(self)
667 Operation.__init__(self)
668 self.profileIndex = 0
668 self.profileIndex = 0
669
669
670 def reset(self):
670 def reset(self):
671 self.buffer = numpy.zeros_like(self.buffer)
671 self.buffer = numpy.zeros_like(self.buffer)
672 self.start_index = 0
672 self.start_index = 0
673 self.times = 1
673 self.times = 1
674
674
675 def setup(self, data, m, n=1):
675 def setup(self, data, m, n=1):
676 self.buffer = numpy.zeros((data.shape[0],data.shape[1]*m),dtype=type(data[0,0]))
676 self.buffer = numpy.zeros((data.shape[0],data.shape[1]*m),dtype=type(data[0,0]))
677 self.profiles = data.shape[1]
677 self.nHeights = data.nHeights
678 self.start_index = 0
678 self.start_index = 0
679 self.times = 1
679 self.times = 1
680
680
681 def concat(self, data):
681 def concat(self, data):
682
682
683 self.buffer[:,self.start_index:self.profiles*self.times] = data.copy()
683 self.buffer[:,self.start_index:self.profiles*self.times] = data.copy()
684 self.start_index = self.start_index + self.profiles
684 self.start_index = self.start_index + self.nHeights
685
685
686 def run(self, dataOut, m):
686 def run(self, dataOut, m):
687
687
688 dataOut.flagNoData = True
688 dataOut.flagNoData = True
689
689
690 if not self.isConfig:
690 if not self.isConfig:
691 self.setup(dataOut.data, m, 1)
691 self.setup(dataOut.data, m, 1)
692 self.isConfig = True
692 self.isConfig = True
693
693
694 if dataOut.flagDataAsBlock:
694 if dataOut.flagDataAsBlock:
695
695
696 raise ValueError, "ProfileConcat can only be used when voltage have been read profile by profiel, getBlock = False"
696 raise ValueError, "ProfileConcat can only be used when voltage have been read profile by profile, getBlock = False"
697
697
698 else:
698 else:
699 self.concat(dataOut.data)
699 self.concat(dataOut.data)
700 self.times += 1
700 self.times += 1
701 if self.times > m:
701 if self.times > m:
702 dataOut.data = self.buffer
702 dataOut.data = self.buffer
703 self.reset()
703 self.reset()
704 dataOut.flagNoData = False
704 dataOut.flagNoData = False
705 # se deben actualizar mas propiedades del header y del objeto dataOut, por ejemplo, las alturas
705 # se deben actualizar mas propiedades del header y del objeto dataOut, por ejemplo, las alturas
706 deltaHeight = dataOut.heightList[1] - dataOut.heightList[0]
706 deltaHeight = dataOut.heightList[1] - dataOut.heightList[0]
707 xf = dataOut.heightList[0] + dataOut.nHeights * deltaHeight * 5
707 xf = dataOut.heightList[0] + dataOut.nHeights * deltaHeight * m
708 dataOut.heightList = numpy.arange(dataOut.heightList[0], xf, deltaHeight)
708 dataOut.heightList = numpy.arange(dataOut.heightList[0], xf, deltaHeight)
709 dataOut.ippSeconds *= m
709
710
710 class ProfileSelector(Operation):
711 class ProfileSelector(Operation):
711
712
712 profileIndex = None
713 profileIndex = None
713 # Tamanho total de los perfiles
714 # Tamanho total de los perfiles
714 nProfiles = None
715 nProfiles = None
715
716
716 def __init__(self):
717 def __init__(self):
717
718
718 Operation.__init__(self)
719 Operation.__init__(self)
719 self.profileIndex = 0
720 self.profileIndex = 0
720
721
721 def incIndex(self):
722 def incIndex(self):
723
722 self.profileIndex += 1
724 self.profileIndex += 1
723
725
724 if self.profileIndex >= self.nProfiles:
726 if self.profileIndex >= self.nProfiles:
725 self.profileIndex = 0
727 self.profileIndex = 0
726
728
727 def isProfileInRange(self, minIndex, maxIndex):
729 def isThisProfileInRange(self, profileIndex, minIndex, maxIndex):
728
730
729 if self.profileIndex < minIndex:
731 if profileIndex < minIndex:
730 return False
732 return False
731
733
732 if self.profileIndex > maxIndex:
734 if profileIndex > maxIndex:
733 return False
735 return False
734
736
735 return True
737 return True
736
738
737 def isProfileInList(self, profileList):
739 def isThisProfileInList(self, profileIndex, profileList):
738
740
739 if self.profileIndex not in profileList:
741 if profileIndex not in profileList:
740 return False
742 return False
741
743
742 return True
744 return True
743
745
744 def run(self, dataOut, profileList=None, profileRangeList=None, beam=None, byblock=False):
746 def run(self, dataOut, profileList=None, profileRangeList=None, beam=None, byblock=False, rangeList = None):
745
747
746 """
748 """
747 ProfileSelector:
749 ProfileSelector:
748
750
751 Inputs:
752 profileList : Index of profiles selected. Example: profileList = (0,1,2,7,8)
753
754 profileRangeList : Minimum and maximum profile indexes. Example: profileRangeList = (4, 30)
755
756 rangeList : List of profile ranges. Example: rangeList = ((4, 30), (32, 64), (128, 256))
757
749 """
758 """
750
759
751 dataOut.flagNoData = True
760 dataOut.flagNoData = True
752 self.nProfiles = dataOut.nProfiles
761 self.nProfiles = dataOut.nProfiles
753
762
754 if dataOut.flagDataAsBlock:
763 if dataOut.flagDataAsBlock:
755 """
764 """
756 data dimension = [nChannels, nProfiles, nHeis]
765 data dimension = [nChannels, nProfiles, nHeis]
757 """
766 """
758 if profileList != None:
767 if profileList != None:
759 dataOut.data = dataOut.data[:,profileList,:]
768 dataOut.data = dataOut.data[:,profileList,:]
760 dataOut.nProfiles = len(profileList)
769 dataOut.nProfiles = len(profileList)
770 dataOut.profileIndex = dataOut.nProfiles - 1
761 else:
771 else:
762 pmin = profileRangeList[0]
772 minIndex = profileRangeList[0]
763 pmax = profileRangeList[1]
773 maxIndex = profileRangeList[1]
764 dataOut.data = dataOut.data[:,pmin:pmax+1,:]
765 dataOut.nProfiles = pmax - pmin + 1
766
774
775 dataOut.data = dataOut.data[:,minIndex:maxIndex+1,:]
776 dataOut.nProfiles = maxIndex - minIndex + 1
777 dataOut.profileIndex = dataOut.nProfiles - 1
767
778
768 dataOut.flagNoData = False
779 dataOut.flagNoData = False
769 self.profileIndex = 0
770
780
771 return True
781 return True
772
782
773 else:
783 else:
774 """
784 """
775 data dimension = [nChannels, nHeis]
785 data dimension = [nChannels, nHeis]
776
786
777 """
787 """
778 if profileList != None:
788 if profileList != None:
779
789
780 if self.isProfileInList(profileList):
790 dataOut.nProfiles = len(profileList)
791
792 if self.isThisProfileInList(dataOut.profileIndex, profileList):
781 dataOut.flagNoData = False
793 dataOut.flagNoData = False
794 dataOut.profileIndex = self.profileIndex
782
795
783 self.incIndex()
796 self.incIndex()
784 return 1
797 return True
785
798
786
799
787 if profileRangeList != None:
800 if profileRangeList != None:
788
801
789 minIndex = profileRangeList[0]
802 minIndex = profileRangeList[0]
790 maxIndex = profileRangeList[1]
803 maxIndex = profileRangeList[1]
791 if self.isProfileInRange(minIndex, maxIndex):
804
805 dataOut.nProfiles = maxIndex - minIndex + 1
806
807 if self.isThisProfileInRange(dataOut.profileIndex, minIndex, maxIndex):
792 dataOut.flagNoData = False
808 dataOut.flagNoData = False
809 dataOut.profileIndex = self.profileIndex
793
810
794 self.incIndex()
811 self.incIndex()
795 return 1
812 return True
813
814 if rangeList != None:
815
816 nProfiles = 0
817
818 for thisRange in rangeList:
819 minIndex = thisRange[0]
820 maxIndex = thisRange[1]
821
822 nProfiles += maxIndex - minIndex + 1
823
824 dataOut.nProfiles = nProfiles
825
826 for thisRange in rangeList:
827
828 minIndex = thisRange[0]
829 maxIndex = thisRange[1]
830
831 if self.isThisProfileInRange(dataOut.profileIndex, minIndex, maxIndex):
832
833 # print "profileIndex = ", dataOut.profileIndex
834
835 dataOut.flagNoData = False
836 dataOut.profileIndex = self.profileIndex
837
838 self.incIndex()
839 break
840 return True
841
796
842
797 if beam != None: #beam is only for AMISR data
843 if beam != None: #beam is only for AMISR data
798 if self.isProfileInList(dataOut.beamRangeDict[beam]):
844 if self.isThisProfileInList(dataOut.profileIndex, dataOut.beamRangeDict[beam]):
799 dataOut.flagNoData = False
845 dataOut.flagNoData = False
846 dataOut.profileIndex = self.profileIndex
800
847
801 self.incIndex()
848 self.incIndex()
802 return 1
849 return 1
803
850
804 raise ValueError, "ProfileSelector needs profileList or profileRangeList"
851 raise ValueError, "ProfileSelector needs profileList or profileRangeList"
805
852
806 return 0
853 return 0
807
854
808
855
809
856
810 class Reshaper(Operation):
857 class Reshaper(Operation):
811
858
812 def __init__(self):
859 def __init__(self):
813
860
814 Operation.__init__(self)
861 Operation.__init__(self)
815 self.updateNewHeights = True
862 self.updateNewHeights = True
816
863
817 def run(self, dataOut, shape):
864 def run(self, dataOut, shape):
818
865
819 if not dataOut.flagDataAsBlock:
866 if not dataOut.flagDataAsBlock:
820 raise ValueError, "Reshaper can only be used when voltage have been read as Block, getBlock = True"
867 raise ValueError, "Reshaper can only be used when voltage have been read as Block, getBlock = True"
821
868
822 if len(shape) != 3:
869 if len(shape) != 3:
823 raise ValueError, "shape len should be equal to 3, (nChannels, nProfiles, nHeis)"
870 raise ValueError, "shape len should be equal to 3, (nChannels, nProfiles, nHeis)"
824
871
825 shape_tuple = tuple(shape)
872 shape_tuple = tuple(shape)
826 dataOut.data = numpy.reshape(dataOut.data, shape_tuple)
873 dataOut.data = numpy.reshape(dataOut.data, shape_tuple)
827 dataOut.flagNoData = False
874 dataOut.flagNoData = False
828
875
829 if self.updateNewHeights:
876 if self.updateNewHeights:
830
877
831 old_nheights = dataOut.nHeights
878 old_nheights = dataOut.nHeights
832 new_nheights = dataOut.data.shape[2]
879 new_nheights = dataOut.data.shape[2]
833 factor = 1.0*new_nheights / old_nheights
880 factor = 1.0*new_nheights / old_nheights
834
881
835 deltaHeight = dataOut.heightList[1] - dataOut.heightList[0]
882 deltaHeight = dataOut.heightList[1] - dataOut.heightList[0]
836
883
837 xf = dataOut.heightList[0] + dataOut.nHeights * deltaHeight * factor
884 xf = dataOut.heightList[0] + dataOut.nHeights * deltaHeight * factor
838
885
839 dataOut.heightList = numpy.arange(dataOut.heightList[0], xf, deltaHeight)
886 dataOut.heightList = numpy.arange(dataOut.heightList[0], xf, deltaHeight)
840
887
841 dataOut.nProfiles = dataOut.data.shape[1]
888 dataOut.nProfiles = dataOut.data.shape[1]
889
890 dataOut.ippSeconds *= factor No newline at end of file
General Comments 0
You need to be logged in to leave comments. Login now