1use rdkit_ffi::rd;
2use super::molecule;
3
4pub struct MCSResult {
5 pub rd_mcsr: cxx::UniquePtr<rd::MCSResult>
6 }
8
9impl MCSResult {
10 pub fn find_mcs(mols: &Vec<molecule::Molecule>) -> Self {
11 let mol_vec = rd::ROMolPtrVec_new();
12 for mol in mols.iter() {
13 rd::ROMolPtrVec_emplace_back(&mol_vec, &mol.rd_mol)
14 }
15
16 let rd_mcsr = rd::FMCS_find_mcs(&mol_vec);
17 return Self { rd_mcsr }
18 }
19
20 pub fn num_atoms(&self) -> u32 { rd::MCSResult_num_atoms(&self.rd_mcsr) }
21 pub fn num_bonds(&self) -> u32 { rd::MCSResult_num_bonds(&self.rd_mcsr) }
22 pub fn smarts_string(&self) -> String {
23 rd::MCSResult_smarts_string(&self.rd_mcsr).to_string_lossy().into_owned()
24 }
25}
26
27#[cfg(test)]
28mod test_mod_query {
29 use super::*;
30
31 #[test]
32 fn test_fmcs() {
33 let smiles_vec = vec![
34 "O=C(NCc1cc(OC)c(O)cc1)CCCC/C=C/C(C)C",
35 "CC(C)CCCCCC(=O)NCC1=CC(=C(C=C1)O)OC",
36 "c1(C=O)cc(OC)c(O)cc1"
37 ];
38 let mols: Vec<molecule::Molecule> = smiles_vec
39 .iter()
40 .map(|smiles| molecule::Molecule::new_from_smiles(smiles))
41 .collect();
42 let mcrs = MCSResult::find_mcs(&mols);
43 assert_eq!(mcrs.num_atoms(), 10);
44 assert_eq!(mcrs.num_bonds(), 10);
45 assert_eq!(mcrs.smarts_string(), "[#6]1(-[#6]):[#6]:[#6](-[#8]-[#6]):[#6](:[#6]:[#6]:1)-[#8]");
46 }
47}