Пример #1
0
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;
}
Пример #2
0
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);
}
Пример #3
0
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;
}
Пример #4
0
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);
}
Пример #5
0
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);
}
Пример #6
0
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;
}
Пример #7
0
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;
}