В этом задании предлагалось познакомиться с докингом низкомолекулярных соединений с помощью пакетов Autodock Vina и oddt в структуру лизоцима.
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.Draw import IPythonConsole
import pmx # Модуль для манипулирования pdb
Подготовка белка
pdb=pmx.Model('LAMBD_L.B99990001.pdb')
for r in pdb.residues[135:]:
print r #посмотрим остатки
# создание объектов белок и лиганда
newpdb = pdb.copy()
lig = pdb.copy()
del newpdb.residues[158:]
del lig.residues[:158]
Находим геометрический центр лиганда.
x_list = []
y_list = []
z_list = []
for a in lig.atoms:
x_list.append(a.x[0])
y_list.append(a.x[1])
z_list.append(a.x[2])
x_ave = reduce(lambda k, l: k+l, x_list)/len(x_list)
y_ave = reduce(lambda k, l: k+l, y_list)/len(y_list)
z_ave = reduce(lambda k, l: k+l, z_list)/len(z_list)
newpdb.writePDB("LAMBD.pdb")
Подготовка белка к докингу.
prot = oddt.toolkit.readfile('pdb','LAMBD.pdb').next()
prot.OBMol.AddPolarHydrogens()
prot.OBMol.AutomaticPartialCharge()
print 'is it the first mol in 1lmp is protein?',prot.protein,':) and MW of this mol is:', prot.molwt
Загружаем лиганды для докинга.
smiles = ['c1cccc(O)c1', 'c1c(O)ccc(O)c1','c1(O)cc(c2ccccc2)cc(O)c1']
mols= []
images =[]
for s in smiles:
m = oddt.toolkit.readstring('smi', s)
if not m.OBMol.Has3D():
m.make3D(forcefield='mmff94', steps=150)
m.removeh()
m.OBMol.AddPolarHydrogens()
mols.append(m)
###with print m.OBMol.Has3D() was found that:
### deep copy needed to keep 3D , write svg make mols flat
images.append((SVG(copy.deepcopy(m).write('svg'))))
display_svg(*images)
Делаем докинг.
#create docking object
dock_obj= oddt.docking.AutodockVina.autodock_vina(
protein=prot,size=(20,20,20),center=[x_ave,y_ave,z_ave],
executable='/usr/bin/vina',autocleanup=True, num_modes=20)
print dock_obj.tmp_dir
print " ".join(dock_obj.params) # Опишите выдачу
# do it
res = dock_obj.dock(mols,prot)
Смотрим результаты докинга.
for i,r in enumerate(res):
print "%4d%10s%8s%8s%8s" %(i,r.formula, r.data['vina_affinity'], r.data['vina_rmsd_ub'], r.residues[0].name)
Анализ докинга.
for i,r in enumerate(res):
hbs = oddt.interactions.hbonds(prot,r)
stack= oddt.interactions.pi_stacking(prot,r)
phob = oddt.interactions.hydrophobic_contacts(prot,r)
print "%8s%8s%8s" % (len(hbs[1]), len(stack[1]), len(phob[1]))
Визуализация.
for i,r in enumerate(res):
r.write(filename='r%s.pdb' % i, format='pdb')
Еще раз результаты докинга, но отсортированные по 'vina_affinity'.
import collections
doc_dic = {}
for i,r in enumerate(res):
doc_dic[float(r.data['vina_affinity'])] = "%4d%10s%8s%8s%8s" %(i,r.formula, r.data['vina_affinity'], r.data['vina_rmsd_ub'], r.residues[0].name)
dd = collections.OrderedDict(sorted(doc_dic.items()))
for key in dd:
print dd[key]