''' $Author$ $Id$ ''' import os import sys import numpy import datetime import time path = os.path.split(os.getcwd())[0] sys.path.append(path) from Data.JROData import Voltage from IO.VoltageIO import VoltageWriter from Graphics.schainPlotTypes import ScopeFigure, RTIFigure class VoltageProcessor: dataInObj = None dataOutObj = None integratorObjIndex = None writerObjIndex = None integratorObjList = None writerObjList = None def __init__(self): self.integratorObjIndex = None self.writerObjIndex = None self.plotObjIndex = None self.integratorObjList = [] self.writerObjList = [] self.plotObjList = [] def setup(self,dataInObj=None,dataOutObj=None): self.dataInObj = dataInObj if self.dataOutObj == None: dataOutObj = Voltage() self.dataOutObj = dataOutObj return self.dataOutObj def init(self): self.integratorObjIndex = 0 self.writerObjIndex = 0 self.plotObjIndex = 0 if not(self.dataInObj.flagNoData): self.dataOutObj.copy(self.dataInObj) # No necesita copiar en cada init() los atributos de dataInObj # la copia deberia hacerse por cada nuevo bloque de datos def addRti(self, idfigure, nframes, wintitle, driver, colormap, colorbar, showprofile): rtiObj = RTIFigure(idfigure, nframes, wintitle, driver, colormap, colorbar, showprofile) self.plotObjList.append(rtiObj) def plotRti(self, idfigure=None, starttime=None, endtime=None, rangemin=None, rangemax=None, minvalue=None, maxvalue=None, wintitle='', driver='plplot', colormap='br_greeen', colorbar=True, showprofile=False, xrangestep=None, save=False, gpath=None, ratio=1, channelList=None): if self.dataOutObj.flagNoData: return 0 if channelList == None: channelList = self.dataOutObj.channelList nframes = len(channelList) if len(self.plotObjList) <= self.plotObjIndex: self.addRti(idfigure, nframes, wintitle, driver, colormap, colorbar, showprofile) data = self.dataOutObj.data[channelList,:] * numpy.conjugate(self.dataOutObj.data[channelList,:]) data = 10*numpy.log10(data.real) currenttime = self.dataOutObj.utctime - time.timezone range = self.dataOutObj.heightList thisdatetime = datetime.datetime.fromtimestamp(self.dataOutObj.utctime) dateTime = "%s"%(thisdatetime.strftime("%d-%b-%Y %H:%M:%S")) date = "%s"%(thisdatetime.strftime("%d-%b-%Y")) figuretitle = "RTI Plot Radar Data" #+ date plotObj = self.plotObjList[self.plotObjIndex] cleardata = False deltax = self.dataOutObj.timeInterval plotObj.plotPcolor(data=data, x=currenttime, y=range, channelList=channelList, xmin=starttime, xmax=endtime, ymin=rangemin, ymax=rangemax, minvalue=minvalue, maxvalue=maxvalue, figuretitle=figuretitle, xrangestep=xrangestep, deltax=deltax, save=save, gpath=gpath, ratio=ratio, cleardata=cleardata ) self.plotObjIndex += 1 def addScope(self, idfigure, nframes, wintitle, driver): if idfigure==None: idfigure = self.plotObjIndex scopeObj = ScopeFigure(idfigure, nframes, wintitle, driver) self.plotObjList.append(scopeObj) def plotScope(self, idfigure=None, minvalue=None, maxvalue=None, xmin=None, xmax=None, wintitle='', driver='plplot', save=False, gpath=None, ratio=1, type="power"): if self.dataOutObj.flagNoData: return 0 nframes = len(self.dataOutObj.channelList) if len(self.plotObjList) <= self.plotObjIndex: self.addScope(idfigure, nframes, wintitle, driver) if type=="power": data1D = self.dataOutObj.data * numpy.conjugate(self.dataOutObj.data) data1D = data1D.real if type =="iq": data1D = self.dataOutObj.data thisDatetime = datetime.datetime.fromtimestamp(self.dataOutObj.utctime) dateTime = "%s"%(thisDatetime.strftime("%d-%b-%Y %H:%M:%S")) date = "%s"%(thisDatetime.strftime("%d-%b-%Y")) figuretitle = "Scope Plot Radar Data: " + date plotObj = self.plotObjList[self.plotObjIndex] plotObj.plot1DArray(data1D=data1D, x=self.dataOutObj.heightList, channelList=self.dataOutObj.channelList, xmin=xmin, xmax=xmax, minvalue=minvalue, maxvalue=maxvalue, figuretitle=figuretitle, save=save, gpath=gpath, ratio=ratio) self.plotObjIndex += 1 def addIntegrator(self, *args): objCohInt = CoherentIntegrator(*args) self.integratorObjList.append(objCohInt) def addWriter(self, *args): writerObj = VoltageWriter(self.dataOutObj) writerObj.setup(*args) self.writerObjList.append(writerObj) def writeData(self, wrpath, blocksPerFile, profilesPerBlock): if self.dataOutObj.flagNoData: return 0 if len(self.writerObjList) <= self.writerObjIndex: self.addWriter(wrpath, blocksPerFile, profilesPerBlock) self.writerObjList[self.writerObjIndex].putData() self.writerObjIndex += 1 def integrator(self, nCohInt=None, timeInterval=None, overlapping=False): if self.dataOutObj.flagNoData: return 0 if len(self.integratorObjList) <= self.integratorObjIndex: self.addIntegrator(nCohInt, timeInterval, overlapping) myCohIntObj = self.integratorObjList[self.integratorObjIndex] myCohIntObj.exe(data = self.dataOutObj.data, datatime=self.dataOutObj.utctime) # self.dataOutObj.timeInterval *= nCohInt self.dataOutObj.flagNoData = True if myCohIntObj.isReady: self.dataOutObj.data = myCohIntObj.data self.dataOutObj.timeInterval *= myCohIntObj.nCohInt self.dataOutObj.nCohInt = myCohIntObj.nCohInt * self.dataInObj.nCohInt self.dataOutObj.utctime = myCohIntObj.firstdatatime self.dataOutObj.flagNoData = False def selectChannels(self, channelList): self.selectChannelsByIndex(channelList) def selectChannelsByIndex(self, channelIndexList): """ Selecciona un bloque de datos en base a canales segun el channelIndexList Input: channelIndexList : lista sencilla de canales a seleccionar por ej. [2,3,7] Affected: self.dataOutObj.data self.dataOutObj.channelIndexList self.dataOutObj.nChannels self.dataOutObj.m_ProcessingHeader.totalSpectra self.dataOutObj.systemHeaderObj.numChannels self.dataOutObj.m_ProcessingHeader.blockSize Return: None """ if self.dataOutObj.flagNoData: return 0 for channel in channelIndexList: if channel not in self.dataOutObj.channelIndexList: raise ValueError, "The value %d in channelIndexList is not valid" %channel nChannels = len(channelIndexList) data = self.dataOutObj.data[channelIndexList,:] self.dataOutObj.data = data self.dataOutObj.channelIndexList = channelIndexList self.dataOutObj.channelList = [self.dataOutObj.channelList[i] for i in channelIndexList] self.dataOutObj.nChannels = nChannels return 1 class CoherentIntegrator: __profIndex = 0 __withOverapping = False __isByTime = False __initime = None __integrationtime = None __buffer = None isReady = False nCohInt = None firstdatatime = None def __init__(self, nCohInt=None, timeInterval=None, overlapping=False): """ Set the parameters of the integration class. Inputs: nCohInt : Number of coherent integrations timeInterval : Time of integration. If nCohInt is selected this parameter does not work overlapping : """ self.__buffer = None self.isReady = False if nCohInt == None and timeInterval == None: raise ValueError, "nCohInt or timeInterval should be specified ..." if nCohInt != None: self.nCohInt = nCohInt self.__isByTime = False else: self.__integrationtime = timeInterval * 60. #if (type(timeInterval)!=integer) -> change this line self.__isByTime = True if overlapping: self.__withOverapping = True self.__buffer = None else: self.__withOverapping = False self.__buffer = 0 self.__profIndex = 0 firstdatatime = None def putData(self, data): """ Add a profile to the __buffer and increase in one the __profileIndex """ if not self.__withOverapping: self.__buffer += data self.__profIndex += 1 return #Overlapping data nChannels, nHeis = data.shape data = numpy.reshape(data, (1, nChannels, nHeis)) if self.__buffer == None: self.__buffer = data self.__profIndex += 1 return if self.__profIndex < self.nCohInt: self.__buffer = numpy.vstack((self.__buffer, data)) self.__profIndex += 1 return self.__buffer = numpy.roll(self.__buffer, -1, axis=0) self.__buffer[self.nCohInt-1] = data #self.__profIndex = self.nCohInt return def pushData(self): """ Return the sum of the last profiles and the profiles used in the sum. Affected: self.__profileIndex """ if not self.__withOverapping: data = self.__buffer nCohInt = self.__profIndex self.__buffer = 0 self.__profIndex = 0 return data, nCohInt #Overlapping data data = numpy.sum(self.__buffer, axis=0) nCohInt = self.__profIndex return data, nCohInt def byProfiles(self, data): self.isReady = False avg_data = None self.putData(data) if self.__profIndex == self.nCohInt: avg_data, nCohInt = self.pushData() self.isReady = True return avg_data def byTime(self, data, datatime): self.isReady = False avg_data = None if self.__initime == None: self.__initime = datatime self.putData(data) if (datatime - self.__initime) >= self.__integrationtime: avg_data, nCohInt = self.pushData() self.nCohInt = nCohInt self.isReady = True return avg_data def exe(self, data, datatime=None): if self.firstdatatime == None or self.isReady: self.firstdatatime = datatime if not self.__isByTime: avg_data = self.byProfiles(data) else: avg_data = self.byTime(data, datatime) self.data = avg_data return avg_data