pub enum ExperimentType {
Xrr,
Xrs,
Other,
}
impl ExperimentType {
pub fn from_str(exp_type: &str) -> Result<Self, crate::errors::FitsLoaderError> {
match exp_type.to_lowercase().as_str() {
"xrr" => Ok(ExperimentType::Xrr),
"xrs" => Ok(ExperimentType::Xrs),
"other" => Ok(ExperimentType::Other),
_ => Err(crate::errors::FitsLoaderError::InvalidExperimentType(
exp_type.to_string(),
)),
}
}
pub fn get_keys(&self) -> Vec<HeaderValue> {
match self {
ExperimentType::Xrr => vec![
HeaderValue::SampleTheta,
HeaderValue::CCDTheta,
HeaderValue::BeamlineEnergy,
HeaderValue::BeamCurrent,
HeaderValue::EPUPolarization,
HeaderValue::HorizontalExitSlitSize,
HeaderValue::HigherOrderSuppressor,
HeaderValue::Exposure,
],
ExperimentType::Xrs => vec![HeaderValue::BeamlineEnergy],
ExperimentType::Other => vec![],
}
}
pub fn names(&self) -> Vec<&str> {
match self {
ExperimentType::Xrr => vec![
"Sample Theta",
"CCD Theta",
"Beamline Energy",
"Beam Current",
"EPU Polarization",
"Horizontal Exit Slit Size",
"Higher Order Suppressor",
"EXPOSURE",
],
ExperimentType::Xrs => vec!["Beamline Energy"],
ExperimentType::Other => vec![],
}
}
}
pub enum HeaderValue {
SampleTheta,
CCDTheta,
BeamlineEnergy,
EPUPolarization,
BeamCurrent,
HorizontalExitSlitSize,
HigherOrderSuppressor,
Exposure,
}
impl HeaderValue {
pub fn unit(&self) -> &str {
match self {
HeaderValue::SampleTheta => "[deg]",
HeaderValue::CCDTheta => "[deg]",
HeaderValue::BeamlineEnergy => "[eV]",
HeaderValue::BeamCurrent => "[mA]",
HeaderValue::EPUPolarization => "[deg]",
HeaderValue::HorizontalExitSlitSize => "[um]",
HeaderValue::HigherOrderSuppressor => "[mm]",
HeaderValue::Exposure => "[s]",
}
}
pub fn hdu(&self) -> &str {
match self {
HeaderValue::SampleTheta => "Sample Theta",
HeaderValue::CCDTheta => "CCD Theta",
HeaderValue::BeamlineEnergy => "Beamline Energy",
HeaderValue::BeamCurrent => "Beam Current",
HeaderValue::EPUPolarization => "EPU Polarization",
HeaderValue::HorizontalExitSlitSize => "Horizontal Exit Slit Size",
HeaderValue::HigherOrderSuppressor => "Higher Order Suppressor",
HeaderValue::Exposure => "EXPOSURE",
}
}
pub fn name(&self) -> &str {
match self {
HeaderValue::SampleTheta => "Sample Theta [deg]",
HeaderValue::CCDTheta => "CCD Theta [deg]",
HeaderValue::BeamlineEnergy => "Beamline Energy [eV]",
HeaderValue::BeamCurrent => "Beam Current [mA]",
HeaderValue::EPUPolarization => "EPU Polarization [deg]",
HeaderValue::HorizontalExitSlitSize => "Horizontal Exit Slit Size [um]",
HeaderValue::HigherOrderSuppressor => "Higher Order Suppressor [mm]",
HeaderValue::Exposure => "EXPOSURE [s]",
}
}
}