Запустим PyMOL и загрузим необходимые пакеты
import __main__
__main__.pymol_argv = [ 'pymol', '-x' ]
import pymol
pymol.finish_launching()
from pymol import cmd
import rdkit
from rdkit import Chem
from rdkit.Chem import AllChem
from rdkit import RDConfig
from rdkit.Chem.Draw import ShowMol
from rdkit.Chem.Draw import IPythonConsole
from rdkit.Chem import Draw
from IPython.display import display,Image,HTML,Video
from base64 import b64encode
import io
import base64
С помощью инструментов Sculpting и Mutagenesis можно изменять структуру белка и его аминокислотную последовательность.
Дана структура лизоцима (1lmp), которая связывает лиганд. Внесём одиночную мутацию в белок, которая приведёт к потере связывания с лигандом, и изменим его структуру. Нетрудно заметить, что важную роль в поддержании структуры играют дисульфидные мостики. Лишившись одной из них мутацией cys-115 на gly-115, белок наверняка не сможет связывать лиганд также хорошо.
display(Image(filename='sculpting.png', width='1000'))
Загрузим флуоресцентную метку TAMRA:
TAMRA = "CN(C)C1=CC2=C(C=C1)C(=C3C=CC(=[N+](C)C)C=C3O2)C4=C(C=CC(=C4)C(=O)[O-])C(=O)O"
mol = Chem.MolFromSmiles(TAMRA)
AllChem.Compute2DCoords(mol)
Chem.Draw.MolToImageFile(mol, 'TAMRA.png', size=(400, 400))
rdkit.Chem.rdmolfiles.MolToPDBFile(mol, 'tamra.pdb')
display(Image(filename='TAMRA.png', width='400'))
Создадим небольшое видео, на котором будет показано место мутации, сама мутация, изменение структуры белка, и присоединение метки TAMRA к остатку ser-81.
cmd.reinitialize()
F1 = (-0.3529979884624481,0.8130868077278137,0.46290624141693115,0.9355168342590332,0.29923903942108154,0.1877879798412323,0.014168323948979378,0.4993453621864319, -0.8662871718406677,0.0,0.0,
-34.043251037597656, 13.16138744354248, 57.79969787597656, 11.865260124206543, 25.74932098388672, 42.337188720703125, -20.000001907348633)
F2 = (-0.8534818887710571, -0.20164379477500916, 0.48052918910980225, 0.05657187104225159, 0.8807989954948425, 0.4700946807861328, -0.5180383324623108, 0.4284009039402008, -0.7403392195701599,
-3.489851951599121e-05, -2.1442770957946777e-05, -137.54098510742188, 14.468088150024414, 51.811973571777344, 21.076236724853516, 108.45553588867188, 166.67001342773438, -20.000001907348633)
cmd.set_view(F2)
cmd.do("""
load 1lmp.pdb
load unfold.pdb
mset 1 x550
frame 1
mdo 1: select cys2, 1lmp and resi 30+115; hide everything, unfold or resn HOH; hide sticks, cys2; show cartoon, 1lmp
mview store
frame 60
""")
cmd.set_view(F1)
cmd.mdo(70, 'bond resi 30 and name SG, resi 115 and name SG;show sticks, cys2')
cmd.mdo(100, 'unbond resi 30 and name SG, resi 115 and name SG; hide everything, resi 115 and name CB')
cmd.mview('store')
cmd.frame('150')
cmd.set_view(F1)
cmd.mview('store')
cmd.frame('250')
cmd.set_view(F2)
cmd.mdo(250, 'show cartoon, unfold; show sticks, unfold and resi 30+115')
cmd.mview('store')
cmd.mdo(300,'translate [-15, 0, 0], 1lmp')
cmd.mview('store',300)
cmd.mdo(350,'align 1lmp, unfold')
cmd.frame('350')
cmd.set_view(F2)
cmd.mview('store')
cmd.mdo(360, 'hide everything, unfold; show sticks, resi 81')
cmd.frame('400')
F3 = (-0.1544012725353241, -0.8934862613677979, 0.4217180609703064, 0.8179206848144531, 0.12383925914764404, 0.5618440508842468, -0.5542225241661072, 0.4316789507865906, 0.7116769552230835, 3.016740083694458e-05,
-0.0002479869872331619, -30.16435432434082, 20.55228042602539, 38.527523040771484, 33.38637924194336, -71.82227325439453, 132.20156860351562, -20.000001907348633)
cmd.load('tamra.pdb')
cmd.set_view(F3)
cmd.mview('store')
cmd.mdo(420, 'fuse tamra and name C24, /1lmp//A/81/OG; hide everything, tamra or /1lmp///UNL/O3')
cmd.mdo(450, 'edit /1lmp///UNL/C22, /1lmp///UNL/C24; torsion -180')
cmd.unpick()
cmd.frame('500')
F4 = (0.66672682762146, -0.6927023530006409, 0.2750241756439209, 0.6331138014793396, 0.33168816566467285, -0.6993889808654785, 0.39324676990509033, 0.6404197812080383, 0.6597030758857727,
-2.054031938314438e-05, -0.0003727748990058899, -46.78189468383789, 26.51824188232422, 40.285648345947266, 33.29109191894531, 9.764094352722168, 83.79641723632812, -20.000001907348633)
cmd.set_view(F4)
cmd.mview('store')
cmd.mview('reinterpolate')
cmd.mplay()
video = io.open('sculpt-mutagenesis-tamra.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')))
phi = '-57'
psi = '-47'
cmd.reinitialize()
cmd.editor.attach_amino_acid("pk1",'ala')
for i in range(3,100):
cmd.editor.attach_amino_acid("pk1",'ala')
cmd.set_dihedral(str(i-1)+'/N',
str(i-1)+'/CA',
str(i-1)+'/C',
str(i)+'/C',phi)
cmd.set_dihedral(str(i-1)+'/C',
str(i)+'/N',
str(i)+'/CA',
str(i)+'/C',psi)
cmd.edit(str(i)+'/C')
cmd.mset('1 x250')
cmd.frame('1')
F1 = [0.1681254804134369, -0.697181224822998, -0.6968995332717896, 0.8559678792953491, 0.4538997411727905, -0.24758465588092804, 0.4889317452907562, -0.5548980832099915, 0.6730760931968689, 7.071066647768021e-06,
1.300126314163208e-06, -49.94206237792969, 1.9890364408493042, -1.0455727577209473, -3.60075044631958, -2950.052978515625, 3049.947021484375, -20.0]
cmd.set_view(F1)
cmd.mview('store')
cmd.frame('100')
cmd.set_view((0.1681254804134369,
-0.697181224822998,
-0.6968995332717896,
0.8559678792953491,
0.4538997411727905,
-0.24758465588092804,
0.4889317452907562,
-0.5548980832099915,
0.6730760931968689,
0.0,
0.0,
-49.94206237792969,
58.02196502685547,
31.593772888183594,
-77.0528564453125,
-2950.057861328125,
3049.942138671875,
-20.0))
cmd.mview('store')
cmd.frame('150')
F2 = [-0.7746680378913879, -0.24491159617900848, 0.5830132365226746, -0.06119655817747116, 0.94666588306427, 0.3163629472255707, -0.6293984055519104, 0.2093973010778427, -0.7483389973640442,
0.00014367070980370045, 0.0003098566085100174, -28.81438446044922, 61.57285690307617, 29.46417236328125, -77.46070861816406, -2971.1669921875, 3028.8330078125, -20.0]
cmd.set_view(F2)
cmd.mview('store')
cmd.frame('250')
F3 = [-0.7746680378913879, -0.24491159617900848, 0.5830132365226746, -0.06119655817747116, 0.94666588306427, 0.3163629472255707, -0.6293984055519104, 0.2093973010778427, -0.7483389973640442,
0.00014272332191467285, 0.0003088745288550854, 94.43785095214844, 61.47258377075195, 30.15804672241211, -77.25460815429688, -3094.40185546875, 2905.59814453125, -20.0]
cmd.set_view(F3)
cmd.mview('store')
cmd.mview('reinterpolate')
cmd.mplay()
video = io.open('poly-ala.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')))
display(Image(filename='polyala.png', width='1000'))
cmd.reinitialize()
cmd.fetch('1bna')
cmd.do('''
create pair, c. A and i. 5 + c. B and i. 20
create nextpair, c. A and i. 4 + c. B and i. 21
create 1, pair''')
cmd.pair_fit('pair', 'nextpair')
trans = cmd.get_object_matrix('pair')
for x in range(2, 101):
cmd.create (str(x), str(x-1))
cmd.transform_selection(str(x), trans, homogenous = 0)
cmd.create('A_Bond'+str(x),'/'+str(x)+"/A/A/DA`5/O3'` or /"+str(x-1)+"/A/A/DA`5/P`")
cmd.bond("A_bond"+str(x)+" and name O3'","A_bond"+str(x)+" and name P")
cmd.create('B_Bond'+str(x),'/'+str(x-1)+"/B/B/DT`20/O3'` or /"+str(x)+"/B/B/DT`20/P`")
cmd.bond("B_bond"+str(x)+" and name O3'","B_bond"+str(x)+" and name P")
cmd.show('sticks',str(x)+' or A_bond'+str(x)+' or B_bond'+str(x))
cmd.orient('all')
cmd.hide('everything','1bna')
display(Image(filename='B-DNA.png', width='1000'))