use hifitime::Epoch;
use crate::constants::*;
pub fn epoch_as_gps_seconds(e: Epoch) -> f64 {
e.as_gpst_seconds() - HIFITIME_GPS_FACTOR
}
pub fn jd_to_epoch(jd_days: f64) -> hifitime::Epoch {
let num_leap_seconds = {
let naive_obs_epoch = Epoch::from_tai_days(jd_days);
jd_days - naive_obs_epoch.as_utc_days()
};
Epoch::from_jde_tai(jd_days + num_leap_seconds)
}
pub fn mjd_to_epoch(mjd_days: f64) -> hifitime::Epoch {
let num_leap_seconds = {
let naive_obs_epoch = Epoch::from_tai_days(mjd_days);
mjd_days - naive_obs_epoch.as_utc_days()
};
Epoch::from_mjd_tai(mjd_days + num_leap_seconds)
}
pub fn gps_to_epoch(gps: f64) -> hifitime::Epoch {
let tai = gps + 19.0 + HIFITIME_GPS_FACTOR;
Epoch::from_tai_seconds(tai)
}
pub fn casacore_utc_to_epoch(utc_seconds: f64) -> hifitime::Epoch {
let num_leap_seconds = {
let naive_obs_epoch = Epoch::from_tai_seconds(utc_seconds - MJD_TAI_EPOCH_DIFF);
utc_seconds - MJD_TAI_EPOCH_DIFF - naive_obs_epoch.as_utc_seconds()
};
Epoch::from_tai_seconds(utc_seconds - MJD_TAI_EPOCH_DIFF + num_leap_seconds)
}
#[cfg(test)]
mod tests {
use super::*;
use approx::assert_abs_diff_eq;
#[test]
fn hifitime_behaves_as_expected_gps() {
let gps = 1065880128.0;
let epoch = gps_to_epoch(gps);
assert_abs_diff_eq!(epoch_as_gps_seconds(epoch), gps);
}
#[test]
fn hifitime_behaves_as_expected_utc() {
let utc = 4888561714.0;
let epoch = casacore_utc_to_epoch(utc);
assert_abs_diff_eq!(epoch.as_utc_seconds(), 3590833714.0);
assert_abs_diff_eq!(epoch_as_gps_seconds(epoch), 1065880130.0);
}
}