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