def __call__(self, item : str): ligand = oechem.OEGraphMol() ligand_name = oechem.oemolistream() ligand_name.openstring(item) oechem.OEReadPDBFile(ligand_name, ligand) return [scorer.ScoreLigand(ligand) for scorer in self.scorers]
def PrepareReceptor(pdb,padding=4,outpath=""): """ Prepares a receptor from a pdb with a crystalized ligand Padding controls the docking region. If outpath is given, PrepareReceptor will write an openeye binary (oeb) of the receptor structure. This will be faster than rebuilding the receptor every time. """ print("STOP CALLING THIS FUNCTION") exit() com = oechem.OEGraphMol() ifs = oechem.oemolistream() if ifs.open(pdb): oechem.OEReadPDBFile(ifs, com) ifs.close() """ Sorry, this requires some explanation. Openeye wasn't recognizing the previously docked ligand, so I tried to find other ways. The next blocks of code take our system and split it based on its connected components, for which its REQUIRED that our protein only has a single chain. It assumes that the last component is the ligand. It then creates the ligand (lig) and protein (prot) as separate molecules. Next, it finds the minimum and maximum 3D coordinates of the current ligand and produces a box around it with the specified padding. Finally it uses this box to create a 'receptor' object into which ligands can be docked. Only the receptor is returned. Openeye's docking shouldn't be this involved, but I couldn't get it to run the typical 'hybrid' docking without error. """ oechem.OEDetermineConnectivity(com) nparts, connect = oechem.OEDetermineComponents(com) if(nparts != 2): print("ERR in dock_conf::prepareReceptor. PDB doesn't have 2 connected components") exit() ## TODO: What is a good way to catch errors? # Get apo pred = oechem.OEPartPredAtom(connect) pred.SelectPart(nparts) lig = oechem.OEGraphMol() oechem.OESubsetMol(lig, com, pred) print(lig) # Get protein pred = oechem.OEPartPredAtom(connect) pred.SelectPart(1) prot = oechem.OEGraphMol() oechem.OESubsetMol(prot, com, pred) # Get box dimensions by iterating over ligand x_min = y_min = z_min = float('inf') x_max = y_max = z_max = -float('inf') crd = lig.GetCoords() print("CRD", crd) for atm in crd: x,y,z = crd[atm] if x < x_min: x_min = x if y < y_min: y_min = y if z < z_min: z_min = z if x > x_max: x_max = x if y > y_max: y_max = y if z > z_max: z_max = z x_min -= padding y_min -= padding z_min -= padding x_max += padding y_max += padding z_max += padding print(x_min,y_min,z_max, y_max) # Now prepare the receptor receptor = oechem.OEGraphMol() box = oedocking.OEBox() box.Setup(x_max, y_max, z_max, x_min, y_min, z_min) oedocking.OEMakeReceptor(receptor, prot, box) if not outpath == "": oedocking.OEWriteReceptorFile(receptor,f'{outpath}/receptor.oeb') return receptor
def create_openeye_molecule(pdb, options, verbose=True): """ Create OpenEye molecule from PDB representation. The molecule will have hydrogens added and be normalized, but the overall geometry will not be altered. Parameters ---------- pdb : Pdb The PDB-extracted entries for the ligand. Returns ------- molecule : openeye.oechem.OEMol Molecule representation. options : options struct Options structure. """ # Create a molecule container. molecule = oechem.OEGraphMol() # Open a PDB file reader from the stored PDB string representation of HETATM and CONECT records. print pdb.pdb_extract ifs = oechem.oemolistream() ifs.openstring(pdb.pdb_extract) flavor = oechem.OEIFlavor_Generic_Default | oechem.OEIFlavor_PDB_Default | oechem.OEIFlavor_PDB_ALL ifs.SetFlavor(oechem.OEFormat_PDB, flavor) oechem.OEReadPDBFile(ifs, molecule) # Add explicit hydrogens. oechem.OEDetermineConnectivity(molecule) oechem.OEFindRingAtomsAndBonds(molecule) oechem.OEAssignAromaticFlags(molecule) # check aromaticity oechem.OEPerceiveBondOrders(molecule) # We must assign implicit hydrogens first so that the valence model will be correct. oechem.OEAssignImplicitHydrogens(molecule) oechem.OEAssignFormalCharges(molecule) # Now add explicit hydrogens. polarOnly = False set3D = True oechem.OEAddExplicitHydrogens(molecule, polarOnly, set3D) # TODO: Sequentially number hydrogen atoms. # Perceive stereochemostry. oechem.OEPerceiveChiral(molecule) # Set title. molecule.SetTitle(options.ligand) # Write out PDB form of this molecule. # TODO: Fix atom numbering. #if verbose: print "Writing input molecule as PDB..." #outmol = oechem.OEMol(molecule) #ofs = oechem.oemolostream() #flavor = oechem.OEOFlavor_Generic_Default | oechem.OEOFlavor_PDB_Default #ofs.SetFlavor(oechem.OEFormat_PDB, flavor) #ofs.open(options.ligand + '.pdb') #oechem.OEWriteMolecule(ofs, outmol) #ofs.close() # Write mol2 file for this molecule. if verbose: print "Writing input molecule as mol2..." outmol = oechem.OEMol(molecule) ofs = oechem.oemolostream() filename = options.ligand + '.mol2' ofs.open(filename) oechem.OEWriteMolecule(ofs, outmol) ofs.close() # Use low level writer to get atom names correct. ofs = oechem.oemolostream() ofs.open(filename) for (dest_atom, src_atom) in zip(outmol.GetAtoms(), molecule.GetAtoms()): dest_atom.SetName(src_atom.GetName()) oechem.OEWriteMol2File(ofs, outmol, True) ofs.close() # Read and write in PDB format. if verbose: print "Converting mol2 to PDB..." ifs = oechem.oemolistream() ofs = oechem.oemolostream() if ifs.open(options.ligand + '.mol2'): if ofs.open(options.ligand + '.pdb'): for mol in ifs.GetOEGraphMols(): oechem.OEWriteMolecule(ofs, mol) return molecule
#!/usr/bin/env python import sys from openeye import oechem class BumpCheck: def __init__(self, prot_mol, cutoff=2.0): self.near_nbr = oechem.OENearestNbrs(prot_mol, cutoff) self.cutoff = cutoff def count(self, lig_mol): bump_count = 0 for nb in self.near_nbr.GetNbrs(lig_mol): if (not nb.GetBgn().IsHydrogen()) and (not nb.GetEnd().IsHydrogen()) and nb.GetDist() <= self.cutoff: bump_count += 1 return bump_count if __name__ == "__main__": PROT = sys.argv[1] LIG = sys.argv[2] prot = oechem.OEMol() oechem.OEReadPDBFile(oechem.oemolistream(PROT), prot) bump_check = BumpCheck(prot) for lig_mol in oechem.oemolistream(LIG).GetOEGraphMols(): print(bump_check.count(lig_mol))
# SaaS offerings (each a "Customer"). # Customer is hereby permitted to use, copy, and modify the Sample Code, # subject to these terms. OpenEye claims no rights to Customer's # modifications. Modification of Sample Code is at Customer's sole and # exclusive risk. Sample Code may require Customer to have a then # current license or subscription to the applicable OpenEye offering. # THE SAMPLE CODE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED. OPENEYE DISCLAIMS ALL WARRANTIES, INCLUDING, BUT # NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY, FITNESS FOR A # PARTICULAR PURPOSE AND NONINFRINGEMENT. In no event shall OpenEye be # liable for any damages or liability in connection with the Sample Code # or its use. # @ <SNIPPET> from openeye import oechem import sys ifs = oechem.oemolistream(sys.argv[1]) ofs = oechem.oemolostream(sys.argv[2]) mol = oechem.OEGraphMol() oechem.OEReadPDBFile(ifs, mol) # @ <SNIPPET-CONNECT-PERCEIVE> oechem.OEDetermineConnectivity(mol) oechem.OEFindRingAtomsAndBonds(mol) oechem.OEPerceiveBondOrders(mol) oechem.OEAssignImplicitHydrogens(mol) oechem.OEAssignFormalCharges(mol) # @ </SNIPPET-CONNECT-PERCEIVE> oechem.OEWriteMolecule(ofs, mol) # @ </SNIPPET>
def __call__(self, item: str): ligand = oechem.OEGraphMol() ligand_name = oechem.oemolistream() ligand_name.openstring(item) oechem.OEReadPDBFile(ligand_name, ligand) return {'Chemgauss4': self.score.ScoreLigand(ligand)}