def split_molecule_components( molecule: oechem.OEGraphMol) -> List[oechem.OEGraphMol]: """ Split an OpenEye Molecule into its bonded components. Parameters ---------- molecule: oechem.OEGraphMol An OpenEye molecule holding multiple components. Returns ------- : list of oechem.OEGraphMol A list of OpenEye molecules holding the split components. """ # determine bonded components number_of_components, part_list = oechem.OEDetermineComponents(molecule) predicate = oechem.OEPartPredAtom(part_list) # get bonded components components = [] for i in range(number_of_components): predicate.SelectPart(i + 1) component = oechem.OEGraphMol() oechem.OESubsetMol(component, molecule, predicate) components.append(component) return components
def get_binding_site(structure, ligand): """ """ partlist = oechem.OEIntArray(structure.GetMaxAtomIdx()) # get all contacts between ligand and assembly contacts = oechem.OEGetNearestNbrs(structure, ligand, 5.0) binding_site_atom_idxs = set(contact.GetBgn().GetIdx() for contact in contacts) # create the partition map for atom in structure.GetAtoms(): if atom.GetIdx() in binding_site_atom_idxs: partlist[atom.GetIdx()] = 1 entitypred = oechem.OEPartPredAtom(partlist) # select the binding site atoms entitypred.SelectPart(1) # create a new molecule for the entity binding_site = oechem.OEGraphMol() oechem.OESubsetMol(binding_site, structure, entitypred, False, False) return binding_site
def main(argv=[__name__]): if len(argv) != 3: oechem.OEThrow.Usage("%s <infile> <outfile>" % argv[0]) ifs = oechem.oemolistream() if not ifs.open(argv[1]): oechem.OEThrow.Fatal("Unable to open %s for reading" % argv[1]) ofs = oechem.oemolostream() if not ofs.open(argv[2]): oechem.OEThrow.Fatal("Unable to open %s for writing" % argv[2]) for mol in ifs.GetOEGraphMols(): numparts, partlist = oechem.OEDetermineComponents(mol) pred = oechem.OEPartPredAtom(partlist) for i in range(1, numparts + 1): pred.SelectPart(i) partmol = oechem.OEGraphMol() oechem.OESubsetMol(partmol, mol, pred) oechem.OEWriteMolecule(ofs, partmol)
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