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