Установка PyMol
conda install -c schrodinger pymol
import __main__
__main__.pymol_argv = [ 'pymol', '-c' ]
import pymol
pymol.finish_launching()
from pymol import cmd,stored
from IPython.display import Image
import numpy as np
import time
Далее код, который итерирует 200 раз С-альфа атомы близлежащих ак в структуре 1lmp
Для обращения к консоли Pymol используется cmd.do("str"). При этом "str" подразумевает команды на "языке" PyMol, в данном случае мы скачиваем 1cll (fetch) (в версии PyMOL 2.3.0 async и так дефолтно = 0), далее задаем отображение атомов под именами C,O,N,CA с помощью lines (as), затем приближаем остатки под номерами 4 и 5 (zoom). mset показывает 1-ое состояние в 1000 кадрах mview store - фиксирует данный кадр основным. Если бы было несколько таких кадров - это имело бы смысл, но у нас такого нет.
cmd.do('''
fetch 1cll, async=0
as lines, n. C+O+N+CA
zoom i. 4+5
mset 1 x1000
mview store''')
cmd.png('/tmp/1.png')
Image(filename='/tmp/1.png')
stored.r = [] # назовем список stored.r, общий и для jupyter и для pymol
cmd.iterate('1cll and n. CA','stored.r.append(resi)') # Итерируем структуру 1cll по остаткам с именем CA
# Забрасываем номера остатков в созданный ранее список
length = len(stored.r) # возвращаем в переменную length длину списка stored.r, что соответствует количеству ак в структуре
colors = np.linspace(1,0.5, length) # создание массива равномерно распределенных чисел от 0.5 до 1, количество чисел = количество ак
for k,i in enumerate(stored.r): # итерируемся по индексам(k) и объектам(i) в списке stored.r
cmd.set_color('col%d' % k, [colors[k],0.5,0.75]) # Создаем палитру разных красных ["obj in colors",0.5,0.75]
#для раскрашивания скаждого остатка в структуре 1cll в свой цвет
#print([1,1,colors[k]])
cmd.set('cartoon_color','col%d' % k ,'resi %d' % int(i)) # Красим i остаток в соответствующий цвет
cmd.show_as('cartoon','all') # Устанавливаем cartoon на 1cll
cmd.png('/tmp/2.png')
Image(filename='/tmp/2.png')
for i in range(50):
cmd.frame((20*i)+1)# фиксируем каждые 20 кадров (от 1 до 981)
cmd.zoom( 'n. CA and i. %d+%d' % (i,i+7))# сдвигаем камеру на 1 остаток каждый цикл
# 7 остатков в одном кадре приближаются
cmd.mview('store')#сохраняем опорный кадр
Sculpting (в данном задании строгового запрета делать все вручную в PyMol нет, так что просто изображения). Операции производились согласно инструкции https://pymolwiki.org/index.php/Molecular_Sculpting
Image('pic2.png', width=600, height=600)
Image('pic3.png', width=600, height=600)
С помощью метода Sculpting, возможно лишь собрлюдение торсионных и др. угов, длин связей, хиральность и планарность химических групп. Поэтому метод подразумевает лишь незначительные изменения конформации молекулы.
Mutagenesis Сначала оценим взаимодействие лиганда с молекулой лизозима. Согласно связям, установленным pdb банком, лиганд (2-acetamido-2-deoxy-beta-D-glucopyranose-(1-4)-2-acetamido-2-deoxy-beta-D-glucopyranose-(1-4)-2-acetamido-2-deoxy-alpha-D-glucopyranose) взаимодействует водяным мостиком с 59 ASN OD1, с азотом остова 59 ASN водородной связью, с кислородом остова ALA 107 тоже водородной связью.
cmd.reinitialize()
Почему-то команда 'dist hbond1, ligand, resi 107' не дает выделения на картинке, но расстояние между кислородом остова и азотом NAG`2 там 3.1 A.
cmd.do('''
fetch 1lmp
remove resn hoh
bg_color white
select ligand, resn NAG`2
dist hbond1, ligand, resi 107
show sticks, resi 107
orient resi 61 or resi 106
set cartoon_transparency, 0.7
png lig.png, width=1080, height=720, ray=1
delete hbond1
''')
cmd.select("hph_core", "byres all within 3 of i. 107")
cmd.show("licorice", "hph_core")
cmd.color("red", "i. 107")
#center resi 107, 10
cmd.png('/tmp/4.png')
Image(filename='/tmp/4.png')
Вероятно, это взаимодействие - не основное. Предположительно 59 ASN остаток играет важную роль. Потому что лиганд связан водяным мостиком с 59 ASN OD1, с азотом остова 59 ASN водородной связью
cmd.reinitialize()
cmd.do('''
fetch 1lmp
remove resn hoh
bg_color white
select ligand, resn NAG`2
select site, byres all within 5 of ligand
dist hbond1, ligand, resi 59
show sticks, resi 59
zoom resi 59, 10
set cartoon_transparency, 0.7
png lig.png, width=1080, height=720, ray=1
delete hbond1
''')
#cmd.select("hph_core", "byres all within 3 of i. 59")
#сmd.show("licorice", "hph_core")
cmd.color("red", "i. 59")
cmd.png('/tmp/5.png')
Image(filename='/tmp/5.png')
Во взаимодействии, заменим на аминокислоту, не имеющую - NH группы в остове и кислорода в остатке. На пролин - который имеет совершенно другую геометрию.
cmd.wizard('mutagenesis')
cmd.refresh_wizard()
cmd.get_wizard().do_select('resi 59')
cmd.get_wizard().set_mode('PRO')
cmd.refresh_wizard()
cmd.get_wizard().apply()
cmd.set_wizard()
cmd.do('''
select ligand, resn nag+ndg
dist hbond1, ligand, resi 103, mode=2
''')
cmd.do('png contact_surface.png, 1920, 1080')
#cmd.select("hph_core", "byres all within 3 of i. 59")
#сmd.show("licorice", "hph_core")
display(Image('contact_surface.png', width=720))
C пролином связи не образуются, вероятно это нарушает взаиводействие
MPEG
cmd.reinitialize()
cmd.do('as cartoon, not resi 59 and not hetatm')
cmd.do('zoom')
cmd.fetch('1lmp')
cmd.fetch('1lmp', 'native')
cmd.do('remove resn hoh')
cmd.do('show sticks, native and resi 59')
cmd.center('1lmp or native')
cmd.zoom('1lmp or native')
cmd.super('1lmp', 'native')
cmd.translate('[-30, 0, 0]', 'native')
cmd.center('1lmp or native')
cmd.zoom('1lmp or native')
cmd.do('png mov.png, width=1080, height=720, ray=1')
Image('mov.png')
cmd.mset('1 x300')
cmd.frame('1')
cmd.mview('store')
cmd.mview('store', object='native')
cmd.frame('100')
cmd.mview('store')
cmd.translate('[30, 0, 0]', object='native')
cmd.mview('store', object='native')
cmd.frame('150')
cmd.center('native')
cmd.zoom('native')
cmd.mview('store', object='native')
cmd.mview('store')
cmd.frame('200')
cmd.mview('store', object='native')
cmd.center('1lmp and resi 59')
cmd.zoom('1lmp and resi 59')
cmd.mview('store')
cmd.frame('300')
cmd.mview('store', object='native')
cmd.center('1lmp and resi 59')
cmd.zoom('1lmp and resi 59')
cmd.turn('y', 90)
cmd.mview('store')
cmd.mview('reinterpolate')
cmd.mview('reinterpolate', object='native_protein')
cmd.do('''movie.produce movie.mpg, quality=90''')
from IPython.display import Video
display(Video("movie.mpg"))
TAMRA Пришить флуоресцентную метку лучше на поверхность глобулы к доступному остатку, Если связь сложноэфирная, Значит должна цепляться к спиртовой группе белка своей кислой карбонильной группой. Подходит THR`47
cmd.do('''
fetch 1lmp
remove resn hoh
bg_color white
load tamra.sdf
show sticks, resi 47
remove resi 47 and name OG1
fuse tamra and donor, resi 47 and name CB, mode=1
torsion 30
remove tamra
orient resi 47
turn y, -20
label n. CA and i. 37, "(%s, %s)" % (resn, resi)
unpick
remove hydrogens
png tamred.png, width=1080, height=720, ray=1
''')
Image('tamred.png')
Полиаланиновая спираль
cmd.reinitialize()
cmd.do('''
fragment PRO
edit resi 2 and name C
''')
for i in range(1, 30):
cmd.editor.attach_amino_acid('pk1', 'ALA', ss=1)
cmd.do('''
orient
hide everything
show sticks
png pro.png, width=1080, height=720, ray=1
''')
Image('pro.png')
cmd.reinitialize()
cmd.fetch('4bna')
# теперь попробуем все через cmd
cmd.select('np1', 'i. 7 + i. 18')
cmd.select('np2', 'i. 8 + i. 17')
cmd.extract('pair1', 'np1')
cmd.extract('pair2', 'np2')
cmd.pair_fit('m. pair2 and bb.', 'm. pair1 and bb.')
transform = cmd.get_object_matrix('pair2')
cmd.delete('m. pair2')
cmd.set_name('pair1', '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.do('''
orient
png bdna_done.png, width=1080, height=720, ray=1
''')
Image('bdna_done.png')