rdkit_rs/
query.rs

1use rdkit_ffi::rd;
2use super::molecule;
3
4pub struct MCSResult {
5    pub rd_mcsr: cxx::UniquePtr<rd::MCSResult>
6    // pub mol_vec: cxx::UniquePtr<rd::ROMolPtrVec>
7}
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}