# swot_gamma_pipeline.py import os, math, sys, shutil import numpy as np sys.path.insert(0, '/usr/local/GAMMA_20241205') import py_gamma as pg def pget(par_path, key, idx=0, cast=float): val = pg.ParFile(par_path).get_value(key) if isinstance(val, (list, tuple)): v = val[idx] else: v = val return cast(v) def ensure_dir(path): os.makedirs(path, exist_ok=True) return os.path.abspath(path) # ---------- user-configurable defaults ---------- DEFAULTS = dict( # multilook r_dec=1, az_dec=5, rwin=3, azwin=15, # ORB orb_interval="0.5", orb_extra=150, orb_mode=2, # deskew interp=0, order=5, deramp=1, ph_corr=1, ) class SLC: def __init__(self, filepath, savepath=None, imgname=None): self.datapath = os.path.abspath(filepath) # savepath filename_parts = os.path.split(filepath)[-1].split("_") if savepath is None: savepath = "_".join(filename_parts[:7]) + "_output_v0" self.savepath = ensure_dir(savepath) # image name if imgname is None: imgname = filename_parts[7].split("T")[0] self.img = os.path.join(self.savepath, imgname) # raw (skewed) SLCs produced by par_SWOT_SLC self.r_minus = f"{self.img}_R_minus_y.slc" self.r_minus_par = f"{self.img}_R_minus_y.slc.par" self.r_plus = f"{self.img}_R_plus_y.slc" self.r_plus_par = f"{self.img}_R_plus_y.slc.par" # deskewed legs self.ra_slc = f"{self.img}_RA.slc" self.ra_slc_par = f"{self.img}_RA.slc.par" self.rb_slc = f"{self.img}_RB.slc" self.rb_slc_par = f"{self.img}_RB.slc.par" # MLIs self.ra_mli = f"{self.img}_RA.mli" self.ra_mli_par = f"{self.img}_RA.mli.par" self.rb_mli = f"{self.img}_RB.mli" self.rb_mli_par = f"{self.img}_RB.mli.par" # offsets self.offset = f"{self.img}.RA_RB.off" # SCH DEM from par_SWOT_SLC self.sch_dem = f"{self.img}.sch.dem" self.sch_dem_par = f"{self.img}.sch.dem_par" # ---- Stage 1: SLC initial processing ---- # Import SLC from NetCDF and process it def import_from_nc(self): pg.par_SWOT_SLC(self.datapath, self.img, self.sch_dem, self.sch_dem_par) print("[par_SWOT_SLC] wrote SLC legs + SCH DEM") # Orbit Propagation def propagate_orbit( self, interval=DEFAULTS["orb_interval"], extra=DEFAULTS["orb_extra"], mode=DEFAULTS["orb_mode"] ): pg.ORB_prop_SLC(self.r_minus_par, "-", interval, extra, mode) pg.ORB_prop_SLC(self.r_plus_par, "-", interval, extra, mode) print(f"[ORB_prop_SLC] interval={interval}s extra={extra}s mode={mode}") # Deskew SLC def deskew( self, interp=DEFAULTS["interp"], order=DEFAULTS["order"], deramp=DEFAULTS["deramp"], ph_corr=DEFAULTS["ph_corr"] ): nrA = pget(self.r_minus_par, "near_range_slc") nrB = pget(self.r_plus_par, "near_range_slc") pg.SLC_deskew(self.r_minus, self.r_minus_par, self.ra_slc, self.ra_slc_par, 0, interp, order, deramp, ph_corr, nrA) pg.SLC_deskew(self.r_plus, self.r_plus_par, self.rb_slc, self.rb_slc_par, 0, interp, order, deramp, ph_corr, nrB) print(f"[SLC_deskew] order={order} Lanczos, deramp={deramp}, ph_corr={ph_corr}") if __name__ == "__main__": filename = f"data/SWOT_L1B_HR_SLC_036_001_237R_20250720T123100_20250720T123111_PID0_01.nc" dempath = f"dem/dem_alps.tif" epsg = 4326 post_deg=0.0002777777 slc = SLC(filename) slc.import_from_nc() slc.propagate_orbit() slc.deskew()