##// 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
@@ -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
266 if cspc != None:
267 if cspc != None:
267 cspc = numpy.roll( cspc, self.m_ProcessingHeader.profilesPerBlock/2, axis=2 ) #desplaza a la derecha en el eje 2 determinadas posiciones
268 cspc = numpy.roll( cspc, self.m_ProcessingHeader.profilesPerBlock/2, axis=2 ) #desplaza a la derecha en el eje 2 determinadas posiciones
268
269
269 spc = numpy.transpose( spc, (0,2,1) )
270 spc = numpy.transpose( spc, (0,2,1) )
270 if cspc != None: cspc = numpy.transpose( cspc, (0,2,1) )
271
271
272 self.data_spc = spc
272 if cspc != None:
273 cspc = numpy.transpose( cspc, (0,2,1) )
274
275
273 if cspc != None:
276 if cspc != None:
274 self.data_cspc = cspc['real'] + cspc['imag']*1j
277 self.data_cspc = cspc['real'] + cspc['imag']*1j
275 else:
278 else:
276 self.data_cspc = None
279 self.data_cspc = None
280
281 self.data_spc = spc
277 self.data_dc = dc['real'] + dc['imag']*1j
282 self.data_dc = dc['real'] + dc['imag']*1j
278
283
279 self.datablockIndex = 0
284 self.datablockIndex = 0
280 self.flagIsNewFile = 0
285 self.flagIsNewFile = 0
281 self.flagIsNewBlock = 1
286 self.flagIsNewBlock = 1
282
287
283 self.nTotalBlocks += 1
288 self.nTotalBlocks += 1
284 self.nReadBlocks += 1
289 self.nReadBlocks += 1
285
290
286 return 1
291 return 1
287
292
288
293
289 def getData(self):
294 def getData(self):
290 """
295 """
291 Copia el buffer de lectura a la clase "Spectra",
296 Copia el buffer de lectura a la clase "Spectra",
292 con todos los parametros asociados a este (metadata). cuando no hay datos en el buffer de
297 con todos los parametros asociados a este (metadata). cuando no hay datos en el buffer de
293 lectura es necesario hacer una nueva lectura de los bloques de datos usando "readNextBlock"
298 lectura es necesario hacer una nueva lectura de los bloques de datos usando "readNextBlock"
294
299
295 Return:
300 Return:
296 0 : Si no hay mas archivos disponibles
301 0 : Si no hay mas archivos disponibles
297 1 : Si hizo una buena copia del buffer
302 1 : Si hizo una buena copia del buffer
298
303
299 Affected:
304 Affected:
300 self.m_DataObj
305 self.m_DataObj
301 self.datablockIndex
306 self.datablockIndex
302 self.flagResetProcessing
307 self.flagResetProcessing
303 self.flagIsNewBlock
308 self.flagIsNewBlock
304 """
309 """
305
310
306 if self.flagNoMoreFiles: return 0
311 if self.flagNoMoreFiles: return 0
307
312
308 self.flagResetProcessing = 0
313 self.flagResetProcessing = 0
309 self.flagIsNewBlock = 0
314 self.flagIsNewBlock = 0
310
315
311 if self.__hasNotDataInBuffer():
316 if self.__hasNotDataInBuffer():
312
317
313 if not( self.readNextBlock() ):
318 if not( self.readNextBlock() ):
314 return 0
319 return 0
315
320
316 self.updateDataHeader()
321 self.updateDataHeader()
317
322
318 if self.flagNoMoreFiles == 1:
323 if self.flagNoMoreFiles == 1:
319 print 'Process finished'
324 print 'Process finished'
320 return 0
325 return 0
321
326
322 #data es un numpy array de 3 dmensiones (perfiles, alturas y canales)
327 #data es un numpy array de 3 dmensiones (perfiles, alturas y canales)
323
328
324 if self.data_dc == None:
329 if self.data_dc == None:
325 self.m_DataObj.flagNoData = True
330 self.m_DataObj.flagNoData = True
326 return 0
331 return 0
327
332
328 self.m_DataObj.flagNoData = False
333 self.m_DataObj.flagNoData = False
329 self.m_DataObj.flagResetProcessing = self.flagResetProcessing
334 self.m_DataObj.flagResetProcessing = self.flagResetProcessing
330
335
331 self.m_DataObj.data_spc = self.data_spc
336 self.m_DataObj.data_spc = self.data_spc
332 self.m_DataObj.data_cspc = self.data_cspc
337 self.m_DataObj.data_cspc = self.data_cspc
333 self.m_DataObj.data_dc = self.data_dc
338 self.m_DataObj.data_dc = self.data_dc
334
339
335 return 1
340 return 1
336
341
337
342
338 class SpectraWriter(JRODataWriter):
343 class SpectraWriter(JRODataWriter):
339
344
340 """
345 """
341 Esta clase permite escribir datos de espectros a archivos procesados (.pdata). La escritura
346 Esta clase permite escribir datos de espectros a archivos procesados (.pdata). La escritura
342 de los datos siempre se realiza por bloques.
347 de los datos siempre se realiza por bloques.
343 """
348 """
344
349
345 m_DataObj = None
350 m_DataObj = None
346
351
347 shape_spc_Buffer = None
352 shape_spc_Buffer = None
348 shape_cspc_Buffer = None
353 shape_cspc_Buffer = None
349 shape_dc_Buffer = None
354 shape_dc_Buffer = None
350
355
351 data_spc = None
356 data_spc = None
352 data_cspc = None
357 data_cspc = None
353 data_dc = None
358 data_dc = None
354
359
355
360
356 def __init__(self, m_Spectra=None):
361 def __init__(self, m_Spectra=None):
357 """
362 """
358 Inicializador de la clase SpectraWriter para la escritura de datos de espectros.
363 Inicializador de la clase SpectraWriter para la escritura de datos de espectros.
359
364
360 Affected:
365 Affected:
361 self.m_DataObj
366 self.m_DataObj
362 self.m_BasicHeader
367 self.m_BasicHeader
363 self.m_SystemHeader
368 self.m_SystemHeader
364 self.m_RadarControllerHeader
369 self.m_RadarControllerHeader
365 self.m_ProcessingHeader
370 self.m_ProcessingHeader
366
371
367 Return: None
372 Return: None
368 """
373 """
369 if m_Spectra == None:
374 if m_Spectra == None:
370 m_Spectra = Spectra()
375 m_Spectra = Spectra()
371
376
372 if not( isinstance(m_Spectra, Spectra) ):
377 if not( isinstance(m_Spectra, Spectra) ):
373 raise ValueError, "in SpectraReader, m_Spectra must be an Spectra class object"
378 raise ValueError, "in SpectraReader, m_Spectra must be an Spectra class object"
374
379
375 self.m_DataObj = m_Spectra
380 self.m_DataObj = m_Spectra
376
381
377 self.ext = ".pdata"
382 self.ext = ".pdata"
378
383
379 self.optchar = "P"
384 self.optchar = "P"
380
385
381 self.shape_spc_Buffer = None
386 self.shape_spc_Buffer = None
382 self.shape_cspc_Buffer = None
387 self.shape_cspc_Buffer = None
383 self.shape_dc_Buffer = None
388 self.shape_dc_Buffer = None
384
389
385 self.data_spc = None
390 self.data_spc = None
386 self.data_cspc = None
391 self.data_cspc = None
387 self.data_dc = None
392 self.data_dc = None
388
393
389 ####################################
394 ####################################
390
395
391 self.fp = None
396 self.fp = None
392
397
393 self.nWriteBlocks = 0
398 self.nWriteBlocks = 0
394
399
395 self.flagIsNewFile = 1
400 self.flagIsNewFile = 1
396
401
397 self.nTotalBlocks = 0
402 self.nTotalBlocks = 0
398
403
399 self.flagIsNewBlock = 0
404 self.flagIsNewBlock = 0
400
405
401 self.flagNoMoreFiles = 0
406 self.flagNoMoreFiles = 0
402
407
403 self.setFile = None
408 self.setFile = None
404
409
405 self.dataType = None
410 self.dataType = None
406
411
407 self.path = None
412 self.path = None
408
413
409 self.noMoreFiles = 0
414 self.noMoreFiles = 0
410
415
411 self.filename = None
416 self.filename = None
412
417
413 self.m_BasicHeader= BasicHeader()
418 self.m_BasicHeader= BasicHeader()
414
419
415 self.m_SystemHeader = SystemHeader()
420 self.m_SystemHeader = SystemHeader()
416
421
417 self.m_RadarControllerHeader = RadarControllerHeader()
422 self.m_RadarControllerHeader = RadarControllerHeader()
418
423
419 self.m_ProcessingHeader = ProcessingHeader()
424 self.m_ProcessingHeader = ProcessingHeader()
420
425
421
426
422 def hasAllDataInBuffer(self):
427 def hasAllDataInBuffer(self):
423 return 1
428 return 1
424
429
425
430
426 def setBlockDimension(self):
431 def setBlockDimension(self):
427 """
432 """
428 Obtiene las formas dimensionales del los subbloques de datos que componen un bloque
433 Obtiene las formas dimensionales del los subbloques de datos que componen un bloque
429
434
430 Affected:
435 Affected:
431 self.shape_spc_Buffer
436 self.shape_spc_Buffer
432 self.shape_cspc_Buffer
437 self.shape_cspc_Buffer
433 self.shape_dc_Buffer
438 self.shape_dc_Buffer
434
439
435 Return: None
440 Return: None
436 """
441 """
437 self.shape_spc_Buffer = (self.m_DataObj.nChannels,
442 self.shape_spc_Buffer = (self.m_DataObj.nChannels,
438 self.m_ProcessingHeader.numHeights,
443 self.m_ProcessingHeader.numHeights,
439 self.m_ProcessingHeader.profilesPerBlock)
444 self.m_ProcessingHeader.profilesPerBlock)
440
445
441 self.shape_cspc_Buffer = (self.m_DataObj.nPairs,
446 self.shape_cspc_Buffer = (self.m_DataObj.nPairs,
442 self.m_ProcessingHeader.numHeights,
447 self.m_ProcessingHeader.numHeights,
443 self.m_ProcessingHeader.profilesPerBlock)
448 self.m_ProcessingHeader.profilesPerBlock)
444
449
445 self.shape_dc_Buffer = (self.m_SystemHeader.numChannels,
450 self.shape_dc_Buffer = (self.m_SystemHeader.numChannels,
446 self.m_ProcessingHeader.numHeights)
451 self.m_ProcessingHeader.numHeights)
447
452
448
453
449 def writeBlock(self):
454 def writeBlock(self):
450 """
455 """
451 Escribe el buffer en el file designado
456 Escribe el buffer en el file designado
452
457
453 Affected:
458 Affected:
454 self.data_spc
459 self.data_spc
455 self.data_cspc
460 self.data_cspc
456 self.data_dc
461 self.data_dc
457 self.flagIsNewFile
462 self.flagIsNewFile
458 self.flagIsNewBlock
463 self.flagIsNewBlock
459 self.nTotalBlocks
464 self.nTotalBlocks
460 self.nWriteBlocks
465 self.nWriteBlocks
461
466
462 Return: None
467 Return: None
463 """
468 """
464
469
465 spc = numpy.transpose( self.data_spc, (0,2,1) )
470 spc = numpy.transpose( self.data_spc, (0,2,1) )
466 if not( self.m_ProcessingHeader.shif_fft ):
471 if not( self.m_ProcessingHeader.shif_fft ):
467 spc = numpy.roll( spc, self.m_ProcessingHeader.profilesPerBlock/2, axis=2 ) #desplaza a la derecha en el eje 2 determinadas posiciones
472 spc = numpy.roll( spc, self.m_ProcessingHeader.profilesPerBlock/2, axis=2 ) #desplaza a la derecha en el eje 2 determinadas posiciones
468 data = spc.reshape((-1))
473 data = spc.reshape((-1))
469 data.tofile(self.fp)
474 data.tofile(self.fp)
470
475
471 if self.data_cspc != None:
476 if self.data_cspc != None:
472 data = numpy.zeros( self.shape_cspc_Buffer, self.dataType )
477 data = numpy.zeros( self.shape_cspc_Buffer, self.dataType )
473 cspc = numpy.transpose( self.data_cspc, (0,2,1) )
478 cspc = numpy.transpose( self.data_cspc, (0,2,1) )
474 if not( self.m_ProcessingHeader.shif_fft ):
479 if not( self.m_ProcessingHeader.shif_fft ):
475 cspc = numpy.roll( cspc, self.m_ProcessingHeader.profilesPerBlock/2, axis=2 ) #desplaza a la derecha en el eje 2 determinadas posiciones
480 cspc = numpy.roll( cspc, self.m_ProcessingHeader.profilesPerBlock/2, axis=2 ) #desplaza a la derecha en el eje 2 determinadas posiciones
476 data['real'] = cspc.real
481 data['real'] = cspc.real
477 data['imag'] = cspc.imag
482 data['imag'] = cspc.imag
478 data = data.reshape((-1))
483 data = data.reshape((-1))
479 data.tofile(self.fp)
484 data.tofile(self.fp)
480
485
481 data = numpy.zeros( self.shape_dc_Buffer, self.dataType )
486 data = numpy.zeros( self.shape_dc_Buffer, self.dataType )
482 dc = self.data_dc
487 dc = self.data_dc
483 data['real'] = dc.real
488 data['real'] = dc.real
484 data['imag'] = dc.imag
489 data['imag'] = dc.imag
485 data = data.reshape((-1))
490 data = data.reshape((-1))
486 data.tofile(self.fp)
491 data.tofile(self.fp)
487
492
488 self.data_spc.fill(0)
493 self.data_spc.fill(0)
489 self.data_dc.fill(0)
494 self.data_dc.fill(0)
490 if self.data_cspc != None:
495 if self.data_cspc != None:
491 self.data_cspc.fill(0)
496 self.data_cspc.fill(0)
492
497
493 self.flagIsNewFile = 0
498 self.flagIsNewFile = 0
494 self.flagIsNewBlock = 1
499 self.flagIsNewBlock = 1
495 self.nTotalBlocks += 1
500 self.nTotalBlocks += 1
496 self.nWriteBlocks += 1
501 self.nWriteBlocks += 1
497
502
498
503
499 def putData(self):
504 def putData(self):
500 """
505 """
501 Setea un bloque de datos y luego los escribe en un file
506 Setea un bloque de datos y luego los escribe en un file
502
507
503 Affected:
508 Affected:
504 self.data_spc
509 self.data_spc
505 self.data_cspc
510 self.data_cspc
506 self.data_dc
511 self.data_dc
507
512
508 Return:
513 Return:
509 0 : Si no hay data o no hay mas files que puedan escribirse
514 0 : Si no hay data o no hay mas files que puedan escribirse
510 1 : Si se escribio la data de un bloque en un file
515 1 : Si se escribio la data de un bloque en un file
511 """
516 """
512 self.flagIsNewBlock = 0
517 self.flagIsNewBlock = 0
513
518
514 if self.m_DataObj.flagNoData:
519 if self.m_DataObj.flagNoData:
515 return 0
520 return 0
516
521
517 if self.m_DataObj.flagResetProcessing:
522 if self.m_DataObj.flagResetProcessing:
518 self.data_spc.fill(0)
523 self.data_spc.fill(0)
519 self.data_cspc.fill(0)
524 self.data_cspc.fill(0)
520 self.data_dc.fill(0)
525 self.data_dc.fill(0)
521 self.setNextFile()
526 self.setNextFile()
522
527
523 self.data_spc = self.m_DataObj.data_spc
528 self.data_spc = self.m_DataObj.data_spc
524 self.data_cspc = self.m_DataObj.data_cspc
529 self.data_cspc = self.m_DataObj.data_cspc
525 self.data_dc = self.m_DataObj.data_dc
530 self.data_dc = self.m_DataObj.data_dc
526
531
527 # #self.m_ProcessingHeader.dataBlocksPerFile)
532 # #self.m_ProcessingHeader.dataBlocksPerFile)
528 if self.hasAllDataInBuffer():
533 if self.hasAllDataInBuffer():
529 self.getDataHeader()
534 self.getDataHeader()
530 self.writeNextBlock()
535 self.writeNextBlock()
531
536
532 if self.flagNoMoreFiles:
537 if self.flagNoMoreFiles:
533 #print 'Process finished'
538 #print 'Process finished'
534 return 0
539 return 0
535
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 NO CONTENT: modified file
NO CONTENT: modified file
General Comments 0
You need to be logged in to leave comments. Login now