Импортируем необходимые модули.
Фоново загружаем структуру белка, задаем его отрисовку, приближение.
import __main__
__main__.pymol_argv = [ 'pymol', '-x' ]
import pymol
pymol.finish_launching()
from pymol import cmd,stored
from IPython.display import Image
import time
cmd.do('''
fetch 1LMP, async=0
color palegreen
bg_color white
select s1, resn nag+ndg
util.cbaw s1
set ray_trace_mode, 3
set ray_opaque_background, 0
ray 600,700''')
cmd.select('none') # это чтобы на картинке не было маркеров выделения
Image(filename='pr2_1.png')
В первом задании использовали возможности Sculpting (Wizard->Demo->Sculpting). С помощью мышки можно изменять структуру белка, которая после оптимизируется программой. Были изменены положения трех альфа-спиралей и одного бета слоя. Атомы отталкиваются при перекрывании, если clash-score становился слишком большим.
cmd.do('''
color palegreen
select s1, resn nag+ndg
util.cbaw s1 ''')
display(Image('pr2_1.png', width=500, height=300), Image('pr2_2.png', width=500, height=300))
Теперь найдем остаток, принимающий участие в связывании лиганда, проведем точечный мутагенез, ведущий к потере этого взаимодействия, а также оценим зону контакта с лигандом.
cmd.reinitialize()
cmd.do('''
reini
fetch 1LMP, async=0
color palegreen
bg_color white
select s1, resn nag+ndg
util.cbaw s1
set ray_trace_mode, 3
set ray_opaque_background, 0
ray 600,700
remove solvent
extract ligand, het
as cartoon, 1lmp
set cartoon_transparency, 0.5
as sticks, ligand
center ligand
origin ligand
zoom ligand
util.cbas hetatm
select pocket, byres m. 1lmp and (hetatm around 3.5)
show sticks, pocket
util.cbaw pocket
''')
cmd.orient('hetatm')
cmd.zoom('hetatm', '20')
cmd.do('''orient ligand
rotate x, 90''')
cmd.zoom('hetatm', '5')
cmd.dist('hbonds', 'm. 1lmp and (not hetatm)', 'hetatm', '3.5', '2')
cmd.do('''
set label_color, black
label pocket and n. ca, "%s%s" % (resn, resi)
''')
cmd.zoom('hetatm', '3')
cmd.do('png pr2_3.png')
Image(filename='pr2_3.png')
Всего нашлось 9 возможных водородных связей, имеющих длину до 3.5 ангстрем. Это остатки 35, 46, 52, 59, 63, 101, 103, 107, 109
cmd.reinitialize()
cmd.do('''
reini
fetch 1LMP, async=0
color palegreen
bg_color white
select s1, resn nag+ndg
util.cbaw s1
set ray_trace_mode, 3
set ray_opaque_background, 0
ray 600,700
remove solvent
extract ligand, het
as cartoon, 1lmp
set cartoon_transparency, 0.5
as sticks, ligand
center ligand
origin ligand
zoom ligand
sele ligand, resn NAG+NDG
sele cont, ligand around 3.5
show surface, cont
distance h, ligand, cont, 3.5, 2
''')
cmd.do('''orient ligand
rotate x, 90''')
cmd.do('png pr2_4.png')
Image(filename='pr2_4.png')
import time
cmd.do('''set auto_sculpt, on
set sculpting, on
sculpt_activate all''')
time.sleep(30)
cmd.do('set sculpting, off')
cmd.do('png pr2_5.png')
display(Image('pr2_5.png'))
Из статьи https://doi.org/10.1107/S0907444995005105 видно, что Asp 103 важен для связывания лиганда. Заменим его на глицин.
cmd.wizard('mutagenesis')
cmd.refresh_wizard()
cmd.get_wizard().do_select('resi 103')
cmd.get_wizard().set_mode('GLY')
cmd.refresh_wizard()
cmd.get_wizard().apply()
cmd.set_wizard()
import time
cmd.do('''set auto_sculpt, on
set sculpting, on
sculpt_activate all''')
time.sleep(30)
cmd.do('set sculpting, off')
cmd.do('''orient ligand
rotate x, 60''')
cmd.do('png pr2_6.png')
display(Image('pr2_6.png'))
Видно, что водородные связи растянулись, связывание пропало.
Сделаем видео
cmd.reinitialize()
cmd.reinitialize()
cmd.do('''
fetch 1LMP, mutant
''')
cmd.wizard('mutagenesis')
cmd.refresh_wizard()
cmd.get_wizard().do_select('resi 103')
cmd.get_wizard().set_mode('GLY')
cmd.refresh_wizard()
cmd.get_wizard().apply()
cmd.set_wizard()
cmd.do('''
fetch 1LMP, native_protein
color marine, native_protein
color red, mutant
remove solvent
as sticks, mutant
as sticks, native_protein
color yellow, resi 103 and native_protein
color purple, resi 103 and mutant
''')
cmd.util.cbag("native_protein and mutant")
cmd.translate("[-60, 0, 0]", "native_protein")
cmd.center('native_protein + mutant')
cmd.zoom('center', '40')
cmd.do('''
bg_color white
set ray_trace_mode,3
set ray_opaque_background, 0
ray 1500,700''')
cmd.png('pr2_7.png')
time.sleep(3)
Image(filename='pr2_7.png')
cmd.do('''set matrix_mode, 1
set movie_panel, 1
set cache_frames, 1
''')
cmd.bg_color("white")
cmd.mset('1 x480')
cmd.frame('1')
cmd.mview('store')
cmd.mview('store', object='native_protein')
cmd.frame('50')
cmd.mview('store')
cmd.translate('[60, 0, 0]', object='native_protein')
cmd.mview('store', object='native_protein')
cmd.frame('110')
cmd.center('mutant')
cmd.zoom('mutant')
cmd.mview('store', object='native_protein')
cmd.mview('store')
cmd.frame('200')
cmd.mview('store', object='native_protein')
cmd.center('mutant and resi 103')
cmd.zoom('mutant and resi 103')
cmd.mview('store')
cmd.frame('320')
cmd.mview('store', object='native_protein')
cmd.center('mutant and resi 103')
cmd.zoom('mutant and resi 103', "5")
cmd.turn('y', 120)
cmd.mview('store')
cmd.frame('480')
cmd.mview('store')
cmd.translate('[-10, -30, 80]', object='native_protein')
cmd.mview('store', object='native_protein')
cmd.mview('reinterpolate')
cmd.mview('reinterpolate', object='native_protein')
import imageio
import os
cmd.mstop()
dirpath = './'
cmd.mpng(dirpath, mode=1, width=1920//4, height=1080//4)
while not os.path.exists('./0480.png'):
time.sleep(0.1)
with imageio.get_writer('movie.gif', mode='I', fps=30) as writer:
for x in range(0, 480):
filename = os.path.join(dirpath, f'{x+1:04}.png')
image = imageio.imread(filename)
writer.append_data(image)
from IPython.display import Image
display(Image(filename='movie.gif', format='png'))