use alpha_g_detector::padwing::map::TpcPadPosition;
use lazy_static::lazy_static;
use std::collections::HashMap;
use thiserror::Error;
includes! {
DATA_PATH = "../../../data/calibration/pads/baseline/";
BYTES_SIMULATION = "simulation_complete.ron",
BYTES_9277 = "9277_complete_handwritten_cherry_picked_see_commit.ron",
BYTES_11192 = "11192_complete.ron",
}
lazy_static! {
static ref MAP_SIMULATION: HashMap<TpcPadPosition, i16> = complete_from_bytes(BYTES_SIMULATION);
static ref MAP_9277: HashMap<TpcPadPosition, i16> = complete_from_bytes(BYTES_9277);
static ref MAP_11192: HashMap<TpcPadPosition, i16> = complete_from_bytes(BYTES_11192);
}
pub(crate) fn try_pad_baseline(
run_number: u32,
pad: TpcPadPosition,
) -> Result<i16, MapPadBaselineError> {
let map = match run_number {
u32::MAX => &*MAP_SIMULATION,
11084.. => &*MAP_11192,
9277.. => &*MAP_9277,
_ => return Err(MapPadBaselineError::MissingMap { run_number }),
};
map.get(&pad)
.copied()
.ok_or(MapPadBaselineError::MissingPad { run_number, pad })
}
#[derive(Debug, Error)]
pub enum MapPadBaselineError {
#[error("no pad baseline calibration available for run number `{run_number}`")]
MissingMap { run_number: u32 },
#[error("no baseline available for pad `{pad:?}` in run number `{run_number}`")]
MissingPad {
run_number: u32,
pad: TpcPadPosition,
},
}
fn complete_from_bytes(bytes: &[u8]) -> HashMap<TpcPadPosition, i16> {
let map: HashMap<TpcPadPosition, (f64, f64, usize)> = ron::de::from_bytes(bytes).unwrap();
map.into_iter()
.map(|(pad, (baseline, _, _))| (pad, baseline.round() as i16))
.collect()
}
#[cfg(test)]
mod tests;