Установка PyMol

In [5]:
conda install -c schrodinger pymol
Collecting package metadata (current_repodata.json): done
Solving environment: done

# All requested packages already installed.


Note: you may need to restart the kernel to use updated packages.
In [6]:
import __main__
__main__.pymol_argv = [ 'pymol', '-c' ]
import pymol
pymol.finish_launching()
from pymol import cmd,stored
from IPython.display import Image
In [7]:
import numpy as np
import time 

Далее код, который итерирует 200 раз С-альфа атомы близлежащих ак в структуре 1lmp

Для обращения к консоли Pymol используется cmd.do("str"). При этом "str" подразумевает команды на "языке" PyMol, в данном случае мы скачиваем 1cll (fetch) (в версии PyMOL 2.3.0 async и так дефолтно = 0), далее задаем отображение атомов под именами C,O,N,CA с помощью lines (as), затем приближаем остатки под номерами 4 и 5 (zoom). mset показывает 1-ое состояние в 1000 кадрах mview store - фиксирует данный кадр основным. Если бы было несколько таких кадров - это имело бы смысл, но у нас такого нет.

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

cmd.png('/tmp/1.png')
Image(filename='/tmp/1.png')
Out[8]:
In [12]:
stored.r = []  # назовем список stored.r, общий и для jupyter и для pymol
cmd.iterate('1cll and n. CA','stored.r.append(resi)')  # Итерируем структуру 1cll по остаткам с именем CA
# Забрасываем номера остатков в созданный ранее список

length = len(stored.r)               # возвращаем в переменную length длину списка stored.r, что соответствует количеству ак в структуре
colors = np.linspace(1,0.5, length)  # создание массива равномерно распределенных чисел от 0.5 до 1, количество чисел = количество ак 
for k,i in enumerate(stored.r):      # итерируемся по индексам(k) и объектам(i) в списке stored.r
    cmd.set_color('col%d' % k, [colors[k],0.5,0.75])  # Создаем палитру разных красных ["obj in colors",0.5,0.75] 
                                                    #для раскрашивания скаждого остатка в структуре 1cll в свой цвет 
#print([1,1,colors[k]])
    cmd.set('cartoon_color','col%d' % k ,'resi %d' % int(i))  # Красим i остаток в соответствующий цвет
                                                             
cmd.show_as('cartoon','all')  # Устанавливаем cartoon на 1cll
In [13]:
cmd.png('/tmp/2.png')
Image(filename='/tmp/2.png')
Out[13]:
In [14]:
for i in range(50):
    cmd.frame((20*i)+1)# фиксируем каждые 20 кадров (от 1 до 981) 
    cmd.zoom( 'n. CA and i. %d+%d' % (i,i+7))# сдвигаем камеру на 1 остаток каждый цикл
                                                # 7 остатков в одном кадре приближаются
    cmd.mview('store')#сохраняем опорный кадр

Sculpting (в данном задании строгового запрета делать все вручную в PyMol нет, так что просто изображения). Операции производились согласно инструкции https://pymolwiki.org/index.php/Molecular_Sculpting

In [15]:
Image('pic2.png', width=600, height=600)
Out[15]:
In [16]:
Image('pic3.png', width=600, height=600)
Out[16]:

С помощью метода Sculpting, возможно лишь собрлюдение торсионных и др. угов, длин связей, хиральность и планарность химических групп. Поэтому метод подразумевает лишь незначительные изменения конформации молекулы.

Mutagenesis Сначала оценим взаимодействие лиганда с молекулой лизозима. Согласно связям, установленным pdb банком, лиганд (2-acetamido-2-deoxy-beta-D-glucopyranose-(1-4)-2-acetamido-2-deoxy-beta-D-glucopyranose-(1-4)-2-acetamido-2-deoxy-alpha-D-glucopyranose) взаимодействует водяным мостиком с 59 ASN OD1, с азотом остова 59 ASN водородной связью, с кислородом остова ALA 107 тоже водородной связью.

In [17]:
cmd.reinitialize()

Почему-то команда 'dist hbond1, ligand, resi 107' не дает выделения на картинке, но расстояние между кислородом остова и азотом NAG`2 там 3.1 A.

In [20]:
cmd.do('''
fetch 1lmp
remove resn hoh
bg_color white
select ligand, resn NAG`2
dist hbond1, ligand, resi 107
show sticks, resi 107
orient resi 61 or resi 106

set cartoon_transparency, 0.7
png lig.png, width=1080, height=720, ray=1
delete hbond1
''')
cmd.select("hph_core", "byres all within 3 of i. 107")
cmd.show("licorice", "hph_core")
cmd.color("red", "i. 107")
#center resi 107, 10
In [21]:
cmd.png('/tmp/4.png')
Image(filename='/tmp/4.png')
Out[21]:

Вероятно, это взаимодействие - не основное. Предположительно 59 ASN остаток играет важную роль. Потому что лиганд связан водяным мостиком с 59 ASN OD1, с азотом остова 59 ASN водородной связью

In [22]:
cmd.reinitialize()
In [25]:
cmd.do('''
fetch 1lmp
remove resn hoh
bg_color white
select ligand, resn NAG`2
select site, byres all within 5 of ligand
dist hbond1, ligand, resi 59
show sticks, resi 59

zoom resi 59, 10
set cartoon_transparency, 0.7
png lig.png, width=1080, height=720, ray=1
delete hbond1
''')
#cmd.select("hph_core", "byres all within 3 of i. 59")
#сmd.show("licorice", "hph_core")
cmd.color("red", "i. 59")
In [26]:
cmd.png('/tmp/5.png')
Image(filename='/tmp/5.png')
Out[26]:

Во взаимодействии, заменим на аминокислоту, не имеющую - NH группы в остове и кислорода в остатке. На пролин - который имеет совершенно другую геометрию.

In [27]:
cmd.wizard('mutagenesis')
cmd.refresh_wizard()
cmd.get_wizard().do_select('resi 59')
cmd.get_wizard().set_mode('PRO')
cmd.refresh_wizard()
cmd.get_wizard().apply()
cmd.set_wizard()

cmd.do('''
select ligand, resn nag+ndg
dist hbond1, ligand, resi 103, mode=2
''')
Selected!
 Mutagenesis: 10 rotamers loaded.
 Rotamer 5/10, strain=23.97
 Rotamer 5/10, strain=23.97
 Mutagenesis: 2 rotamers loaded.
 Rotamer 1/2, strain=63.28
In [28]:
cmd.do('png contact_surface.png, 1920, 1080')
#cmd.select("hph_core", "byres all within 3 of i. 59")
#сmd.show("licorice", "hph_core")

display(Image('contact_surface.png', width=720))

C пролином связи не образуются, вероятно это нарушает взаиводействие

MPEG

In [29]:
cmd.reinitialize()
In [30]:
cmd.do('as cartoon, not resi 59 and not hetatm')
cmd.do('zoom')
In [31]:
cmd.fetch('1lmp')
cmd.fetch('1lmp', 'native')
cmd.do('remove resn hoh')
cmd.do('show sticks, native and resi 59')
cmd.center('1lmp or native')
cmd.zoom('1lmp or native')
cmd.super('1lmp', 'native')
cmd.translate('[-30, 0, 0]', 'native')
cmd.center('1lmp or native')
cmd.zoom('1lmp or native')

cmd.do('png mov.png, width=1080, height=720, ray=1')
In [32]:
Image('mov.png')
Out[32]:
In [35]:
cmd.mset('1 x300')
cmd.frame('1')
cmd.mview('store')
cmd.mview('store', object='native')

cmd.frame('100')
cmd.mview('store')
cmd.translate('[30, 0, 0]', object='native')
cmd.mview('store', object='native')

cmd.frame('150')
cmd.center('native')
cmd.zoom('native')
cmd.mview('store', object='native')
cmd.mview('store')

cmd.frame('200')
cmd.mview('store', object='native')
cmd.center('1lmp and resi 59')
cmd.zoom('1lmp and resi 59')
cmd.mview('store')

cmd.frame('300')
cmd.mview('store', object='native')
cmd.center('1lmp and resi 59')
cmd.zoom('1lmp and resi 59')
cmd.turn('y', 90)
cmd.mview('store')

cmd.mview('reinterpolate')
cmd.mview('reinterpolate', object='native_protein')

cmd.do('''movie.produce movie.mpg, quality=90''')
cmd.sync() timed out (wait_queue)
cmd.sync() timed out (lock_attempt)
 produce: creating 'movie.mpg' (in background)...
 please wait ...
 produce: 2027520 bytes written...
 produce: finished.
using encoder "mpeg_encode"
In [37]:
from IPython.display import Video
display(Video("movie.mpg"))
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-37-d5ef2824a5fb> in <module>
      1 from IPython.display import Video
----> 2 display(Video("movie.mpg"))

/opt/anaconda3/lib/python3.7/site-packages/IPython/core/display.py in __init__(self, data, url, filename, embed, mimetype, width, height)
   1365                 "Consider passing Video(url='...')",
   1366             ])
-> 1367             raise ValueError(msg)
   1368 
   1369         self.mimetype = mimetype

ValueError: To embed videos, you must pass embed=True (this may make your notebook files huge)
Consider passing Video(url='...')

TAMRA Пришить флуоресцентную метку лучше на поверхность глобулы к доступному остатку, Если связь сложноэфирная, Значит должна цепляться к спиртовой группе белка своей кислой карбонильной группой. Подходит THR`47

In [38]:
cmd.do('''
fetch 1lmp
remove resn hoh
bg_color white
load tamra.sdf
show sticks, resi 47
remove resi 47 and name OG1
fuse tamra and donor, resi 47 and name CB, mode=1
torsion 30
remove tamra
orient resi 47
turn y, -20
label n. CA and i. 37, "(%s, %s)" % (resn, resi)
unpick
remove hydrogens
png tamred.png, width=1080, height=720, ray=1
''')
In [39]:
Image('tamred.png')
Out[39]:
cmd.sync() timed out (wait_queue)
 Error: Error occurred.
 produce: creating 'movie.mpg' (in background)...
 please wait ...
 produce: 847872 bytes written...
 produce: 4714496 bytes written...
 produce: finished.

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

In [44]:
cmd.reinitialize()
cmd.do('''
fragment PRO
edit resi 2 and name C
''')

for i in range(1, 30):
    cmd.editor.attach_amino_acid('pk1', 'ALA', ss=1)

cmd.do('''
orient
hide everything
show sticks
png pro.png, width=1080, height=720, ray=1
''')
In [45]:
Image('pro.png')
Out[45]:
In [46]:
cmd.reinitialize()
cmd.fetch('4bna')

# теперь попробуем все через cmd
cmd.select('np1', 'i. 7 + i. 18')
cmd.select('np2', 'i. 8 + i. 17')
cmd.extract('pair1', 'np1')
cmd.extract('pair2', 'np2')
cmd.pair_fit('m. pair2 and bb.', 'm. pair1 and bb.')
transform = cmd.get_object_matrix('pair2')
cmd.delete('m. pair2')
cmd.set_name('pair1', 'np1')
cmd.delete('4bna')
cmd.alter(f'/np1///DA', 'resi = 100')
cmd.alter(f'/np1///DT', 'resi = 101')

for i in range(1, 100):
    cmd.create(f'np{i+1}', f'np{i}')
    cmd.transform_selection(f'np{i+1}', transform)
    cmd.alter(f'/np{i+1}///DA', f'resi = {100 - i}')
    cmd.alter(f'/np{i+1}///DT', f'resi = {100 + i + 1}')

cmd.create('DNA', 'all')

for i in range(1, 100):
    cmd.delete(f'm. np{i+1}')
  
    cmd.select('pk1', f"i. {i} and n. O3'")
    cmd.select('pk2', f'i. {i+1} and n. P')
    cmd.bond()
  
    cmd.select('pk1', f"i. {100 + i} and n. O3'")
    cmd.select('pk2', f'i. {100 + i+1} and n. P')
    cmd.bond()

cmd.do('''
orient
png bdna_done.png, width=1080, height=720, ray=1
''')
In [47]:
Image('bdna_done.png')
Out[47]:
In [ ]: