import __main__
__main__.pymol_argv = [ 'pymol', '-x' ]
import pymol
pymol.finish_launching()
from pymol import cmd,stored
import numpy as np
Знакомство с Pymol¶
cmd.do('''
fetch 1cll, async=0
as lines, n. C+O+N+CA
zoom i. 4+5
mset 1 x1000
mview store''')
Исследование итерации по остаткам¶
Код ниже красит Cа атомы растяжкой от более красненького цвета к более синенькому за счет варьирования красной компоненты в RGB записи цвета отдельных остатков:
stored.r = [] # создаем список для Са атомов через объект stored
cmd.iterate('1cll and n. CA', # итерация по Ca и добавление номеров остатков
'stored.r.append(resi)')
length = len(stored.r) # Число остатков
colors = np.linspace(1, 0.5, length) # массив компонент красного цвета
for k, i in enumerate(stored.r): # итерация по номерам остатков
cmd.set_color(f'col {k}', # Задание кастомного цвета
[colors[k], 0.5, 0.75]) # берется цвет с красной компонентой из списка colors
print([1, 1, colors[k]])
cmd.set('cartoon_color', # покраска отображения cartoon остатка i
f'col {k}',
f'resi {int(i)}')
cmd.show_as('cartoon','all')
Movie¶
Следующий код генерирует видео, в котором показываются по очереди интервалы Ca атомов (по 8 штук).
for i in range(length):
cmd.frame(10*i + i) # положение камеры записывается на каждый 11 кадр
cmd.zoom( f'n. CA and i. {i}+{i+7}') # Ca атомы каких остатков надо показать
cmd.mview('store') # запомнить положение камеры
Работа с Pymol¶
cmd.delete("1cll")
cmd.fetch("1LMP")
Изменение структуры 1LMP¶
До вмешательства:
После:
Анимация с мутацией¶
cmd.fetch('1LMP', 'wt')
cmd.copy('mutant', 'wt') # копирую белок
Для этого задания я заменила 101 аспартат в белке на фенилаланин. Таким образом теряется водородная связь с субстратом.
mutation = 101
В мультике сначала отодвигаю мутат, фиксирую кадр, накладываю обратно. Число кадров -- 120
cmd.mset('1 x120')
cmd.orient("resi 101")
The Kernel crashed while executing code in the current cell or a previous cell. Please review the code in the cell(s) to identify a possible cause of the failure. Click <a href='https://aka.ms/vscodeJupyterKernelCrash'>here</a> for more info. View Jupyter <a href='command:jupyter.viewOutput'>log</a> for further details.
cmd.frame(1)
cmd.translate([30, 0, 0], object='mutant') # Сдвиг на 30 Ангстрем по X
cmd.mview('store', object='mutant') # Фиксирую "далекое" положение мутанта
cmd.mview('store', object='wt')
cmd.mview('store')
cmd.frame(60)
cmd.translate([-30, 0, 0], object='mutant') # Возвращение мутанта
cmd.mview('store', object='mutant')
cmd.mview('store', object='wt')
cmd.mview('store')
for frame in range(60, 80):
cmd.frame(frame)
cmd.mview('store')
cmd.mview('store', object='mutant')
cmd.mview('store', object='wt')
# Увеличение места мутации в итоге выглядит не так хорошо, как хотелось бы
cmd.frame(80)
cmd.zoom(f'resi {mutation} and mutant', buffer=7) # Фокус на мутации
cmd.show('sticks', f'resi {mutation}')
cmd.color('red', f'resi {mutation} and mutant')
cmd.mview('store', object='mutant')
cmd.mview('store', object='wt')
cmd.mview('store')
for frame in range(81, 121):
cmd.frame(frame)
cmd.mview('store')
cmd.mview('store', object='mutant')
cmd.mview('store', object='wt')
(Белок пытается убежать, даже если фиксировать каждый кадр, но я уже устала что-то с этим делать).
Сохраняю в гифку:
cmd.set('ray_trace_frames', 0)
cmd.mpng('frame')
import glob
import os
from PIL import Image
def create_gif(frame_prefix="frame", output_name="mutation_movie.gif", duration=50):
search_pattern = f"{frame_prefix}*.png"
files = sorted(glob.glob(search_pattern))
frames = [Image.open(f) for f in files]
frames[0].save(
output_name,
format='GIF',
append_images=frames[1:],
save_all=True,
duration=duration,
loop=1
)
for f in files:
os.remove(f)
print(f"{output_name}")
create_gif(duration=60)
Присоединение метки TAMRA¶
Для присоединения метки я выбрала 24 серин на поверхности белка 1LMP
cmd.load("./tamra.sdf")
cmd.fetch("1LMP")
'1LMP'
Затем я выбрала углеродный атом карбоксильной группы, предварительно убрав гидроксил TAMRA:
cmd.select("c_tamra", "sele")
1
Далее я соединяю серин за атом кислорода (OG) и выбранный атом TAMRA:
cmd.fuse("name OG and resi 24", "c_tamra")
cmd.select("cc_tamra", "sele")
1
далее при помощи команды torsion я подвинула метку так, чтобы не было клэшей:
cmd.torsion(12.2)
cmd.draw(1600)
cmd.save("./tamra.png")
1
Полиаланиновая альфа-спираль¶
cmd.delete("all")
from pymol import editor
Торсионные углы примерно такие для альфа спирали:
phi = -64
psi = -41
cmd.reinitialize()
cmd.fragment('ala')
cmd.alter('ala', "resv=1")
length = 100
for i in range(1, length):
cmd.edit(f"i. {i} & n. C") # пикаю атом для присоединения
editor.attach_amino_acid("pk1","ala") # добавляю следующий остаток
# Поворачиаю на угол фи
cmd.edit(f"i. {i} & n. C",
f"i. {i+1} & n. N")
cmd.torsion(phi)
# Поворачиваю на угол пси
cmd.edit(f"i. {i+1} & n. C",
f"i. {i+1} & n. CA")
cmd.torsion(psi)
cmd.show_as('cartoon')
cmd.orient()
Посмотрев на резульат я поняла, что углы в итоге не те и спираль какая-то угловатая.
Я попробовала по-другому:
cmd.reinitialize()
cmd.fragment('ala', "helix")
for i in range(2, 100):
cmd.edit(f'helix & i. {i} & n. C')
cmd.editor.attach_amino_acid('pk1', 'ala')
cmd.set_dihedral(f'i. {i} & n. N',
f'i. {i} & n. CA',
f'i. {i} & n. C',
f'i. {i + 1} & 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.show("cartoon", "helix")
cmd.draw(1600)
cmd.save("./helix2.png")
1
У второй спирали торсионные углы заданы адекватным образом и она более округлая:
Построение B формы ДНК¶
cmd.fetch("1bna")
'1bna'
Осталось размножить этот кусочек ДНК. Сначала я выделила две последовательные пары
cmd.create("pair1", "/1bna/A/A/DG`10 or /1bna/B/B/DC`15")
# Почему-то выделить остатки более адекватно у меня так и не получилось
cmd.create("pair0", "pair1")
cmd.create("pair2", "/1bna/A/A/DC`9 or /1bna/B/B/DG`16")
cmd.pair_fit('pair0', 'pair2') # Совмещение пар
trans = cmd.get_object_matrix('pair0') # матрица трансляции
trans
(0.8249965906143188, -0.5602499842643738, 0.0741661936044693, 13.95048156125559, 0.5625239014625549, 0.8014712333679199, -0.20300428569316864, -3.5682928485270473, 0.054291076958179474, 0.20919810235500336, 0.9763650298118591, -1.3228139070803167, 0.0, 0.0, 0.0, 1.0)
cmd.delete("1bna or pair0 or pair2")
cmd.alter(f'pair1 & chain A', # для правильного нейминга
f'resi=1')
cmd.alter(f'pair1& chain B',
f'resi=99')
for i in range(1, 100):
cmd.create(f'pair{i+1}', f'pair{i}')
cmd.transform_selection(selection=f'pair{i+1}',
matrix=trans)
cmd.alter(f'pair{i+1} & chain A',
f'resi={i+1}')
cmd.alter(f'pair{i+1} & chain B',
f'resi={100-i}')
cmd.sort(f"pair{i+1}")
cmd.create('B-helix', 'pair*')
cmd.delete('pair*')
cmd.show("sticks")
Правильно соединяю пары между собой:
for i in range(1, 100):
cmd.bond(f"/B-helix//A/DG`{i+1}/O3'", f"/B-helix//A/DG`{i}/P")
cmd.bond(f"/B-helix//B/DC`{100-i+1}/O3'", f"/B-helix//B/DC`{100-i}/P")
cmd.draw(1600)
cmd.save("./dna.png")
1
The Kernel crashed while executing code in the current cell or a previous cell. Please review the code in the cell(s) to identify a possible cause of the failure. Click <a href='https://aka.ms/vscodeJupyterKernelCrash'>here</a> for more info. View Jupyter <a href='command:jupyter.viewOutput'>log</a> for further details.