Для запуска ipython notebook надо запустить специальную версию python в терминале, лучше это делать из той директории где будут лежать файлы практикума.
Форматирование задаётся Markdown: http://daringfireball.net/projects/markdown/basics

Практикум использования Pymol

Задание 1. Оцените возможности Sculpting, в Wizard->Demo->Sculpting

интересно, спасибо, применять научился.

Задание 2. лиганд и мутация в белке


In [77]:
#Для работы с Pymol я импортировал прокси и загрузку картинок:
from xmlrpclib import ServerProxy
from IPython.display import Image

Подключился к Pymol, который предварительно запущен как RPC сервер командой :

pymol -R

и скачал с PDB структуру белка 1LMP

In [3]:
cmd = ServerProxy(uri="http://localhost:9123/RPC2")
In [16]:
cmd.fetch('1lmp')
Out[16]:
'1lmp'

Для контроля за временем надо импортировать модуль time

In [17]:
import time
cmd.hide("everything")
cmd.cd("C:\MOL_model\Pract_try1")

Скрипт для импорта и расположения молекулы нужным образом

In [18]:
cmd.hide("everything")
cmd.show_as("cartoon")
cmd.set("cartoon_color", "green")
cmd.set("opaque_background", 'off')
cmd.set("ray_trace_mode", '1')
cmd.bg_color('white')

#найдем лиганд
cmd.select("ligand", "r. NAG+NDG")
cmd.show_as("sticks", "ligand")
cmd.color("cyan", "ligand and n. C*")

#выберем подходящий ракурс
#cmd.turn("x", "160")
cmd.do('orient i. 48+103+71')
cmd.zoom("i. 48+103", 3.0, 0, 1)

#снимем выделение
cmd.select("None")
Out[18]:
0

Рассмотрим лиганд ближе

In [19]:
cmd.zoom("ligand or i. 103+59+98", 3.0, 0, 1)
cmd.ray(600,400)
cmd.png('tmp\mypng1.png')
time.sleep(2)
Image(filename='tmp\mypng1.png')
Out[19]:

мутируем остаток Asn 103, образующий водородную связь с лигандом. Для этого сперва изобразим его:

In [20]:
cmd.select("asn103", "i. 103")

#для наглядности покажем полупрозрачные поверхности и отдельно мутируемый остаток
cmd.set("surface_color", "gray40")
cmd.show("surface", "! ligand")
cmd.set("surface_color", "blue", "asn103")
cmd.set("transparency",  0.5)
cmd.show("sticks", "asn103")
cmd.color("green", "asn103 and n. C*")
cmd.zoom("ligand or i. 103+59+98", 3.0, 0, 1)

#покажем длину связи
cmd.distance("///A/NAG`130/O7", "///A/ASN`103/ND2")
cmd.set("label_size", -1.0)
cmd.ray(600,400)
cmd.png('tmp\mypng2.png')
time.sleep(2)
Image(filename='tmp\mypng2.png')
Out[20]:

далее заменим остаток на Ala (типичный способ мутагенеза). В скрипте все-равно пропишу выбор ротамеров, пусть для данного примера это и не актуально.

In [21]:
cmd.wizard("mutagenesis")
cmd.do("refresh_wizard")
 
# lets mutate chain A residue 103 to ALA.
cmd.do('cmd.get_wizard().set_mode("ALA")')
cmd.do('cmd.get_wizard().do_select("///A/103")')
 
# Select the first rotamer, which is most probable
cmd.frame(1)
 
# Apply the mutation
cmd.do('cmd.get_wizard().apply()')
# Close wizard
cmd.set_wizard("done")
#OR cmd.wizard(None) 

cmd.zoom("ligand or i. 103+59+98", 3.0, 0, 1)
#create new distances
cmd.delete("dist*")
cmd.distance("///A/NAG`130/O7", "///A/ALA`103/CB")
cmd.set("label_size", -1.0)
#remove surface
cmd.hide("surface")
#to avoid mistakes do->
cmd.hide("sticks", "i. 103 & r. asn")

#save pdb file with Ala 103
cmd.save("1lmp_Ala103.pdb")

cmd.ray(600,400)
cmd.png('tmp\mypng3.png')
time.sleep(2)
Image(filename='tmp\mypng3.png')
Out[21]:

Задание 3. видео

Используем сохраненный мутантный белок и новую молекулу.

In [27]:
cmd.delete("all")

#load structures
cmd.load("1lmp_Ala103.pdb")
cmd.fetch("1lmp")

cmd.super("1lmp", "1lmp_Ala103")

#colors and models etc.
cmd.show_as("cartoon")
#cmd.set("cartoon_side_chain_helper", "on")
cmd.color("cyan", "n. C* and 1lmp")
cmd.set("cartoon_color", "cyan", "1lmp")
cmd.color("orange", "n. C* and 1lmp_*")
cmd.set("cartoon_color", "orange", "1lmp_*")
cmd.do('set stick_radius, 0.12, 1lmp')  


#show recidue 103
cmd.show("sticks", "i. 103")
#cmd.do('orient i. 103, -1')

#сменим ракурс
cmd.turn("x", "160")
cmd.do('orient i. 48+103+71')
cmd.zoom("1lm*", 3.0, 0, 1)

#раскадровка на 55 одинаковых кадров
cmd.mset("1 x100")

#первый кадр
cmd.frame("1")
cmd.do('translate [50, 0, 0], object=1lmp')
cmd.do('mview store, object=1lmp')
cmd.zoom("1lm*", 1.0, 0, 1)
cmd.mview("store")

#10-й кадр
cmd.frame("10")
cmd.do('mview store, object=1lmp')
cmd.zoom("1lm*", 3.0, 0, 1)
cmd.mview("store")

#совмещение (60 кадр)
cmd.frame("60")
cmd.do('translate [-50, 0, 0], object=1lmp')
cmd.do('mview store, object=1lmp')
cmd.zoom("i. 103", 5.0, 0, 1)
cmd.mview("store")

#приблизить остатки и слегка сдвинуть(90 кадр)
cmd.frame("90")
cmd.do('translate [-50, 0, 0], object=1lmp')
cmd.do('orient i. 103')
cmd.do('mview store, object=1lmp')
cmd.zoom("i. 103", 1.0, 0, 1)
cmd.mview("store")

#окончание видео (100 кадр)
cmd.frame("100")
cmd.do('mview store, object=1lmp')
cmd.mview("store")

#интерполяция
cmd.do('mview reinterpolate')
cmd.do('mview reinterpolate, object=1lmp')

#сохраним
cmd.do('set ray_trace_frames,1')
cmd.do('mpng movie_')

Видео хорошо бы добавить на эту страницу, поэтому нашел похожий пример.

In [82]:
from IPython.display import HTML
from base64 import b64encode
video = open('Pract2_Aleshin_mutants.mp4', 'rb').read()
video_encoded = b64encode(video)
video_tag = '<video controls alt="PyMol Movie" src="data:video/mp4;base64,{0}" type="video/mp4">'.format(video_encoded)
HTML(data=video_tag)
Out[82]:

Задание 4. Присоединение тетраметилродамина

При поиске информации я нашел, что тетраметилродамин может присоединяться к аминогруппам белка. Мы будем делать сложноэфирную связь, поэтому присоединим метку по остатку например серина 37.

Предварительно загрузим 3D модель TAMRA в формате SDF, откроем файл в PyMol и сохраним как TAMRA.pdb во избежание неприятностей.

In [31]:
cmd.delete("all")

#load structures
cmd.load("1lmp.pdb")
cmd.load("TAMRA.pdb")

#colors and models etc.
cmd.show_as("cartoon")
cmd.set("cartoon_side_chain_helper", "on")
cmd.color("cyan", "n. C* and 1lmp")
cmd.set("cartoon_color", "cyan", "1lmp")
cmd.do('set stick_radius, 0.12, 1lmp')  

#show recidue 37
cmd.show("sticks", "i. 37")
#cmd.do('orient i. 37, -1')

cmd.select('serOG', '/1lmp//A/SER`37/OG')

# NOTE: tamraC should be choosen manually as command below
cmd.select('tamraC', '/TAMRA///UNK`/C')
#returns all carbon atoms of tamra

после того, как мы выделили атом в тетраметилродамине для слияния с белком:

In [31]:
cmd.fuse(anchor_O, tamra_C)
# use several times
cmd.do('torsion 15')  
#or pull atoms and rotate angles with 'wisard'->'sculpting'->Ctrl+mouse

# And then remove the original oxygen from the TAMRA (manually because of the same problem)

cmd.disable('1lmp')
In [31]:
# Clear animation frames
cmd.mclear()
cmd.mdelete('100', '1')

cmd.do('orient tamra & i. 37 + /tamra///UNK`/')
In [35]:
cmd.set("ray_trace_mode", '0')
cmd.ray(600,400)
cmd.png('tmp\mypng4.png')
time.sleep(2)
Image(filename='tmp\mypng4.png')
Out[35]:

Задание 5. создать поливалиновую спираль длинной 100 аминкислот

Для построения α-спирали взглянем еще раз на карту Рамачандрана (на приведенном рисунке символом "А" обозначен район локализации углов в альфа-спиралях, соответственно эти углы нам и нужны). Примем значения углов для аланина в α-спиралях за ϕ=−60 и ψ=−45.
Добавления нового остатка будем производить в цикле, изменяя при этом соответствующие углы для создаваемых остатков, при этом использовалась команда set dihedral, что несколько короче, чем выбор связи и затем ее вращение на заданный угол.

In [73]:
# start again
cmd.reinitialize()
cmd.bg_colour('white')

#here you can choose variables for the script: "num" - helix length, "aa" - amino acid, "helix_phi" & "helix_psi" - torsion angles. 
num=100
aa  = 'VAL'
helix_phi = '-60'
helix_psi = '-45'

def AA_helix(n, aa, phi=None, psi=None):
    cmd.fragment(aa)
    cmd.edit("i. %i & n. C" % 2)   #I had to use i. 2 and change it later to i. 1 using "cmd.alter" below
    cmd.edit("i. 2 & n. CA", "i. 2 & n. C")

    # Here is the main sycle At first, just add all the aminoacids
    for i in range(2, n+1):
        # select the atom for attachment
        cmd.edit("i. %i & n. C" % i)
        # attach the given residue
        cmd.do('editor.attach_amino_acid("pk1", "%s")' % aa)
        #time.sleep(1)
        # Then change dihedral angles
        cmd.set_dihedral("i. %i & n. N" % i, "i. %i & n. CA" % i,
                             "i. %i & n. C" % i, "i. %i & n.  N" % (i+1),
                             phi)
        cmd.set_dihedral("i. %i & n.  C" % i,     "i. %i & n. N" % (i+1),
                             "i. %i & n. CA" % (i+1), "i. %i & n. C" % (i+1),
                             psi)

    cmd.edit()
    cmd.alter("%s & */ca" % str(aa),"ss='H'")                       #to show cartoon as helix
    cmd.alter("%s" % str(aa), 'resi=str(int(resi)-1)')              #to get good aa numbers from 1 to num    
    cmd.cartoon("auto")
    
    cmd.show_as('sticks', aa)
    cmd.show('cartoon', aa)
    cmd.set("cartoon_side_chain_helper", "on")
    cmd.center(aa)
    cmd.zoom(aa)

AA_helix(num, aa, phi=helix_phi, psi=helix_psi)
    
cmd.ray(600,400)
cmd.png('tmp\mypng5.png')
time.sleep(2)
Image(filename='tmp\mypng5.png')
Out[73]:



In [74]:
cmd.orient('/VAL///VAL`4/CB or /VAL///VAL`3/1HG1 or /VAL///VAL`5/2HG2')
#cmd.zoom('/VAL///VAL`4/CB or /VAL///VAL`3/1HG1 or /VAL///VAL`5/2HG2', 10.0, 0, 1)
cmd.spectrum('count')
cmd.show('spheres')
cmd.set('sphere_scale', '0.3')
cmd.set('stick_radius', '0.12')
cmd.do('set depth_cue, 0')      #to turn off the fog.
cmd.do('clip far, -100')        #to see all the helix. Be careful with it
cmd.do('clip near, 10')
cmd.ray(600,400)
cmd.png('tmp\mypng6.png')
time.sleep(2)
Image(filename='tmp\mypng6.png')
Out[74]:


##Возможно именно это увидят люди, путешествующие сквозь кротовую нору...

Задание 6. Построить молекулу кубана.

теперь возьмем Smiles кубана кубана, запишем его в файл '.smi', сопроводив через несколько пробелов словом 'cubane', далее воспользуемся на kodomo пакетом Mopac, подробнее в подсказках.
полученный в итоге файл 'cubane.mol' используем в скрипте ниже.

In [76]:
# start again
cmd.reinitialize()
cmd.bg_colour('white')

cmd.load("cubane.mol")

cmd.zoom("cubane", 1.0, 0, 1)
cmd.show('sticks')
cmd.set('stick_radius', '0.12')
cmd.set('sphere_scale', '0.3')
cmd.show('spheres')
cmd.set('sphere_scale', '0.3')

cmd.ray(600,400)
cmd.png('tmp\mypng7.png')
time.sleep(2)
Image(filename='tmp\mypng7.png')
Out[76]:

А теперь надо все это как-то сохранить, надо сохранять как notebook (см. меню), и можно html:

ipython nbconvert --to html pract1_copy2.ipynb

в результате имеем intro.html, забавно, что картинки уже встрены в html