##// END OF EJS Templates
controller.py: minor changes
Miguel Valdez -
r702:67a28cffb323
parent child
Show More
@@ -1,1252 +1,1263
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 schainpy
11 11 import schainpy.admin
12 12
13 13 from xml.etree.ElementTree import ElementTree, Element, SubElement, tostring
14 14 from xml.dom import minidom
15 15
16 16 from schainpy.model import *
17 17 from time import sleep
18 18
19 19 def prettify(elem):
20 20 """Return a pretty-printed XML string for the Element.
21 21 """
22 22 rough_string = tostring(elem, 'utf-8')
23 23 reparsed = minidom.parseString(rough_string)
24 24 return reparsed.toprettyxml(indent=" ")
25 25
26 26 class ParameterConf():
27 27
28 28 id = None
29 29 name = None
30 30 value = None
31 31 format = None
32 32
33 33 __formated_value = None
34 34
35 35 ELEMENTNAME = 'Parameter'
36 36
37 37 def __init__(self):
38 38
39 39 self.format = 'str'
40 40
41 41 def getElementName(self):
42 42
43 43 return self.ELEMENTNAME
44 44
45 45 def getValue(self):
46 46
47 47 value = self.value
48 48 format = self.format
49 49
50 50 if self.__formated_value != None:
51 51
52 52 return self.__formated_value
53 53
54 54 if format == 'str':
55 55 self.__formated_value = str(value)
56 56 return self.__formated_value
57 57
58 58 if value == '':
59 59 raise ValueError, "%s: This parameter value is empty" %self.name
60 60
61 61 if format == 'list':
62 62 strList = value.split(',')
63 63
64 64 self.__formated_value = strList
65 65
66 66 return self.__formated_value
67 67
68 68 if format == 'intlist':
69 69 """
70 70 Example:
71 71 value = (0,1,2)
72 72 """
73 73 value = value.replace('(', '')
74 74 value = value.replace(')', '')
75 75
76 76 value = value.replace('[', '')
77 77 value = value.replace(']', '')
78 78
79 79 strList = value.split(',')
80 80 intList = [int(float(x)) for x in strList]
81 81
82 82 self.__formated_value = intList
83 83
84 84 return self.__formated_value
85 85
86 86 if format == 'floatlist':
87 87 """
88 88 Example:
89 89 value = (0.5, 1.4, 2.7)
90 90 """
91 91
92 92 value = value.replace('(', '')
93 93 value = value.replace(')', '')
94 94
95 95 value = value.replace('[', '')
96 96 value = value.replace(']', '')
97 97
98 98 strList = value.split(',')
99 99 floatList = [float(x) for x in strList]
100 100
101 101 self.__formated_value = floatList
102 102
103 103 return self.__formated_value
104 104
105 105 if format == 'date':
106 106 strList = value.split('/')
107 107 intList = [int(x) for x in strList]
108 108 date = datetime.date(intList[0], intList[1], intList[2])
109 109
110 110 self.__formated_value = date
111 111
112 112 return self.__formated_value
113 113
114 114 if format == 'time':
115 115 strList = value.split(':')
116 116 intList = [int(x) for x in strList]
117 117 time = datetime.time(intList[0], intList[1], intList[2])
118 118
119 119 self.__formated_value = time
120 120
121 121 return self.__formated_value
122 122
123 123 if format == 'pairslist':
124 124 """
125 125 Example:
126 126 value = (0,1),(1,2)
127 127 """
128 128
129 129 value = value.replace('(', '')
130 130 value = value.replace(')', '')
131 131
132 132 value = value.replace('[', '')
133 133 value = value.replace(']', '')
134 134
135 135 strList = value.split(',')
136 136 intList = [int(item) for item in strList]
137 137 pairList = []
138 138 for i in range(len(intList)/2):
139 139 pairList.append((intList[i*2], intList[i*2 + 1]))
140 140
141 141 self.__formated_value = pairList
142 142
143 143 return self.__formated_value
144 144
145 145 if format == 'multilist':
146 146 """
147 147 Example:
148 148 value = (0,1,2),(3,4,5)
149 149 """
150 150 multiList = ast.literal_eval(value)
151 151
152 152 if type(multiList[0]) == int:
153 153 multiList = ast.literal_eval("(" + value + ")")
154 154
155 155 self.__formated_value = multiList
156 156
157 157 return self.__formated_value
158 158
159 159 if format == 'bool':
160 160 value = int(value)
161 161
162 162 if format == 'int':
163 163 value = float(value)
164 164
165 165 format_func = eval(format)
166 166
167 167 self.__formated_value = format_func(value)
168 168
169 169 return self.__formated_value
170 170
171 171 def updateId(self, new_id):
172 172
173 173 self.id = str(new_id)
174 174
175 175 def setup(self, id, name, value, format='str'):
176 176
177 177 self.id = str(id)
178 178 self.name = name
179 179 self.value = str(value)
180 180 self.format = str.lower(format)
181 181
182 182 try:
183 183 self.getValue()
184 184 except:
185 185 return 0
186 186
187 187 return 1
188 188
189 189 def update(self, name, value, format='str'):
190 190
191 191 self.name = name
192 192 self.value = str(value)
193 193 self.format = format
194 194
195 195 def makeXml(self, opElement):
196 196
197 197 parmElement = SubElement(opElement, self.ELEMENTNAME)
198 198 parmElement.set('id', str(self.id))
199 199 parmElement.set('name', self.name)
200 200 parmElement.set('value', self.value)
201 201 parmElement.set('format', self.format)
202 202
203 203 def readXml(self, parmElement):
204 204
205 205 self.id = parmElement.get('id')
206 206 self.name = parmElement.get('name')
207 207 self.value = parmElement.get('value')
208 208 self.format = str.lower(parmElement.get('format'))
209 209
210 210 #Compatible with old signal chain version
211 211 if self.format == 'int' and self.name == 'idfigure':
212 212 self.name = 'id'
213 213
214 214 def printattr(self):
215 215
216 216 print "Parameter[%s]: name = %s, value = %s, format = %s" %(self.id, self.name, self.value, self.format)
217 217
218 218 class OperationConf():
219 219
220 220 id = None
221 221 name = None
222 222 priority = None
223 223 type = None
224 224
225 225 parmConfObjList = []
226 226
227 227 ELEMENTNAME = 'Operation'
228 228
229 229 def __init__(self):
230 230
231 231 self.id = '0'
232 232 self.name = None
233 233 self.priority = None
234 234 self.type = 'self'
235 235
236 236
237 237 def __getNewId(self):
238 238
239 239 return int(self.id)*10 + len(self.parmConfObjList) + 1
240 240
241 241 def updateId(self, new_id):
242 242
243 243 self.id = str(new_id)
244 244
245 245 n = 1
246 246 for parmObj in self.parmConfObjList:
247 247
248 248 idParm = str(int(new_id)*10 + n)
249 249 parmObj.updateId(idParm)
250 250
251 251 n += 1
252 252
253 253 def getElementName(self):
254 254
255 255 return self.ELEMENTNAME
256 256
257 257 def getParameterObjList(self):
258 258
259 259 return self.parmConfObjList
260 260
261 261 def getParameterObj(self, parameterName):
262 262
263 263 for parmConfObj in self.parmConfObjList:
264 264
265 265 if parmConfObj.name != parameterName:
266 266 continue
267 267
268 268 return parmConfObj
269 269
270 270 return None
271 271
272 272 def getParameterObjfromValue(self, parameterValue):
273 273
274 274 for parmConfObj in self.parmConfObjList:
275 275
276 276 if parmConfObj.getValue() != parameterValue:
277 277 continue
278 278
279 279 return parmConfObj.getValue()
280 280
281 281 return None
282 282
283 283 def getParameterValue(self, parameterName):
284 284
285 285 parameterObj = self.getParameterObj(parameterName)
286 286
287 287 # if not parameterObj:
288 288 # return None
289 289
290 290 value = parameterObj.getValue()
291 291
292 292 return value
293 293
294 294 def setup(self, id, name, priority, type):
295 295
296 296 self.id = str(id)
297 297 self.name = name
298 298 self.type = type
299 299 self.priority = priority
300 300
301 301 self.parmConfObjList = []
302 302
303 303 def removeParameters(self):
304 304
305 305 for obj in self.parmConfObjList:
306 306 del obj
307 307
308 308 self.parmConfObjList = []
309 309
310 310 def addParameter(self, name, value, format='str'):
311 311
312 312 id = self.__getNewId()
313 313
314 314 parmConfObj = ParameterConf()
315 315 if not parmConfObj.setup(id, name, value, format):
316 316 return None
317 317
318 318 self.parmConfObjList.append(parmConfObj)
319 319
320 320 return parmConfObj
321 321
322 322 def changeParameter(self, name, value, format='str'):
323 323
324 324 parmConfObj = self.getParameterObj(name)
325 325 parmConfObj.update(name, value, format)
326 326
327 327 return parmConfObj
328 328
329 329 def makeXml(self, procUnitElement):
330 330
331 331 opElement = SubElement(procUnitElement, self.ELEMENTNAME)
332 332 opElement.set('id', str(self.id))
333 333 opElement.set('name', self.name)
334 334 opElement.set('type', self.type)
335 335 opElement.set('priority', str(self.priority))
336 336
337 337 for parmConfObj in self.parmConfObjList:
338 338 parmConfObj.makeXml(opElement)
339 339
340 340 def readXml(self, opElement):
341 341
342 342 self.id = opElement.get('id')
343 343 self.name = opElement.get('name')
344 344 self.type = opElement.get('type')
345 345 self.priority = opElement.get('priority')
346 346
347 347 #Compatible with old signal chain version
348 348 #Use of 'run' method instead 'init'
349 349 if self.type == 'self' and self.name == 'init':
350 350 self.name = 'run'
351 351
352 352 self.parmConfObjList = []
353 353
354 354 parmElementList = opElement.getiterator(ParameterConf().getElementName())
355 355
356 356 for parmElement in parmElementList:
357 357 parmConfObj = ParameterConf()
358 358 parmConfObj.readXml(parmElement)
359 359
360 360 #Compatible with old signal chain version
361 361 #If an 'plot' OPERATION is found, changes name operation by the value of its type PARAMETER
362 362 if self.type != 'self' and self.name == 'Plot':
363 363 if parmConfObj.format == 'str' and parmConfObj.name == 'type':
364 364 self.name = parmConfObj.value
365 365 continue
366 366
367 367 self.parmConfObjList.append(parmConfObj)
368 368
369 369 def printattr(self):
370 370
371 371 print "%s[%s]: name = %s, type = %s, priority = %s" %(self.ELEMENTNAME,
372 372 self.id,
373 373 self.name,
374 374 self.type,
375 375 self.priority)
376 376
377 377 for parmConfObj in self.parmConfObjList:
378 378 parmConfObj.printattr()
379 379
380 380 def createObject(self, plotter_queue=None):
381 381
382 382 if self.type == 'self':
383 383 raise ValueError, "This operation type cannot be created"
384 384
385 385 if self.type == 'plotter':
386 386 #Plotter(plotter_name)
387 387 opObj = Plotter(self.name, plotter_queue)
388 388
389 389 if self.type == 'external' or self.type == 'other':
390 390 className = eval(self.name)
391 391 opObj = className()
392 392
393 393 return opObj
394 394
395 395 class ProcUnitConf():
396 396
397 397 id = None
398 398 name = None
399 399 datatype = None
400 400 inputId = None
401 401 parentId = None
402 402
403 403 opConfObjList = []
404 404
405 405 procUnitObj = None
406 406 opObjList = []
407 407
408 408 ELEMENTNAME = 'ProcUnit'
409 409
410 410 def __init__(self):
411 411
412 412 self.id = None
413 413 self.datatype = None
414 414 self.name = None
415 415 self.inputId = None
416 416
417 417 self.opConfObjList = []
418 418
419 419 self.procUnitObj = None
420 420 self.opObjDict = {}
421 421
422 422 def __getPriority(self):
423 423
424 424 return len(self.opConfObjList)+1
425 425
426 426 def __getNewId(self):
427 427
428 428 return int(self.id)*10 + len(self.opConfObjList) + 1
429 429
430 430 def getElementName(self):
431 431
432 432 return self.ELEMENTNAME
433 433
434 434 def getId(self):
435 435
436 436 return self.id
437 437
438 438 def updateId(self, new_id, parentId=parentId):
439 439
440 440
441 441 new_id = int(parentId)*10 + (int(self.id) % 10)
442 442 new_inputId = int(parentId)*10 + (int(self.inputId) % 10)
443 443
444 444 #If this proc unit has not inputs
445 445 if self.inputId == '0':
446 446 new_inputId = 0
447 447
448 448 n = 1
449 449 for opConfObj in self.opConfObjList:
450 450
451 451 idOp = str(int(new_id)*10 + n)
452 452 opConfObj.updateId(idOp)
453 453
454 454 n += 1
455 455
456 456 self.parentId = str(parentId)
457 457 self.id = str(new_id)
458 458 self.inputId = str(new_inputId)
459 459
460 460
461 461 def getInputId(self):
462 462
463 463 return self.inputId
464 464
465 465 def getOperationObjList(self):
466 466
467 467 return self.opConfObjList
468 468
469 469 def getOperationObj(self, name=None):
470 470
471 471 for opConfObj in self.opConfObjList:
472 472
473 473 if opConfObj.name != name:
474 474 continue
475 475
476 476 return opConfObj
477 477
478 478 return None
479 479
480 480 def getOpObjfromParamValue(self, value=None):
481 481
482 482 for opConfObj in self.opConfObjList:
483 483 if opConfObj.getParameterObjfromValue(parameterValue=value) != value:
484 484 continue
485 485 return opConfObj
486 486 return None
487 487
488 488 def getProcUnitObj(self):
489 489
490 490 return self.procUnitObj
491 491
492 492 def setup(self, id, name, datatype, inputId, parentId=None):
493 493
494 494 #Compatible with old signal chain version
495 495 if datatype==None and name==None:
496 496 raise ValueError, "datatype or name should be defined"
497 497
498 498 if name==None:
499 499 if 'Proc' in datatype:
500 500 name = datatype
501 501 else:
502 502 name = '%sProc' %(datatype)
503 503
504 504 if datatype==None:
505 505 datatype = name.replace('Proc','')
506 506
507 507 self.id = str(id)
508 508 self.name = name
509 509 self.datatype = datatype
510 510 self.inputId = inputId
511 511 self.parentId = parentId
512 512
513 513 self.opConfObjList = []
514 514
515 515 self.addOperation(name='run', optype='self')
516 516
517 517 def removeOperations(self):
518 518
519 519 for obj in self.opConfObjList:
520 520 del obj
521 521
522 522 self.opConfObjList = []
523 523 self.addOperation(name='run')
524 524
525 525 def addParameter(self, **kwargs):
526 526 '''
527 527 Add parameters to "run" operation
528 528 '''
529 529 opObj = self.opConfObjList[0]
530 530
531 531 opObj.addParameter(**kwargs)
532 532
533 533 return opObj
534 534
535 535 def addOperation(self, name, optype='self'):
536 536
537 537 id = self.__getNewId()
538 538 priority = self.__getPriority()
539 539
540 540 opConfObj = OperationConf()
541 541 opConfObj.setup(id, name=name, priority=priority, type=optype)
542 542
543 543 self.opConfObjList.append(opConfObj)
544 544
545 545 return opConfObj
546 546
547 547 def makeXml(self, projectElement):
548 548
549 549 procUnitElement = SubElement(projectElement, self.ELEMENTNAME)
550 550 procUnitElement.set('id', str(self.id))
551 551 procUnitElement.set('name', self.name)
552 552 procUnitElement.set('datatype', self.datatype)
553 553 procUnitElement.set('inputId', str(self.inputId))
554 554
555 555 for opConfObj in self.opConfObjList:
556 556 opConfObj.makeXml(procUnitElement)
557 557
558 558 def readXml(self, upElement):
559 559
560 560 self.id = upElement.get('id')
561 561 self.name = upElement.get('name')
562 562 self.datatype = upElement.get('datatype')
563 563 self.inputId = upElement.get('inputId')
564 564
565 565 if self.ELEMENTNAME == "ReadUnit":
566 566 self.datatype = self.datatype.replace("Reader", "")
567 567
568 568 if self.ELEMENTNAME == "ProcUnit":
569 569 self.datatype = self.datatype.replace("Proc", "")
570 570
571 571 if self.inputId == 'None':
572 572 self.inputId = '0'
573 573
574 574 self.opConfObjList = []
575 575
576 576 opElementList = upElement.getiterator(OperationConf().getElementName())
577 577
578 578 for opElement in opElementList:
579 579 opConfObj = OperationConf()
580 580 opConfObj.readXml(opElement)
581 581 self.opConfObjList.append(opConfObj)
582 582
583 583 def printattr(self):
584 584
585 585 print "%s[%s]: name = %s, datatype = %s, inputId = %s" %(self.ELEMENTNAME,
586 586 self.id,
587 587 self.name,
588 588 self.datatype,
589 589 self.inputId)
590 590
591 591 for opConfObj in self.opConfObjList:
592 592 opConfObj.printattr()
593 593
594 594 def createObjects(self, plotter_queue=None):
595 595
596 596 className = eval(self.name)
597 597 procUnitObj = className()
598 598
599 599 for opConfObj in self.opConfObjList:
600 600
601 601 if opConfObj.type == 'self':
602 602 continue
603 603
604 604 opObj = opConfObj.createObject(plotter_queue)
605 605
606 606 self.opObjDict[opConfObj.id] = opObj
607 607 procUnitObj.addOperation(opObj, opConfObj.id)
608 608
609 609 self.procUnitObj = procUnitObj
610 610
611 611 return procUnitObj
612 612
613 613 def run(self):
614 614
615 615 is_ok = False
616 616
617 617 for opConfObj in self.opConfObjList:
618 618
619 619 kwargs = {}
620 620 for parmConfObj in opConfObj.getParameterObjList():
621 621 if opConfObj.name == 'run' and parmConfObj.name == 'datatype':
622 622 continue
623 623
624 624 kwargs[parmConfObj.name] = parmConfObj.getValue()
625 625
626 626 #print "\tRunning the '%s' operation with %s" %(opConfObj.name, opConfObj.id)
627 627 sts = self.procUnitObj.call(opType = opConfObj.type,
628 628 opName = opConfObj.name,
629 629 opId = opConfObj.id,
630 630 **kwargs)
631 631 is_ok = is_ok or sts
632 632
633 633 return is_ok
634 634
635 635 def close(self):
636 636
637 637 for opConfObj in self.opConfObjList:
638 638 if opConfObj.type == 'self':
639 639 continue
640 640
641 641 opObj = self.procUnitObj.getOperationObj(opConfObj.id)
642 642 opObj.close()
643 643
644 644 self.procUnitObj.close()
645 645
646 646 return
647 647
648 648 class ReadUnitConf(ProcUnitConf):
649 649
650 650 path = None
651 651 startDate = None
652 652 endDate = None
653 653 startTime = None
654 654 endTime = None
655 655
656 656 ELEMENTNAME = 'ReadUnit'
657 657
658 658 def __init__(self):
659 659
660 660 self.id = None
661 661 self.datatype = None
662 662 self.name = None
663 663 self.inputId = None
664 664
665 665 self.parentId = None
666 666
667 667 self.opConfObjList = []
668 668 self.opObjList = []
669 669
670 670 def getElementName(self):
671 671
672 672 return self.ELEMENTNAME
673 673
674 674 def setup(self, id, name, datatype, path, startDate="", endDate="", startTime="", endTime="", parentId=None, **kwargs):
675 675
676 676 #Compatible with old signal chain version
677 677 if datatype==None and name==None:
678 678 raise ValueError, "datatype or name should be defined"
679 679
680 680 if name==None:
681 681 if 'Reader' in datatype:
682 682 name = datatype
683 683 else:
684 684 name = '%sReader' %(datatype)
685 685
686 686 if datatype==None:
687 687 datatype = name.replace('Reader','')
688 688
689 689 self.id = id
690 690 self.name = name
691 691 self.datatype = datatype
692 692
693 693 self.path = os.path.abspath(path)
694 694 self.startDate = startDate
695 695 self.endDate = endDate
696 696 self.startTime = startTime
697 697 self.endTime = endTime
698 698
699 699 self.inputId = '0'
700 700 self.parentId = parentId
701 701
702 702 self.addRunOperation(**kwargs)
703 703
704 704 def update(self, datatype, path, startDate, endDate, startTime, endTime, parentId=None, name=None, **kwargs):
705 705
706 706 #Compatible with old signal chain version
707 707 if datatype==None and name==None:
708 708 raise ValueError, "datatype or name should be defined"
709 709
710 710 if name==None:
711 711 if 'Reader' in datatype:
712 712 name = datatype
713 713 else:
714 714 name = '%sReader' %(datatype)
715 715
716 716 if datatype==None:
717 717 datatype = name.replace('Reader','')
718 718
719 719 self.datatype = datatype
720 720 self.name = name
721 721 self.path = path
722 722 self.startDate = startDate
723 723 self.endDate = endDate
724 724 self.startTime = startTime
725 725 self.endTime = endTime
726 726
727 727 self.inputId = '0'
728 728 self.parentId = parentId
729 729
730 730 self.updateRunOperation(**kwargs)
731 731
732 732 def removeOperations(self):
733 733
734 734 for obj in self.opConfObjList:
735 735 del obj
736 736
737 737 self.opConfObjList = []
738 738
739 739 def addRunOperation(self, **kwargs):
740 740
741 741 opObj = self.addOperation(name = 'run', optype = 'self')
742 742
743 743 opObj.addParameter(name='datatype' , value=self.datatype, format='str')
744 744 opObj.addParameter(name='path' , value=self.path, format='str')
745 745 opObj.addParameter(name='startDate' , value=self.startDate, format='date')
746 746 opObj.addParameter(name='endDate' , value=self.endDate, format='date')
747 747 opObj.addParameter(name='startTime' , value=self.startTime, format='time')
748 748 opObj.addParameter(name='endTime' , value=self.endTime, format='time')
749 749
750 750 for key, value in kwargs.items():
751 751 opObj.addParameter(name=key, value=value, format=type(value).__name__)
752 752
753 753 return opObj
754 754
755 755 def updateRunOperation(self, **kwargs):
756 756
757 757 opObj = self.getOperationObj(name = 'run')
758 758 opObj.removeParameters()
759 759
760 760 opObj.addParameter(name='datatype' , value=self.datatype, format='str')
761 761 opObj.addParameter(name='path' , value=self.path, format='str')
762 762 opObj.addParameter(name='startDate' , value=self.startDate, format='date')
763 763 opObj.addParameter(name='endDate' , value=self.endDate, format='date')
764 764 opObj.addParameter(name='startTime' , value=self.startTime, format='time')
765 765 opObj.addParameter(name='endTime' , value=self.endTime, format='time')
766 766
767 767 for key, value in kwargs.items():
768 768 opObj.addParameter(name=key, value=value, format=type(value).__name__)
769 769
770 770 return opObj
771 771
772 772 # def makeXml(self, projectElement):
773 773 #
774 774 # procUnitElement = SubElement(projectElement, self.ELEMENTNAME)
775 775 # procUnitElement.set('id', str(self.id))
776 776 # procUnitElement.set('name', self.name)
777 777 # procUnitElement.set('datatype', self.datatype)
778 778 # procUnitElement.set('inputId', str(self.inputId))
779 779 #
780 780 # for opConfObj in self.opConfObjList:
781 781 # opConfObj.makeXml(procUnitElement)
782 782
783 783 def readXml(self, upElement):
784 784
785 785 self.id = upElement.get('id')
786 786 self.name = upElement.get('name')
787 787 self.datatype = upElement.get('datatype')
788 788 self.inputId = upElement.get('inputId')
789 789
790 790 if self.ELEMENTNAME == "ReadUnit":
791 791 self.datatype = self.datatype.replace("Reader", "")
792 792
793 793 if self.inputId == 'None':
794 794 self.inputId = '0'
795 795
796 796 self.opConfObjList = []
797 797
798 798 opElementList = upElement.getiterator(OperationConf().getElementName())
799 799
800 800 for opElement in opElementList:
801 801 opConfObj = OperationConf()
802 802 opConfObj.readXml(opElement)
803 803 self.opConfObjList.append(opConfObj)
804 804
805 805 if opConfObj.name == 'run':
806 806 self.path = opConfObj.getParameterValue('path')
807 807 self.startDate = opConfObj.getParameterValue('startDate')
808 808 self.endDate = opConfObj.getParameterValue('endDate')
809 809 self.startTime = opConfObj.getParameterValue('startTime')
810 810 self.endTime = opConfObj.getParameterValue('endTime')
811 811
812 812 class Project():
813 813
814 814 id = None
815 815 name = None
816 816 description = None
817 817 filename = None
818 818
819 819 procUnitConfObjDict = None
820 820
821 821 ELEMENTNAME = 'Project'
822 822
823 823 __plotterQueue = None
824 824
825 def __init__(self, filename="./schain.xml", plotter_queue=None):
825 def __init__(self, filename=None, plotter_queue=None):
826 826
827 827 self.id = None
828 828 self.name = None
829 829 self.description = None
830
830
831 831 self.filename = filename
832 832 self.__plotterQueue = plotter_queue
833 833
834 834 self.procUnitConfObjDict = {}
835 835
836 836 def __getNewId(self):
837 837
838 838 id = int(self.id)*10 + len(self.procUnitConfObjDict) + 1
839 839
840 840 return str(id)
841 841
842 842 def getElementName(self):
843 843
844 844 return self.ELEMENTNAME
845 845
846 846 def getId(self):
847 847
848 848 return self.id
849 849
850 850 def updateId(self, new_id):
851 851
852 852 self.id = str(new_id)
853 853
854 854 keyList = self.procUnitConfObjDict.keys()
855 855 keyList.sort()
856 856
857 857 n = 1
858 858 newProcUnitConfObjDict = {}
859 859
860 860 for procKey in keyList:
861 861
862 862 procUnitConfObj = self.procUnitConfObjDict[procKey]
863 863 idProcUnit = str(int(self.id)*10 + n)
864 864 procUnitConfObj.updateId(idProcUnit, parentId = self.id)
865 865
866 866 newProcUnitConfObjDict[idProcUnit] = procUnitConfObj
867 867 n += 1
868 868
869 869 self.procUnitConfObjDict = newProcUnitConfObjDict
870 870
871 871 def setup(self, id, name, description):
872 872
873 873 self.id = str(id)
874 874 self.name = name
875 875 self.description = description
876 876
877 877 def update(self, name, description):
878 878
879 879 self.name = name
880 880 self.description = description
881 881
882 882 def addReadUnit(self, id=None, datatype=None, name=None, **kwargs):
883 883
884 884 if id is None:
885 885 idReadUnit = self.__getNewId()
886 886 else:
887 887 idReadUnit = str(id)
888 888
889 889 readUnitConfObj = ReadUnitConf()
890 890 readUnitConfObj.setup(idReadUnit, name, datatype, parentId=self.id, **kwargs)
891 891
892 892 self.procUnitConfObjDict[readUnitConfObj.getId()] = readUnitConfObj
893 893
894 894 return readUnitConfObj
895 895
896 896 def addProcUnit(self, inputId='0', datatype=None, name=None):
897 897
898 898 idProcUnit = self.__getNewId()
899 899
900 900 procUnitConfObj = ProcUnitConf()
901 901 procUnitConfObj.setup(idProcUnit, name, datatype, inputId, parentId=self.id)
902 902
903 903 self.procUnitConfObjDict[procUnitConfObj.getId()] = procUnitConfObj
904 904
905 905 return procUnitConfObj
906 906
907 907 def removeProcUnit(self, id):
908 908
909 909 if id in self.procUnitConfObjDict.keys():
910 910 self.procUnitConfObjDict.pop(id)
911 911
912 912 def getReadUnitId(self):
913 913
914 914 readUnitConfObj = self.getReadUnitObj()
915 915
916 916 return readUnitConfObj.id
917 917
918 918 def getReadUnitObj(self):
919 919
920 920 for obj in self.procUnitConfObjDict.values():
921 921 if obj.getElementName() == "ReadUnit":
922 922 return obj
923 923
924 924 return None
925 925
926 926 def getProcUnitObj(self, id=None, name=None):
927 927
928 928 if id != None:
929 929 return self.procUnitConfObjDict[id]
930 930
931 931 if name != None:
932 932 return self.getProcUnitObjByName(name)
933 933
934 934 return None
935 935
936 936 def getProcUnitObjByName(self, name):
937 937
938 938 for obj in self.procUnitConfObjDict.values():
939 939 if obj.name == name:
940 940 return obj
941 941
942 942 return None
943 943
944 944 def procUnitItems(self):
945 945
946 946 return self.procUnitConfObjDict.items()
947 947
948 948 def makeXml(self):
949 949
950 950 projectElement = Element('Project')
951 951 projectElement.set('id', str(self.id))
952 952 projectElement.set('name', self.name)
953 953 projectElement.set('description', self.description)
954 954
955 955 for procUnitConfObj in self.procUnitConfObjDict.values():
956 956 procUnitConfObj.makeXml(projectElement)
957 957
958 958 self.projectElement = projectElement
959 959
960 def writeXml(self, filename):
960 def writeXml(self, filename=None):
961 961
962 if filename == None:
963 filename = self.filename
964
965 if not filename:
966 print "filename has not been defined. Use setFilename(filename) for do it."
967 return 0
968
962 969 abs_file = os.path.abspath(filename)
963 970
964 971 if not os.access(os.path.dirname(abs_file), os.W_OK):
965 972 print "No write permission on %s" %os.path.dirname(abs_file)
966 973 return 0
967 974
968 975 if os.path.isfile(abs_file) and not(os.access(abs_file, os.W_OK)):
969 976 print "File %s already exists and it could not be overwriten" %abs_file
970 977 return 0
971 978
972 979 self.makeXml()
973 980
974 981 ElementTree(self.projectElement).write(abs_file, method='xml')
975 982
976 self.filename = abs_file
977
978 983 return 1
979 984
980 def readXml(self, filename):
985 def readXml(self, filename = None):
981 986
987 if filename == None:
988 filename = self.filename
989
982 990 abs_file = os.path.abspath(filename)
983 991
984 992 if not os.path.isfile(abs_file):
985 993 print "%s does not exist" %abs_file
986 994 return 0
987 995
988 996 self.projectElement = None
989 997 self.procUnitConfObjDict = {}
990 998
991 999 self.projectElement = ElementTree().parse(abs_file)
992 1000
993 1001 self.project = self.projectElement.tag
994 1002
995 1003 self.id = self.projectElement.get('id')
996 1004 self.name = self.projectElement.get('name')
997 1005 self.description = self.projectElement.get('description')
998 1006
999 1007 readUnitElementList = self.projectElement.getiterator(ReadUnitConf().getElementName())
1000 1008
1001 1009 for readUnitElement in readUnitElementList:
1002 1010 readUnitConfObj = ReadUnitConf()
1003 1011 readUnitConfObj.readXml(readUnitElement)
1004 1012
1005 1013 if readUnitConfObj.parentId == None:
1006 1014 readUnitConfObj.parentId = self.id
1007 1015
1008 1016 self.procUnitConfObjDict[readUnitConfObj.getId()] = readUnitConfObj
1009 1017
1010 1018 procUnitElementList = self.projectElement.getiterator(ProcUnitConf().getElementName())
1011 1019
1012 1020 for procUnitElement in procUnitElementList:
1013 1021 procUnitConfObj = ProcUnitConf()
1014 1022 procUnitConfObj.readXml(procUnitElement)
1015 1023
1016 1024 if procUnitConfObj.parentId == None:
1017 1025 procUnitConfObj.parentId = self.id
1018 1026
1019 1027 self.procUnitConfObjDict[procUnitConfObj.getId()] = procUnitConfObj
1020 1028
1029 if self.filename == None:
1030 self.filename = abs_file
1031
1021 1032 return 1
1022 1033
1023 1034 def printattr(self):
1024 1035
1025 1036 print "Project[%s]: name = %s, description = %s" %(self.id,
1026 1037 self.name,
1027 1038 self.description)
1028 1039
1029 1040 for procUnitConfObj in self.procUnitConfObjDict.values():
1030 1041 procUnitConfObj.printattr()
1031 1042
1032 1043 def createObjects(self):
1033 1044
1034 1045 for procUnitConfObj in self.procUnitConfObjDict.values():
1035 1046 procUnitConfObj.createObjects(self.__plotterQueue)
1036 1047
1037 1048 def __connect(self, objIN, thisObj):
1038 1049
1039 1050 thisObj.setInput(objIN.getOutputObj())
1040 1051
1041 1052 def connectObjects(self):
1042 1053
1043 1054 for thisPUConfObj in self.procUnitConfObjDict.values():
1044 1055
1045 1056 inputId = thisPUConfObj.getInputId()
1046 1057
1047 1058 if int(inputId) == 0:
1048 1059 continue
1049 1060
1050 1061 #Get input object
1051 1062 puConfINObj = self.procUnitConfObjDict[inputId]
1052 1063 puObjIN = puConfINObj.getProcUnitObj()
1053 1064
1054 1065 #Get current object
1055 1066 thisPUObj = thisPUConfObj.getProcUnitObj()
1056 1067
1057 1068 self.__connect(puObjIN, thisPUObj)
1058 1069
1059 1070 def __handleError(self, procUnitConfObj):
1060 1071
1061 1072 import socket
1062 1073
1063 1074 err = traceback.format_exception(sys.exc_info()[0],
1064 1075 sys.exc_info()[1],
1065 1076 sys.exc_info()[2])
1066 1077
1067 1078 subject = "SChain v%s: Error running %s\n" %(schainpy.__version__, procUnitConfObj.name)
1068 1079
1069 1080 subtitle = "%s: %s\n" %(procUnitConfObj.getElementName() ,procUnitConfObj.name)
1070 1081 subtitle += "Hostname: %s\n" %socket.gethostbyname(socket.gethostname())
1071 1082 subtitle += "Working directory: %s\n" %os.path.abspath("./")
1072 1083 subtitle += "Configuration file: %s\n" %self.filename
1073 1084 subtitle += "Time: %s\n" %str(datetime.datetime.now())
1074 1085
1075 1086 readUnitConfObj = self.getReadUnitObj()
1076 1087 if readUnitConfObj:
1077 1088 subtitle += "\nInput parameters:\n"
1078 1089 subtitle += "[Data path = %s]\n" %readUnitConfObj.path
1079 1090 subtitle += "[Data type = %s]\n" %readUnitConfObj.datatype
1080 1091 subtitle += "[Start date = %s]\n" %readUnitConfObj.startDate
1081 1092 subtitle += "[End date = %s]\n" %readUnitConfObj.endDate
1082 1093 subtitle += "[Start time = %s]\n" %readUnitConfObj.startTime
1083 1094 subtitle += "[End time = %s]\n" %readUnitConfObj.endTime
1084 1095
1085 1096 message = "".join(err)
1086 1097
1087 1098 sys.stderr.write(message)
1088 1099
1089 1100 adminObj = schainpy.admin.SchainNotify()
1090 1101 adminObj.sendAlert(message=message,
1091 1102 subject=subject,
1092 1103 subtitle=subtitle,
1093 1104 filename=self.filename)
1094 1105
1095 1106 def isPaused(self):
1096 1107 return 0
1097 1108
1098 1109 def isStopped(self):
1099 1110 return 0
1100 1111
1101 1112 def runController(self):
1102 1113 """
1103 1114 returns 0 when this process has been stopped, 1 otherwise
1104 1115 """
1105 1116
1106 1117 if self.isPaused():
1107 1118 print "Process suspended"
1108 1119
1109 1120 while True:
1110 1121 sleep(0.1)
1111 1122
1112 1123 if not self.isPaused():
1113 1124 break
1114 1125
1115 1126 if self.isStopped():
1116 1127 break
1117 1128
1118 1129 print "Process reinitialized"
1119 1130
1120 1131 if self.isStopped():
1121 1132 print "Process stopped"
1122 1133 return 0
1123 1134
1124 1135 return 1
1125 1136
1126 1137 def setFilename(self, filename):
1127 1138
1128 1139 self.filename = filename
1129 1140
1130 1141 def setPlotterQueue(self, plotter_queue):
1131 1142
1132 1143 self.__plotterQueue = plotter_queue
1133 1144
1134 1145 def getPlotterQueue(self):
1135 1146
1136 1147 return self.__plotterQueue
1137 1148
1138 1149 def run(self):
1139 1150
1140 1151 print
1141 1152 print "*"*60
1142 1153 print " Starting SIGNAL CHAIN PROCESSING v%s " %schainpy.__version__
1143 1154 print "*"*60
1144 1155 print
1145 1156
1146 1157 keyList = self.procUnitConfObjDict.keys()
1147 1158 keyList.sort()
1148 1159
1149 1160 while(True):
1150 1161
1151 1162 is_ok = False
1152 1163
1153 1164 for procKey in keyList:
1154 1165 # print "Running the '%s' process with %s" %(procUnitConfObj.name, procUnitConfObj.id)
1155 1166
1156 1167 procUnitConfObj = self.procUnitConfObjDict[procKey]
1157 1168
1158 1169 try:
1159 1170 sts = procUnitConfObj.run()
1160 1171 is_ok = is_ok or sts
1161 1172 except ValueError, e:
1162 1173 print "***** Error occurred in %s *****" %(procUnitConfObj.name)
1163 1174 sleep(0.5)
1164 1175 print e
1165 1176 is_ok = False
1166 1177 break
1167 1178 except:
1168 1179 print "***** Error occurred in %s *****" %(procUnitConfObj.name)
1169 1180 sleep(0.5)
1170 1181 self.__handleError(procUnitConfObj)
1171 1182 is_ok = False
1172 1183 break
1173 1184
1174 1185 #If every process unit finished so end process
1175 1186 if not(is_ok):
1176 1187 print "Every process unit have finished"
1177 1188 break
1178 1189
1179 1190 if not self.runController():
1180 1191 break
1181 1192
1182 1193 #Closing every process
1183 1194 for procKey in keyList:
1184 1195 procUnitConfObj = self.procUnitConfObjDict[procKey]
1185 1196 procUnitConfObj.close()
1186 1197
1187 1198 print "Process finished"
1188 1199
1189 1200 def start(self):
1190 1201
1191 if not self.writeXml(self.filename):
1202 if not self.writeXml():
1192 1203 return
1193 1204
1194 1205 self.createObjects()
1195 1206 self.connectObjects()
1196 1207 self.run()
1197 1208
1198 1209 if __name__ == '__main__':
1199 1210
1200 1211 desc = "Segundo Test"
1201 1212 filename = "schain.xml"
1202 1213
1203 1214 controllerObj = Project()
1204 1215
1205 1216 controllerObj.setup(id = '191', name='test01', description=desc)
1206 1217
1207 1218 readUnitConfObj = controllerObj.addReadUnit(datatype='Voltage',
1208 1219 path='data/rawdata/',
1209 1220 startDate='2011/01/01',
1210 1221 endDate='2012/12/31',
1211 1222 startTime='00:00:00',
1212 1223 endTime='23:59:59',
1213 1224 online=1,
1214 1225 walk=1)
1215 1226
1216 1227 procUnitConfObj0 = controllerObj.addProcUnit(datatype='Voltage', inputId=readUnitConfObj.getId())
1217 1228
1218 1229 opObj10 = procUnitConfObj0.addOperation(name='selectChannels')
1219 1230 opObj10.addParameter(name='channelList', value='3,4,5', format='intlist')
1220 1231
1221 1232 opObj10 = procUnitConfObj0.addOperation(name='selectHeights')
1222 1233 opObj10.addParameter(name='minHei', value='90', format='float')
1223 1234 opObj10.addParameter(name='maxHei', value='180', format='float')
1224 1235
1225 1236 opObj12 = procUnitConfObj0.addOperation(name='CohInt', optype='external')
1226 1237 opObj12.addParameter(name='n', value='10', format='int')
1227 1238
1228 1239 procUnitConfObj1 = controllerObj.addProcUnit(datatype='Spectra', inputId=procUnitConfObj0.getId())
1229 1240 procUnitConfObj1.addParameter(name='nFFTPoints', value='32', format='int')
1230 1241 # procUnitConfObj1.addParameter(name='pairList', value='(0,1),(0,2),(1,2)', format='')
1231 1242
1232 1243
1233 1244 opObj11 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='external')
1234 1245 opObj11.addParameter(name='idfigure', value='1', format='int')
1235 1246 opObj11.addParameter(name='wintitle', value='SpectraPlot0', format='str')
1236 1247 opObj11.addParameter(name='zmin', value='40', format='int')
1237 1248 opObj11.addParameter(name='zmax', value='90', format='int')
1238 1249 opObj11.addParameter(name='showprofile', value='1', format='int')
1239 1250
1240 1251 print "Escribiendo el archivo XML"
1241 1252
1242 1253 controllerObj.writeXml(filename)
1243 1254
1244 1255 print "Leyendo el archivo XML"
1245 1256 controllerObj.readXml(filename)
1246 1257 #controllerObj.printattr()
1247 1258
1248 1259 controllerObj.createObjects()
1249 1260 controllerObj.connectObjects()
1250 1261 controllerObj.run()
1251 1262
1252 1263 No newline at end of file
General Comments 0
You need to be logged in to leave comments. Login now