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