void testMMFFO3AConstraintsAndLocalOnly() { std::string rdbase = getenv("RDBASE"); std::string sdf = rdbase + "/Code/GraphMol/MolAlign/test_data/ref_e2.sdf"; SDMolSupplier supplier(sdf, true, false); const int refNum = 23; const int prbNum = 32; ROMol *refMol = supplier[refNum]; ROMol *prbMol = supplier[prbNum]; unsigned int refNAtoms = refMol->getNumAtoms(); std::vector<double> refLogpContribs(refNAtoms); 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); unsigned int prbNAtoms = prbMol->getNumAtoms(); std::vector<double> prbLogpContribs(prbNAtoms); 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); RWMol *patt = SmartsToMol("S"); MatchVectType matchVect; TEST_ASSERT(SubstructMatch(*refMol, (ROMol &)*patt, matchVect)); delete patt; unsigned int refSIdx = matchVect[0].second; matchVect.clear(); patt = SmartsToMol("O"); TEST_ASSERT(SubstructMatch(*prbMol, (ROMol &)*patt, matchVect)); delete patt; unsigned int prbOIdx = matchVect[0].second; std::vector<double> distOS(2); distOS[0] = 2.7; distOS[1] = 0.4; std::vector<double> weights(2); weights[0] = 0.1; weights[1] = 100.0; for (unsigned int i = 0; i < 2; ++i) { MatchVectType constraintMap; constraintMap.push_back(std::make_pair(prbOIdx, refSIdx)); RDNumeric::DoubleVector constraintWeights(1); constraintWeights[0] = weights[i]; MolAlign::O3A *o3a = new MolAlign::O3A(*prbMol, *refMol, &prbLogpContribs, &refLogpContribs, MolAlign::O3A::CRIPPEN, -1, -1, false, 50, 0, &constraintMap, &constraintWeights); TEST_ASSERT(o3a); o3a->align(); delete o3a; o3a = new MolAlign::O3A(*prbMol, *refMol, &prbLogpContribs, &refLogpContribs, MolAlign::O3A::CRIPPEN, -1, -1, false, 50, MolAlign::O3_LOCAL_ONLY); TEST_ASSERT(o3a); o3a->align(); delete o3a; double d = (prbMol->getConformer().getAtomPos(prbOIdx) - refMol->getConformer().getAtomPos(refSIdx)).length(); TEST_ASSERT(feq(d, distOS[i], 0.1)); } }
void test2AtomMap() { std::string rdbase = getenv("RDBASE"); std::string fname1 = rdbase + "/Code/GraphMol/MolAlign/test_data/1oir.mol"; ROMol *m1 = MolFileToMol(fname1); std::string fname2 = rdbase + "/Code/GraphMol/MolAlign/test_data/1oir_conf.mol"; ROMol *m2 = MolFileToMol(fname2); MatchVectType atomMap; atomMap.push_back(std::pair<int, int>(18, 27)); atomMap.push_back(std::pair<int, int>(13, 23)); atomMap.push_back(std::pair<int, int>(21, 14)); atomMap.push_back(std::pair<int, int>(24, 7)); atomMap.push_back(std::pair<int, int>(9, 19)); atomMap.push_back(std::pair<int, int>(16, 30)); double rmsd = MolAlign::alignMol(*m2, *m1, 0, 0, &atomMap); TEST_ASSERT(RDKit::feq(rmsd, 0.8525)); delete m1; delete m2; }
void test3Weights() { std::string rdbase = getenv("RDBASE"); std::string fname1 = rdbase + "/Code/GraphMol/MolAlign/test_data/1oir.mol"; ROMol *m1 = MolFileToMol(fname1); std::string fname2 = rdbase + "/Code/GraphMol/MolAlign/test_data/1oir_conf.mol"; ROMol *m2 = MolFileToMol(fname2); MatchVectType atomMap; atomMap.push_back(std::pair<int, int>(18, 27)); atomMap.push_back(std::pair<int, int>(13, 23)); atomMap.push_back(std::pair<int, int>(21, 14)); atomMap.push_back(std::pair<int, int>(24, 7)); atomMap.push_back(std::pair<int, int>(9, 19)); atomMap.push_back(std::pair<int, int>(16, 30)); RDNumeric::DoubleVector wts(6); wts.setVal(0, 1.0); wts.setVal(1, 1.0); wts.setVal(2, 1.0); wts.setVal(3, 1.0); wts.setVal(4, 1.0); wts.setVal(5, 2.0); double rmsd = MolAlign::alignMol(*m2, *m1, 0, 0, &atomMap, &wts); TEST_ASSERT(RDKit::feq(rmsd, 0.9513)); delete m1; delete m2; }
void testCrippenO3AConstraints() { ROMol *m = SmilesToMol("n1ccc(cc1)-c1ccccc1"); TEST_ASSERT(m); ROMol *m1 = MolOps::addHs(*m); delete m; TEST_ASSERT(m1); DGeomHelpers::EmbedMolecule(*m1); MMFF::sanitizeMMFFMol((RWMol &)(*m1)); MMFF::MMFFMolProperties mp(*m1); TEST_ASSERT(mp.isValid()); ForceFields::ForceField *field = MMFF::constructForceField(*m1, &mp); field->initialize(); field->minimize(); RWMol *patt = SmartsToMol("nccc-cccc"); MatchVectType matchVect; TEST_ASSERT(SubstructMatch(*m1, (ROMol &)*patt, matchVect)); unsigned int nIdx = matchVect[0].second; unsigned int cIdx = matchVect[matchVect.size() - 1].second; MolTransforms::setDihedralDeg(m1->getConformer(), matchVect[2].second, matchVect[3].second, matchVect[4].second, matchVect[5].second, 0.0); ROMol m2(*m1); MolAlign::randomTransform(m2); ROMol m3(m2); unsigned int prbNAtoms = m2.getNumAtoms(); std::vector<double> prbLogpContribs(prbNAtoms); std::vector<double> prbMRContribs(prbNAtoms); std::vector<unsigned int> prbAtomTypes(prbNAtoms); std::vector<std::string> prbAtomTypeLabels(prbNAtoms); Descriptors::getCrippenAtomContribs(m2, prbLogpContribs, prbMRContribs, true, &prbAtomTypes, &prbAtomTypeLabels); MolAlign::O3A *o3a = new MolAlign::O3A(m2, *m1, &prbLogpContribs, &prbLogpContribs, MolAlign::O3A::CRIPPEN); TEST_ASSERT(o3a); o3a->align(); delete o3a; double d = (m2.getConformer().getAtomPos(cIdx) - m1->getConformer().getAtomPos(cIdx)).length(); TEST_ASSERT(feq(d, 0.0, 1)); MatchVectType constraintMap; constraintMap.push_back(std::make_pair(cIdx, nIdx)); o3a = new MolAlign::O3A(m3, *m1, &prbLogpContribs, &prbLogpContribs, MolAlign::O3A::CRIPPEN, -1, -1, false, 50, 0, &constraintMap); TEST_ASSERT(o3a); o3a->align(); delete o3a; d = (m3.getConformer().getAtomPos(cIdx) - m1->getConformer().getAtomPos(cIdx)).length(); TEST_ASSERT(feq(d, 7.0, 1.0)); delete m1; }
void testCrippenO3AConstraintsAndLocalOnly() { std::string rdbase = getenv("RDBASE"); std::string sdf = rdbase + "/Code/GraphMol/MolAlign/test_data/ref_e2.sdf"; SDMolSupplier supplier(sdf, true, false); const int refNum = 23; const int prbNum = 32; ROMol *refMol = supplier[refNum]; ROMol *prbMol = supplier[prbNum]; MMFF::MMFFMolProperties refMP(*refMol); TEST_ASSERT(refMP.isValid()); MMFF::MMFFMolProperties prbMP(*prbMol); TEST_ASSERT(prbMP.isValid()); RWMol *patt = SmartsToMol("S"); MatchVectType matchVect; TEST_ASSERT(SubstructMatch(*refMol, (ROMol &)*patt, matchVect)); delete patt; unsigned int refSIdx = matchVect[0].second; matchVect.clear(); patt = SmartsToMol("O"); TEST_ASSERT(SubstructMatch(*prbMol, (ROMol &)*patt, matchVect)); delete patt; unsigned int prbOIdx = matchVect[0].second; std::vector<double> distOS(2); distOS[0] = 3.2; distOS[1] = 0.3; std::vector<double> weights(2); weights[0] = 10.0; weights[1] = 100.0; for (unsigned int i = 0; i < 2; ++i) { MatchVectType constraintMap; constraintMap.push_back(std::make_pair(prbOIdx, refSIdx)); RDNumeric::DoubleVector constraintWeights(1); constraintWeights[0] = weights[i]; MolAlign::O3A *o3a = new MolAlign::O3A(*prbMol, *refMol, &prbMP, &refMP, MolAlign::O3A::MMFF94, -1, -1, false, 50, 0, &constraintMap, &constraintWeights); TEST_ASSERT(o3a); o3a->align(); delete o3a; o3a = new MolAlign::O3A(*prbMol, *refMol, &prbMP, &refMP, MolAlign::O3A::MMFF94, -1, -1, false, 50, MolAlign::O3_LOCAL_ONLY); TEST_ASSERT(o3a); o3a->align(); delete o3a; double d = (prbMol->getConformer().getAtomPos(prbOIdx) - refMol->getConformer().getAtomPos(refSIdx)).length(); TEST_ASSERT(feq(d, distOS[i], 0.1)); } }
MatchVectType *_translateAtomMap(python::object atomMap) { PySequenceHolder<python::object> aMapSeq(atomMap); MatchVectType *aMap; aMap = 0; unsigned int i, nAtms = aMapSeq.size(); if (nAtms > 0) { aMap = new MatchVectType; for (i = 0; i < nAtms; ++i) { PySequenceHolder<int> item(aMapSeq[i]); if (item.size() != 2) { delete aMap; aMap = 0; throw_value_error("Incorrect format for atomMap"); } aMap->push_back(std::pair<int, int>(item[0], item[1])); } } return aMap; }
MatchVectType findFuncGroupsOnMol(const ROMol &mol, const FragCatParams *params, INT_VECT &fgBonds) { PRECONDITION(params,"bad params"); fgBonds.clear(); std::pair<int, int> amat; MatchVectType aidFgrps; std::vector<MatchVectType> fgpMatches; std::vector<MatchVectType>::const_iterator mati; MatchVectType::const_iterator mi; int aid; //const ROMol *fgrp; INT_VECT_CI bi; aidFgrps.clear(); int fid = 0; const MOL_SPTR_VECT &fgrps = params->getFuncGroups(); MOL_SPTR_VECT::const_iterator fgci; for (fgci = fgrps.begin(); fgci != fgrps.end(); fgci++) { const ROMol *fgrp = fgci->get(); std::string fname; (*fgci)->getProp(common_properties::_Name, fname); //std::cout << "Groups number: " << fname << "\n"; //(*fgci)->debugMol(std::cout); //mol->debugMol(std::cout); // match this functional group onto the molecule SubstructMatch(mol, *fgrp, fgpMatches); // loop over all the matches we get for this fgroup for (mati = fgpMatches.begin(); mati != fgpMatches.end(); mati++) { //FIX: we will assume that the first atom in fgrp is always the connection // atom amat = mati->front(); aid = amat.second; //FIX: is this correct - the second entry in the pair is the atom ID from mol // grab the list of atom Ids from mol that match the functional group INT_VECT bondIds, maids; for (mi = mati->begin(); mi != mati->end(); mi++) { maids.push_back(mi->second); } // create a list of bond IDs from these atom ID // these are the bond in mol that are part of portion that matches the // functional group bondIds = Subgraphs::bondListFromAtomList(mol, maids); // now check if all these bonds have been covered as part of larger // functional group that was dealt with earlier // FIX: obviously we assume here that the function groups in params // come in decreasing order of size. bool allDone = true; for (bi = bondIds.begin(); bi != bondIds.end(); bi++) { if (std::find(fgBonds.begin(), fgBonds.end(), (*bi)) == fgBonds.end()) { allDone = false; fgBonds.push_back(*bi); } } if (!allDone) { // this functional group mapping onto mol is not part of a larger func // group mapping so record it aidFgrps.push_back(std::pair<int, int>(aid, fid)); } } fid++; } return aidFgrps; }