from IPython.display import Image, display
import __main__
__main__.pymol_argv = [ 'pymol', '-x' ]
import pymol
pymol.finish_launching()
from pymol import cmd, stored
cmd.do('bg_color white')
cmd.do('set antialias, 2')
cmd.do('set ray_trace_mode, 0')
Поработаем со sculpting на белке 1lmp:
cmd.fetch('1lmp')
cmd.do('ray; png 1lmp_view.png')
Image('1lmp_view.png')
Плохо выглядит - уберем воду.
cmd.do('remove resn hoh')
cmd.do('ray; png 1lmp_view.png')
Image('1lmp_view.png')
Стало получше. Применим sculpting и сохраним картинку:
cmd.do('ray; png 1lmp_s.png')
Image('1lmp_s.png')
Теперь поработаем со связыванием:
#Очистим и перезагрузим модель
cmd.delete('1lmp')
cmd.fetch('1lmp')
cmd.do('remove resn hoh')
В записи PDB лиганд обозначен как NAG и NDG. Посмотрим на окружение лиганда:
cmd.do('select ligand, resn NAG or resn NDG')
cmd.do('select contact, ligand around 3.5')
cmd.do('select tomut, byres contact')
cmd.do('as wire, not ligand')
cmd.do('show sticks, contact')
cmd.do('distance contact_dist, ligand, tomut, 3.5')
cmd.do('orient ligand or tomut')
cmd.do('label name CA and contact_res, f"{resn}{resi}"')
cmd.do('ray; png ligand_conn.png')
Image('ligand_conn.png')
Сильный контакт наблюдается с ASP52 и ASN46. Попробуем заменить ASP52 на что-нибудь неподходящее. Подумав, я решил менять на фенилаланин.
cmd.do('ray; png ligand_mut.png')
Image('ligand_mut.png')
Если даже и не произойдет потеря связывания, то сам лиганд будет точно по крайней мере в другой конформации.
Включив и выключив sculpting, наблюдаем, что лиганд несколько выпал из места связывания.
cmd.do('ray; png ligand_mut_sculpt.png')
Image('ligand_mut_sculpt.png')
(Надо бы, конечно, "связи"-контакты отключить, но тут они ориентируют нас, насколько лиганд вывалился).
Теперь сделаем фильм.
cmd.do('hide everything, tomut')
Спрячем контакты
cmd.do('as cartoon, not resi 52 and not hetatm')
cmd.zoom()
cmd.center()
cmd.fetch('1lmp', 'source')
cmd.do('remove resn hoh')
cmd.do('show sticks, source and resi 52')
cmd.center()
cmd.zoom('source or 1lmp')
cmd.super('1lmp', 'source')
Ура, все совместилось! Сместим wt-белок.
cmd.translate('[-50, 0, 0]', 'source')
cmd.center()
cmd.zoom('source or 1lmp')
Теперь рисуем фильм!
cmd.mset('1 x300')
cmd.frame('1')
cmd.mview('store')
cmd.mview('store', object='source')
cmd.frame('100')
cmd.mview('store')
cmd.translate('[50, 0, 0]', object='source')
cmd.mview('store', object='source')
cmd.frame('200')
cmd.center('source')
cmd.zoom('source')
cmd.mview('store', object='source')
cmd.mview('store')
cmd.frame('60')
cmd.mview('store', object='source')
cmd.center('resi 52')
cmd.zoom('resi 52')
cmd.mview('store')
Сохраним фильм из GUI в MPEG.
Какой-то очень странный фильм получился, изображение все время рябит.
Ссылка на фильм.
Это не та TAMRA?
Почему-то по общему запросу ищется 5-TAMRA, а по ссылке в практикуме - 6-TAMRA.
Image('tamra6.png')
cmd.delete('1lmp')
cmd.delete('source')
cmd.fetch('1lmp')
cmd.do('remove resn hoh')
cmd.show('surface')
cmd.do('select roi, resn SER')
cmd.color('chartreuse', 'roi and elem O')
Повертел немножко, кажется, нашел искомый остаток.
cmd.color('violet', 'resi 81')
cmd.do('ray; png surface_res_81.png')
Image('./surface_res_81.png')
cmd.hide('surface')
cmd.show('sticks', 'resi 81')
Грузим структуру
cmd.load('Structure2D_CID_2762604.sdf')
Теперь прикрепим к атому Cb нашу структуру
cmd.remove('resi 81 and elem O and sidechain')
cmd.fuse('Structure2D_CID_2762604 and donor', 'resi 81 and name CB')
cmd.zoom('resi 81')
cmd.unpick()
cmd.delete('Structure2D_CID_2762604')
cmd.remove('elem H')
cmd.zoom('resi 81', buffer=10)
cmd.do('ray; png tamra_acc.png')
Image('tamra_acc.png')
Прикрепилось кривовато, надо бы развернуть. Для этого включим sculpting.
cmd.do('ray; png tamra_acc_2.png')
Image('tamra_acc_2.png')
Стало еще хуже, эта структура гнуться не должна (только связь между трициклом и одиночным ароматическим кольцом вращается). Ну и ладно...
Теперь сделаем полимерную цепь
cmd.reinitialize()
cmd.do('bg_color white')
cmd.fragment('phe')
cmd.alter('phe', 'resi=1')
for i in range(100):
cmd.edit(f'resi {i + 1} and name C')
cmd.editor.attach_amino_acid('pk1', 'phe', ss=1)
cmd.center()
cmd.orient()
cmd.zoom()
cmd.hide()
cmd.show('sticks')
cmd.do('ray 1700, 300; png polymer.png')
Image('polymer.png')
Как мы уже поняли, для ДНК нет шаблонов.
cmd.reinitialize()
cmd.do('bg_color white')
cmd.fetch('5cjy')
cmd.remove('hetatm')
chains = []
В цепи A на 5 и 6 позициях DA. Построим матрицу по ним.
cmd.create('0', 'chain A and resi 5 or chain B and resi 20')
cmd.create('from', 'chain A and resi 5 or chain B and resi 20')
cmd.create('to', 'chain A and resi 6 or chain B and resi 19')
cmd.pair_fit('from', 'to')
mx = cmd.get_object_matrix('from')
cmd.delete('from')
cmd.delete('to')
for i in range(1, 101):
cmd.create(str(i), str(i - 1))
cmd.transform_selection(str(i), mx)
cmd.alter(str(i), f'resi={i}')
cmd.delete('0')
cmd.delete('5cjy')
cmd.create('dna', 'all')
for i in range(1, 101):
cmd.delete(str(i + 1))
cmd.bond(f"/dna/A/A/*{i + 1}/O3'", f"/dna/A/A/*{i + 2}/P")
cmd.bond(f"/dna/B/B/*{i + 2}/O3'", f"/dna/A/A/*{i + 1}/P")
Я ничего не вижу, но хотя бы сохраню результат.
cmd.save('dna_b.pdb')
Я попытался посмотреть файл отдельно: там вроде все есть. А тут не работало, загружу еще раз.
cmd.reinitialize()
cmd.do('bg_color white')
cmd.load('dna_b.pdb')
cmd.show('cartoon')
cmd.do("""
set cartoon_ring_mode, 1
set cartoon_nucleic_acid_mode, 0
set cartoon_ring_color, red
set cartoon_ring_transparency, 0.5
""")
cmd.center()
cmd.orient()
cmd.zoom()
cmd.do('ray 2300, 300; png dna.png')
Image('dna.png')
В общем, красивенько вышло. Научился использовать пимол, правда, не совсем для целей, для которых он предназначен (все же есть программы для генерации структур ДНК и белков). Но практикумы классные.