def main(argv): if len(argv) != 2: oechem.OEThrow.Usage("%s <receptor>" % argv[0]) receptor = oechem.OEGraphMol() oedocking.OEReadReceptorFile(receptor, argv[1]) # @ <SNIPPET-RECEPTOR-BOUND-LIGAND-EDITING-1> if oedocking.OEReceptorHasBoundLigand(receptor): print("Receptor has a bound ligand") else: print("Receptor does not have bound ligand") # @ </SNIPPET-RECEPTOR-BOUND-LIGAND-EDITING-1> # @ <SNIPPET-RECEPTOR-BOUND-LIGAND-EDITING-2> ligand = oechem.OEGraphMol() if oedocking.OEReceptorHasBoundLigand(receptor): ligand = oedocking.OEReceptorGetBoundLigand(receptor) # @ </SNIPPET-RECEPTOR-BOUND-LIGAND-EDITING-2> # @ <SNIPPET-RECEPTOR-BOUND-LIGAND-EDITING-3> oedocking.OEReceptorSetBoundLigand(receptor, ligand) # @ </SNIPPET-RECEPTOR-BOUND-LIGAND-EDITING-3> # @ <SNIPPET-RECEPTOR-BOUND-LIGAND-EDITING-4> oedocking.OEReceptorClearBoundLigand(receptor)
def dock_molecules_to_receptor(receptor_filename): """ Dock the specified molecules, writing out to specified file Parameters ---------- receptor_filename : str Receptor .oeb.gz filename fragment : str The fragment name to dock to """ import os # Read the receptor from openeye import oechem, oedocking receptor = oechem.OEGraphMol() if not oedocking.OEReadReceptorFile(receptor, receptor_filename): oechem.OEThrow.Fatal("Unable to read receptor") if not oedocking.OEReceptorHasBoundLigand(receptor): raise Exception("Receptor does not have bound ligand") #print('Initializing receptor...') dockMethod = oedocking.OEDockMethod_Hybrid2 dockResolution = oedocking.OESearchResolution_Default dock = oedocking.OEDock(dockMethod, dockResolution) success = dock.Initialize(receptor) # Set up Omega #print('Expanding conformers...') from openeye import oeomega #omegaOpts = oeomega.OEOmegaOptions(oeomega.OEOmegaSampling_Dense) omegaOpts = oeomega.OEOmegaOptions() omega = oeomega.OEOmega(omegaOpts) omega.SetStrictStereo(False) # Dock molecules docked_molecules = list() for mol in molecules: dockedMol = oechem.OEGraphMol() # Expand conformers omega.Build(mol) # Dock molecule #print(f'Docking {mol.NumConfs()} conformers...') retCode = dock.DockMultiConformerMolecule(dockedMol, mol) if (retCode != oedocking.OEDockingReturnCode_Success): print("Docking Failed with error code " + oedocking.OEDockingReturnCodeGetName(retCode)) continue # Store docking data sdtag = oedocking.OEDockMethodGetName(dockMethod) oedocking.OESetSDScore(dockedMol, dock, sdtag) dock.AnnotatePose(dockedMol) docked_molecules.append( oechem.OEMol(dockedMol) ) return docked_molecules
def dock_molecules(receptor_filename, molecules, filename): """ Dock the specified molecules, writing out to specified file Parameters ---------- receptor_filename : str Receptor .oeb.gz filename molecules : list of openeye.oechem.OEMol The read molecules to dock filename : str The filename to stream docked molecules to """ # Read the receptor print('Loading receptor...') from openeye import oechem, oedocking receptor = oechem.OEGraphMol() if not oedocking.OEReadReceptorFile(receptor, 'receptor.oeb.gz'): oechem.OEThrow.Fatal("Unable to read receptor") if oedocking.OEReceptorHasBoundLigand(receptor): print("Receptor has a bound ligand") else: print("Receptor does not have bound ligand") print('Initializing receptor...') dockMethod = oedocking.OEDockMethod_Hybrid2 dockResolution = oedocking.OESearchResolution_High dock = oedocking.OEDock(dockMethod, dockResolution) success = dock.Initialize(receptor) # Set up Omega from openeye import oeomega omegaOpts = oeomega.OEOmegaOptions(oeomega.OEOmegaSampling_Dense) #omegaOpts = oeomega.OEOmegaOptions() omega = oeomega.OEOmega(omegaOpts) omega.SetStrictStereo(False) # Dock molecules with oechem.oemolostream(filename) as ofs: from tqdm import tqdm for mol in tqdm(molecules): dockedMol = oechem.OEGraphMol() # Expand conformers omega.Build(mol) # Dock molecule retCode = dock.DockMultiConformerMolecule(dockedMol, mol) if (retCode != oedocking.OEDockingReturnCode_Success): oechem.OEThrow.Fatal("Docking Failed with error code " + oedocking.OEDockingReturnCodeGetName(retCode)) # Store docking data sdtag = oedocking.OEDockMethodGetName(dockMethod) oedocking.OESetSDScore(dockedMol, dock, sdtag) dock.AnnotatePose(dockedMol) # Write molecule oechem.OEWriteMolecule(ofs, dockedMol)
def get_receptor(receptor_file=None, use_hybrid=True, high_resolution=True): """ :param receptor_file: file to .oeb or oeb.gz with prepared protein receptor :param use_hybrid: whether or not to override using hybrid docking method :param high_resolution: set resolution for search :return: docking objector from OE, the receptor oemol """ from . import dock_conf from openeye import oedocking receptor = dock_conf.PrepareReceptorFromBinary(receptor_file) if oedocking.OEReceptorHasBoundLigand(receptor) and use_hybrid: dock_method = oedocking.OEDockMethod_Hybrid else: dock_method = oedocking.OEDockMethod_Chemgauss4 if high_resolution: reso = oedocking.OESearchResolution_High else: reso = oedocking.OESearchResolution_Default dock = oedocking.OEDock(dock_method, reso) dock.Initialize(receptor) return dock, receptor
def receptor_from_file(receptor_filename): receptor = oechem.OEGraphMol() if not oedocking.OEReadReceptorFile(receptor, receptor_filename): oechem.OEThrow.Fatal("Unable to read receptor") if not oedocking.OEReceptorHasBoundLigand(receptor): raise Exception("Receptor does not have bound ligand") return receptor
def begin(self): receptor = oechem.OEGraphMol() self.args.receptor = utils.download_dataset_to_file(self.args.receptor) if not oedocking.OEReadReceptorFile(receptor, str(self.args.receptor)): raise Exception("Unable to read receptor from {0}".format(self.args.receptor)) # Initialize Docking dock_method = oedocking.OEDockMethod_Hybrid if not oedocking.OEReceptorHasBoundLigand(receptor): oechem.OEThrow.Warning("No bound ligand, switching OEDockMethod to ChemGauss4.") dock_method = oedocking.OEDockMethod_Chemgauss4 dock_resolution = oedocking.OESearchResolution_Default self.sdtag = oedocking.OEDockMethodGetName(dock_method) self.dock = oedocking.OEDock(dock_method, dock_resolution) if not self.dock.Initialize(receptor): raise Exception("Unable to initialize Docking with {0}".format(self.args.receptor))
def dock_molecule(receptor, molecule_smiles, n_conformations=10, n_poses=2): """Run the multi-conformer docker. Parameters ---------- receptor : openeye.oedocking.OEReceptor The openeye receptor. molecule_smiles : str The SMILES string of the molecule. n_conformations : int, optional The number of omega conformations to pass to the multi-conformer docker (default is 10). n_poses : int, optional Number of binding poses to return. Returns ------- docked_oemol : openeye.oechem.OEMol The docked multi-conformer OpenEye molecule. """ from openeye import oechem, oedocking import openmoltools as moltools if oedocking.OEReceptorHasBoundLigand(receptor): dock = oedocking.OEHybrid(oedocking.OEDockMethod_Hybrid2, oedocking.OESearchResolution_High) else: dock = oedocking.OEDock() dock.Initialize(receptor) molecule_oemol = moltools.openeye.smiles_to_oemol(molecule_smiles) molecule_oemol = moltools.openeye.get_charges(molecule_oemol, keep_confs=n_conformations) docked_oemol = oechem.OEMol() dock.DockMultiConformerMolecule(docked_oemol, molecule_oemol, n_poses) return docked_oemol
def dock_molecule_to_receptor(molecule, receptor_filename, covalent=False): """ Dock the specified molecules, writing out to specified file Parameters ---------- molecule : oechem.OEMol The molecule to dock receptor_filename : str Receptor to dock to covalent : bool, optional, default=False If True, try to place covalent warheads in proximity to CYS145 Returns ------- docked_molecule : openeye.oechem.OEMol Returns the best tautomer/protomer in docked geometry, annotated with docking score None is returned if no viable docked pose found """ import os # Extract the fragment name for the receptor fragment = extract_fragment_from_filename(receptor_filename) # Read the receptor from openeye import oechem, oedocking receptor = oechem.OEGraphMol() if not oedocking.OEReadReceptorFile(receptor, receptor_filename): oechem.OEThrow.Fatal("Unable to read receptor") #print(f'Receptor has {receptor.NumAtoms()} atoms') if not oedocking.OEReceptorHasBoundLigand(receptor): raise Exception("Receptor does not have bound ligand") #print('Initializing receptor...') dockMethod = oedocking.OEDockMethod_Hybrid2 dockResolution = oedocking.OESearchResolution_High dock = oedocking.OEDock(dockMethod, dockResolution) success = dock.Initialize(receptor) # Add covalent restraint if specified warheads_found = find_warheads(molecule) if covalent and len(warheads_found) > 0: warheads_found = set(warheads_found.keys()) # Initialize covalent constraints customConstraints = oedocking.OEReceptorGetCustomConstraints(receptor) # Find CYS145 SG atom hv = oechem.OEHierView(receptor) hres = hv.GetResidue("A", "CYS", 145) proteinHeavyAtom = None for atom in hres.GetAtoms(): if atom.GetName().strip() == 'SG': proteinHeavyAtom = atom break if proteinHeavyAtom is None: raise Exception('Could not find CYS145 SG') # Add the constraint feature = customConstraints.AddFeature() feature.SetFeatureName("CYS145 proximity") for warhead_type in warheads_found: smarts = covalent_warhead_smarts[warhead_type] print(f'Adding constraint for SMARTS pattern {smarts}') feature.AddSmarts(smarts) sphereRadius = 4.0 # Angstroms sphereCenter = oechem.OEFloatArray(3) receptor.GetCoords(proteinHeavyAtom, sphereCenter) sphere = feature.AddSphere() sphere.SetRad(sphereRadius) sphere.SetCenter(sphereCenter[0], sphereCenter[1], sphereCenter[2]) oedocking.OEReceptorSetCustomConstraints(receptor, customConstraints) # Enumerate tautomers from openeye import oequacpac tautomer_options = oequacpac.OETautomerOptions() tautomer_options.SetMaxTautomersGenerated(4096) tautomer_options.SetMaxTautomersToReturn(16) tautomer_options.SetCarbonHybridization(True) tautomer_options.SetMaxZoneSize(50) tautomer_options.SetApplyWarts(True) pKa_norm = True tautomers = [ oechem.OEMol(tautomer) for tautomer in oequacpac.OEGetReasonableTautomers(molecule, tautomer_options, pKa_norm) ] # Set up Omega #print('Expanding conformers...') from openeye import oeomega #omegaOpts = oeomega.OEOmegaOptions(oeomega.OEOmegaSampling_Dense) omegaOpts = oeomega.OEOmegaOptions() #omegaOpts.SetMaxConfs(5000) omegaOpts.SetMaxSearchTime(60.0) # time out omega = oeomega.OEOmega(omegaOpts) omega.SetStrictStereo(False) # enumerate sterochemistry if uncertain # Dock tautomers docked_molecules = list() from tqdm import tqdm for mol in tautomers: dockedMol = oechem.OEGraphMol() # Expand conformers omega.Build(mol) # Dock molecule retCode = dock.DockMultiConformerMolecule(dockedMol, mol) if (retCode != oedocking.OEDockingReturnCode_Success): #print("Docking Failed with error code " + oedocking.OEDockingReturnCodeGetName(retCode)) continue # Store docking data sdtag = oedocking.OEDockMethodGetName(dockMethod) oedocking.OESetSDScore(dockedMol, dock, sdtag) oechem.OESetSDData(dockedMol, "docked_fragment", fragment) dock.AnnotatePose(dockedMol) docked_molecules.append( dockedMol.CreateCopy() ) if len(docked_molecules) == 0: return None # Select the best-ranked molecule and pose # Note that this ignores protonation state and tautomer penalties docked_molecules.sort(key=score) best_molecule = docked_molecules[0] return best_molecule