class Analyze: def __init__(self, protein, ligand, within=7.5): self.protein = protein self.ligand = ligand genASite = GenActiveSite(within=within) self.asite = genASite(self.protein, self.ligand) renumberResidues(self.asite) log(f'nAtoms of asite {self.asite.GetNumAtoms()}') complex = Chem.CombineMols(self.asite, self.ligand) self.pmol = PDBComplex() cont = Chem.MolToPDBBlock(complex).replace('UNL 1', 'MOL 1') self.pmol.load_pdb(cont, as_string=True) self.pmol.analyze() def getPLIPComplexToProteinMap(self): N = self.protein.GetNumAtoms() protein_coords = getCoordinates(self.protein) cpmap = {} for i in self.pmol.atoms: atom = self.pmol.get_atom(i) d = np.linalg.norm(np.tile(np.array(atom.coords), N).reshape( (N, 3)) - protein_coords, axis=1) minidx = d.argmin() if d[minidx] < 1e-3: cpmap[atom.idx] = minidx.item() return cpmap def getPLIPComplexToLigandMap(self): N = self.ligand.GetNumAtoms() ligand_coords = getCoordinates(self.ligand) clmap = {} for i in self.pmol.atoms: atom = self.pmol.get_atom(i) d = np.linalg.norm(np.tile(np.array(atom.coords), N).reshape( (N, 3)) - ligand_coords, axis=1) minidx = d.argmin() if d[minidx] < 1e-3: clmap[atom.idx] = minidx.item() return clmap def getPLIPComplexToASiteMap(self): N = self.asite.GetNumAtoms() asite_coords = getCoordinates(self.asite) camap = {} for i in self.pmol.atoms: atom = self.pmol.get_atom(i) d = np.linalg.norm(np.tile(np.array(atom.coords), N).reshape( (N, 3)) - asite_coords, axis=1) minidx = d.argmin() if d[minidx] < 1e-3: camap[atom.idx] = minidx.item() return camap def interactions(self): camap = self.getPLIPComplexToASiteMap() clmap = self.getPLIPComplexToLigandMap() for bsite, iacts in self.pmol.interaction_sets.items(): for ia in iacts.all_itypes: iact = Inter(ia) if not iact.isValid(): continue aidxs = list(map(lambda x: camap[x], iact.P())) lidxs = list(map(lambda x: clmap[x], iact.L())) yield bsite, iact.name, aidxs, lidxs