@@ -1,656 +1,678 | |||||
1 | import numpy |
|
1 | import numpy | |
2 | import time |
|
2 | import time | |
3 | import os |
|
3 | import os | |
4 | import h5py |
|
4 | import h5py | |
5 | import re |
|
5 | import re | |
6 |
|
6 | |||
7 | from model.data.jrodata import * |
|
7 | from model.data.jrodata import * | |
8 | from model.proc.jroproc_base import ProcessingUnit, Operation |
|
8 | from model.proc.jroproc_base import ProcessingUnit, Operation | |
9 | from model.io.jroIO_base import * |
|
9 | from model.io.jroIO_base import * | |
10 |
|
10 | |||
11 |
|
11 | |||
12 | class HDF5Reader(ProcessingUnit): |
|
12 | class HDF5Reader(ProcessingUnit): | |
13 |
|
13 | |||
14 | ext = ".hdf5" |
|
14 | ext = ".hdf5" | |
15 |
|
15 | |||
16 | optchar = "D" |
|
16 | optchar = "D" | |
17 |
|
17 | |||
18 | timezone = None |
|
18 | timezone = None | |
19 |
|
19 | |||
20 | fileIndex = None |
|
20 | fileIndex = None | |
21 |
|
21 | |||
22 | blockIndex = None |
|
22 | blockIndex = None | |
23 |
|
23 | |||
24 | path = None |
|
24 | path = None | |
25 |
|
25 | |||
26 | #Hdf5 File |
|
26 | #Hdf5 File | |
27 |
|
27 | |||
28 | fpMetadata = None |
|
28 | fpMetadata = None | |
29 |
|
29 | |||
30 | listMetaname = None |
|
30 | listMetaname = None | |
31 |
|
31 | |||
32 | listMetadata = None |
|
32 | listMetadata = None | |
33 |
|
33 | |||
34 | fp = None |
|
34 | fp = None | |
35 |
|
35 | |||
36 | #dataOut reconstruction |
|
36 | #dataOut reconstruction | |
37 |
|
37 | |||
38 |
|
38 | |||
39 | dataOut = None |
|
39 | dataOut = None | |
40 |
|
40 | |||
41 | nChannels = None #Dimension 0 |
|
41 | nChannels = None #Dimension 0 | |
42 |
|
42 | |||
43 | nPoints = None #Dimension 1, number of Points or Parameters |
|
43 | nPoints = None #Dimension 1, number of Points or Parameters | |
44 |
|
44 | |||
45 | nSamples = None #Dimension 2, number of samples or ranges |
|
45 | nSamples = None #Dimension 2, number of samples or ranges | |
46 |
|
46 | |||
47 |
|
47 | |||
48 | def __init__(self): |
|
48 | def __init__(self): | |
49 |
|
49 | |||
50 | return |
|
50 | return | |
51 |
|
51 | |||
52 | def setup(self,path=None, |
|
52 | def setup(self,path=None, | |
53 | startDate=None, |
|
53 | startDate=None, | |
54 | endDate=None, |
|
54 | endDate=None, | |
55 | startTime=datetime.time(0,0,0), |
|
55 | startTime=datetime.time(0,0,0), | |
56 | endTime=datetime.time(23,59,59), |
|
56 | endTime=datetime.time(23,59,59), | |
57 | walk=True, |
|
57 | walk=True, | |
58 | timezone='ut', |
|
58 | timezone='ut', | |
59 | all=0, |
|
59 | all=0, | |
60 | online=False, |
|
60 | online=False, | |
61 | ext=None): |
|
61 | ext=None): | |
62 |
|
62 | |||
63 | if ext==None: |
|
63 | if ext==None: | |
64 | ext = self.ext |
|
64 | ext = self.ext | |
65 | self.timezone = timezone |
|
65 | self.timezone = timezone | |
66 | # self.all = all |
|
66 | # self.all = all | |
67 | # self.online = online |
|
67 | # self.online = online | |
68 | self.path = path |
|
68 | self.path = path | |
69 |
|
69 | |||
70 |
|
70 | |||
71 | if not(online): |
|
71 | if not(online): | |
72 | #Busqueda de archivos offline |
|
72 | #Busqueda de archivos offline | |
73 | self.__searchFilesOffline(path, startDate, endDate, ext, startTime, endTime, walk) |
|
73 | self.__searchFilesOffline(path, startDate, endDate, ext, startTime, endTime, walk) | |
74 | else: |
|
74 | else: | |
75 | self.__searchFilesOnline(path, walk) |
|
75 | self.__searchFilesOnline(path, walk) | |
76 |
|
76 | |||
77 | if not(self.filenameList): |
|
77 | if not(self.filenameList): | |
78 | print "There is no files into the folder: %s"%(path) |
|
78 | print "There is no files into the folder: %s"%(path) | |
79 | sys.exit(-1) |
|
79 | sys.exit(-1) | |
80 |
|
80 | |||
81 | # self.__getExpParameters() |
|
81 | # self.__getExpParameters() | |
82 |
|
82 | |||
83 | self.fileIndex = -1 |
|
83 | self.fileIndex = -1 | |
84 |
|
84 | |||
85 | self.__setNextFileOffline() |
|
85 | self.__setNextFileOffline() | |
86 |
|
86 | |||
87 | self.__readMetadata() |
|
87 | self.__readMetadata() | |
88 |
|
88 | |||
89 | self.blockIndex = 0 |
|
89 | self.blockIndex = 0 | |
90 |
|
90 | |||
91 | return |
|
91 | return | |
92 |
|
92 | |||
93 | def __searchFilesOffline(self, |
|
93 | def __searchFilesOffline(self, | |
94 | path, |
|
94 | path, | |
95 | startDate, |
|
95 | startDate, | |
96 | endDate, |
|
96 | endDate, | |
97 | ext, |
|
97 | ext, | |
98 | startTime=datetime.time(0,0,0), |
|
98 | startTime=datetime.time(0,0,0), | |
99 | endTime=datetime.time(23,59,59), |
|
99 | endTime=datetime.time(23,59,59), | |
100 | walk=True): |
|
100 | walk=True): | |
101 |
|
101 | |||
102 | # self.__setParameters(path, startDate, endDate, startTime, endTime, walk) |
|
102 | # self.__setParameters(path, startDate, endDate, startTime, endTime, walk) | |
103 | # |
|
103 | # | |
104 | # self.__checkPath() |
|
104 | # self.__checkPath() | |
105 | # |
|
105 | # | |
106 | # self.__findDataForDates() |
|
106 | # self.__findDataForDates() | |
107 | # |
|
107 | # | |
108 | # self.__selectDataForTimes() |
|
108 | # self.__selectDataForTimes() | |
109 | # |
|
109 | # | |
110 | # for i in range(len(self.filenameList)): |
|
110 | # for i in range(len(self.filenameList)): | |
111 | # print "%s" %(self.filenameList[i]) |
|
111 | # print "%s" %(self.filenameList[i]) | |
112 |
|
112 | |||
113 | pathList = [] |
|
113 | pathList = [] | |
114 |
|
114 | |||
115 | if not walk: |
|
115 | if not walk: | |
116 | #pathList.append(path) |
|
116 | #pathList.append(path) | |
117 | multi_path = path.split(',') |
|
117 | multi_path = path.split(',') | |
118 | for single_path in multi_path: |
|
118 | for single_path in multi_path: | |
119 | pathList.append(single_path) |
|
119 | pathList.append(single_path) | |
120 |
|
120 | |||
121 | else: |
|
121 | else: | |
122 | #dirList = [] |
|
122 | #dirList = [] | |
123 | multi_path = path.split(',') |
|
123 | multi_path = path.split(',') | |
124 | for single_path in multi_path: |
|
124 | for single_path in multi_path: | |
125 | dirList = [] |
|
125 | dirList = [] | |
126 | for thisPath in os.listdir(single_path): |
|
126 | for thisPath in os.listdir(single_path): | |
127 | if not os.path.isdir(os.path.join(single_path,thisPath)): |
|
127 | if not os.path.isdir(os.path.join(single_path,thisPath)): | |
128 | continue |
|
128 | continue | |
129 | if not isDoyFolder(thisPath): |
|
129 | if not isDoyFolder(thisPath): | |
130 | continue |
|
130 | continue | |
131 |
|
131 | |||
132 | dirList.append(thisPath) |
|
132 | dirList.append(thisPath) | |
133 |
|
133 | |||
134 | if not(dirList): |
|
134 | if not(dirList): | |
135 | return None, None |
|
135 | return None, None | |
136 |
|
136 | |||
137 | thisDate = startDate |
|
137 | thisDate = startDate | |
138 |
|
138 | |||
139 | while(thisDate <= endDate): |
|
139 | while(thisDate <= endDate): | |
140 | year = thisDate.timetuple().tm_year |
|
140 | year = thisDate.timetuple().tm_year | |
141 | doy = thisDate.timetuple().tm_yday |
|
141 | doy = thisDate.timetuple().tm_yday | |
142 |
|
142 | |||
143 | matchlist = fnmatch.filter(dirList, '?' + '%4.4d%3.3d' % (year,doy) + '*') |
|
143 | matchlist = fnmatch.filter(dirList, '?' + '%4.4d%3.3d' % (year,doy) + '*') | |
144 | if len(matchlist) == 0: |
|
144 | if len(matchlist) == 0: | |
145 | thisDate += datetime.timedelta(1) |
|
145 | thisDate += datetime.timedelta(1) | |
146 | continue |
|
146 | continue | |
147 | for match in matchlist: |
|
147 | for match in matchlist: | |
148 | pathList.append(os.path.join(single_path,match)) |
|
148 | pathList.append(os.path.join(single_path,match)) | |
149 |
|
149 | |||
150 | thisDate += datetime.timedelta(1) |
|
150 | thisDate += datetime.timedelta(1) | |
151 |
|
151 | |||
152 | if pathList == []: |
|
152 | if pathList == []: | |
153 | print "Any folder was found for the date range: %s-%s" %(startDate, endDate) |
|
153 | print "Any folder was found for the date range: %s-%s" %(startDate, endDate) | |
154 | return None, None |
|
154 | return None, None | |
155 |
|
155 | |||
156 | print "%d folder(s) was(were) found for the date range: %s - %s" %(len(pathList), startDate, endDate) |
|
156 | print "%d folder(s) was(were) found for the date range: %s - %s" %(len(pathList), startDate, endDate) | |
157 |
|
157 | |||
158 | filenameList = [] |
|
158 | filenameList = [] | |
159 | datetimeList = [] |
|
159 | datetimeList = [] | |
160 | pathDict = {} |
|
160 | pathDict = {} | |
161 | filenameList_to_sort = [] |
|
161 | filenameList_to_sort = [] | |
162 |
|
162 | |||
163 | for i in range(len(pathList)): |
|
163 | for i in range(len(pathList)): | |
164 |
|
164 | |||
165 | thisPath = pathList[i] |
|
165 | thisPath = pathList[i] | |
166 |
|
166 | |||
167 | fileList = glob.glob1(thisPath, "*%s" %ext) |
|
167 | fileList = glob.glob1(thisPath, "*%s" %ext) | |
168 | fileList.sort() |
|
168 | fileList.sort() | |
169 | pathDict.setdefault(fileList[0]) |
|
169 | pathDict.setdefault(fileList[0]) | |
170 | pathDict[fileList[0]] = i |
|
170 | pathDict[fileList[0]] = i | |
171 | filenameList_to_sort.append(fileList[0]) |
|
171 | filenameList_to_sort.append(fileList[0]) | |
172 |
|
172 | |||
173 | filenameList_to_sort.sort() |
|
173 | filenameList_to_sort.sort() | |
174 |
|
174 | |||
175 | for file in filenameList_to_sort: |
|
175 | for file in filenameList_to_sort: | |
176 | thisPath = pathList[pathDict[file]] |
|
176 | thisPath = pathList[pathDict[file]] | |
177 |
|
177 | |||
178 | fileList = glob.glob1(thisPath, "*%s" %ext) |
|
178 | fileList = glob.glob1(thisPath, "*%s" %ext) | |
179 | fileList.sort() |
|
179 | fileList.sort() | |
180 |
|
180 | |||
181 | for file in fileList: |
|
181 | for file in fileList: | |
182 |
|
182 | |||
183 | filename = os.path.join(thisPath,file) |
|
183 | filename = os.path.join(thisPath,file) | |
184 | thisDatetime = self.__isFileinThisTime(filename, startTime, endTime) |
|
184 | thisDatetime = self.__isFileinThisTime(filename, startTime, endTime) | |
185 |
|
185 | |||
186 | if not(thisDatetime): |
|
186 | if not(thisDatetime): | |
187 | continue |
|
187 | continue | |
188 |
|
188 | |||
189 | filenameList.append(filename) |
|
189 | filenameList.append(filename) | |
190 | datetimeList.append(thisDatetime) |
|
190 | datetimeList.append(thisDatetime) | |
191 |
|
191 | |||
192 | if not(filenameList): |
|
192 | if not(filenameList): | |
193 | print "Any file was found for the time range %s - %s" %(startTime, endTime) |
|
193 | print "Any file was found for the time range %s - %s" %(startTime, endTime) | |
194 | return None, None |
|
194 | return None, None | |
195 |
|
195 | |||
196 | print "%d file(s) was(were) found for the time range: %s - %s" %(len(filenameList), startTime, endTime) |
|
196 | print "%d file(s) was(were) found for the time range: %s - %s" %(len(filenameList), startTime, endTime) | |
197 |
|
197 | |||
198 |
|
198 | |||
199 | for i in range(len(filenameList)): |
|
199 | for i in range(len(filenameList)): | |
200 | print "%s -> [%s]" %(filenameList[i], datetimeList[i].ctime()) |
|
200 | print "%s -> [%s]" %(filenameList[i], datetimeList[i].ctime()) | |
201 |
|
201 | |||
202 | self.filenameList = filenameList |
|
202 | self.filenameList = filenameList | |
203 | self.datetimeList = datetimeList |
|
203 | self.datetimeList = datetimeList | |
204 |
|
204 | |||
205 | return pathList, filenameList |
|
205 | return pathList, filenameList | |
206 |
|
206 | |||
207 | def __isFileinThisTime(self, filename, startTime, endTime): |
|
207 | def __isFileinThisTime(self, filename, startTime, endTime): | |
208 | """ |
|
208 | """ | |
209 | Retorna 1 si el archivo de datos se encuentra dentro del rango de horas especificado. |
|
209 | Retorna 1 si el archivo de datos se encuentra dentro del rango de horas especificado. | |
210 |
|
210 | |||
211 | Inputs: |
|
211 | Inputs: | |
212 | filename : nombre completo del archivo de datos en formato Jicamarca (.r) |
|
212 | filename : nombre completo del archivo de datos en formato Jicamarca (.r) | |
213 |
|
213 | |||
214 | startTime : tiempo inicial del rango seleccionado en formato datetime.time |
|
214 | startTime : tiempo inicial del rango seleccionado en formato datetime.time | |
215 |
|
215 | |||
216 | endTime : tiempo final del rango seleccionado en formato datetime.time |
|
216 | endTime : tiempo final del rango seleccionado en formato datetime.time | |
217 |
|
217 | |||
218 | Return: |
|
218 | Return: | |
219 | Boolean : Retorna True si el archivo de datos contiene datos en el rango de |
|
219 | Boolean : Retorna True si el archivo de datos contiene datos en el rango de | |
220 | fecha especificado, de lo contrario retorna False. |
|
220 | fecha especificado, de lo contrario retorna False. | |
221 |
|
221 | |||
222 | Excepciones: |
|
222 | Excepciones: | |
223 | Si el archivo no existe o no puede ser abierto |
|
223 | Si el archivo no existe o no puede ser abierto | |
224 | Si la cabecera no puede ser leida. |
|
224 | Si la cabecera no puede ser leida. | |
225 |
|
225 | |||
226 | """ |
|
226 | """ | |
227 |
|
227 | |||
228 |
|
228 | |||
229 | try: |
|
229 | try: | |
230 | fp = fp = h5py.File(filename,'r') |
|
230 | fp = fp = h5py.File(filename,'r') | |
231 | except IOError: |
|
231 | except IOError: | |
232 | traceback.print_exc() |
|
232 | traceback.print_exc() | |
233 | raise IOError, "The file %s can't be opened" %(filename) |
|
233 | raise IOError, "The file %s can't be opened" %(filename) | |
234 |
|
234 | |||
235 | grp = fp['Data'] |
|
235 | grp = fp['Data'] | |
236 | time = grp['time'] |
|
236 | time = grp['time'] | |
237 | time0 = time[:][0] |
|
237 | time0 = time[:][0] | |
238 |
|
238 | |||
239 | fp.close() |
|
239 | fp.close() | |
240 |
|
240 | |||
241 | thisDatetime = datetime.datetime.utcfromtimestamp(time0) |
|
241 | thisDatetime = datetime.datetime.utcfromtimestamp(time0) | |
242 |
|
242 | |||
243 | if self.timezone == 'lt': |
|
243 | if self.timezone == 'lt': | |
244 | thisDatetime = thisDatetime - datetime.timedelta(minutes = 300) |
|
244 | thisDatetime = thisDatetime - datetime.timedelta(minutes = 300) | |
245 |
|
245 | |||
246 | thisTime = thisDatetime.time() |
|
246 | thisTime = thisDatetime.time() | |
247 |
|
247 | |||
248 | if not ((startTime <= thisTime) and (endTime > thisTime)): |
|
248 | if not ((startTime <= thisTime) and (endTime > thisTime)): | |
249 | return None |
|
249 | return None | |
250 |
|
250 | |||
251 | return thisDatetime |
|
251 | return thisDatetime | |
252 |
|
252 | |||
253 | def __checkPath(self): |
|
253 | def __checkPath(self): | |
254 | if os.path.exists(self.path): |
|
254 | if os.path.exists(self.path): | |
255 | self.status = 1 |
|
255 | self.status = 1 | |
256 | else: |
|
256 | else: | |
257 | self.status = 0 |
|
257 | self.status = 0 | |
258 | print 'Path:%s does not exists'%self.path |
|
258 | print 'Path:%s does not exists'%self.path | |
259 |
|
259 | |||
260 | return |
|
260 | return | |
261 |
|
261 | |||
262 | def __setNextFileOffline(self): |
|
262 | def __setNextFileOffline(self): | |
263 | idFile = self.fileIndex |
|
263 | idFile = self.fileIndex | |
264 | idFile += 1 |
|
264 | idFile += 1 | |
265 |
|
265 | |||
266 | if not(idFile < len(self.filenameList)): |
|
266 | if not(idFile < len(self.filenameList)): | |
267 | self.flagNoMoreFiles = 1 |
|
267 | self.flagNoMoreFiles = 1 | |
268 | print "No more Files" |
|
268 | print "No more Files" | |
269 | return 0 |
|
269 | return 0 | |
270 |
|
270 | |||
271 | filename = self.filenameList[idFile] |
|
271 | filename = self.filenameList[idFile] | |
272 |
|
272 | |||
273 | filePointer = h5py.File(filename,'r') |
|
273 | filePointer = h5py.File(filename,'r') | |
274 |
|
274 | |||
275 | self.flagIsNewFile = 1 |
|
275 | self.flagIsNewFile = 1 | |
276 | self.fileIndex = idFile |
|
276 | self.fileIndex = idFile | |
277 | self.filename = filename |
|
277 | self.filename = filename | |
278 |
|
278 | |||
279 | self.fp = filePointer |
|
279 | self.fp = filePointer | |
280 |
|
280 | |||
281 | print "Setting the file: %s"%self.filename |
|
281 | print "Setting the file: %s"%self.filename | |
282 |
|
282 | |||
283 | self.__readMetadata() |
|
283 | self.__readMetadata() | |
284 |
|
284 | |||
285 | return 1 |
|
285 | return 1 | |
286 |
|
286 | |||
287 | def __readMetadata(self): |
|
287 | def __readMetadata(self): | |
288 | grp = self.fp['Data'] |
|
288 | grp = self.fp['Data'] | |
289 | self.pathMeta = os.path.join(self.path, grp.attrs['metadata']) |
|
289 | self.pathMeta = os.path.join(self.path, grp.attrs['metadata']) | |
290 | filePointer = h5py.File(self.pathMeta,'r') |
|
290 | filePointer = h5py.File(self.pathMeta,'r') | |
291 | groupPointer = filePointer['Metadata'] |
|
291 | groupPointer = filePointer['Metadata'] | |
292 |
|
292 | |||
293 | listMetaname = [] |
|
293 | listMetaname = [] | |
294 | listMetadata = [] |
|
294 | listMetadata = [] | |
295 | for item in groupPointer.items(): |
|
295 | for item in groupPointer.items(): | |
296 | name = item[0] |
|
296 | name = item[0] | |
297 |
|
297 | |||
298 | if name=='data shape': |
|
298 | if name=='data shape': | |
299 | self.nSamples = 1 |
|
299 | self.nSamples = 1 | |
300 | self.nPoints = 1 |
|
300 | self.nPoints = 1 | |
301 | self.nChannels = 1 |
|
301 | self.nChannels = 1 | |
302 | else: |
|
302 | else: | |
303 | data = groupPointer[name][:] |
|
303 | data = groupPointer[name][:] | |
304 | listMetaname.append(name) |
|
304 | listMetaname.append(name) | |
305 | listMetadata.append(data) |
|
305 | listMetadata.append(data) | |
306 |
|
306 | |||
307 | if name=='type': |
|
307 | if name=='type': | |
308 | self.__initDataOut(name) |
|
308 | self.__initDataOut(name) | |
309 |
|
309 | |||
310 | filePointer.close() |
|
310 | filePointer.close() | |
311 |
|
311 | |||
312 | self.listMetadata = listMetaname |
|
312 | self.listMetadata = listMetaname | |
313 | self.listMetadata = listMetadata |
|
313 | self.listMetadata = listMetadata | |
314 |
|
314 | |||
315 | return |
|
315 | return | |
316 |
|
316 | |||
317 | def __initDataOut(self, type): |
|
317 | def __initDataOut(self, type): | |
318 |
|
318 | |||
319 | if 'type'=='Parameters': |
|
319 | if 'type'=='Parameters': | |
320 | self.dataOut = Parameters() |
|
320 | self.dataOut = Parameters() | |
321 | elif 'type'=='Spectra': |
|
321 | elif 'type'=='Spectra': | |
322 | self.dataOut = Spectra() |
|
322 | self.dataOut = Spectra() | |
323 | elif 'type'=='Voltage': |
|
323 | elif 'type'=='Voltage': | |
324 | self.dataOut = Voltage() |
|
324 | self.dataOut = Voltage() | |
325 | elif 'type'=='Correlation': |
|
325 | elif 'type'=='Correlation': | |
326 | self.dataOut = Correlation() |
|
326 | self.dataOut = Correlation() | |
327 |
|
327 | |||
328 | return |
|
328 | return | |
329 |
|
329 | |||
330 | def __setDataOut(self): |
|
330 | def __setDataOut(self): | |
331 | listMetadata = self.listMetadata |
|
331 | listMetadata = self.listMetadata | |
332 | listMetaname = self.listMetaname |
|
332 | listMetaname = self.listMetaname | |
333 | listDataname = self.listDataname |
|
333 | listDataname = self.listDataname | |
334 | listData = self.listData |
|
334 | listData = self.listData | |
335 |
|
335 | |||
336 | blockIndex = self.blockIndex |
|
336 | blockIndex = self.blockIndex | |
337 |
|
337 | |||
338 | for i in range(len(listMetadata)): |
|
338 | for i in range(len(listMetadata)): | |
339 | setattr(self.dataOut,listMetaname[i],listMetadata[i]) |
|
339 | setattr(self.dataOut,listMetaname[i],listMetadata[i]) | |
340 |
|
340 | |||
341 | for j in range(len(listData)): |
|
341 | for j in range(len(listData)): | |
342 | setattr(self.dataOut,listDataname[j][blockIndex,:],listData[j][blockIndex,:]) |
|
342 | setattr(self.dataOut,listDataname[j][blockIndex,:],listData[j][blockIndex,:]) | |
343 |
|
343 | |||
344 | return |
|
344 | return | |
345 |
|
345 | |||
346 | def getData(self): |
|
346 | def getData(self): | |
347 |
|
347 | |||
348 | if self.flagNoMoreFiles: |
|
348 | if self.flagNoMoreFiles: | |
349 | self.dataOut.flagNoData = True |
|
349 | self.dataOut.flagNoData = True | |
350 | print 'Process finished' |
|
350 | print 'Process finished' | |
351 | return 0 |
|
351 | return 0 | |
352 |
|
352 | |||
353 | if self.__hasNotDataInBuffer(): |
|
353 | if self.__hasNotDataInBuffer(): | |
354 | self.__setNextFile() |
|
354 | self.__setNextFile() | |
355 |
|
355 | |||
356 |
|
356 | |||
357 | if self.datablock == None: # setear esta condicion cuando no hayan datos por leers |
|
357 | if self.datablock == None: # setear esta condicion cuando no hayan datos por leers | |
358 | self.dataOut.flagNoData = True |
|
358 | self.dataOut.flagNoData = True | |
359 | return 0 |
|
359 | return 0 | |
360 |
|
360 | |||
361 | self.__setDataOut() |
|
361 | self.__setDataOut() | |
362 | self.dataOut.flagNoData = False |
|
362 | self.dataOut.flagNoData = False | |
363 |
|
363 | |||
364 | self.blockIndex += 1 |
|
364 | self.blockIndex += 1 | |
365 |
|
365 | |||
366 | return self.dataOut.data |
|
366 | return self.dataOut.data | |
367 |
|
367 | |||
368 | def run(self, **kwargs): |
|
368 | def run(self, **kwargs): | |
369 |
|
369 | |||
370 | if not(self.isConfig): |
|
370 | if not(self.isConfig): | |
371 | self.setup(**kwargs) |
|
371 | self.setup(**kwargs) | |
372 | self.setObjProperties() |
|
372 | self.setObjProperties() | |
373 | self.isConfig = True |
|
373 | self.isConfig = True | |
374 |
|
374 | |||
375 | self.getData() |
|
375 | self.getData() | |
376 |
|
376 | |||
377 | return |
|
377 | return | |
378 |
|
378 | |||
379 | class HDF5Writer(Operation): |
|
379 | class HDF5Writer(Operation): | |
380 |
|
380 | |||
381 | ext = ".hdf5" |
|
381 | ext = ".hdf5" | |
382 |
|
382 | |||
383 | optchar = "D" |
|
383 | optchar = "D" | |
384 |
|
384 | |||
385 | metaoptchar = "M" |
|
385 | metaoptchar = "M" | |
386 |
|
386 | |||
387 | metaFile = None |
|
387 | metaFile = None | |
388 |
|
388 | |||
389 | path = None |
|
389 | path = None | |
390 |
|
390 | |||
391 | setFile = None |
|
391 | setFile = None | |
392 |
|
392 | |||
393 | fp = None |
|
393 | fp = None | |
394 |
|
394 | |||
395 | grp = None |
|
395 | grp = None | |
396 |
|
396 | |||
397 | ds = None |
|
397 | ds = None | |
398 |
|
398 | |||
399 | firsttime = True |
|
399 | firsttime = True | |
400 |
|
400 | |||
401 | #Configurations |
|
401 | #Configurations | |
402 |
|
402 | |||
403 | blocksPerFile = None |
|
403 | blocksPerFile = None | |
404 |
|
404 | |||
405 | blockIndex = None |
|
405 | blockIndex = None | |
406 |
|
406 | |||
407 | dataOut = None |
|
407 | dataOut = None | |
408 |
|
408 | |||
409 | #Data Arrays |
|
409 | #Data Arrays | |
410 |
|
410 | |||
411 | dataList = None |
|
411 | dataList = None | |
412 |
|
412 | |||
413 | metadataList = None |
|
413 | metadataList = None | |
414 |
|
414 | |||
415 | dataDim = None |
|
415 | dataDim = None | |
416 |
|
416 | |||
|
417 | tableDim = None | |||
|
418 | ||||
|
419 | dtype = [('arrayName', 'S10'),('nChannels', 'i'), ('nPoints', 'i'), ('nSamples', 'i')] | |||
|
420 | ||||
417 | def __init__(self): |
|
421 | def __init__(self): | |
418 |
|
422 | |||
419 | Operation.__init__(self) |
|
423 | Operation.__init__(self) | |
420 | self.isConfig = False |
|
424 | self.isConfig = False | |
421 | return |
|
425 | return | |
422 |
|
426 | |||
423 |
|
427 | |||
424 | def setup(self, dataOut, **kwargs): |
|
428 | def setup(self, dataOut, **kwargs): | |
425 |
|
429 | |||
426 | self.path = kwargs['path'] |
|
430 | self.path = kwargs['path'] | |
427 |
|
431 | |||
428 | if kwargs.has_key('ext'): |
|
432 | if kwargs.has_key('ext'): | |
429 | self.ext = kwargs['ext'] |
|
433 | self.ext = kwargs['ext'] | |
430 | else: |
|
434 | else: | |
431 | self.blocksPerFile = 10 |
|
435 | self.blocksPerFile = 10 | |
432 |
|
436 | |||
433 | if kwargs.has_key('blocksPerFile'): |
|
437 | if kwargs.has_key('blocksPerFile'): | |
434 | self.blocksPerFile = kwargs['blocksPerFile'] |
|
438 | self.blocksPerFile = kwargs['blocksPerFile'] | |
435 | else: |
|
439 | else: | |
436 | self.blocksPerFile = 10 |
|
440 | self.blocksPerFile = 10 | |
437 |
|
441 | |||
438 | self.dataOut = dataOut |
|
442 | self.dataOut = dataOut | |
439 |
|
443 | |||
440 | self.metadataList = ['inputUnit','abscissaRange','heightRange'] |
|
444 | self.metadataList = ['type','inputUnit','abscissaRange','heightRange'] | |
441 |
|
445 | |||
442 | self.dataList = ['data_param', 'data_error', 'data_SNR'] |
|
446 | self.dataList = ['data_param', 'data_error', 'data_SNR'] | |
443 |
|
447 | |||
444 | self.dataDim = numpy.zeros((len(self.dataList),3)) |
|
448 | self.dataDim = numpy.zeros((len(self.dataList),3)) | |
445 |
|
449 | |||
|
450 | #Data types | |||
|
451 | ||||
|
452 | dtype0 = self.dtype | |||
|
453 | ||||
|
454 | tableList = [] | |||
|
455 | ||||
446 | for i in range(len(self.dataList)): |
|
456 | for i in range(len(self.dataList)): | |
447 |
|
457 | |||
448 | dataDim = getattr(self.dataOut, self.dataList[i]).shape |
|
458 | dataDim = getattr(self.dataOut, self.dataList[i]).shape | |
449 |
|
459 | |||
450 | if len(dataDim) == 3: |
|
460 | if len(dataDim) == 3: | |
451 | self.dataDim[i,:] = numpy.array(dataDim) |
|
461 | self.dataDim[i,:] = numpy.array(dataDim) | |
452 | else: |
|
462 | else: | |
453 |
self.dataDim[i, |
|
463 | self.dataDim[i,0] = numpy.array(dataDim)[0] | |
454 |
self.dataDim[i, |
|
464 | self.dataDim[i,2] = numpy.array(dataDim)[1] | |
|
465 | self.dataDim[i,1] = 1 | |||
455 |
|
466 | |||
|
467 | table = numpy.array((self.dataList[i],) + tuple(self.dataDim[i,:]),dtype = dtype0) | |||
|
468 | tableList.append(table) | |||
|
469 | ||||
|
470 | self.tableDim = numpy.array(tableList, dtype = dtype0) | |||
456 | self.blockIndex = 0 |
|
471 | self.blockIndex = 0 | |
457 |
|
472 | |||
458 | return |
|
473 | return | |
459 |
|
474 | |||
460 | def putMetadata(self): |
|
475 | def putMetadata(self): | |
461 |
|
476 | |||
462 | fp = self.createMetadataFile() |
|
477 | fp = self.createMetadataFile() | |
463 | self.writeMetadata(fp) |
|
478 | self.writeMetadata(fp) | |
464 | fp.close() |
|
479 | fp.close() | |
465 | return |
|
480 | return | |
466 |
|
481 | |||
467 | def createMetadataFile(self): |
|
482 | def createMetadataFile(self): | |
468 | ext = self.ext |
|
483 | ext = self.ext | |
469 | path = self.path |
|
484 | path = self.path | |
470 | setFile = self.setFile |
|
485 | setFile = self.setFile | |
471 |
|
486 | |||
472 | timeTuple = time.localtime(self.dataOut.utctime) |
|
487 | timeTuple = time.localtime(self.dataOut.utctime) | |
473 | subfolder = '' |
|
488 | subfolder = '' | |
474 |
|
489 | |||
475 | fullpath = os.path.join( path, subfolder ) |
|
490 | fullpath = os.path.join( path, subfolder ) | |
476 | if not( os.path.exists(fullpath) ): |
|
491 | if not( os.path.exists(fullpath) ): | |
477 | os.mkdir(fullpath) |
|
492 | os.mkdir(fullpath) | |
478 | setFile = -1 #inicializo mi contador de seteo |
|
493 | setFile = -1 #inicializo mi contador de seteo | |
479 | else: |
|
494 | else: | |
480 | filesList = os.listdir( fullpath ) |
|
495 | filesList = os.listdir( fullpath ) | |
481 | if len( filesList ) > 0: |
|
496 | if len( filesList ) > 0: | |
482 | filesList = sorted( filesList, key=str.lower ) |
|
497 | filesList = sorted( filesList, key=str.lower ) | |
483 | filen = filesList[-1] |
|
498 | filen = filesList[-1] | |
484 | # el filename debera tener el siguiente formato |
|
499 | # el filename debera tener el siguiente formato | |
485 | # 0 1234 567 89A BCDE (hex) |
|
500 | # 0 1234 567 89A BCDE (hex) | |
486 | # x YYYY DDD SSS .ext |
|
501 | # x YYYY DDD SSS .ext | |
487 | if isNumber( filen[8:11] ): |
|
502 | if isNumber( filen[8:11] ): | |
488 | setFile = int( filen[8:11] ) #inicializo mi contador de seteo al seteo del ultimo file |
|
503 | setFile = int( filen[8:11] ) #inicializo mi contador de seteo al seteo del ultimo file | |
489 | else: |
|
504 | else: | |
490 | setFile = -1 |
|
505 | setFile = -1 | |
491 | else: |
|
506 | else: | |
492 | setFile = -1 #inicializo mi contador de seteo |
|
507 | setFile = -1 #inicializo mi contador de seteo | |
493 |
|
508 | |||
494 | setFile += 1 |
|
509 | setFile += 1 | |
495 |
|
510 | |||
496 | file = '%s%4.4d%3.3d%3.3d%s' % (self.metaoptchar, |
|
511 | file = '%s%4.4d%3.3d%3.3d%s' % (self.metaoptchar, | |
497 | timeTuple.tm_year, |
|
512 | timeTuple.tm_year, | |
498 | timeTuple.tm_yday, |
|
513 | timeTuple.tm_yday, | |
499 | setFile, |
|
514 | setFile, | |
500 | ext ) |
|
515 | ext ) | |
501 |
|
516 | |||
502 | filename = os.path.join( path, subfolder, file ) |
|
517 | filename = os.path.join( path, subfolder, file ) | |
503 | self.metaFile = file |
|
518 | self.metaFile = file | |
504 | #Setting HDF5 File |
|
519 | #Setting HDF5 File | |
505 | fp = h5py.File(filename,'w') |
|
520 | fp = h5py.File(filename,'w') | |
506 |
|
521 | |||
507 | return fp |
|
522 | return fp | |
508 |
|
523 | |||
509 | def writeMetadata(self, fp): |
|
524 | def writeMetadata(self, fp): | |
510 |
|
525 | |||
511 | grp = fp.create_group("Metadata") |
|
526 | grp = fp.create_group("Metadata") | |
|
527 | grp.create_dataset('array dimensions', data = self.tableDim, dtype = self.dtype) | |||
512 |
|
528 | |||
513 | for i in range(len(self.metadataList)): |
|
529 | for i in range(len(self.metadataList)): | |
514 | grp.create_dataset(self.metadataList[i], data=getattr(self.dataOut, self.metadataList[i])) |
|
530 | grp.create_dataset(self.metadataList[i], data=getattr(self.dataOut, self.metadataList[i])) | |
515 | return |
|
531 | return | |
516 |
|
532 | |||
517 | def setNextFile(self): |
|
533 | def setNextFile(self): | |
518 |
|
534 | |||
519 | ext = self.ext |
|
535 | ext = self.ext | |
520 | path = self.path |
|
536 | path = self.path | |
521 | setFile = self.setFile |
|
537 | setFile = self.setFile | |
522 |
|
538 | |||
523 | if self.fp != None: |
|
539 | if self.fp != None: | |
524 | self.fp.close() |
|
540 | self.fp.close() | |
525 |
|
541 | |||
526 | timeTuple = time.localtime(self.dataOut.utctime) |
|
542 | timeTuple = time.localtime(self.dataOut.utctime) | |
527 | subfolder = 'd%4.4d%3.3d' % (timeTuple.tm_year,timeTuple.tm_yday) |
|
543 | subfolder = 'd%4.4d%3.3d' % (timeTuple.tm_year,timeTuple.tm_yday) | |
528 |
|
544 | |||
529 | fullpath = os.path.join( path, subfolder ) |
|
545 | fullpath = os.path.join( path, subfolder ) | |
530 | if not( os.path.exists(fullpath) ): |
|
546 | if not( os.path.exists(fullpath) ): | |
531 | os.mkdir(fullpath) |
|
547 | os.mkdir(fullpath) | |
532 | setFile = -1 #inicializo mi contador de seteo |
|
548 | setFile = -1 #inicializo mi contador de seteo | |
533 | else: |
|
549 | else: | |
534 | filesList = os.listdir( fullpath ) |
|
550 | filesList = os.listdir( fullpath ) | |
535 | if len( filesList ) > 0: |
|
551 | if len( filesList ) > 0: | |
536 | filesList = sorted( filesList, key=str.lower ) |
|
552 | filesList = sorted( filesList, key=str.lower ) | |
537 | filen = filesList[-1] |
|
553 | filen = filesList[-1] | |
538 | # el filename debera tener el siguiente formato |
|
554 | # el filename debera tener el siguiente formato | |
539 | # 0 1234 567 89A BCDE (hex) |
|
555 | # 0 1234 567 89A BCDE (hex) | |
540 | # x YYYY DDD SSS .ext |
|
556 | # x YYYY DDD SSS .ext | |
541 | if isNumber( filen[8:11] ): |
|
557 | if isNumber( filen[8:11] ): | |
542 | setFile = int( filen[8:11] ) #inicializo mi contador de seteo al seteo del ultimo file |
|
558 | setFile = int( filen[8:11] ) #inicializo mi contador de seteo al seteo del ultimo file | |
543 | else: |
|
559 | else: | |
544 | setFile = -1 |
|
560 | setFile = -1 | |
545 | else: |
|
561 | else: | |
546 | setFile = -1 #inicializo mi contador de seteo |
|
562 | setFile = -1 #inicializo mi contador de seteo | |
547 |
|
563 | |||
548 | setFile += 1 |
|
564 | setFile += 1 | |
549 |
|
565 | |||
550 | file = '%s%4.4d%3.3d%3.3d%s' % (self.optchar, |
|
566 | file = '%s%4.4d%3.3d%3.3d%s' % (self.optchar, | |
551 | timeTuple.tm_year, |
|
567 | timeTuple.tm_year, | |
552 | timeTuple.tm_yday, |
|
568 | timeTuple.tm_yday, | |
553 | setFile, |
|
569 | setFile, | |
554 | ext ) |
|
570 | ext ) | |
555 |
|
571 | |||
556 | filename = os.path.join( path, subfolder, file ) |
|
572 | filename = os.path.join( path, subfolder, file ) | |
557 |
|
573 | |||
558 | #Setting HDF5 File |
|
574 | #Setting HDF5 File | |
559 | fp = h5py.File(filename,'w') |
|
575 | fp = h5py.File(filename,'w') | |
560 | grp = fp.create_group("Data") |
|
576 | grp = fp.create_group("Data") | |
561 | grp.attrs['metadata'] = self.metaFile |
|
577 | grp.attrs['metadata'] = self.metaFile | |
562 |
|
578 | |||
563 |
|
579 | grp['blocksPerFile'] = 0 | ||
564 |
|
580 | |||
565 | ds = [] |
|
581 | ds = [] | |
566 | data = [] |
|
582 | data = [] | |
567 |
|
583 | |||
568 | for i in range(len(self.dataList)): |
|
584 | for i in range(len(self.dataList)): | |
569 |
|
585 | |||
570 | grp0 = grp.create_group(self.dataList[i]) |
|
586 | grp0 = grp.create_group(self.dataList[i]) | |
571 |
|
587 | |||
572 | for j in range(int(self.dataDim[i,0])): |
|
588 | for j in range(int(self.dataDim[i,0])): | |
573 | tableName = "channel" + str(j) |
|
589 | tableName = "channel" + str(j) | |
574 |
|
590 | |||
575 |
if not |
|
591 | if not(self.dataDim[i,1] == 1): | |
576 | ds0 = grp0.create_dataset(tableName, (1,1,1) , chunks = True) |
|
592 | ds0 = grp0.create_dataset(tableName, (1,1,1) , chunks = True) | |
577 | else: |
|
593 | else: | |
578 | ds0 = grp0.create_dataset(tableName, (1,1) , chunks = True) |
|
594 | ds0 = grp0.create_dataset(tableName, (1,1) , chunks = True) | |
579 |
|
595 | |||
580 | ds.append(ds0) |
|
596 | ds.append(ds0) | |
581 | data.append([]) |
|
597 | data.append([]) | |
582 |
|
598 | |||
583 | ds0 = grp.create_dataset("time", (1,) , chunks = True) |
|
599 | ds0 = grp.create_dataset("time", (1,) , chunks = True) | |
584 | ds.append(ds0) |
|
600 | ds.append(ds0) | |
585 | data.append([]) |
|
601 | data.append([]) | |
586 |
|
602 | |||
587 | #Saving variables |
|
603 | #Saving variables | |
588 | print 'Writing the file: %s'%filename |
|
604 | print 'Writing the file: %s'%filename | |
589 | self.fp = fp |
|
605 | self.fp = fp | |
590 | self.grp = grp |
|
606 | self.grp = grp | |
591 | self.ds = ds |
|
607 | self.ds = ds | |
592 | self.data = data |
|
608 | self.data = data | |
593 |
|
609 | |||
594 | self.setFile = setFile |
|
610 | self.setFile = setFile | |
595 | self.firsttime = True |
|
611 | self.firsttime = True | |
596 | self.blockIndex = 0 |
|
612 | self.blockIndex = 0 | |
597 | return |
|
613 | return | |
598 |
|
614 | |||
599 | def putData(self): |
|
615 | def putData(self): | |
600 | self.setBlock() |
|
616 | self.setBlock() | |
601 | self.writeBlock() |
|
617 | self.writeBlock() | |
602 |
|
618 | |||
603 | if self.blockIndex == self.blocksPerFile: |
|
619 | if self.blockIndex == self.blocksPerFile: | |
604 | self.setNextFile() |
|
620 | self.setNextFile() | |
605 | return |
|
621 | return | |
606 |
|
622 | |||
607 | def setBlock(self): |
|
623 | def setBlock(self): | |
|
624 | ''' | |||
|
625 | data Array configured | |||
608 |
|
|
626 | ||
|
627 | ''' | |||
609 | #Creating Arrays |
|
628 | #Creating Arrays | |
610 | data = self.data |
|
629 | data = self.data | |
611 | ind = 0 |
|
630 | ind = 0 | |
612 | for i in range(len(self.dataList)): |
|
631 | for i in range(len(self.dataList)): | |
613 | dataAux = getattr(self.dataOut,self.dataList[i]) |
|
632 | dataAux = getattr(self.dataOut,self.dataList[i]) | |
614 |
|
633 | |||
615 | for j in range(int(self.dataDim[i,0])): |
|
634 | for j in range(int(self.dataDim[i,0])): | |
616 | data[ind] = dataAux[j,:] |
|
635 | data[ind] = dataAux[j,:] | |
617 | if not(numpy.isnan(self.dataDim[i,2])): |
|
636 | ||
|
637 | if not(self.dataDim[i,1] == 1): | |||
618 | data[ind] = data[ind].reshape((data[ind].shape[0],data[ind].shape[1],1)) |
|
638 | data[ind] = data[ind].reshape((data[ind].shape[0],data[ind].shape[1],1)) | |
619 | if not self.firsttime: |
|
639 | if not self.firsttime: | |
620 | data[ind] = numpy.dstack((self.ds[ind][:], data[ind])) |
|
640 | data[ind] = numpy.dstack((self.ds[ind][:], data[ind])) | |
621 | else: |
|
641 | else: | |
622 | data[ind] = data[ind].reshape((1,data[ind].shape[0])) |
|
642 | data[ind] = data[ind].reshape((1,data[ind].shape[0])) | |
623 | if not self.firsttime: |
|
643 | if not self.firsttime: | |
624 | data[ind] = numpy.vstack((self.ds[ind][:], data[ind])) |
|
644 | data[ind] = numpy.vstack((self.ds[ind][:], data[ind])) | |
625 | ind += 1 |
|
645 | ind += 1 | |
626 |
|
646 | |||
627 | data[ind] = numpy.array([self.dataOut.utctime]) |
|
647 | data[ind] = numpy.array([self.dataOut.utctime]) | |
628 | if not self.firsttime: |
|
648 | if not self.firsttime: | |
629 | self.data[ind] = numpy.hstack((self.ds[ind][:], self.data[ind])) |
|
649 | self.data[ind] = numpy.hstack((self.ds[ind][:], self.data[ind])) | |
630 | self.data = data |
|
650 | self.data = data | |
631 |
|
651 | |||
632 | return |
|
652 | return | |
633 |
|
653 | |||
634 | def writeBlock(self): |
|
654 | def writeBlock(self): | |
635 |
|
655 | ''' | ||
|
656 | Saves the block in the HDF5 file | |||
|
657 | ''' | |||
636 | for i in range(len(self.ds)): |
|
658 | for i in range(len(self.ds)): | |
637 | self.ds[i].shape = self.data[i].shape |
|
659 | self.ds[i].shape = self.data[i].shape | |
638 | self.ds[i][:] = self.data[i] |
|
660 | self.ds[i][:] = self.data[i] | |
639 |
|
661 | |||
640 | self.blockIndex += 1 |
|
662 | self.blockIndex += 1 | |
641 |
|
663 | |||
642 |
self.grp |
|
664 | self.grp.attrs.modify('blocksPerFile', self.blockIndex) | |
643 |
|
665 | |||
644 | self.firsttime = False |
|
666 | self.firsttime = False | |
645 | return |
|
667 | return | |
646 |
|
668 | |||
647 | def run(self, dataOut, **kwargs): |
|
669 | def run(self, dataOut, **kwargs): | |
648 | if not(self.isConfig): |
|
670 | if not(self.isConfig): | |
649 | self.setup(dataOut, **kwargs) |
|
671 | self.setup(dataOut, **kwargs) | |
650 | self.isConfig = True |
|
672 | self.isConfig = True | |
651 | self.putMetadata() |
|
673 | self.putMetadata() | |
652 | self.setNextFile() |
|
674 | self.setNextFile() | |
653 |
|
675 | |||
654 | self.putData() |
|
676 | self.putData() | |
655 | return |
|
677 | return | |
656 |
|
678 |
General Comments 0
You need to be logged in to leave comments.
Login now