##// END OF EJS Templates
DATAIO.py:...
Victor Sarmiento -
r58:d07c26af67ec
parent child
Show More
@@ -3,7 +3,9 Created on 23/01/2012
3
3
4 @author $Author$
4 @author $Author$
5 @version $Id$
5 @version $Id$
6 @version $Id$
6 '''
7 '''
8
7 import os, sys
9 import os, sys
8 import glob
10 import glob
9 import time
11 import time
@@ -43,16 +45,16 def checkForRealPath(path, year, doy, set, ext):
43 filename = None
45 filename = None
44
46
45 if ext.lower() == ".r": #voltage
47 if ext.lower() == ".r": #voltage
46 str1 = "dD"
48 header1 = "dD"
47 str2 = "dD"
49 header2 = "dD"
48 elif ext.lower() == ".pdata": #spectra
50 elif ext.lower() == ".pdata": #spectra
49 str1 = "dD"
51 header1 = "dD"
50 str2 = "pP"
52 header2 = "pP"
51 else:
53 else:
52 return None, filename
54 return None, filename
53
55
54 for dir in str1: #barrido por las dos combinaciones posibles de "D"
56 for dir in header1: #barrido por las dos combinaciones posibles de "D"
55 for fil in str2: #barrido por las dos combinaciones posibles de "D"
57 for fil in header2: #barrido por las dos combinaciones posibles de "D"
56 doypath = "%s%04d%03d" % ( dir, year, doy ) #formo el nombre del directorio xYYYYDDD (x=d o x=D)
58 doypath = "%s%04d%03d" % ( dir, year, doy ) #formo el nombre del directorio xYYYYDDD (x=d o x=D)
57 filename = "%s%04d%03d%03d%s" % ( fil, year, doy, set, ext ) #formo el nombre del file xYYYYDDDSSS.ext
59 filename = "%s%04d%03d%03d%s" % ( fil, year, doy, set, ext ) #formo el nombre del file xYYYYDDDSSS.ext
58 filepath = os.path.join( path, doypath, filename ) #formo el path completo
60 filepath = os.path.join( path, doypath, filename ) #formo el path completo
@@ -123,7 +125,7 def isThisFileinRange(filename, startUTSeconds, endUTSeconds):
123 print "Skipping the file %s because it has not a valid header" %(filename)
125 print "Skipping the file %s because it has not a valid header" %(filename)
124 return 0
126 return 0
125
127
126 if not ((startUTSeconds <= m_BasicHeader.utc) and (endUTSeconds >= m_BasicHeader.utc)):
128 if not ((startUTSeconds <= m_BasicHeader.utc) and (endUTSeconds > m_BasicHeader.utc)):
127 return 0
129 return 0
128
130
129 return 1
131 return 1
@@ -146,20 +148,20 def getlastFileFromPath(path, ext):
146 fileList = os.listdir(path)
148 fileList = os.listdir(path)
147
149
148 # 0 1234 567 89A BCDE
150 # 0 1234 567 89A BCDE
149 # D YYYY DDD SSS .ext
151 # H YYYY DDD SSS .ext
150
152
151 for file in fileList:
153 for file in fileList:
152 try:
154 try:
153 year = int(file[1:5])
155 year = int(file[1:5])
154 doy = int(file[5:8])
156 doy = int(file[5:8])
157
158 if (os.path.splitext(file)[-1].upper() != ext.upper()) : continue
155 except:
159 except:
156 continue
160 continue
157
158 if (os.path.splitext(file)[-1].upper() != ext.upper()) : continue
159
161
160 validFilelist.append(file)
162 validFilelist.append(file)
161
163
162 if len(validFilelist) > 0:
164 if validFilelist:
163 validFilelist = sorted( validFilelist, key=str.lower )
165 validFilelist = sorted( validFilelist, key=str.lower )
164 return validFilelist[-1]
166 return validFilelist[-1]
165
167
@@ -185,14 +187,19 class JRODataReader(DataReader):
185 contiene todos lo metodos necesarios para leer datos desde archivos en formato
187 contiene todos lo metodos necesarios para leer datos desde archivos en formato
186 jicamarca o pdata (.r o .pdata). La lectura de los datos siempre se realiza por bloques. Los datos
188 jicamarca o pdata (.r o .pdata). La lectura de los datos siempre se realiza por bloques. Los datos
187 leidos son array de 3 dimensiones:
189 leidos son array de 3 dimensiones:
188 perfiles*alturas*canales
190
191 Voltajes - perfiles * alturas * canales
192
193 Spectra - pares * alturas * perfiles (Self Spectra)
194 canales * alturas * perfiles (Cross Spectra)
195 canales * alturas (DC Channels)
189
196
190 y son almacenados en la variable "datablock".
197 y son almacenados en su buffer respectivo.
191
198
192 Esta clase contiene instancias (objetos) de las clases BasicHeader, SystemHeader,
199 Esta clase contiene instancias (objetos) de las clases BasicHeader, SystemHeader,
193 RadarControllerHeader y DataObj. Los tres primeros se usan para almacenar informacion de la
200 RadarControllerHeader y DataObj. Los tres primeros se usan para almacenar informacion de la
194 cabecera de datos (metadata), y el cuarto (DataObj) para obtener y almacenar los datos desde
201 cabecera de datos (metadata), y el cuarto (DataObj) para obtener y almacenar los datos desde
195 el "datablock" cada vez que se ejecute el metodo "getData".
202 el buffer cada vez que se ejecute el metodo "getData".
196 """
203 """
197
204
198 m_BasicHeader = BasicHeader()
205 m_BasicHeader = BasicHeader()
@@ -203,24 +210,14 class JRODataReader(DataReader):
203
210
204 m_ProcessingHeader = ProcessingHeader()
211 m_ProcessingHeader = ProcessingHeader()
205
212
206 m_DataObj = None
207
208 online = 0
213 online = 0
209
214
210 startDateTime = None
211
212 endDateTime = None
213
214 fp = None
215 fp = None
215
216
216 fileSizeByHeader = None
217 fileSizeByHeader = None
217
218
218 pathList = []
219
220 filenameList = []
219 filenameList = []
221
220
222 fileIndex = None
223
224 filename = None
221 filename = None
225
222
226 fileSize = None
223 fileSize = None
@@ -231,18 +228,9 class JRODataReader(DataReader):
231
228
232 dataType = None
229 dataType = None
233
230
234 blocksize = 0
231 maxTimeStep = 30
235
232
236 datablock = None
233 flagNoMoreFiles = 0
237
238 datablockIndex = None
239
240 pts2read = 0
241
242 #Parametros para el procesamiento en linea
243 year = 0
244
245 doy = 0
246
234
247 set = 0
235 set = 0
248
236
@@ -250,50 +238,31 class JRODataReader(DataReader):
250
238
251 path = None
239 path = None
252
240
253 optchar = None
254
255 delay = 7 #seconds
241 delay = 7 #seconds
256
242
257 nTries = 3 #quantity tries
243 nTries = 3 #quantity tries
258
244
259 nFiles = 3 #number of files for searching
245 nFiles = 3 #number of files for searching
260
246
261 pts2read = 0
262
263 blocksize = 0
264
265 utc = 0
266
267 nBlocks = 0
247 nBlocks = 0
268
248
249 flagIsNewFile = 1
250
251 ippSeconds = 0
252
253 flagResetProcessing = 0
254
255 flagIsNewBlock = 0
256
257 nReadBlocks = 0
258
259 blocksize = 0
260
261 datablockIndex = 9999
262
269 #speed of light
263 #speed of light
270 c = 3E8
264 c = 3E8
271
265
272 def __init__(self, m_DataObj=None):
273 """
274 Inicializador de la clase JRODataReader para la lectura de datos.
275
276 Input:
277 m_DataObj : Objeto de la clase JROData. Este objeto sera utilizado para
278 almacenar un perfil de datos cada vez que se haga un requerimiento
279 (getData). El perfil sera obtenido a partir del buffer de datos,
280 si el buffer esta vacio se hara un nuevo proceso de lectura de un
281 bloque de datos.
282 Si este parametro no es pasado se creara uno internamente.
283
284 Variables afectadas:
285 self.m_DataObj
286 self.m_BasicHeader
287 self.m_SystemHeader
288 self.m_RadarControllerHeader
289 self.m_ProcessingHeader
290
291 Return:
292 None
293 """
294
295 raise ValueError, "This class can't be instanced"
296
297
266
298 def __rdSystemHeader(self, fp=None):
267 def __rdSystemHeader(self, fp=None):
299
268
@@ -324,6 +293,7 class JRODataReader(DataReader):
324
293
325 self.m_BasicHeader.read(fp)
294 self.m_BasicHeader.read(fp)
326
295
296
327 def __readFirstHeader(self):
297 def __readFirstHeader(self):
328 """
298 """
329 Lectura del First Header, es decir el Basic Header y el Long Header
299 Lectura del First Header, es decir el Basic Header y el Long Header
@@ -338,10 +308,6 class JRODataReader(DataReader):
338 self.dataType
308 self.dataType
339 self.fileSizeByHeader
309 self.fileSizeByHeader
340 self.ippSeconds
310 self.ippSeconds
341 self.nChannels
342 self.nPairs
343 self.pts2read_SelfSpectra
344 self.pts2read_CrossSpectra
345
311
346 Return:
312 Return:
347 None
313 None
@@ -385,6 +351,7 class JRODataReader(DataReader):
385
351
386 self.getBlockDimension()
352 self.getBlockDimension()
387
353
354
388 def __setNextFileOnline(self):
355 def __setNextFileOnline(self):
389 """
356 """
390 Busca el siguiente file que tenga suficiente data para ser leida, dentro de un folder especifico, si
357 Busca el siguiente file que tenga suficiente data para ser leida, dentro de un folder especifico, si
@@ -411,7 +378,6 class JRODataReader(DataReader):
411
378
412 notFirstTime_flag = False
379 notFirstTime_flag = False
413 fileOk_flag = False
380 fileOk_flag = False
414 changeDir_flag = False
415 self.flagIsNewFile = 0
381 self.flagIsNewFile = 0
416
382
417 while( True ): #este loop permite llevar la cuenta de intentos, de files y carpetas,
383 while( True ): #este loop permite llevar la cuenta de intentos, de files y carpetas,
@@ -426,64 +392,39 class JRODataReader(DataReader):
426 if countFiles > self.nFiles: #si no encuentro el file buscado cambio de carpeta y busco en la siguiente carpeta
392 if countFiles > self.nFiles: #si no encuentro el file buscado cambio de carpeta y busco en la siguiente carpeta
427 self.set = 0
393 self.set = 0
428 self.doy += 1
394 self.doy += 1
429 changeDir_flag = True
395
430
431 file = None
396 file = None
432 filename = None
397 filename = None
433 fileOk_flag = False
398 fileOk_flag = False
434
399
435 #busca el 1er file disponible
400 #busca el 1er file disponible
436 file, filename = checkForRealPath( self.path, self.year, self.doy, self.set, self.ext )
401 file, filename = checkForRealPath( self.path, self.year, self.doy, self.set, self.ext )
402 if file:
403 if self.__verifyFile(file, False):
404 fileOk_flag = True
437
405
438 if file == None:
406 if not(fileOk_flag):
439 if notFirstTime_flag: #si no es la primera vez que busca el file entonces no espera y busca for el siguiente file
407 if notFirstTime_flag: #si no es la primera vez que busca el file entonces no espera y busca for el siguiente file
440 print "\tsearching next \"%s\" file ..." % ( filename )
408 print "\tSearching next \"%s\" file ..." % ( filename )
441 continue
409 continue
442 else: #si es la primera vez que busca el file entonces espera self.nTries veces hasta encontrarlo o no
410 else: #si es la primera vez que busca el file entonces espera self.nTries veces hasta encontrarlo o no
443 for nTries in range( self.nTries ):
411 for nTries in range( self.nTries ):
444 print "\twaiting new \"%s\" file, try %03d ..." % ( filename, nTries+1 )
412 print "\tWaiting %0.2f sec for new \"%s\" file, try %03d ..." % ( self.delay, filename, nTries+1 )
445 time.sleep( self.delay )
413 time.sleep( self.delay )
446
414
447 file, filename = checkForRealPath( self.path, self.year, self.doy, self.set, self.ext )
415 file, filename = checkForRealPath( self.path, self.year, self.doy, self.set, self.ext )
448 if file != None:
416 if file:
449 fileOk_flag = True
417 if self.__verifyFile(file):
450 break
418 fileOk_flag = True
419 break
451
420
452 if not( fileOk_flag ): #no encontro ningun file valido a leer despues de haber esperado alguno
421 if not( fileOk_flag ): #no encontro ningun file valido a leer despues de haber esperado alguno
453 notFirstTime_flag = True
422 notFirstTime_flag = True
454 continue
423 continue
455
424
456 #una vez que se obtuvo el 1er file valido se procede a checkear si si tamanho es suficiente para empezar a leerlo
425 if fileOk_flag:
457 currentSize = os.path.getsize( file )
458 neededSize = self.m_ProcessingHeader.blockSize + self.firstHeaderSize
459
460 #si el tamanho es suficiente entonces deja de buscar
461 if currentSize > neededSize:
462 fileOk_flag = True
463 break
426 break
464
465 fileOk_flag = False
466 #si el file no tiene el tamanho necesario se espera una cierta cantidad de tiempo
467 #por una cierta cantidad de veces hasta que el contenido del file sea valido
468 if changeDir_flag: #si al buscar un file cambie de directorio ya no espero y sigo con el siguiente file
469 print "\tsearching next \"%s\" file ..." % filename
470 changeDir_flag = False
471 continue
472
473 for nTries in range( self.nTries ):
474 print "\twaiting for the First Header block of \"%s\" file, try %03d ..." % ( filename, nTries+1 )
475 time.sleep( self.delay )
476
427
477 currentSize = os.path.getsize( file )
478 neededSize = self.m_ProcessingHeader.blockSize + self.firstHeaderSize
479
480 if currentSize > neededSize:
481 fileOk_flag = True
482 break
483
484 if fileOk_flag: #si encontro un file valido sale del bucle y deja de buscar
485 break
486
487 print "Skipping the file \"%s\" due to this files is empty" % filename
428 print "Skipping the file \"%s\" due to this files is empty" % filename
488 countFiles = 0
429 countFiles = 0
489
430
@@ -493,13 +434,13 class JRODataReader(DataReader):
493 self.flagIsNewFile = 1
434 self.flagIsNewFile = 1
494 if self.fp != None: self.fp.close()
435 if self.fp != None: self.fp.close()
495 self.fp = open(file)
436 self.fp = open(file)
496 self.noMoreFiles = 0
437 self.flagNoMoreFiles = 0
497 print 'Setting the file: %s' % file
438 print 'Setting the file: %s' % file
498 else:
439 else:
499 self.fileSize = 0
440 self.fileSize = 0
500 self.filename = None
441 self.filename = None
501 self.fp = None
442 self.fp = None
502 self.noMoreFiles = 1
443 self.flagNoMoreFiles = 1
503 print 'No more Files'
444 print 'No more Files'
504
445
505 return fileOk_flag
446 return fileOk_flag
@@ -561,7 +502,7 class JRODataReader(DataReader):
561 return 1
502 return 1
562
503
563
504
564 def __setNextFile( self ):
505 def setNextFile(self):
565 """
506 """
566 Determina el siguiente file a leer y si hay uno disponible lee el First Header
507 Determina el siguiente file a leer y si hay uno disponible lee el First Header
567
508
@@ -584,7 +525,7 class JRODataReader(DataReader):
584 else:
525 else:
585 newFile = self.__setNextFileOffline()
526 newFile = self.__setNextFileOffline()
586
527
587 if self.noMoreFiles:
528 if self.flagNoMoreFiles:
588 sys.exit(0)
529 sys.exit(0)
589
530
590 if not(newFile):
531 if not(newFile):
@@ -629,7 +570,7 class JRODataReader(DataReader):
629 fpointer = self.fp.tell()
570 fpointer = self.fp.tell()
630 self.fp.close()
571 self.fp.close()
631
572
632 print "\tWaiting for the next block, try %03d ..." % (nTries+1)
573 print "\tWaiting %0.2f sec for the next block, try %03d ..." % (self.delay, nTries+1)
633 time.sleep( self.delay )
574 time.sleep( self.delay )
634
575
635 self.fp = open( self.filename, 'rb' )
576 self.fp = open( self.filename, 'rb' )
@@ -640,11 +581,11 class JRODataReader(DataReader):
640 neededSize = self.m_ProcessingHeader.blockSize + self.basicHeaderSize
581 neededSize = self.m_ProcessingHeader.blockSize + self.basicHeaderSize
641
582
642 if ( currentSize >= neededSize ):
583 if ( currentSize >= neededSize ):
643 self.rdBasicHeader()
584 self.__rdBasicHeader()
644 return 1
585 return 1
645
586
646 #Setting new file
587 #Setting new file
647 if not( self.__setNextFile() ):
588 if not( self.setNextFile() ):
648 return 0
589 return 0
649
590
650 deltaTime = self.m_BasicHeader.utc - self.lastUTTime # check this
591 deltaTime = self.m_BasicHeader.utc - self.lastUTTime # check this
@@ -656,17 +597,9 class JRODataReader(DataReader):
656 #self.nReadBlocks = 0
597 #self.nReadBlocks = 0
657
598
658 return 1
599 return 1
659
660 def getBlockDimension(self):
661
662 raise ValueError, "No implemented"
663
664 def hasNotDataInBuffer(self):
665
666 raise ValueError, "Not implemented"
667
668
600
669 def __searchFilesOnLine( self, path, startDateTime=None, endDateTime=None, expLabel = "", ext = ".pdata" ):
601
602 def __searchFilesOnLine(self, path, startDateTime=None, endDateTime=None, expLabel = "", ext = None):
670 """
603 """
671 Busca el ultimo archivo de la ultima carpeta (determinada o no por startDateTime) y
604 Busca el ultimo archivo de la ultima carpeta (determinada o no por startDateTime) y
672 devuelve el archivo encontrado ademas de otros datos.
605 devuelve el archivo encontrado ademas de otros datos.
@@ -684,13 +617,19 class JRODataReader(DataReader):
684 directory : eL directorio donde esta el file encontrado
617 directory : eL directorio donde esta el file encontrado
685 """
618 """
686
619
687 print "Searching files ..."
620 pathList = os.listdir(path)
688
621
622 if not(pathList):
623 return None, None, None, None, None
624
689 dirList = []
625 dirList = []
690 for thisPath in os.listdir(path):
626 for thisPath in os.listdir(path):
691 if os.path.isdir(os.path.join(path,thisPath)):
627 if os.path.isdir(os.path.join(path,thisPath)):
692 dirList.append(thisPath)
628 dirList.append(thisPath)
693
629
630 if not(dirList):
631 return None, None, None, None, None
632
694 pathList = dirList
633 pathList = dirList
695
634
696 if startDateTime != None:
635 if startDateTime != None:
@@ -709,34 +648,20 class JRODataReader(DataReader):
709
648
710 pathList.append(os.path.join(path,match[0], expLabel))
649 pathList.append(os.path.join(path,match[0], expLabel))
711 thisDateTime += datetime.timedelta(1)
650 thisDateTime += datetime.timedelta(1)
712
713
651
652 if not(pathList):
653 return None, None, None, None, None
654
714 directory = pathList[-1]
655 directory = pathList[-1]
715
656
716 if directory == None:
657 filename = getlastFileFromPath(directory, ext)
717 return 0, 0, 0, None, None
658
718
659 if not(filename):
719
720 nTries = 0
721 while True:
722 if nTries >= self.nTries:
723 break
724 filename = getlastFileFromPath(directory, ext )
725
726 if filename != None:
727 break
728
729 print "Waiting %d seconds for the first file with extension (%s) on %s..." %(self.delay, ext, directory)
730 time.sleep(self.delay)
731 nTries += 1
732
733 if filename == None:
734 return None, None, None, None, None
660 return None, None, None, None, None
735
661
736 if not(self.__verifyFile(os.path.join(directory, filename))):
662 if not(self.__verifyFile(os.path.join(directory, filename))):
737 print "The file %s hasn't enough data" % filename
738 return None, None, None, None, None
663 return None, None, None, None, None
739
664
740 year = int( filename[1:5] )
665 year = int( filename[1:5] )
741 doy = int( filename[5:8] )
666 doy = int( filename[5:8] )
742 set = int( filename[8:11] )
667 set = int( filename[8:11] )
@@ -799,6 +724,9 class JRODataReader(DataReader):
799 if os.path.isdir(os.path.join(path,thisPath)):
724 if os.path.isdir(os.path.join(path,thisPath)):
800 dirList.append(thisPath)
725 dirList.append(thisPath)
801
726
727 if not(dirList):
728 return None, None
729
802 pathList = []
730 pathList = []
803
731
804 thisDateTime = startDateTime
732 thisDateTime = startDateTime
@@ -827,50 +755,49 class JRODataReader(DataReader):
827 if isThisFileinRange(filename, startUtSeconds, endUtSeconds):
755 if isThisFileinRange(filename, startUtSeconds, endUtSeconds):
828 filenameList.append(filename)
756 filenameList.append(filename)
829
757
758 if not(filenameList):
759 return None, None
760
830 self.filenameList = filenameList
761 self.filenameList = filenameList
831
762
832 return pathList, filenameList
763 return pathList, filenameList
833
764
834
765
835 def __verifyFile( self, filename ):
766 def __verifyFile(self, filename, msgFlag=True):
836 """
767 """
837 Verifica que el filename tenga data valida, para ello leo el 1er bloque
768 Verifica que el filename tenga data valida, para ello leo el FirstHeader del file
838 del file, si no es un file valido espera una cierta cantidad de tiempo a que
839 lo sea, si transcurrido el tiempo no logra validar el file entonces el metodo
840 devuelve 0 caso contrario devuelve 1
841
769
842 Affected:
843 m_BasicHeader
844
845 Return:
770 Return:
846 0 : file no valido para ser leido
771 0 : file no valido para ser leido
847 1 : file valido para ser leido
772 1 : file valido para ser leido
848 """
773 """
849 m_BasicHeader = BasicHeader()
774 m_BasicHeader = BasicHeader()
775 m_SystemHeader = SystemHeader()
776 m_RadarControllerHeader = RadarControllerHeader()
777 m_ProcessingHeader = ProcessingHeader()
778 flagFileOK = False
850
779
851 for nTries in range( self.nTries+1 ):
780 try:
852 try:
781 fp = open( filename,'rb' ) #lectura binaria
853 fp = open( filename,'rb' ) #lectura binaria
782 except:
854 except:
783 if msgFlag:
855 raise IOError, "The file %s can't be opened" % (filename)
784 print "The file %s can't be opened" % (filename)
856
785
857 try:
786 try:
858 m_BasicHeader.read(fp)
787 m_BasicHeader.read(fp)
859 except:
788 m_SystemHeader.read(fp)
860 print "The file %s is empty" % filename
789 m_RadarControllerHeader.read(fp)
861
790 m_ProcessingHeader.read(fp)
862 fp.close()
791 data_type = int(numpy.log2((m_ProcessingHeader.processFlags & PROCFLAG.DATATYPE_MASK))-numpy.log2(PROCFLAG.DATATYPE_CHAR))
863
792 if m_BasicHeader.size > self.basicHeaderSize:
864 if m_BasicHeader.size > 24:
793 flagFileOK = True
865 break
794 except:
866
795 if msgFlag:
867 if nTries >= self.nTries: #si ya espero la cantidad de veces necesarias entonces ya no vuelve a esperar
796 print "The file %s is empty or it hasn't enough data" % filename
868 break
797
869
798 fp.close()
870 print '\twaiting for new block of file %s: try %02d' % ( filename, nTries )
799
871 time.sleep( self.delay )
800 if not(flagFileOK):
872
873 if m_BasicHeader.size <= 24:
874 return 0
801 return 0
875
802
876 return 1
803 return 1
@@ -878,7 +805,7 class JRODataReader(DataReader):
878
805
879 def setup(self, path, startDateTime, endDateTime=None, set=0, expLabel = "", ext = None, online = 0):
806 def setup(self, path, startDateTime, endDateTime=None, set=0, expLabel = "", ext = None, online = 0):
880 """
807 """
881 setup configura los parametros de lectura de la clase VoltageReader.
808 setup configura los parametros de lectura de la clase DataReader.
882
809
883 Si el modo de lectura es offline, primero se realiza una busqueda de todos los archivos
810 Si el modo de lectura es offline, primero se realiza una busqueda de todos los archivos
884 que coincidan con los parametros especificados; esta lista de archivos son almacenados en
811 que coincidan con los parametros especificados; esta lista de archivos son almacenados en
@@ -924,10 +851,19 class JRODataReader(DataReader):
924 ext = self.ext
851 ext = self.ext
925
852
926 if online:
853 if online:
927
854 print "Searching files ..."
928 doypath, file, year, doy, set = self.__searchFilesOnLine(path, startDateTime, endDateTime, expLabel, ext)
855 doypath, file, year, doy, set = self.__searchFilesOnLine(path, startDateTime, endDateTime, expLabel, ext)
856
857 if not(doypath):
858 for nTries in range( self.nTries ):
859 print '\twaiting %0.2f sec for valid file in %s: try %02d ...' % (self.delay, path, nTries+1)
860 time.sleep( self.delay )
861 doypath, file, year, doy, set = self.__searchFilesOnLine(path, startDateTime, endDateTime, expLabel, ext)
862 if doypath:
863 break
929
864
930 if doypath == None:
865 if not(doypath):
866 print "There 'isn't valied files in %s" % path
931 return 0
867 return 0
932
868
933 self.year = year
869 self.year = year
@@ -935,8 +871,12 class JRODataReader(DataReader):
935 self.set = set - 1
871 self.set = set - 1
936 self.path = path
872 self.path = path
937
873
938 else:
874 else: # offline
939 pathList, filenameList = self.__searchFilesOffLine(path, startDateTime, endDateTime, set, expLabel, ext)
875 pathList, filenameList = self.__searchFilesOffLine(path, startDateTime, endDateTime, set, expLabel, ext)
876 if not(pathList):
877 print "No files in range: %s - %s" %(startDateTime.ctime(), endDateTime.ctime())
878 return 0
879
940 self.fileIndex = -1
880 self.fileIndex = -1
941 self.pathList = pathList
881 self.pathList = pathList
942 self.filenameList = filenameList
882 self.filenameList = filenameList
@@ -946,7 +886,7 class JRODataReader(DataReader):
946
886
947 ext = ext.lower()
887 ext = ext.lower()
948
888
949 if not( self.__setNextFile() ):
889 if not( self.setNextFile() ):
950 if (startDateTime != None) and (endDateTime != None):
890 if (startDateTime != None) and (endDateTime != None):
951 print "No files in range: %s - %s" %(startDateTime.ctime(), endDateTime.ctime())
891 print "No files in range: %s - %s" %(startDateTime.ctime(), endDateTime.ctime())
952 elif startDateTime != None:
892 elif startDateTime != None:
@@ -975,7 +915,7 class JRODataReader(DataReader):
975 return 1
915 return 1
976
916
977
917
978 def readNextBlock( self ):
918 def readNextBlock(self):
979 """
919 """
980 Establece un nuevo bloque de datos a leer y los lee, si es que no existiese
920 Establece un nuevo bloque de datos a leer y los lee, si es que no existiese
981 mas bloques disponibles en el archivo actual salta al siguiente.
921 mas bloques disponibles en el archivo actual salta al siguiente.
@@ -988,117 +928,34 class JRODataReader(DataReader):
988 if not(self.__setNewBlock()):
928 if not(self.__setNewBlock()):
989 return 0
929 return 0
990
930
991 self.readBlock()
931 if not(self.readBlock()):
932 return 0
992
933
993 self.lastUTTime = self.m_BasicHeader.utc
934 self.lastUTTime = self.m_BasicHeader.utc
994
935
995 return 1
936 return 1
996
937
997 def readBlock(self):
998
999 raise ValueError, "This method has not been implemented"
1000
1001 def getData( self ):
1002 """
1003 getData obtiene una unidad de datos del buffer de lectura y la copia a la clase "Voltage"
1004 con todos los parametros asociados a este (metadata). cuando no hay datos en el buffer de
1005 lectura es necesario hacer una nueva lectura de los bloques de datos usando "readNextBlock"
1006
1007 Ademas incrementa el contador del buffer en 1.
1008
1009 Return:
1010 data : retorna un perfil de voltages (alturas * canales) copiados desde el
1011 buffer. Si no hay mas archivos a leer retorna None.
1012
1013 Variables afectadas:
1014 self.m_DataObj
1015 self.datablockIndex
1016
1017 Affected:
1018 self.m_DataObj
1019 self.datablockIndex
1020 self.flagNoContinuousBlock
1021 self.flagNewBlock
1022 """
1023
1024 raise ValueError, "This method has not been implemented"
1025
1026
938
1027 class JRODataWriter(DataWriter):
939 class JRODataWriter(DataWriter):
940
1028 """
941 """
1029 Esta clase permite escribir datos a archivos procesados (.r o ,pdata). La escritura
942 Esta clase permite escribir datos a archivos procesados (.r o ,pdata). La escritura
1030 de los datos siempre se realiza por bloques.
943 de los datos siempre se realiza por bloques.
1031 """
944 """
1032
1033 def __init__(self):
1034 """
1035 Inicializador de la clase VoltageWriter para la escritura de datos de espectros.
1036
1037 Affected:
1038 self.m_DataObj
1039 self.m_BasicHeader
1040 self.m_SystemHeader
1041 self.m_RadarControllerHeader
1042 self.m_ProcessingHeader
1043
945
1044 Return: None
946 fp = None
1045 """
1046 if m_Voltage == None:
1047 m_Voltage = Voltage()
1048
1049 self.m_DataObj = m_Voltage
1050
1051 self.path = None
1052
1053 self.fp = None
1054
1055 self.format = None
1056
947
1057 self.blocksCounter = 0
948 blocksCounter = 0
1058
1059 self.setFile = None
1060
1061 self.flagIsNewFile = 1
1062
1063 self.dataType = None
1064
1065 self.datablock = None
1066
1067 self.datablockIndex = 0
1068
1069 self.ext = None
1070
1071 self.shapeBuffer = None
1072
1073 self.shape_spc_Buffer = None
1074
1075 self.shape_cspc_Buffer = None
1076
1077 self.shape_dc_Buffer = None
1078
1079 self.nWriteBlocks = 0
1080
1081 self.flagIsNewBlock = 0
1082
1083 self.noMoreFiles = 0
1084
1085 self.filename = None
1086
1087 self.m_BasicHeader= BasicHeader()
1088
949
1089 self.m_SystemHeader = SystemHeader()
950 flagIsNewFile = 1
1090
951
1091 self.m_RadarControllerHeader = RadarControllerHeader()
952 nWriteBlocks = 0
1092
953
1093 self.m_ProcessingHeader = ProcessingHeader()
954 flagIsNewBlock = 0
1094
955
1095 self.data_spc = None
956 flagNoMoreFiles = 0
1096
1097 self.data_cspc = None
1098
1099 self.data_dc = None
1100
1101
957
958
1102 def __writeFirstHeader(self):
959 def __writeFirstHeader(self):
1103 """
960 """
1104 Escribe el primer header del file es decir el Basic header y el Long header (SystemHeader, RadarControllerHeader, ProcessingHeader)
961 Escribe el primer header del file es decir el Basic header y el Long header (SystemHeader, RadarControllerHeader, ProcessingHeader)
@@ -1126,7 +983,7 class JRODataWriter(DataWriter):
1126 if fp == None:
983 if fp == None:
1127 fp = self.fp
984 fp = self.fp
1128
985
1129 self.m_BasicHeader.write(fp)
986 self.m_DataObj.m_BasicHeader.write(fp)
1130
987
1131
988
1132 def __wrSystemHeader(self, fp=None):
989 def __wrSystemHeader(self, fp=None):
@@ -1139,7 +996,7 class JRODataWriter(DataWriter):
1139 if fp == None:
996 if fp == None:
1140 fp = self.fp
997 fp = self.fp
1141
998
1142 self.m_SystemHeader.write(fp)
999 self.m_DataObj.m_SystemHeader.write(fp)
1143
1000
1144
1001
1145 def __wrRadarControllerHeader(self, fp=None):
1002 def __wrRadarControllerHeader(self, fp=None):
@@ -1152,7 +1009,7 class JRODataWriter(DataWriter):
1152 if fp == None:
1009 if fp == None:
1153 fp = self.fp
1010 fp = self.fp
1154
1011
1155 self.m_RadarControllerHeader.write(fp)
1012 self.m_DataObj.m_RadarControllerHeader.write(fp)
1156
1013
1157
1014
1158 def __wrProcessingHeader(self, fp=None):
1015 def __wrProcessingHeader(self, fp=None):
@@ -1165,10 +1022,10 class JRODataWriter(DataWriter):
1165 if fp == None:
1022 if fp == None:
1166 fp = self.fp
1023 fp = self.fp
1167
1024
1168 self.m_ProcessingHeader.write(fp)
1025 self.m_DataObj.m_ProcessingHeader.write(fp)
1169
1026
1170
1027
1171 def __setNextFile(self):
1028 def setNextFile(self):
1172 """
1029 """
1173 Determina el siguiente file que sera escrito
1030 Determina el siguiente file que sera escrito
1174
1031
@@ -1189,7 +1046,7 class JRODataWriter(DataWriter):
1189 if self.fp != None:
1046 if self.fp != None:
1190 self.fp.close()
1047 self.fp.close()
1191
1048
1192 timeTuple = time.localtime( self.m_DataObj.m_BasicHeader.utc ) # utc from m_Voltage
1049 timeTuple = time.localtime( self.m_DataObj.m_BasicHeader.utc )
1193 subfolder = 'D%4.4d%3.3d' % (timeTuple.tm_year,timeTuple.tm_yday)
1050 subfolder = 'D%4.4d%3.3d' % (timeTuple.tm_year,timeTuple.tm_yday)
1194
1051
1195 tmp = os.path.join( path, subfolder )
1052 tmp = os.path.join( path, subfolder )
@@ -1203,7 +1060,7 class JRODataWriter(DataWriter):
1203 filen = filesList[-1]
1060 filen = filesList[-1]
1204 # el filename debera tener el siguiente formato
1061 # el filename debera tener el siguiente formato
1205 # 0 1234 567 89A BCDE (hex)
1062 # 0 1234 567 89A BCDE (hex)
1206 # D YYYY DDD SSS .ext
1063 # x YYYY DDD SSS .ext
1207 if isNumber( filen[8:11] ):
1064 if isNumber( filen[8:11] ):
1208 self.setFile = int( filen[8:11] ) #inicializo mi contador de seteo al seteo del ultimo file
1065 self.setFile = int( filen[8:11] ) #inicializo mi contador de seteo al seteo del ultimo file
1209 else:
1066 else:
@@ -1249,7 +1106,7 class JRODataWriter(DataWriter):
1249 1 : Si escribio el Basic el First Header
1106 1 : Si escribio el Basic el First Header
1250 """
1107 """
1251 if self.fp == None:
1108 if self.fp == None:
1252 self.__setNextFile()
1109 self.setNextFile()
1253
1110
1254 if self.flagIsNewFile:
1111 if self.flagIsNewFile:
1255 return 1
1112 return 1
@@ -1258,7 +1115,7 class JRODataWriter(DataWriter):
1258 self.__writeBasicHeader()
1115 self.__writeBasicHeader()
1259 return 1
1116 return 1
1260
1117
1261 if not( self.__setNextFile() ):
1118 if not( self.setNextFile() ):
1262 return 0
1119 return 0
1263
1120
1264 return 1
1121 return 1
@@ -1278,6 +1135,7 class JRODataWriter(DataWriter):
1278 self.writeBlock()
1135 self.writeBlock()
1279
1136
1280 return 1
1137 return 1
1138
1281
1139
1282 def getHeader(self):
1140 def getHeader(self):
1283 """
1141 """
@@ -1299,6 +1157,7 class JRODataWriter(DataWriter):
1299 self.m_ProcessingHeader = self.m_DataObj.m_ProcessingHeader.copy()
1157 self.m_ProcessingHeader = self.m_DataObj.m_ProcessingHeader.copy()
1300 self.dataType = self.m_DataObj.dataType
1158 self.dataType = self.m_DataObj.dataType
1301
1159
1160
1302 def setup(self, path, set=0, ext=None):
1161 def setup(self, path, set=0, ext=None):
1303 """
1162 """
1304 Setea el tipo de formato en la cual sera guardada la data y escribe el First Header
1163 Setea el tipo de formato en la cual sera guardada la data y escribe el First Header
@@ -1321,40 +1180,13 class JRODataWriter(DataWriter):
1321 self.path = path
1180 self.path = path
1322 self.setFile = set - 1
1181 self.setFile = set - 1
1323 self.ext = ext
1182 self.ext = ext
1324 self.format = format
1183 #self.format = format
1325 self.getHeader()
1184 self.getHeader()
1326
1185
1327 self.setBlockDimension()
1186 self.setBlockDimension()
1328
1187
1329 if not( self.__setNextFile() ):
1188 if not( self.setNextFile() ):
1330 print "There isn't a next file"
1189 print "There isn't a next file"
1331 return 0
1190 return 0
1332
1191
1333 return 1
1192 return 1
1334
1335 def hasAllDataInBuffer(self):
1336
1337 raise ValueError, "Not implemented"
1338
1339 def setBlockDimension(self):
1340
1341 raise ValueError, "Not implemented"
1342
1343 def writeBlock(self):
1344
1345 raise ValueError, "No implemented"
1346
1347 def putData(self):
1348 """
1349 Setea un bloque de datos y luego los escribe en un file
1350
1351 Affected:
1352 self.flagIsNewBlock
1353 self.datablockIndex
1354
1355 Return:
1356 0 : Si no hay data o no hay mas files que puedan escribirse
1357 1 : Si se escribio la data de un bloque en un file
1358 """
1359
1360 raise ValueError, "No implemented" No newline at end of file
General Comments 0
You need to be logged in to leave comments. Login now