##// END OF EJS Templates
Miguel Valdez -
r98:e2f0a078c091
parent child
Show More
@@ -1,30 +1,25
1 '''
1 '''
2 Created on 23/01/2012
2 Created on 23/01/2012
3
3
4 @author $Author$
4 @author $Author$
5 @version $Id$
5 @version $Id$
6 '''
6 '''
7
7
8 from DataIO import DataReader
8 from JRODataIO import JRODataIO
9 from DataIO import DataWriter
10
9
11 class CorrelationReader(DataReader):
10 class CorrelationReader(JRODataIO):
12
11
13 def __init__(self):
12 def __init__(self):
14
13
15 pass
14 pass
16
15
17 class CorrelationWriter(DataWriter):
16 class CorrelationWriter(JRODataIO):
18
17
19 def __init__(self):
18 def __init__(self):
20
21 pass
19 pass
22
20
23 def puData(self):
21 def putData(self):
24 pass
22 pass
25
23
26 def writeBlock(self):
24 def writeBlock(self):
27 pass
25 pass No newline at end of file
28
29
30 No newline at end of file
@@ -1,1219 +1,1219
1 '''
1 '''
2 Created on 23/01/2012
2 Created on 23/01/2012
3
3
4 @author $Author$
4 @author $Author$
5 @version $Id$
5 @version $Id$
6 @version $Id$
6 @version $Id$
7 '''
7 '''
8
8
9 import os, sys
9 import os, sys
10 import glob
10 import glob
11 import time
11 import time
12 import numpy
12 import numpy
13 import fnmatch
13 import fnmatch
14 import time, datetime
14 import time, datetime
15
15
16 path = os.path.split(os.getcwd())[0]
16 path = os.path.split(os.getcwd())[0]
17 sys.path.append(path)
17 sys.path.append(path)
18
18
19 from Model.JROHeader import *
19 from Model.JROHeader import *
20 from Model.JROData import JROData
20 from Model.JROData import JROData
21
21
22 def checkForRealPath(path, year, doy, set, ext):
22 def checkForRealPath(path, year, doy, set, ext):
23 """
23 """
24 Por ser Linux Case Sensitive entonces checkForRealPath encuentra el nombre correcto de un path,
24 Por ser Linux Case Sensitive entonces checkForRealPath encuentra el nombre correcto de un path,
25 Prueba por varias combinaciones de nombres entre mayusculas y minusculas para determinar
25 Prueba por varias combinaciones de nombres entre mayusculas y minusculas para determinar
26 el path exacto de un determinado file.
26 el path exacto de un determinado file.
27
27
28 Example :
28 Example :
29 nombre correcto del file es .../.../D2009307/P2009307367.ext
29 nombre correcto del file es .../.../D2009307/P2009307367.ext
30
30
31 Entonces la funcion prueba con las siguientes combinaciones
31 Entonces la funcion prueba con las siguientes combinaciones
32 .../.../x2009307/y2009307367.ext
32 .../.../x2009307/y2009307367.ext
33 .../.../x2009307/Y2009307367.ext
33 .../.../x2009307/Y2009307367.ext
34 .../.../X2009307/y2009307367.ext
34 .../.../X2009307/y2009307367.ext
35 .../.../X2009307/Y2009307367.ext
35 .../.../X2009307/Y2009307367.ext
36 siendo para este caso, la ultima combinacion de letras, identica al file buscado
36 siendo para este caso, la ultima combinacion de letras, identica al file buscado
37
37
38 Return:
38 Return:
39 Si encuentra la cobinacion adecuada devuelve el path completo y el nombre del file
39 Si encuentra la cobinacion adecuada devuelve el path completo y el nombre del file
40 caso contrario devuelve None como path y el la ultima combinacion de nombre en mayusculas
40 caso contrario devuelve None como path y el la ultima combinacion de nombre en mayusculas
41 para el filename
41 para el filename
42 """
42 """
43 filepath = None
43 filepath = None
44 find_flag = False
44 find_flag = False
45 filename = None
45 filename = None
46
46
47 if ext.lower() == ".r": #voltage
47 if ext.lower() == ".r": #voltage
48 header1 = "dD"
48 header1 = "dD"
49 header2 = "dD"
49 header2 = "dD"
50 elif ext.lower() == ".pdata": #spectra
50 elif ext.lower() == ".pdata": #spectra
51 header1 = "dD"
51 header1 = "dD"
52 header2 = "pP"
52 header2 = "pP"
53 else:
53 else:
54 return None, filename
54 return None, filename
55
55
56 for dir in header1: #barrido por las dos combinaciones posibles de "D"
56 for dir in header1: #barrido por las dos combinaciones posibles de "D"
57 for fil in header2: #barrido por las dos combinaciones posibles de "D"
57 for fil in header2: #barrido por las dos combinaciones posibles de "D"
58 doypath = "%s%04d%03d" % ( dir, year, doy ) #formo el nombre del directorio xYYYYDDD (x=d o x=D)
58 doypath = "%s%04d%03d" % ( dir, year, doy ) #formo el nombre del directorio xYYYYDDD (x=d o x=D)
59 filename = "%s%04d%03d%03d%s" % ( fil, year, doy, set, ext ) #formo el nombre del file xYYYYDDDSSS.ext
59 filename = "%s%04d%03d%03d%s" % ( fil, year, doy, set, ext ) #formo el nombre del file xYYYYDDDSSS.ext
60 filepath = os.path.join( path, doypath, filename ) #formo el path completo
60 filepath = os.path.join( path, doypath, filename ) #formo el path completo
61 if os.path.exists( filepath ): #verifico que exista
61 if os.path.exists( filepath ): #verifico que exista
62 find_flag = True
62 find_flag = True
63 break
63 break
64 if find_flag:
64 if find_flag:
65 break
65 break
66
66
67 if not(find_flag):
67 if not(find_flag):
68 return None, filename
68 return None, filename
69
69
70 return filepath, filename
70 return filepath, filename
71
71
72
72
73 def isNumber(str):
73 def isNumber(str):
74 """
74 """
75 Chequea si el conjunto de caracteres que componen un string puede ser convertidos a un numero.
75 Chequea si el conjunto de caracteres que componen un string puede ser convertidos a un numero.
76
76
77 Excepciones:
77 Excepciones:
78 Si un determinado string no puede ser convertido a numero
78 Si un determinado string no puede ser convertido a numero
79 Input:
79 Input:
80 str, string al cual se le analiza para determinar si convertible a un numero o no
80 str, string al cual se le analiza para determinar si convertible a un numero o no
81
81
82 Return:
82 Return:
83 True : si el string es uno numerico
83 True : si el string es uno numerico
84 False : no es un string numerico
84 False : no es un string numerico
85 """
85 """
86 try:
86 try:
87 float( str )
87 float( str )
88 return True
88 return True
89 except:
89 except:
90 return False
90 return False
91
91
92
92
93 def isThisFileinRange(filename, startUTSeconds, endUTSeconds):
93 def isThisFileinRange(filename, startUTSeconds, endUTSeconds):
94 """
94 """
95 Esta funcion determina si un archivo de datos se encuentra o no dentro del rango de fecha especificado.
95 Esta funcion determina si un archivo de datos se encuentra o no dentro del rango de fecha especificado.
96
96
97 Inputs:
97 Inputs:
98 filename : nombre completo del archivo de datos en formato Jicamarca (.r)
98 filename : nombre completo del archivo de datos en formato Jicamarca (.r)
99
99
100 startUTSeconds : fecha inicial del rango seleccionado. La fecha esta dada en
100 startUTSeconds : fecha inicial del rango seleccionado. La fecha esta dada en
101 segundos contados desde 01/01/1970.
101 segundos contados desde 01/01/1970.
102 endUTSeconds : fecha final del rango seleccionado. La fecha esta dada en
102 endUTSeconds : fecha final del rango seleccionado. La fecha esta dada en
103 segundos contados desde 01/01/1970.
103 segundos contados desde 01/01/1970.
104
104
105 Return:
105 Return:
106 Boolean : Retorna True si el archivo de datos contiene datos en el rango de
106 Boolean : Retorna True si el archivo de datos contiene datos en el rango de
107 fecha especificado, de lo contrario retorna False.
107 fecha especificado, de lo contrario retorna False.
108
108
109 Excepciones:
109 Excepciones:
110 Si el archivo no existe o no puede ser abierto
110 Si el archivo no existe o no puede ser abierto
111 Si la cabecera no puede ser leida.
111 Si la cabecera no puede ser leida.
112
112
113 """
113 """
114 m_BasicHeader = BasicHeader()
114 m_BasicHeader = BasicHeader()
115
115
116 try:
116 try:
117 fp = open(filename,'rb')
117 fp = open(filename,'rb')
118 except:
118 except:
119 raise IOError, "The file %s can't be opened" %(filename)
119 raise IOError, "The file %s can't be opened" %(filename)
120
120
121 sts = m_BasicHeader.read(fp)
121 sts = m_BasicHeader.read(fp)
122 fp.close()
122 fp.close()
123
123
124 if not(sts):
124 if not(sts):
125 print "Skipping the file %s because it has not a valid header" %(filename)
125 print "Skipping the file %s because it has not a valid header" %(filename)
126 return 0
126 return 0
127
127
128 if not ((startUTSeconds <= m_BasicHeader.utc) and (endUTSeconds > m_BasicHeader.utc)):
128 if not ((startUTSeconds <= m_BasicHeader.utc) and (endUTSeconds > m_BasicHeader.utc)):
129 return 0
129 return 0
130
130
131 return 1
131 return 1
132
132
133
133
134 def getlastFileFromPath(path, ext):
134 def getlastFileFromPath(path, ext):
135 """
135 """
136 Depura el fileList dejando solo los que cumplan el formato de "PYYYYDDDSSS.ext"
136 Depura el fileList dejando solo los que cumplan el formato de "PYYYYDDDSSS.ext"
137 al final de la depuracion devuelve el ultimo file de la lista que quedo.
137 al final de la depuracion devuelve el ultimo file de la lista que quedo.
138
138
139 Input:
139 Input:
140 fileList : lista conteniendo todos los files (sin path) que componen una determinada carpeta
140 fileList : lista conteniendo todos los files (sin path) que componen una determinada carpeta
141 ext : extension de los files contenidos en una carpeta
141 ext : extension de los files contenidos en una carpeta
142
142
143 Return:
143 Return:
144 El ultimo file de una determinada carpeta, no se considera el path.
144 El ultimo file de una determinada carpeta, no se considera el path.
145 """
145 """
146 validFilelist = []
146 validFilelist = []
147 fileList = os.listdir(path)
147 fileList = os.listdir(path)
148
148
149 # 0 1234 567 89A BCDE
149 # 0 1234 567 89A BCDE
150 # H YYYY DDD SSS .ext
150 # H YYYY DDD SSS .ext
151
151
152 for file in fileList:
152 for file in fileList:
153 try:
153 try:
154 year = int(file[1:5])
154 year = int(file[1:5])
155 doy = int(file[5:8])
155 doy = int(file[5:8])
156
156
157 if (os.path.splitext(file)[-1].upper() != ext.upper()) : continue
157 if (os.path.splitext(file)[-1].upper() != ext.upper()) : continue
158 except:
158 except:
159 continue
159 continue
160
160
161 validFilelist.append(file)
161 validFilelist.append(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 class JRODataIO():
169 class JRODataIO:
170
170
171 #speed of light
171 #speed of light
172 c = 3E8
172 c = 3E8
173
173
174 m_BasicHeader = BasicHeader()
174 m_BasicHeader = BasicHeader()
175
175
176 m_SystemHeader = SystemHeader()
176 m_SystemHeader = SystemHeader()
177
177
178 m_RadarControllerHeader = RadarControllerHeader()
178 m_RadarControllerHeader = RadarControllerHeader()
179
179
180 m_ProcessingHeader = ProcessingHeader()
180 m_ProcessingHeader = ProcessingHeader()
181
181
182 m_DataObj = None
182 m_DataObj = None
183
183
184 online = 0
184 online = 0
185
185
186 fp = None
186 fp = None
187
187
188 dataType = None
188 dataType = None
189
189
190 fileSizeByHeader = None
190 fileSizeByHeader = None
191
191
192 filenameList = []
192 filenameList = []
193
193
194 filename = None
194 filename = None
195
195
196 fileSize = None
196 fileSize = None
197
197
198 firstHeaderSize = 0
198 firstHeaderSize = 0
199
199
200 basicHeaderSize = 24
200 basicHeaderSize = 24
201
201
202 nTotalBlocks = 0
202 nTotalBlocks = 0
203
203
204 ippSeconds = 0
204 ippSeconds = 0
205
205
206 blocksize = 0
206 blocksize = 0
207
207
208 set = 0
208 set = 0
209
209
210 ext = None
210 ext = None
211
211
212 path = None
212 path = None
213
213
214 maxTimeStep = 30
214 maxTimeStep = 30
215
215
216
216
217 delay = 3 #seconds
217 delay = 3 #seconds
218
218
219 nTries = 3 #quantity tries
219 nTries = 3 #quantity tries
220
220
221 nFiles = 3 #number of files for searching
221 nFiles = 3 #number of files for searching
222
222
223
223
224 flagNoMoreFiles = 0
224 flagNoMoreFiles = 0
225
225
226 flagIsNewFile = 1
226 flagIsNewFile = 1
227
227
228 flagResetProcessing = 0
228 flagResetProcessing = 0
229
229
230 flagIsNewBlock = 0
230 flagIsNewBlock = 0
231
231
232 def __init__(self):
232 def __init__(self):
233 pass
233 pass
234
234
235 class JRODataReader(JRODataIO):
235 class JRODataReader(JRODataIO):
236
236
237 """
237 """
238 Esta clase es usada como la clase padre de las clases VoltageReader y SpectraReader.
238 Esta clase es usada como la clase padre de las clases VoltageReader y SpectraReader.
239 Contiene todos lo metodos necesarios para leer datos desde archivos en formato
239 Contiene todos lo metodos necesarios para leer datos desde archivos en formato
240 jicamarca o pdata (.r o .pdata). La lectura de los datos siempre se realiza por bloques. Los datos
240 jicamarca o pdata (.r o .pdata). La lectura de los datos siempre se realiza por bloques. Los datos
241 leidos son array de 3 dimensiones:
241 leidos son array de 3 dimensiones:
242
242
243 Para Voltajes - perfiles * alturas * canales
243 Para Voltajes - perfiles * alturas * canales
244
244
245 Para Spectra - paresCanalesIguales * alturas * perfiles (Self Spectra)
245 Para Spectra - paresCanalesIguales * alturas * perfiles (Self Spectra)
246 paresCanalesDiferentes * alturas * perfiles (Cross Spectra)
246 paresCanalesDiferentes * alturas * perfiles (Cross Spectra)
247 canales * alturas (DC Channels)
247 canales * alturas (DC Channels)
248
248
249 y son almacenados en su buffer respectivo.
249 y son almacenados en su buffer respectivo.
250
250
251 Esta clase contiene instancias (objetos) de las clases BasicHeader, SystemHeader,
251 Esta clase contiene instancias (objetos) de las clases BasicHeader, SystemHeader,
252 RadarControllerHeader y DataObj. Los tres primeros se usan para almacenar informacion de la
252 RadarControllerHeader y DataObj. Los tres primeros se usan para almacenar informacion de la
253 cabecera de datos (metadata), y el cuarto (DataObj) para obtener y almacenar los datos desde
253 cabecera de datos (metadata), y el cuarto (DataObj) para obtener y almacenar los datos desde
254 el buffer de datos cada vez que se ejecute el metodo "getData".
254 el buffer de datos cada vez que se ejecute el metodo "getData".
255 """
255 """
256
256
257 nReadBlocks = 0
257 nReadBlocks = 0
258
258
259 def __init__(self, m_DataObj=None):
259 def __init__(self, m_DataObj=None):
260
260
261 raise ValueError, "This class can't be instanced"
261 raise ValueError, "This class can't be instanced"
262
262
263
263
264 def hasNotDataInBuffer(self):
264 def hasNotDataInBuffer(self):
265
265
266 raise ValueError, "Not implemented"
266 raise ValueError, "Not implemented"
267
267
268 def getBlockDimension(self):
268 def getBlockDimension(self):
269
269
270 raise ValueError, "No implemented"
270 raise ValueError, "No implemented"
271
271
272 def readBlock(self):
272 def readBlock(self):
273
273
274 self.nTotalBlocks += 1
274 self.nTotalBlocks += 1
275 self.nReadBlocks += 1
275 self.nReadBlocks += 1
276
276
277 raise ValueError, "This method has not been implemented"
277 raise ValueError, "This method has not been implemented"
278
278
279 def getData( self ):
279 def getData( self ):
280
280
281 raise ValueError, "This method has not been implemented"
281 raise ValueError, "This method has not been implemented"
282
282
283
283
284 def __rdSystemHeader(self, fp=None):
284 def __rdSystemHeader(self, fp=None):
285
285
286 if fp == None:
286 if fp == None:
287 fp = self.fp
287 fp = self.fp
288
288
289 self.m_SystemHeader.read(fp)
289 self.m_SystemHeader.read(fp)
290
290
291
291
292 def __rdRadarControllerHeader(self, fp=None):
292 def __rdRadarControllerHeader(self, fp=None):
293 if fp == None:
293 if fp == None:
294 fp = self.fp
294 fp = self.fp
295
295
296 self.m_RadarControllerHeader.read(fp)
296 self.m_RadarControllerHeader.read(fp)
297
297
298
298
299 def __rdProcessingHeader(self, fp=None):
299 def __rdProcessingHeader(self, fp=None):
300 if fp == None:
300 if fp == None:
301 fp = self.fp
301 fp = self.fp
302
302
303 self.m_ProcessingHeader.read(fp)
303 self.m_ProcessingHeader.read(fp)
304
304
305
305
306 def __rdBasicHeader(self, fp=None):
306 def __rdBasicHeader(self, fp=None):
307
307
308 if fp == None:
308 if fp == None:
309 fp = self.fp
309 fp = self.fp
310
310
311 self.m_BasicHeader.read(fp)
311 self.m_BasicHeader.read(fp)
312
312
313 def __readFirstHeader(self):
313 def __readFirstHeader(self):
314 """
314 """
315 Lectura del First Header, es decir el Basic Header y el Long Header
315 Lectura del First Header, es decir el Basic Header y el Long Header
316
316
317 Affected:
317 Affected:
318 self.m_BasicHeader
318 self.m_BasicHeader
319 self.m_SystemHeader
319 self.m_SystemHeader
320 self.m_RadarControllerHeader
320 self.m_RadarControllerHeader
321 self.m_ProcessingHeader
321 self.m_ProcessingHeader
322 self.firstHeaderSize
322 self.firstHeaderSize
323 self.dataType
323 self.dataType
324 self.fileSizeByHeader
324 self.fileSizeByHeader
325 self.ippSeconds
325 self.ippSeconds
326
326
327 Return:
327 Return:
328 None
328 None
329 """
329 """
330 self.__rdBasicHeader()
330 self.__rdBasicHeader()
331 self.__rdSystemHeader()
331 self.__rdSystemHeader()
332 self.__rdRadarControllerHeader()
332 self.__rdRadarControllerHeader()
333 self.__rdProcessingHeader()
333 self.__rdProcessingHeader()
334 self.firstHeaderSize = self.m_BasicHeader.size
334 self.firstHeaderSize = self.m_BasicHeader.size
335
335
336 datatype = int(numpy.log2((self.m_ProcessingHeader.processFlags & PROCFLAG.DATATYPE_MASK))-numpy.log2(PROCFLAG.DATATYPE_CHAR))
336 datatype = int(numpy.log2((self.m_ProcessingHeader.processFlags & PROCFLAG.DATATYPE_MASK))-numpy.log2(PROCFLAG.DATATYPE_CHAR))
337 if datatype == 0:
337 if datatype == 0:
338 datatype_str = numpy.dtype([('real','<i1'),('imag','<i1')])
338 datatype_str = numpy.dtype([('real','<i1'),('imag','<i1')])
339
339
340 elif datatype == 1:
340 elif datatype == 1:
341 datatype_str = numpy.dtype([('real','<i2'),('imag','<i2')])
341 datatype_str = numpy.dtype([('real','<i2'),('imag','<i2')])
342
342
343 elif datatype == 2:
343 elif datatype == 2:
344 datatype_str = numpy.dtype([('real','<i4'),('imag','<i4')])
344 datatype_str = numpy.dtype([('real','<i4'),('imag','<i4')])
345
345
346 elif datatype == 3:
346 elif datatype == 3:
347 datatype_str = numpy.dtype([('real','<i8'),('imag','<i8')])
347 datatype_str = numpy.dtype([('real','<i8'),('imag','<i8')])
348
348
349 elif datatype == 4:
349 elif datatype == 4:
350 datatype_str = numpy.dtype([('real','<f4'),('imag','<f4')])
350 datatype_str = numpy.dtype([('real','<f4'),('imag','<f4')])
351
351
352 elif datatype == 5:
352 elif datatype == 5:
353 datatype_str = numpy.dtype([('real','<f8'),('imag','<f8')])
353 datatype_str = numpy.dtype([('real','<f8'),('imag','<f8')])
354
354
355 else:
355 else:
356 raise ValueError, 'Data type was not defined'
356 raise ValueError, 'Data type was not defined'
357
357
358 self.dataType = datatype_str
358 self.dataType = datatype_str
359 self.ippSeconds = 2 * 1000 * self.m_RadarControllerHeader.ipp / self.c
359 self.ippSeconds = 2 * 1000 * self.m_RadarControllerHeader.ipp / self.c
360
360
361 self.fileSizeByHeader = self.m_ProcessingHeader.dataBlocksPerFile * self.m_ProcessingHeader.blockSize + self.firstHeaderSize + self.basicHeaderSize*(self.m_ProcessingHeader.dataBlocksPerFile - 1)
361 self.fileSizeByHeader = self.m_ProcessingHeader.dataBlocksPerFile * self.m_ProcessingHeader.blockSize + self.firstHeaderSize + self.basicHeaderSize*(self.m_ProcessingHeader.dataBlocksPerFile - 1)
362
362
363 self.getBlockDimension()
363 self.getBlockDimension()
364
364
365
365
366 def __setNewBlock(self):
366 def __setNewBlock(self):
367 """
367 """
368 Lee el Basic Header y posiciona le file pointer en la posicion inicial del bloque a leer
368 Lee el Basic Header y posiciona le file pointer en la posicion inicial del bloque a leer
369
369
370 Affected:
370 Affected:
371 self.m_BasicHeader
371 self.m_BasicHeader
372 self.flagNoContinuousBlock
372 self.flagNoContinuousBlock
373 self.ns
373 self.ns
374
374
375 Return:
375 Return:
376 0 : Si el file no tiene un Basic Header que pueda ser leido
376 0 : Si el file no tiene un Basic Header que pueda ser leido
377 1 : Si se pudo leer el Basic Header
377 1 : Si se pudo leer el Basic Header
378 """
378 """
379 if self.fp == None:
379 if self.fp == None:
380 return 0
380 return 0
381
381
382 if self.flagIsNewFile:
382 if self.flagIsNewFile:
383 return 1
383 return 1
384
384
385 self.lastUTTime = self.m_BasicHeader.utc
385 self.lastUTTime = self.m_BasicHeader.utc
386
386
387 currentSize = self.fileSize - self.fp.tell()
387 currentSize = self.fileSize - self.fp.tell()
388 neededSize = self.m_ProcessingHeader.blockSize + self.basicHeaderSize
388 neededSize = self.m_ProcessingHeader.blockSize + self.basicHeaderSize
389
389
390 #If there is enough data setting new data block
390 #If there is enough data setting new data block
391 if ( currentSize >= neededSize ):
391 if ( currentSize >= neededSize ):
392 self.__rdBasicHeader()
392 self.__rdBasicHeader()
393 return 1
393 return 1
394
394
395 #si es OnLine y ademas aun no se han leido un bloque completo entonces se espera por uno valido
395 #si es OnLine y ademas aun no se han leido un bloque completo entonces se espera por uno valido
396 if self.online and (self.nReadBlocks < self.m_ProcessingHeader.dataBlocksPerFile):
396 if self.online and (self.nReadBlocks < self.m_ProcessingHeader.dataBlocksPerFile):
397
397
398 fpointer = self.fp.tell()
398 fpointer = self.fp.tell()
399
399
400 for nTries in range( self.nTries ):
400 for nTries in range( self.nTries ):
401 #self.fp.close()
401 #self.fp.close()
402
402
403 print "\tWaiting %0.2f seconds for the next block, try %03d ..." % (self.delay, nTries+1)
403 print "\tWaiting %0.2f seconds for the next block, try %03d ..." % (self.delay, nTries+1)
404 time.sleep( self.delay )
404 time.sleep( self.delay )
405
405
406 #self.fp = open( self.filename, 'rb' )
406 #self.fp = open( self.filename, 'rb' )
407 #self.fp.seek( fpointer )
407 #self.fp.seek( fpointer )
408
408
409 self.fileSize = os.path.getsize( self.filename )
409 self.fileSize = os.path.getsize( self.filename )
410 currentSize = self.fileSize - fpointer
410 currentSize = self.fileSize - fpointer
411
411
412 if ( currentSize >= neededSize ):
412 if ( currentSize >= neededSize ):
413 self.__rdBasicHeader()
413 self.__rdBasicHeader()
414 return 1
414 return 1
415
415
416 #Setting new file
416 #Setting new file
417 if not( self.setNextFile() ):
417 if not( self.setNextFile() ):
418 return 0
418 return 0
419
419
420 deltaTime = self.m_BasicHeader.utc - self.lastUTTime # check this
420 deltaTime = self.m_BasicHeader.utc - self.lastUTTime # check this
421
421
422 self.flagResetProcessing = 0
422 self.flagResetProcessing = 0
423
423
424 if deltaTime > self.maxTimeStep:
424 if deltaTime > self.maxTimeStep:
425 self.flagResetProcessing = 1
425 self.flagResetProcessing = 1
426
426
427 return 1
427 return 1
428
428
429 def readNextBlock(self):
429 def readNextBlock(self):
430 """
430 """
431 Establece un nuevo bloque de datos a leer y los lee, si es que no existiese
431 Establece un nuevo bloque de datos a leer y los lee, si es que no existiese
432 mas bloques disponibles en el archivo actual salta al siguiente.
432 mas bloques disponibles en el archivo actual salta al siguiente.
433
433
434 Affected:
434 Affected:
435 self.lastUTTime
435 self.lastUTTime
436
436
437 Return: None
437 Return: None
438 """
438 """
439
439
440 if not(self.__setNewBlock()):
440 if not(self.__setNewBlock()):
441 return 0
441 return 0
442
442
443 if not(self.readBlock()):
443 if not(self.readBlock()):
444 return 0
444 return 0
445
445
446 return 1
446 return 1
447
447
448 def __setNextFileOnline(self):
448 def __setNextFileOnline(self):
449 """
449 """
450 Busca el siguiente file que tenga suficiente data para ser leida, dentro de un folder especifico, si
450 Busca el siguiente file que tenga suficiente data para ser leida, dentro de un folder especifico, si
451 no encuentra un file valido espera un tiempo determinado y luego busca en los posibles n files
451 no encuentra un file valido espera un tiempo determinado y luego busca en los posibles n files
452 siguientes.
452 siguientes.
453
453
454 Affected:
454 Affected:
455 self.flagIsNewFile
455 self.flagIsNewFile
456 self.filename
456 self.filename
457 self.fileSize
457 self.fileSize
458 self.fp
458 self.fp
459 self.set
459 self.set
460 self.flagNoMoreFiles
460 self.flagNoMoreFiles
461
461
462 Return:
462 Return:
463 0 : si luego de una busqueda del siguiente file valido este no pudo ser encontrado
463 0 : si luego de una busqueda del siguiente file valido este no pudo ser encontrado
464 1 : si el file fue abierto con exito y esta listo a ser leido
464 1 : si el file fue abierto con exito y esta listo a ser leido
465
465
466 Excepciones:
466 Excepciones:
467 Si un determinado file no puede ser abierto
467 Si un determinado file no puede ser abierto
468 """
468 """
469 nFiles = 0
469 nFiles = 0
470 fileOk_flag = False
470 fileOk_flag = False
471 firstTime_flag = True
471 firstTime_flag = True
472
472
473 self.set += 1
473 self.set += 1
474
474
475 #busca el 1er file disponible
475 #busca el 1er file disponible
476 file, filename = checkForRealPath( self.path, self.year, self.doy, self.set, self.ext )
476 file, filename = checkForRealPath( self.path, self.year, self.doy, self.set, self.ext )
477 if file:
477 if file:
478 if self.__verifyFile(file, False):
478 if self.__verifyFile(file, False):
479 fileOk_flag = True
479 fileOk_flag = True
480
480
481 #si no encuentra un file entonces espera y vuelve a buscar
481 #si no encuentra un file entonces espera y vuelve a buscar
482 if not(fileOk_flag):
482 if not(fileOk_flag):
483 for nFiles in range(self.nFiles+1): #busco en los siguientes self.nFiles+1 files posibles
483 for nFiles in range(self.nFiles+1): #busco en los siguientes self.nFiles+1 files posibles
484
484
485 if firstTime_flag: #si es la 1era vez entonces hace el for self.nTries veces
485 if firstTime_flag: #si es la 1era vez entonces hace el for self.nTries veces
486 tries = self.nTries
486 tries = self.nTries
487 else:
487 else:
488 tries = 1 #si no es la 1era vez entonces solo lo hace una vez
488 tries = 1 #si no es la 1era vez entonces solo lo hace una vez
489
489
490 for nTries in range( tries ):
490 for nTries in range( tries ):
491 if firstTime_flag:
491 if firstTime_flag:
492 print "\tWaiting %0.2f sec for new \"%s\" file, try %03d ..." % ( self.delay, filename, nTries+1 )
492 print "\tWaiting %0.2f sec for new \"%s\" file, try %03d ..." % ( self.delay, filename, nTries+1 )
493 time.sleep( self.delay )
493 time.sleep( self.delay )
494 else:
494 else:
495 print "\tSearching next \"%s%04d%03d%03d%s\" file ..." % (self.optchar, self.year, self.doy, self.set, self.ext)
495 print "\tSearching next \"%s%04d%03d%03d%s\" file ..." % (self.optchar, self.year, self.doy, self.set, self.ext)
496
496
497 file, filename = checkForRealPath( self.path, self.year, self.doy, self.set, self.ext )
497 file, filename = checkForRealPath( self.path, self.year, self.doy, self.set, self.ext )
498 if file:
498 if file:
499 if self.__verifyFile(file):
499 if self.__verifyFile(file):
500 fileOk_flag = True
500 fileOk_flag = True
501 break
501 break
502
502
503 if fileOk_flag:
503 if fileOk_flag:
504 break
504 break
505
505
506 firstTime_flag = False
506 firstTime_flag = False
507
507
508 print "\tSkipping the file \"%s\" due to this file doesn't exist yet" % filename
508 print "\tSkipping the file \"%s\" due to this file doesn't exist yet" % filename
509 self.set += 1
509 self.set += 1
510
510
511 if nFiles == (self.nFiles-1): #si no encuentro el file buscado cambio de carpeta y busco en la siguiente carpeta
511 if nFiles == (self.nFiles-1): #si no encuentro el file buscado cambio de carpeta y busco en la siguiente carpeta
512 self.set = 0
512 self.set = 0
513 self.doy += 1
513 self.doy += 1
514
514
515 if fileOk_flag:
515 if fileOk_flag:
516 self.fileSize = os.path.getsize( file )
516 self.fileSize = os.path.getsize( file )
517 self.filename = file
517 self.filename = file
518 self.flagIsNewFile = 1
518 self.flagIsNewFile = 1
519 if self.fp != None: self.fp.close()
519 if self.fp != None: self.fp.close()
520 self.fp = open(file)
520 self.fp = open(file)
521 self.flagNoMoreFiles = 0
521 self.flagNoMoreFiles = 0
522 print 'Setting the file: %s' % file
522 print 'Setting the file: %s' % file
523 else:
523 else:
524 self.fileSize = 0
524 self.fileSize = 0
525 self.filename = None
525 self.filename = None
526 self.flagIsNewFile = 0
526 self.flagIsNewFile = 0
527 self.fp = None
527 self.fp = None
528 self.flagNoMoreFiles = 1
528 self.flagNoMoreFiles = 1
529 print 'No more Files'
529 print 'No more Files'
530
530
531 return fileOk_flag
531 return fileOk_flag
532
532
533
533
534 def __setNextFileOffline(self):
534 def __setNextFileOffline(self):
535 """
535 """
536 Busca el siguiente file dentro de un folder que tenga suficiente data para ser leida
536 Busca el siguiente file dentro de un folder que tenga suficiente data para ser leida
537
537
538 Affected:
538 Affected:
539 self.flagIsNewFile
539 self.flagIsNewFile
540 self.fileIndex
540 self.fileIndex
541 self.filename
541 self.filename
542 self.fileSize
542 self.fileSize
543 self.fp
543 self.fp
544
544
545 Return:
545 Return:
546 0 : si un determinado file no puede ser abierto
546 0 : si un determinado file no puede ser abierto
547 1 : si el file fue abierto con exito
547 1 : si el file fue abierto con exito
548
548
549 Excepciones:
549 Excepciones:
550 Si un determinado file no puede ser abierto
550 Si un determinado file no puede ser abierto
551 """
551 """
552 idFile = self.fileIndex
552 idFile = self.fileIndex
553
553
554 while(True):
554 while(True):
555
555
556 idFile += 1
556 idFile += 1
557
557
558 if not(idFile < len(self.filenameList)):
558 if not(idFile < len(self.filenameList)):
559 self.flagNoMoreFiles = 1
559 self.flagNoMoreFiles = 1
560 print 'No more Files'
560 print 'No more Files'
561 return 0
561 return 0
562
562
563 filename = self.filenameList[idFile]
563 filename = self.filenameList[idFile]
564
564
565 if not(self.__verifyFile(filename)):
565 if not(self.__verifyFile(filename)):
566 continue
566 continue
567
567
568 fileSize = os.path.getsize(filename)
568 fileSize = os.path.getsize(filename)
569 fp = open(filename,'rb')
569 fp = open(filename,'rb')
570 break
570 break
571
571
572 self.flagIsNewFile = 1
572 self.flagIsNewFile = 1
573 self.fileIndex = idFile
573 self.fileIndex = idFile
574 self.filename = filename
574 self.filename = filename
575 self.fileSize = fileSize
575 self.fileSize = fileSize
576 self.fp = fp
576 self.fp = fp
577
577
578 print 'Setting the file: %s'%self.filename
578 print 'Setting the file: %s'%self.filename
579
579
580 return 1
580 return 1
581
581
582
582
583 def setNextFile(self):
583 def setNextFile(self):
584 """
584 """
585 Determina el siguiente file a leer y si hay uno disponible lee el First Header
585 Determina el siguiente file a leer y si hay uno disponible lee el First Header
586
586
587 Affected:
587 Affected:
588 self.m_BasicHeader
588 self.m_BasicHeader
589 self.m_SystemHeader
589 self.m_SystemHeader
590 self.m_RadarControllerHeader
590 self.m_RadarControllerHeader
591 self.m_ProcessingHeader
591 self.m_ProcessingHeader
592 self.firstHeaderSize
592 self.firstHeaderSize
593
593
594 Return:
594 Return:
595 0 : Si no hay files disponibles
595 0 : Si no hay files disponibles
596 1 : Si hay mas files disponibles
596 1 : Si hay mas files disponibles
597 """
597 """
598 if self.fp != None:
598 if self.fp != None:
599 self.fp.close()
599 self.fp.close()
600
600
601 if self.online:
601 if self.online:
602 newFile = self.__setNextFileOnline()
602 newFile = self.__setNextFileOnline()
603 else:
603 else:
604 newFile = self.__setNextFileOffline()
604 newFile = self.__setNextFileOffline()
605
605
606 if not(newFile):
606 if not(newFile):
607 return 0
607 return 0
608
608
609 self.__readFirstHeader()
609 self.__readFirstHeader()
610 self.nReadBlocks = 0
610 self.nReadBlocks = 0
611 return 1
611 return 1
612
612
613 def __searchFilesOnLine(self, path, startDateTime=None, endDateTime=None, expLabel = "", ext = None):
613 def __searchFilesOnLine(self, path, startDateTime=None, endDateTime=None, expLabel = "", ext = None):
614 """
614 """
615 Busca el ultimo archivo de la ultima carpeta (determinada o no por startDateTime) y
615 Busca el ultimo archivo de la ultima carpeta (determinada o no por startDateTime) y
616 devuelve el archivo encontrado ademas de otros datos.
616 devuelve el archivo encontrado ademas de otros datos.
617
617
618 Input:
618 Input:
619 path : carpeta donde estan contenidos los files que contiene data
619 path : carpeta donde estan contenidos los files que contiene data
620 startDateTime : punto especifico en el tiempo del cual se requiere la data
620 startDateTime : punto especifico en el tiempo del cual se requiere la data
621 ext : extension de los files
621 ext : extension de los files
622
622
623 Return:
623 Return:
624 year : el anho
624 year : el anho
625 doy : el numero de dia del anho
625 doy : el numero de dia del anho
626 set : el set del archivo
626 set : el set del archivo
627 filename : el ultimo file de una determinada carpeta
627 filename : el ultimo file de una determinada carpeta
628 directory : eL directorio donde esta el file encontrado
628 directory : eL directorio donde esta el file encontrado
629 """
629 """
630 dirList = []
630 dirList = []
631 pathList = []
631 pathList = []
632 directory = None
632 directory = None
633
633
634 for thisPath in os.listdir(path):
634 for thisPath in os.listdir(path):
635 if os.path.isdir(os.path.join(path,thisPath)):
635 if os.path.isdir(os.path.join(path,thisPath)):
636 dirList.append(thisPath)
636 dirList.append(thisPath)
637
637
638 if not(dirList):
638 if not(dirList):
639 return None, None, None, None, None
639 return None, None, None, None, None
640
640
641 dirList = sorted( dirList, key=str.lower )
641 dirList = sorted( dirList, key=str.lower )
642
642
643 if startDateTime:
643 if startDateTime:
644 thisDateTime = startDateTime
644 thisDateTime = startDateTime
645 if endDateTime == None: endDateTime = startDateTime
645 if endDateTime == None: endDateTime = startDateTime
646
646
647 while(thisDateTime <= endDateTime):
647 while(thisDateTime <= endDateTime):
648 year = thisDateTime.timetuple().tm_year
648 year = thisDateTime.timetuple().tm_year
649 doy = thisDateTime.timetuple().tm_yday
649 doy = thisDateTime.timetuple().tm_yday
650
650
651 match = fnmatch.filter(dirList, '?' + '%4.4d%3.3d' % (year,doy))
651 match = fnmatch.filter(dirList, '?' + '%4.4d%3.3d' % (year,doy))
652 if len(match) == 0:
652 if len(match) == 0:
653 thisDateTime += datetime.timedelta(1)
653 thisDateTime += datetime.timedelta(1)
654 continue
654 continue
655
655
656 pathList.append(os.path.join(path,match[0], expLabel))
656 pathList.append(os.path.join(path,match[0], expLabel))
657 thisDateTime += datetime.timedelta(1)
657 thisDateTime += datetime.timedelta(1)
658
658
659 if not(pathList):
659 if not(pathList):
660 print "\tNo files in range: %s - %s" %(startDateTime.ctime(), endDateTime.ctime())
660 print "\tNo files in range: %s - %s" %(startDateTime.ctime(), endDateTime.ctime())
661 return None, None, None, None, None
661 return None, None, None, None, None
662
662
663 directory = pathList[0]
663 directory = pathList[0]
664
664
665 else:
665 else:
666 directory = dirList[-1]
666 directory = dirList[-1]
667 directory = os.path.join(path,directory)
667 directory = os.path.join(path,directory)
668
668
669 filename = getlastFileFromPath(directory, ext)
669 filename = getlastFileFromPath(directory, ext)
670
670
671 if not(filename):
671 if not(filename):
672 return None, None, None, None, None
672 return None, None, None, None, None
673
673
674 if not(self.__verifyFile(os.path.join(directory, filename))):
674 if not(self.__verifyFile(os.path.join(directory, filename))):
675 return None, None, None, None, None
675 return None, None, None, None, None
676
676
677 year = int( filename[1:5] )
677 year = int( filename[1:5] )
678 doy = int( filename[5:8] )
678 doy = int( filename[5:8] )
679 set = int( filename[8:11] )
679 set = int( filename[8:11] )
680
680
681 return directory, filename, year, doy, set
681 return directory, filename, year, doy, set
682
682
683
683
684 def __searchFilesOffLine(self, path, startDateTime, endDateTime, set=None, expLabel = "", ext = ".r"):
684 def __searchFilesOffLine(self, path, startDateTime, endDateTime, set=None, expLabel = "", ext = ".r"):
685 """
685 """
686 Realiza una busqueda de los archivos que coincidan con los parametros
686 Realiza una busqueda de los archivos que coincidan con los parametros
687 especificados y se encuentren ubicados en el path indicado. Para realizar una busqueda
687 especificados y se encuentren ubicados en el path indicado. Para realizar una busqueda
688 correcta la estructura de directorios debe ser la siguiente:
688 correcta la estructura de directorios debe ser la siguiente:
689
689
690 ...path/D[yyyy][ddd]/expLabel/D[yyyy][ddd][sss].ext
690 ...path/D[yyyy][ddd]/expLabel/D[yyyy][ddd][sss].ext
691
691
692 [yyyy]: anio
692 [yyyy]: anio
693 [ddd] : dia del anio
693 [ddd] : dia del anio
694 [sss] : set del archivo
694 [sss] : set del archivo
695
695
696 Inputs:
696 Inputs:
697 path : Directorio de datos donde se realizara la busqueda. Todos los
697 path : Directorio de datos donde se realizara la busqueda. Todos los
698 ficheros que concidan con el criterio de busqueda seran
698 ficheros que concidan con el criterio de busqueda seran
699 almacenados en una lista y luego retornados.
699 almacenados en una lista y luego retornados.
700 startDateTime : Fecha inicial. Rechaza todos los archivos donde
700 startDateTime : Fecha inicial. Rechaza todos los archivos donde
701 file end time < startDateTime (obejto datetime.datetime)
701 file end time < startDateTime (obejto datetime.datetime)
702
702
703 endDateTime : Fecha final. Rechaza todos los archivos donde
703 endDateTime : Fecha final. Rechaza todos los archivos donde
704 file start time > endDateTime (obejto datetime.datetime)
704 file start time > endDateTime (obejto datetime.datetime)
705
705
706 set : Set del primer archivo a leer. Por defecto None
706 set : Set del primer archivo a leer. Por defecto None
707
707
708 expLabel : Nombre del subdirectorio de datos. Por defecto ""
708 expLabel : Nombre del subdirectorio de datos. Por defecto ""
709
709
710 ext : Extension de los archivos a leer. Por defecto .r
710 ext : Extension de los archivos a leer. Por defecto .r
711
711
712 Return:
712 Return:
713
713
714 (pathList, filenameList)
714 (pathList, filenameList)
715
715
716 pathList : Lista de directorios donde se encontraron archivos dentro
716 pathList : Lista de directorios donde se encontraron archivos dentro
717 de los parametros especificados
717 de los parametros especificados
718 filenameList : Lista de archivos (ruta completa) que coincidieron con los
718 filenameList : Lista de archivos (ruta completa) que coincidieron con los
719 parametros especificados.
719 parametros especificados.
720
720
721 Variables afectadas:
721 Variables afectadas:
722
722
723 self.filenameList: Lista de archivos (ruta completa) que la clase utiliza
723 self.filenameList: Lista de archivos (ruta completa) que la clase utiliza
724 como fuente para leer los bloque de datos, si se termina
724 como fuente para leer los bloque de datos, si se termina
725 de leer todos los bloques de datos de un determinado
725 de leer todos los bloques de datos de un determinado
726 archivo se pasa al siguiente archivo de la lista.
726 archivo se pasa al siguiente archivo de la lista.
727
727
728 Excepciones:
728 Excepciones:
729
729
730 """
730 """
731
731
732 print "Searching files ..."
732 print "Searching files ..."
733
733
734 dirList = []
734 dirList = []
735 for thisPath in os.listdir(path):
735 for thisPath in os.listdir(path):
736 if os.path.isdir(os.path.join(path,thisPath)):
736 if os.path.isdir(os.path.join(path,thisPath)):
737 dirList.append(thisPath)
737 dirList.append(thisPath)
738
738
739 if not(dirList):
739 if not(dirList):
740 return None, None
740 return None, None
741
741
742 pathList = []
742 pathList = []
743
743
744 thisDateTime = startDateTime
744 thisDateTime = startDateTime
745
745
746 while(thisDateTime <= endDateTime):
746 while(thisDateTime <= endDateTime):
747 year = thisDateTime.timetuple().tm_year
747 year = thisDateTime.timetuple().tm_year
748 doy = thisDateTime.timetuple().tm_yday
748 doy = thisDateTime.timetuple().tm_yday
749
749
750 match = fnmatch.filter(dirList, '?' + '%4.4d%3.3d' % (year,doy))
750 match = fnmatch.filter(dirList, '?' + '%4.4d%3.3d' % (year,doy))
751 if len(match) == 0:
751 if len(match) == 0:
752 thisDateTime += datetime.timedelta(1)
752 thisDateTime += datetime.timedelta(1)
753 continue
753 continue
754
754
755 pathList.append(os.path.join(path,match[0],expLabel))
755 pathList.append(os.path.join(path,match[0],expLabel))
756 thisDateTime += datetime.timedelta(1)
756 thisDateTime += datetime.timedelta(1)
757
757
758 startUtSeconds = time.mktime(startDateTime.timetuple())
758 startUtSeconds = time.mktime(startDateTime.timetuple())
759 endUtSeconds = time.mktime(endDateTime.timetuple())
759 endUtSeconds = time.mktime(endDateTime.timetuple())
760
760
761 filenameList = []
761 filenameList = []
762 for thisPath in pathList:
762 for thisPath in pathList:
763 fileList = glob.glob1(thisPath, "*%s" %ext)
763 fileList = glob.glob1(thisPath, "*%s" %ext)
764 fileList.sort()
764 fileList.sort()
765 for file in fileList:
765 for file in fileList:
766 filename = os.path.join(thisPath,file)
766 filename = os.path.join(thisPath,file)
767 if isThisFileinRange(filename, startUtSeconds, endUtSeconds):
767 if isThisFileinRange(filename, startUtSeconds, endUtSeconds):
768 filenameList.append(filename)
768 filenameList.append(filename)
769
769
770 if not(filenameList):
770 if not(filenameList):
771 return None, None
771 return None, None
772
772
773 self.filenameList = filenameList
773 self.filenameList = filenameList
774
774
775 return pathList, filenameList
775 return pathList, filenameList
776
776
777 def __verifyFile(self, filename, msgFlag=True):
777 def __verifyFile(self, filename, msgFlag=True):
778 """
778 """
779 Verifica que el filename tenga data valida, para ello leo el FirstHeader del file
779 Verifica que el filename tenga data valida, para ello leo el FirstHeader del file
780
780
781 Return:
781 Return:
782 0 : file no valido para ser leido
782 0 : file no valido para ser leido
783 1 : file valido para ser leido
783 1 : file valido para ser leido
784 """
784 """
785 msg = None
785 msg = None
786
786
787 try:
787 try:
788 fp = open( filename,'rb' ) #lectura binaria
788 fp = open( filename,'rb' ) #lectura binaria
789 currentPosition = fp.tell()
789 currentPosition = fp.tell()
790 except:
790 except:
791 if msgFlag:
791 if msgFlag:
792 print "The file %s can't be opened" % (filename)
792 print "The file %s can't be opened" % (filename)
793 return False
793 return False
794
794
795 neededSize = self.m_ProcessingHeader.blockSize + self.firstHeaderSize
795 neededSize = self.m_ProcessingHeader.blockSize + self.firstHeaderSize
796
796
797 if neededSize == 0:
797 if neededSize == 0:
798
798
799 m_BasicHeader = BasicHeader()
799 m_BasicHeader = BasicHeader()
800 m_SystemHeader = SystemHeader()
800 m_SystemHeader = SystemHeader()
801 m_RadarControllerHeader = RadarControllerHeader()
801 m_RadarControllerHeader = RadarControllerHeader()
802 m_ProcessingHeader = ProcessingHeader()
802 m_ProcessingHeader = ProcessingHeader()
803
803
804 try:
804 try:
805 if not( m_BasicHeader.read(fp) ): raise ValueError
805 if not( m_BasicHeader.read(fp) ): raise ValueError
806 if not( m_SystemHeader.read(fp) ): raise ValueError
806 if not( m_SystemHeader.read(fp) ): raise ValueError
807 if not( m_RadarControllerHeader.read(fp) ): raise ValueError
807 if not( m_RadarControllerHeader.read(fp) ): raise ValueError
808 if not( m_ProcessingHeader.read(fp) ): raise ValueError
808 if not( m_ProcessingHeader.read(fp) ): raise ValueError
809 data_type = int(numpy.log2((m_ProcessingHeader.processFlags & PROCFLAG.DATATYPE_MASK))-numpy.log2(PROCFLAG.DATATYPE_CHAR))
809 data_type = int(numpy.log2((m_ProcessingHeader.processFlags & PROCFLAG.DATATYPE_MASK))-numpy.log2(PROCFLAG.DATATYPE_CHAR))
810
810
811 neededSize = m_ProcessingHeader.blockSize + m_BasicHeader.size
811 neededSize = m_ProcessingHeader.blockSize + m_BasicHeader.size
812
812
813 except:
813 except:
814 if msgFlag:
814 if msgFlag:
815 print "\tThe file %s is empty or it hasn't enough data" % filename
815 print "\tThe file %s is empty or it hasn't enough data" % filename
816
816
817 fp.close()
817 fp.close()
818 return False
818 return False
819
819
820 else:
820 else:
821 msg = "\tSkipping the file %s due to it hasn't enough data" %filename
821 msg = "\tSkipping the file %s due to it hasn't enough data" %filename
822
822
823 fp.close()
823 fp.close()
824 fileSize = os.path.getsize(filename)
824 fileSize = os.path.getsize(filename)
825 currentSize = fileSize - currentPosition
825 currentSize = fileSize - currentPosition
826
826
827 if currentSize < neededSize:
827 if currentSize < neededSize:
828 if msgFlag and (msg != None):
828 if msgFlag and (msg != None):
829 print msg #print"\tSkipping the file %s due to it hasn't enough data" %filename
829 print msg #print"\tSkipping the file %s due to it hasn't enough data" %filename
830 return False
830 return False
831
831
832 return True
832 return True
833
833
834 def updateDataHeader(self):
834 def updateDataHeader(self):
835
835
836 self.m_DataObj.m_BasicHeader = self.m_BasicHeader.copy()
836 self.m_DataObj.m_BasicHeader = self.m_BasicHeader.copy()
837 self.m_DataObj.m_ProcessingHeader = self.m_ProcessingHeader.copy()
837 self.m_DataObj.m_ProcessingHeader = self.m_ProcessingHeader.copy()
838 self.m_DataObj.m_RadarControllerHeader = self.m_RadarControllerHeader.copy()
838 self.m_DataObj.m_RadarControllerHeader = self.m_RadarControllerHeader.copy()
839 self.m_DataObj.m_SystemHeader = self.m_SystemHeader.copy()
839 self.m_DataObj.m_SystemHeader = self.m_SystemHeader.copy()
840
840
841 self.m_DataObj.dataType = self.dataType
841 self.m_DataObj.dataType = self.dataType
842 self.m_DataObj.updateObjFromHeader()
842 self.m_DataObj.updateObjFromHeader()
843
843
844 def setup(self, path, startDateTime=None, endDateTime=None, set=0, expLabel = "", ext = None, online = 0):
844 def setup(self, path, startDateTime=None, endDateTime=None, set=0, expLabel = "", ext = None, online = 0):
845 """
845 """
846 setup configura los parametros de lectura de la clase DataReader.
846 setup configura los parametros de lectura de la clase DataReader.
847
847
848 Si el modo de lectura es offline, primero se realiza una busqueda de todos los archivos
848 Si el modo de lectura es offline, primero se realiza una busqueda de todos los archivos
849 que coincidan con los parametros especificados; esta lista de archivos son almacenados en
849 que coincidan con los parametros especificados; esta lista de archivos son almacenados en
850 self.filenameList.
850 self.filenameList.
851
851
852 Input:
852 Input:
853 path : Directorios donde se ubican los datos a leer. Dentro de este
853 path : Directorios donde se ubican los datos a leer. Dentro de este
854 directorio deberia de estar subdirectorios de la forma:
854 directorio deberia de estar subdirectorios de la forma:
855
855
856 path/D[yyyy][ddd]/expLabel/P[yyyy][ddd][sss][ext]
856 path/D[yyyy][ddd]/expLabel/P[yyyy][ddd][sss][ext]
857
857
858 startDateTime : Fecha inicial. Rechaza todos los archivos donde
858 startDateTime : Fecha inicial. Rechaza todos los archivos donde
859 file end time < startDatetime (obejto datetime.datetime)
859 file end time < startDatetime (obejto datetime.datetime)
860
860
861 endDateTime : Fecha final. Si no es None, rechaza todos los archivos donde
861 endDateTime : Fecha final. Si no es None, rechaza todos los archivos donde
862 file end time < startDatetime (obejto datetime.datetime)
862 file end time < startDatetime (obejto datetime.datetime)
863
863
864 set : Set del primer archivo a leer. Por defecto None
864 set : Set del primer archivo a leer. Por defecto None
865
865
866 expLabel : Nombre del subdirectorio de datos. Por defecto ""
866 expLabel : Nombre del subdirectorio de datos. Por defecto ""
867
867
868 ext : Extension de los archivos a leer. Por defecto .r
868 ext : Extension de los archivos a leer. Por defecto .r
869
869
870 online : Si es == a 0 entonces busca files que cumplan con las condiciones dadas
870 online : Si es == a 0 entonces busca files que cumplan con las condiciones dadas
871
871
872 Return:
872 Return:
873 0 : Si no encuentra files que cumplan con las condiciones dadas
873 0 : Si no encuentra files que cumplan con las condiciones dadas
874 1 : Si encuentra files que cumplan con las condiciones dadas
874 1 : Si encuentra files que cumplan con las condiciones dadas
875
875
876 Affected:
876 Affected:
877 self.startUTCSeconds
877 self.startUTCSeconds
878 self.endUTCSeconds
878 self.endUTCSeconds
879 self.startYear
879 self.startYear
880 self.endYear
880 self.endYear
881 self.startDoy
881 self.startDoy
882 self.endDoy
882 self.endDoy
883 self.pathList
883 self.pathList
884 self.filenameList
884 self.filenameList
885 self.online
885 self.online
886 """
886 """
887
887
888 if ext == None:
888 if ext == None:
889 ext = self.ext
889 ext = self.ext
890
890
891 if online:
891 if online:
892 print "Searching files ..."
892 print "Searching files ..."
893 doypath, file, year, doy, set = self.__searchFilesOnLine(path, startDateTime, endDateTime, expLabel, ext)
893 doypath, file, year, doy, set = self.__searchFilesOnLine(path, startDateTime, endDateTime, expLabel, ext)
894
894
895 if not(doypath):
895 if not(doypath):
896 for nTries in range( self.nTries ):
896 for nTries in range( self.nTries ):
897 print '\tWaiting %0.2f sec for valid file in %s: try %02d ...' % (self.delay, path, nTries+1)
897 print '\tWaiting %0.2f sec for valid file in %s: try %02d ...' % (self.delay, path, nTries+1)
898 time.sleep( self.delay )
898 time.sleep( self.delay )
899 doypath, file, year, doy, set = self.__searchFilesOnLine(path, startDateTime, endDateTime, expLabel, ext)
899 doypath, file, year, doy, set = self.__searchFilesOnLine(path, startDateTime, endDateTime, expLabel, ext)
900 if doypath:
900 if doypath:
901 break
901 break
902
902
903 if not(doypath):
903 if not(doypath):
904 print "There 'isn't valied files in %s" % path
904 print "There 'isn't valied files in %s" % path
905 return 0
905 return 0
906
906
907 self.year = year
907 self.year = year
908 self.doy = doy
908 self.doy = doy
909 self.set = set - 1
909 self.set = set - 1
910 self.path = path
910 self.path = path
911
911
912 else: # offline
912 else: # offline
913 pathList, filenameList = self.__searchFilesOffLine(path, startDateTime, endDateTime, set, expLabel, ext)
913 pathList, filenameList = self.__searchFilesOffLine(path, startDateTime, endDateTime, set, expLabel, ext)
914 if not(pathList):
914 if not(pathList):
915 print "No files in range: %s - %s" %(startDateTime.ctime(), endDateTime.ctime())
915 print "No files in range: %s - %s" %(startDateTime.ctime(), endDateTime.ctime())
916 return 0
916 return 0
917
917
918 self.fileIndex = -1
918 self.fileIndex = -1
919 self.pathList = pathList
919 self.pathList = pathList
920 self.filenameList = filenameList
920 self.filenameList = filenameList
921
921
922 self.online = online
922 self.online = online
923 self.ext = ext
923 self.ext = ext
924
924
925 ext = ext.lower()
925 ext = ext.lower()
926
926
927 if not( self.setNextFile() ):
927 if not( self.setNextFile() ):
928 if (startDateTime != None) and (endDateTime != None):
928 if (startDateTime != None) and (endDateTime != None):
929 print "No files in range: %s - %s" %(startDateTime.ctime(), endDateTime.ctime())
929 print "No files in range: %s - %s" %(startDateTime.ctime(), endDateTime.ctime())
930 elif startDateTime != None:
930 elif startDateTime != None:
931 print "No files in : %s" % startDateTime.ctime()
931 print "No files in : %s" % startDateTime.ctime()
932 else:
932 else:
933 print "No files"
933 print "No files"
934 return 0
934 return 0
935
935
936 if startDateTime != None:
936 if startDateTime != None:
937 self.startUTCSeconds = time.mktime(startDateTime.timetuple())
937 self.startUTCSeconds = time.mktime(startDateTime.timetuple())
938 self.startYear = startDateTime.timetuple().tm_year
938 self.startYear = startDateTime.timetuple().tm_year
939 self.startDoy = startDateTime.timetuple().tm_yday
939 self.startDoy = startDateTime.timetuple().tm_yday
940
940
941 if endDateTime != None:
941 if endDateTime != None:
942 self.endUTCSeconds = time.mktime(endDateTime.timetuple())
942 self.endUTCSeconds = time.mktime(endDateTime.timetuple())
943 self.endYear = endDateTime.timetuple().tm_year
943 self.endYear = endDateTime.timetuple().tm_year
944 self.endDoy = endDateTime.timetuple().tm_yday
944 self.endDoy = endDateTime.timetuple().tm_yday
945 #call fillHeaderValues() - to Data Object
945 #call fillHeaderValues() - to Data Object
946
946
947 self.updateDataHeader()
947 self.updateDataHeader()
948
948
949 return 1
949 return 1
950
950
951 class JRODataWriter(JRODataIO):
951 class JRODataWriter(JRODataIO):
952
952
953 """
953 """
954 Esta clase permite escribir datos a archivos procesados (.r o ,pdata). La escritura
954 Esta clase permite escribir datos a archivos procesados (.r o ,pdata). La escritura
955 de los datos siempre se realiza por bloques.
955 de los datos siempre se realiza por bloques.
956 """
956 """
957
957
958 nWriteBlocks = 0
958 nWriteBlocks = 0
959
959
960 setFile = None
960 setFile = None
961
961
962
962
963 def __init__(self, m_DataObj=None):
963 def __init__(self, m_DataObj=None):
964 raise ValueError, "Not implemented"
964 raise ValueError, "Not implemented"
965
965
966
966
967 def hasAllDataInBuffer(self):
967 def hasAllDataInBuffer(self):
968 raise ValueError, "Not implemented"
968 raise ValueError, "Not implemented"
969
969
970
970
971 def setBlockDimension(self):
971 def setBlockDimension(self):
972 raise ValueError, "Not implemented"
972 raise ValueError, "Not implemented"
973
973
974
974
975 def writeBlock(self):
975 def writeBlock(self):
976 raise ValueError, "No implemented"
976 raise ValueError, "No implemented"
977
977
978
978
979 def putData(self):
979 def putData(self):
980 raise ValueError, "No implemented"
980 raise ValueError, "No implemented"
981
981
982
982
983 def __writeFirstHeader(self):
983 def __writeFirstHeader(self):
984 """
984 """
985 Escribe el primer header del file es decir el Basic header y el Long header (SystemHeader, RadarControllerHeader, ProcessingHeader)
985 Escribe el primer header del file es decir el Basic header y el Long header (SystemHeader, RadarControllerHeader, ProcessingHeader)
986
986
987 Affected:
987 Affected:
988 __dataType
988 __dataType
989
989
990 Return:
990 Return:
991 None
991 None
992 """
992 """
993 self.__writeBasicHeader()
993 self.__writeBasicHeader()
994 self.__wrSystemHeader()
994 self.__wrSystemHeader()
995 self.__wrRadarControllerHeader()
995 self.__wrRadarControllerHeader()
996 self.__wrProcessingHeader()
996 self.__wrProcessingHeader()
997 self.dataType = self.m_DataObj.dataType
997 self.dataType = self.m_DataObj.dataType
998
998
999
999
1000 def __writeBasicHeader(self, fp=None):
1000 def __writeBasicHeader(self, fp=None):
1001 """
1001 """
1002 Escribe solo el Basic header en el file creado
1002 Escribe solo el Basic header en el file creado
1003
1003
1004 Return:
1004 Return:
1005 None
1005 None
1006 """
1006 """
1007 if fp == None:
1007 if fp == None:
1008 fp = self.fp
1008 fp = self.fp
1009
1009
1010 self.m_DataObj.m_BasicHeader.write(fp)
1010 self.m_DataObj.m_BasicHeader.write(fp)
1011
1011
1012
1012
1013 def __wrSystemHeader(self, fp=None):
1013 def __wrSystemHeader(self, fp=None):
1014 """
1014 """
1015 Escribe solo el System header en el file creado
1015 Escribe solo el System header en el file creado
1016
1016
1017 Return:
1017 Return:
1018 None
1018 None
1019 """
1019 """
1020 if fp == None:
1020 if fp == None:
1021 fp = self.fp
1021 fp = self.fp
1022
1022
1023 self.m_DataObj.m_SystemHeader.write(fp)
1023 self.m_DataObj.m_SystemHeader.write(fp)
1024
1024
1025
1025
1026 def __wrRadarControllerHeader(self, fp=None):
1026 def __wrRadarControllerHeader(self, fp=None):
1027 """
1027 """
1028 Escribe solo el RadarController header en el file creado
1028 Escribe solo el RadarController header en el file creado
1029
1029
1030 Return:
1030 Return:
1031 None
1031 None
1032 """
1032 """
1033 if fp == None:
1033 if fp == None:
1034 fp = self.fp
1034 fp = self.fp
1035
1035
1036 self.m_DataObj.m_RadarControllerHeader.write(fp)
1036 self.m_DataObj.m_RadarControllerHeader.write(fp)
1037
1037
1038
1038
1039 def __wrProcessingHeader(self, fp=None):
1039 def __wrProcessingHeader(self, fp=None):
1040 """
1040 """
1041 Escribe solo el Processing header en el file creado
1041 Escribe solo el Processing header en el file creado
1042
1042
1043 Return:
1043 Return:
1044 None
1044 None
1045 """
1045 """
1046 if fp == None:
1046 if fp == None:
1047 fp = self.fp
1047 fp = self.fp
1048
1048
1049 self.m_DataObj.m_ProcessingHeader.write(fp)
1049 self.m_DataObj.m_ProcessingHeader.write(fp)
1050
1050
1051
1051
1052 def setNextFile(self):
1052 def setNextFile(self):
1053 """
1053 """
1054 Determina el siguiente file que sera escrito
1054 Determina el siguiente file que sera escrito
1055
1055
1056 Affected:
1056 Affected:
1057 self.filename
1057 self.filename
1058 self.subfolder
1058 self.subfolder
1059 self.fp
1059 self.fp
1060 self.setFile
1060 self.setFile
1061 self.flagIsNewFile
1061 self.flagIsNewFile
1062
1062
1063 Return:
1063 Return:
1064 0 : Si el archivo no puede ser escrito
1064 0 : Si el archivo no puede ser escrito
1065 1 : Si el archivo esta listo para ser escrito
1065 1 : Si el archivo esta listo para ser escrito
1066 """
1066 """
1067 ext = self.ext
1067 ext = self.ext
1068 path = self.path
1068 path = self.path
1069
1069
1070 if self.fp != None:
1070 if self.fp != None:
1071 self.fp.close()
1071 self.fp.close()
1072
1072
1073 timeTuple = time.localtime( self.m_DataObj.m_BasicHeader.utc )
1073 timeTuple = time.localtime( self.m_DataObj.m_BasicHeader.utc )
1074 subfolder = 'D%4.4d%3.3d' % (timeTuple.tm_year,timeTuple.tm_yday)
1074 subfolder = 'D%4.4d%3.3d' % (timeTuple.tm_year,timeTuple.tm_yday)
1075
1075
1076 doypath = os.path.join( path, subfolder )
1076 doypath = os.path.join( path, subfolder )
1077 if not( os.path.exists(doypath) ):
1077 if not( os.path.exists(doypath) ):
1078 os.mkdir(doypath)
1078 os.mkdir(doypath)
1079 self.setFile = -1 #inicializo mi contador de seteo
1079 self.setFile = -1 #inicializo mi contador de seteo
1080 else:
1080 else:
1081 filesList = os.listdir( doypath )
1081 filesList = os.listdir( doypath )
1082 if len( filesList ) > 0:
1082 if len( filesList ) > 0:
1083 filesList = sorted( filesList, key=str.lower )
1083 filesList = sorted( filesList, key=str.lower )
1084 filen = filesList[-1]
1084 filen = filesList[-1]
1085 # el filename debera tener el siguiente formato
1085 # el filename debera tener el siguiente formato
1086 # 0 1234 567 89A BCDE (hex)
1086 # 0 1234 567 89A BCDE (hex)
1087 # x YYYY DDD SSS .ext
1087 # x YYYY DDD SSS .ext
1088 if isNumber( filen[8:11] ):
1088 if isNumber( filen[8:11] ):
1089 self.setFile = int( filen[8:11] ) #inicializo mi contador de seteo al seteo del ultimo file
1089 self.setFile = int( filen[8:11] ) #inicializo mi contador de seteo al seteo del ultimo file
1090 else:
1090 else:
1091 self.setFile = -1
1091 self.setFile = -1
1092 else:
1092 else:
1093 self.setFile = -1 #inicializo mi contador de seteo
1093 self.setFile = -1 #inicializo mi contador de seteo
1094
1094
1095 setFile = self.setFile
1095 setFile = self.setFile
1096 setFile += 1
1096 setFile += 1
1097
1097
1098 file = '%s%4.4d%3.3d%3.3d%s' % (self.optchar,
1098 file = '%s%4.4d%3.3d%3.3d%s' % (self.optchar,
1099 timeTuple.tm_year,
1099 timeTuple.tm_year,
1100 timeTuple.tm_yday,
1100 timeTuple.tm_yday,
1101 setFile,
1101 setFile,
1102 ext )
1102 ext )
1103
1103
1104 filename = os.path.join( path, subfolder, file )
1104 filename = os.path.join( path, subfolder, file )
1105
1105
1106 fp = open( filename,'wb' )
1106 fp = open( filename,'wb' )
1107
1107
1108 self.nWriteBlocks = 0
1108 self.nWriteBlocks = 0
1109
1109
1110 #guardando atributos
1110 #guardando atributos
1111 self.filename = filename
1111 self.filename = filename
1112 self.subfolder = subfolder
1112 self.subfolder = subfolder
1113 self.fp = fp
1113 self.fp = fp
1114 self.setFile = setFile
1114 self.setFile = setFile
1115 self.flagIsNewFile = 1
1115 self.flagIsNewFile = 1
1116
1116
1117 print 'Writing the file: %s'%self.filename
1117 print 'Writing the file: %s'%self.filename
1118
1118
1119 self.__writeFirstHeader()
1119 self.__writeFirstHeader()
1120
1120
1121 return 1
1121 return 1
1122
1122
1123
1123
1124 def __setNewBlock(self):
1124 def __setNewBlock(self):
1125 """
1125 """
1126 Si es un nuevo file escribe el First Header caso contrario escribe solo el Basic Header
1126 Si es un nuevo file escribe el First Header caso contrario escribe solo el Basic Header
1127
1127
1128 Return:
1128 Return:
1129 0 : si no pudo escribir nada
1129 0 : si no pudo escribir nada
1130 1 : Si escribio el Basic el First Header
1130 1 : Si escribio el Basic el First Header
1131 """
1131 """
1132 if self.fp == None:
1132 if self.fp == None:
1133 self.setNextFile()
1133 self.setNextFile()
1134
1134
1135 if self.flagIsNewFile:
1135 if self.flagIsNewFile:
1136 return 1
1136 return 1
1137
1137
1138 if self.nWriteBlocks < self.m_ProcessingHeader.dataBlocksPerFile:
1138 if self.nWriteBlocks < self.m_ProcessingHeader.dataBlocksPerFile:
1139 self.__writeBasicHeader()
1139 self.__writeBasicHeader()
1140 return 1
1140 return 1
1141
1141
1142 if not( self.setNextFile() ):
1142 if not( self.setNextFile() ):
1143 return 0
1143 return 0
1144
1144
1145 return 1
1145 return 1
1146
1146
1147
1147
1148 def writeNextBlock(self):
1148 def writeNextBlock(self):
1149 """
1149 """
1150 Selecciona el bloque siguiente de datos y los escribe en un file
1150 Selecciona el bloque siguiente de datos y los escribe en un file
1151
1151
1152 Return:
1152 Return:
1153 0 : Si no hizo pudo escribir el bloque de datos
1153 0 : Si no hizo pudo escribir el bloque de datos
1154 1 : Si no pudo escribir el bloque de datos
1154 1 : Si no pudo escribir el bloque de datos
1155 """
1155 """
1156 if not( self.__setNewBlock() ):
1156 if not( self.__setNewBlock() ):
1157 return 0
1157 return 0
1158
1158
1159 self.writeBlock()
1159 self.writeBlock()
1160
1160
1161 return 1
1161 return 1
1162
1162
1163
1163
1164 def getDataHeader(self):
1164 def getDataHeader(self):
1165 """
1165 """
1166 Obtiene una copia del First Header
1166 Obtiene una copia del First Header
1167
1167
1168 Affected:
1168 Affected:
1169 self.m_BasicHeader
1169 self.m_BasicHeader
1170 self.m_SystemHeader
1170 self.m_SystemHeader
1171 self.m_RadarControllerHeader
1171 self.m_RadarControllerHeader
1172 self.m_ProcessingHeader
1172 self.m_ProcessingHeader
1173 self.dataType
1173 self.dataType
1174
1174
1175 Return:
1175 Return:
1176 None
1176 None
1177 """
1177 """
1178 self.m_DataObj.updateHeaderFromObj()
1178 self.m_DataObj.updateHeaderFromObj()
1179
1179
1180 self.m_BasicHeader = self.m_DataObj.m_BasicHeader.copy()
1180 self.m_BasicHeader = self.m_DataObj.m_BasicHeader.copy()
1181 self.m_SystemHeader = self.m_DataObj.m_SystemHeader.copy()
1181 self.m_SystemHeader = self.m_DataObj.m_SystemHeader.copy()
1182 self.m_RadarControllerHeader = self.m_DataObj.m_RadarControllerHeader.copy()
1182 self.m_RadarControllerHeader = self.m_DataObj.m_RadarControllerHeader.copy()
1183 self.m_ProcessingHeader = self.m_DataObj.m_ProcessingHeader.copy()
1183 self.m_ProcessingHeader = self.m_DataObj.m_ProcessingHeader.copy()
1184
1184
1185 self.dataType = self.m_DataObj.dataType
1185 self.dataType = self.m_DataObj.dataType
1186
1186
1187
1187
1188 def setup(self, path, set=0, ext=None):
1188 def setup(self, path, set=0, ext=None):
1189 """
1189 """
1190 Setea el tipo de formato en la cual sera guardada la data y escribe el First Header
1190 Setea el tipo de formato en la cual sera guardada la data y escribe el First Header
1191
1191
1192 Inputs:
1192 Inputs:
1193 path : el path destino en el cual se escribiran los files a crear
1193 path : el path destino en el cual se escribiran los files a crear
1194 format : formato en el cual sera salvado un file
1194 format : formato en el cual sera salvado un file
1195 set : el setebo del file
1195 set : el setebo del file
1196
1196
1197 Return:
1197 Return:
1198 0 : Si no realizo un buen seteo
1198 0 : Si no realizo un buen seteo
1199 1 : Si realizo un buen seteo
1199 1 : Si realizo un buen seteo
1200 """
1200 """
1201
1201
1202 if ext == None:
1202 if ext == None:
1203 ext = self.ext
1203 ext = self.ext
1204
1204
1205 ext = ext.lower()
1205 ext = ext.lower()
1206
1206
1207 self.path = path
1207 self.path = path
1208 self.setFile = set - 1
1208 self.setFile = set - 1
1209 self.ext = ext
1209 self.ext = ext
1210 #self.format = format
1210 #self.format = format
1211 self.getDataHeader()
1211 self.getDataHeader()
1212
1212
1213 self.setBlockDimension()
1213 self.setBlockDimension()
1214
1214
1215 if not( self.setNextFile() ):
1215 if not( self.setNextFile() ):
1216 print "There isn't a next file"
1216 print "There isn't a next file"
1217 return 0
1217 return 0
1218
1218
1219 return 1
1219 return 1
This diff has been collapsed as it changes many lines, (1075 lines changed) Show them Hide them
@@ -1,536 +1,541
1 '''
1 '''
2 File: SpectraIO.py
2 File: SpectraIO.py
3 Created on 20/02/2012
3 Created on 20/02/2012
4
4
5 @author $Author$
5 @author $Author$
6 @version $Id$
6 @version $Id$
7 '''
7 '''
8
8
9 import os, sys
9 import os, sys
10 import numpy
10 import numpy
11 import glob
11 import glob
12 import fnmatch
12 import fnmatch
13 import time, datetime
13 import time, datetime
14
14
15 path = os.path.split(os.getcwd())[0]
15 path = os.path.split(os.getcwd())[0]
16 sys.path.append(path)
16 sys.path.append(path)
17
17
18 from Model.JROHeader import *
18 from Model.JROHeader import *
19 from Model.Spectra import Spectra
19 from Model.Spectra import Spectra
20
20
21 from JRODataIO import JRODataReader
21 from JRODataIO import JRODataReader
22 from JRODataIO import JRODataWriter
22 from JRODataIO import JRODataWriter
23 from JRODataIO import isNumber
23 from JRODataIO import isNumber
24
24
25
25
26 class SpectraReader( JRODataReader ):
26 class SpectraReader(JRODataReader):
27 """
27 """
28 Esta clase permite leer datos de espectros desde archivos procesados (.pdata). La lectura
28 Esta clase permite leer datos de espectros desde archivos procesados (.pdata). La lectura
29 de los datos siempre se realiza por bloques. Los datos leidos (array de 3 dimensiones)
29 de los datos siempre se realiza por bloques. Los datos leidos (array de 3 dimensiones)
30 son almacenados en tres buffer's para el Self Spectra, el Cross Spectra y el DC Channel.
30 son almacenados en tres buffer's para el Self Spectra, el Cross Spectra y el DC Channel.
31
31
32 paresCanalesIguales * alturas * perfiles (Self Spectra)
32 paresCanalesIguales * alturas * perfiles (Self Spectra)
33 paresCanalesDiferentes * alturas * perfiles (Cross Spectra)
33 paresCanalesDiferentes * alturas * perfiles (Cross Spectra)
34 canales * alturas (DC Channels)
34 canales * alturas (DC Channels)
35
35
36 Esta clase contiene instancias (objetos) de las clases BasicHeader, SystemHeader,
36 Esta clase contiene instancias (objetos) de las clases BasicHeader, SystemHeader,
37 RadarControllerHeader y Spectra. Los tres primeros se usan para almacenar informacion de la
37 RadarControllerHeader y Spectra. Los tres primeros se usan para almacenar informacion de la
38 cabecera de datos (metadata), y el cuarto (Spectra) para obtener y almacenar un bloque de
38 cabecera de datos (metadata), y el cuarto (Spectra) para obtener y almacenar un bloque de
39 datos desde el "buffer" cada vez que se ejecute el metodo "getData".
39 datos desde el "buffer" cada vez que se ejecute el metodo "getData".
40
40
41 Example:
41 Example:
42 dpath = "/home/myuser/data"
42 dpath = "/home/myuser/data"
43
43
44 startTime = datetime.datetime(2010,1,20,0,0,0,0,0,0)
44 startTime = datetime.datetime(2010,1,20,0,0,0,0,0,0)
45
45
46 endTime = datetime.datetime(2010,1,21,23,59,59,0,0,0)
46 endTime = datetime.datetime(2010,1,21,23,59,59,0,0,0)
47
47
48 readerObj = SpectraReader()
48 readerObj = SpectraReader()
49
49
50 readerObj.setup(dpath, startTime, endTime)
50 readerObj.setup(dpath, startTime, endTime)
51
51
52 while(True):
52 while(True):
53
53
54 readerObj.getData()
54 readerObj.getData()
55
55
56 print readerObj.m_Spectra.data
56 print readerObj.m_Spectra.data
57
57
58 if readerObj.flagNoMoreFiles:
58 if readerObj.flagNoMoreFiles:
59 break
59 break
60
60
61 """
61 """
62 m_DataObj = None
62 m_DataObj = None
63
63
64 data_spc = None
64 data_spc = None
65 data_cspc = None
65 data_cspc = None
66 data_dc = None
66 data_dc = None
67
67
68 pts2read_SelfSpectra = 0
68 pts2read_SelfSpectra = 0
69 pts2read_CrossSpectra = 0
69 pts2read_CrossSpectra = 0
70 pts2read_DCchannels = 0
70 pts2read_DCchannels = 0
71
71
72 nChannels = 0
72 nChannels = 0
73
73
74 nPairs = 0
74 nPairs = 0
75
75
76 #pairList = None
76 #pairList = None
77
77
78 channelList = None
78 channelList = None
79
79
80 def __init__(self, m_Spectra=None):
80 def __init__(self, m_Spectra=None):
81 """
81 """
82 Inicializador de la clase SpectraReader para la lectura de datos de espectros.
82 Inicializador de la clase SpectraReader para la lectura de datos de espectros.
83
83
84 Inputs:
84 Inputs:
85 m_Spectra : Objeto de la clase Spectra. Este objeto sera utilizado para
85 m_Spectra : Objeto de la clase Spectra. Este objeto sera utilizado para
86 almacenar un perfil de datos cada vez que se haga un requerimiento
86 almacenar un perfil de datos cada vez que se haga un requerimiento
87 (getData). El perfil sera obtenido a partir del buffer de datos,
87 (getData). El perfil sera obtenido a partir del buffer de datos,
88 si el buffer esta vacio se hara un nuevo proceso de lectura de un
88 si el buffer esta vacio se hara un nuevo proceso de lectura de un
89 bloque de datos.
89 bloque de datos.
90 Si este parametro no es pasado se creara uno internamente.
90 Si este parametro no es pasado se creara uno internamente.
91
91
92 Affected:
92 Affected:
93 self.m_DataObj
93 self.m_DataObj
94
94
95 Return : None
95 Return : None
96 """
96 """
97 if m_Spectra == None:
97 if m_Spectra == None:
98 m_Spectra = Spectra()
98 m_Spectra = Spectra()
99
99
100 if not( isinstance(m_Spectra, Spectra) ):
100 if not( isinstance(m_Spectra, Spectra) ):
101 raise ValueError, "in SpectraReader, m_Spectra must be an Spectra class object"
101 raise ValueError, "in SpectraReader, m_Spectra must be an Spectra class object"
102
102
103 self.m_DataObj = m_Spectra
103 self.m_DataObj = m_Spectra
104
104
105 self.data_spc = None
105 self.data_spc = None
106 self.data_cspc = None
106 self.data_cspc = None
107 self.data_dc = None
107 self.data_dc = None
108
108
109 self.pts2read_SelfSpectra = 0
109 self.pts2read_SelfSpectra = 0
110 self.pts2read_CrossSpectra = 0
110 self.pts2read_CrossSpectra = 0
111 self.pts2read_DCs = 0
111 self.pts2read_DCs = 0
112
112
113 self.nChannels = 0
113 self.nChannels = 0
114
114
115 self.nPairs = 0
115 self.nPairs = 0
116
116
117 self.ext = ".pdata"
117 self.ext = ".pdata"
118
118
119 self.optchar = "P"
119 self.optchar = "P"
120
120
121 ######################
121 ######################
122
122
123 self.m_BasicHeader = BasicHeader()
123 self.m_BasicHeader = BasicHeader()
124
124
125 self.m_SystemHeader = SystemHeader()
125 self.m_SystemHeader = SystemHeader()
126
126
127 self.m_RadarControllerHeader = RadarControllerHeader()
127 self.m_RadarControllerHeader = RadarControllerHeader()
128
128
129 self.m_ProcessingHeader = ProcessingHeader()
129 self.m_ProcessingHeader = ProcessingHeader()
130
130
131 self.online = 0
131 self.online = 0
132
132
133 self.fp = None
133 self.fp = None
134
134
135 self.fileSizeByHeader = None
135 self.fileSizeByHeader = None
136
136
137 self.filenameList = []
137 self.filenameList = []
138
138
139 self.filename = None
139 self.filename = None
140
140
141 self.fileSize = None
141 self.fileSize = None
142
142
143 self.firstHeaderSize = 0
143 self.firstHeaderSize = 0
144
144
145 self.basicHeaderSize = 24
145 self.basicHeaderSize = 24
146
146
147 self.dataType = None
147 self.dataType = None
148
148
149 self.maxTimeStep = 30
149 self.maxTimeStep = 30
150
150
151 self.flagNoMoreFiles = 0
151 self.flagNoMoreFiles = 0
152
152
153 self.set = 0
153 self.set = 0
154
154
155 self.path = None
155 self.path = None
156
156
157 self.delay = 3 #seconds
157 self.delay = 3 #seconds
158
158
159 self.nTries = 3 #quantity tries
159 self.nTries = 3 #quantity tries
160
160
161 self.nFiles = 3 #number of files for searching
161 self.nFiles = 3 #number of files for searching
162
162
163 self.nReadBlocks = 0
163 self.nReadBlocks = 0
164
164
165 self.flagIsNewFile = 1
165 self.flagIsNewFile = 1
166
166
167 self.ippSeconds = 0
167 self.ippSeconds = 0
168
168
169 self.flagResetProcessing = 0
169 self.flagResetProcessing = 0
170
170
171 self.flagIsNewBlock = 0
171 self.flagIsNewBlock = 0
172
172
173 self.nTotalBlocks = 0
173 self.nTotalBlocks = 0
174
174
175 self.blocksize = 0
175 self.blocksize = 0
176
176
177 #pairList = None
177 #pairList = None
178
178
179 channelList = None
179 channelList = None
180
180
181
181
182 def __hasNotDataInBuffer(self):
182 def __hasNotDataInBuffer(self):
183 return 1
183 return 1
184
184
185
185
186 def getBlockDimension(self):
186 def getBlockDimension(self):
187 """
187 """
188 Obtiene la cantidad de puntos a leer por cada bloque de datos
188 Obtiene la cantidad de puntos a leer por cada bloque de datos
189
189
190 Affected:
190 Affected:
191 self.nChannels
191 self.nChannels
192 self.nPairs
192 self.nPairs
193 self.pts2read_SelfSpectra
193 self.pts2read_SelfSpectra
194 self.pts2read_CrossSpectra
194 self.pts2read_CrossSpectra
195 self.pts2read_DCchannels
195 self.pts2read_DCchannels
196 self.blocksize
196 self.blocksize
197 self.m_DataObj.nChannels
197 self.m_DataObj.nChannels
198 self.m_DataObj.nPairs
198 self.m_DataObj.nPairs
199
199
200 Return:
200 Return:
201 None
201 None
202 """
202 """
203 self.nChannels = 0
203 self.nChannels = 0
204 self.nPairs = 0
204 self.nPairs = 0
205 self.pairList = []
205 self.pairList = []
206
206
207 for i in range( 0, self.m_ProcessingHeader.totalSpectra*2, 2 ):
207 for i in range( 0, self.m_ProcessingHeader.totalSpectra*2, 2 ):
208 if self.m_ProcessingHeader.spectraComb[i] == self.m_ProcessingHeader.spectraComb[i+1]:
208 if self.m_ProcessingHeader.spectraComb[i] == self.m_ProcessingHeader.spectraComb[i+1]:
209 self.nChannels = self.nChannels + 1 #par de canales iguales
209 self.nChannels = self.nChannels + 1 #par de canales iguales
210 else:
210 else:
211 self.nPairs = self.nPairs + 1 #par de canales diferentes
211 self.nPairs = self.nPairs + 1 #par de canales diferentes
212 self.pairList.append( (self.m_ProcessingHeader.spectraComb[i], self.m_ProcessingHeader.spectraComb[i+1]) )
212 self.pairList.append( (self.m_ProcessingHeader.spectraComb[i], self.m_ProcessingHeader.spectraComb[i+1]) )
213
213
214 pts2read = self.m_ProcessingHeader.numHeights * self.m_ProcessingHeader.profilesPerBlock
214 pts2read = self.m_ProcessingHeader.numHeights * self.m_ProcessingHeader.profilesPerBlock
215
215
216 self.pts2read_SelfSpectra = int( self.nChannels * pts2read )
216 self.pts2read_SelfSpectra = int( self.nChannels * pts2read )
217 self.pts2read_CrossSpectra = int( self.nPairs * pts2read )
217 self.pts2read_CrossSpectra = int( self.nPairs * pts2read )
218 self.pts2read_DCchannels = int( self.m_SystemHeader.numChannels * self.m_ProcessingHeader.numHeights )
218 self.pts2read_DCchannels = int( self.m_SystemHeader.numChannels * self.m_ProcessingHeader.numHeights )
219
219
220 self.blocksize = self.pts2read_SelfSpectra + self.pts2read_CrossSpectra + self.pts2read_DCchannels
220 self.blocksize = self.pts2read_SelfSpectra + self.pts2read_CrossSpectra + self.pts2read_DCchannels
221
221
222 self.channelList = numpy.arange( self.nChannels )
222 self.channelList = numpy.arange( self.nChannels )
223
223
224
224
225 def readBlock(self):
225 def readBlock(self):
226 """
226 """
227 Lee el bloque de datos desde la posicion actual del puntero del archivo
227 Lee el bloque de datos desde la posicion actual del puntero del archivo
228 (self.fp) y actualiza todos los parametros relacionados al bloque de datos
228 (self.fp) y actualiza todos los parametros relacionados al bloque de datos
229 (metadata + data). La data leida es almacenada en el buffer y el contador del buffer
229 (metadata + data). La data leida es almacenada en el buffer y el contador del buffer
230 es seteado a 0
230 es seteado a 0
231
231
232 Return: None
232 Return: None
233
233
234 Variables afectadas:
234 Variables afectadas:
235 self.datablockIndex
235 self.datablockIndex
236 self.flagIsNewFile
236 self.flagIsNewFile
237 self.flagIsNewBlock
237 self.flagIsNewBlock
238 self.nTotalBlocks
238 self.nTotalBlocks
239 self.data_spc
239 self.data_spc
240 self.data_cspc
240 self.data_cspc
241 self.data_dc
241 self.data_dc
242
242
243 Exceptions:
243 Exceptions:
244 Si un bloque leido no es un bloque valido
244 Si un bloque leido no es un bloque valido
245 """
245 """
246 blockOk_flag = False
246 blockOk_flag = False
247 fpointer = self.fp.tell()
247 fpointer = self.fp.tell()
248
248
249 spc = numpy.fromfile( self.fp, self.dataType[0], self.pts2read_SelfSpectra )
249 spc = numpy.fromfile( self.fp, self.dataType[0], self.pts2read_SelfSpectra )
250 cspc = numpy.fromfile( self.fp, self.dataType, self.pts2read_CrossSpectra )
250 cspc = numpy.fromfile( self.fp, self.dataType, self.pts2read_CrossSpectra )
251 dc = numpy.fromfile( self.fp, self.dataType, self.pts2read_DCchannels ) #int(self.m_ProcessingHeader.numHeights*self.m_SystemHeader.numChannels) )
251 dc = numpy.fromfile( self.fp, self.dataType, self.pts2read_DCchannels ) #int(self.m_ProcessingHeader.numHeights*self.m_SystemHeader.numChannels) )
252
252
253 try:
253 try:
254 spc = spc.reshape( (self.nChannels, self.m_ProcessingHeader.numHeights, self.m_ProcessingHeader.profilesPerBlock) ) #transforma a un arreglo 3D
254 spc = spc.reshape( (self.nChannels, self.m_ProcessingHeader.numHeights, self.m_ProcessingHeader.profilesPerBlock) ) #transforma a un arreglo 3D
255 if self.nPairs != 0:
255 if self.nPairs != 0:
256 cspc = cspc.reshape( (self.nPairs, self.m_ProcessingHeader.numHeights, self.m_ProcessingHeader.profilesPerBlock) ) #transforma a un arreglo 3D
256 cspc = cspc.reshape( (self.nPairs, self.m_ProcessingHeader.numHeights, self.m_ProcessingHeader.profilesPerBlock) ) #transforma a un arreglo 3D
257 else:
257 else:
258 cspc = None
258 cspc = None
259 dc = dc.reshape( (self.m_SystemHeader.numChannels, self.m_ProcessingHeader.numHeights) ) #transforma a un arreglo 2D
259 dc = dc.reshape( (self.m_SystemHeader.numChannels, self.m_ProcessingHeader.numHeights) ) #transforma a un arreglo 2D
260 except:
260 except:
261 print "Data file %s is invalid" % self.filename
261 print "Data file %s is invalid" % self.filename
262 return 0
262 return 0
263
263
264 if not( self.m_ProcessingHeader.shif_fft ):
264 if not( self.m_ProcessingHeader.shif_fft ):
265 spc = numpy.roll( spc, self.m_ProcessingHeader.profilesPerBlock/2, axis=2 ) #desplaza a la derecha en el eje 2 determinadas posiciones
265 spc = numpy.roll( spc, self.m_ProcessingHeader.profilesPerBlock/2, axis=2 ) #desplaza a la derecha en el eje 2 determinadas posiciones
266 if cspc != None:
266
267 cspc = numpy.roll( cspc, self.m_ProcessingHeader.profilesPerBlock/2, axis=2 ) #desplaza a la derecha en el eje 2 determinadas posiciones
267 if cspc != None:
268
268 cspc = numpy.roll( cspc, self.m_ProcessingHeader.profilesPerBlock/2, axis=2 ) #desplaza a la derecha en el eje 2 determinadas posiciones
269 spc = numpy.transpose( spc, (0,2,1) )
269
270 if cspc != None: cspc = numpy.transpose( cspc, (0,2,1) )
270 spc = numpy.transpose( spc, (0,2,1) )
271
271
272 self.data_spc = spc
272 if cspc != None:
273 if cspc != None:
273 cspc = numpy.transpose( cspc, (0,2,1) )
274 self.data_cspc = cspc['real'] + cspc['imag']*1j
274
275 else:
275
276 self.data_cspc = None
276 if cspc != None:
277 self.data_dc = dc['real'] + dc['imag']*1j
277 self.data_cspc = cspc['real'] + cspc['imag']*1j
278
278 else:
279 self.datablockIndex = 0
279 self.data_cspc = None
280 self.flagIsNewFile = 0
280
281 self.flagIsNewBlock = 1
281 self.data_spc = spc
282
282 self.data_dc = dc['real'] + dc['imag']*1j
283 self.nTotalBlocks += 1
283
284 self.nReadBlocks += 1
284 self.datablockIndex = 0
285
285 self.flagIsNewFile = 0
286 return 1
286 self.flagIsNewBlock = 1
287
287
288
288 self.nTotalBlocks += 1
289 def getData(self):
289 self.nReadBlocks += 1
290 """
290
291 Copia el buffer de lectura a la clase "Spectra",
291 return 1
292 con todos los parametros asociados a este (metadata). cuando no hay datos en el buffer de
292
293 lectura es necesario hacer una nueva lectura de los bloques de datos usando "readNextBlock"
293
294
294 def getData(self):
295 Return:
295 """
296 0 : Si no hay mas archivos disponibles
296 Copia el buffer de lectura a la clase "Spectra",
297 1 : Si hizo una buena copia del buffer
297 con todos los parametros asociados a este (metadata). cuando no hay datos en el buffer de
298
298 lectura es necesario hacer una nueva lectura de los bloques de datos usando "readNextBlock"
299 Affected:
299
300 self.m_DataObj
300 Return:
301 self.datablockIndex
301 0 : Si no hay mas archivos disponibles
302 self.flagResetProcessing
302 1 : Si hizo una buena copia del buffer
303 self.flagIsNewBlock
303
304 """
304 Affected:
305
305 self.m_DataObj
306 if self.flagNoMoreFiles: return 0
306 self.datablockIndex
307
307 self.flagResetProcessing
308 self.flagResetProcessing = 0
308 self.flagIsNewBlock
309 self.flagIsNewBlock = 0
309 """
310
310
311 if self.__hasNotDataInBuffer():
311 if self.flagNoMoreFiles: return 0
312
312
313 if not( self.readNextBlock() ):
313 self.flagResetProcessing = 0
314 return 0
314 self.flagIsNewBlock = 0
315
315
316 self.updateDataHeader()
316 if self.__hasNotDataInBuffer():
317
317
318 if self.flagNoMoreFiles == 1:
318 if not( self.readNextBlock() ):
319 print 'Process finished'
319 return 0
320 return 0
320
321
321 self.updateDataHeader()
322 #data es un numpy array de 3 dmensiones (perfiles, alturas y canales)
322
323
323 if self.flagNoMoreFiles == 1:
324 if self.data_dc == None:
324 print 'Process finished'
325 self.m_DataObj.flagNoData = True
325 return 0
326 return 0
326
327
327 #data es un numpy array de 3 dmensiones (perfiles, alturas y canales)
328 self.m_DataObj.flagNoData = False
328
329 self.m_DataObj.flagResetProcessing = self.flagResetProcessing
329 if self.data_dc == None:
330
330 self.m_DataObj.flagNoData = True
331 self.m_DataObj.data_spc = self.data_spc
331 return 0
332 self.m_DataObj.data_cspc = self.data_cspc
332
333 self.m_DataObj.data_dc = self.data_dc
333 self.m_DataObj.flagNoData = False
334
334 self.m_DataObj.flagResetProcessing = self.flagResetProcessing
335 return 1
335
336
336 self.m_DataObj.data_spc = self.data_spc
337
337 self.m_DataObj.data_cspc = self.data_cspc
338 class SpectraWriter(JRODataWriter):
338 self.m_DataObj.data_dc = self.data_dc
339
339
340 """
340 return 1
341 Esta clase permite escribir datos de espectros a archivos procesados (.pdata). La escritura
341
342 de los datos siempre se realiza por bloques.
342
343 """
343 class SpectraWriter(JRODataWriter):
344
344
345 m_DataObj = None
345 """
346
346 Esta clase permite escribir datos de espectros a archivos procesados (.pdata). La escritura
347 shape_spc_Buffer = None
347 de los datos siempre se realiza por bloques.
348 shape_cspc_Buffer = None
348 """
349 shape_dc_Buffer = None
349
350
350 m_DataObj = None
351 data_spc = None
351
352 data_cspc = None
352 shape_spc_Buffer = None
353 data_dc = None
353 shape_cspc_Buffer = None
354
354 shape_dc_Buffer = None
355
355
356 def __init__(self, m_Spectra=None):
356 data_spc = None
357 """
357 data_cspc = None
358 Inicializador de la clase SpectraWriter para la escritura de datos de espectros.
358 data_dc = None
359
359
360 Affected:
360
361 self.m_DataObj
361 def __init__(self, m_Spectra=None):
362 self.m_BasicHeader
362 """
363 self.m_SystemHeader
363 Inicializador de la clase SpectraWriter para la escritura de datos de espectros.
364 self.m_RadarControllerHeader
364
365 self.m_ProcessingHeader
365 Affected:
366
366 self.m_DataObj
367 Return: None
367 self.m_BasicHeader
368 """
368 self.m_SystemHeader
369 if m_Spectra == None:
369 self.m_RadarControllerHeader
370 m_Spectra = Spectra()
370 self.m_ProcessingHeader
371
371
372 if not( isinstance(m_Spectra, Spectra) ):
372 Return: None
373 raise ValueError, "in SpectraReader, m_Spectra must be an Spectra class object"
373 """
374
374 if m_Spectra == None:
375 self.m_DataObj = m_Spectra
375 m_Spectra = Spectra()
376
376
377 self.ext = ".pdata"
377 if not( isinstance(m_Spectra, Spectra) ):
378
378 raise ValueError, "in SpectraReader, m_Spectra must be an Spectra class object"
379 self.optchar = "P"
379
380
380 self.m_DataObj = m_Spectra
381 self.shape_spc_Buffer = None
381
382 self.shape_cspc_Buffer = None
382 self.ext = ".pdata"
383 self.shape_dc_Buffer = None
383
384
384 self.optchar = "P"
385 self.data_spc = None
385
386 self.data_cspc = None
386 self.shape_spc_Buffer = None
387 self.data_dc = None
387 self.shape_cspc_Buffer = None
388
388 self.shape_dc_Buffer = None
389 ####################################
389
390
390 self.data_spc = None
391 self.fp = None
391 self.data_cspc = None
392
392 self.data_dc = None
393 self.nWriteBlocks = 0
393
394
394 ####################################
395 self.flagIsNewFile = 1
395
396
396 self.fp = None
397 self.nTotalBlocks = 0
397
398
398 self.nWriteBlocks = 0
399 self.flagIsNewBlock = 0
399
400
400 self.flagIsNewFile = 1
401 self.flagNoMoreFiles = 0
401
402
402 self.nTotalBlocks = 0
403 self.setFile = None
403
404
404 self.flagIsNewBlock = 0
405 self.dataType = None
405
406
406 self.flagNoMoreFiles = 0
407 self.path = None
407
408
408 self.setFile = None
409 self.noMoreFiles = 0
409
410
410 self.dataType = None
411 self.filename = None
411
412
412 self.path = None
413 self.m_BasicHeader= BasicHeader()
413
414
414 self.noMoreFiles = 0
415 self.m_SystemHeader = SystemHeader()
415
416
416 self.filename = None
417 self.m_RadarControllerHeader = RadarControllerHeader()
417
418
418 self.m_BasicHeader= BasicHeader()
419 self.m_ProcessingHeader = ProcessingHeader()
419
420
420 self.m_SystemHeader = SystemHeader()
421
421
422 def hasAllDataInBuffer(self):
422 self.m_RadarControllerHeader = RadarControllerHeader()
423 return 1
423
424
424 self.m_ProcessingHeader = ProcessingHeader()
425
425
426 def setBlockDimension(self):
426
427 """
427 def hasAllDataInBuffer(self):
428 Obtiene las formas dimensionales del los subbloques de datos que componen un bloque
428 return 1
429
429
430 Affected:
430
431 self.shape_spc_Buffer
431 def setBlockDimension(self):
432 self.shape_cspc_Buffer
432 """
433 self.shape_dc_Buffer
433 Obtiene las formas dimensionales del los subbloques de datos que componen un bloque
434
434
435 Return: None
435 Affected:
436 """
436 self.shape_spc_Buffer
437 self.shape_spc_Buffer = (self.m_DataObj.nChannels,
437 self.shape_cspc_Buffer
438 self.m_ProcessingHeader.numHeights,
438 self.shape_dc_Buffer
439 self.m_ProcessingHeader.profilesPerBlock)
439
440
440 Return: None
441 self.shape_cspc_Buffer = (self.m_DataObj.nPairs,
441 """
442 self.m_ProcessingHeader.numHeights,
442 self.shape_spc_Buffer = (self.m_DataObj.nChannels,
443 self.m_ProcessingHeader.profilesPerBlock)
443 self.m_ProcessingHeader.numHeights,
444
444 self.m_ProcessingHeader.profilesPerBlock)
445 self.shape_dc_Buffer = (self.m_SystemHeader.numChannels,
445
446 self.m_ProcessingHeader.numHeights)
446 self.shape_cspc_Buffer = (self.m_DataObj.nPairs,
447
447 self.m_ProcessingHeader.numHeights,
448
448 self.m_ProcessingHeader.profilesPerBlock)
449 def writeBlock(self):
449
450 """
450 self.shape_dc_Buffer = (self.m_SystemHeader.numChannels,
451 Escribe el buffer en el file designado
451 self.m_ProcessingHeader.numHeights)
452
452
453 Affected:
453
454 self.data_spc
454 def writeBlock(self):
455 self.data_cspc
455 """
456 self.data_dc
456 Escribe el buffer en el file designado
457 self.flagIsNewFile
457
458 self.flagIsNewBlock
458 Affected:
459 self.nTotalBlocks
459 self.data_spc
460 self.nWriteBlocks
460 self.data_cspc
461
461 self.data_dc
462 Return: None
462 self.flagIsNewFile
463 """
463 self.flagIsNewBlock
464
464 self.nTotalBlocks
465 spc = numpy.transpose( self.data_spc, (0,2,1) )
465 self.nWriteBlocks
466 if not( self.m_ProcessingHeader.shif_fft ):
466
467 spc = numpy.roll( spc, self.m_ProcessingHeader.profilesPerBlock/2, axis=2 ) #desplaza a la derecha en el eje 2 determinadas posiciones
467 Return: None
468 data = spc.reshape((-1))
468 """
469 data.tofile(self.fp)
469
470
470 spc = numpy.transpose( self.data_spc, (0,2,1) )
471 if self.data_cspc != None:
471 if not( self.m_ProcessingHeader.shif_fft ):
472 data = numpy.zeros( self.shape_cspc_Buffer, self.dataType )
472 spc = numpy.roll( spc, self.m_ProcessingHeader.profilesPerBlock/2, axis=2 ) #desplaza a la derecha en el eje 2 determinadas posiciones
473 cspc = numpy.transpose( self.data_cspc, (0,2,1) )
473 data = spc.reshape((-1))
474 if not( self.m_ProcessingHeader.shif_fft ):
474 data.tofile(self.fp)
475 cspc = numpy.roll( cspc, self.m_ProcessingHeader.profilesPerBlock/2, axis=2 ) #desplaza a la derecha en el eje 2 determinadas posiciones
475
476 data['real'] = cspc.real
476 if self.data_cspc != None:
477 data['imag'] = cspc.imag
477 data = numpy.zeros( self.shape_cspc_Buffer, self.dataType )
478 data = data.reshape((-1))
478 cspc = numpy.transpose( self.data_cspc, (0,2,1) )
479 data.tofile(self.fp)
479 if not( self.m_ProcessingHeader.shif_fft ):
480
480 cspc = numpy.roll( cspc, self.m_ProcessingHeader.profilesPerBlock/2, axis=2 ) #desplaza a la derecha en el eje 2 determinadas posiciones
481 data = numpy.zeros( self.shape_dc_Buffer, self.dataType )
481 data['real'] = cspc.real
482 dc = self.data_dc
482 data['imag'] = cspc.imag
483 data['real'] = dc.real
483 data = data.reshape((-1))
484 data['imag'] = dc.imag
484 data.tofile(self.fp)
485 data = data.reshape((-1))
485
486 data.tofile(self.fp)
486 data = numpy.zeros( self.shape_dc_Buffer, self.dataType )
487
487 dc = self.data_dc
488 self.data_spc.fill(0)
488 data['real'] = dc.real
489 self.data_dc.fill(0)
489 data['imag'] = dc.imag
490 if self.data_cspc != None:
490 data = data.reshape((-1))
491 self.data_cspc.fill(0)
491 data.tofile(self.fp)
492
492
493 self.flagIsNewFile = 0
493 self.data_spc.fill(0)
494 self.flagIsNewBlock = 1
494 self.data_dc.fill(0)
495 self.nTotalBlocks += 1
495 if self.data_cspc != None:
496 self.nWriteBlocks += 1
496 self.data_cspc.fill(0)
497
497
498
498 self.flagIsNewFile = 0
499 def putData(self):
499 self.flagIsNewBlock = 1
500 """
500 self.nTotalBlocks += 1
501 Setea un bloque de datos y luego los escribe en un file
501 self.nWriteBlocks += 1
502
502
503 Affected:
503
504 self.data_spc
504 def putData(self):
505 self.data_cspc
505 """
506 self.data_dc
506 Setea un bloque de datos y luego los escribe en un file
507
507
508 Return:
508 Affected:
509 0 : Si no hay data o no hay mas files que puedan escribirse
509 self.data_spc
510 1 : Si se escribio la data de un bloque en un file
510 self.data_cspc
511 """
511 self.data_dc
512 self.flagIsNewBlock = 0
512
513
513 Return:
514 if self.m_DataObj.flagNoData:
514 0 : Si no hay data o no hay mas files que puedan escribirse
515 return 0
515 1 : Si se escribio la data de un bloque en un file
516
516 """
517 if self.m_DataObj.flagResetProcessing:
517 self.flagIsNewBlock = 0
518 self.data_spc.fill(0)
518
519 self.data_cspc.fill(0)
519 if self.m_DataObj.flagNoData:
520 self.data_dc.fill(0)
520 return 0
521 self.setNextFile()
521
522
522 if self.m_DataObj.flagResetProcessing:
523 self.data_spc = self.m_DataObj.data_spc
523 self.data_spc.fill(0)
524 self.data_cspc = self.m_DataObj.data_cspc
524 self.data_cspc.fill(0)
525 self.data_dc = self.m_DataObj.data_dc
525 self.data_dc.fill(0)
526
526 self.setNextFile()
527 # #self.m_ProcessingHeader.dataBlocksPerFile)
527
528 if self.hasAllDataInBuffer():
528 self.data_spc = self.m_DataObj.data_spc
529 self.getDataHeader()
529 self.data_cspc = self.m_DataObj.data_cspc
530 self.writeNextBlock()
530 self.data_dc = self.m_DataObj.data_dc
531
531
532 if self.flagNoMoreFiles:
532 # #self.m_ProcessingHeader.dataBlocksPerFile)
533 #print 'Process finished'
533 if self.hasAllDataInBuffer():
534 return 0
534 self.getDataHeader()
535
535 self.writeNextBlock()
536
537 if self.flagNoMoreFiles:
538 #print 'Process finished'
539 return 0
540
536 return 1 No newline at end of file
541 return 1
@@ -1,57 +1,57
1 '''
1 '''
2 Created on 23/01/2012
2 Created on 23/01/2012
3
3
4 @author $Author$
4 @author $Author$
5 @version $Id$
5 @version $Id$
6 '''
6 '''
7 import os
7 import os
8 import sys
8 import sys
9 import datetime
9 import datetime
10 import time
10 import time
11
11
12 class TestIO():
12 class TestIO:
13
13
14 def __init__(self):
14 def __init__(self):
15 self.setValues()
15 self.setValues()
16 self.createVoltageObjects()
16 self.createVoltageObjects()
17 self.testReadVoltage()
17 self.testReadVoltage()
18 pass
18 pass
19
19
20 def setValues(self):
20 def setValues(self):
21
21
22
22
23 self.path = '/Users/danielangelsuarezmunoz/Documents/Projects/testWR'
23 self.path = '/Users/danielangelsuarezmunoz/Documents/Projects/testWR'
24 self.startDateTime = datetime.datetime(2007,5,1,17,49,0)
24 self.startDateTime = datetime.datetime(2007,5,1,17,49,0)
25 self.endDateTime = datetime.datetime(2007,5,1,18,15,0)
25 self.endDateTime = datetime.datetime(2007,5,1,18,15,0)
26
26
27 def createVoltageObjects(self):
27 def createVoltageObjects(self):
28 path = os.path.split(os.getcwd())[0]
28 path = os.path.split(os.getcwd())[0]
29 sys.path.append(path)
29 sys.path.append(path)
30
30
31 from IO.VoltageIO import VoltageReader
31 from IO.VoltageIO import VoltageReader
32 from IO.VoltageIO import VoltageWriter
32 from IO.VoltageIO import VoltageWriter
33 from Model.Voltage import Voltage
33 from Model.Voltage import Voltage
34
34
35 self.voltageModelObj = Voltage()
35 self.voltageModelObj = Voltage()
36 self.voltageReaderObj = VoltageReader(self.voltageModelObj)
36 self.voltageReaderObj = VoltageReader(self.voltageModelObj)
37 self.voltageReaderObj.setup(self.path, self.startDateTime, self.endDateTime)
37 self.voltageReaderObj.setup(self.path, self.startDateTime, self.endDateTime)
38
38
39 # self.voltageWriterObj = VoltageWriter(self.voltageModelObj)
39 # self.voltageWriterObj = VoltageWriter(self.voltageModelObj)
40 # self.voltageWriterObj.setup('/Users/danielangelsuarezmunoz/Documents/Projects/testWR')
40 # self.voltageWriterObj.setup('/Users/danielangelsuarezmunoz/Documents/Projects/testWR')
41
41
42
42
43 def testReadVoltage(self):
43 def testReadVoltage(self):
44 while(not(self.voltageReaderObj.noMoreFiles)):
44 while(not(self.voltageReaderObj.noMoreFiles)):
45
45
46 self.voltageReaderObj.getData()
46 self.voltageReaderObj.getData()
47 if self.voltageReaderObj.flagResetProcessing:
47 if self.voltageReaderObj.flagResetProcessing:
48 print 'jump'
48 print 'jump'
49
49
50 if self.voltageReaderObj.flagIsNewBlock:
50 if self.voltageReaderObj.flagIsNewBlock:
51 print 'Block No %04d, Time: %s'%(self.voltageReaderObj.nTotalBlocks,
51 print 'Block No %04d, Time: %s'%(self.voltageReaderObj.nTotalBlocks,
52 datetime.datetime.fromtimestamp(self.voltageReaderObj.m_BasicHeader.utc))
52 datetime.datetime.fromtimestamp(self.voltageReaderObj.m_BasicHeader.utc))
53
53
54 # self.voltageWriterObj.putData()
54 # self.voltageWriterObj.putData()
55
55
56 if __name__ == '__main__':
56 if __name__ == '__main__':
57 TestIO() No newline at end of file
57 TestIO()
@@ -1,434 +1,434
1 '''
1 '''
2 Created on 23/01/2012
2 Created on 23/01/2012
3
3
4 @author $Author$
4 @author $Author$
5 @version $Id$
5 @version $Id$
6 '''
6 '''
7
7
8 import os, sys
8 import os, sys
9 import numpy
9 import numpy
10 import glob
10 import glob
11 import fnmatch
11 import fnmatch
12 import time, datetime
12 import time, datetime
13
13
14 path = os.path.split(os.getcwd())[0]
14 path = os.path.split(os.getcwd())[0]
15 sys.path.append(path)
15 sys.path.append(path)
16
16
17 from Model.JROHeader import *
17 from Model.JROHeader import *
18 from Model.Voltage import Voltage
18 from Model.Voltage import Voltage
19
19
20 from IO.JRODataIO import JRODataReader
20 from IO.JRODataIO import JRODataReader
21 from IO.JRODataIO import JRODataWriter
21 from IO.JRODataIO import JRODataWriter
22
22
23
23
24 class VoltageReader(JRODataReader):
24 class VoltageReader(JRODataReader):
25 """
25 """
26 Esta clase permite leer datos de voltage desde archivos en formato rawdata (.r). La lectura
26 Esta clase permite leer datos de voltage desde archivos en formato rawdata (.r). La lectura
27 de los datos siempre se realiza por bloques. Los datos leidos (array de 3 dimensiones:
27 de los datos siempre se realiza por bloques. Los datos leidos (array de 3 dimensiones:
28 perfiles*alturas*canales) son almacenados en la variable "buffer".
28 perfiles*alturas*canales) son almacenados en la variable "buffer".
29
29
30 perfiles * alturas * canales
30 perfiles * alturas * canales
31
31
32 Esta clase contiene instancias (objetos) de las clases BasicHeader, SystemHeader,
32 Esta clase contiene instancias (objetos) de las clases BasicHeader, SystemHeader,
33 RadarControllerHeader y Voltage. Los tres primeros se usan para almacenar informacion de la
33 RadarControllerHeader y Voltage. Los tres primeros se usan para almacenar informacion de la
34 cabecera de datos (metadata), y el cuarto (Voltage) para obtener y almacenar un perfil de
34 cabecera de datos (metadata), y el cuarto (Voltage) para obtener y almacenar un perfil de
35 datos desde el "buffer" cada vez que se ejecute el metodo "getData".
35 datos desde el "buffer" cada vez que se ejecute el metodo "getData".
36
36
37 Example:
37 Example:
38
38
39 dpath = "/home/myuser/data"
39 dpath = "/home/myuser/data"
40
40
41 startTime = datetime.datetime(2010,1,20,0,0,0,0,0,0)
41 startTime = datetime.datetime(2010,1,20,0,0,0,0,0,0)
42
42
43 endTime = datetime.datetime(2010,1,21,23,59,59,0,0,0)
43 endTime = datetime.datetime(2010,1,21,23,59,59,0,0,0)
44
44
45 readerObj = VoltageReader()
45 readerObj = VoltageReader()
46
46
47 readerObj.setup(dpath, startTime, endTime)
47 readerObj.setup(dpath, startTime, endTime)
48
48
49 while(True):
49 while(True):
50
50
51 #to get one profile
51 #to get one profile
52 profile = readerObj.getData()
52 profile = readerObj.getData()
53
53
54 #print the profile
54 #print the profile
55 print profile
55 print profile
56
56
57 #If you want to see all datablock
57 #If you want to see all datablock
58 print readerObj.datablock
58 print readerObj.datablock
59
59
60 if readerObj.flagNoMoreFiles:
60 if readerObj.flagNoMoreFiles:
61 break
61 break
62
62
63 """
63 """
64 m_DataObj = None
64 m_DataObj = None
65
65
66 datablock = None
66 datablock = None
67
67
68 ext = ".r"
68 ext = ".r"
69
69
70 optchar = "D"
70 optchar = "D"
71
71
72
72
73 def __init__(self, m_Voltage=None):
73 def __init__(self, m_Voltage=None):
74 """
74 """
75 Inicializador de la clase VoltageReader para la lectura de datos de voltage.
75 Inicializador de la clase VoltageReader para la lectura de datos de voltage.
76
76
77 Input:
77 Input:
78 m_Voltage : Objeto de la clase Voltage. Este objeto sera utilizado para
78 m_Voltage : Objeto de la clase Voltage. Este objeto sera utilizado para
79 almacenar un perfil de datos cada vez que se haga un requerimiento
79 almacenar un perfil de datos cada vez que se haga un requerimiento
80 (getData). El perfil sera obtenido a partir del buffer de datos,
80 (getData). El perfil sera obtenido a partir del buffer de datos,
81 si el buffer esta vacio se hara un nuevo proceso de lectura de un
81 si el buffer esta vacio se hara un nuevo proceso de lectura de un
82 bloque de datos.
82 bloque de datos.
83 Si este parametro no es pasado se creara uno internamente.
83 Si este parametro no es pasado se creara uno internamente.
84
84
85 Variables afectadas:
85 Variables afectadas:
86 self.m_DataObj
86 self.m_DataObj
87
87
88 Return:
88 Return:
89 None
89 None
90 """
90 """
91 if m_Voltage == None:
91 if m_Voltage == None:
92 m_Voltage = Voltage()
92 m_Voltage = Voltage()
93
93
94 if not(isinstance(m_Voltage, Voltage)):
94 if not(isinstance(m_Voltage, Voltage)):
95 raise ValueError, "in VoltageReader, m_Voltage must be an Voltage class object"
95 raise ValueError, "in VoltageReader, m_Voltage must be an Voltage class object"
96
96
97 self.m_DataObj = m_Voltage
97 self.m_DataObj = m_Voltage
98
98
99 self.datablock = None
99 self.datablock = None
100
100
101 self.utc = 0
101 self.utc = 0
102
102
103 self.ext = ".r"
103 self.ext = ".r"
104
104
105 self.optchar = "D"
105 self.optchar = "D"
106
106
107 self.m_BasicHeader = BasicHeader()
107 self.m_BasicHeader = BasicHeader()
108
108
109 self.m_SystemHeader = SystemHeader()
109 self.m_SystemHeader = SystemHeader()
110
110
111 self.m_RadarControllerHeader = RadarControllerHeader()
111 self.m_RadarControllerHeader = RadarControllerHeader()
112
112
113 self.m_ProcessingHeader = ProcessingHeader()
113 self.m_ProcessingHeader = ProcessingHeader()
114
114
115 self.online = 0
115 self.online = 0
116
116
117 self.fp = None
117 self.fp = None
118
118
119 self.idFile = None
119 self.idFile = None
120
120
121 self.startDateTime = None
121 self.startDateTime = None
122
122
123 self.endDateTime = None
123 self.endDateTime = None
124
124
125 self.dataType = None
125 self.dataType = None
126
126
127 self.fileSizeByHeader = None
127 self.fileSizeByHeader = None
128
128
129 self.filenameList = []
129 self.filenameList = []
130
130
131 self.filename = None
131 self.filename = None
132
132
133 self.fileSize = None
133 self.fileSize = None
134
134
135 self.firstHeaderSize = 0
135 self.firstHeaderSize = 0
136
136
137 self.basicHeaderSize = 24
137 self.basicHeaderSize = 24
138
138
139 self.pathList = []
139 self.pathList = []
140
140
141 self.filenameList = []
141 self.filenameList = []
142
142
143 self.lastUTTime = 0
143 self.lastUTTime = 0
144
144
145 self.maxTimeStep = 30
145 self.maxTimeStep = 30
146
146
147 self.flagNoMoreFiles = 0
147 self.flagNoMoreFiles = 0
148
148
149 self.set = 0
149 self.set = 0
150
150
151 self.path = None
151 self.path = None
152
152
153 self.profileIndex = 9999
153 self.profileIndex = 9999
154
154
155 self.delay = 3 #seconds
155 self.delay = 3 #seconds
156
156
157 self.nTries = 3 #quantity tries
157 self.nTries = 3 #quantity tries
158
158
159 self.nFiles = 3 #number of files for searching
159 self.nFiles = 3 #number of files for searching
160
160
161 self.nReadBlocks = 0
161 self.nReadBlocks = 0
162
162
163 self.flagIsNewFile = 1
163 self.flagIsNewFile = 1
164
164
165 self.ippSeconds = 0
165 self.ippSeconds = 0
166
166
167 self.flagResetProcessing = 0
167 self.flagResetProcessing = 0
168
168
169 self.flagIsNewBlock = 0
169 self.flagIsNewBlock = 0
170
170
171 self.nTotalBlocks = 0
171 self.nTotalBlocks = 0
172
172
173 self.blocksize = 0
173 self.blocksize = 0
174
174
175 def __hasNotDataInBuffer(self):
175 def __hasNotDataInBuffer(self):
176 if self.profileIndex >= self.m_ProcessingHeader.profilesPerBlock:
176 if self.profileIndex >= self.m_ProcessingHeader.profilesPerBlock:
177 return 1
177 return 1
178 return 0
178 return 0
179
179
180
180
181 def getBlockDimension(self):
181 def getBlockDimension(self):
182 """
182 """
183 Obtiene la cantidad de puntos a leer por cada bloque de datos
183 Obtiene la cantidad de puntos a leer por cada bloque de datos
184
184
185 Affected:
185 Affected:
186 self.blocksize
186 self.blocksize
187
187
188 Return:
188 Return:
189 None
189 None
190 """
190 """
191 pts2read = self.m_ProcessingHeader.profilesPerBlock * self.m_ProcessingHeader.numHeights * self.m_SystemHeader.numChannels
191 pts2read = self.m_ProcessingHeader.profilesPerBlock * self.m_ProcessingHeader.numHeights * self.m_SystemHeader.numChannels
192 self.blocksize = pts2read
192 self.blocksize = pts2read
193
193
194
194
195 def readBlock(self):
195 def readBlock(self):
196 """
196 """
197 readBlock lee el bloque de datos desde la posicion actual del puntero del archivo
197 readBlock lee el bloque de datos desde la posicion actual del puntero del archivo
198 (self.fp) y actualiza todos los parametros relacionados al bloque de datos
198 (self.fp) y actualiza todos los parametros relacionados al bloque de datos
199 (metadata + data). La data leida es almacenada en el buffer y el contador del buffer
199 (metadata + data). La data leida es almacenada en el buffer y el contador del buffer
200 es seteado a 0
200 es seteado a 0
201
201
202 Inputs:
202 Inputs:
203 None
203 None
204
204
205 Return:
205 Return:
206 None
206 None
207
207
208 Affected:
208 Affected:
209 self.profileIndex
209 self.profileIndex
210 self.datablock
210 self.datablock
211 self.flagIsNewFile
211 self.flagIsNewFile
212 self.flagIsNewBlock
212 self.flagIsNewBlock
213 self.nTotalBlocks
213 self.nTotalBlocks
214
214
215 Exceptions:
215 Exceptions:
216 Si un bloque leido no es un bloque valido
216 Si un bloque leido no es un bloque valido
217 """
217 """
218
218
219 junk = numpy.fromfile( self.fp, self.dataType, self.blocksize )
219 junk = numpy.fromfile( self.fp, self.dataType, self.blocksize )
220
220
221 try:
221 try:
222 junk = junk.reshape( (self.m_ProcessingHeader.profilesPerBlock, self.m_ProcessingHeader.numHeights, self.m_SystemHeader.numChannels) )
222 junk = junk.reshape( (self.m_ProcessingHeader.profilesPerBlock, self.m_ProcessingHeader.numHeights, self.m_SystemHeader.numChannels) )
223 except:
223 except:
224 print "The read block (%3d) has not enough data" %self.nReadBlocks
224 print "The read block (%3d) has not enough data" %self.nReadBlocks
225 return 0
225 return 0
226
226
227 junk = numpy.transpose(junk, (2,0,1))
227 junk = numpy.transpose(junk, (2,0,1))
228 self.datablock = junk['real'] + junk['imag']*1j
228 self.datablock = junk['real'] + junk['imag']*1j
229
229
230 self.profileIndex = 0
230 self.profileIndex = 0
231
231
232 self.flagIsNewFile = 0
232 self.flagIsNewFile = 0
233 self.flagIsNewBlock = 1
233 self.flagIsNewBlock = 1
234
234
235 self.nTotalBlocks += 1
235 self.nTotalBlocks += 1
236 self.nReadBlocks += 1
236 self.nReadBlocks += 1
237
237
238 return 1
238 return 1
239
239
240
240
241 def getData(self):
241 def getData(self):
242 """
242 """
243 getData obtiene una unidad de datos del buffer de lectura y la copia a la clase "Voltage"
243 getData obtiene una unidad de datos del buffer de lectura y la copia a la clase "Voltage"
244 con todos los parametros asociados a este (metadata). cuando no hay datos en el buffer de
244 con todos los parametros asociados a este (metadata). cuando no hay datos en el buffer de
245 lectura es necesario hacer una nueva lectura de los bloques de datos usando "readNextBlock"
245 lectura es necesario hacer una nueva lectura de los bloques de datos usando "readNextBlock"
246
246
247 Ademas incrementa el contador del buffer en 1.
247 Ademas incrementa el contador del buffer en 1.
248
248
249 Return:
249 Return:
250 data : retorna un perfil de voltages (alturas * canales) copiados desde el
250 data : retorna un perfil de voltages (alturas * canales) copiados desde el
251 buffer. Si no hay mas archivos a leer retorna None.
251 buffer. Si no hay mas archivos a leer retorna None.
252
252
253 Variables afectadas:
253 Variables afectadas:
254 self.m_DataObj
254 self.m_DataObj
255 self.profileIndex
255 self.profileIndex
256
256
257 Affected:
257 Affected:
258 self.m_DataObj
258 self.m_DataObj
259 self.profileIndex
259 self.profileIndex
260 self.flagResetProcessing
260 self.flagResetProcessing
261 self.flagIsNewBlock
261 self.flagIsNewBlock
262 """
262 """
263 if self.flagNoMoreFiles: return 0
263 if self.flagNoMoreFiles: return 0
264
264
265 self.flagResetProcessing = 0
265 self.flagResetProcessing = 0
266 self.flagIsNewBlock = 0
266 self.flagIsNewBlock = 0
267
267
268 if self.__hasNotDataInBuffer():
268 if self.__hasNotDataInBuffer():
269
269
270 if not( self.readNextBlock() ):
270 if not( self.readNextBlock() ):
271 return 0
271 return 0
272
272
273 self.updateDataHeader()
273 self.updateDataHeader()
274
274
275 if self.flagNoMoreFiles == 1:
275 if self.flagNoMoreFiles == 1:
276 print 'Process finished'
276 print 'Process finished'
277 return 0
277 return 0
278
278
279 #data es un numpy array de 3 dmensiones (perfiles, alturas y canales)
279 #data es un numpy array de 3 dmensiones (perfiles, alturas y canales)
280
280
281 if self.datablock == None:
281 if self.datablock == None:
282 self.m_DataObj.flagNoData = True
282 self.m_DataObj.flagNoData = True
283 return 0
283 return 0
284
284
285 time = self.m_BasicHeader.utc + self.profileIndex * self.ippSeconds
285 time = self.m_BasicHeader.utc + self.profileIndex * self.ippSeconds
286 self.m_DataObj.m_BasicHeader.utc = time
286 self.m_DataObj.m_BasicHeader.utc = time
287
287
288 self.m_DataObj.flagNoData = False
288 self.m_DataObj.flagNoData = False
289 self.m_DataObj.flagResetProcessing = self.flagResetProcessing
289 self.m_DataObj.flagResetProcessing = self.flagResetProcessing
290
290
291 self.m_DataObj.data = self.datablock[:,self.profileIndex,:]
291 self.m_DataObj.data = self.datablock[:,self.profileIndex,:]
292
292
293 self.profileIndex += 1
293 self.profileIndex += 1
294
294
295 #call setData - to Data Object
295 #call setData - to Data Object
296
296
297 return 1 #self.m_DataObj.data
297 return 1 #self.m_DataObj.data
298
298
299
299
300 class VoltageWriter( JRODataWriter ):
300 class VoltageWriter(JRODataWriter):
301 """
301 """
302 Esta clase permite escribir datos de voltajes a archivos procesados (.r). La escritura
302 Esta clase permite escribir datos de voltajes a archivos procesados (.r). La escritura
303 de los datos siempre se realiza por bloques.
303 de los datos siempre se realiza por bloques.
304 """
304 """
305 __configHeaderFile = 'wrSetHeadet.txt'
305 __configHeaderFile = 'wrSetHeadet.txt'
306
306
307 m_DataObj = None
307 m_DataObj = None
308
308
309 ext = ".r"
309 ext = ".r"
310
310
311 optchar = "D"
311 optchar = "D"
312
312
313 datablock = None
313 datablock = None
314
314
315 profileIndex = 0
315 profileIndex = 0
316
316
317 shapeBuffer = None
317 shapeBuffer = None
318
318
319
319
320 def __init__(self, m_Voltage=None):
320 def __init__(self, m_Voltage=None):
321 """
321 """
322 Inicializador de la clase VoltageWriter para la escritura de datos de espectros.
322 Inicializador de la clase VoltageWriter para la escritura de datos de espectros.
323
323
324 Affected:
324 Affected:
325 self.m_DataObj
325 self.m_DataObj
326
326
327 Return: None
327 Return: None
328 """
328 """
329 if m_Voltage == None:
329 if m_Voltage == None:
330 m_Voltage = Voltage()
330 m_Voltage = Voltage()
331
331
332 if not( isinstance(m_Voltage, Voltage) ):
332 if not( isinstance(m_Voltage, Voltage) ):
333 raise ValueError, "in VoltageReader, m_Voltage must be an Spectra class object"
333 raise ValueError, "in VoltageReader, m_Voltage must be an Spectra class object"
334
334
335 self.m_DataObj = m_Voltage
335 self.m_DataObj = m_Voltage
336
336
337
337
338 def hasAllDataInBuffer(self):
338 def hasAllDataInBuffer(self):
339 if self.profileIndex >= self.m_ProcessingHeader.profilesPerBlock:
339 if self.profileIndex >= self.m_ProcessingHeader.profilesPerBlock:
340 return 1
340 return 1
341 return 0
341 return 0
342
342
343
343
344 def setBlockDimension(self):
344 def setBlockDimension(self):
345 """
345 """
346 Obtiene las formas dimensionales del los subbloques de datos que componen un bloque
346 Obtiene las formas dimensionales del los subbloques de datos que componen un bloque
347
347
348 Affected:
348 Affected:
349 self.shape_spc_Buffer
349 self.shape_spc_Buffer
350 self.shape_cspc_Buffer
350 self.shape_cspc_Buffer
351 self.shape_dc_Buffer
351 self.shape_dc_Buffer
352
352
353 Return: None
353 Return: None
354 """
354 """
355 self.shapeBuffer = (self.m_ProcessingHeader.profilesPerBlock,
355 self.shapeBuffer = (self.m_ProcessingHeader.profilesPerBlock,
356 self.m_ProcessingHeader.numHeights,
356 self.m_ProcessingHeader.numHeights,
357 self.m_SystemHeader.numChannels )
357 self.m_SystemHeader.numChannels )
358
358
359 self.datablock = numpy.zeros((self.m_SystemHeader.numChannels,
359 self.datablock = numpy.zeros((self.m_SystemHeader.numChannels,
360 self.m_ProcessingHeader.profilesPerBlock,
360 self.m_ProcessingHeader.profilesPerBlock,
361 self.m_ProcessingHeader.numHeights),
361 self.m_ProcessingHeader.numHeights),
362 dtype=numpy.dtype('complex'))
362 dtype=numpy.dtype('complex'))
363
363
364
364
365 def writeBlock(self):
365 def writeBlock(self):
366 """
366 """
367 Escribe el buffer en el file designado
367 Escribe el buffer en el file designado
368
368
369 Affected:
369 Affected:
370 self.profileIndex
370 self.profileIndex
371 self.flagIsNewFile
371 self.flagIsNewFile
372 self.flagIsNewBlock
372 self.flagIsNewBlock
373 self.nTotalBlocks
373 self.nTotalBlocks
374 self.nWriteBlocks
374 self.nWriteBlocks
375
375
376 Return: None
376 Return: None
377 """
377 """
378 data = numpy.zeros( self.shapeBuffer, self.dataType )
378 data = numpy.zeros( self.shapeBuffer, self.dataType )
379
379
380 junk = numpy.transpose(self.datablock, (1,2,0))
380 junk = numpy.transpose(self.datablock, (1,2,0))
381
381
382 data['real'] = junk.real
382 data['real'] = junk.real
383 data['imag'] = junk.imag
383 data['imag'] = junk.imag
384
384
385 data = data.reshape( (-1) )
385 data = data.reshape( (-1) )
386
386
387 data.tofile( self.fp )
387 data.tofile( self.fp )
388
388
389 self.datablock.fill(0)
389 self.datablock.fill(0)
390 self.profileIndex = 0
390 self.profileIndex = 0
391 self.flagIsNewFile = 0
391 self.flagIsNewFile = 0
392 self.flagIsNewBlock = 1
392 self.flagIsNewBlock = 1
393 self.nTotalBlocks += 1
393 self.nTotalBlocks += 1
394 self.nWriteBlocks += 1
394 self.nWriteBlocks += 1
395
395
396
396
397 def putData(self):
397 def putData(self):
398 """
398 """
399 Setea un bloque de datos y luego los escribe en un file
399 Setea un bloque de datos y luego los escribe en un file
400
400
401 Affected:
401 Affected:
402 self.flagIsNewBlock
402 self.flagIsNewBlock
403 self.profileIndex
403 self.profileIndex
404
404
405 Return:
405 Return:
406 0 : Si no hay data o no hay mas files que puedan escribirse
406 0 : Si no hay data o no hay mas files que puedan escribirse
407 1 : Si se escribio la data de un bloque en un file
407 1 : Si se escribio la data de un bloque en un file
408 """
408 """
409 self.flagIsNewBlock = 0
409 self.flagIsNewBlock = 0
410
410
411 if self.m_DataObj.flagNoData:
411 if self.m_DataObj.flagNoData:
412 return 0
412 return 0
413
413
414 if self.m_DataObj.flagResetProcessing:
414 if self.m_DataObj.flagResetProcessing:
415
415
416 self.datablock.fill(0)
416 self.datablock.fill(0)
417 self.profileIndex = 0
417 self.profileIndex = 0
418 self.setNextFile()
418 self.setNextFile()
419
419
420 self.datablock[:,self.profileIndex,:] = self.m_DataObj.data
420 self.datablock[:,self.profileIndex,:] = self.m_DataObj.data
421
421
422 self.profileIndex += 1
422 self.profileIndex += 1
423
423
424 if self.hasAllDataInBuffer():
424 if self.hasAllDataInBuffer():
425 #if self.flagIsNewFile:
425 #if self.flagIsNewFile:
426 self.getDataHeader()
426 self.getDataHeader()
427 self.writeNextBlock()
427 self.writeNextBlock()
428
428
429 if self.flagNoMoreFiles:
429 if self.flagNoMoreFiles:
430 #print 'Process finished'
430 #print 'Process finished'
431 return 0
431 return 0
432
432
433 return 1
433 return 1
434 No newline at end of file
434
General Comments 0
You need to be logged in to leave comments. Login now