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