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,
''')
cmd.do('''
ray
png overall.png
''')
Image(filename='overall.png')
Данной командой мы иниицируем паймол через юпитер и фетчим структуру 1lmp из RCSB PDB. Структура представляет собой небольшой глобулярный белок с лигандом, трисахаридом. Воду спрячем, т.к. для заданий практикума она нам вообщем и не нужна. В первом задании нас просят немного изменить структуру белка 1lmp c помощью встроенной утилиты Pymol sculpting.
cmd.do('''
ray
png sculpted.png
''')
Image(filename='sculpted.png')
В качестве наиболее тривиального упражнения по sculpting мы просто растянули c-концевой участок белка в прямую цепь.
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
''')
Перед тем как приступать к заданию с мутагенезом, рассмотрим сайт связывания поближе, для удобства команды выше перекрашивают атомы углерода лиганда в жёлтый чтобы лиганд было легче отличать на фоне белка. Также мы отображаем поверхность белка и делаем её прозрачной для удобства.
cmd.do('''
dist hbo,1lmp,lig,3.2,mode=2
ray
png lig.png
''')
Image(filename='lig.png')
Можно заметить что многие водородные связи лиганд образует не с боковыми цепями, а с атомами остова белка. В качестве остатка который мы будем мутировать, мной был выбран триптофан 63 (конечно сомнительно, что при такой мутации будет наблюдаться потеря связывания но по крайней мере мы теряем одну водородную связь), мы заменим его на аланин.
cmd.do('''
ray
png trp63.png
''')
Image(filename='trp63.png')
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-й Триптофан на аланин. А данное видео по мере смены кадров меняет параметр прозрачности для неизменённой структуры, таким образом триптофан плавно исчезает в анимации,а на его месте остаётся аланин.
from IPython.display import Video
Video(filename='movie.mp4', embed=True, width=1080, height=640)
В следующем задании нам необходимо присоединить к нашей структуре флуоресцентную метку TAMRA с помощью команд fuse и torsion. По условию присоединение должно происходить по сложноэфирной связи, поэтому мы можем выбрать любой удобный нам серин, тирозин или треонин, мой выбор остановился на серине 122 поскольку он очень удачно расположен на поверхности молекулы.
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.
cmd.do('''
fuse fuse1, fuse2
''')
cmd.do('''
ray
png tamra.png
''')
Image(filename='tamra.png')
Теперь выполним задание №5, а именно сгенерируем полиаланиновую альфа спираль из сотни остатков:
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")
cmd.do('''
ray
png polyA.png
''')
Image(filename='polyA.png')
Перейдём теперь к последнему заданию, сгенерируем 100 нуклеотидную последовательность ДНК в B-форме.
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')
cmd.do('''
ray
png B_DNA.png
''')
Image(filename='B_DNA.png')