import numpy as np
import copy
# Отображение структур
import IPython.display
import ipywidgets
from IPython.display import display,display_svg,SVG,Image
# Open Drug Discovery Toolkit
import oddt
import oddt.docking
import oddt.interactions
# Органик
from rdkit.Chem import Draw
from rdkit.Chem import AllChem
from rdkit.Chem import MolFromSmiles
from rdkit.Chem.Draw import IPythonConsole
import pmx
from os import system
def chemdraw(smiles):
mol = MolFromSmiles(smiles)
AllChem.Compute2DCoords(mol)
display(mol)
Для работы возьмем модель с прошлого практикума
pdb=pmx.Model('../pr10/QUERY.B99990005.pdb')
Локализуем лиганд
for r in pdb.residues[-5:]:
print r
Сделаем новые пдб - только лиганд и только модель
newpdb = pdb.copy()
for r in newpdb.residues[-3:]:
newpdb.remove_residue(r)
lig = pdb.copy()
for r in lig.residues[:-3]:
lig.remove_residue(r)
lig.writePDB('ligand.pdb')
newpdb.writePDB('base.pdb')
Найдем геометрический центр лиганда - приближение положения сайта связывания
coords = np.zeros((len(lig.atoms),3))
for c,a in enumerate(lig.atoms):
coords[c,:] = a.x
geom_center = np.mean(coords, axis = 0)
print geom_center
Подготовим белок
prot = oddt.toolkit.readfile('pdb','base.pdb').next()
prot.OBMol.AddPolarHydrogens()
prot.OBMol.AutomaticPartialCharge()
prot.molwt
Придумаем субстраты
NAG = "CC(=O)NC1C(C(C(OC1O)CO)O)O"
chemdraw(NAG)
Замещаем группу -NH-C(CH3)=O
NAG_OH = "OC1C(C(C(OC1O)CO)O)O"
NAG_N = "[NH3+]C1C(C(C(OC1O)CO)O)O"
NAG_H = "C1C(C(C(OC1O)CO)O)O"
NAG_Ph = "C1=CC=C(C=C1)C1C(C(C(OC1O)CO)O)O"
Посмотрим, что это за вещества, и подготовим их структуры к докингу
mols = []
for nag in (NAG_OH, NAG_N, NAG_H, NAG_Ph):
chemdraw(nag)
m = oddt.toolkit.readstring('smi', nag)
if not m.OBMol.Has3D():
m.make3D(forcefield='mmff94', steps=1000)
m.removeh()
m.OBMol.AddPolarHydrogens()
mols.append(m)
Докинг
dock_obj= oddt.docking.AutodockVina.autodock_vina(
protein=prot,size=(20,20,20),center=geom_center,
executable='/usr/bin/vina',autocleanup=True, num_modes=20)
print dock_obj.tmp_dir
print " ".join(dock_obj.params)
res = dock_obj.dock(mols,prot)
display(Image('all.png'))
Запишем пдб-файлы и сохраним в таблицу аффинность
results = np.zeros((len(res),3),dtype=object)
for i,r in enumerate(res):
r.write(filename='r%s.pdb' % i, format='pdb')
results[i] = [i, r.formula, float(r.data['vina_affinity'])]
top3 = sorted(results, key=lambda x: x[2])[:3]
top3
display(Image('27.png'))
display(Image('28.png'))
display(Image('29.png'))
В топ-3 вошли позиции модификации с фенилом, что не удивительно. Подобная модификация мимикрирует еще одно моносахаридное кольцо по форме. Также 29 образует пи-пи стекинг
Посмотрим лучших по остальным трем веществам
res_nag_h = results[results[:,1] == 'C6H12O5',:]
res_nag_oh = results[results[:,1] == 'C6H12O6',:]
res_nag_nh3 = results[results[:,1] == 'C6H14NO5',:]
print res_nag_h[res_nag_h[:,2] == np.min(res_nag_h[:,2]),0][0]
print res_nag_oh[res_nag_oh[:,2] == np.min(res_nag_oh[:,2]),0][0]
print res_nag_nh3[res_nag_nh3[:,2] == np.min(res_nag_nh3[:,2]),0][0]
display(Image('18.png'))
display(Image('0.png'))
display(Image('9.png'))