|
|
'''
|
|
|
@author: Daniel Suarez
|
|
|
'''
|
|
|
import numpy
|
|
|
from .jroproc_base import ProcessingUnit, Operation
|
|
|
from schainpy.model.data.jroamisr import AMISR
|
|
|
|
|
|
class AMISRProc(ProcessingUnit):
|
|
|
def __init__(self, **kwargs):
|
|
|
ProcessingUnit.__init__(self, **kwargs)
|
|
|
self.objectDict = {}
|
|
|
self.dataOut = AMISR()
|
|
|
|
|
|
def run(self):
|
|
|
if self.dataIn.type == 'AMISR':
|
|
|
self.dataOut.copy(self.dataIn)
|
|
|
|
|
|
|
|
|
class PrintInfo(Operation):
|
|
|
def __init__(self, **kwargs):
|
|
|
Operation.__init__(self, **kwargs)
|
|
|
self.__isPrinted = False
|
|
|
|
|
|
def run(self, dataOut):
|
|
|
|
|
|
if not self.__isPrinted:
|
|
|
print('Number of Records by File: %d'%dataOut.nRecords)
|
|
|
print('Number of Pulses: %d'%dataOut.nProfiles)
|
|
|
print('Number of Pulses by Frame: %d'%dataOut.npulseByFrame)
|
|
|
print('Number of Samples by Pulse: %d'%len(dataOut.heightList))
|
|
|
print('Ipp Seconds: %f'%dataOut.ippSeconds)
|
|
|
print('Number of Beams: %d'%dataOut.nBeams)
|
|
|
print('BeamCodes:')
|
|
|
beamStrList = ['Beam %d -> Code=%d, azimuth=%2.2f, zenith=%2.2f, gain=%2.2f'%(k,v[0],v[1],v[2],v[3]) for k,v in list(dataOut.beamCodeDict.items())]
|
|
|
for b in beamStrList:
|
|
|
print(b)
|
|
|
self.__isPrinted = True
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
class BeamSelector(Operation):
|
|
|
profileIndex = None
|
|
|
nProfiles = None
|
|
|
|
|
|
def __init__(self, **kwargs):
|
|
|
Operation.__init__(self, **kwargs)
|
|
|
self.profileIndex = 0
|
|
|
self.__isConfig = False
|
|
|
|
|
|
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
|
|
|
|
|
|
def run(self, dataOut, beam=None):
|
|
|
|
|
|
dataOut.flagNoData = True
|
|
|
|
|
|
if not(self.__isConfig):
|
|
|
|
|
|
self.nProfiles = dataOut.nProfiles
|
|
|
self.profileIndex = dataOut.profileIndex
|
|
|
self.__isConfig = True
|
|
|
|
|
|
if beam != None:
|
|
|
if self.isProfileInList(dataOut.beamRangeDict[beam]):
|
|
|
beamInfo = dataOut.beamCodeDict[beam]
|
|
|
dataOut.azimuth = beamInfo[1]
|
|
|
dataOut.zenith = beamInfo[2]
|
|
|
dataOut.gain = beamInfo[3]
|
|
|
dataOut.flagNoData = False
|
|
|
|
|
|
self.incIndex()
|
|
|
return 1
|
|
|
|
|
|
else:
|
|
|
raise ValueError("BeamSelector needs beam value")
|
|
|
|
|
|
return 0
|
|
|
|
|
|
class ProfileToChannels(Operation):
|
|
|
|
|
|
def __init__(self, **kwargs):
|
|
|
Operation.__init__(self, **kwargs)
|
|
|
self.__isConfig = False
|
|
|
self.__counter_chan = 0
|
|
|
self.buffer = None
|
|
|
|
|
|
def isProfileInList(self, profileList):
|
|
|
|
|
|
if self.profileIndex not in profileList:
|
|
|
return False
|
|
|
|
|
|
return True
|
|
|
|
|
|
def run(self, dataOut):
|
|
|
|
|
|
dataOut.flagNoData = True
|
|
|
|
|
|
if not(self.__isConfig):
|
|
|
nchannels = len(list(dataOut.beamRangeDict.keys()))
|
|
|
nsamples = dataOut.nHeights
|
|
|
self.buffer = numpy.zeros((nchannels, nsamples), dtype = 'complex128')
|
|
|
dataOut.beam.codeList = [dataOut.beamCodeDict[x][0] for x in range(nchannels)]
|
|
|
dataOut.beam.azimuthList = [dataOut.beamCodeDict[x][1] for x in range(nchannels)]
|
|
|
dataOut.beam.zenithList = [dataOut.beamCodeDict[x][2] for x in range(nchannels)]
|
|
|
self.__isConfig = True
|
|
|
|
|
|
for i in range(self.buffer.shape[0]):
|
|
|
if dataOut.profileIndex in dataOut.beamRangeDict[i]:
|
|
|
self.buffer[i,:] = dataOut.data
|
|
|
break
|
|
|
|
|
|
|
|
|
self.__counter_chan += 1
|
|
|
|
|
|
if self.__counter_chan >= self.buffer.shape[0]:
|
|
|
self.__counter_chan = 0
|
|
|
dataOut.data = self.buffer.copy()
|
|
|
dataOut.channelList = list(range(self.buffer.shape[0]))
|
|
|
self.__isConfig = False
|
|
|
dataOut.flagNoData = False
|
|
|
pass
|
|
|
|