def QuickOpt(Mol): """ Fast MM optimization to whittle down number of conformers before QM. Default Szybki OEOptType type set to steepest descent (SD) based on preliminary comparisons. Parameters ---------- Mol: single OEChem molecule (aka single conformer) Returns ------- boolean: True if completed successfully, False otherwise. """ # set general energy options along with the run type specification optSzybki = oeszybki.OESzybkiOptions() optSzybki.SetForceFieldType(oeszybki.OEForceFieldType_MMFF94S) optSzybki.SetSolventModel(oeszybki.OESolventModel_Sheffield) optSzybki.SetOptimizerType(oeszybki.OEOptType_SD) taglabel = 'MM Szybki SD Energy' # generate szybki MMFF94 engine for minimization szOpt = oeszybki.OESzybki(optSzybki) # construct a results object to contain the results of a szybki calculation szResults = oeszybki.OESzybkiResults() # work on a copy of the molecule tmpmol = oechem.OEMol(Mol) if not szOpt(tmpmol, szResults): print('szybki run failed for %s' % tmpmol.GetTitle()) return False Mol.SetCoords(tmpmol.GetCoords()) oechem.OESetSDData(Mol, oechem.OESDDataPair(taglabel, "%.12f" \ % szResults.GetTotalEnergy())) return True
def main(args): if len(args) != 3: oechem.OEThrow.Usage("%s input_molecule output_molecule" % args[0]) ifs = oechem.oemolistream() if not ifs.open(args[1]): oechem.OEThrow.Fatal("Unable to open %s for reading" % args[1]) ofs = oechem.oemolostream() if not ofs.open(args[2]): oechem.OEThrow.Fatal("Unable to open %s for writing" % args[2]) opts = oeszybki.OESzybkiOptions() opts.GetOptOptions().SetOptimizerType(oeszybki.OEOptType_NEWTON) opts.GetGeneralOptions().SetForceFieldType( oeszybki.OEForceFieldType_MMFF94S) opts.GetSolventOptions().SetSolventModel(oeszybki.OESolventModel_Sheffield) opts.GetSolventOptions().SetChargeEngine(oequacpac.OEChargeEngineNoOp()) sz = oeszybki.OESzybki(opts) res = oeszybki.OESzybkiResults() for mol in ifs.GetOEMols(): for conf in mol.GetConfs(): if sz(conf, res): oechem.OESetSDData( conf, oechem.OESDDataPair('Total_energy', "%0.4f" % res.GetTotalEnergy())) oechem.OEWriteMolecule(ofs, mol) ifs.close() ofs.close() return 0
def resolve_clashes(mol, clashfile): """ Minimize conformers with severe steric interaction. Parameters ---------- mol : single OEChem molecule (single conformer) clashfile : string name of file to write output Returns ------- boolean True if completed successfully, False otherwise. """ # set general energy options along with the single-point specification spSzybki = oeszybki.OESzybkiOptions() spSzybki.SetForceFieldType(oeszybki.OEForceFieldType_MMFF94S) spSzybki.SetSolventModel(oeszybki.OESolventModel_Sheffield) spSzybki.SetRunType(oeszybki.OERunType_SinglePoint) # generate the szybki MMFF94 engine for single points szSP = oeszybki.OESzybki(spSzybki) # construct minimiz options from single-points options to get general optns optSzybki = oeszybki.OESzybkiOptions(spSzybki) # now reset the option for minimization optSzybki.SetRunType(oeszybki.OERunType_CartesiansOpt) # generate szybki MMFF94 engine for minimization szOpt = oeszybki.OESzybki(optSzybki) # add strong harmonic restraints to nonHs szOpt.SetHarmonicConstraints(10.0) # construct a results object to contain the results of a szybki calculation szResults = oeszybki.OESzybkiResults() # work on a copy of the molecule tmpmol = oechem.OEMol(mol) if not szSP(tmpmol, szResults): print('szybki run failed for %s' % tmpmol.GetTitle()) return False Etotsp = szResults.GetTotalEnergy() Evdwsp = szResults.GetEnergyTerm(oeszybki.OEPotentialTerms_MMFFVdW) if Evdwsp > 35: if not szOpt(tmpmol, szResults): print('szybki run failed for %s' % tmpmol.GetTitle()) return False Etot = szResults.GetTotalEnergy() Evdw = szResults.GetEnergyTerm(oeszybki.OEPotentialTerms_MMFFVdW) wfile = open(clashfile, 'a') wfile.write('%s resolved bad clash: initial vdW: %.4f ; ' 'resolved EvdW: %.4f\n' % (tmpmol.GetTitle(), Evdwsp, Evdw)) wfile.close() mol.SetCoords(tmpmol.GetCoords()) oechem.OESetSDData(mol, oechem.OESDDataPair('MM Szybki Single Point Energy'\ , "%.12f" % szResults.GetTotalEnergy())) return True
def DumpSDData(mol): print("SD data of", mol.GetTitle()) # loop over SD data for dp in oechem.OEGetSDDataPairs(mol): print(dp.GetTag(), ':', dp.GetValue()) print() mol = oechem.OEGraphMol() oechem.OESmilesToMol(mol, "c1ccccc1") mol.SetTitle("benzene") # set some tagged data oechem.OESetSDData(mol, "color", "brown") oechem.OESetSDData(mol, oechem.OESDDataPair("size", "small")) DumpSDData(mol) # check for existence of data, then delete it if oechem.OEHasSDData(mol, "size"): oechem.OEDeleteSDData(mol, "size") DumpSDData(mol) # add additional color data oechem.OEAddSDData(mol, "color", "black") DumpSDData(mol) # remove all SD data oechem.OEClearSDData(mol) DumpSDData(mol) # @ </SNIPPET>