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