136 lines
5.3 KiB
Python
Executable File
136 lines
5.3 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
# Author: Cunren Liang
|
|
# Copyright 2021
|
|
|
|
import os
|
|
import copy
|
|
import argparse
|
|
import numpy as np
|
|
|
|
import isce
|
|
import isceobj
|
|
from isceobj.Constants import SPEED_OF_LIGHT
|
|
from isceobj.TopsProc.runIon import computeIonosphere
|
|
from isceobj.Alos2Proc.runIonFilt import reformatMaskedAreas
|
|
|
|
from Stack import ionParam
|
|
|
|
|
|
def createParser():
|
|
parser = argparse.ArgumentParser(description='compute ionosphere using lower and upper band interferograms')
|
|
parser.add_argument('-l', '--lower', dest='lower', type=str, required=True,
|
|
help='lower band interferogram')
|
|
parser.add_argument('-u', '--upper', dest='upper', type=str, required=True,
|
|
help='upper band interferogram')
|
|
parser.add_argument('-c', '--coherence', dest='coherence', type=str, required=True,
|
|
help='input coherence')
|
|
parser.add_argument('-i', '--ionosphere', dest='ionosphere', type=str, required=True,
|
|
help='output ionosphere')
|
|
parser.add_argument('-o', '--coherence_output', dest='coherence_output', type=str, required=True,
|
|
help='output coherence file name. simply copy input coherence')
|
|
parser.add_argument('-m', '--masked_areas', dest='masked_areas', type=int, nargs='+', action='append', default=None,
|
|
help='This is a 2-d list. Each element in the 2-D list is a four-element list: [firstLine, lastLine, firstColumn, lastColumn], with line/column numbers starting with 1. If one of the four elements is specified with -1, the program will use firstLine/lastLine/firstColumn/lastColumn instead. e.g. two areas masked out: --masked_areas 10 20 10 20 --masked_areas 110 120 110 120')
|
|
#parser.add_argument('-m', '--masked_areas', dest='masked_areas', type=int, nargs='+', default=None,
|
|
# help='This is a 2-d list. Each element in the 2-D list is a four-element list: [firstLine, lastLine, firstColumn, lastColumn], with line/column numbers starting with 1. If one of the four elements is specified with -1, the program will use firstLine/lastLine/firstColumn/lastColumn instead. e.g. two areas masked out: --masked_areas 10 20 10 20 110 120 110 120')
|
|
|
|
return parser
|
|
|
|
|
|
def cmdLineParse(iargs = None):
|
|
parser = createParser()
|
|
return parser.parse_args(args=iargs)
|
|
|
|
|
|
def main(iargs=None):
|
|
'''
|
|
'''
|
|
inps = cmdLineParse(iargs)
|
|
|
|
# #convert 1-d list to 2-d list
|
|
# if len(inps.masked_areas) % 4 != 0:
|
|
# raise Exception('each maksed area must have four elements')
|
|
# else:
|
|
# masked_areas = []
|
|
# n = np.int32(len(inps.masked_areas)/4)
|
|
# for i in range(n):
|
|
# masked_areas.append([inps.masked_areas[i*4+0], inps.masked_areas[i*4+1], inps.masked_areas[i*4+2], inps.masked_areas[i*4+3]])
|
|
# inps.masked_areas = masked_areas
|
|
|
|
###################################
|
|
#SET PARAMETERS HERE
|
|
#THESE SHOULD BE GOOD ENOUGH, NO NEED TO SET IN setup(self)
|
|
corThresholdAdj = 0.85
|
|
###################################
|
|
|
|
print('computing ionosphere')
|
|
#get files
|
|
lowerUnwfile = inps.lower
|
|
upperUnwfile = inps.upper
|
|
corfile = inps.coherence
|
|
|
|
#use image size from lower unwrapped interferogram
|
|
img = isceobj.createImage()
|
|
img.load(lowerUnwfile + '.xml')
|
|
width = img.width
|
|
length = img.length
|
|
|
|
lowerUnw = (np.fromfile(lowerUnwfile, dtype=np.float32).reshape(length*2, width))[1:length*2:2, :]
|
|
upperUnw = (np.fromfile(upperUnwfile, dtype=np.float32).reshape(length*2, width))[1:length*2:2, :]
|
|
#lowerAmp = (np.fromfile(lowerUnwfile, dtype=np.float32).reshape(length*2, width))[0:length*2:2, :]
|
|
#upperAmp = (np.fromfile(upperUnwfile, dtype=np.float32).reshape(length*2, width))[0:length*2:2, :]
|
|
cor = (np.fromfile(corfile, dtype=np.float32).reshape(length*2, width))[1:length*2:2, :]
|
|
#amp = np.sqrt(lowerAmp**2+upperAmp**2)
|
|
amp = (np.fromfile(corfile, dtype=np.float32).reshape(length*2, width))[0:length*2:2, :]
|
|
|
|
#masked out user-specified areas
|
|
if inps.masked_areas != None:
|
|
maskedAreas = reformatMaskedAreas(inps.masked_areas, length, width)
|
|
for area in maskedAreas:
|
|
lowerUnw[area[0]:area[1], area[2]:area[3]] = 0
|
|
upperUnw[area[0]:area[1], area[2]:area[3]] = 0
|
|
cor[area[0]:area[1], area[2]:area[3]] = 0
|
|
|
|
ionParamObj=ionParam()
|
|
ionParamObj.configure()
|
|
|
|
#compute ionosphere
|
|
fl = SPEED_OF_LIGHT / ionParamObj.radarWavelengthLower
|
|
fu = SPEED_OF_LIGHT / ionParamObj.radarWavelengthUpper
|
|
adjFlag = 1
|
|
ionos = computeIonosphere(lowerUnw, upperUnw, cor, fl, fu, adjFlag, corThresholdAdj, 0)
|
|
|
|
#dump ionosphere
|
|
outFilename = inps.ionosphere
|
|
os.makedirs(os.path.dirname(inps.ionosphere), exist_ok=True)
|
|
|
|
ion = np.zeros((length*2, width), dtype=np.float32)
|
|
ion[0:length*2:2, :] = amp
|
|
ion[1:length*2:2, :] = ionos
|
|
ion.astype(np.float32).tofile(outFilename)
|
|
img.filename = outFilename
|
|
img.extraFilename = outFilename + '.vrt'
|
|
img.renderHdr()
|
|
|
|
#dump coherence
|
|
outFilename = inps.coherence_output
|
|
os.makedirs(os.path.dirname(inps.coherence_output), exist_ok=True)
|
|
|
|
ion[1:length*2:2, :] = cor
|
|
ion.astype(np.float32).tofile(outFilename)
|
|
img.filename = outFilename
|
|
img.extraFilename = outFilename + '.vrt'
|
|
img.renderHdr()
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
'''
|
|
Main driver.
|
|
'''
|
|
# Main Driver
|
|
main()
|
|
|
|
|
|
|