##// END OF EJS Templates
This is the new organization by packages and scripts for Signal Chain, this version contains new features and bugs fixed until August 2014
This is the new organization by packages and scripts for Signal Chain, this version contains new features and bugs fixed until August 2014

File last commit:

r487:89975db10cce
r487:89975db10cce
Show More
controller.py
745 lines | 24.5 KiB | text/x-python | PythonLexer
'''
Created on September , 2012
@author:
'''
from xml.etree.ElementTree import Element, SubElement, ElementTree
from xml.etree import ElementTree as ET
from xml.dom import minidom
import datetime
from model import *
def prettify(elem):
"""Return a pretty-printed XML string for the Element.
"""
rough_string = ET.tostring(elem, 'utf-8')
reparsed = minidom.parseString(rough_string)
return reparsed.toprettyxml(indent=" ")
class ParameterConf():
id = None
name = None
value = None
format = None
__value = None
ELEMENTNAME = 'Parameter'
def __init__(self):
self.format = 'str'
def getElementName(self):
return self.ELEMENTNAME
def getValue(self):
if self.__value != None:
return self.__value
value = self.value
if self.format == 'list':
strList = value.split(',')
return strList
if self.format == 'intlist':
strList = value.split(',')
intList = [int(x) for x in strList]
return intList
if self.format == 'floatlist':
strList = value.split(',')
floatList = [float(x) for x in strList]
return floatList
if self.format == 'date':
strList = value.split('/')
intList = [int(x) for x in strList]
date = datetime.date(intList[0], intList[1], intList[2])
return date
if self.format == 'time':
strList = value.split(':')
intList = [int(x) for x in strList]
time = datetime.time(intList[0], intList[1], intList[2])
return time
if self.format == 'bool':
value = int(value)
if self.format == 'pairsList':
"""
Example:
value = (0,1),(1,2)
"""
value = value.replace('(', '')
value = value.replace(')', '')
strList = value.split(',')
intList = [int(item) for item in strList]
pairList = []
for i in range(len(intList)/2):
pairList.append((intList[i*2], intList[i*2 + 1]))
return pairList
func = eval(self.format)
self.__value = func(value)
return self.__value
def setup(self, id, name, value, format='str'):
self.id = id
self.name = name
self.value = str(value)
self.format = format
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)
parmElement.set('format', self.format)
def readXml(self, parmElement):
self.id = parmElement.get('id')
self.name = parmElement.get('name')
self.value = parmElement.get('value')
self.format = parmElement.get('format')
def printattr(self):
print "Parameter[%s]: name = %s, value = %s, format = %s" %(self.id, self.name, self.value, self.format)
class OperationConf():
id = None
name = None
priority = None
type = None
parmConfObjList = []
ELEMENTNAME = 'Operation'
def __init__(self):
id = 0
name = None
priority = None
type = 'self'
def __getNewId(self):
return int(self.id)*10 + len(self.parmConfObjList) + 1
def getElementName(self):
return self.ELEMENTNAME
def getParameterObjList(self):
return self.parmConfObjList
def setup(self, id, name, priority, type):
self.id = id
self.name = name
self.type = type
self.priority = priority
self.parmConfObjList = []
def addParameter(self, name, value, format='str'):
id = self.__getNewId()
parmConfObj = ParameterConf()
parmConfObj.setup(id, name, value, format)
self.parmConfObjList.append(parmConfObj)
return parmConfObj
def makeXml(self, upElement):
opElement = SubElement(upElement, self.ELEMENTNAME)
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')
self.parmConfObjList = []
parmElementList = opElement.getiterator(ParameterConf().getElementName())
for parmElement in parmElementList:
parmConfObj = ParameterConf()
parmConfObj.readXml(parmElement)
self.parmConfObjList.append(parmConfObj)
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()
def createObject(self):
if self.type == 'self':
raise ValueError, "This operation type cannot be created"
if self.type == 'external' or self.type == 'other':
className = eval(self.name)
opObj = className()
return opObj
class ProcUnitConf():
id = None
name = None
datatype = None
inputId = None
opConfObjList = []
procUnitObj = None
opObjList = []
ELEMENTNAME = 'ProcUnit'
def __init__(self):
self.id = None
self.datatype = None
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):
return str(self.id)
def getInputId(self):
return str(self.inputId)
def getOperationObjList(self):
return self.opConfObjList
def getProcUnitObj(self):
return self.procUnitObj
def setup(self, id, name, datatype, inputId):
self.id = id
self.name = name
self.datatype = datatype
self.inputId = inputId
self.opConfObjList = []
self.addOperation(name='run', optype='self')
def addParameter(self, **kwargs):
opObj = self.opConfObjList[0]
opObj.addParameter(**kwargs)
return opObj
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
def makeXml(self, procUnitElement):
upElement = SubElement(procUnitElement, self.ELEMENTNAME)
upElement.set('id', str(self.id))
upElement.set('name', self.name)
upElement.set('datatype', self.datatype)
upElement.set('inputId', str(self.inputId))
for opConfObj in self.opConfObjList:
opConfObj.makeXml(upElement)
def readXml(self, upElement):
self.id = upElement.get('id')
self.name = upElement.get('name')
self.datatype = upElement.get('datatype')
self.inputId = upElement.get('inputId')
self.opConfObjList = []
opElementList = upElement.getiterator(OperationConf().getElementName())
for opElement in opElementList:
opConfObj = OperationConf()
opConfObj.readXml(opElement)
self.opConfObjList.append(opConfObj)
def printattr(self):
print "%s[%s]: name = %s, datatype = %s, inputId = %s" %(self.ELEMENTNAME,
self.id,
self.name,
self.datatype,
self.inputId)
for opConfObj in self.opConfObjList:
opConfObj.printattr()
def createObjects(self):
className = eval(self.name)
procUnitObj = className()
for opConfObj in self.opConfObjList:
if opConfObj.type == 'self':
continue
opObj = opConfObj.createObject()
self.opObjDict[opConfObj.id] = opObj
procUnitObj.addOperation(opObj, opConfObj.id)
self.procUnitObj = procUnitObj
return procUnitObj
def run(self):
finalSts = False
for opConfObj in self.opConfObjList:
kwargs = {}
for parmConfObj in opConfObj.getParameterObjList():
kwargs[parmConfObj.name] = parmConfObj.getValue()
#print "\tRunning the '%s' operation with %s" %(opConfObj.name, opConfObj.id)
sts = self.procUnitObj.call(opType = opConfObj.type,
opName = opConfObj.name,
opId = opConfObj.id,
**kwargs)
finalSts = finalSts or sts
return finalSts
class ReadUnitConf(ProcUnitConf):
path = None
startDate = None
endDate = None
startTime = None
endTime = None
ELEMENTNAME = 'ReadUnit'
def __init__(self):
self.id = None
self.datatype = None
self.name = None
self.inputId = 0
self.opConfObjList = []
self.opObjList = []
def getElementName(self):
return self.ELEMENTNAME
def setup(self, id, name, datatype, path="", startDate="", endDate="", startTime="", endTime="", **kwargs):
self.id = id
self.name = name
self.datatype = datatype
self.path = path
self.startDate = startDate
self.endDate = endDate
self.startTime = startTime
self.endTime = endTime
self.addRunOperation(**kwargs)
def addRunOperation(self, **kwargs):
opObj = self.addOperation(name = 'run', optype = 'self')
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
class Project():
id = None
name = None
description = None
# readUnitConfObjList = None
procUnitConfObjDict = None
ELEMENTNAME = 'Project'
def __init__(self):
self.id = None
self.name = None
self.description = None
# self.readUnitConfObjList = []
self.procUnitConfObjDict = {}
def __getNewId(self):
id = int(self.id)*10 + len(self.procUnitConfObjDict) + 1
return str(id)
def getElementName(self):
return self.ELEMENTNAME
def setup(self, id, name, description):
self.id = id
self.name = name
self.description = description
def addReadUnit(self, datatype, **kwargs):
id = self.__getNewId()
name = '%s' %(datatype)
readUnitConfObj = ReadUnitConf()
readUnitConfObj.setup(id, name, datatype, **kwargs)
self.procUnitConfObjDict[readUnitConfObj.getId()] = readUnitConfObj
return readUnitConfObj
def addProcUnit(self, datatype, inputId):
id = self.__getNewId()
name = '%s' %(datatype)
procUnitConfObj = ProcUnitConf()
procUnitConfObj.setup(id, name, datatype, inputId)
self.procUnitConfObjDict[procUnitConfObj.getId()] = procUnitConfObj
return procUnitConfObj
def makeXml(self):
projectElement = Element('Project')
projectElement.set('id', str(self.id))
projectElement.set('name', self.name)
projectElement.set('description', self.description)
# for readUnitConfObj in self.readUnitConfObjList:
# readUnitConfObj.makeXml(projectElement)
for procUnitConfObj in self.procUnitConfObjDict.values():
procUnitConfObj.makeXml(projectElement)
self.projectElement = projectElement
def writeXml(self, filename):
self.makeXml()
print prettify(self.projectElement)
ElementTree(self.projectElement).write(filename, method='xml')
def readXml(self, filename):
#tree = ET.parse(filename)
self.projectElement = None
# self.readUnitConfObjList = []
self.procUnitConfObjDict = {}
self.projectElement = ElementTree().parse(filename)
self.project = self.projectElement.tag
self.id = self.projectElement.get('id')
self.name = self.projectElement.get('name')
self.description = self.projectElement.get('description')
readUnitElementList = self.projectElement.getiterator(ReadUnitConf().getElementName())
for readUnitElement in readUnitElementList:
readUnitConfObj = ReadUnitConf()
readUnitConfObj.readXml(readUnitElement)
self.procUnitConfObjDict[readUnitConfObj.getId()] = readUnitConfObj
procUnitElementList = self.projectElement.getiterator(ProcUnitConf().getElementName())
for procUnitElement in procUnitElementList:
procUnitConfObj = ProcUnitConf()
procUnitConfObj.readXml(procUnitElement)
self.procUnitConfObjDict[procUnitConfObj.getId()] = procUnitConfObj
def printattr(self):
print "Project[%s]: name = %s, description = %s" %(self.id,
self.name,
self.description)
# for readUnitConfObj in self.readUnitConfObjList:
# readUnitConfObj.printattr()
for procUnitConfObj in self.procUnitConfObjDict.values():
procUnitConfObj.printattr()
def createObjects(self):
# for readUnitConfObj in self.readUnitConfObjList:
# readUnitConfObj.createObjects()
for procUnitConfObj in self.procUnitConfObjDict.values():
procUnitConfObj.createObjects()
def __connect(self, objIN, thisObj):
thisObj.setInput(objIN.getOutputObj())
def connectObjects(self):
for thisPUConfObj in self.procUnitConfObjDict.values():
inputId = thisPUConfObj.getInputId()
if int(inputId) == 0:
continue
#Get input object
puConfINObj = self.procUnitConfObjDict[inputId]
puObjIN = puConfINObj.getProcUnitObj()
#Get current object
thisPUObj = thisPUConfObj.getProcUnitObj()
self.__connect(puObjIN, thisPUObj)
def run(self):
# for readUnitConfObj in self.readUnitConfObjList:
# readUnitConfObj.run()
while(True):
finalSts = False
for procUnitConfObj in self.procUnitConfObjDict.values():
#print "Running the '%s' process with %s" %(procUnitConfObj.name, procUnitConfObj.id)
sts = procUnitConfObj.run()
finalSts = finalSts or sts
#If every process unit finished so end process
if not(finalSts):
print "Every process units have finished"
break
if __name__ == '__main__':
desc = "Segundo Test"
filename = "schain.xml"
controllerObj = Project()
controllerObj.setup(id = '191', name='test01', description=desc)
readUnitConfObj = controllerObj.addReadUnit(datatype='Voltage',
path='data/rawdata/',
startDate='2011/01/01',
endDate='2012/12/31',
startTime='00:00:00',
endTime='23:59:59',
online=1,
walk=1)
# opObj00 = readUnitConfObj.addOperation(name='printInfo')
procUnitConfObj0 = controllerObj.addProcUnit(datatype='Voltage', inputId=readUnitConfObj.getId())
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')
opObj10.addParameter(name='maxHei', value='180', format='float')
opObj12 = procUnitConfObj0.addOperation(name='CohInt', optype='external')
opObj12.addParameter(name='n', value='10', format='int')
procUnitConfObj1 = controllerObj.addProcUnit(datatype='Spectra', inputId=procUnitConfObj0.getId())
procUnitConfObj1.addParameter(name='nFFTPoints', value='32', format='int')
# procUnitConfObj1.addParameter(name='pairList', value='(0,1),(0,2),(1,2)', format='')
opObj11 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='external')
opObj11.addParameter(name='idfigure', value='1', format='int')
opObj11.addParameter(name='wintitle', value='SpectraPlot0', format='str')
opObj11.addParameter(name='zmin', value='40', format='int')
opObj11.addParameter(name='zmax', value='90', format='int')
opObj11.addParameter(name='showprofile', value='1', format='int')
# opObj11 = procUnitConfObj1.addOperation(name='CrossSpectraPlot', optype='external')
# opObj11.addParameter(name='idfigure', value='2', format='int')
# opObj11.addParameter(name='wintitle', value='CrossSpectraPlot', format='str')
# opObj11.addParameter(name='zmin', value='40', format='int')
# opObj11.addParameter(name='zmax', value='90', format='int')
# procUnitConfObj2 = controllerObj.addProcUnit(datatype='Voltage', inputId=procUnitConfObj0.getId())
#
# opObj12 = procUnitConfObj2.addOperation(name='CohInt', optype='external')
# opObj12.addParameter(name='n', value='2', format='int')
# opObj12.addParameter(name='overlapping', value='1', format='int')
#
# procUnitConfObj3 = controllerObj.addProcUnit(datatype='Spectra', inputId=procUnitConfObj2.getId())
# procUnitConfObj3.addParameter(name='nFFTPoints', value='32', format='int')
#
# opObj11 = procUnitConfObj3.addOperation(name='SpectraPlot', optype='external')
# opObj11.addParameter(name='idfigure', value='2', format='int')
# opObj11.addParameter(name='wintitle', value='SpectraPlot1', format='str')
# opObj11.addParameter(name='zmin', value='40', format='int')
# opObj11.addParameter(name='zmax', value='90', format='int')
# opObj11.addParameter(name='showprofile', value='1', format='int')
# opObj11 = procUnitConfObj1.addOperation(name='RTIPlot', optype='external')
# opObj11.addParameter(name='idfigure', value='10', format='int')
# opObj11.addParameter(name='wintitle', value='RTI', format='str')
## opObj11.addParameter(name='xmin', value='21', format='float')
## opObj11.addParameter(name='xmax', value='22', format='float')
# opObj11.addParameter(name='zmin', value='40', format='int')
# opObj11.addParameter(name='zmax', value='90', format='int')
# opObj11.addParameter(name='showprofile', value='1', format='int')
# opObj11.addParameter(name='timerange', value=str(60), format='int')
# opObj10 = procUnitConfObj1.addOperation(name='selectChannels')
# opObj10.addParameter(name='channelList', value='0,2,4,6', format='intlist')
#
# opObj12 = procUnitConfObj1.addOperation(name='IncohInt', optype='external')
# opObj12.addParameter(name='n', value='2', format='int')
#
# opObj11 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='external')
# opObj11.addParameter(name='idfigure', value='2', format='int')
# opObj11.addParameter(name='wintitle', value='SpectraPlot10', format='str')
# opObj11.addParameter(name='zmin', value='70', format='int')
# opObj11.addParameter(name='zmax', value='90', format='int')
#
# opObj10 = procUnitConfObj1.addOperation(name='selectChannels')
# opObj10.addParameter(name='channelList', value='2,6', format='intlist')
#
# opObj12 = procUnitConfObj1.addOperation(name='IncohInt', optype='external')
# opObj12.addParameter(name='n', value='2', format='int')
#
# opObj11 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='external')
# opObj11.addParameter(name='idfigure', value='3', format='int')
# opObj11.addParameter(name='wintitle', value='SpectraPlot10', format='str')
# opObj11.addParameter(name='zmin', value='70', format='int')
# opObj11.addParameter(name='zmax', value='90', format='int')
# opObj12 = procUnitConfObj1.addOperation(name='decoder')
# opObj12.addParameter(name='ncode', value='2', format='int')
# opObj12.addParameter(name='nbauds', value='8', format='int')
# opObj12.addParameter(name='code0', value='001110011', format='int')
# opObj12.addParameter(name='code1', value='001110011', format='int')
# procUnitConfObj2 = controllerObj.addProcUnit(datatype='Spectra', inputId=procUnitConfObj1.getId())
#
# opObj21 = procUnitConfObj2.addOperation(name='IncohInt', optype='external')
# opObj21.addParameter(name='n', value='2', format='int')
#
# opObj11 = procUnitConfObj2.addOperation(name='SpectraPlot', optype='external')
# opObj11.addParameter(name='idfigure', value='4', format='int')
# opObj11.addParameter(name='wintitle', value='SpectraPlot OBJ 2', format='str')
# opObj11.addParameter(name='zmin', value='70', format='int')
# opObj11.addParameter(name='zmax', value='90', format='int')
print "Escribiendo el archivo XML"
controllerObj.writeXml(filename)
print "Leyendo el archivo XML"
controllerObj.readXml(filename)
#controllerObj.printattr()
controllerObj.createObjects()
controllerObj.connectObjects()
controllerObj.run()