Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
94 changes: 69 additions & 25 deletions cxx/isce3/geocode/GeocodeCov.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,8 @@ void Geocode<T>::geocode(const isce3::product::RadarGridParameters& radar_grid,
isce3::io::Raster& input_raster, isce3::io::Raster& output_raster,
isce3::io::Raster& dem_raster, geocodeOutputMode output_mode,
bool flag_az_baseband_doppler, bool flatten, double geogrid_upsampling,
bool flag_upsample_radar_grid, bool flag_apply_rtc,
float shadow_no_data_value, bool flag_upsample_radar_grid,
bool flag_apply_rtc,
isce3::geometry::rtcInputTerrainRadiometry input_terrain_radiometry,
isce3::geometry::rtcOutputTerrainRadiometry output_terrain_radiometry,
int exponent, float rtc_min_value_db, double rtc_geogrid_upsampling,
Expand Down Expand Up @@ -158,7 +159,8 @@ void Geocode<T>::geocode(const isce3::product::RadarGridParameters& radar_grid,
bool flag_run_geocode_interp = output_mode == geocodeOutputMode::INTERP;
if (flag_run_geocode_interp && !flag_complex_to_real)
geocodeInterp<T>(radar_grid, input_raster, output_raster, dem_raster,
flag_apply_rtc, flag_az_baseband_doppler, flatten,
shadow_no_data_value, flag_apply_rtc,
flag_az_baseband_doppler, flatten,
input_terrain_radiometry, output_terrain_radiometry,
rtc_min_value_db, rtc_geogrid_upsampling, rtc_algorithm,
rtc_area_beta_mode,
Expand All @@ -174,7 +176,8 @@ void Geocode<T>::geocode(const isce3::product::RadarGridParameters& radar_grid,
(std::is_same<T, double>::value ||
std::is_same<T, std::complex<double>>::value))
geocodeInterp<double>(radar_grid, input_raster, output_raster,
dem_raster, flag_apply_rtc, flag_az_baseband_doppler, flatten,
dem_raster, shadow_no_data_value,
flag_apply_rtc, flag_az_baseband_doppler, flatten,
input_terrain_radiometry, output_terrain_radiometry,
rtc_min_value_db, rtc_geogrid_upsampling, rtc_algorithm,
rtc_area_beta_mode,
Expand All @@ -188,7 +191,8 @@ void Geocode<T>::geocode(const isce3::product::RadarGridParameters& radar_grid,
dem_interp_method);
else if (flag_run_geocode_interp)
geocodeInterp<float>(radar_grid, input_raster, output_raster,
dem_raster, flag_apply_rtc, flag_az_baseband_doppler, flatten,
dem_raster, shadow_no_data_value,
flag_apply_rtc, flag_az_baseband_doppler, flatten,
input_terrain_radiometry, output_terrain_radiometry,
rtc_min_value_db, rtc_geogrid_upsampling, rtc_algorithm,
rtc_area_beta_mode,
Expand All @@ -202,7 +206,8 @@ void Geocode<T>::geocode(const isce3::product::RadarGridParameters& radar_grid,
dem_interp_method);
else if (!flag_complex_to_real)
geocodeAreaProj<T>(radar_grid, input_raster, output_raster, dem_raster,
geogrid_upsampling, flag_upsample_radar_grid, flag_apply_rtc,
geogrid_upsampling, shadow_no_data_value,
flag_upsample_radar_grid, flag_apply_rtc,
input_terrain_radiometry, output_terrain_radiometry,
rtc_min_value_db, rtc_geogrid_upsampling, rtc_algorithm,
rtc_area_beta_mode,
Expand All @@ -218,7 +223,8 @@ void Geocode<T>::geocode(const isce3::product::RadarGridParameters& radar_grid,
else if (std::is_same<T, double>::value ||
std::is_same<T, std::complex<double>>::value)
geocodeAreaProj<double>(radar_grid, input_raster, output_raster,
dem_raster, geogrid_upsampling, flag_upsample_radar_grid,
dem_raster, geogrid_upsampling, shadow_no_data_value,
flag_upsample_radar_grid,
flag_apply_rtc, input_terrain_radiometry,
output_terrain_radiometry, rtc_min_value_db,
rtc_geogrid_upsampling, rtc_algorithm, rtc_area_beta_mode,
Expand All @@ -233,7 +239,8 @@ void Geocode<T>::geocode(const isce3::product::RadarGridParameters& radar_grid,
dem_interp_method);
else
geocodeAreaProj<float>(radar_grid, input_raster, output_raster,
dem_raster, geogrid_upsampling, flag_upsample_radar_grid,
dem_raster, geogrid_upsampling, shadow_no_data_value,
flag_upsample_radar_grid,
flag_apply_rtc, input_terrain_radiometry,
output_terrain_radiometry, rtc_min_value_db,
rtc_geogrid_upsampling, rtc_algorithm, rtc_area_beta_mode,
Expand All @@ -253,8 +260,8 @@ template<class T_out>
void Geocode<T>::geocodeInterp(
const isce3::product::RadarGridParameters& radar_grid,
isce3::io::Raster& inputRaster, isce3::io::Raster& outputRaster,
isce3::io::Raster& demRaster, bool flag_apply_rtc,
bool flag_az_baseband_doppler, bool flatten,
isce3::io::Raster& demRaster, float shadow_no_data_value,
bool flag_apply_rtc, bool flag_az_baseband_doppler, bool flatten,
isce3::geometry::rtcInputTerrainRadiometry input_terrain_radiometry,
isce3::geometry::rtcOutputTerrainRadiometry output_terrain_radiometry,
float rtc_min_value_db, double rtc_geogrid_upsampling,
Expand Down Expand Up @@ -860,9 +867,10 @@ void Geocode<T>::geocodeInterp(
rdrBlockWidth, rdrBlockLength, azimuthFirstLine,
rangeFirstPixel, interp.get(), radar_grid,
flag_az_baseband_doppler, flatten, phase_screen_raster,
phase_screen_array, rtc_min_value,
phase_screen_array, shadow_no_data_value, rtc_min_value,
abs_cal_factor_effective, clip_min, clip_max,
flag_apply_rtc, rtc_area_array, rtc_area_sigma0_array, out_geo_rtc_band,
flag_apply_rtc, rtc_area_array, rtc_area_sigma0_array,
out_geo_rtc_band,
out_geo_rtc_array, out_geo_rtc_gamma0_to_sigma0_band,
out_geo_rtc_gamma0_to_sigma0_array,
input_layover_shadow_mask_raster,
Expand Down Expand Up @@ -947,7 +955,7 @@ inline void Geocode<T>::_interpolate(
const bool flag_az_baseband_doppler, const bool flatten,
isce3::io::Raster* phase_screen_raster,
isce3::core::Matrix<float>& phase_screen_array,
float rtc_min_value,
float shadow_no_data_value, float rtc_min_value,
double abs_cal_factor_effective,
float clip_min, float clip_max, bool flag_apply_rtc,
const isce3::core::Matrix<float>& rtc_area,
Expand Down Expand Up @@ -1036,6 +1044,21 @@ inline void Geocode<T>::_interpolate(
}

if (flag_has_invalid_sample) {

// set NaN values according to T_out, i.e. real (NaN)
// or complex (NaN, NaN)
T_out v = static_cast<T_out>(shadow_no_data_value);
geoDataBlock(i, j) = v;

if (flag_apply_rtc && out_geo_rtc != nullptr) {
out_geo_rtc_array(i, j) =
std::numeric_limits<float>::quiet_NaN();
}
if (flag_apply_rtc &&
out_geo_rtc_gamma0_to_sigma0 != nullptr) {
out_geo_rtc_gamma0_to_sigma0_array(i, j) =
std::numeric_limits<float>::quiet_NaN();
}
continue;
}
}
Expand Down Expand Up @@ -1866,7 +1889,8 @@ void Geocode<T>::geocodeAreaProj(
const isce3::product::RadarGridParameters& radar_grid,
isce3::io::Raster& input_raster, isce3::io::Raster& output_raster,
isce3::io::Raster& dem_raster, double geogrid_upsampling,
bool flag_upsample_radar_grid, bool flag_apply_rtc,
float shadow_no_data_value, bool flag_upsample_radar_grid,
bool flag_apply_rtc,
isce3::geometry::rtcInputTerrainRadiometry input_terrain_radiometry,
isce3::geometry::rtcOutputTerrainRadiometry output_terrain_radiometry,
float rtc_min_value_db, double rtc_geogrid_upsampling,
Expand Down Expand Up @@ -1910,10 +1934,10 @@ void Geocode<T>::geocodeAreaProj(
const float upsampled_radar_grid_nlooks = radar_grid_nlooks / 2;
geocodeAreaProj<T_out>(upsampled_radar_grid, input_raster,
output_raster, dem_raster, geogrid_upsampling,
flag_upsample_radar_grid, flag_apply_rtc,
input_terrain_radiometry, output_terrain_radiometry,
rtc_min_value_db, rtc_geogrid_upsampling, rtc_algorithm,
rtc_area_beta_mode,
shadow_no_data_value, flag_upsample_radar_grid,
flag_apply_rtc, input_terrain_radiometry,
output_terrain_radiometry, rtc_min_value_db,
rtc_geogrid_upsampling, rtc_algorithm, rtc_area_beta_mode,
abs_cal_factor, clip_min, clip_max, min_nlooks,
upsampled_radar_grid_nlooks, out_off_diag_terms, out_geo_rdr,
out_geo_dem, out_geo_nlooks, out_geo_rtc,
Expand Down Expand Up @@ -2271,7 +2295,8 @@ void Geocode<T>::geocodeAreaProj(
is_radar_grid_single_block, rdrData, block_size_y,
block_size_with_upsampling_y, block_y, block_size_x,
block_size_with_upsampling_x, block_x, numdone,
progress_block, geogrid_upsampling, nbands,
progress_block, geogrid_upsampling,
shadow_no_data_value, nbands,
nbands_off_diag_terms, dem_interp_method, dem_raster,
out_off_diag_terms, out_geo_rdr, out_geo_dem,
out_geo_nlooks, out_geo_rtc,
Expand All @@ -2298,7 +2323,8 @@ void Geocode<T>::geocodeAreaProj(
is_radar_grid_single_block, rdrDataT, block_size_y,
block_size_with_upsampling_y, block_y, block_size_x,
block_size_with_upsampling_x, block_x, numdone,
progress_block, geogrid_upsampling, nbands,
progress_block, geogrid_upsampling,
shadow_no_data_value, nbands,
nbands_off_diag_terms, dem_interp_method, dem_raster,
out_off_diag_terms, out_geo_rdr, out_geo_dem,
out_geo_nlooks, out_geo_rtc,
Expand Down Expand Up @@ -2486,7 +2512,8 @@ void Geocode<T>::_runBlock(
int block_size_y, int block_size_with_upsampling_y, int block_y,
int block_size_x, int block_size_with_upsampling_x, int block_x,
long long& numdone, const long long& progress_block,
double geogrid_upsampling, int nbands, int nbands_off_diag_terms,
double geogrid_upsampling, float shadow_no_data_value,
int nbands, int nbands_off_diag_terms,
isce3::core::dataInterpMethod dem_interp_method,
isce3::io::Raster& dem_raster, isce3::io::Raster* out_off_diag_terms,
isce3::io::Raster* out_geo_rdr, isce3::io::Raster* out_geo_dem,
Expand Down Expand Up @@ -3355,13 +3382,34 @@ void Geocode<T>::_runBlock(
out_mask_array(i, j) = 0;
}

// x, y positions are binned by integer quotient (floor)
const int x = static_cast<int>(j / geogrid_upsampling);
const int y = static_cast<int>(i / geogrid_upsampling);

// ignoring boundary or low-sampled area elements
if (std::isnan(nlooks) || nlooks == 0 ||
nlooks < isce3::core::AREA_PROJECTION_MIN_VALID_SAMPLES_RATIO *
std::abs(w_total) ||
(!std::isnan(min_nlooks) &&
nlooks * radar_grid_nlooks <= min_nlooks))
nlooks * radar_grid_nlooks <= min_nlooks)) {

if (!std::isnan(shadow_no_data_value)) {

T_out v = static_cast<T_out>(shadow_no_data_value);
for (int band = 0; band < nbands; ++band) {
geoDataBlock[band]->operator()(y, x) = v;
}
if (nbands_off_diag_terms > 0) {

T2 v2 = static_cast<T2>(shadow_no_data_value);
for (int band = 0; band < nbands_off_diag_terms; ++band) {
geoDataBlockOffDiag[band]->operator()(y, x) = v2;
}
}
}

continue;
}

/*
If we need to output the mask layer AND the geogrid pixel contains
Expand Down Expand Up @@ -3410,10 +3458,6 @@ void Geocode<T>::_runBlock(
out_geo_rdr_r(i + 1, j + 1) = x11;
}

// x, y positions are binned by integer quotient (floor)
const int x = static_cast<int>(j / geogrid_upsampling);
const int y = static_cast<int>(i / geogrid_upsampling);

if (flag_apply_rtc) {
area_total /= nlooks;
if (out_geo_rtc_gamma0_to_sigma0 != nullptr) {
Expand Down
35 changes: 29 additions & 6 deletions cxx/isce3/geocode/GeocodeCov.h
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,10 @@ class Geocode {
* baseband (using Doppler centroid) before interpolation
* @param[in] flatten Flatten the geocoded SLC
* @param[in] geogrid_upsampling Geogrid upsampling
* @param[in] shadow_no_data_value Value to represent areas without
* valid radar samples. If output is complex (e.g., off-diagonal terms),
* this value will be used for the real-part whereas the imaginary part
* will be set to 0
* @param[in] flag_upsample_radar_grid Double the radar grid sampling rate
* @param[in] flag_apply_rtc Apply radiometric terrain correction
* (RTC)
Expand Down Expand Up @@ -151,6 +155,7 @@ class Geocode {
geocodeOutputMode output_mode = geocodeOutputMode::INTERP,
bool flag_az_baseband_doppler = false, bool flatten = false,
double geogrid_upsampling = 1,
float shadow_no_data_value = std::numeric_limits<float>::quiet_NaN(),
bool flag_upsample_radar_grid = false, bool flag_apply_rtc = false,
isce3::geometry::rtcInputTerrainRadiometry
input_terrain_radiometry = isce3::geometry::
Expand Down Expand Up @@ -222,6 +227,12 @@ class Geocode {
* `abs_cal_factor parameters`, which default to `false` and `1`,
* respectively.
* @param[in] dem_raster Input DEM raster
* @param[in] shadow_no_data_value Value to represent areas without
* valid radar samples. If output is complex (e.g., off-diagonal terms),
* this value will be used for the real-part whereas the imaginary part
* will be set to 0
* @param[in] flag_apply_rtc Apply radiometric terrain correction
* (RTC)
* @param[in] flag_az_baseband_doppler Shift SLC azimuth spectrum to
* baseband (using Doppler centroid) before interpolation
* @param[in] input_terrain_radiometry Input terrain radiometry
Expand Down Expand Up @@ -288,7 +299,9 @@ class Geocode {
template<class T_out>
void geocodeInterp(const isce3::product::RadarGridParameters& radar_grid,
isce3::io::Raster& input_raster, isce3::io::Raster& output_raster,
isce3::io::Raster& dem_raster, bool flag_apply_rtc = false,
isce3::io::Raster& dem_raster,
float shadow_no_data_value = std::numeric_limits<float>::quiet_NaN(),
bool flag_apply_rtc = false,
bool flag_az_baseband_doppler = false, bool flatten = false,
isce3::geometry::rtcInputTerrainRadiometry
input_terrain_radiometry = isce3::geometry::
Expand Down Expand Up @@ -356,6 +369,10 @@ class Geocode {
* respectively.
* @param[in] dem_raster Input DEM raster
* @param[in] geogrid_upsampling Geogrid upsampling
* @param[in] shadow_no_data_value Value to represent areas without
* valid radar samples. If output is complex (e.g., off-diagonal terms),
* this value will be used for the real-part whereas the imaginary part
* will be set to 0
* @param[in] flag_upsample_radar_grid Double the radar grid sampling rate
* @param[in] flag_apply_rtc Apply radiometric terrain correction
* (RTC)
Expand Down Expand Up @@ -433,6 +450,7 @@ class Geocode {
isce3::io::Raster& input_raster, isce3::io::Raster& output_raster,
isce3::io::Raster& dem_raster,
double geogrid_upsampling = 1,
float shadow_no_data_value = std::numeric_limits<float>::quiet_NaN(),
bool flag_upsample_radar_grid = false,
bool flag_apply_rtc = false,
isce3::geometry::rtcInputTerrainRadiometry input_terrain_radiometry =
Expand Down Expand Up @@ -621,7 +639,9 @@ class Geocode {
int block_size_y, int block_size_with_upsampling_y, int block_y,
int block_size_x, int block_size_with_upsampling_x, int block_x,
long long& numdone, const long long& progress_block,
double geogrid_upsampling, int nbands, int nbands_off_diag_terms,
double geogrid_upsampling,
float shadow_no_data_value,
int nbands, int nbands_off_diag_terms,
isce3::core::dataInterpMethod dem_interp_method,
isce3::io::Raster& dem_raster,
isce3::io::Raster* out_off_diag_terms,
Expand Down Expand Up @@ -672,8 +692,11 @@ class Geocode {
* @param[in] flatten flag to flatten the geocoded SLC
* @param[in] phase_screen_raster Phase screen raster
* @param[in] phase_screen_array Phase screen array
* @param[in] rtc_min_value_db Minimum value for the RTC area factor.
* Radar data with RTC area factor below this limit will be set to NaN.
* @param[in] shadow_no_data_value Value to represent areas without
* valid radar samples. If output is complex (e.g., off-diagonal terms),
* this value will be used for the real-part whereas the imaginary part
* will be set to 0
* @param[in] rtc_min_value Minimum value for the RTC area factor.
* @param[in] abs_cal_factor Absolute calibration factor applied
* to real-valued output datasets (assumed to be proportional to
* power/intensity). If the output is complex valued, its considered
Expand Down Expand Up @@ -724,8 +747,8 @@ class Geocode {
const bool flag_az_baseband_doppler, const bool flatten,
isce3::io::Raster* phase_screen_raster,
isce3::core::Matrix<float>& phase_screen_array,
float rtc_min_value, double abs_cal_factor,
float clip_min, float clip_max,
float shadow_no_data_value, float rtc_min_value,
double abs_cal_factor, float clip_min, float clip_max,
bool flag_run_rtc, const isce3::core::Matrix<float>& rtc_area,
const isce3::core::Matrix<float>& rtc_area_sigma,
isce3::io::Raster* out_geo_rtc,
Expand Down
Loading
Loading