use alpha_g_detector::alpha16::aw_map::TpcWirePosition;
use lazy_static::lazy_static;
use std::collections::HashMap;
use thiserror::Error;
includes! {
DATA_PATH = "../../../data/calibration/wires/gain/";
BYTES_SIMULATION = "simulation_complete.json",
BYTES_9277 = "9277_complete.json",
BYTES_11186 = "11186_complete.json",
BYTES_11506 = "11506_complete.json",
}
lazy_static! {
static ref MAP_SIMULATION: HashMap<TpcWirePosition, f64> = complete_from_bytes(BYTES_SIMULATION);
static ref MAP_9277: HashMap<TpcWirePosition, f64> = complete_from_bytes(BYTES_9277);
static ref MAP_11186: HashMap<TpcWirePosition, f64> = complete_from_bytes(BYTES_11186);
static ref MAP_11506: HashMap<TpcWirePosition, f64> = complete_from_bytes(BYTES_11506);
}
pub(crate) fn try_wire_gain(
run_number: u32,
wire: TpcWirePosition,
) -> Result<f64, MapWireGainError> {
let map = match run_number {
u32::MAX => &*MAP_SIMULATION,
11356.. => &*MAP_11506,
11084.. => &*MAP_11186,
9277.. => &*MAP_9277,
_ => return Err(MapWireGainError::MissingMap { run_number }),
};
map.get(&wire)
.copied()
.ok_or(MapWireGainError::MissingWire { run_number, wire })
}
#[derive(Debug, Error)]
pub enum MapWireGainError {
#[error("no wire gain calibration available for run number `{run_number}`")]
MissingMap { run_number: u32 },
#[error("no wire gain calibration available for wire `{wire:?}` in run number `{run_number}`")]
MissingWire {
run_number: u32,
wire: TpcWirePosition,
},
}
fn complete_from_bytes(bytes: &[u8]) -> HashMap<TpcWirePosition, f64> {
serde_json::from_slice(bytes).unwrap()
}
#[cfg(test)]
mod tests;