In [93]:
#Знакомство с pymol перед выполнением домашнего задания
# 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''')
cmd.do('''
ray
png 1cll.png
''')
cmd.orient()
from IPython.display import Image
Image(filename='1cll.png')
 Error: loading mmCIF into existing object not supported, please use 'create' to append to an existing object.
Out[93]:
No description has been provided for this image
In [94]:
# 2) Итерация по остаткам
stored.r = [] 
cmd.iterate('1cll and n. CA','stored.r.append(resi)') # Не хватало append, мы итерируемы остатки записываем в список
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])
    cmd.set('cartoon_color','col%d' % k ,'resi %d' % int(i)) # Командой help было найдено имя параметра 'cartoon_color'
cmd.show_as('cartoon','all')
cmd.do('''
ray
png 1cll_2.png
''')
Image(filename='1cll_2.png')
Out[94]:
No description has been provided for this image
In [95]:
# 3) Использование movie
cmd.mset('1 x90') #State 1 90 кадров
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')   
In [96]:
cmd.do('''
set ray_trace_frames=1
mpng ./movfldr/mymovie 
''')# Перед этим я добавил папку на компьютер
In [97]:
#Я установил Pillow, чтобы сделать gif
from PIL import Image as imago
In [98]:
import os
folder = './movfldr'
filenames = [os.path.join(folder, f) for f in sorted(os.listdir(folder))]
In [99]:
print(filenames)
['./movfldr\\mymovie0001.png', './movfldr\\mymovie0002.png', './movfldr\\mymovie0003.png', './movfldr\\mymovie0004.png', './movfldr\\mymovie0005.png', './movfldr\\mymovie0006.png', './movfldr\\mymovie0007.png', './movfldr\\mymovie0008.png', './movfldr\\mymovie0009.png', './movfldr\\mymovie0010.png', './movfldr\\mymovie0011.png', './movfldr\\mymovie0012.png', './movfldr\\mymovie0013.png', './movfldr\\mymovie0014.png', './movfldr\\mymovie0015.png', './movfldr\\mymovie0016.png', './movfldr\\mymovie0017.png', './movfldr\\mymovie0018.png', './movfldr\\mymovie0019.png', './movfldr\\mymovie0020.png', './movfldr\\mymovie0021.png', './movfldr\\mymovie0022.png', './movfldr\\mymovie0023.png', './movfldr\\mymovie0024.png', './movfldr\\mymovie0025.png', './movfldr\\mymovie0026.png', './movfldr\\mymovie0027.png', './movfldr\\mymovie0028.png', './movfldr\\mymovie0029.png', './movfldr\\mymovie0030.png', './movfldr\\mymovie0031.png', './movfldr\\mymovie0032.png', './movfldr\\mymovie0033.png', './movfldr\\mymovie0034.png', './movfldr\\mymovie0035.png', './movfldr\\mymovie0036.png', './movfldr\\mymovie0037.png', './movfldr\\mymovie0038.png', './movfldr\\mymovie0039.png', './movfldr\\mymovie0040.png', './movfldr\\mymovie0041.png', './movfldr\\mymovie0042.png', './movfldr\\mymovie0043.png', './movfldr\\mymovie0044.png', './movfldr\\mymovie0045.png', './movfldr\\mymovie0046.png', './movfldr\\mymovie0047.png', './movfldr\\mymovie0048.png', './movfldr\\mymovie0049.png', './movfldr\\mymovie0050.png', './movfldr\\mymovie0051.png', './movfldr\\mymovie0052.png', './movfldr\\mymovie0053.png', './movfldr\\mymovie0054.png', './movfldr\\mymovie0055.png', './movfldr\\mymovie0056.png', './movfldr\\mymovie0057.png', './movfldr\\mymovie0058.png', './movfldr\\mymovie0059.png', './movfldr\\mymovie0060.png', './movfldr\\mymovie0061.png', './movfldr\\mymovie0062.png', './movfldr\\mymovie0063.png', './movfldr\\mymovie0064.png', './movfldr\\mymovie0065.png', './movfldr\\mymovie0066.png', './movfldr\\mymovie0067.png', './movfldr\\mymovie0068.png', './movfldr\\mymovie0069.png', './movfldr\\mymovie0070.png', './movfldr\\mymovie0071.png', './movfldr\\mymovie0072.png', './movfldr\\mymovie0073.png', './movfldr\\mymovie0074.png', './movfldr\\mymovie0075.png', './movfldr\\mymovie0076.png', './movfldr\\mymovie0077.png', './movfldr\\mymovie0078.png', './movfldr\\mymovie0079.png', './movfldr\\mymovie0080.png', './movfldr\\mymovie0081.png', './movfldr\\mymovie0082.png', './movfldr\\mymovie0083.png', './movfldr\\mymovie0084.png', './movfldr\\mymovie0085.png', './movfldr\\mymovie0086.png', './movfldr\\mymovie0087.png', './movfldr\\mymovie0088.png', './movfldr\\mymovie0089.png', './movfldr\\mymovie0090.png']
In [103]:
images = [imago.open(i) for i in filenames]
images[0].save(
    'animation.gif',
    save_all=True,
    append_images=images[1:],
    optimize=False,
    duration=500,
    loop=0,
    disposal=2
)
In [104]:
Image(filename='animation.gif')
animation.gif
Out[104]:
<IPython.core.display.Image object>
In [105]:
#Мы закончили знакомится с некоторыми функциями pymol, перейдём к домашнему заданию
In [ ]:
 
In [150]:
from xmlrpc.client import ServerProxy #Сможем запустить pymol как локальный сервер
from IPython.display import Image #Сможем загружать картинки 
In [151]:
#Anaconda prompt: pymol -R #Запускаем pymol как сервер
In [152]:
cmd = ServerProxy(uri="http://localhost:9123/RPC2") #Подключаемя к запущенному серверу 
In [153]:
cmd.fetch('1lmp') #У нас появилась загруженная структура в pymol
Out[153]:
'1lmp'
In [154]:
import time
cmd.hide("everything")
In [155]:
# 1) Оцените возможности Sculpting, в Wizard->Demo->Sculpting . Измените структуру белка 1LMP.
In [156]:
#Перейдём в sculpting 
#PyMOL>edit_mode
 #Setting: suspend_updates set to off.
In [157]:
Image(filename='step1.png')
Out[157]:
No description has been provided for this image
In [158]:
#Можно перетаскивать атомы и вращать связи
In [159]:
Image(filename='step2.png')
Out[159]:
No description has been provided for this image
In [160]:
#Выводы: Можно изменять форму молекулы и торсионные углы.
#Например, я не смог повернуть связь в запрещённое положение.
In [161]:
#Изменим структуру 1LMP
#PyMOL>edit_mode
# Setting: suspend_updates set to off.
#PyMOL>wizard sculpting
In [162]:
cmd.reinitialize()
cmd.fetch('1lmp')
Out[162]:
'1lmp'
In [163]:
#Before:
Image(filename='step3.png')
Out[163]:
No description has been provided for this image
In [164]:
#After:
Image(filename='step4.png')
Out[164]:
No description has been provided for this image
In [165]:
# 2) Средствами Tcl/Tk интерфейса (Wizard->Mutagenesis) проведите одиночную мутацию в белке,
#которая по вашему мнению должна привести к потере связывания с лигандом.
#Предварительно оцените зону контакта.
In [166]:
cmd.reinitialize()
cmd.fetch('1lmp')
Out[166]:
'1lmp'
In [167]:
#Далее я выделил лиганд (lig) и белок (prot)
In [138]:
cmd.do('''
select inter, byres (lig around 4.0)
''') #Выделили окружение лиганда на расстоянии 4 Ангстрема, будем считать, что это зона контакта
In [139]:
Image(filename='step5.png')
Out[139]:
No description has been provided for this image
In [140]:
#Для мутагенеза выберем ASP52 и заменим на PHE52
In [141]:
Image(filename='step6.png')
Out[141]:
No description has been provided for this image
In [142]:
Image(filename='step7.png')
Out[142]:
No description has been provided for this image
In [143]:
#Можно заметить явное столкновение поверхностей, такого быть не должно, поэтому это может привести к потере связывания с лигандом.
In [144]:
# 3) Используя команды mset, mview, super, translate создайте анимационный ролик (mpeg) где происходит совмещение белков и показывается место мутации.
In [145]:
#Переименуем мутантный белок и достанем ещё один оригинальный
In [169]:
cmd.fetch('1lmp')
Out[169]:
'1lmp'
In [170]:
cmd.do('''
select inter2, byres (sele around 4.0)
''') 
In [171]:
#PyMOL>super 1lmp_mut, 1lmp
# MatchAlign: aligning residues (129 vs 129)...
# MatchAlign: score 636.941
# ExecutiveAlign: 997 atoms aligned.
# ExecutiveRMS: 5 atoms rejected during cycle 1 (RMSD=0.01).
# Executive: RMSD =    0.000 (992 to 992 atoms)
In [172]:
#PyMOL>mset 1 x 2
#PyMOL>frame 1
#PyMOL>mview store
# MovieView: Setting frame 1.
# MovieView: reinterpolating all frames 1 to 2 (wrapping).
#PyMOL>frame 2
#PyMOL>translate [0,100,0], object=1lmp_mut
#PyMOL>mview store, object=1lmp_mut
# ObjectMotion: Setting frame 2.
# ObjectMotion: reinterpolating all frames 1 to 2 (wrapping).
In [173]:
#Сохраним и посмотрим полученную анимацию
In [174]:
filenames2 = ['./movfldr2\\mut0001.png', './movfldr2\\mut0002.png']
In [175]:
images = [imago.open(i) for i in filenames2]
images[0].save(
    'animation2.gif',
    save_all=True,
    append_images=images[1:],
    optimize=False,
    duration=500,
    loop=0
)
In [176]:
Image(filename='animation2.gif')
animation2.gif
Out[176]:
<IPython.core.display.Image object>
In [177]:
cmd.reinitialize()
cmd.fetch('1lmp')
Out[177]:
'1lmp'
In [178]:
# 4) Присоедините флуоресцентную метку TAMRA к белку через сложноэфирную связь.
# Используйте команды fuse и torsion.
In [179]:
Image(filename='Step8.png') # 1lmp и 6-TAMRA метка
Out[179]:
No description has been provided for this image
In [31]:
cmd.do("""
select oh_residues, resn SER+THR+TYR;
show sticks, oh_residues;
color atomic, oh_residues;
""") # Для образования сложноэфирной связи нам нужно выбрать АМК с гидроксильной группой
In [32]:
# Присоединим метку к SER81
# Выбираем атомы для образования связи, удаляем кислород в TAMRA, чтобы fuse сработал
cmd.fuse("TAMRA_sel", "SER_sel")
In [33]:
#Далее выделенную связь мы вращаем с помощью команды torsion
In [180]:
Image(filename='Step9.png') #fuse скопировал TAMRA и присоединил к белку, далее мы вручную повернули молекулу, чтобы не было наложений
Out[180]:
No description has been provided for this image
In [181]:
# Напишите скрипт для построения поли-аланиновой альфа спирали длинной 100 аминокислот.
In [182]:
cmd.reinitialize()
In [183]:
# Напишем скрипт и загрузим его в pymol
In [184]:
#python
#phi = -57
#psi = -47
#cmd.fragment ('ala','spiral')
#for i in range(2,101):
#    cmd.edit(f'spiral and resi {i} and name C')
#    editor.attach_amino_acid('pk1', 'ala')
#    cmd.edit(f'spiral and resi {i} and name CA', f'spiral and resi {i} and name C')
#    cmd.torsion(psi)
#    cmd.edit(f'spiral and resi {i+1} and name N', f'spiral and resi {i+1} and name CA')
#    cmd.torsion(phi)
#    cmd.unpick()
#    cmd.zoom('spiral')
#python end
In [185]:
Image(filename='Step10.png')
Out[185]:
No description has been provided for this image
In [186]:
# 6) Напишите скрипт для построения B-формы ДНК длинной 100 пар нуклеотидов.
# Здесь есть проблемы, так заготовок для нуклеиновых кислот нет.
# Суть подхода состоит в определении матрицы превращения при совмещении одной пары нуклеотидов с последующей.
# После чего выможете размножать эту пару и применять к ней матрицу превращения.
# Команды: cmd.pair_fit("pair","nextpair"), trans=cmd.get_object_matrix("pair"), create, cmd.transform_selection
In [187]:
cmd.reinitialize()
In [188]:
#python
#cmd.fnab('AT')
#cmd.select('pair', f'obj01 and index 1-21 or index 63-82')
#cmd.select('nextpair', f'obj01 and index 22-41 or index 42-62')
#cmd.create('obj_pair', 'pair')
#cmd.create('obj_nextpair', 'nextpair')
#cmd.create('pair1', 'pair')
#cmd.pair_fit('obj_pair', 'obj_nextpair')
#trans = cmd.get_object_matrix('obj_pair')
#for i in range(2,101):
#	cmd.create(f'pair{i}', f'pair{i-1}')
#	cmd.transform_selection(f'pair{i}', trans, homogenous=0)
#python end
In [189]:
Image(filename='Step11.png')
Out[189]:
No description has been provided for this image