rdkit 0.4.12

High level RDKit functionality for rust
Documentation
use std::collections::HashMap;

use rdkit::{Properties, ROMol};

#[test]
fn test_a_thing() {
    let mol = ROMol::from_smiles("c1ccccc1C(=O)NC").unwrap();
    let properties = Properties::new();
    let computed: HashMap<String, f64> = properties.compute_properties(&mol);
    assert_eq!(*computed.get("NumAtoms").unwrap(), 19.0);
}

#[test]
fn test_computing_properties() {
    let smiles = "CCOC(=O)C(C)(C)OC1=CC=C(C=C1)Cl.CO.C1=CC(=CC=C1C(=O)N[C@@H](CCC(=O)O)C(=O)O)NCC2=CN=C3C(=N2)C(=O)NC(=N3)N";
    let romol = ROMol::from_smiles(smiles).unwrap();

    let properties = Properties::new();

    let computed = properties.compute_properties(&romol);

    let expected = vec![
        ("NumAtoms", 88.0),
        ("chi1n", 14.854760794353165),
        ("chi2n", 6.31077807123148),
        ("kappa3", 12.661143750192025),
        ("NumAtomStereoCenters", 1.0),
        ("NumSaturatedRings", 0.0),
        ("CrippenMR", 182.82939999999977),
        ("NumAliphaticRings", 0.0),
        ("chi0v", 28.35419311110654),
        ("NumHeterocycles", 2.0),
        ("tpsa", 269.03999999999996),
        ("lipinskiHBA", 17.0),
        ("NumRings", 4.0),
        ("chi1v", 15.232725267362392),
        ("chi2v", 6.5627543865709645),
        ("amw", 716.1479999999998),
        ("NumAliphaticHeterocycles", 0.0),
        ("chi0n", 27.598264165088082),
        ("chi4n", 3.8988182639091344),
        ("NumSaturatedHeterocycles", 0.0),
        ("chi3v", 6.5627543865709645),
        ("chi3n", 6.31077807123148),
        ("FractionCSP3", 0.3125),
        ("NumBridgeheadAtoms", 0.0),
        ("kappa1", 40.36507158313297),
        ("kappa2", 19.253316231719992),
        ("Phi", 15.54322975812147),
        ("lipinskiHBD", 8.0),
        ("exactmw", 715.2368680959999),
        ("NumRotatableBonds", 13.0),
        ("NumAromaticHeterocycles", 2.0),
        ("CrippenClogP", 2.6242),
        ("NumHBD", 7.0),
        ("NumHeavyAtoms", 50.0),
        ("NumHBA", 13.0),
        ("NumAmideBonds", 1.0),
        ("NumAromaticRings", 4.0),
        ("NumUnspecifiedAtomStereoCenters", 0.0),
        ("chi4v", 4.024806421578876),
        ("NumHeteroatoms", 18.0),
        ("NumSpiroAtoms", 0.0),
        ("hallKierAlpha", -5.8100000000000005),
        ("labuteASA", 290.3869834026883),
    ];

    let mut expected = expected
        .iter()
        .map(|(k, v)| (k.to_string(), format!("{:.3}", *v)))
        .collect::<Vec<_>>();
    let mut computed = computed
        .into_iter()
        .map(|(k, v)| (k.to_string(), format!("{:.3}", v)))
        .collect::<Vec<_>>();

    expected.sort_by(|(k1, _), (k2, _)| k1.cmp(k2));
    computed.sort_by(|(k1, _), (k2, _)| k1.cmp(k2));

    assert_eq!(expected, computed);
}