jroproc_amisr.py
143 lines
| 4.4 KiB
| text/x-python
|
PythonLexer
|
r491 | ''' | ||
@author: Daniel Suarez | ||||
''' | ||||
|
r501 | import numpy | ||
|
r1167 | from .jroproc_base import ProcessingUnit, Operation | ||
|
r568 | from schainpy.model.data.jroamisr import AMISR | ||
|
r491 | |||
class AMISRProc(ProcessingUnit): | ||||
|
r1080 | def __init__(self, **kwargs): | ||
ProcessingUnit.__init__(self, **kwargs) | ||||
|
r491 | self.objectDict = {} | ||
self.dataOut = AMISR() | ||||
def run(self): | ||||
if self.dataIn.type == 'AMISR': | ||||
self.dataOut.copy(self.dataIn) | ||||
|
r1287 | class PrintInfoAMISR(Operation): | ||
|
r1080 | def __init__(self, **kwargs): | ||
Operation.__init__(self, **kwargs) | ||||
|
r497 | self.__isPrinted = False | ||
|
r491 | |||
def run(self, dataOut): | ||||
|
r497 | if not self.__isPrinted: | ||
|
r1383 | 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) | ||||
|
r1167 | print('BeamCodes:') | ||
|
r1383 | 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())] | ||
|
r497 | for b in beamStrList: | ||
|
r1167 | print(b) | ||
|
r497 | self.__isPrinted = True | ||
return | ||||
|
r491 | |||
class BeamSelector(Operation): | ||||
profileIndex = None | ||||
nProfiles = None | ||||
|
r1080 | def __init__(self, **kwargs): | ||
Operation.__init__(self, **kwargs) | ||||
|
r491 | self.profileIndex = 0 | ||
|
r504 | self.__isConfig = False | ||
|
r491 | |||
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 | ||||
|
r504 | |||
if not(self.__isConfig): | ||||
self.nProfiles = dataOut.nProfiles | ||||
self.profileIndex = dataOut.profileIndex | ||||
self.__isConfig = True | ||||
|
r491 | |||
if beam != None: | ||||
if self.isProfileInList(dataOut.beamRangeDict[beam]): | ||||
|
r499 | beamInfo = dataOut.beamCodeDict[beam] | ||
dataOut.azimuth = beamInfo[1] | ||||
dataOut.zenith = beamInfo[2] | ||||
dataOut.gain = beamInfo[3] | ||||
|
r491 | dataOut.flagNoData = False | ||
self.incIndex() | ||||
return 1 | ||||
else: | ||||
|
r1167 | raise ValueError("BeamSelector needs beam value") | ||
|
r491 | |||
|
r501 | return 0 | ||
class ProfileToChannels(Operation): | ||||
|
r1080 | def __init__(self, **kwargs): | ||
Operation.__init__(self, **kwargs) | ||||
|
r501 | self.__isConfig = False | ||
self.__counter_chan = 0 | ||||
self.buffer = None | ||||
|
r505 | def isProfileInList(self, profileList): | ||
if self.profileIndex not in profileList: | ||||
return False | ||||
return True | ||||
|
r501 | |||
def run(self, dataOut): | ||||
dataOut.flagNoData = True | ||||
if not(self.__isConfig): | ||||
|
r1167 | nchannels = len(list(dataOut.beamRangeDict.keys())) | ||
|
r501 | nsamples = dataOut.nHeights | ||
|
r1383 | self.buffer = numpy.zeros((nchannels, nsamples), dtype='complex128') | ||
|
r505 | 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)] | ||||
|
r501 | self.__isConfig = True | ||
for i in range(self.buffer.shape[0]): | ||||
if dataOut.profileIndex in dataOut.beamRangeDict[i]: | ||||
|
r1383 | self.buffer[i, :] = dataOut.data | ||
|
r501 | break | ||
|
r505 | |||
|
r501 | self.__counter_chan += 1 | ||
if self.__counter_chan >= self.buffer.shape[0]: | ||||
self.__counter_chan = 0 | ||||
dataOut.data = self.buffer.copy() | ||||
|
r1167 | dataOut.channelList = list(range(self.buffer.shape[0])) | ||
|
r501 | self.__isConfig = False | ||
dataOut.flagNoData = False | ||||
pass | ||||
|
r1383 | |||