''' ''' class ProcessingUnit: """ Esta es la clase base para el procesamiento de datos. Contiene el metodo "call" para llamar operaciones. Las operaciones pueden ser: - Metodos internos (callMethod) - Objetos del tipo Operation (callObject). Antes de ser llamados, estos objetos tienen que ser agreagados con el metodo "add". """ # objeto de datos de entrada (Voltage, Spectra o Correlation) dataIn = None dataInList = [] # objeto de datos de entrada (Voltage, Spectra o Correlation) dataOut = None operations2RunDict = None isConfig = False def __init__(self): self.dataIn = None self.dataInList = [] self.dataOut = {} self.operations2RunDict = {} self.isConfig = False def addOperation(self, opObj, objId): """ Agrega un objeto del tipo "Operation" (opObj) a la lista de objetos "self.objectList" y retorna el identificador asociado a este objeto. Input: object : objeto de la clase "Operation" Return: objId : identificador del objeto, necesario para ejecutar la operacion """ self.operations2RunDict[objId] = opObj return objId def operation(self, **kwargs): """ Operacion directa sobre la data (dataOut.data). Es necesario actualizar los valores de los atributos del objeto dataOut Input: **kwargs : Diccionario de argumentos de la funcion a ejecutar """ raise ValueError, "ImplementedError" def callMethod(self, name, **kwargs): """ Ejecuta el metodo con el nombre "name" y con argumentos **kwargs de la propia clase. Input: name : nombre del metodo a ejecutar **kwargs : diccionario con los nombres y valores de la funcion a ejecutar. """ if name == 'run': if not self.checkInputs(): self.dataOut.flagNoData = True return False else: #Si no es un metodo RUN la entrada es la misma dataOut (interna) if self.dataOut.isEmpty(): return False #Getting the pointer to method methodToCall = getattr(self, name) #Executing the self method methodToCall(**kwargs) #Checkin the outputs # if name == 'run': # pass # else: # pass # # if name != 'run': # return True if self.dataOut.isEmpty(): return False return True def callObject(self, objId, **kwargs): """ Ejecuta la operacion asociada al identificador del objeto "objId" Input: objId : identificador del objeto a ejecutar **kwargs : diccionario con los nombres y valores de la funcion a ejecutar. Return: None """ if self.dataOut.isEmpty(): return False externalProcObj = self.operations2RunDict[objId] externalProcObj.run(self.dataOut, **kwargs) return True def call(self, opType, opName=None, opId=None, **kwargs): """ Return True si ejecuta la operacion "operationConf.name" con los argumentos "**kwargs". False si la operacion no se ha ejecutado. La operacion puede ser de dos tipos: 1. Un metodo propio de esta clase: operation.type = "self" 2. El metodo "run" de un objeto del tipo Operation o de un derivado de ella: operation.type = "other". Este objeto de tipo Operation debe de haber sido agregado antes con el metodo: "addOperation" e identificado con el operation.id con el id de la operacion. Input: Operation : Objeto del tipo operacion con los atributos: name, type y id. """ if opType == 'self': if not opName: raise IOError, "opName parameter should be defined" sts = self.callMethod(opName, **kwargs) if opType == 'other' or opType == 'external': if not opId: raise IOError, "opId parameter should be defined" if opId not in self.operations2RunDict.keys(): raise IOError, "This id operation have not been registered" sts = self.callObject(opId, **kwargs) return sts def setInput(self, dataIn): self.dataIn = dataIn self.dataInList.append(dataIn) def getOutputObj(self): return self.dataOut def checkInputs(self): for thisDataIn in self.dataInList: if thisDataIn.isEmpty(): return False return True def setup(self): raise ValueError, "Not implemented" def run(self): raise ValueError, "Not implemented" class Operation(): """ Clase base para definir las operaciones adicionales que se pueden agregar a la clase ProcessingUnit y necesiten acumular informacion previa de los datos a procesar. De preferencia usar un buffer de acumulacion dentro de esta clase Ejemplo: Integraciones coherentes, necesita la informacion previa de los n perfiles anteriores (bufffer) """ __buffer = None isConfig = False def __init__(self): self.__buffer = None self.isConfig = False def setup(self): self.isConfig = True raise ValueError, "Not implemented" def run(self, dataIn, **kwargs): """ Realiza las operaciones necesarias sobre la dataIn.data y actualiza los atributos del objeto dataIn. Input: dataIn : objeto del tipo JROData Return: None Affected: __buffer : buffer de recepcion de datos. """ if not self.isConfig: self.setup(**kwargs) raise ValueError, "ImplementedError"