Цель работы: ознакомиться с возможностями гомологичного моделирования комплекса белка с лигандом. Будем пользоваться пакетом Modeller, это программное обеспечение распространяется бесплатно для академических пользователей.
Возьмем белок лизоцим LYS_MERLU (Uniprot: P37715), принадлежащий ракушке Meretrix lusoria и смоделируем его структуру (модель комлпекса белка с лигандом) на сонове структуры лизоцима радужной форели (1LMP).
Программе MODELLER для моделирования структуры белков, в качестве входных данных нужны: управляющий скрипт, файл pdb со структурой-образцом, файл выравнивания с дополнительной информацией.
Для начала построим выравнивание их последовательностей с помощью программы Clustal (сохраним выдачу в формате pir): ...
#>1LMPA
#KVYDRCELARALKASGMDGYAGNSLPNWVCLSKWESSYNTQATNRNTDGSTDYGIFQINSRYWCDDGRTPGAKNVCGIRCSQLLTDDLTVAIRCAKRVVLDPNGIGAWVAWRLHCQNQDLRSYVAGCGV
#>LYS_MERLU
#FAGGIVSQRCLSCICKMESGCRNVGCKMDMGSLSCGYFQIKEAYWIDCGRPGSSWKSCAASSYCASLCVQNYMKRYAKWAGCPLRCEGFAREHNGGPRGCKKGSTIGYWNRLQKISGCHGVQ
Получили файл выравнивания + поправили его, добавив после названий последовательностей параметры последовательностей для modeller + знаки окончания последовательности (./): lys_align.pir.
Модификация файла со структурой: удалим всю воду из структуры (в текстовом редакторе) всем атомам лиганда присвойте один и тот же номер "остатка" (MODELLER считает, что один лиганд = один остаток) и модифицируем имена атомов каждого остатка, добавив в конец буквы A, B, C. Смысл операции в том, что атомы остатка 130 имели индекс А, атомы остатка 131 имели индекс В и т.д. . После модификации имен атомов измените номера остатков на 130. Файл сохранили: 1lmp.ent = test1.ali.
Управляющий скрипт: my_seq.py
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
Надеюсь, это сработает...
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()
Не заработало. Воспользуемся запуском mod9v7 из консоли.
%%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
%%bash
mod9v7 lys.py
О да. Было получено 5 моделей. Полученные структуры представлены ниже.
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)
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)
Видно, что при наложении полученные модели похожи (по крайней мере, элементами вторичной структуры).
cmd.load('1lmp.pdb')
cmd.do('''
show cartoon
hide lines
super 1lmp, seq.B99990001
center 1lmp
''')
prepareImage()
Image(defaultImage)
Желтым показан белок-образец (1lmp). В целом, модели похожи на структуру, но какие-то части элементов вторичной структуры потеряны, но их немного (можно посмотреть внимательнее на совмещении одной из моделей с 1lmp ниже).
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)