double AlignMolecule(ROMol &prbMol, const ROMol &refMol, int prbCid = -1, int refCid = -1, python::object atomMap = python::list(), python::object weights = python::list(), bool reflect = false, unsigned int maxIters = 50) { MatchVectType *aMap = _translateAtomMap(atomMap); unsigned int nAtms; if (aMap) { nAtms = aMap->size(); } else { nAtms = prbMol.getNumAtoms(); } RDNumeric::DoubleVector *wtsVec = _translateWeights(weights); if (wtsVec) { if (wtsVec->size() != nAtms) { throw_value_error("Incorrect number of weights specified"); } } double rmsd; { NOGIL gil; rmsd = MolAlign::alignMol(prbMol, refMol, prbCid, refCid, aMap, wtsVec, reflect, maxIters); } if (aMap) { delete aMap; } if (wtsVec) { delete wtsVec; } return rmsd; }
PyObject *getMolAlignTransform(const ROMol &prbMol, const ROMol &refMol, int prbCid = -1, int refCid = -1, python::object atomMap = python::list(), python::object weights = python::list(), bool reflect = false, unsigned int maxIters = 50) { MatchVectType *aMap = _translateAtomMap(atomMap); unsigned int nAtms; if (aMap) { nAtms = aMap->size(); } else { nAtms = prbMol.getNumAtoms(); } RDNumeric::DoubleVector *wtsVec = _translateWeights(weights); if (wtsVec) { if (wtsVec->size() != nAtms) { throw_value_error("Incorrect number of weights specified"); } } RDGeom::Transform3D trans; double rmsd; { NOGIL gil; rmsd = MolAlign::getAlignmentTransform( prbMol, refMol, trans, prbCid, refCid, aMap, wtsVec, reflect, maxIters); } if (aMap) { delete aMap; } if (wtsVec) { delete wtsVec; } return generateRmsdTransPyTuple(rmsd, trans); }
std::vector<MatchVectType> _translateAtomMapVector(python::object atomMapVec) { std::vector<MatchVectType> aMapVec; PySequenceHolder<python::object> aMapVecSeq(atomMapVec); for (size_t i = 0; i < aMapVecSeq.size(); ++i) { MatchVectType *aMap = _translateAtomMap(aMapVecSeq[i]); aMapVec.push_back(*aMap); delete aMap; } return aMapVec; }
python::tuple getCrippenO3AForConfs( ROMol &prbMol, ROMol &refMol, int numThreads, python::list prbCrippenContribs, python::list refCrippenContribs, int refCid = -1, bool reflect = false, unsigned int maxIters = 50, unsigned int options = 0, python::list constraintMap = python::list(), python::list constraintWeights = python::list()) { MatchVectType *cMap = (python::len(constraintMap) ? _translateAtomMap(constraintMap) : NULL); RDNumeric::DoubleVector *cWts = NULL; if (cMap) { cWts = _translateWeights(constraintWeights); if (cWts) { if ((*cMap).size() != (*cWts).size()) { throw_value_error( "The number of weights should match the number of constraints"); } } for (unsigned int i = 0; i < (*cMap).size(); ++i) { if (((*cMap)[i].first < 0) || ((*cMap)[i].first >= rdcast<int>(prbMol.getNumAtoms())) || ((*cMap)[i].second < 0) || ((*cMap)[i].second >= rdcast<int>(refMol.getNumAtoms()))) { throw_value_error("Constrained atom idx out of range"); } if ((prbMol[(*cMap)[i].first]->getAtomicNum() == 1) || (refMol[(*cMap)[i].second]->getAtomicNum() == 1)) { throw_value_error("Constrained atoms must be heavy atoms"); } } } unsigned int prbNAtoms = prbMol.getNumAtoms(); std::vector<double> prbLogpContribs(prbNAtoms); unsigned int refNAtoms = refMol.getNumAtoms(); std::vector<double> refLogpContribs(refNAtoms); if ((prbCrippenContribs != python::list()) && (python::len(prbCrippenContribs) == prbNAtoms)) { for (unsigned int i = 0; i < prbNAtoms; ++i) { python::tuple logpMRTuple = python::extract<python::tuple>(prbCrippenContribs[i]); prbLogpContribs[i] = python::extract<double>(logpMRTuple[0]); } } else { std::vector<double> prbMRContribs(prbNAtoms); std::vector<unsigned int> prbAtomTypes(prbNAtoms); std::vector<std::string> prbAtomTypeLabels(prbNAtoms); Descriptors::getCrippenAtomContribs(prbMol, prbLogpContribs, prbMRContribs, true, &prbAtomTypes, &prbAtomTypeLabels); } if ((refCrippenContribs != python::list()) && (python::len(refCrippenContribs) == refNAtoms)) { for (unsigned int i = 0; i < refNAtoms; ++i) { python::tuple logpMRTuple = python::extract<python::tuple>(refCrippenContribs[i]); refLogpContribs[i] = python::extract<double>(logpMRTuple[0]); } } else { std::vector<double> refMRContribs(refNAtoms); std::vector<unsigned int> refAtomTypes(refNAtoms); std::vector<std::string> refAtomTypeLabels(refNAtoms); Descriptors::getCrippenAtomContribs(refMol, refLogpContribs, refMRContribs, true, &refAtomTypes, &refAtomTypeLabels); } std::vector<boost::shared_ptr<O3A> > res; { NOGIL gil; getO3AForProbeConfs(prbMol, refMol, &prbLogpContribs, &refLogpContribs, res, numThreads, MolAlign::O3A::CRIPPEN, refCid, reflect, maxIters, options, cMap, cWts); } python::list pyres; for (unsigned int i = 0; i < res.size(); ++i) { pyres.append(new PyO3A(res[i])); } if (cMap) { delete cMap; } if (cWts) { delete cWts; } return python::tuple(pyres); }
python::tuple getMMFFO3AForConfs( ROMol &prbMol, ROMol &refMol, int numThreads, python::object prbProps, python::object refProps, int refCid = -1, bool reflect = false, unsigned int maxIters = 50, unsigned int options = 0, python::list constraintMap = python::list(), python::list constraintWeights = python::list()) { MatchVectType *cMap = (python::len(constraintMap) ? _translateAtomMap(constraintMap) : NULL); RDNumeric::DoubleVector *cWts = NULL; if (cMap) { cWts = _translateWeights(constraintWeights); if (cWts) { if ((*cMap).size() != (*cWts).size()) { throw_value_error( "The number of weights should match the number of constraints"); } } for (unsigned int i = 0; i < (*cMap).size(); ++i) { if (((*cMap)[i].first < 0) || ((*cMap)[i].first >= rdcast<int>(prbMol.getNumAtoms())) || ((*cMap)[i].second < 0) || ((*cMap)[i].second >= rdcast<int>(refMol.getNumAtoms()))) { throw_value_error("Constrained atom idx out of range"); } if ((prbMol[(*cMap)[i].first]->getAtomicNum() == 1) || (refMol[(*cMap)[i].second]->getAtomicNum() == 1)) { throw_value_error("Constrained atoms must be heavy atoms"); } } } ForceFields::PyMMFFMolProperties *prbPyMMFFMolProperties = NULL; MMFF::MMFFMolProperties *prbMolProps = NULL; ForceFields::PyMMFFMolProperties *refPyMMFFMolProperties = NULL; MMFF::MMFFMolProperties *refMolProps = NULL; if (prbProps != python::object()) { prbPyMMFFMolProperties = python::extract<ForceFields::PyMMFFMolProperties *>(prbProps); prbMolProps = prbPyMMFFMolProperties->mmffMolProperties.get(); } else { prbMolProps = new MMFF::MMFFMolProperties(prbMol); if (!prbMolProps->isValid()) { throw_value_error("missing MMFF94 parameters for probe molecule"); } } if (refProps != python::object()) { refPyMMFFMolProperties = python::extract<ForceFields::PyMMFFMolProperties *>(refProps); refMolProps = refPyMMFFMolProperties->mmffMolProperties.get(); } else { refMolProps = new MMFF::MMFFMolProperties(refMol); if (!refMolProps->isValid()) { throw_value_error("missing MMFF94 parameters for reference molecule"); } } std::vector<boost::shared_ptr<O3A> > res; { NOGIL gil; getO3AForProbeConfs(prbMol, refMol, prbMolProps, refMolProps, res, numThreads, MolAlign::O3A::MMFF94, refCid, reflect, maxIters, options, cMap, cWts); } python::list pyres; for (unsigned int i = 0; i < res.size(); ++i) { pyres.append(new PyO3A(res[i])); } if (!prbPyMMFFMolProperties) delete prbMolProps; if (!refPyMMFFMolProperties) delete refMolProps; if (cMap) { delete cMap; } if (cWts) { delete cWts; } return python::tuple(pyres); }
PyO3A *getCrippenO3A(ROMol &prbMol, ROMol &refMol, python::list prbCrippenContribs, python::list refCrippenContribs, int prbCid = -1, int refCid = -1, bool reflect = false, unsigned int maxIters = 50, unsigned int options = 0, python::list constraintMap = python::list(), python::list constraintWeights = python::list()) { MatchVectType *cMap = (python::len(constraintMap) ? _translateAtomMap(constraintMap) : nullptr); RDNumeric::DoubleVector *cWts = nullptr; if (cMap) { cWts = _translateWeights(constraintWeights); if (cWts) { if ((*cMap).size() != (*cWts).size()) { throw_value_error( "The number of weights should match the number of constraints"); } } for (auto &i : (*cMap)) { if ((i.first < 0) || (i.first >= rdcast<int>(prbMol.getNumAtoms())) || (i.second < 0) || (i.second >= rdcast<int>(refMol.getNumAtoms()))) { throw_value_error("Constrained atom idx out of range"); } if ((prbMol[i.first]->getAtomicNum() == 1) || (refMol[i.second]->getAtomicNum() == 1)) { throw_value_error("Constrained atoms must be heavy atoms"); } } } unsigned int prbNAtoms = prbMol.getNumAtoms(); std::vector<double> prbLogpContribs(prbNAtoms); unsigned int refNAtoms = refMol.getNumAtoms(); std::vector<double> refLogpContribs(refNAtoms); if ((prbCrippenContribs != python::list()) && (python::len(prbCrippenContribs) == prbNAtoms)) { for (unsigned int i = 0; i < prbNAtoms; ++i) { python::tuple logpMRTuple = python::extract<python::tuple>(prbCrippenContribs[i]); prbLogpContribs[i] = python::extract<double>(logpMRTuple[0]); } } else { std::vector<double> prbMRContribs(prbNAtoms); std::vector<unsigned int> prbAtomTypes(prbNAtoms); std::vector<std::string> prbAtomTypeLabels(prbNAtoms); Descriptors::getCrippenAtomContribs(prbMol, prbLogpContribs, prbMRContribs, true, &prbAtomTypes, &prbAtomTypeLabels); } if ((refCrippenContribs != python::list()) && (python::len(refCrippenContribs) == refNAtoms)) { for (unsigned int i = 0; i < refNAtoms; ++i) { python::tuple logpMRTuple = python::extract<python::tuple>(refCrippenContribs[i]); refLogpContribs[i] = python::extract<double>(logpMRTuple[0]); } } else { std::vector<double> refMRContribs(refNAtoms); std::vector<unsigned int> refAtomTypes(refNAtoms); std::vector<std::string> refAtomTypeLabels(refNAtoms); Descriptors::getCrippenAtomContribs(refMol, refLogpContribs, refMRContribs, true, &refAtomTypes, &refAtomTypeLabels); } O3A *o3a; { NOGIL gil; o3a = new MolAlign::O3A(prbMol, refMol, &prbLogpContribs, &refLogpContribs, MolAlign::O3A::CRIPPEN, prbCid, refCid, reflect, maxIters, options, cMap, cWts); } auto *pyO3A = new PyO3A(o3a); if (cMap) { delete cMap; } if (cWts) { delete cWts; } return pyO3A; }
PyO3A *getMMFFO3A(ROMol &prbMol, ROMol &refMol, python::object prbProps, python::object refProps, int prbCid = -1, int refCid = -1, bool reflect = false, unsigned int maxIters = 50, unsigned int options = 0, python::list constraintMap = python::list(), python::list constraintWeights = python::list()) { MatchVectType *cMap = (python::len(constraintMap) ? _translateAtomMap(constraintMap) : nullptr); RDNumeric::DoubleVector *cWts = nullptr; if (cMap) { cWts = _translateWeights(constraintWeights); if (cWts) { if ((*cMap).size() != (*cWts).size()) { throw_value_error( "The number of weights should match the number of constraints"); } } for (auto &i : (*cMap)) { if ((i.first < 0) || (i.first >= rdcast<int>(prbMol.getNumAtoms())) || (i.second < 0) || (i.second >= rdcast<int>(refMol.getNumAtoms()))) { throw_value_error("Constrained atom idx out of range"); } if ((prbMol[i.first]->getAtomicNum() == 1) || (refMol[i.second]->getAtomicNum() == 1)) { throw_value_error("Constrained atoms must be heavy atoms"); } } } ForceFields::PyMMFFMolProperties *prbPyMMFFMolProperties = nullptr; MMFF::MMFFMolProperties *prbMolProps = nullptr; ForceFields::PyMMFFMolProperties *refPyMMFFMolProperties = nullptr; MMFF::MMFFMolProperties *refMolProps = nullptr; if (prbProps != python::object()) { prbPyMMFFMolProperties = python::extract<ForceFields::PyMMFFMolProperties *>(prbProps); prbMolProps = prbPyMMFFMolProperties->mmffMolProperties.get(); } else { prbMolProps = new MMFF::MMFFMolProperties(prbMol); if (!prbMolProps->isValid()) { throw_value_error("missing MMFF94 parameters for probe molecule"); } } if (refProps != python::object()) { refPyMMFFMolProperties = python::extract<ForceFields::PyMMFFMolProperties *>(refProps); refMolProps = refPyMMFFMolProperties->mmffMolProperties.get(); } else { refMolProps = new MMFF::MMFFMolProperties(refMol); if (!refMolProps->isValid()) { throw_value_error("missing MMFF94 parameters for reference molecule"); } } O3A *o3a; { NOGIL gil; o3a = new MolAlign::O3A(prbMol, refMol, prbMolProps, refMolProps, MolAlign::O3A::MMFF94, prbCid, refCid, reflect, maxIters, options, cMap, cWts); } auto *pyO3A = new PyO3A(o3a); if (!prbPyMMFFMolProperties) delete prbMolProps; if (!refPyMMFFMolProperties) delete refMolProps; if (cMap) { delete cMap; } if (cWts) { delete cWts; } return pyO3A; }