Код из задания с комментариями:
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')