option for discarding burst properties in TOPS ionosphere estimation

LT1AB
CunrenLiang 2020-10-19 19:49:28 -07:00 committed by CunrenLiang
parent 9837bf381c
commit a7b0287a0c
4 changed files with 119 additions and 13 deletions

View File

@ -438,6 +438,20 @@ ION_DO_ION = Application.Parameter('ION_doIon',
mandatory = False,
doc = '')
ION_APPLY_ION = Application.Parameter('ION_applyIon',
public_name = 'apply ionosphere correction',
default = False,
type = bool,
mandatory = False,
doc = '')
ION_CONSIDER_BURST_PROPERTIES = Application.Parameter('ION_considerBurstProperties',
public_name = 'consider burst properties in ionosphere computation',
default = False,
type = bool,
mandatory = False,
doc = '')
ION_START_STEP = Application.Parameter(
'ION_startStep',
public_name='start ionosphere step',
@ -649,6 +663,8 @@ class TopsInSAR(Application):
########################################################
#for ionospheric correction
ION_DO_ION,
ION_APPLY_ION,
ION_CONSIDER_BURST_PROPERTIES,
ION_START_STEP,
ION_END_STEP,
ION_ION_HEIGHT,
@ -734,6 +750,9 @@ class TopsInSAR(Application):
if(self.geocode_list is None):
#if not provided by the user use the list from InsarProc
self.geocode_list = self.insar.geocode_list
#for ionosphere
if 'topophase.ion' not in self.geocode_list:
self.geocode_list.append('topophase.ion')
else:
#if geocode_list defined here, then give it to InsarProc
#for consistency between insarApp and InsarProc and warn the user

View File

@ -42,6 +42,7 @@ def setup(self):
#SECTION 1. PROCESSING CONTROL PARAMETERS
#1. suggested default values of the parameters
ionParam.doIon = False
ionParam.considerBurstProperties = False
ionParam.startStep = ionParam.allSteps[0]
ionParam.endStep = ionParam.allSteps[-1]
@ -77,6 +78,7 @@ def setup(self):
#2. accept the above parameters from topsApp.py
ionParam.doIon = self.ION_doIon
ionParam.considerBurstProperties = self.ION_considerBurstProperties
ionParam.startStep = self.ION_startStep
ionParam.endStep = self.ION_endStep
@ -2637,16 +2639,17 @@ def runIon(self):
if run_step('filt_gaussian', ionParam):
filt_gaussian(self, ionParam)
#only do the following steps when considering burst properties
#ionosphere shift
if run_step('ionosphere_shift', ionParam):
if run_step('ionosphere_shift', ionParam) and ionParam.considerBurstProperties:
ionosphere_shift(self, ionParam)
#resample from ionospheric layer to ground layer, get ionosphere for each burst
if run_step('ion2grd', ionParam):
if run_step('ion2grd', ionParam) and ionParam.considerBurstProperties:
ion2grd(self, ionParam)
#esd
if run_step('esd', ionParam):
if run_step('esd', ionParam) and ionParam.considerBurstProperties:
esd(self, ionParam)
#pure esd without applying ionospheric correction

View File

@ -20,6 +20,38 @@ import logging
from isceobj.Util.ImageUtil import ImageLib as IML
def interpolateDifferentNumberOfLooks(inputData, lengtho, widtho, nrli, nali, nrlo, nalo):
'''
inputData: input numpy 2-d array
lengtho: length of output array
widtho: width of output array
nrli: number of range looks input
nali: number of azimuth looks input
nrlo: number of range looks output
nalo: number of azimuth looks output
'''
import numpy as np
from scipy.interpolate import interp1d
(lengthi, widthi) = inputData.shape
indexi = np.linspace(0, widthi-1, num=widthi, endpoint=True)
indexo = np.linspace(0, widtho-1, num=widtho, endpoint=True) * nrli/nrlo + (nrli-nrlo)/(2.0*nrlo)
outputData0 = np.zeros((lengthi, widtho), dtype=inputData.dtype)
for i in range(lengthi):
f = interp1d(indexi, inputData[i,:], kind='cubic', fill_value="extrapolate")
outputData0[i, :] = f(indexo)
indexi = np.linspace(0, lengthi-1, num=lengthi, endpoint=True)
indexo = np.linspace(0, lengtho-1, num=lengtho, endpoint=True) * nali/nalo + (nali-nalo)/(2.0*nalo)
outputData = np.zeros((lengtho, widtho), dtype=inputData.dtype)
for j in range(widtho):
f = interp1d(indexi, outputData0[:, j], kind='cubic', fill_value="extrapolate")
outputData[:, j] = f(indexo)
return outputData
def mergeBox(frame):
'''
Merging using VRTs.
@ -666,14 +698,16 @@ def runMergeBursts(self, adjust=1):
#totalLooksThreshold = 9
totalLooksThreshold = 99999999999999
#if doing ionospheric correction
ionCorrection = self.ION_doIon
doIon = self.ION_doIon
applyIon = self.ION_applyIon
considerBurstProperties = self.ION_considerBurstProperties
ionDirname = 'ion/ion_burst'
mergedIonname = 'topophase.ion'
originalIfgname = 'topophase_ori.flat'
#########################################
# backing out the tigher constraints for ionosphere as it could itnroduce gabs between along track products produced seperately
if not ionCorrection:
if not (doIon and considerBurstProperties):
adjust=0
#########################################
@ -712,7 +746,7 @@ def runMergeBursts(self, adjust=1):
#restore
frames = frames_bak
else:
validOnly==True
validOnly=True
#########################################
@ -738,7 +772,7 @@ def runMergeBursts(self, adjust=1):
mergeBursts2(frames, os.path.join(self._insar.fineIfgDirname, 'IW%d', 'burst_%02d.int'), burstIndex, box, os.path.join(mergedir, self._insar.mergedIfgname+suffix), virtual=virtual, validOnly=True)
if self.numberAzimuthLooks * self.numberRangeLooks < totalLooksThreshold:
mergeBursts2(frames, os.path.join(self._insar.fineIfgDirname, 'IW%d', 'burst_%02d.cor'), burstIndex, box, os.path.join(mergedir, self._insar.correlationFilename+suffix), virtual=virtual, validOnly=True)
if ionCorrection == True:
if doIon and considerBurstProperties:
mergeBursts2(frames, os.path.join(ionDirname, 'IW%d', 'burst_%02d.ion'), burstIndex, box, os.path.join(mergedir, mergedIonname+suffix), virtual=virtual, validOnly=True)
@ -782,13 +816,61 @@ def runMergeBursts(self, adjust=1):
os.remove(os.path.join(mergedir, pwrfile+'.xml'))
os.remove(os.path.join(mergedir, pwrfile+'.vrt'))
if ionCorrection:
if doIon:
if considerBurstProperties:
multilook(os.path.join(mergedir, mergedIonname+suffix),
outname = os.path.join(mergedir, mergedIonname),
alks = self.numberAzimuthLooks, rlks=self.numberRangeLooks)
else:
ionFilt = 'ion/ion_cal/filt.ion'
img = isceobj.createImage()
img.load(ionFilt+'.xml')
ionFiltImage = (np.fromfile(ionFilt, dtype=np.float32).reshape(img.length*2, img.width))[1:img.length*2:2, :]
img = isceobj.createImage()
img.load(os.path.join(mergedir, self._insar.mergedIfgname)+'.xml')
#interpolate original
ionFiltImageOut = interpolateDifferentNumberOfLooks(ionFiltImage, img.length, img.width, self.numberRangeLooks, self.numberAzimuthLooks, self.ION_numberRangeLooks, self.ION_numberAzimuthLooks)
ionFiltOut = os.path.join(mergedir, mergedIonname)
ionFiltImageOut.astype(np.float32).tofile(ionFiltOut)
image = isceobj.createImage()
image.setDataType('FLOAT')
image.setFilename(ionFiltOut)
image.extraFilename = ionFiltOut + '.vrt'
image.setWidth(img.width)
image.setLength(img.length)
#image.setAccessMode('read')
#image.createImage()
image.renderHdr()
#image.finalizeImage()
else:
print('Skipping multi-looking ....')
if self.doInSAR and doIon and (not considerBurstProperties):
ionFilt = 'ion/ion_cal/filt.ion'
img = isceobj.createImage()
img.load(ionFilt+'.xml')
ionFiltImage = (np.fromfile(ionFilt, dtype=np.float32).reshape(img.length*2, img.width))[1:img.length*2:2, :]
img = isceobj.createImage()
img.load(os.path.join(mergedir, self._insar.mergedIfgname+suffix)+'.xml')
#interpolate original
ionFiltImageOut = interpolateDifferentNumberOfLooks(ionFiltImage, img.length, img.width, self.numberRangeLooks, self.numberAzimuthLooks, self.ION_numberRangeLooks, self.ION_numberAzimuthLooks)
ionFiltOut = os.path.join(mergedir, mergedIonname)
ionFiltImageOut.astype(np.float32).tofile(ionFiltOut)
image = isceobj.createImage()
image.setDataType('FLOAT')
image.setFilename(ionFiltOut)
image.extraFilename = ionFiltOut + '.vrt'
image.setWidth(img.width)
image.setLength(img.length)
#image.setAccessMode('read')
#image.createImage()
image.renderHdr()
#image.finalizeImage()
#########################################
# STEP 4. APPLY CORRECTIONS
@ -796,8 +878,8 @@ def runMergeBursts(self, adjust=1):
#do ionospheric and other corrections here
#should also consider suffix, but usually we use multiple looks, so I ignore it for now.
if self.doInSAR:
if ionCorrection:
print('user choose to do ionospheric correction')
if doIon and applyIon:
print('user choose to apply ionospheric correction')
#define file names
interferogramFilename = os.path.join(mergedir, self._insar.mergedIfgname)

View File

@ -183,6 +183,8 @@ By default, ESD is always performed.
#ionospheric correction module parameters
#the values below are the default values used by the module
<property name="do ionosphere correction">False</property>
<property name="apply ionosphere correction">False</property>
<property name="consider burst properties in ionosphere computation">False</property>
#choose from: ['subband', 'rawion', 'grd2ion', 'filt_gaussian', 'ionosphere_shift', 'ion2grd', 'esd']
<property name="start ionosphere step">subband</property>
<property name="end ionosphere step">esd</property>