##// END OF EJS Templates
-Se ha cambiado la forma de calcular los segundos en tiempo local con el parametro Timezone tomado del archivo leido....
Miguel Valdez -
r344:ff2597a84a69
parent child
Show More
@@ -137,8 +137,16 class JROData:
137 137
138 138 flagTimeBlock = False
139 139
140 useLocalTime = False
141
140 142 utctime = None
141 143
144 timeZone = None
145
146 dstFlag = None
147
148 errorCount = None
149
142 150 blocksize = None
143 151
144 152 nCode = None
@@ -213,17 +221,24 class JROData:
213 221
214 222 return heis
215 223
224 def getltctime(self):
225
226 if self.useLocalTime:
227 return self.utctime - self.timeZone*60
228
229 return self.utctime
230
216 231 def getDatatime(self):
217 232
218 datatime = datetime.datetime.utcfromtimestamp(self.utctime)
233 datatime = datetime.datetime.utcfromtimestamp(self.ltctime)
219 234 return datatime
220 235
221 236 def getTimeRange(self):
222 237
223 238 datatime = []
224 239
225 datatime.append(self.utctime)
226 datatime.append(self.utctime + self.timeInterval)
240 datatime.append(self.ltctime)
241 datatime.append(self.ltctime + self.timeInterval)
227 242
228 243 datatime = numpy.array(datatime)
229 244
@@ -250,6 +265,7 class JROData:
250 265 nHeights = property(getNHeights, "I'm the 'nHeights' property.")
251 266 noise = property(getNoise, "I'm the 'nHeights' property.")
252 267 datatime = property(getDatatime, "I'm the 'datatime' property")
268 ltctime = property(getltctime, "I'm the 'ltctime' property")
253 269
254 270 class Voltage(JROData):
255 271
@@ -289,6 +305,12 class Voltage(JROData):
289 305
290 306 self.utctime = None
291 307
308 self.timeZone = None
309
310 self.dstFlag = None
311
312 self.errorCount = None
313
292 314 self.nCohInt = None
293 315
294 316 self.blocksize = None
@@ -10,13 +10,16 import time
10 10 import numpy
11 11 import fnmatch
12 12 import time, datetime
13 try:
13 14 import pyfits
15 except:
16 print "pyfits module has not been imported, it should be installed to save files in fits format"
14 17
15 18 from jrodata import *
16 19 from jroheaderIO import *
17 20 from jroprocessing import *
18 21
19 LOCALTIME = -18000
22 LOCALTIME = True #-18000
20 23
21 24 def isNumber(str):
22 25 """
@@ -328,6 +331,8 class JRODataReader(JRODataIO, ProcessingUnit):
328 331
329 332 __printInfo = True
330 333
334 profileIndex = None
335
331 336 def __init__(self):
332 337
333 338 """
@@ -921,6 +926,24 class JRODataReader(JRODataIO, ProcessingUnit):
921 926
922 927 return self.dataOut
923 928
929 def getBasicHeader(self):
930
931 self.dataOut.utctime = self.basicHeaderObj.utc + self.basicHeaderObj.miliSecond/1000. + self.profileIndex * self.ippSeconds
932
933 self.dataOut.flagTimeBlock = self.flagTimeBlock
934
935 self.dataOut.timeZone = self.basicHeaderObj.timeZone
936
937 self.dataOut.dstFlag = self.basicHeaderObj.dstFlag
938
939 self.dataOut.errorCount = self.basicHeaderObj.errorCount
940
941 self.dataOut.useLocalTime = self.basicHeaderObj.useLocalTime
942
943 def getFirstHeader(self):
944
945 raise ValueError, "This method has not been implemented"
946
924 947 def getData():
925 948
926 949 raise ValueError, "This method has not been implemented"
@@ -1011,7 +1034,23 class JRODataWriter(JRODataIO, Operation):
1011 1034 def putData(self):
1012 1035 raise ValueError, "No implemented"
1013 1036
1014 def getDataHeader(self):
1037
1038 def setBasicHeader(self):
1039
1040 self.basicHeaderObj.size = self.basicHeaderSize #bytes
1041 self.basicHeaderObj.version = self.versionFile
1042 self.basicHeaderObj.dataBlock = self.nTotalBlocks
1043
1044 utc = numpy.floor(self.dataOut.utctime)
1045 milisecond = (self.dataOut.utctime - utc)* 1000.0
1046
1047 self.basicHeaderObj.utc = utc
1048 self.basicHeaderObj.miliSecond = milisecond
1049 self.basicHeaderObj.timeZone = self.dataOut.timeZone
1050 self.basicHeaderObj.dstFlag = self.dataOut.dstFlag
1051 self.basicHeaderObj.errorCount = self.dataOut.errorCount
1052
1053 def setFirstHeader(self):
1015 1054 """
1016 1055 Obtiene una copia del First Header
1017 1056
@@ -1028,21 +1067,6 class JRODataWriter(JRODataIO, Operation):
1028 1067
1029 1068 raise ValueError, "No implemented"
1030 1069
1031 def getBasicHeader(self):
1032
1033 self.basicHeaderObj.size = self.basicHeaderSize #bytes
1034 self.basicHeaderObj.version = self.versionFile
1035 self.basicHeaderObj.dataBlock = self.nTotalBlocks
1036
1037 utc = numpy.floor(self.dataOut.utctime)
1038 milisecond = (self.dataOut.utctime - utc)* 1000.0
1039
1040 self.basicHeaderObj.utc = utc
1041 self.basicHeaderObj.miliSecond = milisecond
1042 self.basicHeaderObj.timeZone = 0
1043 self.basicHeaderObj.dstFlag = 0
1044 self.basicHeaderObj.errorCount = 0
1045
1046 1070 def __writeFirstHeader(self):
1047 1071 """
1048 1072 Escribe el primer header del file es decir el Basic header y el Long header (SystemHeader, RadarControllerHeader, ProcessingHeader)
@@ -1170,7 +1194,7 class JRODataWriter(JRODataIO, Operation):
1170 1194 self.setFile = setFile
1171 1195 self.flagIsNewFile = 1
1172 1196
1173 self.getDataHeader()
1197 self.setFirstHeader()
1174 1198
1175 1199 print 'Writing the file: %s'%self.filename
1176 1200
@@ -1441,42 +1465,7 class VoltageReader(JRODataReader):
1441 1465
1442 1466 return 1
1443 1467
1444
1445 def getData(self):
1446 """
1447 getData obtiene una unidad de datos del buffer de lectura y la copia a la clase "Voltage"
1448 con todos los parametros asociados a este (metadata). cuando no hay datos en el buffer de
1449 lectura es necesario hacer una nueva lectura de los bloques de datos usando "readNextBlock"
1450
1451 Ademas incrementa el contador del buffer en 1.
1452
1453 Return:
1454 data : retorna un perfil de voltages (alturas * canales) copiados desde el
1455 buffer. Si no hay mas archivos a leer retorna None.
1456
1457 Variables afectadas:
1458 self.dataOut
1459 self.profileIndex
1460
1461 Affected:
1462 self.dataOut
1463 self.profileIndex
1464 self.flagTimeBlock
1465 self.flagIsNewBlock
1466 """
1467
1468 if self.flagNoMoreFiles:
1469 self.dataOut.flagNoData = True
1470 print 'Process finished'
1471 return 0
1472
1473 self.flagTimeBlock = 0
1474 self.flagIsNewBlock = 0
1475
1476 if self.__hasNotDataInBuffer():
1477
1478 if not( self.readNextBlock() ):
1479 return 0
1468 def getFirstHeader(self):
1480 1469
1481 1470 self.dataOut.dtype = self.dtype
1482 1471
@@ -1488,8 +1477,6 class VoltageReader(JRODataReader):
1488 1477
1489 1478 self.dataOut.channelList = range(self.systemHeaderObj.nChannels)
1490 1479
1491 self.dataOut.flagTimeBlock = self.flagTimeBlock
1492
1493 1480 self.dataOut.ippSeconds = self.ippSeconds
1494 1481
1495 1482 self.dataOut.timeInterval = self.ippSeconds * self.processingHeaderObj.nCohInt
@@ -1516,27 +1503,55 class VoltageReader(JRODataReader):
1516 1503
1517 1504 self.dataOut.flagShiftFFT = False
1518 1505
1506 def getData(self):
1507 """
1508 getData obtiene una unidad de datos del buffer de lectura y la copia a la clase "Voltage"
1509 con todos los parametros asociados a este (metadata). cuando no hay datos en el buffer de
1510 lectura es necesario hacer una nueva lectura de los bloques de datos usando "readNextBlock"
1519 1511
1520 # self.updateDataHeader()
1512 Ademas incrementa el contador del buffer en 1.
1521 1513
1522 #data es un numpy array de 3 dmensiones (perfiles, alturas y canales)
1514 Return:
1515 data : retorna un perfil de voltages (alturas * canales) copiados desde el
1516 buffer. Si no hay mas archivos a leer retorna None.
1523 1517
1524 if self.datablock == None:
1518 Variables afectadas:
1519 self.dataOut
1520 self.profileIndex
1521
1522 Affected:
1523 self.dataOut
1524 self.profileIndex
1525 self.flagTimeBlock
1526 self.flagIsNewBlock
1527 """
1528
1529 if self.flagNoMoreFiles:
1525 1530 self.dataOut.flagNoData = True
1531 print 'Process finished'
1526 1532 return 0
1527 1533
1528 self.dataOut.data = self.datablock[:,self.profileIndex,:]
1534 self.flagTimeBlock = 0
1535 self.flagIsNewBlock = 0
1529 1536
1530 self.dataOut.utctime = self.basicHeaderObj.utc + self.basicHeaderObj.miliSecond/1000. + self.profileIndex * self.ippSeconds
1537 if self.__hasNotDataInBuffer():
1531 1538
1532 self.profileIndex += 1
1539 if not( self.readNextBlock() ):
1540 return 0
1541
1542 self.getFirstHeader()
1543
1544 if self.datablock == None:
1545 self.dataOut.flagNoData = True
1546 return 0
1547
1548 self.dataOut.data = self.datablock[:,self.profileIndex,:]
1533 1549
1534 1550 self.dataOut.flagNoData = False
1535 1551
1536 # print self.profileIndex, self.dataOut.utctime
1537 # if self.profileIndex == 800:
1538 # a=1
1552 self.getBasicHeader()
1539 1553
1554 self.profileIndex += 1
1540 1555
1541 1556 return self.dataOut.data
1542 1557
@@ -1678,7 +1693,7 class VoltageWriter(JRODataWriter):
1678 1693 self.setNextFile()
1679 1694
1680 1695 if self.profileIndex == 0:
1681 self.getBasicHeader()
1696 self.setBasicHeader()
1682 1697
1683 1698 self.datablock[:,self.profileIndex,:] = self.dataOut.data
1684 1699
@@ -1687,7 +1702,7 class VoltageWriter(JRODataWriter):
1687 1702 if self.hasAllDataInBuffer():
1688 1703 #if self.flagIsNewFile:
1689 1704 self.writeNextBlock()
1690 # self.getDataHeader()
1705 # self.setFirstHeader()
1691 1706
1692 1707 return 1
1693 1708
@@ -1759,7 +1774,7 class VoltageWriter(JRODataWriter):
1759 1774
1760 1775 return blocksize
1761 1776
1762 def getDataHeader(self):
1777 def setFirstHeader(self):
1763 1778
1764 1779 """
1765 1780 Obtiene una copia del First Header
@@ -1777,7 +1792,7 class VoltageWriter(JRODataWriter):
1777 1792 self.systemHeaderObj.nChannels = self.dataOut.nChannels
1778 1793 self.radarControllerHeaderObj = self.dataOut.radarControllerHeaderObj.copy()
1779 1794
1780 self.getBasicHeader()
1795 self.setBasicHeader()
1781 1796
1782 1797 processingHeaderSize = 40 # bytes
1783 1798 self.processingHeaderObj.dtype = 0 # Voltage
@@ -1865,7 +1880,6 class SpectraReader(JRODataReader):
1865 1880
1866 1881 rdPairList = []
1867 1882
1868
1869 1883 def __init__(self):
1870 1884 """
1871 1885 Inicializador de la clase SpectraReader para la lectura de datos de espectros.
@@ -1964,6 +1978,8 class SpectraReader(JRODataReader):
1964 1978
1965 1979 self.dataOut = self.createObjByDefault()
1966 1980
1981 self.profileIndex = 1 #Always
1982
1967 1983
1968 1984 def createObjByDefault(self):
1969 1985
@@ -2088,6 +2104,51 class SpectraReader(JRODataReader):
2088 2104
2089 2105 return 1
2090 2106
2107 def getFirstHeader(self):
2108
2109 self.dataOut.dtype = self.dtype
2110
2111 self.dataOut.nPairs = self.nRdPairs
2112
2113 self.dataOut.pairsList = self.rdPairList
2114
2115 self.dataOut.nProfiles = self.processingHeaderObj.profilesPerBlock
2116
2117 self.dataOut.nFFTPoints = self.processingHeaderObj.profilesPerBlock
2118
2119 self.dataOut.nCohInt = self.processingHeaderObj.nCohInt
2120
2121 self.dataOut.nIncohInt = self.processingHeaderObj.nIncohInt
2122
2123 xf = self.processingHeaderObj.firstHeight + self.processingHeaderObj.nHeights*self.processingHeaderObj.deltaHeight
2124
2125 self.dataOut.heightList = numpy.arange(self.processingHeaderObj.firstHeight, xf, self.processingHeaderObj.deltaHeight)
2126
2127 self.dataOut.channelList = range(self.systemHeaderObj.nChannels)
2128
2129 self.dataOut.ippSeconds = self.ippSeconds
2130
2131 self.dataOut.timeInterval = self.ippSeconds * self.processingHeaderObj.nCohInt * self.processingHeaderObj.nIncohInt * self.dataOut.nFFTPoints
2132
2133 self.dataOut.systemHeaderObj = self.systemHeaderObj.copy()
2134
2135 self.dataOut.radarControllerHeaderObj = self.radarControllerHeaderObj.copy()
2136
2137 self.dataOut.flagShiftFFT = self.processingHeaderObj.shif_fft
2138
2139 self.dataOut.flagDecodeData = False #asumo q la data no esta decodificada
2140
2141 self.dataOut.flagDeflipData = True #asumo q la data no esta sin flip
2142
2143 if self.processingHeaderObj.code != None:
2144
2145 self.dataOut.nCode = self.processingHeaderObj.nCode
2146
2147 self.dataOut.nBaud = self.processingHeaderObj.nBaud
2148
2149 self.dataOut.code = self.processingHeaderObj.code
2150
2151 self.dataOut.flagDecodeData = True
2091 2152
2092 2153 def getData(self):
2093 2154 """
@@ -2120,78 +2181,24 class SpectraReader(JRODataReader):
2120 2181 self.dataOut.flagNoData = True
2121 2182 return 0
2122 2183
2123 # self.updateDataHeader()
2124
2125 2184 #data es un numpy array de 3 dmensiones (perfiles, alturas y canales)
2126 2185
2127 2186 if self.data_dc == None:
2128 2187 self.dataOut.flagNoData = True
2129 2188 return 0
2130 2189
2190 self.getBasicHeader()
2191
2192 self.getFirstHeader()
2193
2131 2194 self.dataOut.data_spc = self.data_spc
2132 2195
2133 2196 self.dataOut.data_cspc = self.data_cspc
2134 2197
2135 2198 self.dataOut.data_dc = self.data_dc
2136 2199
2137 self.dataOut.flagTimeBlock = self.flagTimeBlock
2138
2139 2200 self.dataOut.flagNoData = False
2140 2201
2141 self.dataOut.dtype = self.dtype
2142
2143 # self.dataOut.nChannels = self.nRdChannels
2144
2145 self.dataOut.nPairs = self.nRdPairs
2146
2147 self.dataOut.pairsList = self.rdPairList
2148
2149 # self.dataOut.nHeights = self.processingHeaderObj.nHeights
2150
2151 self.dataOut.nProfiles = self.processingHeaderObj.profilesPerBlock
2152
2153 self.dataOut.nFFTPoints = self.processingHeaderObj.profilesPerBlock
2154
2155 self.dataOut.nCohInt = self.processingHeaderObj.nCohInt
2156
2157 self.dataOut.nIncohInt = self.processingHeaderObj.nIncohInt
2158
2159 xf = self.processingHeaderObj.firstHeight + self.processingHeaderObj.nHeights*self.processingHeaderObj.deltaHeight
2160
2161 self.dataOut.heightList = numpy.arange(self.processingHeaderObj.firstHeight, xf, self.processingHeaderObj.deltaHeight)
2162
2163 self.dataOut.channelList = range(self.systemHeaderObj.nChannels)
2164
2165 # self.dataOut.channelIndexList = range(self.systemHeaderObj.nChannels)
2166
2167 self.dataOut.utctime = self.basicHeaderObj.utc + self.basicHeaderObj.miliSecond/1000.#+ self.profileIndex * self.ippSeconds
2168
2169 self.dataOut.ippSeconds = self.ippSeconds
2170
2171 self.dataOut.timeInterval = self.ippSeconds * self.processingHeaderObj.nCohInt * self.processingHeaderObj.nIncohInt * self.dataOut.nFFTPoints
2172
2173 # self.profileIndex += 1
2174
2175 self.dataOut.systemHeaderObj = self.systemHeaderObj.copy()
2176
2177 self.dataOut.radarControllerHeaderObj = self.radarControllerHeaderObj.copy()
2178
2179 self.dataOut.flagShiftFFT = self.processingHeaderObj.shif_fft
2180
2181 self.dataOut.flagDecodeData = False #asumo q la data no esta decodificada
2182
2183 self.dataOut.flagDeflipData = True #asumo q la data no esta sin flip
2184
2185 if self.processingHeaderObj.code != None:
2186
2187 self.dataOut.nCode = self.processingHeaderObj.nCode
2188
2189 self.dataOut.nBaud = self.processingHeaderObj.nBaud
2190
2191 self.dataOut.code = self.processingHeaderObj.code
2192
2193 self.dataOut.flagDecodeData = True
2194
2195 2202 return self.dataOut.data_spc
2196 2203
2197 2204
@@ -2377,7 +2384,7 class SpectraWriter(JRODataWriter):
2377 2384 self.setNextFile()
2378 2385
2379 2386 if self.flagIsNewFile == 0:
2380 self.getBasicHeader()
2387 self.setBasicHeader()
2381 2388
2382 2389 self.data_spc = self.dataOut.data_spc.copy()
2383 2390 self.data_cspc = self.dataOut.data_cspc.copy()
@@ -2385,7 +2392,7 class SpectraWriter(JRODataWriter):
2385 2392
2386 2393 # #self.processingHeaderObj.dataBlocksPerFile)
2387 2394 if self.hasAllDataInBuffer():
2388 # self.getDataHeader()
2395 # self.setFirstHeader()
2389 2396 self.writeNextBlock()
2390 2397
2391 2398 return 1
@@ -2476,7 +2483,7 class SpectraWriter(JRODataWriter):
2476 2483
2477 2484 return blocksize
2478 2485
2479 def getDataHeader(self):
2486 def setFirstHeader(self):
2480 2487
2481 2488 """
2482 2489 Obtiene una copia del First Header
@@ -2494,7 +2501,7 class SpectraWriter(JRODataWriter):
2494 2501 self.systemHeaderObj.nChannels = self.dataOut.nChannels
2495 2502 self.radarControllerHeaderObj = self.dataOut.radarControllerHeaderObj.copy()
2496 2503
2497 self.getBasicHeader()
2504 self.setBasicHeader()
2498 2505
2499 2506 processingHeaderSize = 40 # bytes
2500 2507 self.processingHeaderObj.dtype = 1 # Spectra
@@ -2506,6 +2513,7 class SpectraWriter(JRODataWriter):
2506 2513 self.processingHeaderObj.nCohInt = self.dataOut.nCohInt# Se requiere para determinar el valor de timeInterval
2507 2514 self.processingHeaderObj.nIncohInt = self.dataOut.nIncohInt
2508 2515 self.processingHeaderObj.totalSpectra = self.dataOut.nPairs + self.dataOut.nChannels
2516 self.processingHeaderObj.shif_fft = self.dataOut.flagShiftFFT
2509 2517
2510 2518 if self.processingHeaderObj.totalSpectra > 0:
2511 2519 channelList = []
@@ -36,6 +36,7 class BasicHeader(Header):
36 36 version = None
37 37 dataBlock = None
38 38 utc = None
39 ltc = None
39 40 miliSecond = None
40 41 timeZone = None
41 42 dstFlag = None
@@ -45,7 +46,7 class BasicHeader(Header):
45 46
46 47 __LOCALTIME = None
47 48
48 def __init__(self, localtime=0):
49 def __init__(self, useLocalTime=True):
49 50
50 51 self.size = 0
51 52 self.version = 0
@@ -66,7 +67,7 class BasicHeader(Header):
66 67 ('nErrorCount','<u4')
67 68 ])
68 69
69 self.__LOCALTIME = localtime
70 self.useLocalTime = useLocalTime
70 71
71 72 def read(self, fp):
72 73 try:
@@ -80,9 +81,12 class BasicHeader(Header):
80 81 self.dstFlag = int(header['nDstflag'][0])
81 82 self.errorCount = int(header['nErrorCount'][0])
82 83
83 self.utc += self.__LOCALTIME
84 self.ltc = self.utc
84 85
85 self.datatime = datetime.datetime.utcfromtimestamp(self.utc)
86 if self.useLocalTime:
87 self.ltc -= self.timeZone*60
88
89 self.datatime = datetime.datetime.utcfromtimestamp(self.ltc)
86 90
87 91 except Exception, e:
88 92 print "BasicHeader: "
@@ -92,7 +96,7 class BasicHeader(Header):
92 96 return 1
93 97
94 98 def write(self, fp):
95 self.utc -= self.__LOCALTIME
99
96 100 headerTuple = (self.size,self.version,self.dataBlock,self.utc,self.miliSecond,self.timeZone,self.dstFlag,self.errorCount)
97 101 header = numpy.array(headerTuple,self.struct)
98 102 header.tofile(fp)
@@ -695,6 +695,11 class SpectraProc(ProcessingUnit):
695 695
696 696 def __updateObjFromInput(self):
697 697
698 self.dataOut.timeZone = self.dataIn.timeZone
699 self.dataOut.dstFlag = self.dataIn.dstFlag
700 self.dataOut.errorCount = self.dataIn.errorCount
701 self.dataOut.useLocalTime = self.dataIn.useLocalTime
702
698 703 self.dataOut.radarControllerHeaderObj = self.dataIn.radarControllerHeaderObj.copy()
699 704 self.dataOut.systemHeaderObj = self.dataIn.systemHeaderObj.copy()
700 705 self.dataOut.channelList = self.dataIn.channelList
@@ -759,6 +764,7 class SpectraProc(ProcessingUnit):
759 764 self.dataOut.data_cspc = cspc
760 765 self.dataOut.data_dc = dc
761 766 self.dataOut.blockSize = blocksize
767 self.dataOut.flagShiftFFT = True
762 768
763 769 def init(self, nFFTPoints=None, pairsList=None):
764 770
General Comments 0
You need to be logged in to leave comments. Login now