use serde::{Deserialize, Serialize};
use super::Reaction;
use crate::{
quantum::Frame,
variables::{Angles, CosTheta, Mass, Phi},
LadduError, LadduResult,
};
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct Decay {
pub(super) reaction: Reaction,
pub(super) parent: String,
pub(super) daughter_1: String,
pub(super) daughter_2: String,
}
impl Decay {
pub const fn reaction(&self) -> &Reaction {
&self.reaction
}
pub fn parent(&self) -> &str {
&self.parent
}
pub fn daughter_1(&self) -> &str {
&self.daughter_1
}
pub fn daughter_2(&self) -> &str {
&self.daughter_2
}
pub fn daughters(&self) -> [&str; 2] {
[&self.daughter_1, &self.daughter_2]
}
pub fn mass(&self) -> Mass {
self.reaction.mass(&self.parent)
}
pub fn parent_mass(&self) -> Mass {
self.mass()
}
pub fn daughter_1_mass(&self) -> Mass {
self.reaction.mass(&self.daughter_1)
}
pub fn daughter_2_mass(&self) -> Mass {
self.reaction.mass(&self.daughter_2)
}
pub fn daughter_mass(&self, daughter: &str) -> LadduResult<Mass> {
self.validate_daughter(daughter)?;
Ok(self.reaction.mass(daughter))
}
pub fn costheta(&self, daughter: &str, frame: Frame) -> LadduResult<CosTheta> {
self.validate_daughter(daughter)?;
Ok(CosTheta::from_reaction(
self.reaction.clone(),
self.parent.clone(),
daughter,
frame,
))
}
pub fn phi(&self, daughter: &str, frame: Frame) -> LadduResult<Phi> {
self.validate_daughter(daughter)?;
Ok(Phi::from_reaction(
self.reaction.clone(),
self.parent.clone(),
daughter,
frame,
))
}
pub fn angles(&self, daughter: &str, frame: Frame) -> LadduResult<Angles> {
self.validate_daughter(daughter)?;
Ok(Angles::from_reaction(
self.reaction.clone(),
self.parent.clone(),
daughter,
frame,
))
}
fn validate_daughter(&self, daughter: &str) -> LadduResult<()> {
if daughter == self.daughter_1 || daughter == self.daughter_2 {
Ok(())
} else {
Err(LadduError::Custom(format!(
"particle '{}' is not an immediate daughter of '{}'",
daughter, self.parent
)))
}
}
}