##// END OF EJS Templates
actualización hdf5, reemplazo .value por [()] en kamisr
joabAM -
r1421:9ecadbbaf80a
parent child
Show More
@@ -1,660 +1,660
1 ''''
1 ''''
2 Created on Set 9, 2015
2 Created on Set 9, 2015
3
3
4 @author: roj-idl71 Karim Kuyeng
4 @author: roj-idl71 Karim Kuyeng
5
5
6 @update: 2021, Joab Apaza
6 @update: 2021, Joab Apaza
7 '''
7 '''
8
8
9 import os
9 import os
10 import sys
10 import sys
11 import glob
11 import glob
12 import fnmatch
12 import fnmatch
13 import datetime
13 import datetime
14 import time
14 import time
15 import re
15 import re
16 import h5py
16 import h5py
17 import numpy
17 import numpy
18
18
19 try:
19 try:
20 from gevent import sleep
20 from gevent import sleep
21 except:
21 except:
22 from time import sleep
22 from time import sleep
23
23
24 from schainpy.model.data.jroheaderIO import RadarControllerHeader, SystemHeader
24 from schainpy.model.data.jroheaderIO import RadarControllerHeader, SystemHeader
25 from schainpy.model.data.jrodata import Voltage
25 from schainpy.model.data.jrodata import Voltage
26 from schainpy.model.proc.jroproc_base import ProcessingUnit, Operation, MPDecorator
26 from schainpy.model.proc.jroproc_base import ProcessingUnit, Operation, MPDecorator
27 from numpy import imag
27 from numpy import imag
28
28
29
29
30 class AMISRReader(ProcessingUnit):
30 class AMISRReader(ProcessingUnit):
31 '''
31 '''
32 classdocs
32 classdocs
33 '''
33 '''
34
34
35 def __init__(self):
35 def __init__(self):
36 '''
36 '''
37 Constructor
37 Constructor
38 '''
38 '''
39
39
40 ProcessingUnit.__init__(self)
40 ProcessingUnit.__init__(self)
41
41
42 self.set = None
42 self.set = None
43 self.subset = None
43 self.subset = None
44 self.extension_file = '.h5'
44 self.extension_file = '.h5'
45 self.dtc_str = 'dtc'
45 self.dtc_str = 'dtc'
46 self.dtc_id = 0
46 self.dtc_id = 0
47 self.status = True
47 self.status = True
48 self.isConfig = False
48 self.isConfig = False
49 self.dirnameList = []
49 self.dirnameList = []
50 self.filenameList = []
50 self.filenameList = []
51 self.fileIndex = None
51 self.fileIndex = None
52 self.flagNoMoreFiles = False
52 self.flagNoMoreFiles = False
53 self.flagIsNewFile = 0
53 self.flagIsNewFile = 0
54 self.filename = ''
54 self.filename = ''
55 self.amisrFilePointer = None
55 self.amisrFilePointer = None
56 self.realBeamCode = []
56 self.realBeamCode = []
57 self.beamCodeMap = None
57 self.beamCodeMap = None
58 self.azimuthList = []
58 self.azimuthList = []
59 self.elevationList = []
59 self.elevationList = []
60 self.dataShape = None
60 self.dataShape = None
61 self.flag_old_beams = False
61 self.flag_old_beams = False
62
62
63
63
64 self.profileIndex = 0
64 self.profileIndex = 0
65
65
66
66
67 self.beamCodeByFrame = None
67 self.beamCodeByFrame = None
68 self.radacTimeByFrame = None
68 self.radacTimeByFrame = None
69
69
70 self.dataset = None
70 self.dataset = None
71
71
72 self.__firstFile = True
72 self.__firstFile = True
73
73
74 self.buffer = None
74 self.buffer = None
75
75
76 self.timezone = 'ut'
76 self.timezone = 'ut'
77
77
78 self.__waitForNewFile = 20
78 self.__waitForNewFile = 20
79 self.__filename_online = None
79 self.__filename_online = None
80 #Is really necessary create the output object in the initializer
80 #Is really necessary create the output object in the initializer
81 self.dataOut = Voltage()
81 self.dataOut = Voltage()
82 self.dataOut.error=False
82 self.dataOut.error=False
83
83
84
84
85 def setup(self,path=None,
85 def setup(self,path=None,
86 startDate=None,
86 startDate=None,
87 endDate=None,
87 endDate=None,
88 startTime=None,
88 startTime=None,
89 endTime=None,
89 endTime=None,
90 walk=True,
90 walk=True,
91 timezone='ut',
91 timezone='ut',
92 all=0,
92 all=0,
93 code = None,
93 code = None,
94 nCode = 0,
94 nCode = 0,
95 nBaud = 0,
95 nBaud = 0,
96 online=False
96 online=False,
97 old_beams=False):
97 old_beams=False):
98
98
99
99
100
100
101 self.timezone = timezone
101 self.timezone = timezone
102 self.all = all
102 self.all = all
103 self.online = online
103 self.online = online
104 self.flag_old_beams = old_beams
104 self.flag_old_beams = old_beams
105 self.code = code
105 self.code = code
106 self.nCode = int(nCode)
106 self.nCode = int(nCode)
107 self.nBaud = int(nBaud)
107 self.nBaud = int(nBaud)
108
108
109
109
110
110
111 #self.findFiles()
111 #self.findFiles()
112 if not(online):
112 if not(online):
113 #Busqueda de archivos offline
113 #Busqueda de archivos offline
114 self.searchFilesOffLine(path, startDate, endDate, startTime, endTime, walk)
114 self.searchFilesOffLine(path, startDate, endDate, startTime, endTime, walk)
115 else:
115 else:
116 self.searchFilesOnLine(path, startDate, endDate, startTime,endTime,walk)
116 self.searchFilesOnLine(path, startDate, endDate, startTime,endTime,walk)
117
117
118 if not(self.filenameList):
118 if not(self.filenameList):
119 raise schainpy.admin.SchainWarning("There is no files into the folder: %s"%(path))
119 raise schainpy.admin.SchainWarning("There is no files into the folder: %s"%(path))
120 sys.exit()
120 sys.exit()
121
121
122 self.fileIndex = 0
122 self.fileIndex = 0
123
123
124 self.readNextFile(online)
124 self.readNextFile(online)
125
125
126 '''
126 '''
127 Add code
127 Add code
128 '''
128 '''
129 self.isConfig = True
129 self.isConfig = True
130 # print("Setup Done")
130 # print("Setup Done")
131 pass
131 pass
132
132
133
133
134 def readAMISRHeader(self,fp):
134 def readAMISRHeader(self,fp):
135
135
136 if self.isConfig and (not self.flagNoMoreFiles):
136 if self.isConfig and (not self.flagNoMoreFiles):
137 newShape = fp.get('Raw11/Data/Samples/Data').shape[1:]
137 newShape = fp.get('Raw11/Data/Samples/Data').shape[1:]
138 if self.dataShape != newShape and newShape != None:
138 if self.dataShape != newShape and newShape != None:
139 raise schainpy.admin.SchainError("NEW FILE HAS A DIFFERENT SHAPE: ")
139 raise schainpy.admin.SchainError("NEW FILE HAS A DIFFERENT SHAPE: ")
140 print(self.dataShape,newShape,"\n")
140 print(self.dataShape,newShape,"\n")
141 return 0
141 return 0
142 else:
142 else:
143 self.dataShape = fp.get('Raw11/Data/Samples/Data').shape[1:]
143 self.dataShape = fp.get('Raw11/Data/Samples/Data').shape[1:]
144
144
145
145
146 header = 'Raw11/Data/RadacHeader'
146 header = 'Raw11/Data/RadacHeader'
147 self.beamCodeByPulse = fp.get(header+'/BeamCode') # LIST OF BEAMS PER PROFILE, TO BE USED ON REARRANGE
147 self.beamCodeByPulse = fp.get(header+'/BeamCode') # LIST OF BEAMS PER PROFILE, TO BE USED ON REARRANGE
148 if (self.startDate> datetime.date(2021, 7, 15)) or self.flag_old_beams: #Se cambió la forma de extracción de Apuntes el 17 o forzar con flag de reorganización
148 if (self.startDate> datetime.date(2021, 7, 15)) or self.flag_old_beams: #Se cambió la forma de extracción de Apuntes el 17 o forzar con flag de reorganización
149 self.beamcodeFile = fp['Setup/Beamcodefile'][()].decode()
149 self.beamcodeFile = fp['Setup/Beamcodefile'][()].decode()
150 self.trueBeams = self.beamcodeFile.split("\n")
150 self.trueBeams = self.beamcodeFile.split("\n")
151 self.trueBeams.pop()#remove last
151 self.trueBeams.pop()#remove last
152 [self.realBeamCode.append(x) for x in self.trueBeams if x not in self.realBeamCode]
152 [self.realBeamCode.append(x) for x in self.trueBeams if x not in self.realBeamCode]
153 self.beamCode = [int(x, 16) for x in self.realBeamCode]
153 self.beamCode = [int(x, 16) for x in self.realBeamCode]
154 else:
154 else:
155 _beamCode= fp.get('Raw11/Data/Beamcodes') #se usa la manera previa al cambio de apuntes
155 _beamCode= fp.get('Raw11/Data/Beamcodes') #se usa la manera previa al cambio de apuntes
156 self.beamCode = _beamCode[0,:]
156 self.beamCode = _beamCode[0,:]
157
157
158 if self.beamCodeMap == None:
158 if self.beamCodeMap == None:
159 self.beamCodeMap = fp['Setup/BeamcodeMap']
159 self.beamCodeMap = fp['Setup/BeamcodeMap']
160 for beam in self.beamCode:
160 for beam in self.beamCode:
161 beamAziElev = numpy.where(self.beamCodeMap[:,0]==beam)
161 beamAziElev = numpy.where(self.beamCodeMap[:,0]==beam)
162 beamAziElev = beamAziElev[0].squeeze()
162 beamAziElev = beamAziElev[0].squeeze()
163 self.azimuthList.append(self.beamCodeMap[beamAziElev,1])
163 self.azimuthList.append(self.beamCodeMap[beamAziElev,1])
164 self.elevationList.append(self.beamCodeMap[beamAziElev,2])
164 self.elevationList.append(self.beamCodeMap[beamAziElev,2])
165 #print("Beamssss: ",self.beamCodeMap[beamAziElev,1],self.beamCodeMap[beamAziElev,2])
165 #print("Beamssss: ",self.beamCodeMap[beamAziElev,1],self.beamCodeMap[beamAziElev,2])
166 #print(self.beamCode)
166 #print(self.beamCode)
167 #self.code = fp.get(header+'/Code') # NOT USE FOR THIS
167 #self.code = fp.get(header+'/Code') # NOT USE FOR THIS
168 self.frameCount = fp.get(header+'/FrameCount')# NOT USE FOR THIS
168 self.frameCount = fp.get(header+'/FrameCount')# NOT USE FOR THIS
169 self.modeGroup = fp.get(header+'/ModeGroup')# NOT USE FOR THIS
169 self.modeGroup = fp.get(header+'/ModeGroup')# NOT USE FOR THIS
170 self.nsamplesPulse = fp.get(header+'/NSamplesPulse')# TO GET NSA OR USING DATA FOR THAT
170 self.nsamplesPulse = fp.get(header+'/NSamplesPulse')# TO GET NSA OR USING DATA FOR THAT
171 self.pulseCount = fp.get(header+'/PulseCount')# NOT USE FOR THIS
171 self.pulseCount = fp.get(header+'/PulseCount')# NOT USE FOR THIS
172 self.radacTime = fp.get(header+'/RadacTime')# 1st TIME ON FILE ANDE CALCULATE THE REST WITH IPP*nindexprofile
172 self.radacTime = fp.get(header+'/RadacTime')# 1st TIME ON FILE ANDE CALCULATE THE REST WITH IPP*nindexprofile
173 self.timeCount = fp.get(header+'/TimeCount')# NOT USE FOR THIS
173 self.timeCount = fp.get(header+'/TimeCount')# NOT USE FOR THIS
174 self.timeStatus = fp.get(header+'/TimeStatus')# NOT USE FOR THIS
174 self.timeStatus = fp.get(header+'/TimeStatus')# NOT USE FOR THIS
175 self.rangeFromFile = fp.get('Raw11/Data/Samples/Range')
175 self.rangeFromFile = fp.get('Raw11/Data/Samples/Range')
176 self.frequency = fp.get('Rx/Frequency')
176 self.frequency = fp.get('Rx/Frequency')
177 txAus = fp.get('Raw11/Data/Pulsewidth')
177 txAus = fp.get('Raw11/Data/Pulsewidth')
178
178
179
179
180 self.nblocks = self.pulseCount.shape[0] #nblocks
180 self.nblocks = self.pulseCount.shape[0] #nblocks
181
181
182 self.nprofiles = self.pulseCount.shape[1] #nprofile
182 self.nprofiles = self.pulseCount.shape[1] #nprofile
183 self.nsa = self.nsamplesPulse[0,0] #ngates
183 self.nsa = self.nsamplesPulse[0,0] #ngates
184 self.nchannels = len(self.beamCode)
184 self.nchannels = len(self.beamCode)
185 self.ippSeconds = (self.radacTime[0][1] -self.radacTime[0][0]) #Ipp in seconds
185 self.ippSeconds = (self.radacTime[0][1] -self.radacTime[0][0]) #Ipp in seconds
186 #self.__waitForNewFile = self.nblocks # wait depending on the number of blocks since each block is 1 sec
186 #self.__waitForNewFile = self.nblocks # wait depending on the number of blocks since each block is 1 sec
187 self.__waitForNewFile = self.nblocks * self.nprofiles * self.ippSeconds # wait until new file is created
187 self.__waitForNewFile = self.nblocks * self.nprofiles * self.ippSeconds # wait until new file is created
188
188
189 #filling radar controller header parameters
189 #filling radar controller header parameters
190 self.__ippKm = self.ippSeconds *.15*1e6 # in km
190 self.__ippKm = self.ippSeconds *.15*1e6 # in km
191 self.__txA = (txAus.value)*.15 #(ipp[us]*.15km/1us) in km
191 self.__txA = (txAus[()])*.15 #(ipp[us]*.15km/1us) in km
192 self.__txB = 0
192 self.__txB = 0
193 nWindows=1
193 nWindows=1
194 self.__nSamples = self.nsa
194 self.__nSamples = self.nsa
195 self.__firstHeight = self.rangeFromFile[0][0]/1000 #in km
195 self.__firstHeight = self.rangeFromFile[0][0]/1000 #in km
196 self.__deltaHeight = (self.rangeFromFile[0][1] - self.rangeFromFile[0][0])/1000
196 self.__deltaHeight = (self.rangeFromFile[0][1] - self.rangeFromFile[0][0])/1000
197
197
198 #for now until understand why the code saved is different (code included even though code not in tuf file)
198 #for now until understand why the code saved is different (code included even though code not in tuf file)
199 #self.__codeType = 0
199 #self.__codeType = 0
200 # self.__nCode = None
200 # self.__nCode = None
201 # self.__nBaud = None
201 # self.__nBaud = None
202 self.__code = self.code
202 self.__code = self.code
203 self.__codeType = 0
203 self.__codeType = 0
204 if self.code != None:
204 if self.code != None:
205 self.__codeType = 1
205 self.__codeType = 1
206 self.__nCode = self.nCode
206 self.__nCode = self.nCode
207 self.__nBaud = self.nBaud
207 self.__nBaud = self.nBaud
208 #self.__code = 0
208 #self.__code = 0
209
209
210 #filling system header parameters
210 #filling system header parameters
211 self.__nSamples = self.nsa
211 self.__nSamples = self.nsa
212 self.newProfiles = self.nprofiles/self.nchannels
212 self.newProfiles = self.nprofiles/self.nchannels
213 self.__channelList = list(range(self.nchannels))
213 self.__channelList = list(range(self.nchannels))
214
214
215 self.__frequency = self.frequency[0][0]
215 self.__frequency = self.frequency[0][0]
216
216
217
217
218 return 1
218 return 1
219
219
220
220
221 def createBuffers(self):
221 def createBuffers(self):
222
222
223 pass
223 pass
224
224
225 def __setParameters(self,path='', startDate='',endDate='',startTime='', endTime='', walk=''):
225 def __setParameters(self,path='', startDate='',endDate='',startTime='', endTime='', walk=''):
226 self.path = path
226 self.path = path
227 self.startDate = startDate
227 self.startDate = startDate
228 self.endDate = endDate
228 self.endDate = endDate
229 self.startTime = startTime
229 self.startTime = startTime
230 self.endTime = endTime
230 self.endTime = endTime
231 self.walk = walk
231 self.walk = walk
232
232
233 def __checkPath(self):
233 def __checkPath(self):
234 if os.path.exists(self.path):
234 if os.path.exists(self.path):
235 self.status = 1
235 self.status = 1
236 else:
236 else:
237 self.status = 0
237 self.status = 0
238 print('Path:%s does not exists'%self.path)
238 print('Path:%s does not exists'%self.path)
239
239
240 return
240 return
241
241
242
242
243 def __selDates(self, amisr_dirname_format):
243 def __selDates(self, amisr_dirname_format):
244 try:
244 try:
245 year = int(amisr_dirname_format[0:4])
245 year = int(amisr_dirname_format[0:4])
246 month = int(amisr_dirname_format[4:6])
246 month = int(amisr_dirname_format[4:6])
247 dom = int(amisr_dirname_format[6:8])
247 dom = int(amisr_dirname_format[6:8])
248 thisDate = datetime.date(year,month,dom)
248 thisDate = datetime.date(year,month,dom)
249 #margen de un día extra, igual luego se filtra for fecha y hora
249 #margen de un día extra, igual luego se filtra for fecha y hora
250 if (thisDate>=(self.startDate - datetime.timedelta(days=1)) and thisDate <= (self.endDate)+ datetime.timedelta(days=1)):
250 if (thisDate>=(self.startDate - datetime.timedelta(days=1)) and thisDate <= (self.endDate)+ datetime.timedelta(days=1)):
251 return amisr_dirname_format
251 return amisr_dirname_format
252 except:
252 except:
253 return None
253 return None
254
254
255
255
256 def __findDataForDates(self,online=False):
256 def __findDataForDates(self,online=False):
257
257
258 if not(self.status):
258 if not(self.status):
259 return None
259 return None
260
260
261 pat = '\d+.\d+'
261 pat = '\d+.\d+'
262 dirnameList = [re.search(pat,x) for x in os.listdir(self.path)]
262 dirnameList = [re.search(pat,x) for x in os.listdir(self.path)]
263 dirnameList = [x for x in dirnameList if x!=None]
263 dirnameList = [x for x in dirnameList if x!=None]
264 dirnameList = [x.string for x in dirnameList]
264 dirnameList = [x.string for x in dirnameList]
265 if not(online):
265 if not(online):
266 dirnameList = [self.__selDates(x) for x in dirnameList]
266 dirnameList = [self.__selDates(x) for x in dirnameList]
267 dirnameList = [x for x in dirnameList if x!=None]
267 dirnameList = [x for x in dirnameList if x!=None]
268 if len(dirnameList)>0:
268 if len(dirnameList)>0:
269 self.status = 1
269 self.status = 1
270 self.dirnameList = dirnameList
270 self.dirnameList = dirnameList
271 self.dirnameList.sort()
271 self.dirnameList.sort()
272 else:
272 else:
273 self.status = 0
273 self.status = 0
274 return None
274 return None
275
275
276 def __getTimeFromData(self):
276 def __getTimeFromData(self):
277 startDateTime_Reader = datetime.datetime.combine(self.startDate,self.startTime)
277 startDateTime_Reader = datetime.datetime.combine(self.startDate,self.startTime)
278 endDateTime_Reader = datetime.datetime.combine(self.endDate,self.endTime)
278 endDateTime_Reader = datetime.datetime.combine(self.endDate,self.endTime)
279
279
280 print('Filtering Files from %s to %s'%(startDateTime_Reader, endDateTime_Reader))
280 print('Filtering Files from %s to %s'%(startDateTime_Reader, endDateTime_Reader))
281 print('........................................')
281 print('........................................')
282 filter_filenameList = []
282 filter_filenameList = []
283 self.filenameList.sort()
283 self.filenameList.sort()
284 #for i in range(len(self.filenameList)-1):
284 #for i in range(len(self.filenameList)-1):
285 for i in range(len(self.filenameList)):
285 for i in range(len(self.filenameList)):
286 filename = self.filenameList[i]
286 filename = self.filenameList[i]
287 fp = h5py.File(filename,'r')
287 fp = h5py.File(filename,'r')
288 time_str = fp.get('Time/RadacTimeString')
288 time_str = fp.get('Time/RadacTimeString')
289
289
290 startDateTimeStr_File = time_str[0][0].decode('UTF-8').split('.')[0]
290 startDateTimeStr_File = time_str[0][0].decode('UTF-8').split('.')[0]
291 #startDateTimeStr_File = "2019-12-16 09:21:11"
291 #startDateTimeStr_File = "2019-12-16 09:21:11"
292 junk = time.strptime(startDateTimeStr_File, '%Y-%m-%d %H:%M:%S')
292 junk = time.strptime(startDateTimeStr_File, '%Y-%m-%d %H:%M:%S')
293 startDateTime_File = datetime.datetime(junk.tm_year,junk.tm_mon,junk.tm_mday,junk.tm_hour, junk.tm_min, junk.tm_sec)
293 startDateTime_File = datetime.datetime(junk.tm_year,junk.tm_mon,junk.tm_mday,junk.tm_hour, junk.tm_min, junk.tm_sec)
294
294
295 #endDateTimeStr_File = "2019-12-16 11:10:11"
295 #endDateTimeStr_File = "2019-12-16 11:10:11"
296 endDateTimeStr_File = time_str[-1][-1].decode('UTF-8').split('.')[0]
296 endDateTimeStr_File = time_str[-1][-1].decode('UTF-8').split('.')[0]
297 junk = time.strptime(endDateTimeStr_File, '%Y-%m-%d %H:%M:%S')
297 junk = time.strptime(endDateTimeStr_File, '%Y-%m-%d %H:%M:%S')
298 endDateTime_File = datetime.datetime(junk.tm_year,junk.tm_mon,junk.tm_mday,junk.tm_hour, junk.tm_min, junk.tm_sec)
298 endDateTime_File = datetime.datetime(junk.tm_year,junk.tm_mon,junk.tm_mday,junk.tm_hour, junk.tm_min, junk.tm_sec)
299
299
300 fp.close()
300 fp.close()
301
301
302 #print("check time", startDateTime_File)
302 #print("check time", startDateTime_File)
303 if self.timezone == 'lt':
303 if self.timezone == 'lt':
304 startDateTime_File = startDateTime_File - datetime.timedelta(minutes = 300)
304 startDateTime_File = startDateTime_File - datetime.timedelta(minutes = 300)
305 endDateTime_File = endDateTime_File - datetime.timedelta(minutes = 300)
305 endDateTime_File = endDateTime_File - datetime.timedelta(minutes = 300)
306 if (startDateTime_File >=startDateTime_Reader and endDateTime_File<=endDateTime_Reader):
306 if (startDateTime_File >=startDateTime_Reader and endDateTime_File<=endDateTime_Reader):
307 filter_filenameList.append(filename)
307 filter_filenameList.append(filename)
308
308
309 if (startDateTime_File>endDateTime_Reader):
309 if (startDateTime_File>endDateTime_Reader):
310 break
310 break
311
311
312
312
313 filter_filenameList.sort()
313 filter_filenameList.sort()
314 self.filenameList = filter_filenameList
314 self.filenameList = filter_filenameList
315
315
316 return 1
316 return 1
317
317
318 def __filterByGlob1(self, dirName):
318 def __filterByGlob1(self, dirName):
319 filter_files = glob.glob1(dirName, '*.*%s'%self.extension_file)
319 filter_files = glob.glob1(dirName, '*.*%s'%self.extension_file)
320 filter_files.sort()
320 filter_files.sort()
321 filterDict = {}
321 filterDict = {}
322 filterDict.setdefault(dirName)
322 filterDict.setdefault(dirName)
323 filterDict[dirName] = filter_files
323 filterDict[dirName] = filter_files
324 return filterDict
324 return filterDict
325
325
326 def __getFilenameList(self, fileListInKeys, dirList):
326 def __getFilenameList(self, fileListInKeys, dirList):
327 for value in fileListInKeys:
327 for value in fileListInKeys:
328 dirName = list(value.keys())[0]
328 dirName = list(value.keys())[0]
329 for file in value[dirName]:
329 for file in value[dirName]:
330 filename = os.path.join(dirName, file)
330 filename = os.path.join(dirName, file)
331 self.filenameList.append(filename)
331 self.filenameList.append(filename)
332
332
333
333
334 def __selectDataForTimes(self, online=False):
334 def __selectDataForTimes(self, online=False):
335 #aun no esta implementado el filtro for tiempo
335 #aun no esta implementado el filtro for tiempo
336 if not(self.status):
336 if not(self.status):
337 return None
337 return None
338
338
339 dirList = [os.path.join(self.path,x) for x in self.dirnameList]
339 dirList = [os.path.join(self.path,x) for x in self.dirnameList]
340 fileListInKeys = [self.__filterByGlob1(x) for x in dirList]
340 fileListInKeys = [self.__filterByGlob1(x) for x in dirList]
341 self.__getFilenameList(fileListInKeys, dirList)
341 self.__getFilenameList(fileListInKeys, dirList)
342 if not(online):
342 if not(online):
343 #filtro por tiempo
343 #filtro por tiempo
344 if not(self.all):
344 if not(self.all):
345 self.__getTimeFromData()
345 self.__getTimeFromData()
346
346
347 if len(self.filenameList)>0:
347 if len(self.filenameList)>0:
348 self.status = 1
348 self.status = 1
349 self.filenameList.sort()
349 self.filenameList.sort()
350 else:
350 else:
351 self.status = 0
351 self.status = 0
352 return None
352 return None
353
353
354 else:
354 else:
355 #get the last file - 1
355 #get the last file - 1
356 self.filenameList = [self.filenameList[-2]]
356 self.filenameList = [self.filenameList[-2]]
357 new_dirnameList = []
357 new_dirnameList = []
358 for dirname in self.dirnameList:
358 for dirname in self.dirnameList:
359 junk = numpy.array([dirname in x for x in self.filenameList])
359 junk = numpy.array([dirname in x for x in self.filenameList])
360 junk_sum = junk.sum()
360 junk_sum = junk.sum()
361 if junk_sum > 0:
361 if junk_sum > 0:
362 new_dirnameList.append(dirname)
362 new_dirnameList.append(dirname)
363 self.dirnameList = new_dirnameList
363 self.dirnameList = new_dirnameList
364 return 1
364 return 1
365
365
366 def searchFilesOnLine(self, path, startDate, endDate, startTime=datetime.time(0,0,0),
366 def searchFilesOnLine(self, path, startDate, endDate, startTime=datetime.time(0,0,0),
367 endTime=datetime.time(23,59,59),walk=True):
367 endTime=datetime.time(23,59,59),walk=True):
368
368
369 if endDate ==None:
369 if endDate ==None:
370 startDate = datetime.datetime.utcnow().date()
370 startDate = datetime.datetime.utcnow().date()
371 endDate = datetime.datetime.utcnow().date()
371 endDate = datetime.datetime.utcnow().date()
372
372
373 self.__setParameters(path=path, startDate=startDate, endDate=endDate,startTime = startTime,endTime=endTime, walk=walk)
373 self.__setParameters(path=path, startDate=startDate, endDate=endDate,startTime = startTime,endTime=endTime, walk=walk)
374
374
375 self.__checkPath()
375 self.__checkPath()
376
376
377 self.__findDataForDates(online=True)
377 self.__findDataForDates(online=True)
378
378
379 self.dirnameList = [self.dirnameList[-1]]
379 self.dirnameList = [self.dirnameList[-1]]
380
380
381 self.__selectDataForTimes(online=True)
381 self.__selectDataForTimes(online=True)
382
382
383 return
383 return
384
384
385
385
386 def searchFilesOffLine(self,
386 def searchFilesOffLine(self,
387 path,
387 path,
388 startDate,
388 startDate,
389 endDate,
389 endDate,
390 startTime=datetime.time(0,0,0),
390 startTime=datetime.time(0,0,0),
391 endTime=datetime.time(23,59,59),
391 endTime=datetime.time(23,59,59),
392 walk=True):
392 walk=True):
393
393
394 self.__setParameters(path, startDate, endDate, startTime, endTime, walk)
394 self.__setParameters(path, startDate, endDate, startTime, endTime, walk)
395
395
396 self.__checkPath()
396 self.__checkPath()
397
397
398 self.__findDataForDates()
398 self.__findDataForDates()
399
399
400 self.__selectDataForTimes()
400 self.__selectDataForTimes()
401
401
402 for i in range(len(self.filenameList)):
402 for i in range(len(self.filenameList)):
403 print("%s" %(self.filenameList[i]))
403 print("%s" %(self.filenameList[i]))
404
404
405 return
405 return
406
406
407 def __setNextFileOffline(self):
407 def __setNextFileOffline(self):
408
408
409 try:
409 try:
410 self.filename = self.filenameList[self.fileIndex]
410 self.filename = self.filenameList[self.fileIndex]
411 self.amisrFilePointer = h5py.File(self.filename,'r')
411 self.amisrFilePointer = h5py.File(self.filename,'r')
412 self.fileIndex += 1
412 self.fileIndex += 1
413 except:
413 except:
414 self.flagNoMoreFiles = 1
414 self.flagNoMoreFiles = 1
415 raise schainpy.admin.SchainError('No more files to read')
415 raise schainpy.admin.SchainError('No more files to read')
416 return 0
416 return 0
417
417
418 self.flagIsNewFile = 1
418 self.flagIsNewFile = 1
419 print("Setting the file: %s"%self.filename)
419 print("Setting the file: %s"%self.filename)
420
420
421 return 1
421 return 1
422
422
423
423
424 def __setNextFileOnline(self):
424 def __setNextFileOnline(self):
425 filename = self.filenameList[0]
425 filename = self.filenameList[0]
426 if self.__filename_online != None:
426 if self.__filename_online != None:
427 self.__selectDataForTimes(online=True)
427 self.__selectDataForTimes(online=True)
428 filename = self.filenameList[0]
428 filename = self.filenameList[0]
429 wait = 0
429 wait = 0
430 self.__waitForNewFile=300 ## DEBUG:
430 self.__waitForNewFile=300 ## DEBUG:
431 while self.__filename_online == filename:
431 while self.__filename_online == filename:
432 print('waiting %d seconds to get a new file...'%(self.__waitForNewFile))
432 print('waiting %d seconds to get a new file...'%(self.__waitForNewFile))
433 if wait == 5:
433 if wait == 5:
434 self.flagNoMoreFiles = 1
434 self.flagNoMoreFiles = 1
435 return 0
435 return 0
436 sleep(self.__waitForNewFile)
436 sleep(self.__waitForNewFile)
437 self.__selectDataForTimes(online=True)
437 self.__selectDataForTimes(online=True)
438 filename = self.filenameList[0]
438 filename = self.filenameList[0]
439 wait += 1
439 wait += 1
440
440
441 self.__filename_online = filename
441 self.__filename_online = filename
442
442
443 self.amisrFilePointer = h5py.File(filename,'r')
443 self.amisrFilePointer = h5py.File(filename,'r')
444 self.flagIsNewFile = 1
444 self.flagIsNewFile = 1
445 self.filename = filename
445 self.filename = filename
446 print("Setting the file: %s"%self.filename)
446 print("Setting the file: %s"%self.filename)
447 return 1
447 return 1
448
448
449
449
450 def readData(self):
450 def readData(self):
451 buffer = self.amisrFilePointer.get('Raw11/Data/Samples/Data')
451 buffer = self.amisrFilePointer.get('Raw11/Data/Samples/Data')
452 re = buffer[:,:,:,0]
452 re = buffer[:,:,:,0]
453 im = buffer[:,:,:,1]
453 im = buffer[:,:,:,1]
454 dataset = re + im*1j
454 dataset = re + im*1j
455
455
456 self.radacTime = self.amisrFilePointer.get('Raw11/Data/RadacHeader/RadacTime')
456 self.radacTime = self.amisrFilePointer.get('Raw11/Data/RadacHeader/RadacTime')
457 timeset = self.radacTime[:,0]
457 timeset = self.radacTime[:,0]
458
458
459 return dataset,timeset
459 return dataset,timeset
460
460
461 def reshapeData(self):
461 def reshapeData(self):
462 #self.beamCodeByPulse, self.beamCode, self.nblocks, self.nprofiles, self.nsa,
462 #self.beamCodeByPulse, self.beamCode, self.nblocks, self.nprofiles, self.nsa,
463 channels = self.beamCodeByPulse[0,:]
463 channels = self.beamCodeByPulse[0,:]
464 nchan = self.nchannels
464 nchan = self.nchannels
465 #self.newProfiles = self.nprofiles/nchan #must be defined on filljroheader
465 #self.newProfiles = self.nprofiles/nchan #must be defined on filljroheader
466 nblocks = self.nblocks
466 nblocks = self.nblocks
467 nsamples = self.nsa
467 nsamples = self.nsa
468
468
469 #Dimensions : nChannels, nProfiles, nSamples
469 #Dimensions : nChannels, nProfiles, nSamples
470 new_block = numpy.empty((nblocks, nchan, numpy.int_(self.newProfiles), nsamples), dtype="complex64")
470 new_block = numpy.empty((nblocks, nchan, numpy.int_(self.newProfiles), nsamples), dtype="complex64")
471 ############################################
471 ############################################
472
472
473 for thisChannel in range(nchan):
473 for thisChannel in range(nchan):
474 new_block[:,thisChannel,:,:] = self.dataset[:,numpy.where(channels==self.beamCode[thisChannel])[0],:]
474 new_block[:,thisChannel,:,:] = self.dataset[:,numpy.where(channels==self.beamCode[thisChannel])[0],:]
475
475
476
476
477 new_block = numpy.transpose(new_block, (1,0,2,3))
477 new_block = numpy.transpose(new_block, (1,0,2,3))
478 new_block = numpy.reshape(new_block, (nchan,-1, nsamples))
478 new_block = numpy.reshape(new_block, (nchan,-1, nsamples))
479
479
480 return new_block
480 return new_block
481
481
482 def updateIndexes(self):
482 def updateIndexes(self):
483
483
484 pass
484 pass
485
485
486 def fillJROHeader(self):
486 def fillJROHeader(self):
487
487
488 #fill radar controller header
488 #fill radar controller header
489 self.dataOut.radarControllerHeaderObj = RadarControllerHeader(ipp=self.__ippKm,
489 self.dataOut.radarControllerHeaderObj = RadarControllerHeader(ipp=self.__ippKm,
490 txA=self.__txA,
490 txA=self.__txA,
491 txB=0,
491 txB=0,
492 nWindows=1,
492 nWindows=1,
493 nHeights=self.__nSamples,
493 nHeights=self.__nSamples,
494 firstHeight=self.__firstHeight,
494 firstHeight=self.__firstHeight,
495 deltaHeight=self.__deltaHeight,
495 deltaHeight=self.__deltaHeight,
496 codeType=self.__codeType,
496 codeType=self.__codeType,
497 nCode=self.__nCode, nBaud=self.__nBaud,
497 nCode=self.__nCode, nBaud=self.__nBaud,
498 code = self.__code,
498 code = self.__code,
499 fClock=1)
499 fClock=1)
500
500
501 #fill system header
501 #fill system header
502 self.dataOut.systemHeaderObj = SystemHeader(nSamples=self.__nSamples,
502 self.dataOut.systemHeaderObj = SystemHeader(nSamples=self.__nSamples,
503 nProfiles=self.newProfiles,
503 nProfiles=self.newProfiles,
504 nChannels=len(self.__channelList),
504 nChannels=len(self.__channelList),
505 adcResolution=14,
505 adcResolution=14,
506 pciDioBusWidth=32)
506 pciDioBusWidth=32)
507
507
508 self.dataOut.type = "Voltage"
508 self.dataOut.type = "Voltage"
509 self.dataOut.data = None
509 self.dataOut.data = None
510 self.dataOut.dtype = numpy.dtype([('real','<i8'),('imag','<i8')])
510 self.dataOut.dtype = numpy.dtype([('real','<i8'),('imag','<i8')])
511 # self.dataOut.nChannels = 0
511 # self.dataOut.nChannels = 0
512
512
513 # self.dataOut.nHeights = 0
513 # self.dataOut.nHeights = 0
514
514
515 self.dataOut.nProfiles = self.newProfiles*self.nblocks
515 self.dataOut.nProfiles = self.newProfiles*self.nblocks
516 #self.dataOut.heightList = self.__firstHeigth + numpy.arange(self.__nSamples, dtype = numpy.float)*self.__deltaHeigth
516 #self.dataOut.heightList = self.__firstHeigth + numpy.arange(self.__nSamples, dtype = numpy.float)*self.__deltaHeigth
517 ranges = numpy.reshape(self.rangeFromFile.value,(-1))
517 ranges = numpy.reshape(self.rangeFromFile[()],(-1))
518 self.dataOut.heightList = ranges/1000.0 #km
518 self.dataOut.heightList = ranges/1000.0 #km
519 self.dataOut.channelList = self.__channelList
519 self.dataOut.channelList = self.__channelList
520 self.dataOut.blocksize = self.dataOut.nChannels * self.dataOut.nHeights
520 self.dataOut.blocksize = self.dataOut.nChannels * self.dataOut.nHeights
521
521
522 # self.dataOut.channelIndexList = None
522 # self.dataOut.channelIndexList = None
523
523
524
524
525 self.dataOut.azimuthList = numpy.array(self.azimuthList)
525 self.dataOut.azimuthList = numpy.array(self.azimuthList)
526 self.dataOut.elevationList = numpy.array(self.elevationList)
526 self.dataOut.elevationList = numpy.array(self.elevationList)
527 self.dataOut.codeList = numpy.array(self.beamCode)
527 self.dataOut.codeList = numpy.array(self.beamCode)
528 #print(self.dataOut.elevationList)
528 #print(self.dataOut.elevationList)
529 self.dataOut.flagNoData = True
529 self.dataOut.flagNoData = True
530
530
531 #Set to TRUE if the data is discontinuous
531 #Set to TRUE if the data is discontinuous
532 self.dataOut.flagDiscontinuousBlock = False
532 self.dataOut.flagDiscontinuousBlock = False
533
533
534 self.dataOut.utctime = None
534 self.dataOut.utctime = None
535
535
536 #self.dataOut.timeZone = -5 #self.__timezone/60 #timezone like jroheader, difference in minutes between UTC and localtime
536 #self.dataOut.timeZone = -5 #self.__timezone/60 #timezone like jroheader, difference in minutes between UTC and localtime
537 if self.timezone == 'lt':
537 if self.timezone == 'lt':
538 self.dataOut.timeZone = time.timezone / 60. #get the timezone in minutes
538 self.dataOut.timeZone = time.timezone / 60. #get the timezone in minutes
539 else:
539 else:
540 self.dataOut.timeZone = 0 #by default time is UTC
540 self.dataOut.timeZone = 0 #by default time is UTC
541
541
542 self.dataOut.dstFlag = 0
542 self.dataOut.dstFlag = 0
543 self.dataOut.errorCount = 0
543 self.dataOut.errorCount = 0
544 self.dataOut.nCohInt = 1
544 self.dataOut.nCohInt = 1
545 self.dataOut.flagDecodeData = False #asumo que la data esta decodificada
545 self.dataOut.flagDecodeData = False #asumo que la data esta decodificada
546 self.dataOut.flagDeflipData = False #asumo que la data esta sin flip
546 self.dataOut.flagDeflipData = False #asumo que la data esta sin flip
547 self.dataOut.flagShiftFFT = False
547 self.dataOut.flagShiftFFT = False
548 self.dataOut.ippSeconds = self.ippSeconds
548 self.dataOut.ippSeconds = self.ippSeconds
549
549
550 #Time interval between profiles
550 #Time interval between profiles
551 #self.dataOut.timeInterval = self.dataOut.ippSeconds * self.dataOut.nCohInt
551 #self.dataOut.timeInterval = self.dataOut.ippSeconds * self.dataOut.nCohInt
552
552
553 self.dataOut.frequency = self.__frequency
553 self.dataOut.frequency = self.__frequency
554 self.dataOut.realtime = self.online
554 self.dataOut.realtime = self.online
555 pass
555 pass
556
556
557 def readNextFile(self,online=False):
557 def readNextFile(self,online=False):
558
558
559 if not(online):
559 if not(online):
560 newFile = self.__setNextFileOffline()
560 newFile = self.__setNextFileOffline()
561 else:
561 else:
562 newFile = self.__setNextFileOnline()
562 newFile = self.__setNextFileOnline()
563
563
564 if not(newFile):
564 if not(newFile):
565 self.dataOut.error = True
565 self.dataOut.error = True
566 return 0
566 return 0
567
567
568 if not self.readAMISRHeader(self.amisrFilePointer):
568 if not self.readAMISRHeader(self.amisrFilePointer):
569 self.dataOut.error = True
569 self.dataOut.error = True
570 return 0
570 return 0
571
571
572 self.createBuffers()
572 self.createBuffers()
573 self.fillJROHeader()
573 self.fillJROHeader()
574
574
575 #self.__firstFile = False
575 #self.__firstFile = False
576
576
577
577
578
578
579 self.dataset,self.timeset = self.readData()
579 self.dataset,self.timeset = self.readData()
580
580
581 if self.endDate!=None:
581 if self.endDate!=None:
582 endDateTime_Reader = datetime.datetime.combine(self.endDate,self.endTime)
582 endDateTime_Reader = datetime.datetime.combine(self.endDate,self.endTime)
583 time_str = self.amisrFilePointer.get('Time/RadacTimeString')
583 time_str = self.amisrFilePointer.get('Time/RadacTimeString')
584 startDateTimeStr_File = time_str[0][0].decode('UTF-8').split('.')[0]
584 startDateTimeStr_File = time_str[0][0].decode('UTF-8').split('.')[0]
585 junk = time.strptime(startDateTimeStr_File, '%Y-%m-%d %H:%M:%S')
585 junk = time.strptime(startDateTimeStr_File, '%Y-%m-%d %H:%M:%S')
586 startDateTime_File = datetime.datetime(junk.tm_year,junk.tm_mon,junk.tm_mday,junk.tm_hour, junk.tm_min, junk.tm_sec)
586 startDateTime_File = datetime.datetime(junk.tm_year,junk.tm_mon,junk.tm_mday,junk.tm_hour, junk.tm_min, junk.tm_sec)
587 if self.timezone == 'lt':
587 if self.timezone == 'lt':
588 startDateTime_File = startDateTime_File - datetime.timedelta(minutes = 300)
588 startDateTime_File = startDateTime_File - datetime.timedelta(minutes = 300)
589 if (startDateTime_File>endDateTime_Reader):
589 if (startDateTime_File>endDateTime_Reader):
590 return 0
590 return 0
591
591
592 self.jrodataset = self.reshapeData()
592 self.jrodataset = self.reshapeData()
593 #----self.updateIndexes()
593 #----self.updateIndexes()
594 self.profileIndex = 0
594 self.profileIndex = 0
595
595
596 return 1
596 return 1
597
597
598
598
599 def __hasNotDataInBuffer(self):
599 def __hasNotDataInBuffer(self):
600 if self.profileIndex >= (self.newProfiles*self.nblocks):
600 if self.profileIndex >= (self.newProfiles*self.nblocks):
601 return 1
601 return 1
602 return 0
602 return 0
603
603
604
604
605 def getData(self):
605 def getData(self):
606
606
607 if self.flagNoMoreFiles:
607 if self.flagNoMoreFiles:
608 self.dataOut.flagNoData = True
608 self.dataOut.flagNoData = True
609 return 0
609 return 0
610
610
611 if self.__hasNotDataInBuffer():
611 if self.__hasNotDataInBuffer():
612 if not (self.readNextFile(self.online)):
612 if not (self.readNextFile(self.online)):
613 return 0
613 return 0
614
614
615
615
616 if self.dataset is None: # setear esta condicion cuando no hayan datos por leer
616 if self.dataset is None: # setear esta condicion cuando no hayan datos por leer
617 self.dataOut.flagNoData = True
617 self.dataOut.flagNoData = True
618 return 0
618 return 0
619
619
620 #self.dataOut.data = numpy.reshape(self.jrodataset[self.profileIndex,:],(1,-1))
620 #self.dataOut.data = numpy.reshape(self.jrodataset[self.profileIndex,:],(1,-1))
621
621
622 self.dataOut.data = self.jrodataset[:,self.profileIndex,:]
622 self.dataOut.data = self.jrodataset[:,self.profileIndex,:]
623
623
624 #print("R_t",self.timeset)
624 #print("R_t",self.timeset)
625
625
626 #self.dataOut.utctime = self.jrotimeset[self.profileIndex]
626 #self.dataOut.utctime = self.jrotimeset[self.profileIndex]
627 #verificar basic header de jro data y ver si es compatible con este valor
627 #verificar basic header de jro data y ver si es compatible con este valor
628 #self.dataOut.utctime = self.timeset + (self.profileIndex * self.ippSeconds * self.nchannels)
628 #self.dataOut.utctime = self.timeset + (self.profileIndex * self.ippSeconds * self.nchannels)
629 indexprof = numpy.mod(self.profileIndex, self.newProfiles)
629 indexprof = numpy.mod(self.profileIndex, self.newProfiles)
630 indexblock = self.profileIndex/self.newProfiles
630 indexblock = self.profileIndex/self.newProfiles
631 #print (indexblock, indexprof)
631 #print (indexblock, indexprof)
632 diffUTC = 0
632 diffUTC = 0
633 t_comp = (indexprof * self.ippSeconds * self.nchannels) + diffUTC #
633 t_comp = (indexprof * self.ippSeconds * self.nchannels) + diffUTC #
634
634
635 #print("utc :",indexblock," __ ",t_comp)
635 #print("utc :",indexblock," __ ",t_comp)
636 #print(numpy.shape(self.timeset))
636 #print(numpy.shape(self.timeset))
637 self.dataOut.utctime = self.timeset[numpy.int_(indexblock)] + t_comp
637 self.dataOut.utctime = self.timeset[numpy.int_(indexblock)] + t_comp
638 #self.dataOut.utctime = self.timeset[self.profileIndex] + t_comp
638 #self.dataOut.utctime = self.timeset[self.profileIndex] + t_comp
639
639
640 self.dataOut.profileIndex = self.profileIndex
640 self.dataOut.profileIndex = self.profileIndex
641 #print("N profile:",self.profileIndex,self.newProfiles,self.nblocks,self.dataOut.utctime)
641 #print("N profile:",self.profileIndex,self.newProfiles,self.nblocks,self.dataOut.utctime)
642 self.dataOut.flagNoData = False
642 self.dataOut.flagNoData = False
643 # if indexprof == 0:
643 # if indexprof == 0:
644 # print("kamisr: ",self.dataOut.utctime)
644 # print("kamisr: ",self.dataOut.utctime)
645
645
646 self.profileIndex += 1
646 self.profileIndex += 1
647
647
648 return self.dataOut.data #retorno necesario??
648 return self.dataOut.data #retorno necesario??
649
649
650
650
651 def run(self, **kwargs):
651 def run(self, **kwargs):
652 '''
652 '''
653 This method will be called many times so here you should put all your code
653 This method will be called many times so here you should put all your code
654 '''
654 '''
655 #print("running kamisr")
655 #print("running kamisr")
656 if not self.isConfig:
656 if not self.isConfig:
657 self.setup(**kwargs)
657 self.setup(**kwargs)
658 self.isConfig = True
658 self.isConfig = True
659
659
660 self.getData()
660 self.getData()
General Comments 0
You need to be logged in to leave comments. Login now