#! /usr/bin/env python ################################################################# ### This program is part of PyINT v2.1 ### ### Copy Right (c): 2017-2019, Yunmeng Cao ### ### Author: Yunmeng Cao ### ### Contact : ymcmrs@gmail.com ### ################################################################# import numpy as np import os import sys import argparse from pyint import _utils as ut def _run_or_raise(call_str, stage): rc = os.system(call_str) if rc != 0: raise RuntimeError('%s failed with rc=%s: %s' % (stage, rc, call_str)) return rc def _safe_remove(path): if path and os.path.exists(path): os.remove(path) def _copy_file(src, dst): ut.copy_file(src, dst) def cmdLineParse(): parser = argparse.ArgumentParser(description='Coregister SM mode SLC to a reference SLC image using GAMMA.',\ formatter_class=argparse.RawTextHelpFormatter,\ epilog=INTRODUCTION+'\n'+EXAMPLE) parser.add_argument('projectName', help='Name of project.') parser.add_argument('sdate', help='date of the slave SLC image. [mater date is read from template]') inps = parser.parse_args() return inps INTRODUCTION = ''' ------------------------------------------------------------------- Coregister SM mode SLC to a reference SLC image using GAMMA. [The reference date or master date will be read from the template file.] ''' EXAMPLE = """Usage: coreg_gamma.py projectName Sdate coreg_gamma.py PacayaT163TsxHhA 20150102 ------------------------------------------------------------------- """ def main(argv): inps = cmdLineParse() projectName = inps.projectName Sdate = inps.sdate scratchDir = os.getenv('SCRATCHDIR') templateDir = os.getenv('TEMPLATEDIR') templateFile = templateDir + "/" + projectName + ".template" slcDir = scratchDir + '/' + projectName + "/SLC" rslcDir = scratchDir + '/' + projectName + "/RSLC" if not os.path.isdir(rslcDir): os.mkdir(rslcDir) #workDir = processDir + '/' + igramDir workDir = rslcDir + '/' + Sdate if not os.path.isdir(workDir): os.mkdir(workDir) templateDict=ut.update_template(templateFile) rlks = templateDict['range_looks'] azlks = templateDict['azimuth_looks'] Mdate = templateDict['masterDate'] IFGPair = Mdate + '-' + Sdate demDir = scratchDir + '/' + projectName + '/DEM' SslcDir = slcDir + '/' + Sdate Samp = slcDir + '/' + Sdate + '/' + Sdate + '_' + rlks + 'rlks.amp' SampPar = slcDir + '/' + Sdate + '/' + Sdate + '_' + rlks + 'rlks.amp.par' Sramp = rslcDir + '/' + Sdate + '/' + Sdate + '_' + rlks + 'rlks.amp' SrampPar = rslcDir + '/' + Sdate + '/' + Sdate + '_' + rlks + 'rlks.amp.par' Sslc = slcDir + '/' + Sdate + '/' + Sdate + '.slc' SslcPar = slcDir + '/' + Sdate + '/' + Sdate + '.slc.par' SrslcDir = rslcDir + "/" + Sdate Srslc = SrslcDir + "/" + Sdate + ".rslc" SrslcPar = SrslcDir + "/" + Sdate + ".rslc.par" Srslc0 = SrslcDir + "/" + Sdate + ".rslc0" SrslcPar0 = SrslcDir + "/" + Sdate + ".rslc0.par" ##################################################### ## copy all of the master files into slave folder for parallel processing remove_file = [] Mslc0 = slcDir + '/' + Mdate + '/' + Mdate + '.slc' MslcPar0 = slcDir + '/' + Mdate + '/' + Mdate + '.slc.par' Mamp0 = slcDir + '/' + Mdate + '/' + Mdate + '_' + rlks + 'rlks.amp' MampPar0 = slcDir + '/' + Mdate + '/' + Mdate + '_' + rlks + 'rlks.amp.par' Mamp0_dem = demDir + '/' + Mdate + '_' + rlks + 'rlks.amp' MampPar0_dem = demDir + '/' + Mdate + '_' + rlks + 'rlks.amp.par' HGTSIM0 = demDir + '/' + Mdate + '_' + rlks + 'rlks.rdc.dem' if not os.path.isfile(HGTSIM0): call_str = 'generate_rdc_dem.py ' + projectName _run_or_raise(call_str, 'generate_rdc_dem') if not os.path.isfile(Mamp0) and os.path.isfile(Mamp0_dem): ut.copy_file(Mamp0_dem, Mamp0) if not os.path.isfile(MampPar0) and os.path.isfile(MampPar0_dem): ut.copy_file(MampPar0_dem, MampPar0) if not os.path.isfile(Mamp0) or not os.path.isfile(MampPar0): call_str = 'multi_look ' + Mslc0 + ' ' + MslcPar0 + ' ' + Mamp0 + ' ' + MampPar0 + ' ' + rlks + ' ' + azlks _run_or_raise(call_str, 'master_multi_look') if not os.path.isfile(Samp) or not os.path.isfile(SampPar): call_str = 'multi_look ' + Sslc + ' ' + SslcPar + ' ' + Samp + ' ' + SampPar + ' ' + rlks + ' ' + azlks _run_or_raise(call_str, 'slave_multi_look') Mslc = slcDir + '/' + Sdate + '/' + Mdate + '.slc' MslcPar = slcDir + '/' + Sdate + '/' + Mdate + '.slc.par' Mamp = slcDir + '/' + Sdate + '/' + Mdate + '_' + rlks + 'rlks.amp' MampPar = slcDir + '/' + Sdate + '/' + Mdate + '_' + rlks + 'rlks.amp.par' HGTSIM = slcDir + '/' + Sdate + '/' + Mdate + '_' + rlks + 'rlks.rdc.dem' ut.copy_file(HGTSIM0,HGTSIM) ut.copy_file(Mslc0,Mslc) ut.copy_file(MslcPar0,MslcPar) ut.copy_file(Mamp0,Mamp) ut.copy_file(MampPar0,MampPar) ####################################################### # define process files # lt0 = workDir + "/lt0" lt1 = workDir + "/lt1" mli0 = workDir + "/mli0" diff0 = workDir + "/diff0" offs0 = workDir + "/offs0" snr0 = workDir + "/snr0" offsets0 = workDir + "/offsets0" coffs0 = workDir + "/coffs0" coffsets0 = workDir + "/coffsets0" off = workDir + "/" + IFGPair + ".off" offs = workDir + "/offs" snr = workDir + "/snr" offsets = workDir + "/offsets" coffs = workDir + "/coffs" coffsets = workDir + "/coffsets" OFFSTD = workDir + "/" + IFGPair + ".off_std" ############################################## call_str = "rdc_trans " + MampPar + " " + HGTSIM + " " + SampPar + " " + lt0 _run_or_raise(call_str, 'rdc_trans') width_Mamp = ut.read_gamma_par(MampPar, 'read', 'range_samples') width_Samp = ut.read_gamma_par(SampPar, 'read', 'range_samples') line_Samp = ut.read_gamma_par(SampPar, 'read', 'azimuth_lines') call_str = "geocode " + lt0 + " " + Mamp + " " + width_Mamp + " " + mli0 + " " + width_Samp + " " + line_Samp + " 2 0" _run_or_raise(call_str, 'geocode_lt0') call_str = "create_diff_par " + SampPar + " - " + diff0 + " 1 0" _run_or_raise(call_str, 'create_diff_par') try: call_str = "init_offsetm " + mli0 + " " + Samp + " " + diff0 + " 1 1" _run_or_raise(call_str, 'init_offsetm') call_str = "offset_pwrm " + mli0 + " " + Samp + " " + diff0 + " " + offs0 + " " + snr0 + " 256 256 " + offsets0 + " 2 32 32" _run_or_raise(call_str, 'offset_pwrm') call_str = "offset_fitm " + offs0 + " " + snr0 + " " + diff0 + " " + coffs0 + " " + coffsets0 + " - 4" _run_or_raise(call_str, 'offset_fitm') call_str = "gc_map_fine " + lt0 + " " + width_Mamp + " " + diff0 + " " + lt1 _run_or_raise(call_str, 'gc_map_fine') except RuntimeError as exc: print('ERROR: initial DEM-assisted offset refinement failed; aborting coregistration instead of falling back') print(str(exc)) raise call_str = "SLC_interp_lt " + Sslc + " " + MslcPar + " " + SslcPar + " " + lt1 + " " + MampPar + " " + SampPar + " - " + Srslc0 + " " + SrslcPar0 _run_or_raise(call_str, 'SLC_interp_lt_initial') ############################################ Refinement ############################################ try: call_str = "create_offset " + MslcPar + " " + SrslcPar0 + " " + off + " 1 - - 0" _run_or_raise(call_str, 'create_offset') call_str = "offset_pwr " + Mslc + " " + Srslc0 + " " + MslcPar + " " + SrslcPar0 + " " + off + " " + offs + " " + snr + " " + templateDict['rwin4cor'] + " " + templateDict['azwin4cor'] + " " + offsets + " 2 " + templateDict['rsample4cor'] + " " + templateDict['azsample4cor'] _run_or_raise(call_str, 'offset_pwr_coarse') call_str = "offset_fit " + offs + " " + snr + " " + off + " " + coffs + " " + coffsets + " - 3" _run_or_raise(call_str, 'offset_fit_coarse') rfwin4cor = str(int(1/2*int(templateDict['rwin4cor']))) azfwin4cor = str(int(1/2*int(templateDict['azwin4cor']))) rfsample4cor = str(2*int(templateDict['rsample4cor'])) azfsample4cor = str(2*int(templateDict['azsample4cor'])) call_str = "offset_pwr " + Mslc + " " + Srslc0 + " " + MslcPar + " " + SrslcPar0 + " " + off + " " + offs + " " + snr + " " + rfwin4cor + " " + azfwin4cor + " " + offsets + " 2 " + rfsample4cor + " " + azfsample4cor _run_or_raise(call_str, 'offset_pwr_fine') call_str = "offset_fit " + offs + " " + snr + " " + off + " " + coffs + " " + coffsets + " - 3 >" + OFFSTD _run_or_raise(call_str, 'offset_fit_fine') ############################################ Resampling ############################################ call_str = "SLC_interp_lt " + Sslc + " " + MslcPar + " " + SslcPar + " " + lt1 + " " + MampPar + " " + SampPar + " " + off + " " + Srslc + " " + SrslcPar _run_or_raise(call_str, 'SLC_interp_lt_final') except RuntimeError as exc: print('ERROR: offset refinement failed; aborting coregistration instead of promoting the provisional RSLC') print(str(exc)) raise call_str = 'multi_look ' + Srslc + ' ' + SrslcPar + ' ' + Sramp + ' ' + SrampPar + ' ' + rlks + ' ' + azlks _run_or_raise(call_str, 'multi_look_rslc') nWidth = ut.read_gamma_par(SrampPar, 'read', 'range_samples') call_str = 'raspwr ' + Sramp + ' ' + nWidth _run_or_raise(call_str, 'raspwr') for path in ( lt0, lt1, mli0, diff0, offs0, snr0, offsets0, coffs0, coffsets0, off, offs, snr, offsets, coffs, coffsets, Srslc0, SrslcPar0, Mslc, Mamp, HGTSIM, ): _safe_remove(path) print("Coregistration with DEM is done!") sys.exit(0) if __name__ == '__main__': main(sys.argv[:])