Для начала сделаем все необходимые импорты:
import __main__
__main__.pymol_argv = [ 'pymol', '-x' ]
import pymol
pymol.finish_launching()
from pymol import cmd,stored
Подгружаем структуру 1cll из базы данных PDB, включаем отображение структуры в виде линий (lines), показывая только остовные атомы - C, O, N, CA. Приближаем камеру к остаткам 4, 5 (лейцин и треонин). У нас был создан "фильм" из 1000 фреймов 1 стейта. Также мы сохранили "точку обзора".
cmd.do('''
fetch 1cll, async=0
as lines, n. C+O+N+CA
zoom i. 4+5
mset 1 x1000
mview store''')
Создаем массив stored.r и добавляем в него id аминокислотных остатков
stored.r = []
cmd.iterate('1cll and n. CA','stored.r.append(resi)')
152
В переменную length записываем длину массива stored.r, созданного нами ранее. Далее, в переменную colors записываем массив, длина которого равно length - значения от 1 до 0.5 с равным шагом.
После этого мы, итерируясь по массиву sterd.r с одновременнум нумерование его элементов, создаем цвета col0, col1, col2, ... со значениями [1, 0.5, 0.75], [0.99668874, 0.5, 0.75], [0.99337748, 0.5, 0.75], ... . Присваиваем каждому остатку свой цвет.
Отображаем все в cartoon. Получается cartoon в оттенках фиолетового.
import numpy as np
length = len(stored.r)
colors = np.linspace(1,0.5, length)
stored.r = list(map(lambda x: int(x), stored.r))
for k,i in enumerate(stored.r):
cmd.set_color('col%d' %k, [colors[k],0.5,0.75])
print([1,1,colors[k]])
cmd.set('cartoon_color','col%d' % k ,'resi %d' % i)
cmd.show_as('cartoon','all')
Мы итерируемся по списку с индексами аминокислотных остатков - stored.r.
cmd.frame - переводит нас к заданному в качестве аргументу фрейма фильма,
cmd.zoom - в данном случае приближает нас к С-альфа атомам аминокислотных остатков i и i+7,
cmd.mview
Таким образом, каждый десятый кадр - приближение участка из i - (i+7) остатков.
for i in range(len(stored.r)):
cmd.frame((10*i)+1)
cmd.zoom( 'n. CA and i. %d+%d' % (i,i+7))
cmd.mview('store')
cmd.reinitialize()
from IPython.display import display, Image
Структура "до" выглядела следующим образом:
cmd.reinitialize()
cmd.do('''
fetch 1lmp
remove het
remove resname hoh
bg white
set ambient, 0.2
set light_count, 0
color deepteal, all
set ray_trace_mode, 1
ray
''')
cmd.png(filename='/home/julybel/study/biopol/1lmp.png',width='10cm',dpi=500,ray=3)
Image('/home/julybel/study/biopol/1lmp.png')
Та же структура после применения "Sculpting":
Мы немного изменили структуру петельки (отмечена "deepteal" на рисунке ниже). Инструмент Sculpting учитывает возникающие клеши и позволяет несколько, простыми методами, оптимизировать новоизмененную структуру прямо внутри PyMol.
Посмотрим на общий вид белка с лигандом.
cmd.do('''
fetch 1LMP, async=0''')
cmd.do('remove resname hoh')
cmd.do('bg white')
cmd.set('cartoon_color', 'gray80')
cmd.color('deepteal', '(r. NAG + r. NDG) and n. C*')
cmd.color('firebrick', '(r. NAG + r. NDG) and n. O*')
cmd.color('marine', '(r. NAG + r. NDG) and n. N*')
cmd.do('''
set light_count, 0
set ambient, 0.2
''')
cmd.do('''
set ray_trace_mode, 3
ray
''')
cmd.png(filename='/home/julybel/study/biopol/common.png',width='10cm',dpi=500,ray=3)
Image('/home/julybel/study/biopol/common.png')
Посмотрим вручную в PyMol, какие взаимодействия формирует лиганд с белком и отметим их (остатки, взаимодействия с которыми мы отметили: Asp101, Ala107, Glu35, Asp52, Asn59):
cmd.dist("i. 101 and chain A and n. OD2", "i. 3 and chain B and n. O6")
cmd.dist("i. 107 and chain A and n. O", "i. 2 and chain B and n. N2")
cmd.dist("i. 59 and chain A and n. N", "i. 2 and chain B and n. O7")
cmd.dist("i. 35 and chain A and n. OE2", "i. 1 and chain B and n. O6")
cmd.dist("i. 52 and chain A and n. OD2", "i. 1 and chain B and n. O1")
cmd.do('''
select aa, (i. 101 + i. 107 + i. 59 + i. 35 + i. 52) and chain A
show sticks, aa
color gray80, aa and n. C*
color firebrick, aa and n. O*
color marine, aa and n. N*
rotate x, 30
rotate y, -20
rotate x, 30
rotate y, 2
cmd.mview('store')
''')
cmd.zoom()
cmd.png(filename='/home/julybel/study/biopol/dists.png',width='10cm',dpi=500,ray=3)
Рассматриваемый нами белок - представитель лизоцимов с-типа, действующий как 1,4-бета-ацетилмурамидаза, он разрешает полисахариды, которые присутствуют в составе клеточной стенки некоторых бактерий. Ключеве для каталитической функции остатки - Asp52, Glu35. По видимому, образовавшийся в ходе реакции карбениевый катион стабилизируется отрицательно-заряженной карбоксильной группой аспартата 52. Возьмем его для мутации.
[1] https://www.creative-enzymes.com/similar/lysozyme_426.html
[2] Held J., Smaalen S.V. The active site of hen egg-white lysozyme: flexibility and chemical bonding. Acta Crystallographica, 2014, D70: 1136-1146.
cmd.delete("n. dist*")
cmd.hide("labels")
from pymol import wizard
cmd.wizard("mutagenesis")
cmd.do("refresh_wizard")
cmd.get_wizard().set_mode("ALA")
cmd.get_wizard().do_select("i. 52 and chain A")
cmd.frame(1)
cmd.get_wizard().apply()
cmd.set_wizard("done")
cmd.zoom('i. 52 and n. NDG')
cmd.png(filename='/home/julybel/study/biopol/asp52.png',width='10cm',dpi=500,ray=3)
Image('/home/julybel/study/biopol/asp52.png')
Как мы видим на рисунке выше, присутствовавшая ранее водородная связь между O1 NDG и остатком в позиции 52 цепи А не формируется (мы промутировали аспартат на аланин).
cmd.fetch('1lmp', 'prev')
cmd.remove('solvent')
cmd.do('''
select (not hetatm) and prev
color brightorange, sele and n. C*
color firebrick, sele and n. O*
color marine, sele and n. N*
''')
cmd.set('cartoon_color', 'brightorange' , '(not hetatm) and prev')
cmd.do('''
util.cbac hetatm
show sticks, i. 52
util.cnc prev and i. 52
''')
cmd.super('1LMP', 'prev')
cmd.do('''
mset 1 x 100
mview store
frame 1
translate [0,0,60], object=1LMP
translate [0,0,-60], object=prev
mview store
frame 50
translate [0,0,-60], object=1LMP
translate [0,0,60], object=prev
mview store, object=1LMP
mview store, object=prev
mview store
mview interpolate, object=1LMP
mview interpolate, object=prev
frame 100
translate [0,0,0], object=1LMP
translate [0,0,0], object=prev
mview store, object=1LMP
mview store, object=prev
mview store
orient (i. 52 and chain A and 1LMP) + (chain B and r. NDG)
select i. 52 + (chain B and r. NDG)
zoom 0.9, sele
mview store, object=1LMP
mview store, object=prev
mview store
frame 1
mplay
''')
display(Image("/home/julybel/study/biopol/movie/movie.gif", format='png'))
Посмотрим, как выглядит метка TAMRA, которую нам нужноь навесить на белок через сложноэфирную связь.
cmd.reinitialize()
cmd.load('/home/julybel/study/biopol/TAMRA.sdf')
cmd.do('''
bg white
set stick_radii, 0.3
color deepteal, TAMRA and n. C*
color firebrick, TAMRA and n. O*
color marine, TAMRA and n. N*
set ambient, 0.2
rot y, 50
set ray_trace_mode, 3
ray
''')
cmd.png(filename='/home/julybel/study/biopol/TAMRA.png',width='10cm',dpi=500,ray=3)
Image('/home/julybel/study/biopol/TAMRA.png')
Метка имеет достаточно крупную ароматическую систему. Посмотрим на аминокислоты, которые имеют относительно некрупный радикал, в составе которого есть гидроксильная группа - Ser, Thr.
cmd.do('''
fetch 1LMP, async=0
remove resname hoh
set cartoon_color, gray80
set ambient, 0.3
set light_count, 0
set ray_trace_mode, 1
select res, 1LMP and (r. SER + r. THR)
sh st, res
color gray80, res and n. C*
color marine, res and n. N*
color firebrick, res and n. O*
center i. 43
zoom i. 43
label i. 43 and n. OG1, resn + resi
''')
Прикрепим флуоресцентную метку к Thr43, этот остаток достаточно сильно удален от активного центра и лежит на поверхности.
cmd.png(filename='/home/julybel/study/biopol/Thr43.png',width='10cm',dpi=500,ray=3)
Image('/home/julybel/study/biopol/Thr43.png')
Прикрепляем метку:
cmd.do('''
select prot, r. thr and i. 43
show sticks, prot
util.cbag prot
select og1, prot and name OG1
select map, TAMRA and id 4
fuse map, og1
torsion -45
zoom og1
''')
Значения дихедралов были взяты из этой статьи:
Nakazawa Y., Asakura T. Structure Determination of a Peptide Model of the Repeated Helical Domain in Samia c ynthia r icini Silk Fibroin before Spinning by a Combination of Advanced Solid-State NMR Methods //Journal of the American Chemical Society. – 2003. – Т. 125. – №. 24. – С. 7230-7237.
cmd.reinitialize()
cmd.fragment('ala')
for i in range(2,101):
cmd.do('''
edit i. {} and n. C
editor.attach_amino_acid("pk1","ala")
set_dihedral i. {} and n. N, i. {} and n. CA, i. {} and n. C, i. {} and n. N, -48
set_dihedral i. {} and n. C, i. {} and n. N, i. {} and n. CA, i. {} and n. C, -59'''.format(i, i,i,i,i+1,i,i+1,i+1,i+1))
cmd.do('''
alter (all),resi=str(int(resi)-1)
select ala
hide sticks, sele
spectrum count, rainbow_rev, byres=1
bg white
zoom
''')
cmd.reinitialize()
cmd.do('''
fetch 1bna
remove resname hoh
extract anchor, i. 4 + i. 21
extract next, i. 5 + i. 20
''')
cmd.pair_fit("anchor","next")
trans=cmd.get_object_matrix("anchor")
cmd.do('''
select all ; show sticks
delete 1bna
delete next
''')
i = 1
anchor = 'anchor'
nxt = 'next'
cmd.create(nxt, anchor)
cmd.transform_selection(nxt, trans)
cmd.do('''
alter anchor and i. 4,resi={}
alter anchor and i. 21,resi={}
alter next and i. 4, resi={}
alter next and i. 21, resi={}
create obj, all
delete anchor
delete next
select a1, chain A and i. {} and id 66
select a2, chain A and i. {} and id 58
bond a1, a2
select a1, chain B and i. {} and id 405
select a2, chain B and i. {} and id 413
bond a1, a2
select anchor, (chain A and i. {}) + (chain B and i. {})
'''.format(i, 200-i+1, i+1, 200-i, i, i+1, 200-i+1, 200-i, i+1, 200-i))
for i in range(2,101):
anchor = 'anchor'
nxt = 'next'
cmd.create(nxt, anchor)
cmd.transform_selection(nxt, trans)
cmd.do('''
alter next and i. {}, resi={}
alter next and i. {}, resi={}
create obj, all
delete anchor
delete next
select a1, chain A and i. {} and id 66
select a2, chain A and i. {} and id 58
bond a1, a2
select a1, chain B and i. {} and id 413
select a2, chain B and i. {} and id 405
bond a1, a2
select anchor, (chain A and i. {}) + (chain B and i. {})
'''.format(i, i+1, 200-i+1, 200-i, i, i+1, 200-i, 200-i+1, i+1, 200-i))
cmd.do('''
bg white
zoom in
''')
Получилась такая штука (докрасили вручную в PyMol ):