#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
pub enum ProteinScheme {
#[default]
AmberFFSB,
AmberFF03,
Charmm,
}
impl ProteinScheme {
pub(crate) const fn key(self) -> &'static str {
match self {
Self::AmberFFSB => "amber-ffsb",
Self::AmberFF03 => "amber-ff03",
Self::Charmm => "charmm",
}
}
pub const fn all() -> &'static [Self] {
&[Self::AmberFFSB, Self::AmberFF03, Self::Charmm]
}
pub fn charge(self, pos: crate::Position, residue: &str, atom: &str) -> Option<f32> {
crate::generated::get_protein_charge(self.key(), pos.key(), residue, atom)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default() {
assert_eq!(ProteinScheme::default(), ProteinScheme::AmberFFSB);
}
#[test]
fn count() {
assert_eq!(ProteinScheme::all().len(), 3);
}
#[test]
fn key_format() {
for s in ProteinScheme::all() {
let k = s.key();
assert!(
k.chars()
.all(|c| c.is_ascii_lowercase() || c == '-' || c.is_ascii_digit())
);
}
}
}