From a731a256fc18ace5c583981596cb5c2d5cca050d 2013-02-20 03:55:49 From: Daniel Valdez Date: 2013-02-20 03:55:49 Subject: [PATCH] Se agrega una nueva clase de escritura FitsWriter, ademas de las Clases Metadata y ParameterConf, que se usan para leer el archivo xml que configura el header de los archivos FITS. --- diff --git a/schainpy/model/jrodataIO.py b/schainpy/model/jrodataIO.py index 80f54ed..ab4a1ac 100644 --- a/schainpy/model/jrodataIO.py +++ b/schainpy/model/jrodataIO.py @@ -2735,3 +2735,186 @@ class FITS: if os.path.isfile(filename): os.remove(filename) self.thdulist.writeto(filename) + + +class ParameterConf: + ELEMENTNAME = 'Parameter' + def __init__(self): + self.name = '' + self.value = '' + + def readXml(self, parmElement): + self.name = parmElement.get('name') + self.value = parmElement.get('value') + + def getElementName(self): + return self.ELEMENTNAME + +class Metadata: + + def __init__(self, filename): + self.parmConfObjList = [] + self.readXml(filename) + + def readXml(self, filename): + self.projectElement = None + self.procUnitConfObjDict = {} + self.projectElement = ElementTree().parse(filename) + self.project = self.projectElement.tag + + parmElementList = self.projectElement.getiterator(ParameterConf().getElementName()) + + for parmElement in parmElementList: + parmConfObj = ParameterConf() + parmConfObj.readXml(parmElement) + self.parmConfObjList.append(parmConfObj) + +class FitsWriter(Operation): + + def __init__(self): + self.isConfig = False + self.dataBlocksPerFile = None + self.blockIndex = 0 + self.flagIsNewFile = 1 + self.fitsObj = None + self.optchar = 'P' + self.ext = '.fits' + self.setFile = 0 + + def setFitsHeader(self, dataOut, metadatafile): + + header_data = pyfits.PrimaryHDU() + + metadata4fits = Metadata(metadatafile) + for parameter in metadata4fits.parmConfObjList: + parm_name = parameter.name + parm_value = parameter.value + + if parm_value == 'fromdatadatetime': + value = time.strftime("%b %d %Y %H:%M:%S", dataOut.datatime.timetuple()) + elif parm_value == 'fromdataheights': + value = dataOut.nHeights + elif parm_value == 'fromdatachannel': + value = dataOut.nChannels + elif parm_value == 'fromdatasamples': + value = dataOut.nFFTPoints + else: + value = parm_value + + header_data.header[parm_name] = value + + header_data.header['NBLOCK'] = self.blockIndex + + header_data.writeto(self.filename) + + + def setup(self, dataOut, path, dataBlocksPerFile, metadatafile): + + self.path = path + self.dataOut = dataOut + self.metadatafile = metadatafile + self.dataBlocksPerFile = dataBlocksPerFile + + def open(self): + self.fitsObj = pyfits.open(self.filename, mode='update') + + + def addData(self, data): + self.open() + extension = pyfits.ImageHDU(data=data, name=self.fitsObj[0].header['DATA']) + extension.header['UTCTIME'] = self.dataOut.utctime + self.fitsObj.append(extension) + self.blockIndex += 1 + self.fitsObj[0].header['NBLOCK'] = self.blockIndex + + self.write() + + def write(self): + + self.fitsObj.flush(verbose=True) + self.fitsObj.close() + + + def setNextFile(self): + + ext = self.ext + path = self.path + + timeTuple = time.localtime( self.dataOut.utctime) + subfolder = 'd%4.4d%3.3d' % (timeTuple.tm_year,timeTuple.tm_yday) + + fullpath = os.path.join( path, subfolder ) + if not( os.path.exists(fullpath) ): + os.mkdir(fullpath) + self.setFile = -1 #inicializo mi contador de seteo + else: + filesList = os.listdir( fullpath ) + if len( filesList ) > 0: + filesList = sorted( filesList, key=str.lower ) + filen = filesList[-1] + + if isNumber( filen[8:11] ): + self.setFile = int( filen[8:11] ) #inicializo mi contador de seteo al seteo del ultimo file + else: + self.setFile = -1 + else: + self.setFile = -1 #inicializo mi contador de seteo + + setFile = self.setFile + setFile += 1 + + file = '%s%4.4d%3.3d%3.3d%s' % (self.optchar, + timeTuple.tm_year, + timeTuple.tm_yday, + setFile, + ext ) + + filename = os.path.join( path, subfolder, file ) + + self.blockIndex = 0 + self.filename = filename + self.setFile = setFile + self.flagIsNewFile = 1 + + print 'Writing the file: %s'%self.filename + + self.setFitsHeader(self.dataOut, self.metadatafile) + + return 1 + + def writeBlock(self): + self.addData(self.dataOut.data_spc) + self.flagIsNewFile = 0 + + + def __setNewBlock(self): + + if self.flagIsNewFile: + return 1 + + if self.blockIndex < self.dataBlocksPerFile: + return 1 + + if not( self.setNextFile() ): + return 0 + + return 1 + + def writeNextBlock(self): + if not( self.__setNewBlock() ): + return 0 + self.writeBlock() + return 1 + + def putData(self): + if self.flagIsNewFile: + self.setNextFile() + self.writeNextBlock() + + def run(self, dataOut, **kwargs): + if not(self.isConfig): + self.setup(dataOut, **kwargs) + self.isConfig = True + self.putData() + + diff --git a/schainpy/test/SunExperiment.py b/schainpy/test/SunExperiment.py index e438a29..0943c2e 100644 --- a/schainpy/test/SunExperiment.py +++ b/schainpy/test/SunExperiment.py @@ -37,32 +37,38 @@ opObj11.addParameter(name='wintitle', value='SpectraHeisPlot', format='str') #opObj11.addParameter(name='ymax', value='140', format='int') #opObj11.addParameter(name='channelList', value='0,1,2', format='intlist') #opObj11.addParameter(name='showprofile', value='1', format='int') -opObj11.addParameter(name='save', value='1', format='bool') -opObj11.addParameter(name='figfile', value='spc-noise.png', format='str') -opObj11.addParameter(name='figpath', value='/Users/dsuarez/Pictures/sun_pics', format='str') -opObj11.addParameter(name='ftp', value='1', format='int') -opObj11.addParameter(name='ftpratio', value='10', format='int') +#opObj11.addParameter(name='save', value='1', format='bool') +#opObj11.addParameter(name='figfile', value='spc-noise.png', format='str') +#opObj11.addParameter(name='figpath', value='/Users/dsuarez/Pictures/sun_pics', format='str') +#opObj11.addParameter(name='ftp', value='1', format='int') +#opObj11.addParameter(name='ftpratio', value='10', format='int') opObj11 = procUnitConfObj1.addOperation(name='RTIfromSpectraHeis', optype='other') opObj11.addParameter(name='idfigure', value='6', format='int') opObj11.addParameter(name='wintitle', value='RTIPLot', format='str') -#opObj11.addParameter(name='zmin', value='10', format='int') -#opObj11.addParameter(name='zmax', value='40', format='int') +opObj11.addParameter(name='xmin', value='11.5', format='float') +opObj11.addParameter(name='xmax', value='12.5', format='float') opObj11.addParameter(name='ymin', value='60', format='int') opObj11.addParameter(name='ymax', value='85', format='int') #opObj11.addParameter(name='channelList', value='0,1,2,3', format='intlist') #opObj11.addParameter(name='timerange', value='600', format='int') #opObj11.addParameter(name='showprofile', value='0', format='int') -opObj11.addParameter(name='save', value='1', format='bool') -opObj11.addParameter(name='figfile', value='rti-noise.png', format='str') -opObj11.addParameter(name='figpath', value='/Users/dsuarez/Pictures/sun_pics', format='str') -opObj11.addParameter(name='ftp', value='1', format='int') -opObj11.addParameter(name='ftpratio', value='10', format='int') +#opObj11.addParameter(name='save', value='1', format='bool') +#opObj11.addParameter(name='figfile', value='rti-noise.png', format='str') +#opObj11.addParameter(name='figpath', value='/Users/dsuarez/Pictures/sun_pics', format='str') +#opObj11.addParameter(name='ftp', value='1', format='int') +#opObj11.addParameter(name='ftpratio', value='10', format='int') +opObj11.addParameter(name='useLocalTime', value='1', format='bool') +opObj11.addParameter(name='timezone', value='300', format='int') -opObj11 = procUnitConfObj1.addOperation(name='SpectraHeisWriter', optype='other') -opObj11.addParameter(name='wrpath', value='/Users/dsuarez/Remote', format='str') -#opObj11.addParameter(name='blocksPerFile', value='200', format='int') +#opObj11 = procUnitConfObj1.addOperation(name='SpectraHeisWriter', optype='other') +#opObj11.addParameter(name='wrpath', value='/Users/dsuarez/Remote', format='str') +##opObj11.addParameter(name='blocksPerFile', value='200', format='int') +opObj11 = procUnitConfObj1.addOperation(name='FitsWriter', optype='other') +opObj11.addParameter(name='path', value='/Users/dsuarez/Remote', format='str') +opObj11.addParameter(name='dataBlocksPerFile', value='10', format='int') +opObj11.addParameter(name='metadatafile', value='/Users/dsuarez/Desktop/metadata_fits.xml', format='str') print "Escribiendo el archivo XML" controllerObj.writeXml(filename)