##// END OF EJS Templates
finishing day, need testing
José Chávez -
r931:9d13aae43f1b
parent child
Show More
@@ -1,1321 +1,1321
1 1 '''
2 2 Created on September , 2012
3 3 @author:
4 4 '''
5 5
6 6 import sys
7 7 import ast
8 8 import datetime
9 9 import traceback
10 10 import math
11 import time
11 12 from multiprocessing import Process, Queue, cpu_count
12 13
13 14 import schainpy
14 15 import schainpy.admin
15 16
16 17 from xml.etree.ElementTree import ElementTree, Element, SubElement, tostring
17 18 from xml.dom import minidom
18 19
19 20 from schainpy.model import *
20 21 from time import sleep
21 22
22 23 def prettify(elem):
23 24 """Return a pretty-printed XML string for the Element.
24 25 """
25 26 rough_string = tostring(elem, 'utf-8')
26 27 reparsed = minidom.parseString(rough_string)
27 28 return reparsed.toprettyxml(indent=" ")
28 29
29 30 def multiSchain(child, nProcess=cpu_count(), startDate=None, endDate=None, by_day=False):
30 31 skip = 0
31 32 cursor = 0
32 33 nFiles = None
33 34 processes = []
34 35 dt1 = datetime.datetime.strptime(startDate, '%Y/%m/%d')
35 36 dt2 = datetime.datetime.strptime(endDate, '%Y/%m/%d')
36 37 days = (dt2 - dt1).days
37 38
38 39 for day in range(days+1):
39 40 skip = 0
40 41 cursor = 0
41 42 q = Queue()
42 43 processes = []
43 44 dt = (dt1 + datetime.timedelta(day)).strftime('%Y/%m/%d')
44 45 firstProcess = Process(target=child, args=(cursor, skip, q, dt))
45 46 firstProcess.start()
46 47 if by_day:
47 48 continue
48 49 nFiles = q.get()
49 50 firstProcess.terminate()
50 51 skip = int(math.ceil(nFiles/nProcess))
51 52 while True:
52 53 processes.append(Process(target=child, args=(cursor, skip, q, dt)))
53 54 processes[cursor].start()
54 55 if nFiles < cursor*skip:
55 56 break
56 57 cursor += 1
57 58
58 59 def beforeExit(exctype, value, trace):
59 60 for process in processes:
60 61 process.terminate()
61 62 process.join()
62 63 print traceback.print_tb(trace)
63 64
64 65 sys.excepthook = beforeExit
65 66
66 67 for process in processes:
67 68 process.join()
68 69 process.terminate()
69 sys.exit()
70
70 time.sleep(3)
71 71
72 72 class ParameterConf():
73 73
74 74 id = None
75 75 name = None
76 76 value = None
77 77 format = None
78 78
79 79 __formated_value = None
80 80
81 81 ELEMENTNAME = 'Parameter'
82 82
83 83 def __init__(self):
84 84
85 85 self.format = 'str'
86 86
87 87 def getElementName(self):
88 88
89 89 return self.ELEMENTNAME
90 90
91 91 def getValue(self):
92 92
93 93 value = self.value
94 94 format = self.format
95 95
96 96 if self.__formated_value != None:
97 97
98 98 return self.__formated_value
99 99
100 100 if format == 'obj':
101 101 return value
102 102
103 103 if format == 'str':
104 104 self.__formated_value = str(value)
105 105 return self.__formated_value
106 106
107 107 if value == '':
108 108 raise ValueError, "%s: This parameter value is empty" %self.name
109 109
110 110 if format == 'list':
111 111 strList = value.split(',')
112 112
113 113 self.__formated_value = strList
114 114
115 115 return self.__formated_value
116 116
117 117 if format == 'intlist':
118 118 """
119 119 Example:
120 120 value = (0,1,2)
121 121 """
122 122
123 123 new_value = ast.literal_eval(value)
124 124
125 125 if type(new_value) not in (tuple, list):
126 126 new_value = [int(new_value)]
127 127
128 128 self.__formated_value = new_value
129 129
130 130 return self.__formated_value
131 131
132 132 if format == 'floatlist':
133 133 """
134 134 Example:
135 135 value = (0.5, 1.4, 2.7)
136 136 """
137 137
138 138 new_value = ast.literal_eval(value)
139 139
140 140 if type(new_value) not in (tuple, list):
141 141 new_value = [float(new_value)]
142 142
143 143 self.__formated_value = new_value
144 144
145 145 return self.__formated_value
146 146
147 147 if format == 'date':
148 148 strList = value.split('/')
149 149 intList = [int(x) for x in strList]
150 150 date = datetime.date(intList[0], intList[1], intList[2])
151 151
152 152 self.__formated_value = date
153 153
154 154 return self.__formated_value
155 155
156 156 if format == 'time':
157 157 strList = value.split(':')
158 158 intList = [int(x) for x in strList]
159 159 time = datetime.time(intList[0], intList[1], intList[2])
160 160
161 161 self.__formated_value = time
162 162
163 163 return self.__formated_value
164 164
165 165 if format == 'pairslist':
166 166 """
167 167 Example:
168 168 value = (0,1),(1,2)
169 169 """
170 170
171 171 new_value = ast.literal_eval(value)
172 172
173 173 if type(new_value) not in (tuple, list):
174 174 raise ValueError, "%s has to be a tuple or list of pairs" %value
175 175
176 176 if type(new_value[0]) not in (tuple, list):
177 177 if len(new_value) != 2:
178 178 raise ValueError, "%s has to be a tuple or list of pairs" %value
179 179 new_value = [new_value]
180 180
181 181 for thisPair in new_value:
182 182 if len(thisPair) != 2:
183 183 raise ValueError, "%s has to be a tuple or list of pairs" %value
184 184
185 185 self.__formated_value = new_value
186 186
187 187 return self.__formated_value
188 188
189 189 if format == 'multilist':
190 190 """
191 191 Example:
192 192 value = (0,1,2),(3,4,5)
193 193 """
194 194 multiList = ast.literal_eval(value)
195 195
196 196 if type(multiList[0]) == int:
197 197 multiList = ast.literal_eval("(" + value + ")")
198 198
199 199 self.__formated_value = multiList
200 200
201 201 return self.__formated_value
202 202
203 203 if format == 'bool':
204 204 value = int(value)
205 205
206 206 if format == 'int':
207 207 value = float(value)
208 208
209 209 format_func = eval(format)
210 210
211 211 self.__formated_value = format_func(value)
212 212
213 213 return self.__formated_value
214 214
215 215 def updateId(self, new_id):
216 216
217 217 self.id = str(new_id)
218 218
219 219 def setup(self, id, name, value, format='str'):
220 220
221 221 self.id = str(id)
222 222 self.name = name
223 223 if format == 'obj':
224 224 self.value = value
225 225 else:
226 226 self.value = str(value)
227 227 self.format = str.lower(format)
228 228
229 229 self.getValue()
230 230
231 231 return 1
232 232
233 233 def update(self, name, value, format='str'):
234 234
235 235 self.name = name
236 236 self.value = str(value)
237 237 self.format = format
238 238
239 239 def makeXml(self, opElement):
240 240 if self.name not in ('queue',):
241 241 parmElement = SubElement(opElement, self.ELEMENTNAME)
242 242 parmElement.set('id', str(self.id))
243 243 parmElement.set('name', self.name)
244 244 parmElement.set('value', self.value)
245 245 parmElement.set('format', self.format)
246 246
247 247 def readXml(self, parmElement):
248 248
249 249 self.id = parmElement.get('id')
250 250 self.name = parmElement.get('name')
251 251 self.value = parmElement.get('value')
252 252 self.format = str.lower(parmElement.get('format'))
253 253
254 254 #Compatible with old signal chain version
255 255 if self.format == 'int' and self.name == 'idfigure':
256 256 self.name = 'id'
257 257
258 258 def printattr(self):
259 259
260 260 print "Parameter[%s]: name = %s, value = %s, format = %s" %(self.id, self.name, self.value, self.format)
261 261
262 262 class OperationConf():
263 263
264 264 id = None
265 265 name = None
266 266 priority = None
267 267 type = None
268 268
269 269 parmConfObjList = []
270 270
271 271 ELEMENTNAME = 'Operation'
272 272
273 273 def __init__(self):
274 274
275 275 self.id = '0'
276 276 self.name = None
277 277 self.priority = None
278 278 self.type = 'self'
279 279
280 280
281 281 def __getNewId(self):
282 282
283 283 return int(self.id)*10 + len(self.parmConfObjList) + 1
284 284
285 285 def updateId(self, new_id):
286 286
287 287 self.id = str(new_id)
288 288
289 289 n = 1
290 290 for parmObj in self.parmConfObjList:
291 291
292 292 idParm = str(int(new_id)*10 + n)
293 293 parmObj.updateId(idParm)
294 294
295 295 n += 1
296 296
297 297 def getElementName(self):
298 298
299 299 return self.ELEMENTNAME
300 300
301 301 def getParameterObjList(self):
302 302
303 303 return self.parmConfObjList
304 304
305 305 def getParameterObj(self, parameterName):
306 306
307 307 for parmConfObj in self.parmConfObjList:
308 308
309 309 if parmConfObj.name != parameterName:
310 310 continue
311 311
312 312 return parmConfObj
313 313
314 314 return None
315 315
316 316 def getParameterObjfromValue(self, parameterValue):
317 317
318 318 for parmConfObj in self.parmConfObjList:
319 319
320 320 if parmConfObj.getValue() != parameterValue:
321 321 continue
322 322
323 323 return parmConfObj.getValue()
324 324
325 325 return None
326 326
327 327 def getParameterValue(self, parameterName):
328 328
329 329 parameterObj = self.getParameterObj(parameterName)
330 330
331 331 # if not parameterObj:
332 332 # return None
333 333
334 334 value = parameterObj.getValue()
335 335
336 336 return value
337 337
338 338
339 339 def getKwargs(self):
340 340
341 341 kwargs = {}
342 342
343 343 for parmConfObj in self.parmConfObjList:
344 344 if self.name == 'run' and parmConfObj.name == 'datatype':
345 345 continue
346 346
347 347 kwargs[parmConfObj.name] = parmConfObj.getValue()
348 348
349 349 return kwargs
350 350
351 351 def setup(self, id, name, priority, type):
352 352
353 353 self.id = str(id)
354 354 self.name = name
355 355 self.type = type
356 356 self.priority = priority
357 357
358 358 self.parmConfObjList = []
359 359
360 360 def removeParameters(self):
361 361
362 362 for obj in self.parmConfObjList:
363 363 del obj
364 364
365 365 self.parmConfObjList = []
366 366
367 367 def addParameter(self, name, value, format='str'):
368 368
369 369 id = self.__getNewId()
370 370
371 371 parmConfObj = ParameterConf()
372 372 if not parmConfObj.setup(id, name, value, format):
373 373 return None
374 374
375 375 self.parmConfObjList.append(parmConfObj)
376 376
377 377 return parmConfObj
378 378
379 379 def changeParameter(self, name, value, format='str'):
380 380
381 381 parmConfObj = self.getParameterObj(name)
382 382 parmConfObj.update(name, value, format)
383 383
384 384 return parmConfObj
385 385
386 386 def makeXml(self, procUnitElement):
387 387
388 388 opElement = SubElement(procUnitElement, self.ELEMENTNAME)
389 389 opElement.set('id', str(self.id))
390 390 opElement.set('name', self.name)
391 391 opElement.set('type', self.type)
392 392 opElement.set('priority', str(self.priority))
393 393
394 394 for parmConfObj in self.parmConfObjList:
395 395 parmConfObj.makeXml(opElement)
396 396
397 397 def readXml(self, opElement):
398 398
399 399 self.id = opElement.get('id')
400 400 self.name = opElement.get('name')
401 401 self.type = opElement.get('type')
402 402 self.priority = opElement.get('priority')
403 403
404 404 #Compatible with old signal chain version
405 405 #Use of 'run' method instead 'init'
406 406 if self.type == 'self' and self.name == 'init':
407 407 self.name = 'run'
408 408
409 409 self.parmConfObjList = []
410 410
411 411 parmElementList = opElement.iter(ParameterConf().getElementName())
412 412
413 413 for parmElement in parmElementList:
414 414 parmConfObj = ParameterConf()
415 415 parmConfObj.readXml(parmElement)
416 416
417 417 #Compatible with old signal chain version
418 418 #If an 'plot' OPERATION is found, changes name operation by the value of its type PARAMETER
419 419 if self.type != 'self' and self.name == 'Plot':
420 420 if parmConfObj.format == 'str' and parmConfObj.name == 'type':
421 421 self.name = parmConfObj.value
422 422 continue
423 423
424 424 self.parmConfObjList.append(parmConfObj)
425 425
426 426 def printattr(self):
427 427
428 428 print "%s[%s]: name = %s, type = %s, priority = %s" %(self.ELEMENTNAME,
429 429 self.id,
430 430 self.name,
431 431 self.type,
432 432 self.priority)
433 433
434 434 for parmConfObj in self.parmConfObjList:
435 435 parmConfObj.printattr()
436 436
437 437 def createObject(self, plotter_queue=None):
438 438
439 439
440 440 if self.type == 'self':
441 441 raise ValueError, "This operation type cannot be created"
442 442
443 443 if self.type == 'plotter':
444 444 #Plotter(plotter_name)
445 445 if not plotter_queue:
446 446 raise ValueError, "plotter_queue is not defined. Use:\nmyProject = Project()\nmyProject.setPlotterQueue(plotter_queue)"
447 447
448 448 opObj = Plotter(self.name, plotter_queue)
449 449
450 450 if self.type == 'external' or self.type == 'other':
451 451
452 452 className = eval(self.name)
453 453 kwargs = self.getKwargs()
454 454
455 455 opObj = className(**kwargs)
456 456
457 457 return opObj
458 458
459 459
460 460 class ProcUnitConf():
461 461
462 462 id = None
463 463 name = None
464 464 datatype = None
465 465 inputId = None
466 466 parentId = None
467 467
468 468 opConfObjList = []
469 469
470 470 procUnitObj = None
471 471 opObjList = []
472 472
473 473 ELEMENTNAME = 'ProcUnit'
474 474
475 475 def __init__(self):
476 476
477 477 self.id = None
478 478 self.datatype = None
479 479 self.name = None
480 480 self.inputId = None
481 481
482 482 self.opConfObjList = []
483 483
484 484 self.procUnitObj = None
485 485 self.opObjDict = {}
486 486
487 487 def __getPriority(self):
488 488
489 489 return len(self.opConfObjList)+1
490 490
491 491 def __getNewId(self):
492 492
493 493 return int(self.id)*10 + len(self.opConfObjList) + 1
494 494
495 495 def getElementName(self):
496 496
497 497 return self.ELEMENTNAME
498 498
499 499 def getId(self):
500 500
501 501 return self.id
502 502
503 503 def updateId(self, new_id, parentId=parentId):
504 504
505 505
506 506 new_id = int(parentId)*10 + (int(self.id) % 10)
507 507 new_inputId = int(parentId)*10 + (int(self.inputId) % 10)
508 508
509 509 #If this proc unit has not inputs
510 510 if self.inputId == '0':
511 511 new_inputId = 0
512 512
513 513 n = 1
514 514 for opConfObj in self.opConfObjList:
515 515
516 516 idOp = str(int(new_id)*10 + n)
517 517 opConfObj.updateId(idOp)
518 518
519 519 n += 1
520 520
521 521 self.parentId = str(parentId)
522 522 self.id = str(new_id)
523 523 self.inputId = str(new_inputId)
524 524
525 525
526 526 def getInputId(self):
527 527
528 528 return self.inputId
529 529
530 530 def getOperationObjList(self):
531 531
532 532 return self.opConfObjList
533 533
534 534 def getOperationObj(self, name=None):
535 535
536 536 for opConfObj in self.opConfObjList:
537 537
538 538 if opConfObj.name != name:
539 539 continue
540 540
541 541 return opConfObj
542 542
543 543 return None
544 544
545 545 def getOpObjfromParamValue(self, value=None):
546 546
547 547 for opConfObj in self.opConfObjList:
548 548 if opConfObj.getParameterObjfromValue(parameterValue=value) != value:
549 549 continue
550 550 return opConfObj
551 551 return None
552 552
553 553 def getProcUnitObj(self):
554 554
555 555 return self.procUnitObj
556 556
557 557 def setup(self, id, name, datatype, inputId, parentId=None):
558 558
559 559 #Compatible with old signal chain version
560 560 if datatype==None and name==None:
561 561 raise ValueError, "datatype or name should be defined"
562 562
563 563 if name==None:
564 564 if 'Proc' in datatype:
565 565 name = datatype
566 566 else:
567 567 name = '%sProc' %(datatype)
568 568
569 569 if datatype==None:
570 570 datatype = name.replace('Proc','')
571 571
572 572 self.id = str(id)
573 573 self.name = name
574 574 self.datatype = datatype
575 575 self.inputId = inputId
576 576 self.parentId = parentId
577 577
578 578 self.opConfObjList = []
579 579
580 580 self.addOperation(name='run', optype='self')
581 581
582 582 def removeOperations(self):
583 583
584 584 for obj in self.opConfObjList:
585 585 del obj
586 586
587 587 self.opConfObjList = []
588 588 self.addOperation(name='run')
589 589
590 590 def addParameter(self, **kwargs):
591 591 '''
592 592 Add parameters to "run" operation
593 593 '''
594 594 opObj = self.opConfObjList[0]
595 595
596 596 opObj.addParameter(**kwargs)
597 597
598 598 return opObj
599 599
600 600 def addOperation(self, name, optype='self'):
601 601
602 602 id = self.__getNewId()
603 603 priority = self.__getPriority()
604 604
605 605 opConfObj = OperationConf()
606 606 opConfObj.setup(id, name=name, priority=priority, type=optype)
607 607
608 608 self.opConfObjList.append(opConfObj)
609 609
610 610 return opConfObj
611 611
612 612 def makeXml(self, projectElement):
613 613
614 614 procUnitElement = SubElement(projectElement, self.ELEMENTNAME)
615 615 procUnitElement.set('id', str(self.id))
616 616 procUnitElement.set('name', self.name)
617 617 procUnitElement.set('datatype', self.datatype)
618 618 procUnitElement.set('inputId', str(self.inputId))
619 619
620 620 for opConfObj in self.opConfObjList:
621 621 opConfObj.makeXml(procUnitElement)
622 622
623 623 def readXml(self, upElement):
624 624
625 625 self.id = upElement.get('id')
626 626 self.name = upElement.get('name')
627 627 self.datatype = upElement.get('datatype')
628 628 self.inputId = upElement.get('inputId')
629 629
630 630 if self.ELEMENTNAME == "ReadUnit":
631 631 self.datatype = self.datatype.replace("Reader", "")
632 632
633 633 if self.ELEMENTNAME == "ProcUnit":
634 634 self.datatype = self.datatype.replace("Proc", "")
635 635
636 636 if self.inputId == 'None':
637 637 self.inputId = '0'
638 638
639 639 self.opConfObjList = []
640 640
641 641 opElementList = upElement.iter(OperationConf().getElementName())
642 642
643 643 for opElement in opElementList:
644 644 opConfObj = OperationConf()
645 645 opConfObj.readXml(opElement)
646 646 self.opConfObjList.append(opConfObj)
647 647
648 648 def printattr(self):
649 649
650 650 print "%s[%s]: name = %s, datatype = %s, inputId = %s" %(self.ELEMENTNAME,
651 651 self.id,
652 652 self.name,
653 653 self.datatype,
654 654 self.inputId)
655 655
656 656 for opConfObj in self.opConfObjList:
657 657 opConfObj.printattr()
658 658
659 659
660 660 def getKwargs(self):
661 661
662 662 opObj = self.opConfObjList[0]
663 663 kwargs = opObj.getKwargs()
664 664
665 665 return kwargs
666 666
667 667 def createObjects(self, plotter_queue=None):
668 668
669 669 className = eval(self.name)
670 670 kwargs = self.getKwargs()
671 671 procUnitObj = className(**kwargs)
672 672
673 673 for opConfObj in self.opConfObjList:
674 674
675 675 if opConfObj.type=='self' and self.name=='run':
676 676 continue
677 677 elif opConfObj.type=='self':
678 678 procUnitObj.addOperationKwargs(opConfObj.id, **opConfObj.getKwargs())
679 679 continue
680 680
681 681 opObj = opConfObj.createObject(plotter_queue)
682 682
683 683 self.opObjDict[opConfObj.id] = opObj
684 684
685 685 procUnitObj.addOperation(opObj, opConfObj.id)
686 686
687 687 self.procUnitObj = procUnitObj
688 688
689 689 return procUnitObj
690 690
691 691 def run(self):
692 692
693 693 is_ok = False
694 694
695 695 for opConfObj in self.opConfObjList:
696 696
697 697 kwargs = {}
698 698 for parmConfObj in opConfObj.getParameterObjList():
699 699 if opConfObj.name == 'run' and parmConfObj.name == 'datatype':
700 700 continue
701 701
702 702 kwargs[parmConfObj.name] = parmConfObj.getValue()
703 703
704 704 #ini = time.time()
705 705
706 706 #print "\tRunning the '%s' operation with %s" %(opConfObj.name, opConfObj.id)
707 707 sts = self.procUnitObj.call(opType = opConfObj.type,
708 708 opName = opConfObj.name,
709 709 opId = opConfObj.id,
710 710 )
711 711
712 712 # total_time = time.time() - ini
713 713 #
714 714 # if total_time > 0.002:
715 715 # print "%s::%s took %f seconds" %(self.name, opConfObj.name, total_time)
716 716
717 717 is_ok = is_ok or sts
718 718
719 719 return is_ok
720 720
721 721 def close(self):
722 722
723 723 for opConfObj in self.opConfObjList:
724 724 if opConfObj.type == 'self':
725 725 continue
726 726
727 727 opObj = self.procUnitObj.getOperationObj(opConfObj.id)
728 728 opObj.close()
729 729
730 730 self.procUnitObj.close()
731 731
732 732 return
733 733
734 734 class ReadUnitConf(ProcUnitConf):
735 735
736 736 path = None
737 737 startDate = None
738 738 endDate = None
739 739 startTime = None
740 740 endTime = None
741 741
742 742 ELEMENTNAME = 'ReadUnit'
743 743
744 744 def __init__(self):
745 745
746 746 self.id = None
747 747 self.datatype = None
748 748 self.name = None
749 749 self.inputId = None
750 750
751 751 self.parentId = None
752 752
753 753 self.opConfObjList = []
754 754 self.opObjList = []
755 755
756 756 def getElementName(self):
757 757
758 758 return self.ELEMENTNAME
759 759
760 760 def setup(self, id, name, datatype, path, startDate="", endDate="", startTime="", endTime="", parentId=None, queue=None, **kwargs):
761 761
762 762 #Compatible with old signal chain version
763 763 if datatype==None and name==None:
764 764 raise ValueError, "datatype or name should be defined"
765 765
766 766 if name==None:
767 767 if 'Reader' in datatype:
768 768 name = datatype
769 769 else:
770 770 name = '%sReader' %(datatype)
771 771
772 772 if datatype==None:
773 773 datatype = name.replace('Reader','')
774 774
775 775 self.id = id
776 776 self.name = name
777 777 self.datatype = datatype
778 778
779 779 self.path = os.path.abspath(path)
780 780 self.startDate = startDate
781 781 self.endDate = endDate
782 782 self.startTime = startTime
783 783 self.endTime = endTime
784 784
785 785 self.inputId = '0'
786 786 self.parentId = parentId
787 787 self.queue = queue
788 788 self.addRunOperation(**kwargs)
789 789
790 790 def update(self, datatype, path, startDate, endDate, startTime, endTime, parentId=None, name=None, **kwargs):
791 791
792 792 #Compatible with old signal chain version
793 793 if datatype==None and name==None:
794 794 raise ValueError, "datatype or name should be defined"
795 795
796 796 if name==None:
797 797 if 'Reader' in datatype:
798 798 name = datatype
799 799 else:
800 800 name = '%sReader' %(datatype)
801 801
802 802 if datatype==None:
803 803 datatype = name.replace('Reader','')
804 804
805 805 self.datatype = datatype
806 806 self.name = name
807 807 self.path = path
808 808 self.startDate = startDate
809 809 self.endDate = endDate
810 810 self.startTime = startTime
811 811 self.endTime = endTime
812 812
813 813 self.inputId = '0'
814 814 self.parentId = parentId
815 815
816 816 self.updateRunOperation(**kwargs)
817 817
818 818 def removeOperations(self):
819 819
820 820 for obj in self.opConfObjList:
821 821 del obj
822 822
823 823 self.opConfObjList = []
824 824
825 825 def addRunOperation(self, **kwargs):
826 826
827 827 opObj = self.addOperation(name = 'run', optype = 'self')
828 828
829 829 opObj.addParameter(name='datatype' , value=self.datatype, format='str')
830 830 opObj.addParameter(name='path' , value=self.path, format='str')
831 831 opObj.addParameter(name='startDate' , value=self.startDate, format='date')
832 832 opObj.addParameter(name='endDate' , value=self.endDate, format='date')
833 833 opObj.addParameter(name='startTime' , value=self.startTime, format='time')
834 834 opObj.addParameter(name='endTime' , value=self.endTime, format='time')
835 835 opObj.addParameter(name='queue' , value=self.queue, format='obj')
836 836
837 837 for key, value in kwargs.items():
838 838 opObj.addParameter(name=key, value=value, format=type(value).__name__)
839 839
840 840 return opObj
841 841
842 842 def updateRunOperation(self, **kwargs):
843 843
844 844 opObj = self.getOperationObj(name = 'run')
845 845 opObj.removeParameters()
846 846
847 847 opObj.addParameter(name='datatype' , value=self.datatype, format='str')
848 848 opObj.addParameter(name='path' , value=self.path, format='str')
849 849 opObj.addParameter(name='startDate' , value=self.startDate, format='date')
850 850 opObj.addParameter(name='endDate' , value=self.endDate, format='date')
851 851 opObj.addParameter(name='startTime' , value=self.startTime, format='time')
852 852 opObj.addParameter(name='endTime' , value=self.endTime, format='time')
853 853
854 854 for key, value in kwargs.items():
855 855 opObj.addParameter(name=key, value=value, format=type(value).__name__)
856 856
857 857 return opObj
858 858
859 859 # def makeXml(self, projectElement):
860 860 #
861 861 # procUnitElement = SubElement(projectElement, self.ELEMENTNAME)
862 862 # procUnitElement.set('id', str(self.id))
863 863 # procUnitElement.set('name', self.name)
864 864 # procUnitElement.set('datatype', self.datatype)
865 865 # procUnitElement.set('inputId', str(self.inputId))
866 866 #
867 867 # for opConfObj in self.opConfObjList:
868 868 # opConfObj.makeXml(procUnitElement)
869 869
870 870 def readXml(self, upElement):
871 871
872 872 self.id = upElement.get('id')
873 873 self.name = upElement.get('name')
874 874 self.datatype = upElement.get('datatype')
875 875 self.inputId = upElement.get('inputId')
876 876
877 877 if self.ELEMENTNAME == "ReadUnit":
878 878 self.datatype = self.datatype.replace("Reader", "")
879 879
880 880 if self.inputId == 'None':
881 881 self.inputId = '0'
882 882
883 883 self.opConfObjList = []
884 884
885 885 opElementList = upElement.iter(OperationConf().getElementName())
886 886
887 887 for opElement in opElementList:
888 888 opConfObj = OperationConf()
889 889 opConfObj.readXml(opElement)
890 890 self.opConfObjList.append(opConfObj)
891 891
892 892 if opConfObj.name == 'run':
893 893 self.path = opConfObj.getParameterValue('path')
894 894 self.startDate = opConfObj.getParameterValue('startDate')
895 895 self.endDate = opConfObj.getParameterValue('endDate')
896 896 self.startTime = opConfObj.getParameterValue('startTime')
897 897 self.endTime = opConfObj.getParameterValue('endTime')
898 898
899 899 class Project():
900 900
901 901 id = None
902 902 name = None
903 903 description = None
904 904 filename = None
905 905
906 906 procUnitConfObjDict = None
907 907
908 908 ELEMENTNAME = 'Project'
909 909
910 910 plotterQueue = None
911 911
912 912 def __init__(self, plotter_queue=None):
913 913
914 914 self.id = None
915 915 self.name = None
916 916 self.description = None
917 917
918 918 self.plotterQueue = plotter_queue
919 919
920 920 self.procUnitConfObjDict = {}
921 921
922 922 def __getNewId(self):
923 923
924 924 idList = self.procUnitConfObjDict.keys()
925 925
926 926 id = int(self.id)*10
927 927
928 928 while True:
929 929 id += 1
930 930
931 931 if str(id) in idList:
932 932 continue
933 933
934 934 break
935 935
936 936 return str(id)
937 937
938 938 def getElementName(self):
939 939
940 940 return self.ELEMENTNAME
941 941
942 942 def getId(self):
943 943
944 944 return self.id
945 945
946 946 def updateId(self, new_id):
947 947
948 948 self.id = str(new_id)
949 949
950 950 keyList = self.procUnitConfObjDict.keys()
951 951 keyList.sort()
952 952
953 953 n = 1
954 954 newProcUnitConfObjDict = {}
955 955
956 956 for procKey in keyList:
957 957
958 958 procUnitConfObj = self.procUnitConfObjDict[procKey]
959 959 idProcUnit = str(int(self.id)*10 + n)
960 960 procUnitConfObj.updateId(idProcUnit, parentId = self.id)
961 961
962 962 newProcUnitConfObjDict[idProcUnit] = procUnitConfObj
963 963 n += 1
964 964
965 965 self.procUnitConfObjDict = newProcUnitConfObjDict
966 966
967 967 def setup(self, id, name, description):
968 968
969 969 self.id = str(id)
970 970 self.name = name
971 971 self.description = description
972 972
973 973 def update(self, name, description):
974 974
975 975 self.name = name
976 976 self.description = description
977 977
978 978 def addReadUnit(self, id=None, datatype=None, name=None, **kwargs):
979 979
980 980 if id is None:
981 981 idReadUnit = self.__getNewId()
982 982 else:
983 983 idReadUnit = str(id)
984 984
985 985 readUnitConfObj = ReadUnitConf()
986 986 readUnitConfObj.setup(idReadUnit, name, datatype, parentId=self.id, **kwargs)
987 987
988 988 self.procUnitConfObjDict[readUnitConfObj.getId()] = readUnitConfObj
989 989
990 990 return readUnitConfObj
991 991
992 992 def addProcUnit(self, inputId='0', datatype=None, name=None):
993 993
994 994 idProcUnit = self.__getNewId()
995 995
996 996 procUnitConfObj = ProcUnitConf()
997 997 procUnitConfObj.setup(idProcUnit, name, datatype, inputId, parentId=self.id)
998 998
999 999 self.procUnitConfObjDict[procUnitConfObj.getId()] = procUnitConfObj
1000 1000
1001 1001 return procUnitConfObj
1002 1002
1003 1003 def removeProcUnit(self, id):
1004 1004
1005 1005 if id in self.procUnitConfObjDict.keys():
1006 1006 self.procUnitConfObjDict.pop(id)
1007 1007
1008 1008 def getReadUnitId(self):
1009 1009
1010 1010 readUnitConfObj = self.getReadUnitObj()
1011 1011
1012 1012 return readUnitConfObj.id
1013 1013
1014 1014 def getReadUnitObj(self):
1015 1015
1016 1016 for obj in self.procUnitConfObjDict.values():
1017 1017 if obj.getElementName() == "ReadUnit":
1018 1018 return obj
1019 1019
1020 1020 return None
1021 1021
1022 1022 def getProcUnitObj(self, id=None, name=None):
1023 1023
1024 1024 if id != None:
1025 1025 return self.procUnitConfObjDict[id]
1026 1026
1027 1027 if name != None:
1028 1028 return self.getProcUnitObjByName(name)
1029 1029
1030 1030 return None
1031 1031
1032 1032 def getProcUnitObjByName(self, name):
1033 1033
1034 1034 for obj in self.procUnitConfObjDict.values():
1035 1035 if obj.name == name:
1036 1036 return obj
1037 1037
1038 1038 return None
1039 1039
1040 1040 def procUnitItems(self):
1041 1041
1042 1042 return self.procUnitConfObjDict.items()
1043 1043
1044 1044 def makeXml(self):
1045 1045
1046 1046 projectElement = Element('Project')
1047 1047 projectElement.set('id', str(self.id))
1048 1048 projectElement.set('name', self.name)
1049 1049 projectElement.set('description', self.description)
1050 1050
1051 1051 for procUnitConfObj in self.procUnitConfObjDict.values():
1052 1052 procUnitConfObj.makeXml(projectElement)
1053 1053
1054 1054 self.projectElement = projectElement
1055 1055
1056 1056 def writeXml(self, filename=None):
1057 1057
1058 1058 if filename == None:
1059 1059 if self.filename:
1060 1060 filename = self.filename
1061 1061 else:
1062 1062 filename = "schain.xml"
1063 1063
1064 1064 if not filename:
1065 1065 print "filename has not been defined. Use setFilename(filename) for do it."
1066 1066 return 0
1067 1067
1068 1068 abs_file = os.path.abspath(filename)
1069 1069
1070 1070 if not os.access(os.path.dirname(abs_file), os.W_OK):
1071 1071 print "No write permission on %s" %os.path.dirname(abs_file)
1072 1072 return 0
1073 1073
1074 1074 if os.path.isfile(abs_file) and not(os.access(abs_file, os.W_OK)):
1075 1075 print "File %s already exists and it could not be overwriten" %abs_file
1076 1076 return 0
1077 1077
1078 1078 self.makeXml()
1079 1079
1080 1080 ElementTree(self.projectElement).write(abs_file, method='xml')
1081 1081
1082 1082 self.filename = abs_file
1083 1083
1084 1084 return 1
1085 1085
1086 1086 def readXml(self, filename = None):
1087 1087
1088 1088 if not filename:
1089 1089 print "filename is not defined"
1090 1090 return 0
1091 1091
1092 1092 abs_file = os.path.abspath(filename)
1093 1093
1094 1094 if not os.path.isfile(abs_file):
1095 1095 print "%s file does not exist" %abs_file
1096 1096 return 0
1097 1097
1098 1098 self.projectElement = None
1099 1099 self.procUnitConfObjDict = {}
1100 1100
1101 1101 try:
1102 1102 self.projectElement = ElementTree().parse(abs_file)
1103 1103 except:
1104 1104 print "Error reading %s, verify file format" %filename
1105 1105 return 0
1106 1106
1107 1107 self.project = self.projectElement.tag
1108 1108
1109 1109 self.id = self.projectElement.get('id')
1110 1110 self.name = self.projectElement.get('name')
1111 1111 self.description = self.projectElement.get('description')
1112 1112
1113 1113 readUnitElementList = self.projectElement.iter(ReadUnitConf().getElementName())
1114 1114
1115 1115 for readUnitElement in readUnitElementList:
1116 1116 readUnitConfObj = ReadUnitConf()
1117 1117 readUnitConfObj.readXml(readUnitElement)
1118 1118
1119 1119 if readUnitConfObj.parentId == None:
1120 1120 readUnitConfObj.parentId = self.id
1121 1121
1122 1122 self.procUnitConfObjDict[readUnitConfObj.getId()] = readUnitConfObj
1123 1123
1124 1124 procUnitElementList = self.projectElement.iter(ProcUnitConf().getElementName())
1125 1125
1126 1126 for procUnitElement in procUnitElementList:
1127 1127 procUnitConfObj = ProcUnitConf()
1128 1128 procUnitConfObj.readXml(procUnitElement)
1129 1129
1130 1130 if procUnitConfObj.parentId == None:
1131 1131 procUnitConfObj.parentId = self.id
1132 1132
1133 1133 self.procUnitConfObjDict[procUnitConfObj.getId()] = procUnitConfObj
1134 1134
1135 1135 self.filename = abs_file
1136 1136
1137 1137 return 1
1138 1138
1139 1139 def printattr(self):
1140 1140
1141 1141 print "Project[%s]: name = %s, description = %s" %(self.id,
1142 1142 self.name,
1143 1143 self.description)
1144 1144
1145 1145 for procUnitConfObj in self.procUnitConfObjDict.values():
1146 1146 procUnitConfObj.printattr()
1147 1147
1148 1148 def createObjects(self):
1149 1149
1150 1150 for procUnitConfObj in self.procUnitConfObjDict.values():
1151 1151 procUnitConfObj.createObjects(self.plotterQueue)
1152 1152
1153 1153 def __connect(self, objIN, thisObj):
1154 1154
1155 1155 thisObj.setInput(objIN.getOutputObj())
1156 1156
1157 1157 def connectObjects(self):
1158 1158
1159 1159 for thisPUConfObj in self.procUnitConfObjDict.values():
1160 1160
1161 1161 inputId = thisPUConfObj.getInputId()
1162 1162
1163 1163 if int(inputId) == 0:
1164 1164 continue
1165 1165
1166 1166 #Get input object
1167 1167 puConfINObj = self.procUnitConfObjDict[inputId]
1168 1168 puObjIN = puConfINObj.getProcUnitObj()
1169 1169
1170 1170 #Get current object
1171 1171 thisPUObj = thisPUConfObj.getProcUnitObj()
1172 1172
1173 1173 self.__connect(puObjIN, thisPUObj)
1174 1174
1175 1175 def __handleError(self, procUnitConfObj, send_email=True):
1176 1176
1177 1177 import socket
1178 1178
1179 1179 err = traceback.format_exception(sys.exc_info()[0],
1180 1180 sys.exc_info()[1],
1181 1181 sys.exc_info()[2])
1182 1182
1183 1183 print "***** Error occurred in %s *****" %(procUnitConfObj.name)
1184 1184 print "***** %s" %err[-1]
1185 1185
1186 1186 message = "".join(err)
1187 1187
1188 1188 sys.stderr.write(message)
1189 1189
1190 1190 if not send_email:
1191 1191 return
1192 1192
1193 1193 subject = "SChain v%s: Error running %s\n" %(schainpy.__version__, procUnitConfObj.name)
1194 1194
1195 1195 subtitle = "%s: %s\n" %(procUnitConfObj.getElementName() ,procUnitConfObj.name)
1196 1196 subtitle += "Hostname: %s\n" %socket.gethostbyname(socket.gethostname())
1197 1197 subtitle += "Working directory: %s\n" %os.path.abspath("./")
1198 1198 subtitle += "Configuration file: %s\n" %self.filename
1199 1199 subtitle += "Time: %s\n" %str(datetime.datetime.now())
1200 1200
1201 1201 readUnitConfObj = self.getReadUnitObj()
1202 1202 if readUnitConfObj:
1203 1203 subtitle += "\nInput parameters:\n"
1204 1204 subtitle += "[Data path = %s]\n" %readUnitConfObj.path
1205 1205 subtitle += "[Data type = %s]\n" %readUnitConfObj.datatype
1206 1206 subtitle += "[Start date = %s]\n" %readUnitConfObj.startDate
1207 1207 subtitle += "[End date = %s]\n" %readUnitConfObj.endDate
1208 1208 subtitle += "[Start time = %s]\n" %readUnitConfObj.startTime
1209 1209 subtitle += "[End time = %s]\n" %readUnitConfObj.endTime
1210 1210
1211 1211 adminObj = schainpy.admin.SchainNotify()
1212 1212 adminObj.sendAlert(message=message,
1213 1213 subject=subject,
1214 1214 subtitle=subtitle,
1215 1215 filename=self.filename)
1216 1216
1217 1217 def isPaused(self):
1218 1218 return 0
1219 1219
1220 1220 def isStopped(self):
1221 1221 return 0
1222 1222
1223 1223 def runController(self):
1224 1224 """
1225 1225 returns 0 when this process has been stopped, 1 otherwise
1226 1226 """
1227 1227
1228 1228 if self.isPaused():
1229 1229 print "Process suspended"
1230 1230
1231 1231 while True:
1232 1232 sleep(0.1)
1233 1233
1234 1234 if not self.isPaused():
1235 1235 break
1236 1236
1237 1237 if self.isStopped():
1238 1238 break
1239 1239
1240 1240 print "Process reinitialized"
1241 1241
1242 1242 if self.isStopped():
1243 1243 print "Process stopped"
1244 1244 return 0
1245 1245
1246 1246 return 1
1247 1247
1248 1248 def setFilename(self, filename):
1249 1249
1250 1250 self.filename = filename
1251 1251
1252 1252 def setPlotterQueue(self, plotter_queue):
1253 1253
1254 1254 raise NotImplementedError, "Use schainpy.controller_api.ControllerThread instead Project class"
1255 1255
1256 1256 def getPlotterQueue(self):
1257 1257
1258 1258 raise NotImplementedError, "Use schainpy.controller_api.ControllerThread instead Project class"
1259 1259
1260 1260 def useExternalPlotter(self):
1261 1261
1262 1262 raise NotImplementedError, "Use schainpy.controller_api.ControllerThread instead Project class"
1263 1263
1264 1264 def run(self):
1265 1265
1266 1266 print
1267 1267 print "*"*60
1268 1268 print " Starting SIGNAL CHAIN PROCESSING v%s " %schainpy.__version__
1269 1269 print "*"*60
1270 1270 print
1271 1271
1272 1272 keyList = self.procUnitConfObjDict.keys()
1273 1273 keyList.sort()
1274 1274
1275 1275 while(True):
1276 1276
1277 1277 is_ok = False
1278 1278
1279 1279 for procKey in keyList:
1280 1280 # print "Running the '%s' process with %s" %(procUnitConfObj.name, procUnitConfObj.id)
1281 1281
1282 1282 procUnitConfObj = self.procUnitConfObjDict[procKey]
1283 1283
1284 1284 try:
1285 1285 sts = procUnitConfObj.run()
1286 1286 is_ok = is_ok or sts
1287 1287 except KeyboardInterrupt:
1288 1288 is_ok = False
1289 1289 break
1290 1290 except ValueError, e:
1291 1291 sleep(0.5)
1292 1292 self.__handleError(procUnitConfObj, send_email=True)
1293 1293 is_ok = False
1294 1294 break
1295 1295 except:
1296 1296 sleep(0.5)
1297 1297 self.__handleError(procUnitConfObj)
1298 1298 is_ok = False
1299 1299 break
1300 1300
1301 1301 #If every process unit finished so end process
1302 1302 if not(is_ok):
1303 1303 # print "Every process unit have finished"
1304 1304 break
1305 1305
1306 1306 if not self.runController():
1307 1307 break
1308 1308
1309 1309 #Closing every process
1310 1310 for procKey in keyList:
1311 1311 procUnitConfObj = self.procUnitConfObjDict[procKey]
1312 1312 procUnitConfObj.close()
1313 1313
1314 1314 print "Process finished"
1315 1315
1316 1316 def start(self):
1317 1317
1318 1318 self.writeXml()
1319 1319 self.createObjects()
1320 1320 self.connectObjects()
1321 1321 self.run()
1 NO CONTENT: modified file
@@ -1,693 +1,707
1 1
2 2 import os
3 3 import zmq
4 4 import time
5 5 import numpy
6 6 import datetime
7 7 import numpy as np
8 8 import matplotlib
9 9 matplotlib.use('TkAgg')
10 10 import matplotlib.pyplot as plt
11 11 from mpl_toolkits.axes_grid1 import make_axes_locatable
12 12 from matplotlib.ticker import FuncFormatter, LinearLocator
13 13 from multiprocessing import Process
14 14
15 15 from schainpy.model.proc.jroproc_base import Operation
16 16
17 17 plt.ioff()
18 18
19 19 func = lambda x, pos: ('%s') %(datetime.datetime.fromtimestamp(x).strftime('%H:%M'))
20 20
21 21 d1970 = datetime.datetime(1970,1,1)
22 22
23 23 class PlotData(Operation, Process):
24 24
25 25 CODE = 'Figure'
26 26 colormap = 'jro'
27 CONFLATE = True
27 CONFLATE = False
28 28 __MAXNUMX = 80
29 __MAXNUMY = 80
30 29 __missing = 1E30
31 30
32 31 def __init__(self, **kwargs):
33 32
34 33 Operation.__init__(self, plot=True, **kwargs)
35 34 Process.__init__(self)
36 35 self.kwargs['code'] = self.CODE
37 36 self.mp = False
38 37 self.dataOut = None
39 38 self.isConfig = False
40 39 self.figure = None
41 40 self.axes = []
42 41 self.localtime = kwargs.pop('localtime', True)
43 42 self.show = kwargs.get('show', True)
44 43 self.save = kwargs.get('save', False)
45 44 self.colormap = kwargs.get('colormap', self.colormap)
46 45 self.colormap_coh = kwargs.get('colormap_coh', 'jet')
47 46 self.colormap_phase = kwargs.get('colormap_phase', 'RdBu_r')
48 47 self.showprofile = kwargs.get('showprofile', True)
49 48 self.title = kwargs.get('wintitle', '')
50 49 self.xaxis = kwargs.get('xaxis', 'frequency')
51 50 self.zmin = kwargs.get('zmin', None)
52 51 self.zmax = kwargs.get('zmax', None)
53 52 self.xmin = kwargs.get('xmin', None)
54 53 self.xmax = kwargs.get('xmax', None)
55 54 self.xrange = kwargs.get('xrange', 24)
56 55 self.ymin = kwargs.get('ymin', None)
57 56 self.ymax = kwargs.get('ymax', None)
57 self.__MAXNUMY = kwargs.get('decimation', 80)
58 58 self.throttle_value = 5
59 self.times = []
59 60
60 61 def fill_gaps(self, x_buffer, y_buffer, z_buffer):
61 62
62 63 if x_buffer.shape[0] < 2:
63 64 return x_buffer, y_buffer, z_buffer
64 65
65 66 deltas = x_buffer[1:] - x_buffer[0:-1]
66 67 x_median = np.median(deltas)
67 68
68 69 index = np.where(deltas > 5*x_median)
69 70
70 71 if len(index[0]) != 0:
71 72 z_buffer[::, index[0], ::] = self.__missing
72 73 z_buffer = np.ma.masked_inside(z_buffer,
73 74 0.99*self.__missing,
74 75 1.01*self.__missing)
75 76
76 77 return x_buffer, y_buffer, z_buffer
77 78
78 79 def decimate(self):
79 80
80 81 # dx = int(len(self.x)/self.__MAXNUMX) + 1
81 82 dy = int(len(self.y)/self.__MAXNUMY) + 1
82 83
83 84 # x = self.x[::dx]
84 85 x = self.x
85 86 y = self.y[::dy]
86 87 z = self.z[::, ::, ::dy]
87 88
88 89 return x, y, z
89 90
90 91 def __plot(self):
91 92
92 93 print 'plotting...{}'.format(self.CODE)
93 94
94 95 if self.show:
95 96 print 'showing'
96 97 self.figure.show()
97 98
98 99 self.plot()
99 100 plt.tight_layout()
100 101 self.figure.canvas.manager.set_window_title('{} {} - Date:{}'.format(self.title, self.CODE.upper(),
101 102 datetime.datetime.fromtimestamp(self.max_time).strftime('%y/%m/%d %H:%M:%S')))
102 103
103 104 if self.save:
104 105 figname = os.path.join(self.save, '{}_{}.png'.format(self.CODE,
105 106 datetime.datetime.fromtimestamp(self.saveTime).strftime('%y%m%d_%H%M%S')))
106 107 print 'Saving figure: {}'.format(figname)
107 108 self.figure.savefig(figname)
108 109
109 110 self.figure.canvas.draw()
110 111
111 112 def plot(self):
112 113
113 114 print 'plotting...{}'.format(self.CODE.upper())
114 115 return
115 116
116 117 def run(self):
117 118
118 119 print '[Starting] {}'.format(self.name)
119 120 context = zmq.Context()
120 121 receiver = context.socket(zmq.SUB)
121 122 receiver.setsockopt(zmq.SUBSCRIBE, '')
122 123 receiver.setsockopt(zmq.CONFLATE, self.CONFLATE)
123 124 receiver.connect("ipc:///tmp/zmq.plots")
124
125 seconds_passed = 0
125 126 while True:
126 127 try:
127 self.data = receiver.recv_pyobj(flags=zmq.NOBLOCK)
128 self.data = receiver.recv_pyobj(flags=zmq.NOBLOCK)#flags=zmq.NOBLOCK
129 self.started = self.data['STARTED']
128 130 self.dataOut = self.data['dataOut']
131
132 if (len(self.times) < len(self.data['times']) and not self.started and self.data['ENDED']):
133 continue
134
129 135 self.times = self.data['times']
130 136 self.times.sort()
131 137 self.throttle_value = self.data['throttle']
132 138 self.min_time = self.times[0]
133 139 self.max_time = self.times[-1]
134 140
135 141 if self.isConfig is False:
142 print 'setting up'
136 143 self.setup()
137 144 self.isConfig = True
138 145 self.__plot()
139 146
140 147 if self.data['ENDED'] is True:
148 print '********GRAPHIC ENDED********'
149 self.ended = True
141 150 self.isConfig = False
151 self.__plot()
152 elif seconds_passed >= self.data['throttle']:
153 print 'passed', seconds_passed
154 self.__plot()
155 seconds_passed = 0
142 156
143 157 except zmq.Again as e:
144 158 print 'Waiting for data...'
145 plt.pause(self.throttle_value)
159 plt.pause(2)
160 seconds_passed += 2
146 161
147 162 def close(self):
148 163 if self.dataOut:
149 164 self.__plot()
150 165
151 166
152 167 class PlotSpectraData(PlotData):
153 168
154 169 CODE = 'spc'
155 170 colormap = 'jro'
156 171 CONFLATE = False
157 172
158 173 def setup(self):
159 174
160 175 ncolspan = 1
161 176 colspan = 1
162 177 self.ncols = int(numpy.sqrt(self.dataOut.nChannels)+0.9)
163 178 self.nrows = int(self.dataOut.nChannels*1./self.ncols + 0.9)
164 179 self.width = 3.6*self.ncols
165 180 self.height = 3.2*self.nrows
166 181 if self.showprofile:
167 182 ncolspan = 3
168 183 colspan = 2
169 184 self.width += 1.2*self.ncols
170 185
171 186 self.ylabel = 'Range [Km]'
172 187 self.titles = ['Channel {}'.format(x) for x in self.dataOut.channelList]
173 188
174 189 if self.figure is None:
175 190 self.figure = plt.figure(figsize=(self.width, self.height),
176 191 edgecolor='k',
177 192 facecolor='w')
178 193 else:
179 194 self.figure.clf()
180 195
181 196 n = 0
182 197 for y in range(self.nrows):
183 198 for x in range(self.ncols):
184 199 if n >= self.dataOut.nChannels:
185 200 break
186 201 ax = plt.subplot2grid((self.nrows, self.ncols*ncolspan), (y, x*ncolspan), 1, colspan)
187 202 if self.showprofile:
188 203 ax.ax_profile = plt.subplot2grid((self.nrows, self.ncols*ncolspan), (y, x*ncolspan+colspan), 1, 1)
189 204
190 205 ax.firsttime = True
191 206 self.axes.append(ax)
192 207 n += 1
193 208
194 209 def plot(self):
195 210
196 211 if self.xaxis == "frequency":
197 212 x = self.dataOut.getFreqRange(1)/1000.
198 213 xlabel = "Frequency (kHz)"
199 214 elif self.xaxis == "time":
200 215 x = self.dataOut.getAcfRange(1)
201 216 xlabel = "Time (ms)"
202 217 else:
203 218 x = self.dataOut.getVelRange(1)
204 219 xlabel = "Velocity (m/s)"
205 220
206 221 y = self.dataOut.getHeiRange()
207 222 z = self.data[self.CODE]
208 223
209 224 for n, ax in enumerate(self.axes):
210 225
211 226 if ax.firsttime:
212 227 self.xmax = self.xmax if self.xmax else np.nanmax(x)
213 228 self.xmin = self.xmin if self.xmin else -self.xmax
214 229 self.ymin = self.ymin if self.ymin else np.nanmin(y)
215 230 self.ymax = self.ymax if self.ymax else np.nanmax(y)
216 231 self.zmin = self.zmin if self.zmin else np.nanmin(z)
217 232 self.zmax = self.zmax if self.zmax else np.nanmax(z)
218 233 ax.plot = ax.pcolormesh(x, y, z[n].T,
219 234 vmin=self.zmin,
220 235 vmax=self.zmax,
221 236 cmap=plt.get_cmap(self.colormap)
222 237 )
223 238 divider = make_axes_locatable(ax)
224 239 cax = divider.new_horizontal(size='3%', pad=0.05)
225 240 self.figure.add_axes(cax)
226 241 plt.colorbar(ax.plot, cax)
227 242
228 243 ax.set_xlim(self.xmin, self.xmax)
229 244 ax.set_ylim(self.ymin, self.ymax)
230 245
231 246 ax.set_ylabel(self.ylabel)
232 247 ax.set_xlabel(xlabel)
233 248
234 249 ax.firsttime = False
235 250
236 251 if self.showprofile:
237 252 ax.plot_profile= ax.ax_profile.plot(self.data['rti'][self.max_time][n], y)[0]
238 253 ax.ax_profile.set_xlim(self.zmin, self.zmax)
239 254 ax.ax_profile.set_ylim(self.ymin, self.ymax)
240 255 ax.ax_profile.set_xlabel('dB')
241 256 ax.ax_profile.grid(b=True, axis='x')
242 257 ax.plot_noise = ax.ax_profile.plot(numpy.repeat(self.data['noise'][self.max_time][n], len(y)), y,
243 258 color="k", linestyle="dashed", lw=2)[0]
244 259 [tick.set_visible(False) for tick in ax.ax_profile.get_yticklabels()]
245 260 else:
246 261 ax.plot.set_array(z[n].T.ravel())
247 262 if self.showprofile:
248 263 ax.plot_profile.set_data(self.data['rti'][self.max_time][n], y)
249 264 ax.plot_noise.set_data(numpy.repeat(self.data['noise'][self.max_time][n], len(y)), y)
250 265
251 266 ax.set_title('{} - Noise: {:.2f} dB'.format(self.titles[n], self.data['noise'][self.max_time][n]),
252 267 size=8)
253 268 self.saveTime = self.max_time
254 269
255 270
256 271 class PlotCrossSpectraData(PlotData):
257 272
258 273 CODE = 'cspc'
259 274 zmin_coh = None
260 275 zmax_coh = None
261 276 zmin_phase = None
262 277 zmax_phase = None
263 278 CONFLATE = False
264 279
265 280 def setup(self):
266 281
267 282 ncolspan = 1
268 283 colspan = 1
269 284 self.ncols = 2
270 285 self.nrows = self.dataOut.nPairs
271 286 self.width = 3.6*self.ncols
272 287 self.height = 3.2*self.nrows
273 288
274 289 self.ylabel = 'Range [Km]'
275 290 self.titles = ['Channel {}'.format(x) for x in self.dataOut.channelList]
276 291
277 292 if self.figure is None:
278 293 self.figure = plt.figure(figsize=(self.width, self.height),
279 294 edgecolor='k',
280 295 facecolor='w')
281 296 else:
282 297 self.figure.clf()
283 298
284 299 for y in range(self.nrows):
285 300 for x in range(self.ncols):
286 301 ax = plt.subplot2grid((self.nrows, self.ncols), (y, x), 1, 1)
287 302 ax.firsttime = True
288 303 self.axes.append(ax)
289 304
290 305 def plot(self):
291 306
292 307 if self.xaxis == "frequency":
293 308 x = self.dataOut.getFreqRange(1)/1000.
294 309 xlabel = "Frequency (kHz)"
295 310 elif self.xaxis == "time":
296 311 x = self.dataOut.getAcfRange(1)
297 312 xlabel = "Time (ms)"
298 313 else:
299 314 x = self.dataOut.getVelRange(1)
300 315 xlabel = "Velocity (m/s)"
301 316
302 317 y = self.dataOut.getHeiRange()
303 318 z_coh = self.data['cspc_coh']
304 319 z_phase = self.data['cspc_phase']
305 320
306 321 for n in range(self.nrows):
307 322 ax = self.axes[2*n]
308 323 ax1 = self.axes[2*n+1]
309 324 if ax.firsttime:
310 325 self.xmax = self.xmax if self.xmax else np.nanmax(x)
311 326 self.xmin = self.xmin if self.xmin else -self.xmax
312 327 self.ymin = self.ymin if self.ymin else np.nanmin(y)
313 328 self.ymax = self.ymax if self.ymax else np.nanmax(y)
314 329 self.zmin_coh = self.zmin_coh if self.zmin_coh else 0.0
315 330 self.zmax_coh = self.zmax_coh if self.zmax_coh else 1.0
316 331 self.zmin_phase = self.zmin_phase if self.zmin_phase else -180
317 332 self.zmax_phase = self.zmax_phase if self.zmax_phase else 180
318 333
319 334 ax.plot = ax.pcolormesh(x, y, z_coh[n].T,
320 335 vmin=self.zmin_coh,
321 336 vmax=self.zmax_coh,
322 337 cmap=plt.get_cmap(self.colormap_coh)
323 338 )
324 339 divider = make_axes_locatable(ax)
325 340 cax = divider.new_horizontal(size='3%', pad=0.05)
326 341 self.figure.add_axes(cax)
327 342 plt.colorbar(ax.plot, cax)
328 343
329 344 ax.set_xlim(self.xmin, self.xmax)
330 345 ax.set_ylim(self.ymin, self.ymax)
331 346
332 347 ax.set_ylabel(self.ylabel)
333 348 ax.set_xlabel(xlabel)
334 349 ax.firsttime = False
335 350
336 351 ax1.plot = ax1.pcolormesh(x, y, z_phase[n].T,
337 352 vmin=self.zmin_phase,
338 353 vmax=self.zmax_phase,
339 354 cmap=plt.get_cmap(self.colormap_phase)
340 355 )
341 356 divider = make_axes_locatable(ax1)
342 357 cax = divider.new_horizontal(size='3%', pad=0.05)
343 358 self.figure.add_axes(cax)
344 359 plt.colorbar(ax1.plot, cax)
345 360
346 361 ax1.set_xlim(self.xmin, self.xmax)
347 362 ax1.set_ylim(self.ymin, self.ymax)
348 363
349 364 ax1.set_ylabel(self.ylabel)
350 365 ax1.set_xlabel(xlabel)
351 366 ax1.firsttime = False
352 367 else:
353 368 ax.plot.set_array(z_coh[n].T.ravel())
354 369 ax1.plot.set_array(z_phase[n].T.ravel())
355 370
356 371 ax.set_title('Coherence Ch{} * Ch{}'.format(self.dataOut.pairsList[n][0], self.dataOut.pairsList[n][1]), size=8)
357 372 ax1.set_title('Phase Ch{} * Ch{}'.format(self.dataOut.pairsList[n][0], self.dataOut.pairsList[n][1]), size=8)
358 373 self.saveTime = self.max_time
359 374
360 375
361 376 class PlotSpectraMeanData(PlotSpectraData):
362 377
363 378 CODE = 'spc_mean'
364 379 colormap = 'jet'
365 380
366 381 def plot(self):
367 382
368 383 if self.xaxis == "frequency":
369 384 x = self.dataOut.getFreqRange(1)/1000.
370 385 xlabel = "Frequency (kHz)"
371 386 elif self.xaxis == "time":
372 387 x = self.dataOut.getAcfRange(1)
373 388 xlabel = "Time (ms)"
374 389 else:
375 390 x = self.dataOut.getVelRange(1)
376 391 xlabel = "Velocity (m/s)"
377 392
378 393 y = self.dataOut.getHeiRange()
379 394 z = self.data['spc']
380 395 mean = self.data['mean'][self.max_time]
381 396
382 397 for n, ax in enumerate(self.axes):
383 398
384 399 if ax.firsttime:
385 400 self.xmax = self.xmax if self.xmax else np.nanmax(x)
386 401 self.xmin = self.xmin if self.xmin else -self.xmax
387 402 self.ymin = self.ymin if self.ymin else np.nanmin(y)
388 403 self.ymax = self.ymax if self.ymax else np.nanmax(y)
389 404 self.zmin = self.zmin if self.zmin else np.nanmin(z)
390 405 self.zmax = self.zmax if self.zmax else np.nanmax(z)
391 406 ax.plt = ax.pcolormesh(x, y, z[n].T,
392 407 vmin=self.zmin,
393 408 vmax=self.zmax,
394 409 cmap=plt.get_cmap(self.colormap)
395 410 )
396 411 ax.plt_dop = ax.plot(mean[n], y,
397 412 color='k')[0]
398 413
399 414 divider = make_axes_locatable(ax)
400 415 cax = divider.new_horizontal(size='3%', pad=0.05)
401 416 self.figure.add_axes(cax)
402 417 plt.colorbar(ax.plt, cax)
403 418
404 419 ax.set_xlim(self.xmin, self.xmax)
405 420 ax.set_ylim(self.ymin, self.ymax)
406 421
407 422 ax.set_ylabel(self.ylabel)
408 423 ax.set_xlabel(xlabel)
409 424
410 425 ax.firsttime = False
411 426
412 427 if self.showprofile:
413 428 ax.plt_profile= ax.ax_profile.plot(self.data['rti'][self.max_time][n], y)[0]
414 429 ax.ax_profile.set_xlim(self.zmin, self.zmax)
415 430 ax.ax_profile.set_ylim(self.ymin, self.ymax)
416 431 ax.ax_profile.set_xlabel('dB')
417 432 ax.ax_profile.grid(b=True, axis='x')
418 433 ax.plt_noise = ax.ax_profile.plot(numpy.repeat(self.data['noise'][self.max_time][n], len(y)), y,
419 434 color="k", linestyle="dashed", lw=2)[0]
420 435 [tick.set_visible(False) for tick in ax.ax_profile.get_yticklabels()]
421 436 else:
422 437 ax.plt.set_array(z[n].T.ravel())
423 438 ax.plt_dop.set_data(mean[n], y)
424 439 if self.showprofile:
425 440 ax.plt_profile.set_data(self.data['rti'][self.max_time][n], y)
426 441 ax.plt_noise.set_data(numpy.repeat(self.data['noise'][self.max_time][n], len(y)), y)
427 442
428 443 ax.set_title('{} - Noise: {:.2f} dB'.format(self.titles[n], self.data['noise'][self.max_time][n]),
429 444 size=8)
430 445 self.saveTime = self.max_time
431 446
432 447
433 448 class PlotRTIData(PlotData):
434 449
435 450 CODE = 'rti'
436 451 colormap = 'jro'
437 452
438 453 def setup(self):
439 454 self.ncols = 1
440 455 self.nrows = self.dataOut.nChannels
441 456 self.width = 10
442 457 self.height = 2.2*self.nrows if self.nrows<6 else 12
443 458 if self.nrows==1:
444 459 self.height += 1
445 460 self.ylabel = 'Range [Km]'
446 461 self.titles = ['Channel {}'.format(x) for x in self.dataOut.channelList]
447 462
448 463 if self.figure is None:
449 464 self.figure = plt.figure(figsize=(self.width, self.height),
450 465 edgecolor='k',
451 466 facecolor='w')
452 467 else:
453 468 self.figure.clf()
454 469 self.axes = []
455 470
456 471 for n in range(self.nrows):
457 472 ax = self.figure.add_subplot(self.nrows, self.ncols, n+1)
458 473 ax.firsttime = True
459 474 self.axes.append(ax)
460 475
461 476 def plot(self):
462 477
463 478 self.x = np.array(self.times)
464 479 self.y = self.dataOut.getHeiRange()
465 480 self.z = []
466 481
467 482 for ch in range(self.nrows):
468 483 self.z.append([self.data[self.CODE][t][ch] for t in self.times])
469 484
470 485 self.z = np.array(self.z)
471 486 for n, ax in enumerate(self.axes):
472
473 487 x, y, z = self.fill_gaps(*self.decimate())
474 488 xmin = self.min_time
475 489 xmax = xmin+self.xrange*60*60
490 self.zmin = self.zmin if self.zmin else np.min(self.z)
491 self.zmax = self.zmax if self.zmax else np.max(self.z)
476 492 if ax.firsttime:
477 493 self.ymin = self.ymin if self.ymin else np.nanmin(self.y)
478 494 self.ymax = self.ymax if self.ymax else np.nanmax(self.y)
479 self.zmin = self.zmin if self.zmin else np.nanmin(self.z)
480 self.zmax = self.zmax if self.zmax else np.nanmax(self.z)
481 495 plot = ax.pcolormesh(x, y, z[n].T,
482 496 vmin=self.zmin,
483 497 vmax=self.zmax,
484 498 cmap=plt.get_cmap(self.colormap)
485 499 )
486 500 divider = make_axes_locatable(ax)
487 501 cax = divider.new_horizontal(size='2%', pad=0.05)
488 502 self.figure.add_axes(cax)
489 503 plt.colorbar(plot, cax)
490 504 ax.set_ylim(self.ymin, self.ymax)
491 505
492 506 ax.xaxis.set_major_formatter(FuncFormatter(func))
493 507 ax.xaxis.set_major_locator(LinearLocator(6))
494 508
495 509 ax.set_ylabel(self.ylabel)
496 510
497 511 # if self.xmin is None:
498 512 # xmin = self.min_time
499 513 # else:
500 514 # xmin = (datetime.datetime.combine(self.dataOut.datatime.date(),
501 515 # datetime.time(self.xmin, 0, 0))-d1970).total_seconds()
502 516
503 517 ax.set_xlim(xmin, xmax)
504 518 ax.firsttime = False
505 519 else:
506 520 ax.collections.remove(ax.collections[0])
507 521 ax.set_xlim(xmin, xmax)
508 522 plot = ax.pcolormesh(x, y, z[n].T,
509 523 vmin=self.zmin,
510 524 vmax=self.zmax,
511 525 cmap=plt.get_cmap(self.colormap)
512 526 )
513 527 ax.set_title('{} {}'.format(self.titles[n],
514 528 datetime.datetime.fromtimestamp(self.max_time).strftime('%y/%m/%d %H:%M:%S')),
515 529 size=8)
516 530
517 531 self.saveTime = self.min_time
518 532
519 533
520 534 class PlotCOHData(PlotRTIData):
521 535
522 536 CODE = 'coh'
523 537
524 538 def setup(self):
525 539
526 540 self.ncols = 1
527 541 self.nrows = self.dataOut.nPairs
528 542 self.width = 10
529 543 self.height = 2.2*self.nrows if self.nrows<6 else 12
530 544 if self.nrows==1:
531 545 self.height += 1
532 546 self.ylabel = 'Range [Km]'
533 547 self.titles = ['{} Ch{} * Ch{}'.format(self.CODE.upper(), x[0], x[1]) for x in self.dataOut.pairsList]
534 548
535 549 if self.figure is None:
536 550 self.figure = plt.figure(figsize=(self.width, self.height),
537 551 edgecolor='k',
538 552 facecolor='w')
539 553 else:
540 554 self.figure.clf()
541 555 self.axes = []
542 556
543 557 for n in range(self.nrows):
544 558 ax = self.figure.add_subplot(self.nrows, self.ncols, n+1)
545 559 ax.firsttime = True
546 560 self.axes.append(ax)
547 561
548 562
549 563 class PlotNoiseData(PlotData):
550 564 CODE = 'noise'
551 565
552 566 def setup(self):
553 567
554 568 self.ncols = 1
555 569 self.nrows = 1
556 570 self.width = 10
557 571 self.height = 3.2
558 572 self.ylabel = 'Intensity [dB]'
559 573 self.titles = ['Noise']
560 574
561 575 if self.figure is None:
562 576 self.figure = plt.figure(figsize=(self.width, self.height),
563 577 edgecolor='k',
564 578 facecolor='w')
565 579 else:
566 580 self.figure.clf()
567 581 self.axes = []
568 582
569 583 self.ax = self.figure.add_subplot(self.nrows, self.ncols, 1)
570 584 self.ax.firsttime = True
571 585
572 586 def plot(self):
573 587
574 588 x = self.times
575 589 xmin = self.min_time
576 590 xmax = xmin+self.xrange*60*60
577 591 if self.ax.firsttime:
578 592 for ch in self.dataOut.channelList:
579 593 y = [self.data[self.CODE][t][ch] for t in self.times]
580 594 self.ax.plot(x, y, lw=1, label='Ch{}'.format(ch))
581 595 self.ax.firsttime = False
582 596 self.ax.xaxis.set_major_formatter(FuncFormatter(func))
583 597 self.ax.xaxis.set_major_locator(LinearLocator(6))
584 598 self.ax.set_ylabel(self.ylabel)
585 599 plt.legend()
586 600 else:
587 601 for ch in self.dataOut.channelList:
588 602 y = [self.data[self.CODE][t][ch] for t in self.times]
589 603 self.ax.lines[ch].set_data(x, y)
590 604
591 605 self.ax.set_xlim(xmin, xmax)
592 606 self.ax.set_ylim(min(y)-5, max(y)+5)
593 607 self.saveTime = self.min_time
594 608
595 609
596 610 class PlotWindProfilerData(PlotRTIData):
597 611 CODE = 'wind'
598 612 colormap = 'seismic'
599 613
600 614 def setup(self):
601 615 self.ncols = 1
602 616 self.nrows = self.dataOut.data_output.shape[0]
603 617 self.width = 10
604 618 self.height = 2.2*self.nrows
605 619 self.ylabel = 'Height [Km]'
606 620 self.titles = ['Zonal' ,'Meridional', 'Vertical']
607 621 self.clabels = ['Velocity (m/s)','Velocity (m/s)','Velocity (cm/s)']
608 622 self.windFactor = [1, 1, 100]
609 623
610 624 if self.figure is None:
611 625 self.figure = plt.figure(figsize=(self.width, self.height),
612 626 edgecolor='k',
613 627 facecolor='w')
614 628 else:
615 629 self.figure.clf()
616 630 self.axes = []
617 631
618 632 for n in range(self.nrows):
619 633 ax = self.figure.add_subplot(self.nrows, self.ncols, n+1)
620 634 ax.firsttime = True
621 635 self.axes.append(ax)
622 636
623 637 def plot(self):
624 638
625 639 self.x = np.array(self.times)
626 640 self.y = self.dataOut.heightList
627 641 self.z = []
628 642
629 643 for ch in range(self.nrows):
630 644 self.z.append([self.data[self.CODE][t][ch] for t in self.times])
631 645
632 646 self.z = np.array(self.z)
633 647 self.z = numpy.ma.masked_invalid(self.z)
634 648
635 649 cmap=plt.get_cmap(self.colormap)
636 650 cmap.set_bad('white', 1.)
637 651
638 652 for n, ax in enumerate(self.axes):
639 653 x, y, z = self.fill_gaps(*self.decimate())
640 654 xmin = self.min_time
641 655 xmax = xmin+self.xrange*60*60
642 656 if ax.firsttime:
643 657 self.ymin = self.ymin if self.ymin else np.nanmin(self.y)
644 658 self.ymax = self.ymax if self.ymax else np.nanmax(self.y)
645 659 self.zmax = self.zmax if self.zmax else numpy.nanmax(abs(self.z[:-1, :]))
646 660 self.zmin = self.zmin if self.zmin else -self.zmax
647 661
648 662 plot = ax.pcolormesh(x, y, z[n].T*self.windFactor[n],
649 663 vmin=self.zmin,
650 664 vmax=self.zmax,
651 665 cmap=cmap
652 666 )
653 667 divider = make_axes_locatable(ax)
654 668 cax = divider.new_horizontal(size='2%', pad=0.05)
655 669 cax.set_ylabel(self.clabels[n])
656 670 self.figure.add_axes(cax)
657 671 plt.colorbar(plot, cax)
658 672 ax.set_ylim(self.ymin, self.ymax)
659 673
660 674 ax.xaxis.set_major_formatter(FuncFormatter(func))
661 675 ax.xaxis.set_major_locator(LinearLocator(6))
662 676
663 677 ax.set_ylabel(self.ylabel)
664 678
665 679 ax.set_xlim(xmin, xmax)
666 680 ax.firsttime = False
667 681 else:
668 682 ax.collections.remove(ax.collections[0])
669 683 ax.set_xlim(xmin, xmax)
670 684 plot = ax.pcolormesh(x, y, z[n].T*self.windFactor[n],
671 685 vmin=self.zmin,
672 686 vmax=self.zmax,
673 687 cmap=plt.get_cmap(self.colormap)
674 688 )
675 689 ax.set_title('{} {}'.format(self.titles[n],
676 690 datetime.datetime.fromtimestamp(self.max_time).strftime('%y/%m/%d %H:%M:%S')),
677 691 size=8)
678 692
679 693 self.saveTime = self.min_time
680 694
681 695
682 696 class PlotSNRData(PlotRTIData):
683 697 CODE = 'snr'
684 698 colormap = 'jet'
685 699
686 700 class PlotDOPData(PlotRTIData):
687 701 CODE = 'dop'
688 702 colormap = 'jet'
689 703
690 704
691 705 class PlotPHASEData(PlotCOHData):
692 706 CODE = 'phase'
693 707 colormap = 'seismic'
@@ -1,1743 +1,1750
1 1 '''
2 2 Created on Jul 2, 2014
3 3
4 4 @author: roj-idl71
5 5 '''
6 6 import os
7 7 import sys
8 8 import glob
9 9 import time
10 10 import numpy
11 11 import fnmatch
12 12 import time, datetime
13 13 #import h5py
14 14 import traceback
15 15
16 16 try:
17 17 from gevent import sleep
18 18 except:
19 19 from time import sleep
20 20
21 21 from schainpy.model.data.jroheaderIO import PROCFLAG, BasicHeader, SystemHeader, RadarControllerHeader, ProcessingHeader
22 22 from schainpy.model.data.jroheaderIO import get_dtype_index, get_numpy_dtype, get_procflag_dtype, get_dtype_width
23 23
24 24 LOCALTIME = True
25 25
26 26 def isNumber(cad):
27 27 """
28 28 Chequea si el conjunto de caracteres que componen un string puede ser convertidos a un numero.
29 29
30 30 Excepciones:
31 31 Si un determinado string no puede ser convertido a numero
32 32 Input:
33 33 str, string al cual se le analiza para determinar si convertible a un numero o no
34 34
35 35 Return:
36 36 True : si el string es uno numerico
37 37 False : no es un string numerico
38 38 """
39 39 try:
40 40 float( cad )
41 41 return True
42 42 except:
43 43 return False
44 44
45 45 def isFileInEpoch(filename, startUTSeconds, endUTSeconds):
46 46 """
47 47 Esta funcion determina si un archivo de datos se encuentra o no dentro del rango de fecha especificado.
48 48
49 49 Inputs:
50 50 filename : nombre completo del archivo de datos en formato Jicamarca (.r)
51 51
52 52 startUTSeconds : fecha inicial del rango seleccionado. La fecha esta dada en
53 53 segundos contados desde 01/01/1970.
54 54 endUTSeconds : fecha final del rango seleccionado. La fecha esta dada en
55 55 segundos contados desde 01/01/1970.
56 56
57 57 Return:
58 58 Boolean : Retorna True si el archivo de datos contiene datos en el rango de
59 59 fecha especificado, de lo contrario retorna False.
60 60
61 61 Excepciones:
62 62 Si el archivo no existe o no puede ser abierto
63 63 Si la cabecera no puede ser leida.
64 64
65 65 """
66 66 basicHeaderObj = BasicHeader(LOCALTIME)
67 67
68 68 try:
69 69 fp = open(filename,'rb')
70 70 except IOError:
71 71 print "The file %s can't be opened" %(filename)
72 72 return 0
73 73
74 74 sts = basicHeaderObj.read(fp)
75 75 fp.close()
76 76
77 77 if not(sts):
78 78 print "Skipping the file %s because it has not a valid header" %(filename)
79 79 return 0
80 80
81 81 if not ((startUTSeconds <= basicHeaderObj.utc) and (endUTSeconds > basicHeaderObj.utc)):
82 82 return 0
83 83
84 84 return 1
85 85
86 86 def isTimeInRange(thisTime, startTime, endTime):
87 87
88 88 if endTime >= startTime:
89 89 if (thisTime < startTime) or (thisTime > endTime):
90 90 return 0
91 91
92 92 return 1
93 93 else:
94 94 if (thisTime < startTime) and (thisTime > endTime):
95 95 return 0
96 96
97 97 return 1
98 98
99 99 def isFileInTimeRange(filename, startDate, endDate, startTime, endTime):
100 100 """
101 101 Retorna 1 si el archivo de datos se encuentra dentro del rango de horas especificado.
102 102
103 103 Inputs:
104 104 filename : nombre completo del archivo de datos en formato Jicamarca (.r)
105 105
106 106 startDate : fecha inicial del rango seleccionado en formato datetime.date
107 107
108 108 endDate : fecha final del rango seleccionado en formato datetime.date
109 109
110 110 startTime : tiempo inicial del rango seleccionado en formato datetime.time
111 111
112 112 endTime : tiempo final del rango seleccionado en formato datetime.time
113 113
114 114 Return:
115 115 Boolean : Retorna True si el archivo de datos contiene datos en el rango de
116 116 fecha especificado, de lo contrario retorna False.
117 117
118 118 Excepciones:
119 119 Si el archivo no existe o no puede ser abierto
120 120 Si la cabecera no puede ser leida.
121 121
122 122 """
123 123
124 124
125 125 try:
126 126 fp = open(filename,'rb')
127 127 except IOError:
128 128 print "The file %s can't be opened" %(filename)
129 129 return None
130 130
131 131 firstBasicHeaderObj = BasicHeader(LOCALTIME)
132 132 systemHeaderObj = SystemHeader()
133 133 radarControllerHeaderObj = RadarControllerHeader()
134 134 processingHeaderObj = ProcessingHeader()
135 135
136 136 lastBasicHeaderObj = BasicHeader(LOCALTIME)
137 137
138 138 sts = firstBasicHeaderObj.read(fp)
139 139
140 140 if not(sts):
141 141 print "[Reading] Skipping the file %s because it has not a valid header" %(filename)
142 142 return None
143 143
144 144 if not systemHeaderObj.read(fp):
145 145 return None
146 146
147 147 if not radarControllerHeaderObj.read(fp):
148 148 return None
149 149
150 150 if not processingHeaderObj.read(fp):
151 151 return None
152 152
153 153 filesize = os.path.getsize(filename)
154 154
155 155 offset = processingHeaderObj.blockSize + 24 #header size
156 156
157 157 if filesize <= offset:
158 158 print "[Reading] %s: This file has not enough data" %filename
159 159 return None
160 160
161 161 fp.seek(-offset, 2)
162 162
163 163 sts = lastBasicHeaderObj.read(fp)
164 164
165 165 fp.close()
166 166
167 167 thisDatetime = lastBasicHeaderObj.datatime
168 168 thisTime_last_block = thisDatetime.time()
169 169
170 170 thisDatetime = firstBasicHeaderObj.datatime
171 171 thisDate = thisDatetime.date()
172 172 thisTime_first_block = thisDatetime.time()
173 173
174 174 #General case
175 175 # o>>>>>>>>>>>>>><<<<<<<<<<<<<<o
176 176 #-----------o----------------------------o-----------
177 177 # startTime endTime
178 178
179 179 if endTime >= startTime:
180 180 if (thisTime_last_block < startTime) or (thisTime_first_block > endTime):
181 181 return None
182 182
183 183 return thisDatetime
184 184
185 185 #If endTime < startTime then endTime belongs to the next day
186 186
187 187
188 188 #<<<<<<<<<<<o o>>>>>>>>>>>
189 189 #-----------o----------------------------o-----------
190 190 # endTime startTime
191 191
192 192 if (thisDate == startDate) and (thisTime_last_block < startTime):
193 193 return None
194 194
195 195 if (thisDate == endDate) and (thisTime_first_block > endTime):
196 196 return None
197 197
198 198 if (thisTime_last_block < startTime) and (thisTime_first_block > endTime):
199 199 return None
200 200
201 201 return thisDatetime
202 202
203 203 def isFolderInDateRange(folder, startDate=None, endDate=None):
204 204 """
205 205 Retorna 1 si el archivo de datos se encuentra dentro del rango de horas especificado.
206 206
207 207 Inputs:
208 208 folder : nombre completo del directorio.
209 209 Su formato deberia ser "/path_root/?YYYYDDD"
210 210
211 211 siendo:
212 212 YYYY : Anio (ejemplo 2015)
213 213 DDD : Dia del anio (ejemplo 305)
214 214
215 215 startDate : fecha inicial del rango seleccionado en formato datetime.date
216 216
217 217 endDate : fecha final del rango seleccionado en formato datetime.date
218 218
219 219 Return:
220 220 Boolean : Retorna True si el archivo de datos contiene datos en el rango de
221 221 fecha especificado, de lo contrario retorna False.
222 222 Excepciones:
223 223 Si el directorio no tiene el formato adecuado
224 224 """
225 225
226 226 basename = os.path.basename(folder)
227 227
228 228 if not isRadarFolder(basename):
229 229 print "The folder %s has not the rigth format" %folder
230 230 return 0
231 231
232 232 if startDate and endDate:
233 233 thisDate = getDateFromRadarFolder(basename)
234 234
235 235 if thisDate < startDate:
236 236 return 0
237 237
238 238 if thisDate > endDate:
239 239 return 0
240 240
241 241 return 1
242 242
243 243 def isFileInDateRange(filename, startDate=None, endDate=None):
244 244 """
245 245 Retorna 1 si el archivo de datos se encuentra dentro del rango de horas especificado.
246 246
247 247 Inputs:
248 248 filename : nombre completo del archivo de datos en formato Jicamarca (.r)
249 249
250 250 Su formato deberia ser "?YYYYDDDsss"
251 251
252 252 siendo:
253 253 YYYY : Anio (ejemplo 2015)
254 254 DDD : Dia del anio (ejemplo 305)
255 255 sss : set
256 256
257 257 startDate : fecha inicial del rango seleccionado en formato datetime.date
258 258
259 259 endDate : fecha final del rango seleccionado en formato datetime.date
260 260
261 261 Return:
262 262 Boolean : Retorna True si el archivo de datos contiene datos en el rango de
263 263 fecha especificado, de lo contrario retorna False.
264 264 Excepciones:
265 265 Si el archivo no tiene el formato adecuado
266 266 """
267 267
268 268 basename = os.path.basename(filename)
269 269
270 270 if not isRadarFile(basename):
271 271 print "The filename %s has not the rigth format" %filename
272 272 return 0
273 273
274 274 if startDate and endDate:
275 275 thisDate = getDateFromRadarFile(basename)
276 276
277 277 if thisDate < startDate:
278 278 return 0
279 279
280 280 if thisDate > endDate:
281 281 return 0
282 282
283 283 return 1
284 284
285 285 def getFileFromSet(path, ext, set):
286 286 validFilelist = []
287 287 fileList = os.listdir(path)
288 288
289 289 # 0 1234 567 89A BCDE
290 290 # H YYYY DDD SSS .ext
291 291
292 292 for thisFile in fileList:
293 293 try:
294 294 year = int(thisFile[1:5])
295 295 doy = int(thisFile[5:8])
296 296 except:
297 297 continue
298 298
299 299 if (os.path.splitext(thisFile)[-1].lower() != ext.lower()):
300 300 continue
301 301
302 302 validFilelist.append(thisFile)
303 303
304 304 myfile = fnmatch.filter(validFilelist,'*%4.4d%3.3d%3.3d*'%(year,doy,set))
305 305
306 306 if len(myfile)!= 0:
307 307 return myfile[0]
308 308 else:
309 309 filename = '*%4.4d%3.3d%3.3d%s'%(year,doy,set,ext.lower())
310 310 print 'the filename %s does not exist'%filename
311 311 print '...going to the last file: '
312 312
313 313 if validFilelist:
314 314 validFilelist = sorted( validFilelist, key=str.lower )
315 315 return validFilelist[-1]
316 316
317 317 return None
318 318
319 319 def getlastFileFromPath(path, ext):
320 320 """
321 321 Depura el fileList dejando solo los que cumplan el formato de "PYYYYDDDSSS.ext"
322 322 al final de la depuracion devuelve el ultimo file de la lista que quedo.
323 323
324 324 Input:
325 325 fileList : lista conteniendo todos los files (sin path) que componen una determinada carpeta
326 326 ext : extension de los files contenidos en una carpeta
327 327
328 328 Return:
329 329 El ultimo file de una determinada carpeta, no se considera el path.
330 330 """
331 331 validFilelist = []
332 332 fileList = os.listdir(path)
333 333
334 334 # 0 1234 567 89A BCDE
335 335 # H YYYY DDD SSS .ext
336 336
337 337 for thisFile in fileList:
338 338
339 339 year = thisFile[1:5]
340 340 if not isNumber(year):
341 341 continue
342 342
343 343 doy = thisFile[5:8]
344 344 if not isNumber(doy):
345 345 continue
346 346
347 347 year = int(year)
348 348 doy = int(doy)
349 349
350 350 if (os.path.splitext(thisFile)[-1].lower() != ext.lower()):
351 351 continue
352 352
353 353 validFilelist.append(thisFile)
354 354
355 355 if validFilelist:
356 356 validFilelist = sorted( validFilelist, key=str.lower )
357 357 return validFilelist[-1]
358 358
359 359 return None
360 360
361 361 def checkForRealPath(path, foldercounter, year, doy, set, ext):
362 362 """
363 363 Por ser Linux Case Sensitive entonces checkForRealPath encuentra el nombre correcto de un path,
364 364 Prueba por varias combinaciones de nombres entre mayusculas y minusculas para determinar
365 365 el path exacto de un determinado file.
366 366
367 367 Example :
368 368 nombre correcto del file es .../.../D2009307/P2009307367.ext
369 369
370 370 Entonces la funcion prueba con las siguientes combinaciones
371 371 .../.../y2009307367.ext
372 372 .../.../Y2009307367.ext
373 373 .../.../x2009307/y2009307367.ext
374 374 .../.../x2009307/Y2009307367.ext
375 375 .../.../X2009307/y2009307367.ext
376 376 .../.../X2009307/Y2009307367.ext
377 377 siendo para este caso, la ultima combinacion de letras, identica al file buscado
378 378
379 379 Return:
380 380 Si encuentra la cobinacion adecuada devuelve el path completo y el nombre del file
381 381 caso contrario devuelve None como path y el la ultima combinacion de nombre en mayusculas
382 382 para el filename
383 383 """
384 384 fullfilename = None
385 385 find_flag = False
386 386 filename = None
387 387
388 388 prefixDirList = [None,'d','D']
389 389 if ext.lower() == ".r": #voltage
390 390 prefixFileList = ['d','D']
391 391 elif ext.lower() == ".pdata": #spectra
392 392 prefixFileList = ['p','P']
393 393 else:
394 394 return None, filename
395 395
396 396 #barrido por las combinaciones posibles
397 397 for prefixDir in prefixDirList:
398 398 thispath = path
399 399 if prefixDir != None:
400 400 #formo el nombre del directorio xYYYYDDD (x=d o x=D)
401 401 if foldercounter == 0:
402 402 thispath = os.path.join(path, "%s%04d%03d" % ( prefixDir, year, doy ))
403 403 else:
404 404 thispath = os.path.join(path, "%s%04d%03d_%02d" % ( prefixDir, year, doy , foldercounter))
405 405 for prefixFile in prefixFileList: #barrido por las dos combinaciones posibles de "D"
406 406 filename = "%s%04d%03d%03d%s" % ( prefixFile, year, doy, set, ext ) #formo el nombre del file xYYYYDDDSSS.ext
407 407 fullfilename = os.path.join( thispath, filename ) #formo el path completo
408 408
409 409 if os.path.exists( fullfilename ): #verifico que exista
410 410 find_flag = True
411 411 break
412 412 if find_flag:
413 413 break
414 414
415 415 if not(find_flag):
416 416 return None, filename
417 417
418 418 return fullfilename, filename
419 419
420 420 def isRadarFolder(folder):
421 421 try:
422 422 year = int(folder[1:5])
423 423 doy = int(folder[5:8])
424 424 except:
425 425 return 0
426 426
427 427 return 1
428 428
429 429 def isRadarFile(file):
430 430 try:
431 431 year = int(file[1:5])
432 432 doy = int(file[5:8])
433 433 set = int(file[8:11])
434 434 except:
435 435 return 0
436 436
437 437 return 1
438 438
439 439 def getDateFromRadarFile(file):
440 440 try:
441 441 year = int(file[1:5])
442 442 doy = int(file[5:8])
443 443 set = int(file[8:11])
444 444 except:
445 445 return None
446 446
447 447 thisDate = datetime.date(year, 1, 1) + datetime.timedelta(doy-1)
448 448 return thisDate
449 449
450 450 def getDateFromRadarFolder(folder):
451 451 try:
452 452 year = int(folder[1:5])
453 453 doy = int(folder[5:8])
454 454 except:
455 455 return None
456 456
457 457 thisDate = datetime.date(year, 1, 1) + datetime.timedelta(doy-1)
458 458 return thisDate
459 459
460 460 class JRODataIO:
461 461
462 462 c = 3E8
463 463
464 464 isConfig = False
465 465
466 466 basicHeaderObj = None
467 467
468 468 systemHeaderObj = None
469 469
470 470 radarControllerHeaderObj = None
471 471
472 472 processingHeaderObj = None
473 473
474 474 dtype = None
475 475
476 476 pathList = []
477 477
478 478 filenameList = []
479 479
480 480 filename = None
481 481
482 482 ext = None
483 483
484 484 flagIsNewFile = 1
485 485
486 486 flagDiscontinuousBlock = 0
487 487
488 488 flagIsNewBlock = 0
489 489
490 490 fp = None
491 491
492 492 firstHeaderSize = 0
493 493
494 494 basicHeaderSize = 24
495 495
496 496 versionFile = 1103
497 497
498 498 fileSize = None
499 499
500 500 # ippSeconds = None
501 501
502 502 fileSizeByHeader = None
503 503
504 504 fileIndex = None
505 505
506 506 profileIndex = None
507 507
508 508 blockIndex = None
509 509
510 510 nTotalBlocks = None
511 511
512 512 maxTimeStep = 30
513 513
514 514 lastUTTime = None
515 515
516 516 datablock = None
517 517
518 518 dataOut = None
519 519
520 520 blocksize = None
521 521
522 522 getByBlock = False
523 523
524 524 def __init__(self):
525 525
526 526 raise NotImplementedError
527 527
528 528 def run(self):
529 529
530 530 raise NotImplementedError
531 531
532 532 def getDtypeWidth(self):
533 533
534 534 dtype_index = get_dtype_index(self.dtype)
535 535 dtype_width = get_dtype_width(dtype_index)
536 536
537 537 return dtype_width
538 538
539 539 class JRODataReader(JRODataIO):
540 540
541 541
542 542 online = 0
543 543
544 544 realtime = 0
545 545
546 546 nReadBlocks = 0
547 547
548 548 delay = 10 #number of seconds waiting a new file
549 549
550 550 nTries = 3 #quantity tries
551 551
552 552 nFiles = 3 #number of files for searching
553 553
554 554 path = None
555 555
556 556 foldercounter = 0
557 557
558 558 flagNoMoreFiles = 0
559 559
560 560 datetimeList = []
561 561
562 562 __isFirstTimeOnline = 1
563 563
564 564 __printInfo = True
565 565
566 566 profileIndex = None
567 567
568 568 nTxs = 1
569 569
570 570 txIndex = None
571 571
572 572 #Added--------------------
573 573
574 574 selBlocksize = None
575 575
576 576 selBlocktime = None
577 577
578 578
579 579 def __init__(self):
580 580
581 581 """
582 582 This class is used to find data files
583 583
584 584 Example:
585 585 reader = JRODataReader()
586 586 fileList = reader.findDataFiles()
587 587
588 588 """
589 589 pass
590 590
591 591
592 592 def createObjByDefault(self):
593 593 """
594 594
595 595 """
596 596 raise NotImplementedError
597 597
598 598 def getBlockDimension(self):
599 599
600 600 raise NotImplementedError
601 601
602 602 def __searchFilesOffLine(self,
603 603 path,
604 604 startDate=None,
605 605 endDate=None,
606 606 startTime=datetime.time(0,0,0),
607 607 endTime=datetime.time(23,59,59),
608 608 set=None,
609 609 expLabel='',
610 610 ext='.r',
611 611 queue=None,
612 612 cursor=None,
613 613 skip=None,
614 614 walk=True):
615 615
616 616 self.filenameList = []
617 617 self.datetimeList = []
618 618
619 619 pathList = []
620 620
621 621 dateList, pathList = self.findDatafiles(path, startDate, endDate, expLabel, ext, walk, include_path=True)
622 622
623 623 if dateList == []:
624 624 # print "[Reading] Date range selected invalid [%s - %s]: No *%s files in %s)" %(startDate, endDate, ext, path)
625 625 return None, None
626 626
627 627 if len(dateList) > 1:
628 628 print "[Reading] Data found for date range [%s - %s]: total days = %d" %(startDate, endDate, len(dateList))
629 629 else:
630 630 print "[Reading] Data found for date range [%s - %s]: date = %s" %(startDate, endDate, dateList[0])
631 631
632 632 filenameList = []
633 633 datetimeList = []
634 634
635 635 for thisPath in pathList:
636 636 # thisPath = pathList[pathDict[file]]
637 637
638 638 fileList = glob.glob1(thisPath, "*%s" %ext)
639 639 fileList.sort()
640 640
641 641 skippedFileList = []
642 642
643 643 if cursor is not None and skip is not None:
644 644 # if cursor*skip > len(fileList):
645 645 if skip == 0:
646 646 if queue is not None:
647 647 queue.put(len(fileList))
648 648 skippedFileList = []
649 649 else:
650 650 skippedFileList = fileList[cursor*skip: cursor*skip + skip]
651 651
652 652 else:
653 653 skippedFileList = fileList
654 654
655 655 for file in skippedFileList:
656 656
657 657 filename = os.path.join(thisPath,file)
658 658
659 659 if not isFileInDateRange(filename, startDate, endDate):
660 660 continue
661 661
662 662 thisDatetime = isFileInTimeRange(filename, startDate, endDate, startTime, endTime)
663 663
664 664 if not(thisDatetime):
665 665 continue
666 666
667 667 filenameList.append(filename)
668 668 datetimeList.append(thisDatetime)
669 669
670 670 if not(filenameList):
671 671 print "[Reading] Time range selected invalid [%s - %s]: No *%s files in %s)" %(startTime, endTime, ext, path)
672 672 return None, None
673 673
674 674 print "[Reading] %d file(s) was(were) found in time range: %s - %s" %(len(filenameList), startTime, endTime)
675 675 print
676 676
677 677 for i in range(len(filenameList)):
678 678 print "[Reading] %s -> [%s]" %(filenameList[i], datetimeList[i].ctime())
679 679
680 680 self.filenameList = filenameList
681 681 self.datetimeList = datetimeList
682 682
683 683 return pathList, filenameList
684 684
685 685 def __searchFilesOnLine(self, path, expLabel = "", ext = None, walk=True, set=None):
686 686
687 687 """
688 688 Busca el ultimo archivo de la ultima carpeta (determinada o no por startDateTime) y
689 689 devuelve el archivo encontrado ademas de otros datos.
690 690
691 691 Input:
692 692 path : carpeta donde estan contenidos los files que contiene data
693 693
694 694 expLabel : Nombre del subexperimento (subfolder)
695 695
696 696 ext : extension de los files
697 697
698 698 walk : Si es habilitado no realiza busquedas dentro de los ubdirectorios (doypath)
699 699
700 700 Return:
701 701 directory : eL directorio donde esta el file encontrado
702 702 filename : el ultimo file de una determinada carpeta
703 703 year : el anho
704 704 doy : el numero de dia del anho
705 705 set : el set del archivo
706 706
707 707
708 708 """
709 709 if not os.path.isdir(path):
710 710 return None, None, None, None, None, None
711 711
712 712 dirList = []
713 713
714 714 if not walk:
715 715 fullpath = path
716 716 foldercounter = 0
717 717 else:
718 718 #Filtra solo los directorios
719 719 for thisPath in os.listdir(path):
720 720 if not os.path.isdir(os.path.join(path,thisPath)):
721 721 continue
722 722 if not isRadarFolder(thisPath):
723 723 continue
724 724
725 725 dirList.append(thisPath)
726 726
727 727 if not(dirList):
728 728 return None, None, None, None, None, None
729 729
730 730 dirList = sorted( dirList, key=str.lower )
731 731
732 732 doypath = dirList[-1]
733 733 foldercounter = int(doypath.split('_')[1]) if len(doypath.split('_'))>1 else 0
734 734 fullpath = os.path.join(path, doypath, expLabel)
735 735
736 736
737 737 print "[Reading] %s folder was found: " %(fullpath )
738 738
739 739 if set == None:
740 740 filename = getlastFileFromPath(fullpath, ext)
741 741 else:
742 742 filename = getFileFromSet(fullpath, ext, set)
743 743
744 744 if not(filename):
745 745 return None, None, None, None, None, None
746 746
747 747 print "[Reading] %s file was found" %(filename)
748 748
749 749 if not(self.__verifyFile(os.path.join(fullpath, filename))):
750 750 return None, None, None, None, None, None
751 751
752 752 year = int( filename[1:5] )
753 753 doy = int( filename[5:8] )
754 754 set = int( filename[8:11] )
755 755
756 756 return fullpath, foldercounter, filename, year, doy, set
757 757
758 758 def __setNextFileOffline(self):
759 759
760 760 idFile = self.fileIndex
761 761
762 762 while (True):
763 763 idFile += 1
764 764 if not(idFile < len(self.filenameList)):
765 765 self.flagNoMoreFiles = 1
766 766 # print "[Reading] No more Files"
767 767 return 0
768 768
769 769 filename = self.filenameList[idFile]
770 770
771 771 if not(self.__verifyFile(filename)):
772 772 continue
773 773
774 774 fileSize = os.path.getsize(filename)
775 775 fp = open(filename,'rb')
776 776 break
777 777
778 778 self.flagIsNewFile = 1
779 779 self.fileIndex = idFile
780 780 self.filename = filename
781 781 self.fileSize = fileSize
782 782 self.fp = fp
783 783
784 784 # print "[Reading] Setting the file: %s"%self.filename
785 785
786 786 return 1
787 787
788 788 def __setNextFileOnline(self):
789 789 """
790 790 Busca el siguiente file que tenga suficiente data para ser leida, dentro de un folder especifico, si
791 791 no encuentra un file valido espera un tiempo determinado y luego busca en los posibles n files
792 792 siguientes.
793 793
794 794 Affected:
795 795 self.flagIsNewFile
796 796 self.filename
797 797 self.fileSize
798 798 self.fp
799 799 self.set
800 800 self.flagNoMoreFiles
801 801
802 802 Return:
803 803 0 : si luego de una busqueda del siguiente file valido este no pudo ser encontrado
804 804 1 : si el file fue abierto con exito y esta listo a ser leido
805 805
806 806 Excepciones:
807 807 Si un determinado file no puede ser abierto
808 808 """
809 809 nFiles = 0
810 810 fileOk_flag = False
811 811 firstTime_flag = True
812 812
813 813 self.set += 1
814 814
815 815 if self.set > 999:
816 816 self.set = 0
817 817 self.foldercounter += 1
818 818
819 819 #busca el 1er file disponible
820 820 fullfilename, filename = checkForRealPath( self.path, self.foldercounter, self.year, self.doy, self.set, self.ext )
821 821 if fullfilename:
822 822 if self.__verifyFile(fullfilename, False):
823 823 fileOk_flag = True
824 824
825 825 #si no encuentra un file entonces espera y vuelve a buscar
826 826 if not(fileOk_flag):
827 827 for nFiles in range(self.nFiles+1): #busco en los siguientes self.nFiles+1 files posibles
828 828
829 829 if firstTime_flag: #si es la 1era vez entonces hace el for self.nTries veces
830 830 tries = self.nTries
831 831 else:
832 832 tries = 1 #si no es la 1era vez entonces solo lo hace una vez
833 833
834 834 for nTries in range( tries ):
835 835 if firstTime_flag:
836 836 print "\t[Reading] Waiting %0.2f sec for the next file: \"%s\" , try %03d ..." % ( self.delay, filename, nTries+1 )
837 837 sleep( self.delay )
838 838 else:
839 839 print "\t[Reading] Searching the next \"%s%04d%03d%03d%s\" file ..." % (self.optchar, self.year, self.doy, self.set, self.ext)
840 840
841 841 fullfilename, filename = checkForRealPath( self.path, self.foldercounter, self.year, self.doy, self.set, self.ext )
842 842 if fullfilename:
843 843 if self.__verifyFile(fullfilename):
844 844 fileOk_flag = True
845 845 break
846 846
847 847 if fileOk_flag:
848 848 break
849 849
850 850 firstTime_flag = False
851 851
852 852 print "\t[Reading] Skipping the file \"%s\" due to this file doesn't exist" % filename
853 853 self.set += 1
854 854
855 855 if nFiles == (self.nFiles-1): #si no encuentro el file buscado cambio de carpeta y busco en la siguiente carpeta
856 856 self.set = 0
857 857 self.doy += 1
858 858 self.foldercounter = 0
859 859
860 860 if fileOk_flag:
861 861 self.fileSize = os.path.getsize( fullfilename )
862 862 self.filename = fullfilename
863 863 self.flagIsNewFile = 1
864 864 if self.fp != None: self.fp.close()
865 865 self.fp = open(fullfilename, 'rb')
866 866 self.flagNoMoreFiles = 0
867 867 # print '[Reading] Setting the file: %s' % fullfilename
868 868 else:
869 869 self.fileSize = 0
870 870 self.filename = None
871 871 self.flagIsNewFile = 0
872 872 self.fp = None
873 873 self.flagNoMoreFiles = 1
874 874 # print '[Reading] No more files to read'
875 875
876 876 return fileOk_flag
877 877
878 878 def setNextFile(self):
879 879 if self.fp != None:
880 880 self.fp.close()
881 881
882 882 if self.online:
883 883 newFile = self.__setNextFileOnline()
884 884 else:
885 885 newFile = self.__setNextFileOffline()
886 886
887 887 if not(newFile):
888 888 print '[Reading] No more files to read'
889 889 return 0
890 890
891 if self.verbose:
891 892 print '[Reading] Setting the file: %s' % self.filename
892 893
893 894 self.__readFirstHeader()
894 895 self.nReadBlocks = 0
895 896 return 1
896 897
897 898 def __waitNewBlock(self):
898 899 """
899 900 Return 1 si se encontro un nuevo bloque de datos, 0 de otra forma.
900 901
901 902 Si el modo de lectura es OffLine siempre retorn 0
902 903 """
903 904 if not self.online:
904 905 return 0
905 906
906 907 if (self.nReadBlocks >= self.processingHeaderObj.dataBlocksPerFile):
907 908 return 0
908 909
909 910 currentPointer = self.fp.tell()
910 911
911 912 neededSize = self.processingHeaderObj.blockSize + self.basicHeaderSize
912 913
913 914 for nTries in range( self.nTries ):
914 915
915 916 self.fp.close()
916 917 self.fp = open( self.filename, 'rb' )
917 918 self.fp.seek( currentPointer )
918 919
919 920 self.fileSize = os.path.getsize( self.filename )
920 921 currentSize = self.fileSize - currentPointer
921 922
922 923 if ( currentSize >= neededSize ):
923 924 self.basicHeaderObj.read(self.fp)
924 925 return 1
925 926
926 927 if self.fileSize == self.fileSizeByHeader:
927 928 # self.flagEoF = True
928 929 return 0
929 930
930 931 print "[Reading] Waiting %0.2f seconds for the next block, try %03d ..." % (self.delay, nTries+1)
931 932 sleep( self.delay )
932 933
933 934
934 935 return 0
935 936
936 937 def waitDataBlock(self,pointer_location):
937 938
938 939 currentPointer = pointer_location
939 940
940 941 neededSize = self.processingHeaderObj.blockSize #+ self.basicHeaderSize
941 942
942 943 for nTries in range( self.nTries ):
943 944 self.fp.close()
944 945 self.fp = open( self.filename, 'rb' )
945 946 self.fp.seek( currentPointer )
946 947
947 948 self.fileSize = os.path.getsize( self.filename )
948 949 currentSize = self.fileSize - currentPointer
949 950
950 951 if ( currentSize >= neededSize ):
951 952 return 1
952 953
953 954 print "[Reading] Waiting %0.2f seconds for the next block, try %03d ..." % (self.delay, nTries+1)
954 955 sleep( self.delay )
955 956
956 957 return 0
957 958
958 959 def __jumpToLastBlock(self):
959 960
960 961 if not(self.__isFirstTimeOnline):
961 962 return
962 963
963 964 csize = self.fileSize - self.fp.tell()
964 965 blocksize = self.processingHeaderObj.blockSize
965 966
966 967 #salta el primer bloque de datos
967 968 if csize > self.processingHeaderObj.blockSize:
968 969 self.fp.seek(self.fp.tell() + blocksize)
969 970 else:
970 971 return
971 972
972 973 csize = self.fileSize - self.fp.tell()
973 974 neededsize = self.processingHeaderObj.blockSize + self.basicHeaderSize
974 975 while True:
975 976
976 977 if self.fp.tell()<self.fileSize:
977 978 self.fp.seek(self.fp.tell() + neededsize)
978 979 else:
979 980 self.fp.seek(self.fp.tell() - neededsize)
980 981 break
981 982
982 983 # csize = self.fileSize - self.fp.tell()
983 984 # neededsize = self.processingHeaderObj.blockSize + self.basicHeaderSize
984 985 # factor = int(csize/neededsize)
985 986 # if factor > 0:
986 987 # self.fp.seek(self.fp.tell() + factor*neededsize)
987 988
988 989 self.flagIsNewFile = 0
989 990 self.__isFirstTimeOnline = 0
990 991
991 992 def __setNewBlock(self):
992 993
993 994 if self.fp == None:
994 995 return 0
995 996
996 997 # if self.online:
997 998 # self.__jumpToLastBlock()
998 999
999 1000 if self.flagIsNewFile:
1000 1001 self.lastUTTime = self.basicHeaderObj.utc
1001 1002 return 1
1002 1003
1003 1004 if self.realtime:
1004 1005 self.flagDiscontinuousBlock = 1
1005 1006 if not(self.setNextFile()):
1006 1007 return 0
1007 1008 else:
1008 1009 return 1
1009 1010
1010 1011 currentSize = self.fileSize - self.fp.tell()
1011 1012 neededSize = self.processingHeaderObj.blockSize + self.basicHeaderSize
1012 1013
1013 1014 if (currentSize >= neededSize):
1014 1015 self.basicHeaderObj.read(self.fp)
1015 1016 self.lastUTTime = self.basicHeaderObj.utc
1016 1017 return 1
1017 1018
1018 1019 if self.__waitNewBlock():
1019 1020 self.lastUTTime = self.basicHeaderObj.utc
1020 1021 return 1
1021 1022
1022 1023 if not(self.setNextFile()):
1023 1024 return 0
1024 1025
1025 1026 deltaTime = self.basicHeaderObj.utc - self.lastUTTime #
1026 1027 self.lastUTTime = self.basicHeaderObj.utc
1027 1028
1028 1029 self.flagDiscontinuousBlock = 0
1029 1030
1030 1031 if deltaTime > self.maxTimeStep:
1031 1032 self.flagDiscontinuousBlock = 1
1032 1033
1033 1034 return 1
1034 1035
1035 1036 def readNextBlock(self):
1036 1037
1037 1038 #Skip block out of startTime and endTime
1038 1039 while True:
1039 1040 if not(self.__setNewBlock()):
1040 1041 return 0
1041 1042
1042 1043 if not(self.readBlock()):
1043 1044 return 0
1044 1045
1045 1046 self.getBasicHeader()
1046 1047
1047 1048 if not isTimeInRange(self.dataOut.datatime.time(), self.startTime, self.endTime):
1048 1049
1049 1050 print "[Reading] Block No. %d/%d -> %s [Skipping]" %(self.nReadBlocks,
1050 1051 self.processingHeaderObj.dataBlocksPerFile,
1051 1052 self.dataOut.datatime.ctime())
1052 1053 continue
1053 1054
1054 1055 break
1055 1056
1057 if self.verbose:
1056 1058 print "[Reading] Block No. %d/%d -> %s" %(self.nReadBlocks,
1057 1059 self.processingHeaderObj.dataBlocksPerFile,
1058 1060 self.dataOut.datatime.ctime())
1059 1061 return 1
1060 1062
1061 1063 def __readFirstHeader(self):
1062 1064
1063 1065 self.basicHeaderObj.read(self.fp)
1064 1066 self.systemHeaderObj.read(self.fp)
1065 1067 self.radarControllerHeaderObj.read(self.fp)
1066 1068 self.processingHeaderObj.read(self.fp)
1067 1069
1068 1070 self.firstHeaderSize = self.basicHeaderObj.size
1069 1071
1070 1072 datatype = int(numpy.log2((self.processingHeaderObj.processFlags & PROCFLAG.DATATYPE_MASK))-numpy.log2(PROCFLAG.DATATYPE_CHAR))
1071 1073 if datatype == 0:
1072 1074 datatype_str = numpy.dtype([('real','<i1'),('imag','<i1')])
1073 1075 elif datatype == 1:
1074 1076 datatype_str = numpy.dtype([('real','<i2'),('imag','<i2')])
1075 1077 elif datatype == 2:
1076 1078 datatype_str = numpy.dtype([('real','<i4'),('imag','<i4')])
1077 1079 elif datatype == 3:
1078 1080 datatype_str = numpy.dtype([('real','<i8'),('imag','<i8')])
1079 1081 elif datatype == 4:
1080 1082 datatype_str = numpy.dtype([('real','<f4'),('imag','<f4')])
1081 1083 elif datatype == 5:
1082 1084 datatype_str = numpy.dtype([('real','<f8'),('imag','<f8')])
1083 1085 else:
1084 1086 raise ValueError, 'Data type was not defined'
1085 1087
1086 1088 self.dtype = datatype_str
1087 1089 #self.ippSeconds = 2 * 1000 * self.radarControllerHeaderObj.ipp / self.c
1088 1090 self.fileSizeByHeader = self.processingHeaderObj.dataBlocksPerFile * self.processingHeaderObj.blockSize + self.firstHeaderSize + self.basicHeaderSize*(self.processingHeaderObj.dataBlocksPerFile - 1)
1089 1091 # self.dataOut.channelList = numpy.arange(self.systemHeaderObj.numChannels)
1090 1092 # self.dataOut.channelIndexList = numpy.arange(self.systemHeaderObj.numChannels)
1091 1093 self.getBlockDimension()
1092 1094
1093 1095 def __verifyFile(self, filename, msgFlag=True):
1094 1096
1095 1097 msg = None
1096 1098
1097 1099 try:
1098 1100 fp = open(filename, 'rb')
1099 1101 except IOError:
1100 1102
1101 1103 if msgFlag:
1102 1104 print "[Reading] File %s can't be opened" % (filename)
1103 1105
1104 1106 return False
1105 1107
1106 1108 currentPosition = fp.tell()
1107 1109 neededSize = self.processingHeaderObj.blockSize + self.firstHeaderSize
1108 1110
1109 1111 if neededSize == 0:
1110 1112 basicHeaderObj = BasicHeader(LOCALTIME)
1111 1113 systemHeaderObj = SystemHeader()
1112 1114 radarControllerHeaderObj = RadarControllerHeader()
1113 1115 processingHeaderObj = ProcessingHeader()
1114 1116
1115 1117 if not( basicHeaderObj.read(fp) ):
1116 1118 fp.close()
1117 1119 return False
1118 1120
1119 1121 if not( systemHeaderObj.read(fp) ):
1120 1122 fp.close()
1121 1123 return False
1122 1124
1123 1125 if not( radarControllerHeaderObj.read(fp) ):
1124 1126 fp.close()
1125 1127 return False
1126 1128
1127 1129 if not( processingHeaderObj.read(fp) ):
1128 1130 fp.close()
1129 1131 return False
1130 1132
1131 1133 neededSize = processingHeaderObj.blockSize + basicHeaderObj.size
1132 1134 else:
1133 1135 msg = "[Reading] Skipping the file %s due to it hasn't enough data" %filename
1134 1136
1135 1137 fp.close()
1136 1138
1137 1139 fileSize = os.path.getsize(filename)
1138 1140 currentSize = fileSize - currentPosition
1139 1141
1140 1142 if currentSize < neededSize:
1141 1143 if msgFlag and (msg != None):
1142 1144 print msg
1143 1145 return False
1144 1146
1145 1147 return True
1146 1148
1147 1149 def findDatafiles(self, path, startDate=None, endDate=None, expLabel='', ext='.r', walk=True, include_path=False):
1148 1150
1149 1151 path_empty = True
1150 1152
1151 1153 dateList = []
1152 1154 pathList = []
1153 1155
1154 1156 multi_path = path.split(',')
1155 1157
1156 1158 if not walk:
1157 1159
1158 1160 for single_path in multi_path:
1159 1161
1160 1162 if not os.path.isdir(single_path):
1161 1163 continue
1162 1164
1163 1165 fileList = glob.glob1(single_path, "*"+ext)
1164 1166
1165 1167 if not fileList:
1166 1168 continue
1167 1169
1168 1170 path_empty = False
1169 1171
1170 1172 fileList.sort()
1171 1173
1172 1174 for thisFile in fileList:
1173 1175
1174 1176 if not os.path.isfile(os.path.join(single_path, thisFile)):
1175 1177 continue
1176 1178
1177 1179 if not isRadarFile(thisFile):
1178 1180 continue
1179 1181
1180 1182 if not isFileInDateRange(thisFile, startDate, endDate):
1181 1183 continue
1182 1184
1183 1185 thisDate = getDateFromRadarFile(thisFile)
1184 1186
1185 1187 if thisDate in dateList:
1186 1188 continue
1187 1189
1188 1190 dateList.append(thisDate)
1189 1191 pathList.append(single_path)
1190 1192
1191 1193 else:
1192 1194 for single_path in multi_path:
1193 1195
1194 1196 if not os.path.isdir(single_path):
1195 1197 continue
1196 1198
1197 1199 dirList = []
1198 1200
1199 1201 for thisPath in os.listdir(single_path):
1200 1202
1201 1203 if not os.path.isdir(os.path.join(single_path,thisPath)):
1202 1204 continue
1203 1205
1204 1206 if not isRadarFolder(thisPath):
1205 1207 continue
1206 1208
1207 1209 if not isFolderInDateRange(thisPath, startDate, endDate):
1208 1210 continue
1209 1211
1210 1212 dirList.append(thisPath)
1211 1213
1212 1214 if not dirList:
1213 1215 continue
1214 1216
1215 1217 dirList.sort()
1216 1218
1217 1219 for thisDir in dirList:
1218 1220
1219 1221 datapath = os.path.join(single_path, thisDir, expLabel)
1220 1222 fileList = glob.glob1(datapath, "*"+ext)
1221 1223
1222 1224 if not fileList:
1223 1225 continue
1224 1226
1225 1227 path_empty = False
1226 1228
1227 1229 thisDate = getDateFromRadarFolder(thisDir)
1228 1230
1229 1231 pathList.append(datapath)
1230 1232 dateList.append(thisDate)
1231 1233
1232 1234 dateList.sort()
1233 1235
1234 1236 if walk:
1235 1237 pattern_path = os.path.join(multi_path[0], "[dYYYYDDD]", expLabel)
1236 1238 else:
1237 1239 pattern_path = multi_path[0]
1238 1240
1239 1241 if path_empty:
1240 1242 print "[Reading] No *%s files in %s for %s to %s" %(ext, pattern_path, startDate, endDate)
1241 1243 else:
1242 1244 if not dateList:
1243 1245 print "[Reading] Date range selected invalid [%s - %s]: No *%s files in %s)" %(startDate, endDate, ext, path)
1244 1246
1245 1247 if include_path:
1246 1248 return dateList, pathList
1247 1249
1248 1250 return dateList
1249 1251
1250 1252 def setup(self,
1251 1253 path=None,
1252 1254 startDate=None,
1253 1255 endDate=None,
1254 1256 startTime=datetime.time(0,0,0),
1255 1257 endTime=datetime.time(23,59,59),
1256 1258 set=None,
1257 1259 expLabel = "",
1258 1260 ext = None,
1259 1261 online = False,
1260 1262 delay = 60,
1261 1263 walk = True,
1262 1264 getblock = False,
1263 1265 nTxs = 1,
1264 1266 realtime=False,
1265 1267 blocksize=None,
1266 1268 blocktime=None,
1267 1269 queue=None,
1268 1270 skip=None,
1269 cursor=None):
1271 cursor=None,
1272 warnings=True,
1273 verbose=True):
1270 1274
1271 1275 if path == None:
1272 1276 raise ValueError, "[Reading] The path is not valid"
1273 1277
1274 1278 if ext == None:
1275 1279 ext = self.ext
1276 1280
1277 1281 if online:
1278 1282 print "[Reading] Searching files in online mode..."
1279 1283
1280 1284 for nTries in range( self.nTries ):
1281 1285 fullpath, foldercounter, file, year, doy, set = self.__searchFilesOnLine(path=path, expLabel=expLabel, ext=ext, walk=walk, set=set)
1282 1286
1283 1287 if fullpath:
1284 1288 break
1285 1289
1286 1290 print '[Reading] Waiting %0.2f sec for an valid file in %s: try %02d ...' % (self.delay, path, nTries+1)
1287 1291 sleep( self.delay )
1288 1292
1289 1293 if not(fullpath):
1290 1294 print "[Reading] There 'isn't any valid file in %s" % path
1291 1295 return
1292 1296
1293 1297 self.year = year
1294 1298 self.doy = doy
1295 1299 self.set = set - 1
1296 1300 self.path = path
1297 1301 self.foldercounter = foldercounter
1298 1302 last_set = None
1299 1303
1300 1304 else:
1301 1305 print "[Reading] Searching files in offline mode ..."
1302 1306 pathList, filenameList = self.__searchFilesOffLine(path, startDate=startDate, endDate=endDate,
1303 1307 startTime=startTime, endTime=endTime,
1304 1308 set=set, expLabel=expLabel, ext=ext,
1305 1309 walk=walk, cursor=cursor,
1306 1310 skip=skip, queue=queue)
1307 1311
1308 1312 if not(pathList):
1309 1313 # print "[Reading] No *%s files in %s (%s - %s)"%(ext, path,
1310 1314 # datetime.datetime.combine(startDate,startTime).ctime(),
1311 1315 # datetime.datetime.combine(endDate,endTime).ctime())
1312 1316
1313 1317 # sys.exit(-1)
1314 1318
1315 1319 self.fileIndex = -1
1316 1320 self.pathList = []
1317 1321 self.filenameList = []
1318 1322 return
1319 1323
1320 1324 self.fileIndex = -1
1321 1325 self.pathList = pathList
1322 1326 self.filenameList = filenameList
1323 1327 file_name = os.path.basename(filenameList[-1])
1324 1328 basename, ext = os.path.splitext(file_name)
1325 1329 last_set = int(basename[-3:])
1326 1330
1327 1331 self.online = online
1328 1332 self.realtime = realtime
1329 1333 self.delay = delay
1330 1334 ext = ext.lower()
1331 1335 self.ext = ext
1332 1336 self.getByBlock = getblock
1333 1337 self.nTxs = nTxs
1334 1338 self.startTime = startTime
1335 1339 self.endTime = endTime
1336 1340
1337 1341 #Added-----------------
1338 1342 self.selBlocksize = blocksize
1339 1343 self.selBlocktime = blocktime
1340 1344
1345 # Verbose-----------
1346 self.verbose = verbose
1347 self.warnings = warnings
1341 1348
1342 1349 if not(self.setNextFile()):
1343 1350 if (startDate!=None) and (endDate!=None):
1344 1351 print "[Reading] No files in range: %s - %s" %(datetime.datetime.combine(startDate,startTime).ctime(), datetime.datetime.combine(endDate,endTime).ctime())
1345 1352 elif startDate != None:
1346 1353 print "[Reading] No files in range: %s" %(datetime.datetime.combine(startDate,startTime).ctime())
1347 1354 else:
1348 1355 print "[Reading] No files"
1349 1356
1350 1357 self.fileIndex = -1
1351 1358 self.pathList = []
1352 1359 self.filenameList = []
1353 1360 return
1354 1361
1355 1362 # self.getBasicHeader()
1356 1363
1357 1364 if last_set != None:
1358 1365 self.dataOut.last_block = last_set * self.processingHeaderObj.dataBlocksPerFile + self.basicHeaderObj.dataBlock
1359 1366 return
1360 1367
1361 1368 def getBasicHeader(self):
1362 1369
1363 1370 self.dataOut.utctime = self.basicHeaderObj.utc + self.basicHeaderObj.miliSecond/1000. + self.profileIndex * self.radarControllerHeaderObj.ippSeconds
1364 1371
1365 1372 self.dataOut.flagDiscontinuousBlock = self.flagDiscontinuousBlock
1366 1373
1367 1374 self.dataOut.timeZone = self.basicHeaderObj.timeZone
1368 1375
1369 1376 self.dataOut.dstFlag = self.basicHeaderObj.dstFlag
1370 1377
1371 1378 self.dataOut.errorCount = self.basicHeaderObj.errorCount
1372 1379
1373 1380 self.dataOut.useLocalTime = self.basicHeaderObj.useLocalTime
1374 1381
1375 1382 self.dataOut.ippSeconds = self.radarControllerHeaderObj.ippSeconds/self.nTxs
1376 1383
1377 1384 # self.dataOut.nProfiles = self.processingHeaderObj.profilesPerBlock*self.nTxs
1378 1385
1379 1386
1380 1387 def getFirstHeader(self):
1381 1388
1382 1389 raise NotImplementedError
1383 1390
1384 1391 def getData(self):
1385 1392
1386 1393 raise NotImplementedError
1387 1394
1388 1395 def hasNotDataInBuffer(self):
1389 1396
1390 1397 raise NotImplementedError
1391 1398
1392 1399 def readBlock(self):
1393 1400
1394 1401 raise NotImplementedError
1395 1402
1396 1403 def isEndProcess(self):
1397 1404
1398 1405 return self.flagNoMoreFiles
1399 1406
1400 1407 def printReadBlocks(self):
1401 1408
1402 1409 print "[Reading] Number of read blocks per file %04d" %self.nReadBlocks
1403 1410
1404 1411 def printTotalBlocks(self):
1405 1412
1406 1413 print "[Reading] Number of read blocks %04d" %self.nTotalBlocks
1407 1414
1408 1415 def printNumberOfBlock(self):
1409 1416
1410 1417 if self.flagIsNewBlock:
1411 1418 print "[Reading] Block No. %d/%d -> %s" %(self.nReadBlocks,
1412 1419 self.processingHeaderObj.dataBlocksPerFile,
1413 1420 self.dataOut.datatime.ctime())
1414 1421
1415 1422 def printInfo(self):
1416 1423
1417 1424 if self.__printInfo == False:
1418 1425 return
1419 1426
1420 1427 self.basicHeaderObj.printInfo()
1421 1428 self.systemHeaderObj.printInfo()
1422 1429 self.radarControllerHeaderObj.printInfo()
1423 1430 self.processingHeaderObj.printInfo()
1424 1431
1425 1432 self.__printInfo = False
1426 1433
1427 1434
1428 1435 def run(self, **kwargs):
1429 1436
1430 1437 if not(self.isConfig):
1431 1438
1432 1439 # self.dataOut = dataOut
1433 1440 self.setup(**kwargs)
1434 1441 self.isConfig = True
1435 1442
1436 1443 self.getData()
1437 1444
1438 1445 class JRODataWriter(JRODataIO):
1439 1446
1440 1447 """
1441 1448 Esta clase permite escribir datos a archivos procesados (.r o ,pdata). La escritura
1442 1449 de los datos siempre se realiza por bloques.
1443 1450 """
1444 1451
1445 1452 blockIndex = 0
1446 1453
1447 1454 path = None
1448 1455
1449 1456 setFile = None
1450 1457
1451 1458 profilesPerBlock = None
1452 1459
1453 1460 blocksPerFile = None
1454 1461
1455 1462 nWriteBlocks = 0
1456 1463
1457 1464 fileDate = None
1458 1465
1459 1466 def __init__(self, dataOut=None):
1460 1467 raise NotImplementedError
1461 1468
1462 1469
1463 1470 def hasAllDataInBuffer(self):
1464 1471 raise NotImplementedError
1465 1472
1466 1473
1467 1474 def setBlockDimension(self):
1468 1475 raise NotImplementedError
1469 1476
1470 1477
1471 1478 def writeBlock(self):
1472 1479 raise NotImplementedError
1473 1480
1474 1481
1475 1482 def putData(self):
1476 1483 raise NotImplementedError
1477 1484
1478 1485
1479 1486 def getProcessFlags(self):
1480 1487
1481 1488 processFlags = 0
1482 1489
1483 1490 dtype_index = get_dtype_index(self.dtype)
1484 1491 procflag_dtype = get_procflag_dtype(dtype_index)
1485 1492
1486 1493 processFlags += procflag_dtype
1487 1494
1488 1495 if self.dataOut.flagDecodeData:
1489 1496 processFlags += PROCFLAG.DECODE_DATA
1490 1497
1491 1498 if self.dataOut.flagDeflipData:
1492 1499 processFlags += PROCFLAG.DEFLIP_DATA
1493 1500
1494 1501 if self.dataOut.code is not None:
1495 1502 processFlags += PROCFLAG.DEFINE_PROCESS_CODE
1496 1503
1497 1504 if self.dataOut.nCohInt > 1:
1498 1505 processFlags += PROCFLAG.COHERENT_INTEGRATION
1499 1506
1500 1507 if self.dataOut.type == "Spectra":
1501 1508 if self.dataOut.nIncohInt > 1:
1502 1509 processFlags += PROCFLAG.INCOHERENT_INTEGRATION
1503 1510
1504 1511 if self.dataOut.data_dc is not None:
1505 1512 processFlags += PROCFLAG.SAVE_CHANNELS_DC
1506 1513
1507 1514 if self.dataOut.flagShiftFFT:
1508 1515 processFlags += PROCFLAG.SHIFT_FFT_DATA
1509 1516
1510 1517 return processFlags
1511 1518
1512 1519 def setBasicHeader(self):
1513 1520
1514 1521 self.basicHeaderObj.size = self.basicHeaderSize #bytes
1515 1522 self.basicHeaderObj.version = self.versionFile
1516 1523 self.basicHeaderObj.dataBlock = self.nTotalBlocks
1517 1524
1518 1525 utc = numpy.floor(self.dataOut.utctime)
1519 1526 milisecond = (self.dataOut.utctime - utc)* 1000.0
1520 1527
1521 1528 self.basicHeaderObj.utc = utc
1522 1529 self.basicHeaderObj.miliSecond = milisecond
1523 1530 self.basicHeaderObj.timeZone = self.dataOut.timeZone
1524 1531 self.basicHeaderObj.dstFlag = self.dataOut.dstFlag
1525 1532 self.basicHeaderObj.errorCount = self.dataOut.errorCount
1526 1533
1527 1534 def setFirstHeader(self):
1528 1535 """
1529 1536 Obtiene una copia del First Header
1530 1537
1531 1538 Affected:
1532 1539
1533 1540 self.basicHeaderObj
1534 1541 self.systemHeaderObj
1535 1542 self.radarControllerHeaderObj
1536 1543 self.processingHeaderObj self.
1537 1544
1538 1545 Return:
1539 1546 None
1540 1547 """
1541 1548
1542 1549 raise NotImplementedError
1543 1550
1544 1551 def __writeFirstHeader(self):
1545 1552 """
1546 1553 Escribe el primer header del file es decir el Basic header y el Long header (SystemHeader, RadarControllerHeader, ProcessingHeader)
1547 1554
1548 1555 Affected:
1549 1556 __dataType
1550 1557
1551 1558 Return:
1552 1559 None
1553 1560 """
1554 1561
1555 1562 # CALCULAR PARAMETROS
1556 1563
1557 1564 sizeLongHeader = self.systemHeaderObj.size + self.radarControllerHeaderObj.size + self.processingHeaderObj.size
1558 1565 self.basicHeaderObj.size = self.basicHeaderSize + sizeLongHeader
1559 1566
1560 1567 self.basicHeaderObj.write(self.fp)
1561 1568 self.systemHeaderObj.write(self.fp)
1562 1569 self.radarControllerHeaderObj.write(self.fp)
1563 1570 self.processingHeaderObj.write(self.fp)
1564 1571
1565 1572 def __setNewBlock(self):
1566 1573 """
1567 1574 Si es un nuevo file escribe el First Header caso contrario escribe solo el Basic Header
1568 1575
1569 1576 Return:
1570 1577 0 : si no pudo escribir nada
1571 1578 1 : Si escribio el Basic el First Header
1572 1579 """
1573 1580 if self.fp == None:
1574 1581 self.setNextFile()
1575 1582
1576 1583 if self.flagIsNewFile:
1577 1584 return 1
1578 1585
1579 1586 if self.blockIndex < self.processingHeaderObj.dataBlocksPerFile:
1580 1587 self.basicHeaderObj.write(self.fp)
1581 1588 return 1
1582 1589
1583 1590 if not( self.setNextFile() ):
1584 1591 return 0
1585 1592
1586 1593 return 1
1587 1594
1588 1595
1589 1596 def writeNextBlock(self):
1590 1597 """
1591 1598 Selecciona el bloque siguiente de datos y los escribe en un file
1592 1599
1593 1600 Return:
1594 1601 0 : Si no hizo pudo escribir el bloque de datos
1595 1602 1 : Si no pudo escribir el bloque de datos
1596 1603 """
1597 1604 if not( self.__setNewBlock() ):
1598 1605 return 0
1599 1606
1600 1607 self.writeBlock()
1601 1608
1602 1609 print "[Writing] Block No. %d/%d" %(self.blockIndex,
1603 1610 self.processingHeaderObj.dataBlocksPerFile)
1604 1611
1605 1612 return 1
1606 1613
1607 1614 def setNextFile(self):
1608 1615 """
1609 1616 Determina el siguiente file que sera escrito
1610 1617
1611 1618 Affected:
1612 1619 self.filename
1613 1620 self.subfolder
1614 1621 self.fp
1615 1622 self.setFile
1616 1623 self.flagIsNewFile
1617 1624
1618 1625 Return:
1619 1626 0 : Si el archivo no puede ser escrito
1620 1627 1 : Si el archivo esta listo para ser escrito
1621 1628 """
1622 1629 ext = self.ext
1623 1630 path = self.path
1624 1631
1625 1632 if self.fp != None:
1626 1633 self.fp.close()
1627 1634
1628 1635 timeTuple = time.localtime( self.dataOut.utctime)
1629 1636 subfolder = 'd%4.4d%3.3d' % (timeTuple.tm_year,timeTuple.tm_yday)
1630 1637
1631 1638 fullpath = os.path.join( path, subfolder )
1632 1639 setFile = self.setFile
1633 1640
1634 1641 if not( os.path.exists(fullpath) ):
1635 1642 os.mkdir(fullpath)
1636 1643 setFile = -1 #inicializo mi contador de seteo
1637 1644 else:
1638 1645 filesList = os.listdir( fullpath )
1639 1646 if len( filesList ) > 0:
1640 1647 filesList = sorted( filesList, key=str.lower )
1641 1648 filen = filesList[-1]
1642 1649 # el filename debera tener el siguiente formato
1643 1650 # 0 1234 567 89A BCDE (hex)
1644 1651 # x YYYY DDD SSS .ext
1645 1652 if isNumber( filen[8:11] ):
1646 1653 setFile = int( filen[8:11] ) #inicializo mi contador de seteo al seteo del ultimo file
1647 1654 else:
1648 1655 setFile = -1
1649 1656 else:
1650 1657 setFile = -1 #inicializo mi contador de seteo
1651 1658
1652 1659 setFile += 1
1653 1660
1654 1661 #If this is a new day it resets some values
1655 1662 if self.dataOut.datatime.date() > self.fileDate:
1656 1663 setFile = 0
1657 1664 self.nTotalBlocks = 0
1658 1665
1659 1666 filen = '%s%4.4d%3.3d%3.3d%s' % (self.optchar, timeTuple.tm_year, timeTuple.tm_yday, setFile, ext )
1660 1667
1661 1668 filename = os.path.join( path, subfolder, filen )
1662 1669
1663 1670 fp = open( filename,'wb' )
1664 1671
1665 1672 self.blockIndex = 0
1666 1673
1667 1674 #guardando atributos
1668 1675 self.filename = filename
1669 1676 self.subfolder = subfolder
1670 1677 self.fp = fp
1671 1678 self.setFile = setFile
1672 1679 self.flagIsNewFile = 1
1673 1680 self.fileDate = self.dataOut.datatime.date()
1674 1681
1675 1682 self.setFirstHeader()
1676 1683
1677 1684 print '[Writing] Opening file: %s'%self.filename
1678 1685
1679 1686 self.__writeFirstHeader()
1680 1687
1681 1688 return 1
1682 1689
1683 1690 def setup(self, dataOut, path, blocksPerFile, profilesPerBlock=64, set=None, ext=None, datatype=4):
1684 1691 """
1685 1692 Setea el tipo de formato en la cual sera guardada la data y escribe el First Header
1686 1693
1687 1694 Inputs:
1688 1695 path : directory where data will be saved
1689 1696 profilesPerBlock : number of profiles per block
1690 1697 set : initial file set
1691 1698 datatype : An integer number that defines data type:
1692 1699 0 : int8 (1 byte)
1693 1700 1 : int16 (2 bytes)
1694 1701 2 : int32 (4 bytes)
1695 1702 3 : int64 (8 bytes)
1696 1703 4 : float32 (4 bytes)
1697 1704 5 : double64 (8 bytes)
1698 1705
1699 1706 Return:
1700 1707 0 : Si no realizo un buen seteo
1701 1708 1 : Si realizo un buen seteo
1702 1709 """
1703 1710
1704 1711 if ext == None:
1705 1712 ext = self.ext
1706 1713
1707 1714 self.ext = ext.lower()
1708 1715
1709 1716 self.path = path
1710 1717
1711 1718 if set is None:
1712 1719 self.setFile = -1
1713 1720 else:
1714 1721 self.setFile = set - 1
1715 1722
1716 1723 self.blocksPerFile = blocksPerFile
1717 1724
1718 1725 self.profilesPerBlock = profilesPerBlock
1719 1726
1720 1727 self.dataOut = dataOut
1721 1728 self.fileDate = self.dataOut.datatime.date()
1722 1729 #By default
1723 1730 self.dtype = self.dataOut.dtype
1724 1731
1725 1732 if datatype is not None:
1726 1733 self.dtype = get_numpy_dtype(datatype)
1727 1734
1728 1735 if not(self.setNextFile()):
1729 1736 print "[Writing] There isn't a next file"
1730 1737 return 0
1731 1738
1732 1739 self.setBlockDimension()
1733 1740
1734 1741 return 1
1735 1742
1736 1743 def run(self, dataOut, **kwargs):
1737 1744
1738 1745 if not(self.isConfig):
1739 1746
1740 1747 self.setup(dataOut, **kwargs)
1741 1748 self.isConfig = True
1742 1749
1743 1750 self.putData()
@@ -1,346 +1,346
1 1 '''
2 2
3 3 $Author: murco $
4 4 $Id: jroproc_base.py 1 2012-11-12 18:56:07Z murco $
5 5 '''
6 6 import inspect
7 7 from fuzzywuzzy import process
8 8
9 9 def checkKwargs(method, kwargs):
10 10 currentKwargs = kwargs
11 11 choices = inspect.getargspec(method).args
12 12 try:
13 13 choices.remove('self')
14 14 except Exception as e:
15 15 pass
16 16
17 17 try:
18 18 choices.remove('dataOut')
19 19 except Exception as e:
20 20 pass
21 21
22 22 for kwarg in kwargs:
23 23 fuzz = process.extractOne(kwarg, choices)
24 24 if fuzz is None:
25 25 continue
26 26 if fuzz[1] < 100:
27 raise Exception('\x1b[2;30;43mDid you mean {} instead of {} in {}? \x1b[0m'.
27 raise Exception('\x1b[0;32;40mDid you mean {} instead of {} in {}? \x1b[0m'.
28 28 format(fuzz[0], kwarg, method.__self__.__class__.__name__))
29 29
30 30 class ProcessingUnit(object):
31 31
32 32 """
33 33 Esta es la clase base para el procesamiento de datos.
34 34
35 35 Contiene el metodo "call" para llamar operaciones. Las operaciones pueden ser:
36 36 - Metodos internos (callMethod)
37 37 - Objetos del tipo Operation (callObject). Antes de ser llamados, estos objetos
38 38 tienen que ser agreagados con el metodo "add".
39 39
40 40 """
41 41 # objeto de datos de entrada (Voltage, Spectra o Correlation)
42 42 dataIn = None
43 43 dataInList = []
44 44
45 45 # objeto de datos de entrada (Voltage, Spectra o Correlation)
46 46 dataOut = None
47 47
48 48 operations2RunDict = None
49 49
50 50 isConfig = False
51 51
52 52
53 53 def __init__(self, *args, **kwargs):
54 54
55 55 self.dataIn = None
56 56 self.dataInList = []
57 57
58 58 self.dataOut = None
59 59
60 60 self.operations2RunDict = {}
61 61 self.operationKwargs = {}
62 62
63 63 self.isConfig = False
64 64
65 65 self.args = args
66 66 self.kwargs = kwargs
67 67 checkKwargs(self.run, kwargs)
68 68
69 69 def getAllowedArgs(self):
70 70 return inspect.getargspec(self.run).args
71 71
72 72 def addOperationKwargs(self, objId, **kwargs):
73 73 '''
74 74 '''
75 75
76 76 self.operationKwargs[objId] = kwargs
77 77
78 78
79 79 def addOperation(self, opObj, objId):
80 80
81 81 """
82 82 Agrega un objeto del tipo "Operation" (opObj) a la lista de objetos "self.objectList" y retorna el
83 83 identificador asociado a este objeto.
84 84
85 85 Input:
86 86
87 87 object : objeto de la clase "Operation"
88 88
89 89 Return:
90 90
91 91 objId : identificador del objeto, necesario para ejecutar la operacion
92 92 """
93 93
94 94 self.operations2RunDict[objId] = opObj
95 95
96 96 return objId
97 97
98 98 def getOperationObj(self, objId):
99 99
100 100 if objId not in self.operations2RunDict.keys():
101 101 return None
102 102
103 103 return self.operations2RunDict[objId]
104 104
105 105 def operation(self, **kwargs):
106 106
107 107 """
108 108 Operacion directa sobre la data (dataOut.data). Es necesario actualizar los valores de los
109 109 atributos del objeto dataOut
110 110
111 111 Input:
112 112
113 113 **kwargs : Diccionario de argumentos de la funcion a ejecutar
114 114 """
115 115
116 116 raise NotImplementedError
117 117
118 118 def callMethod(self, name, opId):
119 119
120 120 """
121 121 Ejecuta el metodo con el nombre "name" y con argumentos **kwargs de la propia clase.
122 122
123 123 Input:
124 124 name : nombre del metodo a ejecutar
125 125
126 126 **kwargs : diccionario con los nombres y valores de la funcion a ejecutar.
127 127
128 128 """
129 129
130 130 #Checking the inputs
131 131 if name == 'run':
132 132
133 133 if not self.checkInputs():
134 134 self.dataOut.flagNoData = True
135 135 return False
136 136 else:
137 137 #Si no es un metodo RUN la entrada es la misma dataOut (interna)
138 138 if self.dataOut is not None and self.dataOut.isEmpty():
139 139 return False
140 140
141 141 #Getting the pointer to method
142 142 methodToCall = getattr(self, name)
143 143
144 144 #Executing the self method
145 145
146 146 if hasattr(self, 'mp'):
147 147 if name=='run':
148 148 if self.mp is False:
149 149 self.mp = True
150 150 self.start()
151 151 else:
152 152 methodToCall(**self.operationKwargs[opId])
153 153 else:
154 154 if name=='run':
155 155 methodToCall(**self.kwargs)
156 156 else:
157 157 methodToCall(**self.operationKwargs[opId])
158 158
159 159 if self.dataOut is None:
160 160 return False
161 161
162 162 if self.dataOut.isEmpty():
163 163 return False
164 164
165 165 return True
166 166
167 167 def callObject(self, objId):
168 168
169 169 """
170 170 Ejecuta la operacion asociada al identificador del objeto "objId"
171 171
172 172 Input:
173 173
174 174 objId : identificador del objeto a ejecutar
175 175
176 176 **kwargs : diccionario con los nombres y valores de la funcion a ejecutar.
177 177
178 178 Return:
179 179
180 180 None
181 181 """
182 182
183 183 if self.dataOut is not None and self.dataOut.isEmpty():
184 184 return False
185 185
186 186 externalProcObj = self.operations2RunDict[objId]
187 187
188 188 if hasattr(externalProcObj, 'mp'):
189 189 if externalProcObj.mp is False:
190 190 self.operationKwargs[objId] = externalProcObj.kwargs
191 191 externalProcObj.mp = True
192 192 externalProcObj.start()
193 193 else:
194 194 externalProcObj.run(self.dataOut, **externalProcObj.kwargs)
195 195 self.operationKwargs[objId] = externalProcObj.kwargs
196 196
197 197 return True
198 198
199 199 def call(self, opType, opName=None, opId=None):
200 200
201 201 """
202 202 Return True si ejecuta la operacion interna nombrada "opName" o la operacion externa
203 203 identificada con el id "opId"; con los argumentos "**kwargs".
204 204
205 205 False si la operacion no se ha ejecutado.
206 206
207 207 Input:
208 208
209 209 opType : Puede ser "self" o "external"
210 210
211 211 Depende del tipo de operacion para llamar a:callMethod or callObject:
212 212
213 213 1. If opType = "self": Llama a un metodo propio de esta clase:
214 214
215 215 name_method = getattr(self, name)
216 216 name_method(**kwargs)
217 217
218 218
219 219 2. If opType = "other" o"external": Llama al metodo "run()" de una instancia de la
220 220 clase "Operation" o de un derivado de ella:
221 221
222 222 instanceName = self.operationList[opId]
223 223 instanceName.run(**kwargs)
224 224
225 225 opName : Si la operacion es interna (opType = 'self'), entonces el "opName" sera
226 226 usada para llamar a un metodo interno de la clase Processing
227 227
228 228 opId : Si la operacion es externa (opType = 'other' o 'external), entonces el
229 229 "opId" sera usada para llamar al metodo "run" de la clase Operation
230 230 registrada anteriormente con ese Id
231 231
232 232 Exception:
233 233 Este objeto de tipo Operation debe de haber sido agregado antes con el metodo:
234 234 "addOperation" e identificado con el valor "opId" = el id de la operacion.
235 235 De lo contrario retornara un error del tipo ValueError
236 236
237 237 """
238 238
239 239 if opType == 'self':
240 240
241 241 if not opName:
242 242 raise ValueError, "opName parameter should be defined"
243 243
244 244 sts = self.callMethod(opName, opId)
245 245
246 246 elif opType == 'other' or opType == 'external' or opType == 'plotter':
247 247
248 248 if not opId:
249 249 raise ValueError, "opId parameter should be defined"
250 250
251 251 if opId not in self.operations2RunDict.keys():
252 252 raise ValueError, "Any operation with id=%s has been added" %str(opId)
253 253
254 254 sts = self.callObject(opId)
255 255
256 256 else:
257 257 raise ValueError, "opType should be 'self', 'external' or 'plotter'; and not '%s'" %opType
258 258
259 259 return sts
260 260
261 261 def setInput(self, dataIn):
262 262
263 263 self.dataIn = dataIn
264 264 self.dataInList.append(dataIn)
265 265
266 266 def getOutputObj(self):
267 267
268 268 return self.dataOut
269 269
270 270 def checkInputs(self):
271 271
272 272 for thisDataIn in self.dataInList:
273 273
274 274 if thisDataIn.isEmpty():
275 275 return False
276 276
277 277 return True
278 278
279 279 def setup(self):
280 280
281 281 raise NotImplementedError
282 282
283 283 def run(self):
284 284
285 285 raise NotImplementedError
286 286
287 287 def close(self):
288 288 #Close every thread, queue or any other object here is it is neccesary.
289 289 return
290 290
291 291 class Operation(object):
292 292
293 293 """
294 294 Clase base para definir las operaciones adicionales que se pueden agregar a la clase ProcessingUnit
295 295 y necesiten acumular informacion previa de los datos a procesar. De preferencia usar un buffer de
296 296 acumulacion dentro de esta clase
297 297
298 298 Ejemplo: Integraciones coherentes, necesita la informacion previa de los n perfiles anteriores (bufffer)
299 299
300 300 """
301 301
302 302 __buffer = None
303 303 isConfig = False
304 304
305 305 def __init__(self, **kwargs):
306 306
307 307 self.__buffer = None
308 308 self.isConfig = False
309 309 self.kwargs = kwargs
310 310 checkKwargs(self.run, kwargs)
311 311
312 312 def getAllowedArgs(self):
313 313 return inspect.getargspec(self.run).args
314 314
315 315 def setup(self):
316 316
317 317 self.isConfig = True
318 318
319 319 raise NotImplementedError
320 320
321 321 def run(self, dataIn, **kwargs):
322 322
323 323 """
324 324 Realiza las operaciones necesarias sobre la dataIn.data y actualiza los
325 325 atributos del objeto dataIn.
326 326
327 327 Input:
328 328
329 329 dataIn : objeto del tipo JROData
330 330
331 331 Return:
332 332
333 333 None
334 334
335 335 Affected:
336 336 __buffer : buffer de recepcion de datos.
337 337
338 338 """
339 339 if not self.isConfig:
340 340 self.setup(**kwargs)
341 341
342 342 raise NotImplementedError
343 343
344 344 def close(self):
345 345
346 346 pass
@@ -1,445 +1,457
1 1 '''
2 2 @author: Juan C. Espinoza
3 3 '''
4 4
5 5 import time
6 6 import json
7 7 import numpy
8 8 import paho.mqtt.client as mqtt
9 9 import zmq
10 import cPickle as pickle
10 from profilehooks import profile
11 11 import datetime
12 12 from zmq.utils.monitor import recv_monitor_message
13 13 from functools import wraps
14 14 from threading import Thread
15 15 from multiprocessing import Process
16 16
17 17 from schainpy.model.proc.jroproc_base import Operation, ProcessingUnit
18 18
19 19 MAXNUMX = 100
20 20 MAXNUMY = 100
21 21
22 22 class PrettyFloat(float):
23 23 def __repr__(self):
24 24 return '%.2f' % self
25 25
26 26 def roundFloats(obj):
27 27 if isinstance(obj, list):
28 28 return map(roundFloats, obj)
29 29 elif isinstance(obj, float):
30 30 return round(obj, 2)
31 31
32 def decimate(z):
32 def decimate(z, MAXNUMY):
33 33 # dx = int(len(self.x)/self.__MAXNUMX) + 1
34 34
35 35 dy = int(len(z[0])/MAXNUMY) + 1
36 36
37 37 return z[::, ::dy]
38 38
39 39 class throttle(object):
40 40 """Decorator that prevents a function from being called more than once every
41 41 time period.
42 42 To create a function that cannot be called more than once a minute, but
43 43 will sleep until it can be called:
44 44 @throttle(minutes=1)
45 45 def foo():
46 46 pass
47 47
48 48 for i in range(10):
49 49 foo()
50 50 print "This function has run %s times." % i
51 51 """
52 52
53 53 def __init__(self, seconds=0, minutes=0, hours=0):
54 54 self.throttle_period = datetime.timedelta(
55 55 seconds=seconds, minutes=minutes, hours=hours
56 56 )
57 57
58 58 self.time_of_last_call = datetime.datetime.min
59 59
60 60 def __call__(self, fn):
61 61 @wraps(fn)
62 62 def wrapper(*args, **kwargs):
63 63 now = datetime.datetime.now()
64 64 time_since_last_call = now - self.time_of_last_call
65 65 time_left = self.throttle_period - time_since_last_call
66 66
67 67 if time_left > datetime.timedelta(seconds=0):
68 68 return
69 69
70 70 self.time_of_last_call = datetime.datetime.now()
71 71 return fn(*args, **kwargs)
72 72
73 73 return wrapper
74 74
75 75
76 76 class PublishData(Operation):
77 77 """Clase publish."""
78 78
79 79 def __init__(self, **kwargs):
80 80 """Inicio."""
81 81 Operation.__init__(self, **kwargs)
82 82 self.isConfig = False
83 83 self.client = None
84 84 self.zeromq = None
85 85 self.mqtt = None
86 86
87 87 def on_disconnect(self, client, userdata, rc):
88 88 if rc != 0:
89 89 print("Unexpected disconnection.")
90 90 self.connect()
91 91
92 92 def connect(self):
93 93 print 'trying to connect'
94 94 try:
95 95 self.client.connect(
96 96 host=self.host,
97 97 port=self.port,
98 98 keepalive=60*10,
99 99 bind_address='')
100 100 self.client.loop_start()
101 101 # self.client.publish(
102 102 # self.topic + 'SETUP',
103 103 # json.dumps(setup),
104 104 # retain=True
105 105 # )
106 106 except:
107 107 print "MQTT Conection error."
108 108 self.client = False
109 109
110 def setup(self, port=1883, username=None, password=None, clientId="user", zeromq=1, **kwargs):
110 def setup(self, port=1883, username=None, password=None, clientId="user", zeromq=1, verbose=True, **kwargs):
111 111 self.counter = 0
112 112 self.topic = kwargs.get('topic', 'schain')
113 113 self.delay = kwargs.get('delay', 0)
114 114 self.plottype = kwargs.get('plottype', 'spectra')
115 115 self.host = kwargs.get('host', "10.10.10.82")
116 116 self.port = kwargs.get('port', 3000)
117 117 self.clientId = clientId
118 118 self.cnt = 0
119 119 self.zeromq = zeromq
120 120 self.mqtt = kwargs.get('plottype', 0)
121 121 self.client = None
122 self.verbose = verbose
123 self.dataOut.firstdata = True
122 124 setup = []
123 125 if mqtt is 1:
124 126 self.client = mqtt.Client(
125 127 client_id=self.clientId + self.topic + 'SCHAIN',
126 128 clean_session=True)
127 129 self.client.on_disconnect = self.on_disconnect
128 130 self.connect()
129 131 for plot in self.plottype:
130 132 setup.append({
131 133 'plot': plot,
132 134 'topic': self.topic + plot,
133 135 'title': getattr(self, plot + '_' + 'title', False),
134 136 'xlabel': getattr(self, plot + '_' + 'xlabel', False),
135 137 'ylabel': getattr(self, plot + '_' + 'ylabel', False),
136 138 'xrange': getattr(self, plot + '_' + 'xrange', False),
137 139 'yrange': getattr(self, plot + '_' + 'yrange', False),
138 140 'zrange': getattr(self, plot + '_' + 'zrange', False),
139 141 })
140 142 if zeromq is 1:
141 143 context = zmq.Context()
142 144 self.zmq_socket = context.socket(zmq.PUSH)
143 145 server = kwargs.get('server', 'zmq.pipe')
144 146
145 147 if 'tcp://' in server:
146 148 address = server
147 149 else:
148 150 address = 'ipc:///tmp/%s' % server
149 151
150 152 self.zmq_socket.connect(address)
151 153 time.sleep(1)
152 154
155
153 156 def publish_data(self):
154 157 self.dataOut.finished = False
155 158 if self.mqtt is 1:
156 159 yData = self.dataOut.heightList[:2].tolist()
157 160 if self.plottype == 'spectra':
158 161 data = getattr(self.dataOut, 'data_spc')
159 162 z = data/self.dataOut.normFactor
160 163 zdB = 10*numpy.log10(z)
161 164 xlen, ylen = zdB[0].shape
162 165 dx = int(xlen/MAXNUMX) + 1
163 166 dy = int(ylen/MAXNUMY) + 1
164 167 Z = [0 for i in self.dataOut.channelList]
165 168 for i in self.dataOut.channelList:
166 169 Z[i] = zdB[i][::dx, ::dy].tolist()
167 170 payload = {
168 171 'timestamp': self.dataOut.utctime,
169 172 'data': roundFloats(Z),
170 173 'channels': ['Ch %s' % ch for ch in self.dataOut.channelList],
171 174 'interval': self.dataOut.getTimeInterval(),
172 175 'type': self.plottype,
173 176 'yData': yData
174 177 }
175 178 # print payload
176 179
177 180 elif self.plottype in ('rti', 'power'):
178 181 data = getattr(self.dataOut, 'data_spc')
179 182 z = data/self.dataOut.normFactor
180 183 avg = numpy.average(z, axis=1)
181 184 avgdB = 10*numpy.log10(avg)
182 185 xlen, ylen = z[0].shape
183 186 dy = numpy.floor(ylen/self.__MAXNUMY) + 1
184 187 AVG = [0 for i in self.dataOut.channelList]
185 188 for i in self.dataOut.channelList:
186 189 AVG[i] = avgdB[i][::dy].tolist()
187 190 payload = {
188 191 'timestamp': self.dataOut.utctime,
189 192 'data': roundFloats(AVG),
190 193 'channels': ['Ch %s' % ch for ch in self.dataOut.channelList],
191 194 'interval': self.dataOut.getTimeInterval(),
192 195 'type': self.plottype,
193 196 'yData': yData
194 197 }
195 198 elif self.plottype == 'noise':
196 199 noise = self.dataOut.getNoise()/self.dataOut.normFactor
197 200 noisedB = 10*numpy.log10(noise)
198 201 payload = {
199 202 'timestamp': self.dataOut.utctime,
200 203 'data': roundFloats(noisedB.reshape(-1, 1).tolist()),
201 204 'channels': ['Ch %s' % ch for ch in self.dataOut.channelList],
202 205 'interval': self.dataOut.getTimeInterval(),
203 206 'type': self.plottype,
204 207 'yData': yData
205 208 }
206 209 elif self.plottype == 'snr':
207 210 data = getattr(self.dataOut, 'data_SNR')
208 211 avgdB = 10*numpy.log10(data)
209 212
210 213 ylen = data[0].size
211 214 dy = numpy.floor(ylen/self.__MAXNUMY) + 1
212 215 AVG = [0 for i in self.dataOut.channelList]
213 216 for i in self.dataOut.channelList:
214 217 AVG[i] = avgdB[i][::dy].tolist()
215 218 payload = {
216 219 'timestamp': self.dataOut.utctime,
217 220 'data': roundFloats(AVG),
218 221 'channels': ['Ch %s' % ch for ch in self.dataOut.channelList],
219 222 'type': self.plottype,
220 223 'yData': yData
221 224 }
222 225 else:
223 226 print "Tipo de grafico invalido"
224 227 payload = {
225 228 'data': 'None',
226 229 'timestamp': 'None',
227 230 'type': None
228 231 }
229 232 # print 'Publishing data to {}'.format(self.host)
230 233 self.client.publish(self.topic + self.plottype, json.dumps(payload), qos=0)
231 234
232 235 if self.zeromq is 1:
236 if self.verbose:
233 237 print '[Sending] {} - {}'.format(self.dataOut.type, self.dataOut.datatime)
234 238 self.zmq_socket.send_pyobj(self.dataOut)
239 self.dataOut.firstdata = False
240
235 241
236 242 def run(self, dataOut, **kwargs):
237 243 self.dataOut = dataOut
238 244 if not self.isConfig:
239 245 self.setup(**kwargs)
240 246 self.isConfig = True
241 247
242 248 self.publish_data()
243 249 time.sleep(self.delay)
244 250
245 251 def close(self):
246 252 if self.zeromq is 1:
247 253 self.dataOut.finished = True
248 254 self.zmq_socket.send_pyobj(self.dataOut)
249
255 self.zmq_socket.close()
250 256 if self.client:
251 257 self.client.loop_stop()
252 258 self.client.disconnect()
253 259
254
255 260 class ReceiverData(ProcessingUnit, Process):
256 261
257 262 throttle_value = 5
258 263
259 264 def __init__(self, **kwargs):
260 265
261 266 ProcessingUnit.__init__(self, **kwargs)
262 267 Process.__init__(self)
263 268 self.mp = False
264 269 self.isConfig = False
265 270 self.isWebConfig = False
266 271 self.plottypes =[]
267 272 self.connections = 0
268 273 server = kwargs.get('server', 'zmq.pipe')
269 274 plot_server = kwargs.get('plot_server', 'zmq.web')
270 275 if 'tcp://' in server:
271 276 address = server
272 277 else:
273 278 address = 'ipc:///tmp/%s' % server
274 279
275 280 if 'tcp://' in plot_server:
276 281 plot_address = plot_server
277 282 else:
278 283 plot_address = 'ipc:///tmp/%s' % plot_server
279 284
280 285 self.address = address
281 286 self.plot_address = plot_address
282 287 self.plottypes = [s.strip() for s in kwargs.get('plottypes', 'rti').split(',')]
283 288 self.realtime = kwargs.get('realtime', False)
284 289 self.throttle_value = kwargs.get('throttle', 5)
285 290 self.sendData = self.initThrottle(self.throttle_value)
286 291 self.setup()
287 292
288 293 def setup(self):
289 294
290 295 self.data = {}
291 296 self.data['times'] = []
292 297 for plottype in self.plottypes:
293 298 self.data[plottype] = {}
294 299 self.data['noise'] = {}
295 300 self.data['throttle'] = self.throttle_value
296 301 self.data['ENDED'] = False
297 302 self.isConfig = True
298 303 self.data_web = {}
299 304
300 305 def event_monitor(self, monitor):
301 306
302 307 events = {}
303 308
304 309 for name in dir(zmq):
305 310 if name.startswith('EVENT_'):
306 311 value = getattr(zmq, name)
307 312 events[value] = name
308 313
309 314 while monitor.poll():
310 315 evt = recv_monitor_message(monitor)
311 316 if evt['event'] == 32:
312 317 self.connections += 1
313 318 if evt['event'] == 512:
314 319 pass
315 320 if self.connections == 0 and self.started is True:
316 321 self.ended = True
317 322
318 323 evt.update({'description': events[evt['event']]})
319 324
320 325 if evt['event'] == zmq.EVENT_MONITOR_STOPPED:
321 326 break
322 327 monitor.close()
323 328 print("event monitor thread done!")
324 329
325 330 def initThrottle(self, throttle_value):
326 331
327 332 @throttle(seconds=throttle_value)
328 333 def sendDataThrottled(fn_sender, data):
329 334 fn_sender(data)
330 335
331 336 return sendDataThrottled
332 337
338
333 339 def send(self, data):
334 340 # print '[sending] data=%s size=%s' % (data.keys(), len(data['times']))
335 341 self.sender.send_pyobj(data)
336 342
337 def update(self):
338 343
344 def update(self):
339 345 t = self.dataOut.utctime
340 346
341 347 if t in self.data['times']:
342 348 return
343 349
344 350 self.data['times'].append(t)
345 351 self.data['dataOut'] = self.dataOut
346 352
347 353 for plottype in self.plottypes:
348 354 if plottype == 'spc':
349 355 z = self.dataOut.data_spc/self.dataOut.normFactor
350 356 self.data[plottype] = 10*numpy.log10(z)
351 357 self.data['noise'][t] = 10*numpy.log10(self.dataOut.getNoise()/self.dataOut.normFactor)
352 358 if plottype == 'cspc':
353 359 jcoherence = self.dataOut.data_cspc/numpy.sqrt(self.dataOut.data_spc*self.dataOut.data_spc)
354 360 self.data['cspc_coh'] = numpy.abs(jcoherence)
355 361 self.data['cspc_phase'] = numpy.arctan2(jcoherence.imag, jcoherence.real)*180/numpy.pi
356 362 if plottype == 'rti':
357 363 self.data[plottype][t] = self.dataOut.getPower()
358 364 if plottype == 'snr':
359 365 self.data[plottype][t] = 10*numpy.log10(self.dataOut.data_SNR)
360 366 if plottype == 'dop':
361 367 self.data[plottype][t] = 10*numpy.log10(self.dataOut.data_DOP)
362 368 if plottype == 'mean':
363 369 self.data[plottype][t] = self.dataOut.data_MEAN
364 370 if plottype == 'std':
365 371 self.data[plottype][t] = self.dataOut.data_STD
366 372 if plottype == 'coh':
367 373 self.data[plottype][t] = self.dataOut.getCoherence()
368 374 if plottype == 'phase':
369 375 self.data[plottype][t] = self.dataOut.getCoherence(phase=True)
370 376 if plottype == 'wind':
371 377 self.data[plottype][t] = self.dataOut.data_output
372 378 if self.realtime:
373 379 self.data_web['timestamp'] = t
374 380 if plottype == 'spc':
375 381 self.data_web[plottype] = roundFloats(decimate(self.data[plottype]).tolist())
376 382 elif plottype == 'cspc':
377 383 self.data_web['cspc_coh'] = roundFloats(decimate(self.data['cspc_coh']).tolist())
378 384 self.data_web['cspc_phase'] = roundFloats(decimate(self.data['cspc_phase']).tolist())
379 385 elif plottype == 'noise':
380 386 self.data_web['noise'] = roundFloats(self.data['noise'][t].tolist())
381 387 else:
382 388 self.data_web[plottype] = roundFloats(decimate(self.data[plottype][t]).tolist())
383 389 self.data_web['interval'] = self.dataOut.getTimeInterval()
384 390 self.data_web['type'] = plottype
385 391
386 392 def run(self):
387 393
388 394 print '[Starting] {} from {}'.format(self.name, self.address)
389 395
390 396 self.context = zmq.Context()
391 397 self.receiver = self.context.socket(zmq.PULL)
392 398 self.receiver.bind(self.address)
393 399 monitor = self.receiver.get_monitor_socket()
394 400 self.sender = self.context.socket(zmq.PUB)
395 401 if self.realtime:
396 402 self.sender_web = self.context.socket(zmq.PUB)
397 403 self.sender_web.connect(self.plot_address)
398 404 time.sleep(1)
399 405 self.sender.bind("ipc:///tmp/zmq.plots")
400
406 time.sleep(3)
401 407 t = Thread(target=self.event_monitor, args=(monitor,))
402 408 t.start()
403 409
404 410 while True:
405 411 self.dataOut = self.receiver.recv_pyobj()
406 412 # print '[Receiving] {} - {}'.format(self.dataOut.type,
407 413 # self.dataOut.datatime.ctime())
408 414
409 415 self.update()
410 416
417 if self.dataOut.firstdata is True:
418 self.data['STARTED'] = True
419
420
411 421 if self.dataOut.finished is True:
412 422 self.send(self.data)
413 423 self.connections -= 1
414 424 if self.connections == 0 and self.started:
415 425 self.ended = True
416 426 self.data['ENDED'] = True
417 427 self.send(self.data)
418 428 self.setup()
429 self.started = False
419 430 else:
420 431 if self.realtime:
421 432 self.send(self.data)
422 433 self.sender_web.send_string(json.dumps(self.data_web))
423 434 else:
424 435 self.sendData(self.send, self.data)
425 436 self.started = True
426 437
438 self.data['STARTED'] = False
427 439 return
428 440
429 441 def sendToWeb(self):
430 442
431 443 if not self.isWebConfig:
432 444 context = zmq.Context()
433 445 sender_web_config = context.socket(zmq.PUB)
434 446 if 'tcp://' in self.plot_address:
435 447 dum, address, port = self.plot_address.split(':')
436 448 conf_address = '{}:{}:{}'.format(dum, address, int(port)+1)
437 449 else:
438 450 conf_address = self.plot_address + '.config'
439 451 sender_web_config.bind(conf_address)
440 452 time.sleep(1)
441 453 for kwargs in self.operationKwargs.values():
442 454 if 'plot' in kwargs:
443 455 print '[Sending] Config data to web for {}'.format(kwargs['code'].upper())
444 456 sender_web_config.send_string(json.dumps(kwargs))
445 457 self.isWebConfig = True
@@ -1,96 +1,97
1 1 import argparse
2 2
3 3 from schainpy.controller import Project, multiSchain
4 4
5 5 desc = "HF_EXAMPLE"
6 6
7 7 def fiber(cursor, skip, q, dt):
8 8
9 9 controllerObj = Project()
10 10
11 11 controllerObj.setup(id='191', name='test01', description=desc)
12 12
13 13 readUnitConfObj = controllerObj.addReadUnit(datatype='SpectraReader',
14 path='/home/nanosat/data/julia',
14 path='/home/nanosat/data/sp1_f0',
15 15 startDate=dt,
16 16 endDate=dt,
17 17 startTime="00:00:00",
18 18 endTime="23:59:59",
19 19 online=0,
20 20 #set=1426485881,
21 delay=10,
22 21 walk=1,
23 22 queue=q,
24 23 cursor=cursor,
25 24 skip=skip,
25 verbose=1
26 26 #timezone=-5*3600
27 27 )
28 28
29 29 # #opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock')
30 30 #
31 31 procUnitConfObj2 = controllerObj.addProcUnit(datatype='Spectra', inputId=readUnitConfObj.getId())
32 32 # procUnitConfObj2.addParameter(name='nipp', value='5', format='int')
33 33
34 34 procUnitConfObj3 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=readUnitConfObj.getId())
35 35 opObj11 = procUnitConfObj3.addOperation(name='SpectralMoments', optype='other')
36 36
37 37 #
38 38 # opObj11 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='other')
39 39 # opObj11.addParameter(name='id', value='1000', format='int')
40 40 # opObj11.addParameter(name='wintitle', value='HF_Jicamarca_Spc', format='str')
41 41 # opObj11.addParameter(name='channelList', value='0', format='intlist')
42 42 # opObj11.addParameter(name='zmin', value='-120', format='float')
43 43 # opObj11.addParameter(name='zmax', value='-70', format='float')
44 44 # opObj11.addParameter(name='save', value='1', format='int')
45 45 # opObj11.addParameter(name='figpath', value=figpath, format='str')
46 46
47 opObj11 = procUnitConfObj3.addOperation(name='Parameters1Plot', optype='other')
48 opObj11.addParameter(name='channelList', value='0', format='intList')
47 # opObj11 = procUnitConfObj3.addOperation(name='Parameters1Plot', optype='other')
48 # opObj11.addParameter(name='channelList', value='0', format='intList')
49 49
50 opObj11.addParameter(name='id', value='2000', format='int')
51 # opObj11.addParameter(name='colormap', value='0', format='bool')
52 opObj11.addParameter(name='onlySNR', value='1', format='bool')
53 opObj11.addParameter(name='DOP', value='0', format='bool')
54 # opObj11.addParameter(name='showSNR', value='1', format='bool')
55 # opObj11.addParameter(name='SNRthresh', value='0', format='int')
50 # opObj11.addParameter(name='id', value='2000', format='int')
51 # # opObj11.addParameter(name='colormap', value='0', format='bool')
52 # opObj11.addParameter(name='onlySNR', value='1', format='bool')
53 # opObj11.addParameter(name='DOP', value='0', format='bool')
54 # # opObj11.addParameter(name='showSNR', value='1', format='bool')
55 # # opObj11.addParameter(name='SNRthresh', value='0', format='int')
56 56 # opObj11.addParameter(name='SNRmin', value='-10', format='int')
57 57 # opObj11.addParameter(name='SNRmax', value='30', format='int')
58 58
59 59 # opObj11.addParameter(name='showSNR', value='1', format='int')
60 60 # # opObj11.addParameter(name='channelList', value='0', format='intlist')
61 61 # # opObj11.addParameter(name='xmin', value='0', format='float')
62 62 # opObj11.addParameter(name='xmin', value='0', format='float')
63 63 # opObj11.addParameter(name='xmax', value='24', format='float')
64 64
65 65 # opObj11.addParameter(name='zmin', value='-110', format='float')
66 66 # opObj11.addParameter(name='zmax', value='-70', format='float')
67 67 # opObj11.addParameter(name='save', value='0', format='int')
68 68 # # opObj11.addParameter(name='figpath', value='/tmp/', format='str')
69 69 #
70 70 opObj12 = procUnitConfObj3.addOperation(name='PublishData', optype='other')
71 71 opObj12.addParameter(name='zeromq', value=1, format='int')
72 opObj12.addParameter(name='verbose', value=0, format='bool')
72 73
73 74
74 75 # opObj13 = procUnitConfObj3.addOperation(name='PublishData', optype='other')
75 76 # opObj13.addParameter(name='zeromq', value=1, format='int')
76 77 # opObj13.addParameter(name='server', value="juanca", format='str')
77 78
78 opObj12.addParameter(name='delay', value=1, format='int')
79 opObj12.addParameter(name='delay', value=0, format='int')
79 80
80 81
81 82 # print "Escribiendo el archivo XML"
82 83 # controllerObj.writeXml(filename)
83 84 # print "Leyendo el archivo XML"
84 85 # controllerObj.readXml(filename)
85 86
86 87
87 88 # timeit.timeit('controllerObj.run()', number=2)
88 89
89 90 controllerObj.start()
90 91
91 92
92 93 if __name__ == '__main__':
93 94 parser = argparse.ArgumentParser(description='Set number of parallel processes')
94 95 parser.add_argument('--nProcess', default=1, type=int)
95 96 args = parser.parse_args()
96 multiSchain(fiber, nProcess=args.nProcess, startDate='2015/09/26', endDate='2015/09/26')
97 multiSchain(fiber, nProcess=args.nProcess, startDate='2017/01/26', endDate='2017/01/28')
@@ -1,75 +1,97
1 #!/usr/bin/env python
2 '''
3 Created on Jul 7, 2014
1 import argparse
4 2
5 @author: roj-idl71
6 '''
7 import os, sys
8 from datetime import datetime, timedelta
9 import multiprocessing
10 from schainpy.controller import Project
3 from schainpy.controller import Project, multiSchain
11 4
12 def main(date):
5 desc = "HF_EXAMPLE"
6
7 def fiber(cursor, skip, q, dt):
13 8
14 9 controllerObj = Project()
15 10
16 controllerObj.setup(id='191', name='test01', description='')
11 controllerObj.setup(id='191', name='test01', description=desc)
17 12
18 readUnitConfObj = controllerObj.addReadUnit(datatype='Spectra',
19 path='/home/nanosat/data/zeus',
20 startDate=date,
21 endDate=date,
22 startTime='00:00:00',
23 endTime='23:59:59',
13 readUnitConfObj = controllerObj.addReadUnit(datatype='SpectraReader',
14 path='/home/nanosat/data/julia',
15 startDate=dt,
16 endDate=dt,
17 startTime="00:00:00",
18 endTime="23:59:59",
24 19 online=0,
20 #set=1426485881,
21 delay=10,
25 22 walk=1,
26 expLabel='')
27
28 procUnitConfObj1 = controllerObj.addProcUnit(datatype='Spectra', inputId=readUnitConfObj.getId())
29 #opObj11 = procUnitConfObj1.addOperation(name='removeDC')
30 #opObj11.addParameter(name='mode', value='1', format='int')
31
32 #opObj11 = procUnitConfObj1.addOperation(name='removeInterference')
33
34
35 opObj11 = procUnitConfObj1.addOperation(name='RTIPlot', optype='other')
36 opObj11.addParameter(name='id', value='10', format='int')
37 opObj11.addParameter(name='wintitle', value='150Km', format='str')
38 opObj11.addParameter(name='colormap', value='jro', format='str')
39 opObj11.addParameter(name='xaxis', value='time', format='str')
40 opObj11.addParameter(name='xmin', value='0', format='int')
41 opObj11.addParameter(name='xmax', value='23', format='int')
42 #opObj11.addParameter(name='ymin', value='100', format='int')
43 #opObj11.addParameter(name='ymax', value='150', format='int')
44 opObj11.addParameter(name='zmin', value='10', format='int')
45 opObj11.addParameter(name='zmax', value='35', format='int')
46
47
48
49
50 opObject12 = procUnitConfObj1.addOperation(name='PlotRTIData', optype='other')
51 opObject12.addParameter(name='id', value='12', format='int')
52 opObject12.addParameter(name='wintitle', value='150Km', format='str')
53 opObject12.addParameter(name='colormap', value='jro', format='str')
54 opObject12.addParameter(name='xaxis', value='time', format='str')
55 opObject12.addParameter(name='xmin', value='0', format='int')
56 opObject12.addParameter(name='xmax', value='23', format='int')
57 #opObject12.addParameter(name='ymin', value='100', format='int')
58 #opObject12.addParameter(name='ymax', value='150', format='int')
59 opObject12.addParameter(name='zmin', value='10', format='int')
60 opObject12.addParameter(name='zmax', value='35', format='int')
61 #opObject12.addParameter(name='pause', value='1', format='bool')
62 opObject12.addParameter(name='show', value='0', format='bool')
63 opObject12.addParameter(name='save', value='/tmp', format='str')
64
23 queue=q,
24 cursor=cursor,
25 skip=skip,
26 #timezone=-5*3600
27 )
28
29 # #opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock')
30 #
31 procUnitConfObj2 = controllerObj.addProcUnit(datatype='Spectra', inputId=readUnitConfObj.getId())
32 # procUnitConfObj2.addParameter(name='nipp', value='5', format='int')
33
34 # procUnitConfObj3 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=readUnitConfObj.getId())
35 # opObj11 = procUnitConfObj3.addOperation(name='SpectralMoments', optype='other')
36
37 #
38 # opObj11 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='other')
39 # opObj11.addParameter(name='id', value='1000', format='int')
40 # opObj11.addParameter(name='wintitle', value='HF_Jicamarca_Spc', format='str')
41 # opObj11.addParameter(name='channelList', value='0', format='intlist')
42 # opObj11.addParameter(name='zmin', value='-120', format='float')
43 # opObj11.addParameter(name='zmax', value='-70', format='float')
44 # opObj11.addParameter(name='save', value='1', format='int')
45 # opObj11.addParameter(name='figpath', value=figpath, format='str')
46
47 # opObj11 = procUnitConfObj3.addOperation(name='Parameters1Plot', optype='other')
48 # opObj11.addParameter(name='channelList', value='0', format='intList')
49 #
50 # opObj11.addParameter(name='id', value='2000', format='int')
51 # # opObj11.addParameter(name='colormap', value='0', format='bool')
52 # opObj11.addParameter(name='onlySNR', value='1', format='bool')
53 # opObj11.addParameter(name='DOP', value='0', format='bool')
54 # opObj11.addParameter(name='showSNR', value='1', format='bool')
55 # opObj11.addParameter(name='SNRthresh', value='0', format='int')
56 # opObj11.addParameter(name='SNRmin', value='-10', format='int')
57 # opObj11.addParameter(name='SNRmax', value='30', format='int')
58
59 # opObj11.addParameter(name='showSNR', value='1', format='int')
60 # # opObj11.addParameter(name='channelList', value='0', format='intlist')
61 # # opObj11.addParameter(name='xmin', value='0', format='float')
62 # opObj11.addParameter(name='xmin', value='0', format='float')
63 # opObj11.addParameter(name='xmax', value='24', format='float')
64
65 # opObj11.addParameter(name='zmin', value='-110', format='float')
66 # opObj11.addParameter(name='zmax', value='-70', format='float')
67 # opObj11.addParameter(name='save', value='0', format='int')
68 # # opObj11.addParameter(name='figpath', value='/tmp/', format='str')
69 #
70 opObj12 = procUnitConfObj2.addOperation(name='PublishData', optype='other')
71 opObj12.addParameter(name='zeromq', value=1, format='int')
72 # opObj12.addParameter(name='server', value='tcp://10.10.10.82:7000', format='str')
73
74
75 # opObj13 = procUnitConfObj3.addOperation(name='PublishData', optype='other')
76 # opObj13.addParameter(name='zeromq', value=1, format='int')
77 # opObj13.addParameter(name='server', value="juanca", format='str')
78
79 # opObj12.addParameter(name='delay', value=1, format='int')
80
81
82 # print "Escribiendo el archivo XML"
83 # controllerObj.writeXml(filename)
84 # print "Leyendo el archivo XML"
85 # controllerObj.readXml(filename)
86
87
88 # timeit.timeit('controllerObj.run()', number=2)
65 89
66 90 controllerObj.start()
67 91
68 if __name__=='__main__':
69 92
70 dt = datetime(2017, 1, 12)
71
72 dates = [(dt+timedelta(x)).strftime('%Y/%m/%d') for x in range(20)]
73
74 p = multiprocessing.Pool(4)
75 p.map(main, dates)
93 if __name__ == '__main__':
94 parser = argparse.ArgumentParser(description='Set number of parallel processes')
95 parser.add_argument('--nProcess', default=1, type=int)
96 args = parser.parse_args()
97 multiSchain(fiber, nProcess=args.nProcess, startDate='2016/08/19', endDate='2016/08/19')
@@ -1,58 +1,58
1 1 #!/usr/bin/env python
2 2 '''
3 3 Created on Jul 7, 2014
4 4
5 5 @author: roj-idl71
6 6 '''
7 7 import os, sys
8 8
9 9 from schainpy.controller import Project
10 10
11 11 if __name__ == '__main__':
12 12 desc = "Segundo Test"
13 13
14 14 controllerObj = Project()
15 15 controllerObj.setup(id='191', name='test01', description=desc)
16 16
17 17 proc1 = controllerObj.addProcUnit(name='ReceiverData')
18 18 proc1.addParameter(name='realtime', value='0', format='bool')
19 proc1.addParameter(name='plottypes', value='rti,coh,phase,snr,dop', format='str')
19 proc1.addParameter(name='plottypes', value='rti,coh,phase', format='str')
20 20 proc1.addParameter(name='throttle', value='10', format='int')
21 proc1.addParameter(name='plot_server', value='tcp://10.10.10.82:7000', format='str')
21 # proc1.addParameter(name='server', value='tcp://10.10.10.82:7000', format='str')
22 22 ## TODO Agregar direccion de server de publicacion a graficos como variable
23 23
24 24 op1 = proc1.addOperation(name='PlotRTIData', optype='other')
25 25 op1.addParameter(name='wintitle', value='Julia 150Km', format='str')
26 26 op1.addParameter(name='save', value='/home/nanosat/Pictures', format='str')
27 27 op1.addParameter(name='show', value='0', format='bool')
28 28 op1.addParameter(name='colormap', value='jet', format='str')
29 29 #
30 30 op2 = proc1.addOperation(name='PlotCOHData', optype='other')
31 31 op2.addParameter(name='wintitle', value='Julia 150Km', format='str')
32 32 op2.addParameter(name='save', value='/home/nanosat/Pictures', format='str')
33 33 op2.addParameter(name='colormap', value='jet', format='str')
34 34 op2.addParameter(name='show', value='0', format='bool')
35 # #
35 # # #
36 36 op6 = proc1.addOperation(name='PlotPHASEData', optype='other')
37 37 op6.addParameter(name='wintitle', value='Julia 150Km', format='str')
38 38 op6.addParameter(name='save', value='/home/nanosat/Pictures', format='str')
39 39 op6.addParameter(name='show', value='1', format='bool')
40 #
41 # proc2 = controllerObj.addProcUnit(name='ReceiverData')
42 # proc2.addParameter(name='server', value='juanca', format='str')
43 # proc2.addParameter(name='plottypes', value='snr,dop', format='str')
44 #
45 op3 = proc1.addOperation(name='PlotSNRData', optype='other')
46 op3.addParameter(name='wintitle', value='Julia 150Km', format='str')
47 op3.addParameter(name='save', value='/home/nanosat/Pictures', format='str')
48 op3.addParameter(name='show', value='0', format='bool')
49 #
50 op4 = proc1.addOperation(name='PlotDOPData', optype='other')
51 op4.addParameter(name='wintitle', value='Julia 150Km', format='str')
52 op4.addParameter(name='save', value='/home/nanosat/Pictures', format='str')
53 op4.addParameter(name='show', value='0', format='bool')
54 op4.addParameter(name='colormap', value='jet', format='str')
40 # #
41 # # proc2 = controllerObj.addProcUnit(name='ReceiverData')
42 # # proc2.addParameter(name='server', value='juanca', format='str')
43 # # proc2.addParameter(name='plottypes', value='snr,dop', format='str')
44 # #
45 # op3 = proc1.addOperation(name='PlotSNRData', optype='other')
46 # op3.addParameter(name='wintitle', value='Julia 150Km', format='str')
47 # op3.addParameter(name='save', value='/home/nanosat/Pictures', format='str')
48 # op3.addParameter(name='show', value='0', format='bool')
49 # #
50 # op4 = proc1.addOperation(name='PlotDOPData', optype='other')
51 # op4.addParameter(name='wintitle', value='Julia 150Km', format='str')
52 # op4.addParameter(name='save', value='/home/nanosat/Pictures', format='str')
53 # op4.addParameter(name='show', value='0', format='bool')
54 # op4.addParameter(name='colormap', value='jet', format='str')
55 55
56 56
57 57
58 58 controllerObj.start()
@@ -1,1 +1,1
1 <Project description="HF_EXAMPLE" id="191" name="test01"><ReadUnit datatype="SpectraReader" id="1911" inputId="0" name="SpectraReader"><Operation id="19111" name="run" priority="1" type="self"><Parameter format="str" id="191111" name="datatype" value="SpectraReader" /><Parameter format="str" id="191112" name="path" value="/home/nanosat/data/julia" /><Parameter format="date" id="191113" name="startDate" value="2015/09/26" /><Parameter format="date" id="191114" name="endDate" value="2015/09/26" /><Parameter format="time" id="191115" name="startTime" value="00:00:00" /><Parameter format="time" id="191116" name="endTime" value="23:59:59" /><Parameter format="int" id="191118" name="cursor" value="0" /><Parameter format="int" id="191119" name="skip" value="0" /><Parameter format="int" id="191120" name="delay" value="10" /><Parameter format="int" id="191121" name="walk" value="1" /><Parameter format="int" id="191122" name="online" value="0" /></Operation></ReadUnit><ProcUnit datatype="ParametersProc" id="1913" inputId="1911" name="ParametersProc"><Operation id="19131" name="run" priority="1" type="self" /><Operation id="19132" name="SpectralMoments" priority="2" type="other" /><Operation id="19133" name="Parameters1Plot" priority="3" type="other"><Parameter format="intlist" id="191331" name="channelList" value="0" /><Parameter format="int" id="191332" name="id" value="2000" /><Parameter format="bool" id="191333" name="onlySNR" value="1" /><Parameter format="bool" id="191334" name="DOP" value="0" /></Operation><Operation id="19134" name="PublishData" priority="4" type="other"><Parameter format="int" id="191341" name="zeromq" value="1" /><Parameter format="int" id="191342" name="delay" value="1" /></Operation></ProcUnit><ProcUnit datatype="Spectra" id="1912" inputId="1911" name="SpectraProc"><Operation id="19121" name="run" priority="1" type="self" /></ProcUnit></Project> No newline at end of file
1 <Project description="HF_EXAMPLE" id="191" name="test01"><ReadUnit datatype="SpectraReader" id="1911" inputId="0" name="SpectraReader"><Operation id="19111" name="run" priority="1" type="self"><Parameter format="str" id="191111" name="datatype" value="SpectraReader" /><Parameter format="str" id="191112" name="path" value="/home/nanosat/data/sp1_f0" /><Parameter format="date" id="191113" name="startDate" value="2017/01/28" /><Parameter format="date" id="191114" name="endDate" value="2017/01/28" /><Parameter format="time" id="191115" name="startTime" value="00:00:00" /><Parameter format="time" id="191116" name="endTime" value="23:59:59" /><Parameter format="int" id="191118" name="cursor" value="28" /><Parameter format="int" id="191119" name="skip" value="22" /><Parameter format="int" id="191120" name="walk" value="1" /><Parameter format="int" id="191121" name="verbose" value="1" /><Parameter format="int" id="191122" name="online" value="0" /></Operation></ReadUnit><ProcUnit datatype="ParametersProc" id="1913" inputId="1911" name="ParametersProc"><Operation id="19131" name="run" priority="1" type="self" /><Operation id="19132" name="SpectralMoments" priority="2" type="other" /><Operation id="19133" name="PublishData" priority="3" type="other"><Parameter format="int" id="191331" name="zeromq" value="1" /><Parameter format="bool" id="191332" name="verbose" value="0" /><Parameter format="int" id="191333" name="delay" value="0" /></Operation></ProcUnit><ProcUnit datatype="Spectra" id="1912" inputId="1911" name="SpectraProc"><Operation id="19121" name="run" priority="1" type="self" /></ProcUnit></Project> No newline at end of file
@@ -1,48 +1,49
1 1 '''
2 2 Created on Jul 16, 2014
3 3
4 4 @author: Miguel Urco
5 5 '''
6 6
7 7 from schainpy import __version__
8 8 from setuptools import setup, Extension
9 9
10 10 setup(name="schainpy",
11 11 version=__version__,
12 12 description="Python tools to read, write and process Jicamarca data",
13 13 author="Miguel Urco",
14 14 author_email="miguel.urco@jro.igp.gob.pe",
15 15 url="http://jro.igp.gob.pe",
16 16 packages = {'schainpy',
17 17 'schainpy.model',
18 18 'schainpy.model.data',
19 19 'schainpy.model.graphics',
20 20 'schainpy.model.io',
21 21 'schainpy.model.proc',
22 22 'schainpy.model.serializer',
23 23 'schainpy.model.utils',
24 24 'schainpy.gui',
25 25 'schainpy.gui.figures',
26 26 'schainpy.gui.viewcontroller',
27 27 'schainpy.gui.viewer',
28 28 'schainpy.gui.viewer.windows'},
29 29 ext_package='schainpy',
30 30 py_modules=[''],
31 31 package_data={'': ['schain.conf.template'],
32 32 'schainpy.gui.figures': ['*.png','*.jpg'],
33 33 },
34 34 include_package_data=False,
35 35 scripts =['schainpy/gui/schainGUI',
36 36 'schainpy/scripts/schain'],
37 37 ext_modules=[Extension("cSchain", ["schainpy/model/proc/extensions.c"])],
38 38 install_requires=[
39 39 "scipy >= 0.14.0",
40 40 "h5py >= 2.2.1",
41 41 "matplotlib >= 1.4.2",
42 42 "pyfits >= 3.4",
43 43 "numpy >= 1.11.2",
44 44 "paramiko >= 2.1.2",
45 45 "paho-mqtt >= 1.2",
46 46 "zmq",
47 "fuzzywuzzy"
47 48 ],
48 49 )
General Comments 0
You need to be logged in to leave comments. Login now