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

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

Цель данного занятия является знакомство с возможностями докинга низкомолекулярного лиганда в структуру белка. В работе использовался пакет 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 [80]:
pdb=pmx.Model('hyace_lig.B99990001.pdb')

for r in pdb.residues[139:]:
    print r #посмотрим остатки
<Molecule: id = 140 name = NAG chain_id =    natoms = 14>
<Molecule: id = 141 name = NAG chain_id =    natoms = 14>
<Molecule: id = 142 name = NDG chain_id =    natoms = 15>

Удалим все лиганды (NAG, NAG и NDG):

In [81]:
newpdb = pdb.copy()
for r in newpdb.residues[-3:]:
    print r
    newpdb.remove_residue(r)

lig = pdb.copy()
del lig.residues[:-3]

newpdb.writePDB(fname="hyace_prot_only.pdb")
lig.writePDB(fname="hyace_ligs_only.pdb")
<Molecule: id = 140 name = NAG chain_id =    natoms = 14>
<Molecule: id = 140 name = NAG chain_id =    natoms = 14>
<Molecule: id = 140 name = NDG chain_id =    natoms = 15>

Найдём айдите геометрический центр лиганда (место для докинга):

In [82]:
a_lig_x = [a.x[0] for a in lig.atoms]
a_lig_y = [a.x[1] for a in lig.atoms]
a_lig_z = [a.x[2] for a in lig.atoms]
x_average = sum(a_lig_x)/len(a_lig_x)
y_average = sum(a_lig_y)/len(a_lig_y)
z_average = sum(a_lig_z)/len(a_lig_z)

Подготовим белок для докинга:

In [83]:
prot = oddt.toolkit.readfile('pdb','hyace_prot_only.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: 15871.05588

Хотя в выдаче написано, что структура не является белком, это не так. В общем, работаем с тем, что имеем.

Теперь подготовим лиганды для докинга. NAG содержит в себе СH3C(=O)NH группу.
Создадим лиганды, где метильный радикал этой группы будет заменён на:

  • OH
  • NH3+
  • H
  • Ph
  • COO-
In [76]:
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)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 H H H H H O O O O O O N O HO *****

Докинг

Теперь займёмся непосредственно докингом:

In [84]:
#create docking object
dock_obj= oddt.docking.AutodockVina.autodock_vina(
    protein=prot,size=(20,20,20),center=[x_average,y_average,z_average],
    executable='/usr/bin/vina',autocleanup=True, num_modes=20)

print dock_obj.tmp_dir
print " ".join(dock_obj.params) 
/tmp/autodock_vina_sz0fQ3
--center_x 38.6630658009 --center_y 35.2240969697 --center_z 20.3041541126 --size_x 20 --size_y 20 --size_z 20 --cpu 1 --exhaustiveness 8 --num_modes 20 --energy_range 3
  • center_x, center_y, center_z - центр куба, куда будет помещена молекула;
  • size_x, size_y, size_z - размер куба;
  • exhaustiveness - параметр Autodock Vina;
  • num_modes - число конформаций, генерируемых Autodock Vina;
  • energy_range - cut-off по энергии.
In [85]:
# do it
res = dock_obj.dock(mols,prot)

Анализ результатов

In [107]:
from operator import itemgetter
res_list = [[r.formula, r.data['vina_affinity'],  r.data['vina_rmsd_ub'], r.residues[0].name, i] for i,r in enumerate(res)]
final_res = sorted(res_list, key=itemgetter(1),reverse=True)
for el in final_res:
    print "%4d%10s%8s%8s%8s" %(el[-1],el[0],el[1],el[2],el[3])
  28 C13H17NO6    -5.8   0.000     UNL
   0  C8H15NO6    -5.7   0.000     UNL
   1  C8H15NO6    -5.7   4.923     UNL
   7  C7H13NO7    -5.6   0.000     UNL
  13 C7H15N2O6    -5.5   0.000     UNL
  14 C7H15N2O6    -5.5   1.399     UNL
  15 C7H15N2O6    -5.5   5.243     UNL
  29 C13H17NO6    -5.5   4.197     UNL
  31  C8H13NO8    -5.5   0.000     UNL
   8  C7H13NO7    -5.4   5.237     UNL
  21  C7H13NO6    -5.4   0.000     UNL
  22  C7H13NO6    -5.4   5.034     UNL
  23  C7H13NO6    -5.4   3.335     UNL
  32  C8H13NO8    -5.4   3.545     UNL
  30 C13H17NO6    -5.3   4.988     UNL
  24  C7H13NO6    -5.2   3.512     UNL
   2  C8H15NO6    -5.1   3.862     UNL
   3  C8H15NO6    -5.0   1.397     UNL
   4  C8H15NO6    -4.8   4.705     UNL
  16 C7H15N2O6    -4.7   2.948     UNL
  25  C7H13NO6    -4.7   4.237     UNL
   9  C7H13NO7    -4.3   4.873     UNL
   5  C8H15NO6    -4.2   5.278     UNL
  17 C7H15N2O6    -4.1   1.309     UNL
  18 C7H15N2O6    -4.1   4.864     UNL
  19 C7H15N2O6    -3.9   2.818     UNL
  10  C7H13NO7    -3.8   3.069     UNL
  20 C7H15N2O6    -3.6   3.303     UNL
  11  C7H13NO7    -3.5   4.973     UNL
   6  C8H15NO6    -3.3   3.267     UNL
  33  C8H13NO8    -3.3   2.834     UNL
  12  C7H13NO7    -3.1   2.831     UNL
  34  C8H13NO8    -3.0   4.415     UNL
  26  C7H13NO6    -2.6  17.134     UNL
  27  C7H13NO6    -2.5  17.465     UNL

Наилучшей оказалась структура под номером 28. Попробуем получить её трёхмерную структуру:

In [108]:
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)
In [110]:
for i,r in enumerate(res):
    r.write(filename='r%s.pdb' % i, format='pdb')

Ниже представлено графическое представление результатов докинга. Белым цветом окрашена структура с худшим заместителем (C7H13NO6), малиновым - наилучшим (C13H17NO6, 28). Тонкими синими линиями показано положение исходных лигандов. title

Видно, что хорошая структура находится в том же кармане, что и исходные лиганды.


Дата последнего обновления: 19.05.17
© Светлана Яровенко