def doO3Dalign(i, mol, qmol, threshold, perfect_score, writer, conformerProps=None, minEnergy=None): pyO3As = rdMolAlign.GetO3AForProbeConfs(mol, qmol) best_score = 0 j = 0 conf_id = -1 for pyO3A in pyO3As: align = pyO3A.Align() score = pyO3A.Score() if score > best_score: best_score = score conf_id = j j += 1 #utils.log("Best score = ",best_score) if not threshold or perfect_score - best_score < threshold: utils.log(i, align, score, Chem.MolToSmiles(mol, isomericSmiles=True)) mol.SetDoubleProp(field_O3DAScore, score) if conformerProps and minEnergy: eAbs = conformerProps[conf_id][(conformers.field_EnergyAbs)] eDelta = eAbs - minEnergy if eAbs: mol.SetDoubleProp(conformers.field_EnergyAbs, eAbs) if eDelta: mol.SetDoubleProp(conformers.field_EnergyDelta, eDelta) writer.write(mol, confId=conf_id) return 1 return 0
def test15MultiConfs(self): " test multi-conf alignment " sdf = os.path.join(RDConfig.RDBaseDir, 'Code', 'GraphMol', 'MolAlign', 'test_data', 'ref_e2.sdf') suppl = Chem.SDMolSupplier(sdf, removeHs=False) refMol = suppl[13] sdf = os.path.join(RDConfig.RDBaseDir, 'Code', 'GraphMol', 'MolAlign', 'test_data', 'probe_mol.sdf') prbSuppl = Chem.SDMolSupplier(sdf, removeHs=False) tms = [x for x in prbSuppl] prbMol = tms[0] for tm in tms[1:]: prbMol.AddConformer(tm.GetConformer(), True) self.failUnlessEqual(prbMol.GetNumConformers(), 50) refParams = ChemicalForceFields.MMFFGetMoleculeProperties(refMol) prbParams = ChemicalForceFields.MMFFGetMoleculeProperties(prbMol) cp = Chem.Mol(prbMol) o3s = rdMolAlign.GetO3AForProbeConfs(cp, refMol, 1, prbParams, refParams) for i in range(prbMol.GetNumConformers()): cp2 = Chem.Mol(prbMol) o3 = rdMolAlign.GetO3A(cp2, refMol, prbParams, refParams, prbCid=i) self.failUnlessAlmostEqual(o3s[i].Align(), o3.Align(), 6) self.failUnlessAlmostEqual(o3s[i].Score(), o3.Score(), 6) cp = Chem.Mol(prbMol) o3s = rdMolAlign.GetCrippenO3AForProbeConfs(cp, refMol) for i in range(prbMol.GetNumConformers()): cp2 = Chem.Mol(prbMol) o3 = rdMolAlign.GetCrippenO3A(cp2, refMol, prbCid=i) self.failUnlessAlmostEqual(o3s[i].Align(), o3.Align(), 6) self.failUnlessAlmostEqual(o3s[i].Score(), o3.Score(), 6)
def doO3Dalign(i, mol, qmol, use_crippen, threshold, perfect_score, writer, conformerProps=None, minEnergy=None): if use_crippen: pyO3As = rdMolAlign.GetCrippenO3AForProbeConfs(mol, qmol) else: pyO3As = rdMolAlign.GetO3AForProbeConfs(mol, qmol) if len(pyO3As) == 0: return 0 best_score = 0 j = 0 conf_id = -1 for pyO3A in pyO3As: align = pyO3A.Align() score = pyO3A.Score() if score > best_score: best_score = score conf_id = j j += 1 #utils.log("Best score = ",best_score) if not threshold or perfect_score - best_score < threshold: utils.log("Molecule", i, align, score) mol.SetDoubleProp(field_O3DAScore, score) if conformerProps and minEnergy: eAbs = conformerProps[conf_id][(conformers.field_EnergyAbs)] eDelta = eAbs - minEnergy if eAbs: mol.SetDoubleProp(conformers.field_EnergyAbs, eAbs) if eDelta: mol.SetDoubleProp(conformers.field_EnergyDelta, eDelta) writer.write(mol, confId=conf_id) return 1 return 0
def test16MultithreadBug(self): " test multi-conf alignment " nConfs = 10 sdf = os.path.join(RDConfig.RDBaseDir, 'Code', 'GraphMol', 'MolAlign', 'test_data', 'bzr_data.sdf') bzr_ms_o = [x for x in Chem.SDMolSupplier(sdf, removeHs=False)] bzr_ms = [Chem.Mol(x) for x in bzr_ms_o] for m in bzr_ms: c = m.GetConformer() while m.GetNumConformers() < nConfs: cc = Chem.Conformer(c) m.AddConformer(cc, assignId=True) #refParams = ChemicalForceFields.MMFFGetMoleculeProperties(bzr_ms_o[0]) for i, m in enumerate(bzr_ms): #prbParams = ChemicalForceFields.MMFFGetMoleculeProperties(m) algs = rdMolAlign.GetO3AForProbeConfs( m, bzr_ms_o[0], numThreads=4 #,prbPyMMFFMolProperties=prbParams, #refPyMMFFMolProperties=refParams ) self.failUnlessEqual(len(algs), nConfs)