Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
da95af1
sm r3.4
Sep 19, 2023
3a8e2ec
merge R4.0.2beta-1
Mar 11, 2024
b6cfbbb
change the SM commit id for R4.0.2
May 23, 2024
f764f2f
merge upstream develop branch
Jun 4, 2024
a920ae6
Merge remote-tracking branch 'upstream/develop' into develop
Jun 5, 2024
1d28fae
Merge remote-tracking branch 'upstream/develop' into develop
Jun 13, 2024
84f3874
Merge remote-tracking branch 'upstream/develop' into develop
Aug 12, 2024
2bb897a
Merge remote-tracking branch 'upstream/develop' into develop
Sep 14, 2024
da76f88
Merge branch 'develop' of https://github-fn.jpl.nasa.gov/isce-3/isce …
Oct 2, 2024
6313217
Merge branch 'develop' of https://github-fn.jpl.nasa.gov/isce-3/isce …
Oct 9, 2024
ce2b301
Merge branch 'develop' of https://github-fn.jpl.nasa.gov/isce-3/isce …
Oct 15, 2024
8394511
Merge branch 'develop' of https://github-fn.jpl.nasa.gov/isce-3/isce …
Oct 24, 2024
72645bd
Merge branch 'develop' of https://github-fn.jpl.nasa.gov/isce-3/isce …
Oct 29, 2024
6f93fd3
Merge branch 'develop' of https://github-fn.jpl.nasa.gov/isce-3/isce …
Dec 9, 2024
eebd988
Merge branch 'develop' of https://github-fn.jpl.nasa.gov/isce-3/isce …
Jan 21, 2025
9b108ce
Merge branch 'develop' of https://github-fn.jpl.nasa.gov/isce-3/isce …
Jan 29, 2025
b1c78f7
Merge branch 'develop' of https://github-fn.jpl.nasa.gov/isce-3/isce …
Mar 18, 2025
e46f53f
Merge branch 'develop' of https://github-fn.jpl.nasa.gov/isce-3/isce …
Apr 10, 2025
54d6ab4
Merge branch 'develop' of https://github-fn.jpl.nasa.gov/isce-3/isce …
May 12, 2025
73b6b9b
Merge branch 'develop' of https://github-fn.jpl.nasa.gov/isce-3/isce …
Jun 10, 2025
2eb1387
Merge branch 'develop' of https://github.com/isce-framework/isce3 int…
Sep 30, 2025
42f2514
Merge branch 'develop' of https://github.com/isce-framework/isce3 int…
Nov 14, 2025
39c9883
Merge branch 'develop' of https://github.com/isce-framework/isce3 int…
Dec 1, 2025
f6cfd55
Merge branch 'develop' of https://github.com/isce-framework/isce3 int…
Jan 14, 2026
6176caa
Merge branch 'develop' of https://github.com/isce-framework/isce3 int…
Jan 16, 2026
1f111b3
Merge branch 'develop' of https://github.com/isce-framework/isce3 int…
Mar 23, 2026
0cf5e3b
Merge branch 'develop' of https://github.com/isce-framework/isce3 int…
Apr 2, 2026
978b7d3
update the mask dataset in the HDF5 file
Apr 2, 2026
d279aa1
add the hasinputdataexception to identification group
Apr 2, 2026
5fa21e9
update the water mask
Apr 2, 2026
995cc8f
update the subswath mask interpolation
Apr 2, 2026
737c83c
update the geocode_insar invalid values
Apr 2, 2026
146174d
check if the inputdataexcpetion exits or not
Apr 6, 2026
9200ce9
fix bugs
Apr 6, 2026
83508c3
use 255 as the fill value
Apr 6, 2026
a52aafc
update the fillvalue
Apr 6, 2026
aa9c733
update the lines and samples
Apr 6, 2026
c6ddd6e
update the minors
Apr 8, 2026
305b75d
fix minors
Apr 14, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 15 additions & 9 deletions python/packages/nisar/products/insar/GOFF_writer.py
Original file line number Diff line number Diff line change
Expand Up @@ -118,15 +118,21 @@ def add_grids_to_hdf5(self):
offset_group,
"mask",
goff_shape,
np.uint8,
("Combination of water mask and a mask of subswaths of valid samples"
" in the reference RSLC and geometrically-coregistered secondary RSLC."
" Each pixel value is a three-digit number:"
" the most significant digit represents the water flag of that pixel in the reference RSLC,"
" where 1 is water and 0 is non-water;"
" the second digit represents the subswath number of that pixel in the reference RSLC;"
" the least significant digit represents the subswath number of that pixel in the secondary RSLC."
" A value of 0 in either subswath digit indicates an invalid sample in the corresponding RSLC"),
np.uint32,
("Combination of a water mask, a mask of subswaths of valid samples, and data anomalies"
" in the reference RSLC and the geometrically coregistered secondary RSLC."
" Each pixel value is encoded as a 32-bit unsigned integer."
" Bits 0–7 represent subswath encoding, where the most significant digit represents"
" the water flag of that pixel in the reference RSLC, where 1 is water"
" and 0 is non-water; the second most significant digit corresponds to"
" the subswath number of the reference RSLC, and the least significant digit"
" corresponds to the subswath number of the secondary RSLC;"
" a value of 0 in either digit indicates an invalid sample in the corresponding RSLC."
" Bits 8–15 represent bitwise anomaly flags for the secondary RSLC, and"
" bits 16–23 represent bitwise anomaly flags for the reference RSLC,"
" with each bit corresponding to a specific anomaly condition."
" A value of 0 in the anomaly bits indicates that no anomaly is detected in the corresponding RSLC."
" Bits 24–31 are reserved for future use"),
grid_mapping=grids_val,
xds=xds,
yds=yds,
Expand Down
26 changes: 16 additions & 10 deletions python/packages/nisar/products/insar/GUNW_writer.py
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ def add_parameters_to_procinfo_group(self):
else:
unwrap_igram_range_looks = wrap_igram_range_looks
unwrap_igram_azimuth_looks = wrap_igram_azimuth_looks

# the unwrappedInterfergram group under the processingInformation/parameters
# group is copied from the RUNW product, but the name in RUNW product is
# 'interferogram', while in GUNW its name is 'unwrappedInterferogram'. Here
Expand Down Expand Up @@ -291,15 +291,21 @@ def add_grids_to_hdf5(self):
"mask",
(ds_geogrid.length,
ds_geogrid.width),
np.uint8,
("Combination of water mask and a mask of subswaths of valid samples"
" in the reference RSLC and geometrically-coregistered secondary RSLC."
" Each pixel value is a three-digit number:"
" the most significant digit represents the water flag of that pixel in the reference RSLC,"
" where 1 is water and 0 is non-water;"
" the second digit represents the subswath number of that pixel in the reference RSLC;"
" the least significant digit represents the subswath number of that pixel in the secondary RSLC."
" A value of 0 in either subswath digit indicates an invalid sample in the corresponding RSLC"),
np.uint32,
("Combination of a water mask, a mask of subswaths of valid samples, and data anomalies"
" in the reference RSLC and the geometrically coregistered secondary RSLC."
" Each pixel value is encoded as a 32-bit unsigned integer."
" Bits 0–7 represent subswath encoding, where the most significant digit represents"
" the water flag of that pixel in the reference RSLC, where 1 is water"
" and 0 is non-water; the second most significant digit corresponds to"
" the subswath number of the reference RSLC, and the least significant digit"
" corresponds to the subswath number of the secondary RSLC;"
" a value of 0 in either digit indicates an invalid sample in the corresponding RSLC."
" Bits 8–15 represent bitwise anomaly flags for the secondary RSLC, and"
" bits 16–23 represent bitwise anomaly flags for the reference RSLC,"
" with each bit corresponding to a specific anomaly condition."
" A value of 0 in the anomaly bits indicates that no anomaly is detected in the corresponding RSLC."
" Bits 24–31 are reserved for future use"),
grid_mapping=grids_val,
xds=xds,
yds=yds,
Expand Down
84 changes: 47 additions & 37 deletions python/packages/nisar/products/insar/InSAR_L1_writer.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
from .product_paths import L1GroupsPaths
from .units import Units
from .utils import (extract_datetime_from_string, generate_dem_rdr,
generate_insar_subswath_mask,
generate_insar_mask,
get_geolocation_grid_cube_obj, save_to_hdf5_ds)


Expand Down Expand Up @@ -493,18 +493,21 @@ def add_pixel_offsets_to_swaths_group(self):
self._create_2d_dataset(offset_group,
'mask',
shape=(off_length, off_width),
dtype=np.uint8,
description=("Mask indicating the subswaths of valid samples in the reference RSLC"
" and geometrically-coregistered secondary RSLC."
" Each pixel value is a two-digit number:"
" the least significant digit represents the"
" subswath number of that pixel in the secondary RSLC,"
" and the most significant digit represents"
" the subswath number of that pixel in the reference RSLC."
" A value of 0 in either digit indicates an invalid sample"
" in the corresponding RSLC"),
dtype=np.uint32,
description=("Mask indicating the subswaths of valid samples and data anomalies"
" in the reference RSLC and the geometrically coregistered secondary RSLC."
" Each pixel value is encoded as a 32-bit unsigned integer."
" Bits 0–7 represent subswath encoding,"
" where the most significant digit corresponds to the subswath number of the reference RSLC"
" and the least significant digit corresponds to the subswath number of the secondary RSLC;"
" a value of 0 in either digit indicates an invalid sample in the corresponding RSLC."
" Bits 8–15 represent bitwise anomaly flags for the secondary RSLC,"
" and bits 16–23 represent bitwise anomaly flags for the reference RSLC,"
" with each bit corresponding to a specific anomaly condition."
" A value of 0 in the anomaly bits indicates that no anomaly is detected in the corresponding RSLC."
" Bits 24–31 are reserved for future use"),
fill_value=255)
offset_group['mask'].attrs['long_name'] = to_bytes("Valid samples subswath mask")
offset_group['mask'].attrs['long_name'] = to_bytes("Valid samples subswath and data anomaly mask")
offset_group['mask'].attrs['valid_min'] = 0

range_offset_path = \
Expand All @@ -529,13 +532,15 @@ def add_pixel_offsets_to_swaths_group(self):
for az in offset_zero_doppler_time])

offset_group['mask'][...] = \
generate_insar_subswath_mask(self.ref_rslc,
self.sec_rslc,
range_offset_path,
azimuth_offset_path,
freq,
az_idx,
rg_idx)
generate_insar_mask(self.ref_rslc,
self.sec_rslc,
self.ref_h5py_file_obj,
self.sec_h5py_file_obj,
range_offset_path,
azimuth_offset_path,
freq,
az_idx,
rg_idx)

# add the datasets to pixel offsets group
self._add_datasets_to_pixel_offset_group()
Expand Down Expand Up @@ -706,19 +711,22 @@ def add_interferogram_to_swaths_group(self):
self._create_2d_dataset(igram_group,
'mask',
shape=igram_shape,
dtype=np.uint8,
description=("Mask indicating the subswaths of valid samples in the reference RSLC"
" and geometrically-coregistered secondary RSLC."
" Each pixel value is a two-digit number:"
" the least significant digit represents the"
" subswath number of that pixel in the secondary RSLC,"
" and the most significant digit represents"
" the subswath number of that pixel in the reference RSLC."
" A value of 0 in either digit indicates an invalid sample"
" in the corresponding RSLC"),
dtype=np.uint32,
description=("Mask indicating the subswaths of valid samples and data anomalies"
" in the reference RSLC and the geometrically coregistered secondary RSLC."
" Each pixel value is encoded as a 32-bit unsigned integer."
" Bits 0–7 represent subswath encoding,"
" where the most significant digit corresponds to the subswath number of the reference RSLC"
" and the least significant digit corresponds to the subswath number of the secondary RSLC;"
" a value of 0 in either digit indicates an invalid sample in the corresponding RSLC."
" Bits 8–15 represent bitwise anomaly flags for the secondary RSLC,"
" and bits 16–23 represent bitwise anomaly flags for the reference RSLC,"
" with each bit corresponding to a specific anomaly condition."
" A value of 0 in the anomaly bits indicates that no anomaly is detected in the corresponding RSLC."
" Bits 24–31 are reserved for future use"),
fill_value=255)
igram_group['mask'].attrs['valid_min'] = 0
igram_group['mask'].attrs['long_name'] = to_bytes("Valid samples subswath mask")
igram_group['mask'].attrs['long_name'] = to_bytes("Valid samples subswath and data anomaly mask")

range_offset_path = \
os.path.join(self.topo_path,
Expand All @@ -742,13 +750,15 @@ def add_interferogram_to_swaths_group(self):
for az in igram_zero_doppler_time])

igram_group['mask'][...] = \
generate_insar_subswath_mask(self.ref_rslc,
self.sec_rslc,
range_offset_path,
azimuth_offset_path,
freq,
az_idx,
rg_idx)
generate_insar_mask(self.ref_rslc,
self.sec_rslc,
self.ref_h5py_file_obj,
self.sec_h5py_file_obj,
range_offset_path,
azimuth_offset_path,
freq,
az_idx,
rg_idx)

# add the interferogram and pixelOffsets groups to the polarization group
for pol in pol_list:
Expand Down
25 changes: 20 additions & 5 deletions python/packages/nisar/products/insar/InSAR_base_writer.py
Original file line number Diff line number Diff line change
Expand Up @@ -1078,7 +1078,8 @@ def add_identification_to_hdf5(self):
"isJointObservation",
"plannedObservationId",
"plannedDatatakeId",
"listOfObservationModes"]
"listOfObservationModes",
"hasInputDataException"]
cap = lambda x: f"{x[0].upper()}{x[1:]}"

for ds_name in datasets_to_copy:
Expand All @@ -1099,21 +1100,21 @@ def add_identification_to_hdf5(self):
# rename the End time to stop
time_in_description = 'stop' if start_or_stop == 'End' else 'start'
ds.attrs['description'] = \
f"Azimuth {time_in_description} time (in UTC) of {rslc_name} RSLC product in the format YYYY-mm-ddTHH:MM:SS.sssssssss"
to_bytes(f"Azimuth {time_in_description} time (in UTC) of {rslc_name} RSLC product in the format YYYY-mm-ddTHH:MM:SS.sssssssss")

for rslc_name in ['reference', 'secondary']:
# Update descriptions for absolute orbit number, planned datatakes and observation
ds = dst_id_group[f"{rslc_name}AbsoluteOrbitNumber"]
ds.attrs['description'] = \
f'Absolute orbit number for the {rslc_name} RSLC'
to_bytes(f'Absolute orbit number for the {rslc_name} RSLC')

ds = dst_id_group[f"{rslc_name}PlannedDatatakeId"]
ds.attrs['description'] = \
f'List of planned datatakes included in the {rslc_name} RSLC'
to_bytes(f'List of planned datatakes included in the {rslc_name} RSLC')

ds = dst_id_group[f"{rslc_name}PlannedObservationId"]
ds.attrs['description'] = \
f'List of planned observations included in the {rslc_name} RSLC'
to_bytes(f'List of planned observations included in the {rslc_name} RSLC')

# Update the description for the isJointObservation
# If there is no isJointObservation in the identification group,
Expand Down Expand Up @@ -1144,6 +1145,20 @@ def add_identification_to_hdf5(self):
to_bytes(['(NOT SPECIFIED)']),
description))

# Update the description for the hasInputDataException
ds_name = f"{rslc_name}HasInputDataException"
description = f'Indication of input {rslc_name} RSLC data exceptions or anomalies.'+\
' Zero when no known exception affects this product,'+\
' otherwise the bitwise OR of exception codes (2: NISAR LSAR qFSP-H1 sample slip)'
if ds_name in dst_id_group:
ds = dst_id_group[ds_name]
ds.attrs['description'] = to_bytes(description)
else:
add_dataset_and_attrs(dst_id_group, DatasetParams(
ds_name,
to_bytes(['(NOT SPECIFIED)']),
description))

# Granule ID follows the NISAR filename convention. The partial granule ID
# has placeholders (curly brackets) which will be filled by the InSAR SAS
# (Partial Granule ID Example:
Expand Down
Loading
Loading