##// END OF EJS Templates
Se modifica el metodo LinearPlot para ploteo interactivo. Se adaptó el ejemplo 1. Se plotean dos graficos, el primero es el de una señal senoidal con ruido aleatorio, el segundo grafico es del tipo pcolor.
Se modifica el metodo LinearPlot para ploteo interactivo. Se adaptó el ejemplo 1. Se plotean dos graficos, el primero es el de una señal senoidal con ruido aleatorio, el segundo grafico es del tipo pcolor.

File last commit:

r163:dc0275970b25
r167:87539073aeee
Show More
SpectraProcessor.py
769 lines | 26.0 KiB | text/x-python | PythonLexer
'''
$Author$
$Id$
'''
import os, sys
import numpy
import time
import datetime
path = os.path.split(os.getcwd())[0]
sys.path.append(path)
from Data.JROData import Spectra, SpectraHeis
from IO.SpectraIO import SpectraWriter
from Graphics.schainPlotTypes import ScopeFigure, SpcFigure, RTIFigure
#from JRONoise import Noise
class SpectraProcessor:
'''
classdocs
'''
dataInObj = None
dataOutObj = None
noiseObj = None
integratorObjList = []
writerObjList = []
integratorObjIndex = None
writerObjIndex = None
profIndex = 0 # Se emplea cuando el objeto de entrada es un Voltage
firstdatatime = None
def __init__(self):
'''
Constructor
'''
self.integratorObjIndex = None
self.writerObjIndex = None
self.plotObjIndex = None
self.integratorOst = []
self.plotObjList = []
self.noiseObj = []
self.writerObjList = []
self.buffer = None
self.firstdatatime = None
self.profIndex = 0
def setup(self, dataInObj=None, dataOutObj=None, nFFTPoints=None, pairsList=None):
if dataInObj == None:
raise ValueError, "This SpectraProcessor.setup() function needs dataInObj input variable"
if dataInObj.type == "Voltage":
if nFFTPoints == None:
raise ValueError, "This SpectraProcessor.setup() function needs nFFTPoints input variable"
if dataInObj.type == "Spectra":
if nFFTPoints != None:
raise ValueError, "The nFFTPoints cannot be selected to this object type"
nFFTPoints = dataInObj.nFFTPoints
if pairsList == None:
pairsList = dataInObj.pairsList
if pairsList == None:
nPairs = 0
else:
nPairs = len(pairsList)
self.dataInObj = dataInObj
if dataOutObj == None:
dataOutObj = Spectra()
self.dataOutObj = dataOutObj
self.dataOutObj.nFFTPoints = nFFTPoints
self.dataOutObj.pairsList = pairsList
self.dataOutObj.nPairs = nPairs
return self.dataOutObj
def init(self):
self.dataOutObj.flagNoData = True
if self.dataInObj.flagNoData:
return 0
self.integratorObjIndex = 0
self.writerObjIndex = 0
self.plotObjIndex = 0
if self.dataInObj.type == "Spectra":
self.dataOutObj.copy(self.dataInObj)
self.dataOutObj.flagNoData = False
return
if self.dataInObj.type == "Voltage":
if self.buffer == None:
self.buffer = numpy.zeros((self.dataInObj.nChannels,
self.dataOutObj.nFFTPoints,
self.dataInObj.nHeights),
dtype='complex')
self.buffer[:,self.profIndex,:] = self.dataInObj.data
self.profIndex += 1
if self.firstdatatime == None:
self.firstdatatime = self.dataInObj.utctime
if self.profIndex == self.dataOutObj.nFFTPoints:
self.__updateObjFromInput()
self.__getFft()
self.dataOutObj.flagNoData = False
self.buffer = None
self.firstdatatime = None
self.profIndex = 0
return
#Other kind of data
raise ValueError, "The type object %(s) is not valid " %(self.dataOutObj.type)
def __getFft(self):
"""
Convierte valores de Voltaje a Spectra
Affected:
self.dataOutObj.data_spc
self.dataOutObj.data_cspc
self.dataOutObj.data_dc
self.dataOutObj.heightList
self.dataOutObj.m_BasicHeader
self.dataOutObj.m_ProcessingHeader
self.dataOutObj.radarControllerHeaderObj
self.dataOutObj.systemHeaderObj
self.profIndex
self.buffer
self.dataOutObj.flagNoData
self.dataOutObj.dtype
self.dataOutObj.nPairs
self.dataOutObj.nChannels
self.dataOutObj.nProfiles
self.dataOutObj.systemHeaderObj.numChannels
self.dataOutObj.m_ProcessingHeader.totalSpectra
self.dataOutObj.m_ProcessingHeader.profilesPerBlock
self.dataOutObj.m_ProcessingHeader.numHeights
self.dataOutObj.m_ProcessingHeader.spectraComb
self.dataOutObj.m_ProcessingHeader.shif_fft
"""
fft_volt = numpy.fft.fft(self.buffer,axis=1)
dc = fft_volt[:,0,:]
#calculo de self-spectra
fft_volt = numpy.fft.fftshift(fft_volt,axes=(1,))
spc = fft_volt * numpy.conjugate(fft_volt)
spc = spc.real
blocksize = 0
blocksize += dc.size
blocksize += spc.size
cspc = None
pairIndex = 0
if self.dataOutObj.pairsList != None:
#calculo de cross-spectra
cspc = numpy.zeros((self.dataOutObj.nPairs, self.dataOutObj.nFFTPoints, self.dataOutObj.nHeights), dtype='complex')
for pair in self.dataOutObj.pairsList:
cspc[pairIndex,:,:] = numpy.abs(fft_volt[pair[0],:,:] * numpy.conjugate(fft_volt[pair[1],:,:]))
pairIndex += 1
blocksize += cspc.size
self.dataOutObj.data_spc = spc
self.dataOutObj.data_cspc = cspc
self.dataOutObj.data_dc = dc
self.dataOutObj.blockSize = blocksize
# self.getNoise()
def __updateObjFromInput(self):
self.dataOutObj.radarControllerHeaderObj = self.dataInObj.radarControllerHeaderObj.copy()
self.dataOutObj.systemHeaderObj = self.dataInObj.systemHeaderObj.copy()
self.dataOutObj.channelList = self.dataInObj.channelList
self.dataOutObj.heightList = self.dataInObj.heightList
self.dataOutObj.dtype = self.dataInObj.dtype
self.dataOutObj.nHeights = self.dataInObj.nHeights
self.dataOutObj.nChannels = self.dataInObj.nChannels
self.dataOutObj.nBaud = self.dataInObj.nBaud
self.dataOutObj.nCode = self.dataInObj.nCode
self.dataOutObj.code = self.dataInObj.code
self.dataOutObj.nProfiles = self.dataOutObj.nFFTPoints
self.dataOutObj.channelIndexList = self.dataInObj.channelIndexList
self.dataOutObj.flagTimeBlock = self.dataInObj.flagTimeBlock
self.dataOutObj.utctime = self.firstdatatime
self.dataOutObj.flagDecodeData = self.dataInObj.flagDecodeData #asumo q la data esta decodificada
self.dataOutObj.flagDeflipData = self.dataInObj.flagDeflipData #asumo q la data esta sin flip
self.dataOutObj.flagShiftFFT = self.dataInObj.flagShiftFFT
self.dataOutObj.nCohInt = self.dataInObj.nCohInt
self.dataOutObj.nIncohInt = 1
self.dataOutObj.ippSeconds = self.dataInObj.ippSeconds
self.dataOutObj.timeInterval = self.dataInObj.timeInterval*self.dataOutObj.nFFTPoints
def addWriter(self, wrpath, blocksPerFile):
objWriter = SpectraWriter(self.dataOutObj)
objWriter.setup(wrpath, blocksPerFile)
self.writerObjList.append(objWriter)
def addIntegrator(self,N,timeInterval):
objIncohInt = IncoherentIntegration(N,timeInterval)
self.integratorObjList.append(objIncohInt)
def addCrossSpc(self, idfigure, nframes, wintitle, driver, colormap, colorbar, showprofile):
crossSpcObj = CrossSpcFigure(idfigure, nframes, wintitle, driver, colormap, colorbar, showprofile)
self.plotObjList.append(crossSpcObj)
def plotCrossSpc(self, idfigure=None,
xmin=None,
xmax=None,
ymin=None,
ymax=None,
minvalue=None,
maxvalue=None,
wintitle='',
driver='plplot',
colormap='br_green',
colorbar=True,
showprofile=False,
save=False,
gpath=None,
pairsList = None):
if self.dataOutObj.flagNoData:
return 0
if pairsList == None:
pairsList = self.dataOutObj.pairsList
nframes = len(pairsList)
x = numpy.arange(self.dataOutObj.nFFTPoints)
y = self.dataOutObj.heightList
data_spc = self.dataOutObj.data_spc
data_cspc = self.dataOutObj.data_cspc
data = []
if len(self.plotObjList) <= self.plotObjIndex:
self.addSpc(idfigure, nframes, wintitle, driver, colormap, colorbar, showprofile)
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 = 10.*numpy.log10(self.dataOutObj.data_spc[channelList,:,:])
data = numpy.average(data, axis=1)
currenttime = self.dataOutObj.utctime - time.timezone
range = self.dataOutObj.heightList
figuretitle = "RTI Plot for Spectra Data" #+ date
cleardata = False
deltax = self.dataOutObj.timeInterval
plotObj = self.plotObjList[self.plotObjIndex]
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 addSpc(self, idfigure, nframes, wintitle, driver, colormap, colorbar, showprofile):
spcObj = SpcFigure(idfigure, nframes, wintitle, driver, colormap, colorbar, showprofile)
self.plotObjList.append(spcObj)
def plotSpc(self, idfigure=None,
xmin=None,
xmax=None,
ymin=None,
ymax=None,
minvalue=None,
maxvalue=None,
wintitle='',
driver='plplot',
colormap='br_green',
colorbar=True,
showprofile=False,
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.addSpc(idfigure, nframes, wintitle, driver, colormap, colorbar, showprofile)
x = numpy.arange(self.dataOutObj.nFFTPoints)
y = self.dataOutObj.heightList
data = 10.*numpy.log10(self.dataOutObj.data_spc[channelList,:,:])
# noisedB = 10.*numpy.log10(noise)
noisedB = numpy.arange(len(channelList)+1)
noisedB = noisedB *1.2
titleList = []
for i in range(len(noisedB)):
title = "%.2f"%noisedB[i]
titleList.append(title)
thisdatetime = datetime.datetime.fromtimestamp(self.dataOutObj.utctime)
dateTime = "%s"%(thisdatetime.strftime("%d-%b-%Y %H:%M:%S"))
figuretitle = "Spc Radar Data: %s"%dateTime
cleardata = True
plotObj = self.plotObjList[self.plotObjIndex]
plotObj.plotPcolor(data=data,
x=x,
y=y,
channelList=channelList,
xmin=xmin,
xmax=xmax,
ymin=ymin,
ymax=ymax,
minvalue=minvalue,
maxvalue=maxvalue,
figuretitle=figuretitle,
xrangestep=None,
deltax=None,
save=save,
gpath=gpath,
cleardata=cleardata
)
self.plotObjIndex += 1
def writeData(self, wrpath, blocksPerFile):
if self.dataOutObj.flagNoData:
return 0
if len(self.writerObjList) <= self.writerObjIndex:
self.addWriter(wrpath, blocksPerFile)
self.writerObjList[self.writerObjIndex].putData()
self.writerObjIndex += 1
def integrator(self, N=None, timeInterval=None):
if self.dataOutObj.flagNoData:
return 0
if len(self.integratorObjList) <= self.integratorObjIndex:
self.addIntegrator(N,timeInterval)
myIncohIntObj = self.integratorObjList[self.integratorObjIndex]
myIncohIntObj.exe(data=self.dataOutObj.data_spc,datatime=self.dataOutObj.utctime)
if myIncohIntObj.isReady:
self.dataOutObj.data_spc = myIncohIntObj.data
self.dataOutObj.timeInterval *= myCohIntObj.nIncohInt
self.dataOutObj.nIncohInt = myIncohIntObj.navg * self.dataInObj.nIncohInt
self.dataOutObj.utctime = myIncohIntObj.firstdatatime
self.dataOutObj.flagNoData = False
"""Calcular el ruido"""
self.getNoise()
else:
self.dataOutObj.flagNoData = True
self.integratorObjIndex += 1
class SpectraHeisProcessor:
def __init__(self):
self.integratorObjIndex = None
self.writerObjIndex = None
self.plotObjIndex = None
self.integratorObjList = []
self.writerObjList = []
self.plotObjList = []
#self.noiseObj = Noise()
def setup(self, dataInObj, dataOutObj=None, nFFTPoints=None, pairList=None):
if nFFTPoints == None:
nFFTPoints = self.dataInObj.nHeights
self.dataInObj = dataInObj
if dataOutObj == None:
dataOutObj = SpectraHeis()
self.dataOutObj = dataOutObj
return self.dataOutObj
def init(self):
self.dataOutObj.flagNoData = True
if self.dataInObj.flagNoData:
return 0
self.integratorObjIndex = 0
self.writerObjIndex = 0
self.plotObjIndex = 0
if self.dataInObj.type == "Voltage":
self.__updateObjFromInput()
self.__getFft()
self.dataOutObj.flagNoData = False
return
#Other kind of data
if self.dataInObj.type == "SpectraHeis":
self.dataOutObj.copy(self.dataInObj)
self.dataOutObj.flagNoData = False
return
raise ValueError, "The type is not valid"
def __updateObjFromInput(self):
self.dataOutObj.radarControllerHeaderObj = self.dataInObj.radarControllerHeaderObj.copy()
self.dataOutObj.systemHeaderObj = self.dataInObj.systemHeaderObj.copy()
self.dataOutObj.channelList = self.dataInObj.channelList
self.dataOutObj.heightList = self.dataInObj.heightList
self.dataOutObj.dtype = self.dataInObj.dtype
self.dataOutObj.nHeights = self.dataInObj.nHeights
self.dataOutObj.nChannels = self.dataInObj.nChannels
self.dataOutObj.nBaud = self.dataInObj.nBaud
self.dataOutObj.nCode = self.dataInObj.nCode
self.dataOutObj.code = self.dataInObj.code
self.dataOutObj.nProfiles = 1
self.dataOutObj.nFFTPoints = self.dataInObj.nHeights
self.dataOutObj.channelIndexList = self.dataInObj.channelIndexList
self.dataOutObj.flagNoData = self.dataInObj.flagNoData
self.dataOutObj.flagTimeBlock = self.dataInObj.flagTimeBlock
self.dataOutObj.utctime = self.dataInObj.utctime
self.dataOutObj.flagDecodeData = self.dataInObj.flagDecodeData #asumo q la data esta decodificada
self.dataOutObj.flagDeflipData = self.dataInObj.flagDeflipData #asumo q la data esta sin flip
self.dataOutObj.flagShiftFFT = self.dataInObj.flagShiftFFT
self.dataOutObj.nIncohInt = 1
self.dataOutObj.ippSeconds= self.dataInObj.ippSeconds
# def addWriter(self,wrpath,blocksPerfile):
def addWriter(self,wrpath):
objWriter=SpectraHeisWriter(self.dataOutObj)
objWriter.setup(wrpath)
#objWriter.setup(wrpath,blocksPerfile)
self.writerObjList.append(objWriter)
# def writedata(self,wrpath,blocksPerfile):
def writedata(self,wrpath):
if self.dataOutObj.flagNoData:
return 0
if len(self.writerObjList) <= self.writerObjIndex:
#self.addWriter(wrpath, blocksPerFile)
self.addWriter(wrpath)
self.writerObjList[self.writerObjIndex].putData()
self.writerObjIndex += 1
def __getFft(self):
fft_volt = numpy.fft.fft(self.dataInObj.data, axis=1)
#print fft_volt
#calculo de self-spectra
fft_volt = numpy.fft.fftshift(fft_volt,axes=(1,))
spc = numpy.abs(fft_volt * numpy.conjugate(fft_volt))
self.dataOutObj.data_spc = spc
def getSpectra(self):
return self.dataOutObj.data_spc
def getFrecuencies(self):
print self.nFFTPoints
return numpy.arange(int(self.nFFTPoints))
def addIntegrator(self,N,timeInterval):
objIncohInt = IncoherentIntegration(N,timeInterval)
self.integratorObjList.append(objIncohInt)
def integrator(self, N=None, timeInterval=None):
if self.dataOutObj.flagNoData:
return 0
if len(self.integratorObjList) <= self.integratorObjIndex:
self.addIntegrator(N,timeInterval)
myIncohIntObj = self.integratorObjList[self.integratorObjIndex]
myIncohIntObj.exe(data=self.dataOutObj.data_spc,timeOfData=self.dataOutObj.utctime)
if myIncohIntObj.isReady:
self.dataOutObj.data_spc = myIncohIntObj.data
self.dataOutObj.nIncohInt = self.dataOutObj.nIncohInt*myIncohIntObj.navg
self.dataOutObj.flagNoData = False
#self.getNoise(type="hildebrand",parm=myIncohIntObj.navg)
# self.getNoise(type="sort", parm=16)
else:
self.dataOutObj.flagNoData = True
self.integratorObjIndex += 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,
titleList=None,
xlabelList=None,
ylabelList=None):
if self.dataOutObj.flagNoData:
return 0
nframes = len(self.dataOutObj.channelList)
if len(self.plotObjList) <= self.plotObjIndex:
self.addScope(idfigure, nframes, wintitle, driver)
data1D = self.dataOutObj.data_spc
x = numpy.arange(self.dataOutObj.nHeights)
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,
x,
self.dataOutObj.channelList,
xmin,
xmax,
minvalue,
maxvalue,
figureTitle,
save,
gpath)
self.plotObjIndex += 1
def rti(self):
if self.dataOutObj.flagNoData:
return 0
data=numpy.average(self.dataOutObj.data_spc,axis=1)
data[0]
print data[0]
x = numpy.arange(100000)
print "test"
#print self.dataOutObj.data_spc.average(axis=1)
class IncoherentIntegration:
integ_counter = None
data = None
navg = None
buffer = None
nIncohInt = None
firstdatatime = None
def __init__(self, N = None, timeInterval = None):
"""
N
timeInterval - interval time [min], integer value
"""
self.data = None
self.navg = None
self.buffer = None
self.timeOut = None
self.exitCondition = False
self.isReady = False
self.nIncohInt = N
self.integ_counter = 0
self.firstdatatime = None
if timeInterval!=None:
self.timeIntervalInSeconds = timeInterval * 60. #if (type(timeInterval)!=integer) -> change this line
if ((timeInterval==None) and (N==None)):
print 'N = None ; timeInterval = None'
sys.exit(0)
elif timeInterval == None:
self.timeFlag = False
else:
self.timeFlag = True
def exe(self,data,datatime):
"""
data
datatime [seconds]
"""
if self.firstdatatime == None or self.isReady:
self.firstdatatime = datatime
if self.timeFlag:
if self.timeOut == None:
self.timeOut = datatime + self.timeIntervalInSeconds
if datatime < self.timeOut:
if self.buffer == None:
self.buffer = data
else:
self.buffer = self.buffer + data
self.integ_counter += 1
else:
self.exitCondition = True
else:
if self.integ_counter < self.nIncohInt:
if self.buffer == None:
self.buffer = data
else:
self.buffer = self.buffer + data
self.integ_counter += 1
if self.integ_counter == self.nIncohInt:
self.exitCondition = True
if self.exitCondition:
self.data = self.buffer
self.navg = self.integ_counter
self.isReady = True
self.buffer = None
self.timeOut = None
self.integ_counter = 0
self.exitCondition = False
if self.timeFlag:
self.buffer = data
self.timeOut = datatime + self.timeIntervalInSeconds
else:
self.isReady = False