From d1c4d7f93fe3f9ec11bf11e32259ea02b21a0dcd Mon Sep 17 00:00:00 2001 From: "Gustavo H. X. Shiroma" Date: Thu, 3 Jul 2025 11:30:42 -0700 Subject: [PATCH 01/11] disable polarimetric symmetrization by default --- share/nisar/defaults/gcov.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/share/nisar/defaults/gcov.yaml b/share/nisar/defaults/gcov.yaml index db0c71352..3b9da8a89 100644 --- a/share/nisar/defaults/gcov.yaml +++ b/share/nisar/defaults/gcov.yaml @@ -177,7 +177,7 @@ runconfig: # HV and VH), otherwise, the flag is ignored. # If enabled, the output product's "HV" dataset will contain symmetrized # HV/VH data and the "VH" dataset will be omitted from the output. - symmetrize_cross_pol_channels: True + symmetrize_cross_pol_channels: False # TODO OPTIONAL - Only checked when internet access is available dem_download: From 2ac26942f19a6ff2e3145a96ca52044d09f867ea Mon Sep 17 00:00:00 2001 From: "Gustavo H. X. Shiroma" Date: Tue, 22 Jul 2025 13:58:03 -0700 Subject: [PATCH 02/11] revert changes to `symmetrize_cross_pol_channels` --- share/nisar/defaults/gcov.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/share/nisar/defaults/gcov.yaml b/share/nisar/defaults/gcov.yaml index 3b9da8a89..db0c71352 100644 --- a/share/nisar/defaults/gcov.yaml +++ b/share/nisar/defaults/gcov.yaml @@ -177,7 +177,7 @@ runconfig: # HV and VH), otherwise, the flag is ignored. # If enabled, the output product's "HV" dataset will contain symmetrized # HV/VH data and the "VH" dataset will be omitted from the output. - symmetrize_cross_pol_channels: False + symmetrize_cross_pol_channels: True # TODO OPTIONAL - Only checked when internet access is available dem_download: From 05d7fda0ff21704541179bfc5b0fb5415ebae1b6 Mon Sep 17 00:00:00 2001 From: "Gustavo H. X. Shiroma" Date: Tue, 22 Jul 2025 16:01:58 -0700 Subject: [PATCH 03/11] Update GCOV and GSLC specification XMLs --- .../nisar/products/XML/L2/nisar_L2_GCOV.xml | 291 ++++++++++------ .../nisar/products/XML/L2/nisar_L2_GSLC.xml | 321 +++++++++++------- 2 files changed, 371 insertions(+), 241 deletions(-) diff --git a/python/packages/nisar/products/XML/L2/nisar_L2_GCOV.xml b/python/packages/nisar/products/XML/L2/nisar_L2_GCOV.xml index 021b48b6a..a9e931bdb 100644 --- a/python/packages/nisar/products/XML/L2/nisar_L2_GCOV.xml +++ b/python/packages/nisar/products/XML/L2/nisar_L2_GCOV.xml @@ -105,7 +105,7 @@ + shape="numberOfObservations"> List of planned datatakes included in the product @@ -127,13 +127,19 @@ List of frequency layers available in the product - + List of each input raw dataset's observation mode + + - Indicates if the radar operation mode is a diagnostic mode (1-2) or DBFed science (0): 0, 1, or 2 - + Indicates if the radar operation mode is a diagnostic mode (1-2) or DBFed science (0): 0, 1, or 2 + @@ -182,7 +188,7 @@ name="/science/LSAR/identification/processingType" shape="scalar"> Nominal (or) Urgent (or) Custom (or) Undefined + lang="en">Processing pipeline used to generate this granule. "Nominal": standard production system; "Urgent": time-sensitive processing in response to urgent response events; "Custom": user-initiated processing outside the nominal production system X coordinates in specified projection Y coordinates in specified projection @@ -329,7 +337,7 @@ valid_min="0" _FillValue="nan" grid_mapping="projection" - units="1">Radiometric terrain correction factor to normalize GCOV terms from gamma0 to sigma0 + units="1">Radiometric terrain correction (RTC) scaling factor to normalize backscatter coefficients from gamma0 to sigma0, accounting for local terrain Mask indicating the subswath number associated with valid GCOV samples. A GCOV sample is only considered valid if it is generated from fully-focused radar samples. If at least one radar sample in the averaging set is partially focused or invalid, the corresponding mask pixel will contain the value `0`. GCOV pixels outside of the radar acquisition extent are filled with the value `255` + grid_mapping="projection">Mask indicating the subswath number associated with valid GCOV samples. A GCOV sample is only considered valid if it is generated from fully-focused radar samples. If at least one radar sample in the averaging set is partially focused or invalid, the corresponding mask pixel will contain the value 0. GCOV pixels outside of the radar acquisition extent are filled with the value 255 X coordinates in specified projection Y coordinates in specified projection @@ -706,7 +716,7 @@ valid_min="0" _FillValue="nan" grid_mapping="projection" - units="1">Radiometric terrain correction factor to normalize GCOV terms from gamma0 to sigma0 + units="1">Radiometric terrain correction (RTC) scaling factor to normalize backscatter coefficients from gamma0 to sigma0, accounting for local terrain Mask indicating the subswath number associated with valid GCOV samples. A GCOV sample is only considered valid if it is generated from fully-focused radar samples. If at least one radar sample in the averaging set is partially focused or invalid, the corresponding mask pixel will contain the value `0`. GCOV pixels outside of the radar acquisition extent are filled with the value `255` + grid_mapping="projection">Mask indicating the subswath number associated with valid GCOV samples. A GCOV sample is only considered valid if it is generated from fully-focused radar samples. If at least one radar sample in the averaging set is partially focused or invalid, the corresponding mask pixel will contain the value 0. GCOV pixels outside of the radar acquisition extent are filled with the value 255 East component of unit vector of LOS from target to sensor + units="1">East component of the line-of-sight (LOS) unit vector, defined from the target to the sensor, expressed in the east-north-up (ENU) coordinate system with its origin at the target location North component of unit vector of LOS from target to sensor + units="1">North component of the line-of-sight (LOS) unit vector, defined from the target to the sensor, expressed in the east-north-up (ENU) coordinate system with its origin at the target location East component of unit vector along ground track + units="1">East component of the along-track unit vector at the target location, expressed in the east-north-up (ENU) coordinate system and projected onto the horizontal plane (i.e., excluding the up component) North component of unit vector along ground track + units="1">North component of the along-track unit vector at the target location, expressed in the east-north-up (ENU) coordinate system and projected onto the horizontal plane (i.e., excluding the up component) X coordinates in specified projection X coordinates in specified projection - - + + Product map grid projection: EPSG code, with additional projection information as HDF5 Attributes + + + Y coordinates in specified projection + + + X coordinates in specified projection + Crosstalk in H-transmit channel expressed as ratio txV / txH Crosstalk in V-transmit channel expressed as ratio txH / txV Crosstalk in H-receive channel expressed as ratio rxV / rxH Crosstalk in V-receive channel expressed as ratio rxH / rxV + + @@ -2437,14 +2519,14 @@ Reference Terrain Height as a function of map coordinates + units="meters">Reference terrain height as a function of map coordinates scalar values - - - number of datatakes in product - - - number of observations in product + lang="en">Number of observations in product @@ -3372,28 +3445,22 @@ Shape of calibration LUTs + lang="en">Shape of real-valued calibration LUTs - Shape of antenna pattern datasets + lang="en">Shape of complex-valued calibration LUTs - - Shape of crosstalk datasets - - + shape="numberOfObservations"> List of planned datatakes included in the product @@ -127,13 +127,19 @@ List of frequency layers available in the product - + List of each input raw dataset's observation mode + + - Indicates if the radar operation mode is a diagnostic mode (1-2) or DBFed science (0): 0, 1, or 2 - + Indicates if the radar operation mode is a diagnostic mode (1-2) or DBFed science (0): 0, 1, or 2 + @@ -182,7 +188,7 @@ name="/science/LSAR/identification/processingType" shape="scalar"> Nominal (or) Urgent (or) Custom (or) Undefined + lang="en">Processing pipeline used to generate this granule. "Nominal": standard production system; "Urgent": time-sensitive processing in response to urgent response events; "Custom": user-initiated processing outside the nominal production system Mask indicating the subswath number representing valid GSLC samples. Each GSLC pixel is assumed valid if all the pixels in the interpolation window are fully focused in the input RSLC. A value of `0` indicates that at least one RSLC pixel in the interpolation window is partially focused or invalid. Pixels outside of the radar acquisition extent are filled with the value `255`. + _FillValue="255">Mask indicating the subswath number representing valid GSLC samples. Each GSLC pixel is assumed valid if all the pixels in the interpolation window are fully focused in the input RSLC. A value of 0 indicates that at least one RSLC pixel in the interpolation window is partially focused or invalid. Pixels outside of the radar acquisition extent are filled with the value 255. Focused SLC image (HH) @@ -373,7 +379,7 @@ mean_real_value="Arithmetic average of the real part of the numeric data points" sample_stddev_real="Standard deviation of the real part of the numeric data points" long_name="Geocoded single-look complex image HV" - grid_mapping='projection' + grid_mapping="projection" DIMENSION_LIST="HDF5 internal attribute" _FillValue="(nan+nan*j)" units="1">Focused SLC image (HV) @@ -393,7 +399,7 @@ mean_real_value="Arithmetic average of the real part of the numeric data points" sample_stddev_real="Standard deviation of the real part of the numeric data points" long_name="Geocoded single-look complex image VH" - grid_mapping='projection' + grid_mapping="projection" DIMENSION_LIST="HDF5 internal attribute" _FillValue="(nan+nan*j)" units="1">Focused SLC image (VH) @@ -413,7 +419,7 @@ mean_real_value="Arithmetic average of the real part of the numeric data points" sample_stddev_real="Standard deviation of the real part of the numeric data points" long_name="Geocoded single-look complex image VV" - grid_mapping='projection' + grid_mapping="projection" DIMENSION_LIST="HDF5 internal attribute" _FillValue="(nan+nan*j)" units="1">Focused SLC image (VV) @@ -433,7 +439,7 @@ mean_real_value="Arithmetic average of the real part of the numeric data points" sample_stddev_real="Standard deviation of the real part of the numeric data points" long_name="Geocoded single-look complex image RH" - grid_mapping='projection' + grid_mapping="projection" DIMENSION_LIST="HDF5 internal attribute" _FillValue="(nan+nan*j)" units="1">Focused SLC image (RH) @@ -453,7 +459,7 @@ mean_real_value="Arithmetic average of the real part of the numeric data points" sample_stddev_real="Standard deviation of the real part of the numeric data points" long_name="Geocoded single-look complex image RV" - grid_mapping='projection' + grid_mapping="projection" DIMENSION_LIST="HDF5 internal attribute" _FillValue="(nan+nan*j)" units="1">Focused SLC image (RV) @@ -538,14 +544,14 @@ Mask indicating the subswath number representing valid GSLC samples. Each GSLC pixel is assumed valid if all the pixels in the interpolation window are fully focused in the input RSLC. A value of `0` indicates that at least one RSLC pixel in the interpolation window is partially focused or invalid. Pixels outside of the radar acquisition extent are filled with the value `255`. + _FillValue="255">Mask indicating the subswath number representing valid GSLC samples. Each GSLC pixel is assumed valid if all the pixels in the interpolation window are fully focused in the input RSLC. A value of 0 indicates that at least one RSLC pixel in the interpolation window is partially focused or invalid. Pixels outside of the radar acquisition extent are filled with the value 255. Focused SLC image (HH) @@ -626,7 +632,7 @@ mean_real_value="Arithmetic average of the real part of the numeric data points" sample_stddev_real="Standard deviation of the real part of the numeric data points" long_name="Geocoded single-look complex image HV" - grid_mapping='projection' + grid_mapping="projection" DIMENSION_LIST="HDF5 internal attribute" _FillValue="(nan+nan*j)" units="1">Focused SLC image (HV) @@ -646,7 +652,7 @@ mean_real_value="Arithmetic average of the real part of the numeric data points" sample_stddev_real="Standard deviation of the real part of the numeric data points" long_name="Geocoded single-look complex image VH" - grid_mapping='projection' + grid_mapping="projection" DIMENSION_LIST="HDF5 internal attribute" _FillValue="(nan+nan*j)" units="1">Focused SLC image (VH) @@ -666,7 +672,7 @@ mean_real_value="Arithmetic average of the real part of the numeric data points" sample_stddev_real="Standard deviation of the real part of the numeric data points" long_name="Geocoded single-look complex image VV" - grid_mapping='projection' + grid_mapping="projection" DIMENSION_LIST="HDF5 internal attribute" _FillValue="(nan+nan*j)" units="1">Focused SLC image (VV) @@ -686,7 +692,7 @@ mean_real_value="Arithmetic average of the real part of the numeric data points" sample_stddev_real="Standard deviation of the real part of the numeric data points" long_name="Geocoded single-look complex image RH" - grid_mapping='projection' + grid_mapping="projection" DIMENSION_LIST="HDF5 internal attribute" _FillValue="(nan+nan*j)" units="1">Focused SLC image (RH) @@ -706,7 +712,7 @@ mean_real_value="Arithmetic average of the real part of the numeric data points" sample_stddev_real="Standard deviation of the real part of the numeric data points" long_name="Geocoded single-look complex image RVH" - grid_mapping='projection' + grid_mapping="projection" DIMENSION_LIST="HDF5 internal attribute" _FillValue="(nan+nan*j)" units="1">Focused SLC image (RV) @@ -832,7 +838,7 @@ _FillValue="nan" grid_mapping="projection" long_name="LOS unit vector X" - units="1">East component of unit vector of LOS from target to sensor + units="1">East component of the line-of-sight (LOS) unit vector, defined from the target to the sensor, expressed in the east-north-up (ENU) coordinate system with its origin at the target location North component of unit vector of LOS from target to sensor + units="1">North component of the line-of-sight (LOS) unit vector, defined from the target to the sensor, expressed in the east-north-up (ENU) coordinate system with its origin at the target location East component of unit vector along ground track + units="1">East component of the along-track unit vector at the target location, expressed in the east-north-up (ENU) coordinate system and projected onto the horizontal plane (i.e., excluding the up component) North component of unit vector along ground track + units="1">North component of the along-track unit vector at the target location, expressed in the east-north-up (ENU) coordinate system and projected onto the horizontal plane (i.e., excluding the up component) X coordinates in specified projection X coordinates in specified projection - - + + Product map grid projection: EPSG code, with additional projection information as HDF5 Attributes + + + Y coordinates in specified projection + + + X coordinates in specified projection + Crosstalk in H-transmit channel expressed as ratio txV / txH Crosstalk in V-transmit channel expressed as ratio txH / txV Crosstalk in H-receive channel expressed as ratio rxV / rxH Crosstalk in V-receive channel expressed as ratio rxH / rxV + + @@ -2096,7 +2174,7 @@ lang="en" _FillValue="nan" grid_mapping="projection" - units="meters">Reference Terrain Height as a function of geographical location + units="meters">Reference terrain height as a function of map coordinates scalar values - - - number of datatakes in product - - - number of observations in product + lang="en">Number of observations in product @@ -3116,28 +3185,22 @@ Shape of calibration LUTs + lang="en">Shape of real-valued calibration LUTs - Shape of antenna pattern datasets + lang="en">Shape of complex-valued calibration LUTs - - Shape of crosstalk datasets - - Number of input L1 SLC granules + name="numberOfInputL1Files"/> From 749058db5115479f727ca055d828370ecd1ec07e Mon Sep 17 00:00:00 2001 From: "Gustavo H. X. Shiroma" Date: Wed, 23 Jul 2025 11:45:11 -0700 Subject: [PATCH 04/11] Revert changes to the GCOV and GSLC specification XMLs --- .../nisar/products/XML/L2/nisar_L2_GCOV.xml | 291 ++++++---------- .../nisar/products/XML/L2/nisar_L2_GSLC.xml | 321 +++++++----------- 2 files changed, 241 insertions(+), 371 deletions(-) diff --git a/python/packages/nisar/products/XML/L2/nisar_L2_GCOV.xml b/python/packages/nisar/products/XML/L2/nisar_L2_GCOV.xml index a9e931bdb..021b48b6a 100644 --- a/python/packages/nisar/products/XML/L2/nisar_L2_GCOV.xml +++ b/python/packages/nisar/products/XML/L2/nisar_L2_GCOV.xml @@ -105,7 +105,7 @@ + shape="numberOfDatatakes"> List of planned datatakes included in the product @@ -127,19 +127,13 @@ List of frequency layers available in the product - - List of each input raw dataset's observation mode - - - Indicates if the radar operation mode is a diagnostic mode (1-2) or DBFed science (0): 0, 1, or 2 - + Indicates if the radar operation mode is a diagnostic mode (1-2) or DBFed science (0): 0, 1, or 2 + @@ -188,7 +182,7 @@ name="/science/LSAR/identification/processingType" shape="scalar"> Processing pipeline used to generate this granule. "Nominal": standard production system; "Urgent": time-sensitive processing in response to urgent response events; "Custom": user-initiated processing outside the nominal production system + lang="en">Nominal (or) Urgent (or) Custom (or) Undefined X coordinates in specified projection Y coordinates in specified projection @@ -337,7 +329,7 @@ valid_min="0" _FillValue="nan" grid_mapping="projection" - units="1">Radiometric terrain correction (RTC) scaling factor to normalize backscatter coefficients from gamma0 to sigma0, accounting for local terrain + units="1">Radiometric terrain correction factor to normalize GCOV terms from gamma0 to sigma0 Mask indicating the subswath number associated with valid GCOV samples. A GCOV sample is only considered valid if it is generated from fully-focused radar samples. If at least one radar sample in the averaging set is partially focused or invalid, the corresponding mask pixel will contain the value 0. GCOV pixels outside of the radar acquisition extent are filled with the value 255 + grid_mapping="projection">Mask indicating the subswath number associated with valid GCOV samples. A GCOV sample is only considered valid if it is generated from fully-focused radar samples. If at least one radar sample in the averaging set is partially focused or invalid, the corresponding mask pixel will contain the value `0`. GCOV pixels outside of the radar acquisition extent are filled with the value `255` X coordinates in specified projection Y coordinates in specified projection @@ -716,7 +706,7 @@ valid_min="0" _FillValue="nan" grid_mapping="projection" - units="1">Radiometric terrain correction (RTC) scaling factor to normalize backscatter coefficients from gamma0 to sigma0, accounting for local terrain + units="1">Radiometric terrain correction factor to normalize GCOV terms from gamma0 to sigma0 Mask indicating the subswath number associated with valid GCOV samples. A GCOV sample is only considered valid if it is generated from fully-focused radar samples. If at least one radar sample in the averaging set is partially focused or invalid, the corresponding mask pixel will contain the value 0. GCOV pixels outside of the radar acquisition extent are filled with the value 255 + grid_mapping="projection">Mask indicating the subswath number associated with valid GCOV samples. A GCOV sample is only considered valid if it is generated from fully-focused radar samples. If at least one radar sample in the averaging set is partially focused or invalid, the corresponding mask pixel will contain the value `0`. GCOV pixels outside of the radar acquisition extent are filled with the value `255` East component of the line-of-sight (LOS) unit vector, defined from the target to the sensor, expressed in the east-north-up (ENU) coordinate system with its origin at the target location + units="1">East component of unit vector of LOS from target to sensor North component of the line-of-sight (LOS) unit vector, defined from the target to the sensor, expressed in the east-north-up (ENU) coordinate system with its origin at the target location + units="1">North component of unit vector of LOS from target to sensor East component of the along-track unit vector at the target location, expressed in the east-north-up (ENU) coordinate system and projected onto the horizontal plane (i.e., excluding the up component) + units="1">East component of unit vector along ground track North component of the along-track unit vector at the target location, expressed in the east-north-up (ENU) coordinate system and projected onto the horizontal plane (i.e., excluding the up component) + units="1">North component of unit vector along ground track X coordinates in specified projection X coordinates in specified projection + + - - Product map grid projection: EPSG code, with additional projection information as HDF5 Attributes - - - Y coordinates in specified projection - - - X coordinates in specified projection - Crosstalk in H-transmit channel expressed as ratio txV / txH Crosstalk in V-transmit channel expressed as ratio txH / txV Crosstalk in H-receive channel expressed as ratio rxV / rxH Crosstalk in V-receive channel expressed as ratio rxH / rxV - - @@ -2519,14 +2437,14 @@ Reference terrain height as a function of map coordinates + units="meters">Reference Terrain Height as a function of map coordinates scalar values + + + number of datatakes in product + + + Number of observations in product + lang="en">number of observations in product @@ -3445,22 +3372,28 @@ Shape of real-valued calibration LUTs + lang="en">Shape of calibration LUTs - Shape of complex-valued calibration LUTs + lang="en">Shape of antenna pattern datasets + + Shape of crosstalk datasets + + + shape="numberOfDatatakes"> List of planned datatakes included in the product @@ -127,19 +127,13 @@ List of frequency layers available in the product - - List of each input raw dataset's observation mode - - - Indicates if the radar operation mode is a diagnostic mode (1-2) or DBFed science (0): 0, 1, or 2 - + Indicates if the radar operation mode is a diagnostic mode (1-2) or DBFed science (0): 0, 1, or 2 + @@ -188,7 +182,7 @@ name="/science/LSAR/identification/processingType" shape="scalar"> Processing pipeline used to generate this granule. "Nominal": standard production system; "Urgent": time-sensitive processing in response to urgent response events; "Custom": user-initiated processing outside the nominal production system + lang="en">Nominal (or) Urgent (or) Custom (or) Undefined Mask indicating the subswath number representing valid GSLC samples. Each GSLC pixel is assumed valid if all the pixels in the interpolation window are fully focused in the input RSLC. A value of 0 indicates that at least one RSLC pixel in the interpolation window is partially focused or invalid. Pixels outside of the radar acquisition extent are filled with the value 255. + _FillValue="255">Mask indicating the subswath number representing valid GSLC samples. Each GSLC pixel is assumed valid if all the pixels in the interpolation window are fully focused in the input RSLC. A value of `0` indicates that at least one RSLC pixel in the interpolation window is partially focused or invalid. Pixels outside of the radar acquisition extent are filled with the value `255`. Focused SLC image (HH) @@ -379,7 +373,7 @@ mean_real_value="Arithmetic average of the real part of the numeric data points" sample_stddev_real="Standard deviation of the real part of the numeric data points" long_name="Geocoded single-look complex image HV" - grid_mapping="projection" + grid_mapping='projection' DIMENSION_LIST="HDF5 internal attribute" _FillValue="(nan+nan*j)" units="1">Focused SLC image (HV) @@ -399,7 +393,7 @@ mean_real_value="Arithmetic average of the real part of the numeric data points" sample_stddev_real="Standard deviation of the real part of the numeric data points" long_name="Geocoded single-look complex image VH" - grid_mapping="projection" + grid_mapping='projection' DIMENSION_LIST="HDF5 internal attribute" _FillValue="(nan+nan*j)" units="1">Focused SLC image (VH) @@ -419,7 +413,7 @@ mean_real_value="Arithmetic average of the real part of the numeric data points" sample_stddev_real="Standard deviation of the real part of the numeric data points" long_name="Geocoded single-look complex image VV" - grid_mapping="projection" + grid_mapping='projection' DIMENSION_LIST="HDF5 internal attribute" _FillValue="(nan+nan*j)" units="1">Focused SLC image (VV) @@ -439,7 +433,7 @@ mean_real_value="Arithmetic average of the real part of the numeric data points" sample_stddev_real="Standard deviation of the real part of the numeric data points" long_name="Geocoded single-look complex image RH" - grid_mapping="projection" + grid_mapping='projection' DIMENSION_LIST="HDF5 internal attribute" _FillValue="(nan+nan*j)" units="1">Focused SLC image (RH) @@ -459,7 +453,7 @@ mean_real_value="Arithmetic average of the real part of the numeric data points" sample_stddev_real="Standard deviation of the real part of the numeric data points" long_name="Geocoded single-look complex image RV" - grid_mapping="projection" + grid_mapping='projection' DIMENSION_LIST="HDF5 internal attribute" _FillValue="(nan+nan*j)" units="1">Focused SLC image (RV) @@ -544,14 +538,14 @@ Mask indicating the subswath number representing valid GSLC samples. Each GSLC pixel is assumed valid if all the pixels in the interpolation window are fully focused in the input RSLC. A value of 0 indicates that at least one RSLC pixel in the interpolation window is partially focused or invalid. Pixels outside of the radar acquisition extent are filled with the value 255. + _FillValue="255">Mask indicating the subswath number representing valid GSLC samples. Each GSLC pixel is assumed valid if all the pixels in the interpolation window are fully focused in the input RSLC. A value of `0` indicates that at least one RSLC pixel in the interpolation window is partially focused or invalid. Pixels outside of the radar acquisition extent are filled with the value `255`. Focused SLC image (HH) @@ -632,7 +626,7 @@ mean_real_value="Arithmetic average of the real part of the numeric data points" sample_stddev_real="Standard deviation of the real part of the numeric data points" long_name="Geocoded single-look complex image HV" - grid_mapping="projection" + grid_mapping='projection' DIMENSION_LIST="HDF5 internal attribute" _FillValue="(nan+nan*j)" units="1">Focused SLC image (HV) @@ -652,7 +646,7 @@ mean_real_value="Arithmetic average of the real part of the numeric data points" sample_stddev_real="Standard deviation of the real part of the numeric data points" long_name="Geocoded single-look complex image VH" - grid_mapping="projection" + grid_mapping='projection' DIMENSION_LIST="HDF5 internal attribute" _FillValue="(nan+nan*j)" units="1">Focused SLC image (VH) @@ -672,7 +666,7 @@ mean_real_value="Arithmetic average of the real part of the numeric data points" sample_stddev_real="Standard deviation of the real part of the numeric data points" long_name="Geocoded single-look complex image VV" - grid_mapping="projection" + grid_mapping='projection' DIMENSION_LIST="HDF5 internal attribute" _FillValue="(nan+nan*j)" units="1">Focused SLC image (VV) @@ -692,7 +686,7 @@ mean_real_value="Arithmetic average of the real part of the numeric data points" sample_stddev_real="Standard deviation of the real part of the numeric data points" long_name="Geocoded single-look complex image RH" - grid_mapping="projection" + grid_mapping='projection' DIMENSION_LIST="HDF5 internal attribute" _FillValue="(nan+nan*j)" units="1">Focused SLC image (RH) @@ -712,7 +706,7 @@ mean_real_value="Arithmetic average of the real part of the numeric data points" sample_stddev_real="Standard deviation of the real part of the numeric data points" long_name="Geocoded single-look complex image RVH" - grid_mapping="projection" + grid_mapping='projection' DIMENSION_LIST="HDF5 internal attribute" _FillValue="(nan+nan*j)" units="1">Focused SLC image (RV) @@ -838,7 +832,7 @@ _FillValue="nan" grid_mapping="projection" long_name="LOS unit vector X" - units="1">East component of the line-of-sight (LOS) unit vector, defined from the target to the sensor, expressed in the east-north-up (ENU) coordinate system with its origin at the target location + units="1">East component of unit vector of LOS from target to sensor North component of the line-of-sight (LOS) unit vector, defined from the target to the sensor, expressed in the east-north-up (ENU) coordinate system with its origin at the target location + units="1">North component of unit vector of LOS from target to sensor East component of the along-track unit vector at the target location, expressed in the east-north-up (ENU) coordinate system and projected onto the horizontal plane (i.e., excluding the up component) + units="1">East component of unit vector along ground track North component of the along-track unit vector at the target location, expressed in the east-north-up (ENU) coordinate system and projected onto the horizontal plane (i.e., excluding the up component) + units="1">North component of unit vector along ground track X coordinates in specified projection X coordinates in specified projection + + - - Product map grid projection: EPSG code, with additional projection information as HDF5 Attributes - - - Y coordinates in specified projection - - - X coordinates in specified projection - Crosstalk in H-transmit channel expressed as ratio txV / txH Crosstalk in V-transmit channel expressed as ratio txH / txV Crosstalk in H-receive channel expressed as ratio rxV / rxH Crosstalk in V-receive channel expressed as ratio rxH / rxV - - @@ -2174,7 +2096,7 @@ lang="en" _FillValue="nan" grid_mapping="projection" - units="meters">Reference terrain height as a function of map coordinates + units="meters">Reference Terrain Height as a function of geographical location scalar values + + + number of datatakes in product + + + Number of observations in product + lang="en">number of observations in product @@ -3185,22 +3116,28 @@ Shape of real-valued calibration LUTs + lang="en">Shape of calibration LUTs - Shape of complex-valued calibration LUTs + lang="en">Shape of antenna pattern datasets + + Shape of crosstalk datasets + + Number of input L1 SLC granules + name="numberOfInputL0BFiles"/> From 353c981d6aac8ef78718053cdd3ba36f91f4aea2 Mon Sep 17 00:00:00 2001 From: "Gustavo H. X. Shiroma" Date: Mon, 9 Feb 2026 15:12:50 -0800 Subject: [PATCH 05/11] Update postings in STATIC layers granule ID to decimeters --- python/packages/nisar/static/granule_id.py | 36 +++++++++++++--------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/python/packages/nisar/static/granule_id.py b/python/packages/nisar/static/granule_id.py index 0f7198347..7d6cfc3ed 100644 --- a/python/packages/nisar/static/granule_id.py +++ b/python/packages/nisar/static/granule_id.py @@ -4,24 +4,29 @@ import isce3 -def int_to_3_digit_string(i: int) -> str: +def int_to_n_digit_string(i: int, n: int = 3) -> str: """ - Format an integer as a 3-digit zero-padded string. + Format an integer as an n-digit zero-padded string. Parameters ---------- i : int - The input integer. Must be >= 0 and <= 999. + The input integer. Must be >= 0 and <= 10^n - 1. + + n : int + The number of digits in the output string. Returns ------- str - A 3-character string representation of the input integer, left-padded with - zeros. + An n-character string representation of the input integer, left-padded + with zeros. """ - if (i < 0) or (i > 999): - raise ValueError(f"argument must be in the range [0, 999], got {i}") - return f"{i:03d}" + max_value = 10 ** n - 1 + if (i < 0) or (i > max_value): + raise ValueError(f"argument must be in the range [0, {max_value}]," + f" got {i}") + return f"{i:0{n}d}" def orbit_direction_to_char_code(direction: isce3.core.OrbitPassDirection) -> str: @@ -160,13 +165,14 @@ def form_granule_id( I=radar_band, L=product_level, PROD=product_type, - REL=int_to_3_digit_string(relative_orbit_number), - P=orbit_direction_to_char_code(orbit_pass_direction), - FRM=int_to_3_digit_string(frame_number), - Xposting=int_to_3_digit_string(int(round(x_posting))), - Yposting=int_to_3_digit_string(int(round(y_posting))), - ValidityStartDateTime=datetime_to_yyyymmddthhmmss(validity_start_datetime), + REL=int_to_n_digit_string(relative_orbit_number, n=3), + P=orbit_direction_to_char_code(orbit_pass_direction, n=3), + FRM=int_to_n_digit_string(frame_number, 3), + Xposting=int_to_n_digit_string(int(round(x_posting)), n=4), + Yposting=int_to_n_digit_string(int(round(y_posting)), n=4), + ValidityStartDateTime=datetime_to_yyyymmddthhmmss( + validity_start_datetime), CRID=composite_release_id, LOC=processing_center_to_char_code(processing_center), - CTR=int_to_3_digit_string(product_counter), + CTR=int_to_n_digit_string(product_counter, n=3), ) From 935378cbb34d548dec78089a92d080f04c27d3f2 Mon Sep 17 00:00:00 2001 From: "Gustavo H. X. Shiroma" Date: Tue, 10 Feb 2026 08:34:05 -0800 Subject: [PATCH 06/11] Update postings in STATIC layers granule ID to decimeters --- python/packages/nisar/static/granule_id.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/packages/nisar/static/granule_id.py b/python/packages/nisar/static/granule_id.py index 7d6cfc3ed..21ecc1235 100644 --- a/python/packages/nisar/static/granule_id.py +++ b/python/packages/nisar/static/granule_id.py @@ -166,7 +166,7 @@ def form_granule_id( L=product_level, PROD=product_type, REL=int_to_n_digit_string(relative_orbit_number, n=3), - P=orbit_direction_to_char_code(orbit_pass_direction, n=3), + P=orbit_direction_to_char_code(orbit_pass_direction), FRM=int_to_n_digit_string(frame_number, 3), Xposting=int_to_n_digit_string(int(round(x_posting)), n=4), Yposting=int_to_n_digit_string(int(round(y_posting)), n=4), From 2194cfd6fa97eb9f235c9fc7a149b6ad1345065d Mon Sep 17 00:00:00 2001 From: "Gustavo H. X. Shiroma" Date: Tue, 10 Feb 2026 08:58:29 -0800 Subject: [PATCH 07/11] Update postings in STATIC layers granule ID to decimeters; fix unit tests --- tests/python/packages/nisar/static/granule_id.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/python/packages/nisar/static/granule_id.py b/tests/python/packages/nisar/static/granule_id.py index f0455a372..5d6043f6b 100644 --- a/tests/python/packages/nisar/static/granule_id.py +++ b/tests/python/packages/nisar/static/granule_id.py @@ -20,7 +20,7 @@ def test_form_granule_id(): product_counter=1, ) assert ( - granule_id == "NISAR_L2_STATIC_001_A_002_010_005_19991231T235959_T01023_J_001" + granule_id == "NISAR_L2_STATIC_001_A_0020_010_0050_19991231T235959_T01023_J_001" ) granule_id = form_granule_id( @@ -39,5 +39,5 @@ def test_form_granule_id(): product_counter=999, ) assert ( - granule_id == "NISAR_S2_STATIC_123_D_124_080_080_20000101T000000_A11111_X_999" + granule_id == "NISAR_S2_STATIC_123_D_124_0800_0800_20000101T000000_A11111_X_999" ) From 69d47d12cf9d3368ac092cf245a4f187ca615073 Mon Sep 17 00:00:00 2001 From: "Gustavo H. X. Shiroma" Date: Tue, 10 Feb 2026 09:50:29 -0800 Subject: [PATCH 08/11] Update postings in STATIC layers granule ID to decimeters; fix unit tests --- tests/python/packages/nisar/static/granule_id.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/python/packages/nisar/static/granule_id.py b/tests/python/packages/nisar/static/granule_id.py index 5d6043f6b..dd5baa323 100644 --- a/tests/python/packages/nisar/static/granule_id.py +++ b/tests/python/packages/nisar/static/granule_id.py @@ -20,7 +20,7 @@ def test_form_granule_id(): product_counter=1, ) assert ( - granule_id == "NISAR_L2_STATIC_001_A_0020_010_0050_19991231T235959_T01023_J_001" + granule_id == "NISAR_L2_STATIC_001_A_0020_0100_0050_19991231T235959_T01023_J_001" ) granule_id = form_granule_id( From 4d328cdf6fc109c0aada53d7e18a6ca9991c83eb Mon Sep 17 00:00:00 2001 From: "Gustavo H. X. Shiroma" Date: Tue, 10 Feb 2026 10:23:29 -0800 Subject: [PATCH 09/11] Update postings in STATIC layers granule ID to decimeters; fix unit tests --- python/packages/nisar/static/granule_id.py | 4 ++-- tests/python/packages/nisar/static/granule_id.py | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/python/packages/nisar/static/granule_id.py b/python/packages/nisar/static/granule_id.py index 21ecc1235..aeca1766b 100644 --- a/python/packages/nisar/static/granule_id.py +++ b/python/packages/nisar/static/granule_id.py @@ -168,8 +168,8 @@ def form_granule_id( REL=int_to_n_digit_string(relative_orbit_number, n=3), P=orbit_direction_to_char_code(orbit_pass_direction), FRM=int_to_n_digit_string(frame_number, 3), - Xposting=int_to_n_digit_string(int(round(x_posting)), n=4), - Yposting=int_to_n_digit_string(int(round(y_posting)), n=4), + Xposting=int_to_n_digit_string(int(10*round(x_posting)), n=4), + Yposting=int_to_n_digit_string(int(10*round(y_posting)), n=4), ValidityStartDateTime=datetime_to_yyyymmddthhmmss( validity_start_datetime), CRID=composite_release_id, diff --git a/tests/python/packages/nisar/static/granule_id.py b/tests/python/packages/nisar/static/granule_id.py index dd5baa323..353e2795e 100644 --- a/tests/python/packages/nisar/static/granule_id.py +++ b/tests/python/packages/nisar/static/granule_id.py @@ -12,15 +12,15 @@ def test_form_granule_id(): relative_orbit_number=1, orbit_pass_direction="ascending", frame_number=2, - x_posting=10.0, - y_posting=5.0, + x_posting=10*10.0, + y_posting=10*5.0, validity_start_datetime=datetime.fromisoformat("1999-12-31T23:59:59"), composite_release_id="T01023", processing_center="JPL", product_counter=1, ) assert ( - granule_id == "NISAR_L2_STATIC_001_A_0020_0100_0050_19991231T235959_T01023_J_001" + granule_id == "NISAR_L2_STATIC_001_A_002_0100_0050_19991231T235959_T01023_J_001" ) granule_id = form_granule_id( @@ -31,8 +31,8 @@ def test_form_granule_id(): relative_orbit_number=123, orbit_pass_direction="descending", frame_number=124, - x_posting=80.0, - y_posting=80.0, + x_posting=10*80.0, + y_posting=10*80.0, validity_start_datetime=datetime.fromisoformat("2000-01-01T00:00:00"), composite_release_id="A11111", processing_center="somewhere else", From 1b36ef59220a4039396cdd4cfc9a7eaac5d20c9e Mon Sep 17 00:00:00 2001 From: "Gustavo H. X. Shiroma" Date: Tue, 10 Feb 2026 11:09:31 -0800 Subject: [PATCH 10/11] Update postings in STATIC layers granule ID to decimeters only for products in projected cordinates --- python/packages/nisar/static/granule_id.py | 45 ++++++++++++++++--- python/packages/nisar/workflows/static.py | 1 + .../packages/nisar/static/granule_id.py | 10 +++-- 3 files changed, 45 insertions(+), 11 deletions(-) diff --git a/python/packages/nisar/static/granule_id.py b/python/packages/nisar/static/granule_id.py index aeca1766b..e13e7277e 100644 --- a/python/packages/nisar/static/granule_id.py +++ b/python/packages/nisar/static/granule_id.py @@ -1,5 +1,6 @@ import string from datetime import datetime +from osgeo import osr import isce3 @@ -104,6 +105,7 @@ def form_granule_id( frame_number: int, x_posting: float, y_posting: float, + epsg_code: int, validity_start_datetime: datetime, composite_release_id: str, processing_center: str, @@ -134,6 +136,9 @@ def form_granule_id( x_posting, y_posting : float X and Y spacing of the raster coordinate grid, in the units of the grid's native coordinate system. Must be > 0 and <= 999. + epsg_code : int + EPSG code of the spatial reference system in which the raster coordinate grid is + defined. validity_start_datetime : datetime.datetime UTC date and time of the start of the granule's validity date range. Must not contain a fractional seconds component. @@ -149,17 +154,39 @@ def form_granule_id( Returns ------- str - The granule ID. + The granule ID. If the spatial reference system specified by + epsg_code is projected, the X and Y postings are multiplied + by 10 and formatted as four-digit, zero-padded integers. + If the spatial reference system is geographic, the X and Y + postings are formatted directly (without multiplication) as + four-digit, zero-padded integers, with the decimal point + removed. References ---------- .. [1] S. Niemoeller, "NASA SDS Product Specification Level-2 Static Layers", JPL D-107727, 2025. """ - template = string.Template( - "${MISSION}_${I}${L}_${PROD}_${REL}_${P}_${FRM}_${Xposting}_${Yposting}" - "_${ValidityStartDateTime}_${CRID}_${LOC}_${CTR}" - ) + srs = osr.SpatialReference() + srs.ImportFromEPSG(epsg_code) + + # The granule ID for projected coordinate systems encodes the X and Y + # postings in decimeters as 4-digit zero-padded integers, + # while the granule ID for geographic coordinate systems encodes the + # X and Y postings in degrees as 4-digit zero-padded integers with the + # decimal point removed. + if not srs.IsGeographic(): + template = string.Template( + "${MISSION}_${I}${L}_${PROD}_${REL}_${P}_${FRM}" + "_${XpostingDecimeters}_${YpostingDecimeters}" + "_${ValidityStartDateTime}_${CRID}_${LOC}_${CTR}" + ) + else: + template = string.Template( + "${MISSION}_${I}${L}_${PROD}_${REL}_${P}_${FRM}" + "_${Xposting}_${Yposting}" + "_${ValidityStartDateTime}_${CRID}_${LOC}_${CTR}" + ) return template.substitute( MISSION=mission_id, I=radar_band, @@ -168,8 +195,12 @@ def form_granule_id( REL=int_to_n_digit_string(relative_orbit_number, n=3), P=orbit_direction_to_char_code(orbit_pass_direction), FRM=int_to_n_digit_string(frame_number, 3), - Xposting=int_to_n_digit_string(int(10*round(x_posting)), n=4), - Yposting=int_to_n_digit_string(int(10*round(y_posting)), n=4), + XpostingDecimeters=int_to_n_digit_string(int(10*round(x_posting)), + n=4), + YpostingDecimeters=int_to_n_digit_string(int(10*round(y_posting)), + n=4), + Xposting=int_to_n_digit_string(int(round(x_posting)), n=4), + Yposting=int_to_n_digit_string(int(round(y_posting)), n=4), ValidityStartDateTime=datetime_to_yyyymmddthhmmss( validity_start_datetime), CRID=composite_release_id, diff --git a/python/packages/nisar/workflows/static.py b/python/packages/nisar/workflows/static.py index e7165519b..7ab2f9841 100644 --- a/python/packages/nisar/workflows/static.py +++ b/python/packages/nisar/workflows/static.py @@ -236,6 +236,7 @@ def run_static_layers_workflow(config_file: os.PathLike | str) -> None: orbit_pass_direction=orbit_pass_direction, x_posting=abs(geo_grid.spacing_x), y_posting=abs(geo_grid.spacing_y), + epsg_code=geometry_params["output_epsg"], validity_start_datetime=validity_start_datetime, composite_release_id=primary_executable_params["composite_release_id"], processing_center=primary_executable_params["processing_center"], diff --git a/tests/python/packages/nisar/static/granule_id.py b/tests/python/packages/nisar/static/granule_id.py index 353e2795e..1397923f8 100644 --- a/tests/python/packages/nisar/static/granule_id.py +++ b/tests/python/packages/nisar/static/granule_id.py @@ -12,8 +12,9 @@ def test_form_granule_id(): relative_orbit_number=1, orbit_pass_direction="ascending", frame_number=2, - x_posting=10*10.0, - y_posting=10*5.0, + x_posting=10.0, + y_posting=5.0, + epsg_code=32611, validity_start_datetime=datetime.fromisoformat("1999-12-31T23:59:59"), composite_release_id="T01023", processing_center="JPL", @@ -31,8 +32,9 @@ def test_form_granule_id(): relative_orbit_number=123, orbit_pass_direction="descending", frame_number=124, - x_posting=10*80.0, - y_posting=10*80.0, + x_posting=80.0, + y_posting=80.0, + epsg_code=32611, validity_start_datetime=datetime.fromisoformat("2000-01-01T00:00:00"), composite_release_id="A11111", processing_center="somewhere else", From 9e130a49eca101a494a2e4dfa19a698b2fb09b52 Mon Sep 17 00:00:00 2001 From: "Gustavo H. X. Shiroma" Date: Tue, 10 Feb 2026 15:14:03 -0800 Subject: [PATCH 11/11] Update postings in STATIC layers granule ID to decimeters only for products in projected cordinates --- python/packages/nisar/workflows/static.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/packages/nisar/workflows/static.py b/python/packages/nisar/workflows/static.py index 7ab2f9841..84afaf022 100644 --- a/python/packages/nisar/workflows/static.py +++ b/python/packages/nisar/workflows/static.py @@ -236,7 +236,7 @@ def run_static_layers_workflow(config_file: os.PathLike | str) -> None: orbit_pass_direction=orbit_pass_direction, x_posting=abs(geo_grid.spacing_x), y_posting=abs(geo_grid.spacing_y), - epsg_code=geometry_params["output_epsg"], + epsg_code=geo_grid_params["epsg"], validity_start_datetime=validity_start_datetime, composite_release_id=primary_executable_params["composite_release_id"], processing_center=primary_executable_params["processing_center"],