diff --git a/examples/tautomer_enumerator.rs b/examples/tautomer_enumerator_example.rs similarity index 100% rename from examples/tautomer_enumerator.rs rename to examples/tautomer_enumerator_example.rs diff --git a/rdkit-sys/src/bridge/ro_mol.rs b/rdkit-sys/src/bridge/ro_mol.rs index daf365d..35085f3 100644 --- a/rdkit-sys/src/bridge/ro_mol.rs +++ b/rdkit-sys/src/bridge/ro_mol.rs @@ -18,6 +18,7 @@ pub mod ffi { include!("wrapper/include/ro_mol.h"); pub type ROMol; + pub type ExplicitBitVect = crate::fingerprint_ffi::ExplicitBitVect; pub type SmilesParserParams; pub type Atom; diff --git a/rdkit-sys/src/bridge/scaffold_network.rs b/rdkit-sys/src/bridge/scaffold_network.rs index 5ba705e..e72ac00 100644 --- a/rdkit-sys/src/bridge/scaffold_network.rs +++ b/rdkit-sys/src/bridge/scaffold_network.rs @@ -1,43 +1,94 @@ +use cxx::{ExternType, SharedPtr}; + #[cxx::bridge(namespace = "RDKit")] pub mod ffi { + unsafe extern "C++" { include!("wrapper/include/scaffold_network.h"); - pub type ScaffoldNetworkParams; - // - // pub fn default_scaffold_network_params() -> SharedPtr; + pub type ROMol = crate::ro_mol_ffi::ROMol; + pub type ScaffoldNetworkParamsLocal; - pub fn default_scaffold_network_params() -> SharedPtr; + pub fn default_scaffold_network_params() -> SharedPtr; pub fn new_scaffold_network_params( bond_breaker_smarts: &Vec, - ) -> SharedPtr; + ) -> SharedPtr; pub fn set_include_generic_scaffolds( - params: &mut SharedPtr, + params: &mut SharedPtr, input: bool, ); - pub fn include_generic_bond_scaffolds( - params: &mut SharedPtr, + pub fn set_include_generic_bond_scaffolds( + params: &mut SharedPtr, input: bool, ); - pub fn include_scaffolds_without_attachments( - params: &mut SharedPtr, + pub fn set_include_scaffolds_without_attachments( + params: &mut SharedPtr, input: bool, ); - pub fn include_scaffolds_with_attachments( - params: &mut SharedPtr, + pub fn set_include_scaffolds_with_attachments( + params: &mut SharedPtr, input: bool, ); - pub fn keep_only_first_fragment(params: &mut SharedPtr, input: bool); - pub fn prune_before_fragmenting(params: &mut SharedPtr, input: bool); - pub fn flatten_isotopes(params: &mut SharedPtr, input: bool); - pub fn flatten_chirality(params: &mut SharedPtr, input: bool); - pub fn flatten_keep_largest(params: &mut SharedPtr, input: bool); - pub fn collect_mol_counts(params: &mut SharedPtr, input: bool); + pub fn set_keep_only_first_fragment( + params: &mut SharedPtr, + input: bool, + ); + pub fn set_prune_before_fragmenting( + params: &mut SharedPtr, + input: bool, + ); + pub fn set_flatten_isotopes( + params: &mut SharedPtr, + input: bool, + ); + pub fn set_flatten_chirality( + params: &mut SharedPtr, + input: bool, + ); + pub fn set_flatten_keep_largest( + params: &mut SharedPtr, + input: bool, + ); + pub fn set_collect_mol_counts( + params: &mut SharedPtr, + input: bool, + ); + + pub fn get_include_generic_scaffolds( + params: &SharedPtr, + ) -> bool; + pub fn get_include_generic_bond_scaffolds( + params: &SharedPtr, + ) -> bool; + pub fn get_include_scaffolds_without_attachments( + params: &SharedPtr, + ) -> bool; + pub fn get_include_scaffolds_with_attachments( + params: &SharedPtr, + ) -> bool; + pub fn get_keep_only_first_fragment(params: &SharedPtr) + -> bool; + pub fn get_prune_before_fragmenting(params: &SharedPtr) + -> bool; + pub fn get_flatten_isotopes(params: &SharedPtr) -> bool; + pub fn get_flatten_chirality(params: &SharedPtr) -> bool; + pub fn get_flatten_keep_largest(params: &SharedPtr) -> bool; + pub fn get_collect_mol_counts(params: &SharedPtr) -> bool; pub type ScaffoldNetworkClass; pub fn default_scaffold_network() -> SharedPtr; + pub fn create_scaffold_network( + mol: &SharedPtr, + scaffold_network_params: &SharedPtr, + ) -> SharedPtr; + + pub fn update_scaffold_network( + mol: &SharedPtr, + scaffold_network: &mut SharedPtr, + scaffold_network_params: &SharedPtr, + ); } } diff --git a/rdkit-sys/tests/test_atoms.rs b/rdkit-sys/tests/test_atoms.rs index b46da68..f5d9d5c 100644 --- a/rdkit-sys/tests/test_atoms.rs +++ b/rdkit-sys/tests/test_atoms.rs @@ -1,7 +1,7 @@ #[test] fn test_atoms() { cxx::let_cxx_string!(smiles = "c1ccccc1CCCCCCCC"); - let romol = rdkit_sys::ro_mol_ffi::smiles_to_mol(&smiles).unwrap(); + let mut romol = rdkit_sys::ro_mol_ffi::smiles_to_mol(&smiles).unwrap(); let num_atoms = rdkit_sys::ro_mol_ffi::get_num_atoms(&romol, true); diff --git a/rdkit-sys/tests/test_scaffold_network.rs b/rdkit-sys/tests/test_scaffold_network.rs index 9819a4d..4db8af8 100644 --- a/rdkit-sys/tests/test_scaffold_network.rs +++ b/rdkit-sys/tests/test_scaffold_network.rs @@ -1,3 +1,4 @@ +use cxx::let_cxx_string; use rdkit_sys::scaffold_network_ffi::*; #[test] @@ -6,15 +7,30 @@ fn test_scaffold_network() { let mut params = new_scaffold_network_params(&vec![]); set_include_generic_scaffolds(&mut params, true); - include_generic_bond_scaffolds(&mut params, true); - include_scaffolds_without_attachments(&mut params, true); - include_scaffolds_with_attachments(&mut params, true); - keep_only_first_fragment(&mut params, true); - prune_before_fragmenting(&mut params, true); - flatten_isotopes(&mut params, true); - flatten_chirality(&mut params, true); - flatten_keep_largest(&mut params, true); - collect_mol_counts(&mut params, true); + set_include_generic_bond_scaffolds(&mut params, true); + set_include_scaffolds_without_attachments(&mut params, true); + set_include_scaffolds_with_attachments(&mut params, true); + set_keep_only_first_fragment(&mut params, true); + set_prune_before_fragmenting(&mut params, true); + set_flatten_isotopes(&mut params, true); + set_flatten_chirality(&mut params, true); + set_flatten_keep_largest(&mut params, true); + set_collect_mol_counts(&mut params, true); - let _scaffold_network = default_scaffold_network(); + get_include_generic_scaffolds(¶ms); + get_include_generic_bond_scaffolds(¶ms); + get_include_scaffolds_without_attachments(¶ms); + get_include_scaffolds_with_attachments(¶ms); + get_keep_only_first_fragment(¶ms); + get_prune_before_fragmenting(¶ms); + get_flatten_isotopes(¶ms); + get_flatten_chirality(¶ms); + get_flatten_keep_largest(¶ms); + get_collect_mol_counts(¶ms); + + let mut scaffold_network = default_scaffold_network(); + let_cxx_string!(smiles = "CCC"); + let mol = rdkit_sys::ro_mol_ffi::smiles_to_mol(&smiles).unwrap(); + + update_scaffold_network(&mol, &mut scaffold_network, ¶ms); } diff --git a/rdkit-sys/wrapper/include/ro_mol.h b/rdkit-sys/wrapper/include/ro_mol.h index 84c9d1e..5e44dd7 100644 --- a/rdkit-sys/wrapper/include/ro_mol.h +++ b/rdkit-sys/wrapper/include/ro_mol.h @@ -9,6 +9,8 @@ #include namespace RDKit { + using ROMolSharedPtr = std::shared_ptr; + std::shared_ptr copy_mol(const std::shared_ptr &mol); std::shared_ptr smiles_to_mol(const std::string &smiles); rust::String mol_to_smiles(const std::shared_ptr &mol); diff --git a/rdkit-sys/wrapper/include/scaffold_network.h b/rdkit-sys/wrapper/include/scaffold_network.h index 68c51cc..d754910 100644 --- a/rdkit-sys/wrapper/include/scaffold_network.h +++ b/rdkit-sys/wrapper/include/scaffold_network.h @@ -5,23 +5,46 @@ #include namespace RDKit { - using ScaffoldNetworkParams = ScaffoldNetwork::ScaffoldNetworkParams; - - std::shared_ptr default_scaffold_network_params(); - std::shared_ptr new_scaffold_network_params(const rust::Vec &bondBreakersSmarts); - - void set_include_generic_scaffolds(std::shared_ptr ¶ms, bool input); - void include_generic_bond_scaffolds(std::shared_ptr ¶ms, bool input); - void include_scaffolds_without_attachments(std::shared_ptr ¶ms, bool input); - void include_scaffolds_with_attachments(std::shared_ptr ¶ms, bool input); - void keep_only_first_fragment(std::shared_ptr ¶ms, bool input); - void prune_before_fragmenting(std::shared_ptr ¶ms, bool input); - void flatten_isotopes(std::shared_ptr ¶ms, bool input); - void flatten_chirality(std::shared_ptr ¶ms, bool input); - void flatten_keep_largest(std::shared_ptr ¶ms, bool input); - void collect_mol_counts(std::shared_ptr ¶ms, bool input); + using ScaffoldNetworkParamsLocal = ScaffoldNetwork::ScaffoldNetworkParams; + + std::shared_ptr default_scaffold_network_params(); + std::shared_ptr new_scaffold_network_params(const rust::Vec &bondBreakersSmarts); + + void set_include_generic_scaffolds(std::shared_ptr ¶ms, bool input); + void set_include_generic_bond_scaffolds(std::shared_ptr ¶ms, bool input); + void set_include_scaffolds_without_attachments(std::shared_ptr ¶ms, bool input); + void set_include_scaffolds_with_attachments(std::shared_ptr ¶ms, bool input); + void set_keep_only_first_fragment(std::shared_ptr ¶ms, bool input); + void set_prune_before_fragmenting(std::shared_ptr ¶ms, bool input); + void set_flatten_isotopes(std::shared_ptr ¶ms, bool input); + void set_flatten_chirality(std::shared_ptr ¶ms, bool input); + void set_flatten_keep_largest(std::shared_ptr ¶ms, bool input); + void set_collect_mol_counts(std::shared_ptr ¶ms, bool input); + + bool get_include_generic_scaffolds(const std::shared_ptr ¶ms); + bool get_include_generic_bond_scaffolds(const std::shared_ptr ¶ms); + bool get_include_scaffolds_without_attachments(const std::shared_ptr ¶ms); + bool get_include_scaffolds_with_attachments(const std::shared_ptr ¶ms); + bool get_keep_only_first_fragment(const std::shared_ptr ¶ms); + bool get_prune_before_fragmenting(const std::shared_ptr ¶ms); + bool get_flatten_isotopes(const std::shared_ptr ¶ms); + bool get_flatten_chirality(const std::shared_ptr ¶ms); + bool get_flatten_keep_largest(const std::shared_ptr ¶ms); + bool get_collect_mol_counts(const std::shared_ptr ¶ms); using ScaffoldNetworkClass = ScaffoldNetwork::ScaffoldNetwork; std::shared_ptr default_scaffold_network(); + + std::shared_ptr create_scaffold_network(const std::shared_ptr &mol, const std::shared_ptr &scaffold_network_params) { + throw std::invalid_argument("sup"); + } + + void update_scaffold_network(const std::shared_ptr &mol, std::shared_ptr &scaffold_network, const std::shared_ptr &scaffold_network_params); + +// pub fn update_scaffold_network( +// mol: &SharedPtr, +// scaffold_network: &mut SharedPtr, +// scaffold_network_params: &SharedPtr, +// ); } \ No newline at end of file diff --git a/rdkit-sys/wrapper/src/scaffold_network.cc b/rdkit-sys/wrapper/src/scaffold_network.cc index 601e798..d1d24a2 100644 --- a/rdkit-sys/wrapper/src/scaffold_network.cc +++ b/rdkit-sys/wrapper/src/scaffold_network.cc @@ -25,39 +25,39 @@ namespace RDKit { params->includeGenericScaffolds = input; } - void include_generic_bond_scaffolds(std::shared_ptr ¶ms, bool input) { + void set_include_generic_bond_scaffolds(std::shared_ptr ¶ms, bool input) { params->includeGenericBondScaffolds = input; } - void include_scaffolds_without_attachments(std::shared_ptr ¶ms, bool input) { + void set_include_scaffolds_without_attachments(std::shared_ptr ¶ms, bool input) { params->includeScaffoldsWithoutAttachments = input; } - void include_scaffolds_with_attachments(std::shared_ptr ¶ms, bool input) { + void set_include_scaffolds_with_attachments(std::shared_ptr ¶ms, bool input) { params->includeScaffoldsWithAttachments = input; } - void keep_only_first_fragment(std::shared_ptr ¶ms, bool input) { + void set_keep_only_first_fragment(std::shared_ptr ¶ms, bool input) { params->keepOnlyFirstFragment = input; } - void prune_before_fragmenting(std::shared_ptr ¶ms, bool input) { + void set_prune_before_fragmenting(std::shared_ptr ¶ms, bool input) { params->pruneBeforeFragmenting = input; } - void flatten_isotopes(std::shared_ptr ¶ms, bool input) { + void set_flatten_isotopes(std::shared_ptr ¶ms, bool input) { params->flattenIsotopes = input; } - void flatten_chirality(std::shared_ptr ¶ms, bool input) { + void set_flatten_chirality(std::shared_ptr ¶ms, bool input) { params->flattenChirality = input; } - void flatten_keep_largest(std::shared_ptr ¶ms, bool input) { + void set_flatten_keep_largest(std::shared_ptr ¶ms, bool input) { params->flattenKeepLargest = input; } - void collect_mol_counts(std::shared_ptr ¶ms, bool input) { + void set_collect_mol_counts(std::shared_ptr ¶ms, bool input) { params->collectMolCounts = input; } @@ -68,4 +68,41 @@ namespace RDKit { return std::shared_ptr(scaffold_network); } + bool get_include_generic_scaffolds(const std::shared_ptr ¶ms) { + return params->includeGenericScaffolds; + } + bool get_include_generic_bond_scaffolds(const std::shared_ptr ¶ms) { + return params->includeGenericBondScaffolds; + } + bool get_include_scaffolds_without_attachments(const std::shared_ptr ¶ms) { + return params->includeScaffoldsWithoutAttachments; + } + bool get_include_scaffolds_with_attachments(const std::shared_ptr ¶ms) { + return params->includeScaffoldsWithAttachments; + } + bool get_keep_only_first_fragment(const std::shared_ptr ¶ms) { + return params->keepOnlyFirstFragment; + } + bool get_prune_before_fragmenting(const std::shared_ptr ¶ms) { + return params->pruneBeforeFragmenting; + } + bool get_flatten_isotopes(const std::shared_ptr ¶ms) { + return params->flattenIsotopes; + } + bool get_flatten_chirality(const std::shared_ptr ¶ms) { + return params->flattenChirality; + } + bool get_flatten_keep_largest(const std::shared_ptr ¶ms) { + return params->flattenKeepLargest; + } + bool get_collect_mol_counts(const std::shared_ptr ¶ms) { + return params->collectMolCounts; + } + + void update_scaffold_network(const std::shared_ptr &mol, std::shared_ptr &scaffold_network, const std::shared_ptr &scaffold_network_params) { + std::vector mols; + mols.push_back(*mol); + ScaffoldNetwork::updateScaffoldNetwork(&mols, *scaffold_network, *scaffold_network_params); + } + } \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index 01adaa4..afe9e4c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -16,6 +16,9 @@ pub use mol_standardize::*; mod periodic_table; pub use periodic_table::*; +mod scaffold_network; +pub use scaffold_network::*; + mod substruct_match; pub use substruct_match::*; diff --git a/src/scaffold_network/mod.rs b/src/scaffold_network/mod.rs new file mode 100644 index 0000000..59cdbb3 --- /dev/null +++ b/src/scaffold_network/mod.rs @@ -0,0 +1,5 @@ +mod scaffold_network; +pub use scaffold_network::*; + +mod scaffold_network_params; +pub use scaffold_network_params::*; diff --git a/src/scaffold_network/scaffold_network.rs b/src/scaffold_network/scaffold_network.rs new file mode 100644 index 0000000..3d57a9d --- /dev/null +++ b/src/scaffold_network/scaffold_network.rs @@ -0,0 +1,19 @@ +use cxx::SharedPtr; + +pub struct ScaffoldNetwork { + ptr: SharedPtr, +} + +impl Default for ScaffoldNetwork { + fn default() -> Self { + Self { + ptr: rdkit_sys::scaffold_network_ffi::default_scaffold_network(), + } + } +} + +impl ScaffoldNetwork { + pub fn new() -> Self { + Self::default() + } +} diff --git a/src/scaffold_network/scaffold_network_params.rs b/src/scaffold_network/scaffold_network_params.rs new file mode 100644 index 0000000..9d31c3a --- /dev/null +++ b/src/scaffold_network/scaffold_network_params.rs @@ -0,0 +1,109 @@ +use cxx::SharedPtr; + +pub struct ScaffoldNetworkParams { + ptr: SharedPtr, +} + +impl Default for ScaffoldNetworkParams { + fn default() -> Self { + let ptr = rdkit_sys::scaffold_network_ffi::default_scaffold_network_params(); + Self { ptr } + } +} + +impl ScaffoldNetworkParams { + pub fn new() -> Self { + Self::default() + } + + pub fn new_with_bond_breakers(bond_breaker_smarts: &Vec) -> Self { + let ptr = rdkit_sys::scaffold_network_ffi::new_scaffold_network_params(bond_breaker_smarts); + Self { ptr } + } + + pub fn set_include_generic_scaffolds(&mut self, input: bool) { + rdkit_sys::scaffold_network_ffi::set_include_generic_scaffolds(&mut self.ptr, input); + } + + pub fn set_include_generic_bond_scaffolds(&mut self, input: bool) { + rdkit_sys::scaffold_network_ffi::set_include_generic_bond_scaffolds(&mut self.ptr, input); + } + + pub fn set_include_scaffolds_without_attachments(&mut self, input: bool) { + rdkit_sys::scaffold_network_ffi::set_include_scaffolds_without_attachments( + &mut self.ptr, + input, + ); + } + + pub fn set_include_scaffolds_with_attachments(&mut self, input: bool) { + rdkit_sys::scaffold_network_ffi::set_include_scaffolds_with_attachments( + &mut self.ptr, + input, + ); + } + + pub fn set_keep_only_first_fragment(&mut self, input: bool) { + rdkit_sys::scaffold_network_ffi::set_keep_only_first_fragment(&mut self.ptr, input); + } + + pub fn set_prune_before_fragmenting(&mut self, input: bool) { + rdkit_sys::scaffold_network_ffi::set_prune_before_fragmenting(&mut self.ptr, input); + } + + pub fn set_flatten_isotopes(&mut self, input: bool) { + rdkit_sys::scaffold_network_ffi::set_flatten_isotopes(&mut self.ptr, input); + } + + pub fn set_flatten_chirality(&mut self, input: bool) { + rdkit_sys::scaffold_network_ffi::set_flatten_chirality(&mut self.ptr, input); + } + + pub fn set_flatten_keep_largest(&mut self, input: bool) { + rdkit_sys::scaffold_network_ffi::set_flatten_keep_largest(&mut self.ptr, input); + } + + pub fn set_collect_mol_counts(&mut self, input: bool) { + rdkit_sys::scaffold_network_ffi::set_collect_mol_counts(&mut self.ptr, input); + } + + pub fn get_include_generic_scaffolds(&self) -> bool { + rdkit_sys::scaffold_network_ffi::get_include_generic_scaffolds(&self.ptr) + } + + pub fn get_include_generic_bond_scaffolds(&self) -> bool { + rdkit_sys::scaffold_network_ffi::get_include_generic_bond_scaffolds(&self.ptr) + } + + pub fn get_include_scaffolds_without_attachments(&self) -> bool { + rdkit_sys::scaffold_network_ffi::get_include_scaffolds_without_attachments(&self.ptr) + } + + pub fn get_include_scaffolds_with_attachments(&self) -> bool { + rdkit_sys::scaffold_network_ffi::get_include_scaffolds_with_attachments(&self.ptr) + } + + pub fn get_keep_only_first_fragment(&self) -> bool { + rdkit_sys::scaffold_network_ffi::get_keep_only_first_fragment(&self.ptr) + } + + pub fn get_prune_before_fragmenting(&self) -> bool { + rdkit_sys::scaffold_network_ffi::get_prune_before_fragmenting(&self.ptr) + } + + pub fn get_flatten_isotopes(&self) -> bool { + rdkit_sys::scaffold_network_ffi::get_flatten_isotopes(&self.ptr) + } + + pub fn get_flatten_chirality(&self) -> bool { + rdkit_sys::scaffold_network_ffi::get_flatten_chirality(&self.ptr) + } + + pub fn get_flatten_keep_largest(&self) -> bool { + rdkit_sys::scaffold_network_ffi::get_flatten_keep_largest(&self.ptr) + } + + pub fn get_collect_mol_counts(&self) -> bool { + rdkit_sys::scaffold_network_ffi::get_collect_mol_counts(&self.ptr) + } +} diff --git a/tests/test_atom.rs b/tests/test_atom.rs index 356aebc..a6d6aab 100644 --- a/tests/test_atom.rs +++ b/tests/test_atom.rs @@ -1,8 +1,8 @@ #[test] fn test_atom() { - let romol = rdkit::ROMol::from_smiles("C").unwrap(); + let mut romol = rdkit::ROMol::from_smiles("C").unwrap(); - let atom = romol.atom_with_idx(0); + let mut atom = romol.atom_with_idx(0); assert_eq!(format!("{:?}", atom), "C"); diff --git a/tests/test_scaffold_network.rs b/tests/test_scaffold_network.rs new file mode 100644 index 0000000..f0cce62 --- /dev/null +++ b/tests/test_scaffold_network.rs @@ -0,0 +1,7 @@ +use rdkit::{ScaffoldNetwork, ScaffoldNetworkParams}; + +#[test] +pub fn test_new_scaffold_network() { + let _scaffold_network_params = ScaffoldNetworkParams::new(); + let _scaffold_network = ScaffoldNetwork::new(); +}