##// END OF EJS Templates
Optimizacion de graficos con buffer, el buffer se crea en la clase Axes del modulo figure.py, se agrega el metodo pcolorbuffer....
Optimizacion de graficos con buffer, el buffer se crea en la clase Axes del modulo figure.py, se agrega el metodo pcolorbuffer. En mpldriver.py se agrega el metodo addpcolorbuffer donde se limpia el buffer de matplotlib que genera pcolormesh Estas modificaciones se aplican a los graficos RTI y Mapa de Coherencias.

File last commit:

r169:661bb8af254a
r318:2312df9eac7d
Show More
VoltageProcessor.py
678 lines | 21.9 KiB | text/x-python | PythonLexer
'''
Created on Feb 7, 2012
@author $Author$
@version $Id$
'''
import os, sys
import numpy
path = os.path.split(os.getcwd())[0]
sys.path.append(path)
from Model.Voltage import Voltage
from IO.VoltageIO import VoltageWriter
from Graphics.VoltagePlot import Osciloscope
from Graphics.VoltagePlot import RTI
class VoltageProcessor:
'''
classdocs
'''
dataInObj = None
dataOutObj = None
integratorObjIndex = None
decoderObjIndex = None
profSelectorObjIndex = None
writerObjIndex = None
plotterObjIndex = None
flipIndex = None
integratorObjList = []
decoderObjList = []
profileSelectorObjList = []
writerObjList = []
plotterObjList = []
m_Voltage= Voltage()
def __init__(self):
'''
Constructor
'''
self.integratorObjIndex = None
self.decoderObjIndex = None
self.profSelectorObjIndex = None
self.writerObjIndex = None
self.plotterObjIndex = None
self.flipIndex = 1
self.integratorObjList = []
self.decoderObjList = []
self.profileSelectorObjList = []
self.writerObjList = []
self.plotterObjList = []
def setup(self, dataInObj=None, dataOutObj=None):
self.dataInObj = dataInObj
if dataOutObj == None:
dataOutObj = Voltage()
dataOutObj.copy(dataInObj)
self.dataOutObj = dataOutObj
return self.dataOutObj
def init(self):
self.integratorObjIndex = 0
self.decoderObjIndex = 0
self.profSelectorObjIndex = 0
self.writerObjIndex = 0
self.plotterObjIndex = 0
self.dataOutObj.copy(self.dataInObj)
if self.profSelectorObjIndex != None:
for profSelObj in self.profileSelectorObjList:
profSelObj.incIndex()
def addWriter(self, wrpath):
objWriter = VoltageWriter(self.dataOutObj)
objWriter.setup(wrpath)
self.writerObjList.append(objWriter)
def addRti(self,index=None):
if index==None:
index = self.plotterObjIndex
plotObj = RTI(self.dataOutObj, index)
self.plotterObjList.append(plotObj)
def addPlotter(self, index=None):
if index==None:
index = self.plotterObjIndex
plotObj = Osciloscope(self.dataOutObj, index)
self.plotterObjList.append(plotObj)
def addIntegrator(self, N,timeInterval):
objCohInt = CoherentIntegrator(N,timeInterval)
self.integratorObjList.append(objCohInt)
def addDecoder(self, code, ncode, nbaud):
objDecoder = Decoder(code,ncode,nbaud)
self.decoderObjList.append(objDecoder)
def addProfileSelector(self, nProfiles):
objProfSelector = ProfileSelector(nProfiles)
self.profileSelectorObjList.append(objProfSelector)
def writeData(self,wrpath):
if self.dataOutObj.flagNoData:
return 0
if len(self.writerObjList) <= self.writerObjIndex:
self.addWriter(wrpath)
self.writerObjList[self.writerObjIndex].putData()
self.writerObjIndex += 1
def addScope(self,index=None):
if index==None:
index = self.plotterObjIndex
plotObj = Osciloscope(self.dataOutObj, index)
self.plotterObjList.append(plotObj)
def plotScope(self,
xmin=None,
xmax=None,
ymin=None,
ymax=None,
titleList=None,
xlabelList=None,
ylabelList=None,
winTitle='',
type="power",
index=None):
if self.dataOutObj.flagNoData:
return 0
if len(self.plotterObjList) <= self.plotterObjIndex:
self.addScope(index)
self.plotterObjList[self.plotterObjIndex].plotData(xmin,
xmax,
ymin,
ymax,
titleList,
xlabelList,
ylabelList,
winTitle,
type)
self.plotterObjIndex += 1
def plotRti(self,
xmin=None,
xmax=None,
ymin=None,
ymax=None,
zmin=None,
zmax=None,
titleList=None,
xlabelList=None,
ylabelList=None,
winTitle='',
timezone='lt',
npoints=1000.0,
colormap="br_green",
showColorbar=True,
showPowerProfile=False,
XAxisAsTime=True,
save=False,
index=None):
if self.dataOutObj.flagNoData:
return 0
if len(self.plotterObjList) <= self.plotterObjIndex:
self.addRti(index)
self.plotterObjList[self.plotterObjIndex].plotData(xmin,
xmax,
ymin,
ymax,
zmin,
zmax,
titleList,
xlabelList,
ylabelList,
winTitle,
timezone,
npoints,
colormap,
showColorbar,
showPowerProfile,
XAxisAsTime,
save)
self.plotterObjIndex += 1
def plotData(self,xmin=None, xmax=None, ymin=None, ymax=None, type='iq', winTitle='', index=None):
if self.dataOutObj.flagNoData:
return 0
if len(self.plotterObjList) <= self.plotterObjIndex:
self.addPlotter(index)
self.plotterObjList[self.plotterObjIndex].plotData(xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax,type=type, winTitle=winTitle)
self.plotterObjIndex += 1
def integrator(self, N=None, timeInterval=None):
if self.dataOutObj.flagNoData:
return 0
if len(self.integratorObjList) <= self.integratorObjIndex:
self.addIntegrator(N,timeInterval)
myCohIntObj = self.integratorObjList[self.integratorObjIndex]
myCohIntObj.exe(data=self.dataOutObj.data,timeOfData=self.dataOutObj.m_BasicHeader.utc)
if myCohIntObj.isReady:
self.dataOutObj.data = myCohIntObj.data
self.dataOutObj.nAvg = myCohIntObj.navg
self.dataOutObj.m_ProcessingHeader.coherentInt *= myCohIntObj.navg
#print "myCohIntObj.navg: ",myCohIntObj.navg
self.dataOutObj.flagNoData = False
else:
self.dataOutObj.flagNoData = True
self.integratorObjIndex += 1
def decoder(self,code=None, mode = 0):
if self.dataOutObj.flagNoData:
return 0
if code == None:
code = self.dataOutObj.radarControllerHeaderObj.code
ncode, nbaud = code.shape
if len(self.decoderObjList) <= self.decoderObjIndex:
self.addDecoder(code,ncode,nbaud)
myDecodObj = self.decoderObjList[self.decoderObjIndex]
data, ndata = myDecodObj.exe(data=self.dataOutObj.data,mode=mode)
self.dataOutObj.data = data
self.dataOutObj.nHeights = ndata
self.dataOutObj.heightList = self.dataInObj.heightList[:ndata]
self.dataOutObj.flagNoData = False
self.decoderObjIndex += 1
def filterByHei(self, window):
if window == None:
window = self.dataOutObj.radarControllerHeaderObj.txA / self.dataOutObj.m_ProcessingHeader.deltaHeight[0]
newdelta = self.dataOutObj.m_ProcessingHeader.deltaHeight[0] * window
dim1 = self.dataOutObj.data.shape[0]
dim2 = self.dataOutObj.data.shape[1]
r = dim2 % window
buffer = self.dataOutObj.data[:,0:dim2-r]
buffer = buffer.reshape(dim1,dim2/window,window)
buffer = numpy.sum(buffer,2)
self.dataOutObj.data = buffer
self.dataOutObj.m_ProcessingHeader.deltaHeight = newdelta
self.dataOutObj.m_ProcessingHeader.numHeights = buffer.shape[1]
self.dataOutObj.nHeights = self.dataOutObj.m_ProcessingHeader.numHeights
#self.dataOutObj.heightList es un numpy.array
self.dataOutObj.heightList = numpy.arange(self.dataOutObj.m_ProcessingHeader.firstHeight[0],newdelta*self.dataOutObj.nHeights,newdelta)
def deFlip(self):
self.dataOutObj.data *= self.flipIndex
self.flipIndex *= -1.
def selectChannels(self, channelList):
pass
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.nChannels = nChannels
self.dataOutObj.m_ProcessingHeader.totalSpectra = 0
self.dataOutObj.systemHeaderObj.numChannels = nChannels
self.dataOutObj.m_ProcessingHeader.blockSize = data.size
return 1
def selectHeightsByValue(self, minHei, maxHei):
"""
Selecciona un bloque de datos en base a un grupo de valores de alturas segun el rango
minHei <= height <= maxHei
Input:
minHei : valor minimo de altura a considerar
maxHei : valor maximo de altura a considerar
Affected:
Indirectamente son cambiados varios valores a travez del metodo selectHeightsByIndex
Return:
1 si el metodo se ejecuto con exito caso contrario devuelve 0
"""
if self.dataOutObj.flagNoData:
return 0
if (minHei < self.dataOutObj.heightList[0]) or (minHei > maxHei):
raise ValueError, "some value in (%d,%d) is not valid" % (minHei, maxHei)
if (maxHei > self.dataOutObj.heightList[-1]):
raise ValueError, "some value in (%d,%d) is not valid" % (minHei, maxHei)
minIndex = 0
maxIndex = 0
data = self.dataOutObj.heightList
for i,val in enumerate(data):
if val < minHei:
continue
else:
minIndex = i;
break
for i,val in enumerate(data):
if val <= maxHei:
maxIndex = i;
else:
break
self.selectHeightsByIndex(minIndex, maxIndex)
return 1
def selectHeightsByIndex(self, minIndex, maxIndex):
"""
Selecciona un bloque de datos en base a un grupo indices de alturas segun el rango
minIndex <= index <= maxIndex
Input:
minIndex : valor de indice minimo de altura a considerar
maxIndex : valor de indice maximo de altura a considerar
Affected:
self.dataOutObj.data
self.dataOutObj.heightList
self.dataOutObj.nHeights
self.dataOutObj.m_ProcessingHeader.blockSize
self.dataOutObj.m_ProcessingHeader.numHeights
self.dataOutObj.m_ProcessingHeader.firstHeight
self.dataOutObj.radarControllerHeaderObj
Return:
1 si el metodo se ejecuto con exito caso contrario devuelve 0
"""
if self.dataOutObj.flagNoData:
return 0
if (minIndex < 0) or (minIndex > maxIndex):
raise ValueError, "some value in (%d,%d) is not valid" % (minIndex, maxIndex)
if (maxIndex >= self.dataOutObj.nHeights):
raise ValueError, "some value in (%d,%d) is not valid" % (minIndex, maxIndex)
nHeights = maxIndex - minIndex + 1
#voltage
data = self.dataOutObj.data[:,minIndex:maxIndex+1]
firstHeight = self.dataOutObj.heightList[minIndex]
self.dataOutObj.data = data
self.dataOutObj.heightList = self.dataOutObj.heightList[minIndex:maxIndex+1]
self.dataOutObj.nHeights = nHeights
self.dataOutObj.m_ProcessingHeader.blockSize = data.size
self.dataOutObj.m_ProcessingHeader.numHeights = nHeights
self.dataOutObj.m_ProcessingHeader.firstHeight = firstHeight
self.dataOutObj.radarControllerHeaderObj.numHeights = nHeights
return 1
def selectProfilesByValue(self,indexList, nProfiles):
if self.dataOutObj.flagNoData:
return 0
if self.profSelectorObjIndex >= len(self.profileSelectorObjList):
self.addProfileSelector(nProfiles)
profileSelectorObj = self.profileSelectorObjList[self.profSelectorObjIndex]
if not(profileSelectorObj.isProfileInList(indexList)):
self.dataOutObj.flagNoData = True
self.profSelectorObjIndex += 1
return 0
self.dataOutObj.flagNoData = False
self.profSelectorObjIndex += 1
return 1
def selectProfilesByIndex(self, minIndex, maxIndex, nProfiles):
"""
Selecciona un bloque de datos en base a un grupo indices de perfiles segun el rango
minIndex <= index <= maxIndex
Input:
minIndex : valor de indice minimo de perfil a considerar
maxIndex : valor de indice maximo de perfil a considerar
nProfiles : numero de profiles
Affected:
self.dataOutObj.flagNoData
self.profSelectorObjIndex
Return:
1 si el metodo se ejecuto con exito caso contrario devuelve 0
"""
if self.dataOutObj.flagNoData:
return 0
if self.profSelectorObjIndex >= len(self.profileSelectorObjList):
self.addProfileSelector(nProfiles)
profileSelectorObj = self.profileSelectorObjList[self.profSelectorObjIndex]
if not(profileSelectorObj.isProfileInRange(minIndex, maxIndex)):
self.dataOutObj.flagNoData = True
self.profSelectorObjIndex += 1
return 0
self.dataOutObj.flagNoData = False
self.profSelectorObjIndex += 1
return 1
def selectNtxs(self, ntx):
pass
class Decoder:
data = None
profCounter = 1
nCode = None
nBaud = None
codeIndex = 0
code = None
flag = False
def __init__(self,code, ncode, nbaud):
self.data = None
self.ndata = None
self.profCounter = 1
self.nCode = ncode
self.nBaud = nbaud
self.codeIndex = 0
self.code = code #this is a List
self.flag = False
def exe(self, data, ndata=None, mode = 0):
if ndata == None: ndata = data.shape[1]
if mode == 0:
self.convolutionInFreq(data,ndata)
if mode == 1:
self.convolutionInTime(data, ndata)
self.ndata = ndata - self.nBaud + 1
return self.data, self.ndata
def convolutionInFreq(self,data, ndata):
newcode = numpy.zeros(ndata)
newcode[0:self.nBaud] = self.code[self.codeIndex]
self.codeIndex += 1
fft_data = numpy.fft.fft(data, axis=1)
fft_code = numpy.conj(numpy.fft.fft(newcode))
fft_code = fft_code.reshape(1,len(fft_code))
conv = fft_data.copy()
conv.fill(0)
conv = fft_data*fft_code
data = numpy.fft.ifft(conv,axis=1)
self.data = data[:,:-self.nBaud+1]
self.flag = True
if self.profCounter == self.nCode:
self.profCounter = 0
self.codeIndex = 0
self.profCounter += 1
def convolutionInTime(self, data, ndata):
nchannel = data.shape[1]
newcode = self.code[self.codeIndex]
self.codeIndex += 1
conv = data.copy()
for i in range(nchannel):
conv[i,:] = numpy.correlate(data[i,:], newcode)
self.data = conv
self.flag = True
if self.profCounter == self.nCode:
self.profCounter = 0
self.codeIndex = 0
self.profCounter += 1
class CoherentIntegrator:
integ_counter = None
data = None
navg = None
buffer = None
nCohInt = None
def __init__(self, N=None,timeInterval=None):
self.data = None
self.navg = None
self.buffer = None
self.timeOut = None
self.exitCondition = False
self.isReady = False
self.nCohInt = N
self.integ_counter = 0
if timeInterval!=None:
self.timeIntervalInSeconds = timeInterval * 60. #if (type(timeInterval)!=integer) -> change this line
if ((timeInterval==None) and (N==None)):
raise ValueError, "N = None ; timeInterval = None"
if timeInterval == None:
self.timeFlag = False
else:
self.timeFlag = True
def exe(self, data, timeOfData):
if self.timeFlag:
if self.timeOut == None:
self.timeOut = timeOfData + self.timeIntervalInSeconds
if timeOfData < 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.nCohInt:
if self.buffer == None:
self.buffer = data
else:
self.buffer = self.buffer + data
self.integ_counter += 1
if self.integ_counter == self.nCohInt:
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 = timeOfData + self.timeIntervalInSeconds
else:
self.isReady = False
class ProfileSelector:
profileIndex = None
# Tamanho total de los perfiles
nProfiles = None
def __init__(self, nProfiles):
self.profileIndex = 0
self.nProfiles = nProfiles
def incIndex(self):
self.profileIndex += 1
if self.profileIndex >= self.nProfiles:
self.profileIndex = 0
def isProfileInRange(self, minIndex, maxIndex):
if self.profileIndex < minIndex:
return False
if self.profileIndex > maxIndex:
return False
return True
def isProfileInList(self, profileList):
if self.profileIndex not in profileList:
return False
return True