DISP‐NI Interface Acceptance Test Procedure - nasa/opera-sds-pge GitHub Wiki
This page contains instructions for performing Acceptance Testing for the DISP-NI Final delivery from the OPERA-ADT team. These instructions pertain to the latest version of the Interface release, currently delivery v1. These instructions assume the user has access to the JPL Artifactory-FN, and has Docker installed on their local machine.
NOTE: For the current delivery, all checks are expected pass when the AT has been run on an AMD-family instance type.
The image is currently hosted on JPL Artifactory-FN, which requires JPL VPN access and JPL credentials. You may also need to be added to the gov.nasa.jpl.opera.adt organization.
Once you have access, the container tarball delivery is available under general/gov/nasa/jpl/opera/adt/disp_ni/r1/interface/dockerimg_disp_ni_interface.tar
. Sample inputs and outputs are also available under general/gov/nasa/jpl/opera/adt/disp_ni/r1/interface/delivery_data_small.tar
.
Documentation for the current delivery is at general/gov/nasa/jpl/opera/adt/disp_ni/r1/interface/documents/
.
Download both images to a location on your local machine. This location will be referred to throughout this instructions as <DISP_NI_DIR>
The first step in running the DISP-NI image is to load it into Docker via the following command:
docker load -i <DISP_NI_DIR>/dockerimg_disp_ni_interface.tar
This should add the Docker image to your local repository with the name opera/disp-nisar
and the tag 0.1.1
.
Once the delivery_data_small.tar
file is downloaded to your local machine, unpack it to <DISP_NI_DIR>
:
tar -xvf delivery_data_small.tar
mv delivery_data_small/* .
rm -rf delivery_data_small/ delivery_data_small.tar
This will create the following directories within <DISP_NI_DIR>
:
- config_files/
- algorithm_parameters_forward.yaml
- algorithm_parameters_historical.yaml
- runconfig_forward.yaml
- runconfig_historical.yaml
- dynamic_ancillary_files/
- gunw_files/
- NISAR_L2_PR_GUNW_001_005_A_219_220_4020_SH_*.h5
- water_binary_mask.tif
- water_mask.tif
- water
- gunw_files/
- golden_output/
- historical/
- <expected .nc and .png products>
- compressed_slcs/
- compressed_20060630_20060630_20071118.h5
- historical/
- input_slcs/
- NISAR_L2_GSLC_NI_F150_*.h5
- static_ancillary_files/
- Frame_to_bounds_DISP-NI_v0.1.json
- opera-disp-nisar-reference-dates-dummy.json
Note that even though there are runconfigs for the "forward" case in this delivery, only the "historical" mode is currently supported.
In order to execute the SAS, the input file directory, runconfig and an output location will be mounted into the container instance as Docker Volumes. To help streamline this process, we recommend making the following changes within the <DISP_NI_DIR>
directory:
-
Create a directory named
runconfig
just under<DISP_NI_DIR>
, and copy only the "historical" runconfig YAML files into it:mkdir -p <DISP_NI_DIR>/runconfig
cp <DISP_NI_DIR>/config_files/*historical.yaml <DISP_NI_DIR>/runconfig/
-
Update the
algorithm_parameters_file
setting in<DISP_NI_DIR>/runconfig/runconfig_historical.yaml
to point at the version we just copied:
# REQUIRED: Path to file containing SAS algorithm parameters.
# Type: string.
algorithm_parameters_file: runconfig/algorithm_parameters_historical.yaml
Change directory into the DISP_NI_DIR
directory.
cd <DISP_NI_DIR>/
We're now ready to execute the 'historical' DISP-NI Interface.
Note: the relative path to the runconfig file must be specified in the docker run command
docker run --rm --user $(id -u):$(id -g) \
--volume $(pwd):/work \
opera/disp-nisar:0.1.1 disp-nisar run runconfig/runconfig_historical.yaml
The docker container will output progress messages as it runs, e.g.:
[INFO|wrapped_phase|L63] 2025-03-31T18:44:27+0000: Running wrapped phase estimation in /work/scratch/historical
[INFO|masking|L229] 2025-03-31T18:44:39+0000: Creating mask for bounds POLYGON ((-117.824535811717 34.2042782747881, -117.824535811717 35.1348562280527, -118.766279082582 35.1348562280527, -118.766279082582 34.2042782747881, -117.824535811717 34.2042782747881))
[INFO|masking|L252] 2025-03-31T18:44:40+0000: Created /work/scratch/historical/bounds_mask.tif
[INFO|wrapped_phase|L107] 2025-03-31T18:44:45+0000: Creating persistent scatterer file /work/scratch/historical/PS/ps_pixels.tif
...
Execution time for the small test case on opera-dev-pge (r6a.4xlarge at time of writing) was about 20 minutes.
NOTE: Due to the increased memory consumption used by DISP-NI when running in historical mode, R-family instances (such as r6[a|i].4xlarge) are recommended when running this portion of the Acceptance Test. If the test instance needs to be converted to an R-family instance, contact an OPERA PGE developer. Also note that for the purpose of the Quality Assurance test, an AMD-based instance type should be utilized.
When the docker run is finished, scratch/historical/
and output/historical/
directories will be created.
The output/historical directory will contain the following product files:
output/historical/
├── 20060630_20060815.nc
├── 20060630_20060815.short_wavelength_displacement.png
├── 20060630_20060930.nc
├── 20060630_20060930.short_wavelength_displacement.png
├── 20060630_20061115.nc
├── 20060630_20061115.short_wavelength_displacement.png
├── 20060630_20061231.nc
├── 20060630_20061231.short_wavelength_displacement.png
├── 20060630_20070215.nc
├── 20060630_20070215.short_wavelength_displacement.png
├── 20060630_20070518.nc
├── 20060630_20070518.short_wavelength_displacement.png
├── 20060630_20070703.nc
├── 20060630_20070703.short_wavelength_displacement.png
├── 20060630_20070818.nc
├── 20060630_20070818.short_wavelength_displacement.png
├── 20060630_20071003.nc
├── 20060630_20071003.short_wavelength_displacement.png
├── 20060630_20071118.nc
├── 20060630_20071118.short_wavelength_displacement.png
└── compressed_slcs
└── compressed_20060630_20060630_20071118.h5
Now that we've successfully executed the SAS container and generated outputs, the last step is to perform a QA check against the expected outputs.
A Python program to compare DISP-NI products generated by DISP-NI-SAS with expected outputs “golden datasets” is included in the Docker image. The disp-nisar application can run a "validate" workflow that accepts two input files: the golden dataset and the test dataset.
The docker command to run this is:
docker run --rm --volume $(pwd):/work \
opera/disp-nisar:0.1.1 \
disp-nisar validate <path to golden dataset> <path to output dataset>
For example, if the SAS was run using the example command above and the result is in the output/ directory, the validation program can be run as as follows:
docker run --rm --volume $(pwd):/work \
opera/disp-nisar:0.1.1 \
disp-nisar validate golden_output/historical/20060630_20060815.nc output/historical/20060630_20060815.nc
for f in `find golden_output/historical/ -type f -iname '*.nc' | sed 's|^.*/||'`; do docker run --rm --volume $(pwd):/work opera/disp-nisar:0.1.1 disp-nisar validate golden_output/historical/$f output/historical/$f; done
Sample output from comparison of Historical mode products:
[INFO|validate|L502] 2025-03-31T19:19:14+0000: Comparing HDF5 contents...
[INFO|validate|L194] 2025-03-31T19:19:14+0000: Checking connected component labels...
[INFO|validate|L225] 2025-03-31T19:19:14+0000: Test unwrapped area: 5033072/5081358 (99.050%)
[INFO|validate|L226] 2025-03-31T19:19:14+0000: Reference unwrapped area: 5033072/5081358 (99.050%)
[INFO|validate|L227] 2025-03-31T19:19:14+0000: Intersection/Reference: 5033072/5033072 (100.000%)
[INFO|validate|L228] 2025-03-31T19:19:14+0000: Intersection/Union: 5033072/5033072 (100.000%)
[INFO|validate|L285] 2025-03-31T19:19:15+0000: Checking displacement...
[INFO|validate|L336] 2025-03-31T19:19:15+0000: Test nan count: 1/3285934 (0.000%)
[INFO|validate|L337] 2025-03-31T19:19:15+0000: Reference nan count: 1/3285934 (0.000%)
[INFO|validate|L365] 2025-03-31T19:19:15+0000: Mean absolute re-wrapped phase error: 0.00000 rad
[INFO|validate|L366] 2025-03-31T19:19:15+0000: Max absolute re-wrapped phase error: 0.00000 rad
[INFO|validate|L370] 2025-03-31T19:19:15+0000: Non-congruent pixel count: 0/3285933 (0.000%)
[INFO|validate|L414] 2025-03-31T19:19:15+0000: /identification/product_version: b'0.1' vs. b'0.1'
[INFO|validate|L414] 2025-03-31T19:19:15+0000: /identification/processing_start_datetime: b'2025-03-31 18:44:27' vs. b'2025-03-26 14:51:38'
[INFO|validate|L414] 2025-03-31T19:19:15+0000: /metadata/disp_nisar_software_version: b'0.1.1.post1.dev0+g5193e97.d20250326' vs. b'0.1.1.post1.dev0+g5193e97.d20250326'
[INFO|validate|L414] 2025-03-31T19:19:15+0000: /metadata/dolphin_software_version: b'0.36.2' vs. b'0.36.2'
[INFO|validate|L414] 2025-03-31T19:19:15+0000: /metadata/pge_runconfig: b"input_file_group:\n # REQUIRED: list of paths to GSLC files.\n # Type: array.\n gslc_file_list:\n - input_slcs/NISAR_L2_GSLC_NI_F150_20060630T061920Z_20240528T200256Z_NI_HH_v0.1.h5\n - input_slcs/NISAR_L2_GSLC_NI_F150_20060815T061952Z_20240528T200246Z_NI_HH_v0.1.h5\n - input_slcs/NISAR_L2_GSLC_NI_F150_20060930T062029Z_20240528T200242Z_NI_HH_v0.1.h5\n - input_slcs/NISAR_L2_GSLC_NI_F150_20061115T062055Z_20240528T200248Z_NI_HH_v0.1.h5\n - input_slcs/NISAR_L2_GSLC_NI_F150_20061231T062124Z_20240528T200247Z_NI_HH_v0.1.h5\n - input_slcs/NISAR_L2_GSLC_NI_F150_20070215T062136Z_20240528T201122Z_NI_HH_v0.1.h5\n - input_slcs/NISAR_L2_GSLC_NI_F150_20070518T062142Z_20240528T201124Z_NI_HH_v0.1.h5\n - input_slcs/NISAR_L2_GSLC_NI_F150_20070703T062138Z_20240528T200959Z_NI_HH_v0.1.h5\n - input_slcs/NISAR_L2_GSLC_NI_F150_20070818T062132Z_20240528T200952Z_NI_HH_v0.1.h5\n - input_slcs/NISAR_L2_GSLC_NI_F150_20071003T062119Z_20240528T201004Z_NI_HH_v0.1.h5\n - input_slcs/NISAR_L2_GSLC_NI_F150_20071118T062059Z_20240528T201835Z_NI_HH_v0.1.h5\n # REQUIRED: Frame ID of the gslcs contained in `gslc_file_list`.\n # Type: integer.\n frame_id: 150\n # REQUIRED: Frequency in which gslcs are acquired.\n # Type: string.\n frequency: frequencyA\n # REQUIRED: Polarization of the gslcs contained in `gslc_file_list`.\n # Type: string.\n polarization: HH\ndynamic_ancillary_file_group:\n # REQUIRED: Path to file containing SAS algorithm parameters.\n # Type: string.\n algorithm_parameters_file: runconfig/algorithm_parameters_historical.yaml\n # Optional Byte mask file used to ignore low correlation/bad data (e.g water mask).\n # Convention is 0 for no data/invalid, and 1 for good data. Dtype must be uint8.\n # Type: string | null.\n mask_file: dynamic_ancillary_files/water_mask.tif\n # Path to the DEM file covering full frame. If none provided, corrections using DEM are\n # skipped.\n # Type: string | null.\n dem_file:\n # List of paths to GUNW files for ionosphere, SET and static geometry layers.\n # Type: array | null.\n gunw_files:\n - dynamic_ancillary_files/gunw_files/NISAR_L2_PR_GUNW_001_005_A_219_220_4020_SH_20060630T000000_20060630T000000_20060815T000000_20060815T000000_P01101_M_F_J_001.h5\n - dynamic_ancillary_files/gunw_files/NISAR_L2_PR_GUNW_001_005_A_219_220_4020_SH_20060815T000000_20060815T000000_20060930T000000_20060930T000000_P01101_M_F_J_001.h5\n - dynamic_ancillary_files/gunw_files/NISAR_L2_PR_GUNW_001_005_A_219_220_4020_SH_20060930T000000_20060930T000000_20061115T000000_20061115T000000_P01101_M_F_J_001.h5\n - dynamic_ancillary_files/gunw_files/NISAR_L2_PR_GUNW_001_005_A_219_220_4020_SH_20061115T000000_20061115T000000_20061231T000000_20061231T000000_P01101_M_F_J_001.h5\n - dynamic_ancillary_files/gunw_files/NISAR_L2_PR_GUNW_001_005_A_219_220_4020_SH_20061231T000000_20061231T000000_20070215T000000_20070215T000000_P01101_M_F_J_001.h5\n - dynamic_ancillary_files/gunw_files/NISAR_L2_PR_GUNW_001_005_A_219_220_4020_SH_20070215T000000_20070215T000000_20070518T000000_20070518T000000_P01101_M_F_J_001.h5\n - dynamic_ancillary_files/gunw_files/NISAR_L2_PR_GUNW_001_005_A_219_220_4020_SH_20070518T000000_20070518T000000_20070703T000000_20070703T000000_P01101_M_F_J_001.h5\n - dynamic_ancillary_files/gunw_files/NISAR_L2_PR_GUNW_001_005_A_219_220_4020_SH_20070703T000000_20070703T000000_20070818T000000_20070818T000000_P01101_M_F_J_001.h5\n - dynamic_ancillary_files/gunw_files/NISAR_L2_PR_GUNW_001_005_A_219_220_4020_SH_20070818T000000_20070818T000000_20071003T000000_20071003T000000_P01101_M_F_J_001.h5\n - dynamic_ancillary_files/gunw_files/NISAR_L2_PR_GUNW_001_005_A_219_220_4020_SH_20071003T000000_20071003T000000_20071118T000000_20071118T000000_P01101_M_F_J_001.h5\n - dynamic_ancillary_files/gunw_files/NISAR_L2_PR_GUNW_001_005_A_219_220_4020_SH_20071118T000000_20071118T000000_20080103T000000_20080103T000000_P01101_M_F_J_001.h5\n # List of paths to troposphere weather model files (1 per date). If none provided,\n # troposphere corrections are skipped.\n # Type: array | null.\n troposphere_files:\nstatic_ancillary_file_group:\n # JSON file containing the mapping from frame_id to bounds information.\n # Type: string | null.\n frame_to_bounds_json: static_ancillary_files/Frame_to_bounds_DISP-NI_v0.1.json\n # JSON file containing list of reference date changes for each frame.\n # Type: string | null.\n reference_date_database_json: static_ancillary_files/opera-disp-nisar-reference-dates-dummy.json\nprimary_executable:\n # Product type of the PGE.\n # Type: string.\n product_type: DISP_NISAR_HISTORICAL\nproduct_path_group:\n # REQUIRED: Directory where PGE will place results.\n # Type: string.\n product_path: output/historical\n # Path to the scratch directory.\n # Type: string.\n scratch_path: scratch/historical\n # Path to the SAS output directory.\n # Type: string.\n sas_output_path: output/historical\n # Version of the product, in <major>.<minor> format.\n # Type: string.\n product_version: '0.1'\n # Whether the SAS should output and save the Compressed SLCs in addition to the standard\n # product output.\n # Type: boolean.\n save_compressed_slc: true\nworker_settings:\n # Whether to use GPU for processing (if available).\n # Type: boolean.\n gpu_enabled: false\n # Number of threads to use per worker. This sets the OMP_NUM_THREADS environment variable in\n # each python process.\n # Type: integer.\n threads_per_worker: 16\n # If processing separate spatial bursts, number of bursts to run in parallel for wrapped-\n # phase-estimation.\n # Type: integer.\n n_parallel_bursts: 4\n # Size (rows, columns) of blocks of data to load at a time.\n # Type: array.\n block_shape:\n - 512\n - 512\n# Path to the output log file in addition to logging to stderr.\n# Type: string | null.\nlog_file: scratch/historical/log_sas.log\n" vs. b"input_file_group:\n # REQUIRED: list of paths to GSLC files.\n # Type: array.\n gslc_file_list:\n - input_slcs/NISAR_L2_GSLC_NI_F150_20060630T061920Z_20240528T200256Z_NI_HH_v0.1.h5\n - input_slcs/NISAR_L2_GSLC_NI_F150_20060815T061952Z_20240528T200246Z_NI_HH_v0.1.h5\n - input_slcs/NISAR_L2_GSLC_NI_F150_20060930T062029Z_20240528T200242Z_NI_HH_v0.1.h5\n - input_slcs/NISAR_L2_GSLC_NI_F150_20061115T062055Z_20240528T200248Z_NI_HH_v0.1.h5\n - input_slcs/NISAR_L2_GSLC_NI_F150_20061231T062124Z_20240528T200247Z_NI_HH_v0.1.h5\n - input_slcs/NISAR_L2_GSLC_NI_F150_20070215T062136Z_20240528T201122Z_NI_HH_v0.1.h5\n - input_slcs/NISAR_L2_GSLC_NI_F150_20070518T062142Z_20240528T201124Z_NI_HH_v0.1.h5\n - input_slcs/NISAR_L2_GSLC_NI_F150_20070703T062138Z_20240528T200959Z_NI_HH_v0.1.h5\n - input_slcs/NISAR_L2_GSLC_NI_F150_20070818T062132Z_20240528T200952Z_NI_HH_v0.1.h5\n - input_slcs/NISAR_L2_GSLC_NI_F150_20071003T062119Z_20240528T201004Z_NI_HH_v0.1.h5\n - input_slcs/NISAR_L2_GSLC_NI_F150_20071118T062059Z_20240528T201835Z_NI_HH_v0.1.h5\n # REQUIRED: Frame ID of the gslcs contained in `gslc_file_list`.\n # Type: integer.\n frame_id: 150\n # REQUIRED: Frequency in which gslcs are acquired.\n # Type: string.\n frequency: frequencyA\n # REQUIRED: Polarization of the gslcs contained in `gslc_file_list`.\n # Type: string.\n polarization: HH\ndynamic_ancillary_file_group:\n # REQUIRED: Path to file containing SAS algorithm parameters.\n # Type: string.\n algorithm_parameters_file: config_files/algorithm_parameters_historical.yaml\n # Optional Byte mask file used to ignore low correlation/bad data (e.g water mask).\n # Convention is 0 for no data/invalid, and 1 for good data. Dtype must be uint8.\n # Type: string | null.\n mask_file: dynamic_ancillary_files/water_mask.tif\n # Path to the DEM file covering full frame. If none provided, corrections using DEM are\n # skipped.\n # Type: string | null.\n dem_file:\n # List of paths to GUNW files for ionosphere, SET and static geometry layers.\n # Type: array | null.\n gunw_files:\n - dynamic_ancillary_files/gunw_files/NISAR_L2_PR_GUNW_001_005_A_219_220_4020_SH_20060630T000000_20060630T000000_20060815T000000_20060815T000000_P01101_M_F_J_001.h5\n - dynamic_ancillary_files/gunw_files/NISAR_L2_PR_GUNW_001_005_A_219_220_4020_SH_20060815T000000_20060815T000000_20060930T000000_20060930T000000_P01101_M_F_J_001.h5\n - dynamic_ancillary_files/gunw_files/NISAR_L2_PR_GUNW_001_005_A_219_220_4020_SH_20060930T000000_20060930T000000_20061115T000000_20061115T000000_P01101_M_F_J_001.h5\n - dynamic_ancillary_files/gunw_files/NISAR_L2_PR_GUNW_001_005_A_219_220_4020_SH_20061115T000000_20061115T000000_20061231T000000_20061231T000000_P01101_M_F_J_001.h5\n - dynamic_ancillary_files/gunw_files/NISAR_L2_PR_GUNW_001_005_A_219_220_4020_SH_20061231T000000_20061231T000000_20070215T000000_20070215T000000_P01101_M_F_J_001.h5\n - dynamic_ancillary_files/gunw_files/NISAR_L2_PR_GUNW_001_005_A_219_220_4020_SH_20070215T000000_20070215T000000_20070518T000000_20070518T000000_P01101_M_F_J_001.h5\n - dynamic_ancillary_files/gunw_files/NISAR_L2_PR_GUNW_001_005_A_219_220_4020_SH_20070518T000000_20070518T000000_20070703T000000_20070703T000000_P01101_M_F_J_001.h5\n - dynamic_ancillary_files/gunw_files/NISAR_L2_PR_GUNW_001_005_A_219_220_4020_SH_20070703T000000_20070703T000000_20070818T000000_20070818T000000_P01101_M_F_J_001.h5\n - dynamic_ancillary_files/gunw_files/NISAR_L2_PR_GUNW_001_005_A_219_220_4020_SH_20070818T000000_20070818T000000_20071003T000000_20071003T000000_P01101_M_F_J_001.h5\n - dynamic_ancillary_files/gunw_files/NISAR_L2_PR_GUNW_001_005_A_219_220_4020_SH_20071003T000000_20071003T000000_20071118T000000_20071118T000000_P01101_M_F_J_001.h5\n - dynamic_ancillary_files/gunw_files/NISAR_L2_PR_GUNW_001_005_A_219_220_4020_SH_20071118T000000_20071118T000000_20080103T000000_20080103T000000_P01101_M_F_J_001.h5\n # List of paths to troposphere weather model files (1 per date). If none provided,\n # troposphere corrections are skipped.\n # Type: array | null.\n troposphere_files:\nstatic_ancillary_file_group:\n # JSON file containing the mapping from frame_id to bounds information.\n # Type: string | null.\n frame_to_bounds_json: static_ancillary_files/Frame_to_bounds_DISP-NI_v0.1.json\n # JSON file containing list of reference date changes for each frame.\n # Type: string | null.\n reference_date_database_json: static_ancillary_files/opera-disp-nisar-reference-dates-dummy.json\nprimary_executable:\n # Product type of the PGE.\n # Type: string.\n product_type: DISP_NISAR_HISTORICAL\nproduct_path_group:\n # REQUIRED: Directory where PGE will place results.\n # Type: string.\n product_path: output/historical\n # Path to the scratch directory.\n # Type: string.\n scratch_path: scratch/historical\n # Path to the SAS output directory.\n # Type: string.\n sas_output_path: output/historical\n # Version of the product, in <major>.<minor> format.\n # Type: string.\n product_version: '0.1'\n # Whether the SAS should output and save the Compressed SLCs in addition to the standard\n # product output.\n # Type: boolean.\n save_compressed_slc: true\nworker_settings:\n # Whether to use GPU for processing (if available).\n # Type: boolean.\n gpu_enabled: false\n # Number of threads to use per worker. This sets the OMP_NUM_THREADS environment variable in\n # each python process.\n # Type: integer.\n threads_per_worker: 16\n # If processing separate spatial bursts, number of bursts to run in parallel for wrapped-\n # phase-estimation.\n # Type: integer.\n n_parallel_bursts: 4\n # Size (rows, columns) of blocks of data to load at a time.\n # Type: array.\n block_shape:\n - 512\n - 512\n# Path to the output log file in addition to logging to stderr.\n# Type: string | null.\nlog_file: scratch/historical/log_sas.log\n"
[INFO|validate|L414] 2025-03-31T19:19:15+0000: /metadata/dolphin_workflow_config: b"input_options:\n # If passing HDF5/NetCDF files, subdataset to use from CSLC files. .\n # Type: string | null.\n subdataset: /science/LSAR/GSLC/grids/frequencyA/HH\n # Format of dates contained in CSLC filenames.\n # Type: string.\n cslc_date_fmt: '%Y%m%d'\n # Radar wavelength (in meters) of the transmitted data. used to convert the units in the\n # rasters in `timeseries/` to from radians to meters. If None and sensor is not\n # recognized, outputs remain in radians.\n # Type: number | null.\n wavelength:\n# Mask file used to ignore low correlation/bad data (e.g water mask). Convention is 0 for no\n# data/invalid, and 1 for good data. Dtype must be uint8.\n# Type: string | null.\nmask_file: /work/scratch/historical/water_binary_mask.tif\n# Name of sub-directory to use for writing output files.\n# Type: string.\nwork_directory: /work/scratch/historical\n# Don't resolve filepaths that are given as relative to be absolute.\n# Type: boolean.\nkeep_paths_relative: false\nworker_settings:\n # Whether to use GPU for processing (if available).\n # Type: boolean.\n gpu_enabled: false\n # Number of threads to use per worker. This sets the OMP_NUM_THREADS environment variable in\n # each python process.\n # Type: integer.\n threads_per_worker: 16\n # If processing separate spatial bursts, number of bursts to run in parallel for wrapped-\n # phase-estimation.\n # Type: integer.\n n_parallel_bursts: 4\n # Size (rows, columns) of blocks of data to load at a time.\n # Type: array.\n block_shape:\n - 512\n - 512\n# Path to output log file (in addition to logging to `stderr`). Default logs to\n# `dolphin.log` within `work_directory`.\n# Type: string | null.\nlog_file: scratch/historical/log_sas.log\n# Time the config file was created.\n# Type: string.\ncreation_time_utc: '2025-03-31T18:44:27.531470Z'\n# REQUIRED: list of CSLC files, or newline-delimited file containing list of CSLC files.\n# Type: array.\ncslc_file_list:\n - /work/input_slcs/NISAR_L2_GSLC_NI_F150_20060630T061920Z_20240528T200256Z_NI_HH_v0.1.h5\n - /work/input_slcs/NISAR_L2_GSLC_NI_F150_20060815T061952Z_20240528T200246Z_NI_HH_v0.1.h5\n - /work/input_slcs/NISAR_L2_GSLC_NI_F150_20060930T062029Z_20240528T200242Z_NI_HH_v0.1.h5\n - /work/input_slcs/NISAR_L2_GSLC_NI_F150_20061115T062055Z_20240528T200248Z_NI_HH_v0.1.h5\n - /work/input_slcs/NISAR_L2_GSLC_NI_F150_20061231T062124Z_20240528T200247Z_NI_HH_v0.1.h5\n - /work/input_slcs/NISAR_L2_GSLC_NI_F150_20070215T062136Z_20240528T201122Z_NI_HH_v0.1.h5\n - /work/input_slcs/NISAR_L2_GSLC_NI_F150_20070518T062142Z_20240528T201124Z_NI_HH_v0.1.h5\n - /work/input_slcs/NISAR_L2_GSLC_NI_F150_20070703T062138Z_20240528T200959Z_NI_HH_v0.1.h5\n - /work/input_slcs/NISAR_L2_GSLC_NI_F150_20070818T062132Z_20240528T200952Z_NI_HH_v0.1.h5\n - /work/input_slcs/NISAR_L2_GSLC_NI_F150_20071003T062119Z_20240528T201004Z_NI_HH_v0.1.h5\n - /work/input_slcs/NISAR_L2_GSLC_NI_F150_20071118T062059Z_20240528T201835Z_NI_HH_v0.1.h5\noutput_options:\n # Output (x, y) resolution (in units of input data).\n # Type: object | null.\n output_resolution:\n # Alternative to specifying output resolution: Specify the (x, y) strides (decimation\n # factor) to perform while processing input. For example, strides of [4, 2] would turn an\n # input resolution of [5, 10] into an output resolution of [20, 20].\n # Type: object.\n strides:\n x: 6\n y: 6\n # Area of interest: [left, bottom, right, top] coordinates. e.g.\n # `bbox=[-150.2,65.0,-150.1,65.5]`.\n # Type: array | null.\n bounds:\n - -118.766279082582\n - 34.2042782747881\n - -117.824535811717\n - 35.1348562280527\n # Area of interest as a simple Polygon in well-known-text (WKT) format. Can pass a string,\n # or a `.wkt` filename containing the Polygon text.\n # Type: string | null.\n bounds_wkt:\n # EPSG code for the `bounds` or `bounds_wkt` coordinates, if specified.\n # Type: integer.\n bounds_epsg: 4326\n # Options for `create_dataset` with h5py.\n # Type: object.\n hdf5_creation_options:\n chunks:\n - 128\n - 128\n compression: gzip\n compression_opts: 4\n shuffle: true\n # GDAL creation options for GeoTIFF files.\n # Type: array.\n gtiff_creation_options:\n - COMPRESS=lzw\n - ZLEVEL=4\n - BIGTIFF=yes\n - TILED=yes\n - INTERLEAVE=band\n - BLOCKXSIZE=128\n - BLOCKYSIZE=128\n # Whether to add overviews to the output GeoTIFF files. This will increase file size, but\n # can be useful for visualizing the data with web mapping tools. See\n # https://gdal.org/programs/gdaladdo.html for more.\n # Type: boolean.\n add_overviews: false\n # List of overview levels to create (if `add_overviews=True`).\n # Type: array.\n overview_levels:\n - 4\n - 8\n - 16\n - 32\n - 64\n # Specify an extra reference datetime in UTC. Adding this lets you to create and unwrap two\n # single reference networks; the later resets at the given date (e.g. for a large\n # earthquake event). If passing strings, formats accepted are YYYY-MM-\n # DD[T]HH:MM[:SS[.ffffff]][Z or []HH[:]MM], or YYYY-MM-DD.\n # Type: string | null.\n extra_reference_date:\nps_options:\n # Amplitude dispersion threshold to consider a pixel a PS.\n # Type: number.\n amp_dispersion_threshold: 0.15\n# Paths to existing Amplitude Dispersion file (1 per SLC region) for PS update calculation.\n# If none provided, computed using the input SLC stack.\n# Type: array.\namplitude_dispersion_files: []\n# Paths to an existing Amplitude Mean files (1 per SLC region) for PS update calculation. If\n# none provided, computed using the input SLC stack.\n# Type: array.\namplitude_mean_files: []\n# Paths to layover/shadow binary masks, where 0 indicates a pixel in layover/shadow, 1 is a\n# good pixel. If none provided, no masking is performed for layover/shadow.\n# Type: array.\nlayover_shadow_mask_files: []\nphase_linking:\n # Size of the ministack for sequential estimator.\n # Type: integer.\n ministack_size: 15\n # Maximum number of compressed images to use in sequential estimator. If there are more\n # ministacks than this, the earliest CCSLCs will be left out of the later stacks. .\n # Type: integer.\n max_num_compressed: 100\n # Index of input SLC to use for making phase linked interferograms after EVD/EMI.\n # Type: integer.\n output_reference_idx: 0\n half_window:\n # Half window size (in pixels) for x direction.\n # Type: integer.\n x: 11\n # Half window size (in pixels) for y direction.\n # Type: integer.\n y: 5\n # Use EVD on the coherence instead of using the EMI algorithm.\n # Type: boolean.\n use_evd: false\n # Beta regularization parameter for correlation matrix inversion. 0 is no regularization.\n # Type: number.\n beta: 0.0\n # Snap correlation values in the coherence matrix below this value to 0.\n # Type: number.\n zero_correlation_threshold: 0.0\n # Method for finding SHPs during phase linking.\n # Type: string.\n # Options: ['glrt', 'ks', 'rect', 'rect'].\n shp_method: glrt\n # Significance level (probability of false alarm) for SHP tests. Lower numbers include more\n # pixels within the multilook window during covariance estimation.\n # Type: number.\n shp_alpha: 0.001\n # If True, pixels labeled as PS will get set to NaN during phase linking to avoid summing\n # their phase. Default of False means that the SHP algorithm will decide if a pixel should\n # be included, regardless of its PS label.\n # Type: boolean.\n mask_input_ps: false\n # StBAS parameter to include only nearest-N interferograms forphase linking. A\n # `baseline_lag` of `n` will only include the closest`n` interferograms. `baseline_line`\n # must be positive.\n # Type: integer | null.\n baseline_lag:\n # Plan for creating Compressed SLCs during phase linking.\n # Type: string.\n # Options: ['always_first', 'first_per_ministack', 'last_per_ministack'].\n compressed_slc_plan: always_first\ninterferogram_network:\n # For single-reference network: Index of the reference image in the network.\n # Type: integer | null.\n reference_idx: 0\n # Max `n` to form the nearest-`n` interferograms by index.\n # Type: integer | null.\n max_bandwidth:\n # Maximum temporal baseline of interferograms.\n # Type: integer | null.\n max_temporal_baseline:\n # For manual-index network: list of (ref_idx, sec_idx) defining the interferograms to form.\n # Type: array | null.\n indexes:\nunwrap_options:\n # Whether to run the unwrapping step after wrapped phase estimation.\n # Type: boolean.\n run_unwrap: true\n # Whether to run Goldstein filtering step on wrapped interferogram.\n # Type: boolean.\n run_goldstein: false\n # Whether to run interpolation step on wrapped interferogram.\n # Type: boolean.\n run_interpolation: true\n # Phase unwrapping method.\n # Type: string.\n # Options: ['snaphu', 'icu', 'phass', 'spurt', 'whirlwind'].\n unwrap_method: snaphu\n # Number of interferograms to unwrap in parallel.\n # Type: integer.\n n_parallel_jobs: 4\n # Set wrapped phase/correlation to 0 where mask is 0 before unwrapping. .\n # Type: boolean.\n zero_where_masked: false\n preprocess_options:\n # Adaptive phase (Goldstein) filter exponent parameter.\n # Type: number.\n alpha: 0.5\n # (for interpolation) Maximum radius to find scatterers.\n # Type: integer.\n max_radius: 51\n # Threshold on the correlation raster to use for interpolation. Pixels with less than this\n # value are replaced by a weighted combination of neighboring pixels.\n # Type: number.\n interpolation_cor_threshold: 0.3\n # Threshold on the correlation raster to use for interpolation. Pixels with less than this\n # value are replaced by a weighted combination of neighboring pixels.\n # Type: number.\n interpolation_similarity_threshold: 0.3\n snaphu_options:\n # Number of tiles to split the inputs into using SNAPHU's internal tiling.\n # Type: array.\n ntiles:\n - 2\n - 2\n # Amount of tile overlap (in pixels) along the (row, col) directions.\n # Type: array.\n tile_overlap:\n - 0\n - 0\n # Number of tiles to unwrap in parallel for each interferogram.\n # Type: integer.\n n_parallel_tiles: 1\n # Initialization method for SNAPHU.\n # Type: string.\n # Options: ['mcf', 'mst'].\n init_method: mcf\n # Statistical cost mode method for SNAPHU.\n # Type: string.\n # Options: ['defo', 'smooth'].\n cost: smooth\n # If True, after unwrapping with multiple tiles, an additional post-processing unwrapping\n # step is performed to re-optimize the unwrapped phase using a single tile.\n # Type: boolean.\n single_tile_reoptimize: false\n tophu_options:\n # Number of tiles to split the inputs into.\n # Type: array.\n ntiles:\n - 2\n - 2\n # Extra multilook factor to use for the coarse unwrap.\n # Type: array.\n downsample_factor:\n - 5\n - 5\n # Initialization method for SNAPHU.\n # Type: string.\n # Options: ['mcf', 'mst'].\n init_method: mcf\n # Statistical cost mode method for SNAPHU.\n # Type: string.\n # Options: ['defo', 'smooth'].\n cost: smooth\n spurt_options:\n # Temporal coherence to pick pixels used on an irregular grid.\n # Type: number.\n temporal_coherence_threshold: 0.7\n # Similarity to pick pixels used on an irregular grid. Any pixel with similarity above\n # `similarity_threshold` *or* above the temporal coherence threshold is chosen.\n # Type: number.\n similarity_threshold: 0.5\n # After running spurt, interpolate the values that were masked during unwrapping (which are\n # otherwise left as nan).\n # Type: boolean.\n run_ambiguity_interpolation: true\n general_settings:\n # Tile up data spatially.\n # Type: boolean.\n use_tiles: true\n tiler_settings:\n # Maximum number of tiles allowed.\n # Type: integer.\n max_tiles: 64\n # Number of points used for determining tiles based on density.\n # Type: integer.\n target_points_for_generation: 120000\n # Target points per tile when generating tiles.\n # Type: integer.\n target_points_per_tile: 900000\n # Dilation factor of non-overlapping tiles. 0.05 would lead to 5 percent dilation of the\n # tile.\n # Type: number.\n dilation_factor: 0.05\n solver_settings:\n # Number of workers for temporal unwrapping in parallel. Set value to <=0 to let workflow\n # use default workers (ncpus - 1).\n # Type: integer.\n t_worker_count: 1\n # Number of workers for spatial unwrapping in parallel. Set value to <=0 to let workflow use\n # (ncpus - 1).\n # Type: integer.\n s_worker_count: 1\n # Temporal unwrapping operations over spatial links are performed in batches and each batch\n # is solved in parallel.\n # Type: integer.\n links_per_batch: 150000\n # Temporal unwrapping costs.\n # Type: string.\n # Options: ['constant', 'distance', 'centroid'].\n t_cost_type: constant\n # Scale factor used to compute edge costs for temporal unwrapping.\n # Type: number.\n t_cost_scale: 100.0\n # Spatial unwrapping costs.\n # Type: string.\n # Options: ['constant', 'distance', 'centroid'].\n s_cost_type: constant\n # Scale factor used to compute edge costs for spatial unwrapping.\n # Type: number.\n s_cost_scale: 100.0\n # Number of tiles to process in parallel. Set to 0 for all tiles.\n # Type: integer.\n num_parallel_tiles: 1\n merger_settings:\n # Minimum number of overlap pixels to be considered valid.\n # Type: integer.\n min_overlap_points: 25\n # Currently, only 'dirichlet' is supported.\n # Type: dirichlet.\n # Options: ['dirichlet'].\n method: dirichlet\n # Method used to estimate bulk offset between tiles.\n # Type: string.\n # Options: ['integer', 'L2'].\n bulk_method: L2\n # Number of interferograms to merge in one batch. Use zero to merge all interferograms in a\n # single batch.\n # Type: integer.\n num_parallel_ifgs: 3\ntimeseries_options:\n # Whether to run the inversion step after unwrapping, if more than a single-reference\n # network is used.\n # Type: boolean.\n run_inversion: true\n # Norm to use during timeseries inversion.\n # Type: string.\n # Options: ['L1', 'L2'].\n method: L1\n # Reference point (row, col) used if performing a time series inversion. If not provided, a\n # point will be selected from a consistent connected component with low amplitude\n # dispersion.\n # Type: array | null.\n reference_point:\n # Run the velocity estimation from the phase time series.\n # Type: boolean.\n run_velocity: false\n # Pixels with correlation below this value will be masked out.\n # Type: number.\n correlation_threshold: 0.2\n # Size (rows, columns) of blocks of data to load at a time. 3D dimsion is number of\n # interferograms (during inversion) and number of SLC dates (during velocity fitting).\n # Type: array.\n block_shape:\n - 256\n - 256\n # Number of parallel blocks to process at once.\n # Type: integer.\n num_parallel_blocks: 4\ncorrection_options:\n # List of weather-model files (one per date) for tropospheric corrections.\n # Type: array.\n troposphere_files: []\n # Format of dates contained in weather-model filenames.\n # Type: string.\n tropo_date_fmt: '%Y%m%d'\n # Package for tropospheric correction. Choices: pyaps, raider.\n # Type: string.\n tropo_package: pyaps\n # Enumeration representing different tropospheric models.\n # Type: string.\n # Options: ['ECMWF', 'ERA5', 'HRES', 'ERAINT', 'ERAI', 'MERRA', 'NARR', 'HRRR', 'GMAO'].\n tropo_model: ECMWF\n # Type of tropospheric delay.\n # Type: string.\n # Options: ['wet', 'dry', 'hydrostatic', 'comb'].\n tropo_delay_type: comb\n # List of GNSS-derived TEC maps for ionospheric corrections (one per date). Source is\n # https://cddis.nasa.gov/archive/gnss/products/ionex/.\n # Type: array.\n ionosphere_files: []\n # Line-of-sight geometry files for each burst/SLC stack area, for use in correction\n # computations.\n # Type: array.\n geometry_files: []\n # DEM file for tropospheric/ topographic phase corrections.\n # Type: string | null.\n dem_file:\nalgorithm_parameters_overrides_json:\nsubdataset: /science/LSAR/GSLC/grids/frequencyA/HH\nrecommended_temporal_coherence_threshold: 0.6\nrecommended_similarity_threshold: 0.5\nspatial_wavelength_cutoff: 25000.0\nbrowse_image_vmin_vmax:\n - -0.1\n - 0.1\nnum_parallel_products: 3\n" vs. b"input_options:\n # If passing HDF5/NetCDF files, subdataset to use from CSLC files. .\n # Type: string | null.\n subdataset: /science/LSAR/GSLC/grids/frequencyA/HH\n # Format of dates contained in CSLC filenames.\n # Type: string.\n cslc_date_fmt: '%Y%m%d'\n # Radar wavelength (in meters) of the transmitted data. used to convert the units in the\n # rasters in `timeseries/` to from radians to meters. If None and sensor is not\n # recognized, outputs remain in radians.\n # Type: number | null.\n wavelength:\n# Mask file used to ignore low correlation/bad data (e.g water mask). Convention is 0 for no\n# data/invalid, and 1 for good data. Dtype must be uint8.\n# Type: string | null.\nmask_file: /work/scratch/historical/water_binary_mask.tif\n# Name of sub-directory to use for writing output files.\n# Type: string.\nwork_directory: /work/scratch/historical\n# Don't resolve filepaths that are given as relative to be absolute.\n# Type: boolean.\nkeep_paths_relative: false\nworker_settings:\n # Whether to use GPU for processing (if available).\n # Type: boolean.\n gpu_enabled: false\n # Number of threads to use per worker. This sets the OMP_NUM_THREADS environment variable in\n # each python process.\n # Type: integer.\n threads_per_worker: 16\n # If processing separate spatial bursts, number of bursts to run in parallel for wrapped-\n # phase-estimation.\n # Type: integer.\n n_parallel_bursts: 4\n # Size (rows, columns) of blocks of data to load at a time.\n # Type: array.\n block_shape:\n - 512\n - 512\n# Path to output log file (in addition to logging to `stderr`). Default logs to\n# `dolphin.log` within `work_directory`.\n# Type: string | null.\nlog_file: scratch/historical/log_sas.log\n# Time the config file was created.\n# Type: string.\ncreation_time_utc: '2025-03-26T14:51:38.466106Z'\n# REQUIRED: list of CSLC files, or newline-delimited file containing list of CSLC files.\n# Type: array.\ncslc_file_list:\n - /work/input_slcs/NISAR_L2_GSLC_NI_F150_20060630T061920Z_20240528T200256Z_NI_HH_v0.1.h5\n - /work/input_slcs/NISAR_L2_GSLC_NI_F150_20060815T061952Z_20240528T200246Z_NI_HH_v0.1.h5\n - /work/input_slcs/NISAR_L2_GSLC_NI_F150_20060930T062029Z_20240528T200242Z_NI_HH_v0.1.h5\n - /work/input_slcs/NISAR_L2_GSLC_NI_F150_20061115T062055Z_20240528T200248Z_NI_HH_v0.1.h5\n - /work/input_slcs/NISAR_L2_GSLC_NI_F150_20061231T062124Z_20240528T200247Z_NI_HH_v0.1.h5\n - /work/input_slcs/NISAR_L2_GSLC_NI_F150_20070215T062136Z_20240528T201122Z_NI_HH_v0.1.h5\n - /work/input_slcs/NISAR_L2_GSLC_NI_F150_20070518T062142Z_20240528T201124Z_NI_HH_v0.1.h5\n - /work/input_slcs/NISAR_L2_GSLC_NI_F150_20070703T062138Z_20240528T200959Z_NI_HH_v0.1.h5\n - /work/input_slcs/NISAR_L2_GSLC_NI_F150_20070818T062132Z_20240528T200952Z_NI_HH_v0.1.h5\n - /work/input_slcs/NISAR_L2_GSLC_NI_F150_20071003T062119Z_20240528T201004Z_NI_HH_v0.1.h5\n - /work/input_slcs/NISAR_L2_GSLC_NI_F150_20071118T062059Z_20240528T201835Z_NI_HH_v0.1.h5\noutput_options:\n # Output (x, y) resolution (in units of input data).\n # Type: object | null.\n output_resolution:\n # Alternative to specifying output resolution: Specify the (x, y) strides (decimation\n # factor) to perform while processing input. For example, strides of [4, 2] would turn an\n # input resolution of [5, 10] into an output resolution of [20, 20].\n # Type: object.\n strides:\n x: 6\n y: 6\n # Area of interest: [left, bottom, right, top] coordinates. e.g.\n # `bbox=[-150.2,65.0,-150.1,65.5]`.\n # Type: array | null.\n bounds:\n - -118.766279082582\n - 34.2042782747881\n - -117.824535811717\n - 35.1348562280527\n # Area of interest as a simple Polygon in well-known-text (WKT) format. Can pass a string,\n # or a `.wkt` filename containing the Polygon text.\n # Type: string | null.\n bounds_wkt:\n # EPSG code for the `bounds` or `bounds_wkt` coordinates, if specified.\n # Type: integer.\n bounds_epsg: 4326\n # Options for `create_dataset` with h5py.\n # Type: object.\n hdf5_creation_options:\n chunks:\n - 128\n - 128\n compression: gzip\n compression_opts: 4\n shuffle: true\n # GDAL creation options for GeoTIFF files.\n # Type: array.\n gtiff_creation_options:\n - COMPRESS=lzw\n - ZLEVEL=4\n - BIGTIFF=yes\n - TILED=yes\n - INTERLEAVE=band\n - BLOCKXSIZE=128\n - BLOCKYSIZE=128\n # Whether to add overviews to the output GeoTIFF files. This will increase file size, but\n # can be useful for visualizing the data with web mapping tools. See\n # https://gdal.org/programs/gdaladdo.html for more.\n # Type: boolean.\n add_overviews: false\n # List of overview levels to create (if `add_overviews=True`).\n # Type: array.\n overview_levels:\n - 4\n - 8\n - 16\n - 32\n - 64\n # Specify an extra reference datetime in UTC. Adding this lets you to create and unwrap two\n # single reference networks; the later resets at the given date (e.g. for a large\n # earthquake event). If passing strings, formats accepted are YYYY-MM-\n # DD[T]HH:MM[:SS[.ffffff]][Z or []HH[:]MM], or YYYY-MM-DD.\n # Type: string | null.\n extra_reference_date:\nps_options:\n # Amplitude dispersion threshold to consider a pixel a PS.\n # Type: number.\n amp_dispersion_threshold: 0.15\n# Paths to existing Amplitude Dispersion file (1 per SLC region) for PS update calculation.\n# If none provided, computed using the input SLC stack.\n# Type: array.\namplitude_dispersion_files: []\n# Paths to an existing Amplitude Mean files (1 per SLC region) for PS update calculation. If\n# none provided, computed using the input SLC stack.\n# Type: array.\namplitude_mean_files: []\n# Paths to layover/shadow binary masks, where 0 indicates a pixel in layover/shadow, 1 is a\n# good pixel. If none provided, no masking is performed for layover/shadow.\n# Type: array.\nlayover_shadow_mask_files: []\nphase_linking:\n # Size of the ministack for sequential estimator.\n # Type: integer.\n ministack_size: 15\n # Maximum number of compressed images to use in sequential estimator. If there are more\n # ministacks than this, the earliest CCSLCs will be left out of the later stacks. .\n # Type: integer.\n max_num_compressed: 100\n # Index of input SLC to use for making phase linked interferograms after EVD/EMI.\n # Type: integer.\n output_reference_idx: 0\n half_window:\n # Half window size (in pixels) for x direction.\n # Type: integer.\n x: 11\n # Half window size (in pixels) for y direction.\n # Type: integer.\n y: 5\n # Use EVD on the coherence instead of using the EMI algorithm.\n # Type: boolean.\n use_evd: false\n # Beta regularization parameter for correlation matrix inversion. 0 is no regularization.\n # Type: number.\n beta: 0.0\n # Snap correlation values in the coherence matrix below this value to 0.\n # Type: number.\n zero_correlation_threshold: 0.0\n # Method for finding SHPs during phase linking.\n # Type: string.\n # Options: ['glrt', 'ks', 'rect', 'rect'].\n shp_method: glrt\n # Significance level (probability of false alarm) for SHP tests. Lower numbers include more\n # pixels within the multilook window during covariance estimation.\n # Type: number.\n shp_alpha: 0.001\n # If True, pixels labeled as PS will get set to NaN during phase linking to avoid summing\n # their phase. Default of False means that the SHP algorithm will decide if a pixel should\n # be included, regardless of its PS label.\n # Type: boolean.\n mask_input_ps: false\n # StBAS parameter to include only nearest-N interferograms forphase linking. A\n # `baseline_lag` of `n` will only include the closest`n` interferograms. `baseline_line`\n # must be positive.\n # Type: integer | null.\n baseline_lag:\n # Plan for creating Compressed SLCs during phase linking.\n # Type: string.\n # Options: ['always_first', 'first_per_ministack', 'last_per_ministack'].\n compressed_slc_plan: always_first\ninterferogram_network:\n # For single-reference network: Index of the reference image in the network.\n # Type: integer | null.\n reference_idx: 0\n # Max `n` to form the nearest-`n` interferograms by index.\n # Type: integer | null.\n max_bandwidth:\n # Maximum temporal baseline of interferograms.\n # Type: integer | null.\n max_temporal_baseline:\n # For manual-index network: list of (ref_idx, sec_idx) defining the interferograms to form.\n # Type: array | null.\n indexes:\nunwrap_options:\n # Whether to run the unwrapping step after wrapped phase estimation.\n # Type: boolean.\n run_unwrap: true\n # Whether to run Goldstein filtering step on wrapped interferogram.\n # Type: boolean.\n run_goldstein: false\n # Whether to run interpolation step on wrapped interferogram.\n # Type: boolean.\n run_interpolation: true\n # Phase unwrapping method.\n # Type: string.\n # Options: ['snaphu', 'icu', 'phass', 'spurt', 'whirlwind'].\n unwrap_method: snaphu\n # Number of interferograms to unwrap in parallel.\n # Type: integer.\n n_parallel_jobs: 4\n # Set wrapped phase/correlation to 0 where mask is 0 before unwrapping. .\n # Type: boolean.\n zero_where_masked: false\n preprocess_options:\n # Adaptive phase (Goldstein) filter exponent parameter.\n # Type: number.\n alpha: 0.5\n # (for interpolation) Maximum radius to find scatterers.\n # Type: integer.\n max_radius: 51\n # Threshold on the correlation raster to use for interpolation. Pixels with less than this\n # value are replaced by a weighted combination of neighboring pixels.\n # Type: number.\n interpolation_cor_threshold: 0.3\n # Threshold on the correlation raster to use for interpolation. Pixels with less than this\n # value are replaced by a weighted combination of neighboring pixels.\n # Type: number.\n interpolation_similarity_threshold: 0.3\n snaphu_options:\n # Number of tiles to split the inputs into using SNAPHU's internal tiling.\n # Type: array.\n ntiles:\n - 2\n - 2\n # Amount of tile overlap (in pixels) along the (row, col) directions.\n # Type: array.\n tile_overlap:\n - 0\n - 0\n # Number of tiles to unwrap in parallel for each interferogram.\n # Type: integer.\n n_parallel_tiles: 1\n # Initialization method for SNAPHU.\n # Type: string.\n # Options: ['mcf', 'mst'].\n init_method: mcf\n # Statistical cost mode method for SNAPHU.\n # Type: string.\n # Options: ['defo', 'smooth'].\n cost: smooth\n # If True, after unwrapping with multiple tiles, an additional post-processing unwrapping\n # step is performed to re-optimize the unwrapped phase using a single tile.\n # Type: boolean.\n single_tile_reoptimize: false\n tophu_options:\n # Number of tiles to split the inputs into.\n # Type: array.\n ntiles:\n - 2\n - 2\n # Extra multilook factor to use for the coarse unwrap.\n # Type: array.\n downsample_factor:\n - 5\n - 5\n # Initialization method for SNAPHU.\n # Type: string.\n # Options: ['mcf', 'mst'].\n init_method: mcf\n # Statistical cost mode method for SNAPHU.\n # Type: string.\n # Options: ['defo', 'smooth'].\n cost: smooth\n spurt_options:\n # Temporal coherence to pick pixels used on an irregular grid.\n # Type: number.\n temporal_coherence_threshold: 0.7\n # Similarity to pick pixels used on an irregular grid. Any pixel with similarity above\n # `similarity_threshold` *or* above the temporal coherence threshold is chosen.\n # Type: number.\n similarity_threshold: 0.5\n # After running spurt, interpolate the values that were masked during unwrapping (which are\n # otherwise left as nan).\n # Type: boolean.\n run_ambiguity_interpolation: true\n general_settings:\n # Tile up data spatially.\n # Type: boolean.\n use_tiles: true\n tiler_settings:\n # Maximum number of tiles allowed.\n # Type: integer.\n max_tiles: 64\n # Number of points used for determining tiles based on density.\n # Type: integer.\n target_points_for_generation: 120000\n # Target points per tile when generating tiles.\n # Type: integer.\n target_points_per_tile: 900000\n # Dilation factor of non-overlapping tiles. 0.05 would lead to 5 percent dilation of the\n # tile.\n # Type: number.\n dilation_factor: 0.05\n solver_settings:\n # Number of workers for temporal unwrapping in parallel. Set value to <=0 to let workflow\n # use default workers (ncpus - 1).\n # Type: integer.\n t_worker_count: 1\n # Number of workers for spatial unwrapping in parallel. Set value to <=0 to let workflow use\n # (ncpus - 1).\n # Type: integer.\n s_worker_count: 1\n # Temporal unwrapping operations over spatial links are performed in batches and each batch\n # is solved in parallel.\n # Type: integer.\n links_per_batch: 150000\n # Temporal unwrapping costs.\n # Type: string.\n # Options: ['constant', 'distance', 'centroid'].\n t_cost_type: constant\n # Scale factor used to compute edge costs for temporal unwrapping.\n # Type: number.\n t_cost_scale: 100.0\n # Spatial unwrapping costs.\n # Type: string.\n # Options: ['constant', 'distance', 'centroid'].\n s_cost_type: constant\n # Scale factor used to compute edge costs for spatial unwrapping.\n # Type: number.\n s_cost_scale: 100.0\n # Number of tiles to process in parallel. Set to 0 for all tiles.\n # Type: integer.\n num_parallel_tiles: 1\n merger_settings:\n # Minimum number of overlap pixels to be considered valid.\n # Type: integer.\n min_overlap_points: 25\n # Currently, only 'dirichlet' is supported.\n # Type: dirichlet.\n # Options: ['dirichlet'].\n method: dirichlet\n # Method used to estimate bulk offset between tiles.\n # Type: string.\n # Options: ['integer', 'L2'].\n bulk_method: L2\n # Number of interferograms to merge in one batch. Use zero to merge all interferograms in a\n # single batch.\n # Type: integer.\n num_parallel_ifgs: 3\ntimeseries_options:\n # Whether to run the inversion step after unwrapping, if more than a single-reference\n # network is used.\n # Type: boolean.\n run_inversion: true\n # Norm to use during timeseries inversion.\n # Type: string.\n # Options: ['L1', 'L2'].\n method: L1\n # Reference point (row, col) used if performing a time series inversion. If not provided, a\n # point will be selected from a consistent connected component with low amplitude\n # dispersion.\n # Type: array | null.\n reference_point:\n # Run the velocity estimation from the phase time series.\n # Type: boolean.\n run_velocity: false\n # Pixels with correlation below this value will be masked out.\n # Type: number.\n correlation_threshold: 0.2\n # Size (rows, columns) of blocks of data to load at a time. 3D dimsion is number of\n # interferograms (during inversion) and number of SLC dates (during velocity fitting).\n # Type: array.\n block_shape:\n - 256\n - 256\n # Number of parallel blocks to process at once.\n # Type: integer.\n num_parallel_blocks: 4\ncorrection_options:\n # List of weather-model files (one per date) for tropospheric corrections.\n # Type: array.\n troposphere_files: []\n # Format of dates contained in weather-model filenames.\n # Type: string.\n tropo_date_fmt: '%Y%m%d'\n # Package for tropospheric correction. Choices: pyaps, raider.\n # Type: string.\n tropo_package: pyaps\n # Enumeration representing different tropospheric models.\n # Type: string.\n # Options: ['ECMWF', 'ERA5', 'HRES', 'ERAINT', 'ERAI', 'MERRA', 'NARR', 'HRRR', 'GMAO'].\n tropo_model: ECMWF\n # Type of tropospheric delay.\n # Type: string.\n # Options: ['wet', 'dry', 'hydrostatic', 'comb'].\n tropo_delay_type: comb\n # List of GNSS-derived TEC maps for ionospheric corrections (one per date). Source is\n # https://cddis.nasa.gov/archive/gnss/products/ionex/.\n # Type: array.\n ionosphere_files: []\n # Line-of-sight geometry files for each burst/SLC stack area, for use in correction\n # computations.\n # Type: array.\n geometry_files: []\n # DEM file for tropospheric/ topographic phase corrections.\n # Type: string | null.\n dem_file:\nalgorithm_parameters_overrides_json:\nsubdataset: /science/LSAR/GSLC/grids/frequencyA/HH\nrecommended_temporal_coherence_threshold: 0.6\nrecommended_similarity_threshold: 0.5\nspatial_wavelength_cutoff: 25000.0\nbrowse_image_vmin_vmax:\n - -0.1\n - 0.1\nnum_parallel_products: 3\n"
[INFO|validate|L506] 2025-03-31T19:19:16+0000: Checking geospatial metadata...
[INFO|validate|L512] 2025-03-31T19:19:16+0000: Files output/historical/20060630_20060815.nc and golden_output/historical/20060630_20060815.nc match.
For the current delivery, all checks are expected pass when the AT has been run on an AMD-family instance type.