#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum SigmaPolicy {
#[default]
DefaultOnly,
Floor,
}
#[derive(Debug, Clone, PartialEq)]
pub enum WeightingLayer {
ObservatoryRule {
obs_code: String,
sigma: [f64; 2],
start_epoch_mjd_tdb: Option<f64>,
end_epoch_mjd_tdb: Option<f64>,
scale: f64,
},
NightlyDeweighting {
max_gap_days: f64,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum WeightingPreset {
None,
#[default]
Vfc17,
Neodys,
}
#[derive(Debug, Clone, PartialEq)]
pub struct WeightingConfig {
pub enabled: bool,
pub preset: WeightingPreset,
pub default_sigma_arcsec: f64,
pub sigma_policy: Option<SigmaPolicy>,
pub additional_layers: Vec<WeightingLayer>,
}
impl Default for WeightingConfig {
fn default() -> Self {
Self {
enabled: true,
preset: WeightingPreset::Vfc17,
default_sigma_arcsec: 1.0,
sigma_policy: None,
additional_layers: vec![WeightingLayer::NightlyDeweighting { max_gap_days: 0.5 }],
}
}
}
pub(super) fn weighting_layer_to_ffi(
layer: &WeightingLayer,
) -> empyrean_sys::EmpyreanWeightingLayer {
let mut ffi = empyrean_sys::EmpyreanWeightingLayer {
kind: 0,
obs_code: [0u8; 4],
sigma_ra_arcsec: 0.0,
sigma_dec_arcsec: 0.0,
start_epoch_mjd_tdb: f64::NAN,
end_epoch_mjd_tdb: f64::NAN,
scale: 0.0,
max_gap_days: 0.0,
};
match layer {
WeightingLayer::ObservatoryRule {
obs_code,
sigma,
start_epoch_mjd_tdb,
end_epoch_mjd_tdb,
scale,
} => {
ffi.kind = empyrean_sys::EMPYREAN_WEIGHTING_LAYER_OBSERVATORY_RULE as i32;
let bytes = obs_code.as_bytes();
for (i, &b) in bytes.iter().enumerate().take(4) {
ffi.obs_code[i] = b;
}
ffi.sigma_ra_arcsec = sigma[0];
ffi.sigma_dec_arcsec = sigma[1];
ffi.start_epoch_mjd_tdb = start_epoch_mjd_tdb.unwrap_or(f64::NAN);
ffi.end_epoch_mjd_tdb = end_epoch_mjd_tdb.unwrap_or(f64::NAN);
ffi.scale = *scale;
}
WeightingLayer::NightlyDeweighting { max_gap_days } => {
ffi.kind = empyrean_sys::EMPYREAN_WEIGHTING_LAYER_NIGHTLY_DEWEIGHTING as i32;
ffi.max_gap_days = *max_gap_days;
}
}
ffi
}