151 lines
6.2 KiB
Python
151 lines
6.2 KiB
Python
import os
|
|
import logging
|
|
import numpy as np
|
|
import numpy.matlib
|
|
|
|
import isceobj
|
|
|
|
logger = logging.getLogger('isce.alos2insar.runIonCorrect')
|
|
|
|
def runIonCorrect(self):
|
|
'''resample original ionosphere and ionospheric correction
|
|
'''
|
|
if hasattr(self, 'doInSAR'):
|
|
if not self.doInSAR:
|
|
return
|
|
|
|
catalog = isceobj.Catalog.createCatalog(self._insar.procDoc.name)
|
|
self.updateParamemetersFromUser()
|
|
|
|
if not self.doIon:
|
|
catalog.printToLog(logger, "runIonCorrect")
|
|
self._insar.procDoc.addAllFromCatalog(catalog)
|
|
return
|
|
|
|
referenceTrack = self._insar.loadTrack(reference=True)
|
|
secondaryTrack = self._insar.loadTrack(reference=False)
|
|
|
|
from isceobj.Alos2Proc.runIonSubband import defineIonDir
|
|
ionDir = defineIonDir()
|
|
subbandPrefix = ['lower', 'upper']
|
|
|
|
ionCalDir = os.path.join(ionDir['ion'], ionDir['ionCal'])
|
|
os.makedirs(ionCalDir, exist_ok=True)
|
|
os.chdir(ionCalDir)
|
|
|
|
|
|
############################################################
|
|
# STEP 3. resample ionospheric phase
|
|
############################################################
|
|
from contrib.alos2proc_f.alos2proc_f import rect
|
|
from isceobj.Alos2Proc.Alos2ProcPublic import create_xml
|
|
from scipy.interpolate import interp1d
|
|
import shutil
|
|
|
|
#################################################
|
|
#SET PARAMETERS HERE
|
|
#interpolation method
|
|
interpolationMethod = 1
|
|
#################################################
|
|
|
|
print('\ninterpolate ionosphere')
|
|
|
|
ml2 = '_{}rlks_{}alks'.format(self._insar.numberRangeLooks1*self._insar.numberRangeLooksIon,
|
|
self._insar.numberAzimuthLooks1*self._insar.numberAzimuthLooksIon)
|
|
|
|
ml3 = '_{}rlks_{}alks'.format(self._insar.numberRangeLooks1*self._insar.numberRangeLooks2,
|
|
self._insar.numberAzimuthLooks1*self._insar.numberAzimuthLooks2)
|
|
|
|
ionfiltfile = 'filt_ion'+ml2+'.ion'
|
|
#ionrectfile = 'filt_ion'+ml3+'.ion'
|
|
ionrectfile = self._insar.multilookIon
|
|
|
|
img = isceobj.createImage()
|
|
img.load(ionfiltfile + '.xml')
|
|
width2 = img.width
|
|
length2 = img.length
|
|
|
|
img = isceobj.createImage()
|
|
img.load(os.path.join('../../', ionDir['insar'], self._insar.multilookDifferentialInterferogram) + '.xml')
|
|
width3 = img.width
|
|
length3 = img.length
|
|
|
|
#number of range looks output
|
|
nrlo = self._insar.numberRangeLooks1*self._insar.numberRangeLooks2
|
|
#number of range looks input
|
|
nrli = self._insar.numberRangeLooks1*self._insar.numberRangeLooksIon
|
|
#number of azimuth looks output
|
|
nalo = self._insar.numberAzimuthLooks1*self._insar.numberAzimuthLooks2
|
|
#number of azimuth looks input
|
|
nali = self._insar.numberAzimuthLooks1*self._insar.numberAzimuthLooksIon
|
|
|
|
if (self._insar.numberRangeLooks2 != self._insar.numberRangeLooksIon) or \
|
|
(self._insar.numberAzimuthLooks2 != self._insar.numberAzimuthLooksIon):
|
|
#this should be faster using fortran
|
|
if interpolationMethod == 0:
|
|
rect(ionfiltfile, ionrectfile,
|
|
width2,length2,
|
|
width3,length3,
|
|
nrlo/nrli, 0.0,
|
|
0.0, nalo/nali,
|
|
(nrlo-nrli)/(2.0*nrli),
|
|
(nalo-nali)/(2.0*nali),
|
|
'REAL','Bilinear')
|
|
#finer, but slower method
|
|
else:
|
|
ionfilt = np.fromfile(ionfiltfile, dtype=np.float32).reshape(length2, width2)
|
|
index2 = np.linspace(0, width2-1, num=width2, endpoint=True)
|
|
index3 = np.linspace(0, width3-1, num=width3, endpoint=True) * nrlo/nrli + (nrlo-nrli)/(2.0*nrli)
|
|
ionrect = np.zeros((length3, width3), dtype=np.float32)
|
|
for i in range(length2):
|
|
f = interp1d(index2, ionfilt[i,:], kind='cubic', fill_value="extrapolate")
|
|
ionrect[i, :] = f(index3)
|
|
|
|
index2 = np.linspace(0, length2-1, num=length2, endpoint=True)
|
|
index3 = np.linspace(0, length3-1, num=length3, endpoint=True) * nalo/nali + (nalo-nali)/(2.0*nali)
|
|
for j in range(width3):
|
|
f = interp1d(index2, ionrect[0:length2, j], kind='cubic', fill_value="extrapolate")
|
|
ionrect[:, j] = f(index3)
|
|
ionrect.astype(np.float32).tofile(ionrectfile)
|
|
del ionrect
|
|
create_xml(ionrectfile, width3, length3, 'float')
|
|
|
|
os.rename(ionrectfile, os.path.join('../../insar', ionrectfile))
|
|
os.rename(ionrectfile+'.vrt', os.path.join('../../insar', ionrectfile)+'.vrt')
|
|
os.rename(ionrectfile+'.xml', os.path.join('../../insar', ionrectfile)+'.xml')
|
|
os.chdir('../../insar')
|
|
else:
|
|
shutil.copyfile(ionfiltfile, os.path.join('../../insar', ionrectfile))
|
|
os.chdir('../../insar')
|
|
create_xml(ionrectfile, width3, length3, 'float')
|
|
#now we are in 'insar'
|
|
|
|
|
|
############################################################
|
|
# STEP 4. correct interferogram
|
|
############################################################
|
|
from isceobj.Alos2Proc.Alos2ProcPublic import renameFile
|
|
from isceobj.Alos2Proc.Alos2ProcPublic import runCmd
|
|
|
|
if self.applyIon:
|
|
print('\ncorrect interferogram')
|
|
if os.path.isfile(self._insar.multilookDifferentialInterferogramOriginal):
|
|
print('original interferogram: {} is already here, do not rename: {}'.format(self._insar.multilookDifferentialInterferogramOriginal, self._insar.multilookDifferentialInterferogram))
|
|
else:
|
|
print('renaming {} to {}'.format(self._insar.multilookDifferentialInterferogram, self._insar.multilookDifferentialInterferogramOriginal))
|
|
renameFile(self._insar.multilookDifferentialInterferogram, self._insar.multilookDifferentialInterferogramOriginal)
|
|
|
|
cmd = "imageMath.py -e='a*exp(-1.0*J*b)' --a={} --b={} -s BIP -t cfloat -o {}".format(
|
|
self._insar.multilookDifferentialInterferogramOriginal,
|
|
self._insar.multilookIon,
|
|
self._insar.multilookDifferentialInterferogram)
|
|
runCmd(cmd)
|
|
else:
|
|
print('\nionospheric phase estimation finished, but correction of interfeorgram not requested')
|
|
|
|
os.chdir('../')
|
|
|
|
catalog.printToLog(logger, "runIonCorrect")
|
|
self._insar.procDoc.addAllFromCatalog(catalog)
|
|
|