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

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

cmd.do('''
fetch 1lmp, async=0,
mview store''')
cmd.do('''
select water, resn HOH,
hide everything, water,
''')
In [2]:
cmd.do('''
ray
png overall.png
''')
Image(filename='overall.png')
Out[2]:
No description has been provided for this image

Данной командой мы иниицируем паймол через юпитер и фетчим структуру 1lmp из RCSB PDB. Структура представляет собой небольшой глобулярный белок с лигандом, трисахаридом. Воду спрячем, т.к. для заданий практикума она нам вообщем и не нужна. В первом задании нас просят немного изменить структуру белка 1lmp c помощью встроенной утилиты Pymol sculpting.

In [4]:
cmd.do('''
ray
png sculpted.png
''')
Image(filename='sculpted.png')
Out[4]:
No description has been provided for this image

В качестве наиболее тривиального упражнения по sculpting мы просто растянули c-концевой участок белка в прямую цепь.

In [8]:
cmd.do('''
select s1, polymer.protein,
hide cartoon, s1,
show sticks, s1,
show surface, s1,
set transparency, 0.5, s1
''')
cmd.do('''
select lig, resn NDG or resn NAG,
color yellow, lig and name C*,
zoom lig
''')

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

In [3]:
cmd.do('''
dist hbo,1lmp,lig,3.2,mode=2
ray
png lig.png
''')
Image(filename='lig.png')
Out[3]:
No description has been provided for this image

Можно заметить что многие водородные связи лиганд образует не с боковыми цепями, а с атомами остова белка. В качестве остатка который мы будем мутировать, мной был выбран триптофан 63 (конечно сомнительно, что при такой мутации будет наблюдаться потеря связывания но по крайней мере мы теряем одну водородную связь), мы заменим его на аланин.

In [5]:
cmd.do('''
ray
png trp63.png
''')
Image(filename='trp63.png')
Out[5]:
No description has been provided for this image
In [10]:
cmd.do('''
set movie_auto_store, 1
mset 1x100
''')
for frame in range(1, 101):
    transparency = (frame - 1) / 99.0
    cmd.do("mdo %d: set stick_transparency, %.2f, s1" % (frame, transparency))

cmd.do('''
frame 1
''')
cmd.do('''
mpng frame_.png
''')

Эта команда делает нам видео из 100 кадров, я скопировал весь белок из 1lmp в отдельный объект и с помощью GUI ввёл мутацию заменив 63-й Триптофан на аланин. А данное видео по мере смены кадров меняет параметр прозрачности для неизменённой структуры, таким образом триптофан плавно исчезает в анимации,а на его месте остаётся аланин.

In [13]:
from IPython.display import Video
Video(filename='movie.mp4', embed=True, width=1080, height=640)
Out[13]:
Your browser does not support the video tag.

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

In [15]:
cmd.do('''
select rem1, resi 122 and name OG,
select fuse1, resi 122 and name CB
select fuse2, TAMRA and id 4
''')

Удалим rem1 через GUI и соединим атомы fuse 1 и fuse2 с помощью fuse. После этого зададим с помощью режима 3 button-editing зададим приемлимые торсионные углы через GUI.

In [17]:
cmd.do('''
fuse fuse1, fuse2
''')
In [22]:
cmd.do('''
ray
png tamra.png
''')
Image(filename='tamra.png')
Out[22]:
No description has been provided for this image

Теперь выполним задание №5, а именно сгенерируем полиаланиновую альфа спираль из сотни остатков:

In [97]:
cmd.reinitialize()
cmd.set("secondary_structure", 1)
cmd.fragment('ala', 'ala_1')
bond_anchor=str(f'ala_1')+str(' and name C')
cmd.edit(bond_anchor)
i=1
while i!=100:
    i+=1
    cmd.editor.attach_amino_acid("pk1", "ala")
In [98]:
cmd.do('''
ray
png polyA.png
''')
Image(filename='polyA.png')
Out[98]:
No description has been provided for this image

Перейдём теперь к последнему заданию, сгенерируем 100 нуклеотидную последовательность ДНК в B-форме.

In [9]:
cmd.reinitialize()
cmd.fetch('4bna')

cmd.select('np1', 'i. 7 + i. 18')
cmd.select('np2', 'i. 8 + i. 17')

cmd.extract('GC', 'np1')
cmd.extract('AT', 'np2')
cmd.pair_fit('m. AT and bb.', 'm. GC and bb.')
transform = cmd.get_object_matrix('AT')
cmd.delete('m. AT')
cmd.set_name('GC', '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.orient('all')
In [10]:
cmd.do('''
ray
png B_DNA.png
''')
Image(filename='B_DNA.png')
Out[10]:
No description has been provided for this image
In [ ]: