static inline void processCuts( size_t i, size_t maxCuts, BondVector_t& bonds_selected, const std::vector<BondVector_t>& matching_bonds, const ROMol& mol, std::vector<std::pair<ROMOL_SPTR, ROMOL_SPTR> >& res) { for (size_t x = i; x < matching_bonds.size(); x++) { appendBonds(bonds_selected, matching_bonds[x]); addResult(res, mol, bonds_selected, maxCuts); if (bonds_selected.size() < maxCuts) processCuts(x + 1, maxCuts, bonds_selected, matching_bonds, mol, res); bonds_selected.pop_back(); } }
bool fragmentMol(const ROMol& mol, std::vector<std::pair<ROMOL_SPTR, ROMOL_SPTR> >& res, const std::vector<unsigned int>& bondsToCut, unsigned int minCuts, unsigned int maxCuts) { std::vector<BondVector_t> matching_bonds; // List of matched query's bonds BOOST_FOREACH(unsigned int i, bondsToCut) { const Bond *bond = mol.getBondWithIdx(i); BondVector_t bonds; unsigned int a1 = bond->getBeginAtomIdx(); unsigned int a2 = bond->getEndAtomIdx(); bonds.push_back( std::make_pair(a1, a2) ); matching_bonds.push_back(bonds); } // loop to generate every cut in the molecule BondVector_t bonds_selected; processCuts(0, minCuts, maxCuts, bonds_selected, matching_bonds, mol, res); return true; }
static inline void processCuts( size_t i, size_t minCuts, size_t maxCuts, BondVector_t& bonds_selected, const std::vector<BondVector_t>& matching_bonds, const ROMol& mol, std::vector<std::pair<ROMOL_SPTR, ROMOL_SPTR> >& res) { if(maxCuts < minCuts) throw ValueErrorException("supplied maxCuts is less than minCuts"); if(minCuts==0) throw ValueErrorException("minCuts must be greater than 0"); for (size_t x = i; x < matching_bonds.size(); x++) { appendBonds(bonds_selected, matching_bonds[x]); if(bonds_selected.size() >= minCuts) { addResult(res, mol, bonds_selected, maxCuts); } if (bonds_selected.size() < maxCuts) { processCuts(x + 1, minCuts, maxCuts, bonds_selected, matching_bonds, mol, res); } bonds_selected.pop_back(); } }
bool fragmentMol(const ROMol& mol, std::vector<std::pair<ROMOL_SPTR, ROMOL_SPTR> >& res, unsigned int minCuts, unsigned int maxCuts, unsigned int maxCutBonds, const std::string& pattern) { #ifdef _DEBUG for (size_t i = 0; i < mol.getNumAtoms(); i++) { std::string symbol = mol.getAtomWithIdx(i)->getSymbol(); int label = 0; mol.getAtomWithIdx(i)->getPropIfPresent(common_properties::molAtomMapNumber, label); char a1[32]; if (0 == label) sprintf(a1, "\'%s\'", symbol.c_str(), label); else sprintf(a1, "\'%s:%u\'", symbol.c_str(), label); std::cout << "Atom " << i << ": " << a1; //<<" Bonds:"; std::cout << "\n"; } #endif res.clear(); std::auto_ptr<const ROMol> smarts((const ROMol*)SmartsToMol(pattern)); std::vector<MatchVectType> matching_atoms; // one bond per match ! with default pattern unsigned int total = SubstructMatch(mol, *smarts, matching_atoms); #ifdef _DEBUG std::cout << "total substructs =" << total << "\nmatching bonds (atom1, atom2):\n"; #endif if (0 == total) // Not found. Return empty set of molecules return false; #ifdef _DEBUG for (size_t i = 0; i < matching_atoms.size(); i++) { std::string symbol = mol.getAtomWithIdx(matching_atoms[i][0].second)->getSymbol(); int label = 0; mol.getAtomWithIdx(matching_atoms[i][0].second) ->getPropIfPresent(common_properties::molAtomMapNumber, label); char a1[32]; if (0 == label) sprintf(a1, "\'%s\'", symbol.c_str(), label); else sprintf(a1, "\'%s:%u\'", symbol.c_str(), label); symbol = mol.getAtomWithIdx(matching_atoms[i][1].second)->getSymbol(); label = 0; mol.getAtomWithIdx(matching_atoms[i][1].second) ->getPropIfPresent(common_properties::molAtomMapNumber, label); char a2[32]; if (0 == label) sprintf(a2, "\'%s\'", symbol.c_str(), label); else sprintf(a2, "\'%s:%u\'", symbol.c_str(), label); std::cout << i << ": (" << matching_atoms[i][0].second << a1 << "," << matching_atoms[i][1].second << a2 << ") \n"; } #endif std::vector<BondVector_t> matching_bonds; // List of matched query's bonds convertMatchingToBondVect(matching_bonds, matching_atoms, mol); if (matching_bonds.size() > maxCutBonds) return false; #ifdef _DEBUG std::cout << "total matching_bonds = " << matching_bonds.size() << "\n"; #endif // loop to generate every cut in the molecule BondVector_t bonds_selected; processCuts(0, minCuts, maxCuts, bonds_selected, matching_bonds, mol, res); return true; }