Знакомство с Pymol¶

In [131]:
from IPython.display import Image
In [1]:
import __main__
__main__.pymol_argv = [ 'pymol', '-x' ]

import pymol
pymol.finish_launching()
from pymol import cmd,stored

cmd.do('''
fetch 1cll, async=0
as lines, n. C+O+N+CA
zoom i. 4+5
mset 1 x1000
mview store''')

Открылось окно PyMol, вот что там видно

In [3]:
cmd.png('1cll_1.png')
Image(filename='1cll_1.png')
Out[3]:

Произведем итерацию по остаткам:

In [4]:
stored.r = [] 
cmd.iterate('1cll and n. CA','stored.r.append(resi)')

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' % int(i))
cmd.show_as('cartoon','all')
In [5]:
cmd.png('1cll_2.png')
Image(filename='1cll_2.png')
Out[5]:

Сделаем упражнение с movie (создадим мультик):

In [6]:
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') 

Действительно, в окне PyMol теперь можно посмотреть movie

Работа с Pymol¶

In [4]:
cmd.do('delete 1cll')

Загрузим структуру 1LMP

In [8]:
cmd.do('''
fetch 1LMP, async=0
as lines, n. C+O+N+CA
zoom i. 4+5
mset 1 x1000
mview store''')
In [9]:
cmd.do('bg_color white; select all; hide all; show cartoon; orient 1LMP; color forest')
In [24]:
Image(filename='1lmp_1.png')
Out[24]:

Оценим возможности Sculpting - вручную подвигаем разные части белка:

In [25]:
Image(filename='1lmp_2.png')
Out[25]:

Теперь обратим внимание, что там вообще-то еще есть лиганд, он покрашен розовым

In [27]:
Image(filename='1lmp_4.png')
Out[27]:

Посмотрим на контакты, которые лиганд может потенциально образовать с белком

In [33]:
Image(filename='1lmp_5.png')
Out[33]:

Аминокислотой, замена которой может привести к потере связывания лиганда, кажется (помимо прочих) ASP52. Можно попробовать заменить ее, например, на фенилаланин.

In [42]:
Image(filename='1lmp_6.png')
Out[42]:

Видим, что замена привела во-первых к потере потенциальной связи, но также и скорее всего поменяется положение лиганда.

После применения sculpting получим следующее:

In [43]:
Image(filename='1lmp_7.png')
Out[43]:

Теперь попробуем сделать фильм

In [54]:
cmd.do('hide sticks; show sticks, ligand or resi 52')
In [18]:
cmd.fetch('1lmp', 'real')
Out[18]:
'real'
In [19]:
cmd.do('remove resn hoh; show sticks, resi 52')
In [105]:
cmd.do('color forest, ligand and 1LMP and (name C*)')
In [15]:
cmd.do('set cartoon_transparency, 0.5')
In [20]:
cmd.do('color pink, real and (name C*)')
In [21]:
# Выравним белки
cmd.super('1LMP', 'real')
Out[21]:
(0.0, 934, 3, 0.18583467602729797, 997, 629.159912109375, 129)
In [22]:
# Передвинем настоящий белок
cmd.translate('[-50, 0, 0]', 'real')
In [23]:
cmd.center('1LMP or real')
cmd.zoom('1LMP or real')
In [24]:
cmd.mset('1 x300')
cmd.frame('1')
cmd.mview('store')
cmd.mview('store', object='real')
In [25]:
cmd.frame('100')
cmd.mview('store')
cmd.translate('[50, 0, 0]', object='real')
cmd.mview('store', object='real')
In [26]:
cmd.frame('200')
cmd.center('real')
cmd.zoom('real')
cmd.mview('store', object='real')
cmd.mview('store')
In [27]:
cmd.frame('200')
cmd.mview('store', object='real')
cmd.center('resi 52')
cmd.zoom('resi 52')
cmd.mview('store')
In [31]:
cmd.frame('500')
cmd.mview('store', object='real')
cmd.center('1LMP and resi 52')
cmd.zoom('1LMP and resi 52')
cmd.turn('y', -120)
cmd.mview('store')
In [38]:
import imageio

with imageio.get_writer('1lmp_movie.gif', mode='I', fps=30) as writer:
    for i in range(300):
        writer.append_data(imageio.imread(f'./movie/class1_movie{i + 1:04}.png'))
In [40]:
display(Image('1lmp_movie.gif', format='png'))

Присоединение метки TAMRA¶

In [44]:
Image(filename='6-Carboxytetramethylrhodamine_300.png')
Out[44]:
In [46]:
cmd.do('delete 1LMP')
In [64]:
cmd.show('surface')
In [57]:
cmd.zoom('real')
cmd.orient('real')

Метка должна присоединяться к серину или треонину

In [58]:
cmd.do('color green, resn SER or resn THR')
In [59]:
cmd.png('1lmp_surface.png')
Image(filename='1lmp_surface.png')
Out[59]:
In [65]:
cmd.hide('surface')

Можно присоединить к THR89

In [69]:
cmd.do('show sticks, resi 89; color pink, resn SER or resn THR; color green, resi 89')
In [74]:
Image(filename='1lmp_8.png')
Out[74]:
In [93]:
cmd.load('Structure2D_CID_2762604.sdf', 'tamra')
In [94]:
cmd.remove('resi 89 and elem O and sidechain')
In [95]:
cmd.orient('resi 89')
In [96]:
cmd.fuse('tamra and donor', 'resi 89 and name CB')
In [97]:
cmd.delete('tamra')
In [98]:
cmd.remove('elem H')
In [99]:
cmd.torsion(200)
In [103]:
Image(filename='1lmp_9.png')
Out[103]:

Вышло как-то так

Полиаланиновая альфа-спираль¶

In [16]:
cmd.reinitialize()
In [17]:
cmd.do('bg_color white')
In [18]:
cmd.fragment('ala')
cmd.alter('ala', 'resi=1')
Out[18]:
10
In [19]:
for i in range(100):
    cmd.edit(f'resi {i + 1} and name C')
    cmd.editor.attach_amino_acid('pk1', 'ala', ss=1)
In [20]:
cmd.center()
In [21]:
cmd.zoom()
In [110]:
cmd.hide('cartoon')
In [111]:
Image(filename='class1_1.png')
Out[111]:

B-форма ДНК длины 100¶

In [107]:
cmd.reinitialize()
In [108]:
cmd.do('bg_color white')
In [109]:
# Исходная структура ДНК
cmd.fetch('3IXN')
Out[109]:
'3IXN'
In [110]:
cmd.remove('hetatm')
In [111]:
stored.a, stored.b = [], []
cmd.iterate("chain A and name C1'", 'stored.a.append([resi, resn])')
cmd.iterate("chain B and name C1'", 'stored.b.append([resi, resn])')
Out[111]:
10
In [112]:
pairs = []
for _ in range(len(stored.a)):
    pairs.append([stored.a[_], stored.b[9 - _]])
In [113]:
pairs
Out[113]:
[[['1', 'DC'], ['10', 'DG']],
 [['2', 'DC'], ['9', 'DG']],
 [['3', 'DG'], ['8', 'DC']],
 [['4', 'DG'], ['7', 'DC']],
 [['5', 'DT'], ['6', 'DA']],
 [['6', 'DA'], ['5', 'DT']],
 [['7', 'DC'], ['4', 'DG']],
 [['8', 'DC'], ['3', 'DG']],
 [['9', 'DG'], ['2', 'DC']],
 [['10', 'DG'], ['1', 'DC']]]

Построим по парам 5, 6

In [114]:
cmd.create('m', 'chain A and resi 5 or chain B and resi 6')
cmd.create('1', 'chain A and resi 5 or chain B and resi 6')
cmd.create('2', 'chain A and resi 6 or chain B and resi 5')
In [115]:
cmd.do('pair_fit m, 2')
# Почему-то cmd.pair_fit упорно выдает ошибку
dna_matrix = cmd.get_object_matrix('m')
cmd.delete('m')
In [116]:
for i in range(3, 101):
    cmd.create(str(i), str(i - 1))
    cmd.transform_selection(str(i), dna_matrix)
In [117]:
for i in range(1, 101):
    cmd.alter(str(i), f'resi={i}')
In [118]:
cmd.do('delete 3IXN')
In [119]:
cmd.create('new_dna', 'all')
In [121]:
for i in range(100):
    cmd.delete(str(i + 1))
    cmd.bond(f"/new_dna/A/A/*{i + 1}/O3'", f"/new_dna/A/A/*{i + 2}/P")
    cmd.bond(f"/new_dna/B/B/*{i + 2}/O3'", f"/new_dna/B/B/*{i + 1}/P")
In [124]:
cmd.show('sticks')
In [127]:
cmd.zoom()
In [129]:
cmd.do('color deeppurple, chain A')
In [133]:
Image(filename='class1_dna.png')
Out[133]:

Почему-то, результат отображается вот только так