controller.py
1337 lines
| 36.8 KiB
| text/x-python
|
PythonLexer
/ schainpy / controller.py
|
r197 | ''' | ||
Created on September , 2012 | ||||
r889 | @author: | |||
|
r197 | ''' | ||
r889 | ||||
|
r672 | import sys | ||
|
r514 | import ast | ||
|
r687 | import datetime | ||
|
r672 | import traceback | ||
|
r898 | import math | ||
|
r931 | import time | ||
|
r1052 | from multiprocessing import Process, cpu_count | ||
|
r672 | |||
|
r681 | from xml.etree.ElementTree import ElementTree, Element, SubElement, tostring | ||
from xml.dom import minidom | ||||
|
r1052 | import schainpy | ||
r1129 | from schainpy.admin import Alarm, SchainWarning | |||
|
r681 | from schainpy.model import * | ||
|
r1052 | from schainpy.utils import log | ||
DTYPES = { | ||||
'Voltage': '.r', | ||||
'Spectra': '.pdata' | ||||
} | ||||
|
r1082 | |||
|
r1052 | def MPProject(project, n=cpu_count()): | ||
''' | ||||
Project wrapper to run schain in n processes | ||||
''' | ||||
rconf = project.getReadUnitObj() | ||||
op = rconf.getOperationObj('run') | ||||
dt1 = op.getParameterValue('startDate') | ||||
dt2 = op.getParameterValue('endDate') | ||||
|
r1112 | tm1 = op.getParameterValue('startTime') | ||
tm2 = op.getParameterValue('endTime') | ||||
r892 | days = (dt2 - dt1).days | |||
|
r1082 | |||
for day in range(days + 1): | ||||
r892 | skip = 0 | |||
cursor = 0 | ||||
processes = [] | ||||
|
r1052 | dt = dt1 + datetime.timedelta(day) | ||
dt_str = dt.strftime('%Y/%m/%d') | ||||
reader = JRODataReader() | ||||
paths, files = reader.searchFilesOffLine(path=rconf.path, | ||||
|
r1082 | startDate=dt, | ||
endDate=dt, | ||||
|
r1112 | startTime=tm1, | ||
endTime=tm2, | ||||
|
r1082 | ext=DTYPES[rconf.datatype]) | ||
|
r1052 | nFiles = len(files) | ||
if nFiles == 0: | ||||
|
r999 | continue | ||
|
r1112 | skip = int(math.ceil(nFiles / n)) | ||
|
r1082 | while nFiles > cursor * skip: | ||
rconf.update(startDate=dt_str, endDate=dt_str, cursor=cursor, | ||||
skip=skip) | ||||
p = project.clone() | ||||
|
r1052 | p.start() | ||
processes.append(p) | ||||
|
r924 | cursor += 1 | ||
def beforeExit(exctype, value, trace): | ||||
r892 | for process in processes: | |||
process.terminate() | ||||
process.join() | ||||
|
r925 | print traceback.print_tb(trace) | ||
|
r957 | |||
|
r924 | sys.excepthook = beforeExit | ||
r892 | ||||
for process in processes: | ||||
process.join() | ||||
|
r924 | process.terminate() | ||
|
r958 | |||
|
r931 | time.sleep(3) | ||
r892 | ||||
|
r1082 | |||
|
r197 | class ParameterConf(): | ||
r889 | ||||
|
r197 | id = None | ||
name = None | ||||
value = None | ||||
|
r199 | format = None | ||
r889 | ||||
|
r529 | __formated_value = None | ||
r889 | ||||
|
r197 | ELEMENTNAME = 'Parameter' | ||
r889 | ||||
|
r197 | def __init__(self): | ||
r889 | ||||
|
r199 | self.format = 'str' | ||
r889 | ||||
|
r197 | def getElementName(self): | ||
r889 | ||||
|
r197 | return self.ELEMENTNAME | ||
r889 | ||||
|
r197 | def getValue(self): | ||
|
r600 | |||
value = self.value | ||||
format = self.format | ||||
r889 | ||||
|
r529 | if self.__formated_value != None: | ||
r889 | ||||
|
r529 | return self.__formated_value | ||
r889 | ||||
r892 | if format == 'obj': | |||
return value | ||||
|
r600 | if format == 'str': | ||
|
r596 | self.__formated_value = str(value) | ||
return self.__formated_value | ||||
r889 | ||||
|
r596 | if value == '': | ||
|
r1082 | raise ValueError, '%s: This parameter value is empty' % self.name | ||
r889 | ||||
|
r600 | if format == 'list': | ||
|
r224 | strList = value.split(',') | ||
r889 | ||||
|
r529 | self.__formated_value = strList | ||
r889 | ||||
|
r529 | return self.__formated_value | ||
r889 | ||||
|
r600 | if format == 'intlist': | ||
|
r1052 | ''' | ||
|
r535 | Example: | ||
value = (0,1,2) | ||||
|
r1052 | ''' | ||
r889 | ||||
|
r735 | new_value = ast.literal_eval(value) | ||
r889 | ||||
|
r735 | if type(new_value) not in (tuple, list): | ||
new_value = [int(new_value)] | ||||
r889 | ||||
|
r735 | self.__formated_value = new_value | ||
r889 | ||||
|
r529 | return self.__formated_value | ||
r889 | ||||
|
r600 | if format == 'floatlist': | ||
|
r1052 | ''' | ||
|
r535 | Example: | ||
value = (0.5, 1.4, 2.7) | ||||
|
r1052 | ''' | ||
r889 | ||||
|
r735 | new_value = ast.literal_eval(value) | ||
r889 | ||||
|
r735 | if type(new_value) not in (tuple, list): | ||
new_value = [float(new_value)] | ||||
r889 | ||||
|
r741 | self.__formated_value = new_value | ||
r889 | ||||
|
r529 | return self.__formated_value | ||
r889 | ||||
|
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]) | ||||
r889 | ||||
|
r529 | self.__formated_value = date | ||
r889 | ||||
|
r529 | return self.__formated_value | ||
r889 | ||||
|
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]) | ||||
r889 | ||||
|
r529 | self.__formated_value = time | ||
r889 | ||||
|
r529 | return self.__formated_value | ||
r889 | ||||
|
r600 | if format == 'pairslist': | ||
|
r1052 | ''' | ||
|
r226 | Example: | ||
value = (0,1),(1,2) | ||||
|
r1052 | ''' | ||
|
r226 | |||
|
r735 | new_value = ast.literal_eval(value) | ||
r889 | ||||
|
r735 | if type(new_value) not in (tuple, list): | ||
|
r1082 | raise ValueError, '%s has to be a tuple or list of pairs' % value | ||
r889 | ||||
|
r735 | if type(new_value[0]) not in (tuple, list): | ||
if len(new_value) != 2: | ||||
|
r1082 | raise ValueError, '%s has to be a tuple or list of pairs' % value | ||
|
r735 | new_value = [new_value] | ||
r889 | ||||
|
r735 | for thisPair in new_value: | ||
if len(thisPair) != 2: | ||||
|
r1082 | raise ValueError, '%s has to be a tuple or list of pairs' % value | ||
r889 | ||||
|
r735 | self.__formated_value = new_value | ||
r889 | ||||
|
r529 | return self.__formated_value | ||
r889 | ||||
|
r600 | if format == 'multilist': | ||
|
r1052 | ''' | ||
|
r514 | Example: | ||
value = (0,1,2),(3,4,5) | ||||
|
r1052 | ''' | ||
|
r514 | multiList = ast.literal_eval(value) | ||
r889 | ||||
|
r600 | if type(multiList[0]) == int: | ||
|
r1052 | multiList = ast.literal_eval('(' + value + ')') | ||
r889 | ||||
|
r529 | self.__formated_value = multiList | ||
r889 | ||||
|
r529 | return self.__formated_value | ||
r889 | ||||
|
r677 | if format == 'bool': | ||
value = int(value) | ||||
r889 | ||||
|
r677 | if format == 'int': | ||
value = float(value) | ||||
r889 | ||||
|
r600 | format_func = eval(format) | ||
r889 | ||||
|
r529 | self.__formated_value = format_func(value) | ||
r889 | ||||
|
r529 | return self.__formated_value | ||
|
r596 | |||
def updateId(self, new_id): | ||||
r889 | ||||
|
r596 | self.id = str(new_id) | ||
r889 | ||||
|
r199 | def setup(self, id, name, value, format='str'): | ||
|
r596 | self.id = str(id) | ||
|
r197 | self.name = name | ||
r892 | if format == 'obj': | |||
self.value = value | ||||
else: | ||||
self.value = str(value) | ||||
|
r535 | self.format = str.lower(format) | ||
r889 | ||||
|
r735 | self.getValue() | ||
r889 | ||||
|
r643 | return 1 | ||
r889 | ||||
|
r577 | def update(self, name, value, format='str'): | ||
r889 | ||||
|
r577 | self.name = name | ||
self.value = str(value) | ||||
self.format = format | ||||
r889 | ||||
|
r197 | def makeXml(self, opElement): | ||
|
r898 | if self.name not in ('queue',): | ||
parmElement = SubElement(opElement, self.ELEMENTNAME) | ||||
parmElement.set('id', str(self.id)) | ||||
parmElement.set('name', self.name) | ||||
parmElement.set('value', self.value) | ||||
parmElement.set('format', self.format) | ||||
r889 | ||||
|
r197 | def readXml(self, parmElement): | ||
r889 | ||||
|
r197 | self.id = parmElement.get('id') | ||
self.name = parmElement.get('name') | ||||
self.value = parmElement.get('value') | ||||
|
r568 | self.format = str.lower(parmElement.get('format')) | ||
r889 | ||||
|
r1082 | # Compatible with old signal chain version | ||
|
r568 | if self.format == 'int' and self.name == 'idfigure': | ||
self.name = 'id' | ||||
r889 | ||||
|
r197 | def printattr(self): | ||
r889 | ||||
|
r1082 | print 'Parameter[%s]: name = %s, value = %s, format = %s' % (self.id, self.name, self.value, self.format) | ||
|
r197 | |||
|
r1052 | class OperationConf(): | ||
r889 | ||||
|
r197 | id = None | ||
name = None | ||||
priority = None | ||||
type = None | ||||
r889 | ||||
|
r197 | parmConfObjList = [] | ||
r889 | ||||
|
r197 | ELEMENTNAME = 'Operation' | ||
r889 | ||||
|
r197 | def __init__(self): | ||
r889 | ||||
|
r589 | self.id = '0' | ||
|
r568 | self.name = None | ||
self.priority = None | ||||
self.type = 'self' | ||||
r889 | ||||
|
r197 | def __getNewId(self): | ||
r889 | ||||
|
r1082 | return int(self.id) * 10 + len(self.parmConfObjList) + 1 | ||
|
r596 | |||
def updateId(self, new_id): | ||||
r889 | ||||
|
r596 | self.id = str(new_id) | ||
r889 | ||||
|
r596 | n = 1 | ||
for parmObj in self.parmConfObjList: | ||||
r889 | ||||
|
r1082 | idParm = str(int(new_id) * 10 + n) | ||
|
r596 | parmObj.updateId(idParm) | ||
r889 | ||||
|
r596 | n += 1 | ||
r889 | ||||
|
r197 | def getElementName(self): | ||
r889 | ||||
|
r197 | return self.ELEMENTNAME | ||
r889 | ||||
|
r197 | def getParameterObjList(self): | ||
r889 | ||||
|
r197 | return self.parmConfObjList | ||
r889 | ||||
|
r577 | def getParameterObj(self, parameterName): | ||
r889 | ||||
|
r577 | for parmConfObj in self.parmConfObjList: | ||
r889 | ||||
|
r577 | if parmConfObj.name != parameterName: | ||
continue | ||||
r889 | ||||
|
r577 | return parmConfObj | ||
r889 | ||||
|
r577 | return None | ||
|
r606 | def getParameterObjfromValue(self, parameterValue): | ||
r889 | ||||
|
r577 | for parmConfObj in self.parmConfObjList: | ||
r889 | ||||
|
r577 | if parmConfObj.getValue() != parameterValue: | ||
continue | ||||
r889 | ||||
|
r577 | return parmConfObj.getValue() | ||
r889 | ||||
|
r577 | return None | ||
r889 | ||||
|
r577 | def getParameterValue(self, parameterName): | ||
r889 | ||||
|
r577 | parameterObj = self.getParameterObj(parameterName) | ||
|
r1082 | |||
|
r1004 | # if not parameterObj: | ||
|
r1011 | # return None | ||
|
r1082 | |||
|
r577 | value = parameterObj.getValue() | ||
r889 | ||||
|
r577 | return value | ||
r889 | ||||
def getKwargs(self): | ||||
kwargs = {} | ||||
for parmConfObj in self.parmConfObjList: | ||||
if self.name == 'run' and parmConfObj.name == 'datatype': | ||||
continue | ||||
kwargs[parmConfObj.name] = parmConfObj.getValue() | ||||
return kwargs | ||||
|
r197 | def setup(self, id, name, priority, type): | ||
r889 | ||||
|
r596 | self.id = str(id) | ||
|
r197 | self.name = name | ||
self.type = type | ||||
self.priority = priority | ||||
r889 | ||||
|
r197 | self.parmConfObjList = [] | ||
r889 | ||||
|
r577 | def removeParameters(self): | ||
r889 | ||||
|
r577 | for obj in self.parmConfObjList: | ||
del obj | ||||
r889 | ||||
|
r577 | self.parmConfObjList = [] | ||
r889 | ||||
|
r199 | def addParameter(self, name, value, format='str'): | ||
|
r1082 | |||
|
r1052 | if value is None: | ||
return None | ||||
|
r197 | id = self.__getNewId() | ||
r889 | ||||
|
r197 | parmConfObj = ParameterConf() | ||
|
r643 | if not parmConfObj.setup(id, name, value, format): | ||
return None | ||||
r889 | ||||
|
r197 | self.parmConfObjList.append(parmConfObj) | ||
r889 | ||||
|
r197 | return parmConfObj | ||
r889 | ||||
|
r577 | def changeParameter(self, name, value, format='str'): | ||
r889 | ||||
|
r577 | parmConfObj = self.getParameterObj(name) | ||
parmConfObj.update(name, value, format) | ||||
r889 | ||||
|
r577 | return parmConfObj | ||
r889 | ||||
|
r681 | def makeXml(self, procUnitElement): | ||
r889 | ||||
|
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)) | ||||
r889 | ||||
|
r197 | for parmConfObj in self.parmConfObjList: | ||
parmConfObj.makeXml(opElement) | ||||
r889 | ||||
|
r197 | def readXml(self, opElement): | ||
r889 | ||||
|
r197 | self.id = opElement.get('id') | ||
self.name = opElement.get('name') | ||||
self.type = opElement.get('type') | ||||
self.priority = opElement.get('priority') | ||||
r889 | ||||
|
r1082 | # Compatible with old signal chain version | ||
# Use of 'run' method instead 'init' | ||||
|
r568 | if self.type == 'self' and self.name == 'init': | ||
self.name = 'run' | ||||
r889 | ||||
|
r197 | self.parmConfObjList = [] | ||
r889 | ||||
|
r860 | parmElementList = opElement.iter(ParameterConf().getElementName()) | ||
r889 | ||||
|
r197 | for parmElement in parmElementList: | ||
parmConfObj = ParameterConf() | ||||
parmConfObj.readXml(parmElement) | ||||
r889 | ||||
|
r1082 | # Compatible with old signal chain version | ||
# If an 'plot' OPERATION is found, changes name operation by the value of its type PARAMETER | ||||
|
r568 | if self.type != 'self' and self.name == 'Plot': | ||
if parmConfObj.format == 'str' and parmConfObj.name == 'type': | ||||
self.name = parmConfObj.value | ||||
continue | ||||
r889 | ||||
|
r568 | self.parmConfObjList.append(parmConfObj) | ||
r889 | ||||
|
r197 | def printattr(self): | ||
r889 | ||||
|
r1082 | print '%s[%s]: name = %s, type = %s, priority = %s' % (self.ELEMENTNAME, | ||
self.id, | ||||
self.name, | ||||
self.type, | ||||
self.priority) | ||||
r889 | ||||
|
r197 | for parmConfObj in self.parmConfObjList: | ||
parmConfObj.printattr() | ||||
r889 | ||||
|
r691 | def createObject(self, plotter_queue=None): | ||
r889 | ||||
|
r924 | if self.type == 'self': | ||
|
r1052 | raise ValueError, 'This operation type cannot be created' | ||
r889 | ||||
|
r1082 | if self.type == 'plotter': | ||
|
r708 | if not plotter_queue: | ||
|
r1052 | raise ValueError, 'plotter_queue is not defined. Use:\nmyProject = Project()\nmyProject.setPlotterQueue(plotter_queue)' | ||
r889 | ||||
|
r691 | opObj = Plotter(self.name, plotter_queue) | ||
r889 | ||||
|
r487 | if self.type == 'external' or self.type == 'other': | ||
|
r924 | |||
|
r197 | className = eval(self.name) | ||
r889 | kwargs = self.getKwargs() | |||
|
r924 | |||
r889 | opObj = className(**kwargs) | |||
|
r197 | return opObj | ||
r889 | ||||
|
r197 | class ProcUnitConf(): | ||
r889 | ||||
|
r197 | id = None | ||
name = None | ||||
|
r199 | datatype = None | ||
|
r197 | inputId = None | ||
|
r577 | parentId = None | ||
r889 | ||||
|
r197 | opConfObjList = [] | ||
r889 | ||||
|
r197 | procUnitObj = None | ||
opObjList = [] | ||||
r889 | ||||
|
r197 | ELEMENTNAME = 'ProcUnit' | ||
r889 | ||||
|
r197 | def __init__(self): | ||
r889 | ||||
|
r197 | self.id = None | ||
|
r199 | self.datatype = None | ||
|
r197 | self.name = None | ||
self.inputId = None | ||||
r889 | ||||
|
r197 | self.opConfObjList = [] | ||
r889 | ||||
|
r197 | self.procUnitObj = None | ||
self.opObjDict = {} | ||||
r889 | ||||
|
r197 | def __getPriority(self): | ||
r889 | ||||
|
r1082 | return len(self.opConfObjList) + 1 | ||
r889 | ||||
|
r197 | def __getNewId(self): | ||
r889 | ||||
|
r1082 | return int(self.id) * 10 + len(self.opConfObjList) + 1 | ||
r889 | ||||
|
r197 | def getElementName(self): | ||
r889 | ||||
|
r197 | return self.ELEMENTNAME | ||
r889 | ||||
|
r197 | def getId(self): | ||
r889 | ||||
|
r589 | return self.id | ||
|
r596 | |||
def updateId(self, new_id, parentId=parentId): | ||||
r889 | ||||
|
r1082 | new_id = int(parentId) * 10 + (int(self.id) % 10) | ||
new_inputId = int(parentId) * 10 + (int(self.inputId) % 10) | ||||
r889 | ||||
|
r1082 | # If this proc unit has not inputs | ||
|
r596 | if self.inputId == '0': | ||
new_inputId = 0 | ||||
r889 | ||||
|
r596 | n = 1 | ||
for opConfObj in self.opConfObjList: | ||||
r889 | ||||
|
r1082 | idOp = str(int(new_id) * 10 + n) | ||
|
r596 | opConfObj.updateId(idOp) | ||
r889 | ||||
|
r596 | n += 1 | ||
r889 | ||||
|
r596 | self.parentId = str(parentId) | ||
self.id = str(new_id) | ||||
self.inputId = str(new_inputId) | ||||
r889 | ||||
|
r197 | def getInputId(self): | ||
r889 | ||||
|
r589 | return self.inputId | ||
r889 | ||||
|
r197 | def getOperationObjList(self): | ||
r889 | ||||
|
r197 | return self.opConfObjList | ||
r889 | ||||
|
r577 | def getOperationObj(self, name=None): | ||
r889 | ||||
|
r577 | for opConfObj in self.opConfObjList: | ||
r889 | ||||
|
r577 | if opConfObj.name != name: | ||
continue | ||||
r889 | ||||
|
r577 | return opConfObj | ||
r889 | ||||
|
r577 | return None | ||
r889 | ||||
|
r606 | def getOpObjfromParamValue(self, value=None): | ||
r889 | ||||
|
r577 | for opConfObj in self.opConfObjList: | ||
if opConfObj.getParameterObjfromValue(parameterValue=value) != value: | ||||
continue | ||||
return opConfObj | ||||
return None | ||||
r889 | ||||
|
r197 | def getProcUnitObj(self): | ||
r889 | ||||
|
r197 | return self.procUnitObj | ||
r889 | ||||
|
r577 | def setup(self, id, name, datatype, inputId, parentId=None): | ||
r889 | ||||
|
r1082 | # Compatible with old signal chain version | ||
if datatype == None and name == None: | ||||
|
r1052 | raise ValueError, 'datatype or name should be defined' | ||
r889 | ||||
|
r1082 | if name == None: | ||
|
r596 | if 'Proc' in datatype: | ||
name = datatype | ||||
else: | ||||
|
r1082 | name = '%sProc' % (datatype) | ||
r889 | ||||
|
r1082 | if datatype == None: | ||
datatype = name.replace('Proc', '') | ||||
r889 | ||||
|
r596 | self.id = str(id) | ||
|
r197 | self.name = name | ||
|
r199 | self.datatype = datatype | ||
|
r197 | self.inputId = inputId | ||
|
r577 | self.parentId = parentId | ||
r889 | ||||
|
r197 | self.opConfObjList = [] | ||
r889 | ||||
|
r487 | self.addOperation(name='run', optype='self') | ||
r889 | ||||
|
r577 | def removeOperations(self): | ||
r889 | ||||
|
r577 | for obj in self.opConfObjList: | ||
del obj | ||||
r889 | ||||
|
r577 | self.opConfObjList = [] | ||
self.addOperation(name='run') | ||||
r889 | ||||
|
r219 | def addParameter(self, **kwargs): | ||
|
r580 | ''' | ||
|
r1052 | Add parameters to 'run' operation | ||
|
r580 | ''' | ||
|
r219 | opObj = self.opConfObjList[0] | ||
r889 | ||||
|
r219 | opObj.addParameter(**kwargs) | ||
r889 | ||||
|
r219 | return opObj | ||
r889 | ||||
|
r197 | def addOperation(self, name, optype='self'): | ||
r889 | ||||
|
r197 | id = self.__getNewId() | ||
r889 | priority = self.__getPriority() | |||
|
r197 | opConfObj = OperationConf() | ||
opConfObj.setup(id, name=name, priority=priority, type=optype) | ||||
r889 | ||||
|
r197 | self.opConfObjList.append(opConfObj) | ||
r889 | ||||
|
r197 | return opConfObj | ||
r889 | ||||
|
r681 | def makeXml(self, projectElement): | ||
r889 | ||||
|
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)) | ||||
r889 | ||||
|
r197 | for opConfObj in self.opConfObjList: | ||
|
r681 | opConfObj.makeXml(procUnitElement) | ||
r889 | ||||
|
r197 | def readXml(self, upElement): | ||
r889 | ||||
|
r197 | self.id = upElement.get('id') | ||
self.name = upElement.get('name') | ||||
|
r199 | self.datatype = upElement.get('datatype') | ||
|
r197 | self.inputId = upElement.get('inputId') | ||
r889 | ||||
|
r1052 | if self.ELEMENTNAME == 'ReadUnit': | ||
self.datatype = self.datatype.replace('Reader', '') | ||||
r889 | ||||
|
r1052 | if self.ELEMENTNAME == 'ProcUnit': | ||
self.datatype = self.datatype.replace('Proc', '') | ||||
r889 | ||||
|
r589 | if self.inputId == 'None': | ||
self.inputId = '0' | ||||
r889 | ||||
|
r197 | self.opConfObjList = [] | ||
r889 | ||||
|
r860 | opElementList = upElement.iter(OperationConf().getElementName()) | ||
r889 | ||||
|
r197 | for opElement in opElementList: | ||
opConfObj = OperationConf() | ||||
opConfObj.readXml(opElement) | ||||
self.opConfObjList.append(opConfObj) | ||||
r889 | ||||
|
r197 | def printattr(self): | ||
r889 | ||||
|
r1082 | print '%s[%s]: name = %s, datatype = %s, inputId = %s' % (self.ELEMENTNAME, | ||
self.id, | ||||
self.name, | ||||
self.datatype, | ||||
self.inputId) | ||||
|
r197 | for opConfObj in self.opConfObjList: | ||
opConfObj.printattr() | ||||
r889 | ||||
def getKwargs(self): | ||||
opObj = self.opConfObjList[0] | ||||
kwargs = opObj.getKwargs() | ||||
return kwargs | ||||
|
r691 | def createObjects(self, plotter_queue=None): | ||
r889 | ||||
|
r197 | className = eval(self.name) | ||
r889 | kwargs = self.getKwargs() | |||
procUnitObj = className(**kwargs) | ||||
|
r924 | for opConfObj in self.opConfObjList: | ||
|
r1082 | if opConfObj.type == 'self' and self.name == 'run': | ||
|
r906 | continue | ||
|
r1082 | elif opConfObj.type == 'self': | ||
procUnitObj.addOperationKwargs( | ||||
opConfObj.id, **opConfObj.getKwargs()) | ||||
|
r197 | continue | ||
r889 | ||||
|
r691 | opObj = opConfObj.createObject(plotter_queue) | ||
r889 | ||||
|
r197 | self.opObjDict[opConfObj.id] = opObj | ||
|
r924 | |||
|
r197 | procUnitObj.addOperation(opObj, opConfObj.id) | ||
r889 | ||||
|
r197 | self.procUnitObj = procUnitObj | ||
r889 | ||||
|
r197 | return procUnitObj | ||
r889 | ||||
|
r197 | def run(self): | ||
r889 | ||||
|
r672 | is_ok = False | ||
r889 | ||||
|
r197 | for opConfObj in self.opConfObjList: | ||
r889 | ||||
|
r197 | kwargs = {} | ||
for parmConfObj in opConfObj.getParameterObjList(): | ||||
|
r577 | if opConfObj.name == 'run' and parmConfObj.name == 'datatype': | ||
continue | ||||
r889 | ||||
|
r197 | kwargs[parmConfObj.name] = parmConfObj.getValue() | ||
r889 | ||||
|
r1082 | sts = self.procUnitObj.call(opType=opConfObj.type, | ||
opName=opConfObj.name, | ||||
opId=opConfObj.id) | ||||
|
r672 | is_ok = is_ok or sts | ||
r889 | ||||
|
r672 | return is_ok | ||
|
r573 | |||
def close(self): | ||||
r889 | ||||
|
r577 | for opConfObj in self.opConfObjList: | ||
if opConfObj.type == 'self': | ||||
continue | ||||
r889 | ||||
|
r577 | opObj = self.procUnitObj.getOperationObj(opConfObj.id) | ||
opObj.close() | ||||
r889 | ||||
|
r577 | self.procUnitObj.close() | ||
r889 | ||||
|
r573 | return | ||
r889 | ||||
|
r1082 | |||
|
r197 | class ReadUnitConf(ProcUnitConf): | ||
r889 | ||||
|
r197 | path = None | ||
startDate = None | ||||
endDate = None | ||||
startTime = None | ||||
endTime = None | ||||
r889 | ||||
|
r197 | ELEMENTNAME = 'ReadUnit' | ||
r889 | ||||
|
r197 | def __init__(self): | ||
r889 | ||||
|
r197 | self.id = None | ||
|
r199 | self.datatype = None | ||
|
r197 | self.name = None | ||
|
r589 | self.inputId = None | ||
r889 | ||||
|
r589 | self.parentId = None | ||
r889 | ||||
|
r197 | self.opConfObjList = [] | ||
self.opObjList = [] | ||||
r889 | ||||
|
r197 | def getElementName(self): | ||
r889 | ||||
|
r197 | return self.ELEMENTNAME | ||
r889 | ||||
|
r1052 | def setup(self, id, name, datatype, path='', startDate='', endDate='', | ||
startTime='', endTime='', parentId=None, server=None, **kwargs): | ||||
|
r1082 | # Compatible with old signal chain version | ||
if datatype == None and name == None: | ||||
|
r1052 | raise ValueError, 'datatype or name should be defined' | ||
|
r1088 | if name == None: | ||
|
r596 | if 'Reader' in datatype: | ||
name = datatype | ||||
|
r1088 | datatype = name.replace('Reader','') | ||
|
r596 | else: | ||
|
r1088 | name = '{}Reader'.format(datatype) | ||
if datatype == None: | ||||
if 'Reader' in name: | ||||
datatype = name.replace('Reader','') | ||||
else: | ||||
datatype = name | ||||
name = '{}Reader'.format(name) | ||||
r889 | ||||
|
r197 | self.id = id | ||
self.name = name | ||||
|
r199 | self.datatype = datatype | ||
|
r963 | if path != '': | ||
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 | ||||
|
r963 | self.server = server | ||
|
r224 | self.addRunOperation(**kwargs) | ||
r889 | ||||
|
r1052 | def update(self, **kwargs): | ||
|
r589 | |||
|
r1052 | if 'datatype' in kwargs: | ||
datatype = kwargs.pop('datatype') | ||||
|
r589 | if 'Reader' in datatype: | ||
|
r1052 | self.name = datatype | ||
|
r589 | else: | ||
|
r1082 | self.name = '%sReader' % (datatype) | ||
|
r1052 | self.datatype = self.name.replace('Reader', '') | ||
r889 | ||||
|
r1082 | attrs = ('path', 'startDate', 'endDate', | ||
'startTime', 'endTime', 'parentId') | ||||
|
r1052 | for attr in attrs: | ||
if attr in kwargs: | ||||
setattr(self, attr, kwargs.pop(attr)) | ||||
|
r1082 | |||
|
r596 | self.inputId = '0' | ||
|
r577 | self.updateRunOperation(**kwargs) | ||
r889 | ||||
|
r687 | def removeOperations(self): | ||
r889 | ||||
|
r687 | for obj in self.opConfObjList: | ||
del obj | ||||
r889 | ||||
|
r687 | self.opConfObjList = [] | ||
r889 | ||||
|
r224 | def addRunOperation(self, **kwargs): | ||
r889 | ||||
|
r1082 | opObj = self.addOperation(name='run', optype='self') | ||
r889 | ||||
|
r963 | if self.server is None: | ||
|
r1082 | opObj.addParameter( | ||
name='datatype', value=self.datatype, format='str') | ||||
|
r1052 | opObj.addParameter(name='path', value=self.path, format='str') | ||
|
r1082 | 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') | ||||
|
r963 | for key, value in kwargs.items(): | ||
|
r1082 | opObj.addParameter(name=key, value=value, | ||
format=type(value).__name__) | ||||
|
r963 | else: | ||
|
r1082 | opObj.addParameter(name='server', value=self.server, format='str') | ||
r889 | ||||
|
r197 | return opObj | ||
r889 | ||||
|
r577 | def updateRunOperation(self, **kwargs): | ||
r889 | ||||
|
r1052 | opObj = self.getOperationObj(name='run') | ||
|
r577 | opObj.removeParameters() | ||
r889 | ||||
|
r1052 | opObj.addParameter(name='datatype', value=self.datatype, format='str') | ||
opObj.addParameter(name='path', value=self.path, format='str') | ||||
|
r1082 | opObj.addParameter( | ||
name='startDate', value=self.startDate, format='date') | ||||
|
r1052 | opObj.addParameter(name='endDate', value=self.endDate, format='date') | ||
|
r1082 | opObj.addParameter( | ||
name='startTime', value=self.startTime, format='time') | ||||
|
r1052 | opObj.addParameter(name='endTime', value=self.endTime, format='time') | ||
|
r1082 | |||
|
r577 | for key, value in kwargs.items(): | ||
|
r1082 | opObj.addParameter(name=key, value=value, | ||
format=type(value).__name__) | ||||
r889 | ||||
|
r577 | return opObj | ||
|
r1082 | |||
|
r681 | def readXml(self, upElement): | ||
r889 | ||||
|
r681 | self.id = upElement.get('id') | ||
self.name = upElement.get('name') | ||||
self.datatype = upElement.get('datatype') | ||||
self.inputId = upElement.get('inputId') | ||||
r889 | ||||
|
r1052 | if self.ELEMENTNAME == 'ReadUnit': | ||
self.datatype = self.datatype.replace('Reader', '') | ||||
r889 | ||||
|
r681 | if self.inputId == 'None': | ||
self.inputId = '0' | ||||
r889 | ||||
|
r681 | self.opConfObjList = [] | ||
r889 | ||||
|
r860 | opElementList = upElement.iter(OperationConf().getElementName()) | ||
r889 | ||||
|
r681 | for opElement in opElementList: | ||
opConfObj = OperationConf() | ||||
opConfObj.readXml(opElement) | ||||
self.opConfObjList.append(opConfObj) | ||||
r889 | ||||
|
r681 | 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') | ||||
r889 | ||||
|
r1082 | |||
|
r1040 | class Project(Process): | ||
|
r1052 | |||
|
r197 | id = None | ||
|
r1052 | # name = None | ||
|
r197 | description = None | ||
|
r681 | filename = None | ||
r889 | ||||
|
r197 | procUnitConfObjDict = None | ||
r889 | ||||
|
r224 | ELEMENTNAME = 'Project' | ||
r889 | ||||
|
r716 | plotterQueue = None | ||
r889 | ||||
|
r1052 | def __init__(self, plotter_queue=None): | ||
|
r1040 | Process.__init__(self) | ||
|
r1126 | self.id = None | ||
|
r197 | self.description = None | ||
|
r1126 | self.email = None | ||
r1130 | self.alarm = None | |||
|
r716 | self.plotterQueue = plotter_queue | ||
|
r197 | self.procUnitConfObjDict = {} | ||
|
r1052 | |||
|
r197 | def __getNewId(self): | ||
r889 | ||||
|
r764 | idList = self.procUnitConfObjDict.keys() | ||
r889 | ||||
|
r1082 | id = int(self.id) * 10 | ||
r889 | ||||
|
r764 | while True: | ||
id += 1 | ||||
r889 | ||||
|
r764 | if str(id) in idList: | ||
continue | ||||
r889 | ||||
|
r764 | break | ||
r889 | ||||
|
r197 | return str(id) | ||
r889 | ||||
|
r197 | def getElementName(self): | ||
r889 | ||||
|
r197 | return self.ELEMENTNAME | ||
|
r577 | |||
def getId(self): | ||||
r889 | ||||
|
r577 | return self.id | ||
r889 | ||||
|
r596 | def updateId(self, new_id): | ||
r889 | ||||
|
r596 | self.id = str(new_id) | ||
r889 | ||||
|
r596 | keyList = self.procUnitConfObjDict.keys() | ||
keyList.sort() | ||||
r889 | ||||
|
r596 | n = 1 | ||
newProcUnitConfObjDict = {} | ||||
r889 | ||||
|
r596 | for procKey in keyList: | ||
r889 | ||||
|
r596 | procUnitConfObj = self.procUnitConfObjDict[procKey] | ||
|
r1082 | idProcUnit = str(int(self.id) * 10 + n) | ||
procUnitConfObj.updateId(idProcUnit, parentId=self.id) | ||||
|
r596 | newProcUnitConfObjDict[idProcUnit] = procUnitConfObj | ||
n += 1 | ||||
r889 | ||||
|
r596 | self.procUnitConfObjDict = newProcUnitConfObjDict | ||
r889 | ||||
r1130 | def setup(self, id, name='', description='', email=None, alarm=[3]): | |||
r889 | ||||
|
r1052 | |||
|
r1082 | print '*' * 60 | ||
|
r1052 | print ' Starting SIGNAL CHAIN PROCESSING v%s ' % schainpy.__version__ | ||
|
r1082 | print '*' * 60 | ||
|
r1052 | |||
|
r596 | self.id = str(id) | ||
|
r1126 | self.description = description | ||
self.email = email | ||||
self.alarm = alarm | ||||
|
r577 | |||
|
r1126 | def update(self, **kwargs): | ||
r889 | ||||
r1133 | for key, value in kwargs.items(): | |||
|
r1126 | setattr(self, key, value) | ||
r889 | ||||
|
r1052 | def clone(self): | ||
p = Project() | ||||
p.procUnitConfObjDict = self.procUnitConfObjDict | ||||
return p | ||||
|
r687 | def addReadUnit(self, id=None, datatype=None, name=None, **kwargs): | ||
|
r1052 | |||
|
r687 | if id is None: | ||
idReadUnit = self.__getNewId() | ||||
else: | ||||
idReadUnit = str(id) | ||||
r889 | ||||
|
r197 | readUnitConfObj = ReadUnitConf() | ||
|
r1082 | readUnitConfObj.setup(idReadUnit, name, datatype, | ||
parentId=self.id, **kwargs) | ||||
r889 | ||||
|
r197 | self.procUnitConfObjDict[readUnitConfObj.getId()] = readUnitConfObj | ||
r889 | ||||
|
r197 | return readUnitConfObj | ||
r889 | ||||
|
r589 | def addProcUnit(self, inputId='0', datatype=None, name=None): | ||
r889 | ||||
|
r589 | idProcUnit = self.__getNewId() | ||
r889 | ||||
|
r197 | procUnitConfObj = ProcUnitConf() | ||
|
r1082 | procUnitConfObj.setup(idProcUnit, name, datatype, | ||
inputId, parentId=self.id) | ||||
r889 | ||||
|
r197 | self.procUnitConfObjDict[procUnitConfObj.getId()] = procUnitConfObj | ||
r889 | ||||
|
r197 | return procUnitConfObj | ||
r889 | ||||
|
r587 | def removeProcUnit(self, id): | ||
r889 | ||||
|
r587 | if id in self.procUnitConfObjDict.keys(): | ||
self.procUnitConfObjDict.pop(id) | ||||
r889 | ||||
|
r577 | def getReadUnitId(self): | ||
r889 | ||||
|
r577 | readUnitConfObj = self.getReadUnitObj() | ||
r889 | ||||
|
r577 | return readUnitConfObj.id | ||
r889 | ||||
|
r577 | def getReadUnitObj(self): | ||
r889 | ||||
|
r577 | for obj in self.procUnitConfObjDict.values(): | ||
|
r1052 | if obj.getElementName() == 'ReadUnit': | ||
|
r577 | return obj | ||
r889 | ||||
|
r577 | return None | ||
r889 | ||||
|
r606 | def getProcUnitObj(self, id=None, name=None): | ||
r889 | ||||
|
r606 | if id != None: | ||
return self.procUnitConfObjDict[id] | ||||
r889 | ||||
|
r606 | if name != None: | ||
return self.getProcUnitObjByName(name) | ||||
r889 | ||||
|
r606 | return None | ||
r889 | ||||
|
r581 | def getProcUnitObjByName(self, name): | ||
r889 | ||||
|
r581 | for obj in self.procUnitConfObjDict.values(): | ||
if obj.name == name: | ||||
return obj | ||||
r889 | ||||
|
r581 | return None | ||
r889 | ||||
|
r606 | def procUnitItems(self): | ||
r889 | ||||
|
r606 | return self.procUnitConfObjDict.items() | ||
r889 | ||||
def makeXml(self): | ||||
|
r224 | projectElement = Element('Project') | ||
|
r197 | projectElement.set('id', str(self.id)) | ||
projectElement.set('name', self.name) | ||||
projectElement.set('description', self.description) | ||||
r889 | ||||
|
r197 | for procUnitConfObj in self.procUnitConfObjDict.values(): | ||
procUnitConfObj.makeXml(projectElement) | ||||
r889 | ||||
|
r197 | self.projectElement = projectElement | ||
r889 | ||||
|
r702 | def writeXml(self, filename=None): | ||
r889 | ||||
|
r702 | if filename == None: | ||
|
r708 | if self.filename: | ||
filename = self.filename | ||||
else: | ||||
|
r1052 | filename = 'schain.xml' | ||
r889 | ||||
|
r702 | if not filename: | ||
|
r1052 | print 'filename has not been defined. Use setFilename(filename) for do it.' | ||
|
r702 | return 0 | ||
r889 | ||||
|
r687 | abs_file = os.path.abspath(filename) | ||
r889 | ||||
|
r687 | if not os.access(os.path.dirname(abs_file), os.W_OK): | ||
|
r1082 | print 'No write permission on %s' % os.path.dirname(abs_file) | ||
|
r681 | return 0 | ||
r889 | ||||
|
r687 | if os.path.isfile(abs_file) and not(os.access(abs_file, os.W_OK)): | ||
|
r1082 | print 'File %s already exists and it could not be overwriten' % abs_file | ||
|
r681 | return 0 | ||
r889 | ||||
|
r681 | self.makeXml() | ||
r889 | ||||
|
r687 | ElementTree(self.projectElement).write(abs_file, method='xml') | ||
r889 | ||||
|
r708 | self.filename = abs_file | ||
r889 | ||||
|
r681 | return 1 | ||
|
r197 | |||
|
r1082 | def readXml(self, filename=None): | ||
r889 | ||||
|
r830 | if not filename: | ||
|
r1052 | print 'filename is not defined' | ||
|
r830 | return 0 | ||
r889 | ||||
|
r687 | abs_file = os.path.abspath(filename) | ||
r889 | ||||
|
r687 | if not os.path.isfile(abs_file): | ||
|
r1082 | print '%s file does not exist' % abs_file | ||
|
r681 | return 0 | ||
r889 | ||||
|
r197 | self.projectElement = None | ||
self.procUnitConfObjDict = {} | ||||
r889 | ||||
|
r735 | try: | ||
self.projectElement = ElementTree().parse(abs_file) | ||||
except: | ||||
|
r1082 | print 'Error reading %s, verify file format' % filename | ||
|
r735 | return 0 | ||
r889 | ||||
|
r197 | self.project = self.projectElement.tag | ||
r889 | ||||
|
r197 | self.id = self.projectElement.get('id') | ||
self.name = self.projectElement.get('name') | ||||
|
r1082 | self.description = self.projectElement.get('description') | ||
readUnitElementList = self.projectElement.iter( | ||||
ReadUnitConf().getElementName()) | ||||
r889 | ||||
|
r197 | for readUnitElement in readUnitElementList: | ||
readUnitConfObj = ReadUnitConf() | ||||
readUnitConfObj.readXml(readUnitElement) | ||||
r889 | ||||
|
r589 | if readUnitConfObj.parentId == None: | ||
readUnitConfObj.parentId = self.id | ||||
r889 | ||||
|
r197 | self.procUnitConfObjDict[readUnitConfObj.getId()] = readUnitConfObj | ||
r889 | ||||
|
r1082 | procUnitElementList = self.projectElement.iter( | ||
ProcUnitConf().getElementName()) | ||||
r889 | ||||
|
r197 | for procUnitElement in procUnitElementList: | ||
procUnitConfObj = ProcUnitConf() | ||||
procUnitConfObj.readXml(procUnitElement) | ||||
r889 | ||||
|
r589 | if procUnitConfObj.parentId == None: | ||
procUnitConfObj.parentId = self.id | ||||
r889 | ||||
|
r197 | self.procUnitConfObjDict[procUnitConfObj.getId()] = procUnitConfObj | ||
r889 | ||||
|
r708 | self.filename = abs_file | ||
r889 | ||||
|
r681 | return 1 | ||
r889 | ||||
|
r197 | def printattr(self): | ||
r889 | ||||
|
r1082 | print 'Project[%s]: name = %s, description = %s' % (self.id, | ||
self.name, | ||||
self.description) | ||||
|
r197 | for procUnitConfObj in self.procUnitConfObjDict.values(): | ||
procUnitConfObj.printattr() | ||||
r889 | ||||
|
r197 | def createObjects(self): | ||
r889 | ||||
|
r197 | for procUnitConfObj in self.procUnitConfObjDict.values(): | ||
|
r716 | procUnitConfObj.createObjects(self.plotterQueue) | ||
r889 | ||||
|
r487 | def __connect(self, objIN, thisObj): | ||
r889 | ||||
|
r487 | thisObj.setInput(objIN.getOutputObj()) | ||
r889 | ||||
|
r197 | def connectObjects(self): | ||
r889 | ||||
|
r487 | for thisPUConfObj in self.procUnitConfObjDict.values(): | ||
r889 | ||||
|
r487 | inputId = thisPUConfObj.getInputId() | ||
r889 | ||||
|
r197 | if int(inputId) == 0: | ||
continue | ||||
r889 | ||||
|
r1082 | # Get input object | ||
|
r197 | puConfINObj = self.procUnitConfObjDict[inputId] | ||
|
r487 | puObjIN = puConfINObj.getProcUnitObj() | ||
r889 | ||||
|
r1082 | # Get current object | ||
|
r487 | thisPUObj = thisPUConfObj.getProcUnitObj() | ||
r889 | ||||
|
r487 | self.__connect(puObjIN, thisPUObj) | ||
r889 | ||||
r1130 | def __handleError(self, procUnitConfObj, modes=None, stdout=True): | |||
r889 | ||||
|
r687 | import socket | ||
r889 | ||||
r1129 | if modes is None: | |||
modes = self.alarm | ||||
|
r687 | err = traceback.format_exception(sys.exc_info()[0], | ||
|
r1082 | sys.exc_info()[1], | ||
sys.exc_info()[2]) | ||||
r1128 | ||||
log.error('{}'.format(err[-1]), procUnitConfObj.name) | ||||
|
r735 | |||
|
r1052 | message = ''.join(err) | ||
r889 | ||||
r1130 | if stdout: | |||
sys.stderr.write(message) | ||||
r889 | ||||
|
r1082 | subject = 'SChain v%s: Error running %s\n' % ( | ||
schainpy.__version__, procUnitConfObj.name) | ||||
r889 | ||||
|
r1082 | 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()) | ||||
r889 | ||||
|
r687 | readUnitConfObj = self.getReadUnitObj() | ||
if readUnitConfObj: | ||||
|
r1052 | subtitle += '\nInput parameters:\n' | ||
|
r1082 | 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 | ||||
r889 | ||||
r1129 | a = Alarm( | |||
modes=modes, | ||||
|
r1126 | email=self.email, | ||
message=message, | ||||
subject=subject, | ||||
subtitle=subtitle, | ||||
filename=self.filename | ||||
) | ||||
|
r1082 | |||
r1130 | return a | |||
r1129 | ||||
|
r672 | def isPaused(self): | ||
return 0 | ||||
r889 | ||||
|
r672 | def isStopped(self): | ||
return 0 | ||||
r889 | ||||
|
r672 | def runController(self): | ||
|
r1052 | ''' | ||
|
r672 | returns 0 when this process has been stopped, 1 otherwise | ||
|
r1052 | ''' | ||
r889 | ||||
|
r672 | if self.isPaused(): | ||
|
r1052 | print 'Process suspended' | ||
r889 | ||||
|
r672 | while True: | ||
|
r1052 | time.sleep(0.1) | ||
r889 | ||||
|
r672 | if not self.isPaused(): | ||
break | ||||
r889 | ||||
|
r672 | if self.isStopped(): | ||
break | ||||
r889 | ||||
|
r1052 | print 'Process reinitialized' | ||
r889 | ||||
|
r672 | if self.isStopped(): | ||
|
r1052 | print 'Process stopped' | ||
|
r672 | return 0 | ||
r889 | ||||
|
r672 | return 1 | ||
|
r691 | |||
def setFilename(self, filename): | ||||
r889 | ||||
|
r691 | self.filename = filename | ||
r889 | ||||
|
r691 | def setPlotterQueue(self, plotter_queue): | ||
r889 | ||||
|
r1052 | raise NotImplementedError, 'Use schainpy.controller_api.ControllerThread instead Project class' | ||
|
r716 | |||
|
r691 | def getPlotterQueue(self): | ||
r889 | ||||
|
r1052 | raise NotImplementedError, 'Use schainpy.controller_api.ControllerThread instead Project class' | ||
|
r716 | |||
def useExternalPlotter(self): | ||||
r889 | ||||
|
r1052 | raise NotImplementedError, 'Use schainpy.controller_api.ControllerThread instead Project class' | ||
r889 | ||||
|
r1052 | def run(self): | ||
|
r1004 | |||
|
r1052 | log.success('Starting {}'.format(self.name)) | ||
|
r1112 | self.start_time = time.time() | ||
|
r1040 | self.createObjects() | ||
self.connectObjects() | ||||
r889 | ||||
|
r568 | keyList = self.procUnitConfObjDict.keys() | ||
keyList.sort() | ||||
r889 | ||||
r1130 | err = None | |||
|
r197 | while(True): | ||
r889 | ||||
|
r672 | is_ok = False | ||
r889 | ||||
|
r568 | for procKey in keyList: | ||
r889 | ||||
|
r568 | procUnitConfObj = self.procUnitConfObjDict[procKey] | ||
r889 | ||||
|
r672 | try: | ||
sts = procUnitConfObj.run() | ||||
is_ok = is_ok or sts | ||||
r1129 | except SchainWarning: | |||
r1130 | err = self.__handleError(procUnitConfObj, modes=[2, 3], stdout=False) | |||
|
r735 | except KeyboardInterrupt: | ||
is_ok = False | ||||
break | ||||
|
r687 | except ValueError, e: | ||
|
r1052 | time.sleep(0.5) | ||
r1130 | err = self.__handleError(procUnitConfObj) | |||
|
r687 | is_ok = False | ||
break | ||||
|
r672 | except: | ||
|
r1052 | time.sleep(0.5) | ||
r1130 | err = self.__handleError(procUnitConfObj) | |||
|
r672 | is_ok = False | ||
break | ||||
r889 | ||||
|
r1082 | # If every process unit finished so end process | ||
|
r672 | if not(is_ok): | ||
|
r199 | break | ||
|
r573 | |||
|
r672 | if not self.runController(): | ||
|
r577 | break | ||
r889 | ||||
|
r1082 | # Closing every process | ||
|
r573 | for procKey in keyList: | ||
procUnitConfObj = self.procUnitConfObjDict[procKey] | ||||
procUnitConfObj.close() | ||||
|
r1052 | |||
r1130 | if err is not None: | |||
err.start() | ||||
# err.join() | ||||
|
r1112 | log.success('{} finished (time: {}s)'.format( | ||
self.name, | ||||
time.time()-self.start_time)) | ||||