##// END OF EJS Templates
Metodo self.__waitNewBlock agreagado: Bug leyendo datos en linea. No esperaba un nuevo bloque, siempre saltaba al siguiente archivo.
Miguel Valdez -
r172:248131ce173d
parent child
Show More
@@ -1,1049 +1,1082
1 '''
1 '''
2
2
3 $Author$
3 $Author$
4 $Id$
4 $Id$
5 '''
5 '''
6
6
7 import os, sys
7 import os, sys
8 import glob
8 import glob
9 import time
9 import time
10 import numpy
10 import numpy
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 JROHeaderIO import *
17 from JROHeaderIO import *
18 from Data.JROData import JROData
18 from Data.JROData import JROData
19
19
20 def isNumber(str):
20 def isNumber(str):
21 """
21 """
22 Chequea si el conjunto de caracteres que componen un string puede ser convertidos a un numero.
22 Chequea si el conjunto de caracteres que componen un string puede ser convertidos a un numero.
23
23
24 Excepciones:
24 Excepciones:
25 Si un determinado string no puede ser convertido a numero
25 Si un determinado string no puede ser convertido a numero
26 Input:
26 Input:
27 str, string al cual se le analiza para determinar si convertible a un numero o no
27 str, string al cual se le analiza para determinar si convertible a un numero o no
28
28
29 Return:
29 Return:
30 True : si el string es uno numerico
30 True : si el string es uno numerico
31 False : no es un string numerico
31 False : no es un string numerico
32 """
32 """
33 try:
33 try:
34 float( str )
34 float( str )
35 return True
35 return True
36 except:
36 except:
37 return False
37 return False
38
38
39 def isThisFileinRange(filename, startUTSeconds, endUTSeconds):
39 def isThisFileinRange(filename, startUTSeconds, endUTSeconds):
40 """
40 """
41 Esta funcion determina si un archivo de datos se encuentra o no dentro del rango de fecha especificado.
41 Esta funcion determina si un archivo de datos se encuentra o no dentro del rango de fecha especificado.
42
42
43 Inputs:
43 Inputs:
44 filename : nombre completo del archivo de datos en formato Jicamarca (.r)
44 filename : nombre completo del archivo de datos en formato Jicamarca (.r)
45
45
46 startUTSeconds : fecha inicial del rango seleccionado. La fecha esta dada en
46 startUTSeconds : fecha inicial del rango seleccionado. La fecha esta dada en
47 segundos contados desde 01/01/1970.
47 segundos contados desde 01/01/1970.
48 endUTSeconds : fecha final del rango seleccionado. La fecha esta dada en
48 endUTSeconds : fecha final del rango seleccionado. La fecha esta dada en
49 segundos contados desde 01/01/1970.
49 segundos contados desde 01/01/1970.
50
50
51 Return:
51 Return:
52 Boolean : Retorna True si el archivo de datos contiene datos en el rango de
52 Boolean : Retorna True si el archivo de datos contiene datos en el rango de
53 fecha especificado, de lo contrario retorna False.
53 fecha especificado, de lo contrario retorna False.
54
54
55 Excepciones:
55 Excepciones:
56 Si el archivo no existe o no puede ser abierto
56 Si el archivo no existe o no puede ser abierto
57 Si la cabecera no puede ser leida.
57 Si la cabecera no puede ser leida.
58
58
59 """
59 """
60 basicHeaderObj = BasicHeader()
60 basicHeaderObj = BasicHeader()
61
61
62 try:
62 try:
63 fp = open(filename,'rb')
63 fp = open(filename,'rb')
64 except:
64 except:
65 raise IOError, "The file %s can't be opened" %(filename)
65 raise IOError, "The file %s can't be opened" %(filename)
66
66
67 sts = basicHeaderObj.read(fp)
67 sts = basicHeaderObj.read(fp)
68 fp.close()
68 fp.close()
69
69
70 if not(sts):
70 if not(sts):
71 print "Skipping the file %s because it has not a valid header" %(filename)
71 print "Skipping the file %s because it has not a valid header" %(filename)
72 return 0
72 return 0
73
73
74 if not ((startUTSeconds <= basicHeaderObj.utc) and (endUTSeconds > basicHeaderObj.utc)):
74 if not ((startUTSeconds <= basicHeaderObj.utc) and (endUTSeconds > basicHeaderObj.utc)):
75 return 0
75 return 0
76
76
77 return 1
77 return 1
78
78
79 def getlastFileFromPath(path, ext):
79 def getlastFileFromPath(path, ext):
80 """
80 """
81 Depura el fileList dejando solo los que cumplan el formato de "PYYYYDDDSSS.ext"
81 Depura el fileList dejando solo los que cumplan el formato de "PYYYYDDDSSS.ext"
82 al final de la depuracion devuelve el ultimo file de la lista que quedo.
82 al final de la depuracion devuelve el ultimo file de la lista que quedo.
83
83
84 Input:
84 Input:
85 fileList : lista conteniendo todos los files (sin path) que componen una determinada carpeta
85 fileList : lista conteniendo todos los files (sin path) que componen una determinada carpeta
86 ext : extension de los files contenidos en una carpeta
86 ext : extension de los files contenidos en una carpeta
87
87
88 Return:
88 Return:
89 El ultimo file de una determinada carpeta, no se considera el path.
89 El ultimo file de una determinada carpeta, no se considera el path.
90 """
90 """
91 validFilelist = []
91 validFilelist = []
92 fileList = os.listdir(path)
92 fileList = os.listdir(path)
93
93
94 # 0 1234 567 89A BCDE
94 # 0 1234 567 89A BCDE
95 # H YYYY DDD SSS .ext
95 # H YYYY DDD SSS .ext
96
96
97 for file in fileList:
97 for file in fileList:
98 try:
98 try:
99 year = int(file[1:5])
99 year = int(file[1:5])
100 doy = int(file[5:8])
100 doy = int(file[5:8])
101
101
102 if (os.path.splitext(file)[-1].upper() != ext.upper()) : continue
102 if (os.path.splitext(file)[-1].upper() != ext.upper()) : continue
103 except:
103 except:
104 continue
104 continue
105
105
106 validFilelist.append(file)
106 validFilelist.append(file)
107
107
108 if validFilelist:
108 if validFilelist:
109 validFilelist = sorted( validFilelist, key=str.lower )
109 validFilelist = sorted( validFilelist, key=str.lower )
110 return validFilelist[-1]
110 return validFilelist[-1]
111
111
112 return None
112 return None
113
113
114 def checkForRealPath(path, year, doy, set, ext):
114 def checkForRealPath(path, year, doy, set, ext):
115 """
115 """
116 Por ser Linux Case Sensitive entonces checkForRealPath encuentra el nombre correcto de un path,
116 Por ser Linux Case Sensitive entonces checkForRealPath encuentra el nombre correcto de un path,
117 Prueba por varias combinaciones de nombres entre mayusculas y minusculas para determinar
117 Prueba por varias combinaciones de nombres entre mayusculas y minusculas para determinar
118 el path exacto de un determinado file.
118 el path exacto de un determinado file.
119
119
120 Example :
120 Example :
121 nombre correcto del file es .../.../D2009307/P2009307367.ext
121 nombre correcto del file es .../.../D2009307/P2009307367.ext
122
122
123 Entonces la funcion prueba con las siguientes combinaciones
123 Entonces la funcion prueba con las siguientes combinaciones
124 .../.../x2009307/y2009307367.ext
124 .../.../x2009307/y2009307367.ext
125 .../.../x2009307/Y2009307367.ext
125 .../.../x2009307/Y2009307367.ext
126 .../.../X2009307/y2009307367.ext
126 .../.../X2009307/y2009307367.ext
127 .../.../X2009307/Y2009307367.ext
127 .../.../X2009307/Y2009307367.ext
128 siendo para este caso, la ultima combinacion de letras, identica al file buscado
128 siendo para este caso, la ultima combinacion de letras, identica al file buscado
129
129
130 Return:
130 Return:
131 Si encuentra la cobinacion adecuada devuelve el path completo y el nombre del file
131 Si encuentra la cobinacion adecuada devuelve el path completo y el nombre del file
132 caso contrario devuelve None como path y el la ultima combinacion de nombre en mayusculas
132 caso contrario devuelve None como path y el la ultima combinacion de nombre en mayusculas
133 para el filename
133 para el filename
134 """
134 """
135 filepath = None
135 filepath = None
136 find_flag = False
136 find_flag = False
137 filename = None
137 filename = None
138
138
139 if ext.lower() == ".r": #voltage
139 if ext.lower() == ".r": #voltage
140 header1 = "dD"
140 header1 = "dD"
141 header2 = "dD"
141 header2 = "dD"
142 elif ext.lower() == ".pdata": #spectra
142 elif ext.lower() == ".pdata": #spectra
143 header1 = "dD"
143 header1 = "dD"
144 header2 = "pP"
144 header2 = "pP"
145 else:
145 else:
146 return None, filename
146 return None, filename
147
147
148 for dir in header1: #barrido por las dos combinaciones posibles de "D"
148 for dir in header1: #barrido por las dos combinaciones posibles de "D"
149 for fil in header2: #barrido por las dos combinaciones posibles de "D"
149 for fil in header2: #barrido por las dos combinaciones posibles de "D"
150 doypath = "%s%04d%03d" % ( dir, year, doy ) #formo el nombre del directorio xYYYYDDD (x=d o x=D)
150 doypath = "%s%04d%03d" % ( dir, year, doy ) #formo el nombre del directorio xYYYYDDD (x=d o x=D)
151 filename = "%s%04d%03d%03d%s" % ( fil, year, doy, set, ext ) #formo el nombre del file xYYYYDDDSSS.ext
151 filename = "%s%04d%03d%03d%s" % ( fil, year, doy, set, ext ) #formo el nombre del file xYYYYDDDSSS.ext
152 filepath = os.path.join( path, doypath, filename ) #formo el path completo
152 filepath = os.path.join( path, doypath, filename ) #formo el path completo
153 if os.path.exists( filepath ): #verifico que exista
153 if os.path.exists( filepath ): #verifico que exista
154 find_flag = True
154 find_flag = True
155 break
155 break
156 if find_flag:
156 if find_flag:
157 break
157 break
158
158
159 if not(find_flag):
159 if not(find_flag):
160 return None, filename
160 return None, filename
161
161
162 return filepath, filename
162 return filepath, filename
163
163
164 class JRODataIO:
164 class JRODataIO:
165
165
166 c = 3E8
166 c = 3E8
167
167
168 basicHeaderObj = BasicHeader()
168 basicHeaderObj = BasicHeader()
169
169
170 systemHeaderObj = SystemHeader()
170 systemHeaderObj = SystemHeader()
171
171
172 radarControllerHeaderObj = RadarControllerHeader()
172 radarControllerHeaderObj = RadarControllerHeader()
173
173
174 processingHeaderObj = ProcessingHeader()
174 processingHeaderObj = ProcessingHeader()
175
175
176 online = 0
176 online = 0
177
177
178 dtype = None
178 dtype = None
179
179
180 pathList = []
180 pathList = []
181
181
182 filenameList = []
182 filenameList = []
183
183
184 filename = None
184 filename = None
185
185
186 ext = None
186 ext = None
187
187
188 flagNoMoreFiles = 0
188 flagNoMoreFiles = 0
189
189
190 flagIsNewFile = 1
190 flagIsNewFile = 1
191
191
192 flagTimeBlock = 0
192 flagTimeBlock = 0
193
193
194 flagIsNewBlock = 0
194 flagIsNewBlock = 0
195
195
196 fp = None
196 fp = None
197
197
198 firstHeaderSize = 0
198 firstHeaderSize = 0
199
199
200 basicHeaderSize = 24
200 basicHeaderSize = 24
201
201
202 versionFile = 1103
202 versionFile = 1103
203
203
204 fileSize = None
204 fileSize = None
205
205
206 ippSeconds = None
206 ippSeconds = None
207
207
208 fileSizeByHeader = None
208 fileSizeByHeader = None
209
209
210 fileIndex = None
210 fileIndex = None
211
211
212 profileIndex = None
212 profileIndex = None
213
213
214 blockIndex = None
214 blockIndex = None
215
215
216 nTotalBlocks = None
216 nTotalBlocks = None
217
217
218 maxTimeStep = 30
218 maxTimeStep = 30
219
219
220 lastUTTime = None
220 lastUTTime = None
221
221
222 datablock = None
222 datablock = None
223
223
224 dataOutObj = None
224 dataOutObj = None
225
225
226 blocksize = None
226 blocksize = None
227
227
228 set = None
228 set = None
229
229
230 def __init__(self):
230 def __init__(self):
231 pass
231 pass
232
232
233 class JRODataReader(JRODataIO):
233 class JRODataReader(JRODataIO):
234
234
235 nReadBlocks = 0
235 nReadBlocks = 0
236
236
237 delay = 60 #number of seconds waiting a new file
237 delay = 60 #number of seconds waiting a new file
238
238
239 nTries = 3 #quantity tries
239 nTries = 3 #quantity tries
240
240
241 nFiles = 3 #number of files for searching
241 nFiles = 3 #number of files for searching
242
242
243
243
244 def __init__(self):
244 def __init__(self):
245
245
246 pass
246 pass
247
247
248 def createObjByDefault(self):
248 def createObjByDefault(self):
249 """
249 """
250
250
251 """
251 """
252 raise ValueError, "This method has not been implemented"
252 raise ValueError, "This method has not been implemented"
253
253
254 def getBlockDimension(self):
254 def getBlockDimension(self):
255
255
256 raise ValueError, "No implemented"
256 raise ValueError, "No implemented"
257
257
258 def __searchFilesOffLine(self,
258 def __searchFilesOffLine(self,
259 path,
259 path,
260 startDate,
260 startDate,
261 endDate,
261 endDate,
262 startTime=datetime.time(0,0,0),
262 startTime=datetime.time(0,0,0),
263 endTime=datetime.time(23,59,59),
263 endTime=datetime.time(23,59,59),
264 set=None,
264 set=None,
265 expLabel="",
265 expLabel="",
266 ext=".r"):
266 ext=".r"):
267 dirList = []
267 dirList = []
268 for thisPath in os.listdir(path):
268 for thisPath in os.listdir(path):
269 if os.path.isdir(os.path.join(path,thisPath)):
269 if os.path.isdir(os.path.join(path,thisPath)):
270 dirList.append(thisPath)
270 dirList.append(thisPath)
271
271
272 if not(dirList):
272 if not(dirList):
273 return None, None
273 return None, None
274
274
275 pathList = []
275 pathList = []
276 dateList = []
276 dateList = []
277
277
278 thisDate = startDate
278 thisDate = startDate
279
279
280 while(thisDate <= endDate):
280 while(thisDate <= endDate):
281 year = thisDate.timetuple().tm_year
281 year = thisDate.timetuple().tm_year
282 doy = thisDate.timetuple().tm_yday
282 doy = thisDate.timetuple().tm_yday
283
283
284 match = fnmatch.filter(dirList, '?' + '%4.4d%3.3d' % (year,doy))
284 match = fnmatch.filter(dirList, '?' + '%4.4d%3.3d' % (year,doy))
285 if len(match) == 0:
285 if len(match) == 0:
286 thisDate += datetime.timedelta(1)
286 thisDate += datetime.timedelta(1)
287 continue
287 continue
288
288
289 pathList.append(os.path.join(path,match[0],expLabel))
289 pathList.append(os.path.join(path,match[0],expLabel))
290 dateList.append(thisDate)
290 dateList.append(thisDate)
291 thisDate += datetime.timedelta(1)
291 thisDate += datetime.timedelta(1)
292
292
293 filenameList = []
293 filenameList = []
294 for index in range(len(pathList)):
294 for index in range(len(pathList)):
295
295
296 thisPath = pathList[index]
296 thisPath = pathList[index]
297 fileList = glob.glob1(thisPath, "*%s" %ext)
297 fileList = glob.glob1(thisPath, "*%s" %ext)
298 fileList.sort()
298 fileList.sort()
299
299
300 #Busqueda de datos en el rango de horas indicados
300 #Busqueda de datos en el rango de horas indicados
301 thisDate = dateList[index]
301 thisDate = dateList[index]
302 startDT = datetime.datetime.combine(thisDate, startTime)
302 startDT = datetime.datetime.combine(thisDate, startTime)
303 endDT = datetime.datetime.combine(thisDate, endTime)
303 endDT = datetime.datetime.combine(thisDate, endTime)
304
304
305 startUtSeconds = time.mktime(startDT.timetuple())
305 startUtSeconds = time.mktime(startDT.timetuple())
306 endUtSeconds = time.mktime(endDT.timetuple())
306 endUtSeconds = time.mktime(endDT.timetuple())
307
307
308 for file in fileList:
308 for file in fileList:
309
309
310 filename = os.path.join(thisPath,file)
310 filename = os.path.join(thisPath,file)
311
311
312 if isThisFileinRange(filename, startUtSeconds, endUtSeconds):
312 if isThisFileinRange(filename, startUtSeconds, endUtSeconds):
313 filenameList.append(filename)
313 filenameList.append(filename)
314
314
315 if not(filenameList):
315 if not(filenameList):
316 return None, None
316 return None, None
317
317
318 self.filenameList = filenameList
318 self.filenameList = filenameList
319
319
320 return pathList, filenameList
320 return pathList, filenameList
321
321
322 def __searchFilesOnLine(self, path, startDate=None, endDate=None, startTime=None, endTime=None, expLabel = "", ext = None):
322 def __searchFilesOnLine(self, path, startDate=None, endDate=None, startTime=None, endTime=None, expLabel = "", ext = None):
323
323
324 """
324 """
325 Busca el ultimo archivo de la ultima carpeta (determinada o no por startDateTime) y
325 Busca el ultimo archivo de la ultima carpeta (determinada o no por startDateTime) y
326 devuelve el archivo encontrado ademas de otros datos.
326 devuelve el archivo encontrado ademas de otros datos.
327
327
328 Input:
328 Input:
329 path : carpeta donde estan contenidos los files que contiene data
329 path : carpeta donde estan contenidos los files que contiene data
330
330
331 startDate : Fecha inicial. Rechaza todos los directorios donde
331 startDate : Fecha inicial. Rechaza todos los directorios donde
332 file end time < startDate (obejto datetime.date)
332 file end time < startDate (obejto datetime.date)
333
333
334 endDate : Fecha final. Rechaza todos los directorios donde
334 endDate : Fecha final. Rechaza todos los directorios donde
335 file start time > endDate (obejto datetime.date)
335 file start time > endDate (obejto datetime.date)
336
336
337 startTime : Tiempo inicial. Rechaza todos los archivos donde
337 startTime : Tiempo inicial. Rechaza todos los archivos donde
338 file end time < startTime (obejto datetime.time)
338 file end time < startTime (obejto datetime.time)
339
339
340 endTime : Tiempo final. Rechaza todos los archivos donde
340 endTime : Tiempo final. Rechaza todos los archivos donde
341 file start time > endTime (obejto datetime.time)
341 file start time > endTime (obejto datetime.time)
342
342
343 expLabel : Nombre del subexperimento (subfolder)
343 expLabel : Nombre del subexperimento (subfolder)
344
344
345 ext : extension de los files
345 ext : extension de los files
346
346
347 Return:
347 Return:
348 directory : eL directorio donde esta el file encontrado
348 directory : eL directorio donde esta el file encontrado
349 filename : el ultimo file de una determinada carpeta
349 filename : el ultimo file de una determinada carpeta
350 year : el anho
350 year : el anho
351 doy : el numero de dia del anho
351 doy : el numero de dia del anho
352 set : el set del archivo
352 set : el set del archivo
353
353
354
354
355 """
355 """
356 dirList = []
356 dirList = []
357 pathList = []
357 pathList = []
358 directory = None
358 directory = None
359
359
360 #Filtra solo los directorios
360 #Filtra solo los directorios
361 for thisPath in os.listdir(path):
361 for thisPath in os.listdir(path):
362 if os.path.isdir(os.path.join(path, thisPath)):
362 if os.path.isdir(os.path.join(path, thisPath)):
363 dirList.append(thisPath)
363 dirList.append(thisPath)
364
364
365 if not(dirList):
365 if not(dirList):
366 return None, None, None, None, None
366 return None, None, None, None, None
367
367
368 dirList = sorted( dirList, key=str.lower )
368 dirList = sorted( dirList, key=str.lower )
369
369
370 if startDate:
370 if startDate:
371 startDateTime = datetime.datetime.combine(startDate, startTime)
371 startDateTime = datetime.datetime.combine(startDate, startTime)
372 thisDateTime = startDateTime
372 thisDateTime = startDateTime
373 if endDate == None: endDateTime = startDateTime
373 if endDate == None: endDateTime = startDateTime
374 else: endDateTime = datetime.datetime.combine(endDate, endTime)
374 else: endDateTime = datetime.datetime.combine(endDate, endTime)
375
375
376 while(thisDateTime <= endDateTime):
376 while(thisDateTime <= endDateTime):
377 year = thisDateTime.timetuple().tm_year
377 year = thisDateTime.timetuple().tm_year
378 doy = thisDateTime.timetuple().tm_yday
378 doy = thisDateTime.timetuple().tm_yday
379
379
380 match = fnmatch.filter(dirList, '?' + '%4.4d%3.3d' % (year,doy))
380 match = fnmatch.filter(dirList, '?' + '%4.4d%3.3d' % (year,doy))
381 if len(match) == 0:
381 if len(match) == 0:
382 thisDateTime += datetime.timedelta(1)
382 thisDateTime += datetime.timedelta(1)
383 continue
383 continue
384
384
385 pathList.append(os.path.join(path,match[0], expLabel))
385 pathList.append(os.path.join(path,match[0], expLabel))
386 thisDateTime += datetime.timedelta(1)
386 thisDateTime += datetime.timedelta(1)
387
387
388 if not(pathList):
388 if not(pathList):
389 print "\tNo files in range: %s - %s" %(startDateTime.ctime(), endDateTime.ctime())
389 print "\tNo files in range: %s - %s" %(startDateTime.ctime(), endDateTime.ctime())
390 return None, None, None, None, None
390 return None, None, None, None, None
391
391
392 directory = pathList[0]
392 directory = pathList[0]
393
393
394 else:
394 else:
395 directory = dirList[-1]
395 directory = dirList[-1]
396 directory = os.path.join(path,directory)
396 directory = os.path.join(path,directory)
397
397
398 filename = getlastFileFromPath(directory, ext)
398 filename = getlastFileFromPath(directory, ext)
399
399
400 if not(filename):
400 if not(filename):
401 return None, None, None, None, None
401 return None, None, None, None, None
402
402
403 if not(self.__verifyFile(os.path.join(directory, filename))):
403 if not(self.__verifyFile(os.path.join(directory, filename))):
404 return None, None, None, None, None
404 return None, None, None, None, None
405
405
406 year = int( filename[1:5] )
406 year = int( filename[1:5] )
407 doy = int( filename[5:8] )
407 doy = int( filename[5:8] )
408 set = int( filename[8:11] )
408 set = int( filename[8:11] )
409
409
410 return directory, filename, year, doy, set
410 return directory, filename, year, doy, set
411
411
412 def setup(self,dataOutObj=None,
412 def setup(self,dataOutObj=None,
413 path=None,
413 path=None,
414 startDate=None,
414 startDate=None,
415 endDate=None,
415 endDate=None,
416 startTime=datetime.time(0,0,0),
416 startTime=datetime.time(0,0,0),
417 endTime=datetime.time(23,59,59),
417 endTime=datetime.time(23,59,59),
418 set=0,
418 set=0,
419 expLabel = "",
419 expLabel = "",
420 ext = None,
420 ext = None,
421 online = False,
421 online = False,
422 delay = 60):
422 delay = 60):
423
423
424 if path == None:
424 if path == None:
425 raise ValueError, "The path is not valid"
425 raise ValueError, "The path is not valid"
426
426
427 if ext == None:
427 if ext == None:
428 ext = self.ext
428 ext = self.ext
429
429
430 if dataOutObj == None:
430 if dataOutObj == None:
431 dataOutObj = self.createObjByDefault()
431 dataOutObj = self.createObjByDefault()
432
432
433 self.dataOutObj = dataOutObj
433 self.dataOutObj = dataOutObj
434
434
435 if online:
435 if online:
436 print "Searching files in online mode..."
436 print "Searching files in online mode..."
437 doypath, file, year, doy, set = self.__searchFilesOnLine(path=path, expLabel=expLabel, ext=ext)
437 doypath, file, year, doy, set = self.__searchFilesOnLine(path=path, expLabel=expLabel, ext=ext)
438
438
439 if not(doypath):
439 if not(doypath):
440 for nTries in range( self.nTries ):
440 for nTries in range( self.nTries ):
441 print '\tWaiting %0.2f sec for an valid file in %s: try %02d ...' % (self.delay, path, nTries+1)
441 print '\tWaiting %0.2f sec for an valid file in %s: try %02d ...' % (self.delay, path, nTries+1)
442 time.sleep( self.delay )
442 time.sleep( self.delay )
443 doypath, file, year, doy, set = self.__searchFilesOnLine(path=path, expLabel=expLabel, ext=exp)
443 doypath, file, year, doy, set = self.__searchFilesOnLine(path=path, expLabel=expLabel, ext=exp)
444 if doypath:
444 if doypath:
445 break
445 break
446
446
447 if not(doypath):
447 if not(doypath):
448 print "There 'isn't valied files in %s" % path
448 print "There 'isn't valied files in %s" % path
449 return None
449 return None
450
450
451 self.year = year
451 self.year = year
452 self.doy = doy
452 self.doy = doy
453 self.set = set - 1
453 self.set = set - 1
454 self.path = path
454 self.path = path
455
455
456 else:
456 else:
457 print "Searching files in offline mode ..."
457 print "Searching files in offline mode ..."
458 pathList, filenameList = self.__searchFilesOffLine(path, startDate, endDate, startTime, endTime, set, expLabel, ext)
458 pathList, filenameList = self.__searchFilesOffLine(path, startDate, endDate, startTime, endTime, set, expLabel, ext)
459
459
460 if not(pathList):
460 if not(pathList):
461 print "No *%s files into the folder %s \nfor the range: %s - %s"%(ext, path,
461 print "No *%s files into the folder %s \nfor the range: %s - %s"%(ext, path,
462 datetime.datetime.combine(startDate,startTime).ctime(),
462 datetime.datetime.combine(startDate,startTime).ctime(),
463 datetime.datetime.combine(endDate,endTime).ctime())
463 datetime.datetime.combine(endDate,endTime).ctime())
464
464
465 sys.exit(-1)
465 sys.exit(-1)
466
466
467
467
468 self.fileIndex = -1
468 self.fileIndex = -1
469 self.pathList = pathList
469 self.pathList = pathList
470 self.filenameList = filenameList
470 self.filenameList = filenameList
471
471
472 self.online = online
472 self.online = online
473 self.delay = delay
473 self.delay = delay
474 ext = ext.lower()
474 ext = ext.lower()
475 self.ext = ext
475 self.ext = ext
476
476
477 if not(self.setNextFile()):
477 if not(self.setNextFile()):
478 if (startDate!=None) and (endDate!=None):
478 if (startDate!=None) and (endDate!=None):
479 print "No files in range: %s - %s" %(datetime.datetime.combine(startDate,startTime).ctime(), datetime.datetime.combine(endDate,endTime).ctime())
479 print "No files in range: %s - %s" %(datetime.datetime.combine(startDate,startTime).ctime(), datetime.datetime.combine(endDate,endTime).ctime())
480 elif startDate != None:
480 elif startDate != None:
481 print "No files in range: %s" %(datetime.datetime.combine(startDate,startTime).ctime())
481 print "No files in range: %s" %(datetime.datetime.combine(startDate,startTime).ctime())
482 else:
482 else:
483 print "No files"
483 print "No files"
484
484
485 sys.exit(-1)
485 sys.exit(-1)
486
486
487 # self.updateDataHeader()
487 # self.updateDataHeader()
488
488
489 return self.dataOutObj
489 return self.dataOutObj
490
490
491 def __setNextFileOffline(self):
491 def __setNextFileOffline(self):
492
492
493 idFile = self.fileIndex
493 idFile = self.fileIndex
494
494
495 while (True):
495 while (True):
496 idFile += 1
496 idFile += 1
497 if not(idFile < len(self.filenameList)):
497 if not(idFile < len(self.filenameList)):
498 self.flagNoMoreFiles = 1
498 self.flagNoMoreFiles = 1
499 print "No more Files"
499 print "No more Files"
500 return 0
500 return 0
501
501
502 filename = self.filenameList[idFile]
502 filename = self.filenameList[idFile]
503
503
504 if not(self.__verifyFile(filename)):
504 if not(self.__verifyFile(filename)):
505 continue
505 continue
506
506
507 fileSize = os.path.getsize(filename)
507 fileSize = os.path.getsize(filename)
508 fp = open(filename,'rb')
508 fp = open(filename,'rb')
509 break
509 break
510
510
511 self.flagIsNewFile = 1
511 self.flagIsNewFile = 1
512 self.fileIndex = idFile
512 self.fileIndex = idFile
513 self.filename = filename
513 self.filename = filename
514 self.fileSize = fileSize
514 self.fileSize = fileSize
515 self.fp = fp
515 self.fp = fp
516
516
517 print "Setting the file: %s"%self.filename
517 print "Setting the file: %s"%self.filename
518
518
519 return 1
519 return 1
520
520
521 def __setNextFileOnline(self):
521 def __setNextFileOnline(self):
522 """
522 """
523 Busca el siguiente file que tenga suficiente data para ser leida, dentro de un folder especifico, si
523 Busca el siguiente file que tenga suficiente data para ser leida, dentro de un folder especifico, si
524 no encuentra un file valido espera un tiempo determinado y luego busca en los posibles n files
524 no encuentra un file valido espera un tiempo determinado y luego busca en los posibles n files
525 siguientes.
525 siguientes.
526
526
527 Affected:
527 Affected:
528 self.flagIsNewFile
528 self.flagIsNewFile
529 self.filename
529 self.filename
530 self.fileSize
530 self.fileSize
531 self.fp
531 self.fp
532 self.set
532 self.set
533 self.flagNoMoreFiles
533 self.flagNoMoreFiles
534
534
535 Return:
535 Return:
536 0 : si luego de una busqueda del siguiente file valido este no pudo ser encontrado
536 0 : si luego de una busqueda del siguiente file valido este no pudo ser encontrado
537 1 : si el file fue abierto con exito y esta listo a ser leido
537 1 : si el file fue abierto con exito y esta listo a ser leido
538
538
539 Excepciones:
539 Excepciones:
540 Si un determinado file no puede ser abierto
540 Si un determinado file no puede ser abierto
541 """
541 """
542 nFiles = 0
542 nFiles = 0
543 fileOk_flag = False
543 fileOk_flag = False
544 firstTime_flag = True
544 firstTime_flag = True
545
545
546 self.set += 1
546 self.set += 1
547
547
548 #busca el 1er file disponible
548 #busca el 1er file disponible
549 file, filename = checkForRealPath( self.path, self.year, self.doy, self.set, self.ext )
549 file, filename = checkForRealPath( self.path, self.year, self.doy, self.set, self.ext )
550 if file:
550 if file:
551 if self.__verifyFile(file, False):
551 if self.__verifyFile(file, False):
552 fileOk_flag = True
552 fileOk_flag = True
553
553
554 #si no encuentra un file entonces espera y vuelve a buscar
554 #si no encuentra un file entonces espera y vuelve a buscar
555 if not(fileOk_flag):
555 if not(fileOk_flag):
556 for nFiles in range(self.nFiles+1): #busco en los siguientes self.nFiles+1 files posibles
556 for nFiles in range(self.nFiles+1): #busco en los siguientes self.nFiles+1 files posibles
557
557
558 if firstTime_flag: #si es la 1era vez entonces hace el for self.nTries veces
558 if firstTime_flag: #si es la 1era vez entonces hace el for self.nTries veces
559 tries = self.nTries
559 tries = self.nTries
560 else:
560 else:
561 tries = 1 #si no es la 1era vez entonces solo lo hace una vez
561 tries = 1 #si no es la 1era vez entonces solo lo hace una vez
562
562
563 for nTries in range( tries ):
563 for nTries in range( tries ):
564 if firstTime_flag:
564 if firstTime_flag:
565 print "\tWaiting %0.2f sec for the file \"%s\" , try %03d ..." % ( self.delay, filename, nTries+1 )
565 print "\tWaiting %0.2f sec for the file \"%s\" , try %03d ..." % ( self.delay, filename, nTries+1 )
566 time.sleep( self.delay )
566 time.sleep( self.delay )
567 else:
567 else:
568 print "\tSearching next \"%s%04d%03d%03d%s\" file ..." % (self.optchar, self.year, self.doy, self.set, self.ext)
568 print "\tSearching next \"%s%04d%03d%03d%s\" file ..." % (self.optchar, self.year, self.doy, self.set, self.ext)
569
569
570 file, filename = checkForRealPath( self.path, self.year, self.doy, self.set, self.ext )
570 file, filename = checkForRealPath( self.path, self.year, self.doy, self.set, self.ext )
571 if file:
571 if file:
572 if self.__verifyFile(file):
572 if self.__verifyFile(file):
573 fileOk_flag = True
573 fileOk_flag = True
574 break
574 break
575
575
576 if fileOk_flag:
576 if fileOk_flag:
577 break
577 break
578
578
579 firstTime_flag = False
579 firstTime_flag = False
580
580
581 print "\tSkipping the file \"%s\" due to this file doesn't exist" % filename
581 print "\tSkipping the file \"%s\" due to this file doesn't exist" % filename
582 self.set += 1
582 self.set += 1
583
583
584 if nFiles == (self.nFiles-1): #si no encuentro el file buscado cambio de carpeta y busco en la siguiente carpeta
584 if nFiles == (self.nFiles-1): #si no encuentro el file buscado cambio de carpeta y busco en la siguiente carpeta
585 self.set = 0
585 self.set = 0
586 self.doy += 1
586 self.doy += 1
587
587
588 if fileOk_flag:
588 if fileOk_flag:
589 self.fileSize = os.path.getsize( file )
589 self.fileSize = os.path.getsize( file )
590 self.filename = file
590 self.filename = file
591 self.flagIsNewFile = 1
591 self.flagIsNewFile = 1
592 if self.fp != None: self.fp.close()
592 if self.fp != None: self.fp.close()
593 self.fp = open(file, 'rb')
593 self.fp = open(file, 'rb')
594 self.flagNoMoreFiles = 0
594 self.flagNoMoreFiles = 0
595 print 'Setting the file: %s' % file
595 print 'Setting the file: %s' % file
596 else:
596 else:
597 self.fileSize = 0
597 self.fileSize = 0
598 self.filename = None
598 self.filename = None
599 self.flagIsNewFile = 0
599 self.flagIsNewFile = 0
600 self.fp = None
600 self.fp = None
601 self.flagNoMoreFiles = 1
601 self.flagNoMoreFiles = 1
602 print 'No more Files'
602 print 'No more Files'
603
603
604 return fileOk_flag
604 return fileOk_flag
605
605
606
606
607 def setNextFile(self):
607 def setNextFile(self):
608 if self.fp != None:
608 if self.fp != None:
609 self.fp.close()
609 self.fp.close()
610
610
611 if self.online:
611 if self.online:
612 newFile = self.__setNextFileOnline()
612 newFile = self.__setNextFileOnline()
613 else:
613 else:
614 newFile = self.__setNextFileOffline()
614 newFile = self.__setNextFileOffline()
615
615
616 if not(newFile):
616 if not(newFile):
617 return 0
617 return 0
618
618
619 self.__readFirstHeader()
619 self.__readFirstHeader()
620 self.nReadBlocks = 0
620 self.nReadBlocks = 0
621 return 1
621 return 1
622
622
623 def __waitNewBlock(self):
624 #si es OnLine y ademas aun no se han leido un bloque completo entonces se espera por uno valido
625 if not self.online:
626 return
627
628
629 if (self.nReadBlocks < self.m_ProcessingHeader.dataBlocksPerFile):
630
631 currentPointer = self.fp.tell()
632
633 for nTries in range( self.nTries ):
634 #self.fp.close()
635
636 print "\tWaiting %0.2f seconds for the next block, try %03d ..." % (self.delay, nTries+1)
637 time.sleep( self.delay )
638
639 #self.fp = open( self.filename, 'rb' )
640 #self.fp.seek( fpointer )
641
642 self.fileSize = os.path.getsize( self.filename )
643 currentSize = self.fileSize - currentPointer
644
645 if ( currentSize >= neededSize ):
646 self.__rdBasicHeader()
647 return 1
648
649 return 0
650
651 return 1
652
623 def __setNewBlock(self):
653 def __setNewBlock(self):
624 if self.fp == None:
654 if self.fp == None:
625 return 0
655 return 0
626
656
627 if self.flagIsNewFile:
657 if self.flagIsNewFile:
628 return 1
658 return 1
629
659
630 self.lastUTTime = self.basicHeaderObj.utc
660 self.lastUTTime = self.basicHeaderObj.utc
631 currentSize = self.fileSize - self.fp.tell()
661 currentSize = self.fileSize - self.fp.tell()
632 neededSize = self.processingHeaderObj.blockSize + self.basicHeaderSize
662 neededSize = self.processingHeaderObj.blockSize + self.basicHeaderSize
633
663
634 if (currentSize >= neededSize):
664 if (currentSize >= neededSize):
635 self.__rdBasicHeader()
665 self.__rdBasicHeader()
636 return 1
666 return 1
667
668 if self.__waitNewBlock():
669 return 1
637
670
638 if not(self.setNextFile()):
671 if not(self.setNextFile()):
639 return 0
672 return 0
640
673
641 deltaTime = self.basicHeaderObj.utc - self.lastUTTime #
674 deltaTime = self.basicHeaderObj.utc - self.lastUTTime #
642
675
643 self.flagTimeBlock = 0
676 self.flagTimeBlock = 0
644
677
645 if deltaTime > self.maxTimeStep:
678 if deltaTime > self.maxTimeStep:
646 self.flagTimeBlock = 1
679 self.flagTimeBlock = 1
647
680
648 return 1
681 return 1
649
682
650
683
651 def readNextBlock(self):
684 def readNextBlock(self):
652 if not(self.__setNewBlock()):
685 if not(self.__setNewBlock()):
653 return 0
686 return 0
654
687
655 if not(self.readBlock()):
688 if not(self.readBlock()):
656 return 0
689 return 0
657
690
658 return 1
691 return 1
659
692
660 def __rdProcessingHeader(self, fp=None):
693 def __rdProcessingHeader(self, fp=None):
661 if fp == None:
694 if fp == None:
662 fp = self.fp
695 fp = self.fp
663
696
664 self.processingHeaderObj.read(fp)
697 self.processingHeaderObj.read(fp)
665
698
666 def __rdRadarControllerHeader(self, fp=None):
699 def __rdRadarControllerHeader(self, fp=None):
667 if fp == None:
700 if fp == None:
668 fp = self.fp
701 fp = self.fp
669
702
670 self.radarControllerHeaderObj.read(fp)
703 self.radarControllerHeaderObj.read(fp)
671
704
672 def __rdSystemHeader(self, fp=None):
705 def __rdSystemHeader(self, fp=None):
673 if fp == None:
706 if fp == None:
674 fp = self.fp
707 fp = self.fp
675
708
676 self.systemHeaderObj.read(fp)
709 self.systemHeaderObj.read(fp)
677
710
678 def __rdBasicHeader(self, fp=None):
711 def __rdBasicHeader(self, fp=None):
679 if fp == None:
712 if fp == None:
680 fp = self.fp
713 fp = self.fp
681
714
682 self.basicHeaderObj.read(fp)
715 self.basicHeaderObj.read(fp)
683
716
684
717
685 def __readFirstHeader(self):
718 def __readFirstHeader(self):
686 self.__rdBasicHeader()
719 self.__rdBasicHeader()
687 self.__rdSystemHeader()
720 self.__rdSystemHeader()
688 self.__rdRadarControllerHeader()
721 self.__rdRadarControllerHeader()
689 self.__rdProcessingHeader()
722 self.__rdProcessingHeader()
690
723
691 self.firstHeaderSize = self.basicHeaderObj.size
724 self.firstHeaderSize = self.basicHeaderObj.size
692
725
693 datatype = int(numpy.log2((self.processingHeaderObj.processFlags & PROCFLAG.DATATYPE_MASK))-numpy.log2(PROCFLAG.DATATYPE_CHAR))
726 datatype = int(numpy.log2((self.processingHeaderObj.processFlags & PROCFLAG.DATATYPE_MASK))-numpy.log2(PROCFLAG.DATATYPE_CHAR))
694 if datatype == 0:
727 if datatype == 0:
695 datatype_str = numpy.dtype([('real','<i1'),('imag','<i1')])
728 datatype_str = numpy.dtype([('real','<i1'),('imag','<i1')])
696 elif datatype == 1:
729 elif datatype == 1:
697 datatype_str = numpy.dtype([('real','<i2'),('imag','<i2')])
730 datatype_str = numpy.dtype([('real','<i2'),('imag','<i2')])
698 elif datatype == 2:
731 elif datatype == 2:
699 datatype_str = numpy.dtype([('real','<i4'),('imag','<i4')])
732 datatype_str = numpy.dtype([('real','<i4'),('imag','<i4')])
700 elif datatype == 3:
733 elif datatype == 3:
701 datatype_str = numpy.dtype([('real','<i8'),('imag','<i8')])
734 datatype_str = numpy.dtype([('real','<i8'),('imag','<i8')])
702 elif datatype == 4:
735 elif datatype == 4:
703 datatype_str = numpy.dtype([('real','<f4'),('imag','<f4')])
736 datatype_str = numpy.dtype([('real','<f4'),('imag','<f4')])
704 elif datatype == 5:
737 elif datatype == 5:
705 datatype_str = numpy.dtype([('real','<f8'),('imag','<f8')])
738 datatype_str = numpy.dtype([('real','<f8'),('imag','<f8')])
706 else:
739 else:
707 raise ValueError, 'Data type was not defined'
740 raise ValueError, 'Data type was not defined'
708
741
709 self.dtype = datatype_str
742 self.dtype = datatype_str
710 self.ippSeconds = 2 * 1000 * self.radarControllerHeaderObj.ipp / self.c
743 self.ippSeconds = 2 * 1000 * self.radarControllerHeaderObj.ipp / self.c
711 self.fileSizeByHeader = self.processingHeaderObj.dataBlocksPerFile * self.processingHeaderObj.blockSize + self.firstHeaderSize + self.basicHeaderSize*(self.processingHeaderObj.dataBlocksPerFile - 1)
744 self.fileSizeByHeader = self.processingHeaderObj.dataBlocksPerFile * self.processingHeaderObj.blockSize + self.firstHeaderSize + self.basicHeaderSize*(self.processingHeaderObj.dataBlocksPerFile - 1)
712 # self.dataOutObj.channelList = numpy.arange(self.systemHeaderObj.numChannels)
745 # self.dataOutObj.channelList = numpy.arange(self.systemHeaderObj.numChannels)
713 # self.dataOutObj.channelIndexList = numpy.arange(self.systemHeaderObj.numChannels)
746 # self.dataOutObj.channelIndexList = numpy.arange(self.systemHeaderObj.numChannels)
714 self.getBlockDimension()
747 self.getBlockDimension()
715
748
716
749
717 def __verifyFile(self, filename, msgFlag=True):
750 def __verifyFile(self, filename, msgFlag=True):
718 msg = None
751 msg = None
719 try:
752 try:
720 fp = open(filename, 'rb')
753 fp = open(filename, 'rb')
721 currentPosition = fp.tell()
754 currentPosition = fp.tell()
722 except:
755 except:
723 if msgFlag:
756 if msgFlag:
724 print "The file %s can't be opened" % (filename)
757 print "The file %s can't be opened" % (filename)
725 return False
758 return False
726
759
727 neededSize = self.processingHeaderObj.blockSize + self.firstHeaderSize
760 neededSize = self.processingHeaderObj.blockSize + self.firstHeaderSize
728
761
729 if neededSize == 0:
762 if neededSize == 0:
730 basicHeaderObj = BasicHeader()
763 basicHeaderObj = BasicHeader()
731 systemHeaderObj = SystemHeader()
764 systemHeaderObj = SystemHeader()
732 radarControllerHeaderObj = RadarControllerHeader()
765 radarControllerHeaderObj = RadarControllerHeader()
733 processingHeaderObj = ProcessingHeader()
766 processingHeaderObj = ProcessingHeader()
734
767
735 try:
768 try:
736 if not( basicHeaderObj.read(fp) ): raise ValueError
769 if not( basicHeaderObj.read(fp) ): raise ValueError
737 if not( systemHeaderObj.read(fp) ): raise ValueError
770 if not( systemHeaderObj.read(fp) ): raise ValueError
738 if not( radarControllerHeaderObj.read(fp) ): raise ValueError
771 if not( radarControllerHeaderObj.read(fp) ): raise ValueError
739 if not( processingHeaderObj.read(fp) ): raise ValueError
772 if not( processingHeaderObj.read(fp) ): raise ValueError
740 data_type = int(numpy.log2((processingHeaderObj.processFlags & PROCFLAG.DATATYPE_MASK))-numpy.log2(PROCFLAG.DATATYPE_CHAR))
773 data_type = int(numpy.log2((processingHeaderObj.processFlags & PROCFLAG.DATATYPE_MASK))-numpy.log2(PROCFLAG.DATATYPE_CHAR))
741
774
742 neededSize = processingHeaderObj.blockSize + basicHeaderObj.size
775 neededSize = processingHeaderObj.blockSize + basicHeaderObj.size
743
776
744 except:
777 except:
745 if msgFlag:
778 if msgFlag:
746 print "\tThe file %s is empty or it hasn't enough data" % filename
779 print "\tThe file %s is empty or it hasn't enough data" % filename
747
780
748 fp.close()
781 fp.close()
749 return False
782 return False
750 else:
783 else:
751 msg = "\tSkipping the file %s due to it hasn't enough data" %filename
784 msg = "\tSkipping the file %s due to it hasn't enough data" %filename
752
785
753 fp.close()
786 fp.close()
754 fileSize = os.path.getsize(filename)
787 fileSize = os.path.getsize(filename)
755 currentSize = fileSize - currentPosition
788 currentSize = fileSize - currentPosition
756 if currentSize < neededSize:
789 if currentSize < neededSize:
757 if msgFlag and (msg != None):
790 if msgFlag and (msg != None):
758 print msg #print"\tSkipping the file %s due to it hasn't enough data" %filename
791 print msg #print"\tSkipping the file %s due to it hasn't enough data" %filename
759 return False
792 return False
760
793
761 return True
794 return True
762
795
763 def getData():
796 def getData():
764 pass
797 pass
765
798
766 def hasNotDataInBuffer():
799 def hasNotDataInBuffer():
767 pass
800 pass
768
801
769 def readBlock():
802 def readBlock():
770 pass
803 pass
771
804
772 class JRODataWriter(JRODataIO):
805 class JRODataWriter(JRODataIO):
773
806
774 """
807 """
775 Esta clase permite escribir datos a archivos procesados (.r o ,pdata). La escritura
808 Esta clase permite escribir datos a archivos procesados (.r o ,pdata). La escritura
776 de los datos siempre se realiza por bloques.
809 de los datos siempre se realiza por bloques.
777 """
810 """
778
811
779 blockIndex = 0
812 blockIndex = 0
780
813
781 path = None
814 path = None
782
815
783 setFile = None
816 setFile = None
784
817
785 profilesPerBlock = None
818 profilesPerBlock = None
786
819
787 blocksPerFile = None
820 blocksPerFile = None
788
821
789 nWriteBlocks = 0
822 nWriteBlocks = 0
790
823
791 def __init__(self, dataOutObj=None):
824 def __init__(self, dataOutObj=None):
792 raise ValueError, "Not implemented"
825 raise ValueError, "Not implemented"
793
826
794
827
795 def hasAllDataInBuffer(self):
828 def hasAllDataInBuffer(self):
796 raise ValueError, "Not implemented"
829 raise ValueError, "Not implemented"
797
830
798
831
799 def setBlockDimension(self):
832 def setBlockDimension(self):
800 raise ValueError, "Not implemented"
833 raise ValueError, "Not implemented"
801
834
802
835
803 def writeBlock(self):
836 def writeBlock(self):
804 raise ValueError, "No implemented"
837 raise ValueError, "No implemented"
805
838
806
839
807 def putData(self):
840 def putData(self):
808 raise ValueError, "No implemented"
841 raise ValueError, "No implemented"
809
842
810
843
811 def __writeFirstHeader(self):
844 def __writeFirstHeader(self):
812 """
845 """
813 Escribe el primer header del file es decir el Basic header y el Long header (SystemHeader, RadarControllerHeader, ProcessingHeader)
846 Escribe el primer header del file es decir el Basic header y el Long header (SystemHeader, RadarControllerHeader, ProcessingHeader)
814
847
815 Affected:
848 Affected:
816 __dataType
849 __dataType
817
850
818 Return:
851 Return:
819 None
852 None
820 """
853 """
821
854
822 # CALCULAR PARAMETROS
855 # CALCULAR PARAMETROS
823
856
824 sizeLongHeader = self.systemHeaderObj.size + self.radarControllerHeaderObj.size + self.processingHeaderObj.size
857 sizeLongHeader = self.systemHeaderObj.size + self.radarControllerHeaderObj.size + self.processingHeaderObj.size
825 self.basicHeaderObj.size = self.basicHeaderSize + sizeLongHeader
858 self.basicHeaderObj.size = self.basicHeaderSize + sizeLongHeader
826
859
827 self.__writeBasicHeader()
860 self.__writeBasicHeader()
828 self.__wrSystemHeader()
861 self.__wrSystemHeader()
829 self.__wrRadarControllerHeader()
862 self.__wrRadarControllerHeader()
830 self.__wrProcessingHeader()
863 self.__wrProcessingHeader()
831 self.dtype = self.dataOutObj.dtype
864 self.dtype = self.dataOutObj.dtype
832
865
833
866
834 def __writeBasicHeader(self, fp=None):
867 def __writeBasicHeader(self, fp=None):
835 """
868 """
836 Escribe solo el Basic header en el file creado
869 Escribe solo el Basic header en el file creado
837
870
838 Return:
871 Return:
839 None
872 None
840 """
873 """
841 if fp == None:
874 if fp == None:
842 fp = self.fp
875 fp = self.fp
843
876
844 self.basicHeaderObj.write(fp)
877 self.basicHeaderObj.write(fp)
845
878
846
879
847 def __wrSystemHeader(self, fp=None):
880 def __wrSystemHeader(self, fp=None):
848 """
881 """
849 Escribe solo el System header en el file creado
882 Escribe solo el System header en el file creado
850
883
851 Return:
884 Return:
852 None
885 None
853 """
886 """
854 if fp == None:
887 if fp == None:
855 fp = self.fp
888 fp = self.fp
856
889
857 self.systemHeaderObj.write(fp)
890 self.systemHeaderObj.write(fp)
858
891
859
892
860 def __wrRadarControllerHeader(self, fp=None):
893 def __wrRadarControllerHeader(self, fp=None):
861 """
894 """
862 Escribe solo el RadarController header en el file creado
895 Escribe solo el RadarController header en el file creado
863
896
864 Return:
897 Return:
865 None
898 None
866 """
899 """
867 if fp == None:
900 if fp == None:
868 fp = self.fp
901 fp = self.fp
869
902
870 self.radarControllerHeaderObj.write(fp)
903 self.radarControllerHeaderObj.write(fp)
871
904
872
905
873 def __wrProcessingHeader(self, fp=None):
906 def __wrProcessingHeader(self, fp=None):
874 """
907 """
875 Escribe solo el Processing header en el file creado
908 Escribe solo el Processing header en el file creado
876
909
877 Return:
910 Return:
878 None
911 None
879 """
912 """
880 if fp == None:
913 if fp == None:
881 fp = self.fp
914 fp = self.fp
882
915
883 self.processingHeaderObj.write(fp)
916 self.processingHeaderObj.write(fp)
884
917
885
918
886 def setNextFile(self):
919 def setNextFile(self):
887 """
920 """
888 Determina el siguiente file que sera escrito
921 Determina el siguiente file que sera escrito
889
922
890 Affected:
923 Affected:
891 self.filename
924 self.filename
892 self.subfolder
925 self.subfolder
893 self.fp
926 self.fp
894 self.setFile
927 self.setFile
895 self.flagIsNewFile
928 self.flagIsNewFile
896
929
897 Return:
930 Return:
898 0 : Si el archivo no puede ser escrito
931 0 : Si el archivo no puede ser escrito
899 1 : Si el archivo esta listo para ser escrito
932 1 : Si el archivo esta listo para ser escrito
900 """
933 """
901 ext = self.ext
934 ext = self.ext
902 path = self.path
935 path = self.path
903
936
904 if self.fp != None:
937 if self.fp != None:
905 self.fp.close()
938 self.fp.close()
906
939
907 timeTuple = time.localtime( self.dataOutObj.dataUtcTime)
940 timeTuple = time.localtime( self.dataOutObj.dataUtcTime)
908 subfolder = 'D%4.4d%3.3d' % (timeTuple.tm_year,timeTuple.tm_yday)
941 subfolder = 'D%4.4d%3.3d' % (timeTuple.tm_year,timeTuple.tm_yday)
909
942
910 doypath = os.path.join( path, subfolder )
943 doypath = os.path.join( path, subfolder )
911 if not( os.path.exists(doypath) ):
944 if not( os.path.exists(doypath) ):
912 os.mkdir(doypath)
945 os.mkdir(doypath)
913 self.setFile = -1 #inicializo mi contador de seteo
946 self.setFile = -1 #inicializo mi contador de seteo
914 else:
947 else:
915 filesList = os.listdir( doypath )
948 filesList = os.listdir( doypath )
916 if len( filesList ) > 0:
949 if len( filesList ) > 0:
917 filesList = sorted( filesList, key=str.lower )
950 filesList = sorted( filesList, key=str.lower )
918 filen = filesList[-1]
951 filen = filesList[-1]
919 # el filename debera tener el siguiente formato
952 # el filename debera tener el siguiente formato
920 # 0 1234 567 89A BCDE (hex)
953 # 0 1234 567 89A BCDE (hex)
921 # x YYYY DDD SSS .ext
954 # x YYYY DDD SSS .ext
922 if isNumber( filen[8:11] ):
955 if isNumber( filen[8:11] ):
923 self.setFile = int( filen[8:11] ) #inicializo mi contador de seteo al seteo del ultimo file
956 self.setFile = int( filen[8:11] ) #inicializo mi contador de seteo al seteo del ultimo file
924 else:
957 else:
925 self.setFile = -1
958 self.setFile = -1
926 else:
959 else:
927 self.setFile = -1 #inicializo mi contador de seteo
960 self.setFile = -1 #inicializo mi contador de seteo
928
961
929 setFile = self.setFile
962 setFile = self.setFile
930 setFile += 1
963 setFile += 1
931
964
932 file = '%s%4.4d%3.3d%3.3d%s' % (self.optchar,
965 file = '%s%4.4d%3.3d%3.3d%s' % (self.optchar,
933 timeTuple.tm_year,
966 timeTuple.tm_year,
934 timeTuple.tm_yday,
967 timeTuple.tm_yday,
935 setFile,
968 setFile,
936 ext )
969 ext )
937
970
938 filename = os.path.join( path, subfolder, file )
971 filename = os.path.join( path, subfolder, file )
939
972
940 fp = open( filename,'wb' )
973 fp = open( filename,'wb' )
941
974
942 self.blockIndex = 0
975 self.blockIndex = 0
943
976
944 #guardando atributos
977 #guardando atributos
945 self.filename = filename
978 self.filename = filename
946 self.subfolder = subfolder
979 self.subfolder = subfolder
947 self.fp = fp
980 self.fp = fp
948 self.setFile = setFile
981 self.setFile = setFile
949 self.flagIsNewFile = 1
982 self.flagIsNewFile = 1
950
983
951 self.getDataHeader()
984 self.getDataHeader()
952
985
953 print 'Writing the file: %s'%self.filename
986 print 'Writing the file: %s'%self.filename
954
987
955 self.__writeFirstHeader()
988 self.__writeFirstHeader()
956
989
957 return 1
990 return 1
958
991
959
992
960 def __setNewBlock(self):
993 def __setNewBlock(self):
961 """
994 """
962 Si es un nuevo file escribe el First Header caso contrario escribe solo el Basic Header
995 Si es un nuevo file escribe el First Header caso contrario escribe solo el Basic Header
963
996
964 Return:
997 Return:
965 0 : si no pudo escribir nada
998 0 : si no pudo escribir nada
966 1 : Si escribio el Basic el First Header
999 1 : Si escribio el Basic el First Header
967 """
1000 """
968 if self.fp == None:
1001 if self.fp == None:
969 self.setNextFile()
1002 self.setNextFile()
970
1003
971 if self.flagIsNewFile:
1004 if self.flagIsNewFile:
972 return 1
1005 return 1
973
1006
974 if self.blockIndex < self.processingHeaderObj.dataBlocksPerFile:
1007 if self.blockIndex < self.processingHeaderObj.dataBlocksPerFile:
975 self.__writeBasicHeader()
1008 self.__writeBasicHeader()
976 return 1
1009 return 1
977
1010
978 if not( self.setNextFile() ):
1011 if not( self.setNextFile() ):
979 return 0
1012 return 0
980
1013
981 return 1
1014 return 1
982
1015
983
1016
984 def writeNextBlock(self):
1017 def writeNextBlock(self):
985 """
1018 """
986 Selecciona el bloque siguiente de datos y los escribe en un file
1019 Selecciona el bloque siguiente de datos y los escribe en un file
987
1020
988 Return:
1021 Return:
989 0 : Si no hizo pudo escribir el bloque de datos
1022 0 : Si no hizo pudo escribir el bloque de datos
990 1 : Si no pudo escribir el bloque de datos
1023 1 : Si no pudo escribir el bloque de datos
991 """
1024 """
992 if not( self.__setNewBlock() ):
1025 if not( self.__setNewBlock() ):
993 return 0
1026 return 0
994
1027
995 self.writeBlock()
1028 self.writeBlock()
996
1029
997 return 1
1030 return 1
998
1031
999
1032
1000 def getDataHeader(self):
1033 def getDataHeader(self):
1001 """Obtiene una copia del First Header Affected: self.basicHeaderObj self.
1034 """Obtiene una copia del First Header Affected: self.basicHeaderObj self.
1002 systemHeaderObj self.radarControllerHeaderObj self.processingHeaderObj self.
1035 systemHeaderObj self.radarControllerHeaderObj self.processingHeaderObj self.
1003 dtype Return: None
1036 dtype Return: None
1004 """
1037 """
1005
1038
1006 raise ValueError, "No implemented"
1039 raise ValueError, "No implemented"
1007
1040
1008 def setup(self, path, blocksPerFile, profilesPerBlock=None, set=0, ext=None):
1041 def setup(self, path, blocksPerFile, profilesPerBlock=None, set=0, ext=None):
1009 """
1042 """
1010 Setea el tipo de formato en la cual sera guardada la data y escribe el First Header
1043 Setea el tipo de formato en la cual sera guardada la data y escribe el First Header
1011
1044
1012 Inputs:
1045 Inputs:
1013 path : el path destino en el cual se escribiran los files a crear
1046 path : el path destino en el cual se escribiran los files a crear
1014 format : formato en el cual sera salvado un file
1047 format : formato en el cual sera salvado un file
1015 set : el setebo del file
1048 set : el setebo del file
1016
1049
1017 Return:
1050 Return:
1018 0 : Si no realizo un buen seteo
1051 0 : Si no realizo un buen seteo
1019 1 : Si realizo un buen seteo
1052 1 : Si realizo un buen seteo
1020 """
1053 """
1021
1054
1022 if ext == None:
1055 if ext == None:
1023 ext = self.ext
1056 ext = self.ext
1024
1057
1025 ext = ext.lower()
1058 ext = ext.lower()
1026
1059
1027 self.ext = ext
1060 self.ext = ext
1028
1061
1029 self.path = path
1062 self.path = path
1030
1063
1031 self.setFile = set - 1
1064 self.setFile = set - 1
1032
1065
1033 self.blocksPerFile = blocksPerFile
1066 self.blocksPerFile = blocksPerFile
1034
1067
1035 self.profilesPerBlock = profilesPerBlock
1068 self.profilesPerBlock = profilesPerBlock
1036
1069
1037 if not(self.setNextFile()):
1070 if not(self.setNextFile()):
1038 print "There isn't a next file"
1071 print "There isn't a next file"
1039 return 0
1072 return 0
1040
1073
1041 self.setBlockDimension()
1074 self.setBlockDimension()
1042
1075
1043 return 1
1076 return 1
1044
1077
1045
1078
1046
1079
1047
1080
1048
1081
1049
1082
@@ -1,949 +1,949
1 '''
1 '''
2
2
3 $Author$
3 $Author$
4 $Id$
4 $Id$
5 '''
5 '''
6
6
7 import os, sys
7 import os, sys
8 import numpy
8 import numpy
9
9
10 import pyfits
10 #import pyfits
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 JROHeaderIO import *
18 from JROHeaderIO import *
19 from JRODataIO import JRODataReader
19 from JRODataIO import JRODataReader
20 from JRODataIO import JRODataWriter
20 from JRODataIO import JRODataWriter
21
21
22 from Data.JROData import Spectra
22 from Data.JROData import Spectra
23
23
24 from Data.JROData import SpectraHeis
24 from Data.JROData import SpectraHeis
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.data_spc
56 print readerObj.data_spc
57
57
58 print readerObj.data_cspc
58 print readerObj.data_cspc
59
59
60 print readerObj.data_dc
60 print readerObj.data_dc
61
61
62 if readerObj.flagNoMoreFiles:
62 if readerObj.flagNoMoreFiles:
63 break
63 break
64
64
65 """
65 """
66
66
67 pts2read_SelfSpectra = 0
67 pts2read_SelfSpectra = 0
68
68
69 pts2read_CrossSpectra = 0
69 pts2read_CrossSpectra = 0
70
70
71 pts2read_DCchannels = 0
71 pts2read_DCchannels = 0
72
72
73 ext = ".pdata"
73 ext = ".pdata"
74
74
75 optchar = "P"
75 optchar = "P"
76
76
77 dataOutObj = None
77 dataOutObj = None
78
78
79 nRdChannels = None
79 nRdChannels = None
80
80
81 nRdPairs = None
81 nRdPairs = None
82
82
83 rdPairList = []
83 rdPairList = []
84
84
85
85
86 def __init__(self, dataOutObj=None):
86 def __init__(self, dataOutObj=None):
87 """
87 """
88 Inicializador de la clase SpectraReader para la lectura de datos de espectros.
88 Inicializador de la clase SpectraReader para la lectura de datos de espectros.
89
89
90 Inputs:
90 Inputs:
91 dataOutObj : Objeto de la clase Spectra. Este objeto sera utilizado para
91 dataOutObj : Objeto de la clase Spectra. Este objeto sera utilizado para
92 almacenar un perfil de datos cada vez que se haga un requerimiento
92 almacenar un perfil de datos cada vez que se haga un requerimiento
93 (getData). El perfil sera obtenido a partir del buffer de datos,
93 (getData). El perfil sera obtenido a partir del buffer de datos,
94 si el buffer esta vacio se hara un nuevo proceso de lectura de un
94 si el buffer esta vacio se hara un nuevo proceso de lectura de un
95 bloque de datos.
95 bloque de datos.
96 Si este parametro no es pasado se creara uno internamente.
96 Si este parametro no es pasado se creara uno internamente.
97
97
98 Affected:
98 Affected:
99 self.dataOutObj
99 self.dataOutObj
100
100
101 Return : None
101 Return : None
102 """
102 """
103
103
104 self.pts2read_SelfSpectra = 0
104 self.pts2read_SelfSpectra = 0
105
105
106 self.pts2read_CrossSpectra = 0
106 self.pts2read_CrossSpectra = 0
107
107
108 self.pts2read_DCchannels = 0
108 self.pts2read_DCchannels = 0
109
109
110 self.datablock = None
110 self.datablock = None
111
111
112 self.utc = None
112 self.utc = None
113
113
114 self.ext = ".pdata"
114 self.ext = ".pdata"
115
115
116 self.optchar = "P"
116 self.optchar = "P"
117
117
118 self.basicHeaderObj = BasicHeader()
118 self.basicHeaderObj = BasicHeader()
119
119
120 self.systemHeaderObj = SystemHeader()
120 self.systemHeaderObj = SystemHeader()
121
121
122 self.radarControllerHeaderObj = RadarControllerHeader()
122 self.radarControllerHeaderObj = RadarControllerHeader()
123
123
124 self.processingHeaderObj = ProcessingHeader()
124 self.processingHeaderObj = ProcessingHeader()
125
125
126 self.online = 0
126 self.online = 0
127
127
128 self.fp = None
128 self.fp = None
129
129
130 self.idFile = None
130 self.idFile = None
131
131
132 self.dtype = None
132 self.dtype = None
133
133
134 self.fileSizeByHeader = None
134 self.fileSizeByHeader = None
135
135
136 self.filenameList = []
136 self.filenameList = []
137
137
138 self.filename = None
138 self.filename = None
139
139
140 self.fileSize = None
140 self.fileSize = None
141
141
142 self.firstHeaderSize = 0
142 self.firstHeaderSize = 0
143
143
144 self.basicHeaderSize = 24
144 self.basicHeaderSize = 24
145
145
146 self.pathList = []
146 self.pathList = []
147
147
148 self.lastUTTime = 0
148 self.lastUTTime = 0
149
149
150 self.maxTimeStep = 30
150 self.maxTimeStep = 30
151
151
152 self.flagNoMoreFiles = 0
152 self.flagNoMoreFiles = 0
153
153
154 self.set = 0
154 self.set = 0
155
155
156 self.path = None
156 self.path = None
157
157
158 self.delay = 3 #seconds
158 self.delay = 3 #seconds
159
159
160 self.nTries = 3 #quantity tries
160 self.nTries = 3 #quantity tries
161
161
162 self.nFiles = 3 #number of files for searching
162 self.nFiles = 3 #number of files for searching
163
163
164 self.nReadBlocks = 0
164 self.nReadBlocks = 0
165
165
166 self.flagIsNewFile = 1
166 self.flagIsNewFile = 1
167
167
168 self.ippSeconds = 0
168 self.ippSeconds = 0
169
169
170 self.flagTimeBlock = 0
170 self.flagTimeBlock = 0
171
171
172 self.flagIsNewBlock = 0
172 self.flagIsNewBlock = 0
173
173
174 self.nTotalBlocks = 0
174 self.nTotalBlocks = 0
175
175
176 self.blocksize = 0
176 self.blocksize = 0
177
177
178
178
179 def createObjByDefault(self):
179 def createObjByDefault(self):
180
180
181 dataObj = Spectra()
181 dataObj = Spectra()
182
182
183 return dataObj
183 return dataObj
184
184
185 def __hasNotDataInBuffer(self):
185 def __hasNotDataInBuffer(self):
186 return 1
186 return 1
187
187
188
188
189 def getBlockDimension(self):
189 def getBlockDimension(self):
190 """
190 """
191 Obtiene la cantidad de puntos a leer por cada bloque de datos
191 Obtiene la cantidad de puntos a leer por cada bloque de datos
192
192
193 Affected:
193 Affected:
194 self.nRdChannels
194 self.nRdChannels
195 self.nRdPairs
195 self.nRdPairs
196 self.pts2read_SelfSpectra
196 self.pts2read_SelfSpectra
197 self.pts2read_CrossSpectra
197 self.pts2read_CrossSpectra
198 self.pts2read_DCchannels
198 self.pts2read_DCchannels
199 self.blocksize
199 self.blocksize
200 self.dataOutObj.nChannels
200 self.dataOutObj.nChannels
201 self.dataOutObj.nPairs
201 self.dataOutObj.nPairs
202
202
203 Return:
203 Return:
204 None
204 None
205 """
205 """
206 self.nRdChannels = 0
206 self.nRdChannels = 0
207 self.nRdPairs = 0
207 self.nRdPairs = 0
208 self.rdPairList = []
208 self.rdPairList = []
209
209
210 for i in range(0, self.processingHeaderObj.totalSpectra*2, 2):
210 for i in range(0, self.processingHeaderObj.totalSpectra*2, 2):
211 if self.processingHeaderObj.spectraComb[i] == self.processingHeaderObj.spectraComb[i+1]:
211 if self.processingHeaderObj.spectraComb[i] == self.processingHeaderObj.spectraComb[i+1]:
212 self.nRdChannels = self.nRdChannels + 1 #par de canales iguales
212 self.nRdChannels = self.nRdChannels + 1 #par de canales iguales
213 else:
213 else:
214 self.nRdPairs = self.nRdPairs + 1 #par de canales diferentes
214 self.nRdPairs = self.nRdPairs + 1 #par de canales diferentes
215 self.rdPairList.append((self.processingHeaderObj.spectraComb[i], self.processingHeaderObj.spectraComb[i+1]))
215 self.rdPairList.append((self.processingHeaderObj.spectraComb[i], self.processingHeaderObj.spectraComb[i+1]))
216
216
217 pts2read = self.processingHeaderObj.nHeights * self.processingHeaderObj.profilesPerBlock
217 pts2read = self.processingHeaderObj.nHeights * self.processingHeaderObj.profilesPerBlock
218
218
219 self.pts2read_SelfSpectra = int(self.nRdChannels * pts2read)
219 self.pts2read_SelfSpectra = int(self.nRdChannels * pts2read)
220 self.blocksize = self.pts2read_SelfSpectra
220 self.blocksize = self.pts2read_SelfSpectra
221
221
222 if self.processingHeaderObj.flag_cspc:
222 if self.processingHeaderObj.flag_cspc:
223 self.pts2read_CrossSpectra = int(self.nRdPairs * pts2read)
223 self.pts2read_CrossSpectra = int(self.nRdPairs * pts2read)
224 self.blocksize += self.pts2read_CrossSpectra
224 self.blocksize += self.pts2read_CrossSpectra
225
225
226 if self.processingHeaderObj.flag_dc:
226 if self.processingHeaderObj.flag_dc:
227 self.pts2read_DCchannels = int(self.systemHeaderObj.nChannels * self.processingHeaderObj.nHeights)
227 self.pts2read_DCchannels = int(self.systemHeaderObj.nChannels * self.processingHeaderObj.nHeights)
228 self.blocksize += self.pts2read_DCchannels
228 self.blocksize += self.pts2read_DCchannels
229
229
230 # self.blocksize = self.pts2read_SelfSpectra + self.pts2read_CrossSpectra + self.pts2read_DCchannels
230 # self.blocksize = self.pts2read_SelfSpectra + self.pts2read_CrossSpectra + self.pts2read_DCchannels
231
231
232
232
233 def readBlock(self):
233 def readBlock(self):
234 """
234 """
235 Lee el bloque de datos desde la posicion actual del puntero del archivo
235 Lee el bloque de datos desde la posicion actual del puntero del archivo
236 (self.fp) y actualiza todos los parametros relacionados al bloque de datos
236 (self.fp) y actualiza todos los parametros relacionados al bloque de datos
237 (metadata + data). La data leida es almacenada en el buffer y el contador del buffer
237 (metadata + data). La data leida es almacenada en el buffer y el contador del buffer
238 es seteado a 0
238 es seteado a 0
239
239
240 Return: None
240 Return: None
241
241
242 Variables afectadas:
242 Variables afectadas:
243
243
244 self.flagIsNewFile
244 self.flagIsNewFile
245 self.flagIsNewBlock
245 self.flagIsNewBlock
246 self.nTotalBlocks
246 self.nTotalBlocks
247 self.data_spc
247 self.data_spc
248 self.data_cspc
248 self.data_cspc
249 self.data_dc
249 self.data_dc
250
250
251 Exceptions:
251 Exceptions:
252 Si un bloque leido no es un bloque valido
252 Si un bloque leido no es un bloque valido
253 """
253 """
254 blockOk_flag = False
254 blockOk_flag = False
255 fpointer = self.fp.tell()
255 fpointer = self.fp.tell()
256
256
257 spc = numpy.fromfile( self.fp, self.dtype[0], self.pts2read_SelfSpectra )
257 spc = numpy.fromfile( self.fp, self.dtype[0], self.pts2read_SelfSpectra )
258 spc = spc.reshape( (self.nRdChannels, self.processingHeaderObj.nHeights, self.processingHeaderObj.profilesPerBlock) ) #transforma a un arreglo 3D
258 spc = spc.reshape( (self.nRdChannels, self.processingHeaderObj.nHeights, self.processingHeaderObj.profilesPerBlock) ) #transforma a un arreglo 3D
259
259
260 if self.processingHeaderObj.flag_cspc:
260 if self.processingHeaderObj.flag_cspc:
261 cspc = numpy.fromfile( self.fp, self.dtype, self.pts2read_CrossSpectra )
261 cspc = numpy.fromfile( self.fp, self.dtype, self.pts2read_CrossSpectra )
262 cspc = cspc.reshape( (self.nRdPairs, self.processingHeaderObj.nHeights, self.processingHeaderObj.profilesPerBlock) ) #transforma a un arreglo 3D
262 cspc = cspc.reshape( (self.nRdPairs, self.processingHeaderObj.nHeights, self.processingHeaderObj.profilesPerBlock) ) #transforma a un arreglo 3D
263
263
264 if self.processingHeaderObj.flag_dc:
264 if self.processingHeaderObj.flag_dc:
265 dc = numpy.fromfile( self.fp, self.dtype, self.pts2read_DCchannels ) #int(self.processingHeaderObj.nHeights*self.systemHeaderObj.nChannels) )
265 dc = numpy.fromfile( self.fp, self.dtype, self.pts2read_DCchannels ) #int(self.processingHeaderObj.nHeights*self.systemHeaderObj.nChannels) )
266 dc = dc.reshape( (self.systemHeaderObj.nChannels, self.processingHeaderObj.nHeights) ) #transforma a un arreglo 2D
266 dc = dc.reshape( (self.systemHeaderObj.nChannels, self.processingHeaderObj.nHeights) ) #transforma a un arreglo 2D
267
267
268
268
269 if not(self.processingHeaderObj.shif_fft):
269 if not(self.processingHeaderObj.shif_fft):
270 spc = numpy.roll( spc, self.processingHeaderObj.profilesPerBlock/2, axis=2 ) #desplaza a la derecha en el eje 2 determinadas posiciones
270 spc = numpy.roll( spc, self.processingHeaderObj.profilesPerBlock/2, axis=2 ) #desplaza a la derecha en el eje 2 determinadas posiciones
271
271
272 if self.processingHeaderObj.flag_cspc:
272 if self.processingHeaderObj.flag_cspc:
273 cspc = numpy.roll( cspc, self.processingHeaderObj.profilesPerBlock/2, axis=2 ) #desplaza a la derecha en el eje 2 determinadas posiciones
273 cspc = numpy.roll( cspc, self.processingHeaderObj.profilesPerBlock/2, axis=2 ) #desplaza a la derecha en el eje 2 determinadas posiciones
274
274
275
275
276 spc = numpy.transpose( spc, (0,2,1) )
276 spc = numpy.transpose( spc, (0,2,1) )
277 self.data_spc = spc
277 self.data_spc = spc
278
278
279 if self.processingHeaderObj.flag_cspc:
279 if self.processingHeaderObj.flag_cspc:
280 cspc = numpy.transpose( cspc, (0,2,1) )
280 cspc = numpy.transpose( cspc, (0,2,1) )
281 self.data_cspc = cspc['real'] + cspc['imag']*1j
281 self.data_cspc = cspc['real'] + cspc['imag']*1j
282 else:
282 else:
283 self.data_cspc = None
283 self.data_cspc = None
284
284
285 if self.processingHeaderObj.flag_dc:
285 if self.processingHeaderObj.flag_dc:
286 self.data_dc = dc['real'] + dc['imag']*1j
286 self.data_dc = dc['real'] + dc['imag']*1j
287 else:
287 else:
288 self.data_dc = None
288 self.data_dc = None
289
289
290 self.flagIsNewFile = 0
290 self.flagIsNewFile = 0
291 self.flagIsNewBlock = 1
291 self.flagIsNewBlock = 1
292
292
293 self.nTotalBlocks += 1
293 self.nTotalBlocks += 1
294 self.nReadBlocks += 1
294 self.nReadBlocks += 1
295
295
296 return 1
296 return 1
297
297
298
298
299 def getData(self):
299 def getData(self):
300 """
300 """
301 Copia el buffer de lectura a la clase "Spectra",
301 Copia el buffer de lectura a la clase "Spectra",
302 con todos los parametros asociados a este (metadata). cuando no hay datos en el buffer de
302 con todos los parametros asociados a este (metadata). cuando no hay datos en el buffer de
303 lectura es necesario hacer una nueva lectura de los bloques de datos usando "readNextBlock"
303 lectura es necesario hacer una nueva lectura de los bloques de datos usando "readNextBlock"
304
304
305 Return:
305 Return:
306 0 : Si no hay mas archivos disponibles
306 0 : Si no hay mas archivos disponibles
307 1 : Si hizo una buena copia del buffer
307 1 : Si hizo una buena copia del buffer
308
308
309 Affected:
309 Affected:
310 self.dataOutObj
310 self.dataOutObj
311
311
312 self.flagTimeBlock
312 self.flagTimeBlock
313 self.flagIsNewBlock
313 self.flagIsNewBlock
314 """
314 """
315
315
316 if self.flagNoMoreFiles: return 0
316 if self.flagNoMoreFiles: return 0
317
317
318 self.flagTimeBlock = 0
318 self.flagTimeBlock = 0
319 self.flagIsNewBlock = 0
319 self.flagIsNewBlock = 0
320
320
321 if self.__hasNotDataInBuffer():
321 if self.__hasNotDataInBuffer():
322
322
323 if not( self.readNextBlock() ):
323 if not( self.readNextBlock() ):
324 return 0
324 return 0
325
325
326 # self.updateDataHeader()
326 # self.updateDataHeader()
327
327
328 if self.flagNoMoreFiles == 1:
328 if self.flagNoMoreFiles == 1:
329 print 'Process finished'
329 print 'Process finished'
330 return 0
330 return 0
331
331
332 #data es un numpy array de 3 dmensiones (perfiles, alturas y canales)
332 #data es un numpy array de 3 dmensiones (perfiles, alturas y canales)
333
333
334 if self.data_dc == None:
334 if self.data_dc == None:
335 self.dataOutObj.flagNoData = True
335 self.dataOutObj.flagNoData = True
336 return 0
336 return 0
337
337
338
338
339 self.dataOutObj.data_spc = self.data_spc
339 self.dataOutObj.data_spc = self.data_spc
340
340
341 self.dataOutObj.data_cspc = self.data_cspc
341 self.dataOutObj.data_cspc = self.data_cspc
342
342
343 self.dataOutObj.data_dc = self.data_dc
343 self.dataOutObj.data_dc = self.data_dc
344
344
345 self.dataOutObj.flagTimeBlock = self.flagTimeBlock
345 self.dataOutObj.flagTimeBlock = self.flagTimeBlock
346
346
347 self.dataOutObj.flagNoData = False
347 self.dataOutObj.flagNoData = False
348
348
349 self.dataOutObj.dtype = self.dtype
349 self.dataOutObj.dtype = self.dtype
350
350
351 self.dataOutObj.nChannels = self.nRdChannels
351 self.dataOutObj.nChannels = self.nRdChannels
352
352
353 self.dataOutObj.nPairs = self.nRdPairs
353 self.dataOutObj.nPairs = self.nRdPairs
354
354
355 self.dataOutObj.pairsList = self.rdPairList
355 self.dataOutObj.pairsList = self.rdPairList
356
356
357 self.dataOutObj.nHeights = self.processingHeaderObj.nHeights
357 self.dataOutObj.nHeights = self.processingHeaderObj.nHeights
358
358
359 self.dataOutObj.nProfiles = self.processingHeaderObj.profilesPerBlock
359 self.dataOutObj.nProfiles = self.processingHeaderObj.profilesPerBlock
360
360
361 self.dataOutObj.nFFTPoints = self.processingHeaderObj.profilesPerBlock
361 self.dataOutObj.nFFTPoints = self.processingHeaderObj.profilesPerBlock
362
362
363 self.dataOutObj.nIncohInt = self.processingHeaderObj.nIncohInt
363 self.dataOutObj.nIncohInt = self.processingHeaderObj.nIncohInt
364
364
365
365
366 xf = self.processingHeaderObj.firstHeight + self.processingHeaderObj.nHeights*self.processingHeaderObj.deltaHeight
366 xf = self.processingHeaderObj.firstHeight + self.processingHeaderObj.nHeights*self.processingHeaderObj.deltaHeight
367
367
368 self.dataOutObj.heightList = numpy.arange(self.processingHeaderObj.firstHeight, xf, self.processingHeaderObj.deltaHeight)
368 self.dataOutObj.heightList = numpy.arange(self.processingHeaderObj.firstHeight, xf, self.processingHeaderObj.deltaHeight)
369
369
370 self.dataOutObj.channelList = range(self.systemHeaderObj.nChannels)
370 self.dataOutObj.channelList = range(self.systemHeaderObj.nChannels)
371
371
372 self.dataOutObj.channelIndexList = range(self.systemHeaderObj.nChannels)
372 self.dataOutObj.channelIndexList = range(self.systemHeaderObj.nChannels)
373
373
374 self.dataOutObj.utctime = self.basicHeaderObj.utc + self.basicHeaderObj.miliSecond/1000.#+ self.profileIndex * self.ippSeconds
374 self.dataOutObj.utctime = self.basicHeaderObj.utc + self.basicHeaderObj.miliSecond/1000.#+ self.profileIndex * self.ippSeconds
375
375
376 self.dataOutObj.ippSeconds = self.ippSeconds
376 self.dataOutObj.ippSeconds = self.ippSeconds
377
377
378 self.dataOutObj.timeInterval = self.ippSeconds * self.processingHeaderObj.nCohInt * self.processingHeaderObj.nIncohInt * self.dataOutObj.nFFTPoints
378 self.dataOutObj.timeInterval = self.ippSeconds * self.processingHeaderObj.nCohInt * self.processingHeaderObj.nIncohInt * self.dataOutObj.nFFTPoints
379
379
380 self.dataOutObj.flagShiftFFT = self.processingHeaderObj.shif_fft
380 self.dataOutObj.flagShiftFFT = self.processingHeaderObj.shif_fft
381
381
382 # self.profileIndex += 1
382 # self.profileIndex += 1
383
383
384 self.dataOutObj.systemHeaderObj = self.systemHeaderObj.copy()
384 self.dataOutObj.systemHeaderObj = self.systemHeaderObj.copy()
385
385
386 self.dataOutObj.radarControllerHeaderObj = self.radarControllerHeaderObj.copy()
386 self.dataOutObj.radarControllerHeaderObj = self.radarControllerHeaderObj.copy()
387
387
388 return self.dataOutObj.data_spc
388 return self.dataOutObj.data_spc
389
389
390
390
391 class SpectraWriter(JRODataWriter):
391 class SpectraWriter(JRODataWriter):
392
392
393 """
393 """
394 Esta clase permite escribir datos de espectros a archivos procesados (.pdata). La escritura
394 Esta clase permite escribir datos de espectros a archivos procesados (.pdata). La escritura
395 de los datos siempre se realiza por bloques.
395 de los datos siempre se realiza por bloques.
396 """
396 """
397
397
398 ext = ".pdata"
398 ext = ".pdata"
399
399
400 optchar = "P"
400 optchar = "P"
401
401
402 shape_spc_Buffer = None
402 shape_spc_Buffer = None
403
403
404 shape_cspc_Buffer = None
404 shape_cspc_Buffer = None
405
405
406 shape_dc_Buffer = None
406 shape_dc_Buffer = None
407
407
408 data_spc = None
408 data_spc = None
409
409
410 data_cspc = None
410 data_cspc = None
411
411
412 data_dc = None
412 data_dc = None
413
413
414 wrPairList = []
414 wrPairList = []
415
415
416 nWrPairs = 0
416 nWrPairs = 0
417
417
418 nWrChannels = 0
418 nWrChannels = 0
419
419
420 # dataOutObj = None
420 # dataOutObj = None
421
421
422 def __init__(self, dataOutObj=None):
422 def __init__(self, dataOutObj=None):
423 """
423 """
424 Inicializador de la clase SpectraWriter para la escritura de datos de espectros.
424 Inicializador de la clase SpectraWriter para la escritura de datos de espectros.
425
425
426 Affected:
426 Affected:
427 self.dataOutObj
427 self.dataOutObj
428 self.basicHeaderObj
428 self.basicHeaderObj
429 self.systemHeaderObj
429 self.systemHeaderObj
430 self.radarControllerHeaderObj
430 self.radarControllerHeaderObj
431 self.processingHeaderObj
431 self.processingHeaderObj
432
432
433 Return: None
433 Return: None
434 """
434 """
435 if dataOutObj == None:
435 if dataOutObj == None:
436 dataOutObj = Spectra()
436 dataOutObj = Spectra()
437
437
438 if not( isinstance(dataOutObj, Spectra) ):
438 if not( isinstance(dataOutObj, Spectra) ):
439 raise ValueError, "in SpectraReader, dataOutObj must be an Spectra class object"
439 raise ValueError, "in SpectraReader, dataOutObj must be an Spectra class object"
440
440
441 self.dataOutObj = dataOutObj
441 self.dataOutObj = dataOutObj
442
442
443 self.nTotalBlocks = 0
443 self.nTotalBlocks = 0
444
444
445 self.nWrChannels = self.dataOutObj.nChannels
445 self.nWrChannels = self.dataOutObj.nChannels
446
446
447 # if len(pairList) > 0:
447 # if len(pairList) > 0:
448 # self.wrPairList = pairList
448 # self.wrPairList = pairList
449 #
449 #
450 # self.nWrPairs = len(pairList)
450 # self.nWrPairs = len(pairList)
451
451
452 self.wrPairList = self.dataOutObj.pairsList
452 self.wrPairList = self.dataOutObj.pairsList
453
453
454 self.nWrPairs = self.dataOutObj.nPairs
454 self.nWrPairs = self.dataOutObj.nPairs
455
455
456 # self.data_spc = None
456 # self.data_spc = None
457 # self.data_cspc = None
457 # self.data_cspc = None
458 # self.data_dc = None
458 # self.data_dc = None
459
459
460 # self.fp = None
460 # self.fp = None
461
461
462 # self.flagIsNewFile = 1
462 # self.flagIsNewFile = 1
463 #
463 #
464 # self.nTotalBlocks = 0
464 # self.nTotalBlocks = 0
465 #
465 #
466 # self.flagIsNewBlock = 0
466 # self.flagIsNewBlock = 0
467 #
467 #
468 # self.flagNoMoreFiles = 0
468 # self.flagNoMoreFiles = 0
469 #
469 #
470 # self.setFile = None
470 # self.setFile = None
471 #
471 #
472 # self.dtype = None
472 # self.dtype = None
473 #
473 #
474 # self.path = None
474 # self.path = None
475 #
475 #
476 # self.noMoreFiles = 0
476 # self.noMoreFiles = 0
477 #
477 #
478 # self.filename = None
478 # self.filename = None
479 #
479 #
480 # self.basicHeaderObj = BasicHeader()
480 # self.basicHeaderObj = BasicHeader()
481 #
481 #
482 # self.systemHeaderObj = SystemHeader()
482 # self.systemHeaderObj = SystemHeader()
483 #
483 #
484 # self.radarControllerHeaderObj = RadarControllerHeader()
484 # self.radarControllerHeaderObj = RadarControllerHeader()
485 #
485 #
486 # self.processingHeaderObj = ProcessingHeader()
486 # self.processingHeaderObj = ProcessingHeader()
487
487
488
488
489 def hasAllDataInBuffer(self):
489 def hasAllDataInBuffer(self):
490 return 1
490 return 1
491
491
492
492
493 def setBlockDimension(self):
493 def setBlockDimension(self):
494 """
494 """
495 Obtiene las formas dimensionales del los subbloques de datos que componen un bloque
495 Obtiene las formas dimensionales del los subbloques de datos que componen un bloque
496
496
497 Affected:
497 Affected:
498 self.shape_spc_Buffer
498 self.shape_spc_Buffer
499 self.shape_cspc_Buffer
499 self.shape_cspc_Buffer
500 self.shape_dc_Buffer
500 self.shape_dc_Buffer
501
501
502 Return: None
502 Return: None
503 """
503 """
504 self.shape_spc_Buffer = (self.dataOutObj.nChannels,
504 self.shape_spc_Buffer = (self.dataOutObj.nChannels,
505 self.processingHeaderObj.nHeights,
505 self.processingHeaderObj.nHeights,
506 self.processingHeaderObj.profilesPerBlock)
506 self.processingHeaderObj.profilesPerBlock)
507
507
508 self.shape_cspc_Buffer = (self.dataOutObj.nPairs,
508 self.shape_cspc_Buffer = (self.dataOutObj.nPairs,
509 self.processingHeaderObj.nHeights,
509 self.processingHeaderObj.nHeights,
510 self.processingHeaderObj.profilesPerBlock)
510 self.processingHeaderObj.profilesPerBlock)
511
511
512 self.shape_dc_Buffer = (self.dataOutObj.nChannels,
512 self.shape_dc_Buffer = (self.dataOutObj.nChannels,
513 self.processingHeaderObj.nHeights)
513 self.processingHeaderObj.nHeights)
514
514
515
515
516 def writeBlock(self):
516 def writeBlock(self):
517 """
517 """
518 Escribe el buffer en el file designado
518 Escribe el buffer en el file designado
519
519
520 Affected:
520 Affected:
521 self.data_spc
521 self.data_spc
522 self.data_cspc
522 self.data_cspc
523 self.data_dc
523 self.data_dc
524 self.flagIsNewFile
524 self.flagIsNewFile
525 self.flagIsNewBlock
525 self.flagIsNewBlock
526 self.nTotalBlocks
526 self.nTotalBlocks
527 self.nWriteBlocks
527 self.nWriteBlocks
528
528
529 Return: None
529 Return: None
530 """
530 """
531
531
532 spc = numpy.transpose( self.data_spc, (0,2,1) )
532 spc = numpy.transpose( self.data_spc, (0,2,1) )
533 if not( self.processingHeaderObj.shif_fft ):
533 if not( self.processingHeaderObj.shif_fft ):
534 spc = numpy.roll( spc, self.processingHeaderObj.profilesPerBlock/2, axis=2 ) #desplaza a la derecha en el eje 2 determinadas posiciones
534 spc = numpy.roll( spc, self.processingHeaderObj.profilesPerBlock/2, axis=2 ) #desplaza a la derecha en el eje 2 determinadas posiciones
535 data = spc.reshape((-1))
535 data = spc.reshape((-1))
536 data.tofile(self.fp)
536 data.tofile(self.fp)
537
537
538 if self.data_cspc != None:
538 if self.data_cspc != None:
539 data = numpy.zeros( self.shape_cspc_Buffer, self.dtype )
539 data = numpy.zeros( self.shape_cspc_Buffer, self.dtype )
540 cspc = numpy.transpose( self.data_cspc, (0,2,1) )
540 cspc = numpy.transpose( self.data_cspc, (0,2,1) )
541 if not( self.processingHeaderObj.shif_fft ):
541 if not( self.processingHeaderObj.shif_fft ):
542 cspc = numpy.roll( cspc, self.processingHeaderObj.profilesPerBlock/2, axis=2 ) #desplaza a la derecha en el eje 2 determinadas posiciones
542 cspc = numpy.roll( cspc, self.processingHeaderObj.profilesPerBlock/2, axis=2 ) #desplaza a la derecha en el eje 2 determinadas posiciones
543 data['real'] = cspc.real
543 data['real'] = cspc.real
544 data['imag'] = cspc.imag
544 data['imag'] = cspc.imag
545 data = data.reshape((-1))
545 data = data.reshape((-1))
546 data.tofile(self.fp)
546 data.tofile(self.fp)
547
547
548 if self.data_dc != None:
548 if self.data_dc != None:
549 data = numpy.zeros( self.shape_dc_Buffer, self.dtype )
549 data = numpy.zeros( self.shape_dc_Buffer, self.dtype )
550 dc = self.data_dc
550 dc = self.data_dc
551 data['real'] = dc.real
551 data['real'] = dc.real
552 data['imag'] = dc.imag
552 data['imag'] = dc.imag
553 data = data.reshape((-1))
553 data = data.reshape((-1))
554 data.tofile(self.fp)
554 data.tofile(self.fp)
555
555
556 self.data_spc.fill(0)
556 self.data_spc.fill(0)
557 self.data_dc.fill(0)
557 self.data_dc.fill(0)
558 if self.data_cspc != None:
558 if self.data_cspc != None:
559 self.data_cspc.fill(0)
559 self.data_cspc.fill(0)
560
560
561 self.flagIsNewFile = 0
561 self.flagIsNewFile = 0
562 self.flagIsNewBlock = 1
562 self.flagIsNewBlock = 1
563 self.nTotalBlocks += 1
563 self.nTotalBlocks += 1
564 self.nWriteBlocks += 1
564 self.nWriteBlocks += 1
565 self.blockIndex += 1
565 self.blockIndex += 1
566
566
567
567
568 def putData(self):
568 def putData(self):
569 """
569 """
570 Setea un bloque de datos y luego los escribe en un file
570 Setea un bloque de datos y luego los escribe en un file
571
571
572 Affected:
572 Affected:
573 self.data_spc
573 self.data_spc
574 self.data_cspc
574 self.data_cspc
575 self.data_dc
575 self.data_dc
576
576
577 Return:
577 Return:
578 0 : Si no hay data o no hay mas files que puedan escribirse
578 0 : Si no hay data o no hay mas files que puedan escribirse
579 1 : Si se escribio la data de un bloque en un file
579 1 : Si se escribio la data de un bloque en un file
580 """
580 """
581 self.flagIsNewBlock = 0
581 self.flagIsNewBlock = 0
582
582
583 if self.dataOutObj.flagNoData:
583 if self.dataOutObj.flagNoData:
584 return 0
584 return 0
585
585
586 if self.dataOutObj.flagTimeBlock:
586 if self.dataOutObj.flagTimeBlock:
587 self.data_spc.fill(0)
587 self.data_spc.fill(0)
588 self.data_cspc.fill(0)
588 self.data_cspc.fill(0)
589 self.data_dc.fill(0)
589 self.data_dc.fill(0)
590 self.setNextFile()
590 self.setNextFile()
591
591
592 if self.flagIsNewFile == 0:
592 if self.flagIsNewFile == 0:
593 self.getBasicHeader()
593 self.getBasicHeader()
594
594
595 self.data_spc = self.dataOutObj.data_spc
595 self.data_spc = self.dataOutObj.data_spc
596 self.data_cspc = self.dataOutObj.data_cspc
596 self.data_cspc = self.dataOutObj.data_cspc
597 self.data_dc = self.dataOutObj.data_dc
597 self.data_dc = self.dataOutObj.data_dc
598
598
599 # #self.processingHeaderObj.dataBlocksPerFile)
599 # #self.processingHeaderObj.dataBlocksPerFile)
600 if self.hasAllDataInBuffer():
600 if self.hasAllDataInBuffer():
601 # self.getDataHeader()
601 # self.getDataHeader()
602 self.writeNextBlock()
602 self.writeNextBlock()
603
603
604 if self.flagNoMoreFiles:
604 if self.flagNoMoreFiles:
605 #print 'Process finished'
605 #print 'Process finished'
606 return 0
606 return 0
607 return 1
607 return 1
608
608
609
609
610 def __getProcessFlags(self):
610 def __getProcessFlags(self):
611
611
612 processFlags = 0
612 processFlags = 0
613
613
614 dtype0 = numpy.dtype([('real','<i1'),('imag','<i1')])
614 dtype0 = numpy.dtype([('real','<i1'),('imag','<i1')])
615 dtype1 = numpy.dtype([('real','<i2'),('imag','<i2')])
615 dtype1 = numpy.dtype([('real','<i2'),('imag','<i2')])
616 dtype2 = numpy.dtype([('real','<i4'),('imag','<i4')])
616 dtype2 = numpy.dtype([('real','<i4'),('imag','<i4')])
617 dtype3 = numpy.dtype([('real','<i8'),('imag','<i8')])
617 dtype3 = numpy.dtype([('real','<i8'),('imag','<i8')])
618 dtype4 = numpy.dtype([('real','<f4'),('imag','<f4')])
618 dtype4 = numpy.dtype([('real','<f4'),('imag','<f4')])
619 dtype5 = numpy.dtype([('real','<f8'),('imag','<f8')])
619 dtype5 = numpy.dtype([('real','<f8'),('imag','<f8')])
620
620
621 dtypeList = [dtype0, dtype1, dtype2, dtype3, dtype4, dtype5]
621 dtypeList = [dtype0, dtype1, dtype2, dtype3, dtype4, dtype5]
622
622
623
623
624
624
625 datatypeValueList = [PROCFLAG.DATATYPE_CHAR,
625 datatypeValueList = [PROCFLAG.DATATYPE_CHAR,
626 PROCFLAG.DATATYPE_SHORT,
626 PROCFLAG.DATATYPE_SHORT,
627 PROCFLAG.DATATYPE_LONG,
627 PROCFLAG.DATATYPE_LONG,
628 PROCFLAG.DATATYPE_INT64,
628 PROCFLAG.DATATYPE_INT64,
629 PROCFLAG.DATATYPE_FLOAT,
629 PROCFLAG.DATATYPE_FLOAT,
630 PROCFLAG.DATATYPE_DOUBLE]
630 PROCFLAG.DATATYPE_DOUBLE]
631
631
632
632
633 for index in range(len(dtypeList)):
633 for index in range(len(dtypeList)):
634 if self.dataOutObj.dtype == dtypeList[index]:
634 if self.dataOutObj.dtype == dtypeList[index]:
635 dtypeValue = datatypeValueList[index]
635 dtypeValue = datatypeValueList[index]
636 break
636 break
637
637
638 processFlags += dtypeValue
638 processFlags += dtypeValue
639
639
640 if self.dataOutObj.flagDecodeData:
640 if self.dataOutObj.flagDecodeData:
641 processFlags += PROCFLAG.DECODE_DATA
641 processFlags += PROCFLAG.DECODE_DATA
642
642
643 if self.dataOutObj.flagDeflipData:
643 if self.dataOutObj.flagDeflipData:
644 processFlags += PROCFLAG.DEFLIP_DATA
644 processFlags += PROCFLAG.DEFLIP_DATA
645
645
646 if self.dataOutObj.code != None:
646 if self.dataOutObj.code != None:
647 processFlags += PROCFLAG.DEFINE_PROCESS_CODE
647 processFlags += PROCFLAG.DEFINE_PROCESS_CODE
648
648
649 if self.dataOutObj.nIncohInt > 1:
649 if self.dataOutObj.nIncohInt > 1:
650 processFlags += PROCFLAG.INCOHERENT_INTEGRATION
650 processFlags += PROCFLAG.INCOHERENT_INTEGRATION
651
651
652 if self.dataOutObj.data_dc != None:
652 if self.dataOutObj.data_dc != None:
653 processFlags += PROCFLAG.SAVE_CHANNELS_DC
653 processFlags += PROCFLAG.SAVE_CHANNELS_DC
654
654
655 return processFlags
655 return processFlags
656
656
657
657
658 def __getBlockSize(self):
658 def __getBlockSize(self):
659 '''
659 '''
660 Este metodos determina el cantidad de bytes para un bloque de datos de tipo Spectra
660 Este metodos determina el cantidad de bytes para un bloque de datos de tipo Spectra
661 '''
661 '''
662
662
663 dtype0 = numpy.dtype([('real','<i1'),('imag','<i1')])
663 dtype0 = numpy.dtype([('real','<i1'),('imag','<i1')])
664 dtype1 = numpy.dtype([('real','<i2'),('imag','<i2')])
664 dtype1 = numpy.dtype([('real','<i2'),('imag','<i2')])
665 dtype2 = numpy.dtype([('real','<i4'),('imag','<i4')])
665 dtype2 = numpy.dtype([('real','<i4'),('imag','<i4')])
666 dtype3 = numpy.dtype([('real','<i8'),('imag','<i8')])
666 dtype3 = numpy.dtype([('real','<i8'),('imag','<i8')])
667 dtype4 = numpy.dtype([('real','<f4'),('imag','<f4')])
667 dtype4 = numpy.dtype([('real','<f4'),('imag','<f4')])
668 dtype5 = numpy.dtype([('real','<f8'),('imag','<f8')])
668 dtype5 = numpy.dtype([('real','<f8'),('imag','<f8')])
669
669
670 dtypeList = [dtype0, dtype1, dtype2, dtype3, dtype4, dtype5]
670 dtypeList = [dtype0, dtype1, dtype2, dtype3, dtype4, dtype5]
671 datatypeValueList = [1,2,4,8,4,8]
671 datatypeValueList = [1,2,4,8,4,8]
672 for index in range(len(dtypeList)):
672 for index in range(len(dtypeList)):
673 if self.dataOutObj.dtype == dtypeList[index]:
673 if self.dataOutObj.dtype == dtypeList[index]:
674 datatypeValue = datatypeValueList[index]
674 datatypeValue = datatypeValueList[index]
675 break
675 break
676
676
677
677
678 pts2write = self.dataOutObj.nHeights * self.dataOutObj.nFFTPoints
678 pts2write = self.dataOutObj.nHeights * self.dataOutObj.nFFTPoints
679
679
680 pts2write_SelfSpectra = int(self.nWrChannels * pts2write)
680 pts2write_SelfSpectra = int(self.nWrChannels * pts2write)
681 blocksize = (pts2write_SelfSpectra*datatypeValue)
681 blocksize = (pts2write_SelfSpectra*datatypeValue)
682
682
683 if self.dataOutObj.data_cspc != None:
683 if self.dataOutObj.data_cspc != None:
684 pts2write_CrossSpectra = int(self.nWrPairs * pts2write)
684 pts2write_CrossSpectra = int(self.nWrPairs * pts2write)
685 blocksize += (pts2write_CrossSpectra*datatypeValue*2)
685 blocksize += (pts2write_CrossSpectra*datatypeValue*2)
686
686
687 if self.dataOutObj.data_dc != None:
687 if self.dataOutObj.data_dc != None:
688 pts2write_DCchannels = int(self.nWrChannels * self.dataOutObj.nHeights)
688 pts2write_DCchannels = int(self.nWrChannels * self.dataOutObj.nHeights)
689 blocksize += (pts2write_DCchannels*datatypeValue*2)
689 blocksize += (pts2write_DCchannels*datatypeValue*2)
690
690
691 blocksize = blocksize #* datatypeValue * 2 #CORREGIR ESTO
691 blocksize = blocksize #* datatypeValue * 2 #CORREGIR ESTO
692
692
693 return blocksize
693 return blocksize
694
694
695
695
696 def getBasicHeader(self):
696 def getBasicHeader(self):
697 self.basicHeaderObj.size = self.basicHeaderSize #bytes
697 self.basicHeaderObj.size = self.basicHeaderSize #bytes
698 self.basicHeaderObj.version = self.versionFile
698 self.basicHeaderObj.version = self.versionFile
699 self.basicHeaderObj.dataBlock = self.nTotalBlocks
699 self.basicHeaderObj.dataBlock = self.nTotalBlocks
700
700
701 utc = numpy.floor(self.dataOutObj.utctime)
701 utc = numpy.floor(self.dataOutObj.utctime)
702 milisecond = (self.dataOutObj.utctime - utc)* 1000.0
702 milisecond = (self.dataOutObj.utctime - utc)* 1000.0
703
703
704 self.basicHeaderObj.utc = utc
704 self.basicHeaderObj.utc = utc
705 self.basicHeaderObj.miliSecond = milisecond
705 self.basicHeaderObj.miliSecond = milisecond
706 self.basicHeaderObj.timeZone = 0
706 self.basicHeaderObj.timeZone = 0
707 self.basicHeaderObj.dstFlag = 0
707 self.basicHeaderObj.dstFlag = 0
708 self.basicHeaderObj.errorCount = 0
708 self.basicHeaderObj.errorCount = 0
709
709
710 def getDataHeader(self):
710 def getDataHeader(self):
711
711
712 """
712 """
713 Obtiene una copia del First Header
713 Obtiene una copia del First Header
714
714
715 Affected:
715 Affected:
716 self.systemHeaderObj
716 self.systemHeaderObj
717 self.radarControllerHeaderObj
717 self.radarControllerHeaderObj
718 self.dtype
718 self.dtype
719
719
720 Return:
720 Return:
721 None
721 None
722 """
722 """
723
723
724 self.systemHeaderObj = self.dataOutObj.systemHeaderObj.copy()
724 self.systemHeaderObj = self.dataOutObj.systemHeaderObj.copy()
725 self.systemHeaderObj.nChannels = self.dataOutObj.nChannels
725 self.systemHeaderObj.nChannels = self.dataOutObj.nChannels
726 self.radarControllerHeaderObj = self.dataOutObj.radarControllerHeaderObj.copy()
726 self.radarControllerHeaderObj = self.dataOutObj.radarControllerHeaderObj.copy()
727
727
728 self.getBasicHeader()
728 self.getBasicHeader()
729
729
730 processingHeaderSize = 40 # bytes
730 processingHeaderSize = 40 # bytes
731 self.processingHeaderObj.dtype = 0 # Voltage
731 self.processingHeaderObj.dtype = 0 # Voltage
732 self.processingHeaderObj.blockSize = self.__getBlockSize()
732 self.processingHeaderObj.blockSize = self.__getBlockSize()
733 self.processingHeaderObj.profilesPerBlock = self.dataOutObj.nFFTPoints
733 self.processingHeaderObj.profilesPerBlock = self.dataOutObj.nFFTPoints
734 self.processingHeaderObj.dataBlocksPerFile = self.blocksPerFile
734 self.processingHeaderObj.dataBlocksPerFile = self.blocksPerFile
735 self.processingHeaderObj.nWindows = 1 #podria ser 1 o self.dataOutObj.processingHeaderObj.nWindows
735 self.processingHeaderObj.nWindows = 1 #podria ser 1 o self.dataOutObj.processingHeaderObj.nWindows
736 self.processingHeaderObj.processFlags = self.__getProcessFlags()
736 self.processingHeaderObj.processFlags = self.__getProcessFlags()
737 self.processingHeaderObj.nCohInt = self.dataOutObj.nCohInt# Se requiere para determinar el valor de timeInterval
737 self.processingHeaderObj.nCohInt = self.dataOutObj.nCohInt# Se requiere para determinar el valor de timeInterval
738 self.processingHeaderObj.nIncohInt = self.dataOutObj.nIncohInt
738 self.processingHeaderObj.nIncohInt = self.dataOutObj.nIncohInt
739 self.processingHeaderObj.totalSpectra = self.dataOutObj.nPairs + self.dataOutObj.nChannels
739 self.processingHeaderObj.totalSpectra = self.dataOutObj.nPairs + self.dataOutObj.nChannels
740
740
741 if self.processingHeaderObj.totalSpectra > 0:
741 if self.processingHeaderObj.totalSpectra > 0:
742 channelList = []
742 channelList = []
743 for channel in range(self.dataOutObj.nChannels):
743 for channel in range(self.dataOutObj.nChannels):
744 channelList.append(channel)
744 channelList.append(channel)
745 channelList.append(channel)
745 channelList.append(channel)
746
746
747 pairsList = []
747 pairsList = []
748 for pair in self.dataOutObj.pairsList:
748 for pair in self.dataOutObj.pairsList:
749 pairsList.append(pair[0])
749 pairsList.append(pair[0])
750 pairsList.append(pair[1])
750 pairsList.append(pair[1])
751 spectraComb = channelList + pairsList
751 spectraComb = channelList + pairsList
752 spectraComb = numpy.array(spectraComb,dtype="u1")
752 spectraComb = numpy.array(spectraComb,dtype="u1")
753 self.processingHeaderObj.spectraComb = spectraComb
753 self.processingHeaderObj.spectraComb = spectraComb
754 sizeOfSpcComb = len(spectraComb)
754 sizeOfSpcComb = len(spectraComb)
755 processingHeaderSize += sizeOfSpcComb
755 processingHeaderSize += sizeOfSpcComb
756
756
757 if self.dataOutObj.code != None:
757 if self.dataOutObj.code != None:
758 self.processingHeaderObj.code = self.dataOutObj.code
758 self.processingHeaderObj.code = self.dataOutObj.code
759 self.processingHeaderObj.nCode = self.dataOutObj.nCode
759 self.processingHeaderObj.nCode = self.dataOutObj.nCode
760 self.processingHeaderObj.nBaud = self.dataOutObj.nBaud
760 self.processingHeaderObj.nBaud = self.dataOutObj.nBaud
761 nCodeSize = 4 # bytes
761 nCodeSize = 4 # bytes
762 nBaudSize = 4 # bytes
762 nBaudSize = 4 # bytes
763 codeSize = 4 # bytes
763 codeSize = 4 # bytes
764 sizeOfCode = int(nCodeSize + nBaudSize + codeSize * self.dataOutObj.nCode * self.dataOutObj.nBaud)
764 sizeOfCode = int(nCodeSize + nBaudSize + codeSize * self.dataOutObj.nCode * self.dataOutObj.nBaud)
765 processingHeaderSize += sizeOfCode
765 processingHeaderSize += sizeOfCode
766
766
767 if self.processingHeaderObj.nWindows != 0:
767 if self.processingHeaderObj.nWindows != 0:
768 self.processingHeaderObj.firstHeight = self.dataOutObj.heightList[0]
768 self.processingHeaderObj.firstHeight = self.dataOutObj.heightList[0]
769 self.processingHeaderObj.deltaHeight = self.dataOutObj.heightList[1] - self.dataOutObj.heightList[0]
769 self.processingHeaderObj.deltaHeight = self.dataOutObj.heightList[1] - self.dataOutObj.heightList[0]
770 self.processingHeaderObj.nHeights = self.dataOutObj.nHeights
770 self.processingHeaderObj.nHeights = self.dataOutObj.nHeights
771 self.processingHeaderObj.samplesWin = self.dataOutObj.nHeights
771 self.processingHeaderObj.samplesWin = self.dataOutObj.nHeights
772 sizeOfFirstHeight = 4
772 sizeOfFirstHeight = 4
773 sizeOfdeltaHeight = 4
773 sizeOfdeltaHeight = 4
774 sizeOfnHeights = 4
774 sizeOfnHeights = 4
775 sizeOfWindows = (sizeOfFirstHeight + sizeOfdeltaHeight + sizeOfnHeights)*self.processingHeaderObj.nWindows
775 sizeOfWindows = (sizeOfFirstHeight + sizeOfdeltaHeight + sizeOfnHeights)*self.processingHeaderObj.nWindows
776 processingHeaderSize += sizeOfWindows
776 processingHeaderSize += sizeOfWindows
777
777
778 self.processingHeaderObj.size = processingHeaderSize
778 self.processingHeaderObj.size = processingHeaderSize
779
779
780
780
781
781
782 class FITS:
782 class FITS:
783 name=None
783 name=None
784 format=None
784 format=None
785 array =None
785 array =None
786 data =None
786 data =None
787 thdulist=None
787 thdulist=None
788 prihdr=None
788 prihdr=None
789 hdu=None
789 hdu=None
790
790
791 def __init__(self):
791 def __init__(self):
792
792
793 pass
793 pass
794
794
795 def setColF(self,name,format,array):
795 def setColF(self,name,format,array):
796 self.name=name
796 self.name=name
797 self.format=format
797 self.format=format
798 self.array=array
798 self.array=array
799 a1=numpy.array([self.array],dtype=numpy.float32)
799 a1=numpy.array([self.array],dtype=numpy.float32)
800 self.col1 = pyfits.Column(name=self.name, format=self.format, array=a1)
800 self.col1 = pyfits.Column(name=self.name, format=self.format, array=a1)
801 return self.col1
801 return self.col1
802
802
803 # def setColP(self,name,format,data):
803 # def setColP(self,name,format,data):
804 # self.name=name
804 # self.name=name
805 # self.format=format
805 # self.format=format
806 # self.data=data
806 # self.data=data
807 # a2=numpy.array([self.data],dtype=numpy.float32)
807 # a2=numpy.array([self.data],dtype=numpy.float32)
808 # self.col2 = pyfits.Column(name=self.name, format=self.format, array=a2)
808 # self.col2 = pyfits.Column(name=self.name, format=self.format, array=a2)
809 # return self.col2
809 # return self.col2
810
810
811
811
812 def writeData(self,name,format,data):
812 def writeData(self,name,format,data):
813 self.name=name
813 self.name=name
814 self.format=format
814 self.format=format
815 self.data=data
815 self.data=data
816 a2=numpy.array([self.data],dtype=numpy.float32)
816 a2=numpy.array([self.data],dtype=numpy.float32)
817 self.col2 = pyfits.Column(name=self.name, format=self.format, array=a2)
817 self.col2 = pyfits.Column(name=self.name, format=self.format, array=a2)
818 return self.col2
818 return self.col2
819
819
820 def cFImage(self,idblock,year,month,day,hour,minute,second):
820 def cFImage(self,idblock,year,month,day,hour,minute,second):
821 self.hdu= pyfits.PrimaryHDU(idblock)
821 self.hdu= pyfits.PrimaryHDU(idblock)
822 self.hdu.header.set("Year",year)
822 self.hdu.header.set("Year",year)
823 self.hdu.header.set("Month",month)
823 self.hdu.header.set("Month",month)
824 self.hdu.header.set("Day",day)
824 self.hdu.header.set("Day",day)
825 self.hdu.header.set("Hour",hour)
825 self.hdu.header.set("Hour",hour)
826 self.hdu.header.set("Minute",minute)
826 self.hdu.header.set("Minute",minute)
827 self.hdu.header.set("Second",second)
827 self.hdu.header.set("Second",second)
828 return self.hdu
828 return self.hdu
829
829
830
830
831 def Ctable(self,colList):
831 def Ctable(self,colList):
832 self.cols=pyfits.ColDefs(colList)
832 self.cols=pyfits.ColDefs(colList)
833 self.tbhdu = pyfits.new_table(self.cols)
833 self.tbhdu = pyfits.new_table(self.cols)
834 return self.tbhdu
834 return self.tbhdu
835
835
836
836
837 def CFile(self,hdu,tbhdu):
837 def CFile(self,hdu,tbhdu):
838 self.thdulist=pyfits.HDUList([hdu,tbhdu])
838 self.thdulist=pyfits.HDUList([hdu,tbhdu])
839
839
840 def wFile(self,filename):
840 def wFile(self,filename):
841 self.thdulist.writeto(filename)
841 self.thdulist.writeto(filename)
842
842
843 class SpectraHeisWriter(JRODataWriter):
843 class SpectraHeisWriter(JRODataWriter):
844 set = None
844 set = None
845 setFile = None
845 setFile = None
846 idblock = None
846 idblock = None
847 doypath = None
847 doypath = None
848 subfolder = None
848 subfolder = None
849
849
850 def __init__(self, dataOutObj):
850 def __init__(self, dataOutObj):
851 self.wrObj = FITS()
851 self.wrObj = FITS()
852 self.dataOutObj = dataOutObj
852 self.dataOutObj = dataOutObj
853 self.nTotalBlocks=0
853 self.nTotalBlocks=0
854 self.set = None
854 self.set = None
855 self.setFile = 0
855 self.setFile = 0
856 self.idblock = 0
856 self.idblock = 0
857 self.wrpath = None
857 self.wrpath = None
858 self.doypath = None
858 self.doypath = None
859 self.subfolder = None
859 self.subfolder = None
860
860
861
861
862 def isNumber(str):
862 def isNumber(str):
863 """
863 """
864 Chequea si el conjunto de caracteres que componen un string puede ser convertidos a un numero.
864 Chequea si el conjunto de caracteres que componen un string puede ser convertidos a un numero.
865
865
866 Excepciones:
866 Excepciones:
867 Si un determinado string no puede ser convertido a numero
867 Si un determinado string no puede ser convertido a numero
868 Input:
868 Input:
869 str, string al cual se le analiza para determinar si convertible a un numero o no
869 str, string al cual se le analiza para determinar si convertible a un numero o no
870
870
871 Return:
871 Return:
872 True : si el string es uno numerico
872 True : si el string es uno numerico
873 False : no es un string numerico
873 False : no es un string numerico
874 """
874 """
875 try:
875 try:
876 float( str )
876 float( str )
877 return True
877 return True
878 except:
878 except:
879 return False
879 return False
880
880
881 def setup(self, wrpath):
881 def setup(self, wrpath):
882
882
883 if not(os.path.exists(wrpath)):
883 if not(os.path.exists(wrpath)):
884 os.mkdir(wrpath)
884 os.mkdir(wrpath)
885
885
886 self.wrpath = wrpath
886 self.wrpath = wrpath
887 self.setFile = 0
887 self.setFile = 0
888
888
889 def putData(self):
889 def putData(self):
890 name= time.localtime( self.dataOutObj.utctime)
890 name= time.localtime( self.dataOutObj.utctime)
891 ext=".fits"
891 ext=".fits"
892
892
893 if self.doypath == None:
893 if self.doypath == None:
894 self.subfolder = 'F%4.4d%3.3d_%d' % (name.tm_year,name.tm_yday,time.mktime(datetime.datetime.now().timetuple()))
894 self.subfolder = 'F%4.4d%3.3d_%d' % (name.tm_year,name.tm_yday,time.mktime(datetime.datetime.now().timetuple()))
895 self.doypath = os.path.join( self.wrpath, self.subfolder )
895 self.doypath = os.path.join( self.wrpath, self.subfolder )
896 os.mkdir(self.doypath)
896 os.mkdir(self.doypath)
897
897
898 if self.set == None:
898 if self.set == None:
899 self.set = self.dataOutObj.set
899 self.set = self.dataOutObj.set
900 self.setFile = 0
900 self.setFile = 0
901 if self.set != self.dataOutObj.set:
901 if self.set != self.dataOutObj.set:
902 self.set = self.dataOutObj.set
902 self.set = self.dataOutObj.set
903 self.setFile = 0
903 self.setFile = 0
904
904
905 #make the filename
905 #make the filename
906 file = 'D%4.4d%3.3d%3.3d_%3.3d%s' % (name.tm_year,name.tm_yday,self.set,self.setFile,ext)
906 file = 'D%4.4d%3.3d%3.3d_%3.3d%s' % (name.tm_year,name.tm_yday,self.set,self.setFile,ext)
907
907
908 filename = os.path.join(self.wrpath,self.subfolder, file)
908 filename = os.path.join(self.wrpath,self.subfolder, file)
909
909
910 idblock = numpy.array([self.idblock],dtype="int64")
910 idblock = numpy.array([self.idblock],dtype="int64")
911 header=self.wrObj.cFImage(idblock=idblock,
911 header=self.wrObj.cFImage(idblock=idblock,
912 year=time.gmtime(self.dataOutObj.utctime).tm_year,
912 year=time.gmtime(self.dataOutObj.utctime).tm_year,
913 month=time.gmtime(self.dataOutObj.utctime).tm_mon,
913 month=time.gmtime(self.dataOutObj.utctime).tm_mon,
914 day=time.gmtime(self.dataOutObj.utctime).tm_mday,
914 day=time.gmtime(self.dataOutObj.utctime).tm_mday,
915 hour=time.gmtime(self.dataOutObj.utctime).tm_hour,
915 hour=time.gmtime(self.dataOutObj.utctime).tm_hour,
916 minute=time.gmtime(self.dataOutObj.utctime).tm_min,
916 minute=time.gmtime(self.dataOutObj.utctime).tm_min,
917 second=time.gmtime(self.dataOutObj.utctime).tm_sec)
917 second=time.gmtime(self.dataOutObj.utctime).tm_sec)
918
918
919 c=3E8
919 c=3E8
920 freq=numpy.arange(-1*self.dataOutObj.nHeights/2.,self.dataOutObj.nHeights/2.)*(c/(2*self.dataOutObj.deltaHeight*1000))
920 freq=numpy.arange(-1*self.dataOutObj.nHeights/2.,self.dataOutObj.nHeights/2.)*(c/(2*self.dataOutObj.deltaHeight*1000))
921
921
922 colList = []
922 colList = []
923
923
924 colFreq=self.wrObj.setColF(name="freq", format=str(self.dataOutObj.nFFTPoints)+'E', array=freq)
924 colFreq=self.wrObj.setColF(name="freq", format=str(self.dataOutObj.nFFTPoints)+'E', array=freq)
925
925
926 colList.append(colFreq)
926 colList.append(colFreq)
927
927
928 nchannel=self.dataOutObj.nChannels
928 nchannel=self.dataOutObj.nChannels
929
929
930 for i in range(nchannel):
930 for i in range(nchannel):
931 col = self.wrObj.writeData(name="PCh"+str(i+1),
931 col = self.wrObj.writeData(name="PCh"+str(i+1),
932 format=str(self.dataOutObj.nFFTPoints)+'E',
932 format=str(self.dataOutObj.nFFTPoints)+'E',
933 data=10*numpy.log10(self.dataOutObj.data_spc[i,:]))
933 data=10*numpy.log10(self.dataOutObj.data_spc[i,:]))
934
934
935 colList.append(col)
935 colList.append(col)
936
936
937 data=self.wrObj.Ctable(colList=colList)
937 data=self.wrObj.Ctable(colList=colList)
938
938
939 self.wrObj.CFile(header,data)
939 self.wrObj.CFile(header,data)
940
940
941 self.wrObj.wFile(filename)
941 self.wrObj.wFile(filename)
942
942
943 #update the setFile
943 #update the setFile
944 self.setFile += 1
944 self.setFile += 1
945 self.idblock += 1
945 self.idblock += 1
946
946
947 return 1
947 return 1
948
948
949 No newline at end of file
949
General Comments 0
You need to be logged in to leave comments. Login now