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