@@ -1,763 +1,1047 | |||
|
1 | 1 | ''' |
|
2 | 2 | |
|
3 | 3 | $Author$ |
|
4 | 4 | $Id$ |
|
5 | 5 | ''' |
|
6 | 6 | |
|
7 | 7 | import os, sys |
|
8 | 8 | import glob |
|
9 | 9 | import time |
|
10 | 10 | import numpy |
|
11 | 11 | import fnmatch |
|
12 | 12 | import time, datetime |
|
13 | 13 | |
|
14 | 14 | path = os.path.split(os.getcwd())[0] |
|
15 | 15 | sys.path.append(path) |
|
16 | 16 | |
|
17 | 17 | from JROHeaderIO import * |
|
18 | 18 | from Data.JROData import JROData |
|
19 | 19 | |
|
20 | 20 | def isNumber(str): |
|
21 | 21 | """ |
|
22 | 22 | Chequea si el conjunto de caracteres que componen un string puede ser convertidos a un numero. |
|
23 | 23 | |
|
24 | 24 | Excepciones: |
|
25 | 25 | Si un determinado string no puede ser convertido a numero |
|
26 | 26 | Input: |
|
27 | 27 | str, string al cual se le analiza para determinar si convertible a un numero o no |
|
28 | 28 | |
|
29 | 29 | Return: |
|
30 | 30 | True : si el string es uno numerico |
|
31 | 31 | False : no es un string numerico |
|
32 | 32 | """ |
|
33 | 33 | try: |
|
34 | 34 | float( str ) |
|
35 | 35 | return True |
|
36 | 36 | except: |
|
37 | 37 | return False |
|
38 | 38 | |
|
39 | 39 | def isThisFileinRange(filename, startUTSeconds, endUTSeconds): |
|
40 | 40 | """ |
|
41 | 41 | Esta funcion determina si un archivo de datos se encuentra o no dentro del rango de fecha especificado. |
|
42 | 42 | |
|
43 | 43 | Inputs: |
|
44 | 44 | filename : nombre completo del archivo de datos en formato Jicamarca (.r) |
|
45 | 45 | |
|
46 | 46 | startUTSeconds : fecha inicial del rango seleccionado. La fecha esta dada en |
|
47 | 47 | segundos contados desde 01/01/1970. |
|
48 | 48 | endUTSeconds : fecha final del rango seleccionado. La fecha esta dada en |
|
49 | 49 | segundos contados desde 01/01/1970. |
|
50 | 50 | |
|
51 | 51 | Return: |
|
52 | 52 | Boolean : Retorna True si el archivo de datos contiene datos en el rango de |
|
53 | 53 | fecha especificado, de lo contrario retorna False. |
|
54 | 54 | |
|
55 | 55 | Excepciones: |
|
56 | 56 | Si el archivo no existe o no puede ser abierto |
|
57 | 57 | Si la cabecera no puede ser leida. |
|
58 | 58 | |
|
59 | 59 | """ |
|
60 | 60 | basicHeaderObj = BasicHeader() |
|
61 | 61 | |
|
62 | 62 | try: |
|
63 | 63 | fp = open(filename,'rb') |
|
64 | 64 | except: |
|
65 | 65 | raise IOError, "The file %s can't be opened" %(filename) |
|
66 | 66 | |
|
67 | 67 | sts = basicHeaderObj.read(fp) |
|
68 | 68 | fp.close() |
|
69 | 69 | |
|
70 | 70 | if not(sts): |
|
71 | 71 | print "Skipping the file %s because it has not a valid header" %(filename) |
|
72 | 72 | return 0 |
|
73 | 73 | |
|
74 | 74 | if not ((startUTSeconds <= basicHeaderObj.utc) and (endUTSeconds > basicHeaderObj.utc)): |
|
75 | 75 | return 0 |
|
76 | 76 | |
|
77 | 77 | return 1 |
|
78 | 78 | |
|
79 | def getlastFileFromPath(path, ext): | |
|
80 | """ | |
|
81 | Depura el fileList dejando solo los que cumplan el formato de "PYYYYDDDSSS.ext" | |
|
82 | al final de la depuracion devuelve el ultimo file de la lista que quedo. | |
|
83 | ||
|
84 | Input: | |
|
85 | fileList : lista conteniendo todos los files (sin path) que componen una determinada carpeta | |
|
86 | ext : extension de los files contenidos en una carpeta | |
|
87 | ||
|
88 | Return: | |
|
89 | El ultimo file de una determinada carpeta, no se considera el path. | |
|
90 | """ | |
|
91 | validFilelist = [] | |
|
92 | fileList = os.listdir(path) | |
|
93 | ||
|
94 | # 0 1234 567 89A BCDE | |
|
95 | # H YYYY DDD SSS .ext | |
|
96 | ||
|
97 | for file in fileList: | |
|
98 | try: | |
|
99 | year = int(file[1:5]) | |
|
100 | doy = int(file[5:8]) | |
|
101 | ||
|
102 | if (os.path.splitext(file)[-1].upper() != ext.upper()) : continue | |
|
103 | except: | |
|
104 | continue | |
|
105 | ||
|
106 | validFilelist.append(file) | |
|
79 | 107 | |
|
108 | if validFilelist: | |
|
109 | validFilelist = sorted( validFilelist, key=str.lower ) | |
|
110 | return validFilelist[-1] | |
|
80 | 111 | |
|
112 | return None | |
|
113 | ||
|
114 | def checkForRealPath(path, year, doy, set, ext): | |
|
115 | """ | |
|
116 | Por ser Linux Case Sensitive entonces checkForRealPath encuentra el nombre correcto de un path, | |
|
117 | Prueba por varias combinaciones de nombres entre mayusculas y minusculas para determinar | |
|
118 | el path exacto de un determinado file. | |
|
119 | ||
|
120 | Example : | |
|
121 | nombre correcto del file es .../.../D2009307/P2009307367.ext | |
|
122 | ||
|
123 | Entonces la funcion prueba con las siguientes combinaciones | |
|
124 | .../.../x2009307/y2009307367.ext | |
|
125 | .../.../x2009307/Y2009307367.ext | |
|
126 | .../.../X2009307/y2009307367.ext | |
|
127 | .../.../X2009307/Y2009307367.ext | |
|
128 | siendo para este caso, la ultima combinacion de letras, identica al file buscado | |
|
129 | ||
|
130 | Return: | |
|
131 | Si encuentra la cobinacion adecuada devuelve el path completo y el nombre del file | |
|
132 | caso contrario devuelve None como path y el la ultima combinacion de nombre en mayusculas | |
|
133 | para el filename | |
|
134 | """ | |
|
135 | filepath = None | |
|
136 | find_flag = False | |
|
137 | filename = None | |
|
138 | ||
|
139 | if ext.lower() == ".r": #voltage | |
|
140 | header1 = "dD" | |
|
141 | header2 = "dD" | |
|
142 | elif ext.lower() == ".pdata": #spectra | |
|
143 | header1 = "dD" | |
|
144 | header2 = "pP" | |
|
145 | else: | |
|
146 | return None, filename | |
|
147 | ||
|
148 | for dir in header1: #barrido por las dos combinaciones posibles de "D" | |
|
149 | for fil in header2: #barrido por las dos combinaciones posibles de "D" | |
|
150 | doypath = "%s%04d%03d" % ( dir, year, doy ) #formo el nombre del directorio xYYYYDDD (x=d o x=D) | |
|
151 | filename = "%s%04d%03d%03d%s" % ( fil, year, doy, set, ext ) #formo el nombre del file xYYYYDDDSSS.ext | |
|
152 | filepath = os.path.join( path, doypath, filename ) #formo el path completo | |
|
153 | if os.path.exists( filepath ): #verifico que exista | |
|
154 | find_flag = True | |
|
155 | break | |
|
156 | if find_flag: | |
|
157 | break | |
|
158 | ||
|
159 | if not(find_flag): | |
|
160 | return None, filename | |
|
161 | ||
|
162 | return filepath, filename | |
|
81 | 163 | |
|
82 | 164 | class JRODataIO: |
|
83 | 165 | |
|
84 | 166 | c = 3E8 |
|
85 | 167 | |
|
86 | 168 | basicHeaderObj = BasicHeader() |
|
87 | 169 | |
|
88 | 170 | systemHeaderObj = SystemHeader() |
|
89 | 171 | |
|
90 | 172 | radarControllerHeaderObj = RadarControllerHeader() |
|
91 | 173 | |
|
92 | 174 | processingHeaderObj = ProcessingHeader() |
|
93 | 175 | |
|
94 | 176 | online = 0 |
|
95 | 177 | |
|
96 | 178 | dtype = None |
|
97 | 179 | |
|
98 | 180 | pathList = [] |
|
99 | 181 | |
|
100 | 182 | filenameList = [] |
|
101 | 183 | |
|
102 | 184 | filename = None |
|
103 | 185 | |
|
104 | 186 | ext = None |
|
105 | 187 | |
|
106 | 188 | flagNoMoreFiles = 0 |
|
107 | 189 | |
|
108 | 190 | flagIsNewFile = 1 |
|
109 | 191 | |
|
110 | 192 | flagTimeBlock = 0 |
|
111 | 193 | |
|
112 | 194 | flagIsNewBlock = 0 |
|
113 | 195 | |
|
114 | 196 | fp = None |
|
115 | 197 | |
|
116 | 198 | firstHeaderSize = 0 |
|
117 | 199 | |
|
118 | 200 | basicHeaderSize = 24 |
|
119 | 201 | |
|
120 | 202 | versionFile = 1103 |
|
121 | 203 | |
|
122 | 204 | fileSize = None |
|
123 | 205 | |
|
124 | 206 | ippSeconds = None |
|
125 | 207 | |
|
126 | 208 | fileSizeByHeader = None |
|
127 | 209 | |
|
128 | 210 | fileIndex = None |
|
129 | 211 | |
|
130 | 212 | profileIndex = None |
|
131 | 213 | |
|
132 | 214 | blockIndex = None |
|
133 | 215 | |
|
134 | 216 | nTotalBlocks = None |
|
135 | 217 | |
|
136 | 218 | maxTimeStep = 30 |
|
137 | 219 | |
|
138 | 220 | lastUTTime = None |
|
139 | 221 | |
|
140 | 222 | datablock = None |
|
141 | 223 | |
|
142 | 224 | dataOutObj = None |
|
143 | 225 | |
|
144 | 226 | blocksize = None |
|
145 | 227 | |
|
146 | 228 | def __init__(self): |
|
147 | 229 | pass |
|
148 | 230 | |
|
149 | 231 | class JRODataReader(JRODataIO): |
|
150 | 232 | |
|
151 | 233 | nReadBlocks = 0 |
|
152 | 234 | |
|
235 | delay = 60 #number of seconds waiting a new file | |
|
236 | ||
|
237 | nTries = 3 #quantity tries | |
|
238 | ||
|
239 | nFiles = 3 #number of files for searching | |
|
240 | ||
|
241 | ||
|
153 | 242 | def __init__(self): |
|
154 | 243 | |
|
155 | 244 | pass |
|
156 | 245 | |
|
157 | 246 | def createObjByDefault(self): |
|
158 | 247 | """ |
|
159 | 248 | |
|
160 | 249 | """ |
|
161 | 250 | raise ValueError, "This method has not been implemented" |
|
162 | 251 | |
|
163 | 252 | def getBlockDimension(self): |
|
164 | 253 | |
|
165 | 254 | raise ValueError, "No implemented" |
|
166 | 255 | |
|
167 | 256 | def __searchFilesOffLine(self, |
|
168 | 257 | path, |
|
169 | 258 | startDate, |
|
170 | 259 | endDate, |
|
171 | 260 | startTime=datetime.time(0,0,0), |
|
172 | 261 | endTime=datetime.time(23,59,59), |
|
173 | 262 | set=None, |
|
174 | 263 | expLabel="", |
|
175 | 264 | ext=".r"): |
|
176 | 265 | dirList = [] |
|
177 | 266 | for thisPath in os.listdir(path): |
|
178 | 267 | if os.path.isdir(os.path.join(path,thisPath)): |
|
179 | 268 | dirList.append(thisPath) |
|
180 | 269 | |
|
181 | 270 | if not(dirList): |
|
182 | 271 | return None, None |
|
183 | 272 | |
|
184 | 273 | pathList = [] |
|
185 | 274 | dateList = [] |
|
186 | 275 | |
|
187 | 276 | thisDate = startDate |
|
188 | 277 | |
|
189 | 278 | while(thisDate <= endDate): |
|
190 | 279 | year = thisDate.timetuple().tm_year |
|
191 | 280 | doy = thisDate.timetuple().tm_yday |
|
192 | 281 | |
|
193 | 282 | match = fnmatch.filter(dirList, '?' + '%4.4d%3.3d' % (year,doy)) |
|
194 | 283 | if len(match) == 0: |
|
195 | 284 | thisDate += datetime.timedelta(1) |
|
196 | 285 | continue |
|
197 | 286 | |
|
198 | 287 | pathList.append(os.path.join(path,match[0],expLabel)) |
|
199 | 288 | dateList.append(thisDate) |
|
200 | 289 | thisDate += datetime.timedelta(1) |
|
201 | 290 | |
|
202 | 291 | filenameList = [] |
|
203 | 292 | for index in range(len(pathList)): |
|
204 | 293 | |
|
205 | 294 | thisPath = pathList[index] |
|
206 | 295 | fileList = glob.glob1(thisPath, "*%s" %ext) |
|
207 | 296 | fileList.sort() |
|
208 | 297 | |
|
209 | 298 | #Busqueda de datos en el rango de horas indicados |
|
210 | 299 | thisDate = dateList[index] |
|
211 | 300 | startDT = datetime.datetime.combine(thisDate, startTime) |
|
212 | 301 | endDT = datetime.datetime.combine(thisDate, endTime) |
|
213 | 302 | |
|
214 | 303 | startUtSeconds = time.mktime(startDT.timetuple()) |
|
215 | 304 | endUtSeconds = time.mktime(endDT.timetuple()) |
|
216 | 305 | |
|
217 | 306 | for file in fileList: |
|
218 | 307 | |
|
219 | 308 | filename = os.path.join(thisPath,file) |
|
220 | 309 | |
|
221 | 310 | if isThisFileinRange(filename, startUtSeconds, endUtSeconds): |
|
222 | 311 | filenameList.append(filename) |
|
223 | 312 | |
|
224 | 313 | if not(filenameList): |
|
225 | 314 | return None, None |
|
226 | 315 | |
|
227 | 316 | self.filenameList = filenameList |
|
228 | 317 | |
|
229 | 318 | return pathList, filenameList |
|
319 | ||
|
320 | def __searchFilesOnLine(self, path, startDate=None, endDate=None, startTime=None, endTime=None, expLabel = "", ext = None): | |
|
321 | ||
|
322 | """ | |
|
323 | Busca el ultimo archivo de la ultima carpeta (determinada o no por startDateTime) y | |
|
324 | devuelve el archivo encontrado ademas de otros datos. | |
|
325 | ||
|
326 | Input: | |
|
327 | path : carpeta donde estan contenidos los files que contiene data | |
|
328 | ||
|
329 | startDate : Fecha inicial. Rechaza todos los directorios donde | |
|
330 | file end time < startDate (obejto datetime.date) | |
|
331 | ||
|
332 | endDate : Fecha final. Rechaza todos los directorios donde | |
|
333 | file start time > endDate (obejto datetime.date) | |
|
334 | ||
|
335 | startTime : Tiempo inicial. Rechaza todos los archivos donde | |
|
336 | file end time < startTime (obejto datetime.time) | |
|
337 | ||
|
338 | endTime : Tiempo final. Rechaza todos los archivos donde | |
|
339 | file start time > endTime (obejto datetime.time) | |
|
340 | ||
|
341 | expLabel : Nombre del subexperimento (subfolder) | |
|
342 | ||
|
343 | ext : extension de los files | |
|
230 | 344 |
|
|
345 | Return: | |
|
346 | directory : eL directorio donde esta el file encontrado | |
|
347 | filename : el ultimo file de una determinada carpeta | |
|
348 | year : el anho | |
|
349 | doy : el numero de dia del anho | |
|
350 | set : el set del archivo | |
|
351 | ||
|
352 | ||
|
353 | """ | |
|
354 | dirList = [] | |
|
355 | pathList = [] | |
|
356 | directory = None | |
|
357 | ||
|
358 | #Filtra solo los directorios | |
|
359 | for thisPath in os.listdir(path): | |
|
360 | if os.path.isdir(os.path.join(path, thisPath)): | |
|
361 | dirList.append(thisPath) | |
|
362 | ||
|
363 | if not(dirList): | |
|
364 | return None, None, None, None, None | |
|
365 | ||
|
366 | dirList = sorted( dirList, key=str.lower ) | |
|
367 | ||
|
368 | if startDate: | |
|
369 | startDateTime = datetime.datetime.combine(startDate, startTime) | |
|
370 | thisDateTime = startDateTime | |
|
371 | if endDate == None: endDateTime = startDateTime | |
|
372 | else: endDateTime = datetime.datetime.combine(endDate, endTime) | |
|
373 | ||
|
374 | while(thisDateTime <= endDateTime): | |
|
375 | year = thisDateTime.timetuple().tm_year | |
|
376 | doy = thisDateTime.timetuple().tm_yday | |
|
377 | ||
|
378 | match = fnmatch.filter(dirList, '?' + '%4.4d%3.3d' % (year,doy)) | |
|
379 | if len(match) == 0: | |
|
380 | thisDateTime += datetime.timedelta(1) | |
|
381 | continue | |
|
382 | ||
|
383 | pathList.append(os.path.join(path,match[0], expLabel)) | |
|
384 | thisDateTime += datetime.timedelta(1) | |
|
385 | ||
|
386 | if not(pathList): | |
|
387 | print "\tNo files in range: %s - %s" %(startDateTime.ctime(), endDateTime.ctime()) | |
|
388 | return None, None, None, None, None | |
|
389 | ||
|
390 | directory = pathList[0] | |
|
391 | ||
|
392 | else: | |
|
393 | directory = dirList[-1] | |
|
394 | directory = os.path.join(path,directory) | |
|
395 | ||
|
396 | filename = getlastFileFromPath(directory, ext) | |
|
397 | ||
|
398 | if not(filename): | |
|
399 | return None, None, None, None, None | |
|
400 | ||
|
401 | if not(self.__verifyFile(os.path.join(directory, filename))): | |
|
402 | return None, None, None, None, None | |
|
403 | ||
|
404 | year = int( filename[1:5] ) | |
|
405 | doy = int( filename[5:8] ) | |
|
406 | set = int( filename[8:11] ) | |
|
407 | ||
|
408 | return directory, filename, year, doy, set | |
|
409 | ||
|
231 | 410 | def setup(self,dataOutObj=None, |
|
232 | 411 | path=None, |
|
233 | 412 | startDate=None, |
|
234 | 413 | endDate=None, |
|
235 | 414 | startTime=datetime.time(0,0,0), |
|
236 | 415 | endTime=datetime.time(23,59,59), |
|
237 | 416 | set=0, |
|
238 | 417 | expLabel = "", |
|
239 | 418 | ext = None, |
|
240 |
online = |
|
|
419 | online = False, | |
|
420 | delay = 60): | |
|
241 | 421 | |
|
242 | 422 | if path == None: |
|
243 | 423 | raise ValueError, "The path is not valid" |
|
244 | 424 | |
|
245 | 425 | if ext == None: |
|
246 | 426 | ext = self.ext |
|
247 | 427 | |
|
248 | 428 | if dataOutObj == None: |
|
249 | 429 | dataOutObj = self.createObjByDefault() |
|
250 | 430 | |
|
251 | 431 | self.dataOutObj = dataOutObj |
|
252 | 432 | |
|
253 | 433 | if online: |
|
254 | pass | |
|
434 | print "Searching files in online mode..." | |
|
435 | doypath, file, year, doy, set = self.__searchFilesOnLine(path=path, expLabel=expLabel, ext=ext) | |
|
436 | ||
|
437 | if not(doypath): | |
|
438 | for nTries in range( self.nTries ): | |
|
439 | print '\tWaiting %0.2f sec for an valid file in %s: try %02d ...' % (self.delay, path, nTries+1) | |
|
440 | time.sleep( self.delay ) | |
|
441 | doypath, file, year, doy, set = self.__searchFilesOnLine(path=path, expLabel=expLabel, ext=exp) | |
|
442 | if doypath: | |
|
443 | break | |
|
444 | ||
|
445 | if not(doypath): | |
|
446 | print "There 'isn't valied files in %s" % path | |
|
447 | return None | |
|
448 | ||
|
449 | self.year = year | |
|
450 | self.doy = doy | |
|
451 | self.set = set - 1 | |
|
452 | self.path = path | |
|
255 | 453 | |
|
256 | 454 | else: |
|
257 | 455 | print "Searching files in offline mode ..." |
|
258 | 456 | pathList, filenameList = self.__searchFilesOffLine(path, startDate, endDate, startTime, endTime, set, expLabel, ext) |
|
259 | 457 | |
|
260 | 458 | if not(pathList): |
|
261 | 459 | print "No *%s files into the folder %s \nfor the range: %s - %s"%(ext, path, |
|
262 | 460 | datetime.datetime.combine(startDate,startTime).ctime(), |
|
263 | 461 | datetime.datetime.combine(endDate,endTime).ctime()) |
|
264 | 462 | |
|
265 | 463 | sys.exit(-1) |
|
266 | 464 | |
|
267 | 465 | |
|
268 | 466 | self.fileIndex = -1 |
|
269 | 467 | self.pathList = pathList |
|
270 | 468 | self.filenameList = filenameList |
|
271 | 469 | |
|
272 | 470 | self.online = online |
|
471 | self.delay = delay | |
|
273 | 472 | ext = ext.lower() |
|
274 | 473 | self.ext = ext |
|
275 | 474 | |
|
276 | 475 | if not(self.setNextFile()): |
|
277 | 476 | if (startDate!=None) and (endDate!=None): |
|
278 | 477 | print "No files in range: %s - %s" %(datetime.datetime.combine(startDate,startTime).ctime(), datetime.datetime.combine(endDate,endTime).ctime()) |
|
279 | 478 | elif startDate != None: |
|
280 | 479 | print "No files in range: %s" %(datetime.datetime.combine(startDate,startTime).ctime()) |
|
281 | 480 | else: |
|
282 | 481 | print "No files" |
|
283 | 482 | |
|
284 | 483 | sys.exit(-1) |
|
285 | 484 | |
|
286 | 485 | # self.updateDataHeader() |
|
287 | 486 | |
|
288 | 487 | return self.dataOutObj |
|
289 | 488 | |
|
290 | 489 | def __setNextFileOffline(self): |
|
490 | ||
|
291 | 491 | idFile = self.fileIndex |
|
292 | 492 | |
|
293 | 493 | while (True): |
|
294 | 494 | idFile += 1 |
|
295 | 495 | if not(idFile < len(self.filenameList)): |
|
296 | 496 | self.flagNoMoreFiles = 1 |
|
297 | 497 | print "No more Files" |
|
298 | 498 | return 0 |
|
299 | 499 | |
|
300 | 500 | filename = self.filenameList[idFile] |
|
301 | 501 | |
|
302 | 502 | if not(self.__verifyFile(filename)): |
|
303 | 503 | continue |
|
304 | 504 | |
|
305 | 505 | fileSize = os.path.getsize(filename) |
|
306 | 506 | fp = open(filename,'rb') |
|
307 | 507 | break |
|
308 | 508 | |
|
309 | 509 | self.flagIsNewFile = 1 |
|
310 | 510 | self.fileIndex = idFile |
|
311 | 511 | self.filename = filename |
|
312 | 512 | self.fileSize = fileSize |
|
313 | 513 | self.fp = fp |
|
314 | 514 | |
|
315 | 515 | print "Setting the file: %s"%self.filename |
|
316 | 516 | |
|
317 | 517 | return 1 |
|
318 | 518 | |
|
519 | def __setNextFileOnline(self): | |
|
520 | """ | |
|
521 | Busca el siguiente file que tenga suficiente data para ser leida, dentro de un folder especifico, si | |
|
522 | no encuentra un file valido espera un tiempo determinado y luego busca en los posibles n files | |
|
523 | siguientes. | |
|
524 | ||
|
525 | Affected: | |
|
526 | self.flagIsNewFile | |
|
527 | self.filename | |
|
528 | self.fileSize | |
|
529 | self.fp | |
|
530 | self.set | |
|
531 | self.flagNoMoreFiles | |
|
532 | ||
|
533 | Return: | |
|
534 | 0 : si luego de una busqueda del siguiente file valido este no pudo ser encontrado | |
|
535 | 1 : si el file fue abierto con exito y esta listo a ser leido | |
|
536 | ||
|
537 | Excepciones: | |
|
538 | Si un determinado file no puede ser abierto | |
|
539 | """ | |
|
540 | nFiles = 0 | |
|
541 | fileOk_flag = False | |
|
542 | firstTime_flag = True | |
|
543 | ||
|
544 | self.set += 1 | |
|
545 | ||
|
546 | #busca el 1er file disponible | |
|
547 | file, filename = checkForRealPath( self.path, self.year, self.doy, self.set, self.ext ) | |
|
548 | if file: | |
|
549 | if self.__verifyFile(file, False): | |
|
550 | fileOk_flag = True | |
|
551 | ||
|
552 | #si no encuentra un file entonces espera y vuelve a buscar | |
|
553 | if not(fileOk_flag): | |
|
554 | for nFiles in range(self.nFiles+1): #busco en los siguientes self.nFiles+1 files posibles | |
|
555 | ||
|
556 | if firstTime_flag: #si es la 1era vez entonces hace el for self.nTries veces | |
|
557 | tries = self.nTries | |
|
558 | else: | |
|
559 | tries = 1 #si no es la 1era vez entonces solo lo hace una vez | |
|
560 | ||
|
561 | for nTries in range( tries ): | |
|
562 | if firstTime_flag: | |
|
563 | print "\tWaiting %0.2f sec for the file \"%s\" , try %03d ..." % ( self.delay, filename, nTries+1 ) | |
|
564 | time.sleep( self.delay ) | |
|
565 | else: | |
|
566 | print "\tSearching next \"%s%04d%03d%03d%s\" file ..." % (self.optchar, self.year, self.doy, self.set, self.ext) | |
|
567 | ||
|
568 | file, filename = checkForRealPath( self.path, self.year, self.doy, self.set, self.ext ) | |
|
569 | if file: | |
|
570 | if self.__verifyFile(file): | |
|
571 | fileOk_flag = True | |
|
572 | break | |
|
573 | ||
|
574 | if fileOk_flag: | |
|
575 | break | |
|
576 | ||
|
577 | firstTime_flag = False | |
|
578 | ||
|
579 | print "\tSkipping the file \"%s\" due to this file doesn't exist" % filename | |
|
580 | self.set += 1 | |
|
581 | ||
|
582 | if nFiles == (self.nFiles-1): #si no encuentro el file buscado cambio de carpeta y busco en la siguiente carpeta | |
|
583 | self.set = 0 | |
|
584 | self.doy += 1 | |
|
585 | ||
|
586 | if fileOk_flag: | |
|
587 | self.fileSize = os.path.getsize( file ) | |
|
588 | self.filename = file | |
|
589 | self.flagIsNewFile = 1 | |
|
590 | if self.fp != None: self.fp.close() | |
|
591 | self.fp = open(file) | |
|
592 | self.flagNoMoreFiles = 0 | |
|
593 | print 'Setting the file: %s' % file | |
|
594 | else: | |
|
595 | self.fileSize = 0 | |
|
596 | self.filename = None | |
|
597 | self.flagIsNewFile = 0 | |
|
598 | self.fp = None | |
|
599 | self.flagNoMoreFiles = 1 | |
|
600 | print 'No more Files' | |
|
601 | ||
|
602 | return fileOk_flag | |
|
319 | 603 | |
|
320 | 604 | |
|
321 | 605 | def setNextFile(self): |
|
322 | 606 | if self.fp != None: |
|
323 | 607 | self.fp.close() |
|
324 | 608 | |
|
325 | 609 | if self.online: |
|
326 | 610 | newFile = self.__setNextFileOnline() |
|
327 | 611 | else: |
|
328 | 612 | newFile = self.__setNextFileOffline() |
|
329 | 613 | |
|
330 | 614 | if not(newFile): |
|
331 | 615 | return 0 |
|
332 | 616 | |
|
333 | 617 | self.__readFirstHeader() |
|
334 | 618 | self.nReadBlocks = 0 |
|
335 | 619 | return 1 |
|
336 | 620 | |
|
337 | 621 | def __setNewBlock(self): |
|
338 | 622 | if self.fp == None: |
|
339 | 623 | return 0 |
|
340 | 624 | |
|
341 | 625 | if self.flagIsNewFile: |
|
342 | 626 | return 1 |
|
343 | 627 | |
|
344 | 628 | self.lastUTTime = self.basicHeaderObj.utc |
|
345 | 629 | currentSize = self.fileSize - self.fp.tell() |
|
346 | 630 | neededSize = self.processingHeaderObj.blockSize + self.basicHeaderSize |
|
347 | 631 | |
|
348 | 632 | if (currentSize >= neededSize): |
|
349 | 633 | self.__rdBasicHeader() |
|
350 | 634 | return 1 |
|
351 | 635 | |
|
352 | 636 | if not(self.setNextFile()): |
|
353 | 637 | return 0 |
|
354 | 638 | |
|
355 | 639 | deltaTime = self.basicHeaderObj.utc - self.lastUTTime # |
|
356 | 640 | |
|
357 | 641 | self.flagTimeBlock = 0 |
|
358 | 642 | |
|
359 | 643 | if deltaTime > self.maxTimeStep: |
|
360 | 644 | self.flagTimeBlock = 1 |
|
361 | 645 | |
|
362 | 646 | return 1 |
|
363 | 647 | |
|
364 | 648 | |
|
365 | 649 | def readNextBlock(self): |
|
366 | 650 | if not(self.__setNewBlock()): |
|
367 | 651 | return 0 |
|
368 | 652 | |
|
369 | 653 | if not(self.readBlock()): |
|
370 | 654 | return 0 |
|
371 | 655 | |
|
372 | 656 | return 1 |
|
373 | 657 | |
|
374 | 658 | def __rdProcessingHeader(self, fp=None): |
|
375 | 659 | if fp == None: |
|
376 | 660 | fp = self.fp |
|
377 | 661 | |
|
378 | 662 | self.processingHeaderObj.read(fp) |
|
379 | 663 | |
|
380 | 664 | def __rdRadarControllerHeader(self, fp=None): |
|
381 | 665 | if fp == None: |
|
382 | 666 | fp = self.fp |
|
383 | 667 | |
|
384 | 668 | self.radarControllerHeaderObj.read(fp) |
|
385 | 669 | |
|
386 | 670 | def __rdSystemHeader(self, fp=None): |
|
387 | 671 | if fp == None: |
|
388 | 672 | fp = self.fp |
|
389 | 673 | |
|
390 | 674 | self.systemHeaderObj.read(fp) |
|
391 | 675 | |
|
392 | 676 | def __rdBasicHeader(self, fp=None): |
|
393 | 677 | if fp == None: |
|
394 | 678 | fp = self.fp |
|
395 | 679 | |
|
396 | 680 | self.basicHeaderObj.read(fp) |
|
397 | 681 | |
|
398 | 682 | |
|
399 | 683 | def __readFirstHeader(self): |
|
400 | 684 | self.__rdBasicHeader() |
|
401 | 685 | self.__rdSystemHeader() |
|
402 | 686 | self.__rdRadarControllerHeader() |
|
403 | 687 | self.__rdProcessingHeader() |
|
404 | 688 | |
|
405 | 689 | self.firstHeaderSize = self.basicHeaderObj.size |
|
406 | 690 | |
|
407 | 691 | datatype = int(numpy.log2((self.processingHeaderObj.processFlags & PROCFLAG.DATATYPE_MASK))-numpy.log2(PROCFLAG.DATATYPE_CHAR)) |
|
408 | 692 | if datatype == 0: |
|
409 | 693 | datatype_str = numpy.dtype([('real','<i1'),('imag','<i1')]) |
|
410 | 694 | elif datatype == 1: |
|
411 | 695 | datatype_str = numpy.dtype([('real','<i2'),('imag','<i2')]) |
|
412 | 696 | elif datatype == 2: |
|
413 | 697 | datatype_str = numpy.dtype([('real','<i4'),('imag','<i4')]) |
|
414 | 698 | elif datatype == 3: |
|
415 | 699 | datatype_str = numpy.dtype([('real','<i8'),('imag','<i8')]) |
|
416 | 700 | elif datatype == 4: |
|
417 | 701 | datatype_str = numpy.dtype([('real','<f4'),('imag','<f4')]) |
|
418 | 702 | elif datatype == 5: |
|
419 | 703 | datatype_str = numpy.dtype([('real','<f8'),('imag','<f8')]) |
|
420 | 704 | else: |
|
421 | 705 | raise ValueError, 'Data type was not defined' |
|
422 | 706 | |
|
423 | 707 | self.dtype = datatype_str |
|
424 | 708 | self.ippSeconds = 2 * 1000 * self.radarControllerHeaderObj.ipp / self.c |
|
425 | 709 | self.fileSizeByHeader = self.processingHeaderObj.dataBlocksPerFile * self.processingHeaderObj.blockSize + self.firstHeaderSize + self.basicHeaderSize*(self.processingHeaderObj.dataBlocksPerFile - 1) |
|
426 | 710 | # self.dataOutObj.channelList = numpy.arange(self.systemHeaderObj.numChannels) |
|
427 | 711 | # self.dataOutObj.channelIndexList = numpy.arange(self.systemHeaderObj.numChannels) |
|
428 | 712 | self.getBlockDimension() |
|
429 | 713 | |
|
430 | 714 | |
|
431 | 715 | def __verifyFile(self, filename, msgFlag=True): |
|
432 | 716 | msg = None |
|
433 | 717 | try: |
|
434 | 718 | fp = open(filename, 'rb') |
|
435 | 719 | currentPosition = fp.tell() |
|
436 | 720 | except: |
|
437 | 721 | if msgFlag: |
|
438 | 722 | print "The file %s can't be opened" % (filename) |
|
439 | 723 | return False |
|
440 | 724 | |
|
441 | 725 | neededSize = self.processingHeaderObj.blockSize + self.firstHeaderSize |
|
442 | 726 | |
|
443 | 727 | if neededSize == 0: |
|
444 | 728 | basicHeaderObj = BasicHeader() |
|
445 | 729 | systemHeaderObj = SystemHeader() |
|
446 | 730 | radarControllerHeaderObj = RadarControllerHeader() |
|
447 | 731 | processingHeaderObj = ProcessingHeader() |
|
448 | 732 | |
|
449 | 733 | try: |
|
450 | 734 | if not( basicHeaderObj.read(fp) ): raise ValueError |
|
451 | 735 | if not( systemHeaderObj.read(fp) ): raise ValueError |
|
452 | 736 | if not( radarControllerHeaderObj.read(fp) ): raise ValueError |
|
453 | 737 | if not( processingHeaderObj.read(fp) ): raise ValueError |
|
454 | 738 | data_type = int(numpy.log2((processingHeaderObj.processFlags & PROCFLAG.DATATYPE_MASK))-numpy.log2(PROCFLAG.DATATYPE_CHAR)) |
|
455 | 739 | |
|
456 | 740 | neededSize = processingHeaderObj.blockSize + basicHeaderObj.size |
|
457 | 741 | |
|
458 | 742 | except: |
|
459 | 743 | if msgFlag: |
|
460 | 744 | print "\tThe file %s is empty or it hasn't enough data" % filename |
|
461 | 745 | |
|
462 | 746 | fp.close() |
|
463 | 747 | return False |
|
464 | 748 | else: |
|
465 | 749 | msg = "\tSkipping the file %s due to it hasn't enough data" %filename |
|
466 | 750 | |
|
467 | 751 | fp.close() |
|
468 | 752 | fileSize = os.path.getsize(filename) |
|
469 | 753 | currentSize = fileSize - currentPosition |
|
470 | 754 | if currentSize < neededSize: |
|
471 | 755 | if msgFlag and (msg != None): |
|
472 | 756 | print msg #print"\tSkipping the file %s due to it hasn't enough data" %filename |
|
473 | 757 | return False |
|
474 | 758 | |
|
475 | 759 | return True |
|
476 | 760 | |
|
477 | 761 | def getData(): |
|
478 | 762 | pass |
|
479 | 763 | |
|
480 | 764 | def hasNotDataInBuffer(): |
|
481 | 765 | pass |
|
482 | 766 | |
|
483 | 767 | def readBlock(): |
|
484 | 768 | pass |
|
485 | 769 | |
|
486 | 770 | class JRODataWriter(JRODataIO): |
|
487 | 771 | |
|
488 | 772 | """ |
|
489 | 773 | Esta clase permite escribir datos a archivos procesados (.r o ,pdata). La escritura |
|
490 | 774 | de los datos siempre se realiza por bloques. |
|
491 | 775 | """ |
|
492 | 776 | |
|
493 | 777 | blockIndex = 0 |
|
494 | 778 | |
|
495 | 779 | path = None |
|
496 | 780 | |
|
497 | 781 | setFile = None |
|
498 | 782 | |
|
499 | 783 | profilesPerBlock = None |
|
500 | 784 | |
|
501 | 785 | blocksPerFile = None |
|
502 | 786 | |
|
503 | 787 | nWriteBlocks = 0 |
|
504 | 788 | |
|
505 | 789 | def __init__(self, dataOutObj=None): |
|
506 | 790 | raise ValueError, "Not implemented" |
|
507 | 791 | |
|
508 | 792 | |
|
509 | 793 | def hasAllDataInBuffer(self): |
|
510 | 794 | raise ValueError, "Not implemented" |
|
511 | 795 | |
|
512 | 796 | |
|
513 | 797 | def setBlockDimension(self): |
|
514 | 798 | raise ValueError, "Not implemented" |
|
515 | 799 | |
|
516 | 800 | |
|
517 | 801 | def writeBlock(self): |
|
518 | 802 | raise ValueError, "No implemented" |
|
519 | 803 | |
|
520 | 804 | |
|
521 | 805 | def putData(self): |
|
522 | 806 | raise ValueError, "No implemented" |
|
523 | 807 | |
|
524 | 808 | |
|
525 | 809 | def __writeFirstHeader(self): |
|
526 | 810 | """ |
|
527 | 811 | Escribe el primer header del file es decir el Basic header y el Long header (SystemHeader, RadarControllerHeader, ProcessingHeader) |
|
528 | 812 | |
|
529 | 813 | Affected: |
|
530 | 814 | __dataType |
|
531 | 815 | |
|
532 | 816 | Return: |
|
533 | 817 | None |
|
534 | 818 | """ |
|
535 | 819 | |
|
536 | 820 | # CALCULAR PARAMETROS |
|
537 | 821 | |
|
538 | 822 | sizeLongHeader = self.systemHeaderObj.size + self.radarControllerHeaderObj.size + self.processingHeaderObj.size |
|
539 | 823 | self.basicHeaderObj.size = self.basicHeaderSize + sizeLongHeader |
|
540 | 824 | |
|
541 | 825 | self.__writeBasicHeader() |
|
542 | 826 | self.__wrSystemHeader() |
|
543 | 827 | self.__wrRadarControllerHeader() |
|
544 | 828 | self.__wrProcessingHeader() |
|
545 | 829 | self.dtype = self.dataOutObj.dtype |
|
546 | 830 | |
|
547 | 831 | |
|
548 | 832 | def __writeBasicHeader(self, fp=None): |
|
549 | 833 | """ |
|
550 | 834 | Escribe solo el Basic header en el file creado |
|
551 | 835 | |
|
552 | 836 | Return: |
|
553 | 837 | None |
|
554 | 838 | """ |
|
555 | 839 | if fp == None: |
|
556 | 840 | fp = self.fp |
|
557 | 841 | |
|
558 | 842 | self.basicHeaderObj.write(fp) |
|
559 | 843 | |
|
560 | 844 | |
|
561 | 845 | def __wrSystemHeader(self, fp=None): |
|
562 | 846 | """ |
|
563 | 847 | Escribe solo el System header en el file creado |
|
564 | 848 | |
|
565 | 849 | Return: |
|
566 | 850 | None |
|
567 | 851 | """ |
|
568 | 852 | if fp == None: |
|
569 | 853 | fp = self.fp |
|
570 | 854 | |
|
571 | 855 | self.systemHeaderObj.write(fp) |
|
572 | 856 | |
|
573 | 857 | |
|
574 | 858 | def __wrRadarControllerHeader(self, fp=None): |
|
575 | 859 | """ |
|
576 | 860 | Escribe solo el RadarController header en el file creado |
|
577 | 861 | |
|
578 | 862 | Return: |
|
579 | 863 | None |
|
580 | 864 | """ |
|
581 | 865 | if fp == None: |
|
582 | 866 | fp = self.fp |
|
583 | 867 | |
|
584 | 868 | self.radarControllerHeaderObj.write(fp) |
|
585 | 869 | |
|
586 | 870 | |
|
587 | 871 | def __wrProcessingHeader(self, fp=None): |
|
588 | 872 | """ |
|
589 | 873 | Escribe solo el Processing header en el file creado |
|
590 | 874 | |
|
591 | 875 | Return: |
|
592 | 876 | None |
|
593 | 877 | """ |
|
594 | 878 | if fp == None: |
|
595 | 879 | fp = self.fp |
|
596 | 880 | |
|
597 | 881 | self.processingHeaderObj.write(fp) |
|
598 | 882 | |
|
599 | 883 | |
|
600 | 884 | def setNextFile(self): |
|
601 | 885 | """ |
|
602 | 886 | Determina el siguiente file que sera escrito |
|
603 | 887 | |
|
604 | 888 | Affected: |
|
605 | 889 | self.filename |
|
606 | 890 | self.subfolder |
|
607 | 891 | self.fp |
|
608 | 892 | self.setFile |
|
609 | 893 | self.flagIsNewFile |
|
610 | 894 | |
|
611 | 895 | Return: |
|
612 | 896 | 0 : Si el archivo no puede ser escrito |
|
613 | 897 | 1 : Si el archivo esta listo para ser escrito |
|
614 | 898 | """ |
|
615 | 899 | ext = self.ext |
|
616 | 900 | path = self.path |
|
617 | 901 | |
|
618 | 902 | if self.fp != None: |
|
619 | 903 | self.fp.close() |
|
620 | 904 | |
|
621 | 905 | timeTuple = time.localtime( self.dataOutObj.dataUtcTime) |
|
622 | 906 | subfolder = 'D%4.4d%3.3d' % (timeTuple.tm_year,timeTuple.tm_yday) |
|
623 | 907 | |
|
624 | 908 | doypath = os.path.join( path, subfolder ) |
|
625 | 909 | if not( os.path.exists(doypath) ): |
|
626 | 910 | os.mkdir(doypath) |
|
627 | 911 | self.setFile = -1 #inicializo mi contador de seteo |
|
628 | 912 | else: |
|
629 | 913 | filesList = os.listdir( doypath ) |
|
630 | 914 | if len( filesList ) > 0: |
|
631 | 915 | filesList = sorted( filesList, key=str.lower ) |
|
632 | 916 | filen = filesList[-1] |
|
633 | 917 | # el filename debera tener el siguiente formato |
|
634 | 918 | # 0 1234 567 89A BCDE (hex) |
|
635 | 919 | # x YYYY DDD SSS .ext |
|
636 | 920 | if isNumber( filen[8:11] ): |
|
637 | 921 | self.setFile = int( filen[8:11] ) #inicializo mi contador de seteo al seteo del ultimo file |
|
638 | 922 | else: |
|
639 | 923 | self.setFile = -1 |
|
640 | 924 | else: |
|
641 | 925 | self.setFile = -1 #inicializo mi contador de seteo |
|
642 | 926 | |
|
643 | 927 | setFile = self.setFile |
|
644 | 928 | setFile += 1 |
|
645 | 929 | |
|
646 | 930 | file = '%s%4.4d%3.3d%3.3d%s' % (self.optchar, |
|
647 | 931 | timeTuple.tm_year, |
|
648 | 932 | timeTuple.tm_yday, |
|
649 | 933 | setFile, |
|
650 | 934 | ext ) |
|
651 | 935 | |
|
652 | 936 | filename = os.path.join( path, subfolder, file ) |
|
653 | 937 | |
|
654 | 938 | fp = open( filename,'wb' ) |
|
655 | 939 | |
|
656 | 940 | self.blockIndex = 0 |
|
657 | 941 | |
|
658 | 942 | #guardando atributos |
|
659 | 943 | self.filename = filename |
|
660 | 944 | self.subfolder = subfolder |
|
661 | 945 | self.fp = fp |
|
662 | 946 | self.setFile = setFile |
|
663 | 947 | self.flagIsNewFile = 1 |
|
664 | 948 | |
|
665 | 949 | self.getDataHeader() |
|
666 | 950 | |
|
667 | 951 | print 'Writing the file: %s'%self.filename |
|
668 | 952 | |
|
669 | 953 | self.__writeFirstHeader() |
|
670 | 954 | |
|
671 | 955 | return 1 |
|
672 | 956 | |
|
673 | 957 | |
|
674 | 958 | def __setNewBlock(self): |
|
675 | 959 | """ |
|
676 | 960 | Si es un nuevo file escribe el First Header caso contrario escribe solo el Basic Header |
|
677 | 961 | |
|
678 | 962 | Return: |
|
679 | 963 | 0 : si no pudo escribir nada |
|
680 | 964 | 1 : Si escribio el Basic el First Header |
|
681 | 965 | """ |
|
682 | 966 | if self.fp == None: |
|
683 | 967 | self.setNextFile() |
|
684 | 968 | |
|
685 | 969 | if self.flagIsNewFile: |
|
686 | 970 | return 1 |
|
687 | 971 | |
|
688 | 972 | if self.blockIndex < self.processingHeaderObj.dataBlocksPerFile: |
|
689 | 973 | self.__writeBasicHeader() |
|
690 | 974 | return 1 |
|
691 | 975 | |
|
692 | 976 | if not( self.setNextFile() ): |
|
693 | 977 | return 0 |
|
694 | 978 | |
|
695 | 979 | return 1 |
|
696 | 980 | |
|
697 | 981 | |
|
698 | 982 | def writeNextBlock(self): |
|
699 | 983 | """ |
|
700 | 984 | Selecciona el bloque siguiente de datos y los escribe en un file |
|
701 | 985 | |
|
702 | 986 | Return: |
|
703 | 987 | 0 : Si no hizo pudo escribir el bloque de datos |
|
704 | 988 | 1 : Si no pudo escribir el bloque de datos |
|
705 | 989 | """ |
|
706 | 990 | if not( self.__setNewBlock() ): |
|
707 | 991 | return 0 |
|
708 | 992 | |
|
709 | 993 | self.writeBlock() |
|
710 | 994 | |
|
711 | 995 | return 1 |
|
712 | 996 | |
|
713 | 997 | |
|
714 | 998 | def getDataHeader(self): |
|
715 | 999 | """Obtiene una copia del First Header Affected: self.basicHeaderObj self. |
|
716 | 1000 | systemHeaderObj self.radarControllerHeaderObj self.processingHeaderObj self. |
|
717 | 1001 | dtype Return: None |
|
718 | 1002 | """ |
|
719 | 1003 | |
|
720 | 1004 | raise ValueError, "No implemented" |
|
721 | 1005 | |
|
722 | 1006 | def setup(self, path, blocksPerFile, profilesPerBlock=None, set=0, ext=None): |
|
723 | 1007 | """ |
|
724 | 1008 | Setea el tipo de formato en la cual sera guardada la data y escribe el First Header |
|
725 | 1009 | |
|
726 | 1010 | Inputs: |
|
727 | 1011 | path : el path destino en el cual se escribiran los files a crear |
|
728 | 1012 | format : formato en el cual sera salvado un file |
|
729 | 1013 | set : el setebo del file |
|
730 | 1014 | |
|
731 | 1015 | Return: |
|
732 | 1016 | 0 : Si no realizo un buen seteo |
|
733 | 1017 | 1 : Si realizo un buen seteo |
|
734 | 1018 | """ |
|
735 | 1019 | |
|
736 | 1020 | if ext == None: |
|
737 | 1021 | ext = self.ext |
|
738 | 1022 | |
|
739 | 1023 | ext = ext.lower() |
|
740 | 1024 | |
|
741 | 1025 | self.ext = ext |
|
742 | 1026 | |
|
743 | 1027 | self.path = path |
|
744 | 1028 | |
|
745 | 1029 | self.setFile = set - 1 |
|
746 | 1030 | |
|
747 | 1031 | self.blocksPerFile = blocksPerFile |
|
748 | 1032 | |
|
749 | 1033 | self.profilesPerBlock = profilesPerBlock |
|
750 | 1034 | |
|
751 | 1035 | if not(self.setNextFile()): |
|
752 | 1036 | print "There isn't a next file" |
|
753 | 1037 | return 0 |
|
754 | 1038 | |
|
755 | 1039 | self.setBlockDimension() |
|
756 | 1040 | |
|
757 | 1041 | return 1 |
|
758 | 1042 | |
|
759 | 1043 | |
|
760 | 1044 | |
|
761 | 1045 | |
|
762 | 1046 | |
|
763 | 1047 |
General Comments 0
You need to be logged in to leave comments.
Login now