def __init__(self, pdb_file): self.receptor = oechem.OEGraphMol() self.scorers = [oedocking.OEScore(oedocking.OEScoreType_Shapegauss), oedocking.OEScore(oedocking.OEScoreType_Chemscore), oedocking.OEScore(oedocking.OEScoreType_Chemgauss3), oedocking.OEScore(oedocking.OEScoreType_Chemgauss4), ] self.score = oedocking.OEScore(oedocking.OEScoreType_Chemgauss4) oedocking.OEReadReceptorFile(self.receptor, pdb_file) for score in self.scorers: score.Initialize(self.receptor)
def __init__(self, receptor): self.receptor = oechem.OEGraphMol() self.scorers = { 'Shapegauss': oedocking.OEScore(oedocking.OEScoreType_Shapegauss), 'Chemscore': oedocking.OEScore(oedocking.OEScoreType_Chemscore), 'Chemgauss': oedocking.OEScore(oedocking.OEScoreType_Chemgauss), 'Chemgauss3': oedocking.OEScore(oedocking.OEScoreType_Chemgauss3), 'Chemgauss4': oedocking.OEScore(oedocking.OEScoreType_Chemgauss4), } for _, score in self.scorers.items(): score.Initialize(receptor)
def main(argv=[__name__]): if len(argv) != 3: oechem.OEThrow.Usage("%s <receptor> <poses>" % argv[0]) receptor = oechem.OEGraphMol() oedocking.OEReadReceptorFile(receptor, argv[1]) oescore = oedocking.OEScore() oescore.Initialize(receptor) poses = oechem.OEGraphMol() imstr = oechem.oemolistream(argv[2]) for poses in imstr.GetOEMols(): TagPoses(oescore, poses, oescore.GetName())
def __init__(self, pdb_file, xmax, ymax, zmax, xmin, ymin, zmin): self.receptor = oechem.OEGraphMol() self.scorers = { 'Shapegauss': oedocking.OEScore(oedocking.OEScoreType_Shapegauss), 'Chemscore': oedocking.OEScore(oedocking.OEScoreType_Chemscore), 'Chemgauss': oedocking.OEScore(oedocking.OEScoreType_Chemgauss), 'Chemgauss3': oedocking.OEScore(oedocking.OEScoreType_Chemgauss3), 'Chemgauss4': oedocking.OEScore(oedocking.OEScoreType_Chemgauss4), } proteinStructure = oechem.OEGraphMol() ifs = oechem.oemolistream(pdb_file) ifs.SetFormat(oechem.OEFormat_PDB) oechem.OEReadMolecule(ifs, proteinStructure) box = oedocking.OEBox(xmax, ymax, zmax, xmin, ymin, zmin) receptor = oechem.OEGraphMol() s = oedocking.OEMakeReceptor(receptor, proteinStructure, box) for _, score in self.scorers.items(): assert (s != False) score.Initialize(receptor)
def __init__(self, pdb_file, xmax, ymax, zmax, xmin, ymin, zmin): self.receptor = oechem.OEGraphMol() self.scorers = oedocking.OEScore(oedocking.OEScoreType_Chemgauss4) proteinStructure = oechem.OEGraphMol() ifs = oechem.oemolistream(pdb_file) ifs.SetFormat(oechem.OEFormat_PDB) oechem.OEReadMolecule(ifs, proteinStructure) box = oedocking.OEBox(xmax, ymax, zmax, xmin, ymin, zmin) receptor = oechem.OEGraphMol() s = oedocking.OEMakeReceptor(receptor, proteinStructure, box) self.scorers.Initialize(receptor)
def main(argv=[__name__]): itf = oechem.OEInterface(InterfaceData) # @ <SNIPPET-RESCORE-POSES-CONFIGURE> oedocking.OEScoreTypeConfigure(itf, "-score") # @ </SNIPPET-RESCORE-POSES-CONFIGURE> if not oechem.OEParseCommandLine(itf, argv): return 1 receptor = oechem.OEGraphMol() if not oedocking.OEReadReceptorFile(receptor, itf.GetString("-receptor")): oechem.OEThrow.Fatal("Unable to read receptor") imstr = oechem.oemolistream() if not imstr.open(itf.GetString("-in")): oechem.OEThrow.Fatal("Unable to open input file of ligands") omstr = oechem.oemolostream() if not omstr.open(itf.GetString("-out")): oechem.OEThrow.Fatal("Unable to open out file for rescored ligands") # @ <SNIPPET-RESCORE-POSES-GET-VALUE> scoreType = oedocking.OEScoreTypeGetValue(itf, "-score") # @ </SNIPPET-RESCORE-POSES-GET-VALUE> # @ <SNIPPET-RESCORE-POSES-SETUP-SCORE> score = oedocking.OEScore(scoreType) # @ </SNIPPET-RESCORE-POSES-SETUP-SCORE> # @ <SNIPPET-RESCORE-POSES-INITIALIZE> score.Initialize(receptor) # @ </SNIPPET-RESCORE-POSES-INITIALIZE> for ligand in imstr.GetOEMols(): if itf.GetBool("-optimize"): # @ <SNIPPET-RESCORE-POSES-OPTIMIZE> score.SystematicSolidBodyOptimize(ligand) # @ </SNIPPET-RESCORE-POSES-OPTIMIZE> # @ <SNIPPET-RESCORE-POSES-ANNOTATE> score.AnnotatePose(ligand) # @ </SNIPPET-RESCORE-POSES-ANNOTATE> sdtag = score.GetName() # @ <SNIPPET-RESCORE-POSES-ASSIGN-SCORE> oedocking.OESetSDScore(ligand, score, sdtag) # @ </SNIPPET-RESCORE-POSES-ASSIGN-SCORE> # @ <SNIPPET-RESCORE-POSES-SCORE-SORTING> oechem.OESortConfsBySDTag(ligand, sdtag, score.GetHighScoresAreBetter()) # @ </SNIPPET-RESCORE-POSES-SCORE-SORTING> oechem.OEWriteMolecule(omstr, ligand) return 0
def main(argv=[__name__]): if len(argv) != 3: oechem.OEThrow.Usage("%s <receptor> <ligand>" % argv[0]) receptor = oechem.OEGraphMol() oedocking.OEReadReceptorFile(receptor, argv[1]) oescore = oedocking.OEScore() oescore.Initialize(receptor) imstr = oechem.oemolistream(argv[2]) mcmol = oechem.OEMol() oechem.OEReadMolecule(imstr, mcmol) for pose in mcmol.GetConfs(): PrintScore(oescore, pose) for atom in pose.GetAtoms(): PrintAtomScore(oescore, pose, atom)
def main(argv=[__name__]): if len(argv) != 3: oechem.OEThrow.Usage("%s <receptor> <ligand>" % argv[0]) # @ <SNIPPET-SCORE-BOX-1> protein = oechem.OEGraphMol() imstr = oechem.oemolistream(argv[1]) oechem.OEReadMolecule(imstr, protein) pose = oechem.OEGraphMol() imstr.open(argv[2]) oechem.OEReadMolecule(imstr, pose) addbox = 4.0 box = oedocking.OEBox() oedocking.OESetupBox(box, pose, addbox) oescore = oedocking.OEScore() oescore.Initialize(protein, box)
def generate_restricted_conformers(receptor, refmol, mol, core_smarts=None): """ Generate and select a conformer of the specified molecule using the reference molecule Parameters ---------- receptor : openeye.oechem.OEGraphMol Receptor (already prepped for docking) for identifying optimal pose refmol : openeye.oechem.OEGraphMol Reference molecule which shares some part in common with the proposed molecule mol : openeye.oechem.OEGraphMol Molecule whose conformers are to be enumerated core_smarts : str, optional, default=None If core_smarts is specified, substructure will be extracted using SMARTS. """ from openeye import oechem, oeomega # DEBUG: For benzotriazoles, truncate refmol core_smarts = 'c1ccc(NC(=O)[C,N]n2nnc3ccccc32)cc1' # prospective core_smarts = 'NC(=O)[C,N]n2nnc3ccccc32' # retrospective # Get core fragment if core_smarts: # Truncate refmol to SMARTS if specified #print(f'Trunctating using SMARTS {refmol_smarts}') ss = oechem.OESubSearch(core_smarts) oechem.OEPrepareSearch(refmol, ss) for match in ss.Match(refmol): core_fragment = oechem.OEGraphMol() oechem.OESubsetMol(core_fragment, match) break #print(f'refmol has {refmol.NumAtoms()} atoms') else: core_fragment = GetCoreFragment(refmol, [mol]) oechem.OESuppressHydrogens(core_fragment) #print(f' Core fragment has {core_fragment.NumAtoms()} heavy atoms') MIN_CORE_ATOMS = 6 if core_fragment.NumAtoms() < MIN_CORE_ATOMS: return None # Create an Omega instance #omegaOpts = oeomega.OEOmegaOptions() omegaOpts = oeomega.OEOmegaOptions(oeomega.OEOmegaSampling_Dense) # Set the fixed reference molecule omegaFixOpts = oeomega.OEConfFixOptions() omegaFixOpts.SetFixMaxMatch(10) # allow multiple MCSS matches omegaFixOpts.SetFixDeleteH(True) # only use heavy atoms omegaFixOpts.SetFixMol(core_fragment) #omegaFixOpts.SetFixSmarts(smarts) omegaFixOpts.SetFixRMS(0.5) atomexpr = oechem.OEExprOpts_Aromaticity | oechem.OEExprOpts_Hybridization bondexpr = oechem.OEExprOpts_BondOrder | oechem.OEExprOpts_Aromaticity omegaFixOpts.SetAtomExpr(atomexpr) omegaFixOpts.SetBondExpr(bondexpr) omegaOpts.SetConfFixOptions(omegaFixOpts) molBuilderOpts = oeomega.OEMolBuilderOptions() molBuilderOpts.SetStrictAtomTypes(False) # don't give up if MMFF types are not found omegaOpts.SetMolBuilderOptions(molBuilderOpts) omegaOpts.SetWarts(False) # expand molecule title omegaOpts.SetStrictStereo(False) # set strict stereochemistry omegaOpts.SetIncludeInput(False) # don't include input omegaOpts.SetMaxConfs(1000) # generate lots of conformers #omegaOpts.SetEnergyWindow(10.0) # allow high energies omega = oeomega.OEOmega(omegaOpts) from openeye import oequacpac if not oequacpac.OEGetReasonableProtomer(mol): print('No reasonable protomer found') return None mol = oechem.OEMol(mol) # multi-conformer molecule ret_code = omega.Build(mol) if (mol.GetDimension() != 3) or (ret_code != oeomega.OEOmegaReturnCode_Success): print(f'Omega failure: {mol.GetDimension()} and {oeomega.OEGetOmegaError(ret_code)}') return None # Extract poses class Pose(object): def __init__(self, conformer): self.conformer = conformer self.clash_score = None self.docking_score = None self.overlap_score = None poses = [ Pose(conf) for conf in mol.GetConfs() ] # Score clashes bump_check = BumpCheck(receptor) for pose in poses: pose.clash_score = bump_check.count(pose.conformer) # Score docking poses from openeye import oedocking score = oedocking.OEScore(oedocking.OEScoreType_Chemgauss4) score.Initialize(receptor) for pose in poses: pose.docking_score = score.ScoreLigand(pose.conformer) # Compute overlap scores from openeye import oeshape overlap_prep = oeshape.OEOverlapPrep() overlap_prep.Prep(refmol) shapeFunc = oeshape.OEExactShapeFunc() shapeFunc.SetupRef(refmol) oeshape_result = oeshape.OEOverlapResults() for pose in poses: tmpmol = oechem.OEGraphMol(pose.conformer) overlap_prep.Prep(tmpmol) shapeFunc.Overlap(tmpmol, oeshape_result) pose.overlap_score = oeshape_result.GetRefTversky() # Filter poses based on top 10% of overlap poses = sorted(poses, key= lambda pose : pose.overlap_score) poses = poses[int(0.9*len(poses)):] # Select the best docking score import numpy as np poses = sorted(poses, key=lambda pose : pose.docking_score) pose = poses[0] mol.SetActive(pose.conformer) oechem.OESetSDData(mol, 'clash_score', str(pose.clash_score)) oechem.OESetSDData(mol, 'docking_score', str(pose.docking_score)) oechem.OESetSDData(mol, 'overlap_score', str(pose.overlap_score)) # Convert to single-conformer molecule mol = oechem.OEGraphMol(mol) return mol
def generate_restricted_conformers(receptor, refmol, mol, core_smarts=None): """ Generate and select a conformer of the specified molecule using the reference molecule Parameters ---------- receptor : openeye.oechem.OEGraphMol Receptor (already prepped for docking) for identifying optimal pose refmol : openeye.oechem.OEGraphMol Reference molecule which shares some part in common with the proposed molecule mol : openeye.oechem.OEGraphMol Molecule whose conformers are to be enumerated core_smarts : str, optional, default=None If core_smarts is specified, substructure will be extracted using SMARTS. """ from openeye import oechem, oeomega logging.debug( f'mol: {oechem.OEMolToSmiles(mol)} | core_smarts: {core_smarts}') # Be quiet from openeye import oechem oechem.OEThrow.SetLevel(oechem.OEErrorLevel_Quiet) #oechem.OEThrow.SetLevel(oechem.OEErrorLevel_Error) # Get core fragment if core_smarts: # Truncate refmol to SMARTS if specified #print(f'Trunctating using SMARTS {refmol_smarts}') ss = oechem.OESubSearch(core_smarts) oechem.OEPrepareSearch(refmol, ss) for match in ss.Match(refmol): core_fragment = oechem.OEGraphMol() oechem.OESubsetMol(core_fragment, match) logging.debug( f'Truncated refmol to generate core_fragment: {oechem.OEMolToSmiles(core_fragment)}' ) break #print(f'refmol has {refmol.NumAtoms()} atoms') else: core_fragment = GetCoreFragment(refmol, [mol]) oechem.OESuppressHydrogens(core_fragment) #print(f' Core fragment has {core_fragment.NumAtoms()} heavy atoms') MIN_CORE_ATOMS = 6 if core_fragment.NumAtoms() < MIN_CORE_ATOMS: return None # Create an Omega instance #omegaOpts = oeomega.OEOmegaOptions() omegaOpts = oeomega.OEOmegaOptions(oeomega.OEOmegaSampling_Dense) # Set the fixed reference molecule omegaFixOpts = oeomega.OEConfFixOptions() omegaFixOpts.SetFixMaxMatch(10) # allow multiple MCSS matches omegaFixOpts.SetFixDeleteH(True) # only use heavy atoms omegaFixOpts.SetFixMol(core_fragment) #omegaFixOpts.SetFixSmarts(core_smarts) # DEBUG omegaFixOpts.SetFixRMS(0.5) # This causes a warning: #Warning: OESubSearch::Match() is unable to match unset hybridization in the target (EN300-221518_3_1) for patterns with set hybridization, call OEPrepareSearch on the target first #atomexpr = oechem.OEExprOpts_Aromaticity | oechem.OEExprOpts_Hybridization atomexpr = oechem.OEExprOpts_Aromaticity | oechem.OEExprOpts_AtomicNumber bondexpr = oechem.OEExprOpts_BondOrder | oechem.OEExprOpts_Aromaticity omegaFixOpts.SetAtomExpr(atomexpr) omegaFixOpts.SetBondExpr(bondexpr) omegaOpts.SetConfFixOptions(omegaFixOpts) molBuilderOpts = oeomega.OEMolBuilderOptions() molBuilderOpts.SetStrictAtomTypes( False) # don't give up if MMFF types are not found omegaOpts.SetMolBuilderOptions(molBuilderOpts) omegaOpts.SetWarts(False) # expand molecule title omegaOpts.SetStrictStereo(True) # set strict stereochemistry omegaOpts.SetIncludeInput(False) # don't include input omegaOpts.SetMaxConfs(1000) # generate lots of conformers omegaOpts.SetEnergyWindow(20.0) # allow high energies omega = oeomega.OEOmega(omegaOpts) # TODO: Expand protonation states and tautomers from openeye import oequacpac if not oequacpac.OEGetReasonableProtomer(mol): logging.warning('No reasonable protomer found') return None mol = oechem.OEMol(mol) # multi-conformer molecule ret_code = omega.Build(mol) if (mol.GetDimension() != 3) or (ret_code != oeomega.OEOmegaReturnCode_Success): msg = f'\nOmega failure for {mol.GetTitle()} : SMILES {oechem.OEMolToSmiles(mol)} : core_smarts {core_smarts} : {oeomega.OEGetOmegaError(ret_code)}\n' logging.warning(msg) return None # Return the molecule with an error code #oechem.OESetSDData(mol, 'error', '{oeomega.OEGetOmegaError(ret_code)}') #return mol # Extract poses class Pose(object): def __init__(self, conformer): self.conformer = conformer self.clash_score = None self.docking_score = None self.overlap_score = None poses = [Pose(conf) for conf in mol.GetConfs()] # Score clashes bump_check = BumpCheck(receptor) for pose in poses: pose.clash_score = bump_check.count(pose.conformer) # Score docking poses from openeye import oedocking score = oedocking.OEScore(oedocking.OEScoreType_Chemgauss4) score.Initialize(receptor) for pose in poses: pose.docking_score = score.ScoreLigand(pose.conformer) # Compute overlap scores from openeye import oeshape overlap_prep = oeshape.OEOverlapPrep() overlap_prep.Prep(refmol) shapeFunc = oeshape.OEExactShapeFunc() shapeFunc.SetupRef(refmol) oeshape_result = oeshape.OEOverlapResults() for pose in poses: tmpmol = oechem.OEGraphMol(pose.conformer) overlap_prep.Prep(tmpmol) shapeFunc.Overlap(tmpmol, oeshape_result) pose.overlap_score = oeshape_result.GetRefTversky() # Filter poses based on top 10% of overlap poses = sorted(poses, key=lambda pose: pose.overlap_score) poses = poses[int(0.9 * len(poses)):] # Select the best docking score import numpy as np poses = sorted(poses, key=lambda pose: pose.docking_score) pose = poses[0] mol.SetActive(pose.conformer) oechem.OESetSDData(mol, 'clash_score', str(pose.clash_score)) oechem.OESetSDData(mol, 'docking_score', str(pose.docking_score)) oechem.OESetSDData(mol, 'overlap_score', str(pose.overlap_score)) # Convert to single-conformer molecule mol = oechem.OEGraphMol(mol) # Compute MMFF energy energy = mmff_energy(mol) oechem.OESetSDData(mol, 'MMFF_internal_energy', str(energy)) # Store SMILES docked_smiles = oechem.OEMolToSmiles(mol) oechem.OESetSDData(mol, 'docked_smiles', docked_smiles) return mol
def __init__(self, pdb_file): self.receptor = oechem.OEGraphMol() self.score = oedocking.OEScore(oedocking.OEScoreType_Chemgauss4) oedocking.OEReadReceptorFile(self.receptor, pdb_file) self.score.Initialize(self.receptor)
def __init__(self, receptor): self.receptor = oechem.OEGraphMol() self.scorers = oedocking.OEScore(oedocking.OEScoreType_Chemgauss4) self.scorers.Initialize(receptor)