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
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
stored.r = [] #создать список с остатками
cmd.iterate('1cll and name CA','stored.r.append(int(resi))')
#проитерироваться по всем альфа атомам и записать их номера в список
length = len(stored.r)
#присвоить переменной length длину списка остатков
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ом,
#узрим что она окрасилась в градиент фиолетового в зависимости от номера остатка, что и ожидалось
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 остатка
Задание 1
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')
#как белок выглядел до того, как я над ним поиздевалась
Радиус Sculpting - 20 $\unicode{x212B}$
Радиус Cushion - 12 $\unicode{x212B}$
Выбираю 102й остаток как стартовую точку для Sculpting
Все порчу,так как не было указано, что испортить белок нужно было как-то разумно, я испортила ео неразумно.
Зеленым окрашивается та часть, которую можно было редактировать (на расстоянии 20 $\unicode{x212B}$ от стартовой точки), бирюзовым и серым, та часть которую редактировать нельзя. Но серая совсем исключается из sculpting а бирюзовая нужна для предоставления контекста. Стоит помнить, что sculpting не минимизирует никакие энерии а всего лишь пытается вернуть параметры локальной геометрии атомов (длины и улы связей, хиральность планарность) к тем, которые были у молекулы до редактирования. Источник: https://pymolwiki.org/index.php/Molecular_Sculpting
cmd.orient("1lmp")
cmd.ray(600,400)
cmd.png('./task1_2.png')
time.sleep(2)
Image(filename='./task1_2.png')
Задание 2
Вернем белок в исходное состояние и вернем ему его лиганд, который я ранее убрала
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''')
Посмотрим на то, как вылядит центр связывания и придумаем, как заменить аминокислоту так, чтобы связывание сломалось
cmd.draw(1200,800)
cmd.png('./task1_3.png')
time.sleep(2)
Image(filename='./task1_3.png')
Видим, что можно заменить аланин 107 боковой стенки кармана на что нибудь с более длинным радикалом и тогда геометрия кармана не будет позволять связывание лиганда.
cmd.do('''
hide sticks,lig
show sticks, (sidechain or name CA) and byres all within 5 of resi 107
show surface, resi 107
''')
cmd.ray(1200,800)
cmd.png('./task1_4.png')
time.sleep(2)
Image(filename='./task1_4.png')
Я заменила аланин на фенилаланин, про этом данный ротамер никак не взаимодействует с другими аминокислотами в кармане и даже может образовывать Т-стекинг с триптофаном 63.
Давайте посмотрим, что получится если мы добавим отображение лиганда.
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')
Можно увидеть, что фенилаланин формирует клэш с кислородом гидроксильной группы радикала и сам по себе, являясь гидрофобной ароматической аминокислотой не может взаимодействовать с довольно гидрофильным лигандом. Я предполагаю, что такая замена способна привести к достаточно заметной потере способности лизоцима связывать хитоолиосахариды.
cmd.do('''save old.pdb, 1lmp''')
Задание 3
#загружаем белок заново, а старый - мутант сдвигаем и называем его 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)
''')
cmd.mset("1 x1")
cmd.mdelete("1")
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
''')
cmd.do('''movie.produce movie.gif, quality=90''')
cmd.do('''movie.produce movie.mpg, quality=90''')
display(Image('movie.gif', format='png'))
Не получилось вставить гифку ( приклеплю ссылку https://kodomo.fbb.msu.ru/~tinaferryman/term8/movie.mpg
Задание 4
cmd.do('''reinitialize
bg_color white
set stick_radius, 0.5
load 1lmp.cif
fetch 2762604, type=cid, name=tamra
hide nonbonded, all
''')
Нужно найти гидроксильную группу к которой мы пришьем нашу TAMRу, поэтому надо выбрать поверхностные серины треонины и тирозины.
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()
bf.drop(["atom"], axis=1).groupby(["resi", "resn"]).agg("mean").query("resn=='SER'|resn=='THR'|resn=='TYR'").sort_values("b", ascending=False)
Посмотрим на остатки по мере убывания их среднего b-фактора с надеждой на то, что они достаточо поверхностные, чтобы пришить к ним нашу метку
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')
Считаю что 47й треонин, выделенный красным - достаточно хороший вариант чтобы пришить к нему метку, потому что он расположен на поверхности и в неструктурированном участке, но там рядом карман связывания и я бы посмотрела на друие аминокислоты
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')
Плохой вариант, рядом с активным центром
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')
Вот этот вариант уже лучше
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')
Не очень хорошее место
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')
Хороший вариант, на нем и остановимся
Перед тем как начать все это радостно соединять обнаруживаем что атомы TAMRA никак не называются...
Назовем атомы TAMRA - имя атома + какой то индекс
stored.indices=iter(range(100))
cmd.do("alter tamra, name=name+str(stored.indices.next())")
Соединим сложной связью TAMRA и 37 серин
cmd.do('''fuse tamra and name O3, 1lmp and resi 37 and name OG''')
Оценим клэши нарисовав атомы в виде WdV радиусов
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')
Необходимо немного повернуть TAMRA, чтобы не было такого сильного клэша с окружающими атомами
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
''')
cmd.ray(600,400)
cmd.png('./task1_8.png')
time.sleep(10)
Image(filename='./task1_8.png')
Вот так хорошо
cmd.do('''
hide spheres, all
show sticks, resi 37 and 1lmp
''')
cmd.ray(600,400)
cmd.png('./task1_9.png')
time.sleep(10)
Image(filename='./task1_9.png')
Задание 5
Поверим википедии и решим что $\phi$=-60 $\psi$=-45
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))
cmd.do('''
set ray_trace_mode, 4
draw 600,400
png task1_10.png
''')
Image(filename='./task1_10.png')
Задание 5
cmd.do('''reinitialize
bg_color white
set stick_radius, 0.5
fetch 1bdz''')
#скачаем какую то структуру двойной спирали ДНК
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")
#сделаем днк
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))
#добавим связи
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))
cmd.do('''
orient, all
set ray_trace_mode, 4
draw 600,400
png task1_11.png
''')
Image(filename='./task1_11.png')