Практикум 1

In [1]:
import __main__
from IPython.display import Image
__main__.pymol_argv = [ 'pymol', '-x' ] # открыть pymol  без использования внешнего GUI
import pymol
pymol.finish_launching()
from pymol import cmd,stored
import numpy as np
import time
import pandas as pd
In [111]:
cmd.do('''
fetch 1cll, async=0
as lines, n. C+O+N+CA
zoom i. 4+5
mset 1 x1000
mview store''')
#загружаем структуру (не блокируя командную строку Pymol а в фоновом режиме,
#изображаем линиями атомы C O N и CA, 
#отцентровать видимую область на остатки 4 и 5 и увеличить изображение
#создать 1000 кадров с этим состоянием
#сохранить вид в позиции 1
In [3]:
stored.r = [] #создать список с остатками
cmd.iterate('1cll and name CA','stored.r.append(int(resi))')
#проитерироваться по всем альфа атомам и записать их номера в список
length = len(stored.r)
#присвоить переменной length длину списка остатков
In [4]:
colors = np.linspace(1,0.5, length)
#присвоим каждому номеру остатка число по порядку от 1 до 0.5
for k,i in enumerate(stored.r):
    cmd.set_color('col%d' %k, [colors[k],0.5,0.75])
    #назовем номером остатка цвет в системе RGB типа [уникальное число присвоенное остатку на предыдущем шаге,0.5,0.75]
    print [1,1,colors[k]]
    cmd.set('cartoon_color','col%d' % k ,'resi %d' % i)
    #присвоим каждому остатку сгенерированный цвет
cmd.show_as('cartoon','all')
#покажем структуру cartoonом, 
#узрим что она окрасилась в градиент фиолетового в зависимости от номера остатка, что и ожидалось
In [5]:
for i in range(length):
    cmd.frame((10*i)+1)
    cmd.zoom( 'n. CA and i. %d+%d' % (i,i+7))
    cmd.mview('store')
#сохраняем 100 фреймов из наших 1000 сгенерированных каждый из которых соответствует зуму на i и i+7 остаток
#отметим, что в такой системе кадров на все АК белка не хватит, потому что их 152 а фреймов только 100
#получается loop-видео где мы зумим iтый и i+7остаток с 0 до 107 остатка

Практикум 2

Задание 1

In [176]:
cmd.delete("all")
cmd.bg_color('white')
cmd.do('''fetch 1lmp
as cartoon, all
color grey, element C
set stick_radius, 0.5
show stick, (resn cys and (sidechain or name CA))
orient 1lmp''')
cmd.mset("1 x1")
cmd.mdelete("1")
cmd.set("opaque_background", 'off')
cmd.set("ray_trace_mode", '4')
cmd.ray(600,400)
cmd.png('./task1_1.png')
time.sleep(2)
Image(filename='./task1_1.png')
#как белок выглядел до того, как я над ним поиздевалась
Out[176]:

Радиус Sculpting - 20 $\unicode{x212B}$

Радиус Cushion - 12 $\unicode{x212B}$

Выбираю 102й остаток как стартовую точку для Sculpting

Все порчу,так как не было указано, что испортить белок нужно было как-то разумно, я испортила ео неразумно.

Зеленым окрашивается та часть, которую можно было редактировать (на расстоянии 20 $\unicode{x212B}$ от стартовой точки), бирюзовым и серым, та часть которую редактировать нельзя. Но серая совсем исключается из sculpting а бирюзовая нужна для предоставления контекста. Стоит помнить, что sculpting не минимизирует никакие энерии а всего лишь пытается вернуть параметры локальной геометрии атомов (длины и улы связей, хиральность планарность) к тем, которые были у молекулы до редактирования. Источник: https://pymolwiki.org/index.php/Molecular_Sculpting

In [11]:
cmd.orient("1lmp")
cmd.ray(600,400)
cmd.png('./task1_2.png')
time.sleep(2)
Image(filename='./task1_2.png')
Out[11]:

Задание 2

Вернем белок в исходное состояние и вернем ему его лиганд, который я ранее убрала

In [177]:
cmd.delete("all")
cmd.do('''fetch 1lmp
as cartoon, all
set cartoon_transparency, 0.5
set stick_transparency, 0
color grey, element C
show sticks, not polymer.protein
select lig, all and organic and not polymer.protein
show sticks, byres (all and polymer.protein) within 5 of lig
hide sticks, (backbone and not name CA)
select cent, lig or (byres (all and polymer.protein) within 5 of lig)
set transparency, 0.3
color hydrogen,  lig and element C
hide everything, not cent
show surface, cent and not lig
orient lig''')

Посмотрим на то, как вылядит центр связывания и придумаем, как заменить аминокислоту так, чтобы связывание сломалось

In [24]:
cmd.draw(1200,800)
cmd.png('./task1_3.png')
time.sleep(2)
Image(filename='./task1_3.png')
Out[24]:

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

In [40]:
cmd.do('''
hide sticks,lig
show sticks, (sidechain or name CA) and  byres all within 5 of resi 107
show surface, resi 107
''')
In [29]:
cmd.ray(1200,800)
cmd.png('./task1_4.png')
time.sleep(2)
Image(filename='./task1_4.png')
Out[29]:

Я заменила аланин на фенилаланин, про этом данный ротамер никак не взаимодействует с другими аминокислотами в кармане и даже может образовывать Т-стекинг с триптофаном 63.

Давайте посмотрим, что получится если мы добавим отображение лиганда.

In [33]:
cmd.do('''show sticks, lig
hide sticks, polymer.protein and not resi 107''')
cmd.ray(1200,800)
cmd.png('./task1_5.png')
time.sleep(2)
Image(filename='./task1_5.png')
Out[33]:

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

In [178]:
cmd.do('''save old.pdb, 1lmp''')

Задание 3

In [5]:
#загружаем белок заново, а старый - мутант сдвигаем и называем его old
cmd.do('''
bg color white
delete all
load old.pdb
translate [50,50,50], old
load 1lmp.cif
hide everything, all
show cartoon, all
set cartoon_transparency, 0
set stick_transparency, 0.3
select newlig,1lmp and organic and not polymer.protein
select lig, old and organic and not polymer.protein
color grey, element C
color hydrogen,  (newlig or lig) and element C
show sticks, (lig or newlig)
color salmon, old and not( lig)
''')
In [6]:
cmd.mset("1 x1")
cmd.mdelete("1")
In [7]:
cmd.mset("1 x1")
cmd.mdelete("1")
cmd.mset("1 x2000")
cmd.do('''orient old or 1lmp
set matrix_mode, 1
set movie_loop, on
set movie_auto_interpolate, on

frame 1
mview store, object=old
mview store, object=1lmp
mview store

frame 100
orient old
mview store
mview store, object=old
mview store, object=1lmp

frame 200
show sticks, resi 107 and old
orient resi 107 and old
mview store
mview store, object=old
mview store, object=1lmp

frame 300
turn y,360
mview store
mview store, object=old
mview store, object=1lmp

frame 400
mview store
mview store, object=old
mview store, object=1lmp

frame 500
orient old or 1lmp
mview store
mview store, object=old
mview store, object=1lmp

frame 600
orient 1lmp
mview store
mview store, object=old
mview store, object=1lmp

frame 700
show sticks, resi 107 and 1lmp
orient resi 107 and 1lmp
mview store
mview store, object=old
mview store, object=1lmp

frame 800
turn y, 360
mview store
mview store, object=old
mview store, object=1lmp

frame 900
mview store
mview store, object=old
mview store, object=1lmp

frame 1000
orient old or 1lmp
mview store
mview store, object=old
mview store, object=1lmp

frame 1200
super 1lmp, old
mview store, object=old
mview store, object=1lmp
mview store

frame 1300
orient 1lmp
mview store
mview store, object=old
mview store, object=1lmp

frame 1500
orient resi 107 and old
mview store
mview store, object=old
mview store, object=1lmp

frame 1700
turn y,360
mview store
mview store, object=old
mview store, object=1lmp


frame 1800
mview store
mview store, object=old
mview store, object=1lmp

''')
In [8]:
cmd.do('''movie.produce movie.gif, quality=90''')
In [187]:
cmd.do('''movie.produce movie.mpg, quality=90''')
In [3]:
display(Image('movie.gif', format='png'))

Не получилось вставить гифку ( приклеплю ссылку https://kodomo.fbb.msu.ru/~tinaferryman/term8/movie.mpg

Задание 4

In [51]:
cmd.do('''reinitialize
bg_color white
set stick_radius, 0.5
load 1lmp.cif
fetch 2762604, type=cid, name=tamra
hide nonbonded, all
''')

Нужно найти гидроксильную группу к которой мы пришьем нашу TAMRу, поэтому надо выбрать поверхностные серины треонины и тирозины.

In [28]:
stored.names = []
stored.atoms = []
stored.ind = []
stored.b = []
cmd.iterate('1lmp and polymer.protein','stored.names.append(resn)')
cmd.iterate('1lmp and polymer.protein','stored.ind.append(int(resi))')
cmd.iterate('1lmp and polymer.protein','stored.b.append(int(b))')
cmd.iterate('1lmp and polymer.protein','stored.atoms.append(name)')
bf=pd.DataFrame({"resi":stored.ind,"resn":stored.names,"atom":stored.atoms,"b":stored.b})
bf.head()
Out[28]:
atom b resi resn
0 N 18 1 LYS
1 CA 15 1 LYS
2 C 17 1 LYS
3 O 14 1 LYS
4 CB 15 1 LYS
In [17]:
bf.drop(["atom"], axis=1).groupby(["resi", "resn"]).agg("mean").query("resn=='SER'|resn=='THR'|resn=='TYR'").sort_values("b", ascending=False)
Out[17]:
b
resi resn
47 THR 44.571429
62 TYR 34.416667
122 SER 32.833333
15 SER 23.333333
37 SER 21.666667
43 THR 20.714286
69 THR 20.571429
123 TYR 19.916667
24 SER 19.833333
85 THR 19.000000
81 SER 19.000000
50 SER 18.666667
38 TYR 18.500000
89 THR 18.142857
20 TYR 17.916667
3 TYR 17.083333
51 THR 16.714286
36 SER 16.500000
53 TYR 16.166667
32 SER 15.666667
60 SER 15.500000
40 THR 14.857143

Посмотрим на остатки по мере убывания их среднего b-фактора с надеждой на то, что они достаточо поверхностные, чтобы пришить к ним нашу метку

In [19]:
cmd.do('''orient 1lmp
show sticks, resi 47 and 1lmp
util.cbay
color grey50, element C
color red, resi 47 and 1lmp''')
cmd.draw(600,400)
cmd.png('./task1_6.png')
time.sleep(10)
Image(filename='./task1_6.png')
Out[19]:

Считаю что 47й треонин, выделенный красным - достаточно хороший вариант чтобы пришить к нему метку, потому что он расположен на поверхности и в неструктурированном участке, но там рядом карман связывания и я бы посмотрела на друие аминокислоты

In [119]:
cmd.do('''orient 1lmp
show sticks, resi 62 and 1lmp
util.cbay
color grey50, element C
color red, resi 62 and 1lmp''')
cmd.draw(600,400)
cmd.png('./task1_6.png')
time.sleep(10)
Image(filename='./task1_6.png')
Out[119]:

Плохой вариант, рядом с активным центром

In [120]:
cmd.do('''orient 1lmp
show sticks, resi 122 and 1lmp
util.cbay
color grey50, element C
color red, resi 122 and 1lmp''')
cmd.draw(600,400)
cmd.png('./task1_6.png')
time.sleep(10)
Image(filename='./task1_6.png')
Out[120]:

Вот этот вариант уже лучше

In [25]:
cmd.do('''orient 1lmp
show sticks, resi 15 and 1lmp
util.cbay
color grey50, element C
color red, resi 15 and 1lmp''')
cmd.draw(600,400)
cmd.png('./task1_6.png')
time.sleep(10)
Image(filename='./task1_6.png')
Out[25]:

Не очень хорошее место

In [123]:
cmd.do('''orient 1lmp
show sticks, resi 37 and 1lmp
util.cbay
color grey50, element C
color red, resi 37 and 1lmp''')
cmd.draw(600,400)
cmd.png('./task1_6.png')
time.sleep(2)
Image(filename='./task1_6.png')
Out[123]:

Хороший вариант, на нем и остановимся

Перед тем как начать все это радостно соединять обнаруживаем что атомы TAMRA никак не называются...

Назовем атомы TAMRA - имя атома + какой то индекс

In [52]:
stored.indices=iter(range(100))
cmd.do("alter tamra, name=name+str(stored.indices.next())")

Соединим сложной связью TAMRA и 37 серин

In [53]:
cmd.do('''fuse tamra and name O3, 1lmp and resi 37 and name OG''')

Оценим клэши нарисовав атомы в виде WdV радиусов

In [59]:
cmd.do('''hide everything, tamra
color violet, 1lmp and resn UNK
set ray_trace_mode, 4
show spheres, surr
''')
cmd.ray(600,400)
cmd.png('./task1_7.png')
time.sleep(10)
Image(filename='./task1_7.png')
Out[59]:

Необходимо немного повернуть TAMRA, чтобы не было такого сильного клэша с окружающими атомами

In [60]:
cmd.do('''
hide spheres, all
torsion -70
select surr,  byres (1lmp and polymer.protein ) within 5 of (1lmp and resn UNK)
center surr
orient surr
show spheres, surr
''')
In [61]:
cmd.ray(600,400)
cmd.png('./task1_8.png')
time.sleep(10)
Image(filename='./task1_8.png')
Out[61]:

Вот так хорошо

In [64]:
cmd.do('''
hide spheres, all
show sticks, resi 37 and 1lmp
''')
In [65]:
cmd.ray(600,400)
cmd.png('./task1_9.png')
time.sleep(10)
Image(filename='./task1_9.png')
Out[65]:

Задание 5

Поверим википедии и решим что $\phi$=-60 $\psi$=-45

https://en.wikipedia.org/wiki/Alpha_helix

In [26]:
stored.prefix="0"
cmd.do('''reinitialize
bg_color white
set stick_radius, 0.5
fragment ala
select n0, ala
edit n0 and name C
select tail, n0''')
cmd.alter("n0", "name=name+stored.prefix")

for i in range(1,100):
    stored.prev=str(i-1)
    stored.name="n"+str(i)
    stored.prefix=str(i)
    cmd.do('''editor.attach_fragment('pk1','ala',11,0)''')
    cmd.do("select {name}, all and not tail".format(name=stored.name))
    cmd.alter(stored.name, "name=name+stored.prefix")
    cmd.do("set_dihedral name C{prev}, name N{prefix}, name CA{prefix}, name C{prefix},-60".format(prefix=stored.prefix,prev=stored.prev))
    cmd.do("set_dihedral name N{prev},name CA{prev}, name C{prev}, name N{prefix},-45".format(prefix=stored.prefix,prev=stored.prev))
    cmd.do("set_dihedral name CA{prev},name C{prev}, name N{prefix}, name CA{prefix},180".format(prefix=stored.prefix,prev=stored.prev))
    cmd.do("select tail, all")
    cmd.do("edit {name} and name C{prefix}".format(name=stored.name,prefix=stored.prefix))
Out[26]:
10
In [32]:
cmd.do('''
set ray_trace_mode, 4
draw 600,400
png task1_10.png
''')
Image(filename='./task1_10.png')
Out[32]:

Задание 5

In [188]:
cmd.do('''reinitialize
       bg_color white
       set stick_radius, 0.5
       fetch 1bdz''')
#скачаем какую то структуру двойной спирали ДНК
In [189]:
cmd.do('''
    extract pair, (c. A and i. 5 and bb.) or (c. B and i. 10 and bb.)
    extract nextpair, (c. A and i. 6 and bb.) or (c. B and i. 9 and bb.) 
    extract clone0, (c. A and i. 4 ) or (c. B and i. 11)
    alter clone0 and c. A, resi=0
    alter clone0 and c. B, resi=1
    show sticks, all''')
cmd.delete("1bdz")
cmd.pair_fit("pair","nextpair")
trans=cmd.get_object_matrix("pair")
cmd.delete("pair")
cmd.delete("nextpair")
cmd.delete("nextpair")
In [190]:
#сделаем днк
length=100
for i in range(1,length):
    cmd.create("clone{i}".format(i=i), "clone{j}".format(j=i-1))
    cmd.transform_selection("clone{i}".format(i=i), trans)
    cmd.alter("c. A and clone{i}".format(i=i),"resi={i}".format(i=i*2))
    cmd.alter("c. B and clone{i}".format(i=i),"resi={i}".format(i=i*2+1))
    cmd.create("DNA","all")
    cmd.delete("clone{i}".format(i=i-1))
cmd.create("DNA","all")
cmd.delete("clone{i}".format(i=length-1))
In [191]:
#добавим связи
for i in range(0,length*2,2):
    cmd.bond("n. O3\' and c. A and i. {resi}".format(resi=i), "n. P and c. A and i. {resi}".format(resi=(i+2)))
    cmd.bond("n. P and c. B and i. {resi}".format(resi=i+1), "n. O3\' and c. B and i. {resi}".format(resi=i+3))
In [193]:
cmd.do('''
orient, all
set ray_trace_mode, 4
draw 600,400
png task1_11.png
''')
Image(filename='./task1_11.png')
Out[193]: