##// END OF EJS Templates
JRODATA: timeInterval is a property now...
Miguel Valdez -
r527:6ccd54aeeb93
parent child
Show More
@@ -1,686 +1,687
1 '''
1 '''
2 @author: Daniel Suarez
2 @author: Daniel Suarez
3 '''
3 '''
4
4
5 import os
5 import os
6 import sys
6 import sys
7 import glob
7 import glob
8 import fnmatch
8 import fnmatch
9 import datetime
9 import datetime
10 import time
10 import time
11 import re
11 import re
12 import h5py
12 import h5py
13 import numpy
13 import numpy
14
14
15 from model.proc.jroproc_base import ProcessingUnit, Operation
15 from model.proc.jroproc_base import ProcessingUnit, Operation
16 from model.data.jroamisr import AMISR
16 from model.data.jroamisr import AMISR
17
17
18 class RadacHeader():
18 class RadacHeader():
19 def __init__(self, fp):
19 def __init__(self, fp):
20 header = 'Raw11/Data/RadacHeader'
20 header = 'Raw11/Data/RadacHeader'
21 self.beamCodeByPulse = fp.get(header+'/BeamCode')
21 self.beamCodeByPulse = fp.get(header+'/BeamCode')
22 self.beamCode = fp.get('Raw11/Data/Beamcodes')
22 self.beamCode = fp.get('Raw11/Data/Beamcodes')
23 self.code = fp.get(header+'/Code')
23 self.code = fp.get(header+'/Code')
24 self.frameCount = fp.get(header+'/FrameCount')
24 self.frameCount = fp.get(header+'/FrameCount')
25 self.modeGroup = fp.get(header+'/ModeGroup')
25 self.modeGroup = fp.get(header+'/ModeGroup')
26 self.nsamplesPulse = fp.get(header+'/NSamplesPulse')
26 self.nsamplesPulse = fp.get(header+'/NSamplesPulse')
27 self.pulseCount = fp.get(header+'/PulseCount')
27 self.pulseCount = fp.get(header+'/PulseCount')
28 self.radacTime = fp.get(header+'/RadacTime')
28 self.radacTime = fp.get(header+'/RadacTime')
29 self.timeCount = fp.get(header+'/TimeCount')
29 self.timeCount = fp.get(header+'/TimeCount')
30 self.timeStatus = fp.get(header+'/TimeStatus')
30 self.timeStatus = fp.get(header+'/TimeStatus')
31
31
32 self.nrecords = self.pulseCount.shape[0] #nblocks
32 self.nrecords = self.pulseCount.shape[0] #nblocks
33 self.npulses = self.pulseCount.shape[1] #nprofile
33 self.npulses = self.pulseCount.shape[1] #nprofile
34 self.nsamples = self.nsamplesPulse[0,0] #ngates
34 self.nsamples = self.nsamplesPulse[0,0] #ngates
35 self.nbeams = self.beamCode.shape[1]
35 self.nbeams = self.beamCode.shape[1]
36
36
37
37
38 def getIndexRangeToPulse(self, idrecord=0):
38 def getIndexRangeToPulse(self, idrecord=0):
39 #indexToZero = numpy.where(self.pulseCount.value[idrecord,:]==0)
39 #indexToZero = numpy.where(self.pulseCount.value[idrecord,:]==0)
40 #startPulseCountId = indexToZero[0][0]
40 #startPulseCountId = indexToZero[0][0]
41 #endPulseCountId = startPulseCountId - 1
41 #endPulseCountId = startPulseCountId - 1
42 #range1 = numpy.arange(startPulseCountId,self.npulses,1)
42 #range1 = numpy.arange(startPulseCountId,self.npulses,1)
43 #range2 = numpy.arange(0,startPulseCountId,1)
43 #range2 = numpy.arange(0,startPulseCountId,1)
44 #return range1, range2
44 #return range1, range2
45 zero = 0
45 zero = 0
46 npulse = max(self.pulseCount[0,:]+1)-1
46 npulse = max(self.pulseCount[0,:]+1)-1
47 looking_index = numpy.where(self.pulseCount.value[idrecord,:]==npulse)[0]
47 looking_index = numpy.where(self.pulseCount.value[idrecord,:]==npulse)[0]
48 getLastIndex = looking_index[-1]
48 getLastIndex = looking_index[-1]
49 index_data = numpy.arange(0,getLastIndex+1,1)
49 index_data = numpy.arange(0,getLastIndex+1,1)
50 index_buffer = numpy.arange(getLastIndex+1,self.npulses,1)
50 index_buffer = numpy.arange(getLastIndex+1,self.npulses,1)
51 return index_data, index_buffer
51 return index_data, index_buffer
52
52
53 class AMISRReader(ProcessingUnit):
53 class AMISRReader(ProcessingUnit):
54
54
55 path = None
55 path = None
56 startDate = None
56 startDate = None
57 endDate = None
57 endDate = None
58 startTime = None
58 startTime = None
59 endTime = None
59 endTime = None
60 walk = None
60 walk = None
61 isConfig = False
61 isConfig = False
62
62
63 def __init__(self):
63 def __init__(self):
64 self.set = None
64 self.set = None
65 self.subset = None
65 self.subset = None
66 self.extension_file = '.h5'
66 self.extension_file = '.h5'
67 self.dtc_str = 'dtc'
67 self.dtc_str = 'dtc'
68 self.dtc_id = 0
68 self.dtc_id = 0
69 self.status = True
69 self.status = True
70 self.isConfig = False
70 self.isConfig = False
71 self.dirnameList = []
71 self.dirnameList = []
72 self.filenameList = []
72 self.filenameList = []
73 self.fileIndex = None
73 self.fileIndex = None
74 self.flagNoMoreFiles = False
74 self.flagNoMoreFiles = False
75 self.flagIsNewFile = 0
75 self.flagIsNewFile = 0
76 self.filename = ''
76 self.filename = ''
77 self.amisrFilePointer = None
77 self.amisrFilePointer = None
78 self.radacHeaderObj = None
78 self.radacHeaderObj = None
79 self.dataOut = self.__createObjByDefault()
79 self.dataOut = self.__createObjByDefault()
80 self.datablock = None
80 self.datablock = None
81 self.rest_datablock = None
81 self.rest_datablock = None
82 self.range = None
82 self.range = None
83 self.idrecord_count = 0
83 self.idrecord_count = 0
84 self.profileIndex = 0
84 self.profileIndex = 0
85 self.index_amisr_sample = None
85 self.index_amisr_sample = None
86 self.index_amisr_buffer = None
86 self.index_amisr_buffer = None
87 self.beamCodeByFrame = None
87 self.beamCodeByFrame = None
88 self.radacTimeByFrame = None
88 self.radacTimeByFrame = None
89 #atributos originales tal y como esta en el archivo de datos
89 #atributos originales tal y como esta en el archivo de datos
90 self.beamCodesFromFile = None
90 self.beamCodesFromFile = None
91 self.radacTimeFromFile = None
91 self.radacTimeFromFile = None
92 self.rangeFromFile = None
92 self.rangeFromFile = None
93 self.dataByFrame = None
93 self.dataByFrame = None
94 self.dataset = None
94 self.dataset = None
95
95
96 self.beamCodeDict = {}
96 self.beamCodeDict = {}
97 self.beamRangeDict = {}
97 self.beamRangeDict = {}
98
98
99 #experiment cgf file
99 #experiment cgf file
100 self.npulsesint_fromfile = None
100 self.npulsesint_fromfile = None
101 self.recordsperfile_fromfile = None
101 self.recordsperfile_fromfile = None
102 self.nbeamcodes_fromfile = None
102 self.nbeamcodes_fromfile = None
103 self.ngates_fromfile = None
103 self.ngates_fromfile = None
104 self.ippSeconds_fromfile = None
104 self.ippSeconds_fromfile = None
105 self.frequency_h5file = None
105 self.frequency_h5file = None
106
106
107
107
108 self.__firstFile = True
108 self.__firstFile = True
109 self.buffer_radactime = None
109 self.buffer_radactime = None
110
110
111 self.index4_schain_datablock = None
111 self.index4_schain_datablock = None
112 self.index4_buffer = None
112 self.index4_buffer = None
113 self.schain_datablock = None
113 self.schain_datablock = None
114 self.buffer = None
114 self.buffer = None
115 self.linear_pulseCount = None
115 self.linear_pulseCount = None
116 self.npulseByFrame = None
116 self.npulseByFrame = None
117 self.profileIndex_offset = None
117 self.profileIndex_offset = None
118 self.timezone = 'ut'
118 self.timezone = 'ut'
119
119
120 self.__waitForNewFile = 20
120 self.__waitForNewFile = 20
121 self.__filename_online = None
121 self.__filename_online = None
122
122
123 def __createObjByDefault(self):
123 def __createObjByDefault(self):
124
124
125 dataObj = AMISR()
125 dataObj = AMISR()
126
126
127 return dataObj
127 return dataObj
128
128
129 def __setParameters(self,path='', startDate='',endDate='',startTime='', endTime='', walk=''):
129 def __setParameters(self,path='', startDate='',endDate='',startTime='', endTime='', walk=''):
130 self.path = path
130 self.path = path
131 self.startDate = startDate
131 self.startDate = startDate
132 self.endDate = endDate
132 self.endDate = endDate
133 self.startTime = startTime
133 self.startTime = startTime
134 self.endTime = endTime
134 self.endTime = endTime
135 self.walk = walk
135 self.walk = walk
136
136
137 def __checkPath(self):
137 def __checkPath(self):
138 if os.path.exists(self.path):
138 if os.path.exists(self.path):
139 self.status = 1
139 self.status = 1
140 else:
140 else:
141 self.status = 0
141 self.status = 0
142 print 'Path:%s does not exists'%self.path
142 print 'Path:%s does not exists'%self.path
143
143
144 return
144 return
145
145
146 def __selDates(self, amisr_dirname_format):
146 def __selDates(self, amisr_dirname_format):
147 try:
147 try:
148 year = int(amisr_dirname_format[0:4])
148 year = int(amisr_dirname_format[0:4])
149 month = int(amisr_dirname_format[4:6])
149 month = int(amisr_dirname_format[4:6])
150 dom = int(amisr_dirname_format[6:8])
150 dom = int(amisr_dirname_format[6:8])
151 thisDate = datetime.date(year,month,dom)
151 thisDate = datetime.date(year,month,dom)
152
152
153 if (thisDate>=self.startDate and thisDate <= self.endDate):
153 if (thisDate>=self.startDate and thisDate <= self.endDate):
154 return amisr_dirname_format
154 return amisr_dirname_format
155 except:
155 except:
156 return None
156 return None
157
157
158 def __findDataForDates(self,online=False):
158 def __findDataForDates(self,online=False):
159
159
160
160
161
161
162 if not(self.status):
162 if not(self.status):
163 return None
163 return None
164
164
165 pat = '\d+.\d+'
165 pat = '\d+.\d+'
166 dirnameList = [re.search(pat,x) for x in os.listdir(self.path)]
166 dirnameList = [re.search(pat,x) for x in os.listdir(self.path)]
167 dirnameList = filter(lambda x:x!=None,dirnameList)
167 dirnameList = filter(lambda x:x!=None,dirnameList)
168 dirnameList = [x.string for x in dirnameList]
168 dirnameList = [x.string for x in dirnameList]
169 if not(online):
169 if not(online):
170 dirnameList = [self.__selDates(x) for x in dirnameList]
170 dirnameList = [self.__selDates(x) for x in dirnameList]
171 dirnameList = filter(lambda x:x!=None,dirnameList)
171 dirnameList = filter(lambda x:x!=None,dirnameList)
172 if len(dirnameList)>0:
172 if len(dirnameList)>0:
173 self.status = 1
173 self.status = 1
174 self.dirnameList = dirnameList
174 self.dirnameList = dirnameList
175 self.dirnameList.sort()
175 self.dirnameList.sort()
176 else:
176 else:
177 self.status = 0
177 self.status = 0
178 return None
178 return None
179
179
180 def __getTimeFromData(self):
180 def __getTimeFromData(self):
181 startDateTime_Reader = datetime.datetime.combine(self.startDate,self.startTime)
181 startDateTime_Reader = datetime.datetime.combine(self.startDate,self.startTime)
182 endDateTime_Reader = datetime.datetime.combine(self.endDate,self.endTime)
182 endDateTime_Reader = datetime.datetime.combine(self.endDate,self.endTime)
183
183
184 print 'Filtering Files from %s to %s'%(startDateTime_Reader, endDateTime_Reader)
184 print 'Filtering Files from %s to %s'%(startDateTime_Reader, endDateTime_Reader)
185 print '........................................'
185 print '........................................'
186 filter_filenameList = []
186 filter_filenameList = []
187 self.filenameList.sort()
187 self.filenameList.sort()
188 for i in range(len(self.filenameList)-1):
188 for i in range(len(self.filenameList)-1):
189 filename = self.filenameList[i]
189 filename = self.filenameList[i]
190 fp = h5py.File(filename,'r')
190 fp = h5py.File(filename,'r')
191 time_str = fp.get('Time/RadacTimeString')
191 time_str = fp.get('Time/RadacTimeString')
192
192
193 startDateTimeStr_File = time_str[0][0].split('.')[0]
193 startDateTimeStr_File = time_str[0][0].split('.')[0]
194 junk = time.strptime(startDateTimeStr_File, '%Y-%m-%d %H:%M:%S')
194 junk = time.strptime(startDateTimeStr_File, '%Y-%m-%d %H:%M:%S')
195 startDateTime_File = datetime.datetime(junk.tm_year,junk.tm_mon,junk.tm_mday,junk.tm_hour, junk.tm_min, junk.tm_sec)
195 startDateTime_File = datetime.datetime(junk.tm_year,junk.tm_mon,junk.tm_mday,junk.tm_hour, junk.tm_min, junk.tm_sec)
196
196
197 endDateTimeStr_File = time_str[-1][-1].split('.')[0]
197 endDateTimeStr_File = time_str[-1][-1].split('.')[0]
198 junk = time.strptime(endDateTimeStr_File, '%Y-%m-%d %H:%M:%S')
198 junk = time.strptime(endDateTimeStr_File, '%Y-%m-%d %H:%M:%S')
199 endDateTime_File = datetime.datetime(junk.tm_year,junk.tm_mon,junk.tm_mday,junk.tm_hour, junk.tm_min, junk.tm_sec)
199 endDateTime_File = datetime.datetime(junk.tm_year,junk.tm_mon,junk.tm_mday,junk.tm_hour, junk.tm_min, junk.tm_sec)
200
200
201 fp.close()
201 fp.close()
202
202
203 if self.timezone == 'lt':
203 if self.timezone == 'lt':
204 startDateTime_File = startDateTime_File - datetime.timedelta(minutes = 300)
204 startDateTime_File = startDateTime_File - datetime.timedelta(minutes = 300)
205 endDateTime_File = endDateTime_File - datetime.timedelta(minutes = 300)
205 endDateTime_File = endDateTime_File - datetime.timedelta(minutes = 300)
206
206
207 if (endDateTime_File>=startDateTime_Reader and endDateTime_File<endDateTime_Reader):
207 if (endDateTime_File>=startDateTime_Reader and endDateTime_File<endDateTime_Reader):
208 #self.filenameList.remove(filename)
208 #self.filenameList.remove(filename)
209 filter_filenameList.append(filename)
209 filter_filenameList.append(filename)
210
210
211 filter_filenameList.sort()
211 filter_filenameList.sort()
212 self.filenameList = filter_filenameList
212 self.filenameList = filter_filenameList
213 return 1
213 return 1
214
214
215 def __filterByGlob1(self, dirName):
215 def __filterByGlob1(self, dirName):
216 filter_files = glob.glob1(dirName, '*.*%s'%self.extension_file)
216 filter_files = glob.glob1(dirName, '*.*%s'%self.extension_file)
217 filterDict = {}
217 filterDict = {}
218 filterDict.setdefault(dirName)
218 filterDict.setdefault(dirName)
219 filterDict[dirName] = filter_files
219 filterDict[dirName] = filter_files
220 return filterDict
220 return filterDict
221
221
222 def __getFilenameList(self, fileListInKeys, dirList):
222 def __getFilenameList(self, fileListInKeys, dirList):
223 for value in fileListInKeys:
223 for value in fileListInKeys:
224 dirName = value.keys()[0]
224 dirName = value.keys()[0]
225 for file in value[dirName]:
225 for file in value[dirName]:
226 filename = os.path.join(dirName, file)
226 filename = os.path.join(dirName, file)
227 self.filenameList.append(filename)
227 self.filenameList.append(filename)
228
228
229
229
230 def __selectDataForTimes(self, online=False):
230 def __selectDataForTimes(self, online=False):
231 #aun no esta implementado el filtro for tiempo
231 #aun no esta implementado el filtro for tiempo
232 if not(self.status):
232 if not(self.status):
233 return None
233 return None
234
234
235 dirList = [os.path.join(self.path,x) for x in self.dirnameList]
235 dirList = [os.path.join(self.path,x) for x in self.dirnameList]
236
236
237 fileListInKeys = [self.__filterByGlob1(x) for x in dirList]
237 fileListInKeys = [self.__filterByGlob1(x) for x in dirList]
238
238
239 self.__getFilenameList(fileListInKeys, dirList)
239 self.__getFilenameList(fileListInKeys, dirList)
240 if not(online):
240 if not(online):
241 #filtro por tiempo
241 #filtro por tiempo
242 if not(self.all):
242 if not(self.all):
243 self.__getTimeFromData()
243 self.__getTimeFromData()
244
244
245 if len(self.filenameList)>0:
245 if len(self.filenameList)>0:
246 self.status = 1
246 self.status = 1
247 self.filenameList.sort()
247 self.filenameList.sort()
248 else:
248 else:
249 self.status = 0
249 self.status = 0
250 return None
250 return None
251
251
252 else:
252 else:
253 #get the last file - 1
253 #get the last file - 1
254 self.filenameList = [self.filenameList[-2]]
254 self.filenameList = [self.filenameList[-2]]
255
255
256 new_dirnameList = []
256 new_dirnameList = []
257 for dirname in self.dirnameList:
257 for dirname in self.dirnameList:
258 junk = numpy.array([dirname in x for x in self.filenameList])
258 junk = numpy.array([dirname in x for x in self.filenameList])
259 junk_sum = junk.sum()
259 junk_sum = junk.sum()
260 if junk_sum > 0:
260 if junk_sum > 0:
261 new_dirnameList.append(dirname)
261 new_dirnameList.append(dirname)
262 self.dirnameList = new_dirnameList
262 self.dirnameList = new_dirnameList
263 return 1
263 return 1
264
264
265 def __searchFilesOnline(self,
265 def __searchFilesOnline(self,
266 path,
266 path,
267 walk=True):
267 walk=True):
268
268
269 startDate = datetime.datetime.utcnow().date()
269 startDate = datetime.datetime.utcnow().date()
270 endDate = datetime.datetime.utcnow().date()
270 endDate = datetime.datetime.utcnow().date()
271
271
272 self.__setParameters(path=path, startDate=startDate, endDate=endDate, walk=walk)
272 self.__setParameters(path=path, startDate=startDate, endDate=endDate, walk=walk)
273
273
274 self.__checkPath()
274 self.__checkPath()
275
275
276 self.__findDataForDates(online=True)
276 self.__findDataForDates(online=True)
277
277
278 self.dirnameList = [self.dirnameList[-1]]
278 self.dirnameList = [self.dirnameList[-1]]
279
279
280 self.__selectDataForTimes(online=True)
280 self.__selectDataForTimes(online=True)
281
281
282 return
282 return
283
283
284
284
285 def __searchFilesOffline(self,
285 def __searchFilesOffline(self,
286 path,
286 path,
287 startDate,
287 startDate,
288 endDate,
288 endDate,
289 startTime=datetime.time(0,0,0),
289 startTime=datetime.time(0,0,0),
290 endTime=datetime.time(23,59,59),
290 endTime=datetime.time(23,59,59),
291 walk=True):
291 walk=True):
292
292
293 self.__setParameters(path, startDate, endDate, startTime, endTime, walk)
293 self.__setParameters(path, startDate, endDate, startTime, endTime, walk)
294
294
295 self.__checkPath()
295 self.__checkPath()
296
296
297 self.__findDataForDates()
297 self.__findDataForDates()
298
298
299 self.__selectDataForTimes()
299 self.__selectDataForTimes()
300
300
301 for i in range(len(self.filenameList)):
301 for i in range(len(self.filenameList)):
302 print "%s" %(self.filenameList[i])
302 print "%s" %(self.filenameList[i])
303
303
304 return
304 return
305
305
306 def __setNextFileOffline(self):
306 def __setNextFileOffline(self):
307 idFile = self.fileIndex
307 idFile = self.fileIndex
308
308
309 while (True):
309 while (True):
310 idFile += 1
310 idFile += 1
311 if not(idFile < len(self.filenameList)):
311 if not(idFile < len(self.filenameList)):
312 self.flagNoMoreFiles = 1
312 self.flagNoMoreFiles = 1
313 print "No more Files"
313 print "No more Files"
314 return 0
314 return 0
315
315
316 filename = self.filenameList[idFile]
316 filename = self.filenameList[idFile]
317
317
318 amisrFilePointer = h5py.File(filename,'r')
318 amisrFilePointer = h5py.File(filename,'r')
319
319
320 break
320 break
321
321
322 self.flagIsNewFile = 1
322 self.flagIsNewFile = 1
323 self.fileIndex = idFile
323 self.fileIndex = idFile
324 self.filename = filename
324 self.filename = filename
325
325
326 self.amisrFilePointer = amisrFilePointer
326 self.amisrFilePointer = amisrFilePointer
327
327
328 print "Setting the file: %s"%self.filename
328 print "Setting the file: %s"%self.filename
329
329
330 return 1
330 return 1
331
331
332
332
333 def __setNextFileOnline(self):
333 def __setNextFileOnline(self):
334 filename = self.filenameList[0]
334 filename = self.filenameList[0]
335 if self.__filename_online != None:
335 if self.__filename_online != None:
336 self.__selectDataForTimes(online=True)
336 self.__selectDataForTimes(online=True)
337 filename = self.filenameList[0]
337 filename = self.filenameList[0]
338 while self.__filename_online == filename:
338 while self.__filename_online == filename:
339 print 'waiting %d seconds to get a new file...'%(self.__waitForNewFile)
339 print 'waiting %d seconds to get a new file...'%(self.__waitForNewFile)
340 time.sleep(self.__waitForNewFile)
340 time.sleep(self.__waitForNewFile)
341 self.__selectDataForTimes(online=True)
341 self.__selectDataForTimes(online=True)
342 filename = self.filenameList[0]
342 filename = self.filenameList[0]
343
343
344 self.__filename_online = filename
344 self.__filename_online = filename
345
345
346 self.amisrFilePointer = h5py.File(filename,'r')
346 self.amisrFilePointer = h5py.File(filename,'r')
347 self.flagIsNewFile = 1
347 self.flagIsNewFile = 1
348 self.filename = filename
348 self.filename = filename
349 print "Setting the file: %s"%self.filename
349 print "Setting the file: %s"%self.filename
350 return 1
350 return 1
351
351
352
352
353 def __readHeader(self):
353 def __readHeader(self):
354 self.radacHeaderObj = RadacHeader(self.amisrFilePointer)
354 self.radacHeaderObj = RadacHeader(self.amisrFilePointer)
355
355
356 #update values from experiment cfg file
356 #update values from experiment cfg file
357 if self.radacHeaderObj.nrecords == self.recordsperfile_fromfile:
357 if self.radacHeaderObj.nrecords == self.recordsperfile_fromfile:
358 self.radacHeaderObj.nrecords = self.recordsperfile_fromfile
358 self.radacHeaderObj.nrecords = self.recordsperfile_fromfile
359 self.radacHeaderObj.nbeams = self.nbeamcodes_fromfile
359 self.radacHeaderObj.nbeams = self.nbeamcodes_fromfile
360 self.radacHeaderObj.npulses = self.npulsesint_fromfile
360 self.radacHeaderObj.npulses = self.npulsesint_fromfile
361 self.radacHeaderObj.nsamples = self.ngates_fromfile
361 self.radacHeaderObj.nsamples = self.ngates_fromfile
362
362
363 #looking index list for data
363 #looking index list for data
364 start_index = self.radacHeaderObj.pulseCount[0,:][0]
364 start_index = self.radacHeaderObj.pulseCount[0,:][0]
365 end_index = self.radacHeaderObj.npulses
365 end_index = self.radacHeaderObj.npulses
366 range4data = range(start_index, end_index)
366 range4data = range(start_index, end_index)
367 self.index4_schain_datablock = numpy.array(range4data)
367 self.index4_schain_datablock = numpy.array(range4data)
368
368
369 buffer_start_index = 0
369 buffer_start_index = 0
370 buffer_end_index = self.radacHeaderObj.pulseCount[0,:][0]
370 buffer_end_index = self.radacHeaderObj.pulseCount[0,:][0]
371 range4buffer = range(buffer_start_index, buffer_end_index)
371 range4buffer = range(buffer_start_index, buffer_end_index)
372 self.index4_buffer = numpy.array(range4buffer)
372 self.index4_buffer = numpy.array(range4buffer)
373
373
374 self.linear_pulseCount = numpy.array(range4data + range4buffer)
374 self.linear_pulseCount = numpy.array(range4data + range4buffer)
375 self.npulseByFrame = max(self.radacHeaderObj.pulseCount[0,:]+1)
375 self.npulseByFrame = max(self.radacHeaderObj.pulseCount[0,:]+1)
376
376
377 #get tuning frequency
377 #get tuning frequency
378 frequency_h5file_dataset = self.amisrFilePointer.get('Rx'+'/TuningFrequency')
378 frequency_h5file_dataset = self.amisrFilePointer.get('Rx'+'/TuningFrequency')
379 self.frequency_h5file = frequency_h5file_dataset[0,0]
379 self.frequency_h5file = frequency_h5file_dataset[0,0]
380
380
381 self.flagIsNewFile = 1
381 self.flagIsNewFile = 1
382
382
383 def __getBeamCode(self):
383 def __getBeamCode(self):
384 self.beamCodeDict = {}
384 self.beamCodeDict = {}
385 self.beamRangeDict = {}
385 self.beamRangeDict = {}
386
386
387 beamCodeMap = self.amisrFilePointer.get('Setup/BeamcodeMap')
387 beamCodeMap = self.amisrFilePointer.get('Setup/BeamcodeMap')
388
388
389 for i in range(len(self.radacHeaderObj.beamCode[0,:])):
389 for i in range(len(self.radacHeaderObj.beamCode[0,:])):
390 self.beamCodeDict.setdefault(i)
390 self.beamCodeDict.setdefault(i)
391 self.beamRangeDict.setdefault(i)
391 self.beamRangeDict.setdefault(i)
392 beamcodeValue = self.radacHeaderObj.beamCode[0,i]
392 beamcodeValue = self.radacHeaderObj.beamCode[0,i]
393 beamcodeIndex = numpy.where(beamCodeMap[:,0] == beamcodeValue)[0][0]
393 beamcodeIndex = numpy.where(beamCodeMap[:,0] == beamcodeValue)[0][0]
394 x = beamCodeMap[beamcodeIndex][1]
394 x = beamCodeMap[beamcodeIndex][1]
395 y = beamCodeMap[beamcodeIndex][2]
395 y = beamCodeMap[beamcodeIndex][2]
396 z = beamCodeMap[beamcodeIndex][3]
396 z = beamCodeMap[beamcodeIndex][3]
397 self.beamCodeDict[i] = [beamcodeValue, x, y, z]
397 self.beamCodeDict[i] = [beamcodeValue, x, y, z]
398
398
399 just4record0 = self.radacHeaderObj.beamCodeByPulse[0,:]
399 just4record0 = self.radacHeaderObj.beamCodeByPulse[0,:]
400
400
401 for i in range(len(self.beamCodeDict.values())):
401 for i in range(len(self.beamCodeDict.values())):
402 xx = numpy.where(just4record0==self.beamCodeDict.values()[i][0])
402 xx = numpy.where(just4record0==self.beamCodeDict.values()[i][0])
403 indexPulseByBeam = self.linear_pulseCount[xx[0]]
403 indexPulseByBeam = self.linear_pulseCount[xx[0]]
404 self.beamRangeDict[i] = indexPulseByBeam
404 self.beamRangeDict[i] = indexPulseByBeam
405
405
406 def __getExpParameters(self):
406 def __getExpParameters(self):
407 if not(self.status):
407 if not(self.status):
408 return None
408 return None
409
409
410 experimentCfgPath = os.path.join(self.path, self.dirnameList[0], 'Setup')
410 experimentCfgPath = os.path.join(self.path, self.dirnameList[0], 'Setup')
411
411
412 expFinder = glob.glob1(experimentCfgPath,'*.exp')
412 expFinder = glob.glob1(experimentCfgPath,'*.exp')
413 if len(expFinder)== 0:
413 if len(expFinder)== 0:
414 self.status = 0
414 self.status = 0
415 return None
415 return None
416
416
417 experimentFilename = os.path.join(experimentCfgPath,expFinder[0])
417 experimentFilename = os.path.join(experimentCfgPath,expFinder[0])
418
418
419 f = open(experimentFilename)
419 f = open(experimentFilename)
420 lines = f.readlines()
420 lines = f.readlines()
421 f.close()
421 f.close()
422
422
423 parmsList = ['npulsesint*','recordsperfile*','nbeamcodes*','ngates*']
423 parmsList = ['npulsesint*','recordsperfile*','nbeamcodes*','ngates*']
424 filterList = [fnmatch.filter(lines, x) for x in parmsList]
424 filterList = [fnmatch.filter(lines, x) for x in parmsList]
425
425
426
426
427 values = [re.sub(r'\D',"",x[0]) for x in filterList]
427 values = [re.sub(r'\D',"",x[0]) for x in filterList]
428
428
429 self.npulsesint_fromfile = int(values[0])
429 self.npulsesint_fromfile = int(values[0])
430 self.recordsperfile_fromfile = int(values[1])
430 self.recordsperfile_fromfile = int(values[1])
431 self.nbeamcodes_fromfile = int(values[2])
431 self.nbeamcodes_fromfile = int(values[2])
432 self.ngates_fromfile = int(values[3])
432 self.ngates_fromfile = int(values[3])
433
433
434 tufileFinder = fnmatch.filter(lines, 'tufile=*')
434 tufileFinder = fnmatch.filter(lines, 'tufile=*')
435 tufile = tufileFinder[0].split('=')[1].split('\n')[0]
435 tufile = tufileFinder[0].split('=')[1].split('\n')[0]
436 tufile = tufile.split('\r')[0]
436 tufile = tufile.split('\r')[0]
437 tufilename = os.path.join(experimentCfgPath,tufile)
437 tufilename = os.path.join(experimentCfgPath,tufile)
438
438
439 f = open(tufilename)
439 f = open(tufilename)
440 lines = f.readlines()
440 lines = f.readlines()
441 f.close()
441 f.close()
442 self.ippSeconds_fromfile = float(lines[1].split()[2])/1E6
442 self.ippSeconds_fromfile = float(lines[1].split()[2])/1E6
443
443
444
444
445 self.status = 1
445 self.status = 1
446
446
447 def __setIdsAndArrays(self):
447 def __setIdsAndArrays(self):
448 self.dataByFrame = self.__setDataByFrame()
448 self.dataByFrame = self.__setDataByFrame()
449 self.beamCodeByFrame = self.amisrFilePointer.get('Raw11/Data/RadacHeader/BeamCode').value[0, :]
449 self.beamCodeByFrame = self.amisrFilePointer.get('Raw11/Data/RadacHeader/BeamCode').value[0, :]
450 self.readRanges()
450 self.readRanges()
451 self.index_amisr_sample, self.index_amisr_buffer = self.radacHeaderObj.getIndexRangeToPulse(0)
451 self.index_amisr_sample, self.index_amisr_buffer = self.radacHeaderObj.getIndexRangeToPulse(0)
452 self.radacTimeByFrame = numpy.zeros(self.radacHeaderObj.npulses)
452 self.radacTimeByFrame = numpy.zeros(self.radacHeaderObj.npulses)
453 if len(self.index_amisr_buffer) > 0:
453 if len(self.index_amisr_buffer) > 0:
454 self.buffer_radactime = numpy.zeros_like(self.radacTimeByFrame)
454 self.buffer_radactime = numpy.zeros_like(self.radacTimeByFrame)
455
455
456
456
457 def __setNextFile(self,online=False):
457 def __setNextFile(self,online=False):
458
458
459 if not(online):
459 if not(online):
460 newFile = self.__setNextFileOffline()
460 newFile = self.__setNextFileOffline()
461 else:
461 else:
462 newFile = self.__setNextFileOnline()
462 newFile = self.__setNextFileOnline()
463
463
464 if not(newFile):
464 if not(newFile):
465 return 0
465 return 0
466
466
467 self.__readHeader()
467 self.__readHeader()
468
468
469 if self.__firstFile:
469 if self.__firstFile:
470 self.__setIdsAndArrays()
470 self.__setIdsAndArrays()
471 self.__firstFile = False
471 self.__firstFile = False
472
472
473 self.__getBeamCode()
473 self.__getBeamCode()
474 self.readDataBlock()
474 self.readDataBlock()
475
475
476
476
477 def setup(self,path=None,
477 def setup(self,path=None,
478 startDate=None,
478 startDate=None,
479 endDate=None,
479 endDate=None,
480 startTime=datetime.time(0,0,0),
480 startTime=datetime.time(0,0,0),
481 endTime=datetime.time(23,59,59),
481 endTime=datetime.time(23,59,59),
482 walk=True,
482 walk=True,
483 timezone='ut',
483 timezone='ut',
484 all=0,
484 all=0,
485 online=False):
485 online=False):
486
486
487 self.timezone = timezone
487 self.timezone = timezone
488 self.all = all
488 self.all = all
489 self.online = online
489 self.online = online
490 if not(online):
490 if not(online):
491 #Busqueda de archivos offline
491 #Busqueda de archivos offline
492 self.__searchFilesOffline(path, startDate, endDate, startTime, endTime, walk)
492 self.__searchFilesOffline(path, startDate, endDate, startTime, endTime, walk)
493 else:
493 else:
494 self.__searchFilesOnline(path, walk)
494 self.__searchFilesOnline(path, walk)
495
495
496 if not(self.filenameList):
496 if not(self.filenameList):
497 print "There is no files into the folder: %s"%(path)
497 print "There is no files into the folder: %s"%(path)
498
498
499 sys.exit(-1)
499 sys.exit(-1)
500
500
501 self.__getExpParameters()
501 self.__getExpParameters()
502
502
503 self.fileIndex = -1
503 self.fileIndex = -1
504
504
505 self.__setNextFile(online)
505 self.__setNextFile(online)
506
506
507 # first_beamcode = self.radacHeaderObj.beamCodeByPulse[0,0]
507 # first_beamcode = self.radacHeaderObj.beamCodeByPulse[0,0]
508 # index = numpy.where(self.radacHeaderObj.beamCodeByPulse[0,:]!=first_beamcode)[0][0]
508 # index = numpy.where(self.radacHeaderObj.beamCodeByPulse[0,:]!=first_beamcode)[0][0]
509 self.profileIndex_offset = self.radacHeaderObj.pulseCount[0,:][0]
509 self.profileIndex_offset = self.radacHeaderObj.pulseCount[0,:][0]
510 self.profileIndex = self.profileIndex_offset
510 self.profileIndex = self.profileIndex_offset
511
511
512 def readRanges(self):
512 def readRanges(self):
513 dataset = self.amisrFilePointer.get('Raw11/Data/Samples/Range')
513 dataset = self.amisrFilePointer.get('Raw11/Data/Samples/Range')
514
514
515 self.rangeFromFile = numpy.reshape(dataset.value,(-1))
515 self.rangeFromFile = numpy.reshape(dataset.value,(-1))
516 return self.rangeFromFile
516 return self.rangeFromFile
517
517
518
518
519 def readRadacTime(self,idrecord, range1, range2):
519 def readRadacTime(self,idrecord, range1, range2):
520 self.radacTimeFromFile = self.radacHeaderObj.radacTime.value
520 self.radacTimeFromFile = self.radacHeaderObj.radacTime.value
521
521
522 radacTimeByFrame = numpy.zeros((self.radacHeaderObj.npulses))
522 radacTimeByFrame = numpy.zeros((self.radacHeaderObj.npulses))
523 #radacTimeByFrame = dataset[idrecord - 1,range1]
523 #radacTimeByFrame = dataset[idrecord - 1,range1]
524 #radacTimeByFrame = dataset[idrecord,range2]
524 #radacTimeByFrame = dataset[idrecord,range2]
525
525
526 return radacTimeByFrame
526 return radacTimeByFrame
527
527
528 def readBeamCode(self, idrecord, range1, range2):
528 def readBeamCode(self, idrecord, range1, range2):
529 dataset = self.amisrFilePointer.get('Raw11/Data/RadacHeader/BeamCode')
529 dataset = self.amisrFilePointer.get('Raw11/Data/RadacHeader/BeamCode')
530 beamcodeByFrame = numpy.zeros((self.radacHeaderObj.npulses))
530 beamcodeByFrame = numpy.zeros((self.radacHeaderObj.npulses))
531 self.beamCodesFromFile = dataset.value
531 self.beamCodesFromFile = dataset.value
532
532
533 #beamcodeByFrame[range1] = dataset[idrecord - 1, range1]
533 #beamcodeByFrame[range1] = dataset[idrecord - 1, range1]
534 #beamcodeByFrame[range2] = dataset[idrecord, range2]
534 #beamcodeByFrame[range2] = dataset[idrecord, range2]
535 beamcodeByFrame[range1] = dataset[idrecord, range1]
535 beamcodeByFrame[range1] = dataset[idrecord, range1]
536 beamcodeByFrame[range2] = dataset[idrecord, range2]
536 beamcodeByFrame[range2] = dataset[idrecord, range2]
537
537
538 return beamcodeByFrame
538 return beamcodeByFrame
539
539
540
540
541 def __setDataByFrame(self):
541 def __setDataByFrame(self):
542 ndata = 2 # porque es complejo
542 ndata = 2 # porque es complejo
543 dataByFrame = numpy.zeros((self.radacHeaderObj.npulses, self.radacHeaderObj.nsamples, ndata))
543 dataByFrame = numpy.zeros((self.radacHeaderObj.npulses, self.radacHeaderObj.nsamples, ndata))
544 return dataByFrame
544 return dataByFrame
545
545
546 def __readDataSet(self):
546 def __readDataSet(self):
547 dataset = self.amisrFilePointer.get('Raw11/Data/Samples/Data')
547 dataset = self.amisrFilePointer.get('Raw11/Data/Samples/Data')
548 return dataset
548 return dataset
549
549
550 def __setDataBlock(self,):
550 def __setDataBlock(self,):
551 real = self.dataByFrame[:,:,0] #asumo que 0 es real
551 real = self.dataByFrame[:,:,0] #asumo que 0 es real
552 imag = self.dataByFrame[:,:,1] #asumo que 1 es imaginario
552 imag = self.dataByFrame[:,:,1] #asumo que 1 es imaginario
553 datablock = real + imag*1j #armo el complejo
553 datablock = real + imag*1j #armo el complejo
554 return datablock
554 return datablock
555
555
556 def readSamples_version1(self,idrecord):
556 def readSamples_version1(self,idrecord):
557 #estas tres primeras lineas solo se deben ejecutar una vez
557 #estas tres primeras lineas solo se deben ejecutar una vez
558 if self.flagIsNewFile:
558 if self.flagIsNewFile:
559 #reading dataset
559 #reading dataset
560 self.dataset = self.__readDataSet()
560 self.dataset = self.__readDataSet()
561 self.flagIsNewFile = 0
561 self.flagIsNewFile = 0
562
562
563 if idrecord == 0:
563 if idrecord == 0:
564 self.dataByFrame[self.index4_schain_datablock, : ,:] = self.dataset[0, self.index_amisr_sample,:,:]
564 self.dataByFrame[self.index4_schain_datablock, : ,:] = self.dataset[0, self.index_amisr_sample,:,:]
565 self.radacTimeByFrame[self.index4_schain_datablock] = self.radacHeaderObj.radacTime[0, self.index_amisr_sample]
565 self.radacTimeByFrame[self.index4_schain_datablock] = self.radacHeaderObj.radacTime[0, self.index_amisr_sample]
566 datablock = self.__setDataBlock()
566 datablock = self.__setDataBlock()
567 if len(self.index_amisr_buffer) > 0:
567 if len(self.index_amisr_buffer) > 0:
568 self.buffer = self.dataset[0, self.index_amisr_buffer,:,:]
568 self.buffer = self.dataset[0, self.index_amisr_buffer,:,:]
569 self.buffer_radactime = self.radacHeaderObj.radacTime[0, self.index_amisr_buffer]
569 self.buffer_radactime = self.radacHeaderObj.radacTime[0, self.index_amisr_buffer]
570
570
571 return datablock
571 return datablock
572 if len(self.index_amisr_buffer) > 0:
572 if len(self.index_amisr_buffer) > 0:
573 self.dataByFrame[self.index4_buffer,:,:] = self.buffer.copy()
573 self.dataByFrame[self.index4_buffer,:,:] = self.buffer.copy()
574 self.radacTimeByFrame[self.index4_buffer] = self.buffer_radactime.copy()
574 self.radacTimeByFrame[self.index4_buffer] = self.buffer_radactime.copy()
575 self.dataByFrame[self.index4_schain_datablock,:,:] = self.dataset[idrecord, self.index_amisr_sample,:,:]
575 self.dataByFrame[self.index4_schain_datablock,:,:] = self.dataset[idrecord, self.index_amisr_sample,:,:]
576 self.radacTimeByFrame[self.index4_schain_datablock] = self.radacHeaderObj.radacTime[idrecord, self.index_amisr_sample]
576 self.radacTimeByFrame[self.index4_schain_datablock] = self.radacHeaderObj.radacTime[idrecord, self.index_amisr_sample]
577 datablock = self.__setDataBlock()
577 datablock = self.__setDataBlock()
578 if len(self.index_amisr_buffer) > 0:
578 if len(self.index_amisr_buffer) > 0:
579 self.buffer = self.dataset[idrecord, self.index_amisr_buffer, :, :]
579 self.buffer = self.dataset[idrecord, self.index_amisr_buffer, :, :]
580 self.buffer_radactime = self.radacHeaderObj.radacTime[idrecord, self.index_amisr_buffer]
580 self.buffer_radactime = self.radacHeaderObj.radacTime[idrecord, self.index_amisr_buffer]
581
581
582 return datablock
582 return datablock
583
583
584
584
585 def readSamples(self,idrecord):
585 def readSamples(self,idrecord):
586 if self.flagIsNewFile:
586 if self.flagIsNewFile:
587 self.dataByFrame = self.__setDataByFrame()
587 self.dataByFrame = self.__setDataByFrame()
588 self.beamCodeByFrame = self.amisrFilePointer.get('Raw11/Data/RadacHeader/BeamCode').value[idrecord, :]
588 self.beamCodeByFrame = self.amisrFilePointer.get('Raw11/Data/RadacHeader/BeamCode').value[idrecord, :]
589
589
590 #reading ranges
590 #reading ranges
591 self.readRanges()
591 self.readRanges()
592 #reading dataset
592 #reading dataset
593 self.dataset = self.__readDataSet()
593 self.dataset = self.__readDataSet()
594
594
595 self.flagIsNewFile = 0
595 self.flagIsNewFile = 0
596 self.radacTimeByFrame = self.radacHeaderObj.radacTime.value[idrecord, :]
596 self.radacTimeByFrame = self.radacHeaderObj.radacTime.value[idrecord, :]
597 self.dataByFrame = self.dataset[idrecord, :, :, :]
597 self.dataByFrame = self.dataset[idrecord, :, :, :]
598 datablock = self.__setDataBlock()
598 datablock = self.__setDataBlock()
599 return datablock
599 return datablock
600
600
601
601
602 def readDataBlock(self):
602 def readDataBlock(self):
603
603
604 self.datablock = self.readSamples_version1(self.idrecord_count)
604 self.datablock = self.readSamples_version1(self.idrecord_count)
605 #self.datablock = self.readSamples(self.idrecord_count)
605 #self.datablock = self.readSamples(self.idrecord_count)
606 #print 'record:', self.idrecord_count
606 #print 'record:', self.idrecord_count
607
607
608 self.idrecord_count += 1
608 self.idrecord_count += 1
609 self.profileIndex = 0
609 self.profileIndex = 0
610
610
611 if self.idrecord_count >= self.radacHeaderObj.nrecords:
611 if self.idrecord_count >= self.radacHeaderObj.nrecords:
612 self.idrecord_count = 0
612 self.idrecord_count = 0
613 self.flagIsNewFile = 1
613 self.flagIsNewFile = 1
614
614
615 def readNextBlock(self):
615 def readNextBlock(self):
616
616
617 self.readDataBlock()
617 self.readDataBlock()
618
618
619 if self.flagIsNewFile:
619 if self.flagIsNewFile:
620 self.__setNextFile(self.online)
620 self.__setNextFile(self.online)
621 pass
621 pass
622
622
623 def __hasNotDataInBuffer(self):
623 def __hasNotDataInBuffer(self):
624 #self.radacHeaderObj.npulses debe ser otra variable para considerar el numero de pulsos a tomar en el primer y ultimo record
624 #self.radacHeaderObj.npulses debe ser otra variable para considerar el numero de pulsos a tomar en el primer y ultimo record
625 if self.profileIndex >= self.radacHeaderObj.npulses:
625 if self.profileIndex >= self.radacHeaderObj.npulses:
626 return 1
626 return 1
627 return 0
627 return 0
628
628
629 def printUTC(self):
629 def printUTC(self):
630 print self.dataOut.utctime
630 print self.dataOut.utctime
631 print ''
631 print ''
632
632
633 def setObjProperties(self):
633 def setObjProperties(self):
634
634 self.dataOut.heightList = self.rangeFromFile/1000.0 #km
635 self.dataOut.heightList = self.rangeFromFile/1000.0 #km
635 self.dataOut.nProfiles = self.radacHeaderObj.npulses
636 self.dataOut.nProfiles = self.radacHeaderObj.npulses
636 self.dataOut.nRecords = self.radacHeaderObj.nrecords
637 self.dataOut.nRecords = self.radacHeaderObj.nrecords
637 self.dataOut.nBeams = self.radacHeaderObj.nbeams
638 self.dataOut.nBeams = self.radacHeaderObj.nbeams
638 self.dataOut.ippSeconds = self.ippSeconds_fromfile
639 self.dataOut.ippSeconds = self.ippSeconds_fromfile
639 self.dataOut.timeInterval = self.dataOut.ippSeconds * self.dataOut.nCohInt
640 # self.dataOut.timeInterval = self.dataOut.ippSeconds * self.dataOut.nCohInt
640 self.dataOut.frequency = self.frequency_h5file
641 self.dataOut.frequency = self.frequency_h5file
641 self.dataOut.npulseByFrame = self.npulseByFrame
642 self.dataOut.npulseByFrame = self.npulseByFrame
642 self.dataOut.nBaud = None
643 self.dataOut.nBaud = None
643 self.dataOut.nCode = None
644 self.dataOut.nCode = None
644 self.dataOut.code = None
645 self.dataOut.code = None
645
646
646 self.dataOut.beamCodeDict = self.beamCodeDict
647 self.dataOut.beamCodeDict = self.beamCodeDict
647 self.dataOut.beamRangeDict = self.beamRangeDict
648 self.dataOut.beamRangeDict = self.beamRangeDict
648
649
649 if self.timezone == 'lt':
650 if self.timezone == 'lt':
650 self.dataOut.timeZone = time.timezone / 60. #get the timezone in minutes
651 self.dataOut.timeZone = time.timezone / 60. #get the timezone in minutes
651 else:
652 else:
652 self.dataOut.timeZone = 0 #by default time is UTC
653 self.dataOut.timeZone = 0 #by default time is UTC
653
654
654 def getData(self):
655 def getData(self):
655
656
656 if self.flagNoMoreFiles:
657 if self.flagNoMoreFiles:
657 self.dataOut.flagNoData = True
658 self.dataOut.flagNoData = True
658 print 'Process finished'
659 print 'Process finished'
659 return 0
660 return 0
660
661
661 if self.__hasNotDataInBuffer():
662 if self.__hasNotDataInBuffer():
662 self.readNextBlock()
663 self.readNextBlock()
663
664
664
665
665 if self.datablock == None: # setear esta condicion cuando no hayan datos por leers
666 if self.datablock == None: # setear esta condicion cuando no hayan datos por leers
666 self.dataOut.flagNoData = True
667 self.dataOut.flagNoData = True
667 return 0
668 return 0
668
669
669 self.dataOut.data = numpy.reshape(self.datablock[self.profileIndex,:],(1,-1))
670 self.dataOut.data = numpy.reshape(self.datablock[self.profileIndex,:],(1,-1))
670
671
671 self.dataOut.utctime = self.radacTimeByFrame[self.profileIndex]
672 self.dataOut.utctime = self.radacTimeByFrame[self.profileIndex]
672 self.dataOut.profileIndex = self.profileIndex
673 self.dataOut.profileIndex = self.profileIndex
673 self.dataOut.flagNoData = False
674 self.dataOut.flagNoData = False
674
675
675 self.profileIndex += 1
676 self.profileIndex += 1
676
677
677 return self.dataOut.data
678 return self.dataOut.data
678
679
679
680
680 def run(self, **kwargs):
681 def run(self, **kwargs):
681 if not(self.isConfig):
682 if not(self.isConfig):
682 self.setup(**kwargs)
683 self.setup(**kwargs)
683 self.setObjProperties()
684 self.setObjProperties()
684 self.isConfig = True
685 self.isConfig = True
685
686
686 self.getData()
687 self.getData()
@@ -1,1337 +1,1338
1 '''
1 '''
2
2
3 '''
3 '''
4 import os
4 import os
5 import sys
5 import sys
6 import glob
6 import glob
7 import time
7 import time
8 import numpy
8 import numpy
9 import fnmatch
9 import fnmatch
10 import time, datetime
10 import time, datetime
11 #import h5py
11 #import h5py
12 import traceback
12 import traceback
13
13
14 #try:
14 #try:
15 # import pyfits
15 # import pyfits
16 #except:
16 #except:
17 # print "pyfits module has not been imported, it should be installed to save files in fits format"
17 # print "pyfits module has not been imported, it should be installed to save files in fits format"
18
18
19 #from jrodata import *
19 #from jrodata import *
20 #from jroheaderIO import *
20 #from jroheaderIO import *
21 #from jroprocessing import *
21 #from jroprocessing import *
22
22
23 #import re
23 #import re
24 #from xml.etree.ElementTree import Element, SubElement, ElementTree
24 #from xml.etree.ElementTree import Element, SubElement, ElementTree
25
25
26
26
27 LOCALTIME = True #-18000
27 LOCALTIME = True #-18000
28
28
29 from model.data.jroheaderIO import PROCFLAG, BasicHeader, SystemHeader, RadarControllerHeader, ProcessingHeader
29 from model.data.jroheaderIO import PROCFLAG, BasicHeader, SystemHeader, RadarControllerHeader, ProcessingHeader
30
30
31 def isNumber(str):
31 def isNumber(str):
32 """
32 """
33 Chequea si el conjunto de caracteres que componen un string puede ser convertidos a un numero.
33 Chequea si el conjunto de caracteres que componen un string puede ser convertidos a un numero.
34
34
35 Excepciones:
35 Excepciones:
36 Si un determinado string no puede ser convertido a numero
36 Si un determinado string no puede ser convertido a numero
37 Input:
37 Input:
38 str, string al cual se le analiza para determinar si convertible a un numero o no
38 str, string al cual se le analiza para determinar si convertible a un numero o no
39
39
40 Return:
40 Return:
41 True : si el string es uno numerico
41 True : si el string es uno numerico
42 False : no es un string numerico
42 False : no es un string numerico
43 """
43 """
44 try:
44 try:
45 float( str )
45 float( str )
46 return True
46 return True
47 except:
47 except:
48 return False
48 return False
49
49
50 def isThisFileinRange(filename, startUTSeconds, endUTSeconds):
50 def isThisFileinRange(filename, startUTSeconds, endUTSeconds):
51 """
51 """
52 Esta funcion determina si un archivo de datos se encuentra o no dentro del rango de fecha especificado.
52 Esta funcion determina si un archivo de datos se encuentra o no dentro del rango de fecha especificado.
53
53
54 Inputs:
54 Inputs:
55 filename : nombre completo del archivo de datos en formato Jicamarca (.r)
55 filename : nombre completo del archivo de datos en formato Jicamarca (.r)
56
56
57 startUTSeconds : fecha inicial del rango seleccionado. La fecha esta dada en
57 startUTSeconds : fecha inicial del rango seleccionado. La fecha esta dada en
58 segundos contados desde 01/01/1970.
58 segundos contados desde 01/01/1970.
59 endUTSeconds : fecha final del rango seleccionado. La fecha esta dada en
59 endUTSeconds : fecha final del rango seleccionado. La fecha esta dada en
60 segundos contados desde 01/01/1970.
60 segundos contados desde 01/01/1970.
61
61
62 Return:
62 Return:
63 Boolean : Retorna True si el archivo de datos contiene datos en el rango de
63 Boolean : Retorna True si el archivo de datos contiene datos en el rango de
64 fecha especificado, de lo contrario retorna False.
64 fecha especificado, de lo contrario retorna False.
65
65
66 Excepciones:
66 Excepciones:
67 Si el archivo no existe o no puede ser abierto
67 Si el archivo no existe o no puede ser abierto
68 Si la cabecera no puede ser leida.
68 Si la cabecera no puede ser leida.
69
69
70 """
70 """
71 basicHeaderObj = BasicHeader(LOCALTIME)
71 basicHeaderObj = BasicHeader(LOCALTIME)
72
72
73 try:
73 try:
74 fp = open(filename,'rb')
74 fp = open(filename,'rb')
75 except IOError:
75 except IOError:
76 traceback.print_exc()
76 traceback.print_exc()
77 raise IOError, "The file %s can't be opened" %(filename)
77 raise IOError, "The file %s can't be opened" %(filename)
78
78
79 sts = basicHeaderObj.read(fp)
79 sts = basicHeaderObj.read(fp)
80 fp.close()
80 fp.close()
81
81
82 if not(sts):
82 if not(sts):
83 print "Skipping the file %s because it has not a valid header" %(filename)
83 print "Skipping the file %s because it has not a valid header" %(filename)
84 return 0
84 return 0
85
85
86 if not ((startUTSeconds <= basicHeaderObj.utc) and (endUTSeconds > basicHeaderObj.utc)):
86 if not ((startUTSeconds <= basicHeaderObj.utc) and (endUTSeconds > basicHeaderObj.utc)):
87 return 0
87 return 0
88
88
89 return 1
89 return 1
90
90
91 def isFileinThisTime(filename, startTime, endTime):
91 def isFileinThisTime(filename, startTime, endTime):
92 """
92 """
93 Retorna 1 si el archivo de datos se encuentra dentro del rango de horas especificado.
93 Retorna 1 si el archivo de datos se encuentra dentro del rango de horas especificado.
94
94
95 Inputs:
95 Inputs:
96 filename : nombre completo del archivo de datos en formato Jicamarca (.r)
96 filename : nombre completo del archivo de datos en formato Jicamarca (.r)
97
97
98 startTime : tiempo inicial del rango seleccionado en formato datetime.time
98 startTime : tiempo inicial del rango seleccionado en formato datetime.time
99
99
100 endTime : tiempo final del rango seleccionado en formato datetime.time
100 endTime : tiempo final del rango seleccionado en formato datetime.time
101
101
102 Return:
102 Return:
103 Boolean : Retorna True si el archivo de datos contiene datos en el rango de
103 Boolean : Retorna True si el archivo de datos contiene datos en el rango de
104 fecha especificado, de lo contrario retorna False.
104 fecha especificado, de lo contrario retorna False.
105
105
106 Excepciones:
106 Excepciones:
107 Si el archivo no existe o no puede ser abierto
107 Si el archivo no existe o no puede ser abierto
108 Si la cabecera no puede ser leida.
108 Si la cabecera no puede ser leida.
109
109
110 """
110 """
111
111
112
112
113 try:
113 try:
114 fp = open(filename,'rb')
114 fp = open(filename,'rb')
115 except IOError:
115 except IOError:
116 traceback.print_exc()
116 traceback.print_exc()
117 raise IOError, "The file %s can't be opened" %(filename)
117 raise IOError, "The file %s can't be opened" %(filename)
118
118
119 basicHeaderObj = BasicHeader(LOCALTIME)
119 basicHeaderObj = BasicHeader(LOCALTIME)
120 sts = basicHeaderObj.read(fp)
120 sts = basicHeaderObj.read(fp)
121 fp.close()
121 fp.close()
122
122
123 thisDatetime = basicHeaderObj.datatime
123 thisDatetime = basicHeaderObj.datatime
124 thisTime = thisDatetime.time()
124 thisTime = thisDatetime.time()
125
125
126 if not(sts):
126 if not(sts):
127 print "Skipping the file %s because it has not a valid header" %(filename)
127 print "Skipping the file %s because it has not a valid header" %(filename)
128 return None
128 return None
129
129
130 if not ((startTime <= thisTime) and (endTime > thisTime)):
130 if not ((startTime <= thisTime) and (endTime > thisTime)):
131 return None
131 return None
132
132
133 return thisDatetime
133 return thisDatetime
134
134
135 def getFileFromSet(path, ext, set):
135 def getFileFromSet(path, ext, set):
136 validFilelist = []
136 validFilelist = []
137 fileList = os.listdir(path)
137 fileList = os.listdir(path)
138
138
139 # 0 1234 567 89A BCDE
139 # 0 1234 567 89A BCDE
140 # H YYYY DDD SSS .ext
140 # H YYYY DDD SSS .ext
141
141
142 for thisFile in fileList:
142 for thisFile in fileList:
143 try:
143 try:
144 year = int(thisFile[1:5])
144 year = int(thisFile[1:5])
145 doy = int(thisFile[5:8])
145 doy = int(thisFile[5:8])
146 except:
146 except:
147 continue
147 continue
148
148
149 if (os.path.splitext(thisFile)[-1].lower() != ext.lower()):
149 if (os.path.splitext(thisFile)[-1].lower() != ext.lower()):
150 continue
150 continue
151
151
152 validFilelist.append(thisFile)
152 validFilelist.append(thisFile)
153
153
154 myfile = fnmatch.filter(validFilelist,'*%4.4d%3.3d%3.3d*'%(year,doy,set))
154 myfile = fnmatch.filter(validFilelist,'*%4.4d%3.3d%3.3d*'%(year,doy,set))
155
155
156 if len(myfile)!= 0:
156 if len(myfile)!= 0:
157 return myfile[0]
157 return myfile[0]
158 else:
158 else:
159 filename = '*%4.4d%3.3d%3.3d%s'%(year,doy,set,ext.lower())
159 filename = '*%4.4d%3.3d%3.3d%s'%(year,doy,set,ext.lower())
160 print 'the filename %s does not exist'%filename
160 print 'the filename %s does not exist'%filename
161 print '...going to the last file: '
161 print '...going to the last file: '
162
162
163 if validFilelist:
163 if validFilelist:
164 validFilelist = sorted( validFilelist, key=str.lower )
164 validFilelist = sorted( validFilelist, key=str.lower )
165 return validFilelist[-1]
165 return validFilelist[-1]
166
166
167 return None
167 return None
168
168
169 def getlastFileFromPath(path, ext):
169 def getlastFileFromPath(path, ext):
170 """
170 """
171 Depura el fileList dejando solo los que cumplan el formato de "PYYYYDDDSSS.ext"
171 Depura el fileList dejando solo los que cumplan el formato de "PYYYYDDDSSS.ext"
172 al final de la depuracion devuelve el ultimo file de la lista que quedo.
172 al final de la depuracion devuelve el ultimo file de la lista que quedo.
173
173
174 Input:
174 Input:
175 fileList : lista conteniendo todos los files (sin path) que componen una determinada carpeta
175 fileList : lista conteniendo todos los files (sin path) que componen una determinada carpeta
176 ext : extension de los files contenidos en una carpeta
176 ext : extension de los files contenidos en una carpeta
177
177
178 Return:
178 Return:
179 El ultimo file de una determinada carpeta, no se considera el path.
179 El ultimo file de una determinada carpeta, no se considera el path.
180 """
180 """
181 validFilelist = []
181 validFilelist = []
182 fileList = os.listdir(path)
182 fileList = os.listdir(path)
183
183
184 # 0 1234 567 89A BCDE
184 # 0 1234 567 89A BCDE
185 # H YYYY DDD SSS .ext
185 # H YYYY DDD SSS .ext
186
186
187 for thisFile in fileList:
187 for thisFile in fileList:
188
188
189 year = thisFile[1:5]
189 year = thisFile[1:5]
190 if not isNumber(year):
190 if not isNumber(year):
191 continue
191 continue
192
192
193 doy = thisFile[5:8]
193 doy = thisFile[5:8]
194 if not isNumber(doy):
194 if not isNumber(doy):
195 continue
195 continue
196
196
197 year = int(year)
197 year = int(year)
198 doy = int(doy)
198 doy = int(doy)
199
199
200 if (os.path.splitext(thisFile)[-1].lower() != ext.lower()):
200 if (os.path.splitext(thisFile)[-1].lower() != ext.lower()):
201 continue
201 continue
202
202
203 validFilelist.append(thisFile)
203 validFilelist.append(thisFile)
204
204
205 if validFilelist:
205 if validFilelist:
206 validFilelist = sorted( validFilelist, key=str.lower )
206 validFilelist = sorted( validFilelist, key=str.lower )
207 return validFilelist[-1]
207 return validFilelist[-1]
208
208
209 return None
209 return None
210
210
211 def checkForRealPath(path, foldercounter, year, doy, set, ext):
211 def checkForRealPath(path, foldercounter, year, doy, set, ext):
212 """
212 """
213 Por ser Linux Case Sensitive entonces checkForRealPath encuentra el nombre correcto de un path,
213 Por ser Linux Case Sensitive entonces checkForRealPath encuentra el nombre correcto de un path,
214 Prueba por varias combinaciones de nombres entre mayusculas y minusculas para determinar
214 Prueba por varias combinaciones de nombres entre mayusculas y minusculas para determinar
215 el path exacto de un determinado file.
215 el path exacto de un determinado file.
216
216
217 Example :
217 Example :
218 nombre correcto del file es .../.../D2009307/P2009307367.ext
218 nombre correcto del file es .../.../D2009307/P2009307367.ext
219
219
220 Entonces la funcion prueba con las siguientes combinaciones
220 Entonces la funcion prueba con las siguientes combinaciones
221 .../.../y2009307367.ext
221 .../.../y2009307367.ext
222 .../.../Y2009307367.ext
222 .../.../Y2009307367.ext
223 .../.../x2009307/y2009307367.ext
223 .../.../x2009307/y2009307367.ext
224 .../.../x2009307/Y2009307367.ext
224 .../.../x2009307/Y2009307367.ext
225 .../.../X2009307/y2009307367.ext
225 .../.../X2009307/y2009307367.ext
226 .../.../X2009307/Y2009307367.ext
226 .../.../X2009307/Y2009307367.ext
227 siendo para este caso, la ultima combinacion de letras, identica al file buscado
227 siendo para este caso, la ultima combinacion de letras, identica al file buscado
228
228
229 Return:
229 Return:
230 Si encuentra la cobinacion adecuada devuelve el path completo y el nombre del file
230 Si encuentra la cobinacion adecuada devuelve el path completo y el nombre del file
231 caso contrario devuelve None como path y el la ultima combinacion de nombre en mayusculas
231 caso contrario devuelve None como path y el la ultima combinacion de nombre en mayusculas
232 para el filename
232 para el filename
233 """
233 """
234 fullfilename = None
234 fullfilename = None
235 find_flag = False
235 find_flag = False
236 filename = None
236 filename = None
237
237
238 prefixDirList = [None,'d','D']
238 prefixDirList = [None,'d','D']
239 if ext.lower() == ".r": #voltage
239 if ext.lower() == ".r": #voltage
240 prefixFileList = ['d','D']
240 prefixFileList = ['d','D']
241 elif ext.lower() == ".pdata": #spectra
241 elif ext.lower() == ".pdata": #spectra
242 prefixFileList = ['p','P']
242 prefixFileList = ['p','P']
243 else:
243 else:
244 return None, filename
244 return None, filename
245
245
246 #barrido por las combinaciones posibles
246 #barrido por las combinaciones posibles
247 for prefixDir in prefixDirList:
247 for prefixDir in prefixDirList:
248 thispath = path
248 thispath = path
249 if prefixDir != None:
249 if prefixDir != None:
250 #formo el nombre del directorio xYYYYDDD (x=d o x=D)
250 #formo el nombre del directorio xYYYYDDD (x=d o x=D)
251 if foldercounter == 0:
251 if foldercounter == 0:
252 thispath = os.path.join(path, "%s%04d%03d" % ( prefixDir, year, doy ))
252 thispath = os.path.join(path, "%s%04d%03d" % ( prefixDir, year, doy ))
253 else:
253 else:
254 thispath = os.path.join(path, "%s%04d%03d_%02d" % ( prefixDir, year, doy , foldercounter))
254 thispath = os.path.join(path, "%s%04d%03d_%02d" % ( prefixDir, year, doy , foldercounter))
255 for prefixFile in prefixFileList: #barrido por las dos combinaciones posibles de "D"
255 for prefixFile in prefixFileList: #barrido por las dos combinaciones posibles de "D"
256 filename = "%s%04d%03d%03d%s" % ( prefixFile, year, doy, set, ext ) #formo el nombre del file xYYYYDDDSSS.ext
256 filename = "%s%04d%03d%03d%s" % ( prefixFile, year, doy, set, ext ) #formo el nombre del file xYYYYDDDSSS.ext
257 fullfilename = os.path.join( thispath, filename ) #formo el path completo
257 fullfilename = os.path.join( thispath, filename ) #formo el path completo
258
258
259 if os.path.exists( fullfilename ): #verifico que exista
259 if os.path.exists( fullfilename ): #verifico que exista
260 find_flag = True
260 find_flag = True
261 break
261 break
262 if find_flag:
262 if find_flag:
263 break
263 break
264
264
265 if not(find_flag):
265 if not(find_flag):
266 return None, filename
266 return None, filename
267
267
268 return fullfilename, filename
268 return fullfilename, filename
269
269
270 def isDoyFolder(folder):
270 def isDoyFolder(folder):
271 try:
271 try:
272 year = int(folder[1:5])
272 year = int(folder[1:5])
273 except:
273 except:
274 return 0
274 return 0
275
275
276 try:
276 try:
277 doy = int(folder[5:8])
277 doy = int(folder[5:8])
278 except:
278 except:
279 return 0
279 return 0
280
280
281 return 1
281 return 1
282
282
283 class JRODataIO:
283 class JRODataIO:
284
284
285 c = 3E8
285 c = 3E8
286
286
287 isConfig = False
287 isConfig = False
288
288
289 basicHeaderObj = None
289 basicHeaderObj = None
290
290
291 systemHeaderObj = None
291 systemHeaderObj = None
292
292
293 radarControllerHeaderObj = None
293 radarControllerHeaderObj = None
294
294
295 processingHeaderObj = None
295 processingHeaderObj = None
296
296
297 online = 0
297 online = 0
298
298
299 dtype = None
299 dtype = None
300
300
301 pathList = []
301 pathList = []
302
302
303 filenameList = []
303 filenameList = []
304
304
305 filename = None
305 filename = None
306
306
307 ext = None
307 ext = None
308
308
309 flagIsNewFile = 1
309 flagIsNewFile = 1
310
310
311 flagTimeBlock = 0
311 flagTimeBlock = 0
312
312
313 flagIsNewBlock = 0
313 flagIsNewBlock = 0
314
314
315 fp = None
315 fp = None
316
316
317 firstHeaderSize = 0
317 firstHeaderSize = 0
318
318
319 basicHeaderSize = 24
319 basicHeaderSize = 24
320
320
321 versionFile = 1103
321 versionFile = 1103
322
322
323 fileSize = None
323 fileSize = None
324
324
325 # ippSeconds = None
325 # ippSeconds = None
326
326
327 fileSizeByHeader = None
327 fileSizeByHeader = None
328
328
329 fileIndex = None
329 fileIndex = None
330
330
331 profileIndex = None
331 profileIndex = None
332
332
333 blockIndex = None
333 blockIndex = None
334
334
335 nTotalBlocks = None
335 nTotalBlocks = None
336
336
337 maxTimeStep = 30
337 maxTimeStep = 30
338
338
339 lastUTTime = None
339 lastUTTime = None
340
340
341 datablock = None
341 datablock = None
342
342
343 dataOut = None
343 dataOut = None
344
344
345 blocksize = None
345 blocksize = None
346
346
347 getblock = False
347 getByBlock = False
348
348
349 def __init__(self):
349 def __init__(self):
350
350
351 raise ValueError, "Not implemented"
351 raise ValueError, "Not implemented"
352
352
353 def run(self):
353 def run(self):
354
354
355 raise ValueError, "Not implemented"
355 raise ValueError, "Not implemented"
356
356
357 class JRODataReader(JRODataIO):
357 class JRODataReader(JRODataIO):
358
358
359 nReadBlocks = 0
359 nReadBlocks = 0
360
360
361 delay = 10 #number of seconds waiting a new file
361 delay = 10 #number of seconds waiting a new file
362
362
363 nTries = 3 #quantity tries
363 nTries = 3 #quantity tries
364
364
365 nFiles = 3 #number of files for searching
365 nFiles = 3 #number of files for searching
366
366
367 path = None
367 path = None
368
368
369 foldercounter = 0
369 foldercounter = 0
370
370
371 flagNoMoreFiles = 0
371 flagNoMoreFiles = 0
372
372
373 datetimeList = []
373 datetimeList = []
374
374
375 __isFirstTimeOnline = 1
375 __isFirstTimeOnline = 1
376
376
377 __printInfo = True
377 __printInfo = True
378
378
379 profileIndex = None
379 profileIndex = None
380
380
381 def __init__(self):
381 def __init__(self):
382
382
383 """
383 """
384
384
385 """
385 """
386
386
387 raise ValueError, "This method has not been implemented"
387 raise ValueError, "This method has not been implemented"
388
388
389
389
390 def createObjByDefault(self):
390 def createObjByDefault(self):
391 """
391 """
392
392
393 """
393 """
394 raise ValueError, "This method has not been implemented"
394 raise ValueError, "This method has not been implemented"
395
395
396 def getBlockDimension(self):
396 def getBlockDimension(self):
397
397
398 raise ValueError, "No implemented"
398 raise ValueError, "No implemented"
399
399
400 def __searchFilesOffLine(self,
400 def __searchFilesOffLine(self,
401 path,
401 path,
402 startDate,
402 startDate,
403 endDate,
403 endDate,
404 startTime=datetime.time(0,0,0),
404 startTime=datetime.time(0,0,0),
405 endTime=datetime.time(23,59,59),
405 endTime=datetime.time(23,59,59),
406 set=None,
406 set=None,
407 expLabel='',
407 expLabel='',
408 ext='.r',
408 ext='.r',
409 walk=True):
409 walk=True):
410
410
411 pathList = []
411 pathList = []
412
412
413 if not walk:
413 if not walk:
414 #pathList.append(path)
414 #pathList.append(path)
415 multi_path = path.split(',')
415 multi_path = path.split(',')
416 for single_path in multi_path:
416 for single_path in multi_path:
417 pathList.append(single_path)
417 pathList.append(single_path)
418
418
419 else:
419 else:
420 #dirList = []
420 #dirList = []
421 multi_path = path.split(',')
421 multi_path = path.split(',')
422 for single_path in multi_path:
422 for single_path in multi_path:
423 dirList = []
423 dirList = []
424 for thisPath in os.listdir(single_path):
424 for thisPath in os.listdir(single_path):
425 if not os.path.isdir(os.path.join(single_path,thisPath)):
425 if not os.path.isdir(os.path.join(single_path,thisPath)):
426 continue
426 continue
427 if not isDoyFolder(thisPath):
427 if not isDoyFolder(thisPath):
428 continue
428 continue
429
429
430 dirList.append(thisPath)
430 dirList.append(thisPath)
431
431
432 if not(dirList):
432 if not(dirList):
433 return None, None
433 return None, None
434
434
435 thisDate = startDate
435 thisDate = startDate
436
436
437 while(thisDate <= endDate):
437 while(thisDate <= endDate):
438 year = thisDate.timetuple().tm_year
438 year = thisDate.timetuple().tm_year
439 doy = thisDate.timetuple().tm_yday
439 doy = thisDate.timetuple().tm_yday
440
440
441 matchlist = fnmatch.filter(dirList, '?' + '%4.4d%3.3d' % (year,doy) + '*')
441 matchlist = fnmatch.filter(dirList, '?' + '%4.4d%3.3d' % (year,doy) + '*')
442 if len(matchlist) == 0:
442 if len(matchlist) == 0:
443 thisDate += datetime.timedelta(1)
443 thisDate += datetime.timedelta(1)
444 continue
444 continue
445 for match in matchlist:
445 for match in matchlist:
446 pathList.append(os.path.join(single_path,match,expLabel))
446 pathList.append(os.path.join(single_path,match,expLabel))
447
447
448 thisDate += datetime.timedelta(1)
448 thisDate += datetime.timedelta(1)
449
449
450 if pathList == []:
450 if pathList == []:
451 print "Any folder was found for the date range: %s-%s" %(startDate, endDate)
451 print "Any folder was found for the date range: %s-%s" %(startDate, endDate)
452 return None, None
452 return None, None
453
453
454 print "%d folder(s) was(were) found for the date range: %s - %s" %(len(pathList), startDate, endDate)
454 print "%d folder(s) was(were) found for the date range: %s - %s" %(len(pathList), startDate, endDate)
455
455
456 filenameList = []
456 filenameList = []
457 datetimeList = []
457 datetimeList = []
458 pathDict = {}
458 pathDict = {}
459 filenameList_to_sort = []
459 filenameList_to_sort = []
460
460
461 for i in range(len(pathList)):
461 for i in range(len(pathList)):
462
462
463 thisPath = pathList[i]
463 thisPath = pathList[i]
464
464
465 fileList = glob.glob1(thisPath, "*%s" %ext)
465 fileList = glob.glob1(thisPath, "*%s" %ext)
466 fileList.sort()
466 fileList.sort()
467 pathDict.setdefault(fileList[0])
467 pathDict.setdefault(fileList[0])
468 pathDict[fileList[0]] = i
468 pathDict[fileList[0]] = i
469 filenameList_to_sort.append(fileList[0])
469 filenameList_to_sort.append(fileList[0])
470
470
471 filenameList_to_sort.sort()
471 filenameList_to_sort.sort()
472
472
473 for file in filenameList_to_sort:
473 for file in filenameList_to_sort:
474 thisPath = pathList[pathDict[file]]
474 thisPath = pathList[pathDict[file]]
475
475
476 fileList = glob.glob1(thisPath, "*%s" %ext)
476 fileList = glob.glob1(thisPath, "*%s" %ext)
477 fileList.sort()
477 fileList.sort()
478
478
479 for file in fileList:
479 for file in fileList:
480
480
481 filename = os.path.join(thisPath,file)
481 filename = os.path.join(thisPath,file)
482 thisDatetime = isFileinThisTime(filename, startTime, endTime)
482 thisDatetime = isFileinThisTime(filename, startTime, endTime)
483
483
484 if not(thisDatetime):
484 if not(thisDatetime):
485 continue
485 continue
486
486
487 filenameList.append(filename)
487 filenameList.append(filename)
488 datetimeList.append(thisDatetime)
488 datetimeList.append(thisDatetime)
489
489
490 if not(filenameList):
490 if not(filenameList):
491 print "Any file was found for the time range %s - %s" %(startTime, endTime)
491 print "Any file was found for the time range %s - %s" %(startTime, endTime)
492 return None, None
492 return None, None
493
493
494 print "%d file(s) was(were) found for the time range: %s - %s" %(len(filenameList), startTime, endTime)
494 print "%d file(s) was(were) found for the time range: %s - %s" %(len(filenameList), startTime, endTime)
495 print
495 print
496
496
497 for i in range(len(filenameList)):
497 for i in range(len(filenameList)):
498 print "%s -> [%s]" %(filenameList[i], datetimeList[i].ctime())
498 print "%s -> [%s]" %(filenameList[i], datetimeList[i].ctime())
499
499
500 self.filenameList = filenameList
500 self.filenameList = filenameList
501 self.datetimeList = datetimeList
501 self.datetimeList = datetimeList
502
502
503 return pathList, filenameList
503 return pathList, filenameList
504
504
505 def __searchFilesOnLine(self, path, expLabel = "", ext = None, walk=True, set=None):
505 def __searchFilesOnLine(self, path, expLabel = "", ext = None, walk=True, set=None):
506
506
507 """
507 """
508 Busca el ultimo archivo de la ultima carpeta (determinada o no por startDateTime) y
508 Busca el ultimo archivo de la ultima carpeta (determinada o no por startDateTime) y
509 devuelve el archivo encontrado ademas de otros datos.
509 devuelve el archivo encontrado ademas de otros datos.
510
510
511 Input:
511 Input:
512 path : carpeta donde estan contenidos los files que contiene data
512 path : carpeta donde estan contenidos los files que contiene data
513
513
514 expLabel : Nombre del subexperimento (subfolder)
514 expLabel : Nombre del subexperimento (subfolder)
515
515
516 ext : extension de los files
516 ext : extension de los files
517
517
518 walk : Si es habilitado no realiza busquedas dentro de los ubdirectorios (doypath)
518 walk : Si es habilitado no realiza busquedas dentro de los ubdirectorios (doypath)
519
519
520 Return:
520 Return:
521 directory : eL directorio donde esta el file encontrado
521 directory : eL directorio donde esta el file encontrado
522 filename : el ultimo file de una determinada carpeta
522 filename : el ultimo file de una determinada carpeta
523 year : el anho
523 year : el anho
524 doy : el numero de dia del anho
524 doy : el numero de dia del anho
525 set : el set del archivo
525 set : el set del archivo
526
526
527
527
528 """
528 """
529 dirList = []
529 dirList = []
530
530
531 if not walk:
531 if not walk:
532 fullpath = path
532 fullpath = path
533 foldercounter = 0
533 foldercounter = 0
534 else:
534 else:
535 #Filtra solo los directorios
535 #Filtra solo los directorios
536 for thisPath in os.listdir(path):
536 for thisPath in os.listdir(path):
537 if not os.path.isdir(os.path.join(path,thisPath)):
537 if not os.path.isdir(os.path.join(path,thisPath)):
538 continue
538 continue
539 if not isDoyFolder(thisPath):
539 if not isDoyFolder(thisPath):
540 continue
540 continue
541
541
542 dirList.append(thisPath)
542 dirList.append(thisPath)
543
543
544 if not(dirList):
544 if not(dirList):
545 return None, None, None, None, None, None
545 return None, None, None, None, None, None
546
546
547 dirList = sorted( dirList, key=str.lower )
547 dirList = sorted( dirList, key=str.lower )
548
548
549 doypath = dirList[-1]
549 doypath = dirList[-1]
550 foldercounter = int(doypath.split('_')[1]) if len(doypath.split('_'))>1 else 0
550 foldercounter = int(doypath.split('_')[1]) if len(doypath.split('_'))>1 else 0
551 fullpath = os.path.join(path, doypath, expLabel)
551 fullpath = os.path.join(path, doypath, expLabel)
552
552
553
553
554 print "%s folder was found: " %(fullpath )
554 print "%s folder was found: " %(fullpath )
555
555
556 if set == None:
556 if set == None:
557 filename = getlastFileFromPath(fullpath, ext)
557 filename = getlastFileFromPath(fullpath, ext)
558 else:
558 else:
559 filename = getFileFromSet(fullpath, ext, set)
559 filename = getFileFromSet(fullpath, ext, set)
560
560
561 if not(filename):
561 if not(filename):
562 return None, None, None, None, None, None
562 return None, None, None, None, None, None
563
563
564 print "%s file was found" %(filename)
564 print "%s file was found" %(filename)
565
565
566 if not(self.__verifyFile(os.path.join(fullpath, filename))):
566 if not(self.__verifyFile(os.path.join(fullpath, filename))):
567 return None, None, None, None, None, None
567 return None, None, None, None, None, None
568
568
569 year = int( filename[1:5] )
569 year = int( filename[1:5] )
570 doy = int( filename[5:8] )
570 doy = int( filename[5:8] )
571 set = int( filename[8:11] )
571 set = int( filename[8:11] )
572
572
573 return fullpath, foldercounter, filename, year, doy, set
573 return fullpath, foldercounter, filename, year, doy, set
574
574
575 def __setNextFileOffline(self):
575 def __setNextFileOffline(self):
576
576
577 idFile = self.fileIndex
577 idFile = self.fileIndex
578
578
579 while (True):
579 while (True):
580 idFile += 1
580 idFile += 1
581 if not(idFile < len(self.filenameList)):
581 if not(idFile < len(self.filenameList)):
582 self.flagNoMoreFiles = 1
582 self.flagNoMoreFiles = 1
583 print "No more Files"
583 print "No more Files"
584 return 0
584 return 0
585
585
586 filename = self.filenameList[idFile]
586 filename = self.filenameList[idFile]
587
587
588 if not(self.__verifyFile(filename)):
588 if not(self.__verifyFile(filename)):
589 continue
589 continue
590
590
591 fileSize = os.path.getsize(filename)
591 fileSize = os.path.getsize(filename)
592 fp = open(filename,'rb')
592 fp = open(filename,'rb')
593 break
593 break
594
594
595 self.flagIsNewFile = 1
595 self.flagIsNewFile = 1
596 self.fileIndex = idFile
596 self.fileIndex = idFile
597 self.filename = filename
597 self.filename = filename
598 self.fileSize = fileSize
598 self.fileSize = fileSize
599 self.fp = fp
599 self.fp = fp
600
600
601 print "Setting the file: %s"%self.filename
601 print "Setting the file: %s"%self.filename
602
602
603 return 1
603 return 1
604
604
605 def __setNextFileOnline(self):
605 def __setNextFileOnline(self):
606 """
606 """
607 Busca el siguiente file que tenga suficiente data para ser leida, dentro de un folder especifico, si
607 Busca el siguiente file que tenga suficiente data para ser leida, dentro de un folder especifico, si
608 no encuentra un file valido espera un tiempo determinado y luego busca en los posibles n files
608 no encuentra un file valido espera un tiempo determinado y luego busca en los posibles n files
609 siguientes.
609 siguientes.
610
610
611 Affected:
611 Affected:
612 self.flagIsNewFile
612 self.flagIsNewFile
613 self.filename
613 self.filename
614 self.fileSize
614 self.fileSize
615 self.fp
615 self.fp
616 self.set
616 self.set
617 self.flagNoMoreFiles
617 self.flagNoMoreFiles
618
618
619 Return:
619 Return:
620 0 : si luego de una busqueda del siguiente file valido este no pudo ser encontrado
620 0 : si luego de una busqueda del siguiente file valido este no pudo ser encontrado
621 1 : si el file fue abierto con exito y esta listo a ser leido
621 1 : si el file fue abierto con exito y esta listo a ser leido
622
622
623 Excepciones:
623 Excepciones:
624 Si un determinado file no puede ser abierto
624 Si un determinado file no puede ser abierto
625 """
625 """
626 nFiles = 0
626 nFiles = 0
627 fileOk_flag = False
627 fileOk_flag = False
628 firstTime_flag = True
628 firstTime_flag = True
629
629
630 self.set += 1
630 self.set += 1
631
631
632 if self.set > 999:
632 if self.set > 999:
633 self.set = 0
633 self.set = 0
634 self.foldercounter += 1
634 self.foldercounter += 1
635
635
636 #busca el 1er file disponible
636 #busca el 1er file disponible
637 fullfilename, filename = checkForRealPath( self.path, self.foldercounter, self.year, self.doy, self.set, self.ext )
637 fullfilename, filename = checkForRealPath( self.path, self.foldercounter, self.year, self.doy, self.set, self.ext )
638 if fullfilename:
638 if fullfilename:
639 if self.__verifyFile(fullfilename, False):
639 if self.__verifyFile(fullfilename, False):
640 fileOk_flag = True
640 fileOk_flag = True
641
641
642 #si no encuentra un file entonces espera y vuelve a buscar
642 #si no encuentra un file entonces espera y vuelve a buscar
643 if not(fileOk_flag):
643 if not(fileOk_flag):
644 for nFiles in range(self.nFiles+1): #busco en los siguientes self.nFiles+1 files posibles
644 for nFiles in range(self.nFiles+1): #busco en los siguientes self.nFiles+1 files posibles
645
645
646 if firstTime_flag: #si es la 1era vez entonces hace el for self.nTries veces
646 if firstTime_flag: #si es la 1era vez entonces hace el for self.nTries veces
647 tries = self.nTries
647 tries = self.nTries
648 else:
648 else:
649 tries = 1 #si no es la 1era vez entonces solo lo hace una vez
649 tries = 1 #si no es la 1era vez entonces solo lo hace una vez
650
650
651 for nTries in range( tries ):
651 for nTries in range( tries ):
652 if firstTime_flag:
652 if firstTime_flag:
653 print "\tWaiting %0.2f sec for the file \"%s\" , try %03d ..." % ( self.delay, filename, nTries+1 )
653 print "\tWaiting %0.2f sec for the file \"%s\" , try %03d ..." % ( self.delay, filename, nTries+1 )
654 time.sleep( self.delay )
654 time.sleep( self.delay )
655 else:
655 else:
656 print "\tSearching next \"%s%04d%03d%03d%s\" file ..." % (self.optchar, self.year, self.doy, self.set, self.ext)
656 print "\tSearching next \"%s%04d%03d%03d%s\" file ..." % (self.optchar, self.year, self.doy, self.set, self.ext)
657
657
658 fullfilename, filename = checkForRealPath( self.path, self.foldercounter, self.year, self.doy, self.set, self.ext )
658 fullfilename, filename = checkForRealPath( self.path, self.foldercounter, self.year, self.doy, self.set, self.ext )
659 if fullfilename:
659 if fullfilename:
660 if self.__verifyFile(fullfilename):
660 if self.__verifyFile(fullfilename):
661 fileOk_flag = True
661 fileOk_flag = True
662 break
662 break
663
663
664 if fileOk_flag:
664 if fileOk_flag:
665 break
665 break
666
666
667 firstTime_flag = False
667 firstTime_flag = False
668
668
669 print "\tSkipping the file \"%s\" due to this file doesn't exist" % filename
669 print "\tSkipping the file \"%s\" due to this file doesn't exist" % filename
670 self.set += 1
670 self.set += 1
671
671
672 if nFiles == (self.nFiles-1): #si no encuentro el file buscado cambio de carpeta y busco en la siguiente carpeta
672 if nFiles == (self.nFiles-1): #si no encuentro el file buscado cambio de carpeta y busco en la siguiente carpeta
673 self.set = 0
673 self.set = 0
674 self.doy += 1
674 self.doy += 1
675 self.foldercounter = 0
675 self.foldercounter = 0
676
676
677 if fileOk_flag:
677 if fileOk_flag:
678 self.fileSize = os.path.getsize( fullfilename )
678 self.fileSize = os.path.getsize( fullfilename )
679 self.filename = fullfilename
679 self.filename = fullfilename
680 self.flagIsNewFile = 1
680 self.flagIsNewFile = 1
681 if self.fp != None: self.fp.close()
681 if self.fp != None: self.fp.close()
682 self.fp = open(fullfilename, 'rb')
682 self.fp = open(fullfilename, 'rb')
683 self.flagNoMoreFiles = 0
683 self.flagNoMoreFiles = 0
684 print 'Setting the file: %s' % fullfilename
684 print 'Setting the file: %s' % fullfilename
685 else:
685 else:
686 self.fileSize = 0
686 self.fileSize = 0
687 self.filename = None
687 self.filename = None
688 self.flagIsNewFile = 0
688 self.flagIsNewFile = 0
689 self.fp = None
689 self.fp = None
690 self.flagNoMoreFiles = 1
690 self.flagNoMoreFiles = 1
691 print 'No more Files'
691 print 'No more Files'
692
692
693 return fileOk_flag
693 return fileOk_flag
694
694
695 def setNextFile(self):
695 def setNextFile(self):
696 if self.fp != None:
696 if self.fp != None:
697 self.fp.close()
697 self.fp.close()
698
698
699 if self.online:
699 if self.online:
700 newFile = self.__setNextFileOnline()
700 newFile = self.__setNextFileOnline()
701 else:
701 else:
702 newFile = self.__setNextFileOffline()
702 newFile = self.__setNextFileOffline()
703
703
704 if not(newFile):
704 if not(newFile):
705 return 0
705 return 0
706
706
707 self.__readFirstHeader()
707 self.__readFirstHeader()
708 self.nReadBlocks = 0
708 self.nReadBlocks = 0
709 return 1
709 return 1
710
710
711 def __waitNewBlock(self):
711 def __waitNewBlock(self):
712 """
712 """
713 Return 1 si se encontro un nuevo bloque de datos, 0 de otra forma.
713 Return 1 si se encontro un nuevo bloque de datos, 0 de otra forma.
714
714
715 Si el modo de lectura es OffLine siempre retorn 0
715 Si el modo de lectura es OffLine siempre retorn 0
716 """
716 """
717 if not self.online:
717 if not self.online:
718 return 0
718 return 0
719
719
720 if (self.nReadBlocks >= self.processingHeaderObj.dataBlocksPerFile):
720 if (self.nReadBlocks >= self.processingHeaderObj.dataBlocksPerFile):
721 return 0
721 return 0
722
722
723 currentPointer = self.fp.tell()
723 currentPointer = self.fp.tell()
724
724
725 neededSize = self.processingHeaderObj.blockSize + self.basicHeaderSize
725 neededSize = self.processingHeaderObj.blockSize + self.basicHeaderSize
726
726
727 for nTries in range( self.nTries ):
727 for nTries in range( self.nTries ):
728
728
729 self.fp.close()
729 self.fp.close()
730 self.fp = open( self.filename, 'rb' )
730 self.fp = open( self.filename, 'rb' )
731 self.fp.seek( currentPointer )
731 self.fp.seek( currentPointer )
732
732
733 self.fileSize = os.path.getsize( self.filename )
733 self.fileSize = os.path.getsize( self.filename )
734 currentSize = self.fileSize - currentPointer
734 currentSize = self.fileSize - currentPointer
735
735
736 if ( currentSize >= neededSize ):
736 if ( currentSize >= neededSize ):
737 self.basicHeaderObj.read(self.fp)
737 self.basicHeaderObj.read(self.fp)
738 return 1
738 return 1
739
739
740 if self.fileSize == self.fileSizeByHeader:
740 if self.fileSize == self.fileSizeByHeader:
741 # self.flagEoF = True
741 # self.flagEoF = True
742 return 0
742 return 0
743
743
744 print "\tWaiting %0.2f seconds for the next block, try %03d ..." % (self.delay, nTries+1)
744 print "\tWaiting %0.2f seconds for the next block, try %03d ..." % (self.delay, nTries+1)
745 time.sleep( self.delay )
745 time.sleep( self.delay )
746
746
747
747
748 return 0
748 return 0
749
749
750 def waitDataBlock(self,pointer_location):
750 def waitDataBlock(self,pointer_location):
751
751
752 currentPointer = pointer_location
752 currentPointer = pointer_location
753
753
754 neededSize = self.processingHeaderObj.blockSize #+ self.basicHeaderSize
754 neededSize = self.processingHeaderObj.blockSize #+ self.basicHeaderSize
755
755
756 for nTries in range( self.nTries ):
756 for nTries in range( self.nTries ):
757 self.fp.close()
757 self.fp.close()
758 self.fp = open( self.filename, 'rb' )
758 self.fp = open( self.filename, 'rb' )
759 self.fp.seek( currentPointer )
759 self.fp.seek( currentPointer )
760
760
761 self.fileSize = os.path.getsize( self.filename )
761 self.fileSize = os.path.getsize( self.filename )
762 currentSize = self.fileSize - currentPointer
762 currentSize = self.fileSize - currentPointer
763
763
764 if ( currentSize >= neededSize ):
764 if ( currentSize >= neededSize ):
765 return 1
765 return 1
766
766
767 print "\tWaiting %0.2f seconds for the next block, try %03d ..." % (self.delay, nTries+1)
767 print "\tWaiting %0.2f seconds for the next block, try %03d ..." % (self.delay, nTries+1)
768 time.sleep( self.delay )
768 time.sleep( self.delay )
769
769
770 return 0
770 return 0
771
771
772 def __jumpToLastBlock(self):
772 def __jumpToLastBlock(self):
773
773
774 if not(self.__isFirstTimeOnline):
774 if not(self.__isFirstTimeOnline):
775 return
775 return
776
776
777 csize = self.fileSize - self.fp.tell()
777 csize = self.fileSize - self.fp.tell()
778 blocksize = self.processingHeaderObj.blockSize
778 blocksize = self.processingHeaderObj.blockSize
779
779
780 #salta el primer bloque de datos
780 #salta el primer bloque de datos
781 if csize > self.processingHeaderObj.blockSize:
781 if csize > self.processingHeaderObj.blockSize:
782 self.fp.seek(self.fp.tell() + blocksize)
782 self.fp.seek(self.fp.tell() + blocksize)
783 else:
783 else:
784 return
784 return
785
785
786 csize = self.fileSize - self.fp.tell()
786 csize = self.fileSize - self.fp.tell()
787 neededsize = self.processingHeaderObj.blockSize + self.basicHeaderSize
787 neededsize = self.processingHeaderObj.blockSize + self.basicHeaderSize
788 while True:
788 while True:
789
789
790 if self.fp.tell()<self.fileSize:
790 if self.fp.tell()<self.fileSize:
791 self.fp.seek(self.fp.tell() + neededsize)
791 self.fp.seek(self.fp.tell() + neededsize)
792 else:
792 else:
793 self.fp.seek(self.fp.tell() - neededsize)
793 self.fp.seek(self.fp.tell() - neededsize)
794 break
794 break
795
795
796 # csize = self.fileSize - self.fp.tell()
796 # csize = self.fileSize - self.fp.tell()
797 # neededsize = self.processingHeaderObj.blockSize + self.basicHeaderSize
797 # neededsize = self.processingHeaderObj.blockSize + self.basicHeaderSize
798 # factor = int(csize/neededsize)
798 # factor = int(csize/neededsize)
799 # if factor > 0:
799 # if factor > 0:
800 # self.fp.seek(self.fp.tell() + factor*neededsize)
800 # self.fp.seek(self.fp.tell() + factor*neededsize)
801
801
802 self.flagIsNewFile = 0
802 self.flagIsNewFile = 0
803 self.__isFirstTimeOnline = 0
803 self.__isFirstTimeOnline = 0
804
804
805 def __setNewBlock(self):
805 def __setNewBlock(self):
806
806
807 if self.fp == None:
807 if self.fp == None:
808 return 0
808 return 0
809
809
810 if self.online:
810 if self.online:
811 self.__jumpToLastBlock()
811 self.__jumpToLastBlock()
812
812
813 if self.flagIsNewFile:
813 if self.flagIsNewFile:
814 return 1
814 return 1
815
815
816 self.lastUTTime = self.basicHeaderObj.utc
816 self.lastUTTime = self.basicHeaderObj.utc
817 currentSize = self.fileSize - self.fp.tell()
817 currentSize = self.fileSize - self.fp.tell()
818 neededSize = self.processingHeaderObj.blockSize + self.basicHeaderSize
818 neededSize = self.processingHeaderObj.blockSize + self.basicHeaderSize
819
819
820 if (currentSize >= neededSize):
820 if (currentSize >= neededSize):
821 self.basicHeaderObj.read(self.fp)
821 self.basicHeaderObj.read(self.fp)
822 return 1
822 return 1
823
823
824 if self.__waitNewBlock():
824 if self.__waitNewBlock():
825 return 1
825 return 1
826
826
827 if not(self.setNextFile()):
827 if not(self.setNextFile()):
828 return 0
828 return 0
829
829
830 deltaTime = self.basicHeaderObj.utc - self.lastUTTime #
830 deltaTime = self.basicHeaderObj.utc - self.lastUTTime #
831
831
832 self.flagTimeBlock = 0
832 self.flagTimeBlock = 0
833
833
834 if deltaTime > self.maxTimeStep:
834 if deltaTime > self.maxTimeStep:
835 self.flagTimeBlock = 1
835 self.flagTimeBlock = 1
836
836
837 return 1
837 return 1
838
838
839 def readNextBlock(self):
839 def readNextBlock(self):
840 if not(self.__setNewBlock()):
840 if not(self.__setNewBlock()):
841 return 0
841 return 0
842
842
843 if not(self.readBlock()):
843 if not(self.readBlock()):
844 return 0
844 return 0
845
845
846 return 1
846 return 1
847
847
848 def __readFirstHeader(self):
848 def __readFirstHeader(self):
849
849
850 self.basicHeaderObj.read(self.fp)
850 self.basicHeaderObj.read(self.fp)
851 self.systemHeaderObj.read(self.fp)
851 self.systemHeaderObj.read(self.fp)
852 self.radarControllerHeaderObj.read(self.fp)
852 self.radarControllerHeaderObj.read(self.fp)
853 self.processingHeaderObj.read(self.fp)
853 self.processingHeaderObj.read(self.fp)
854
854
855 self.firstHeaderSize = self.basicHeaderObj.size
855 self.firstHeaderSize = self.basicHeaderObj.size
856
856
857 datatype = int(numpy.log2((self.processingHeaderObj.processFlags & PROCFLAG.DATATYPE_MASK))-numpy.log2(PROCFLAG.DATATYPE_CHAR))
857 datatype = int(numpy.log2((self.processingHeaderObj.processFlags & PROCFLAG.DATATYPE_MASK))-numpy.log2(PROCFLAG.DATATYPE_CHAR))
858 if datatype == 0:
858 if datatype == 0:
859 datatype_str = numpy.dtype([('real','<i1'),('imag','<i1')])
859 datatype_str = numpy.dtype([('real','<i1'),('imag','<i1')])
860 elif datatype == 1:
860 elif datatype == 1:
861 datatype_str = numpy.dtype([('real','<i2'),('imag','<i2')])
861 datatype_str = numpy.dtype([('real','<i2'),('imag','<i2')])
862 elif datatype == 2:
862 elif datatype == 2:
863 datatype_str = numpy.dtype([('real','<i4'),('imag','<i4')])
863 datatype_str = numpy.dtype([('real','<i4'),('imag','<i4')])
864 elif datatype == 3:
864 elif datatype == 3:
865 datatype_str = numpy.dtype([('real','<i8'),('imag','<i8')])
865 datatype_str = numpy.dtype([('real','<i8'),('imag','<i8')])
866 elif datatype == 4:
866 elif datatype == 4:
867 datatype_str = numpy.dtype([('real','<f4'),('imag','<f4')])
867 datatype_str = numpy.dtype([('real','<f4'),('imag','<f4')])
868 elif datatype == 5:
868 elif datatype == 5:
869 datatype_str = numpy.dtype([('real','<f8'),('imag','<f8')])
869 datatype_str = numpy.dtype([('real','<f8'),('imag','<f8')])
870 else:
870 else:
871 raise ValueError, 'Data type was not defined'
871 raise ValueError, 'Data type was not defined'
872
872
873 self.dtype = datatype_str
873 self.dtype = datatype_str
874 #self.ippSeconds = 2 * 1000 * self.radarControllerHeaderObj.ipp / self.c
874 #self.ippSeconds = 2 * 1000 * self.radarControllerHeaderObj.ipp / self.c
875 self.fileSizeByHeader = self.processingHeaderObj.dataBlocksPerFile * self.processingHeaderObj.blockSize + self.firstHeaderSize + self.basicHeaderSize*(self.processingHeaderObj.dataBlocksPerFile - 1)
875 self.fileSizeByHeader = self.processingHeaderObj.dataBlocksPerFile * self.processingHeaderObj.blockSize + self.firstHeaderSize + self.basicHeaderSize*(self.processingHeaderObj.dataBlocksPerFile - 1)
876 # self.dataOut.channelList = numpy.arange(self.systemHeaderObj.numChannels)
876 # self.dataOut.channelList = numpy.arange(self.systemHeaderObj.numChannels)
877 # self.dataOut.channelIndexList = numpy.arange(self.systemHeaderObj.numChannels)
877 # self.dataOut.channelIndexList = numpy.arange(self.systemHeaderObj.numChannels)
878 self.getBlockDimension()
878 self.getBlockDimension()
879
879
880 def __verifyFile(self, filename, msgFlag=True):
880 def __verifyFile(self, filename, msgFlag=True):
881 msg = None
881 msg = None
882 try:
882 try:
883 fp = open(filename, 'rb')
883 fp = open(filename, 'rb')
884 currentPosition = fp.tell()
884 currentPosition = fp.tell()
885 except IOError:
885 except IOError:
886 traceback.print_exc()
886 traceback.print_exc()
887 if msgFlag:
887 if msgFlag:
888 print "The file %s can't be opened" % (filename)
888 print "The file %s can't be opened" % (filename)
889 return False
889 return False
890
890
891 neededSize = self.processingHeaderObj.blockSize + self.firstHeaderSize
891 neededSize = self.processingHeaderObj.blockSize + self.firstHeaderSize
892
892
893 if neededSize == 0:
893 if neededSize == 0:
894 basicHeaderObj = BasicHeader(LOCALTIME)
894 basicHeaderObj = BasicHeader(LOCALTIME)
895 systemHeaderObj = SystemHeader()
895 systemHeaderObj = SystemHeader()
896 radarControllerHeaderObj = RadarControllerHeader()
896 radarControllerHeaderObj = RadarControllerHeader()
897 processingHeaderObj = ProcessingHeader()
897 processingHeaderObj = ProcessingHeader()
898
898
899 try:
899 try:
900 if not( basicHeaderObj.read(fp) ): raise IOError
900 if not( basicHeaderObj.read(fp) ): raise IOError
901 if not( systemHeaderObj.read(fp) ): raise IOError
901 if not( systemHeaderObj.read(fp) ): raise IOError
902 if not( radarControllerHeaderObj.read(fp) ): raise IOError
902 if not( radarControllerHeaderObj.read(fp) ): raise IOError
903 if not( processingHeaderObj.read(fp) ): raise IOError
903 if not( processingHeaderObj.read(fp) ): raise IOError
904 # data_type = int(numpy.log2((processingHeaderObj.processFlags & PROCFLAG.DATATYPE_MASK))-numpy.log2(PROCFLAG.DATATYPE_CHAR))
904 # data_type = int(numpy.log2((processingHeaderObj.processFlags & PROCFLAG.DATATYPE_MASK))-numpy.log2(PROCFLAG.DATATYPE_CHAR))
905
905
906 neededSize = processingHeaderObj.blockSize + basicHeaderObj.size
906 neededSize = processingHeaderObj.blockSize + basicHeaderObj.size
907
907
908 except IOError:
908 except IOError:
909 traceback.print_exc()
909 traceback.print_exc()
910 if msgFlag:
910 if msgFlag:
911 print "\tThe file %s is empty or it hasn't enough data" % filename
911 print "\tThe file %s is empty or it hasn't enough data" % filename
912
912
913 fp.close()
913 fp.close()
914 return False
914 return False
915 else:
915 else:
916 msg = "\tSkipping the file %s due to it hasn't enough data" %filename
916 msg = "\tSkipping the file %s due to it hasn't enough data" %filename
917
917
918 fp.close()
918 fp.close()
919 fileSize = os.path.getsize(filename)
919 fileSize = os.path.getsize(filename)
920 currentSize = fileSize - currentPosition
920 currentSize = fileSize - currentPosition
921 if currentSize < neededSize:
921 if currentSize < neededSize:
922 if msgFlag and (msg != None):
922 if msgFlag and (msg != None):
923 print msg #print"\tSkipping the file %s due to it hasn't enough data" %filename
923 print msg #print"\tSkipping the file %s due to it hasn't enough data" %filename
924 return False
924 return False
925
925
926 return True
926 return True
927
927
928 def setup(self,
928 def setup(self,
929 path=None,
929 path=None,
930 startDate=None,
930 startDate=None,
931 endDate=None,
931 endDate=None,
932 startTime=datetime.time(0,0,0),
932 startTime=datetime.time(0,0,0),
933 endTime=datetime.time(23,59,59),
933 endTime=datetime.time(23,59,59),
934 set=None,
934 set=None,
935 expLabel = "",
935 expLabel = "",
936 ext = None,
936 ext = None,
937 online = False,
937 online = False,
938 delay = 60,
938 delay = 60,
939 walk = True,
939 walk = True,
940 getblock = False):
940 getblock = False):
941
941
942 if path == None:
942 if path == None:
943 raise ValueError, "The path is not valid"
943 raise ValueError, "The path is not valid"
944
944
945 if ext == None:
945 if ext == None:
946 ext = self.ext
946 ext = self.ext
947
947
948 if online:
948 if online:
949 print "Searching files in online mode..."
949 print "Searching files in online mode..."
950
950
951 for nTries in range( self.nTries ):
951 for nTries in range( self.nTries ):
952 fullpath, foldercounter, file, year, doy, set = self.__searchFilesOnLine(path=path, expLabel=expLabel, ext=ext, walk=walk, set=set)
952 fullpath, foldercounter, file, year, doy, set = self.__searchFilesOnLine(path=path, expLabel=expLabel, ext=ext, walk=walk, set=set)
953
953
954 if fullpath:
954 if fullpath:
955 break
955 break
956
956
957 print '\tWaiting %0.2f sec for an valid file in %s: try %02d ...' % (self.delay, path, nTries+1)
957 print '\tWaiting %0.2f sec for an valid file in %s: try %02d ...' % (self.delay, path, nTries+1)
958 time.sleep( self.delay )
958 time.sleep( self.delay )
959
959
960 if not(fullpath):
960 if not(fullpath):
961 print "There 'isn't valied files in %s" % path
961 print "There 'isn't valied files in %s" % path
962 return None
962 return None
963
963
964 self.year = year
964 self.year = year
965 self.doy = doy
965 self.doy = doy
966 self.set = set - 1
966 self.set = set - 1
967 self.path = path
967 self.path = path
968 self.foldercounter = foldercounter
968 self.foldercounter = foldercounter
969 last_set = None
969 last_set = None
970
970
971 else:
971 else:
972 print "Searching files in offline mode ..."
972 print "Searching files in offline mode ..."
973 pathList, filenameList = self.__searchFilesOffLine(path, startDate=startDate, endDate=endDate,
973 pathList, filenameList = self.__searchFilesOffLine(path, startDate=startDate, endDate=endDate,
974 startTime=startTime, endTime=endTime,
974 startTime=startTime, endTime=endTime,
975 set=set, expLabel=expLabel, ext=ext,
975 set=set, expLabel=expLabel, ext=ext,
976 walk=walk)
976 walk=walk)
977
977
978 if not(pathList):
978 if not(pathList):
979 print "No *%s files into the folder %s \nfor the range: %s - %s"%(ext, path,
979 print "No *%s files into the folder %s \nfor the range: %s - %s"%(ext, path,
980 datetime.datetime.combine(startDate,startTime).ctime(),
980 datetime.datetime.combine(startDate,startTime).ctime(),
981 datetime.datetime.combine(endDate,endTime).ctime())
981 datetime.datetime.combine(endDate,endTime).ctime())
982
982
983 sys.exit(-1)
983 sys.exit(-1)
984
984
985
985
986 self.fileIndex = -1
986 self.fileIndex = -1
987 self.pathList = pathList
987 self.pathList = pathList
988 self.filenameList = filenameList
988 self.filenameList = filenameList
989 file_name = os.path.basename(filenameList[-1])
989 file_name = os.path.basename(filenameList[-1])
990 basename, ext = os.path.splitext(file_name)
990 basename, ext = os.path.splitext(file_name)
991 last_set = int(basename[-3:])
991 last_set = int(basename[-3:])
992
992
993 self.online = online
993 self.online = online
994 self.delay = delay
994 self.delay = delay
995 ext = ext.lower()
995 ext = ext.lower()
996 self.ext = ext
996 self.ext = ext
997 self.getblock = getblock
997 self.getByBlock = getblock
998
998 if not(self.setNextFile()):
999 if not(self.setNextFile()):
999 if (startDate!=None) and (endDate!=None):
1000 if (startDate!=None) and (endDate!=None):
1000 print "No files in range: %s - %s" %(datetime.datetime.combine(startDate,startTime).ctime(), datetime.datetime.combine(endDate,endTime).ctime())
1001 print "No files in range: %s - %s" %(datetime.datetime.combine(startDate,startTime).ctime(), datetime.datetime.combine(endDate,endTime).ctime())
1001 elif startDate != None:
1002 elif startDate != None:
1002 print "No files in range: %s" %(datetime.datetime.combine(startDate,startTime).ctime())
1003 print "No files in range: %s" %(datetime.datetime.combine(startDate,startTime).ctime())
1003 else:
1004 else:
1004 print "No files"
1005 print "No files"
1005
1006
1006 sys.exit(-1)
1007 sys.exit(-1)
1007
1008
1008 # self.updateDataHeader()
1009 # self.updateDataHeader()
1009 if last_set != None:
1010 if last_set != None:
1010 self.dataOut.last_block = last_set * self.processingHeaderObj.dataBlocksPerFile + self.basicHeaderObj.dataBlock
1011 self.dataOut.last_block = last_set * self.processingHeaderObj.dataBlocksPerFile + self.basicHeaderObj.dataBlock
1011 return
1012 return
1012
1013
1013 def getBasicHeader(self):
1014 def getBasicHeader(self):
1014
1015
1015 self.dataOut.utctime = self.basicHeaderObj.utc + self.basicHeaderObj.miliSecond/1000. + self.profileIndex * self.radarControllerHeaderObj.ippSeconds
1016 self.dataOut.utctime = self.basicHeaderObj.utc + self.basicHeaderObj.miliSecond/1000. + self.profileIndex * self.radarControllerHeaderObj.ippSeconds
1016
1017
1017 self.dataOut.flagTimeBlock = self.flagTimeBlock
1018 self.dataOut.flagTimeBlock = self.flagTimeBlock
1018
1019
1019 self.dataOut.timeZone = self.basicHeaderObj.timeZone
1020 self.dataOut.timeZone = self.basicHeaderObj.timeZone
1020
1021
1021 self.dataOut.dstFlag = self.basicHeaderObj.dstFlag
1022 self.dataOut.dstFlag = self.basicHeaderObj.dstFlag
1022
1023
1023 self.dataOut.errorCount = self.basicHeaderObj.errorCount
1024 self.dataOut.errorCount = self.basicHeaderObj.errorCount
1024
1025
1025 self.dataOut.useLocalTime = self.basicHeaderObj.useLocalTime
1026 self.dataOut.useLocalTime = self.basicHeaderObj.useLocalTime
1026
1027
1027 def getFirstHeader(self):
1028 def getFirstHeader(self):
1028
1029
1029 raise ValueError, "This method has not been implemented"
1030 raise ValueError, "This method has not been implemented"
1030
1031
1031 def getData(self):
1032 def getData(self):
1032
1033
1033 raise ValueError, "This method has not been implemented"
1034 raise ValueError, "This method has not been implemented"
1034
1035
1035 def hasNotDataInBuffer(self):
1036 def hasNotDataInBuffer(self):
1036
1037
1037 raise ValueError, "This method has not been implemented"
1038 raise ValueError, "This method has not been implemented"
1038
1039
1039 def readBlock(self):
1040 def readBlock(self):
1040
1041
1041 raise ValueError, "This method has not been implemented"
1042 raise ValueError, "This method has not been implemented"
1042
1043
1043 def isEndProcess(self):
1044 def isEndProcess(self):
1044
1045
1045 return self.flagNoMoreFiles
1046 return self.flagNoMoreFiles
1046
1047
1047 def printReadBlocks(self):
1048 def printReadBlocks(self):
1048
1049
1049 print "Number of read blocks per file %04d" %self.nReadBlocks
1050 print "Number of read blocks per file %04d" %self.nReadBlocks
1050
1051
1051 def printTotalBlocks(self):
1052 def printTotalBlocks(self):
1052
1053
1053 print "Number of read blocks %04d" %self.nTotalBlocks
1054 print "Number of read blocks %04d" %self.nTotalBlocks
1054
1055
1055 def printNumberOfBlock(self):
1056 def printNumberOfBlock(self):
1056
1057
1057 if self.flagIsNewBlock:
1058 if self.flagIsNewBlock:
1058 print "Block No. %04d, Total blocks %04d -> %s" %(self.basicHeaderObj.dataBlock, self.nTotalBlocks, self.dataOut.datatime.ctime())
1059 print "Block No. %04d, Total blocks %04d -> %s" %(self.basicHeaderObj.dataBlock, self.nTotalBlocks, self.dataOut.datatime.ctime())
1059 self.dataOut.blocknow = self.basicHeaderObj.dataBlock
1060 self.dataOut.blocknow = self.basicHeaderObj.dataBlock
1060
1061
1061 def printInfo(self):
1062 def printInfo(self):
1062
1063
1063 if self.__printInfo == False:
1064 if self.__printInfo == False:
1064 return
1065 return
1065
1066
1066 self.basicHeaderObj.printInfo()
1067 self.basicHeaderObj.printInfo()
1067 self.systemHeaderObj.printInfo()
1068 self.systemHeaderObj.printInfo()
1068 self.radarControllerHeaderObj.printInfo()
1069 self.radarControllerHeaderObj.printInfo()
1069 self.processingHeaderObj.printInfo()
1070 self.processingHeaderObj.printInfo()
1070
1071
1071 self.__printInfo = False
1072 self.__printInfo = False
1072
1073
1073
1074
1074 def run(self, **kwargs):
1075 def run(self, **kwargs):
1075
1076
1076 if not(self.isConfig):
1077 if not(self.isConfig):
1077
1078
1078 # self.dataOut = dataOut
1079 # self.dataOut = dataOut
1079 self.setup(**kwargs)
1080 self.setup(**kwargs)
1080 self.isConfig = True
1081 self.isConfig = True
1081
1082
1082 self.getData()
1083 self.getData()
1083
1084
1084 class JRODataWriter(JRODataIO):
1085 class JRODataWriter(JRODataIO):
1085
1086
1086 """
1087 """
1087 Esta clase permite escribir datos a archivos procesados (.r o ,pdata). La escritura
1088 Esta clase permite escribir datos a archivos procesados (.r o ,pdata). La escritura
1088 de los datos siempre se realiza por bloques.
1089 de los datos siempre se realiza por bloques.
1089 """
1090 """
1090
1091
1091 blockIndex = 0
1092 blockIndex = 0
1092
1093
1093 path = None
1094 path = None
1094
1095
1095 setFile = None
1096 setFile = None
1096
1097
1097 profilesPerBlock = None
1098 profilesPerBlock = None
1098
1099
1099 blocksPerFile = None
1100 blocksPerFile = None
1100
1101
1101 nWriteBlocks = 0
1102 nWriteBlocks = 0
1102
1103
1103 def __init__(self, dataOut=None):
1104 def __init__(self, dataOut=None):
1104 raise ValueError, "Not implemented"
1105 raise ValueError, "Not implemented"
1105
1106
1106
1107
1107 def hasAllDataInBuffer(self):
1108 def hasAllDataInBuffer(self):
1108 raise ValueError, "Not implemented"
1109 raise ValueError, "Not implemented"
1109
1110
1110
1111
1111 def setBlockDimension(self):
1112 def setBlockDimension(self):
1112 raise ValueError, "Not implemented"
1113 raise ValueError, "Not implemented"
1113
1114
1114
1115
1115 def writeBlock(self):
1116 def writeBlock(self):
1116 raise ValueError, "No implemented"
1117 raise ValueError, "No implemented"
1117
1118
1118
1119
1119 def putData(self):
1120 def putData(self):
1120 raise ValueError, "No implemented"
1121 raise ValueError, "No implemented"
1121
1122
1122
1123
1123 def setBasicHeader(self):
1124 def setBasicHeader(self):
1124
1125
1125 self.basicHeaderObj.size = self.basicHeaderSize #bytes
1126 self.basicHeaderObj.size = self.basicHeaderSize #bytes
1126 self.basicHeaderObj.version = self.versionFile
1127 self.basicHeaderObj.version = self.versionFile
1127 self.basicHeaderObj.dataBlock = self.nTotalBlocks
1128 self.basicHeaderObj.dataBlock = self.nTotalBlocks
1128
1129
1129 utc = numpy.floor(self.dataOut.utctime)
1130 utc = numpy.floor(self.dataOut.utctime)
1130 milisecond = (self.dataOut.utctime - utc)* 1000.0
1131 milisecond = (self.dataOut.utctime - utc)* 1000.0
1131
1132
1132 self.basicHeaderObj.utc = utc
1133 self.basicHeaderObj.utc = utc
1133 self.basicHeaderObj.miliSecond = milisecond
1134 self.basicHeaderObj.miliSecond = milisecond
1134 self.basicHeaderObj.timeZone = self.dataOut.timeZone
1135 self.basicHeaderObj.timeZone = self.dataOut.timeZone
1135 self.basicHeaderObj.dstFlag = self.dataOut.dstFlag
1136 self.basicHeaderObj.dstFlag = self.dataOut.dstFlag
1136 self.basicHeaderObj.errorCount = self.dataOut.errorCount
1137 self.basicHeaderObj.errorCount = self.dataOut.errorCount
1137
1138
1138 def setFirstHeader(self):
1139 def setFirstHeader(self):
1139 """
1140 """
1140 Obtiene una copia del First Header
1141 Obtiene una copia del First Header
1141
1142
1142 Affected:
1143 Affected:
1143
1144
1144 self.basicHeaderObj
1145 self.basicHeaderObj
1145 self.systemHeaderObj
1146 self.systemHeaderObj
1146 self.radarControllerHeaderObj
1147 self.radarControllerHeaderObj
1147 self.processingHeaderObj self.
1148 self.processingHeaderObj self.
1148
1149
1149 Return:
1150 Return:
1150 None
1151 None
1151 """
1152 """
1152
1153
1153 raise ValueError, "No implemented"
1154 raise ValueError, "No implemented"
1154
1155
1155 def __writeFirstHeader(self):
1156 def __writeFirstHeader(self):
1156 """
1157 """
1157 Escribe el primer header del file es decir el Basic header y el Long header (SystemHeader, RadarControllerHeader, ProcessingHeader)
1158 Escribe el primer header del file es decir el Basic header y el Long header (SystemHeader, RadarControllerHeader, ProcessingHeader)
1158
1159
1159 Affected:
1160 Affected:
1160 __dataType
1161 __dataType
1161
1162
1162 Return:
1163 Return:
1163 None
1164 None
1164 """
1165 """
1165
1166
1166 # CALCULAR PARAMETROS
1167 # CALCULAR PARAMETROS
1167
1168
1168 sizeLongHeader = self.systemHeaderObj.size + self.radarControllerHeaderObj.size + self.processingHeaderObj.size
1169 sizeLongHeader = self.systemHeaderObj.size + self.radarControllerHeaderObj.size + self.processingHeaderObj.size
1169 self.basicHeaderObj.size = self.basicHeaderSize + sizeLongHeader
1170 self.basicHeaderObj.size = self.basicHeaderSize + sizeLongHeader
1170
1171
1171 self.basicHeaderObj.write(self.fp)
1172 self.basicHeaderObj.write(self.fp)
1172 self.systemHeaderObj.write(self.fp)
1173 self.systemHeaderObj.write(self.fp)
1173 self.radarControllerHeaderObj.write(self.fp)
1174 self.radarControllerHeaderObj.write(self.fp)
1174 self.processingHeaderObj.write(self.fp)
1175 self.processingHeaderObj.write(self.fp)
1175
1176
1176 self.dtype = self.dataOut.dtype
1177 self.dtype = self.dataOut.dtype
1177
1178
1178 def __setNewBlock(self):
1179 def __setNewBlock(self):
1179 """
1180 """
1180 Si es un nuevo file escribe el First Header caso contrario escribe solo el Basic Header
1181 Si es un nuevo file escribe el First Header caso contrario escribe solo el Basic Header
1181
1182
1182 Return:
1183 Return:
1183 0 : si no pudo escribir nada
1184 0 : si no pudo escribir nada
1184 1 : Si escribio el Basic el First Header
1185 1 : Si escribio el Basic el First Header
1185 """
1186 """
1186 if self.fp == None:
1187 if self.fp == None:
1187 self.setNextFile()
1188 self.setNextFile()
1188
1189
1189 if self.flagIsNewFile:
1190 if self.flagIsNewFile:
1190 return 1
1191 return 1
1191
1192
1192 if self.blockIndex < self.processingHeaderObj.dataBlocksPerFile:
1193 if self.blockIndex < self.processingHeaderObj.dataBlocksPerFile:
1193 self.basicHeaderObj.write(self.fp)
1194 self.basicHeaderObj.write(self.fp)
1194 return 1
1195 return 1
1195
1196
1196 if not( self.setNextFile() ):
1197 if not( self.setNextFile() ):
1197 return 0
1198 return 0
1198
1199
1199 return 1
1200 return 1
1200
1201
1201
1202
1202 def writeNextBlock(self):
1203 def writeNextBlock(self):
1203 """
1204 """
1204 Selecciona el bloque siguiente de datos y los escribe en un file
1205 Selecciona el bloque siguiente de datos y los escribe en un file
1205
1206
1206 Return:
1207 Return:
1207 0 : Si no hizo pudo escribir el bloque de datos
1208 0 : Si no hizo pudo escribir el bloque de datos
1208 1 : Si no pudo escribir el bloque de datos
1209 1 : Si no pudo escribir el bloque de datos
1209 """
1210 """
1210 if not( self.__setNewBlock() ):
1211 if not( self.__setNewBlock() ):
1211 return 0
1212 return 0
1212
1213
1213 self.writeBlock()
1214 self.writeBlock()
1214
1215
1215 return 1
1216 return 1
1216
1217
1217 def setNextFile(self):
1218 def setNextFile(self):
1218 """
1219 """
1219 Determina el siguiente file que sera escrito
1220 Determina el siguiente file que sera escrito
1220
1221
1221 Affected:
1222 Affected:
1222 self.filename
1223 self.filename
1223 self.subfolder
1224 self.subfolder
1224 self.fp
1225 self.fp
1225 self.setFile
1226 self.setFile
1226 self.flagIsNewFile
1227 self.flagIsNewFile
1227
1228
1228 Return:
1229 Return:
1229 0 : Si el archivo no puede ser escrito
1230 0 : Si el archivo no puede ser escrito
1230 1 : Si el archivo esta listo para ser escrito
1231 1 : Si el archivo esta listo para ser escrito
1231 """
1232 """
1232 ext = self.ext
1233 ext = self.ext
1233 path = self.path
1234 path = self.path
1234
1235
1235 if self.fp != None:
1236 if self.fp != None:
1236 self.fp.close()
1237 self.fp.close()
1237
1238
1238 timeTuple = time.localtime( self.dataOut.utctime)
1239 timeTuple = time.localtime( self.dataOut.utctime)
1239 subfolder = 'd%4.4d%3.3d' % (timeTuple.tm_year,timeTuple.tm_yday)
1240 subfolder = 'd%4.4d%3.3d' % (timeTuple.tm_year,timeTuple.tm_yday)
1240
1241
1241 fullpath = os.path.join( path, subfolder )
1242 fullpath = os.path.join( path, subfolder )
1242 if not( os.path.exists(fullpath) ):
1243 if not( os.path.exists(fullpath) ):
1243 os.mkdir(fullpath)
1244 os.mkdir(fullpath)
1244 self.setFile = -1 #inicializo mi contador de seteo
1245 self.setFile = -1 #inicializo mi contador de seteo
1245 else:
1246 else:
1246 filesList = os.listdir( fullpath )
1247 filesList = os.listdir( fullpath )
1247 if len( filesList ) > 0:
1248 if len( filesList ) > 0:
1248 filesList = sorted( filesList, key=str.lower )
1249 filesList = sorted( filesList, key=str.lower )
1249 filen = filesList[-1]
1250 filen = filesList[-1]
1250 # el filename debera tener el siguiente formato
1251 # el filename debera tener el siguiente formato
1251 # 0 1234 567 89A BCDE (hex)
1252 # 0 1234 567 89A BCDE (hex)
1252 # x YYYY DDD SSS .ext
1253 # x YYYY DDD SSS .ext
1253 if isNumber( filen[8:11] ):
1254 if isNumber( filen[8:11] ):
1254 self.setFile = int( filen[8:11] ) #inicializo mi contador de seteo al seteo del ultimo file
1255 self.setFile = int( filen[8:11] ) #inicializo mi contador de seteo al seteo del ultimo file
1255 else:
1256 else:
1256 self.setFile = -1
1257 self.setFile = -1
1257 else:
1258 else:
1258 self.setFile = -1 #inicializo mi contador de seteo
1259 self.setFile = -1 #inicializo mi contador de seteo
1259
1260
1260 setFile = self.setFile
1261 setFile = self.setFile
1261 setFile += 1
1262 setFile += 1
1262
1263
1263 file = '%s%4.4d%3.3d%3.3d%s' % (self.optchar,
1264 file = '%s%4.4d%3.3d%3.3d%s' % (self.optchar,
1264 timeTuple.tm_year,
1265 timeTuple.tm_year,
1265 timeTuple.tm_yday,
1266 timeTuple.tm_yday,
1266 setFile,
1267 setFile,
1267 ext )
1268 ext )
1268
1269
1269 filename = os.path.join( path, subfolder, file )
1270 filename = os.path.join( path, subfolder, file )
1270
1271
1271 fp = open( filename,'wb' )
1272 fp = open( filename,'wb' )
1272
1273
1273 self.blockIndex = 0
1274 self.blockIndex = 0
1274
1275
1275 #guardando atributos
1276 #guardando atributos
1276 self.filename = filename
1277 self.filename = filename
1277 self.subfolder = subfolder
1278 self.subfolder = subfolder
1278 self.fp = fp
1279 self.fp = fp
1279 self.setFile = setFile
1280 self.setFile = setFile
1280 self.flagIsNewFile = 1
1281 self.flagIsNewFile = 1
1281
1282
1282 self.setFirstHeader()
1283 self.setFirstHeader()
1283
1284
1284 print 'Writing the file: %s'%self.filename
1285 print 'Writing the file: %s'%self.filename
1285
1286
1286 self.__writeFirstHeader()
1287 self.__writeFirstHeader()
1287
1288
1288 return 1
1289 return 1
1289
1290
1290 def setup(self, dataOut, path, blocksPerFile, profilesPerBlock=64, set=0, ext=None):
1291 def setup(self, dataOut, path, blocksPerFile, profilesPerBlock=64, set=0, ext=None):
1291 """
1292 """
1292 Setea el tipo de formato en la cual sera guardada la data y escribe el First Header
1293 Setea el tipo de formato en la cual sera guardada la data y escribe el First Header
1293
1294
1294 Inputs:
1295 Inputs:
1295 path : el path destino en el cual se escribiran los files a crear
1296 path : el path destino en el cual se escribiran los files a crear
1296 format : formato en el cual sera salvado un file
1297 format : formato en el cual sera salvado un file
1297 set : el setebo del file
1298 set : el setebo del file
1298
1299
1299 Return:
1300 Return:
1300 0 : Si no realizo un buen seteo
1301 0 : Si no realizo un buen seteo
1301 1 : Si realizo un buen seteo
1302 1 : Si realizo un buen seteo
1302 """
1303 """
1303
1304
1304 if ext == None:
1305 if ext == None:
1305 ext = self.ext
1306 ext = self.ext
1306
1307
1307 ext = ext.lower()
1308 ext = ext.lower()
1308
1309
1309 self.ext = ext
1310 self.ext = ext
1310
1311
1311 self.path = path
1312 self.path = path
1312
1313
1313 self.setFile = set - 1
1314 self.setFile = set - 1
1314
1315
1315 self.blocksPerFile = blocksPerFile
1316 self.blocksPerFile = blocksPerFile
1316
1317
1317 self.profilesPerBlock = profilesPerBlock
1318 self.profilesPerBlock = profilesPerBlock
1318
1319
1319 self.dataOut = dataOut
1320 self.dataOut = dataOut
1320
1321
1321 if not(self.setNextFile()):
1322 if not(self.setNextFile()):
1322 print "There isn't a next file"
1323 print "There isn't a next file"
1323 return 0
1324 return 0
1324
1325
1325 self.setBlockDimension()
1326 self.setBlockDimension()
1326
1327
1327 return 1
1328 return 1
1328
1329
1329 def run(self, dataOut, **kwargs):
1330 def run(self, dataOut, **kwargs):
1330
1331
1331 if not(self.isConfig):
1332 if not(self.isConfig):
1332
1333
1333 self.setup(dataOut, **kwargs)
1334 self.setup(dataOut, **kwargs)
1334 self.isConfig = True
1335 self.isConfig = True
1335
1336
1336 self.putData()
1337 self.putData()
1337
1338
@@ -1,763 +1,763
1 '''
1 '''
2
2
3 '''
3 '''
4
4
5 import os, sys
5 import os, sys
6 import time, datetime
6 import time, datetime
7 import numpy
7 import numpy
8 import fnmatch
8 import fnmatch
9 import glob
9 import glob
10
10
11 try:
11 try:
12 import pyfits
12 import pyfits
13 except:
13 except:
14 """
14 """
15 """
15 """
16
16
17 from xml.etree.ElementTree import ElementTree
17 from xml.etree.ElementTree import ElementTree
18
18
19 from jroIO_base import isDoyFolder, isNumber
19 from jroIO_base import isDoyFolder, isNumber
20 from model.proc.jroproc_base import Operation, ProcessingUnit
20 from model.proc.jroproc_base import Operation, ProcessingUnit
21
21
22 class ParameterConf:
22 class ParameterConf:
23 ELEMENTNAME = 'Parameter'
23 ELEMENTNAME = 'Parameter'
24 def __init__(self):
24 def __init__(self):
25 self.name = ''
25 self.name = ''
26 self.value = ''
26 self.value = ''
27
27
28 def readXml(self, parmElement):
28 def readXml(self, parmElement):
29 self.name = parmElement.get('name')
29 self.name = parmElement.get('name')
30 self.value = parmElement.get('value')
30 self.value = parmElement.get('value')
31
31
32 def getElementName(self):
32 def getElementName(self):
33 return self.ELEMENTNAME
33 return self.ELEMENTNAME
34
34
35 class Metadata:
35 class Metadata:
36
36
37 def __init__(self, filename):
37 def __init__(self, filename):
38 self.parmConfObjList = []
38 self.parmConfObjList = []
39 self.readXml(filename)
39 self.readXml(filename)
40
40
41 def readXml(self, filename):
41 def readXml(self, filename):
42 self.projectElement = None
42 self.projectElement = None
43 self.procUnitConfObjDict = {}
43 self.procUnitConfObjDict = {}
44 self.projectElement = ElementTree().parse(filename)
44 self.projectElement = ElementTree().parse(filename)
45 self.project = self.projectElement.tag
45 self.project = self.projectElement.tag
46
46
47 parmElementList = self.projectElement.getiterator(ParameterConf().getElementName())
47 parmElementList = self.projectElement.getiterator(ParameterConf().getElementName())
48
48
49 for parmElement in parmElementList:
49 for parmElement in parmElementList:
50 parmConfObj = ParameterConf()
50 parmConfObj = ParameterConf()
51 parmConfObj.readXml(parmElement)
51 parmConfObj.readXml(parmElement)
52 self.parmConfObjList.append(parmConfObj)
52 self.parmConfObjList.append(parmConfObj)
53
53
54 class FitsWriter(Operation):
54 class FitsWriter(Operation):
55
55
56 def __init__(self):
56 def __init__(self):
57 self.isConfig = False
57 self.isConfig = False
58 self.dataBlocksPerFile = None
58 self.dataBlocksPerFile = None
59 self.blockIndex = 0
59 self.blockIndex = 0
60 self.flagIsNewFile = 1
60 self.flagIsNewFile = 1
61 self.fitsObj = None
61 self.fitsObj = None
62 self.optchar = 'P'
62 self.optchar = 'P'
63 self.ext = '.fits'
63 self.ext = '.fits'
64 self.setFile = 0
64 self.setFile = 0
65
65
66 def setFitsHeader(self, dataOut, metadatafile):
66 def setFitsHeader(self, dataOut, metadatafile):
67
67
68 header_data = pyfits.PrimaryHDU()
68 header_data = pyfits.PrimaryHDU()
69
69
70 metadata4fits = Metadata(metadatafile)
70 metadata4fits = Metadata(metadatafile)
71 for parameter in metadata4fits.parmConfObjList:
71 for parameter in metadata4fits.parmConfObjList:
72 parm_name = parameter.name
72 parm_name = parameter.name
73 parm_value = parameter.value
73 parm_value = parameter.value
74
74
75 # if parm_value == 'fromdatadatetime':
75 # if parm_value == 'fromdatadatetime':
76 # value = time.strftime("%b %d %Y %H:%M:%S", dataOut.datatime.timetuple())
76 # value = time.strftime("%b %d %Y %H:%M:%S", dataOut.datatime.timetuple())
77 # elif parm_value == 'fromdataheights':
77 # elif parm_value == 'fromdataheights':
78 # value = dataOut.nHeights
78 # value = dataOut.nHeights
79 # elif parm_value == 'fromdatachannel':
79 # elif parm_value == 'fromdatachannel':
80 # value = dataOut.nChannels
80 # value = dataOut.nChannels
81 # elif parm_value == 'fromdatasamples':
81 # elif parm_value == 'fromdatasamples':
82 # value = dataOut.nFFTPoints
82 # value = dataOut.nFFTPoints
83 # else:
83 # else:
84 # value = parm_value
84 # value = parm_value
85
85
86 header_data.header[parm_name] = parm_value
86 header_data.header[parm_name] = parm_value
87
87
88
88
89 header_data.header['DATETIME'] = time.strftime("%b %d %Y %H:%M:%S", dataOut.datatime.timetuple())
89 header_data.header['DATETIME'] = time.strftime("%b %d %Y %H:%M:%S", dataOut.datatime.timetuple())
90 header_data.header['CHANNELLIST'] = str(dataOut.channelList)
90 header_data.header['CHANNELLIST'] = str(dataOut.channelList)
91 header_data.header['NCHANNELS'] = dataOut.nChannels
91 header_data.header['NCHANNELS'] = dataOut.nChannels
92 #header_data.header['HEIGHTS'] = dataOut.heightList
92 #header_data.header['HEIGHTS'] = dataOut.heightList
93 header_data.header['NHEIGHTS'] = dataOut.nHeights
93 header_data.header['NHEIGHTS'] = dataOut.nHeights
94
94
95 header_data.header['IPPSECONDS'] = dataOut.ippSeconds
95 header_data.header['IPPSECONDS'] = dataOut.ippSeconds
96 header_data.header['NCOHINT'] = dataOut.nCohInt
96 header_data.header['NCOHINT'] = dataOut.nCohInt
97 header_data.header['NINCOHINT'] = dataOut.nIncohInt
97 header_data.header['NINCOHINT'] = dataOut.nIncohInt
98 header_data.header['TIMEZONE'] = dataOut.timeZone
98 header_data.header['TIMEZONE'] = dataOut.timeZone
99 header_data.header['NBLOCK'] = self.blockIndex
99 header_data.header['NBLOCK'] = self.blockIndex
100
100
101 header_data.writeto(self.filename)
101 header_data.writeto(self.filename)
102
102
103 self.addExtension(dataOut.heightList,'HEIGHTLIST')
103 self.addExtension(dataOut.heightList,'HEIGHTLIST')
104
104
105
105
106 def setup(self, dataOut, path, dataBlocksPerFile, metadatafile):
106 def setup(self, dataOut, path, dataBlocksPerFile, metadatafile):
107
107
108 self.path = path
108 self.path = path
109 self.dataOut = dataOut
109 self.dataOut = dataOut
110 self.metadatafile = metadatafile
110 self.metadatafile = metadatafile
111 self.dataBlocksPerFile = dataBlocksPerFile
111 self.dataBlocksPerFile = dataBlocksPerFile
112
112
113 def open(self):
113 def open(self):
114 self.fitsObj = pyfits.open(self.filename, mode='update')
114 self.fitsObj = pyfits.open(self.filename, mode='update')
115
115
116
116
117 def addExtension(self, data, tagname):
117 def addExtension(self, data, tagname):
118 self.open()
118 self.open()
119 extension = pyfits.ImageHDU(data=data, name=tagname)
119 extension = pyfits.ImageHDU(data=data, name=tagname)
120 #extension.header['TAG'] = tagname
120 #extension.header['TAG'] = tagname
121 self.fitsObj.append(extension)
121 self.fitsObj.append(extension)
122 self.write()
122 self.write()
123
123
124 def addData(self, data):
124 def addData(self, data):
125 self.open()
125 self.open()
126 extension = pyfits.ImageHDU(data=data, name=self.fitsObj[0].header['DATATYPE'])
126 extension = pyfits.ImageHDU(data=data, name=self.fitsObj[0].header['DATATYPE'])
127 extension.header['UTCTIME'] = self.dataOut.utctime
127 extension.header['UTCTIME'] = self.dataOut.utctime
128 self.fitsObj.append(extension)
128 self.fitsObj.append(extension)
129 self.blockIndex += 1
129 self.blockIndex += 1
130 self.fitsObj[0].header['NBLOCK'] = self.blockIndex
130 self.fitsObj[0].header['NBLOCK'] = self.blockIndex
131
131
132 self.write()
132 self.write()
133
133
134 def write(self):
134 def write(self):
135
135
136 self.fitsObj.flush(verbose=True)
136 self.fitsObj.flush(verbose=True)
137 self.fitsObj.close()
137 self.fitsObj.close()
138
138
139
139
140 def setNextFile(self):
140 def setNextFile(self):
141
141
142 ext = self.ext
142 ext = self.ext
143 path = self.path
143 path = self.path
144
144
145 timeTuple = time.localtime( self.dataOut.utctime)
145 timeTuple = time.localtime( self.dataOut.utctime)
146 subfolder = 'd%4.4d%3.3d' % (timeTuple.tm_year,timeTuple.tm_yday)
146 subfolder = 'd%4.4d%3.3d' % (timeTuple.tm_year,timeTuple.tm_yday)
147
147
148 fullpath = os.path.join( path, subfolder )
148 fullpath = os.path.join( path, subfolder )
149 if not( os.path.exists(fullpath) ):
149 if not( os.path.exists(fullpath) ):
150 os.mkdir(fullpath)
150 os.mkdir(fullpath)
151 self.setFile = -1 #inicializo mi contador de seteo
151 self.setFile = -1 #inicializo mi contador de seteo
152 else:
152 else:
153 filesList = os.listdir( fullpath )
153 filesList = os.listdir( fullpath )
154 if len( filesList ) > 0:
154 if len( filesList ) > 0:
155 filesList = sorted( filesList, key=str.lower )
155 filesList = sorted( filesList, key=str.lower )
156 filen = filesList[-1]
156 filen = filesList[-1]
157
157
158 if isNumber( filen[8:11] ):
158 if isNumber( filen[8:11] ):
159 self.setFile = int( filen[8:11] ) #inicializo mi contador de seteo al seteo del ultimo file
159 self.setFile = int( filen[8:11] ) #inicializo mi contador de seteo al seteo del ultimo file
160 else:
160 else:
161 self.setFile = -1
161 self.setFile = -1
162 else:
162 else:
163 self.setFile = -1 #inicializo mi contador de seteo
163 self.setFile = -1 #inicializo mi contador de seteo
164
164
165 setFile = self.setFile
165 setFile = self.setFile
166 setFile += 1
166 setFile += 1
167
167
168 file = '%s%4.4d%3.3d%3.3d%s' % (self.optchar,
168 file = '%s%4.4d%3.3d%3.3d%s' % (self.optchar,
169 timeTuple.tm_year,
169 timeTuple.tm_year,
170 timeTuple.tm_yday,
170 timeTuple.tm_yday,
171 setFile,
171 setFile,
172 ext )
172 ext )
173
173
174 filename = os.path.join( path, subfolder, file )
174 filename = os.path.join( path, subfolder, file )
175
175
176 self.blockIndex = 0
176 self.blockIndex = 0
177 self.filename = filename
177 self.filename = filename
178 self.setFile = setFile
178 self.setFile = setFile
179 self.flagIsNewFile = 1
179 self.flagIsNewFile = 1
180
180
181 print 'Writing the file: %s'%self.filename
181 print 'Writing the file: %s'%self.filename
182
182
183 self.setFitsHeader(self.dataOut, self.metadatafile)
183 self.setFitsHeader(self.dataOut, self.metadatafile)
184
184
185 return 1
185 return 1
186
186
187 def writeBlock(self):
187 def writeBlock(self):
188 self.addData(self.dataOut.data_spc)
188 self.addData(self.dataOut.data_spc)
189 self.flagIsNewFile = 0
189 self.flagIsNewFile = 0
190
190
191
191
192 def __setNewBlock(self):
192 def __setNewBlock(self):
193
193
194 if self.flagIsNewFile:
194 if self.flagIsNewFile:
195 return 1
195 return 1
196
196
197 if self.blockIndex < self.dataBlocksPerFile:
197 if self.blockIndex < self.dataBlocksPerFile:
198 return 1
198 return 1
199
199
200 if not( self.setNextFile() ):
200 if not( self.setNextFile() ):
201 return 0
201 return 0
202
202
203 return 1
203 return 1
204
204
205 def writeNextBlock(self):
205 def writeNextBlock(self):
206 if not( self.__setNewBlock() ):
206 if not( self.__setNewBlock() ):
207 return 0
207 return 0
208 self.writeBlock()
208 self.writeBlock()
209 return 1
209 return 1
210
210
211 def putData(self):
211 def putData(self):
212 if self.flagIsNewFile:
212 if self.flagIsNewFile:
213 self.setNextFile()
213 self.setNextFile()
214 self.writeNextBlock()
214 self.writeNextBlock()
215
215
216 def run(self, dataOut, **kwargs):
216 def run(self, dataOut, **kwargs):
217 if not(self.isConfig):
217 if not(self.isConfig):
218 self.setup(dataOut, **kwargs)
218 self.setup(dataOut, **kwargs)
219 self.isConfig = True
219 self.isConfig = True
220 self.putData()
220 self.putData()
221
221
222
222
223 class FitsReader(ProcessingUnit):
223 class FitsReader(ProcessingUnit):
224
224
225 # __TIMEZONE = time.timezone
225 # __TIMEZONE = time.timezone
226
226
227 expName = None
227 expName = None
228 datetimestr = None
228 datetimestr = None
229 utc = None
229 utc = None
230 nChannels = None
230 nChannels = None
231 nSamples = None
231 nSamples = None
232 dataBlocksPerFile = None
232 dataBlocksPerFile = None
233 comments = None
233 comments = None
234 lastUTTime = None
234 lastUTTime = None
235 header_dict = None
235 header_dict = None
236 data = None
236 data = None
237 data_header_dict = None
237 data_header_dict = None
238
238
239 def __init__(self):
239 def __init__(self):
240 self.isConfig = False
240 self.isConfig = False
241 self.ext = '.fits'
241 self.ext = '.fits'
242 self.setFile = 0
242 self.setFile = 0
243 self.flagNoMoreFiles = 0
243 self.flagNoMoreFiles = 0
244 self.flagIsNewFile = 1
244 self.flagIsNewFile = 1
245 self.flagTimeBlock = None
245 self.flagTimeBlock = None
246 self.fileIndex = None
246 self.fileIndex = None
247 self.filename = None
247 self.filename = None
248 self.fileSize = None
248 self.fileSize = None
249 self.fitsObj = None
249 self.fitsObj = None
250 self.timeZone = None
250 self.timeZone = None
251 self.nReadBlocks = 0
251 self.nReadBlocks = 0
252 self.nTotalBlocks = 0
252 self.nTotalBlocks = 0
253 self.dataOut = self.createObjByDefault()
253 self.dataOut = self.createObjByDefault()
254 self.maxTimeStep = 10# deberia ser definido por el usuario usando el metodo setup()
254 self.maxTimeStep = 10# deberia ser definido por el usuario usando el metodo setup()
255 self.blockIndex = 1
255 self.blockIndex = 1
256
256
257 def createObjByDefault(self):
257 def createObjByDefault(self):
258
258
259 dataObj = Fits()
259 dataObj = Fits()
260
260
261 return dataObj
261 return dataObj
262
262
263 def isFileinThisTime(self, filename, startTime, endTime, useLocalTime=False):
263 def isFileinThisTime(self, filename, startTime, endTime, useLocalTime=False):
264 try:
264 try:
265 fitsObj = pyfits.open(filename,'readonly')
265 fitsObj = pyfits.open(filename,'readonly')
266 except:
266 except:
267 raise IOError, "The file %s can't be opened" %(filename)
267 raise IOError, "The file %s can't be opened" %(filename)
268
268
269 header = fitsObj[0].header
269 header = fitsObj[0].header
270 struct_time = time.strptime(header['DATETIME'], "%b %d %Y %H:%M:%S")
270 struct_time = time.strptime(header['DATETIME'], "%b %d %Y %H:%M:%S")
271 utc = time.mktime(struct_time) - time.timezone #TIMEZONE debe ser un parametro del header FITS
271 utc = time.mktime(struct_time) - time.timezone #TIMEZONE debe ser un parametro del header FITS
272
272
273 ltc = utc
273 ltc = utc
274 if useLocalTime:
274 if useLocalTime:
275 ltc -= time.timezone
275 ltc -= time.timezone
276 thisDatetime = datetime.datetime.utcfromtimestamp(ltc)
276 thisDatetime = datetime.datetime.utcfromtimestamp(ltc)
277 thisTime = thisDatetime.time()
277 thisTime = thisDatetime.time()
278
278
279 if not ((startTime <= thisTime) and (endTime > thisTime)):
279 if not ((startTime <= thisTime) and (endTime > thisTime)):
280 return None
280 return None
281
281
282 return thisDatetime
282 return thisDatetime
283
283
284 def __setNextFileOnline(self):
284 def __setNextFileOnline(self):
285 raise ValueError, "No implemented"
285 raise ValueError, "No implemented"
286
286
287 def __setNextFileOffline(self):
287 def __setNextFileOffline(self):
288 idFile = self.fileIndex
288 idFile = self.fileIndex
289
289
290 while (True):
290 while (True):
291 idFile += 1
291 idFile += 1
292 if not(idFile < len(self.filenameList)):
292 if not(idFile < len(self.filenameList)):
293 self.flagNoMoreFiles = 1
293 self.flagNoMoreFiles = 1
294 print "No more Files"
294 print "No more Files"
295 return 0
295 return 0
296
296
297 filename = self.filenameList[idFile]
297 filename = self.filenameList[idFile]
298
298
299 # if not(self.__verifyFile(filename)):
299 # if not(self.__verifyFile(filename)):
300 # continue
300 # continue
301
301
302 fileSize = os.path.getsize(filename)
302 fileSize = os.path.getsize(filename)
303 fitsObj = pyfits.open(filename,'readonly')
303 fitsObj = pyfits.open(filename,'readonly')
304 break
304 break
305
305
306 self.flagIsNewFile = 1
306 self.flagIsNewFile = 1
307 self.fileIndex = idFile
307 self.fileIndex = idFile
308 self.filename = filename
308 self.filename = filename
309 self.fileSize = fileSize
309 self.fileSize = fileSize
310 self.fitsObj = fitsObj
310 self.fitsObj = fitsObj
311 self.blockIndex = 0
311 self.blockIndex = 0
312 print "Setting the file: %s"%self.filename
312 print "Setting the file: %s"%self.filename
313
313
314 return 1
314 return 1
315
315
316 def readHeader(self):
316 def readHeader(self):
317 headerObj = self.fitsObj[0]
317 headerObj = self.fitsObj[0]
318
318
319 self.header_dict = headerObj.header
319 self.header_dict = headerObj.header
320 if 'EXPNAME' in headerObj.header.keys():
320 if 'EXPNAME' in headerObj.header.keys():
321 self.expName = headerObj.header['EXPNAME']
321 self.expName = headerObj.header['EXPNAME']
322
322
323 if 'DATATYPE' in headerObj.header.keys():
323 if 'DATATYPE' in headerObj.header.keys():
324 self.dataType = headerObj.header['DATATYPE']
324 self.dataType = headerObj.header['DATATYPE']
325
325
326 self.datetimestr = headerObj.header['DATETIME']
326 self.datetimestr = headerObj.header['DATETIME']
327 channelList = headerObj.header['CHANNELLIST']
327 channelList = headerObj.header['CHANNELLIST']
328 channelList = channelList.split('[')
328 channelList = channelList.split('[')
329 channelList = channelList[1].split(']')
329 channelList = channelList[1].split(']')
330 channelList = channelList[0].split(',')
330 channelList = channelList[0].split(',')
331 channelList = [int(ch) for ch in channelList]
331 channelList = [int(ch) for ch in channelList]
332 self.channelList = channelList
332 self.channelList = channelList
333 self.nChannels = headerObj.header['NCHANNELS']
333 self.nChannels = headerObj.header['NCHANNELS']
334 self.nHeights = headerObj.header['NHEIGHTS']
334 self.nHeights = headerObj.header['NHEIGHTS']
335 self.ippSeconds = headerObj.header['IPPSECONDS']
335 self.ippSeconds = headerObj.header['IPPSECONDS']
336 self.nCohInt = headerObj.header['NCOHINT']
336 self.nCohInt = headerObj.header['NCOHINT']
337 self.nIncohInt = headerObj.header['NINCOHINT']
337 self.nIncohInt = headerObj.header['NINCOHINT']
338 self.dataBlocksPerFile = headerObj.header['NBLOCK']
338 self.dataBlocksPerFile = headerObj.header['NBLOCK']
339 self.timeZone = headerObj.header['TIMEZONE']
339 self.timeZone = headerObj.header['TIMEZONE']
340
340
341 self.timeInterval = self.ippSeconds * self.nCohInt * self.nIncohInt
341 # self.timeInterval = self.ippSeconds * self.nCohInt * self.nIncohInt
342
342
343 if 'COMMENT' in headerObj.header.keys():
343 if 'COMMENT' in headerObj.header.keys():
344 self.comments = headerObj.header['COMMENT']
344 self.comments = headerObj.header['COMMENT']
345
345
346 self.readHeightList()
346 self.readHeightList()
347
347
348 def readHeightList(self):
348 def readHeightList(self):
349 self.blockIndex = self.blockIndex + 1
349 self.blockIndex = self.blockIndex + 1
350 obj = self.fitsObj[self.blockIndex]
350 obj = self.fitsObj[self.blockIndex]
351 self.heightList = obj.data
351 self.heightList = obj.data
352 self.blockIndex = self.blockIndex + 1
352 self.blockIndex = self.blockIndex + 1
353
353
354 def readExtension(self):
354 def readExtension(self):
355 obj = self.fitsObj[self.blockIndex]
355 obj = self.fitsObj[self.blockIndex]
356 self.heightList = obj.data
356 self.heightList = obj.data
357 self.blockIndex = self.blockIndex + 1
357 self.blockIndex = self.blockIndex + 1
358
358
359 def setNextFile(self):
359 def setNextFile(self):
360
360
361 if self.online:
361 if self.online:
362 newFile = self.__setNextFileOnline()
362 newFile = self.__setNextFileOnline()
363 else:
363 else:
364 newFile = self.__setNextFileOffline()
364 newFile = self.__setNextFileOffline()
365
365
366 if not(newFile):
366 if not(newFile):
367 return 0
367 return 0
368
368
369 self.readHeader()
369 self.readHeader()
370
370
371 self.nReadBlocks = 0
371 self.nReadBlocks = 0
372 # self.blockIndex = 1
372 # self.blockIndex = 1
373 return 1
373 return 1
374
374
375 def __searchFilesOffLine(self,
375 def __searchFilesOffLine(self,
376 path,
376 path,
377 startDate,
377 startDate,
378 endDate,
378 endDate,
379 startTime=datetime.time(0,0,0),
379 startTime=datetime.time(0,0,0),
380 endTime=datetime.time(23,59,59),
380 endTime=datetime.time(23,59,59),
381 set=None,
381 set=None,
382 expLabel='',
382 expLabel='',
383 ext='.fits',
383 ext='.fits',
384 walk=True):
384 walk=True):
385
385
386 pathList = []
386 pathList = []
387
387
388 if not walk:
388 if not walk:
389 pathList.append(path)
389 pathList.append(path)
390
390
391 else:
391 else:
392 dirList = []
392 dirList = []
393 for thisPath in os.listdir(path):
393 for thisPath in os.listdir(path):
394 if not os.path.isdir(os.path.join(path,thisPath)):
394 if not os.path.isdir(os.path.join(path,thisPath)):
395 continue
395 continue
396 if not isDoyFolder(thisPath):
396 if not isDoyFolder(thisPath):
397 continue
397 continue
398
398
399 dirList.append(thisPath)
399 dirList.append(thisPath)
400
400
401 if not(dirList):
401 if not(dirList):
402 return None, None
402 return None, None
403
403
404 thisDate = startDate
404 thisDate = startDate
405
405
406 while(thisDate <= endDate):
406 while(thisDate <= endDate):
407 year = thisDate.timetuple().tm_year
407 year = thisDate.timetuple().tm_year
408 doy = thisDate.timetuple().tm_yday
408 doy = thisDate.timetuple().tm_yday
409
409
410 matchlist = fnmatch.filter(dirList, '?' + '%4.4d%3.3d' % (year,doy) + '*')
410 matchlist = fnmatch.filter(dirList, '?' + '%4.4d%3.3d' % (year,doy) + '*')
411 if len(matchlist) == 0:
411 if len(matchlist) == 0:
412 thisDate += datetime.timedelta(1)
412 thisDate += datetime.timedelta(1)
413 continue
413 continue
414 for match in matchlist:
414 for match in matchlist:
415 pathList.append(os.path.join(path,match,expLabel))
415 pathList.append(os.path.join(path,match,expLabel))
416
416
417 thisDate += datetime.timedelta(1)
417 thisDate += datetime.timedelta(1)
418
418
419 if pathList == []:
419 if pathList == []:
420 print "Any folder was found for the date range: %s-%s" %(startDate, endDate)
420 print "Any folder was found for the date range: %s-%s" %(startDate, endDate)
421 return None, None
421 return None, None
422
422
423 print "%d folder(s) was(were) found for the date range: %s - %s" %(len(pathList), startDate, endDate)
423 print "%d folder(s) was(were) found for the date range: %s - %s" %(len(pathList), startDate, endDate)
424
424
425 filenameList = []
425 filenameList = []
426 datetimeList = []
426 datetimeList = []
427
427
428 for i in range(len(pathList)):
428 for i in range(len(pathList)):
429
429
430 thisPath = pathList[i]
430 thisPath = pathList[i]
431
431
432 fileList = glob.glob1(thisPath, "*%s" %ext)
432 fileList = glob.glob1(thisPath, "*%s" %ext)
433 fileList.sort()
433 fileList.sort()
434
434
435 for file in fileList:
435 for file in fileList:
436
436
437 filename = os.path.join(thisPath,file)
437 filename = os.path.join(thisPath,file)
438 thisDatetime = self.isFileinThisTime(filename, startTime, endTime)
438 thisDatetime = self.isFileinThisTime(filename, startTime, endTime)
439
439
440 if not(thisDatetime):
440 if not(thisDatetime):
441 continue
441 continue
442
442
443 filenameList.append(filename)
443 filenameList.append(filename)
444 datetimeList.append(thisDatetime)
444 datetimeList.append(thisDatetime)
445
445
446 if not(filenameList):
446 if not(filenameList):
447 print "Any file was found for the time range %s - %s" %(startTime, endTime)
447 print "Any file was found for the time range %s - %s" %(startTime, endTime)
448 return None, None
448 return None, None
449
449
450 print "%d file(s) was(were) found for the time range: %s - %s" %(len(filenameList), startTime, endTime)
450 print "%d file(s) was(were) found for the time range: %s - %s" %(len(filenameList), startTime, endTime)
451 print
451 print
452
452
453 for i in range(len(filenameList)):
453 for i in range(len(filenameList)):
454 print "%s -> [%s]" %(filenameList[i], datetimeList[i].ctime())
454 print "%s -> [%s]" %(filenameList[i], datetimeList[i].ctime())
455
455
456 self.filenameList = filenameList
456 self.filenameList = filenameList
457 self.datetimeList = datetimeList
457 self.datetimeList = datetimeList
458
458
459 return pathList, filenameList
459 return pathList, filenameList
460
460
461 def setup(self, path=None,
461 def setup(self, path=None,
462 startDate=None,
462 startDate=None,
463 endDate=None,
463 endDate=None,
464 startTime=datetime.time(0,0,0),
464 startTime=datetime.time(0,0,0),
465 endTime=datetime.time(23,59,59),
465 endTime=datetime.time(23,59,59),
466 set=0,
466 set=0,
467 expLabel = "",
467 expLabel = "",
468 ext = None,
468 ext = None,
469 online = False,
469 online = False,
470 delay = 60,
470 delay = 60,
471 walk = True):
471 walk = True):
472
472
473 if path == None:
473 if path == None:
474 raise ValueError, "The path is not valid"
474 raise ValueError, "The path is not valid"
475
475
476 if ext == None:
476 if ext == None:
477 ext = self.ext
477 ext = self.ext
478
478
479 if not(online):
479 if not(online):
480 print "Searching files in offline mode ..."
480 print "Searching files in offline mode ..."
481 pathList, filenameList = self.__searchFilesOffLine(path, startDate=startDate, endDate=endDate,
481 pathList, filenameList = self.__searchFilesOffLine(path, startDate=startDate, endDate=endDate,
482 startTime=startTime, endTime=endTime,
482 startTime=startTime, endTime=endTime,
483 set=set, expLabel=expLabel, ext=ext,
483 set=set, expLabel=expLabel, ext=ext,
484 walk=walk)
484 walk=walk)
485
485
486 if not(pathList):
486 if not(pathList):
487 print "No *%s files into the folder %s \nfor the range: %s - %s"%(ext, path,
487 print "No *%s files into the folder %s \nfor the range: %s - %s"%(ext, path,
488 datetime.datetime.combine(startDate,startTime).ctime(),
488 datetime.datetime.combine(startDate,startTime).ctime(),
489 datetime.datetime.combine(endDate,endTime).ctime())
489 datetime.datetime.combine(endDate,endTime).ctime())
490
490
491 sys.exit(-1)
491 sys.exit(-1)
492
492
493 self.fileIndex = -1
493 self.fileIndex = -1
494 self.pathList = pathList
494 self.pathList = pathList
495 self.filenameList = filenameList
495 self.filenameList = filenameList
496
496
497 self.online = online
497 self.online = online
498 self.delay = delay
498 self.delay = delay
499 ext = ext.lower()
499 ext = ext.lower()
500 self.ext = ext
500 self.ext = ext
501
501
502 if not(self.setNextFile()):
502 if not(self.setNextFile()):
503 if (startDate!=None) and (endDate!=None):
503 if (startDate!=None) and (endDate!=None):
504 print "No files in range: %s - %s" %(datetime.datetime.combine(startDate,startTime).ctime(), datetime.datetime.combine(endDate,endTime).ctime())
504 print "No files in range: %s - %s" %(datetime.datetime.combine(startDate,startTime).ctime(), datetime.datetime.combine(endDate,endTime).ctime())
505 elif startDate != None:
505 elif startDate != None:
506 print "No files in range: %s" %(datetime.datetime.combine(startDate,startTime).ctime())
506 print "No files in range: %s" %(datetime.datetime.combine(startDate,startTime).ctime())
507 else:
507 else:
508 print "No files"
508 print "No files"
509
509
510 sys.exit(-1)
510 sys.exit(-1)
511
511
512
512
513
513
514 def readBlock(self):
514 def readBlock(self):
515 dataObj = self.fitsObj[self.blockIndex]
515 dataObj = self.fitsObj[self.blockIndex]
516
516
517 self.data = dataObj.data
517 self.data = dataObj.data
518 self.data_header_dict = dataObj.header
518 self.data_header_dict = dataObj.header
519 self.utc = self.data_header_dict['UTCTIME']
519 self.utc = self.data_header_dict['UTCTIME']
520
520
521 self.flagIsNewFile = 0
521 self.flagIsNewFile = 0
522 self.blockIndex += 1
522 self.blockIndex += 1
523 self.nTotalBlocks += 1
523 self.nTotalBlocks += 1
524 self.nReadBlocks += 1
524 self.nReadBlocks += 1
525
525
526 return 1
526 return 1
527
527
528 def __jumpToLastBlock(self):
528 def __jumpToLastBlock(self):
529 raise ValueError, "No implemented"
529 raise ValueError, "No implemented"
530
530
531 def __waitNewBlock(self):
531 def __waitNewBlock(self):
532 """
532 """
533 Return 1 si se encontro un nuevo bloque de datos, 0 de otra forma.
533 Return 1 si se encontro un nuevo bloque de datos, 0 de otra forma.
534
534
535 Si el modo de lectura es OffLine siempre retorn 0
535 Si el modo de lectura es OffLine siempre retorn 0
536 """
536 """
537 if not self.online:
537 if not self.online:
538 return 0
538 return 0
539
539
540 if (self.nReadBlocks >= self.dataBlocksPerFile):
540 if (self.nReadBlocks >= self.dataBlocksPerFile):
541 return 0
541 return 0
542
542
543 currentPointer = self.fp.tell()
543 currentPointer = self.fp.tell()
544
544
545 neededSize = self.processingHeaderObj.blockSize + self.basicHeaderSize
545 neededSize = self.processingHeaderObj.blockSize + self.basicHeaderSize
546
546
547 for nTries in range( self.nTries ):
547 for nTries in range( self.nTries ):
548
548
549 self.fp.close()
549 self.fp.close()
550 self.fp = open( self.filename, 'rb' )
550 self.fp = open( self.filename, 'rb' )
551 self.fp.seek( currentPointer )
551 self.fp.seek( currentPointer )
552
552
553 self.fileSize = os.path.getsize( self.filename )
553 self.fileSize = os.path.getsize( self.filename )
554 currentSize = self.fileSize - currentPointer
554 currentSize = self.fileSize - currentPointer
555
555
556 if ( currentSize >= neededSize ):
556 if ( currentSize >= neededSize ):
557 self.__rdBasicHeader()
557 self.__rdBasicHeader()
558 return 1
558 return 1
559
559
560 print "\tWaiting %0.2f seconds for the next block, try %03d ..." % (self.delay, nTries+1)
560 print "\tWaiting %0.2f seconds for the next block, try %03d ..." % (self.delay, nTries+1)
561 time.sleep( self.delay )
561 time.sleep( self.delay )
562
562
563
563
564 return 0
564 return 0
565
565
566 def __setNewBlock(self):
566 def __setNewBlock(self):
567
567
568 if self.online:
568 if self.online:
569 self.__jumpToLastBlock()
569 self.__jumpToLastBlock()
570
570
571 if self.flagIsNewFile:
571 if self.flagIsNewFile:
572 return 1
572 return 1
573
573
574 self.lastUTTime = self.utc
574 self.lastUTTime = self.utc
575
575
576 if self.online:
576 if self.online:
577 if self.__waitNewBlock():
577 if self.__waitNewBlock():
578 return 1
578 return 1
579
579
580 if self.nReadBlocks < self.dataBlocksPerFile:
580 if self.nReadBlocks < self.dataBlocksPerFile:
581 return 1
581 return 1
582
582
583 if not(self.setNextFile()):
583 if not(self.setNextFile()):
584 return 0
584 return 0
585
585
586 deltaTime = self.utc - self.lastUTTime
586 deltaTime = self.utc - self.lastUTTime
587
587
588 self.flagTimeBlock = 0
588 self.flagTimeBlock = 0
589
589
590 if deltaTime > self.maxTimeStep:
590 if deltaTime > self.maxTimeStep:
591 self.flagTimeBlock = 1
591 self.flagTimeBlock = 1
592
592
593 return 1
593 return 1
594
594
595
595
596 def readNextBlock(self):
596 def readNextBlock(self):
597 if not(self.__setNewBlock()):
597 if not(self.__setNewBlock()):
598 return 0
598 return 0
599
599
600 if not(self.readBlock()):
600 if not(self.readBlock()):
601 return 0
601 return 0
602
602
603 return 1
603 return 1
604
604
605
605
606 def getData(self):
606 def getData(self):
607
607
608 if self.flagNoMoreFiles:
608 if self.flagNoMoreFiles:
609 self.dataOut.flagNoData = True
609 self.dataOut.flagNoData = True
610 print 'Process finished'
610 print 'Process finished'
611 return 0
611 return 0
612
612
613 self.flagTimeBlock = 0
613 self.flagTimeBlock = 0
614 self.flagIsNewBlock = 0
614 self.flagIsNewBlock = 0
615
615
616 if not(self.readNextBlock()):
616 if not(self.readNextBlock()):
617 return 0
617 return 0
618
618
619 if self.data == None:
619 if self.data == None:
620 self.dataOut.flagNoData = True
620 self.dataOut.flagNoData = True
621 return 0
621 return 0
622
622
623 self.dataOut.data = self.data
623 self.dataOut.data = self.data
624 self.dataOut.data_header = self.data_header_dict
624 self.dataOut.data_header = self.data_header_dict
625 self.dataOut.utctime = self.utc
625 self.dataOut.utctime = self.utc
626
626
627 self.dataOut.header = self.header_dict
627 self.dataOut.header = self.header_dict
628 self.dataOut.expName = self.expName
628 self.dataOut.expName = self.expName
629 self.dataOut.nChannels = self.nChannels
629 self.dataOut.nChannels = self.nChannels
630 self.dataOut.timeZone = self.timeZone
630 self.dataOut.timeZone = self.timeZone
631 self.dataOut.dataBlocksPerFile = self.dataBlocksPerFile
631 self.dataOut.dataBlocksPerFile = self.dataBlocksPerFile
632 self.dataOut.comments = self.comments
632 self.dataOut.comments = self.comments
633 self.dataOut.timeInterval = self.timeInterval
633 self.dataOut.timeInterval = self.timeInterval
634 self.dataOut.channelList = self.channelList
634 self.dataOut.channelList = self.channelList
635 self.dataOut.heightList = self.heightList
635 self.dataOut.heightList = self.heightList
636 self.dataOut.flagNoData = False
636 self.dataOut.flagNoData = False
637
637
638 return self.dataOut.data
638 return self.dataOut.data
639
639
640 def run(self, **kwargs):
640 def run(self, **kwargs):
641
641
642 if not(self.isConfig):
642 if not(self.isConfig):
643 self.setup(**kwargs)
643 self.setup(**kwargs)
644 self.isConfig = True
644 self.isConfig = True
645
645
646 self.getData()
646 self.getData()
647
647
648 class SpectraHeisWriter(Operation):
648 class SpectraHeisWriter(Operation):
649 # set = None
649 # set = None
650 setFile = None
650 setFile = None
651 idblock = None
651 idblock = None
652 doypath = None
652 doypath = None
653 subfolder = None
653 subfolder = None
654
654
655 def __init__(self):
655 def __init__(self):
656 self.wrObj = FITS()
656 self.wrObj = FITS()
657 # self.dataOut = dataOut
657 # self.dataOut = dataOut
658 self.nTotalBlocks=0
658 self.nTotalBlocks=0
659 # self.set = None
659 # self.set = None
660 self.setFile = None
660 self.setFile = None
661 self.idblock = 0
661 self.idblock = 0
662 self.wrpath = None
662 self.wrpath = None
663 self.doypath = None
663 self.doypath = None
664 self.subfolder = None
664 self.subfolder = None
665 self.isConfig = False
665 self.isConfig = False
666
666
667 def isNumber(str):
667 def isNumber(str):
668 """
668 """
669 Chequea si el conjunto de caracteres que componen un string puede ser convertidos a un numero.
669 Chequea si el conjunto de caracteres que componen un string puede ser convertidos a un numero.
670
670
671 Excepciones:
671 Excepciones:
672 Si un determinado string no puede ser convertido a numero
672 Si un determinado string no puede ser convertido a numero
673 Input:
673 Input:
674 str, string al cual se le analiza para determinar si convertible a un numero o no
674 str, string al cual se le analiza para determinar si convertible a un numero o no
675
675
676 Return:
676 Return:
677 True : si el string es uno numerico
677 True : si el string es uno numerico
678 False : no es un string numerico
678 False : no es un string numerico
679 """
679 """
680 try:
680 try:
681 float( str )
681 float( str )
682 return True
682 return True
683 except:
683 except:
684 return False
684 return False
685
685
686 def setup(self, dataOut, wrpath):
686 def setup(self, dataOut, wrpath):
687
687
688 if not(os.path.exists(wrpath)):
688 if not(os.path.exists(wrpath)):
689 os.mkdir(wrpath)
689 os.mkdir(wrpath)
690
690
691 self.wrpath = wrpath
691 self.wrpath = wrpath
692 # self.setFile = 0
692 # self.setFile = 0
693 self.dataOut = dataOut
693 self.dataOut = dataOut
694
694
695 def putData(self):
695 def putData(self):
696 name= time.localtime( self.dataOut.utctime)
696 name= time.localtime( self.dataOut.utctime)
697 ext=".fits"
697 ext=".fits"
698
698
699 if self.doypath == None:
699 if self.doypath == None:
700 self.subfolder = 'F%4.4d%3.3d_%d' % (name.tm_year,name.tm_yday,time.mktime(datetime.datetime.now().timetuple()))
700 self.subfolder = 'F%4.4d%3.3d_%d' % (name.tm_year,name.tm_yday,time.mktime(datetime.datetime.now().timetuple()))
701 self.doypath = os.path.join( self.wrpath, self.subfolder )
701 self.doypath = os.path.join( self.wrpath, self.subfolder )
702 os.mkdir(self.doypath)
702 os.mkdir(self.doypath)
703
703
704 if self.setFile == None:
704 if self.setFile == None:
705 # self.set = self.dataOut.set
705 # self.set = self.dataOut.set
706 self.setFile = 0
706 self.setFile = 0
707 # if self.set != self.dataOut.set:
707 # if self.set != self.dataOut.set:
708 ## self.set = self.dataOut.set
708 ## self.set = self.dataOut.set
709 # self.setFile = 0
709 # self.setFile = 0
710
710
711 #make the filename
711 #make the filename
712 file = 'D%4.4d%3.3d_%3.3d%s' % (name.tm_year,name.tm_yday,self.setFile,ext)
712 file = 'D%4.4d%3.3d_%3.3d%s' % (name.tm_year,name.tm_yday,self.setFile,ext)
713
713
714 filename = os.path.join(self.wrpath,self.subfolder, file)
714 filename = os.path.join(self.wrpath,self.subfolder, file)
715
715
716 idblock = numpy.array([self.idblock],dtype="int64")
716 idblock = numpy.array([self.idblock],dtype="int64")
717 header=self.wrObj.cFImage(idblock=idblock,
717 header=self.wrObj.cFImage(idblock=idblock,
718 year=time.gmtime(self.dataOut.utctime).tm_year,
718 year=time.gmtime(self.dataOut.utctime).tm_year,
719 month=time.gmtime(self.dataOut.utctime).tm_mon,
719 month=time.gmtime(self.dataOut.utctime).tm_mon,
720 day=time.gmtime(self.dataOut.utctime).tm_mday,
720 day=time.gmtime(self.dataOut.utctime).tm_mday,
721 hour=time.gmtime(self.dataOut.utctime).tm_hour,
721 hour=time.gmtime(self.dataOut.utctime).tm_hour,
722 minute=time.gmtime(self.dataOut.utctime).tm_min,
722 minute=time.gmtime(self.dataOut.utctime).tm_min,
723 second=time.gmtime(self.dataOut.utctime).tm_sec)
723 second=time.gmtime(self.dataOut.utctime).tm_sec)
724
724
725 c=3E8
725 c=3E8
726 deltaHeight = self.dataOut.heightList[1] - self.dataOut.heightList[0]
726 deltaHeight = self.dataOut.heightList[1] - self.dataOut.heightList[0]
727 freq=numpy.arange(-1*self.dataOut.nHeights/2.,self.dataOut.nHeights/2.)*(c/(2*deltaHeight*1000))
727 freq=numpy.arange(-1*self.dataOut.nHeights/2.,self.dataOut.nHeights/2.)*(c/(2*deltaHeight*1000))
728
728
729 colList = []
729 colList = []
730
730
731 colFreq=self.wrObj.setColF(name="freq", format=str(self.dataOut.nFFTPoints)+'E', array=freq)
731 colFreq=self.wrObj.setColF(name="freq", format=str(self.dataOut.nFFTPoints)+'E', array=freq)
732
732
733 colList.append(colFreq)
733 colList.append(colFreq)
734
734
735 nchannel=self.dataOut.nChannels
735 nchannel=self.dataOut.nChannels
736
736
737 for i in range(nchannel):
737 for i in range(nchannel):
738 col = self.wrObj.writeData(name="PCh"+str(i+1),
738 col = self.wrObj.writeData(name="PCh"+str(i+1),
739 format=str(self.dataOut.nFFTPoints)+'E',
739 format=str(self.dataOut.nFFTPoints)+'E',
740 data=10*numpy.log10(self.dataOut.data_spc[i,:]))
740 data=10*numpy.log10(self.dataOut.data_spc[i,:]))
741
741
742 colList.append(col)
742 colList.append(col)
743
743
744 data=self.wrObj.Ctable(colList=colList)
744 data=self.wrObj.Ctable(colList=colList)
745
745
746 self.wrObj.CFile(header,data)
746 self.wrObj.CFile(header,data)
747
747
748 self.wrObj.wFile(filename)
748 self.wrObj.wFile(filename)
749
749
750 #update the setFile
750 #update the setFile
751 self.setFile += 1
751 self.setFile += 1
752 self.idblock += 1
752 self.idblock += 1
753
753
754 return 1
754 return 1
755
755
756 def run(self, dataOut, **kwargs):
756 def run(self, dataOut, **kwargs):
757
757
758 if not(self.isConfig):
758 if not(self.isConfig):
759
759
760 self.setup(dataOut, **kwargs)
760 self.setup(dataOut, **kwargs)
761 self.isConfig = True
761 self.isConfig = True
762
762
763 self.putData() No newline at end of file
763 self.putData()
@@ -1,761 +1,761
1 '''
1 '''
2 '''
2 '''
3
3
4 import numpy
4 import numpy
5
5
6 from jroIO_base import LOCALTIME, JRODataReader, JRODataWriter
6 from jroIO_base import LOCALTIME, JRODataReader, JRODataWriter
7 from model.proc.jroproc_base import ProcessingUnit, Operation
7 from model.proc.jroproc_base import ProcessingUnit, Operation
8 from model.data.jroheaderIO import PROCFLAG, BasicHeader, SystemHeader, RadarControllerHeader, ProcessingHeader
8 from model.data.jroheaderIO import PROCFLAG, BasicHeader, SystemHeader, RadarControllerHeader, ProcessingHeader
9 from model.data.jrodata import Spectra
9 from model.data.jrodata import Spectra
10
10
11 class SpectraReader(JRODataReader, ProcessingUnit):
11 class SpectraReader(JRODataReader, ProcessingUnit):
12 """
12 """
13 Esta clase permite leer datos de espectros desde archivos procesados (.pdata). La lectura
13 Esta clase permite leer datos de espectros desde archivos procesados (.pdata). La lectura
14 de los datos siempre se realiza por bloques. Los datos leidos (array de 3 dimensiones)
14 de los datos siempre se realiza por bloques. Los datos leidos (array de 3 dimensiones)
15 son almacenados en tres buffer's para el Self Spectra, el Cross Spectra y el DC Channel.
15 son almacenados en tres buffer's para el Self Spectra, el Cross Spectra y el DC Channel.
16
16
17 paresCanalesIguales * alturas * perfiles (Self Spectra)
17 paresCanalesIguales * alturas * perfiles (Self Spectra)
18 paresCanalesDiferentes * alturas * perfiles (Cross Spectra)
18 paresCanalesDiferentes * alturas * perfiles (Cross Spectra)
19 canales * alturas (DC Channels)
19 canales * alturas (DC Channels)
20
20
21 Esta clase contiene instancias (objetos) de las clases BasicHeader, SystemHeader,
21 Esta clase contiene instancias (objetos) de las clases BasicHeader, SystemHeader,
22 RadarControllerHeader y Spectra. Los tres primeros se usan para almacenar informacion de la
22 RadarControllerHeader y Spectra. Los tres primeros se usan para almacenar informacion de la
23 cabecera de datos (metadata), y el cuarto (Spectra) para obtener y almacenar un bloque de
23 cabecera de datos (metadata), y el cuarto (Spectra) para obtener y almacenar un bloque de
24 datos desde el "buffer" cada vez que se ejecute el metodo "getData".
24 datos desde el "buffer" cada vez que se ejecute el metodo "getData".
25
25
26 Example:
26 Example:
27 dpath = "/home/myuser/data"
27 dpath = "/home/myuser/data"
28
28
29 startTime = datetime.datetime(2010,1,20,0,0,0,0,0,0)
29 startTime = datetime.datetime(2010,1,20,0,0,0,0,0,0)
30
30
31 endTime = datetime.datetime(2010,1,21,23,59,59,0,0,0)
31 endTime = datetime.datetime(2010,1,21,23,59,59,0,0,0)
32
32
33 readerObj = SpectraReader()
33 readerObj = SpectraReader()
34
34
35 readerObj.setup(dpath, startTime, endTime)
35 readerObj.setup(dpath, startTime, endTime)
36
36
37 while(True):
37 while(True):
38
38
39 readerObj.getData()
39 readerObj.getData()
40
40
41 print readerObj.data_spc
41 print readerObj.data_spc
42
42
43 print readerObj.data_cspc
43 print readerObj.data_cspc
44
44
45 print readerObj.data_dc
45 print readerObj.data_dc
46
46
47 if readerObj.flagNoMoreFiles:
47 if readerObj.flagNoMoreFiles:
48 break
48 break
49
49
50 """
50 """
51
51
52 pts2read_SelfSpectra = 0
52 pts2read_SelfSpectra = 0
53
53
54 pts2read_CrossSpectra = 0
54 pts2read_CrossSpectra = 0
55
55
56 pts2read_DCchannels = 0
56 pts2read_DCchannels = 0
57
57
58 ext = ".pdata"
58 ext = ".pdata"
59
59
60 optchar = "P"
60 optchar = "P"
61
61
62 dataOut = None
62 dataOut = None
63
63
64 nRdChannels = None
64 nRdChannels = None
65
65
66 nRdPairs = None
66 nRdPairs = None
67
67
68 rdPairList = []
68 rdPairList = []
69
69
70 def __init__(self):
70 def __init__(self):
71 """
71 """
72 Inicializador de la clase SpectraReader para la lectura de datos de espectros.
72 Inicializador de la clase SpectraReader para la lectura de datos de espectros.
73
73
74 Inputs:
74 Inputs:
75 dataOut : Objeto de la clase Spectra. Este objeto sera utilizado para
75 dataOut : Objeto de la clase Spectra. Este objeto sera utilizado para
76 almacenar un perfil de datos cada vez que se haga un requerimiento
76 almacenar un perfil de datos cada vez que se haga un requerimiento
77 (getData). El perfil sera obtenido a partir del buffer de datos,
77 (getData). El perfil sera obtenido a partir del buffer de datos,
78 si el buffer esta vacio se hara un nuevo proceso de lectura de un
78 si el buffer esta vacio se hara un nuevo proceso de lectura de un
79 bloque de datos.
79 bloque de datos.
80 Si este parametro no es pasado se creara uno internamente.
80 Si este parametro no es pasado se creara uno internamente.
81
81
82 Affected:
82 Affected:
83 self.dataOut
83 self.dataOut
84
84
85 Return : None
85 Return : None
86 """
86 """
87
87
88 #Eliminar de la base la herencia
88 #Eliminar de la base la herencia
89 ProcessingUnit.__init__(self)
89 ProcessingUnit.__init__(self)
90
90
91 # self.isConfig = False
91 # self.isConfig = False
92
92
93 self.pts2read_SelfSpectra = 0
93 self.pts2read_SelfSpectra = 0
94
94
95 self.pts2read_CrossSpectra = 0
95 self.pts2read_CrossSpectra = 0
96
96
97 self.pts2read_DCchannels = 0
97 self.pts2read_DCchannels = 0
98
98
99 self.datablock = None
99 self.datablock = None
100
100
101 self.utc = None
101 self.utc = None
102
102
103 self.ext = ".pdata"
103 self.ext = ".pdata"
104
104
105 self.optchar = "P"
105 self.optchar = "P"
106
106
107 self.basicHeaderObj = BasicHeader(LOCALTIME)
107 self.basicHeaderObj = BasicHeader(LOCALTIME)
108
108
109 self.systemHeaderObj = SystemHeader()
109 self.systemHeaderObj = SystemHeader()
110
110
111 self.radarControllerHeaderObj = RadarControllerHeader()
111 self.radarControllerHeaderObj = RadarControllerHeader()
112
112
113 self.processingHeaderObj = ProcessingHeader()
113 self.processingHeaderObj = ProcessingHeader()
114
114
115 self.online = 0
115 self.online = 0
116
116
117 self.fp = None
117 self.fp = None
118
118
119 self.idFile = None
119 self.idFile = None
120
120
121 self.dtype = None
121 self.dtype = None
122
122
123 self.fileSizeByHeader = None
123 self.fileSizeByHeader = None
124
124
125 self.filenameList = []
125 self.filenameList = []
126
126
127 self.filename = None
127 self.filename = None
128
128
129 self.fileSize = None
129 self.fileSize = None
130
130
131 self.firstHeaderSize = 0
131 self.firstHeaderSize = 0
132
132
133 self.basicHeaderSize = 24
133 self.basicHeaderSize = 24
134
134
135 self.pathList = []
135 self.pathList = []
136
136
137 self.lastUTTime = 0
137 self.lastUTTime = 0
138
138
139 self.maxTimeStep = 30
139 self.maxTimeStep = 30
140
140
141 self.flagNoMoreFiles = 0
141 self.flagNoMoreFiles = 0
142
142
143 self.set = 0
143 self.set = 0
144
144
145 self.path = None
145 self.path = None
146
146
147 self.delay = 60 #seconds
147 self.delay = 60 #seconds
148
148
149 self.nTries = 3 #quantity tries
149 self.nTries = 3 #quantity tries
150
150
151 self.nFiles = 3 #number of files for searching
151 self.nFiles = 3 #number of files for searching
152
152
153 self.nReadBlocks = 0
153 self.nReadBlocks = 0
154
154
155 self.flagIsNewFile = 1
155 self.flagIsNewFile = 1
156
156
157 self.__isFirstTimeOnline = 1
157 self.__isFirstTimeOnline = 1
158
158
159 # self.ippSeconds = 0
159 # self.ippSeconds = 0
160
160
161 self.flagTimeBlock = 0
161 self.flagTimeBlock = 0
162
162
163 self.flagIsNewBlock = 0
163 self.flagIsNewBlock = 0
164
164
165 self.nTotalBlocks = 0
165 self.nTotalBlocks = 0
166
166
167 self.blocksize = 0
167 self.blocksize = 0
168
168
169 self.dataOut = self.createObjByDefault()
169 self.dataOut = self.createObjByDefault()
170
170
171 self.profileIndex = 1 #Always
171 self.profileIndex = 1 #Always
172
172
173
173
174 def createObjByDefault(self):
174 def createObjByDefault(self):
175
175
176 dataObj = Spectra()
176 dataObj = Spectra()
177
177
178 return dataObj
178 return dataObj
179
179
180 def __hasNotDataInBuffer(self):
180 def __hasNotDataInBuffer(self):
181 return 1
181 return 1
182
182
183
183
184 def getBlockDimension(self):
184 def getBlockDimension(self):
185 """
185 """
186 Obtiene la cantidad de puntos a leer por cada bloque de datos
186 Obtiene la cantidad de puntos a leer por cada bloque de datos
187
187
188 Affected:
188 Affected:
189 self.nRdChannels
189 self.nRdChannels
190 self.nRdPairs
190 self.nRdPairs
191 self.pts2read_SelfSpectra
191 self.pts2read_SelfSpectra
192 self.pts2read_CrossSpectra
192 self.pts2read_CrossSpectra
193 self.pts2read_DCchannels
193 self.pts2read_DCchannels
194 self.blocksize
194 self.blocksize
195 self.dataOut.nChannels
195 self.dataOut.nChannels
196 self.dataOut.nPairs
196 self.dataOut.nPairs
197
197
198 Return:
198 Return:
199 None
199 None
200 """
200 """
201 self.nRdChannels = 0
201 self.nRdChannels = 0
202 self.nRdPairs = 0
202 self.nRdPairs = 0
203 self.rdPairList = []
203 self.rdPairList = []
204
204
205 for i in range(0, self.processingHeaderObj.totalSpectra*2, 2):
205 for i in range(0, self.processingHeaderObj.totalSpectra*2, 2):
206 if self.processingHeaderObj.spectraComb[i] == self.processingHeaderObj.spectraComb[i+1]:
206 if self.processingHeaderObj.spectraComb[i] == self.processingHeaderObj.spectraComb[i+1]:
207 self.nRdChannels = self.nRdChannels + 1 #par de canales iguales
207 self.nRdChannels = self.nRdChannels + 1 #par de canales iguales
208 else:
208 else:
209 self.nRdPairs = self.nRdPairs + 1 #par de canales diferentes
209 self.nRdPairs = self.nRdPairs + 1 #par de canales diferentes
210 self.rdPairList.append((self.processingHeaderObj.spectraComb[i], self.processingHeaderObj.spectraComb[i+1]))
210 self.rdPairList.append((self.processingHeaderObj.spectraComb[i], self.processingHeaderObj.spectraComb[i+1]))
211
211
212 pts2read = self.processingHeaderObj.nHeights * self.processingHeaderObj.profilesPerBlock
212 pts2read = self.processingHeaderObj.nHeights * self.processingHeaderObj.profilesPerBlock
213
213
214 self.pts2read_SelfSpectra = int(self.nRdChannels * pts2read)
214 self.pts2read_SelfSpectra = int(self.nRdChannels * pts2read)
215 self.blocksize = self.pts2read_SelfSpectra
215 self.blocksize = self.pts2read_SelfSpectra
216
216
217 if self.processingHeaderObj.flag_cspc:
217 if self.processingHeaderObj.flag_cspc:
218 self.pts2read_CrossSpectra = int(self.nRdPairs * pts2read)
218 self.pts2read_CrossSpectra = int(self.nRdPairs * pts2read)
219 self.blocksize += self.pts2read_CrossSpectra
219 self.blocksize += self.pts2read_CrossSpectra
220
220
221 if self.processingHeaderObj.flag_dc:
221 if self.processingHeaderObj.flag_dc:
222 self.pts2read_DCchannels = int(self.systemHeaderObj.nChannels * self.processingHeaderObj.nHeights)
222 self.pts2read_DCchannels = int(self.systemHeaderObj.nChannels * self.processingHeaderObj.nHeights)
223 self.blocksize += self.pts2read_DCchannels
223 self.blocksize += self.pts2read_DCchannels
224
224
225 # self.blocksize = self.pts2read_SelfSpectra + self.pts2read_CrossSpectra + self.pts2read_DCchannels
225 # self.blocksize = self.pts2read_SelfSpectra + self.pts2read_CrossSpectra + self.pts2read_DCchannels
226
226
227
227
228 def readBlock(self):
228 def readBlock(self):
229 """
229 """
230 Lee el bloque de datos desde la posicion actual del puntero del archivo
230 Lee el bloque de datos desde la posicion actual del puntero del archivo
231 (self.fp) y actualiza todos los parametros relacionados al bloque de datos
231 (self.fp) y actualiza todos los parametros relacionados al bloque de datos
232 (metadata + data). La data leida es almacenada en el buffer y el contador del buffer
232 (metadata + data). La data leida es almacenada en el buffer y el contador del buffer
233 es seteado a 0
233 es seteado a 0
234
234
235 Return: None
235 Return: None
236
236
237 Variables afectadas:
237 Variables afectadas:
238
238
239 self.flagIsNewFile
239 self.flagIsNewFile
240 self.flagIsNewBlock
240 self.flagIsNewBlock
241 self.nTotalBlocks
241 self.nTotalBlocks
242 self.data_spc
242 self.data_spc
243 self.data_cspc
243 self.data_cspc
244 self.data_dc
244 self.data_dc
245
245
246 Exceptions:
246 Exceptions:
247 Si un bloque leido no es un bloque valido
247 Si un bloque leido no es un bloque valido
248 """
248 """
249 blockOk_flag = False
249 blockOk_flag = False
250 fpointer = self.fp.tell()
250 fpointer = self.fp.tell()
251
251
252 spc = numpy.fromfile( self.fp, self.dtype[0], self.pts2read_SelfSpectra )
252 spc = numpy.fromfile( self.fp, self.dtype[0], self.pts2read_SelfSpectra )
253 spc = spc.reshape( (self.nRdChannels, self.processingHeaderObj.nHeights, self.processingHeaderObj.profilesPerBlock) ) #transforma a un arreglo 3D
253 spc = spc.reshape( (self.nRdChannels, self.processingHeaderObj.nHeights, self.processingHeaderObj.profilesPerBlock) ) #transforma a un arreglo 3D
254
254
255 if self.processingHeaderObj.flag_cspc:
255 if self.processingHeaderObj.flag_cspc:
256 cspc = numpy.fromfile( self.fp, self.dtype, self.pts2read_CrossSpectra )
256 cspc = numpy.fromfile( self.fp, self.dtype, self.pts2read_CrossSpectra )
257 cspc = cspc.reshape( (self.nRdPairs, self.processingHeaderObj.nHeights, self.processingHeaderObj.profilesPerBlock) ) #transforma a un arreglo 3D
257 cspc = cspc.reshape( (self.nRdPairs, self.processingHeaderObj.nHeights, self.processingHeaderObj.profilesPerBlock) ) #transforma a un arreglo 3D
258
258
259 if self.processingHeaderObj.flag_dc:
259 if self.processingHeaderObj.flag_dc:
260 dc = numpy.fromfile( self.fp, self.dtype, self.pts2read_DCchannels ) #int(self.processingHeaderObj.nHeights*self.systemHeaderObj.nChannels) )
260 dc = numpy.fromfile( self.fp, self.dtype, self.pts2read_DCchannels ) #int(self.processingHeaderObj.nHeights*self.systemHeaderObj.nChannels) )
261 dc = dc.reshape( (self.systemHeaderObj.nChannels, self.processingHeaderObj.nHeights) ) #transforma a un arreglo 2D
261 dc = dc.reshape( (self.systemHeaderObj.nChannels, self.processingHeaderObj.nHeights) ) #transforma a un arreglo 2D
262
262
263
263
264 if not(self.processingHeaderObj.shif_fft):
264 if not(self.processingHeaderObj.shif_fft):
265 #desplaza a la derecha en el eje 2 determinadas posiciones
265 #desplaza a la derecha en el eje 2 determinadas posiciones
266 shift = int(self.processingHeaderObj.profilesPerBlock/2)
266 shift = int(self.processingHeaderObj.profilesPerBlock/2)
267 spc = numpy.roll( spc, shift , axis=2 )
267 spc = numpy.roll( spc, shift , axis=2 )
268
268
269 if self.processingHeaderObj.flag_cspc:
269 if self.processingHeaderObj.flag_cspc:
270 #desplaza a la derecha en el eje 2 determinadas posiciones
270 #desplaza a la derecha en el eje 2 determinadas posiciones
271 cspc = numpy.roll( cspc, shift, axis=2 )
271 cspc = numpy.roll( cspc, shift, axis=2 )
272
272
273 # self.processingHeaderObj.shif_fft = True
273 # self.processingHeaderObj.shif_fft = True
274
274
275 spc = numpy.transpose( spc, (0,2,1) )
275 spc = numpy.transpose( spc, (0,2,1) )
276 self.data_spc = spc
276 self.data_spc = spc
277
277
278 if self.processingHeaderObj.flag_cspc:
278 if self.processingHeaderObj.flag_cspc:
279 cspc = numpy.transpose( cspc, (0,2,1) )
279 cspc = numpy.transpose( cspc, (0,2,1) )
280 self.data_cspc = cspc['real'] + cspc['imag']*1j
280 self.data_cspc = cspc['real'] + cspc['imag']*1j
281 else:
281 else:
282 self.data_cspc = None
282 self.data_cspc = None
283
283
284 if self.processingHeaderObj.flag_dc:
284 if self.processingHeaderObj.flag_dc:
285 self.data_dc = dc['real'] + dc['imag']*1j
285 self.data_dc = dc['real'] + dc['imag']*1j
286 else:
286 else:
287 self.data_dc = None
287 self.data_dc = None
288
288
289 self.flagIsNewFile = 0
289 self.flagIsNewFile = 0
290 self.flagIsNewBlock = 1
290 self.flagIsNewBlock = 1
291
291
292 self.nTotalBlocks += 1
292 self.nTotalBlocks += 1
293 self.nReadBlocks += 1
293 self.nReadBlocks += 1
294
294
295 return 1
295 return 1
296
296
297 def getFirstHeader(self):
297 def getFirstHeader(self):
298
298
299 self.dataOut.systemHeaderObj = self.systemHeaderObj.copy()
299 self.dataOut.systemHeaderObj = self.systemHeaderObj.copy()
300
300
301 self.dataOut.radarControllerHeaderObj = self.radarControllerHeaderObj.copy()
301 self.dataOut.radarControllerHeaderObj = self.radarControllerHeaderObj.copy()
302
302
303 # self.dataOut.ippSeconds = self.ippSeconds
303 # self.dataOut.ippSeconds = self.ippSeconds
304
304
305 self.dataOut.timeInterval = self.radarControllerHeaderObj.ippSeconds * self.processingHeaderObj.nCohInt * self.processingHeaderObj.nIncohInt * self.processingHeaderObj.profilesPerBlock
305 # self.dataOut.timeInterval = self.radarControllerHeaderObj.ippSeconds * self.processingHeaderObj.nCohInt * self.processingHeaderObj.nIncohInt * self.processingHeaderObj.profilesPerBlock
306
306
307 self.dataOut.dtype = self.dtype
307 self.dataOut.dtype = self.dtype
308
308
309 # self.dataOut.nPairs = self.nPairs
309 # self.dataOut.nPairs = self.nPairs
310
310
311 self.dataOut.pairsList = self.rdPairList
311 self.dataOut.pairsList = self.rdPairList
312
312
313 self.dataOut.nProfiles = self.processingHeaderObj.profilesPerBlock
313 self.dataOut.nProfiles = self.processingHeaderObj.profilesPerBlock
314
314
315 self.dataOut.nFFTPoints = self.processingHeaderObj.profilesPerBlock
315 self.dataOut.nFFTPoints = self.processingHeaderObj.profilesPerBlock
316
316
317 self.dataOut.nCohInt = self.processingHeaderObj.nCohInt
317 self.dataOut.nCohInt = self.processingHeaderObj.nCohInt
318
318
319 self.dataOut.nIncohInt = self.processingHeaderObj.nIncohInt
319 self.dataOut.nIncohInt = self.processingHeaderObj.nIncohInt
320
320
321 xf = self.processingHeaderObj.firstHeight + self.processingHeaderObj.nHeights*self.processingHeaderObj.deltaHeight
321 xf = self.processingHeaderObj.firstHeight + self.processingHeaderObj.nHeights*self.processingHeaderObj.deltaHeight
322
322
323 self.dataOut.heightList = numpy.arange(self.processingHeaderObj.firstHeight, xf, self.processingHeaderObj.deltaHeight)
323 self.dataOut.heightList = numpy.arange(self.processingHeaderObj.firstHeight, xf, self.processingHeaderObj.deltaHeight)
324
324
325 self.dataOut.channelList = range(self.systemHeaderObj.nChannels)
325 self.dataOut.channelList = range(self.systemHeaderObj.nChannels)
326
326
327 self.dataOut.flagShiftFFT = self.processingHeaderObj.shif_fft
327 self.dataOut.flagShiftFFT = self.processingHeaderObj.shif_fft
328
328
329 self.dataOut.flagDecodeData = False #asumo q la data no esta decodificada
329 self.dataOut.flagDecodeData = False #asumo q la data no esta decodificada
330
330
331 self.dataOut.flagDeflipData = True #asumo q la data no esta sin flip
331 self.dataOut.flagDeflipData = True #asumo q la data no esta sin flip
332
332
333 if self.radarControllerHeaderObj.code != None:
333 if self.radarControllerHeaderObj.code != None:
334
334
335 self.dataOut.nCode = self.radarControllerHeaderObj.nCode
335 self.dataOut.nCode = self.radarControllerHeaderObj.nCode
336
336
337 self.dataOut.nBaud = self.radarControllerHeaderObj.nBaud
337 self.dataOut.nBaud = self.radarControllerHeaderObj.nBaud
338
338
339 self.dataOut.code = self.radarControllerHeaderObj.code
339 self.dataOut.code = self.radarControllerHeaderObj.code
340
340
341 self.dataOut.flagDecodeData = True
341 self.dataOut.flagDecodeData = True
342
342
343 def getData(self):
343 def getData(self):
344 """
344 """
345 First method to execute before "RUN" is called.
345 First method to execute before "RUN" is called.
346
346
347 Copia el buffer de lectura a la clase "Spectra",
347 Copia el buffer de lectura a la clase "Spectra",
348 con todos los parametros asociados a este (metadata). cuando no hay datos en el buffer de
348 con todos los parametros asociados a este (metadata). cuando no hay datos en el buffer de
349 lectura es necesario hacer una nueva lectura de los bloques de datos usando "readNextBlock"
349 lectura es necesario hacer una nueva lectura de los bloques de datos usando "readNextBlock"
350
350
351 Return:
351 Return:
352 0 : Si no hay mas archivos disponibles
352 0 : Si no hay mas archivos disponibles
353 1 : Si hizo una buena copia del buffer
353 1 : Si hizo una buena copia del buffer
354
354
355 Affected:
355 Affected:
356 self.dataOut
356 self.dataOut
357
357
358 self.flagTimeBlock
358 self.flagTimeBlock
359 self.flagIsNewBlock
359 self.flagIsNewBlock
360 """
360 """
361
361
362 if self.flagNoMoreFiles:
362 if self.flagNoMoreFiles:
363 self.dataOut.flagNoData = True
363 self.dataOut.flagNoData = True
364 print 'Process finished'
364 print 'Process finished'
365 return 0
365 return 0
366
366
367 self.flagTimeBlock = 0
367 self.flagTimeBlock = 0
368 self.flagIsNewBlock = 0
368 self.flagIsNewBlock = 0
369
369
370 if self.__hasNotDataInBuffer():
370 if self.__hasNotDataInBuffer():
371
371
372 if not( self.readNextBlock() ):
372 if not( self.readNextBlock() ):
373 self.dataOut.flagNoData = True
373 self.dataOut.flagNoData = True
374 return 0
374 return 0
375
375
376 #data es un numpy array de 3 dmensiones (perfiles, alturas y canales)
376 #data es un numpy array de 3 dmensiones (perfiles, alturas y canales)
377
377
378 if self.data_dc == None:
378 if self.data_dc == None:
379 self.dataOut.flagNoData = True
379 self.dataOut.flagNoData = True
380 return 0
380 return 0
381
381
382 self.getBasicHeader()
382 self.getBasicHeader()
383
383
384 self.getFirstHeader()
384 self.getFirstHeader()
385
385
386 self.dataOut.data_spc = self.data_spc
386 self.dataOut.data_spc = self.data_spc
387
387
388 self.dataOut.data_cspc = self.data_cspc
388 self.dataOut.data_cspc = self.data_cspc
389
389
390 self.dataOut.data_dc = self.data_dc
390 self.dataOut.data_dc = self.data_dc
391
391
392 self.dataOut.flagNoData = False
392 self.dataOut.flagNoData = False
393
393
394 self.dataOut.realtime = self.online
394 self.dataOut.realtime = self.online
395
395
396 return self.dataOut.data_spc
396 return self.dataOut.data_spc
397
397
398 class SpectraWriter(JRODataWriter, Operation):
398 class SpectraWriter(JRODataWriter, Operation):
399
399
400 """
400 """
401 Esta clase permite escribir datos de espectros a archivos procesados (.pdata). La escritura
401 Esta clase permite escribir datos de espectros a archivos procesados (.pdata). La escritura
402 de los datos siempre se realiza por bloques.
402 de los datos siempre se realiza por bloques.
403 """
403 """
404
404
405 ext = ".pdata"
405 ext = ".pdata"
406
406
407 optchar = "P"
407 optchar = "P"
408
408
409 shape_spc_Buffer = None
409 shape_spc_Buffer = None
410
410
411 shape_cspc_Buffer = None
411 shape_cspc_Buffer = None
412
412
413 shape_dc_Buffer = None
413 shape_dc_Buffer = None
414
414
415 data_spc = None
415 data_spc = None
416
416
417 data_cspc = None
417 data_cspc = None
418
418
419 data_dc = None
419 data_dc = None
420
420
421 # dataOut = None
421 # dataOut = None
422
422
423 def __init__(self):
423 def __init__(self):
424 """
424 """
425 Inicializador de la clase SpectraWriter para la escritura de datos de espectros.
425 Inicializador de la clase SpectraWriter para la escritura de datos de espectros.
426
426
427 Affected:
427 Affected:
428 self.dataOut
428 self.dataOut
429 self.basicHeaderObj
429 self.basicHeaderObj
430 self.systemHeaderObj
430 self.systemHeaderObj
431 self.radarControllerHeaderObj
431 self.radarControllerHeaderObj
432 self.processingHeaderObj
432 self.processingHeaderObj
433
433
434 Return: None
434 Return: None
435 """
435 """
436
436
437 Operation.__init__(self)
437 Operation.__init__(self)
438
438
439 self.isConfig = False
439 self.isConfig = False
440
440
441 self.nTotalBlocks = 0
441 self.nTotalBlocks = 0
442
442
443 self.data_spc = None
443 self.data_spc = None
444
444
445 self.data_cspc = None
445 self.data_cspc = None
446
446
447 self.data_dc = None
447 self.data_dc = None
448
448
449 self.fp = None
449 self.fp = None
450
450
451 self.flagIsNewFile = 1
451 self.flagIsNewFile = 1
452
452
453 self.nTotalBlocks = 0
453 self.nTotalBlocks = 0
454
454
455 self.flagIsNewBlock = 0
455 self.flagIsNewBlock = 0
456
456
457 self.setFile = None
457 self.setFile = None
458
458
459 self.dtype = None
459 self.dtype = None
460
460
461 self.path = None
461 self.path = None
462
462
463 self.noMoreFiles = 0
463 self.noMoreFiles = 0
464
464
465 self.filename = None
465 self.filename = None
466
466
467 self.basicHeaderObj = BasicHeader(LOCALTIME)
467 self.basicHeaderObj = BasicHeader(LOCALTIME)
468
468
469 self.systemHeaderObj = SystemHeader()
469 self.systemHeaderObj = SystemHeader()
470
470
471 self.radarControllerHeaderObj = RadarControllerHeader()
471 self.radarControllerHeaderObj = RadarControllerHeader()
472
472
473 self.processingHeaderObj = ProcessingHeader()
473 self.processingHeaderObj = ProcessingHeader()
474
474
475
475
476 def hasAllDataInBuffer(self):
476 def hasAllDataInBuffer(self):
477 return 1
477 return 1
478
478
479
479
480 def setBlockDimension(self):
480 def setBlockDimension(self):
481 """
481 """
482 Obtiene las formas dimensionales del los subbloques de datos que componen un bloque
482 Obtiene las formas dimensionales del los subbloques de datos que componen un bloque
483
483
484 Affected:
484 Affected:
485 self.shape_spc_Buffer
485 self.shape_spc_Buffer
486 self.shape_cspc_Buffer
486 self.shape_cspc_Buffer
487 self.shape_dc_Buffer
487 self.shape_dc_Buffer
488
488
489 Return: None
489 Return: None
490 """
490 """
491 self.shape_spc_Buffer = (self.dataOut.nChannels,
491 self.shape_spc_Buffer = (self.dataOut.nChannels,
492 self.processingHeaderObj.nHeights,
492 self.processingHeaderObj.nHeights,
493 self.processingHeaderObj.profilesPerBlock)
493 self.processingHeaderObj.profilesPerBlock)
494
494
495 self.shape_cspc_Buffer = (self.dataOut.nPairs,
495 self.shape_cspc_Buffer = (self.dataOut.nPairs,
496 self.processingHeaderObj.nHeights,
496 self.processingHeaderObj.nHeights,
497 self.processingHeaderObj.profilesPerBlock)
497 self.processingHeaderObj.profilesPerBlock)
498
498
499 self.shape_dc_Buffer = (self.dataOut.nChannels,
499 self.shape_dc_Buffer = (self.dataOut.nChannels,
500 self.processingHeaderObj.nHeights)
500 self.processingHeaderObj.nHeights)
501
501
502
502
503 def writeBlock(self):
503 def writeBlock(self):
504 """
504 """
505 Escribe el buffer en el file designado
505 Escribe el buffer en el file designado
506
506
507 Affected:
507 Affected:
508 self.data_spc
508 self.data_spc
509 self.data_cspc
509 self.data_cspc
510 self.data_dc
510 self.data_dc
511 self.flagIsNewFile
511 self.flagIsNewFile
512 self.flagIsNewBlock
512 self.flagIsNewBlock
513 self.nTotalBlocks
513 self.nTotalBlocks
514 self.nWriteBlocks
514 self.nWriteBlocks
515
515
516 Return: None
516 Return: None
517 """
517 """
518
518
519 spc = numpy.transpose( self.data_spc, (0,2,1) )
519 spc = numpy.transpose( self.data_spc, (0,2,1) )
520 if not( self.processingHeaderObj.shif_fft ):
520 if not( self.processingHeaderObj.shif_fft ):
521 spc = numpy.roll( spc, self.processingHeaderObj.profilesPerBlock/2, axis=2 ) #desplaza a la derecha en el eje 2 determinadas posiciones
521 spc = numpy.roll( spc, self.processingHeaderObj.profilesPerBlock/2, axis=2 ) #desplaza a la derecha en el eje 2 determinadas posiciones
522 data = spc.reshape((-1))
522 data = spc.reshape((-1))
523 data = data.astype(self.dtype[0])
523 data = data.astype(self.dtype[0])
524 data.tofile(self.fp)
524 data.tofile(self.fp)
525
525
526 if self.data_cspc != None:
526 if self.data_cspc != None:
527 data = numpy.zeros( self.shape_cspc_Buffer, self.dtype )
527 data = numpy.zeros( self.shape_cspc_Buffer, self.dtype )
528 cspc = numpy.transpose( self.data_cspc, (0,2,1) )
528 cspc = numpy.transpose( self.data_cspc, (0,2,1) )
529 if not( self.processingHeaderObj.shif_fft ):
529 if not( self.processingHeaderObj.shif_fft ):
530 cspc = numpy.roll( cspc, self.processingHeaderObj.profilesPerBlock/2, axis=2 ) #desplaza a la derecha en el eje 2 determinadas posiciones
530 cspc = numpy.roll( cspc, self.processingHeaderObj.profilesPerBlock/2, axis=2 ) #desplaza a la derecha en el eje 2 determinadas posiciones
531 data['real'] = cspc.real
531 data['real'] = cspc.real
532 data['imag'] = cspc.imag
532 data['imag'] = cspc.imag
533 data = data.reshape((-1))
533 data = data.reshape((-1))
534 data.tofile(self.fp)
534 data.tofile(self.fp)
535
535
536 if self.data_dc != None:
536 if self.data_dc != None:
537 data = numpy.zeros( self.shape_dc_Buffer, self.dtype )
537 data = numpy.zeros( self.shape_dc_Buffer, self.dtype )
538 dc = self.data_dc
538 dc = self.data_dc
539 data['real'] = dc.real
539 data['real'] = dc.real
540 data['imag'] = dc.imag
540 data['imag'] = dc.imag
541 data = data.reshape((-1))
541 data = data.reshape((-1))
542 data.tofile(self.fp)
542 data.tofile(self.fp)
543
543
544 self.data_spc.fill(0)
544 self.data_spc.fill(0)
545
545
546 if self.data_dc != None:
546 if self.data_dc != None:
547 self.data_dc.fill(0)
547 self.data_dc.fill(0)
548
548
549 if self.data_cspc != None:
549 if self.data_cspc != None:
550 self.data_cspc.fill(0)
550 self.data_cspc.fill(0)
551
551
552 self.flagIsNewFile = 0
552 self.flagIsNewFile = 0
553 self.flagIsNewBlock = 1
553 self.flagIsNewBlock = 1
554 self.nTotalBlocks += 1
554 self.nTotalBlocks += 1
555 self.nWriteBlocks += 1
555 self.nWriteBlocks += 1
556 self.blockIndex += 1
556 self.blockIndex += 1
557
557
558
558
559 def putData(self):
559 def putData(self):
560 """
560 """
561 Setea un bloque de datos y luego los escribe en un file
561 Setea un bloque de datos y luego los escribe en un file
562
562
563 Affected:
563 Affected:
564 self.data_spc
564 self.data_spc
565 self.data_cspc
565 self.data_cspc
566 self.data_dc
566 self.data_dc
567
567
568 Return:
568 Return:
569 0 : Si no hay data o no hay mas files que puedan escribirse
569 0 : Si no hay data o no hay mas files que puedan escribirse
570 1 : Si se escribio la data de un bloque en un file
570 1 : Si se escribio la data de un bloque en un file
571 """
571 """
572
572
573 if self.dataOut.flagNoData:
573 if self.dataOut.flagNoData:
574 return 0
574 return 0
575
575
576 self.flagIsNewBlock = 0
576 self.flagIsNewBlock = 0
577
577
578 if self.dataOut.flagTimeBlock:
578 if self.dataOut.flagTimeBlock:
579 self.data_spc.fill(0)
579 self.data_spc.fill(0)
580 self.data_cspc.fill(0)
580 self.data_cspc.fill(0)
581 self.data_dc.fill(0)
581 self.data_dc.fill(0)
582 self.setNextFile()
582 self.setNextFile()
583
583
584 if self.flagIsNewFile == 0:
584 if self.flagIsNewFile == 0:
585 self.setBasicHeader()
585 self.setBasicHeader()
586
586
587 self.data_spc = self.dataOut.data_spc.copy()
587 self.data_spc = self.dataOut.data_spc.copy()
588 if self.dataOut.data_cspc != None:
588 if self.dataOut.data_cspc != None:
589 self.data_cspc = self.dataOut.data_cspc.copy()
589 self.data_cspc = self.dataOut.data_cspc.copy()
590 self.data_dc = self.dataOut.data_dc.copy()
590 self.data_dc = self.dataOut.data_dc.copy()
591
591
592 # #self.processingHeaderObj.dataBlocksPerFile)
592 # #self.processingHeaderObj.dataBlocksPerFile)
593 if self.hasAllDataInBuffer():
593 if self.hasAllDataInBuffer():
594 # self.setFirstHeader()
594 # self.setFirstHeader()
595 self.writeNextBlock()
595 self.writeNextBlock()
596
596
597 return 1
597 return 1
598
598
599
599
600 def __getProcessFlags(self):
600 def __getProcessFlags(self):
601
601
602 processFlags = 0
602 processFlags = 0
603
603
604 dtype0 = numpy.dtype([('real','<i1'),('imag','<i1')])
604 dtype0 = numpy.dtype([('real','<i1'),('imag','<i1')])
605 dtype1 = numpy.dtype([('real','<i2'),('imag','<i2')])
605 dtype1 = numpy.dtype([('real','<i2'),('imag','<i2')])
606 dtype2 = numpy.dtype([('real','<i4'),('imag','<i4')])
606 dtype2 = numpy.dtype([('real','<i4'),('imag','<i4')])
607 dtype3 = numpy.dtype([('real','<i8'),('imag','<i8')])
607 dtype3 = numpy.dtype([('real','<i8'),('imag','<i8')])
608 dtype4 = numpy.dtype([('real','<f4'),('imag','<f4')])
608 dtype4 = numpy.dtype([('real','<f4'),('imag','<f4')])
609 dtype5 = numpy.dtype([('real','<f8'),('imag','<f8')])
609 dtype5 = numpy.dtype([('real','<f8'),('imag','<f8')])
610
610
611 dtypeList = [dtype0, dtype1, dtype2, dtype3, dtype4, dtype5]
611 dtypeList = [dtype0, dtype1, dtype2, dtype3, dtype4, dtype5]
612
612
613
613
614
614
615 datatypeValueList = [PROCFLAG.DATATYPE_CHAR,
615 datatypeValueList = [PROCFLAG.DATATYPE_CHAR,
616 PROCFLAG.DATATYPE_SHORT,
616 PROCFLAG.DATATYPE_SHORT,
617 PROCFLAG.DATATYPE_LONG,
617 PROCFLAG.DATATYPE_LONG,
618 PROCFLAG.DATATYPE_INT64,
618 PROCFLAG.DATATYPE_INT64,
619 PROCFLAG.DATATYPE_FLOAT,
619 PROCFLAG.DATATYPE_FLOAT,
620 PROCFLAG.DATATYPE_DOUBLE]
620 PROCFLAG.DATATYPE_DOUBLE]
621
621
622
622
623 for index in range(len(dtypeList)):
623 for index in range(len(dtypeList)):
624 if self.dataOut.dtype == dtypeList[index]:
624 if self.dataOut.dtype == dtypeList[index]:
625 dtypeValue = datatypeValueList[index]
625 dtypeValue = datatypeValueList[index]
626 break
626 break
627
627
628 processFlags += dtypeValue
628 processFlags += dtypeValue
629
629
630 if self.dataOut.flagDecodeData:
630 if self.dataOut.flagDecodeData:
631 processFlags += PROCFLAG.DECODE_DATA
631 processFlags += PROCFLAG.DECODE_DATA
632
632
633 if self.dataOut.flagDeflipData:
633 if self.dataOut.flagDeflipData:
634 processFlags += PROCFLAG.DEFLIP_DATA
634 processFlags += PROCFLAG.DEFLIP_DATA
635
635
636 if self.dataOut.code != None:
636 if self.dataOut.code != None:
637 processFlags += PROCFLAG.DEFINE_PROCESS_CODE
637 processFlags += PROCFLAG.DEFINE_PROCESS_CODE
638
638
639 if self.dataOut.nIncohInt > 1:
639 if self.dataOut.nIncohInt > 1:
640 processFlags += PROCFLAG.INCOHERENT_INTEGRATION
640 processFlags += PROCFLAG.INCOHERENT_INTEGRATION
641
641
642 if self.dataOut.data_dc != None:
642 if self.dataOut.data_dc != None:
643 processFlags += PROCFLAG.SAVE_CHANNELS_DC
643 processFlags += PROCFLAG.SAVE_CHANNELS_DC
644
644
645 return processFlags
645 return processFlags
646
646
647
647
648 def __getBlockSize(self):
648 def __getBlockSize(self):
649 '''
649 '''
650 Este metodos determina el cantidad de bytes para un bloque de datos de tipo Spectra
650 Este metodos determina el cantidad de bytes para un bloque de datos de tipo Spectra
651 '''
651 '''
652
652
653 dtype0 = numpy.dtype([('real','<i1'),('imag','<i1')])
653 dtype0 = numpy.dtype([('real','<i1'),('imag','<i1')])
654 dtype1 = numpy.dtype([('real','<i2'),('imag','<i2')])
654 dtype1 = numpy.dtype([('real','<i2'),('imag','<i2')])
655 dtype2 = numpy.dtype([('real','<i4'),('imag','<i4')])
655 dtype2 = numpy.dtype([('real','<i4'),('imag','<i4')])
656 dtype3 = numpy.dtype([('real','<i8'),('imag','<i8')])
656 dtype3 = numpy.dtype([('real','<i8'),('imag','<i8')])
657 dtype4 = numpy.dtype([('real','<f4'),('imag','<f4')])
657 dtype4 = numpy.dtype([('real','<f4'),('imag','<f4')])
658 dtype5 = numpy.dtype([('real','<f8'),('imag','<f8')])
658 dtype5 = numpy.dtype([('real','<f8'),('imag','<f8')])
659
659
660 dtypeList = [dtype0, dtype1, dtype2, dtype3, dtype4, dtype5]
660 dtypeList = [dtype0, dtype1, dtype2, dtype3, dtype4, dtype5]
661 datatypeValueList = [1,2,4,8,4,8]
661 datatypeValueList = [1,2,4,8,4,8]
662 for index in range(len(dtypeList)):
662 for index in range(len(dtypeList)):
663 if self.dataOut.dtype == dtypeList[index]:
663 if self.dataOut.dtype == dtypeList[index]:
664 datatypeValue = datatypeValueList[index]
664 datatypeValue = datatypeValueList[index]
665 break
665 break
666
666
667
667
668 pts2write = self.dataOut.nHeights * self.dataOut.nFFTPoints
668 pts2write = self.dataOut.nHeights * self.dataOut.nFFTPoints
669
669
670 pts2write_SelfSpectra = int(self.dataOut.nChannels * pts2write)
670 pts2write_SelfSpectra = int(self.dataOut.nChannels * pts2write)
671 blocksize = (pts2write_SelfSpectra*datatypeValue)
671 blocksize = (pts2write_SelfSpectra*datatypeValue)
672
672
673 if self.dataOut.data_cspc != None:
673 if self.dataOut.data_cspc != None:
674 pts2write_CrossSpectra = int(self.dataOut.nPairs * pts2write)
674 pts2write_CrossSpectra = int(self.dataOut.nPairs * pts2write)
675 blocksize += (pts2write_CrossSpectra*datatypeValue*2)
675 blocksize += (pts2write_CrossSpectra*datatypeValue*2)
676
676
677 if self.dataOut.data_dc != None:
677 if self.dataOut.data_dc != None:
678 pts2write_DCchannels = int(self.dataOut.nChannels * self.dataOut.nHeights)
678 pts2write_DCchannels = int(self.dataOut.nChannels * self.dataOut.nHeights)
679 blocksize += (pts2write_DCchannels*datatypeValue*2)
679 blocksize += (pts2write_DCchannels*datatypeValue*2)
680
680
681 blocksize = blocksize #* datatypeValue * 2 #CORREGIR ESTO
681 blocksize = blocksize #* datatypeValue * 2 #CORREGIR ESTO
682
682
683 return blocksize
683 return blocksize
684
684
685 def setFirstHeader(self):
685 def setFirstHeader(self):
686
686
687 """
687 """
688 Obtiene una copia del First Header
688 Obtiene una copia del First Header
689
689
690 Affected:
690 Affected:
691 self.systemHeaderObj
691 self.systemHeaderObj
692 self.radarControllerHeaderObj
692 self.radarControllerHeaderObj
693 self.dtype
693 self.dtype
694
694
695 Return:
695 Return:
696 None
696 None
697 """
697 """
698
698
699 self.systemHeaderObj = self.dataOut.systemHeaderObj.copy()
699 self.systemHeaderObj = self.dataOut.systemHeaderObj.copy()
700 self.systemHeaderObj.nChannels = self.dataOut.nChannels
700 self.systemHeaderObj.nChannels = self.dataOut.nChannels
701 self.radarControllerHeaderObj = self.dataOut.radarControllerHeaderObj.copy()
701 self.radarControllerHeaderObj = self.dataOut.radarControllerHeaderObj.copy()
702 old_code_size = self.dataOut.radarControllerHeaderObj.code_size
702 old_code_size = self.dataOut.radarControllerHeaderObj.code_size
703 new_code_size = int(numpy.ceil(self.dataOut.nBaud/32.))*self.dataOut.nCode*4
703 new_code_size = int(numpy.ceil(self.dataOut.nBaud/32.))*self.dataOut.nCode*4
704 self.radarControllerHeaderObj.size = self.radarControllerHeaderObj.size - old_code_size + new_code_size
704 self.radarControllerHeaderObj.size = self.radarControllerHeaderObj.size - old_code_size + new_code_size
705
705
706 self.setBasicHeader()
706 self.setBasicHeader()
707
707
708 processingHeaderSize = 40 # bytes
708 processingHeaderSize = 40 # bytes
709 self.processingHeaderObj.dtype = 1 # Spectra
709 self.processingHeaderObj.dtype = 1 # Spectra
710 self.processingHeaderObj.blockSize = self.__getBlockSize()
710 self.processingHeaderObj.blockSize = self.__getBlockSize()
711 self.processingHeaderObj.profilesPerBlock = self.dataOut.nFFTPoints
711 self.processingHeaderObj.profilesPerBlock = self.dataOut.nFFTPoints
712 self.processingHeaderObj.dataBlocksPerFile = self.blocksPerFile
712 self.processingHeaderObj.dataBlocksPerFile = self.blocksPerFile
713 self.processingHeaderObj.nWindows = 1 #podria ser 1 o self.dataOut.processingHeaderObj.nWindows
713 self.processingHeaderObj.nWindows = 1 #podria ser 1 o self.dataOut.processingHeaderObj.nWindows
714 self.processingHeaderObj.processFlags = self.__getProcessFlags()
714 self.processingHeaderObj.processFlags = self.__getProcessFlags()
715 self.processingHeaderObj.nCohInt = self.dataOut.nCohInt# Se requiere para determinar el valor de timeInterval
715 self.processingHeaderObj.nCohInt = self.dataOut.nCohInt# Se requiere para determinar el valor de timeInterval
716 self.processingHeaderObj.nIncohInt = self.dataOut.nIncohInt
716 self.processingHeaderObj.nIncohInt = self.dataOut.nIncohInt
717 self.processingHeaderObj.totalSpectra = self.dataOut.nPairs + self.dataOut.nChannels
717 self.processingHeaderObj.totalSpectra = self.dataOut.nPairs + self.dataOut.nChannels
718 self.processingHeaderObj.shif_fft = self.dataOut.flagShiftFFT
718 self.processingHeaderObj.shif_fft = self.dataOut.flagShiftFFT
719
719
720 if self.processingHeaderObj.totalSpectra > 0:
720 if self.processingHeaderObj.totalSpectra > 0:
721 channelList = []
721 channelList = []
722 for channel in range(self.dataOut.nChannels):
722 for channel in range(self.dataOut.nChannels):
723 channelList.append(channel)
723 channelList.append(channel)
724 channelList.append(channel)
724 channelList.append(channel)
725
725
726 pairsList = []
726 pairsList = []
727 if self.dataOut.nPairs > 0:
727 if self.dataOut.nPairs > 0:
728 for pair in self.dataOut.pairsList:
728 for pair in self.dataOut.pairsList:
729 pairsList.append(pair[0])
729 pairsList.append(pair[0])
730 pairsList.append(pair[1])
730 pairsList.append(pair[1])
731
731
732 spectraComb = channelList + pairsList
732 spectraComb = channelList + pairsList
733 spectraComb = numpy.array(spectraComb,dtype="u1")
733 spectraComb = numpy.array(spectraComb,dtype="u1")
734 self.processingHeaderObj.spectraComb = spectraComb
734 self.processingHeaderObj.spectraComb = spectraComb
735 sizeOfSpcComb = len(spectraComb)
735 sizeOfSpcComb = len(spectraComb)
736 processingHeaderSize += sizeOfSpcComb
736 processingHeaderSize += sizeOfSpcComb
737
737
738 # The processing header should not have information about code
738 # The processing header should not have information about code
739 # if self.dataOut.code != None:
739 # if self.dataOut.code != None:
740 # self.processingHeaderObj.code = self.dataOut.code
740 # self.processingHeaderObj.code = self.dataOut.code
741 # self.processingHeaderObj.nCode = self.dataOut.nCode
741 # self.processingHeaderObj.nCode = self.dataOut.nCode
742 # self.processingHeaderObj.nBaud = self.dataOut.nBaud
742 # self.processingHeaderObj.nBaud = self.dataOut.nBaud
743 # nCodeSize = 4 # bytes
743 # nCodeSize = 4 # bytes
744 # nBaudSize = 4 # bytes
744 # nBaudSize = 4 # bytes
745 # codeSize = 4 # bytes
745 # codeSize = 4 # bytes
746 # sizeOfCode = int(nCodeSize + nBaudSize + codeSize * self.dataOut.nCode * self.dataOut.nBaud)
746 # sizeOfCode = int(nCodeSize + nBaudSize + codeSize * self.dataOut.nCode * self.dataOut.nBaud)
747 # processingHeaderSize += sizeOfCode
747 # processingHeaderSize += sizeOfCode
748
748
749 if self.processingHeaderObj.nWindows != 0:
749 if self.processingHeaderObj.nWindows != 0:
750 self.processingHeaderObj.firstHeight = self.dataOut.heightList[0]
750 self.processingHeaderObj.firstHeight = self.dataOut.heightList[0]
751 self.processingHeaderObj.deltaHeight = self.dataOut.heightList[1] - self.dataOut.heightList[0]
751 self.processingHeaderObj.deltaHeight = self.dataOut.heightList[1] - self.dataOut.heightList[0]
752 self.processingHeaderObj.nHeights = self.dataOut.nHeights
752 self.processingHeaderObj.nHeights = self.dataOut.nHeights
753 self.processingHeaderObj.samplesWin = self.dataOut.nHeights
753 self.processingHeaderObj.samplesWin = self.dataOut.nHeights
754 sizeOfFirstHeight = 4
754 sizeOfFirstHeight = 4
755 sizeOfdeltaHeight = 4
755 sizeOfdeltaHeight = 4
756 sizeOfnHeights = 4
756 sizeOfnHeights = 4
757 sizeOfWindows = (sizeOfFirstHeight + sizeOfdeltaHeight + sizeOfnHeights)*self.processingHeaderObj.nWindows
757 sizeOfWindows = (sizeOfFirstHeight + sizeOfdeltaHeight + sizeOfnHeights)*self.processingHeaderObj.nWindows
758 processingHeaderSize += sizeOfWindows
758 processingHeaderSize += sizeOfWindows
759
759
760 self.processingHeaderObj.size = processingHeaderSize
760 self.processingHeaderObj.size = processingHeaderSize
761
761
@@ -1,593 +1,609
1 '''
1 '''
2
2
3 '''
3 '''
4 import numpy
4 import numpy
5
5
6 from jroIO_base import LOCALTIME, JRODataReader, JRODataWriter
6 from jroIO_base import LOCALTIME, JRODataReader, JRODataWriter
7 from model.proc.jroproc_base import ProcessingUnit, Operation
7 from model.proc.jroproc_base import ProcessingUnit, Operation
8 from model.data.jroheaderIO import PROCFLAG, BasicHeader, SystemHeader, RadarControllerHeader, ProcessingHeader
8 from model.data.jroheaderIO import PROCFLAG, BasicHeader, SystemHeader, RadarControllerHeader, ProcessingHeader
9 from model.data.jrodata import Voltage
9 from model.data.jrodata import Voltage
10
10
11 class VoltageReader(JRODataReader, ProcessingUnit):
11 class VoltageReader(JRODataReader, ProcessingUnit):
12 """
12 """
13 Esta clase permite leer datos de voltage desde archivos en formato rawdata (.r). La lectura
13 Esta clase permite leer datos de voltage desde archivos en formato rawdata (.r). La lectura
14 de los datos siempre se realiza por bloques. Los datos leidos (array de 3 dimensiones:
14 de los datos siempre se realiza por bloques. Los datos leidos (array de 3 dimensiones:
15 perfiles*alturas*canales) son almacenados en la variable "buffer".
15 perfiles*alturas*canales) son almacenados en la variable "buffer".
16
16
17 perfiles * alturas * canales
17 perfiles * alturas * canales
18
18
19 Esta clase contiene instancias (objetos) de las clases BasicHeader, SystemHeader,
19 Esta clase contiene instancias (objetos) de las clases BasicHeader, SystemHeader,
20 RadarControllerHeader y Voltage. Los tres primeros se usan para almacenar informacion de la
20 RadarControllerHeader y Voltage. Los tres primeros se usan para almacenar informacion de la
21 cabecera de datos (metadata), y el cuarto (Voltage) para obtener y almacenar un perfil de
21 cabecera de datos (metadata), y el cuarto (Voltage) para obtener y almacenar un perfil de
22 datos desde el "buffer" cada vez que se ejecute el metodo "getData".
22 datos desde el "buffer" cada vez que se ejecute el metodo "getData".
23
23
24 Example:
24 Example:
25
25
26 dpath = "/home/myuser/data"
26 dpath = "/home/myuser/data"
27
27
28 startTime = datetime.datetime(2010,1,20,0,0,0,0,0,0)
28 startTime = datetime.datetime(2010,1,20,0,0,0,0,0,0)
29
29
30 endTime = datetime.datetime(2010,1,21,23,59,59,0,0,0)
30 endTime = datetime.datetime(2010,1,21,23,59,59,0,0,0)
31
31
32 readerObj = VoltageReader()
32 readerObj = VoltageReader()
33
33
34 readerObj.setup(dpath, startTime, endTime)
34 readerObj.setup(dpath, startTime, endTime)
35
35
36 while(True):
36 while(True):
37
37
38 #to get one profile
38 #to get one profile
39 profile = readerObj.getData()
39 profile = readerObj.getData()
40
40
41 #print the profile
41 #print the profile
42 print profile
42 print profile
43
43
44 #If you want to see all datablock
44 #If you want to see all datablock
45 print readerObj.datablock
45 print readerObj.datablock
46
46
47 if readerObj.flagNoMoreFiles:
47 if readerObj.flagNoMoreFiles:
48 break
48 break
49
49
50 """
50 """
51
51
52 ext = ".r"
52 ext = ".r"
53
53
54 optchar = "D"
54 optchar = "D"
55 dataOut = None
55 dataOut = None
56
56
57
57
58 def __init__(self):
58 def __init__(self):
59 """
59 """
60 Inicializador de la clase VoltageReader para la lectura de datos de voltage.
60 Inicializador de la clase VoltageReader para la lectura de datos de voltage.
61
61
62 Input:
62 Input:
63 dataOut : Objeto de la clase Voltage. Este objeto sera utilizado para
63 dataOut : Objeto de la clase Voltage. Este objeto sera utilizado para
64 almacenar un perfil de datos cada vez que se haga un requerimiento
64 almacenar un perfil de datos cada vez que se haga un requerimiento
65 (getData). El perfil sera obtenido a partir del buffer de datos,
65 (getData). El perfil sera obtenido a partir del buffer de datos,
66 si el buffer esta vacio se hara un nuevo proceso de lectura de un
66 si el buffer esta vacio se hara un nuevo proceso de lectura de un
67 bloque de datos.
67 bloque de datos.
68 Si este parametro no es pasado se creara uno internamente.
68 Si este parametro no es pasado se creara uno internamente.
69
69
70 Variables afectadas:
70 Variables afectadas:
71 self.dataOut
71 self.dataOut
72
72
73 Return:
73 Return:
74 None
74 None
75 """
75 """
76
76
77 ProcessingUnit.__init__(self)
77 ProcessingUnit.__init__(self)
78
78
79 self.isConfig = False
79 self.isConfig = False
80
80
81 self.datablock = None
81 self.datablock = None
82
82
83 self.utc = 0
83 self.utc = 0
84
84
85 self.ext = ".r"
85 self.ext = ".r"
86
86
87 self.optchar = "D"
87 self.optchar = "D"
88
88
89 self.basicHeaderObj = BasicHeader(LOCALTIME)
89 self.basicHeaderObj = BasicHeader(LOCALTIME)
90
90
91 self.systemHeaderObj = SystemHeader()
91 self.systemHeaderObj = SystemHeader()
92
92
93 self.radarControllerHeaderObj = RadarControllerHeader()
93 self.radarControllerHeaderObj = RadarControllerHeader()
94
94
95 self.processingHeaderObj = ProcessingHeader()
95 self.processingHeaderObj = ProcessingHeader()
96
96
97 self.online = 0
97 self.online = 0
98
98
99 self.fp = None
99 self.fp = None
100
100
101 self.idFile = None
101 self.idFile = None
102
102
103 self.dtype = None
103 self.dtype = None
104
104
105 self.fileSizeByHeader = None
105 self.fileSizeByHeader = None
106
106
107 self.filenameList = []
107 self.filenameList = []
108
108
109 self.filename = None
109 self.filename = None
110
110
111 self.fileSize = None
111 self.fileSize = None
112
112
113 self.firstHeaderSize = 0
113 self.firstHeaderSize = 0
114
114
115 self.basicHeaderSize = 24
115 self.basicHeaderSize = 24
116
116
117 self.pathList = []
117 self.pathList = []
118
118
119 self.filenameList = []
119 self.filenameList = []
120
120
121 self.lastUTTime = 0
121 self.lastUTTime = 0
122
122
123 self.maxTimeStep = 30
123 self.maxTimeStep = 30
124
124
125 self.flagNoMoreFiles = 0
125 self.flagNoMoreFiles = 0
126
126
127 self.set = 0
127 self.set = 0
128
128
129 self.path = None
129 self.path = None
130
130
131 self.profileIndex = 2**32-1
131 self.profileIndex = 2**32-1
132
132
133 self.delay = 3 #seconds
133 self.delay = 3 #seconds
134
134
135 self.nTries = 3 #quantity tries
135 self.nTries = 3 #quantity tries
136
136
137 self.nFiles = 3 #number of files for searching
137 self.nFiles = 3 #number of files for searching
138
138
139 self.nReadBlocks = 0
139 self.nReadBlocks = 0
140
140
141 self.flagIsNewFile = 1
141 self.flagIsNewFile = 1
142
142
143 self.__isFirstTimeOnline = 1
143 self.__isFirstTimeOnline = 1
144
144
145 # self.ippSeconds = 0
145 # self.ippSeconds = 0
146
146
147 self.flagTimeBlock = 0
147 self.flagTimeBlock = 0
148
148
149 self.flagIsNewBlock = 0
149 self.flagIsNewBlock = 0
150
150
151 self.nTotalBlocks = 0
151 self.nTotalBlocks = 0
152
152
153 self.blocksize = 0
153 self.blocksize = 0
154
154
155 self.dataOut = self.createObjByDefault()
155 self.dataOut = self.createObjByDefault()
156
156
157 def createObjByDefault(self):
157 def createObjByDefault(self):
158
158
159 dataObj = Voltage()
159 dataObj = Voltage()
160
160
161 return dataObj
161 return dataObj
162
162
163 def __hasNotDataInBuffer(self):
163 def __hasNotDataInBuffer(self):
164 if self.profileIndex >= self.processingHeaderObj.profilesPerBlock:
164 if self.profileIndex >= self.processingHeaderObj.profilesPerBlock:
165 return 1
165 return 1
166 return 0
166 return 0
167
167
168
168
169 def getBlockDimension(self):
169 def getBlockDimension(self):
170 """
170 """
171 Obtiene la cantidad de puntos a leer por cada bloque de datos
171 Obtiene la cantidad de puntos a leer por cada bloque de datos
172
172
173 Affected:
173 Affected:
174 self.blocksize
174 self.blocksize
175
175
176 Return:
176 Return:
177 None
177 None
178 """
178 """
179 pts2read = self.processingHeaderObj.profilesPerBlock * self.processingHeaderObj.nHeights * self.systemHeaderObj.nChannels
179 pts2read = self.processingHeaderObj.profilesPerBlock * self.processingHeaderObj.nHeights * self.systemHeaderObj.nChannels
180 self.blocksize = pts2read
180 self.blocksize = pts2read
181
181
182
182
183 def readBlock(self):
183 def readBlock(self):
184 """
184 """
185 readBlock lee el bloque de datos desde la posicion actual del puntero del archivo
185 readBlock lee el bloque de datos desde la posicion actual del puntero del archivo
186 (self.fp) y actualiza todos los parametros relacionados al bloque de datos
186 (self.fp) y actualiza todos los parametros relacionados al bloque de datos
187 (metadata + data). La data leida es almacenada en el buffer y el contador del buffer
187 (metadata + data). La data leida es almacenada en el buffer y el contador del buffer
188 es seteado a 0
188 es seteado a 0
189
189
190 Inputs:
190 Inputs:
191 None
191 None
192
192
193 Return:
193 Return:
194 None
194 None
195
195
196 Affected:
196 Affected:
197 self.profileIndex
197 self.profileIndex
198 self.datablock
198 self.datablock
199 self.flagIsNewFile
199 self.flagIsNewFile
200 self.flagIsNewBlock
200 self.flagIsNewBlock
201 self.nTotalBlocks
201 self.nTotalBlocks
202
202
203 Exceptions:
203 Exceptions:
204 Si un bloque leido no es un bloque valido
204 Si un bloque leido no es un bloque valido
205 """
205 """
206 current_pointer_location = self.fp.tell()
206 current_pointer_location = self.fp.tell()
207 junk = numpy.fromfile( self.fp, self.dtype, self.blocksize )
207 junk = numpy.fromfile( self.fp, self.dtype, self.blocksize )
208
208
209 try:
209 try:
210 junk = junk.reshape( (self.processingHeaderObj.profilesPerBlock, self.processingHeaderObj.nHeights, self.systemHeaderObj.nChannels) )
210 junk = junk.reshape( (self.processingHeaderObj.profilesPerBlock, self.processingHeaderObj.nHeights, self.systemHeaderObj.nChannels) )
211 except:
211 except:
212 #print "The read block (%3d) has not enough data" %self.nReadBlocks
212 #print "The read block (%3d) has not enough data" %self.nReadBlocks
213
213
214 if self.waitDataBlock(pointer_location=current_pointer_location):
214 if self.waitDataBlock(pointer_location=current_pointer_location):
215 junk = numpy.fromfile( self.fp, self.dtype, self.blocksize )
215 junk = numpy.fromfile( self.fp, self.dtype, self.blocksize )
216 junk = junk.reshape( (self.processingHeaderObj.profilesPerBlock, self.processingHeaderObj.nHeights, self.systemHeaderObj.nChannels) )
216 junk = junk.reshape( (self.processingHeaderObj.profilesPerBlock, self.processingHeaderObj.nHeights, self.systemHeaderObj.nChannels) )
217 # return 0
217 # return 0
218
218
219 junk = numpy.transpose(junk, (2,0,1))
219 junk = numpy.transpose(junk, (2,0,1))
220 self.datablock = junk['real'] + junk['imag']*1j
220 self.datablock = junk['real'] + junk['imag']*1j
221
221
222 self.profileIndex = 0
222 self.profileIndex = 0
223
223
224 self.flagIsNewFile = 0
224 self.flagIsNewFile = 0
225 self.flagIsNewBlock = 1
225 self.flagIsNewBlock = 1
226
226
227 self.nTotalBlocks += 1
227 self.nTotalBlocks += 1
228 self.nReadBlocks += 1
228 self.nReadBlocks += 1
229
229
230 return 1
230 return 1
231
231
232 def getFirstHeader(self):
232 def getFirstHeader(self):
233
233
234 self.dataOut.systemHeaderObj = self.systemHeaderObj.copy()
234 self.dataOut.systemHeaderObj = self.systemHeaderObj.copy()
235
235
236 self.dataOut.radarControllerHeaderObj = self.radarControllerHeaderObj.copy()
236 self.dataOut.radarControllerHeaderObj = self.radarControllerHeaderObj.copy()
237
237
238 # self.dataOut.ippSeconds = self.ippSeconds
238 # self.dataOut.ippSeconds = self.ippSeconds
239
239
240 self.dataOut.timeInterval = self.radarControllerHeaderObj.ippSeconds * self.processingHeaderObj.nCohInt
240 # self.dataOut.timeInterval = self.radarControllerHeaderObj.ippSeconds * self.processingHeaderObj.nCohInt
241
241
242 if self.radarControllerHeaderObj.code != None:
242 if self.radarControllerHeaderObj.code != None:
243
243
244 self.dataOut.nCode = self.radarControllerHeaderObj.nCode
244 self.dataOut.nCode = self.radarControllerHeaderObj.nCode
245
245
246 self.dataOut.nBaud = self.radarControllerHeaderObj.nBaud
246 self.dataOut.nBaud = self.radarControllerHeaderObj.nBaud
247
247
248 self.dataOut.code = self.radarControllerHeaderObj.code
248 self.dataOut.code = self.radarControllerHeaderObj.code
249
249
250 self.dataOut.dtype = self.dtype
250 self.dataOut.dtype = self.dtype
251
251
252 self.dataOut.nProfiles = self.processingHeaderObj.profilesPerBlock
252 self.dataOut.nProfiles = self.processingHeaderObj.profilesPerBlock
253
253
254 xf = self.processingHeaderObj.firstHeight + self.processingHeaderObj.nHeights*self.processingHeaderObj.deltaHeight
254 xf = self.processingHeaderObj.firstHeight + self.processingHeaderObj.nHeights*self.processingHeaderObj.deltaHeight
255
255
256 self.dataOut.heightList = numpy.arange(self.processingHeaderObj.firstHeight, xf, self.processingHeaderObj.deltaHeight)
256 self.dataOut.heightList = numpy.arange(self.processingHeaderObj.firstHeight, xf, self.processingHeaderObj.deltaHeight)
257
257
258 self.dataOut.channelList = range(self.systemHeaderObj.nChannels)
258 self.dataOut.channelList = range(self.systemHeaderObj.nChannels)
259
259
260 self.dataOut.nCohInt = self.processingHeaderObj.nCohInt
260 self.dataOut.nCohInt = self.processingHeaderObj.nCohInt
261
261
262 self.dataOut.flagShiftFFT = False
262 self.dataOut.flagShiftFFT = False
263
263
264 self.dataOut.flagDecodeData = False #asumo q la data no esta decodificada
264 self.dataOut.flagDecodeData = False #asumo q la data no esta decodificada
265
265
266 self.dataOut.flagDeflipData = False #asumo q la data no esta sin flip
266 self.dataOut.flagDeflipData = False #asumo q la data no esta sin flip
267
267
268 self.dataOut.flagShiftFFT = False
268 self.dataOut.flagShiftFFT = False
269
269
270 def getData(self):
270 def getData(self):
271 """
271 """
272 getData obtiene una unidad de datos del buffer de lectura y la copia a la clase "Voltage"
272 getData obtiene una unidad de datos del buffer de lectura, un perfil, y la copia al objeto self.dataOut
273 con todos los parametros asociados a este (metadata). cuando no hay datos en el buffer de
273 del tipo "Voltage" con todos los parametros asociados a este (metadata). cuando no hay datos
274 lectura es necesario hacer una nueva lectura de los bloques de datos usando "readNextBlock"
274 en el buffer de lectura es necesario hacer una nueva lectura de los bloques de datos usando
275 "readNextBlock"
275
276
276 Ademas incrementa el contador del buffer en 1.
277 Ademas incrementa el contador del buffer "self.profileIndex" en 1.
277
278
278 Return:
279 Return:
279 data : retorna un perfil de voltages (alturas * canales) copiados desde el
280
280 buffer. Si no hay mas archivos a leer retorna None.
281 Si el flag self.getByBlock ha sido seteado el bloque completo es copiado a self.dataOut y el self.profileIndex
282 es igual al total de perfiles leidos desde el archivo.
283
284 Si self.getByBlock == False:
285
286 self.dataOut.data = buffer[:, thisProfile, :]
287
288 shape = [nChannels, nHeis]
289
290 Si self.getByBlock == True:
291
292 self.dataOut.data = buffer[:, :, :]
293
294 shape = [nChannels, nProfiles, nHeis]
281
295
282 Variables afectadas:
296 Variables afectadas:
283 self.dataOut
297 self.dataOut
284 self.profileIndex
298 self.profileIndex
285
299
286 Affected:
300 Affected:
287 self.dataOut
301 self.dataOut
288 self.profileIndex
302 self.profileIndex
289 self.flagTimeBlock
303 self.flagTimeBlock
290 self.flagIsNewBlock
304 self.flagIsNewBlock
291 """
305 """
292
306
293 if self.flagNoMoreFiles:
307 if self.flagNoMoreFiles:
294 self.dataOut.flagNoData = True
308 self.dataOut.flagNoData = True
295 print 'Process finished'
309 print 'Process finished'
296 return 0
310 return 0
297
311
298 self.flagTimeBlock = 0
312 self.flagTimeBlock = 0
299 self.flagIsNewBlock = 0
313 self.flagIsNewBlock = 0
300
314
301 if self.__hasNotDataInBuffer():
315 if self.__hasNotDataInBuffer():
302
316
303 if not( self.readNextBlock() ):
317 if not( self.readNextBlock() ):
304 return 0
318 return 0
305
319
306 self.getFirstHeader()
320 self.getFirstHeader()
307
321
308 if self.datablock == None:
322 if self.datablock == None:
309 self.dataOut.flagNoData = True
323 self.dataOut.flagNoData = True
310 return 0
324 return 0
311
325
312 if self.getblock:
326 if self.getByBlock:
327 self.dataOut.flagDataAsBlock = True
313 self.dataOut.data = self.datablock
328 self.dataOut.data = self.datablock
314 self.profileIndex = self.processingHeaderObj.profilesPerBlock
329 self.profileIndex = self.processingHeaderObj.profilesPerBlock
315 else:
330 else:
331 self.dataOut.flagDataAsBlock = False
316 self.dataOut.data = self.datablock[:,self.profileIndex,:]
332 self.dataOut.data = self.datablock[:,self.profileIndex,:]
317 self.profileIndex += 1
333 self.profileIndex += 1
318
334
319 self.dataOut.flagNoData = False
335 self.dataOut.flagNoData = False
320
336
321 self.getBasicHeader()
337 self.getBasicHeader()
322
338
323
339
324
340
325 self.dataOut.realtime = self.online
341 self.dataOut.realtime = self.online
326
342
327 return self.dataOut.data
343 return self.dataOut.data
328
344
329 class VoltageWriter(JRODataWriter, Operation):
345 class VoltageWriter(JRODataWriter, Operation):
330 """
346 """
331 Esta clase permite escribir datos de voltajes a archivos procesados (.r). La escritura
347 Esta clase permite escribir datos de voltajes a archivos procesados (.r). La escritura
332 de los datos siempre se realiza por bloques.
348 de los datos siempre se realiza por bloques.
333 """
349 """
334
350
335 ext = ".r"
351 ext = ".r"
336
352
337 optchar = "D"
353 optchar = "D"
338
354
339 shapeBuffer = None
355 shapeBuffer = None
340
356
341
357
342 def __init__(self):
358 def __init__(self):
343 """
359 """
344 Inicializador de la clase VoltageWriter para la escritura de datos de espectros.
360 Inicializador de la clase VoltageWriter para la escritura de datos de espectros.
345
361
346 Affected:
362 Affected:
347 self.dataOut
363 self.dataOut
348
364
349 Return: None
365 Return: None
350 """
366 """
351 Operation.__init__(self)
367 Operation.__init__(self)
352
368
353 self.nTotalBlocks = 0
369 self.nTotalBlocks = 0
354
370
355 self.profileIndex = 0
371 self.profileIndex = 0
356
372
357 self.isConfig = False
373 self.isConfig = False
358
374
359 self.fp = None
375 self.fp = None
360
376
361 self.flagIsNewFile = 1
377 self.flagIsNewFile = 1
362
378
363 self.nTotalBlocks = 0
379 self.nTotalBlocks = 0
364
380
365 self.flagIsNewBlock = 0
381 self.flagIsNewBlock = 0
366
382
367 self.setFile = None
383 self.setFile = None
368
384
369 self.dtype = None
385 self.dtype = None
370
386
371 self.path = None
387 self.path = None
372
388
373 self.filename = None
389 self.filename = None
374
390
375 self.basicHeaderObj = BasicHeader(LOCALTIME)
391 self.basicHeaderObj = BasicHeader(LOCALTIME)
376
392
377 self.systemHeaderObj = SystemHeader()
393 self.systemHeaderObj = SystemHeader()
378
394
379 self.radarControllerHeaderObj = RadarControllerHeader()
395 self.radarControllerHeaderObj = RadarControllerHeader()
380
396
381 self.processingHeaderObj = ProcessingHeader()
397 self.processingHeaderObj = ProcessingHeader()
382
398
383 def hasAllDataInBuffer(self):
399 def hasAllDataInBuffer(self):
384 if self.profileIndex >= self.processingHeaderObj.profilesPerBlock:
400 if self.profileIndex >= self.processingHeaderObj.profilesPerBlock:
385 return 1
401 return 1
386 return 0
402 return 0
387
403
388
404
389 def setBlockDimension(self):
405 def setBlockDimension(self):
390 """
406 """
391 Obtiene las formas dimensionales del los subbloques de datos que componen un bloque
407 Obtiene las formas dimensionales del los subbloques de datos que componen un bloque
392
408
393 Affected:
409 Affected:
394 self.shape_spc_Buffer
410 self.shape_spc_Buffer
395 self.shape_cspc_Buffer
411 self.shape_cspc_Buffer
396 self.shape_dc_Buffer
412 self.shape_dc_Buffer
397
413
398 Return: None
414 Return: None
399 """
415 """
400 self.shapeBuffer = (self.processingHeaderObj.profilesPerBlock,
416 self.shapeBuffer = (self.processingHeaderObj.profilesPerBlock,
401 self.processingHeaderObj.nHeights,
417 self.processingHeaderObj.nHeights,
402 self.systemHeaderObj.nChannels)
418 self.systemHeaderObj.nChannels)
403
419
404 self.datablock = numpy.zeros((self.systemHeaderObj.nChannels,
420 self.datablock = numpy.zeros((self.systemHeaderObj.nChannels,
405 self.processingHeaderObj.profilesPerBlock,
421 self.processingHeaderObj.profilesPerBlock,
406 self.processingHeaderObj.nHeights),
422 self.processingHeaderObj.nHeights),
407 dtype=numpy.dtype('complex64'))
423 dtype=numpy.dtype('complex64'))
408
424
409
425
410 def writeBlock(self):
426 def writeBlock(self):
411 """
427 """
412 Escribe el buffer en el file designado
428 Escribe el buffer en el file designado
413
429
414 Affected:
430 Affected:
415 self.profileIndex
431 self.profileIndex
416 self.flagIsNewFile
432 self.flagIsNewFile
417 self.flagIsNewBlock
433 self.flagIsNewBlock
418 self.nTotalBlocks
434 self.nTotalBlocks
419 self.blockIndex
435 self.blockIndex
420
436
421 Return: None
437 Return: None
422 """
438 """
423 data = numpy.zeros( self.shapeBuffer, self.dtype )
439 data = numpy.zeros( self.shapeBuffer, self.dtype )
424
440
425 junk = numpy.transpose(self.datablock, (1,2,0))
441 junk = numpy.transpose(self.datablock, (1,2,0))
426
442
427 data['real'] = junk.real
443 data['real'] = junk.real
428 data['imag'] = junk.imag
444 data['imag'] = junk.imag
429
445
430 data = data.reshape( (-1) )
446 data = data.reshape( (-1) )
431
447
432 data.tofile( self.fp )
448 data.tofile( self.fp )
433
449
434 self.datablock.fill(0)
450 self.datablock.fill(0)
435
451
436 self.profileIndex = 0
452 self.profileIndex = 0
437 self.flagIsNewFile = 0
453 self.flagIsNewFile = 0
438 self.flagIsNewBlock = 1
454 self.flagIsNewBlock = 1
439
455
440 self.blockIndex += 1
456 self.blockIndex += 1
441 self.nTotalBlocks += 1
457 self.nTotalBlocks += 1
442
458
443 def putData(self):
459 def putData(self):
444 """
460 """
445 Setea un bloque de datos y luego los escribe en un file
461 Setea un bloque de datos y luego los escribe en un file
446
462
447 Affected:
463 Affected:
448 self.flagIsNewBlock
464 self.flagIsNewBlock
449 self.profileIndex
465 self.profileIndex
450
466
451 Return:
467 Return:
452 0 : Si no hay data o no hay mas files que puedan escribirse
468 0 : Si no hay data o no hay mas files que puedan escribirse
453 1 : Si se escribio la data de un bloque en un file
469 1 : Si se escribio la data de un bloque en un file
454 """
470 """
455 if self.dataOut.flagNoData:
471 if self.dataOut.flagNoData:
456 return 0
472 return 0
457
473
458 self.flagIsNewBlock = 0
474 self.flagIsNewBlock = 0
459
475
460 if self.dataOut.flagTimeBlock:
476 if self.dataOut.flagTimeBlock:
461
477
462 self.datablock.fill(0)
478 self.datablock.fill(0)
463 self.profileIndex = 0
479 self.profileIndex = 0
464 self.setNextFile()
480 self.setNextFile()
465
481
466 if self.profileIndex == 0:
482 if self.profileIndex == 0:
467 self.setBasicHeader()
483 self.setBasicHeader()
468
484
469 self.datablock[:,self.profileIndex,:] = self.dataOut.data
485 self.datablock[:,self.profileIndex,:] = self.dataOut.data
470
486
471 self.profileIndex += 1
487 self.profileIndex += 1
472
488
473 if self.hasAllDataInBuffer():
489 if self.hasAllDataInBuffer():
474 #if self.flagIsNewFile:
490 #if self.flagIsNewFile:
475 self.writeNextBlock()
491 self.writeNextBlock()
476 # self.setFirstHeader()
492 # self.setFirstHeader()
477
493
478 return 1
494 return 1
479
495
480 def __getProcessFlags(self):
496 def __getProcessFlags(self):
481
497
482 processFlags = 0
498 processFlags = 0
483
499
484 dtype0 = numpy.dtype([('real','<i1'),('imag','<i1')])
500 dtype0 = numpy.dtype([('real','<i1'),('imag','<i1')])
485 dtype1 = numpy.dtype([('real','<i2'),('imag','<i2')])
501 dtype1 = numpy.dtype([('real','<i2'),('imag','<i2')])
486 dtype2 = numpy.dtype([('real','<i4'),('imag','<i4')])
502 dtype2 = numpy.dtype([('real','<i4'),('imag','<i4')])
487 dtype3 = numpy.dtype([('real','<i8'),('imag','<i8')])
503 dtype3 = numpy.dtype([('real','<i8'),('imag','<i8')])
488 dtype4 = numpy.dtype([('real','<f4'),('imag','<f4')])
504 dtype4 = numpy.dtype([('real','<f4'),('imag','<f4')])
489 dtype5 = numpy.dtype([('real','<f8'),('imag','<f8')])
505 dtype5 = numpy.dtype([('real','<f8'),('imag','<f8')])
490
506
491 dtypeList = [dtype0, dtype1, dtype2, dtype3, dtype4, dtype5]
507 dtypeList = [dtype0, dtype1, dtype2, dtype3, dtype4, dtype5]
492
508
493
509
494
510
495 datatypeValueList = [PROCFLAG.DATATYPE_CHAR,
511 datatypeValueList = [PROCFLAG.DATATYPE_CHAR,
496 PROCFLAG.DATATYPE_SHORT,
512 PROCFLAG.DATATYPE_SHORT,
497 PROCFLAG.DATATYPE_LONG,
513 PROCFLAG.DATATYPE_LONG,
498 PROCFLAG.DATATYPE_INT64,
514 PROCFLAG.DATATYPE_INT64,
499 PROCFLAG.DATATYPE_FLOAT,
515 PROCFLAG.DATATYPE_FLOAT,
500 PROCFLAG.DATATYPE_DOUBLE]
516 PROCFLAG.DATATYPE_DOUBLE]
501
517
502
518
503 for index in range(len(dtypeList)):
519 for index in range(len(dtypeList)):
504 if self.dataOut.dtype == dtypeList[index]:
520 if self.dataOut.dtype == dtypeList[index]:
505 dtypeValue = datatypeValueList[index]
521 dtypeValue = datatypeValueList[index]
506 break
522 break
507
523
508 processFlags += dtypeValue
524 processFlags += dtypeValue
509
525
510 if self.dataOut.flagDecodeData:
526 if self.dataOut.flagDecodeData:
511 processFlags += PROCFLAG.DECODE_DATA
527 processFlags += PROCFLAG.DECODE_DATA
512
528
513 if self.dataOut.flagDeflipData:
529 if self.dataOut.flagDeflipData:
514 processFlags += PROCFLAG.DEFLIP_DATA
530 processFlags += PROCFLAG.DEFLIP_DATA
515
531
516 if self.dataOut.code != None:
532 if self.dataOut.code != None:
517 processFlags += PROCFLAG.DEFINE_PROCESS_CODE
533 processFlags += PROCFLAG.DEFINE_PROCESS_CODE
518
534
519 if self.dataOut.nCohInt > 1:
535 if self.dataOut.nCohInt > 1:
520 processFlags += PROCFLAG.COHERENT_INTEGRATION
536 processFlags += PROCFLAG.COHERENT_INTEGRATION
521
537
522 return processFlags
538 return processFlags
523
539
524
540
525 def __getBlockSize(self):
541 def __getBlockSize(self):
526 '''
542 '''
527 Este metodos determina el cantidad de bytes para un bloque de datos de tipo Voltage
543 Este metodos determina el cantidad de bytes para un bloque de datos de tipo Voltage
528 '''
544 '''
529
545
530 dtype0 = numpy.dtype([('real','<i1'),('imag','<i1')])
546 dtype0 = numpy.dtype([('real','<i1'),('imag','<i1')])
531 dtype1 = numpy.dtype([('real','<i2'),('imag','<i2')])
547 dtype1 = numpy.dtype([('real','<i2'),('imag','<i2')])
532 dtype2 = numpy.dtype([('real','<i4'),('imag','<i4')])
548 dtype2 = numpy.dtype([('real','<i4'),('imag','<i4')])
533 dtype3 = numpy.dtype([('real','<i8'),('imag','<i8')])
549 dtype3 = numpy.dtype([('real','<i8'),('imag','<i8')])
534 dtype4 = numpy.dtype([('real','<f4'),('imag','<f4')])
550 dtype4 = numpy.dtype([('real','<f4'),('imag','<f4')])
535 dtype5 = numpy.dtype([('real','<f8'),('imag','<f8')])
551 dtype5 = numpy.dtype([('real','<f8'),('imag','<f8')])
536
552
537 dtypeList = [dtype0, dtype1, dtype2, dtype3, dtype4, dtype5]
553 dtypeList = [dtype0, dtype1, dtype2, dtype3, dtype4, dtype5]
538 datatypeValueList = [1,2,4,8,4,8]
554 datatypeValueList = [1,2,4,8,4,8]
539 for index in range(len(dtypeList)):
555 for index in range(len(dtypeList)):
540 if self.dataOut.dtype == dtypeList[index]:
556 if self.dataOut.dtype == dtypeList[index]:
541 datatypeValue = datatypeValueList[index]
557 datatypeValue = datatypeValueList[index]
542 break
558 break
543
559
544 blocksize = int(self.dataOut.nHeights * self.dataOut.nChannels * self.profilesPerBlock * datatypeValue * 2)
560 blocksize = int(self.dataOut.nHeights * self.dataOut.nChannels * self.profilesPerBlock * datatypeValue * 2)
545
561
546 return blocksize
562 return blocksize
547
563
548 def setFirstHeader(self):
564 def setFirstHeader(self):
549
565
550 """
566 """
551 Obtiene una copia del First Header
567 Obtiene una copia del First Header
552
568
553 Affected:
569 Affected:
554 self.systemHeaderObj
570 self.systemHeaderObj
555 self.radarControllerHeaderObj
571 self.radarControllerHeaderObj
556 self.dtype
572 self.dtype
557
573
558 Return:
574 Return:
559 None
575 None
560 """
576 """
561
577
562 self.systemHeaderObj = self.dataOut.systemHeaderObj.copy()
578 self.systemHeaderObj = self.dataOut.systemHeaderObj.copy()
563 self.systemHeaderObj.nChannels = self.dataOut.nChannels
579 self.systemHeaderObj.nChannels = self.dataOut.nChannels
564 self.radarControllerHeaderObj = self.dataOut.radarControllerHeaderObj.copy()
580 self.radarControllerHeaderObj = self.dataOut.radarControllerHeaderObj.copy()
565
581
566 self.setBasicHeader()
582 self.setBasicHeader()
567
583
568 processingHeaderSize = 40 # bytes
584 processingHeaderSize = 40 # bytes
569 self.processingHeaderObj.dtype = 0 # Voltage
585 self.processingHeaderObj.dtype = 0 # Voltage
570 self.processingHeaderObj.blockSize = self.__getBlockSize()
586 self.processingHeaderObj.blockSize = self.__getBlockSize()
571 self.processingHeaderObj.profilesPerBlock = self.profilesPerBlock
587 self.processingHeaderObj.profilesPerBlock = self.profilesPerBlock
572 self.processingHeaderObj.dataBlocksPerFile = self.blocksPerFile
588 self.processingHeaderObj.dataBlocksPerFile = self.blocksPerFile
573 self.processingHeaderObj.nWindows = 1 #podria ser 1 o self.dataOut.processingHeaderObj.nWindows
589 self.processingHeaderObj.nWindows = 1 #podria ser 1 o self.dataOut.processingHeaderObj.nWindows
574 self.processingHeaderObj.processFlags = self.__getProcessFlags()
590 self.processingHeaderObj.processFlags = self.__getProcessFlags()
575 self.processingHeaderObj.nCohInt = self.dataOut.nCohInt
591 self.processingHeaderObj.nCohInt = self.dataOut.nCohInt
576 self.processingHeaderObj.nIncohInt = 1 # Cuando la data de origen es de tipo Voltage
592 self.processingHeaderObj.nIncohInt = 1 # Cuando la data de origen es de tipo Voltage
577 self.processingHeaderObj.totalSpectra = 0 # Cuando la data de origen es de tipo Voltage
593 self.processingHeaderObj.totalSpectra = 0 # Cuando la data de origen es de tipo Voltage
578
594
579 # if self.dataOut.code != None:
595 # if self.dataOut.code != None:
580 # self.processingHeaderObj.code = self.dataOut.code
596 # self.processingHeaderObj.code = self.dataOut.code
581 # self.processingHeaderObj.nCode = self.dataOut.nCode
597 # self.processingHeaderObj.nCode = self.dataOut.nCode
582 # self.processingHeaderObj.nBaud = self.dataOut.nBaud
598 # self.processingHeaderObj.nBaud = self.dataOut.nBaud
583 # codesize = int(8 + 4 * self.dataOut.nCode * self.dataOut.nBaud)
599 # codesize = int(8 + 4 * self.dataOut.nCode * self.dataOut.nBaud)
584 # processingHeaderSize += codesize
600 # processingHeaderSize += codesize
585
601
586 if self.processingHeaderObj.nWindows != 0:
602 if self.processingHeaderObj.nWindows != 0:
587 self.processingHeaderObj.firstHeight = self.dataOut.heightList[0]
603 self.processingHeaderObj.firstHeight = self.dataOut.heightList[0]
588 self.processingHeaderObj.deltaHeight = self.dataOut.heightList[1] - self.dataOut.heightList[0]
604 self.processingHeaderObj.deltaHeight = self.dataOut.heightList[1] - self.dataOut.heightList[0]
589 self.processingHeaderObj.nHeights = self.dataOut.nHeights
605 self.processingHeaderObj.nHeights = self.dataOut.nHeights
590 self.processingHeaderObj.samplesWin = self.dataOut.nHeights
606 self.processingHeaderObj.samplesWin = self.dataOut.nHeights
591 processingHeaderSize += 12
607 processingHeaderSize += 12
592
608
593 self.processingHeaderObj.size = processingHeaderSize No newline at end of file
609 self.processingHeaderObj.size = processingHeaderSize
General Comments 0
You need to be logged in to leave comments. Login now