mzannotate 0.2.0

Handle fragmentation of (complex) peptidoforms.
Documentation
use mzcore::{
    chemistry::{CachedCharge, MassOutputMode},
    prelude::{AminoAcid, SequencePosition},
    quantities::Multi,
    sequence::{GnoComposition, Modification, SimpleModificationInner},
};

use crate::{
    glycan::GlycanFragmention,
    prelude::{Fragment, FragmentationModel},
};

/// Generate theoretical fragments for side chains (glycans)
pub(crate) fn generate_theoretical_fragments<Mode: MassOutputMode>(
    modification: &Modification,
    model: &FragmentationModel,
    peptidoform_ion_index: usize,
    peptidoform_index: usize,
    charge_carriers: &mut CachedCharge,
    full_formula: &Multi<Mode::Output>,
    attachment: Option<(AminoAcid, SequencePosition)>,
) -> Vec<Fragment<Mode>> {
    match modification {
        Modification::Simple(modification) | Modification::Ambiguous { modification, .. } => {
            simple_modification_fragments(
                modification,
                model,
                peptidoform_ion_index,
                peptidoform_index,
                charge_carriers,
                full_formula,
                attachment,
            )
        }
        Modification::CrossLink { .. } => Vec::new(),
    }
}

/// Generate theoretical fragments for side chains (glycans)
pub(crate) fn simple_modification_fragments<Mode: MassOutputMode>(
    modification: &SimpleModificationInner,
    model: &FragmentationModel,
    peptidoform_ion_index: usize,
    peptidoform_index: usize,
    charge_carriers: &mut CachedCharge,
    full_formula: &Multi<Mode::Output>,
    attachment: Option<(AminoAcid, SequencePosition)>,
) -> Vec<Fragment<Mode>> {
    match modification {
        SimpleModificationInner::GlycanStructure(glycan)
        | SimpleModificationInner::Gno {
            composition: GnoComposition::Topology(glycan),
            ..
        } => glycan.clone().determine_positions().generate_theoretical_fragments(
            model,
            peptidoform_ion_index,
            peptidoform_index,
            charge_carriers,
            full_formula,
            attachment,
        ),
        SimpleModificationInner::Glycan(composition)
        | SimpleModificationInner::Gno {
            composition: GnoComposition::Composition(composition),
            ..
        } => crate::monosaccharide::theoretical_fragments(
            composition,
            model,
            peptidoform_ion_index,
            peptidoform_index,
            charge_carriers,
            full_formula,
            attachment,
        ),
        _ => Vec::new(),
    }
}