# проверяем, все ли правильно поставилось
import pymol
# импортируем pymol
import __main__
__main__.pymol_argv = [ 'pymol', '-x' ] # включаем вывод в графическое окно
import pymol
pymol.finish_launching()
from pymol import cmd,stored
cmd.fetch('1lmp') # скачиваем структуру с PDB ID: 1LMP
### fun ####
import time # импортируем модуль времени
for i in range (1,200):
cmd.zoom(str(i-1)+"+"+str(i)+"+"+str(i+1)+'/CA') # приблизим камеру к СА атомам остатков i-1, i, i+1
time.sleep(.5) # держим камеру в таком положении 0.5 сек
cmd.do('''
fetch 1cll, async=0
as lines, n. C+O+N+CA
zoom i. 4+5
mset 1 x1000
mview store''')
То же самое с комментариями, но не запускается (из-за комментариев):
cmd.do('''
fetch 1cll, async=0 # загрузить структуру 1cll; не делать ничего, пока она не загрузится
as lines, n. C+O+N+CA # показать в виде линий атомы остова
zoom i. 4+5 # приблизить камеру к 4 и 5 остаткам
mset 1 x1000 # размножить текущее состояние на 1000 кадров
mview store''') # сделать текущее состояние ключевым
stored.r = [] # создать список r в переменной pymol stored
cmd.iterate('1cll and n. CA','stored.r.append(resi)') # пройдемся по всем СА атомам в структуре 1cll и
# запишем номера этих остатков в список r
import numpy as np
length = len(stored.r) # запись длины списка r в переменную length
colors = np.linspace(1,0.5, length) # создаем массив с числами, линейно убывающими от 1 до 0.5 длиной length
for k,i in enumerate(stored.r):
cmd.set_color('col%d' %k, [colors[k],0.5,0.75]) # создаем цвет с названием col_k и RGB формулой
# x,0.5,0.75, где x (красный) варьируется от 1 до 0.5
# (получаются цвета от розового до синеватого)
print([1,1,colors[k]]) # выводим RGB формулу другого цвета (зачем?)
cmd.set('cartoon_color','col%d' % k ,'resi %d' % int(i)) # красим cartoon остатка resi i в k-тый цвет (col_k)
cmd.show_as('cartoon','all') # показываем все в виде cartoon
Здесь мы плавно проходимся камерой по остаткам структуры, до 106го остатка:
for i in range(100):
cmd.frame((10*i)+1) # будем итерироваться от 1го до 991го кадра (через 10 кадров)
cmd.zoom( 'n. CA and i. %d+%d' % (i,i+7)) # приближаем камеру к СА атомам i-го и i+7-го остатков
cmd.mview('store') # делаем каждый 10-ый кадр ключевым (таким образом переход к этому кадру будет плавным через
# предыдущие 9 кадров)
cmd.reinitialize()
cmd.fetch("1LMP")
'1LMP'
from IPython.display import Image
Функция Sculpting позволяет руками менять молекулу с сохранением длин связей и углов между химическими группами:
Image("pr2_1_after.png")
cmd.reinitialize()
cmd.fetch("1LMP")
cmd.bg_color("white")
cmd.remove("resn HOH")
cmd.select("ligand", "r. NAG or r. NDG")
cmd.select("site", "byres all within 5 of ligand")
cmd.show("sticks", "site")
cmd.set("cartoon_transparency", 0.7)
cmd.set("cartoon_side_chain_helper", 1)
cmd.png("pr2_2.png", width=1080, height=720, ray=1)
В зоне контакта белка с лигандом есть несколько остатков, образующих водородные связи с лигандом на периферии кармана. Мутация любого из них не гарантирует отсутствие сродства белка к этому лиганду.
Image("pr2_2.png")
Можно сломать белок совсем, нарушив его гидрофобное ядро заряженной аминокислотой, например аргинином. Тогда белок не сможет сворачиваться в данную конформацию и скорее всего не сможет связывать этот лиганд.
cmd.select("hydrophobic_core", "byres all within 5 of i. 28")
cmd.show("sticks", "hydrophobic_core")
cmd.color("orange", "hydrophobic_core")
cmd.color("red", "i. 28")
cmd.png("pr2_2_2.png", width=1080, height=720, ray=1)
cmd.do('''
wizard mutagenesis
refresh_wizard
python
cmd.get_wizard().do_select("resi 28")
cmd.get_wizard().set_mode("ARG")
cmd.get_wizard().apply()
cmd.set_wizard()
python end
''')
Гидрофобное ядро показано оранжевым, триптофан 28 в центре его - красным. Мутация его на аргинин должна привести к желаемому эффекту:
Image("pr2_2_2.png")
cmd.png("pr2_2_3.png", width=1080, height=720, ray=1)
Image("pr2_2_3.png")
cmd.set_name("1LMP", "broken")
cmd.fetch("1LMP", "correct")
cmd.hide("sticks", "all")
cmd.show("sticks", "i. 28")
cmd.color("cyan", "m. correct")
cmd.color("orange", "m. broken")
cmd.color("red", "i. 28 and m. broken")
cmd.color("blue", "i. 28 and m. correct")
cmd.orient("all")
cmd.translate([60,0, 0], object="m. correct")
cmd.orient("all")
cmd.mview("purge")
cmd.mset("1x150")
cmd.mview("store", 1, object="m. broken")
cmd.mview("store", 1, object="m. correct")
cmd.mview("store", 1)
cmd.mview("store", 150, object="m. broken")
cmd.mview("store", 150, object="m. correct")
cmd.mview("store", 150)
cmd.translate([-60, 0, 0], object="m. correct")
cmd.mview("store", 30, 90, object="m. correct")
cmd.orient("m. broken")
cmd.mview("store", 60)
cmd.translate([60, 0, 0], object="m. correct")
cmd.mview("store", 120, object="m. correct")
cmd.frame(1)
for x in range(0, 150):
cmd.mpng('pr2_movie/', x + 1, x + 1, mode=1, width=720, height=480)
from IPython.display import Video, display
display(Image(filename='pr2_movie.gif', format='png'))
Скачиваем .sdf картинку TAMRA с сайта PubChem
cmd.reinitialize()
cmd.fetch("1LMP")
cmd.load("tamra.sdf")
cmd.show("sticks", "tamra")
cmd.show("sticks", "resi 24")
cmd.remove("tamra and id 2")
cmd.select("tamra_part", "tamra and id 29")
cmd.select("protein_part", "/1LMP/A/A/SER`24/OG")
cmd.fuse("tamra_part", "protein_part")
cmd.torsion(250)
cmd.select("site", "protein_part")
cmd.select("bigsite", "byres all within 10 of site")
244
cmd.orient("bigsite")
cmd.png("pr2_4.png", width=1080, height=720, ray=1)
Image("pr2_4.png")
cmd.reinitialize()
cmd.fragment("ala", "helix")
cmd.alter("helix", "resi=1")
for i in range(1, 100):
cmd.edit(f"i. {i} and n. C")
cmd.editor.attach_amino_acid("pk1", "ala")
cmd.set_dihedral(f"i. {i} and n. C", f"i. {i+1} and n. N", f"i. {i+1} and n. CA",
f"i. {i+1} and n. C", -63)
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", -43)
cmd.orient()
cmd.hide("cartoon", "all")
cmd.png("pr2_5.png", width=1080, height=720, ray=1)
Image("pr2_5.png")
# воспользуемся структурой 4BNA
cmd.reinitialize()
cmd.fetch('4BNA')
cmd.remove("resn HOH")
cmd.select('a1', 'i. 7 + i. 18')
cmd.select('a2', 'i. 8 + i. 17')
cmd.extract('pair_1', 'a1')
cmd.extract('pair_2', 'a2')
cmd.pair_fit('m. pair_2 and bb.', 'm. pair_1 and bb.')
transform = cmd.get_object_matrix('pair_2')
cmd.remove('m. pair_2')
cmd.set_name('pair_1', 'a1')
cmd.remove('4BNA')
cmd.alter(f'/a1///DA', 'resi = 100')
cmd.alter(f'/a1///DT', 'resi = 101')
for i in range(1, 100):
cmd.create(f'a{i+1}', f'a{i}')
cmd.transform_selection(f'a{i+1}', transform)
cmd.alter(f'/a{i+1}///DA', f'resi = {100 - i}')
cmd.alter(f'/a{i+1}///DT', f'resi = {100 + i + 1}')
cmd.create('BDNA', 'all')
for i in range(1, 100):
cmd.do(f'''
delete m. a{i+1}
select pk1, i. {i} and n. O3'
select pk2, i. {i+1} and n. P
bond
select pk1, i. {100 + i} and n. O3'
select pk2, i. {100 + i+1} and n. P
bond
''')
cmd.png("pr2_6.png", width=1080, height=720, ray=1)
Image("pr2_6.png")
jupyter nbconvert --to html pr1and2.ipynb
File "<ipython-input-204-649299d73de6>", line 1 jupyter nbconvert --to html pr1and2.ipynb ^ SyntaxError: invalid syntax