Докинг низкомолекулярных лигандов в структуру белка

В этом задании предлагалось познакомиться с докингом низкомолекулярных соединений с помощью пакетов Autodock Vina и oddt.

В качестве объекта берется лизоцим, структура которого уже была построена ранее.

In [1]:
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 

Далее подготовка белка.

In [2]:
pdb=pmx.Model('LAMBD_L.B99990001.pdb')

for r in pdb.residues[135:]:
    print r #посмотрим остатки
<Molecule: id = 136 name = GLU chain_id =    natoms = 9>
<Molecule: id = 137 name = HIS chain_id =    natoms = 10>
<Molecule: id = 138 name = LYS chain_id =    natoms = 9>
<Molecule: id = 139 name = ALA chain_id =    natoms = 5>
<Molecule: id = 140 name = ASP chain_id =    natoms = 8>
<Molecule: id = 141 name = SER chain_id =    natoms = 6>
<Molecule: id = 142 name = LEU chain_id =    natoms = 8>
<Molecule: id = 143 name = ILE chain_id =    natoms = 8>
<Molecule: id = 144 name = ALA chain_id =    natoms = 5>
<Molecule: id = 145 name = LYS chain_id =    natoms = 9>
<Molecule: id = 146 name = PHE chain_id =    natoms = 11>
<Molecule: id = 147 name = LYS chain_id =    natoms = 9>
<Molecule: id = 148 name = GLU chain_id =    natoms = 9>
<Molecule: id = 149 name = ALA chain_id =    natoms = 5>
<Molecule: id = 150 name = GLY chain_id =    natoms = 4>
<Molecule: id = 151 name = GLY chain_id =    natoms = 4>
<Molecule: id = 152 name = THR chain_id =    natoms = 7>
<Molecule: id = 153 name = VAL chain_id =    natoms = 7>
<Molecule: id = 154 name = ARG chain_id =    natoms = 11>
<Molecule: id = 155 name = GLU chain_id =    natoms = 9>
<Molecule: id = 156 name = ILE chain_id =    natoms = 8>
<Molecule: id = 157 name = ASP chain_id =    natoms = 8>
<Molecule: id = 158 name = VAL chain_id =    natoms = 8>
<Molecule: id = 159 name = NAG chain_id =    natoms = 14>
<Molecule: id = 160 name = NAG chain_id =    natoms = 14>
<Molecule: id = 161 name = NDG chain_id =    natoms = 15>
In [3]:
# создание объектов белок и лиганда
newpdb = pdb.copy()
lig = pdb.copy()
del newpdb.residues[158:]
del lig.residues[:158]

Находим геометрический центр лиганда.

In [4]:
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)
In [5]:
newpdb.writePDB("LAMBD.pdb")

Теперь подготовка белка к докингу

In [6]:
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 
is it the first mol in 1lmp is protein? False :) and MW of this mol is: 18452.56116

Вообще-то по файлу, если посмотреть глазами, белок как белок. Не понятно, почему программа его не признала.

Теперь лиганды для докинга.

In [7]:
smiles = ['CC(=O)NC1C(C(C(OC1O)CO)O)O', 'OC(=O)NC1C(C(C(OC1O)CO)O)O', '[NH3+]C(=O)NC1C(C(C(OC1O)CO)O)O', 
          'C(=O)NC1C(C(C(OC1O)CO)O)O', 'C1=CC=CC=C1C(=O)NC1C(C(C(OC1O)CO)O)O', '[O-]C(=O)NC1C(C(C(OC1O)CO)O)O']
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)
***** - Open Babel Depiction O H H H H H O O O CH 3 O N O *****
***** - Open Babel Depiction O H H H H H H O O O O O N O *****
***** - Open Babel Depiction H H H H H H H H O O O N O O N O *****
***** - Open Babel Depiction O H H H H H O O O O N O *****
***** - Open Babel Depiction H H H H H O O O O O N O *****
***** - Open Babel Depiction O H H H H H O O O O O N HO *****

И, собственно, докинг.

In [8]:
#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) # Опишите выдачу
/tmp/autodock_vina_pn2BDY
--center_x 40.4721946154 --center_y 34.33903 --center_z 21.2514769231 --size_x 20 --size_y 20 --size_z 20 --cpu 1 --exhaustiveness 8 --num_modes 20 --energy_range 3
In [9]:
# do it
res = dock_obj.dock(mols,prot)

Результаты докинга

In [10]:
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)
   0  C8H15NO6     3.8   0.000     UNL
   1  C8H15NO6     4.9   4.826     UNL
   2  C7H13NO7     2.8   0.000     UNL
   3  C7H13NO7     2.9  14.459     UNL
   4  C7H13NO7     2.9   9.557     UNL
   5  C7H13NO7     3.6   4.768     UNL
   6  C7H13NO7     4.9   9.156     UNL
   7 C7H16N2O6     2.6   0.000     UNL
   8 C7H16N2O6     3.1  14.495     UNL
   9 C7H16N2O6     3.3  13.045     UNL
  10 C7H16N2O6     3.8  12.333     UNL
  11 C7H16N2O6     4.4   2.451     UNL
  12 C7H16N2O6     5.3  11.828     UNL
  13  C7H13NO6     2.5   0.000     UNL
  14  C7H13NO6     2.8   9.295     UNL
  15 C13H17NO6     9.9   0.000     UNL
  16 C13H17NO6    10.0   1.098     UNL
  17 C13H17NO6    12.5   4.167     UNL
  18  C7H13NO7    -0.2   0.000     UNL
  19  C7H13NO7     2.6  18.395     UNL

Анализ докинга

In [11]:
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]))
      13       0       0
      18       0       0
      19       0       0
      23       0       0
      12       0       0
      21       0       0
      10       0       0
      23       0       0
      13       0       0
      21       0       0
      13       0       0
      19       0       0
      10       0       0
      14       0       0
      14       0       0
      16       1       4
      16       1       4
      14       2      18
       3       0       0
      16       0       0
/home/preps/golovin/miniconda2/lib/python2.7/site-packages/oddt/interactions.py:103: RuntimeWarning: invalid value encountered in greater
  strict = (((angle1 > (base_angle / a_neighbors_num - tolerance)) |
/home/preps/golovin/miniconda2/lib/python2.7/site-packages/oddt/interactions.py:105: RuntimeWarning: invalid value encountered in greater
  ((angle2 > (base_angle / d_neighbors_num - tolerance)) | np.isnan(angle2))).all(axis=-1)

Визуализация

In [12]:
for i,r in enumerate(res):
    r.write(filename='r%s.pdb' % i, format='pdb')

Еще раз результаты докинга, но отсортированные по 'vina_affinity'.

In [13]:
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]
  18  C7H13NO7    -0.2   0.000     UNL
  13  C7H13NO6     2.5   0.000     UNL
  19  C7H13NO7     2.6  18.395     UNL
  14  C7H13NO6     2.8   9.295     UNL
   4  C7H13NO7     2.9   9.557     UNL
   8 C7H16N2O6     3.1  14.495     UNL
   9 C7H16N2O6     3.3  13.045     UNL
   5  C7H13NO7     3.6   4.768     UNL
  10 C7H16N2O6     3.8  12.333     UNL
  11 C7H16N2O6     4.4   2.451     UNL
   6  C7H13NO7     4.9   9.156     UNL
  12 C7H16N2O6     5.3  11.828     UNL
  15 C13H17NO6     9.9   0.000     UNL
  16 C13H17NO6    10.0   1.098     UNL
  17 C13H17NO6    12.5   4.167     UNL

Интересный факт: я запускала докинг несколько раз и получала колоссально разные результаты (ну, кажется). Почему? Сейчас лучшим оказался вариант лиганда C7H13NO7, то есть с радикалом OH.