use super::Ephemeris;
use crate::astro::Aberration;
use crate::prelude::{Almanac, Frame, Orbit};
use hifitime::TimeSeries;
use log::warn;
use rayon::prelude::*;
use std::collections::BTreeMap;
impl Almanac {
pub fn build_ephemeris(
&self,
target_frame: Frame,
observer_frame: Frame,
time_series: TimeSeries,
ab_corr: Option<Aberration>,
object_id: String,
) -> Ephemeris {
let states = time_series
.par_bridge()
.filter_map(|epoch| {
self.transform(target_frame, observer_frame, epoch, ab_corr)
.map_or_else(
|e| {
warn!("{e}");
None
},
Some,
)
})
.collect::<Vec<Orbit>>();
if states.is_empty() {
warn!("empty ephemeris created");
}
let mut ephem = Ephemeris {
object_id,
interpolation: crate::naif::daf::DafDataType::Type13HermiteUnequalStep,
degree: 7,
state_data: BTreeMap::new(),
};
for state in states {
ephem.insert_orbit(state);
}
ephem
}
}