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

In [65]:
import sys 
import modeller 
import _modeller
import modeller.automodel
import ipywidgets

Начнем работу¶

Мой выбор пал на белок LYS_HYPCU из осенней паутинной моли (Fall webworm moth).

Скачаем файл с последовательностью и файл-заготовку.

In [7]:
%%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')

Зададим все параметры, создадим выравнивание и сохраним это выравнивание.

In [8]:
%%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'
In [9]:
%%capture
alignm.salign()
alignm.write(file='all_in_one.ali', alignment_format='PIR')

В целом файл с выравниванием выглядит нормально. Не вижу смысла приводить его в явном виде.

Теперь замемся моделированием.

In [10]:
%%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()

Посмотрим на структуры.

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

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

In [70]:
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 есть лиганд, а в полученных нами моделях - нет. Структуры выглядят довольно разными но это понятно, учитывая, что эти лизоцимы получены из достаточно далеких организмов: моль и форель.

А что с лигандом?¶

Добавим лиганд в последовательность и построим выравнивание снова

In [48]:
%%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')

Снова осуществим моделирование

In [49]:
%%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()

А теперь посмотрим на то, что у нас получилось.

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

Подвигаем лиганд¶

In [55]:
print ('длина белка 1lmp', len(list(alignm[0].residues)))
print ('длина нашего белка', len(list(alignm[1].residues)))
длина белка 1lmp 132
длина нашего белка 145

Попробуем переместить лиганд в какое-нибудь совсем другое место, например, между аминокислотами 28 и 104.

И снова построим выравнивание и выполлним моделирование.

In [60]:
%%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()

Посмотрим, что у нас получилось.

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

А что если заменить все на аланин?¶

Создадим новое выравнивание (как всегда), но теперь в нем будет только лиганд и аланины.

In [67]:
%%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')

Если посмотреть на выравнивание, то все получилось, поэтому займемся моделированием.

In [68]:
%%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()

И можно посмотреть на то, что получилось.

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

In [71]:
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. На самом деле, такое и ожидалось увидеть, так что все хорошо.

Если сравнивать скоры для аланинового и "нативного" лизоцимов, то окажется, что для аланинового скоры значимо меньше. И это довольно странно: было бы гораздо понятнее, если бы скор у нативного лизоцима, наоборот, был бы меньше. Но такой результат говорит о том, что намоделировать можно все, что угодно, но скору нельзя просто так верить. Вероятно, для достоверности необходимо большее число скоров для двух моделей и уже по этой выборке делаь какие-либо выводы. также стоит отметить, что хоть это два лизоцима, но они из довольно далеких организмов, что тоже иогло внести свой вклад.