use alpha_g_detector::alpha16::aw_map::TpcWirePosition;
use lazy_static::{__Deref, lazy_static};
use std::collections::HashMap;
use thiserror::Error;
includes! {
DATA_PATH = "../../../data/calibration/wires/baseline/";
BYTES_SIMULATION = "simulation_complete.json",
BYTES_7026 = "7026_complete.json",
}
lazy_static! {
static ref MAP_SIMULATION: HashMap<TpcWirePosition, i16> = complete_from_bytes(BYTES_SIMULATION);
static ref MAP_7026: HashMap<TpcWirePosition, i16> = complete_from_bytes(BYTES_7026);
}
pub(crate) fn try_wire_baseline(
run_number: u32,
wire: TpcWirePosition,
) -> Result<i16, MapWireBaselineError> {
let map = match run_number {
u32::MAX => MAP_SIMULATION.deref(),
7026.. => MAP_7026.deref(),
_ => return Err(MapWireBaselineError::MissingMap { run_number }),
};
map.get(&wire)
.copied()
.ok_or(MapWireBaselineError::MissingWire { run_number, wire })
}
#[derive(Debug, Error)]
pub enum MapWireBaselineError {
#[error("no wire baseline calibration available for run number `{run_number}`")]
MissingMap { run_number: u32 },
#[error("no baseline calibration available for wire `{wire:?}` in run number `{run_number}`")]
MissingWire {
run_number: u32,
wire: TpcWirePosition,
},
}
fn complete_from_bytes(bytes: &[u8]) -> HashMap<TpcWirePosition, i16> {
let map: HashMap<TpcWirePosition, (f64, f64, usize)> = serde_json::from_slice(bytes).unwrap();
map.into_iter()
.map(|(wire, (baseline, _, _))| (wire, baseline.round() as i16))
.collect()
}
fn _update_previous_from_bytes(
previous: &HashMap<TpcWirePosition, i16>,
bytes: &[u8],
) -> HashMap<TpcWirePosition, i16> {
let update: HashMap<TpcWirePosition, Option<(f64, f64, usize)>> =
serde_json::from_slice(bytes).unwrap();
let update: HashMap<_, _> = update
.into_iter()
.map(|(k, v)| (k, v.map(|(baseline, _, _)| baseline.round() as i16)))
.collect();
let mut map = previous.clone();
for (wire, value) in update {
match value {
Some(value) => map.insert(wire, value),
None => map.remove(&wire),
};
}
map
}
#[cfg(test)]
mod tests;