10. Гомологичное моделирование комплекса белка с лигандом¶
import sys
import modeller
import _modeller
import modeller.automodel
import ipywidgets
Начнем работу¶
Мой выбор пал на белок LYS_HYPCU из осенней паутинной моли (Fall webworm moth).
Скачаем файл с последовательностью и файл-заготовку.
%%capture
import urllib.request
urllib.request.urlretrieve('http://www.pdb.org/pdb/files/1lmp.pdb', '1lmp.pdb')
urllib.request.urlretrieve('https://www.uniprot.org/uniprot/P50717.fasta', 'P50717.fasta')
Зададим все параметры, создадим выравнивание и сохраним это выравнивание.
%%capture
env = modeller.environ()
env.io.hetatm = True
alignm=modeller.alignment(env)
alignm.append(file='P50717.fasta', align_codes='all',alignment_format='FASTA')
mdl = modeller.model(env, file='1lmp.pdb', model_segment=('FIRST:'+'A', 'LAST:'+'B'))
alignm.append_model(mdl, atom_files='1lmp.pdb', align_codes='1lmp')
alignm[0].code = 'seq'
alignm[1].code = 'pdb'
%%capture
alignm.salign()
alignm.write(file='all_in_one.ali', alignment_format='PIR')
В целом файл с выравниванием выглядит нормально. Не вижу смысла приводить его в явном виде.
Теперь замемся моделированием.
%%capture
s = alignm[0]
pdb = alignm[1]
a = modeller.automodel.automodel(env, alnfile='all_in_one.ali', knowns= pdb.code, sequence = s.code )
a.name='mod'+s.code
a.starting_model = 1
a.ending_model = 2
a.make()
Посмотрим на структуры.
f=open('seq.B99990001.pdb','r')
system = "".join([x for x in f.readlines()])
f.close()
import py3Dmol
view = py3Dmol.view()
view.addModelsAsFrames(system)
view.setStyle({'model': -1}, {"cartoon": {'color': 'spectrum'}})
view.zoomTo()
view.show()
3Dmol.js failed to load for some reason. Please check your browser console for error messages.
f=open('seq.B99990002.pdb','r')
system = "".join([x for x in f.readlines()])
f.close()
import py3Dmol
view = py3Dmol.view()
view.addModelsAsFrames(system)
view.setStyle({'model': -1}, {"cartoon": {'color': 'spectrum'}})
view.zoomTo()
view.show()
3Dmol.js failed to load for some reason. Please check your browser console for error messages.
Модели в первом приближении одинаковые, но скор меньше у первой, поэтому будет рассматривать ее (у некоторых ячеек специально выключен output, чтобы не загромождать отчет). Теперь посмотрим на 1LMP.pdb.
f=open('1lmp.pdb','r')
system = "".join([x for x in f.readlines()])
f.close()
import py3Dmol
view = py3Dmol.view()
view.addModelsAsFrames(system)
view.setStyle({'model': -1}, {"cartoon": {'color': 'spectrum'}})
view.addStyle({'resn':'NAG'}, {'stick': {'colorscheme':'yellowCarbon'}})
view.zoomTo()
view.show()
3Dmol.js failed to load for some reason. Please check your browser console for error messages.
В 1LMP.pdb есть лиганд, а в полученных нами моделях - нет. Структуры выглядят довольно разными но это понятно, учитывая, что эти лизоцимы получены из достаточно далеких организмов: моль и форель.
А что с лигандом?¶
Добавим лиганд в последовательность и построим выравнивание снова
%%capture
with_lig = ''
for res in alignm[0].residues:
with_lig += res.code
for lig in alignm[1].residues[-3:]:
with_lig += lig.code
alignm.append_sequence(with_lig)
alignm[2].code = 'with_lig'
del alignm[0]
alignm.salign()
alignm.write(file='all_in_one2.ali', alignment_format='PIR')
Снова осуществим моделирование
%%capture
s = alignm[1]
pdb = alignm[0]
a = modeller.automodel.automodel(env, alnfile='all_in_one2.ali', knowns=pdb.code, sequence=s.code)
a.name = 'mod' + s.code
a.starting_model = 1
a.ending_model = 2
a.make()
А теперь посмотрим на то, что у нас получилось.
f=open('with_lig.B99990001.pdb','r')
system = "".join([x for x in f.readlines()])
f.close()
import py3Dmol
view = py3Dmol.view()
view.addModelsAsFrames(system)
view.setStyle({'model': -1}, {"cartoon": {'color': 'spectrum'}})
view.addStyle({'resn':'NAG'}, {'stick': {'colorscheme':'yellowCarbon'}})
view.zoomTo()
view.show()
3Dmol.js failed to load for some reason. Please check your browser console for error messages.
Можно заметить, что белок стал более компактным, что уже хорошо. Да и в целом стал более похожим на 1LMP.
Подвигаем лиганд¶
print ('длина белка 1lmp', len(list(alignm[0].residues)))
print ('длина нашего белка', len(list(alignm[1].residues)))
длина белка 1lmp 132 длина нашего белка 145
Попробуем переместить лиганд в какое-нибудь совсем другое место, например, между аминокислотами 28 и 104.
И снова построим выравнивание и выполлним моделирование.
%%capture
alignm[1].code = 'with_lig2'
alignm.salign()
alignm.write(file='all_in_one3.ali', alignment_format='PIR')
s = alignm[1]
pdb = alignm[0]
class mymodel(modeller.automodel.automodel):
def special_restraints(self, aln):
rsr = self.restraints
at = self.atoms
for x,y in [('N:28:A','O6:143:A'), ('N:104:A', 'O6:145:A')]:
rsr.add(modeller.forms.gaussian(group=modeller.physical.xy_distance,
feature=modeller.features.distance(
at[x],at[y]),mean=3.0, stdev=0.1))
from modeller import *
from modeller.automodel import *
a = mymodel(env, alnfile='all_in_one3.ali', knowns=pdb.code, sequence=s.code)
a.name = 'mod' + s.code
a.starting_model = 1
a.ending_model = 2
a.make()
Посмотрим, что у нас получилось.
f=open('with_lig2.B99990001.pdb','r')
system = "".join([x for x in f.readlines()])
f.close()
import py3Dmol
view = py3Dmol.view()
view.addModelsAsFrames(system)
view.setStyle({'model': -1}, {"cartoon": {'color': 'spectrum'}})
view.addStyle({'resn':'NAG'}, {'stick': {'colorscheme':'yellowCarbon'}})
view.zoomTo()
view.show()
3Dmol.js failed to load for some reason. Please check your browser console for error messages.
Лиганд не поместился, но структура белка стала еще более компактной и напоминает 1LMP.
А что если заменить все на аланин?¶
Создадим новое выравнивание (как всегда), но теперь в нем будет только лиганд и аланины.
%%capture
alignm = modeller.alignment(env)
mdl = modeller.model(env, file='1lmp.pdb', model_segment=('FIRST:'+'A', 'LAST:'+'B'))
alignm.append_model(mdl, atom_files='1lmp.pdb', align_codes='1lmp')
seq_ala = 'A' * 145 + '...'
alignm.append_sequence(seq_ala)
alignm[0].code = 'pdb'
alignm[1].code = 'seq_ala'
alignm.salign()
alignm.write(file='all_in_one4.ali', alignment_format='PIR')
Если посмотреть на выравнивание, то все получилось, поэтому займемся моделированием.
%%capture
s = alignm[1]
pdb = alignm[0]
print(s.code, pdb.code)
a = modeller.automodel.automodel(env, alnfile='all_in_one4.ali', knowns=pdb.code, sequence=s.code)
a.name = 'mod' + s.code
a.starting_model = 1
a.ending_model = 2
a.make()
И можно посмотреть на то, что получилось.
f=open('seq_ala.B99990001.pdb','r')
system = "".join([x for x in f.readlines()])
f.close()
import py3Dmol
view = py3Dmol.view()
view.addModelsAsFrames(system)
view.setStyle({'model': -1}, {"cartoon": {'color': 'spectrum'}})
view.addStyle({'resn':'NAG'}, {'stick': {'colorscheme':'yellowCarbon'}})
view.zoomTo()
view.show()
3Dmol.js failed to load for some reason. Please check your browser console for error messages.
f=open('1lmp.pdb','r')
system = "".join([x for x in f.readlines()])
f.close()
import py3Dmol
view = py3Dmol.view()
view.addModelsAsFrames(system)
view.setStyle({'model': -1}, {"cartoon": {'color': 'spectrum'}})
view.addStyle({'resn':'NAG'}, {'stick': {'colorscheme':'yellowCarbon'}})
view.zoomTo()
view.show()
3Dmol.js failed to load for some reason. Please check your browser console for error messages.
И действительно то, что мы смоделировали, очень похоже на 1LMP. На самом деле, такое и ожидалось увидеть, так что все хорошо.
Если сравнивать скоры для аланинового и "нативного" лизоцимов, то окажется, что для аланинового скоры значимо меньше. И это довольно странно: было бы гораздо понятнее, если бы скор у нативного лизоцима, наоборот, был бы меньше. Но такой результат говорит о том, что намоделировать можно все, что угодно, но скору нельзя просто так верить. Вероятно, для достоверности необходимо большее число скоров для двух моделей и уже по этой выборке делаь какие-либо выводы. также стоит отметить, что хоть это два лизоцима, но они из довольно далеких организмов, что тоже иогло внести свой вклад.