Код из задания с комментариями:
import __main__
# Запустить Pymol
__main__.pymol_argv = [ 'pymol', '-x' ]
# импортировать паймол
import pymol
pymol.finish_launching()
# из модулья паймол импортировать объект командной строки и переменную stored, котоая видна и в коде
# здесь, и в паймоле
from pymol import cmd,stored
# загрузить структуру 1cll, не исполнять следующие команды до окончания загрузки
# показать линиями связи атомов остова (т.е. атомы с именами C, O, N и C-alpha)
# приблизить вид на остатки 4 и 5
# задать 1000 кадров видео, повторить текущий вид на каждом кадре
# зафиксировать текущий вид
cmd.do('''
fetch 1cll, async=0
as lines, n. C+O+N+CA
zoom i. 4+5
mset 1 x1000
mview store''')
# в переменной stored создаем пустой список r
stored.r = []
# паймол итерируется по всем CA из 1cll и сохраняет в список r номера просмотренных остатков
cmd.iterate('1cll and n. CA','stored.r.append(resi)')
# импорт numpy
import numpy as np
# сохраняем длину списка остатков
length = len(stored.r)
# создаем numpy массив чисел от 1 до 0.5 с числом элементов, равным числу остатков
colors = np.linspace(1,0.5, length)
# перебираем все остатки из списка r. Причем k - порядковый номер остатка в списке, i - номер остатка в структуре
for k,i in enumerate(stored.r):
# Создаем цвет с названием col[номер k] в RGB нотации.
# Интенсивность красного берем из массива цветов в соответствии с порядковым номером,
# синий и зеленый не меняются.
cmd.set_color('col%d' %k, [colors[k],0.5,0.75])
# зачем-то печатаем список из двух единиц и значения интенсивности цвета для k-го остатка
print([1,1,colors[k]])
# i-му остатку задаем цвет cartoon в соответствии с ранее полученным цветом с названием col[номер k]
cmd.set('cartoon_color','col%d' % k ,'resi %d' % i)
# показываем структуру только в виде cartoon
cmd.show_as('cartoon','all')
# Перебираем i от 0 до 100, поскольку ранее задали видео длиной в 1000 кадров. С учетом первой строки в цикле,
# как раз сможем задать кадры по 991-ый, а оставшиеся 9 кадров камера будет возвращаться на первый
# сохраненный вид
for i in range(100):
# перейти к кадрй (10*i)+1
cmd.frame((10*i)+1)
# Приблизить камеру на CA-атом остатков i и i+7
cmd.zoom( 'n. CA and i. %d+%d' % (i,i+7))
# Сохранить полученный вид в качестве ключевого для данного кадра, чтобы паймол плавно к нему перемещался
cmd.mview('store')
from IPython.display import Image
import os, sys
# pymol launching
import __main__
### Если вывод в графическое окно тормозит или не нужен, то:
__main__.pymol_argv = [ 'pymol', '-cp' ]
import pymol
pymol.finish_launching()
from pymol import cmd
### Информацию об ошибках можно смотреть там где запускали ipython notebook
from IPython.display import Image
Detected 8 CPU cores. Enabled multithreaded rendering.
Структура 1LMP до экзекуции:
Image("before.png")
После экзекуции:
Как можно заметить, несмотря на огромное увеличение расстояния между остатками а.к., программа всё равно попыталась сохранить плавность в элементах вторичной структуры.
Image("after.png")
Зона контактов лиганда с белком:
Image("hood.png")
Если заменить Asp-52 на триптофан, получится так, что пропадет часть полярных контактов, а место кармана связывания частично заполнится боковым радикалом, что значительно помешает связыванию.
Ссылка на скрипт view_movie.pml.
cmd.do("@view_movie.pml")
PyMOL>reinitialize everything
PyMOL>set matrix mode, 1
Error: unknown Setting: 'matrix mode'.
PyMOL>fetch 1LMP, async=0
PyMOL>hide everything
PyMOL>bg_color white
PyMOL>select ligand, resn NDG+NAG
PyMOL>color palegreen, elem C
PyMOL>show cartoon
PyMOL>set cartoon_transparency, 0.3
PyMOL>color lightorange, ligand and elem C
PyMOL>select interest, byres (all within 6 of ligand)
PyMOL>show sticks, interest
PyMOL>show sticks, ligand
PyMOL>create MUT, 1LMP
PyMOL>create LIG, ligand
PyMOL>hide everything, ligand
PyMOL>color lightpink, MUT and elem C
PyMOL>select interest_mut, byres (all within 6 of MUT and resn NDG+NAG)
PyMOL>remove MUT and resn NDG+NAG
PyMOL>cmd.wizard("mutagenesis")
Из-за того, что у pymol на кодомо нет лицензии, на фоне оставался водяной знак с напоминанием об этом, поэтому готовое видео выглядело крайне некачественно. Пришлось генерировать кадры локально и собирать видео с помощью онлайн сервисов.
from IPython.display import HTML
HTML("""
<video alt="test" controls width="960" height="540">
<source src="movie.mp4" type="video/mp4">
</video>
""")
PyMOL>cmd.do("refresh_wizard")
PyMOL>cmd.get_wizard().set_mode("TRP")
PyMOL>cmd.select("resi 52 and MUT")
PyMOL>cmd.get_wizard().do_select("sele")
Selected!
Присоединяю метку Tamra через остаток карбоксильной группы, у которой в структуре был водород, и кислород бокового радикала треонина-47.
cmd.do('''reinitialize everything
fetch 1LMP, async=0
load tamra.sdf
hide everything
bg_color white
select ligand, resn NDG+NAG
color palegreen, elem C
show sticks
set cartoon_transparency, 0.3
color lightorange, ligand and elem C
show sticks, ligand
show sticks, tamra
remove tamra and id 2+54
select tamra_c, tamra and id 29
select prot_o, /1LMP/A/A/THR`47/OG1
fuse tamra_c, prot_o
torsion 273.4
color salmon, resn UNK and elem C
unpick
set label_size, 30
label /1LMP/A/A/THR`47/OG1, "%s-%s" % (resn, resi)
set label_position, (2.2,-1.5,5.0)
set_view (\
0.868775249, -0.259187788, -0.421960205,\
0.420223147, 0.836672664, 0.351274878,\
0.261996388, -0.482495934, 0.835796535,\
0.000073396, 0.000135922, -59.322414398,\
21.051134109, 61.194595337, 31.332492828,\
41.539363861, 77.132972717, -20.000000000 )
set ray_trace_mode, 1
ray
save tamra.png
''')
Mutagenesis: 6 rotamers loaded.
PyMOL>cmd.get_wizard().apply()
PyMOL>cmd.set_wizard("done")
PyMOL>hide lines, resi 52 and MUT
PyMOL>color salmon, resi 52 and MUT and elem C
PyMOL>color green, resi 52 and 1LMP and elem C
PyMOL>align mut, 1lmp
PyMOL>translate [-40,0,0], object=MUT
PyMOL>set retain_order
PyMOL>set matrix_mode, 1
PyMOL>set movie_panel, 1
PyMOL>mset 1 x600
PyMOL>frame 1
PyMOL>orient
PyMOL>set_view (\
PyMOL>0.995556474, -0.016007392, -0.092800669,\
PyMOL>-0.014724770, 0.946862757, -0.321294546,\
PyMOL>0.093012616, 0.321233630, 0.942420363,\
PyMOL>0.000000000, 0.000000000, -160.540985107,\
PyMOL>-5.361316681, 50.851726532, 20.640266418,\
PyMOL>116.560836792, 204.521102905, -20.000000000 )
PyMOL>mview store
PyMOL>mview store, object=1lmp
PyMOL>mview store, object=MUT
PyMOL>mview store, object=LIG
PyMOL>frame 100
PyMOL>align MUT, 1LMP
PyMOL>set_view (\
PyMOL>0.995556474, -0.016007392, -0.092800669,\
PyMOL>-0.014724770, 0.946862757, -0.321294546,\
PyMOL>0.093012616, 0.321233630, 0.942420363,\
PyMOL>0.000021359, -0.000199318, -111.354072571,\
PyMOL>12.923892021, 52.469436646, 22.998434067,\
PyMOL>67.379570007, 155.339828491, -20.000000000 )
PyMOL>mview store
PyMOL>mview store, object=1lmp
PyMOL>mview store, object=MUT
PyMOL>mview store, object=LIG
PyMOL>frame 101
PyMOL>translate [-100,0,0], object=MUT
PyMOL>mview store
PyMOL>mview store, object=1lmp
PyMOL>mview store, object=MUT
PyMOL>mview store, object=LIG
PyMOL>frame 200
PyMOL>set_view (\
PyMOL>-0.331581771, -0.901469469, 0.278222442,\
PyMOL>0.479661137, 0.092854366, 0.872522712,\
PyMOL>-0.812388003, 0.422764122, 0.401612014,\
PyMOL>-0.000178285, -0.000257958, -100.749763489,\
PyMOL>13.752453804, 51.740955353, 23.991491318,\
PyMOL>56.768993378, 144.729248047, -20.000000000 )
PyMOL>mview store
PyMOL>mview store, object=1lmp
PyMOL>mview store, object=MUT
PyMOL>mview store, object=LIG
PyMOL>frame 300
PyMOL>set_view (\
PyMOL>-0.571032405, -0.222614408, 0.790168226,\
PyMOL>0.060400214, 0.948524475, 0.310882449,\
PyMOL>-0.818704784, 0.225250006, -0.528188467,\
PyMOL>-0.000144316, -0.000353435, -69.464553833,\
PyMOL>13.981967926, 55.612464905, 30.819005966,\
PyMOL>25.493402481, 113.453659058, -20.000001907 )
PyMOL>mview store
PyMOL>mview store, object=1lmp
PyMOL>mview store, object=MUT
PyMOL>mview store, object=LIG
PyMOL>frame 350
PyMOL>translate [0,10,0], object=LIG
PyMOL>set_view (\
PyMOL>-0.571032405, -0.222614408, 0.790168226,\
PyMOL>0.060400214, 0.948524475, 0.310882449,\
PyMOL>-0.818704784, 0.225250006, -0.528188467,\
PyMOL>-0.000144316, -0.000353435, -69.464553833,\
PyMOL>13.981967926, 55.612464905, 30.819005966,\
PyMOL>25.493402481, 113.453659058, -20.000001907 )
PyMOL>mview store
PyMOL>mview store, object=1lmp
PyMOL>mview store, object=MUT
PyMOL>mview store, object=LIG
PyMOL>frame 351
PyMOL>align MUT, 1LMP
PyMOL>translate [-100,0,0], object=1lmp
PyMOL>set_view (\
PyMOL>-0.571032405, -0.222614408, 0.790168226,\
PyMOL>0.060400214, 0.948524475, 0.310882449,\
PyMOL>-0.818704784, 0.225250006, -0.528188467,\
PyMOL>-0.000144316, -0.000353435, -69.464553833,\
PyMOL>13.981967926, 55.612464905, 30.819005966,\
PyMOL>25.493402481, 113.453659058, -20.000001907 )
PyMOL>mview store
PyMOL>mview store, object=1lmp
PyMOL>mview store, object=MUT
PyMOL>mview store, object=LIG
PyMOL>frame 360
PyMOL>translate [0,-5,0], object=LIG
PyMOL>set_view (\
PyMOL>-0.571032405, -0.222614408, 0.790168226,\
PyMOL>0.060400214, 0.948524475, 0.310882449,\
PyMOL>-0.818704784, 0.225250006, -0.528188467,\
PyMOL>-0.000144316, -0.000353435, -69.464553833,\
PyMOL>13.981967926, 55.612464905, 30.819005966,\
PyMOL>25.493402481, 113.453659058, -20.000001907 )
PyMOL>mview store
PyMOL>mview store, object=1lmp
PyMOL>mview store, object=MUT
PyMOL>mview store, object=LIG
PyMOL>frame 370
PyMOL>translate [0,5,0], object=LIG
PyMOL>set_view (\
PyMOL>-0.571032405, -0.222614408, 0.790168226,\
PyMOL>0.060400214, 0.948524475, 0.310882449,\
PyMOL>-0.818704784, 0.225250006, -0.528188467,\
PyMOL>-0.000144316, -0.000353435, -69.464553833,\
PyMOL>13.981967926, 55.612464905, 30.819005966,\
PyMOL>25.493402481, 113.453659058, -20.000001907 )
PyMOL>mview store
PyMOL>mview store, object=1lmp
PyMOL>mview store, object=MUT
PyMOL>mview store, object=LIG
PyMOL>frame 380
PyMOL>translate [0,-5,0], object=LIG
PyMOL>set_view (\
PyMOL>-0.571032405, -0.222614408, 0.790168226,\
PyMOL>0.060400214, 0.948524475, 0.310882449,\
PyMOL>-0.818704784, 0.225250006, -0.528188467,\
PyMOL>-0.000144316, -0.000353435, -69.464553833,\
PyMOL>13.981967926, 55.612464905, 30.819005966,\
PyMOL>25.493402481, 113.453659058, -20.000001907 )
PyMOL>mview store
PyMOL>mview store, object=1lmp
PyMOL>mview store, object=MUT
PyMOL>mview store, object=LIG
PyMOL>frame 400
PyMOL>translate [0,10,0], object=LIG
PyMOL>set_view (\
PyMOL>-0.571032405, -0.222614408, 0.790168226,\
PyMOL>0.060400214, 0.948524475, 0.310882449,\
PyMOL>-0.818704784, 0.225250006, -0.528188467,\
PyMOL>-0.000144316, -0.000353435, -69.464553833,\
PyMOL>13.981967926, 55.612464905, 30.819005966,\
PyMOL>25.493402481, 113.453659058, -20.000001907 )
PyMOL>mview store
PyMOL>mview store, object=1lmp
PyMOL>mview store, object=MUT
PyMOL>mview store, object=LIG
PyMOL>mview interpolate
PyMOL>mview interpolate, object=1lmp
PyMOL>mview interpolate, object=MUT
PyMOL>mview interpolate, object=LIG
PyMOL>frame 450
PyMOL>set_view (\
PyMOL>-0.970922112, 0.165055364, 0.173394561,\
PyMOL>0.220398933, 0.333612591, 0.916582286,\
PyMOL>0.093433999, 0.928148091, -0.360289127,\
PyMOL>-0.000427973, -0.000035785, -70.825393677,\
PyMOL>14.614973068, 53.631843567, 28.314699173,\
PyMOL>26.857248306, 114.817428589, -20.000001907 )
PyMOL>mview store
PyMOL>mview store, object=1lmp
PyMOL>mview store, object=MUT
PyMOL>mview store, object=LIG
PyMOL>frame 500
PyMOL>set_view (\
PyMOL>-0.200343251, 0.536659181, -0.819669187,\
PyMOL>-0.836620033, 0.341657937, 0.428172886,\
PyMOL>0.509827673, 0.771539569, 0.380525798,\
PyMOL>-0.000427973, -0.000035785, -70.825393677,\
PyMOL>14.614973068, 53.631843567, 28.314699173,\
PyMOL>26.857248306, 114.817428589, -20.000001907 )
PyMOL>mview store
PyMOL>mview store, object=1lmp
PyMOL>mview store, object=MUT
PyMOL>mview store, object=LIG
PyMOL>frame 600
PyMOL>set_view (\
PyMOL>-0.315165371, -0.611364901, 0.725875497,\
PyMOL>-0.178835765, 0.789411247, 0.587235510,\
PyMOL>-0.932033658, 0.055261470, -0.358123243,\
PyMOL>-0.000117533, -0.000213161, -132.289230347,\
PyMOL>10.420061111, 55.045257568, 24.642662048,\
PyMOL>88.339302063, 176.299499512, -20.000001907 )
PyMOL>mview store
PyMOL>mview store, object=1lmp
PyMOL>mview store, object=MUT
PyMOL>mview store, object=LIG
PyMOL>frame 1
PyMOL>set cache_frames=0
PyMOL>mclear
Image('tamra.png')
#По данным IUPAC правая правая α-спираль поли-L-аланина имеет торсионные углы:
phi = -57
psi = -47
length = 100
aminoacid = 'ala'
cmd.reinitialize()
cmd.bg_color('white')
cmd.fragment(aminoacid)
# Нарастим цепь из 100 аланинов без учета углов
for i in range(2, length+1):
cmd.edit(f"i. {i} & n. C")
cmd.editor.attach_amino_acid("pk1", aminoacid)
# Покрутим аланины, чтобы получить α-спираль
for i in range(2, length+1):
if i % 2 == 0:
cmd.set_dihedral(f"i. {i} and n. N", f"i. {i} and n. CA",
f"i. {i} and n. C", f"i. {i+1} and n. N", phi)
cmd.set_dihedral(f"i. {i} & n. C", f"i. {i+1} & n. N" ,
f"i. {i+1} & n. CA", f"i. {i+1} & n. C", psi)
cmd.save('helix.pdb')
Получили вот такую полиаланиновую спираль:
Image('helix_full.png')
Image('helix_close.png')
length = 100
cmd.do('''
reinitialize everything
bg_color white
fetch 1bna, async=0
remove solvent
create pair_a, c. A and i. 5 + c. B and i. 20
create pair_b, c. A and i. 4 + c. B and i. 21
create pair1, pair_a''')
cmd.pair_fit('pair_a', 'pair_b')
matrix = cmd.get_object_matrix('pair_a')
for i in range(2, length+1):
cmd.create(f'pair{i}', f'pair{i-1}')
cmd.transform_selection(f'pair{i}', matrix, homogenous = 0)
cmd.save('b_dna.pdb', state=0)
cmd.quit()
Image('b_dna_full.png')
Image('b_dna_top.png')
Image('b_dna_close.png')