use super::perceive::{Hybridization, Perceived};
#[derive(Clone, Debug)]
pub struct KnowledgeTorsion {
pub atoms: [usize; 4],
pub signs: [i8; 6],
pub force_constants: [f64; 6],
}
pub fn build_flat_ring_torsions(p: &Perceived) -> Vec<KnowledgeTorsion> {
let mut out = Vec::new();
let mut done_bonds: std::collections::HashSet<(usize, usize)> =
std::collections::HashSet::new();
for ring in &p.ring_idx {
let rsize = ring.len();
if !(4..=6).contains(&rsize) {
continue;
}
for i in 0..rsize {
let aid1 = ring[i];
let aid2 = ring[(i + 1) % rsize];
let aid3 = ring[(i + 2) % rsize];
let aid4 = ring[(i + 3) % rsize];
let bond_key = if aid2 < aid3 {
(aid2, aid3)
} else {
(aid3, aid2)
};
let all_sp2 = [aid1, aid2, aid3, aid4]
.iter()
.all(|&a| p.atoms[a].hybridization == Hybridization::Sp2);
if all_sp2 && !done_bonds.contains(&bond_key) {
done_bonds.insert(bond_key);
let mut signs = [1i8; 6];
signs[1] = -1; let mut fconsts = [0.0; 6];
fconsts[1] = 100.0; out.push(KnowledgeTorsion {
atoms: [aid1, aid2, aid3, aid4],
signs,
force_constants: fconsts,
});
}
}
}
out
}