##// END OF EJS Templates
Actualización del import de JROData
Miguel Valdez -
r144:0dc32e521372
parent child
Show More
@@ -1,757 +1,763
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
79
80
80
81
81
82 class JRODataIO:
82 class JRODataIO:
83
83
84 c = 3E8
84 c = 3E8
85
85
86 basicHeaderObj = BasicHeader()
86 basicHeaderObj = BasicHeader()
87
87
88 systemHeaderObj = SystemHeader()
88 systemHeaderObj = SystemHeader()
89
89
90 radarControllerHeaderObj = RadarControllerHeader()
90 radarControllerHeaderObj = RadarControllerHeader()
91
91
92 processingHeaderObj = ProcessingHeader()
92 processingHeaderObj = ProcessingHeader()
93
93
94 online = 0
94 online = 0
95
95
96 dtype = None
96 dtype = None
97
97
98 pathList = []
98 pathList = []
99
99
100 filenameList = []
100 filenameList = []
101
101
102 filename = None
102 filename = None
103
103
104 ext = None
104 ext = None
105
105
106 flagNoMoreFiles = 0
106 flagNoMoreFiles = 0
107
107
108 flagIsNewFile = 1
108 flagIsNewFile = 1
109
109
110 flagTimeBlock = 0
110 flagTimeBlock = 0
111
111
112 flagIsNewBlock = 0
112 flagIsNewBlock = 0
113
113
114 fp = None
114 fp = None
115
115
116 firstHeaderSize = 0
116 firstHeaderSize = 0
117
117
118 basicHeaderSize = 24
118 basicHeaderSize = 24
119
119
120 versionFile = 1103
120 versionFile = 1103
121
121
122 fileSize = None
122 fileSize = None
123
123
124 ippSeconds = None
124 ippSeconds = None
125
125
126 fileSizeByHeader = None
126 fileSizeByHeader = None
127
127
128 fileIndex = None
128 fileIndex = None
129
129
130 profileIndex = None
130 profileIndex = None
131
131
132 blockIndex = None
132 blockIndex = None
133
133
134 nTotalBlocks = None
134 nTotalBlocks = None
135
135
136 maxTimeStep = 30
136 maxTimeStep = 30
137
137
138 lastUTTime = None
138 lastUTTime = None
139
139
140 datablock = None
140 datablock = None
141
141
142 dataOutObj = None
142 dataOutObj = None
143
143
144 blocksize = None
144 blocksize = None
145
145
146 def __init__(self):
146 def __init__(self):
147 pass
147 pass
148
148
149 class JRODataReader(JRODataIO):
149 class JRODataReader(JRODataIO):
150
150
151 nReadBlocks = 0
151 nReadBlocks = 0
152
152
153 def __init__(self):
153 def __init__(self):
154
154
155 pass
155 pass
156
156
157 def createObjByDefault(self):
157 def createObjByDefault(self):
158 """
158 """
159
159
160 """
160 """
161 raise ValueError, "This method has not been implemented"
161 raise ValueError, "This method has not been implemented"
162
162
163 def getBlockDimension(self):
163 def getBlockDimension(self):
164
164
165 raise ValueError, "No implemented"
165 raise ValueError, "No implemented"
166
166
167 def __searchFilesOffLine(self,
167 def __searchFilesOffLine(self,
168 path,
168 path,
169 startDate,
169 startDate,
170 endDate,
170 endDate,
171 startTime=datetime.time(0,0,0),
171 startTime=datetime.time(0,0,0),
172 endTime=datetime.time(23,59,59),
172 endTime=datetime.time(23,59,59),
173 set=None,
173 set=None,
174 expLabel="",
174 expLabel="",
175 ext=".r"):
175 ext=".r"):
176 dirList = []
176 dirList = []
177 for thisPath in os.listdir(path):
177 for thisPath in os.listdir(path):
178 if os.path.isdir(os.path.join(path,thisPath)):
178 if os.path.isdir(os.path.join(path,thisPath)):
179 dirList.append(thisPath)
179 dirList.append(thisPath)
180
180
181 if not(dirList):
181 if not(dirList):
182 return None, None
182 return None, None
183
183
184 pathList = []
184 pathList = []
185 dateList = []
185 dateList = []
186
186
187 thisDate = startDate
187 thisDate = startDate
188
188
189 while(thisDate <= endDate):
189 while(thisDate <= endDate):
190 year = thisDate.timetuple().tm_year
190 year = thisDate.timetuple().tm_year
191 doy = thisDate.timetuple().tm_yday
191 doy = thisDate.timetuple().tm_yday
192
192
193 match = fnmatch.filter(dirList, '?' + '%4.4d%3.3d' % (year,doy))
193 match = fnmatch.filter(dirList, '?' + '%4.4d%3.3d' % (year,doy))
194 if len(match) == 0:
194 if len(match) == 0:
195 thisDate += datetime.timedelta(1)
195 thisDate += datetime.timedelta(1)
196 continue
196 continue
197
197
198 pathList.append(os.path.join(path,match[0],expLabel))
198 pathList.append(os.path.join(path,match[0],expLabel))
199 dateList.append(thisDate)
199 dateList.append(thisDate)
200 thisDate += datetime.timedelta(1)
200 thisDate += datetime.timedelta(1)
201
201
202 filenameList = []
202 filenameList = []
203 for index in range(len(pathList)):
203 for index in range(len(pathList)):
204
204
205 thisPath = pathList[index]
205 thisPath = pathList[index]
206 fileList = glob.glob1(thisPath, "*%s" %ext)
206 fileList = glob.glob1(thisPath, "*%s" %ext)
207 fileList.sort()
207 fileList.sort()
208
208
209 #Busqueda de datos en el rango de horas indicados
209 #Busqueda de datos en el rango de horas indicados
210 thisDate = dateList[index]
210 thisDate = dateList[index]
211 startDT = datetime.datetime.combine(thisDate, startTime)
211 startDT = datetime.datetime.combine(thisDate, startTime)
212 endDT = datetime.datetime.combine(thisDate, endTime)
212 endDT = datetime.datetime.combine(thisDate, endTime)
213
213
214 startUtSeconds = time.mktime(startDT.timetuple())
214 startUtSeconds = time.mktime(startDT.timetuple())
215 endUtSeconds = time.mktime(endDT.timetuple())
215 endUtSeconds = time.mktime(endDT.timetuple())
216
216
217 for file in fileList:
217 for file in fileList:
218
218
219 filename = os.path.join(thisPath,file)
219 filename = os.path.join(thisPath,file)
220
220
221 if isThisFileinRange(filename, startUtSeconds, endUtSeconds):
221 if isThisFileinRange(filename, startUtSeconds, endUtSeconds):
222 filenameList.append(filename)
222 filenameList.append(filename)
223
223
224 if not(filenameList):
224 if not(filenameList):
225 return None, None
225 return None, None
226
226
227 self.filenameList = filenameList
227 self.filenameList = filenameList
228
228
229 return pathList, filenameList
229 return pathList, filenameList
230
230
231 def setup(self,dataOutObj=None,
231 def setup(self,dataOutObj=None,
232 path=None,
232 path=None,
233 startDate=None,
233 startDate=None,
234 endDate=None,
234 endDate=None,
235 startTime=datetime.time(0,0,0),
235 startTime=datetime.time(0,0,0),
236 endTime=datetime.time(23,59,59),
236 endTime=datetime.time(23,59,59),
237 set=0,
237 set=0,
238 expLabel = "",
238 expLabel = "",
239 ext = None,
239 ext = None,
240 online = 0):
240 online = 0):
241
241
242 if path == None:
242 if path == None:
243 raise ValueError, "The path is not valid"
243 raise ValueError, "The path is not valid"
244
244
245 if ext == None:
245 if ext == None:
246 ext = self.ext
246 ext = self.ext
247
247
248 if dataOutObj == None:
248 if dataOutObj == None:
249 dataOutObj = self.createObjByDefault()
249 dataOutObj = self.createObjByDefault()
250
250
251 self.dataOutObj = dataOutObj
251 self.dataOutObj = dataOutObj
252
252
253 if online:
253 if online:
254 pass
254 pass
255
255
256 else:
256 else:
257 print "Searching file in offline mode"
257 print "Searching files in offline mode"
258 pathList, filenameList = self.__searchFilesOffLine(path, startDate, endDate, startTime, endTime, set, expLabel, ext)
258 pathList, filenameList = self.__searchFilesOffLine(path, startDate, endDate, startTime, endTime, set, expLabel, ext)
259
259 if not(pathList):
260 if not(pathList):
260 print "No files in range: %s - %s"%(datetime.datetime.combine(startDate,startTime).ctime(), datetime.datetime.combine(endDate,endTime).ctime())
261 print "No *%s files into the folder %s \nfor the range: %s - %s"%(ext, path,
261 return None
262 datetime.datetime.combine(startDate,startTime).ctime(),
263 datetime.datetime.combine(endDate,endTime).ctime())
264
265 sys.exit(-1)
266
267
262 self.fileIndex = -1
268 self.fileIndex = -1
263 self.pathList = pathList
269 self.pathList = pathList
264 self.filenameList = filenameList
270 self.filenameList = filenameList
265
271
266 self.online = online
272 self.online = online
267 ext = ext.lower()
273 ext = ext.lower()
268 self.ext = ext
274 self.ext = ext
269
275
270 if not(self.setNextFile()):
276 if not(self.setNextFile()):
271 if (startDate!=None) and (endDate!=None):
277 if (startDate!=None) and (endDate!=None):
272 print "No files in range: %s - %s" %(datetime.datetime.combine(startDate,startTime).ctime(), datetime.datetime.combine(endDate,endTime).ctime())
278 print "No files in range: %s - %s" %(datetime.datetime.combine(startDate,startTime).ctime(), datetime.datetime.combine(endDate,endTime).ctime())
273 elif startDate != None:
279 elif startDate != None:
274 print "No files in range: %s" %(datetime.datetime.combine(startDate,startTime).ctime())
280 print "No files in range: %s" %(datetime.datetime.combine(startDate,startTime).ctime())
275 else:
281 else:
276 print "No files"
282 print "No files"
277
283
278 return None
284 sys.exit(-1)
279
285
280 # self.updateDataHeader()
286 # self.updateDataHeader()
281
287
282 return self.dataOutObj
288 return self.dataOutObj
283
289
284 def __setNextFileOffline(self):
290 def __setNextFileOffline(self):
285 idFile = self.fileIndex
291 idFile = self.fileIndex
286
292
287 while (True):
293 while (True):
288 idFile += 1
294 idFile += 1
289 if not(idFile < len(self.filenameList)):
295 if not(idFile < len(self.filenameList)):
290 self.flagNoMoreFiles = 1
296 self.flagNoMoreFiles = 1
291 print "No more Files"
297 print "No more Files"
292 return 0
298 return 0
293
299
294 filename = self.filenameList[idFile]
300 filename = self.filenameList[idFile]
295
301
296 if not(self.__verifyFile(filename)):
302 if not(self.__verifyFile(filename)):
297 continue
303 continue
298
304
299 fileSize = os.path.getsize(filename)
305 fileSize = os.path.getsize(filename)
300 fp = open(filename,'rb')
306 fp = open(filename,'rb')
301 break
307 break
302
308
303 self.flagIsNewFile = 1
309 self.flagIsNewFile = 1
304 self.fileIndex = idFile
310 self.fileIndex = idFile
305 self.filename = filename
311 self.filename = filename
306 self.fileSize = fileSize
312 self.fileSize = fileSize
307 self.fp = fp
313 self.fp = fp
308
314
309 print "Setting the file: %s"%self.filename
315 print "Setting the file: %s"%self.filename
310
316
311 return 1
317 return 1
312
318
313
319
314
320
315 def setNextFile(self):
321 def setNextFile(self):
316 if self.fp != None:
322 if self.fp != None:
317 self.fp.close()
323 self.fp.close()
318
324
319 if self.online:
325 if self.online:
320 newFile = self.__setNextFileOnline()
326 newFile = self.__setNextFileOnline()
321 else:
327 else:
322 newFile = self.__setNextFileOffline()
328 newFile = self.__setNextFileOffline()
323
329
324 if not(newFile):
330 if not(newFile):
325 return 0
331 return 0
326
332
327 self.__readFirstHeader()
333 self.__readFirstHeader()
328 self.nReadBlocks = 0
334 self.nReadBlocks = 0
329 return 1
335 return 1
330
336
331 def __setNewBlock(self):
337 def __setNewBlock(self):
332 if self.fp == None:
338 if self.fp == None:
333 return 0
339 return 0
334
340
335 if self.flagIsNewFile:
341 if self.flagIsNewFile:
336 return 1
342 return 1
337
343
338 self.lastUTTime = self.basicHeaderObj.utc
344 self.lastUTTime = self.basicHeaderObj.utc
339 currentSize = self.fileSize - self.fp.tell()
345 currentSize = self.fileSize - self.fp.tell()
340 neededSize = self.processingHeaderObj.blockSize + self.basicHeaderSize
346 neededSize = self.processingHeaderObj.blockSize + self.basicHeaderSize
341
347
342 if (currentSize >= neededSize):
348 if (currentSize >= neededSize):
343 self.__rdBasicHeader()
349 self.__rdBasicHeader()
344 return 1
350 return 1
345
351
346 if not(self.setNextFile()):
352 if not(self.setNextFile()):
347 return 0
353 return 0
348
354
349 deltaTime = self.basicHeaderObj.utc - self.lastUTTime #
355 deltaTime = self.basicHeaderObj.utc - self.lastUTTime #
350
356
351 self.flagTimeBlock = 0
357 self.flagTimeBlock = 0
352
358
353 if deltaTime > self.maxTimeStep:
359 if deltaTime > self.maxTimeStep:
354 self.flagTimeBlock = 1
360 self.flagTimeBlock = 1
355
361
356 return 1
362 return 1
357
363
358
364
359 def readNextBlock(self):
365 def readNextBlock(self):
360 if not(self.__setNewBlock()):
366 if not(self.__setNewBlock()):
361 return 0
367 return 0
362
368
363 if not(self.readBlock()):
369 if not(self.readBlock()):
364 return 0
370 return 0
365
371
366 return 1
372 return 1
367
373
368 def __rdProcessingHeader(self, fp=None):
374 def __rdProcessingHeader(self, fp=None):
369 if fp == None:
375 if fp == None:
370 fp = self.fp
376 fp = self.fp
371
377
372 self.processingHeaderObj.read(fp)
378 self.processingHeaderObj.read(fp)
373
379
374 def __rdRadarControllerHeader(self, fp=None):
380 def __rdRadarControllerHeader(self, fp=None):
375 if fp == None:
381 if fp == None:
376 fp = self.fp
382 fp = self.fp
377
383
378 self.radarControllerHeaderObj.read(fp)
384 self.radarControllerHeaderObj.read(fp)
379
385
380 def __rdSystemHeader(self, fp=None):
386 def __rdSystemHeader(self, fp=None):
381 if fp == None:
387 if fp == None:
382 fp = self.fp
388 fp = self.fp
383
389
384 self.systemHeaderObj.read(fp)
390 self.systemHeaderObj.read(fp)
385
391
386 def __rdBasicHeader(self, fp=None):
392 def __rdBasicHeader(self, fp=None):
387 if fp == None:
393 if fp == None:
388 fp = self.fp
394 fp = self.fp
389
395
390 self.basicHeaderObj.read(fp)
396 self.basicHeaderObj.read(fp)
391
397
392
398
393 def __readFirstHeader(self):
399 def __readFirstHeader(self):
394 self.__rdBasicHeader()
400 self.__rdBasicHeader()
395 self.__rdSystemHeader()
401 self.__rdSystemHeader()
396 self.__rdRadarControllerHeader()
402 self.__rdRadarControllerHeader()
397 self.__rdProcessingHeader()
403 self.__rdProcessingHeader()
398
404
399 self.firstHeaderSize = self.basicHeaderObj.size
405 self.firstHeaderSize = self.basicHeaderObj.size
400
406
401 datatype = int(numpy.log2((self.processingHeaderObj.processFlags & PROCFLAG.DATATYPE_MASK))-numpy.log2(PROCFLAG.DATATYPE_CHAR))
407 datatype = int(numpy.log2((self.processingHeaderObj.processFlags & PROCFLAG.DATATYPE_MASK))-numpy.log2(PROCFLAG.DATATYPE_CHAR))
402 if datatype == 0:
408 if datatype == 0:
403 datatype_str = numpy.dtype([('real','<i1'),('imag','<i1')])
409 datatype_str = numpy.dtype([('real','<i1'),('imag','<i1')])
404 elif datatype == 1:
410 elif datatype == 1:
405 datatype_str = numpy.dtype([('real','<i2'),('imag','<i2')])
411 datatype_str = numpy.dtype([('real','<i2'),('imag','<i2')])
406 elif datatype == 2:
412 elif datatype == 2:
407 datatype_str = numpy.dtype([('real','<i4'),('imag','<i4')])
413 datatype_str = numpy.dtype([('real','<i4'),('imag','<i4')])
408 elif datatype == 3:
414 elif datatype == 3:
409 datatype_str = numpy.dtype([('real','<i8'),('imag','<i8')])
415 datatype_str = numpy.dtype([('real','<i8'),('imag','<i8')])
410 elif datatype == 4:
416 elif datatype == 4:
411 datatype_str = numpy.dtype([('real','<f4'),('imag','<f4')])
417 datatype_str = numpy.dtype([('real','<f4'),('imag','<f4')])
412 elif datatype == 5:
418 elif datatype == 5:
413 datatype_str = numpy.dtype([('real','<f8'),('imag','<f8')])
419 datatype_str = numpy.dtype([('real','<f8'),('imag','<f8')])
414 else:
420 else:
415 raise ValueError, 'Data type was not defined'
421 raise ValueError, 'Data type was not defined'
416
422
417 self.dtype = datatype_str
423 self.dtype = datatype_str
418 self.ippSeconds = 2 * 1000 * self.radarControllerHeaderObj.ipp / self.c
424 self.ippSeconds = 2 * 1000 * self.radarControllerHeaderObj.ipp / self.c
419 self.fileSizeByHeader = self.processingHeaderObj.dataBlocksPerFile * self.processingHeaderObj.blockSize + self.firstHeaderSize + self.basicHeaderSize*(self.processingHeaderObj.dataBlocksPerFile - 1)
425 self.fileSizeByHeader = self.processingHeaderObj.dataBlocksPerFile * self.processingHeaderObj.blockSize + self.firstHeaderSize + self.basicHeaderSize*(self.processingHeaderObj.dataBlocksPerFile - 1)
420 # self.dataOutObj.channelList = numpy.arange(self.systemHeaderObj.numChannels)
426 # self.dataOutObj.channelList = numpy.arange(self.systemHeaderObj.numChannels)
421 # self.dataOutObj.channelIndexList = numpy.arange(self.systemHeaderObj.numChannels)
427 # self.dataOutObj.channelIndexList = numpy.arange(self.systemHeaderObj.numChannels)
422 self.getBlockDimension()
428 self.getBlockDimension()
423
429
424
430
425 def __verifyFile(self, filename, msgFlag=True):
431 def __verifyFile(self, filename, msgFlag=True):
426 msg = None
432 msg = None
427 try:
433 try:
428 fp = open(filename, 'rb')
434 fp = open(filename, 'rb')
429 currentPosition = fp.tell()
435 currentPosition = fp.tell()
430 except:
436 except:
431 if msgFlag:
437 if msgFlag:
432 print "The file %s can't be opened" % (filename)
438 print "The file %s can't be opened" % (filename)
433 return False
439 return False
434
440
435 neededSize = self.processingHeaderObj.blockSize + self.firstHeaderSize
441 neededSize = self.processingHeaderObj.blockSize + self.firstHeaderSize
436
442
437 if neededSize == 0:
443 if neededSize == 0:
438 basicHeaderObj = BasicHeader()
444 basicHeaderObj = BasicHeader()
439 systemHeaderObj = SystemHeader()
445 systemHeaderObj = SystemHeader()
440 radarControllerHeaderObj = RadarControllerHeader()
446 radarControllerHeaderObj = RadarControllerHeader()
441 processingHeaderObj = ProcessingHeader()
447 processingHeaderObj = ProcessingHeader()
442
448
443 try:
449 try:
444 if not( basicHeaderObj.read(fp) ): raise ValueError
450 if not( basicHeaderObj.read(fp) ): raise ValueError
445 if not( systemHeaderObj.read(fp) ): raise ValueError
451 if not( systemHeaderObj.read(fp) ): raise ValueError
446 if not( radarControllerHeaderObj.read(fp) ): raise ValueError
452 if not( radarControllerHeaderObj.read(fp) ): raise ValueError
447 if not( processingHeaderObj.read(fp) ): raise ValueError
453 if not( processingHeaderObj.read(fp) ): raise ValueError
448 data_type = int(numpy.log2((processingHeaderObj.processFlags & PROCFLAG.DATATYPE_MASK))-numpy.log2(PROCFLAG.DATATYPE_CHAR))
454 data_type = int(numpy.log2((processingHeaderObj.processFlags & PROCFLAG.DATATYPE_MASK))-numpy.log2(PROCFLAG.DATATYPE_CHAR))
449
455
450 neededSize = processingHeaderObj.blockSize + basicHeaderObj.size
456 neededSize = processingHeaderObj.blockSize + basicHeaderObj.size
451
457
452 except:
458 except:
453 if msgFlag:
459 if msgFlag:
454 print "\tThe file %s is empty or it hasn't enough data" % filename
460 print "\tThe file %s is empty or it hasn't enough data" % filename
455
461
456 fp.close()
462 fp.close()
457 return False
463 return False
458 else:
464 else:
459 msg = "\tSkipping the file %s due to it hasn't enough data" %filename
465 msg = "\tSkipping the file %s due to it hasn't enough data" %filename
460
466
461 fp.close()
467 fp.close()
462 fileSize = os.path.getsize(filename)
468 fileSize = os.path.getsize(filename)
463 currentSize = fileSize - currentPosition
469 currentSize = fileSize - currentPosition
464 if currentSize < neededSize:
470 if currentSize < neededSize:
465 if msgFlag and (msg != None):
471 if msgFlag and (msg != None):
466 print msg #print"\tSkipping the file %s due to it hasn't enough data" %filename
472 print msg #print"\tSkipping the file %s due to it hasn't enough data" %filename
467 return False
473 return False
468
474
469 return True
475 return True
470
476
471 def getData():
477 def getData():
472 pass
478 pass
473
479
474 def hasNotDataInBuffer():
480 def hasNotDataInBuffer():
475 pass
481 pass
476
482
477 def readBlock():
483 def readBlock():
478 pass
484 pass
479
485
480 class JRODataWriter(JRODataIO):
486 class JRODataWriter(JRODataIO):
481
487
482 """
488 """
483 Esta clase permite escribir datos a archivos procesados (.r o ,pdata). La escritura
489 Esta clase permite escribir datos a archivos procesados (.r o ,pdata). La escritura
484 de los datos siempre se realiza por bloques.
490 de los datos siempre se realiza por bloques.
485 """
491 """
486
492
487 blockIndex = 0
493 blockIndex = 0
488
494
489 path = None
495 path = None
490
496
491 setFile = None
497 setFile = None
492
498
493 profilesPerBlock = None
499 profilesPerBlock = None
494
500
495 blocksPerFile = None
501 blocksPerFile = None
496
502
497 nWriteBlocks = 0
503 nWriteBlocks = 0
498
504
499 def __init__(self, dataOutObj=None):
505 def __init__(self, dataOutObj=None):
500 raise ValueError, "Not implemented"
506 raise ValueError, "Not implemented"
501
507
502
508
503 def hasAllDataInBuffer(self):
509 def hasAllDataInBuffer(self):
504 raise ValueError, "Not implemented"
510 raise ValueError, "Not implemented"
505
511
506
512
507 def setBlockDimension(self):
513 def setBlockDimension(self):
508 raise ValueError, "Not implemented"
514 raise ValueError, "Not implemented"
509
515
510
516
511 def writeBlock(self):
517 def writeBlock(self):
512 raise ValueError, "No implemented"
518 raise ValueError, "No implemented"
513
519
514
520
515 def putData(self):
521 def putData(self):
516 raise ValueError, "No implemented"
522 raise ValueError, "No implemented"
517
523
518
524
519 def __writeFirstHeader(self):
525 def __writeFirstHeader(self):
520 """
526 """
521 Escribe el primer header del file es decir el Basic header y el Long header (SystemHeader, RadarControllerHeader, ProcessingHeader)
527 Escribe el primer header del file es decir el Basic header y el Long header (SystemHeader, RadarControllerHeader, ProcessingHeader)
522
528
523 Affected:
529 Affected:
524 __dataType
530 __dataType
525
531
526 Return:
532 Return:
527 None
533 None
528 """
534 """
529
535
530 # CALCULAR PARAMETROS
536 # CALCULAR PARAMETROS
531
537
532 sizeLongHeader = self.systemHeaderObj.size + self.radarControllerHeaderObj.size + self.processingHeaderObj.size
538 sizeLongHeader = self.systemHeaderObj.size + self.radarControllerHeaderObj.size + self.processingHeaderObj.size
533 self.basicHeaderObj.size = self.basicHeaderSize + sizeLongHeader
539 self.basicHeaderObj.size = self.basicHeaderSize + sizeLongHeader
534
540
535 self.__writeBasicHeader()
541 self.__writeBasicHeader()
536 self.__wrSystemHeader()
542 self.__wrSystemHeader()
537 self.__wrRadarControllerHeader()
543 self.__wrRadarControllerHeader()
538 self.__wrProcessingHeader()
544 self.__wrProcessingHeader()
539 self.dtype = self.dataOutObj.dtype
545 self.dtype = self.dataOutObj.dtype
540
546
541
547
542 def __writeBasicHeader(self, fp=None):
548 def __writeBasicHeader(self, fp=None):
543 """
549 """
544 Escribe solo el Basic header en el file creado
550 Escribe solo el Basic header en el file creado
545
551
546 Return:
552 Return:
547 None
553 None
548 """
554 """
549 if fp == None:
555 if fp == None:
550 fp = self.fp
556 fp = self.fp
551
557
552 self.basicHeaderObj.write(fp)
558 self.basicHeaderObj.write(fp)
553
559
554
560
555 def __wrSystemHeader(self, fp=None):
561 def __wrSystemHeader(self, fp=None):
556 """
562 """
557 Escribe solo el System header en el file creado
563 Escribe solo el System header en el file creado
558
564
559 Return:
565 Return:
560 None
566 None
561 """
567 """
562 if fp == None:
568 if fp == None:
563 fp = self.fp
569 fp = self.fp
564
570
565 self.systemHeaderObj.write(fp)
571 self.systemHeaderObj.write(fp)
566
572
567
573
568 def __wrRadarControllerHeader(self, fp=None):
574 def __wrRadarControllerHeader(self, fp=None):
569 """
575 """
570 Escribe solo el RadarController header en el file creado
576 Escribe solo el RadarController header en el file creado
571
577
572 Return:
578 Return:
573 None
579 None
574 """
580 """
575 if fp == None:
581 if fp == None:
576 fp = self.fp
582 fp = self.fp
577
583
578 self.radarControllerHeaderObj.write(fp)
584 self.radarControllerHeaderObj.write(fp)
579
585
580
586
581 def __wrProcessingHeader(self, fp=None):
587 def __wrProcessingHeader(self, fp=None):
582 """
588 """
583 Escribe solo el Processing header en el file creado
589 Escribe solo el Processing header en el file creado
584
590
585 Return:
591 Return:
586 None
592 None
587 """
593 """
588 if fp == None:
594 if fp == None:
589 fp = self.fp
595 fp = self.fp
590
596
591 self.processingHeaderObj.write(fp)
597 self.processingHeaderObj.write(fp)
592
598
593
599
594 def setNextFile(self):
600 def setNextFile(self):
595 """
601 """
596 Determina el siguiente file que sera escrito
602 Determina el siguiente file que sera escrito
597
603
598 Affected:
604 Affected:
599 self.filename
605 self.filename
600 self.subfolder
606 self.subfolder
601 self.fp
607 self.fp
602 self.setFile
608 self.setFile
603 self.flagIsNewFile
609 self.flagIsNewFile
604
610
605 Return:
611 Return:
606 0 : Si el archivo no puede ser escrito
612 0 : Si el archivo no puede ser escrito
607 1 : Si el archivo esta listo para ser escrito
613 1 : Si el archivo esta listo para ser escrito
608 """
614 """
609 ext = self.ext
615 ext = self.ext
610 path = self.path
616 path = self.path
611
617
612 if self.fp != None:
618 if self.fp != None:
613 self.fp.close()
619 self.fp.close()
614
620
615 timeTuple = time.localtime( self.dataOutObj.dataUtcTime)
621 timeTuple = time.localtime( self.dataOutObj.dataUtcTime)
616 subfolder = 'D%4.4d%3.3d' % (timeTuple.tm_year,timeTuple.tm_yday)
622 subfolder = 'D%4.4d%3.3d' % (timeTuple.tm_year,timeTuple.tm_yday)
617
623
618 doypath = os.path.join( path, subfolder )
624 doypath = os.path.join( path, subfolder )
619 if not( os.path.exists(doypath) ):
625 if not( os.path.exists(doypath) ):
620 os.mkdir(doypath)
626 os.mkdir(doypath)
621 self.setFile = -1 #inicializo mi contador de seteo
627 self.setFile = -1 #inicializo mi contador de seteo
622 else:
628 else:
623 filesList = os.listdir( doypath )
629 filesList = os.listdir( doypath )
624 if len( filesList ) > 0:
630 if len( filesList ) > 0:
625 filesList = sorted( filesList, key=str.lower )
631 filesList = sorted( filesList, key=str.lower )
626 filen = filesList[-1]
632 filen = filesList[-1]
627 # el filename debera tener el siguiente formato
633 # el filename debera tener el siguiente formato
628 # 0 1234 567 89A BCDE (hex)
634 # 0 1234 567 89A BCDE (hex)
629 # x YYYY DDD SSS .ext
635 # x YYYY DDD SSS .ext
630 if isNumber( filen[8:11] ):
636 if isNumber( filen[8:11] ):
631 self.setFile = int( filen[8:11] ) #inicializo mi contador de seteo al seteo del ultimo file
637 self.setFile = int( filen[8:11] ) #inicializo mi contador de seteo al seteo del ultimo file
632 else:
638 else:
633 self.setFile = -1
639 self.setFile = -1
634 else:
640 else:
635 self.setFile = -1 #inicializo mi contador de seteo
641 self.setFile = -1 #inicializo mi contador de seteo
636
642
637 setFile = self.setFile
643 setFile = self.setFile
638 setFile += 1
644 setFile += 1
639
645
640 file = '%s%4.4d%3.3d%3.3d%s' % (self.optchar,
646 file = '%s%4.4d%3.3d%3.3d%s' % (self.optchar,
641 timeTuple.tm_year,
647 timeTuple.tm_year,
642 timeTuple.tm_yday,
648 timeTuple.tm_yday,
643 setFile,
649 setFile,
644 ext )
650 ext )
645
651
646 filename = os.path.join( path, subfolder, file )
652 filename = os.path.join( path, subfolder, file )
647
653
648 fp = open( filename,'wb' )
654 fp = open( filename,'wb' )
649
655
650 self.blockIndex = 0
656 self.blockIndex = 0
651
657
652 #guardando atributos
658 #guardando atributos
653 self.filename = filename
659 self.filename = filename
654 self.subfolder = subfolder
660 self.subfolder = subfolder
655 self.fp = fp
661 self.fp = fp
656 self.setFile = setFile
662 self.setFile = setFile
657 self.flagIsNewFile = 1
663 self.flagIsNewFile = 1
658
664
659 self.getDataHeader()
665 self.getDataHeader()
660
666
661 print 'Writing the file: %s'%self.filename
667 print 'Writing the file: %s'%self.filename
662
668
663 self.__writeFirstHeader()
669 self.__writeFirstHeader()
664
670
665 return 1
671 return 1
666
672
667
673
668 def __setNewBlock(self):
674 def __setNewBlock(self):
669 """
675 """
670 Si es un nuevo file escribe el First Header caso contrario escribe solo el Basic Header
676 Si es un nuevo file escribe el First Header caso contrario escribe solo el Basic Header
671
677
672 Return:
678 Return:
673 0 : si no pudo escribir nada
679 0 : si no pudo escribir nada
674 1 : Si escribio el Basic el First Header
680 1 : Si escribio el Basic el First Header
675 """
681 """
676 if self.fp == None:
682 if self.fp == None:
677 self.setNextFile()
683 self.setNextFile()
678
684
679 if self.flagIsNewFile:
685 if self.flagIsNewFile:
680 return 1
686 return 1
681
687
682 if self.blockIndex < self.processingHeaderObj.dataBlocksPerFile:
688 if self.blockIndex < self.processingHeaderObj.dataBlocksPerFile:
683 self.__writeBasicHeader()
689 self.__writeBasicHeader()
684 return 1
690 return 1
685
691
686 if not( self.setNextFile() ):
692 if not( self.setNextFile() ):
687 return 0
693 return 0
688
694
689 return 1
695 return 1
690
696
691
697
692 def writeNextBlock(self):
698 def writeNextBlock(self):
693 """
699 """
694 Selecciona el bloque siguiente de datos y los escribe en un file
700 Selecciona el bloque siguiente de datos y los escribe en un file
695
701
696 Return:
702 Return:
697 0 : Si no hizo pudo escribir el bloque de datos
703 0 : Si no hizo pudo escribir el bloque de datos
698 1 : Si no pudo escribir el bloque de datos
704 1 : Si no pudo escribir el bloque de datos
699 """
705 """
700 if not( self.__setNewBlock() ):
706 if not( self.__setNewBlock() ):
701 return 0
707 return 0
702
708
703 self.writeBlock()
709 self.writeBlock()
704
710
705 return 1
711 return 1
706
712
707
713
708 def getDataHeader(self):
714 def getDataHeader(self):
709 """Obtiene una copia del First Header Affected: self.basicHeaderObj self.
715 """Obtiene una copia del First Header Affected: self.basicHeaderObj self.
710 systemHeaderObj self.radarControllerHeaderObj self.processingHeaderObj self.
716 systemHeaderObj self.radarControllerHeaderObj self.processingHeaderObj self.
711 dtype Return: None
717 dtype Return: None
712 """
718 """
713
719
714 raise ValueError, "No implemented"
720 raise ValueError, "No implemented"
715
721
716 def setup(self, path, blocksPerFile, profilesPerBlock=None, set=0, ext=None):
722 def setup(self, path, blocksPerFile, profilesPerBlock=None, set=0, ext=None):
717 """
723 """
718 Setea el tipo de formato en la cual sera guardada la data y escribe el First Header
724 Setea el tipo de formato en la cual sera guardada la data y escribe el First Header
719
725
720 Inputs:
726 Inputs:
721 path : el path destino en el cual se escribiran los files a crear
727 path : el path destino en el cual se escribiran los files a crear
722 format : formato en el cual sera salvado un file
728 format : formato en el cual sera salvado un file
723 set : el setebo del file
729 set : el setebo del file
724
730
725 Return:
731 Return:
726 0 : Si no realizo un buen seteo
732 0 : Si no realizo un buen seteo
727 1 : Si realizo un buen seteo
733 1 : Si realizo un buen seteo
728 """
734 """
729
735
730 if ext == None:
736 if ext == None:
731 ext = self.ext
737 ext = self.ext
732
738
733 ext = ext.lower()
739 ext = ext.lower()
734
740
735 self.ext = ext
741 self.ext = ext
736
742
737 self.path = path
743 self.path = path
738
744
739 self.setFile = set - 1
745 self.setFile = set - 1
740
746
741 self.blocksPerFile = blocksPerFile
747 self.blocksPerFile = blocksPerFile
742
748
743 self.profilesPerBlock = profilesPerBlock
749 self.profilesPerBlock = profilesPerBlock
744
750
745 if not(self.setNextFile()):
751 if not(self.setNextFile()):
746 print "There isn't a next file"
752 print "There isn't a next file"
747 return 0
753 return 0
748
754
749 self.setBlockDimension()
755 self.setBlockDimension()
750
756
751 return 1
757 return 1
752
758
753
759
754
760
755
761
756
762
757
763
@@ -1,777 +1,777
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 import glob
9 import glob
10 import fnmatch
10 import fnmatch
11 import time, datetime
11 import time, datetime
12
12
13 path = os.path.split(os.getcwd())[0]
13 path = os.path.split(os.getcwd())[0]
14 sys.path.append(path)
14 sys.path.append(path)
15
15
16 from JROHeaderIO import *
16 from JROHeaderIO import *
17 from JRODataIO import JRODataReader
17 from JRODataIO import JRODataReader
18 from JRODataIO import JRODataWriter
18 from JRODataIO import JRODataWriter
19
19
20 from Data.JROData import Spectra
20 from Data.JROData import Spectra
21
21
22 class SpectraReader(JRODataReader):
22 class SpectraReader(JRODataReader):
23 """
23 """
24 Esta clase permite leer datos de espectros desde archivos procesados (.pdata). La lectura
24 Esta clase permite leer datos de espectros desde archivos procesados (.pdata). La lectura
25 de los datos siempre se realiza por bloques. Los datos leidos (array de 3 dimensiones)
25 de los datos siempre se realiza por bloques. Los datos leidos (array de 3 dimensiones)
26 son almacenados en tres buffer's para el Self Spectra, el Cross Spectra y el DC Channel.
26 son almacenados en tres buffer's para el Self Spectra, el Cross Spectra y el DC Channel.
27
27
28 paresCanalesIguales * alturas * perfiles (Self Spectra)
28 paresCanalesIguales * alturas * perfiles (Self Spectra)
29 paresCanalesDiferentes * alturas * perfiles (Cross Spectra)
29 paresCanalesDiferentes * alturas * perfiles (Cross Spectra)
30 canales * alturas (DC Channels)
30 canales * alturas (DC Channels)
31
31
32 Esta clase contiene instancias (objetos) de las clases BasicHeader, SystemHeader,
32 Esta clase contiene instancias (objetos) de las clases BasicHeader, SystemHeader,
33 RadarControllerHeader y Spectra. Los tres primeros se usan para almacenar informacion de la
33 RadarControllerHeader y Spectra. Los tres primeros se usan para almacenar informacion de la
34 cabecera de datos (metadata), y el cuarto (Spectra) para obtener y almacenar un bloque de
34 cabecera de datos (metadata), y el cuarto (Spectra) para obtener y almacenar un bloque de
35 datos desde el "buffer" cada vez que se ejecute el metodo "getData".
35 datos desde el "buffer" cada vez que se ejecute el metodo "getData".
36
36
37 Example:
37 Example:
38 dpath = "/home/myuser/data"
38 dpath = "/home/myuser/data"
39
39
40 startTime = datetime.datetime(2010,1,20,0,0,0,0,0,0)
40 startTime = datetime.datetime(2010,1,20,0,0,0,0,0,0)
41
41
42 endTime = datetime.datetime(2010,1,21,23,59,59,0,0,0)
42 endTime = datetime.datetime(2010,1,21,23,59,59,0,0,0)
43
43
44 readerObj = SpectraReader()
44 readerObj = SpectraReader()
45
45
46 readerObj.setup(dpath, startTime, endTime)
46 readerObj.setup(dpath, startTime, endTime)
47
47
48 while(True):
48 while(True):
49
49
50 readerObj.getData()
50 readerObj.getData()
51
51
52 print readerObj.data_spc
52 print readerObj.data_spc
53
53
54 print readerObj.data_cspc
54 print readerObj.data_cspc
55
55
56 print readerObj.data_dc
56 print readerObj.data_dc
57
57
58 if readerObj.flagNoMoreFiles:
58 if readerObj.flagNoMoreFiles:
59 break
59 break
60
60
61 """
61 """
62
62
63 pts2read_SelfSpectra = 0
63 pts2read_SelfSpectra = 0
64
64
65 pts2read_CrossSpectra = 0
65 pts2read_CrossSpectra = 0
66
66
67 pts2read_DCchannels = 0
67 pts2read_DCchannels = 0
68
68
69 ext = ".pdata"
69 ext = ".pdata"
70
70
71 optchar = "P"
71 optchar = "P"
72
72
73 dataOutObj = None
73 dataOutObj = None
74
74
75 nRdChannels = None
75 nRdChannels = None
76
76
77 nRdPairs = None
77 nRdPairs = None
78
78
79 rdPairList = []
79 rdPairList = []
80
80
81
81
82 def __init__(self, dataOutObj=None):
82 def __init__(self, dataOutObj=None):
83 """
83 """
84 Inicializador de la clase SpectraReader para la lectura de datos de espectros.
84 Inicializador de la clase SpectraReader para la lectura de datos de espectros.
85
85
86 Inputs:
86 Inputs:
87 dataOutObj : Objeto de la clase Spectra. Este objeto sera utilizado para
87 dataOutObj : Objeto de la clase Spectra. Este objeto sera utilizado para
88 almacenar un perfil de datos cada vez que se haga un requerimiento
88 almacenar un perfil de datos cada vez que se haga un requerimiento
89 (getData). El perfil sera obtenido a partir del buffer de datos,
89 (getData). El perfil sera obtenido a partir del buffer de datos,
90 si el buffer esta vacio se hara un nuevo proceso de lectura de un
90 si el buffer esta vacio se hara un nuevo proceso de lectura de un
91 bloque de datos.
91 bloque de datos.
92 Si este parametro no es pasado se creara uno internamente.
92 Si este parametro no es pasado se creara uno internamente.
93
93
94 Affected:
94 Affected:
95 self.dataOutObj
95 self.dataOutObj
96
96
97 Return : None
97 Return : None
98 """
98 """
99
99
100 self.pts2read_SelfSpectra = 0
100 self.pts2read_SelfSpectra = 0
101
101
102 self.pts2read_CrossSpectra = 0
102 self.pts2read_CrossSpectra = 0
103
103
104 self.pts2read_DCchannels = 0
104 self.pts2read_DCchannels = 0
105
105
106 self.datablock = None
106 self.datablock = None
107
107
108 self.utc = None
108 self.utc = None
109
109
110 self.ext = ".pdata"
110 self.ext = ".pdata"
111
111
112 self.optchar = "P"
112 self.optchar = "P"
113
113
114 self.basicHeaderObj = BasicHeader()
114 self.basicHeaderObj = BasicHeader()
115
115
116 self.systemHeaderObj = SystemHeader()
116 self.systemHeaderObj = SystemHeader()
117
117
118 self.radarControllerHeaderObj = RadarControllerHeader()
118 self.radarControllerHeaderObj = RadarControllerHeader()
119
119
120 self.processingHeaderObj = ProcessingHeader()
120 self.processingHeaderObj = ProcessingHeader()
121
121
122 self.online = 0
122 self.online = 0
123
123
124 self.fp = None
124 self.fp = None
125
125
126 self.idFile = None
126 self.idFile = None
127
127
128 self.dtype = None
128 self.dtype = None
129
129
130 self.fileSizeByHeader = None
130 self.fileSizeByHeader = None
131
131
132 self.filenameList = []
132 self.filenameList = []
133
133
134 self.filename = None
134 self.filename = None
135
135
136 self.fileSize = None
136 self.fileSize = None
137
137
138 self.firstHeaderSize = 0
138 self.firstHeaderSize = 0
139
139
140 self.basicHeaderSize = 24
140 self.basicHeaderSize = 24
141
141
142 self.pathList = []
142 self.pathList = []
143
143
144 self.lastUTTime = 0
144 self.lastUTTime = 0
145
145
146 self.maxTimeStep = 30
146 self.maxTimeStep = 30
147
147
148 self.flagNoMoreFiles = 0
148 self.flagNoMoreFiles = 0
149
149
150 self.set = 0
150 self.set = 0
151
151
152 self.path = None
152 self.path = None
153
153
154 self.delay = 3 #seconds
154 self.delay = 3 #seconds
155
155
156 self.nTries = 3 #quantity tries
156 self.nTries = 3 #quantity tries
157
157
158 self.nFiles = 3 #number of files for searching
158 self.nFiles = 3 #number of files for searching
159
159
160 self.nReadBlocks = 0
160 self.nReadBlocks = 0
161
161
162 self.flagIsNewFile = 1
162 self.flagIsNewFile = 1
163
163
164 self.ippSeconds = 0
164 self.ippSeconds = 0
165
165
166 self.flagTimeBlock = 0
166 self.flagTimeBlock = 0
167
167
168 self.flagIsNewBlock = 0
168 self.flagIsNewBlock = 0
169
169
170 self.nTotalBlocks = 0
170 self.nTotalBlocks = 0
171
171
172 self.blocksize = 0
172 self.blocksize = 0
173
173
174
174
175 def createObjByDefault(self):
175 def createObjByDefault(self):
176
176
177 dataObj = Spectra()
177 dataObj = Spectra()
178
178
179 return dataObj
179 return dataObj
180
180
181 def __hasNotDataInBuffer(self):
181 def __hasNotDataInBuffer(self):
182 return 1
182 return 1
183
183
184
184
185 def getBlockDimension(self):
185 def getBlockDimension(self):
186 """
186 """
187 Obtiene la cantidad de puntos a leer por cada bloque de datos
187 Obtiene la cantidad de puntos a leer por cada bloque de datos
188
188
189 Affected:
189 Affected:
190 self.nRdChannels
190 self.nRdChannels
191 self.nRdPairs
191 self.nRdPairs
192 self.pts2read_SelfSpectra
192 self.pts2read_SelfSpectra
193 self.pts2read_CrossSpectra
193 self.pts2read_CrossSpectra
194 self.pts2read_DCchannels
194 self.pts2read_DCchannels
195 self.blocksize
195 self.blocksize
196 self.dataOutObj.nChannels
196 self.dataOutObj.nChannels
197 self.dataOutObj.nPairs
197 self.dataOutObj.nPairs
198
198
199 Return:
199 Return:
200 None
200 None
201 """
201 """
202 self.nRdChannels = 0
202 self.nRdChannels = 0
203 self.nRdPairs = 0
203 self.nRdPairs = 0
204 self.rdPairList = []
204 self.rdPairList = []
205
205
206 for i in range(0, self.processingHeaderObj.totalSpectra*2, 2):
206 for i in range(0, self.processingHeaderObj.totalSpectra*2, 2):
207 if self.processingHeaderObj.spectraComb[i] == self.processingHeaderObj.spectraComb[i+1]:
207 if self.processingHeaderObj.spectraComb[i] == self.processingHeaderObj.spectraComb[i+1]:
208 self.nRdChannels = self.nRdChannels + 1 #par de canales iguales
208 self.nRdChannels = self.nRdChannels + 1 #par de canales iguales
209 else:
209 else:
210 self.nRdPairs = self.nRdPairs + 1 #par de canales diferentes
210 self.nRdPairs = self.nRdPairs + 1 #par de canales diferentes
211 self.rdPairList.append((self.processingHeaderObj.spectraComb[i], self.processingHeaderObj.spectraComb[i+1]))
211 self.rdPairList.append((self.processingHeaderObj.spectraComb[i], self.processingHeaderObj.spectraComb[i+1]))
212
212
213 pts2read = self.processingHeaderObj.nHeights * self.processingHeaderObj.profilesPerBlock
213 pts2read = self.processingHeaderObj.nHeights * self.processingHeaderObj.profilesPerBlock
214
214
215 self.pts2read_SelfSpectra = int(self.nRdChannels * pts2read)
215 self.pts2read_SelfSpectra = int(self.nRdChannels * pts2read)
216 self.blocksize = self.pts2read_SelfSpectra
216 self.blocksize = self.pts2read_SelfSpectra
217
217
218 if self.processingHeaderObj.flag_cspc:
218 if self.processingHeaderObj.flag_cspc:
219 self.pts2read_CrossSpectra = int(self.nRdPairs * pts2read)
219 self.pts2read_CrossSpectra = int(self.nRdPairs * pts2read)
220 self.blocksize += self.pts2read_CrossSpectra
220 self.blocksize += self.pts2read_CrossSpectra
221
221
222 if self.processingHeaderObj.flag_dc:
222 if self.processingHeaderObj.flag_dc:
223 self.pts2read_DCchannels = int(self.systemHeaderObj.nChannels * self.processingHeaderObj.nHeights)
223 self.pts2read_DCchannels = int(self.systemHeaderObj.nChannels * self.processingHeaderObj.nHeights)
224 self.blocksize += self.pts2read_DCchannels
224 self.blocksize += self.pts2read_DCchannels
225
225
226 # self.blocksize = self.pts2read_SelfSpectra + self.pts2read_CrossSpectra + self.pts2read_DCchannels
226 # self.blocksize = self.pts2read_SelfSpectra + self.pts2read_CrossSpectra + self.pts2read_DCchannels
227
227
228
228
229 def readBlock(self):
229 def readBlock(self):
230 """
230 """
231 Lee el bloque de datos desde la posicion actual del puntero del archivo
231 Lee el bloque de datos desde la posicion actual del puntero del archivo
232 (self.fp) y actualiza todos los parametros relacionados al bloque de datos
232 (self.fp) y actualiza todos los parametros relacionados al bloque de datos
233 (metadata + data). La data leida es almacenada en el buffer y el contador del buffer
233 (metadata + data). La data leida es almacenada en el buffer y el contador del buffer
234 es seteado a 0
234 es seteado a 0
235
235
236 Return: None
236 Return: None
237
237
238 Variables afectadas:
238 Variables afectadas:
239
239
240 self.flagIsNewFile
240 self.flagIsNewFile
241 self.flagIsNewBlock
241 self.flagIsNewBlock
242 self.nTotalBlocks
242 self.nTotalBlocks
243 self.data_spc
243 self.data_spc
244 self.data_cspc
244 self.data_cspc
245 self.data_dc
245 self.data_dc
246
246
247 Exceptions:
247 Exceptions:
248 Si un bloque leido no es un bloque valido
248 Si un bloque leido no es un bloque valido
249 """
249 """
250 blockOk_flag = False
250 blockOk_flag = False
251 fpointer = self.fp.tell()
251 fpointer = self.fp.tell()
252
252
253 spc = numpy.fromfile( self.fp, self.dtype[0], self.pts2read_SelfSpectra )
253 spc = numpy.fromfile( self.fp, self.dtype[0], self.pts2read_SelfSpectra )
254 spc = spc.reshape( (self.nRdChannels, self.processingHeaderObj.nHeights, self.processingHeaderObj.profilesPerBlock) ) #transforma a un arreglo 3D
254 spc = spc.reshape( (self.nRdChannels, self.processingHeaderObj.nHeights, self.processingHeaderObj.profilesPerBlock) ) #transforma a un arreglo 3D
255
255
256 if self.processingHeaderObj.flag_cspc:
256 if self.processingHeaderObj.flag_cspc:
257 cspc = numpy.fromfile( self.fp, self.dtype, self.pts2read_CrossSpectra )
257 cspc = numpy.fromfile( self.fp, self.dtype, self.pts2read_CrossSpectra )
258 cspc = cspc.reshape( (self.nRdPairs, self.processingHeaderObj.nHeights, self.processingHeaderObj.profilesPerBlock) ) #transforma a un arreglo 3D
258 cspc = cspc.reshape( (self.nRdPairs, self.processingHeaderObj.nHeights, self.processingHeaderObj.profilesPerBlock) ) #transforma a un arreglo 3D
259
259
260 if self.processingHeaderObj.flag_dc:
260 if self.processingHeaderObj.flag_dc:
261 dc = numpy.fromfile( self.fp, self.dtype, self.pts2read_DCchannels ) #int(self.processingHeaderObj.nHeights*self.systemHeaderObj.nChannels) )
261 dc = numpy.fromfile( self.fp, self.dtype, self.pts2read_DCchannels ) #int(self.processingHeaderObj.nHeights*self.systemHeaderObj.nChannels) )
262 dc = dc.reshape( (self.systemHeaderObj.nChannels, self.processingHeaderObj.nHeights) ) #transforma a un arreglo 2D
262 dc = dc.reshape( (self.systemHeaderObj.nChannels, self.processingHeaderObj.nHeights) ) #transforma a un arreglo 2D
263
263
264
264
265 if not(self.processingHeaderObj.shif_fft):
265 if not(self.processingHeaderObj.shif_fft):
266 spc = numpy.roll( spc, self.processingHeaderObj.profilesPerBlock/2, axis=2 ) #desplaza a la derecha en el eje 2 determinadas posiciones
266 spc = numpy.roll( spc, self.processingHeaderObj.profilesPerBlock/2, axis=2 ) #desplaza a la derecha en el eje 2 determinadas posiciones
267
267
268 if self.processingHeaderObj.flag_cspc:
268 if self.processingHeaderObj.flag_cspc:
269 cspc = numpy.roll( cspc, self.processingHeaderObj.profilesPerBlock/2, axis=2 ) #desplaza a la derecha en el eje 2 determinadas posiciones
269 cspc = numpy.roll( cspc, self.processingHeaderObj.profilesPerBlock/2, axis=2 ) #desplaza a la derecha en el eje 2 determinadas posiciones
270
270
271
271
272 spc = numpy.transpose( spc, (0,2,1) )
272 spc = numpy.transpose( spc, (0,2,1) )
273 self.data_spc = spc
273 self.data_spc = spc
274
274
275 if self.processingHeaderObj.flag_cspc:
275 if self.processingHeaderObj.flag_cspc:
276 cspc = numpy.transpose( cspc, (0,2,1) )
276 cspc = numpy.transpose( cspc, (0,2,1) )
277 self.data_cspc = cspc['real'] + cspc['imag']*1j
277 self.data_cspc = cspc['real'] + cspc['imag']*1j
278 else:
278 else:
279 self.data_cspc = None
279 self.data_cspc = None
280
280
281 if self.processingHeaderObj.flag_dc:
281 if self.processingHeaderObj.flag_dc:
282 self.data_dc = dc['real'] + dc['imag']*1j
282 self.data_dc = dc['real'] + dc['imag']*1j
283 else:
283 else:
284 self.data_dc = None
284 self.data_dc = None
285
285
286 self.flagIsNewFile = 0
286 self.flagIsNewFile = 0
287 self.flagIsNewBlock = 1
287 self.flagIsNewBlock = 1
288
288
289 self.nTotalBlocks += 1
289 self.nTotalBlocks += 1
290 self.nReadBlocks += 1
290 self.nReadBlocks += 1
291
291
292 return 1
292 return 1
293
293
294
294
295 def getData(self):
295 def getData(self):
296 """
296 """
297 Copia el buffer de lectura a la clase "Spectra",
297 Copia el buffer de lectura a la clase "Spectra",
298 con todos los parametros asociados a este (metadata). cuando no hay datos en el buffer de
298 con todos los parametros asociados a este (metadata). cuando no hay datos en el buffer de
299 lectura es necesario hacer una nueva lectura de los bloques de datos usando "readNextBlock"
299 lectura es necesario hacer una nueva lectura de los bloques de datos usando "readNextBlock"
300
300
301 Return:
301 Return:
302 0 : Si no hay mas archivos disponibles
302 0 : Si no hay mas archivos disponibles
303 1 : Si hizo una buena copia del buffer
303 1 : Si hizo una buena copia del buffer
304
304
305 Affected:
305 Affected:
306 self.dataOutObj
306 self.dataOutObj
307
307
308 self.flagTimeBlock
308 self.flagTimeBlock
309 self.flagIsNewBlock
309 self.flagIsNewBlock
310 """
310 """
311
311
312 if self.flagNoMoreFiles: return 0
312 if self.flagNoMoreFiles: return 0
313
313
314 self.flagTimeBlock = 0
314 self.flagTimeBlock = 0
315 self.flagIsNewBlock = 0
315 self.flagIsNewBlock = 0
316
316
317 if self.__hasNotDataInBuffer():
317 if self.__hasNotDataInBuffer():
318
318
319 if not( self.readNextBlock() ):
319 if not( self.readNextBlock() ):
320 return 0
320 return 0
321
321
322 # self.updateDataHeader()
322 # self.updateDataHeader()
323
323
324 if self.flagNoMoreFiles == 1:
324 if self.flagNoMoreFiles == 1:
325 print 'Process finished'
325 print 'Process finished'
326 return 0
326 return 0
327
327
328 #data es un numpy array de 3 dmensiones (perfiles, alturas y canales)
328 #data es un numpy array de 3 dmensiones (perfiles, alturas y canales)
329
329
330 if self.data_dc == None:
330 if self.data_dc == None:
331 self.dataOutObj.flagNoData = True
331 self.dataOutObj.flagNoData = True
332 return 0
332 return 0
333
333
334
334
335 self.dataOutObj.data_spc = self.data_spc
335 self.dataOutObj.data_spc = self.data_spc
336
336
337 self.dataOutObj.data_cspc = self.data_cspc
337 self.dataOutObj.data_cspc = self.data_cspc
338
338
339 self.dataOutObj.data_dc = self.data_dc
339 self.dataOutObj.data_dc = self.data_dc
340
340
341 self.dataOutObj.flagTimeBlock = self.flagTimeBlock
341 self.dataOutObj.flagTimeBlock = self.flagTimeBlock
342
342
343 self.dataOutObj.flagNoData = False
343 self.dataOutObj.flagNoData = False
344
344
345 self.dataOutObj.dtype = self.dtype
345 self.dataOutObj.dtype = self.dtype
346
346
347 self.dataOutObj.nChannels = self.nRdChannels
347 self.dataOutObj.nChannels = self.nRdChannels
348
348
349 self.dataOutObj.nPairs = self.nRdPairs
349 self.dataOutObj.nPairs = self.nRdPairs
350
350
351 self.dataOutObj.pairsList = self.rdPairList
351 self.dataOutObj.pairsList = self.rdPairList
352
352
353 self.dataOutObj.nHeights = self.processingHeaderObj.nHeights
353 self.dataOutObj.nHeights = self.processingHeaderObj.nHeights
354
354
355 self.dataOutObj.nProfiles = self.processingHeaderObj.profilesPerBlock
355 self.dataOutObj.nProfiles = self.processingHeaderObj.profilesPerBlock
356
356
357 self.dataOutObj.nFFTPoints = self.processingHeaderObj.profilesPerBlock
357 self.dataOutObj.nFFTPoints = self.processingHeaderObj.profilesPerBlock
358
358
359 self.dataOutObj.nIncohInt = self.processingHeaderObj.nIncohInt
359 self.dataOutObj.nIncohInt = self.processingHeaderObj.nIncohInt
360
360
361
361
362 xf = self.processingHeaderObj.firstHeight + self.processingHeaderObj.nHeights*self.processingHeaderObj.deltaHeight
362 xf = self.processingHeaderObj.firstHeight + self.processingHeaderObj.nHeights*self.processingHeaderObj.deltaHeight
363
363
364 self.dataOutObj.heightList = numpy.arange(self.processingHeaderObj.firstHeight, xf, self.processingHeaderObj.deltaHeight)
364 self.dataOutObj.heightList = numpy.arange(self.processingHeaderObj.firstHeight, xf, self.processingHeaderObj.deltaHeight)
365
365
366 self.dataOutObj.channelList = range(self.systemHeaderObj.nChannels)
366 self.dataOutObj.channelList = range(self.systemHeaderObj.nChannels)
367
367
368 self.dataOutObj.channelIndexList = range(self.systemHeaderObj.nChannels)
368 self.dataOutObj.channelIndexList = range(self.systemHeaderObj.nChannels)
369
369
370 self.dataOutObj.dataUtcTime = self.basicHeaderObj.utc + self.basicHeaderObj.miliSecond/1000.#+ self.profileIndex * self.ippSeconds
370 self.dataOutObj.dataUtcTime = self.basicHeaderObj.utc + self.basicHeaderObj.miliSecond/1000.#+ self.profileIndex * self.ippSeconds
371
371
372 self.dataOutObj.flagShiftFFT = self.processingHeaderObj.shif_fft
372 self.dataOutObj.flagShiftFFT = self.processingHeaderObj.shif_fft
373
373
374 # self.profileIndex += 1
374 # self.profileIndex += 1
375
375
376 self.dataOutObj.systemHeaderObj = self.systemHeaderObj.copy()
376 self.dataOutObj.systemHeaderObj = self.systemHeaderObj.copy()
377
377
378 self.dataOutObj.radarControllerHeaderObj = self.radarControllerHeaderObj.copy()
378 self.dataOutObj.radarControllerHeaderObj = self.radarControllerHeaderObj.copy()
379
379
380 return self.data_spc
380 return self.dataOutObj.data_spc
381
381
382
382
383 class SpectraWriter(JRODataWriter):
383 class SpectraWriter(JRODataWriter):
384
384
385 """
385 """
386 Esta clase permite escribir datos de espectros a archivos procesados (.pdata). La escritura
386 Esta clase permite escribir datos de espectros a archivos procesados (.pdata). La escritura
387 de los datos siempre se realiza por bloques.
387 de los datos siempre se realiza por bloques.
388 """
388 """
389
389
390 ext = ".pdata"
390 ext = ".pdata"
391
391
392 optchar = "P"
392 optchar = "P"
393
393
394 shape_spc_Buffer = None
394 shape_spc_Buffer = None
395
395
396 shape_cspc_Buffer = None
396 shape_cspc_Buffer = None
397
397
398 shape_dc_Buffer = None
398 shape_dc_Buffer = None
399
399
400 data_spc = None
400 data_spc = None
401
401
402 data_cspc = None
402 data_cspc = None
403
403
404 data_dc = None
404 data_dc = None
405
405
406 wrPairList = []
406 wrPairList = []
407
407
408 nWrPairs = 0
408 nWrPairs = 0
409
409
410 nWrChannels = 0
410 nWrChannels = 0
411
411
412 # dataOutObj = None
412 # dataOutObj = None
413
413
414 def __init__(self, dataOutObj=None):
414 def __init__(self, dataOutObj=None):
415 """
415 """
416 Inicializador de la clase SpectraWriter para la escritura de datos de espectros.
416 Inicializador de la clase SpectraWriter para la escritura de datos de espectros.
417
417
418 Affected:
418 Affected:
419 self.dataOutObj
419 self.dataOutObj
420 self.basicHeaderObj
420 self.basicHeaderObj
421 self.systemHeaderObj
421 self.systemHeaderObj
422 self.radarControllerHeaderObj
422 self.radarControllerHeaderObj
423 self.processingHeaderObj
423 self.processingHeaderObj
424
424
425 Return: None
425 Return: None
426 """
426 """
427 if dataOutObj == None:
427 if dataOutObj == None:
428 dataOutObj = Spectra()
428 dataOutObj = Spectra()
429
429
430 if not( isinstance(dataOutObj, Spectra) ):
430 if not( isinstance(dataOutObj, Spectra) ):
431 raise ValueError, "in SpectraReader, dataOutObj must be an Spectra class object"
431 raise ValueError, "in SpectraReader, dataOutObj must be an Spectra class object"
432
432
433 self.dataOutObj = dataOutObj
433 self.dataOutObj = dataOutObj
434
434
435 self.nTotalBlocks = 0
435 self.nTotalBlocks = 0
436
436
437 self.nWrChannels = self.dataOutObj.nChannels
437 self.nWrChannels = self.dataOutObj.nChannels
438
438
439 # if len(pairList) > 0:
439 # if len(pairList) > 0:
440 # self.wrPairList = pairList
440 # self.wrPairList = pairList
441 #
441 #
442 # self.nWrPairs = len(pairList)
442 # self.nWrPairs = len(pairList)
443
443
444 self.wrPairList = self.dataOutObj.pairsList
444 self.wrPairList = self.dataOutObj.pairsList
445
445
446 self.nWrPairs = self.dataOutObj.nPairs
446 self.nWrPairs = self.dataOutObj.nPairs
447
447
448
448
449
449
450
450
451
451
452 # self.data_spc = None
452 # self.data_spc = None
453 # self.data_cspc = None
453 # self.data_cspc = None
454 # self.data_dc = None
454 # self.data_dc = None
455
455
456 # self.fp = None
456 # self.fp = None
457
457
458 # self.flagIsNewFile = 1
458 # self.flagIsNewFile = 1
459 #
459 #
460 # self.nTotalBlocks = 0
460 # self.nTotalBlocks = 0
461 #
461 #
462 # self.flagIsNewBlock = 0
462 # self.flagIsNewBlock = 0
463 #
463 #
464 # self.flagNoMoreFiles = 0
464 # self.flagNoMoreFiles = 0
465 #
465 #
466 # self.setFile = None
466 # self.setFile = None
467 #
467 #
468 # self.dtype = None
468 # self.dtype = None
469 #
469 #
470 # self.path = None
470 # self.path = None
471 #
471 #
472 # self.noMoreFiles = 0
472 # self.noMoreFiles = 0
473 #
473 #
474 # self.filename = None
474 # self.filename = None
475 #
475 #
476 # self.basicHeaderObj = BasicHeader()
476 # self.basicHeaderObj = BasicHeader()
477 #
477 #
478 # self.systemHeaderObj = SystemHeader()
478 # self.systemHeaderObj = SystemHeader()
479 #
479 #
480 # self.radarControllerHeaderObj = RadarControllerHeader()
480 # self.radarControllerHeaderObj = RadarControllerHeader()
481 #
481 #
482 # self.processingHeaderObj = ProcessingHeader()
482 # self.processingHeaderObj = ProcessingHeader()
483
483
484
484
485 def hasAllDataInBuffer(self):
485 def hasAllDataInBuffer(self):
486 return 1
486 return 1
487
487
488
488
489 def setBlockDimension(self):
489 def setBlockDimension(self):
490 """
490 """
491 Obtiene las formas dimensionales del los subbloques de datos que componen un bloque
491 Obtiene las formas dimensionales del los subbloques de datos que componen un bloque
492
492
493 Affected:
493 Affected:
494 self.shape_spc_Buffer
494 self.shape_spc_Buffer
495 self.shape_cspc_Buffer
495 self.shape_cspc_Buffer
496 self.shape_dc_Buffer
496 self.shape_dc_Buffer
497
497
498 Return: None
498 Return: None
499 """
499 """
500 self.shape_spc_Buffer = (self.dataOutObj.nChannels,
500 self.shape_spc_Buffer = (self.dataOutObj.nChannels,
501 self.processingHeaderObj.nHeights,
501 self.processingHeaderObj.nHeights,
502 self.processingHeaderObj.profilesPerBlock)
502 self.processingHeaderObj.profilesPerBlock)
503
503
504 self.shape_cspc_Buffer = (self.dataOutObj.nPairs,
504 self.shape_cspc_Buffer = (self.dataOutObj.nPairs,
505 self.processingHeaderObj.nHeights,
505 self.processingHeaderObj.nHeights,
506 self.processingHeaderObj.profilesPerBlock)
506 self.processingHeaderObj.profilesPerBlock)
507
507
508 self.shape_dc_Buffer = (self.dataOutObj.nChannels,
508 self.shape_dc_Buffer = (self.dataOutObj.nChannels,
509 self.processingHeaderObj.nHeights)
509 self.processingHeaderObj.nHeights)
510
510
511
511
512 def writeBlock(self):
512 def writeBlock(self):
513 """
513 """
514 Escribe el buffer en el file designado
514 Escribe el buffer en el file designado
515
515
516 Affected:
516 Affected:
517 self.data_spc
517 self.data_spc
518 self.data_cspc
518 self.data_cspc
519 self.data_dc
519 self.data_dc
520 self.flagIsNewFile
520 self.flagIsNewFile
521 self.flagIsNewBlock
521 self.flagIsNewBlock
522 self.nTotalBlocks
522 self.nTotalBlocks
523 self.nWriteBlocks
523 self.nWriteBlocks
524
524
525 Return: None
525 Return: None
526 """
526 """
527
527
528 spc = numpy.transpose( self.data_spc, (0,2,1) )
528 spc = numpy.transpose( self.data_spc, (0,2,1) )
529 if not( self.processingHeaderObj.shif_fft ):
529 if not( self.processingHeaderObj.shif_fft ):
530 spc = numpy.roll( spc, self.processingHeaderObj.profilesPerBlock/2, axis=2 ) #desplaza a la derecha en el eje 2 determinadas posiciones
530 spc = numpy.roll( spc, self.processingHeaderObj.profilesPerBlock/2, axis=2 ) #desplaza a la derecha en el eje 2 determinadas posiciones
531 data = spc.reshape((-1))
531 data = spc.reshape((-1))
532 data.tofile(self.fp)
532 data.tofile(self.fp)
533
533
534 if self.data_cspc != None:
534 if self.data_cspc != None:
535 data = numpy.zeros( self.shape_cspc_Buffer, self.dtype )
535 data = numpy.zeros( self.shape_cspc_Buffer, self.dtype )
536 cspc = numpy.transpose( self.data_cspc, (0,2,1) )
536 cspc = numpy.transpose( self.data_cspc, (0,2,1) )
537 if not( self.processingHeaderObj.shif_fft ):
537 if not( self.processingHeaderObj.shif_fft ):
538 cspc = numpy.roll( cspc, self.processingHeaderObj.profilesPerBlock/2, axis=2 ) #desplaza a la derecha en el eje 2 determinadas posiciones
538 cspc = numpy.roll( cspc, self.processingHeaderObj.profilesPerBlock/2, axis=2 ) #desplaza a la derecha en el eje 2 determinadas posiciones
539 data['real'] = cspc.real
539 data['real'] = cspc.real
540 data['imag'] = cspc.imag
540 data['imag'] = cspc.imag
541 data = data.reshape((-1))
541 data = data.reshape((-1))
542 data.tofile(self.fp)
542 data.tofile(self.fp)
543
543
544 if self.data_dc != None:
544 if self.data_dc != None:
545 data = numpy.zeros( self.shape_dc_Buffer, self.dtype )
545 data = numpy.zeros( self.shape_dc_Buffer, self.dtype )
546 dc = self.data_dc
546 dc = self.data_dc
547 data['real'] = dc.real
547 data['real'] = dc.real
548 data['imag'] = dc.imag
548 data['imag'] = dc.imag
549 data = data.reshape((-1))
549 data = data.reshape((-1))
550 data.tofile(self.fp)
550 data.tofile(self.fp)
551
551
552 self.data_spc.fill(0)
552 self.data_spc.fill(0)
553 self.data_dc.fill(0)
553 self.data_dc.fill(0)
554 if self.data_cspc != None:
554 if self.data_cspc != None:
555 self.data_cspc.fill(0)
555 self.data_cspc.fill(0)
556
556
557 self.flagIsNewFile = 0
557 self.flagIsNewFile = 0
558 self.flagIsNewBlock = 1
558 self.flagIsNewBlock = 1
559 self.nTotalBlocks += 1
559 self.nTotalBlocks += 1
560 self.nWriteBlocks += 1
560 self.nWriteBlocks += 1
561 self.blockIndex += 1
561 self.blockIndex += 1
562
562
563
563
564 def putData(self):
564 def putData(self):
565 """
565 """
566 Setea un bloque de datos y luego los escribe en un file
566 Setea un bloque de datos y luego los escribe en un file
567
567
568 Affected:
568 Affected:
569 self.data_spc
569 self.data_spc
570 self.data_cspc
570 self.data_cspc
571 self.data_dc
571 self.data_dc
572
572
573 Return:
573 Return:
574 0 : Si no hay data o no hay mas files que puedan escribirse
574 0 : Si no hay data o no hay mas files que puedan escribirse
575 1 : Si se escribio la data de un bloque en un file
575 1 : Si se escribio la data de un bloque en un file
576 """
576 """
577 self.flagIsNewBlock = 0
577 self.flagIsNewBlock = 0
578
578
579 if self.dataOutObj.flagNoData:
579 if self.dataOutObj.flagNoData:
580 return 0
580 return 0
581
581
582 if self.dataOutObj.flagTimeBlock:
582 if self.dataOutObj.flagTimeBlock:
583 self.data_spc.fill(0)
583 self.data_spc.fill(0)
584 self.data_cspc.fill(0)
584 self.data_cspc.fill(0)
585 self.data_dc.fill(0)
585 self.data_dc.fill(0)
586 self.setNextFile()
586 self.setNextFile()
587
587
588 if self.flagIsNewFile == 0:
588 if self.flagIsNewFile == 0:
589 self.getBasicHeader()
589 self.getBasicHeader()
590
590
591 self.data_spc = self.dataOutObj.data_spc
591 self.data_spc = self.dataOutObj.data_spc
592 self.data_cspc = self.dataOutObj.data_cspc
592 self.data_cspc = self.dataOutObj.data_cspc
593 self.data_dc = self.dataOutObj.data_dc
593 self.data_dc = self.dataOutObj.data_dc
594
594
595 # #self.processingHeaderObj.dataBlocksPerFile)
595 # #self.processingHeaderObj.dataBlocksPerFile)
596 if self.hasAllDataInBuffer():
596 if self.hasAllDataInBuffer():
597 # self.getDataHeader()
597 # self.getDataHeader()
598 self.writeNextBlock()
598 self.writeNextBlock()
599
599
600 if self.flagNoMoreFiles:
600 if self.flagNoMoreFiles:
601 #print 'Process finished'
601 #print 'Process finished'
602 return 0
602 return 0
603
603
604 return 1
604 return 1
605
605
606
606
607 def __getProcessFlags(self):
607 def __getProcessFlags(self):
608
608
609 processFlags = 0
609 processFlags = 0
610
610
611 dtype0 = numpy.dtype([('real','<i1'),('imag','<i1')])
611 dtype0 = numpy.dtype([('real','<i1'),('imag','<i1')])
612 dtype1 = numpy.dtype([('real','<i2'),('imag','<i2')])
612 dtype1 = numpy.dtype([('real','<i2'),('imag','<i2')])
613 dtype2 = numpy.dtype([('real','<i4'),('imag','<i4')])
613 dtype2 = numpy.dtype([('real','<i4'),('imag','<i4')])
614 dtype3 = numpy.dtype([('real','<i8'),('imag','<i8')])
614 dtype3 = numpy.dtype([('real','<i8'),('imag','<i8')])
615 dtype4 = numpy.dtype([('real','<f4'),('imag','<f4')])
615 dtype4 = numpy.dtype([('real','<f4'),('imag','<f4')])
616 dtype5 = numpy.dtype([('real','<f8'),('imag','<f8')])
616 dtype5 = numpy.dtype([('real','<f8'),('imag','<f8')])
617
617
618 dtypeList = [dtype0, dtype1, dtype2, dtype3, dtype4, dtype5]
618 dtypeList = [dtype0, dtype1, dtype2, dtype3, dtype4, dtype5]
619
619
620
620
621
621
622 datatypeValueList = [PROCFLAG.DATATYPE_CHAR,
622 datatypeValueList = [PROCFLAG.DATATYPE_CHAR,
623 PROCFLAG.DATATYPE_SHORT,
623 PROCFLAG.DATATYPE_SHORT,
624 PROCFLAG.DATATYPE_LONG,
624 PROCFLAG.DATATYPE_LONG,
625 PROCFLAG.DATATYPE_INT64,
625 PROCFLAG.DATATYPE_INT64,
626 PROCFLAG.DATATYPE_FLOAT,
626 PROCFLAG.DATATYPE_FLOAT,
627 PROCFLAG.DATATYPE_DOUBLE]
627 PROCFLAG.DATATYPE_DOUBLE]
628
628
629
629
630 for index in range(len(dtypeList)):
630 for index in range(len(dtypeList)):
631 if self.dataOutObj.dtype == dtypeList[index]:
631 if self.dataOutObj.dtype == dtypeList[index]:
632 dtypeValue = datatypeValueList[index]
632 dtypeValue = datatypeValueList[index]
633 break
633 break
634
634
635 processFlags += dtypeValue
635 processFlags += dtypeValue
636
636
637 if self.dataOutObj.flagDecodeData:
637 if self.dataOutObj.flagDecodeData:
638 processFlags += PROCFLAG.DECODE_DATA
638 processFlags += PROCFLAG.DECODE_DATA
639
639
640 if self.dataOutObj.flagDeflipData:
640 if self.dataOutObj.flagDeflipData:
641 processFlags += PROCFLAG.DEFLIP_DATA
641 processFlags += PROCFLAG.DEFLIP_DATA
642
642
643 if self.dataOutObj.code != None:
643 if self.dataOutObj.code != None:
644 processFlags += PROCFLAG.DEFINE_PROCESS_CODE
644 processFlags += PROCFLAG.DEFINE_PROCESS_CODE
645
645
646 if self.dataOutObj.nIncohInt > 1:
646 if self.dataOutObj.nIncohInt > 1:
647 processFlags += PROCFLAG.INCOHERENT_INTEGRATION
647 processFlags += PROCFLAG.INCOHERENT_INTEGRATION
648
648
649 if self.dataOutObj.data_dc != None:
649 if self.dataOutObj.data_dc != None:
650 processFlags += PROCFLAG.SAVE_CHANNELS_DC
650 processFlags += PROCFLAG.SAVE_CHANNELS_DC
651
651
652 return processFlags
652 return processFlags
653
653
654
654
655 def __getBlockSize(self):
655 def __getBlockSize(self):
656 '''
656 '''
657 Este metodos determina el cantidad de bytes para un bloque de datos de tipo Spectra
657 Este metodos determina el cantidad de bytes para un bloque de datos de tipo Spectra
658 '''
658 '''
659
659
660 dtype0 = numpy.dtype([('real','<i1'),('imag','<i1')])
660 dtype0 = numpy.dtype([('real','<i1'),('imag','<i1')])
661 dtype1 = numpy.dtype([('real','<i2'),('imag','<i2')])
661 dtype1 = numpy.dtype([('real','<i2'),('imag','<i2')])
662 dtype2 = numpy.dtype([('real','<i4'),('imag','<i4')])
662 dtype2 = numpy.dtype([('real','<i4'),('imag','<i4')])
663 dtype3 = numpy.dtype([('real','<i8'),('imag','<i8')])
663 dtype3 = numpy.dtype([('real','<i8'),('imag','<i8')])
664 dtype4 = numpy.dtype([('real','<f4'),('imag','<f4')])
664 dtype4 = numpy.dtype([('real','<f4'),('imag','<f4')])
665 dtype5 = numpy.dtype([('real','<f8'),('imag','<f8')])
665 dtype5 = numpy.dtype([('real','<f8'),('imag','<f8')])
666
666
667 dtypeList = [dtype0, dtype1, dtype2, dtype3, dtype4, dtype5]
667 dtypeList = [dtype0, dtype1, dtype2, dtype3, dtype4, dtype5]
668 datatypeValueList = [1,2,4,8,4,8]
668 datatypeValueList = [1,2,4,8,4,8]
669 for index in range(len(dtypeList)):
669 for index in range(len(dtypeList)):
670 if self.dataOutObj.dtype == dtypeList[index]:
670 if self.dataOutObj.dtype == dtypeList[index]:
671 datatypeValue = datatypeValueList[index]
671 datatypeValue = datatypeValueList[index]
672 break
672 break
673
673
674
674
675 pts2write = self.dataOutObj.nHeights * self.dataOutObj.nFFTPoints
675 pts2write = self.dataOutObj.nHeights * self.dataOutObj.nFFTPoints
676
676
677 pts2write_SelfSpectra = int(self.nWrChannels * pts2write)
677 pts2write_SelfSpectra = int(self.nWrChannels * pts2write)
678 blocksize = (pts2write_SelfSpectra*datatypeValue)
678 blocksize = (pts2write_SelfSpectra*datatypeValue)
679
679
680 if self.dataOutObj.data_cspc != None:
680 if self.dataOutObj.data_cspc != None:
681 pts2write_CrossSpectra = int(self.nWrPairs * pts2write)
681 pts2write_CrossSpectra = int(self.nWrPairs * pts2write)
682 blocksize += (pts2write_CrossSpectra*datatypeValue*2)
682 blocksize += (pts2write_CrossSpectra*datatypeValue*2)
683
683
684 if self.dataOutObj.data_dc != None:
684 if self.dataOutObj.data_dc != None:
685 pts2write_DCchannels = int(self.nWrChannels * self.dataOutObj.nHeights)
685 pts2write_DCchannels = int(self.nWrChannels * self.dataOutObj.nHeights)
686 blocksize += (pts2write_DCchannels*datatypeValue*2)
686 blocksize += (pts2write_DCchannels*datatypeValue*2)
687
687
688 blocksize = blocksize #* datatypeValue * 2 #CORREGIR ESTO
688 blocksize = blocksize #* datatypeValue * 2 #CORREGIR ESTO
689
689
690 return blocksize
690 return blocksize
691
691
692
692
693 def getBasicHeader(self):
693 def getBasicHeader(self):
694 self.basicHeaderObj.size = self.basicHeaderSize #bytes
694 self.basicHeaderObj.size = self.basicHeaderSize #bytes
695 self.basicHeaderObj.version = self.versionFile
695 self.basicHeaderObj.version = self.versionFile
696 self.basicHeaderObj.dataBlock = self.nTotalBlocks
696 self.basicHeaderObj.dataBlock = self.nTotalBlocks
697
697
698 utc = numpy.floor(self.dataOutObj.dataUtcTime)
698 utc = numpy.floor(self.dataOutObj.dataUtcTime)
699 milisecond = (self.dataOutObj.dataUtcTime - utc)* 1000.0
699 milisecond = (self.dataOutObj.dataUtcTime - utc)* 1000.0
700
700
701 self.basicHeaderObj.utc = utc
701 self.basicHeaderObj.utc = utc
702 self.basicHeaderObj.miliSecond = milisecond
702 self.basicHeaderObj.miliSecond = milisecond
703 self.basicHeaderObj.timeZone = 0
703 self.basicHeaderObj.timeZone = 0
704 self.basicHeaderObj.dstFlag = 0
704 self.basicHeaderObj.dstFlag = 0
705 self.basicHeaderObj.errorCount = 0
705 self.basicHeaderObj.errorCount = 0
706
706
707 def getDataHeader(self):
707 def getDataHeader(self):
708
708
709 """
709 """
710 Obtiene una copia del First Header
710 Obtiene una copia del First Header
711
711
712 Affected:
712 Affected:
713 self.systemHeaderObj
713 self.systemHeaderObj
714 self.radarControllerHeaderObj
714 self.radarControllerHeaderObj
715 self.dtype
715 self.dtype
716
716
717 Return:
717 Return:
718 None
718 None
719 """
719 """
720
720
721 self.systemHeaderObj = self.dataOutObj.systemHeaderObj.copy()
721 self.systemHeaderObj = self.dataOutObj.systemHeaderObj.copy()
722 self.systemHeaderObj.nChannels = self.dataOutObj.nChannels
722 self.systemHeaderObj.nChannels = self.dataOutObj.nChannels
723 self.radarControllerHeaderObj = self.dataOutObj.radarControllerHeaderObj.copy()
723 self.radarControllerHeaderObj = self.dataOutObj.radarControllerHeaderObj.copy()
724
724
725 self.getBasicHeader()
725 self.getBasicHeader()
726
726
727 processingHeaderSize = 40 # bytes
727 processingHeaderSize = 40 # bytes
728 self.processingHeaderObj.dtype = 0 # Voltage
728 self.processingHeaderObj.dtype = 0 # Voltage
729 self.processingHeaderObj.blockSize = self.__getBlockSize()
729 self.processingHeaderObj.blockSize = self.__getBlockSize()
730 self.processingHeaderObj.profilesPerBlock = self.dataOutObj.nFFTPoints
730 self.processingHeaderObj.profilesPerBlock = self.dataOutObj.nFFTPoints
731 self.processingHeaderObj.dataBlocksPerFile = self.blocksPerFile
731 self.processingHeaderObj.dataBlocksPerFile = self.blocksPerFile
732 self.processingHeaderObj.nWindows = 1 #podria ser 1 o self.dataOutObj.processingHeaderObj.nWindows
732 self.processingHeaderObj.nWindows = 1 #podria ser 1 o self.dataOutObj.processingHeaderObj.nWindows
733 self.processingHeaderObj.processFlags = self.__getProcessFlags()
733 self.processingHeaderObj.processFlags = self.__getProcessFlags()
734 self.processingHeaderObj.nCohInt = 1# Cuando la data de origen es de tipo Spectra
734 self.processingHeaderObj.nCohInt = 1# Cuando la data de origen es de tipo Spectra
735 self.processingHeaderObj.nIncohInt = self.dataOutObj.nIncohInt
735 self.processingHeaderObj.nIncohInt = self.dataOutObj.nIncohInt
736 self.processingHeaderObj.totalSpectra = self.dataOutObj.nPairs + self.dataOutObj.nChannels
736 self.processingHeaderObj.totalSpectra = self.dataOutObj.nPairs + self.dataOutObj.nChannels
737
737
738 if self.processingHeaderObj.totalSpectra > 0:
738 if self.processingHeaderObj.totalSpectra > 0:
739 channelList = []
739 channelList = []
740 for channel in range(self.dataOutObj.nChannels):
740 for channel in range(self.dataOutObj.nChannels):
741 channelList.append(channel)
741 channelList.append(channel)
742 channelList.append(channel)
742 channelList.append(channel)
743
743
744 pairsList = []
744 pairsList = []
745 for pair in self.dataOutObj.pairsList:
745 for pair in self.dataOutObj.pairsList:
746 pairsList.append(pair[0])
746 pairsList.append(pair[0])
747 pairsList.append(pair[1])
747 pairsList.append(pair[1])
748 spectraComb = channelList + pairsList
748 spectraComb = channelList + pairsList
749 spectraComb = numpy.array(spectraComb,dtype="u1")
749 spectraComb = numpy.array(spectraComb,dtype="u1")
750 self.processingHeaderObj.spectraComb = spectraComb
750 self.processingHeaderObj.spectraComb = spectraComb
751 sizeOfSpcComb = len(spectraComb)
751 sizeOfSpcComb = len(spectraComb)
752 processingHeaderSize += sizeOfSpcComb
752 processingHeaderSize += sizeOfSpcComb
753
753
754 if self.dataOutObj.code != None:
754 if self.dataOutObj.code != None:
755 self.processingHeaderObj.code = self.dataOutObj.code
755 self.processingHeaderObj.code = self.dataOutObj.code
756 self.processingHeaderObj.nCode = self.dataOutObj.nCode
756 self.processingHeaderObj.nCode = self.dataOutObj.nCode
757 self.processingHeaderObj.nBaud = self.dataOutObj.nBaud
757 self.processingHeaderObj.nBaud = self.dataOutObj.nBaud
758 nCodeSize = 4 # bytes
758 nCodeSize = 4 # bytes
759 nBaudSize = 4 # bytes
759 nBaudSize = 4 # bytes
760 codeSize = 4 # bytes
760 codeSize = 4 # bytes
761 sizeOfCode = int(nCodeSize + nBaudSize + codeSize * self.dataOutObj.nCode * self.dataOutObj.nBaud)
761 sizeOfCode = int(nCodeSize + nBaudSize + codeSize * self.dataOutObj.nCode * self.dataOutObj.nBaud)
762 processingHeaderSize += sizeOfCode
762 processingHeaderSize += sizeOfCode
763
763
764 if self.processingHeaderObj.nWindows != 0:
764 if self.processingHeaderObj.nWindows != 0:
765 self.processingHeaderObj.firstHeight = self.dataOutObj.heightList[0]
765 self.processingHeaderObj.firstHeight = self.dataOutObj.heightList[0]
766 self.processingHeaderObj.deltaHeight = self.dataOutObj.heightList[1] - self.dataOutObj.heightList[0]
766 self.processingHeaderObj.deltaHeight = self.dataOutObj.heightList[1] - self.dataOutObj.heightList[0]
767 self.processingHeaderObj.nHeights = self.dataOutObj.nHeights
767 self.processingHeaderObj.nHeights = self.dataOutObj.nHeights
768 self.processingHeaderObj.samplesWin = self.dataOutObj.nHeights
768 self.processingHeaderObj.samplesWin = self.dataOutObj.nHeights
769 sizeOfFirstHeight = 4
769 sizeOfFirstHeight = 4
770 sizeOfdeltaHeight = 4
770 sizeOfdeltaHeight = 4
771 sizeOfnHeights = 4
771 sizeOfnHeights = 4
772 sizeOfWindows = (sizeOfFirstHeight + sizeOfdeltaHeight + sizeOfnHeights)*self.processingHeaderObj.nWindows
772 sizeOfWindows = (sizeOfFirstHeight + sizeOfdeltaHeight + sizeOfnHeights)*self.processingHeaderObj.nWindows
773 processingHeaderSize += sizeOfWindows
773 processingHeaderSize += sizeOfWindows
774
774
775 self.processingHeaderObj.size = processingHeaderSize
775 self.processingHeaderObj.size = processingHeaderSize
776
776
777 No newline at end of file
777
@@ -1,85 +1,85
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 time, datetime
8 import time, datetime
9
9
10 path = os.path.split(os.getcwd())[0]
10 path = os.path.split(os.getcwd())[0]
11 sys.path.append(path)
11 sys.path.append(path)
12
12
13
13
14 from Data.Spectra import Spectra
14 from Data.JROData import Spectra
15 from IO.SpectraIO import *
15 from IO.SpectraIO import *
16 from Processing.SpectraProcessor import *
16 from Processing.SpectraProcessor import *
17
17
18
18
19
19
20 class TestSChain:
20 class TestSChain:
21
21
22 def __init__(self):
22 def __init__(self):
23 self.setValues()
23 self.setValues()
24 self.createObjects()
24 self.createObjects()
25 self.testSChain()
25 self.testSChain()
26
26
27 def setValues(self):
27 def setValues(self):
28 # self.path = "/Users/jro/Documents/RadarData/MST_ISR/MST"
28 # self.path = "/Users/jro/Documents/RadarData/MST_ISR/MST"
29 ## self.path = "/home/roj-idl71/Data/RAWDATA/IMAGING"
29 ## self.path = "/home/roj-idl71/Data/RAWDATA/IMAGING"
30 # self.path = "/Users/danielangelsuarezmunoz/Data/EW_Drifts"
30 # self.path = "/Users/danielangelsuarezmunoz/Data/EW_Drifts"
31 # self.path = "/Users/danielangelsuarezmunoz/Data/IMAGING"
31 # self.path = "/Users/danielangelsuarezmunoz/Data/IMAGING"
32 self.path = "/home/daniel/RadarData/IMAGING"
32 self.path = "/home/daniel/RadarData/IMAGING"
33
33
34 self.startDate = datetime.date(2012,3,1)
34 self.startDate = datetime.date(2012,3,1)
35 self.endDate = datetime.date(2012,3,30)
35 self.endDate = datetime.date(2012,3,30)
36
36
37 self.startTime = datetime.time(0,0,0)
37 self.startTime = datetime.time(0,0,0)
38 self.endTime = datetime.time(14,1,1)
38 self.endTime = datetime.time(14,1,1)
39
39
40 # paramatros para Escritura de Pdata
40 # paramatros para Escritura de Pdata
41 self.wrpath = "/home/daniel/RadarData/test_wr2"
41 self.wrpath = "/home/daniel/RadarData/test_wr2"
42 self.blocksPerFile = 5
42 self.blocksPerFile = 5
43
43
44
44
45
45
46 def createObjects(self):
46 def createObjects(self):
47
47
48 self.readerObj = SpectraReader()
48 self.readerObj = SpectraReader()
49
49
50 self.specObj1 = self.readerObj.setup(
50 self.specObj1 = self.readerObj.setup(
51 path = self.path,
51 path = self.path,
52 startDate = self.startDate,
52 startDate = self.startDate,
53 endDate = self.endDate,
53 endDate = self.endDate,
54 startTime = self.startTime,
54 startTime = self.startTime,
55 endTime = self.endTime,
55 endTime = self.endTime,
56 expLabel = '',
56 expLabel = '',
57 online = 0)
57 online = 0)
58
58
59 self.specObjProc = SpectraProcessor()
59 self.specObjProc = SpectraProcessor()
60
60
61 self.specObj2 = self.specObjProc.setup(dataInObj = self.specObj1)
61 self.specObj2 = self.specObjProc.setup(dataInObj = self.specObj1)
62
62
63
63
64
64
65 def testSChain(self):
65 def testSChain(self):
66
66
67 ini = time.time()
67 ini = time.time()
68
68
69 while(True):
69 while(True):
70 self.readerObj.getData()
70 self.readerObj.getData()
71
71
72 self.specObjProc.init()
72 self.specObjProc.init()
73
73
74 self.specObjProc.writeData(self.wrpath,self.blocksPerFile)
74 self.specObjProc.writeData(self.wrpath,self.blocksPerFile)
75 #
75 #
76 if self.readerObj.flagNoMoreFiles:
76 if self.readerObj.flagNoMoreFiles:
77 break
77 break
78
78
79 if self.readerObj.flagIsNewBlock:
79 if self.readerObj.flagIsNewBlock:
80 print 'Block No %04d, Time: %s' %(self.readerObj.nTotalBlocks,
80 print 'Block No %04d, Time: %s' %(self.readerObj.nTotalBlocks,
81 datetime.datetime.fromtimestamp(self.readerObj.basicHeaderObj.utc))
81 datetime.datetime.fromtimestamp(self.readerObj.basicHeaderObj.utc))
82
82
83
83
84 if __name__ == '__main__':
84 if __name__ == '__main__':
85 TestSChain() No newline at end of file
85 TestSChain()
General Comments 0
You need to be logged in to leave comments. Login now