From ffd8aa776264836bead9dbeb782cde9f30f9c8a5 Mon Sep 17 00:00:00 2001 From: "Gustavo H. X. Shiroma" Date: Mon, 30 Jun 2025 15:56:43 -0700 Subject: [PATCH] Add an option in the GCOV workflow to assign values to regions with missing radar samples --- cxx/isce3/geocode/GeocodeCov.cpp | 94 ++++++++++++++----- cxx/isce3/geocode/GeocodeCov.h | 35 +++++-- .../pybind_isce3/geocode/GeocodeCov.cpp | 10 +- python/packages/nisar/workflows/gcov.py | 3 + share/nisar/defaults/gcov.yaml | 6 ++ share/nisar/schemas/gcov.yaml | 6 ++ tests/cxx/isce3/geocode/geocodeCov.cpp | 7 +- 7 files changed, 126 insertions(+), 35 deletions(-) diff --git a/cxx/isce3/geocode/GeocodeCov.cpp b/cxx/isce3/geocode/GeocodeCov.cpp index 2bdc05967..bbfe03012 100644 --- a/cxx/isce3/geocode/GeocodeCov.cpp +++ b/cxx/isce3/geocode/GeocodeCov.cpp @@ -128,7 +128,8 @@ void Geocode::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, @@ -158,7 +159,8 @@ void Geocode::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(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, @@ -174,7 +176,8 @@ void Geocode::geocode(const isce3::product::RadarGridParameters& radar_grid, (std::is_same::value || std::is_same>::value)) geocodeInterp(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, @@ -188,7 +191,8 @@ void Geocode::geocode(const isce3::product::RadarGridParameters& radar_grid, dem_interp_method); else if (flag_run_geocode_interp) geocodeInterp(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, @@ -202,7 +206,8 @@ void Geocode::geocode(const isce3::product::RadarGridParameters& radar_grid, dem_interp_method); else if (!flag_complex_to_real) geocodeAreaProj(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, @@ -218,7 +223,8 @@ void Geocode::geocode(const isce3::product::RadarGridParameters& radar_grid, else if (std::is_same::value || std::is_same>::value) geocodeAreaProj(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, @@ -233,7 +239,8 @@ void Geocode::geocode(const isce3::product::RadarGridParameters& radar_grid, dem_interp_method); else geocodeAreaProj(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, @@ -253,8 +260,8 @@ template void Geocode::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, @@ -860,9 +867,10 @@ void Geocode::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, @@ -947,7 +955,7 @@ inline void Geocode::_interpolate( const bool flag_az_baseband_doppler, const bool flatten, isce3::io::Raster* phase_screen_raster, isce3::core::Matrix& 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& rtc_area, @@ -1036,6 +1044,21 @@ inline void Geocode::_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(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::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::quiet_NaN(); + } continue; } } @@ -1866,7 +1889,8 @@ void Geocode::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, @@ -1910,10 +1934,10 @@ void Geocode::geocodeAreaProj( const float upsampled_radar_grid_nlooks = radar_grid_nlooks / 2; geocodeAreaProj(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, @@ -2271,7 +2295,8 @@ void Geocode::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, @@ -2298,7 +2323,8 @@ void Geocode::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, @@ -2486,7 +2512,8 @@ void Geocode::_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, @@ -3355,13 +3382,34 @@ void Geocode::_runBlock( out_mask_array(i, j) = 0; } + // x, y positions are binned by integer quotient (floor) + const int x = static_cast(j / geogrid_upsampling); + const int y = static_cast(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(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(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 @@ -3410,10 +3458,6 @@ void Geocode::_runBlock( out_geo_rdr_r(i + 1, j + 1) = x11; } - // x, y positions are binned by integer quotient (floor) - const int x = static_cast(j / geogrid_upsampling); - const int y = static_cast(i / geogrid_upsampling); - if (flag_apply_rtc) { area_total /= nlooks; if (out_geo_rtc_gamma0_to_sigma0 != nullptr) { diff --git a/cxx/isce3/geocode/GeocodeCov.h b/cxx/isce3/geocode/GeocodeCov.h index dcd704044..1a72972a2 100644 --- a/cxx/isce3/geocode/GeocodeCov.h +++ b/cxx/isce3/geocode/GeocodeCov.h @@ -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) @@ -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::quiet_NaN(), bool flag_upsample_radar_grid = false, bool flag_apply_rtc = false, isce3::geometry::rtcInputTerrainRadiometry input_terrain_radiometry = isce3::geometry:: @@ -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 @@ -288,7 +299,9 @@ class Geocode { template 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::quiet_NaN(), + bool flag_apply_rtc = false, bool flag_az_baseband_doppler = false, bool flatten = false, isce3::geometry::rtcInputTerrainRadiometry input_terrain_radiometry = isce3::geometry:: @@ -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) @@ -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::quiet_NaN(), bool flag_upsample_radar_grid = false, bool flag_apply_rtc = false, isce3::geometry::rtcInputTerrainRadiometry input_terrain_radiometry = @@ -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, @@ -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 @@ -724,8 +747,8 @@ class Geocode { const bool flag_az_baseband_doppler, const bool flatten, isce3::io::Raster* phase_screen_raster, isce3::core::Matrix& 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& rtc_area, const isce3::core::Matrix& rtc_area_sigma, isce3::io::Raster* out_geo_rtc, diff --git a/python/extensions/pybind_isce3/geocode/GeocodeCov.cpp b/python/extensions/pybind_isce3/geocode/GeocodeCov.cpp index 409ce0c4c..725701c85 100644 --- a/python/extensions/pybind_isce3/geocode/GeocodeCov.cpp +++ b/python/extensions/pybind_isce3/geocode/GeocodeCov.cpp @@ -72,6 +72,7 @@ void addbinding(py::class_>& pyGeocode) py::arg("flag_az_baseband_doppler") = false, py::arg("flatten") = false, py::arg("geogrid_upsampling") = 1, + py::arg("shadow_no_data_value") = std::numeric_limits::quiet_NaN(), py::arg("flag_upsample_radar_grid") = false, py::arg("flag_apply_rtc") = false, py::arg("input_terrain_radiometry") = @@ -160,6 +161,11 @@ void addbinding(py::class_>& pyGeocode) Flatten the geocoded SLC geogrid_upsampling: int, optional Geogrid upsampling + shadow_no_data_value: float, optional + 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 flag_upsample_radar_grid: bool, optional Double the radar grid sampling rate flag_apply_rtc: bool, optional @@ -175,9 +181,9 @@ void addbinding(py::class_>& pyGeocode) rtc_min_value_db: float, optional Minimum value for the RTC area factor. Radar data with RTC area factor below this limit will be set to NaN. - rtc_geogrid_upsampling: int, optional + rtc_upsampling: int, optional Geogrid upsampling to compute the radiometric terrain - correction RTC. + correction (RTC). rtc_algorithm: isce3.geometry.RtcAlgorithm, optional RTC algorithm rtc_factor_area_mode : isce3.geometry.RtcAreaBetaMode, optional diff --git a/python/packages/nisar/workflows/gcov.py b/python/packages/nisar/workflows/gcov.py index c4d6a3328..7bcd3c059 100644 --- a/python/packages/nisar/workflows/gcov.py +++ b/python/packages/nisar/workflows/gcov.py @@ -401,6 +401,7 @@ def _run(cfg, raster_scratch_dir): apply_valid_samples_sub_swath_masking = \ geocode_dict['apply_valid_samples_sub_swath_masking'] geogrid_upsampling = geocode_dict['geogrid_upsampling'] + shadow_no_data_value = geocode_dict['shadow_no_data_value'] abs_cal_factor = geocode_dict['abs_rad_cal'] clip_max = geocode_dict['clip_max'] clip_min = geocode_dict['clip_min'] @@ -571,6 +572,8 @@ def _run(cfg, raster_scratch_dir): root_ds = f'/science/LSAR/GCOV/grids/frequency{frequency}' optional_geo_kwargs['geogrid_upsampling'] = geogrid_upsampling + if shadow_no_data_value is not None: + optional_geo_kwargs['shadow_no_data_value'] = shadow_no_data_value optional_geo_kwargs['abs_cal_factor'] = abs_cal_factor optional_geo_kwargs['clip_min'] = clip_min optional_geo_kwargs['clip_max'] = clip_max diff --git a/share/nisar/defaults/gcov.yaml b/share/nisar/defaults/gcov.yaml index db0c71352..405e81489 100644 --- a/share/nisar/defaults/gcov.yaml +++ b/share/nisar/defaults/gcov.yaml @@ -277,6 +277,12 @@ runconfig: # OPTIONAL - Processing upsampling factor applied to input geogrid geogrid_upsampling: 1 + # Value to represent areas without valid radar samples. + # If output is complex (e.g., off-diagonal terms), this value + # will be used for real- and imaginary parts. For example, + # `0` will become `complex(0, 0)`. + shadow_no_data_value: + # Save the number of looks used to compute GCOV save_nlooks: True diff --git a/share/nisar/schemas/gcov.yaml b/share/nisar/schemas/gcov.yaml index d5d882681..04b9ca376 100644 --- a/share/nisar/schemas/gcov.yaml +++ b/share/nisar/schemas/gcov.yaml @@ -316,6 +316,12 @@ geocode_options: # Processing upsampling factor on top of the input geogrid geogrid_upsampling: int(required=False) + # Value to represent areas without valid radar samples. + # If output is complex (e.g., off-diagonal terms), this value + # will be used for real- and imaginary parts. For example, + # `0` will become `complex(0, 0)`. + shadow_no_data_value: num(required=False) + # Save the number of looks used to compute GCOV save_nlooks: bool(required=False) diff --git a/tests/cxx/isce3/geocode/geocodeCov.cpp b/tests/cxx/isce3/geocode/geocodeCov.cpp index f75ec95bc..88d1818a6 100644 --- a/tests/cxx/isce3/geocode/geocodeCov.cpp +++ b/tests/cxx/isce3/geocode/geocodeCov.cpp @@ -116,6 +116,7 @@ TEST(GeocodeTest, TestGeocodeCov) { bool flag_az_baseband_doppler = false; bool flatten = false; double geogrid_upsampling = 1; + double shadow_no_data_value = std::numeric_limits::quiet_NaN(); bool flag_upsample_radar_grid = false; isce3::geometry::rtcInputTerrainRadiometry input_terrain_radiometry = isce3::geometry::rtcInputTerrainRadiometry::BETA_NAUGHT; @@ -241,7 +242,8 @@ TEST(GeocodeTest, TestGeocodeCov) { // run geocode geoObj.geocode(radar_grid_shifted, radarRaster, geocodedRaster, demRaster, output_mode, flag_az_baseband_doppler, - flatten, geogrid_upsampling, flag_upsample_radar_grid, + flatten, geogrid_upsampling, + shadow_no_data_value, flag_upsample_radar_grid, flag_apply_rtc, input_terrain_radiometry, output_terrain_radiometry, exponent, rtc_min_value_db, rtc_geogrid_upsampling, rtc_algorithm, @@ -298,7 +300,8 @@ TEST(GeocodeTest, TestGeocodeCov) { geoComplexObj.geocode(radar_grid, slc_raster_xy, geocoded_diag_raster, demRaster, output_mode, flag_az_baseband_doppler, flatten, - 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, exponent, rtc_min_value_db, rtc_geogrid_upsampling, rtc_algorithm, rtc_area_beta_mode, abs_cal_factor, clip_min,