Source code for bsitep.utils.pocket_utils
import numpy as np
from skimage.segmentation import clear_border
from skimage.morphology import closing
from skimage.measure import label
from scipy.spatial.distance import cdist
[docs]
def get_pockets_segmentation(density, threshold=0.5, min_size=50, scale=0.5):
voxel_size = (1 / scale) ** 3
bw = closing((density[0] > threshold).any(axis=0))
cleared = clear_border(bw)
label_image, num_labels = label(cleared, return_num=True)
for i in range(1, num_labels + 1):
pocket_idx = (label_image == i)
pocket_size = pocket_idx.sum() * voxel_size
if pocket_size < min_size:
label_image[np.where(pocket_idx)] = 0
binding_score = density[0][density[0] > threshold].mean()
return label_image, binding_score
[docs]
def save_pocket_mol(density, origin, step, mol, dist_cutoff=4.5, expand_residue=True):
coords = np.array([a.coords for a in mol.atoms])
atom2residue = np.array([a.residue.idx for a in mol.atoms])
max_len = max(len(a.atoms) for a in mol.residues)
residue2atom = np.array([a_list + [-1]*(max_len - len(a_list)) for a_list in [[a.idx - 1 for a in r.atoms] for r in mol.residues]])
pockets, binding_score = get_pockets_segmentation(density)
pocket_atoms = []
for pocket_label in range(1, pockets.max() + 1):
indices = np.argwhere(pockets == pocket_label).astype('float32')
indices *= np.asarray(step)
indices += np.asarray(origin)
distance = cdist(coords, indices)
close_atoms = np.where((distance < dist_cutoff).any(axis=1))[0]
if len(close_atoms) == 0:
continue
if expand_residue:
residue_ids = np.unique(atom2residue[close_atoms])
close_atoms = np.concatenate(residue2atom[residue_ids])
pocket_atoms.append([int(idx) for idx in close_atoms])
pocket_mols = []
for pocket in pocket_atoms:
pocket_mol = mol.clone
atoms_to_del = (set(range(len(pocket_mol.atoms))) - set(pocket))
pocket_mol.OBMol.BeginModify()
for aidx in sorted(atoms_to_del, reverse=True):
atom = pocket_mol.OBMol.GetAtom(aidx + 1)
pocket_mol.OBMol.DeleteAtom(atom)
pocket_mol.OBMol.EndModify()
pocket_mols.append(pocket_mol)
return pocket_mols, binding_score