use serde::{Deserialize, Serialize};
use mzcore::{
chemistry::MassMode, quantities::Tolerance, sequence::AminoAcid, system::OrderedMass,
};
#[derive(
Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug, Default, Serialize, Deserialize,
)]
pub enum MatchType {
FullIdentity,
IdentityMassMismatch,
#[default]
Mismatch,
Isobaric,
Rotation,
Gap,
}
#[derive(
Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug, Default, Serialize, Deserialize,
)]
pub enum PairMode {
#[default]
Same,
DatabaseToPeptidoform,
PeptidoformToDatabase,
}
impl std::fmt::Display for PairMode {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"{}",
match self {
Self::Same => "Same",
Self::DatabaseToPeptidoform => "Database to Peptidoform",
Self::PeptidoformToDatabase => "Peptidoform to Database",
}
)
}
}
#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub struct AlignScoring<'a> {
pub mismatch: i8,
pub mass_mismatch: i8,
pub mass_base: i8,
pub rotated: i8,
pub isobaric: i8,
pub gap_start: i8,
pub gap_extend: i8,
pub matrix: &'a [[i8; AminoAcid::TOTAL_NUMBER]; AminoAcid::TOTAL_NUMBER],
pub tolerance: Tolerance<OrderedMass>,
pub mass_mode: MassMode,
pub pair: PairMode,
}
impl Default for AlignScoring<'static> {
fn default() -> Self {
Self {
mismatch: -1,
mass_mismatch: 0,
mass_base: 1,
rotated: 3,
isobaric: 2,
gap_start: -4,
gap_extend: -1,
matrix: matrices::BLOSUM62,
tolerance: Tolerance::new_ppm(10.0),
mass_mode: MassMode::Monoisotopic,
pair: PairMode::Same,
}
}
}
pub(super) mod matrices {
use mzcore::sequence::AminoAcid;
pub const BLOSUM45: &[[i8; AminoAcid::TOTAL_NUMBER]; AminoAcid::TOTAL_NUMBER] =
include!("matrices/blosum45.txt");
pub const BLOSUM50: &[[i8; AminoAcid::TOTAL_NUMBER]; AminoAcid::TOTAL_NUMBER] =
include!("matrices/blosum50.txt");
pub const BLOSUM62: &[[i8; AminoAcid::TOTAL_NUMBER]; AminoAcid::TOTAL_NUMBER] =
include!("matrices/blosum62.txt");
pub const BLOSUM80: &[[i8; AminoAcid::TOTAL_NUMBER]; AminoAcid::TOTAL_NUMBER] =
include!("matrices/blosum80.txt");
pub const BLOSUM90: &[[i8; AminoAcid::TOTAL_NUMBER]; AminoAcid::TOTAL_NUMBER] =
include!("matrices/blosum90.txt");
pub const IDENTITY: &[[i8; AminoAcid::TOTAL_NUMBER]; AminoAcid::TOTAL_NUMBER] =
include!("matrices/identity.txt");
pub const PAM30: &[[i8; AminoAcid::TOTAL_NUMBER]; AminoAcid::TOTAL_NUMBER] =
include!("matrices/pam30.txt");
pub const PAM70: &[[i8; AminoAcid::TOTAL_NUMBER]; AminoAcid::TOTAL_NUMBER] =
include!("matrices/pam70.txt");
pub const PAM250: &[[i8; AminoAcid::TOTAL_NUMBER]; AminoAcid::TOTAL_NUMBER] =
include!("matrices/pam250.txt");
}