Подготовка к работе: запуск pymol в режиме rpc сервера и подключение к нему из ноутбука. Для этого в командной строке исполняем pymol -R, запускаем jupyter-notebook и выполняем следующие команды:
import xmlrpc.client as xmlrpclib
cmd = xmlrpclib.ServerProxy('http://localhost:9123')
from IPython import display
cmd.do('''
fetch 1cll, async=0
as lines, n. C+O+N+CA
zoom i. 4+5
mset 1 x1000
mview store
''')
Обсудим работу этого скрипта. Для начала мы подгружаем в рабочую папку pdb файл 1cll и открываем его в Pymol, затем отображаем множество атомов с названиями С, О, N и CA, то есть атомы остова плюс атом кислорода при атоме углерода пептидной связи, в виде линий, потом центрируем камеру на остатки 4 и 5, создаем 1000 кадров на 1 стейт и сохраняем текущий вид как ключевую точку. В итоге работа этого скрипта создаст фильм из одного кадра, настроенного соответствующие остатки в заданном отобажении.
cmd.do('''
stored.r = []
cmd.iterate('1cll and n. CA','stored.r.append(int(resi))')
print(stored.r)
python
import numpy as np
length = len(stored.r)
colors = np.linspace(1,0.5, length)
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)
python end
cmd.show_as('cartoon','all')
''')
Разберем этот скрипт. Здесь мы используем вспомогательную переменную stored, куда сохраняем номера остатков в файле 1cll, затем для каждого остатка создаем свой цвет и отображаем все в виде cartoon с соответствующими сгенерированными расцветками, в данном случае это оттенки от розового до фиолетового.
cmd.do('''
python
for i in range(100):
cmd.frame((10*i)+1)
cmd.zoom( 'n. CA and i. %d+%d' % (i,i+7))
cmd.mview('store')
python end
''')
В этот раз мы создаем фильм поинтереснее. Для фреймов 1, 11, 21, ..., 991 мы создаем ключевую точку как приближение к остаткам с 0 по 7, с 1 по 8 и тд, но всю молекулу не проходим. При этом мы, как будто, идем вдоль цепи со сдвигающейся рамкой обзора.
cmd.fetch('1lmp')
cmd.do('''
bg_color white
zoom i. 90-98
hide everything, sol.
ray
png 1lmp_1.png
''')
display.Image('/home/olga/Downloads/pymol/1lmp_1.png')
display.Image('/home/olga/Downloads/pymol/1lmp_2.png')
Здесь был применен метод Sculpting для петли 90-98 белка комплекса 1lmp, мы видим, что представление о вторичной структуре в виде альфа спирали немного поломалось.
cmd.fetch('1lmp')
cmd.bg_color('white')
cmd.remove('solvent')
cmd.select('ligand', 'chain B')
cmd.orient('ligand')
cmd.select('site', 'byres all within 5 of ligand')
cmd.show('sticks', 'site')
cmd.set_bond('stick_radius', '0.15', 'site and not ligand')
cmd.do('''
select act_site, resi 35+46+52+101+103
hide sticks, site and not (act_site or ligand)
label act_site and name CA, "%s-%s" %(resn, resi)
set label_size, 10
set_view (\
-0.872253001, 0.486871660, -0.046148673,\
0.360131413, 0.703288317, 0.612936080,\
0.330877453, 0.518015444, -0.788783789,\
-0.000001854, -0.000002965, -49.837524414,\
14.164933205, 57.497573853, 27.749946594,\
41.741825104, 57.933265686, -20.000000000 )
set label_position, [0.0, 0.0, 2.5]
png 1lmp_3.png
''')
display.Image('/home/olga/Downloads/pymol/1lmp_3.png')
cmd.do('''
show surface, site
hide sticks, site
hide label
show sticks, ligand
set_view (\
-0.820704699, 0.437998384, 0.366877139,\
0.050413433, -0.584104002, 0.810110271,\
0.569123447, 0.683358252, 0.457295746,\
0.000007987, 0.000011148, -49.841667175,\
14.097801208, 58.162952423, 26.616022110,\
41.741825104, 57.933265686, -20.000000000 )
png 1lmp_4.png
''')
display.Image('/home/olga/Downloads/pymol/1lmp_4.png')
Здесь мы внимательно рассмотрели карман связывания лиганда, коим в данном случае является олигосахарид, с белком. Для этого мы вначале обратили внимание на возможные взаимодействия, которые могут стабилизировать данную геометрию (рисунок 1lmp_3.png), пунктирными линиями были показаны водородные связи для наглядности (их можно и в скрипте прописать через get_distance, но мне здесь показалось неоправданным тратить время и усилия, чтобы вручную прописывать каждую пару атомов, когда для наглядности можно быстро воспользоваться самим Pymol). При этом ничего примечательного, вроде, не наблюдается, ожидаемо, только водородные связи. Но мы не забываем, что именно вклад в связывание лиганда и образование комплекса вносит shape complementarity, поэтому было сделано другое изображение сайта связывания, в виде surface (1lmp_4.png). Из анализа двух изображений можно предположить, что критичнее всего будет мутация остатка, который одновременно формирует нужную форму кармана и стабилизирует уже подошедший лиганд.
Например, мутация глутамата 35 на глицин, как показано на рисунке ниже.
display.Image('/home/olga/Downloads/pymol/1lmp_5.png')
cmd.fetch('1lmp')
cmd.bg_color('white')
cmd.remove('solvent')
Командами create и mutagenesis создаем мутированный белок.
cmd.select('ligand', 'chain B and mut_1lmp')
cmd.orient('ligand')
cmd.select('site', 'byres all within 5 of ligand')
cmd.show('surface', 'site')
cmd.show('cartoon', '1lmp')
cmd.show('sticks', '1lmp and chain B')
cmd.select('ligand1', 'chain B and 1lmp')
cmd.orient('ligand1')
cmd.select('site1', 'byres all within 5 of ligand1')
cmd.show('surface', 'site1')
cmd.do('''
super mut_1lmp, 1lmp
zoom ligand
mset 1x100
mview store, 1
mview store, 100
zoom resi 35
mview store, 40
mview store, 60
''')
cmd.load('tamra.sdf')
cmd.bg_color('white')
cmd.png('tamra.png')
display.Image('/home/olga/Downloads/pymol/tamra.png')
Теперь видно, что для образования сложноэфирной связи в структуре этой метки имеется только карбоксильная группа, тогда нам надо искать в белке гидроксильную, что наводит на мысль о серине, треонине и тирозине.
cmd.fetch('1lmp')
cmd.bg_color('white')
cmd.remove('solvent')
cmd.do('''
select tsy, byres resn THR+SER+TYR
show sticks, tsy
color magenta, tsy
util.cnc tsy
zoom resi 20
png 1lmp_6.png
''')
display.Image('/home/olga/Downloads/pymol/1lmp_6.png')
Для удобства выберем тирозин 20 на периферии белка.
cmd.remove('tamra and id 2')
cmd.select('с', 'id 29 and tamra')
1
cmd.select('o', 'name OH and resi 20')
cmd.fuse('c', 'o')
cmd.edit('c', 'o')
cmd.torsion(0)
cmd.zoom('resn UNK and 1lmp')
cmd.png('1lmp_7.png')
display.Image('/home/olga/Downloads/pymol/1lmp_7.png')
cmd.reinitialize()
cmd.bg_colour('white')
cmd.fragment('ala')
cmd.do('alter ala, resi=1')
for x in range(99):
cmd.do((f'''edit name C and resi {x + 1}
editor.attach_amino_acid('pk1', 'ala')'''))
Возьмем известные значения торсионных углов для такой спирали.
phi = -59 # C N CA C
psi = -48 # N CA C N
for x in range(99):
cmd.set_dihedral(f'resi {x+1} and name C',f'resi {x+2} and name N', f'resi {x+2} and name CA', f'resi {x+2} and name C',phi)
cmd.set_dihedral(f'resi {x+1} and name N',f'resi {x+1} and name CA', f'resi {x+1} and name C',f'resi {x+2} and name N',psi)
cmd.do('''
set_view (\
0.694084167, 0.159645453, -0.701968372,\
-0.565324247, 0.724591017, -0.394183308,\
0.445710659, 0.670437038, 0.593176663,\
0.000012725, -0.000003003, -89.086006165,\
42.711204529, 21.559459686, -35.110416412,\
79.092697144, 139.092697144, -20.000000000 )
''')
cmd.png('1lmp_8.png')
display.Image('/home/olga/Downloads/pymol/1lmp_8.png')