Открываем PyMOL и загружаем все необходимые модули.
import __main__
__main__.pymol_argv = [ 'pymol', '-x' ]
import pymol
pymol.finish_launching()
from pymol import cmd,stored
from IPython.display import Image
import time
import sys
import numpy as np
Для начала оценили возможности sculpting. Переходим во вкладку Wizard->Demo->Sculpting, где можем изменять структуру белка, которая потом будет оптимизирована программой.
Далее загружаем структуру лизоцима в комплексе с лигандами (1LMP).
cmd.reinitialize()
cmd.do('''
fetch 1lmp, async=0
as cartoon, n. C+O+N+CA
zoom center, 30
bg_color white
select ligand, 1lmp and resn nag+ndg
show sticks, ligand
png 1lmp1.png''')
cmd.remove("solvent")
cmd.png('1lmp.png')
time.sleep(3)
Image(filename='1lmp.png')
Используя пакет wizard заменим остаток ASP52 на PHE. Для начала рассмотрим изменяемый остаток до мутации :
cmd.hide('all')
cmd.select('nomutant','resi 52 + resn nag + resn ndg')
cmd.show('sticks', 'nomutant')
cmd.zoom('nomutant')
cmd.png('nomutant.png')
cmd.deselect()
cmd.png('nomutant.png')
time.sleep(2)
Image(filename='nomutant.png')
Далее используя функцию mutagenesis произведем мутацию.
cmd.wizard("mutagenesis")
cmd.refresh_wizard()
cmd.get_wizard().do_select("resi 52")
cmd.get_wizard().set_mode("PHE")
cmd.refresh_wizard()
cmd.get_wizard().apply()
cmd.set_wizard()
Оценим результат мутации.
cmd.hide('all')
cmd.select('mutant','resi 52 + resn nag + resn ndg')
cmd.show('sticks', 'mutant')
cmd.zoom('mutant')
cmd.deselect()
cmd.png('mutant.png')
time.sleep(2)
Image(filename='mutant.png')
cmd.fetch('1lmp', 'nomutlmp')
cmd.hide('all')
cmd.select('ligandmut', '1lmp & resn nag+ndg')
cmd.select('ligandmomut', 'nomutlmp & resn nag+ndg')
cmd.disable('ligand*')
cmd.set('cartoon_side_chain_helper', 'on')
cmd.show('cartoon', '(1lmp | nomutlmp) & !ligand*')
cmd.colour('deepblue', '1lmp')
cmd.colour('deepblue', 'nomutlmp')
cmd.show('sticks', 'ligand*')
cmd.colour('green', 'ligand*')
cmd.show('sticks', 'resi 52')
cmd.colour('red', '1lmp & resi 52')
cmd.colour('yellow', 'nomutlmp & resi 52')
cmd.translate('[-50, 0, 0]', 'nomutlmp')
cmd.center('nomutlmp + 1lmp')
cmd.zoom('center', '40')
cmd.png('compare.png')
time.sleep(2)
Image(filename='compare.png')
Создаем анимационный ролик в котором показано совмещение структур с мутацией и без.
cmd.mset('1 x360')
cmd.frame('1')
cmd.mview('store')
cmd.do('mview store, object=nomutlmp')
cmd.frame('60')
cmd.do('translate [50, 0, 0], object=nomutlmp')
cmd.do('mview store, object=original')
cmd.frame('360')
cmd.zoom('resi 52','5')
cmd.do('mview store, object=nomutlmp')
cmd.frame('120')
cmd.zoom('resi 52','5')
cmd.mview('store')
cmd.frame('180')
cmd.do('mview store, object=nomutlmp')
cmd.zoom('resi 52','5')
cmd.do('util.mrock(180, 360, 360)')
cmd.mview('store')
cmd.frame('360')
cmd.zoom('resi 52','5')
cmd.clip('near', '100'); cmd.clip('far', '-100')
cmd.mview('store')
cmd.do('mview interpolate, object=nomutlmp')
cmd.mview('reinterpolate')
cmd.mpng('mut_nomut_combination')
cmd.mplay()
Сохраняем видео через GUI и импортируем его.
import io
import base64
from IPython.display import HTML
video = io.open('test.mp4', 'r+b').read()
encoded = base64.b64encode(video)
HTML(data='''<video alt="test" controls>
<source src="data:video/mp4;base64,{0}" type="video/mp4" />
</video>'''.format(encoded.decode('ascii')))
Мы выбираем атомы метки и белка между которыми хотим создать связь и с помощью команды fuse сливаем две молекулы с образованием сложноэфирной связи.
cmd.reinitialize()
cmd.bg_color('white')
cmd.load("tamra.sdf")
cmd.remove('tamra and id 4')
cmd.select('tamra_O', 'id 32')
cmd.fetch("1lmp")
cmd.remove("solvent")
cmd.zoom()
cmd.do('''
select THR_O, resn thr and resi 89 and name OG1
show sticks, resn thr and resi 89
''')
cmd.fuse('tamra_O', 'THR_O', 1)
cmd.do('''
zoom center, 20
rotate z,300, all
rotate x, -50, all
rotate y, 20, all
''')
cmd.png('tamra.png')
time.sleep(3)
Image(filename='tamra.png')
Нам необходимо найти структуру B-формы ДНК, получить из нее пары нуклеотидов и их матрицу превращения при совмещении одной пары нуклеотидов с последующей. После чего мы размножаем эту пару и применять к ней матрицу превращения.
cmd.reinitialize()
cmd.fetch('1BNA')
cmd.bg_color('white')
cmd.remove("solvent")
cmd.do('''create pair, c. A & i. 4 + c. B & i. 21
create nextpair, c. A & i. 5 + c. B & i. 20
create 1, pair
pair_fit nextpair, pair
''')
trans = cmd.get_object_matrix("nextpair")
for x in range(2, 100):
cmd.create(str(x), str(x-1))
cmd.transform_selection(x, trans, homogenous=0)
time.sleep(1)
cmd.delete('1BNA')
cmd.show('sticks')
cmd.zoom('all')
cmd.zoom('center', '50')
cmd.do('''
rotate x, -100, all
rotate z, -100, all
''')
cmd.png('dnaprof.png')
time.sleep(3)
Image(filename='dnaprof.png')
cmd.reinitialize()
cmd.bg_color('white')
cmd.fragment('ALA')
for x in range(2,100):
cmd.edit("/ALA///"+str(x)+"/c")
cmd.editor.attach_amino_acid("pk1","ALA")
for x in range(3,100):
cmd.edit("/ALA///"+str(x)+"/N","/ALA///"+str(x)+"/CA")
cmd.torsion (90)
cmd.edit("/ALA///"+str(x-1)+"/CA","/ALA///"+str(x-1)+"/C")
cmd.torsion (180)
Image(filename='polyala1.png')
Image(filename='polyala2.png')