Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MinimalLib Function Exposure: Scaffold Networks #7312

Open
wants to merge 81 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
81 commits
Select commit Hold shift + click to select a range
fcd792e
Update MinimalLib for Function Exposure
syedzayyan Mar 4, 2024
2e8a82c
Merge branch 'rdkit:master' into master
syedzayyan Mar 16, 2024
1a967f2
suggested changes
Mar 17, 2024
528ec6d
Merge pull request #1 from ptosco/ptosco/syedzayyan/master
syedzayyan Mar 17, 2024
3d1e6a3
Merge branch 'rdkit:master' into master
syedzayyan Mar 18, 2024
4d0075f
added updatescaffoldnetwork
syedzayyan Mar 27, 2024
8cdb5c8
added simpler scaffold parameter updates
syedzayyan Mar 28, 2024
7928bea
everything probably works now
syedzayyan Mar 28, 2024
ee6ce15
Merge branch 'rdkit:master' into scaffolds
syedzayyan Mar 28, 2024
2e56532
Merge branch 'rdkit:master' into scaffolds
syedzayyan Apr 3, 2024
0f3692f
Fixes #7318 (#7319)
ricrogz Apr 3, 2024
d4c33e7
Wedge bond from atrop error (#7321)
tadhurst-cdd Apr 3, 2024
e2f1675
cleanup RDKit::MolOps::detectBondStereochemistry (#7329)
rvianello Apr 4, 2024
a33f6f2
Cleaner forloops, deleting of empty header file (#7320)
AnnaBruenisholz Apr 7, 2024
cdea64b
Fixes #7327 (#7328)
ricrogz Apr 8, 2024
0e5215f
C# Build Net6 library and tests using cmake (#7326)
jones-gareth Apr 8, 2024
976b47a
switch to range-based for loops (#7278)
AnnaBruenisholz Apr 8, 2024
f4467ef
fix 1,3- 1,5- conjugated cation normalizer transforms (#7330)
rvianello Apr 9, 2024
a41c593
Include macrocycles in atropisomer calculation by not sanitizing them…
pechersky Apr 9, 2024
a7aef65
remove some warnings with -Wextra (#7339)
greglandrum Apr 11, 2024
ddc0073
Fixes #7346 (#7347)
ricrogz Apr 11, 2024
fd52184
Added MolStandardize to C# wrappers with test (#7351)
jones-gareth Apr 11, 2024
3996bf3
Add option for RASCAL to restrict atom matching to atoms of same degr…
DavidACosgrove Apr 11, 2024
8692940
Fixes problem from discussion 7317 (#7345)
DavidACosgrove Apr 11, 2024
baf6a54
Correct unbranched alkane SMARTS to match the description given (#7255)
greglandrum Apr 12, 2024
2c9cbbf
increase allowed CI time for the UBSAN build; (#7354)
greglandrum Apr 12, 2024
d8f6908
Added JSON parameters to MinimalLib get_(cx)?sm(ile|art)s() functions…
ptosco Apr 18, 2024
4b0c8c1
Support handling atropisomers without coordinates (#7301)
tadhurst-cdd Apr 19, 2024
9eb9962
Revert "Support handling atropisomers without coordinates (#7301)" (#…
greglandrum Apr 19, 2024
0b2aa7a
Fixes github 7331 (#7352)
greglandrum Apr 19, 2024
2175428
Cleanup of Code/DataStructs (#7365)
AnnaBruenisholz Apr 21, 2024
c0b70a9
fixes bug with overly large count_bounds (#7368)
greglandrum Apr 23, 2024
261f2b4
Fix the Uncharger 'force' option w/ non-neutralizable negatively char…
rvianello Apr 24, 2024
3ed41cc
Restore mono build (#7377)
jones-gareth Apr 24, 2024
eaaacc7
Allow reapplyMolBlockWedging() to restore the original wedging regard…
rvianello Apr 27, 2024
b77c8c5
fixes typo in minilib: MolToCXSmiles should have read MolToSmiles (#7…
ptosco Apr 27, 2024
0ecc5d0
Fix performance issue in PR 7327 (#7391)
ricrogz Apr 28, 2024
e8e620b
Code/PgSQL: Fix Pointer vs Datum (#6733)
df7cb Apr 28, 2024
aaff6d5
Include header for boost::numeric_cast (#7389)
cho-m Apr 28, 2024
74d0396
Revert "fix #7221 (#7230)" (#7387)
ptosco Apr 28, 2024
c90adc2
Fixes #7378, raw docstring to escape null chars (#7379)
pechersky Apr 28, 2024
f8727a7
extend mol_to_smiles mol_to_cxsmiles to support optional non-isomeric…
rvianello Apr 29, 2024
6d75c91
Allow any bond (smiles ~) recognition in CDXML (#7363)
bp-kelley Apr 29, 2024
d9d75b0
Prevent the normalization of conjugated cations from applying to the …
rvianello Apr 30, 2024
5d91cf0
Fixes #7300 (#7413)
greglandrum May 2, 2024
21d4f2f
Wedge bond from atrop error (#7355)
tadhurst-cdd May 3, 2024
c976a19
Fix #7311: problem with InChI for phosphinic acid (#7419)
greglandrum May 3, 2024
8f50cb8
C sharp rascal mcs wrapper (#7390)
jones-gareth May 5, 2024
4bc71a7
deprecations for the 2024.09 release (#7398)
greglandrum May 5, 2024
d69ba27
fix location of MolFileSterechem.h (#7420)
tadhurst-cdd May 7, 2024
a02e2c5
Expose replaceAtomWithQueryAtom to Python (#7380)
DavidACosgrove May 7, 2024
55a262b
No coords atropisomers - fix smiles output of atrop wedges after reor…
tadhurst-cdd May 7, 2024
83d5818
Prefer wedging ring bonds around atropisomers (#7373)
greglandrum May 8, 2024
4950d2a
fix a lifetime bug Andrew Dalke identified (#7408)
greglandrum May 9, 2024
f29abcd
allow static builds to work with clang and no coordgen (#7416)
greglandrum May 9, 2024
abde975
Make CXSMILES writer use the default conformer ID (#7415)
greglandrum May 9, 2024
c7fd2bb
Update MinimalLib for Function Exposure: runReactants (#7210)
syedzayyan May 9, 2024
eca4c54
Cleanup: Force field (#7406)
AnnaBruenisholz May 10, 2024
6ed3edf
a couple of additional cleanups (#7432)
greglandrum May 13, 2024
ee616cc
Fixes #7375 (#7381)
ricrogz May 16, 2024
a858d9e
Fixes #7367 (#7426)
ricrogz May 16, 2024
1b1d88b
Fixes #7434 (#7446)
greglandrum May 16, 2024
cbdfcd6
Fixes #7153 (#7441)
ricrogz May 16, 2024
2beb675
Expose a couple of additional functions to Python (#7444)
greglandrum May 17, 2024
26363fe
Handle query atoms and bonds in SWIG wrappers (#7431)
jones-gareth May 23, 2024
7574d36
Fix a python 3.12 compatibility issue (#7450)
rvianello May 24, 2024
395dffe
Expose the property pickle options to SWIG (#7448)
greglandrum May 24, 2024
f60e03d
Allow disabling output of dative bonds to SMILES (#7384)
greglandrum May 25, 2024
0b40179
Allow the substruct library to be deleted when refcount goes to 0 (#7…
bp-kelley May 28, 2024
d392aa6
MaeWriter: handle the R group label property and update the Maestro p…
ricrogz May 30, 2024
2d7d626
Remove unnecessary wrapped pointers (#7465)
bp-kelley May 30, 2024
80e711c
Fixes #7438 (#7474)
greglandrum May 31, 2024
ff7060e
fix: Add aromatic aluminium token (#7428)
iwyoo May 31, 2024
dfa8e48
Wedge bond from atrop error (#7355)
tadhurst-cdd May 3, 2024
f7dca09
Update MinimalLib for Function Exposure
syedzayyan Mar 4, 2024
b5f0607
suggested changes
Mar 17, 2024
6ccc065
added updatescaffoldnetwork
syedzayyan Mar 27, 2024
1bfcfbf
Added JSON parameters to MinimalLib get_(cx)?sm(ile|art)s() functions…
ptosco Apr 18, 2024
4789767
Wedge bond from atrop error (#7355)
tadhurst-cdd May 3, 2024
f788504
Update MinimalLib for Function Exposure: runReactants (#7210)
syedzayyan May 9, 2024
a81b557
Merge remote-tracking branch 'upstream/master' into scaffolds
syedzayyan Jun 1, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
6 changes: 5 additions & 1 deletion Code/MinimalLib/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ if(RDK_BUILD_MINIMAL_LIB)
"CIPLabeler_static;MolDraw2D_static;Depictor_static;RDInchiLib_static;"
"SubstructMatch_static;FileParsers_static;"
"SmilesParse_static;GraphMol_static;RDGeometryLib_static;"
"RDGeneral_static;RGroupDecomposition_static")
"RDGeneral_static;RGroupDecomposition_static;ScaffoldNetwork_static")
if(RDK_BUILD_MINIMAL_LIB_RXN)
add_definitions(-DRDK_BUILD_MINIMAL_LIB_RXN)
set(MINIMAL_LIB_LIBRARIES "${MINIMAL_LIB_LIBRARIES};ChemReactions_static")
Expand All @@ -23,6 +23,10 @@ if(RDK_BUILD_MINIMAL_LIB)
add_definitions(-DRDK_BUILD_MINIMAL_LIB_MMPA)
set(MINIMAL_LIB_LIBRARIES "${MINIMAL_LIB_LIBRARIES};MMPA_static")
endif()
if(RDK_BUILD_MINIMAL_LIB_SCAFFOLDNETWORK)
add_definitions(-DRDK_BUILD_MINIMAL_LIB_SCAFFOLDNETWORK)
set(MINIMAL_LIB_LIBRARIES "${MINIMAL_LIB_LIBRARIES};ChemReactions_static")
endif()
if(RDK_BUILD_FREETYPE_SUPPORT)
if( ${CMAKE_SYSTEM_NAME} MATCHES "Emscripten")
set(USE_FLAGS "-s USE_FREETYPE=1")
Expand Down
61 changes: 60 additions & 1 deletion Code/MinimalLib/jswrapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@
#include <GraphMol/MolDraw2D/MolDraw2DUtils.h>
#include <GraphMol/MolDraw2D/MolDraw2DJS.h>

#ifdef RDK_BUILD_MINIMAL_LIB_SCAFFOLDNETWORK
#include <GraphMol/ScaffoldNetwork/ScaffoldNetwork.h>
#endif

using namespace RDKit;

namespace {
Expand Down Expand Up @@ -340,6 +344,50 @@ emscripten::val get_avalon_fp_as_uint8array(const JSMol &self) {
}
#endif

#ifdef RDK_BUILD_MINIMAL_LIB_SCAFFOLDNETWORK
std::string EdgeTypeToString(RDKit::ScaffoldNetwork::EdgeType edgeType) {
switch (edgeType) {
case RDKit::ScaffoldNetwork::EdgeType::Fragment:
return "Fragment";
case RDKit::ScaffoldNetwork::EdgeType::Generic:
return "Generic";
case RDKit::ScaffoldNetwork::EdgeType::GenericBond:
return "GenericBond";
case RDKit::ScaffoldNetwork::EdgeType::RemoveAttachment:
return "RemoveAttachment";
case RDKit::ScaffoldNetwork::EdgeType::Initialize:
return "Initialize";
default:
return "Unknown";
}
}

emscripten::val update_scaffold_network_wrapper(JSScaffoldNetwork& js_scaffold_network, const JSMolList &mol_list){
RDKit::ScaffoldNetwork::ScaffoldNetwork modified_network;

modified_network = js_scaffold_network.update_scaffold_network(mol_list);

auto network_obj = emscripten::val::object();

network_obj.set("nodes", modified_network.nodes);
network_obj.set("counts", modified_network.counts);
network_obj.set("molCounts", modified_network.molCounts);

std::vector<emscripten::val> edges_array;
for (const auto &new_edge : modified_network.edges) {
auto edge_obj = emscripten::val::object();
edge_obj.set("beginIdx", new_edge.beginIdx);
edge_obj.set("endIdx", new_edge.endIdx);
edge_obj.set("type", EdgeTypeToString(new_edge.type));

edges_array.push_back(edge_obj);
}
network_obj.set("edges", edges_array);

return network_obj;
}
#endif

#ifdef RDK_BUILD_MINIMAL_LIB_MMPA
emscripten::val get_mmpa_frags_helper(const JSMol &self, unsigned int minCuts,
unsigned int maxCuts,
Expand All @@ -352,11 +400,15 @@ emscripten::val get_mmpa_frags_helper(const JSMol &self, unsigned int minCuts,
}
#endif



} // namespace

using namespace emscripten;
EMSCRIPTEN_BINDINGS(RDKit_minimal) {
register_vector<std::string>("StringList");
register_vector<emscripten::val>("JSObjectList");
register_vector<unsigned int>("UnsignedIntList");
register_vector<JSMolList *>("JSMolListList");

class_<JSMol>("Mol")
Expand Down Expand Up @@ -601,6 +653,13 @@ EMSCRIPTEN_BINDINGS(RDKit_minimal) {
&JSReaction::get_svg_with_highlights);
#endif

#ifdef RDK_BUILD_MINIMAL_LIB_SCAFFOLDNETWORK
class_<JSScaffoldNetwork>("ScaffoldNetwork")
.constructor<>()
.function("update_scaffold_network", select_overload<emscripten::val(JSScaffoldNetwork &self, const JSMolList &)>(update_scaffold_network_wrapper))
.function("set_scaffold_params", &JSScaffoldNetwork::set_scaffold_params);
#endif

#ifdef RDK_BUILD_MINIMAL_LIB_SUBSTRUCTLIBRARY
class_<JSSubstructLibrary>("SubstructLibrary")
.constructor<>()
Expand Down Expand Up @@ -686,4 +745,4 @@ EMSCRIPTEN_BINDINGS(RDKit_minimal) {
function("get_mcs_as_smarts", &get_mcs_as_smarts);
function("get_mcs_as_smarts", &get_mcs_as_smarts_no_details);
#endif
}
}
82 changes: 81 additions & 1 deletion Code/MinimalLib/minilib.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,10 @@
#include <DataStructs/BitOps.h>
#include <DataStructs/ExplicitBitVect.h>

#ifdef RDK_BUILD_MINIMAL_LIB_SCAFFOLDNETWORK
#include <GraphMol/ScaffoldNetwork/ScaffoldNetwork.h>
#endif

#include <INCHI-API/inchi.h>

#include <rapidjson/document.h>
Expand Down Expand Up @@ -738,6 +742,72 @@ size_t JSMolList::insert(size_t idx, const JSMol &mol) {
return res;
}

#ifdef RDK_BUILD_MINIMAL_LIB_SCAFFOLDNETWORK
RDKit::ScaffoldNetwork::ScaffoldNetwork JSScaffoldNetwork::update_scaffold_network(const JSMolList &scaffmols) {
std::vector<ROMOL_SPTR> mols;
for (const auto &reactant : scaffmols.mols()) {
mols.push_back(RDKit::ROMOL_SPTR(reactant));
}
RDKit::ScaffoldNetwork::updateScaffoldNetwork(mols, *d_network, *d_scaffparams);
return *d_network;
}

void JSScaffoldNetwork::set_scaffold_params(const std::string &params) {
if (params.empty()) {
return;
}
rj::Document d;
if (d.Parse(params.c_str()).HasParseError()) {
return;
}
if (d.HasMember("includeGenericScaffolds")) {
d_scaffparams->includeGenericScaffolds = d["includeGenericScaffolds"].GetBool();
}
if (d.HasMember("includeGenericBondScaffolds")) {
d_scaffparams->includeGenericBondScaffolds = d["includeGenericBondScaffolds"].GetBool();
}
if (d.HasMember("includeScaffoldsWithoutAttachments")) {
d_scaffparams->includeScaffoldsWithoutAttachments = d["includeScaffoldsWithoutAttachments"].GetBool();
}
if (d.HasMember("includeScaffoldsWithAttachments")) {
d_scaffparams->includeScaffoldsWithAttachments = d["includeScaffoldsWithAttachments"].GetBool();
}
if (d.HasMember("keepOnlyFirstFragment")) {
d_scaffparams->keepOnlyFirstFragment = d["keepOnlyFirstFragment"].GetBool();
}
if (d.HasMember("pruneBeforeFragmenting")) {
d_scaffparams->pruneBeforeFragmenting = d["pruneBeforeFragmenting"].GetBool();
}
if (d.HasMember("flattenIsotopes")) {
d_scaffparams->flattenIsotopes = d["flattenIsotopes"].GetBool();
}
if (d.HasMember("flattenChirality")) {
d_scaffparams->flattenChirality = d["flattenChirality"].GetBool();
}
if (d.HasMember("flattenKeepLargest")) {
d_scaffparams->flattenKeepLargest = d["flattenKeepLargest"].GetBool();
}
if (d.HasMember("collectMolCounts")) {
d_scaffparams->collectMolCounts = d["collectMolCounts"].GetBool();
}
if (d.HasMember("bondBreakersRxns") && d["bondBreakersRxns"].IsArray()) {
const rj::Value& bondBreakersRxnsStringArray = d["bondBreakersRxns"];
std::vector<std::shared_ptr<ChemicalReaction>> bondBreakersRxns;

for (rj::SizeType i = 0; i < bondBreakersRxnsStringArray.Size(); i++) {
if (bondBreakersRxnsStringArray[i].IsString()) {
const std::string rxnStr = bondBreakersRxnsStringArray[i].GetString();
ChemicalReaction *rxn = MinimalLib::rxn_from_input(rxnStr);
rxn->initReactantMatchers();
bondBreakersRxns.emplace_back(rxn);
}
}
d_scaffparams->bondBreakersRxns.clear();
d_scaffparams->bondBreakersRxns = bondBreakersRxns;
}
}
#endif

#ifdef RDK_BUILD_MINIMAL_LIB_SUBSTRUCTLIBRARY
JSSubstructLibrary::JSSubstructLibrary(unsigned int num_bits)
: d_fpHolder(nullptr) {
Expand Down Expand Up @@ -856,6 +926,16 @@ unsigned int JSSubstructLibrary::count_matches(const JSMol &q,
}
#endif

// RDKit::ScaffoldNetwork::ScaffoldNetwork JSScaffoldNetwork::update_scaffold_network(const JSMolList &scaffmols) {
// std::vector<ROMOL_SPTR> mols;
// for (const auto &reactant : scaffmols.mols()) {
// mols.push_back(RDKit::ROMOL_SPTR(reactant));
// }
// RDKit::ScaffoldNetwork::updateScaffoldNetwork(mols, *d_network, *d_scaffparams);
// return *d_network;
// }


std::string get_inchikey_for_inchi(const std::string &input) {
return InchiToInchiKey(input);
}
Expand Down Expand Up @@ -1000,4 +1080,4 @@ JSLog *set_log_capture(const std::string &log_name) {

void enable_logging() { RDKit::MinimalLib::LogHandle::enableLogging(); }

void disable_logging() { RDKit::MinimalLib::LogHandle::disableLogging(); }
void disable_logging() { RDKit::MinimalLib::LogHandle::disableLogging(); }
25 changes: 24 additions & 1 deletion Code/MinimalLib/minilib.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,10 @@
#include <GraphMol/MMPA/MMPA.h>
#endif

#ifdef RDK_BUILD_MINIMAL_LIB_SCAFFOLDNETWORK
#include <GraphMol/ScaffoldNetwork/ScaffoldNetwork.h>
#endif

class JSMolList;

class JSMol {
Expand Down Expand Up @@ -163,6 +167,8 @@ class JSMol {
static constexpr int d_defaultHeight = 200;
};



class JSMolList {
public:
JSMolList(const std::vector<RDKit::ROMOL_SPTR> &mols)
Expand Down Expand Up @@ -225,6 +231,23 @@ class JSReaction {
};
#endif

#ifdef RDK_BUILD_MINIMAL_LIB_SCAFFOLDNETWORK
class JSScaffoldNetwork {
public:
JSScaffoldNetwork() :
d_scaffparams(new RDKit::ScaffoldNetwork::ScaffoldNetworkParams), d_network(new RDKit::ScaffoldNetwork::ScaffoldNetwork) {}

RDKit::ScaffoldNetwork::ScaffoldNetwork update_scaffold_network(
const JSMolList &scaffmols);

void set_scaffold_params(const std::string &params);

private:
RDKit::ScaffoldNetwork::ScaffoldNetworkParams *d_scaffparams;
RDKit::ScaffoldNetwork::ScaffoldNetwork *d_network;
};
#endif

#ifdef RDK_BUILD_MINIMAL_LIB_SUBSTRUCTLIBRARY
class JSSubstructLibrary {
public:
Expand Down Expand Up @@ -292,4 +315,4 @@ JSLog *set_log_capture(const std::string &log_name);
std::string get_mcs_as_json(const JSMolList &mols, const std::string &details_json);
std::string get_mcs_as_smarts(const JSMolList &mols, const std::string &details_json);
JSMol *get_mcs_as_mol(const JSMolList &mols, const std::string &details_json);
#endif
#endif
92 changes: 92 additions & 0 deletions Code/MinimalLib/tests/tests.js
Original file line number Diff line number Diff line change
Expand Up @@ -2583,6 +2583,95 @@ function test_mcs() {
}
}

function assert_edge_counts(net, edgeType, expectedLen) {
let count = 0;
for (let i = 0; i < net.edges.size(); i++) {
const edge = net.edges.get(i);
if (edge.type === edgeType) {
count++;
}
}
assert(count === expectedLen);
}

function test_scaffold_networks(){
let net_ins = new RDKitModule.ScaffoldNetwork();

// Basics
smis = ["c1ccccc1CC1NC(=O)CCC1", "c1cccnc1CC1NC(=O)CCC1"]
ms = molListFromSmiArray(smis);
net = net_ins.update_scaffold_network(ms);

assert(net.nodes.size() === 12);
assert(net.edges.size() === 13);
assert(net.nodes.size() === net.molCounts.size());
assert_edge_counts(net, "Fragment", 4);
assert_edge_counts(net, "Generic", 6);
assert_edge_counts(net, "RemoveAttachment", 3);

// Param updates test
net_ins = new RDKitModule.ScaffoldNetwork();
smis = ["c1ccccc1CC1NC(=O)CCC1", "c1cccnc1CC1NC(=O)CCC1"];
ms = molListFromSmiArray(smis);
net_ins.set_scaffold_params(JSON.stringify({"includeScaffoldsWithoutAttachments" : false}));
net = net_ins.update_scaffold_network(ms);

assert(net.nodes.size() === 7);
assert(net.edges.size() === 7);
assert_edge_counts(net, "Fragment", 4);
assert_edge_counts(net, "Generic", 3);

// Scaffold Network Update Tests
net_ins = new RDKitModule.ScaffoldNetwork();
ms = molListFromSmiArray(["c1ccccc1CC1NC(=O)CCC1"]);
net = net_ins.update_scaffold_network(ms);

assert(net.nodes.size() === 9);
assert(net.edges.size() === 8);
assert(net.nodes.size() === net.molCounts.size());

ms = molListFromSmiArray(["c1cccnc1CC1NC(=O)CCC1"]);
net = net_ins.update_scaffold_network(ms);

assert(net.nodes.size() === 12);
assert(net.edges.size() === 13);
assert(net.nodes.size() === net.molCounts.size());

assert_edge_counts(net, "Fragment", 4);
assert_edge_counts(net, "Generic", 6);
assert_edge_counts(net, "RemoveAttachment", 3);

// Bond Breaker Reactions Test
smis = ["c1c(CC2CC2)cc(NC2CC2)cc1OC1CC1"];
ms = molListFromSmiArray(smis);
let net_ins2 = new RDKitModule.ScaffoldNetwork();
net_ins2.set_scaffold_params(JSON.stringify(
{
"bondBreakersRxns" : ["[!#0;R:1]-!@[O:2]>>[*:1]-[#0].[#0]-[*:2]", "[!#0;R:1]-!@[N:2]>>[*:1]-[#0].[#0]-[*:2]"],
"includeScaffoldsWithoutAttachments" : false,
"includeGenericScaffolds": false,
}
));
net = net_ins2.update_scaffold_network(ms);
assert(net.nodes.size() === 5);
assert(net.edges.size() === 7);

// Test many more scaffold network params
smis = ["C1OC1Cc1ccccc1"]
ms = molListFromSmiArray(smis);
net_ins = new RDKitModule.ScaffoldNetwork();
net_ins.set_scaffold_params(JSON.stringify({"keepOnlyFirstFragment" : false}));
net = net_ins.update_scaffold_network(ms);
assert(net.nodes.size() === 19);
assert(net.edges.size() === 23);

net_ins = new RDKitModule.ScaffoldNetwork();
net_ins.set_scaffold_params(JSON.stringify({"includeGenericScaffolds" : false}));
net = net_ins.update_scaffold_network(ms);
assert(net.nodes.size() === 5);
assert(net.edges.size() === 4);
}

function test_get_num_atoms_bonds() {
var mol = RDKitModule.get_mol('CCCC');
var molH = RDKitModule.get_mol_copy(mol);
Expand Down Expand Up @@ -3013,6 +3102,9 @@ initRDKitModule().then(function(instance) {
if (RDKitModule.get_mcs_as_mol) {
test_mcs();
}
if (RDKitModule.ScaffoldNetwork){
test_scaffold_networks();
}
test_sanitize_no_kekulize_no_setaromaticity();
test_partial_sanitization();
test_capture_logs();
Expand Down