Работа с PyMol

In [2]:
import __main__
import time

__main__.pymol_argv = [ 'pymol', '-x' ]

import pymol
pymol.finish_launching()
from pymol import cmd,stored
from IPython.display import Image

Загружаем исходный белок

In [22]:
cmd.do(f'''
reini
fetch 1lmp
hide nonbonded
bg_color white
color marine, polymer.protein

select ligand, resn nag+ndg
show sticks, ligand
zoom 1lmp, -7
png 1.png, width=1080, height=720, ray=1
''')

Image('1.png',retina= True)
Out[22]:

Поизменяем структуру вручную с помощью демонстрационного скульптора-волшебника Wizard->Demo->Sculpting

In [24]:
Image('2.png', width = 540)
Out[24]:

По данным авторов структуры (http://journals.iucr.org/d/issues/1995/06/00/se0173/se0173.pdf) остаток аспартата 52 вовлечен в образование полярных контактов с олигосахаридом

In [8]:
cmd.do('''
reini
fetch 1lmp
remove resn HOH
bg_color white
select ligand, resn nag+ndg
dist hbond1, ligand, resi 52, 3.5, mode=2
set label_size, -0.9
show sticks, resi 52
orient resi 52 or resn NDG
zoom resi 52 or resn NDG, 1
view1 = get_view()
png 4.png, width=1080, height=720, ray=1
delete hbond1
''')

Image('4.png',retina= True)
Out[8]:

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

In [11]:
cmd.do('''
wizard mutagenesis
refresh_wizard
python
cmd.get_wizard().do_select("resi 52")
cmd.get_wizard().set_mode("TYR")
cmd.get_wizard().apply()
cmd.set_wizard()
python end
dist hbond1, ligand, resi 52, 3.5, mode=2
set_view(view1)
png 5.png, width=1080, height=720, ray=1
''')

Image('5.png',retina=True)
Out[11]:

Сравним две структуры, выделив 52 аминокислотный остаток цветом, а после этого создадим кино про их совмещение

In [13]:
cmd.do('''
set_view(view0)
fetch 1lmp, original
remove resn HOH
translate [30, 0, 0], original
orient all

select ligand1, original and resn nag+ndg
select ligand2, 1lmp and resn nag+ndg
as cartoon, not ligand*
color slate, original
color grey50, ligand*

show sticks, resi 52
color yellow, resi 52 and 1lmp
set stick_radius, 0.5, resi 52 and 1lmp
color tv_red, resi 52 and original

png 6.png, width=1080, height=720, ray=1
''')

Image('6.png',retina=True)
Out[13]:
In [21]:
import time
cmd.do('''
mset 1 x150
set movie_auto_interpolate, off

frame 30
align original, 1lmp
mview store, object=original
mview store, object=1lmp

frame 150
mview store, object=original
mview store, object=1lmp

frame 1
translate [15, 0, 0], object=original
translate [-15, 0, 0], object=1lmp
mview store, object=original
mview store, object=1lmp

mview reinterpolate, object=original
mview reinterpolate, object=1lmp
''')

time.sleep(0.1)

cmd.frame(1)
cmd.zoom()
cmd.mview('store')

cmd.frame(30)
cmd.zoom()
cmd.mview('store')

cmd.frame(60)
cmd.zoom('all', -5)
cmd.mview('store')

cmd.frame(90)
cmd.zoom('resi 52', 2)
cmd.mview('store')

cmd.frame(120)
cmd.turn('y', 120)
cmd.mview('store')

cmd.frame(150)
cmd.turn('y', -30)
cmd.mview('store')

cmd.mview('reinterpolate')
In [22]:
cmd.do('''
python
cmd.mstop()
for x in range(0, 150, 3):
    cmd.mpng('mv/', x + 1, x + 1, mode=1, width=720, height=480)
python end
''')
In [23]:
import imageio
import os
filenames = sorted(os.listdir('mv'))[1:]
with imageio.get_writer('movie.gif', mode='I', fps=10) as writer:   
    for filename in filenames:
        filepath = os.path.join('mv', filename)
        image = imageio.imread(filepath)
        writer.append_data(image)
In [24]:
from IPython.display import Image, display

display(Image(filename='movie.gif', format='png'))

Метка TAMRA образует сложноэфирную свзяь своей карбоксигруппой с спиртовым боковым радикалом треонина либо серина. Я проверил экспонированность боковых цепей всех остатков серина и треонина в белке, и выбрал серин 24. Я присоединил к нему метку TAMRA-6, а потом провел релаксацию связей.

In [28]:
cmd.do('''
reini
fetch 1lmp
remove resn HOH
show surface
color green, all
color magenta, resn THR+SER and elem O and sidechain
turn x, -100
turn y, -0
png 7.png, width=1080, height=720, ray=1
''')

Image('7.png',retina=True)
Out[28]:
In [16]:
cmd.do('''
reini
fetch 1lmp
hide nonbonded
bg_color white

load tamra.sdf
remove tamra and id 54
show sticks, resi 24
remove resi 24 and name OG1
fuse tamra and donor, resi 24 and name CB, mode=1
torsion 50

remove tamra
orient resi 24
turn y, -150
unpick

''')
In [28]:
cmd.do('''
set auto_sculpt, on
set sculpting, on
sculpt_activate all
''')
time.sleep(50)

cmd.do('''
set sculpting, off
zoom resi 24 or resi 23 or resi 25
orient resi 24
png 8.png, width=1080, height=720, ray=1
''')
time.sleep(1)
Image('8.png',retina=True)
Out[28]:

Построим альфа-спираль из 100 остатков цистеина

In [34]:
cmd.do('''
reini
bg_color white
fragment CYS
''')
for i in range(2, 101):
    cmd.do(f'''
    edit resi {i} and name C
    editor.attach_amino_acid('pk1', 'CYS')
    ''')
phi = -57
psi = -47
for i in range(2, 101):
    cmd.do(f'''
    set_dihedral resi {i} and name N, resi {i} and name CA, resi {i} and name C, resi {i+1} and name  N, {phi}
    set_dihedral resi {i} and name C, resi {i+1} and name N, resi {i+1} and name CA, resi {i+1} and name C, {psi}
    ''')
cmd.do('''
show cartoon
orient
zoom cys, 5
unpick
png 9.png, width=1080, height=720, ray=1
''')
time.sleep(1)
Image('9.png')
Out[34]:

Построим B-форму ДНК

In [33]:
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')
time.sleep(1)
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 10.png, width=1080, height=720, ray=1
''')
time.sleep(1)
Image('10.png')
Out[33]:

Построим G-квадруплекс

In [4]:
cmd.do('''
reini
fetch 2o4f
create first_pair, resi 2+12+22+32
create second_pair, resi 3+13+23+33
delete 2o4f
''')

cmd.pair_fit('resi 2 and backbone', 'resi 3 and backbone',
             'resi 12 and backbone', 'resi 13 and backbone',
             'resi 22 and backbone', 'resi 23 and backbone', 
             'resi 32 and backbone', 'resi 33 and backbone')

trans = cmd.get_object_matrix('first_pair')

cmd.do('''
reini
fetch 2o4f
remove resn HOH
create new_pair, resi 2+12+22+32
copy gdna, new_pair
delete 2o4f
alter gdna, 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', 'gdna', mode=3)
cmd.unpick()
cmd.delete('new_pair')


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

cmd.do('''png 11.png, width=1080, height=720, ray=1
''')
time.sleep(1)
Image('11.png')
Out[4]: