|
|
'''
|
|
|
Created on Feb 7, 2012
|
|
|
|
|
|
@author $Author$
|
|
|
@version $Id$
|
|
|
'''
|
|
|
import os, sys
|
|
|
import numpy
|
|
|
import time
|
|
|
|
|
|
path = os.path.split(os.getcwd())[0]
|
|
|
sys.path.append(path)
|
|
|
|
|
|
from Model.Spectra import Spectra
|
|
|
from IO.SpectraIO import SpectraWriter
|
|
|
from Graphics.SpectraPlot import Spectrum
|
|
|
from JRONoise import Noise
|
|
|
|
|
|
class SpectraProcessor:
|
|
|
'''
|
|
|
classdocs
|
|
|
'''
|
|
|
|
|
|
dataInObj = None
|
|
|
|
|
|
dataOutObj = None
|
|
|
|
|
|
noiseObj = None
|
|
|
|
|
|
integratorObjList = []
|
|
|
|
|
|
decoderObjList = []
|
|
|
|
|
|
writerObjList = []
|
|
|
|
|
|
plotterObjList = []
|
|
|
|
|
|
integratorObjIndex = None
|
|
|
|
|
|
decoderObjIndex = None
|
|
|
|
|
|
writerObjIndex = None
|
|
|
|
|
|
plotterObjIndex = None
|
|
|
|
|
|
buffer = None
|
|
|
|
|
|
profIndex = 0
|
|
|
|
|
|
nFFTPoints = None
|
|
|
|
|
|
nChannels = None
|
|
|
|
|
|
nHeights = None
|
|
|
|
|
|
nPairs = None
|
|
|
|
|
|
pairList = None
|
|
|
|
|
|
|
|
|
def __init__(self):
|
|
|
'''
|
|
|
Constructor
|
|
|
'''
|
|
|
|
|
|
self.integratorObjIndex = None
|
|
|
self.decoderObjIndex = None
|
|
|
self.writerObjIndex = None
|
|
|
self.plotterObjIndex = None
|
|
|
|
|
|
self.integratorObjList = []
|
|
|
self.decoderObjList = []
|
|
|
self.writerObjList = []
|
|
|
self.plotterObjList = []
|
|
|
|
|
|
self.noiseObj = None
|
|
|
self.buffer = None
|
|
|
self.profIndex = 0
|
|
|
|
|
|
def setup(self, dataInObj=None, dataOutObj=None, nFFTPoints=None, pairList=None):
|
|
|
|
|
|
if dataInObj == None:
|
|
|
raise ValueError, ""
|
|
|
|
|
|
if nFFTPoints == None:
|
|
|
raise ValueError, ""
|
|
|
|
|
|
self.dataInObj = dataInObj
|
|
|
|
|
|
if dataOutObj == None:
|
|
|
dataOutObj = Spectra()
|
|
|
|
|
|
self.dataOutObj = dataOutObj
|
|
|
self.noiseObj = Noise()
|
|
|
|
|
|
##########################################
|
|
|
self.nFFTPoints = nFFTPoints
|
|
|
self.nChannels = self.dataInObj.nChannels
|
|
|
self.nHeights = self.dataInObj.nHeights
|
|
|
self.pairList = pairList
|
|
|
if pairList != None:
|
|
|
self.nPairs = len(pairList)
|
|
|
else:
|
|
|
self.nPairs = 0
|
|
|
|
|
|
self.dataOutObj.heightList = self.dataInObj.heightList
|
|
|
self.dataOutObj.channelIndexList = self.dataInObj.channelIndexList
|
|
|
self.dataOutObj.m_BasicHeader = self.dataInObj.m_BasicHeader.copy()
|
|
|
self.dataOutObj.m_ProcessingHeader = self.dataInObj.m_ProcessingHeader.copy()
|
|
|
self.dataOutObj.m_RadarControllerHeader = self.dataInObj.m_RadarControllerHeader.copy()
|
|
|
self.dataOutObj.m_SystemHeader = self.dataInObj.m_SystemHeader.copy()
|
|
|
|
|
|
self.dataOutObj.dataType = self.dataInObj.dataType
|
|
|
self.dataOutObj.nPairs = self.nPairs
|
|
|
self.dataOutObj.nChannels = self.nChannels
|
|
|
self.dataOutObj.nProfiles = self.nFFTPoints
|
|
|
self.dataOutObj.nHeights = self.nHeights
|
|
|
self.dataOutObj.nFFTPoints = self.nFFTPoints
|
|
|
#self.dataOutObj.data = None
|
|
|
|
|
|
self.dataOutObj.m_SystemHeader.numChannels = self.nChannels
|
|
|
self.dataOutObj.m_SystemHeader.nProfiles = self.nFFTPoints
|
|
|
|
|
|
self.dataOutObj.m_ProcessingHeader.totalSpectra = self.nChannels + self.nPairs
|
|
|
self.dataOutObj.m_ProcessingHeader.profilesPerBlock = self.nFFTPoints
|
|
|
self.dataOutObj.m_ProcessingHeader.numHeights = self.nHeights
|
|
|
self.dataOutObj.m_ProcessingHeader.shif_fft = True
|
|
|
|
|
|
spectraComb = numpy.zeros( (self.nChannels+self.nPairs)*2,numpy.dtype('u1'))
|
|
|
k = 0
|
|
|
for i in range( 0,self.nChannels*2,2 ):
|
|
|
spectraComb[i] = k
|
|
|
spectraComb[i+1] = k
|
|
|
k += 1
|
|
|
|
|
|
k *= 2
|
|
|
|
|
|
if self.pairList != None:
|
|
|
|
|
|
for pair in self.pairList:
|
|
|
spectraComb[k] = pair[0]
|
|
|
spectraComb[k+1] = pair[1]
|
|
|
k += 2
|
|
|
|
|
|
self.dataOutObj.m_ProcessingHeader.spectraComb = spectraComb
|
|
|
|
|
|
return self.dataOutObj
|
|
|
|
|
|
def init(self):
|
|
|
|
|
|
self.integratorObjIndex = 0
|
|
|
self.decoderObjIndex = 0
|
|
|
self.writerObjIndex = 0
|
|
|
self.plotterObjIndex = 0
|
|
|
|
|
|
if self.dataInObj.type == "Voltage":
|
|
|
|
|
|
if self.buffer == None:
|
|
|
self.buffer = numpy.zeros((self.nChannels,
|
|
|
self.nFFTPoints,
|
|
|
self.nHeights),
|
|
|
dtype='complex')
|
|
|
|
|
|
self.buffer[:,self.profIndex,:] = self.dataInObj.data
|
|
|
self.profIndex += 1
|
|
|
|
|
|
if self.profIndex == self.nFFTPoints:
|
|
|
self.__getFft()
|
|
|
self.dataOutObj.flagNoData = False
|
|
|
|
|
|
self.buffer = None
|
|
|
self.profIndex = 0
|
|
|
return
|
|
|
|
|
|
self.dataOutObj.flagNoData = True
|
|
|
|
|
|
return
|
|
|
|
|
|
#Other kind of data
|
|
|
if self.dataInObj.type == "Spectra":
|
|
|
self.dataOutObj.copy(self.dataInObj)
|
|
|
self.dataOutObj.flagNoData = False
|
|
|
return
|
|
|
|
|
|
raise ValueError, "The datatype is not valid"
|
|
|
|
|
|
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.m_RadarControllerHeader
|
|
|
self.dataOutObj.m_SystemHeader
|
|
|
self.profIndex
|
|
|
self.buffer
|
|
|
self.dataOutObj.flagNoData
|
|
|
self.dataOutObj.dataType
|
|
|
self.dataOutObj.nPairs
|
|
|
self.dataOutObj.nChannels
|
|
|
self.dataOutObj.nProfiles
|
|
|
self.dataOutObj.m_SystemHeader.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
|
|
|
"""
|
|
|
|
|
|
if self.dataInObj.flagNoData:
|
|
|
return 0
|
|
|
|
|
|
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.pairList != None:
|
|
|
#calculo de cross-spectra
|
|
|
cspc = numpy.zeros((self.nPairs, self.nFFTPoints, self.nHeights), dtype='complex')
|
|
|
for pair in self.pairList:
|
|
|
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.m_ProcessingHeader.blockSize = blocksize
|
|
|
self.dataOutObj.m_BasicHeader.utc = self.dataInObj.m_BasicHeader.utc
|
|
|
|
|
|
# self.getNoise()
|
|
|
|
|
|
def addWriter(self,wrpath):
|
|
|
objWriter = SpectraWriter(self.dataOutObj)
|
|
|
objWriter.setup(wrpath)
|
|
|
self.writerObjList.append(objWriter)
|
|
|
|
|
|
def addPlotter(self,index=None):
|
|
|
if index==None:
|
|
|
index = self.plotterObjIndex
|
|
|
|
|
|
plotObj = Spectrum(self.dataOutObj, index)
|
|
|
self.plotterObjList.append(plotObj)
|
|
|
|
|
|
def addIntegrator(self,N,timeInterval):
|
|
|
|
|
|
objIncohInt = IncoherentIntegration(N,timeInterval)
|
|
|
self.integratorObjList.append(objIncohInt)
|
|
|
|
|
|
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 plotData(self,
|
|
|
xmin=None,
|
|
|
xmax=None,
|
|
|
ymin=None,
|
|
|
ymax=None,
|
|
|
zmin=None,
|
|
|
zmax=None,
|
|
|
titleList=None,
|
|
|
xlabelList=None,
|
|
|
ylabelList=None,
|
|
|
winTitle='',
|
|
|
colormap="br_green",
|
|
|
showColorbar=False,
|
|
|
showPowerProfile=False,
|
|
|
XAxisAsTime=False,
|
|
|
save=False,
|
|
|
index=None,
|
|
|
channelList=[]):
|
|
|
|
|
|
if self.dataOutObj.flagNoData:
|
|
|
return 0
|
|
|
|
|
|
if len(self.plotterObjList) <= self.plotterObjIndex:
|
|
|
self.addPlotter(index)
|
|
|
|
|
|
self.plotterObjList[self.plotterObjIndex].plotData(xmin,
|
|
|
xmax,
|
|
|
ymin,
|
|
|
ymax,
|
|
|
zmin,
|
|
|
zmax,
|
|
|
titleList,
|
|
|
xlabelList,
|
|
|
ylabelList,
|
|
|
winTitle,
|
|
|
colormap,
|
|
|
showColorbar,
|
|
|
showPowerProfile,
|
|
|
XAxisAsTime,
|
|
|
save,
|
|
|
channelList)
|
|
|
|
|
|
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)
|
|
|
|
|
|
myIncohIntObj = self.integratorObjList[self.integratorObjIndex]
|
|
|
myIncohIntObj.exe(data=self.dataOutObj.data_spc,timeOfData=self.dataOutObj.m_BasicHeader.utc)
|
|
|
|
|
|
if myIncohIntObj.isReady:
|
|
|
self.dataOutObj.data_spc = myIncohIntObj.data
|
|
|
self.dataOutObj.nAvg = myIncohIntObj.navg
|
|
|
self.dataOutObj.m_ProcessingHeader.incoherentInt = self.dataInObj.m_ProcessingHeader.incoherentInt*myIncohIntObj.navg
|
|
|
#print "myIncohIntObj.navg: ",myIncohIntObj.navg
|
|
|
self.dataOutObj.flagNoData = False
|
|
|
|
|
|
"""Calcular el ruido"""
|
|
|
self.getNoise()
|
|
|
else:
|
|
|
self.dataOutObj.flagNoData = True
|
|
|
|
|
|
self.integratorObjIndex += 1
|
|
|
|
|
|
|
|
|
|
|
|
def removeDC(self, type):
|
|
|
|
|
|
if self.dataOutObj.flagNoData:
|
|
|
return 0
|
|
|
|
|
|
def removeInterference(self):
|
|
|
|
|
|
if self.dataOutObj.flagNoData:
|
|
|
return 0
|
|
|
|
|
|
def removeSatellites(self):
|
|
|
|
|
|
if self.dataOutObj.flagNoData:
|
|
|
return 0
|
|
|
|
|
|
def getNoise(self, type="hildebrand", parm=None):
|
|
|
|
|
|
if parm == None:
|
|
|
parm =self.dataOutObj.m_ProcessingHeader.incoherentInt
|
|
|
|
|
|
self.noiseObj.setNoise(self.dataOutObj.data_spc)
|
|
|
|
|
|
if type == "hildebrand":
|
|
|
noise = self.noiseObj.byHildebrand(parm)
|
|
|
|
|
|
if type == "window":
|
|
|
noise = self.noiseObj.byWindow(parm)
|
|
|
|
|
|
if type == "sort":
|
|
|
noise = self.noiseObj.bySort(parm)
|
|
|
|
|
|
self.dataOutObj.noise = noise
|
|
|
# print 10*numpy.log10(noise)
|
|
|
|
|
|
def selectChannels(self, channelList, pairList=[]):
|
|
|
|
|
|
channelIndexList = []
|
|
|
|
|
|
for channel in channelList:
|
|
|
if channel in self.dataOutObj.channelList:
|
|
|
index = self.dataOutObj.channelList.index(channel)
|
|
|
channelIndexList.append(index)
|
|
|
|
|
|
pairIndexList = []
|
|
|
|
|
|
for pair in pairList:
|
|
|
if pair in self.dataOutObj.pairList:
|
|
|
index = self.dataOutObj.pairList.index(pair)
|
|
|
pairIndexList.append(index)
|
|
|
|
|
|
self.selectChannelsByIndex(channelIndexList, pairIndexList)
|
|
|
|
|
|
def selectChannelsByIndex(self, channelIndexList, pairIndexList=[]):
|
|
|
"""
|
|
|
Selecciona un bloque de datos en base a canales y pares segun el
|
|
|
channelIndexList y el pairIndexList
|
|
|
|
|
|
Input:
|
|
|
channelIndexList : lista de indices de los canales a seleccionar por ej.
|
|
|
|
|
|
Si tenemos los canales
|
|
|
|
|
|
self.channelList = (2,3,5,7)
|
|
|
|
|
|
y deseamos escoger los canales (3,7)
|
|
|
entonces colocaremos el parametro
|
|
|
|
|
|
channelndexList = (1,3)
|
|
|
|
|
|
pairIndexList : tupla de indice depares que se desea selecionar por ej.
|
|
|
|
|
|
Si tenemos los pares :
|
|
|
|
|
|
( (0,1), (0,2), (1,3), (2,5) )
|
|
|
|
|
|
y deseamos seleccionar los pares ((0,2), (2,5))
|
|
|
entonces colocaremos el parametro
|
|
|
|
|
|
pairIndexList = (1,3)
|
|
|
|
|
|
Affected:
|
|
|
self.dataOutObj.data_spc
|
|
|
self.dataOutObj.data_cspc
|
|
|
self.dataOutObj.data_dc
|
|
|
self.dataOutObj.nChannels
|
|
|
self.dataOutObj.nPairs
|
|
|
self.dataOutObj.m_ProcessingHeader.spectraComb
|
|
|
self.dataOutObj.m_SystemHeader.numChannels
|
|
|
|
|
|
self.dataOutObj.noise
|
|
|
Return:
|
|
|
None
|
|
|
"""
|
|
|
|
|
|
if self.dataOutObj.flagNoData:
|
|
|
return 0
|
|
|
|
|
|
if pairIndexList == []:
|
|
|
pairIndexList = numpy.arange(len(self.dataOutObj.pairList))
|
|
|
|
|
|
nChannels = len(channelIndexList)
|
|
|
nPairs = len(pairIndexList)
|
|
|
|
|
|
blocksize = 0
|
|
|
#self spectra
|
|
|
spc = self.dataOutObj.data_spc[channelIndexList,:,:]
|
|
|
blocksize += spc.size
|
|
|
|
|
|
cspc = None
|
|
|
if pairIndexList != []:
|
|
|
cspc = self.dataOutObj.data_cspc[pairIndexList,:,:]
|
|
|
blocksize += cspc.size
|
|
|
|
|
|
#DC channel
|
|
|
dc = None
|
|
|
if self.dataOutObj.m_ProcessingHeader.flag_dc:
|
|
|
dc = self.dataOutObj.data_dc[channelIndexList,:]
|
|
|
blocksize += dc.size
|
|
|
|
|
|
#Almacenar las combinaciones de canales y cros espectros
|
|
|
|
|
|
spectraComb = numpy.zeros( (nChannels+nPairs)*2,numpy.dtype('u1'))
|
|
|
i = 0
|
|
|
for spcChannel in channelIndexList:
|
|
|
spectraComb[i] = spcChannel
|
|
|
spectraComb[i+1] = spcChannel
|
|
|
i += 2
|
|
|
|
|
|
if pairList != None:
|
|
|
for pair in pairList:
|
|
|
spectraComb[i] = pair[0]
|
|
|
spectraComb[i+1] = pair[1]
|
|
|
i += 2
|
|
|
|
|
|
#######
|
|
|
|
|
|
self.dataOutObj.data_spc = spc
|
|
|
self.dataOutObj.data_cspc = cspc
|
|
|
self.dataOutObj.data_dc = dc
|
|
|
self.dataOutObj.nChannels = nChannels
|
|
|
self.dataOutObj.nPairs = nPairs
|
|
|
|
|
|
self.dataOutObj.channelIndexList = channelIndexList
|
|
|
|
|
|
self.dataOutObj.m_ProcessingHeader.spectraComb = spectraComb
|
|
|
self.dataOutObj.m_ProcessingHeader.totalSpectra = nChannels + nPairs
|
|
|
self.dataOutObj.m_SystemHeader.numChannels = nChannels
|
|
|
self.dataOutObj.nChannels = nChannels
|
|
|
self.dataOutObj.m_ProcessingHeader.blockSize = blocksize
|
|
|
|
|
|
if cspc == None:
|
|
|
self.dataOutObj.m_ProcessingHeader.flag_dc = False
|
|
|
if dc == None:
|
|
|
self.dataOutObj.m_ProcessingHeader.flag_cpsc = False
|
|
|
|
|
|
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:
|
|
|
None
|
|
|
"""
|
|
|
|
|
|
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)
|
|
|
|
|
|
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 minimo de altura a considerar
|
|
|
maxIndex : valor maximo de altura a considerar
|
|
|
|
|
|
Affected:
|
|
|
self.dataOutObj.data_spc
|
|
|
self.dataOutObj.data_cspc
|
|
|
self.dataOutObj.data_dc
|
|
|
self.dataOutObj.heightList
|
|
|
self.dataOutObj.nHeights
|
|
|
self.dataOutObj.m_ProcessingHeader.numHeights
|
|
|
self.dataOutObj.m_ProcessingHeader.blockSize
|
|
|
self.dataOutObj.m_ProcessingHeader.firstHeight
|
|
|
self.dataOutObj.m_RadarControllerHeader.numHeights
|
|
|
|
|
|
Return:
|
|
|
None
|
|
|
"""
|
|
|
|
|
|
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)
|
|
|
|
|
|
nChannels = self.dataOutObj.nChannels
|
|
|
nPairs = self.dataOutObj.nPairs
|
|
|
nProfiles = self.dataOutObj.nProfiles
|
|
|
dataType = self.dataOutObj.dataType
|
|
|
nHeights = maxIndex - minIndex + 1
|
|
|
blockSize = 0
|
|
|
|
|
|
#self spectra
|
|
|
spc = self.dataOutObj.data_spc[:,:,minIndex:maxIndex+1]
|
|
|
blockSize += spc.size
|
|
|
|
|
|
#cross spectra
|
|
|
cspc = None
|
|
|
if self.dataOutObj.data_cspc != None:
|
|
|
cspc = self.dataOutObj.data_cspc[:,:,minIndex:maxIndex+1]
|
|
|
blockSize += cspc.size
|
|
|
|
|
|
#DC channel
|
|
|
dc = self.dataOutObj.data_dc[:,minIndex:maxIndex+1]
|
|
|
blockSize += dc.size
|
|
|
|
|
|
self.dataOutObj.data_spc = spc
|
|
|
if cspc != None:
|
|
|
self.dataOutObj.data_cspc = cspc
|
|
|
self.dataOutObj.data_dc = dc
|
|
|
|
|
|
firstHeight = self.dataOutObj.heightList[minIndex]
|
|
|
|
|
|
self.dataOutObj.nHeights = nHeights
|
|
|
self.dataOutObj.m_ProcessingHeader.blockSize = blockSize
|
|
|
self.dataOutObj.m_ProcessingHeader.numHeights = nHeights
|
|
|
self.dataOutObj.m_ProcessingHeader.firstHeight = firstHeight
|
|
|
self.dataOutObj.m_RadarControllerHeader.numHeights = nHeights
|
|
|
|
|
|
self.dataOutObj.heightList = self.dataOutObj.heightList[minIndex:maxIndex+1]
|
|
|
|
|
|
|
|
|
class IncoherentIntegration:
|
|
|
|
|
|
integ_counter = None
|
|
|
data = None
|
|
|
navg = None
|
|
|
buffer = None
|
|
|
nIncohInt = 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
|
|
|
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,timeOfData):
|
|
|
"""
|
|
|
data
|
|
|
|
|
|
timeOfData [seconds]
|
|
|
"""
|
|
|
|
|
|
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.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 = timeOfData + self.timeIntervalInSeconds
|
|
|
else:
|
|
|
self.isReady = False
|
|
|
|