Знакомство и работа с Pymol

In [1]:
#импортируем PyMol и необходимые модули
import __main__
__main__.pymol_argv = [ 'pymol', '-x' ]

from IPython.display import Image, display
import time
In [2]:
#запускаем Pymol
import pymol
pymol.finish_launching()
from pymol import cmd,stored,wizard
import numpy as np
In [3]:
#загружаем структуру, задаем вид. Приближаем остатоки 4 и 5, меняем цвет фона, удаляем растворитель.
#также создаем набор кадров 1000 штук, сохраняем вид
cmd.do('''
fetch 1lmp, async=0
as lines, n. C+O+N+CA
zoom i. 4+5
bg_color white
remove solvent
color pink
mset 1 x1000 
mview store
''')

Исследование итерации по остаткам.

In [5]:
#создаем список stored.r, в котором идентификаторы всех Ca-атомов
stored.r = [] 
cmd.iterate('1lmp and n. CA','stored.r.append(resi)')
#получаем одномерный массив, где есть значения от 1 до 0.5 в количестве элементов списка stored.r
length = len(stored.r)
colors = np.linspace(1,0.5, length)
#создаем цвета со значениями 0.5, 0.75 и присвоим каждому остатку свой цвет
for k,i in enumerate([int(i) for i in stored.r]):
    cmd.set_color('col%d' %k, [colors[k],0.5,0.75])
    cmd.set('cartoon_color','col%d' % k ,'resi %d' % i)
cmd.show_as('cartoon','all')
cmd.do('orient')
In [6]:
cmd.png('structure.png', '1920', '1080', ray=1)
Image('structure.png')
Out[6]:

Упраженение с movie.

In [7]:
#создаем анимацию. в каждом десятом кадре картинка 
#приближается к i-тому и i+7 остатку
import imageio
import os

for i in range(length):
    cmd.frame((10*i)+1) 
    cmd.zoom( 'n. CA and i. %d+%d' % (i,i+7))
    cmd.mview('store')  
In [8]:
cmd.mplay()
In [9]:
cmd.mstop()
dirpath = os.getcwd()
cmd.mpng(dirpath, mode=1, width=1920/4, height=1080/4)
#запишем видео
with imageio.get_writer('movie1.gif.png', format='gif', mode='I') as writer:   
    for x in range(0, 1000, 4):
        filename = os.path.join(dirpath, f'{x+1:04}.png')
        image = imageio.imread(filename)
        writer.append_data(image)
In [10]:
#посмотрим видео
from IPython.display import Image

display(Image(filename='movie1.gif.png'))

Работа с Pymol

In [11]:
cmd.do('''
reini
fetch 1LMP, async=0
as cartoon, n. C+O+N+CA
orient
color atomic
''')
#Посмотрим на изначальную модель
In [12]:
cmd.png('view.png', ray = 1)
Image('view.png')
Out[12]:

Sculpting

Исследуем возможности Sculpting. Попробуем изменить структуру белка. Изменили укладку петель, покрашены в розовый.

In [13]:
cmd.do('''
orient
color pink, resi 64-73 or resi 116-126
''')
In [14]:
cmd.png('view2.png', ray = 1)
Image('view2.png')
Out[14]:

Связывание с лигандом и мутации

Оценим зону контакта с лигандом и попробуем мутировать важную для контакта аминокислоту. Для начала используем сервис ProteinsPlus и найдем возможные аминокислоты-мишени.

In [41]:
display(Image('1lmp_NDG_B_1_NAG_B_2_NAG_B_3.png', width=600))
In [15]:
cmd.do('''
reini
fetch 1LMP, async=0
as cartoon, n. C+O+N+CA
color atomic
orient
remove solvent
sele ligand, resn NAG or resn NDG
sele arnd, byres ligand around 4
as lines, not ligand
distance h, ligand, arnd, 3.5, 2
orient ligand or arnd
rotate y, -150
rotate z, -10
set label_font_id, 5
set label_color, black
label n. CA and arnd, resi
''')
In [16]:
cmd.png('beforem.png', ray = 1)
Image('beforem.png')
Out[16]:

Посмотрим на карман связывания.

In [17]:
cmd.do('''
as surface, arnd
''')
In [224]:
cmd.png('pocket.png', ray = 1)
Image('pocket.png')
Out[224]:

Нас интересует остаток, у радикала которого есть значимое взаимодействие с лигандом. Обратим внимание на 101 остаток. Мутируем его на лейцин.

In [57]:
cmd.wizard('mutagenesis')
cmd.refresh_wizard()
cmd.get_wizard().do_select('resi 101')
cmd.get_wizard().set_mode('LEU')
cmd.refresh_wizard()
cmd.get_wizard().apply()
cmd.set_wizard()

cmd.do('''
as lines, arnd
orient arnd or ligand
color violet, resi 101
as sticks, resi 101
delet h
''')
In [60]:
cmd.do('''
turn x, 10
''')
In [62]:
cmd.png('mutate.png', ray = 1)
Image('mutate.png')
Out[62]:

Такая мутация, если и не приведет к потере связывания с лигандом, то сильно ухудшит его. Карман сильно изменил свою форму.

In [63]:
cmd.do('''
as surface, arnd 
''')
cmd.do('set auto_sculpt, on\n'
       'set sculpting, on\n'
       'sculpt_activate all\n')
time.sleep(60)
cmd.do('set sculpting, off')
In [69]:
cmd.do('''
orient arnd or ligand
turn x, 10
''')
In [71]:
cmd.png('mutate1.png', ray = 1)
Image('mutate1.png')
Out[71]:

Совместим нативную и мутантную структуру.

In [72]:
cmd.fetch('1lmp', 'prev')
cmd.remove('solvent')
cmd.do('''
as cartoon, 1LMP
as sticks, resi 101
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')
In [73]:
cmd.do('''
util.cbac hetatm
as sticks, i. 101
util.cnc prev and i.101
''')
cmd.center('1LMP')
cmd.super('1LMP', 'prev')
Out[73]:
(0.17642422020435333, 826, 5, 0.31610107421875, 997, 603.0420532226562, 129)
In [74]:
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. 101 and chain A and 1LMP)
select i. 101 + (chain B and r. NDG)
zoom 0.9, sele
mview store, object=1LMP
mview store, object=prev
mview store
''')
In [75]:
import os
import imageio
In [76]:
cmd.frame(1)
cmd.mplay()
In [77]:
cmd.mstop()
dirpath = 'movie/'
cmd.do('''
mpng dirpath, first=1, last=100, mode=1, width=1920//4, height=1080//4
''')


while not os.path.exists('movie/0100.png'):
    time.sleep(0.1)
with imageio.get_writer('video.gif.png', format='gif', mode='I' ) as writer:
    for x in range(1, 100):
        filename = os.path.join(dirpath, f'{x+1:04}.png')
        image = imageio.imread(filename)
        writer.append_data(image)
In [78]:
display(Image("video.gif.png", format='png'))

Присоединение флуоресцентной метки

In [284]:
cmd.reinitialize()
cmd.do('''
fetch 1LMP, async=0
as lines, n. C+O+N+CA
remove solvent
''')
cmd.load('TAMRA.sdf')

37 остаток серина небольшого размера, смотрит наружу и подходит для образования сложноэфирной связи. Присоединим метку к тему.

In [285]:
cmd.do('''
sele i. 37 and 1LMP
show sticks, sele
util.cbac i. 37
sele ser, i. 37 and 1LMP and name CB
remove i. 37 and 1lmp and elem O and sidechain
remove elem H
fuse (TAMRA and id 2), ser, mode=1
pick pkbond
torsion 100
''')
In [286]:
cmd.do('''
zoom ser, 10
''')
In [287]:
cmd.png('TAMRA_N.png', ray = 1)
Image('TAMRA_N.png')
Out[287]:

Создание полиаланиновой спирали

Теперь создадим альфа-спираль из отатков аланина. Зная торсионные углы, мы можем циклом прибавлять один остаток аланина к другому командой attach_amino_acid, а затем в явном виде указывать, какие углы хотим при этом получить командой set_dihedral.

In [296]:
cmd.reinitialize()
cmd.fragment('ALA')
cmd.do('''
edit ALA and name C
editor.attach_amino_acid("pk1","ALA")
set_dihedral ALA///2/ and name N, ALA///2/ and name CA, ALA///2/ and name C, ALA///3/ and name N, -45
set_dihedral ALA///2/ and name CA, ALA///2/ and name C, ALA///3/ and name N, ALA///3/ and name CA, 180
set_dihedral ALA///2/ and name C, ALA///3/ and name N, ALA///3/ and name CA, ALA///3/ and name C, -60''')
for i in range(3,100):
    to_do = 'edit ALA///' + str(i) + '/ and name C'
    cmd.do(to_do)
    cmd.do('editor.attach_amino_acid("pk1","ALA")')
    to_do = 'set_dihedral ALA///'+str(i)+'/ and name N, ALA///'+str(i)+'/ and name CA, ALA///'+str(i)+'/ and name C, ALA///'+str(i+1)+'/ and name N, -45'
    cmd.do(to_do)
    to_do = 'set_dihedral ALA///'+str(i)+'/ and name CA, ALA///'+str(i)+'/ and name C, ALA///'+str(i+1)+'/ and name N, ALA///'+str(i+1)+'/ and name CA, 180'
    cmd.do(to_do)
    to_do = 'set_dihedral ALA///'+str(i)+'/ and name C, ALA///'+str(i+1)+'/ and name N, ALA///'+str(i+1)+'/ and name CA, ALA///'+str(i+1)+'/ and name C, -60'
    cmd.do(to_do)
In [300]:
cmd.do('''
hide all
show sticks, ALA
remove elem H
center all
''')
In [301]:
cmd.png('ALA_helix.png', ray = 1)
Image('ALA_helix.png')
Out[301]:

Создание ДНК

Построим B форму ДНК спирали. В Pymol нет заготовок оснований, поэтому получим их из какой-нибудь структуры из банка. С помощью команды get_object_matrix() получим матрицу, согласно которой будем сдвигать основания друг относительно друга.

In [303]:
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))
In [317]:
cmd.do('''
orient all
center all
turn z, 30
''')
In [319]:
cmd.png('dna.png', ray = 1)
Image('dna.png')
Out[319]: