Гомологичное моделирование комплекса белка с лигандом

Цель работы: ознакомиться с возможностями гомологичного моделирования комплекса белка с лигандом. Будем пользоваться пакетом Modeller, это программное обеспечение распространяется бесплатно для академических пользователей.

Возьмем белок лизоцим LYS_MERLU (Uniprot: P37715), принадлежащий ракушке Meretrix lusoria и смоделируем его структуру (модель комлпекса белка с лигандом) на сонове структуры лизоцима радужной форели (1LMP).

Программе MODELLER для моделирования структуры белков, в качестве входных данных нужны: управляющий скрипт, файл pdb со структурой-образцом, файл выравнивания с дополнительной информацией.

Для начала построим выравнивание их последовательностей с помощью программы Clustal (сохраним выдачу в формате pir): ...

In [1]:
#>1LMPA
#KVYDRCELARALKASGMDGYAGNSLPNWVCLSKWESSYNTQATNRNTDGSTDYGIFQINSRYWCDDGRTPGAKNVCGIRCSQLLTDDLTVAIRCAKRVVLDPNGIGAWVAWRLHCQNQDLRSYVAGCGV
#>LYS_MERLU
#FAGGIVSQRCLSCICKMESGCRNVGCKMDMGSLSCGYFQIKEAYWIDCGRPGSSWKSCAASSYCASLCVQNYMKRYAKWAGCPLRCEGFAREHNGGPRGCKKGSTIGYWNRLQKISGCHGVQ

Получили файл выравнивания + поправили его, добавив после названий последовательностей параметры последовательностей для modeller + знаки окончания последовательности (./): lys_align.pir.

Модификация файла со структурой: удалим всю воду из структуры (в текстовом редакторе) всем атомам лиганда присвойте один и тот же номер "остатка" (MODELLER считает, что один лиганд = один остаток) и модифицируем имена атомов каждого остатка, добавив в конец буквы A, B, C. Смысл операции в том, что атомы остатка 130 имели индекс А, атомы остатка 131 имели индекс В и т.д. . После модификации имен атомов измените номера остатков на 130. Файл сохранили: 1lmp.ent = test1.ali.

Управляющий скрипт: my_seq.py

In []:
from modeller.automodel import *
class mymodel(automodel):
    def special_restraints(self, aln):
        rsr = self.restraints
        for ids in (('OD1:98:A', 'O6A:131:A'),
                    ('N:65:A', 'O7B:132:A'),
                    ('OD2:73:A', 'O1C:133:A')):
                    atoms = [self.atoms[i] for i in ids]
                    rsr.add(forms.upper_bound(group=physical.upper_distance,
                      feature=features.distance(*atoms), mean=3.5, stdev=0.1)) 
env = environ()
env.io.hetatm = True
a = mymodel(env, alnfile='test1.ali', knowns=('1lmp'), sequence='seq')
a.starting_model = 1
a.ending_model = 5
a.make()

Некоторые атомы, имеющие водородную связь с лигандом в образце 1lmp:

/1lmp//A/TYR`62/OH = OH:62:A

ligand: O6B:130:A

/1lmp//A/GLU`35/OE2 = OE2:35:A

ligand: O6C:130:A

/1lmp//A/ASN`46/ND2 = ND2:46:A

ligand: O1C:130:A

/1lmp//A/ASN`46/OD1 = OD1:46:A

/1lmp//A/ALA`107/O = O:107:A

/1lmp//A/ASP`101/OD2 = OD2:101:A

/1lmp//A/VAL`109/N = N:109:A

в которых указаны какие водородные связи белка с лигандом должны быть В БУДУЩЕЙ МОДЕЛИ

Противопоставим 3 остаткам из нашего белка по выравниванию:

ND2:46:A - NZ:27:A (вместо аргинина лизин) - осталось только найти лиганд

OH:62:A - OH:44:A (тоже тирозин)

OE2:35:A - OE2:18:A (тоже глутаминовая кислота)

Итого, добавим в скрипт ниже атомы, в которых указаны какие водородные связи белка с лигандом должны быть В БУДУЩЕЙ МОДЕЛИ. Если в моделируемом белке число остатков не совпадает с числом остатков в белке-образце, то номера "остатков" лиганда изменятся, поэтому у лиганда номер остатка 123 (122 - число АМК в белке).

NZ:27:A - O1C:160:B

OH:44:A - O6B:160:B

OE2:18:A - O6C:160:B

Надеюсь, это сработает...

In [29]:
import sys
sys.path.append('/usr/lib/modeller9v7/modlib/')
sys.path.append('/usr/lib/modeller9.12/lib/x86_64-intel8/python2.5/')
import modeller 

from modeller.automodel import *
class mymodel(automodel):
    def special_restraints(self, aln):
        rsr = self.restraints
        for ids in (('NZ:27:A', 'O1C:123:B'),
                    ('OH:44:A', 'O6B:123:B'),
                    ('OE2:18:A', 'O6C:123:B')):
                    atoms = [self.atoms[i] for i in ids]
                    rsr.add(forms.upper_bound(group=physical.upper_distance,
                      feature=features.distance(*atoms), mean=3.5, stdev=0.1)) 
env = environ()
env.io.hetatm = True
a = mymodel(env, alnfile='lis.pir', knowns=('1lmp'), sequence='seq')
a.starting_model = 1
a.ending_model = 5
a.make()
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-29-15f9311c4859> in <module>()
      2 sys.path.append('/usr/lib/modeller9v7/modlib/')
      3 sys.path.append('/usr/lib/modeller9.12/lib/x86_64-intel8/python2.5/')
----> 4 import modeller
      5 
      6 from modeller.automodel import *

/usr/lib/modeller9v7/modlib/modeller/__init__.py in <module>()
     67 
     68 # Set Modeller install location and license
---> 69 import _modeller
     70 if hasattr(config, 'license'):
     71     _modeller.mod_license_key_set(config.license)

ImportError: No module named _modeller

Не заработало. Воспользуемся запуском mod9v7 из консоли.

In [63]:
%%bash
echo "from modeller.automodel import *
class mymodel(automodel):
    def special_restraints(self, aln):
        rsr = self.restraints
        for ids in (('OE2:18:A', 'O6C:123:B'),
                    ('OH:44:A', 'O6B:123:B'),
                    ('NZ:27:A', 'O1C:123:B')):
                    atoms = [self.atoms[i] for i in ids]
                    rsr.add(forms.upper_bound(group=physical.upper_distance,
                      feature=features.distance(*atoms), mean=3.5, stdev=0.1)) 
env = environ()
env.io.hetatm = True
a = mymodel(env, alnfile='test1.ali', knowns=('1lmp'), sequence='seq')
a.starting_model = 1
a.ending_model = 5
a.make()
" > lys.py
In [64]:
%%bash
mod9v7 lys.py
Could not find platform independent libraries <prefix>
Could not find platform dependent libraries <exec_prefix>
Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>]
'import site' failed; use -v for traceback

О да. Было получено 5 моделей. Полученные структуры представлены ниже.

In [65]:
from xmlrpclib import ServerProxy
from IPython.display import Image
import os, sys, time

# pymol launching
import __main__
__main__.pymol_argv = [ 'pymol', '-cp' ]
# __main__.pymol_argv = [ 'pymol', '-x' ]  # for GUI

import pymol
from pymol import cmd
pymol.finish_launching()

defaultImage = 'pymolimg.png'
def prepareImage(width=300, height=300, sleep=5, filename=defaultImage):
    ## To save the rendered image
    cmd.ray(width, height)
    cmd.png('pymolimg.png')
    time.sleep(sleep)
    
# Define some shortcuts
def focus(x):
    cmd.center(x)
    cmd.zoom(x)
In [74]:
cmd.do('''
delete all
refresh
''')
cmd.load('seq.B99990001.pdb')
cmd.load('seq.B99990002.pdb')
cmd.load('seq.B99990003.pdb')
cmd.load('seq.B99990004.pdb')
cmd.load('seq.B99990005.pdb')
cmd.hide('everything')
cmd.show('cartoon')
prepareImage()
Image(defaultImage)
Out[74]:

Видно, что при наложении полученные модели похожи (по крайней мере, элементами вторичной структуры).

In [77]:
cmd.load('1lmp.pdb')
cmd.do('''
show cartoon
hide lines
super 1lmp, seq.B99990001
center 1lmp
''')
prepareImage()
Image(defaultImage)
Out[77]:

Желтым показан белок-образец (1lmp). В целом, модели похожи на структуру, но какие-то части элементов вторичной структуры потеряны, но их немного (можно посмотреть внимательнее на совмещении одной из моделей с 1lmp ниже).

In [80]:
cmd.do('''
delete all
refresh
''')
cmd.load('seq.B99990001.pdb')
cmd.load('1lmp.pdb')
cmd.do('''
show cartoon
hide lines
super 1lmp, seq.B99990001
center 1lmp
''')
prepareImage()
Image(defaultImage)
Out[80]: