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