mod bounds;
mod chirality;
mod knowledge;
mod matrix;
mod perceive;
mod smooth;
mod torsion_prefs;
mod torsion_tables;
mod uff;
use molrs::error::MolRsError;
use molrs::system::atomistic::Atomistic;
pub use chirality::{ChiralConstraint, ChiralSign, ImproperConstraint};
pub use knowledge::KnowledgeTorsion;
pub use matrix::BoundsMatrix;
pub use smooth::{smooth_bounds, smooth_bounds_tol};
pub use torsion_prefs::{AssignedTorsion, TorsionConstraint, TorsionTable, assign_with_provenance};
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum EtkdgVersion {
Etdg,
Etkdgv2,
Etkdgv3,
}
pub struct DgConstraints {
pub bounds: BoundsMatrix,
pub experimental_torsions: Vec<TorsionConstraint>,
pub flat_ring_torsions: Vec<KnowledgeTorsion>,
pub chiral: Vec<ChiralConstraint>,
pub improper: Vec<ImproperConstraint>,
}
pub fn experimental_torsions_with_provenance(mol: &Atomistic) -> Vec<AssignedTorsion> {
let p = perceive::perceive(mol);
assign_with_provenance(mol, &p)
}
pub fn build_bounds(mol: &Atomistic) -> Result<BoundsMatrix, MolRsError> {
let n = mol.n_atoms();
if n == 0 {
return Err(MolRsError::validation("molecule has no atoms"));
}
let p = perceive::perceive(mol);
Ok(bounds::set_topol_bounds(&p))
}
pub fn build_constraints(
mol: &Atomistic,
version: EtkdgVersion,
) -> Result<DgConstraints, MolRsError> {
let n = mol.n_atoms();
if n == 0 {
return Err(MolRsError::validation("molecule has no atoms"));
}
let p = perceive::perceive(mol);
let mut bounds = bounds::set_topol_bounds(&p);
smooth::smooth_bounds(&mut bounds)?;
let (experimental_torsions, flat_ring_torsions, chiral, improper) = match version {
EtkdgVersion::Etdg => (Vec::new(), Vec::new(), Vec::new(), Vec::new()),
EtkdgVersion::Etkdgv2 | EtkdgVersion::Etkdgv3 => (
torsion_prefs::assign_experimental_torsions(mol, &p),
knowledge::build_flat_ring_torsions(&p),
chirality::build_chiral(mol, &p),
chirality::build_improper(&p),
),
};
Ok(DgConstraints {
bounds,
experimental_torsions,
flat_ring_torsions,
chiral,
improper,
})
}