#![allow(clippy::type_complexity)]
use crate::ff::forcefield::ForceField;
use crate::ff::potential::{Potentials, intramolecular_pairs};
use molrs::Atomistic;
use super::Typifier;
pub(crate) mod classify;
pub(crate) mod frame_builder;
pub mod params;
#[cfg(test)]
mod tests;
pub use params::{MMFFAtomProp, MMFFParams};
pub struct MMFFTypifier {
params: MMFFParams,
ff: ForceField,
}
impl MMFFTypifier {
pub fn from_xml_str(xml: &str) -> Result<Self, String> {
let params = crate::ff::forcefield::xml::read_mmff_params_xml_str(xml)?;
let ff = crate::ff::forcefield::xml::read_forcefield_xml_str(xml)?;
Ok(Self { params, ff })
}
pub fn mmff94() -> Result<Self, String> {
Self::from_xml_str(molrs::data::MMFF94_XML)
}
pub fn params(&self) -> &MMFFParams {
&self.params
}
pub fn ff(&self) -> &ForceField {
&self.ff
}
pub fn typify(&self, mol: &Atomistic) -> Result<Atomistic, String> {
frame_builder::annotate_mmff(mol, &self.params)
}
pub fn build(&self, mol: &Atomistic) -> Result<Potentials, String> {
let mut frame = self.typify(mol)?.to_frame();
let pairs = intramolecular_pairs(&frame);
frame.insert("pairs", pairs);
self.ff.to_potentials(&frame)
}
pub fn typify_bond(&self, t1: u32, t2: u32, bond_order: f64) -> u32 {
classify::typify_bond(t1, t2, bond_order, &self.params)
}
pub fn typify_angle(&self, bt_ij: u32, bt_jk: u32) -> u32 {
classify::typify_angle(bt_ij, bt_jk)
}
pub fn typify_dihedral(&self, bt_ij: u32, bt_jk: u32, bt_kl: u32) -> u32 {
classify::typify_dihedral(bt_ij, bt_jk, bt_kl)
}
}
impl Typifier for MMFFTypifier {
type Mol = Atomistic;
fn typify(&self, mol: &Atomistic) -> Result<Atomistic, String> {
MMFFTypifier::typify(self, mol)
}
}