Работа с pymol

In [1]:
#откроем pymol из jupyter notebook
import sys
import __main__
import io
import base64
from IPython.display import HTML
from IPython.display import Image
__main__.pymol_argv = [ 'pymol', '-x' ]
import pymol
from pymol import cmd,stored
pymol.finish_launching()
In [2]:
# загрузим требуемый белок 1lmp и разделим белок с лигандом по отображению (cartoon, sticks)
cmd.do('''
reini
fetch 1lmp
hide nonbonded
bg_color white
color magenta, polymer.protein
select ligand, resn nag+ndg
show sticks, ligand
util.cbac ligand  
set ray_trace_mode, 3
'''
)

#Возможности Sculpting

1lmp - лизоцим, полученный из радужной форели.[1] Лизоцимы определяются как 1,4-бета-N-ацетилмурамидазы (класс гидролазы), которые расщепляют бета-1,4-связи полисахаридных цепей в пептидогликановом компоненте клеточных стенок грамположительных бактерий. Эти длинные полимерные цепи состоят из чередующихся звеньев N-ацетилмураминовой кислоты (NAM) и N-ацетилглюкозамина (NAG), связанных гликозидными связями между атомом C1 атома NAM и O4 атомом NAG. Лизоцимы также катализируют гидролиз хитина, гомополимера N-ацетилглюкозамина.[1]

In [9]:
#структура белка 1lmp и лигандов NAG (N-ACETYL-D-GLUCOSAMINE) и NDG (2-(ACETYLAMINO)-2-DEOXY-A-D-GLUCOPYRANOSE)
cmd.png('pr2_1.png', '2000', '2000', ray=3)
Image('pr2_1.png', retina=True)
Out[9]:

С помощью инструмента Sculpting (Wizard->Demo->Sculpting) я немного поменяла структуру (вручную). Инструмент позволяет менять положение атомов и варьировать углы связей.

In [12]:
#измененная структура 1mp
cmd.png('pr2_2.png', '2000', '2000', ray=3)
Image('pr2_2.png', retina=True)
Out[12]:

#Мутагенез

Остатки глутаминовой кислоты (Glu35) и аспарагиновой кислоты (Asp52) критичны для функционирования фермента, причём Asp52 ионизирован, а Glu35 нет. Некоторые авторы полагают, что Glu35 выступает в качестве донора протона при разрыве гликозидной связи субстрата, разрушая связь, а Asp52 выступает в роли нуклеофила, при образовании интермедиата — гликозил-фермента. Затем гликозил-фермент реагирует с молекулой воды, в результате чего фермент возвращается в исходное состояние и образуется продукт гидролиза. Это ферментативное свойство есть у всех типов лизоцима разного происхождения и отражено в одном из широко используемых вариантов названия этого белка – мурамидаза.[2] Другие авторы полагают, что реакция протекает через образование карбоксоний-иона, стабилизированного заряженной карбоксильной группой Asp52, в то время как высвобождение спирта катализируется по механизму общего основного катализа незаряженным карбоксилом Glu35.[2] Замена остатка Asp52 на Ser52 в структуре белка приводит к потере антисептического действия.[Fundamentals of Enzymology] Выберем эту замену как искомую мутацию.

In [3]:
#выделим Asp52 цветом и покажем водородные связи
cmd.do('''
select mutation, resi 52
util.cbay mutation
hide cartoon, mutation
show sticks, mutation
dist hbond, ligand, mutation, 3.5, mode=2
center mutation
zoom center, 10
''')
cmd.png('pr2_3.png', 720, 720, ray=3)
cmd.do('''
center 1lmp
zoom center, 30''')
cmd.png('pr2_4.png', 720, 720, ray=3)
In [38]:
display(Image('pr2_3.png', retina=True))
display(Image('pr2_4.png', retina=True))
In [4]:
#проведем замену остатка
cmd.wizard('mutagenesis')
cmd.refresh_wizard()
cmd.get_wizard().do_select('mutation')
cmd.get_wizard().set_mode('SER')
cmd.refresh_wizard()
cmd.get_wizard().apply()
cmd.set_wizard()
In [5]:
cmd.do('''
delete hbond
center mutation
zoom center, 10
dist hbond, ligand, mutation, 3.5, mode=2
''')
cmd.png('pr2_5.png', 720, 720, ray=3)
cmd.do('''
center 1lmp
zoom center, 30
''')
cmd.png('pr2_6.png', 720, 720, ray=3)
In [49]:
display(Image('pr2_5.png', retina=True))
display(Image('pr2_6.png', retina=True))

Проведенная замена убирает водородную связь между остатком и лигандом, что приводит к потере активности.

#Анимационный ролик

In [6]:
cmd.fetch("1lmp", "natural")
cmd.remove("solvent")
cmd.select("nat_ligand", "natural and hetatm")
cmd.select("mut_prot", "1lmp and not hetatm")
cmd.select("nat_prot", "natural and not hetatm")
cmd.show("cartoon", "*prot")
cmd.show("sticks", "natural and (resi 52)")
cmd.show("sticks", "*ligand")
cmd.color("pink", "nat_prot")
cmd.color("cyan", "mut_prot")
cmd.color("yellow", "*ligand")
In [7]:
cmd.translate("[-30, 0, 0]", "natural")
cmd.center('natural + 1lmp')
cmd.set("cartoon_transparency", "0.3")
In [81]:
cmd.png('pr2_7.png', 1440, 720, ray=3)
Image('pr2_7.png', retina=False)
Out[81]:

Слева белок без внесенной мутации, справа - с замененным остатком.

Создание видео с совмещением мутантной и нативной структуры

In [8]:
mutant = "resi 52"
cmd.bg_color("white")

cmd.mset('1 x100') #заложим количество кадров
#зафиксируем состояние нативного белка на первом фрейме
cmd.frame('1')
cmd.mview('store')
cmd.mview('store', object='natural')
#совместим структуры мутантного и нативного белков, передвинув последний
cmd.frame('25')
cmd.mview('store') 
cmd.translate('[30, 0, 0]', object='natural')
cmd.mview('store', object='natural') 
#центрируем камеру на совмещенных структурах
cmd.frame('33')
cmd.center('natural')
cmd.zoom('natural')
cmd.mview('store', object='natural')
cmd.mview('store')
#центрируем камеру на объекте мутагенеза
cmd.frame('60')
cmd.mview('store', object='natural')
cmd.center(mutant)
cmd.zoom(mutant)
cmd.mview('store')
#меняем угол камеры
cmd.frame('100')
cmd.mview('store', object='natural')
cmd.center(mutant)
cmd.zoom(mutant)
cmd.turn('y', 135)
cmd.mview('store')
#добавляем плавный переход между сохраненными фреймами
cmd.mview('reinterpolate')
cmd.mview('reinterpolate', object='natural')
In [9]:
cmd.movie.produce('pr2.mp4', 'ray' , encoder="ffmpeg", width = 960, height = 540)
In [10]:
import io
import base64
from IPython.display import HTML

video = io.open('pr2.mp4', 'r+b').read()
encoded = base64.b64encode(video)
HTML(data='''<video alt="test" controls>
                <source src="data:video/mp4;base64,{0}" type="video/mp4" />
             </video>'''.format(encoded.decode('ascii')))
Out[10]:

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

In [11]:
#скачаем метку
import urllib.request

file_name = 'tamra.sdf'
url = 'https://pubchem.ncbi.nlm.nih.gov/rest/pug/compound/cid/2762604/record/SDF/?response_type=save&record_type=3d'
urllib.request.urlretrieve(url, file_name)
Out[11]:
('tamra.sdf', <http.client.HTTPMessage at 0x27bab5b6148>)
In [36]:
#загрузим TAMRA, уберем кислород и выделим атом углерода для связи
cmd.reinitialize()
cmd.bg_color('white')
cmd.load("tamra.sdf")
cmd.remove('tamra and id 4')
cmd.select('tamra_Ac', 'id 32')
Out[36]:
1
In [37]:
#Добавим белок лизоцим и выделим подходящий атом для связи
cmd.do('''
fetch 1lmp, lysozyme
remove solvent
show cartoon, lysozyme and (not hetatm)
color cyan,  lysozymen and (not hetatm)
color magenda,  hetatm
select res, resi 122
hide   cartoon, res
show   sticks,  res
color  green, res
select lys_Bs, lysozyme and res and n. OG

util.cbau tamra
util.cbao res''')
In [38]:
#пришьем метку
cmd.fuse('tamra_Ac', 'lys_Bs')
In [42]:
#изображение прикрепленной к серину метки
cmd.remove("tamra")
cmd.hide("labels", "all")
cmd.zoom("resi 115-125")
cmd.png('tamra.png', 1080, 720, ray=3)
Image('tamra.png', retina=True)
Out[42]:

#Построение аланиновой альфа-спирали

In [94]:
# Загружаем структуру аргинина
cmd.reinitialize()
cmd.fragment('ala')
cmd.show('sticks', 'ala')
cmd.util.cbao('ala')
In [95]:
#строим спираль
for i in range(2, 101):
    cmd.edit('resi {} and n. C'.format(i))
    cmd.editor.attach_amino_acid('pk1', 'ala', ss=1)
In [97]:
#иллюстрации
cmd.do('''
center all
orient all
zoom all
bg_color white
''')
cmd.png('hel1.png', '1920', '1080', ray=3)
cmd.turn('y', 90)
cmd.zoom('ala', '-50')
cmd.png('hel2.png', '1920', '1080', ray=3)
In [99]:
display(Image('hel1.png', retina=True))
display(Image('hel2.png', retina=True))
In [132]:
#Посмотрим на двугранные углы 
psi = cmd.get_dihedral('resi 5 and name N', 'resi 5 and name CA', 'resi 5 and name C', 'resi 6 and name  N')
phi = cmd.get_dihedral('resi 5 and name C', 'resi 6 and name N', 'resi 6 and name CA', 'resi 6 and name C')
display(psi, phi)
-46.99990463256836
-57.00001525878906

Угла "пси" и "фи" соответсвенно равны 47 и 57 радусам. Что соответсвует параметрам альфа-спирали.

#Построение B-формы ДНК

In [135]:
cmd.do('''
reini
fetch 2bna
create first_pair, resi 7+18
create second_pair, resi 6+19
delete 2bna''')

cmd.pair_fit('resi 7 and backbone', 'resi 6 and backbone',
             'resi 18 and backbone', 'resi 19 and backbone')

trans = cmd.get_object_matrix('first_pair')

cmd.do('''
reini
fetch 2bna
create new_pair, resi 7+18
copy bdna, new_pair
delete 2bna
alter bdna, resi=0
''')

for x in range(99):
    cmd.transform_object('new_pair', trans)
    cmd.alter('new_pair', f'resi={x+1}')
    cmd.fuse('new_pair', 'bdna', mode=3)
cmd.unpick()
cmd.delete('new_pair')

cmd.save('temp.pdb')
cmd.reinitialize()
cmd.load('temp.pdb')
cmd.orient()
cmd.move('z', 350)

cmd.do('''png, bdna.png, width=1080, height=720, ray=3
''')
Image('bdna.png')
Out[135]: