controller.py
1293 lines
| 39.7 KiB
| text/x-python
|
PythonLexer
/ schainpy / controller.py
|
r197 | ''' | |
Created on September , 2012 | |||
@author: | |||
''' | |||
|
r587 | ||
|
r672 | import sys | |
|
r514 | import ast | |
|
r687 | import datetime | |
|
r672 | import traceback | |
|
r681 | import schainpy | |
import schainpy.admin | |||
|
r672 | ||
|
r681 | from xml.etree.ElementTree import ElementTree, Element, SubElement, tostring | |
from xml.dom import minidom | |||
from schainpy.model import * | |||
from time import sleep | |||
|
r514 | ||
|
r197 | def prettify(elem): | |
"""Return a pretty-printed XML string for the Element. | |||
""" | |||
|
r664 | rough_string = tostring(elem, 'utf-8') | |
|
r197 | reparsed = minidom.parseString(rough_string) | |
return reparsed.toprettyxml(indent=" ") | |||
class ParameterConf(): | |||
id = None | |||
name = None | |||
value = None | |||
|
r199 | format = None | |
|
r197 | ||
|
r529 | __formated_value = None | |
|
r243 | ||
|
r197 | ELEMENTNAME = 'Parameter' | |
def __init__(self): | |||
|
r199 | self.format = 'str' | |
|
r197 | ||
def getElementName(self): | |||
return self.ELEMENTNAME | |||
def getValue(self): | |||
|
r600 | ||
value = self.value | |||
format = self.format | |||
|
r529 | if self.__formated_value != None: | |
|
r243 | ||
|
r529 | return self.__formated_value | |
|
r587 | ||
|
r600 | if format == 'str': | |
|
r596 | self.__formated_value = str(value) | |
return self.__formated_value | |||
if value == '': | |||
raise ValueError, "%s: This parameter value is empty" %self.name | |||
|
r535 | ||
|
r600 | if format == 'list': | |
|
r224 | strList = value.split(',') | |
|
r529 | ||
self.__formated_value = strList | |||
return self.__formated_value | |||
|
r197 | ||
|
r600 | if format == 'intlist': | |
|
r535 | """ | |
Example: | |||
value = (0,1,2) | |||
""" | |||
|
r600 | ||
|
r735 | new_value = ast.literal_eval(value) | |
|
r600 | ||
|
r735 | if type(new_value) not in (tuple, list): | |
new_value = [int(new_value)] | |||
|
r529 | ||
|
r735 | self.__formated_value = new_value | |
|
r529 | ||
return self.__formated_value | |||
|
r197 | ||
|
r600 | if format == 'floatlist': | |
|
r535 | """ | |
Example: | |||
value = (0.5, 1.4, 2.7) | |||
""" | |||
|
r586 | ||
|
r735 | new_value = ast.literal_eval(value) | |
|
r600 | ||
|
r735 | if type(new_value) not in (tuple, list): | |
new_value = [float(new_value)] | |||
|
r529 | ||
|
r741 | self.__formated_value = new_value | |
|
r529 | ||
return self.__formated_value | |||
|
r197 | ||
|
r600 | if format == 'date': | |
|
r224 | strList = value.split('/') | |
|
r197 | intList = [int(x) for x in strList] | |
date = datetime.date(intList[0], intList[1], intList[2]) | |||
|
r529 | ||
self.__formated_value = date | |||
return self.__formated_value | |||
|
r197 | ||
|
r600 | if format == 'time': | |
|
r224 | strList = value.split(':') | |
|
r197 | intList = [int(x) for x in strList] | |
time = datetime.time(intList[0], intList[1], intList[2]) | |||
|
r529 | ||
self.__formated_value = time | |||
return self.__formated_value | |||
|
r224 | ||
|
r600 | if format == 'pairslist': | |
|
r226 | """ | |
Example: | |||
value = (0,1),(1,2) | |||
""" | |||
|
r735 | new_value = ast.literal_eval(value) | |
|
r600 | ||
|
r735 | if type(new_value) not in (tuple, list): | |
raise ValueError, "%s has to be a tuple or list of pairs" %value | |||
|
r600 | ||
|
r735 | if type(new_value[0]) not in (tuple, list): | |
if len(new_value) != 2: | |||
raise ValueError, "%s has to be a tuple or list of pairs" %value | |||
new_value = [new_value] | |||
|
r226 | ||
|
r735 | for thisPair in new_value: | |
if len(thisPair) != 2: | |||
raise ValueError, "%s has to be a tuple or list of pairs" %value | |||
self.__formated_value = new_value | |||
|
r529 | ||
return self.__formated_value | |||
|
r226 | ||
|
r600 | if format == 'multilist': | |
|
r514 | """ | |
Example: | |||
value = (0,1,2),(3,4,5) | |||
""" | |||
multiList = ast.literal_eval(value) | |||
|
r529 | ||
|
r600 | if type(multiList[0]) == int: | |
multiList = ast.literal_eval("(" + value + ")") | |||
|
r529 | self.__formated_value = multiList | |
return self.__formated_value | |||
|
r514 | ||
|
r677 | if format == 'bool': | |
value = int(value) | |||
if format == 'int': | |||
value = float(value) | |||
|
r600 | format_func = eval(format) | |
|
r224 | ||
|
r529 | self.__formated_value = format_func(value) | |
|
r243 | ||
|
r529 | return self.__formated_value | |
|
r596 | ||
def updateId(self, new_id): | |||
|
r197 | ||
|
r596 | self.id = str(new_id) | |
|
r199 | def setup(self, id, name, value, format='str'): | |
|
r197 | ||
|
r596 | self.id = str(id) | |
|
r197 | self.name = name | |
self.value = str(value) | |||
|
r535 | self.format = str.lower(format) | |
|
r577 | ||
|
r735 | self.getValue() | |
|
r643 | ||
return 1 | |||
|
r577 | def update(self, name, value, format='str'): | |
self.name = name | |||
self.value = str(value) | |||
self.format = format | |||
|
r197 | ||
def makeXml(self, opElement): | |||
parmElement = SubElement(opElement, self.ELEMENTNAME) | |||
parmElement.set('id', str(self.id)) | |||
parmElement.set('name', self.name) | |||
parmElement.set('value', self.value) | |||
|
r199 | parmElement.set('format', self.format) | |
|
r197 | ||
def readXml(self, parmElement): | |||
self.id = parmElement.get('id') | |||
self.name = parmElement.get('name') | |||
self.value = parmElement.get('value') | |||
|
r568 | self.format = str.lower(parmElement.get('format')) | |
|
r197 | ||
|
r568 | #Compatible with old signal chain version | |
if self.format == 'int' and self.name == 'idfigure': | |||
self.name = 'id' | |||
|
r197 | def printattr(self): | |
|
r199 | print "Parameter[%s]: name = %s, value = %s, format = %s" %(self.id, self.name, self.value, self.format) | |
|
r197 | ||
class OperationConf(): | |||
id = None | |||
name = None | |||
priority = None | |||
type = None | |||
parmConfObjList = [] | |||
ELEMENTNAME = 'Operation' | |||
def __init__(self): | |||
|
r589 | self.id = '0' | |
|
r568 | self.name = None | |
self.priority = None | |||
self.type = 'self' | |||
|
r197 | ||
def __getNewId(self): | |||
return int(self.id)*10 + len(self.parmConfObjList) + 1 | |||
|
r596 | ||
def updateId(self, new_id): | |||
self.id = str(new_id) | |||
n = 1 | |||
for parmObj in self.parmConfObjList: | |||
idParm = str(int(new_id)*10 + n) | |||
parmObj.updateId(idParm) | |||
n += 1 | |||
|
r197 | def getElementName(self): | |
return self.ELEMENTNAME | |||
def getParameterObjList(self): | |||
return self.parmConfObjList | |||
|
r577 | def getParameterObj(self, parameterName): | |
for parmConfObj in self.parmConfObjList: | |||
if parmConfObj.name != parameterName: | |||
continue | |||
return parmConfObj | |||
return None | |||
|
r606 | def getParameterObjfromValue(self, parameterValue): | |
|
r577 | for parmConfObj in self.parmConfObjList: | |
if parmConfObj.getValue() != parameterValue: | |||
continue | |||
return parmConfObj.getValue() | |||
return None | |||
def getParameterValue(self, parameterName): | |||
parameterObj = self.getParameterObj(parameterName) | |||
|
r606 | ||
|
r607 | # if not parameterObj: | |
# return None | |||
|
r606 | ||
|
r577 | value = parameterObj.getValue() | |
return value | |||
|
r197 | def setup(self, id, name, priority, type): | |
|
r596 | self.id = str(id) | |
|
r197 | self.name = name | |
self.type = type | |||
self.priority = priority | |||
self.parmConfObjList = [] | |||
|
r577 | ||
def removeParameters(self): | |||
for obj in self.parmConfObjList: | |||
del obj | |||
self.parmConfObjList = [] | |||
|
r197 | ||
|
r199 | def addParameter(self, name, value, format='str'): | |
|
r197 | ||
id = self.__getNewId() | |||
parmConfObj = ParameterConf() | |||
|
r643 | if not parmConfObj.setup(id, name, value, format): | |
return None | |||
|
r197 | ||
self.parmConfObjList.append(parmConfObj) | |||
return parmConfObj | |||
|
r577 | def changeParameter(self, name, value, format='str'): | |
parmConfObj = self.getParameterObj(name) | |||
parmConfObj.update(name, value, format) | |||
return parmConfObj | |||
|
r681 | def makeXml(self, procUnitElement): | |
|
r197 | ||
|
r681 | opElement = SubElement(procUnitElement, self.ELEMENTNAME) | |
|
r197 | opElement.set('id', str(self.id)) | |
opElement.set('name', self.name) | |||
opElement.set('type', self.type) | |||
opElement.set('priority', str(self.priority)) | |||
for parmConfObj in self.parmConfObjList: | |||
parmConfObj.makeXml(opElement) | |||
def readXml(self, opElement): | |||
self.id = opElement.get('id') | |||
self.name = opElement.get('name') | |||
self.type = opElement.get('type') | |||
self.priority = opElement.get('priority') | |||
|
r568 | #Compatible with old signal chain version | |
#Use of 'run' method instead 'init' | |||
if self.type == 'self' and self.name == 'init': | |||
self.name = 'run' | |||
|
r197 | self.parmConfObjList = [] | |
|
r860 | parmElementList = opElement.iter(ParameterConf().getElementName()) | |
|
r197 | ||
for parmElement in parmElementList: | |||
parmConfObj = ParameterConf() | |||
parmConfObj.readXml(parmElement) | |||
|
r568 | ||
#Compatible with old signal chain version | |||
#If an 'plot' OPERATION is found, changes name operation by the value of its type PARAMETER | |||
if self.type != 'self' and self.name == 'Plot': | |||
if parmConfObj.format == 'str' and parmConfObj.name == 'type': | |||
self.name = parmConfObj.value | |||
continue | |||
|
r197 | ||
|
r568 | self.parmConfObjList.append(parmConfObj) | |
|
r197 | def printattr(self): | |
print "%s[%s]: name = %s, type = %s, priority = %s" %(self.ELEMENTNAME, | |||
self.id, | |||
self.name, | |||
self.type, | |||
self.priority) | |||
for parmConfObj in self.parmConfObjList: | |||
parmConfObj.printattr() | |||
|
r691 | def createObject(self, plotter_queue=None): | |
|
r197 | ||
if self.type == 'self': | |||
raise ValueError, "This operation type cannot be created" | |||
|
r691 | if self.type == 'plotter': | |
#Plotter(plotter_name) | |||
|
r708 | if not plotter_queue: | |
raise ValueError, "plotter_queue is not defined. Use:\nmyProject = Project()\nmyProject.setPlotterQueue(plotter_queue)" | |||
|
r691 | opObj = Plotter(self.name, plotter_queue) | |
|
r487 | if self.type == 'external' or self.type == 'other': | |
|
r197 | className = eval(self.name) | |
opObj = className() | |||
return opObj | |||
class ProcUnitConf(): | |||
id = None | |||
name = None | |||
|
r199 | datatype = None | |
|
r197 | inputId = None | |
|
r577 | parentId = None | |
|
r197 | ||
opConfObjList = [] | |||
procUnitObj = None | |||
opObjList = [] | |||
ELEMENTNAME = 'ProcUnit' | |||
def __init__(self): | |||
self.id = None | |||
|
r199 | self.datatype = None | |
|
r197 | self.name = None | |
self.inputId = None | |||
self.opConfObjList = [] | |||
self.procUnitObj = None | |||
self.opObjDict = {} | |||
def __getPriority(self): | |||
return len(self.opConfObjList)+1 | |||
def __getNewId(self): | |||
return int(self.id)*10 + len(self.opConfObjList) + 1 | |||
def getElementName(self): | |||
return self.ELEMENTNAME | |||
def getId(self): | |||
|
r589 | return self.id | |
|
r596 | ||
def updateId(self, new_id, parentId=parentId): | |||
new_id = int(parentId)*10 + (int(self.id) % 10) | |||
new_inputId = int(parentId)*10 + (int(self.inputId) % 10) | |||
#If this proc unit has not inputs | |||
if self.inputId == '0': | |||
new_inputId = 0 | |||
n = 1 | |||
for opConfObj in self.opConfObjList: | |||
idOp = str(int(new_id)*10 + n) | |||
opConfObj.updateId(idOp) | |||
n += 1 | |||
self.parentId = str(parentId) | |||
self.id = str(new_id) | |||
self.inputId = str(new_inputId) | |||
|
r197 | def getInputId(self): | |
|
r589 | return self.inputId | |
|
r197 | ||
def getOperationObjList(self): | |||
return self.opConfObjList | |||
|
r577 | def getOperationObj(self, name=None): | |
for opConfObj in self.opConfObjList: | |||
if opConfObj.name != name: | |||
continue | |||
return opConfObj | |||
return None | |||
|
r606 | def getOpObjfromParamValue(self, value=None): | |
|
r577 | ||
for opConfObj in self.opConfObjList: | |||
if opConfObj.getParameterObjfromValue(parameterValue=value) != value: | |||
continue | |||
return opConfObj | |||
return None | |||
|
r197 | def getProcUnitObj(self): | |
return self.procUnitObj | |||
|
r577 | def setup(self, id, name, datatype, inputId, parentId=None): | |
|
r596 | ||
#Compatible with old signal chain version | |||
if datatype==None and name==None: | |||
raise ValueError, "datatype or name should be defined" | |||
|
r197 | ||
|
r596 | if name==None: | |
if 'Proc' in datatype: | |||
name = datatype | |||
else: | |||
name = '%sProc' %(datatype) | |||
if datatype==None: | |||
datatype = name.replace('Proc','') | |||
self.id = str(id) | |||
|
r197 | self.name = name | |
|
r199 | self.datatype = datatype | |
|
r197 | self.inputId = inputId | |
|
r577 | self.parentId = parentId | |
|
r197 | ||
self.opConfObjList = [] | |||
|
r487 | self.addOperation(name='run', optype='self') | |
|
r219 | ||
|
r577 | def removeOperations(self): | |
for obj in self.opConfObjList: | |||
del obj | |||
self.opConfObjList = [] | |||
self.addOperation(name='run') | |||
|
r219 | def addParameter(self, **kwargs): | |
|
r580 | ''' | |
Add parameters to "run" operation | |||
''' | |||
|
r219 | opObj = self.opConfObjList[0] | |
opObj.addParameter(**kwargs) | |||
|
r197 | ||
|
r219 | return opObj | |
|
r197 | def addOperation(self, name, optype='self'): | |
id = self.__getNewId() | |||
priority = self.__getPriority() | |||
opConfObj = OperationConf() | |||
opConfObj.setup(id, name=name, priority=priority, type=optype) | |||
self.opConfObjList.append(opConfObj) | |||
return opConfObj | |||
|
r681 | def makeXml(self, projectElement): | |
|
r197 | ||
|
r681 | procUnitElement = SubElement(projectElement, self.ELEMENTNAME) | |
procUnitElement.set('id', str(self.id)) | |||
procUnitElement.set('name', self.name) | |||
procUnitElement.set('datatype', self.datatype) | |||
procUnitElement.set('inputId', str(self.inputId)) | |||
|
r197 | ||
for opConfObj in self.opConfObjList: | |||
|
r681 | opConfObj.makeXml(procUnitElement) | |
|
r197 | ||
def readXml(self, upElement): | |||
self.id = upElement.get('id') | |||
self.name = upElement.get('name') | |||
|
r199 | self.datatype = upElement.get('datatype') | |
|
r197 | self.inputId = upElement.get('inputId') | |
|
r589 | ||
|
r596 | if self.ELEMENTNAME == "ReadUnit": | |
self.datatype = self.datatype.replace("Reader", "") | |||
if self.ELEMENTNAME == "ProcUnit": | |||
self.datatype = self.datatype.replace("Proc", "") | |||
|
r589 | if self.inputId == 'None': | |
self.inputId = '0' | |||
|
r197 | self.opConfObjList = [] | |
|
r860 | opElementList = upElement.iter(OperationConf().getElementName()) | |
|
r197 | ||
for opElement in opElementList: | |||
opConfObj = OperationConf() | |||
opConfObj.readXml(opElement) | |||
self.opConfObjList.append(opConfObj) | |||
def printattr(self): | |||
|
r199 | print "%s[%s]: name = %s, datatype = %s, inputId = %s" %(self.ELEMENTNAME, | |
|
r197 | self.id, | |
self.name, | |||
|
r199 | self.datatype, | |
|
r197 | self.inputId) | |
for opConfObj in self.opConfObjList: | |||
opConfObj.printattr() | |||
|
r691 | def createObjects(self, plotter_queue=None): | |
|
r197 | ||
className = eval(self.name) | |||
procUnitObj = className() | |||
for opConfObj in self.opConfObjList: | |||
if opConfObj.type == 'self': | |||
continue | |||
|
r691 | opObj = opConfObj.createObject(plotter_queue) | |
|
r197 | ||
self.opObjDict[opConfObj.id] = opObj | |||
procUnitObj.addOperation(opObj, opConfObj.id) | |||
self.procUnitObj = procUnitObj | |||
return procUnitObj | |||
def run(self): | |||
|
r672 | is_ok = False | |
|
r199 | ||
|
r197 | for opConfObj in self.opConfObjList: | |
|
r199 | ||
|
r197 | kwargs = {} | |
for parmConfObj in opConfObj.getParameterObjList(): | |||
|
r577 | if opConfObj.name == 'run' and parmConfObj.name == 'datatype': | |
continue | |||
|
r197 | kwargs[parmConfObj.name] = parmConfObj.getValue() | |
|
r874 | #ini = time.time() | |
|
r813 | ||
|
r199 | #print "\tRunning the '%s' operation with %s" %(opConfObj.name, opConfObj.id) | |
|
r487 | sts = self.procUnitObj.call(opType = opConfObj.type, | |
opName = opConfObj.name, | |||
opId = opConfObj.id, | |||
**kwargs) | |||
|
r813 | ||
# total_time = time.time() - ini | |||
# | |||
# if total_time > 0.002: | |||
# print "%s::%s took %f seconds" %(self.name, opConfObj.name, total_time) | |||
|
r672 | is_ok = is_ok or sts | |
|
r199 | ||
|
r672 | return is_ok | |
|
r573 | ||
def close(self): | |||
|
r577 | for opConfObj in self.opConfObjList: | |
if opConfObj.type == 'self': | |||
continue | |||
opObj = self.procUnitObj.getOperationObj(opConfObj.id) | |||
opObj.close() | |||
|
r573 | ||
|
r577 | self.procUnitObj.close() | |
|
r573 | return | |
|
r197 | class ReadUnitConf(ProcUnitConf): | |
path = None | |||
startDate = None | |||
endDate = None | |||
startTime = None | |||
endTime = None | |||
ELEMENTNAME = 'ReadUnit' | |||
def __init__(self): | |||
self.id = None | |||
|
r199 | self.datatype = None | |
|
r197 | self.name = None | |
|
r589 | self.inputId = None | |
self.parentId = None | |||
|
r197 | ||
self.opConfObjList = [] | |||
self.opObjList = [] | |||
def getElementName(self): | |||
return self.ELEMENTNAME | |||
|
r577 | def setup(self, id, name, datatype, path, startDate="", endDate="", startTime="", endTime="", parentId=None, **kwargs): | |
|
r596 | ||
#Compatible with old signal chain version | |||
if datatype==None and name==None: | |||
raise ValueError, "datatype or name should be defined" | |||
if name==None: | |||
if 'Reader' in datatype: | |||
name = datatype | |||
else: | |||
name = '%sReader' %(datatype) | |||
|
r197 | ||
|
r596 | if datatype==None: | |
datatype = name.replace('Reader','') | |||
|
r197 | self.id = id | |
self.name = name | |||
|
r199 | self.datatype = datatype | |
|
r197 | ||
|
r687 | self.path = os.path.abspath(path) | |
|
r197 | self.startDate = startDate | |
self.endDate = endDate | |||
self.startTime = startTime | |||
self.endTime = endTime | |||
|
r589 | self.inputId = '0' | |
self.parentId = parentId | |||
|
r224 | self.addRunOperation(**kwargs) | |
|
r577 | ||
|
r589 | def update(self, datatype, path, startDate, endDate, startTime, endTime, parentId=None, name=None, **kwargs): | |
|
r596 | #Compatible with old signal chain version | |
if datatype==None and name==None: | |||
raise ValueError, "datatype or name should be defined" | |||
|
r589 | if name==None: | |
if 'Reader' in datatype: | |||
name = datatype | |||
else: | |||
name = '%sReader' %(datatype) | |||
|
r577 | ||
|
r589 | if datatype==None: | |
datatype = name.replace('Reader','') | |||
|
r577 | self.datatype = datatype | |
|
r589 | self.name = name | |
|
r577 | self.path = path | |
self.startDate = startDate | |||
self.endDate = endDate | |||
self.startTime = startTime | |||
self.endTime = endTime | |||
|
r596 | self.inputId = '0' | |
|
r589 | self.parentId = parentId | |
|
r577 | self.updateRunOperation(**kwargs) | |
|
r687 | ||
def removeOperations(self): | |||
for obj in self.opConfObjList: | |||
del obj | |||
self.opConfObjList = [] | |||
|
r577 | ||
|
r224 | def addRunOperation(self, **kwargs): | |
|
r197 | ||
opObj = self.addOperation(name = 'run', optype = 'self') | |||
|
r577 | opObj.addParameter(name='datatype' , value=self.datatype, format='str') | |
|
r199 | opObj.addParameter(name='path' , value=self.path, format='str') | |
opObj.addParameter(name='startDate' , value=self.startDate, format='date') | |||
opObj.addParameter(name='endDate' , value=self.endDate, format='date') | |||
opObj.addParameter(name='startTime' , value=self.startTime, format='time') | |||
opObj.addParameter(name='endTime' , value=self.endTime, format='time') | |||
|
r224 | ||
for key, value in kwargs.items(): | |||
opObj.addParameter(name=key, value=value, format=type(value).__name__) | |||
|
r197 | return opObj | |
|
r577 | def updateRunOperation(self, **kwargs): | |
opObj = self.getOperationObj(name = 'run') | |||
opObj.removeParameters() | |||
opObj.addParameter(name='datatype' , value=self.datatype, format='str') | |||
opObj.addParameter(name='path' , value=self.path, format='str') | |||
opObj.addParameter(name='startDate' , value=self.startDate, format='date') | |||
opObj.addParameter(name='endDate' , value=self.endDate, format='date') | |||
opObj.addParameter(name='startTime' , value=self.startTime, format='time') | |||
opObj.addParameter(name='endTime' , value=self.endTime, format='time') | |||
for key, value in kwargs.items(): | |||
opObj.addParameter(name=key, value=value, format=type(value).__name__) | |||
return opObj | |||
|
r197 | ||
|
r681 | # def makeXml(self, projectElement): | |
# | |||
# procUnitElement = SubElement(projectElement, self.ELEMENTNAME) | |||
# procUnitElement.set('id', str(self.id)) | |||
# procUnitElement.set('name', self.name) | |||
# procUnitElement.set('datatype', self.datatype) | |||
# procUnitElement.set('inputId', str(self.inputId)) | |||
# | |||
# for opConfObj in self.opConfObjList: | |||
# opConfObj.makeXml(procUnitElement) | |||
def readXml(self, upElement): | |||
self.id = upElement.get('id') | |||
self.name = upElement.get('name') | |||
self.datatype = upElement.get('datatype') | |||
self.inputId = upElement.get('inputId') | |||
if self.ELEMENTNAME == "ReadUnit": | |||
self.datatype = self.datatype.replace("Reader", "") | |||
if self.inputId == 'None': | |||
self.inputId = '0' | |||
self.opConfObjList = [] | |||
|
r860 | opElementList = upElement.iter(OperationConf().getElementName()) | |
|
r681 | ||
for opElement in opElementList: | |||
opConfObj = OperationConf() | |||
opConfObj.readXml(opElement) | |||
self.opConfObjList.append(opConfObj) | |||
if opConfObj.name == 'run': | |||
self.path = opConfObj.getParameterValue('path') | |||
self.startDate = opConfObj.getParameterValue('startDate') | |||
self.endDate = opConfObj.getParameterValue('endDate') | |||
self.startTime = opConfObj.getParameterValue('startTime') | |||
self.endTime = opConfObj.getParameterValue('endTime') | |||
|
r224 | class Project(): | |
|
r197 | ||
id = None | |||
name = None | |||
description = None | |||
|
r681 | filename = None | |
|
r197 | procUnitConfObjDict = None | |
|
r224 | ELEMENTNAME = 'Project' | |
|
r197 | ||
|
r716 | plotterQueue = None | |
|
r691 | ||
|
r708 | def __init__(self, plotter_queue=None): | |
|
r197 | ||
self.id = None | |||
self.name = None | |||
self.description = None | |||
|
r702 | ||
|
r716 | self.plotterQueue = plotter_queue | |
|
r691 | ||
|
r197 | self.procUnitConfObjDict = {} | |
def __getNewId(self): | |||
|
r764 | idList = self.procUnitConfObjDict.keys() | |
|
r197 | ||
|
r764 | id = int(self.id)*10 | |
while True: | |||
id += 1 | |||
if str(id) in idList: | |||
continue | |||
break | |||
|
r197 | return str(id) | |
def getElementName(self): | |||
return self.ELEMENTNAME | |||
|
r577 | ||
def getId(self): | |||
return self.id | |||
|
r197 | ||
|
r596 | def updateId(self, new_id): | |
self.id = str(new_id) | |||
keyList = self.procUnitConfObjDict.keys() | |||
keyList.sort() | |||
n = 1 | |||
newProcUnitConfObjDict = {} | |||
for procKey in keyList: | |||
procUnitConfObj = self.procUnitConfObjDict[procKey] | |||
idProcUnit = str(int(self.id)*10 + n) | |||
procUnitConfObj.updateId(idProcUnit, parentId = self.id) | |||
newProcUnitConfObjDict[idProcUnit] = procUnitConfObj | |||
n += 1 | |||
self.procUnitConfObjDict = newProcUnitConfObjDict | |||
|
r197 | def setup(self, id, name, description): | |
|
r596 | self.id = str(id) | |
|
r197 | self.name = name | |
self.description = description | |||
|
r577 | ||
def update(self, name, description): | |||
self.name = name | |||
self.description = description | |||
|
r687 | def addReadUnit(self, id=None, datatype=None, name=None, **kwargs): | |
|
r568 | ||
|
r687 | if id is None: | |
idReadUnit = self.__getNewId() | |||
else: | |||
idReadUnit = str(id) | |||
|
r197 | ||
readUnitConfObj = ReadUnitConf() | |||
|
r589 | readUnitConfObj.setup(idReadUnit, name, datatype, parentId=self.id, **kwargs) | |
|
r197 | ||
self.procUnitConfObjDict[readUnitConfObj.getId()] = readUnitConfObj | |||
return readUnitConfObj | |||
|
r589 | def addProcUnit(self, inputId='0', datatype=None, name=None): | |
|
r568 | ||
|
r589 | idProcUnit = self.__getNewId() | |
|
r197 | ||
procUnitConfObj = ProcUnitConf() | |||
|
r589 | procUnitConfObj.setup(idProcUnit, name, datatype, inputId, parentId=self.id) | |
|
r197 | ||
self.procUnitConfObjDict[procUnitConfObj.getId()] = procUnitConfObj | |||
return procUnitConfObj | |||
|
r587 | def removeProcUnit(self, id): | |
if id in self.procUnitConfObjDict.keys(): | |||
self.procUnitConfObjDict.pop(id) | |||
|
r577 | def getReadUnitId(self): | |
readUnitConfObj = self.getReadUnitObj() | |||
return readUnitConfObj.id | |||
def getReadUnitObj(self): | |||
for obj in self.procUnitConfObjDict.values(): | |||
if obj.getElementName() == "ReadUnit": | |||
return obj | |||
return None | |||
|
r606 | def getProcUnitObj(self, id=None, name=None): | |
if id != None: | |||
return self.procUnitConfObjDict[id] | |||
if name != None: | |||
return self.getProcUnitObjByName(name) | |||
return None | |||
|
r577 | ||
|
r581 | def getProcUnitObjByName(self, name): | |
for obj in self.procUnitConfObjDict.values(): | |||
if obj.name == name: | |||
return obj | |||
return None | |||
|
r606 | ||
def procUnitItems(self): | |||
return self.procUnitConfObjDict.items() | |||
|
r197 | def makeXml(self): | |
|
r224 | projectElement = Element('Project') | |
|
r197 | projectElement.set('id', str(self.id)) | |
projectElement.set('name', self.name) | |||
projectElement.set('description', self.description) | |||
for procUnitConfObj in self.procUnitConfObjDict.values(): | |||
procUnitConfObj.makeXml(projectElement) | |||
self.projectElement = projectElement | |||
|
r702 | def writeXml(self, filename=None): | |
|
r197 | ||
|
r702 | if filename == None: | |
|
r708 | if self.filename: | |
filename = self.filename | |||
else: | |||
filename = "schain.xml" | |||
|
r702 | ||
if not filename: | |||
print "filename has not been defined. Use setFilename(filename) for do it." | |||
return 0 | |||
|
r687 | abs_file = os.path.abspath(filename) | |
if not os.access(os.path.dirname(abs_file), os.W_OK): | |||
print "No write permission on %s" %os.path.dirname(abs_file) | |||
|
r681 | return 0 | |
|
r197 | ||
|
r687 | if os.path.isfile(abs_file) and not(os.access(abs_file, os.W_OK)): | |
print "File %s already exists and it could not be overwriten" %abs_file | |||
|
r681 | return 0 | |
self.makeXml() | |||
|
r197 | ||
|
r687 | ElementTree(self.projectElement).write(abs_file, method='xml') | |
|
r681 | ||
|
r708 | self.filename = abs_file | |
|
r681 | return 1 | |
|
r197 | ||
|
r702 | def readXml(self, filename = None): | |
|
r830 | ||
if not filename: | |||
print "filename is not defined" | |||
return 0 | |||
|
r687 | abs_file = os.path.abspath(filename) | |
if not os.path.isfile(abs_file): | |||
|
r830 | print "%s file does not exist" %abs_file | |
|
r681 | return 0 | |
|
r197 | self.projectElement = None | |
self.procUnitConfObjDict = {} | |||
|
r735 | try: | |
self.projectElement = ElementTree().parse(abs_file) | |||
except: | |||
print "Error reading %s, verify file format" %filename | |||
return 0 | |||
|
r197 | ||
self.project = self.projectElement.tag | |||
self.id = self.projectElement.get('id') | |||
self.name = self.projectElement.get('name') | |||
self.description = self.projectElement.get('description') | |||
|
r860 | readUnitElementList = self.projectElement.iter(ReadUnitConf().getElementName()) | |
|
r197 | ||
for readUnitElement in readUnitElementList: | |||
readUnitConfObj = ReadUnitConf() | |||
readUnitConfObj.readXml(readUnitElement) | |||
|
r589 | if readUnitConfObj.parentId == None: | |
readUnitConfObj.parentId = self.id | |||
|
r197 | self.procUnitConfObjDict[readUnitConfObj.getId()] = readUnitConfObj | |
|
r860 | procUnitElementList = self.projectElement.iter(ProcUnitConf().getElementName()) | |
|
r197 | ||
for procUnitElement in procUnitElementList: | |||
procUnitConfObj = ProcUnitConf() | |||
procUnitConfObj.readXml(procUnitElement) | |||
|
r589 | if procUnitConfObj.parentId == None: | |
procUnitConfObj.parentId = self.id | |||
|
r197 | self.procUnitConfObjDict[procUnitConfObj.getId()] = procUnitConfObj | |
|
r681 | ||
|
r708 | self.filename = abs_file | |
|
r702 | ||
|
r681 | return 1 | |
|
r197 | def printattr(self): | |
|
r224 | print "Project[%s]: name = %s, description = %s" %(self.id, | |
|
r197 | self.name, | |
self.description) | |||
for procUnitConfObj in self.procUnitConfObjDict.values(): | |||
procUnitConfObj.printattr() | |||
def createObjects(self): | |||
for procUnitConfObj in self.procUnitConfObjDict.values(): | |||
|
r716 | procUnitConfObj.createObjects(self.plotterQueue) | |
|
r197 | ||
|
r487 | def __connect(self, objIN, thisObj): | |
|
r197 | ||
|
r487 | thisObj.setInput(objIN.getOutputObj()) | |
|
r197 | ||
def connectObjects(self): | |||
|
r487 | for thisPUConfObj in self.procUnitConfObjDict.values(): | |
|
r197 | ||
|
r487 | inputId = thisPUConfObj.getInputId() | |
|
r197 | ||
if int(inputId) == 0: | |||
continue | |||
|
r487 | #Get input object | |
|
r197 | puConfINObj = self.procUnitConfObjDict[inputId] | |
|
r487 | puObjIN = puConfINObj.getProcUnitObj() | |
|
r197 | ||
|
r487 | #Get current object | |
thisPUObj = thisPUConfObj.getProcUnitObj() | |||
|
r197 | ||
|
r487 | self.__connect(puObjIN, thisPUObj) | |
|
r197 | ||
|
r719 | def __handleError(self, procUnitConfObj, send_email=True): | |
|
r687 | ||
import socket | |||
err = traceback.format_exception(sys.exc_info()[0], | |||
sys.exc_info()[1], | |||
sys.exc_info()[2]) | |||
|
r735 | print "***** Error occurred in %s *****" %(procUnitConfObj.name) | |
print "***** %s" %err[-1] | |||
|
r719 | message = "".join(err) | |
sys.stderr.write(message) | |||
if not send_email: | |||
return | |||
|
r687 | subject = "SChain v%s: Error running %s\n" %(schainpy.__version__, procUnitConfObj.name) | |
subtitle = "%s: %s\n" %(procUnitConfObj.getElementName() ,procUnitConfObj.name) | |||
subtitle += "Hostname: %s\n" %socket.gethostbyname(socket.gethostname()) | |||
subtitle += "Working directory: %s\n" %os.path.abspath("./") | |||
subtitle += "Configuration file: %s\n" %self.filename | |||
subtitle += "Time: %s\n" %str(datetime.datetime.now()) | |||
readUnitConfObj = self.getReadUnitObj() | |||
if readUnitConfObj: | |||
subtitle += "\nInput parameters:\n" | |||
subtitle += "[Data path = %s]\n" %readUnitConfObj.path | |||
subtitle += "[Data type = %s]\n" %readUnitConfObj.datatype | |||
subtitle += "[Start date = %s]\n" %readUnitConfObj.startDate | |||
subtitle += "[End date = %s]\n" %readUnitConfObj.endDate | |||
subtitle += "[Start time = %s]\n" %readUnitConfObj.startTime | |||
subtitle += "[End time = %s]\n" %readUnitConfObj.endTime | |||
adminObj = schainpy.admin.SchainNotify() | |||
adminObj.sendAlert(message=message, | |||
subject=subject, | |||
subtitle=subtitle, | |||
filename=self.filename) | |||
|
r672 | def isPaused(self): | |
return 0 | |||
def isStopped(self): | |||
return 0 | |||
def runController(self): | |||
""" | |||
returns 0 when this process has been stopped, 1 otherwise | |||
""" | |||
if self.isPaused(): | |||
print "Process suspended" | |||
while True: | |||
sleep(0.1) | |||
if not self.isPaused(): | |||
break | |||
if self.isStopped(): | |||
break | |||
print "Process reinitialized" | |||
if self.isStopped(): | |||
print "Process stopped" | |||
return 0 | |||
return 1 | |||
|
r691 | ||
def setFilename(self, filename): | |||
self.filename = filename | |||
def setPlotterQueue(self, plotter_queue): | |||
|
r716 | raise NotImplementedError, "Use schainpy.controller_api.ControllerThread instead Project class" | |
|
r691 | def getPlotterQueue(self): | |
|
r716 | raise NotImplementedError, "Use schainpy.controller_api.ControllerThread instead Project class" | |
def useExternalPlotter(self): | |||
|
r691 | ||
|
r716 | raise NotImplementedError, "Use schainpy.controller_api.ControllerThread instead Project class" | |
|
r708 | ||
|
r197 | def run(self): | |
|
r568 | ||
|
r672 | print "*"*60 | |
|
r681 | print " Starting SIGNAL CHAIN PROCESSING v%s " %schainpy.__version__ | |
|
r672 | print "*"*60 | |
|
r568 | ||
keyList = self.procUnitConfObjDict.keys() | |||
keyList.sort() | |||
|
r197 | while(True): | |
|
r199 | ||
|
r672 | is_ok = False | |
|
r199 | ||
|
r568 | for procKey in keyList: | |
# print "Running the '%s' process with %s" %(procUnitConfObj.name, procUnitConfObj.id) | |||
procUnitConfObj = self.procUnitConfObjDict[procKey] | |||
|
r672 | ||
try: | |||
sts = procUnitConfObj.run() | |||
is_ok = is_ok or sts | |||
|
r735 | except KeyboardInterrupt: | |
is_ok = False | |||
break | |||
|
r687 | except ValueError, e: | |
sleep(0.5) | |||
|
r741 | self.__handleError(procUnitConfObj, send_email=True) | |
|
r687 | is_ok = False | |
break | |||
|
r672 | except: | |
|
r681 | sleep(0.5) | |
|
r687 | self.__handleError(procUnitConfObj) | |
|
r672 | is_ok = False | |
break | |||
|
r199 | ||
#If every process unit finished so end process | |||
|
r672 | if not(is_ok): | |
|
r735 | # print "Every process unit have finished" | |
|
r199 | break | |
|
r573 | ||
|
r672 | if not self.runController(): | |
|
r577 | break | |
|
r573 | #Closing every process | |
for procKey in keyList: | |||
procUnitConfObj = self.procUnitConfObjDict[procKey] | |||
procUnitConfObj.close() | |||
|
r577 | ||
|
r587 | print "Process finished" | |
|
r573 | ||
|
r691 | def start(self): | |
|
r687 | ||
|
r708 | self.writeXml() | |
|
r691 | ||
|
r573 | self.createObjects() | |
self.connectObjects() | |||
self.run() | |||
|
r596 | ||
|
r197 | if __name__ == '__main__': | |
desc = "Segundo Test" | |||
filename = "schain.xml" | |||
|
r224 | controllerObj = Project() | |
|
r197 | ||
controllerObj.setup(id = '191', name='test01', description=desc) | |||
|
r219 | readUnitConfObj = controllerObj.addReadUnit(datatype='Voltage', | |
path='data/rawdata/', | |||
startDate='2011/01/01', | |||
|
r197 | endDate='2012/12/31', | |
|
r219 | startTime='00:00:00', | |
|
r197 | endTime='23:59:59', | |
|
r224 | online=1, | |
walk=1) | |||
|
r197 | ||
|
r219 | procUnitConfObj0 = controllerObj.addProcUnit(datatype='Voltage', inputId=readUnitConfObj.getId()) | |
|
r197 | ||
|
r219 | opObj10 = procUnitConfObj0.addOperation(name='selectChannels') | |
opObj10.addParameter(name='channelList', value='3,4,5', format='intlist') | |||
opObj10 = procUnitConfObj0.addOperation(name='selectHeights') | |||
opObj10.addParameter(name='minHei', value='90', format='float') | |||
|
r222 | opObj10.addParameter(name='maxHei', value='180', format='float') | |
|
r219 | ||
|
r487 | opObj12 = procUnitConfObj0.addOperation(name='CohInt', optype='external') | |
|
r219 | opObj12.addParameter(name='n', value='10', format='int') | |
procUnitConfObj1 = controllerObj.addProcUnit(datatype='Spectra', inputId=procUnitConfObj0.getId()) | |||
|
r221 | procUnitConfObj1.addParameter(name='nFFTPoints', value='32', format='int') | |
|
r224 | # procUnitConfObj1.addParameter(name='pairList', value='(0,1),(0,2),(1,2)', format='') | |
|
r197 | ||
|
r487 | opObj11 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='external') | |
|
r199 | opObj11.addParameter(name='idfigure', value='1', format='int') | |
|
r222 | opObj11.addParameter(name='wintitle', value='SpectraPlot0', format='str') | |
|
r219 | opObj11.addParameter(name='zmin', value='40', format='int') | |
|
r221 | opObj11.addParameter(name='zmax', value='90', format='int') | |
|
r222 | opObj11.addParameter(name='showprofile', value='1', format='int') | |
|
r636 | ||
|
r197 | print "Escribiendo el archivo XML" | |
controllerObj.writeXml(filename) | |||
print "Leyendo el archivo XML" | |||
controllerObj.readXml(filename) | |||
#controllerObj.printattr() | |||
controllerObj.createObjects() | |||
controllerObj.connectObjects() | |||
controllerObj.run() | |||