use crate::records::Atom;
pub const WATER_RESIDUES: &[&str] = &["HOH", "WAT", "H2O", "DOD", "TIP", "TIP3"];
pub const STANDARD_AMINO_ACIDS: &[&str] = &[
"ALA", "ARG", "ASN", "ASP", "CYS", "GLN", "GLU", "GLY", "HIS", "ILE", "LEU", "LYS", "MET",
"PHE", "PRO", "SER", "THR", "TRP", "TYR", "VAL",
];
pub const STANDARD_NUCLEOTIDES: &[&str] = &[
"A", "C", "G", "U", "DA", "DC", "DG", "DT", ];
pub const COMMON_IONS: &[&str] = &[
"NA", "CL", "MG", "ZN", "CA", "FE", "MN", "CO", "CU", "K", "NI", "CD", "HG",
];
#[inline]
pub fn is_water(residue_name: &str) -> bool {
let name = residue_name.trim();
WATER_RESIDUES.contains(&name)
}
#[inline]
pub fn is_standard_amino_acid(residue_name: &str) -> bool {
STANDARD_AMINO_ACIDS.contains(&residue_name.trim())
}
#[inline]
pub fn is_standard_nucleotide(residue_name: &str) -> bool {
STANDARD_NUCLEOTIDES.contains(&residue_name.trim())
}
#[inline]
pub fn is_standard_residue(residue_name: &str) -> bool {
is_standard_amino_acid(residue_name) || is_standard_nucleotide(residue_name)
}
#[inline]
pub fn is_protein_atom(atom: &Atom) -> bool {
!atom.is_hetatm && is_standard_amino_acid(&atom.residue_name)
}
#[inline]
pub fn is_ligand_atom(atom: &Atom) -> bool {
atom.is_hetatm && !is_water(&atom.residue_name)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_is_water() {
assert!(is_water("HOH"));
assert!(is_water("WAT"));
assert!(is_water("H2O"));
assert!(is_water("DOD"));
assert!(is_water("TIP"));
assert!(is_water("TIP3"));
assert!(!is_water("ALA"));
assert!(!is_water("LIG"));
}
#[test]
fn test_is_standard_amino_acid() {
assert!(is_standard_amino_acid("ALA"));
assert!(is_standard_amino_acid("GLY"));
assert!(is_standard_amino_acid(" ALA "));
assert!(!is_standard_amino_acid("HOH"));
assert!(!is_standard_amino_acid("ATP"));
assert!(!is_standard_amino_acid("SEC"));
assert!(!is_standard_amino_acid("PYL"));
}
#[test]
fn test_is_standard_nucleotide() {
assert!(is_standard_nucleotide("A"));
assert!(is_standard_nucleotide("DA"));
assert!(!is_standard_nucleotide("ALA"));
}
#[test]
fn test_is_standard_residue() {
assert!(is_standard_residue("ALA"));
assert!(is_standard_residue("A"));
assert!(!is_standard_residue("HOH"));
}
#[test]
fn test_is_protein_atom() {
let protein = Atom {
serial: 1,
name: "CA".to_string(),
alt_loc: None,
residue_name: "ALA".to_string(),
chain_id: "A".to_string(),
residue_seq: 1,
ins_code: None,
is_hetatm: false,
x: 0.0,
y: 0.0,
z: 0.0,
occupancy: 1.0,
temp_factor: 20.0,
element: "C".to_string(),
};
assert!(is_protein_atom(&protein));
let hetatm = Atom {
is_hetatm: true,
residue_name: "MSE".to_string(),
..protein.clone()
};
assert!(!is_protein_atom(&hetatm));
}
#[test]
fn test_is_ligand_atom() {
let ligand = Atom {
serial: 1,
name: "C1".to_string(),
alt_loc: None,
residue_name: "LIG".to_string(),
chain_id: "A".to_string(),
residue_seq: 100,
ins_code: None,
is_hetatm: true,
x: 0.0,
y: 0.0,
z: 0.0,
occupancy: 1.0,
temp_factor: 20.0,
element: "C".to_string(),
};
assert!(is_ligand_atom(&ligand));
let water = Atom {
residue_name: "HOH".to_string(),
..ligand.clone()
};
assert!(!is_ligand_atom(&water));
}
}