// // Copyright (c) 2015 Greg Landrum // // @@ All Rights Reserved @@ // This file is part of the RDKit. // The contents are covered by the terms of the BSD license // which is included in the file license.txt, found at the root // of the RDKit source tree. // #include #include #include #include #include #include #include #include #include namespace RDKit { namespace { bool isMapped(const Atom *atom) { return atom->hasProp(common_properties::molAtomMapNumber); } } namespace MolOps { ROMol *adjustQueryProperties(const ROMol &mol, const AdjustQueryParameters *params) { auto *res = new RWMol(mol); try { adjustQueryProperties(*res, params); } catch (MolSanitizeException &se) { delete res; throw se; } return static_cast(res); } void adjustQueryProperties(RWMol &mol, const AdjustQueryParameters *inParams) { AdjustQueryParameters params; if (inParams) { params = *inParams; } const RingInfo *ringInfo = mol.getRingInfo(); if (params.aromatizeIfPossible) { unsigned int failed; sanitizeMol(mol, failed, SANITIZE_SYMMRINGS | SANITIZE_SETAROMATICITY); } else { if (!ringInfo->isInitialized()) { MolOps::symmetrizeSSSR(mol); } } if (params.makeAtomsGeneric) { for (unsigned int i = 0; i < mol.getNumAtoms(); ++i) { if (!((params.makeAtomsGenericFlags & ADJUST_IGNORECHAINS) && !ringInfo->numAtomRings(i)) && !((params.makeAtomsGenericFlags & ADJUST_IGNORERINGS) && ringInfo->numAtomRings(i)) && !((params.adjustDegreeFlags & ADJUST_IGNOREMAPPED) && isMapped(mol.getAtomWithIdx(i)))) { auto *qa = new QueryAtom(); qa->setQuery(makeAtomNullQuery()); mol.replaceAtom(i, qa); delete qa; } } } // end of makeAtomsGeneric if (params.makeBondsGeneric) { for (unsigned int i = 0; i < mol.getNumBonds(); ++i) { if (!((params.makeBondsGenericFlags & ADJUST_IGNORECHAINS) && !ringInfo->numBondRings(i)) && !((params.makeBondsGenericFlags & ADJUST_IGNORERINGS) && ringInfo->numBondRings(i))) { auto *qb = new QueryBond(); qb->setQuery(makeBondNullQuery()); mol.replaceBond(i, qb); delete qb; } } } // end of makeBondsGeneric for (unsigned int i = 0; i < mol.getNumAtoms(); ++i) { Atom *at = mol.getAtomWithIdx(i); // pull properties we need from the atom here, once we // create a query atom they may no longer be valid. unsigned int nRings = ringInfo->numAtomRings(i); int atomicNum = at->getAtomicNum(); if (params.makeDummiesQueries && atomicNum == 0 && !at->hasQuery() && !at->getIsotope()) { auto *qa = new QueryAtom(); qa->setQuery(makeAtomNullQuery()); mol.replaceAtom(i, qa); delete qa; at = mol.getAtomWithIdx(i); } // end of makeDummiesQueries if (params.adjustDegree && !((params.adjustDegreeFlags & ADJUST_IGNORECHAINS) && !nRings) && !((params.adjustDegreeFlags & ADJUST_IGNORERINGS) && nRings) && !((params.adjustDegreeFlags & ADJUST_IGNOREDUMMIES) && !atomicNum) && !((params.adjustDegreeFlags & ADJUST_IGNORENONDUMMIES) && atomicNum) && !((params.adjustDegreeFlags & ADJUST_IGNOREMAPPED) && isMapped(at))) { QueryAtom *qa; if (!at->hasQuery()) { qa = new QueryAtom(*at); mol.replaceAtom(i, qa); delete qa; qa = static_cast(mol.getAtomWithIdx(i)); at = static_cast(qa); } else { qa = static_cast(at); } qa->expandQuery(makeAtomExplicitDegreeQuery(qa->getDegree())); } // end of adjust degree if (params.adjustRingCount && !((params.adjustRingCountFlags & ADJUST_IGNORECHAINS) && !nRings) && !((params.adjustRingCountFlags & ADJUST_IGNORERINGS) && nRings) && !((params.adjustRingCountFlags & ADJUST_IGNOREDUMMIES) && !atomicNum) && !((params.adjustRingCountFlags & ADJUST_IGNORENONDUMMIES) && !((params.adjustRingCountFlags & ADJUST_IGNOREMAPPED) && isMapped(at)) && atomicNum)) { QueryAtom *qa; if (!at->hasQuery()) { qa = new QueryAtom(*at); mol.replaceAtom(i, qa); delete qa; qa = static_cast(mol.getAtomWithIdx(i)); at = static_cast(qa); } else { qa = static_cast(at); } qa->expandQuery(makeAtomInNRingsQuery(nRings)); } // end of adjust ring count } // end of loop over atoms if (params.makeBondsGeneric) { ROMol::EDGE_ITER firstB, lastB; boost::tie(firstB, lastB) = mol.getEdges(); while (firstB != lastB) { BOND_SPTR bond = mol[*firstB]; ++firstB; } } } } // end of MolOps namespace } // end of RDKit namespace