Skip to content

DISP‐S1‐STATIC Final Acceptance Testing Instructions

Riley Kuttruff edited this page Sep 17, 2025 · 4 revisions

This page contains instructions for performing Acceptance Testing for the DISP-S1-STATIC Final delivery from the OPERA-ADT team. These instructions pertain to the latest version of the Final release, currently delivery v6.10. 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.

Acquiring the DISP-S1-STATIC Final Docker Image

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_s1/r6.10/final/dockerimg_disp_s1_final.tar.

Expected input/output data is not in AFN, but we can use the current integration test data archives in S3:

  • Input data: disp_s1/disp_s1_static_r6.6_calval_expected_input.zip
  • Output data: disp_s1/disp_s1_static_r6.9_final_expected_output.zip

The associated runconfig can be found on GitHub:

curl 'https://raw.githubusercontent.com/nasa/opera-sds-pge/3d681d3c01dc8ab3db0853139183fb0c538acf1d/.ci/scripts/disp_s1/opera_pge_disp_s1_static_r6.6_calval_runconfig.yaml' -o runconfig_static.yaml

NOTE this runconfig is for the PGE. The SAS section (RunConfig.Groups.SAS) will need to be isolated

Documentation for the current delivery is at general/gov/nasa/jpl/opera/adt/disp_s1/r6.6/final/documents/.

Download both images to a location on your local machine. This location will be referred to throughout this instructions as <DISP_S1_DIR>

Loading the image into Docker

The first step in running the DISP-S1 image is to load it into Docker via the following command:

docker load -i <DISP_S1_DIR>/dockerimg_disp_s1_final.tar

This should add the Docker image to your local repository with the name opera/disp-s1 and the tag 0.5.10.

Preparing the test data

Once the input/output zip files are downloaded to your local machine, unpack them to <DISP_S1_DIR>:

unzip disp_s1_static_r6.6_calval_expected_input.zip
mv disp_s1_static_r6.6_calval_expected_input/* .
rmdir disp_s1_static_r6.6_calval_expected_input/

unzip disp_s1_static_r6.9_final_expected_output.zip
mv disp_s1_static_r6.9_final_expected_output/* .
rmdir disp_s1_static_r6.9_final_expected_output/

This will create the following files & directories within <DISP_S1_DIR>:

  • cslc_static/
  • dem.vrt
  • dem_0.tif
  • golden_output/
    • dem_warped_utm.tif
    • layover_shadow_mask.tif
    • los_enu.browse.png
    • los_enu.tif
  • opera-s1-disp-0.9.0-frame-to-burst.json.zip
  • rtc_static/
  • runconfig_static.yaml

In order to execute the SAS, the input file directories, ancillaries, 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_S1_DIR> directory:

  • Create a directory named runconfig just under <DISP_S1_DIR>, and copy the existing runconfig YAML files into it:

    mkdir -p <DISP_S1_DIR>/runconfig

    cp <DISP_S1_DIR>/runconfig_static.yaml <DISP_S1_DIR>/runconfig/.

  • Create the output directory and ensure it is writable:

    mkdir -p <DIST_S1_DIR>/output_dir

    chmod ga+w <DIST_S1_DIR>/output_dir

  • Create the scratch directory and ensure it is writable:

    mkdir -p <DIST_S1_DIR>/scratch_dir

    chmod ga+w <DIST_S1_DIR>/scratch_dir

  • Create the input directory and move input files into it:

    mkdir -p <DIST_S1_DIR>/input_dir

    mv cslc_static/ opera-s1-disp-0.9.0-frame-to-burst.json.zip dem_0.tif dem.vrt rtc_static/ input_dir/

Executing the DISP-S1 container on the sample datasets

Change directory into the <DISP_S1_DIR> directory.

cd <DISP_S1_DIR>/

We're now ready to execute the DISP-S1-STATIC Final delivery. Run the following the command to kick off execution with the test assets:

NOTE: the relative path to the runconfig file must be specified in the docker run command. Assuming you are running from within <DISP_S1_DIR>, the $(pwd) command can be utilized as a shortcut.

docker run --rm --user $(id -u):$(id -g) \
   --volume $(pwd)/input_dir:/home/mamba/input_dir  \
   --volume $(pwd)/scratch_dir:/home/mamba/scratch_dir  \
   --volume $(pwd)/output_dir:/home/mamba/output_dir \
   --volume $(pwd)/runconfig:/work/runconfig \
   opera/disp-s1:0.5.10 disp-s1 run runconfig/runconfig_static.yaml

The docker container will output progress messages as it runs, e.g.:

Sample console output
mkdir -p failed for path /home/mamba/.cache/matplotlib: [Errno 13] Permission denied: '/home/mamba/.cache/matplotlib'
Matplotlib created a temporary cache directory at /tmp/matplotlib-m5imlyva because there was an issue with the default path (/home/mamba/.cache/matplotlib); it is highly recommended to set the MPLCONFIGDIR environment variable to a writable directory, in particular to speed up the import of Matplotlib and to better support multiprocessing.
[INFO|main_static_layers|L79] 2025-09-17T21:10:00+0000: Creating geometry layers Workflow
[INFO|main_static_layers|L83] 2025-09-17T21:10:00+0000: Stitching RTC layover shadow mask files
[INFO|main_static_layers|L98] 2025-09-17T21:10:02+0000: Stitching CSLC line of sight geometry files
[INFO|main_static_layers|L122] 2025-09-17T21:11:22+0000: Warping DEM to match UTM frame boundary
[INFO|main_static_layers|L235] 2025-09-17T21:11:22+0000: Warping DEM with isce3
[INFO|main_static_layers|L130] 2025-09-17T21:11:29+0000: Product type: DISP_S1_STATIC
[INFO|main_static_layers|L131] 2025-09-17T21:11:29+0000: Product version: 1.0
[INFO|main_static_layers|L133] 2025-09-17T21:11:29+0000: Maximum memory usage: 3.42 GB
[INFO|main_static_layers|L134] 2025-09-17T21:11:29+0000: Current running disp_s1 version: 0.5.10
[INFO|main_static_layers|L529] 2025-09-17T21:11:29+0000: Creating metadata for static layers products
100%|██████████| 3/3 [00:01<00:00,  2.69it/s]
[INFO|_log|L102] 2025-09-17T21:11:33+0000: Total elapsed time for disp_s1.main_static_layers.run_static_layers : 1.57 minutes (94.17 seconds)
journal:
 -- start X: 523440.000000
 -- end X: 811380.000000
 -- start Y: 4261770.000000
 -- end Y: 4055790.000000
 -- spacing X: 30.000000
 -- spacing Y: -30.000000
 -- width: 9598
 -- length: 6866
 -- epsg: 32610

Execution time for the small test case on opera-dev-pge (r6a.4xlarge at time of writing) was under 2 minutes.

The output_dir/ directory will contain the product files and a browse PNG:

output_dir/
├── dem_warped_utm.tif
├── layover_shadow_mask.tif
├── los_enu.browse.png
├── los_enu.tif
└── sas_logfile.log

Running the Quality Assurance test

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-S1 products generated by DISP-S1-SAS with expected outputs “golden datasets” is included in the Docker image. The disp-s1 application can run a "validate-static-layers" workflow that accepts two input directories: the golden dataset and the test dataset.

The docker command to run this is:

docker run --rm --user $(id -u):$(id -g) --volume $(pwd):/work \
    opera/disp-s1:0.5.10 \
    disp-s1 validate-static-layers <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 --user $(id -u):$(id -g) --volume $(pwd):/work \
    opera/disp-s1:0.5.10 \
    disp-s1 validate-static-layers golden_output/ output_dir/

Sample output from comparison for current delivery:

Sample comparison console output
$ docker run --rm  --user $(id -u):$(id -g) --volume $(pwd):/work         opera/disp-s1:0.5.10         disp-s1 validate-static-layers golden_output/ output_dir/
mkdir -p failed for path /home/mamba/.cache/matplotlib: [Errno 13] Permission denied: '/home/mamba/.cache/matplotlib'
Matplotlib created a temporary cache directory at /tmp/matplotlib-ng30m_hg because there was an issue with the default path (/home/mamba/.cache/matplotlib); it is highly recommended to set the MPLCONFIGDIR environment variable to a writable directory, in particular to speed up the import of Matplotlib and to better support multiprocessing.
[INFO|validate|L519] 2025-09-17T21:15:22+0000: Comparing contents of output_dir to golden_output...
[INFO|validate|L527] 2025-09-17T21:15:22+0000: Comparing output_dir/dem_warped_utm.tif to golden_output/dem_warped_utm.tif...
[INFO|validate|L532] 2025-09-17T21:15:23+0000: Checking geospatial metadata...
[INFO|validate|L527] 2025-09-17T21:15:23+0000: Comparing output_dir/layover_shadow_mask.tif to golden_output/layover_shadow_mask.tif...
[INFO|validate|L532] 2025-09-17T21:15:24+0000: Checking geospatial metadata...
[INFO|validate|L527] 2025-09-17T21:15:24+0000: Comparing output_dir/los_enu.tif to golden_output/los_enu.tif...
[INFO|validate|L532] 2025-09-17T21:15:26+0000: Checking geospatial metadata...
[INFO|validate|L535] 2025-09-17T21:15:26+0000: All files match.

For the current delivery, all checks are expected pass when the AT has been run on an AMD-family instance type.

Clone this wiki locally