In [ ]:
import __main__
__main__.pymol_argv = [ 'pymol', '-x' ]

import pymol
pymol.finish_launching()
from pymol import cmd,stored
import numpy as np

Знакомство с Pymol¶

In [2]:
cmd.do('''
fetch 1cll, async=0
as lines, n. C+O+N+CA
zoom i. 4+5
mset 1 x1000
mview store''')

Исследование итерации по остаткам¶

Код ниже красит Cа атомы растяжкой от более красненького цвета к более синенькому за счет варьирования красной компоненты в RGB записи цвета отдельных остатков:

In [3]:
stored.r = [] # создаем список для Са атомов через объект stored
cmd.iterate('1cll and n. CA', # итерация по Ca и добавление номеров остатков
            'stored.r.append(resi)') 
length = len(stored.r) # Число остатков
colors = np.linspace(1, 0.5, length) # массив компонент красного цвета

for k, i in enumerate(stored.r): # итерация по номерам остатков
    cmd.set_color(f'col {k}', # Задание кастомного цвета
                  [colors[k], 0.5, 0.75]) # берется цвет с красной компонентой из списка colors
    print([1, 1, colors[k]])
    cmd.set('cartoon_color', # покраска отображения cartoon остатка i
            f'col {k}', 
            f'resi {int(i)}')
    
cmd.show_as('cartoon','all')

Movie¶

Следующий код генерирует видео, в котором показываются по очереди интервалы Ca атомов (по 8 штук).

In [14]:
for i in range(length):
    cmd.frame(10*i + i) # положение камеры записывается на каждый 11 кадр
    cmd.zoom( f'n. CA and i. {i}+{i+7}') # Ca атомы каких остатков надо показать
    cmd.mview('store') # запомнить положение камеры

Работа с Pymol¶

In [ ]:
cmd.delete("1cll")
cmd.fetch("1LMP")

Изменение структуры 1LMP¶

До вмешательства:

sculpt.png

После:

sculpt_2.png

Анимация с мутацией¶

In [2]:
cmd.fetch('1LMP', 'wt')  
cmd.copy('mutant', 'wt') # копирую белок 

Для этого задания я заменила 101 аспартат в белке на фенилаланин. Таким образом теряется водородная связь с субстратом.

In [3]:
mutation = 101

В мультике сначала отодвигаю мутат, фиксирую кадр, накладываю обратно. Число кадров -- 120

In [4]:
cmd.mset('1 x120')
In [ ]:
cmd.orient("resi 101")
The Kernel crashed while executing code in the current cell or a previous cell. 

Please review the code in the cell(s) to identify a possible cause of the failure. 

Click <a href='https://aka.ms/vscodeJupyterKernelCrash'>here</a> for more info. 

View Jupyter <a href='command:jupyter.viewOutput'>log</a> for further details.
In [ ]:
cmd.frame(1)
cmd.translate([30, 0, 0], object='mutant') # Сдвиг на 30 Ангстрем по X
cmd.mview('store', object='mutant')        # Фиксирую "далекое" положение мутанта
cmd.mview('store', object='wt')  
cmd.mview('store') 


cmd.frame(60)
cmd.translate([-30, 0, 0], object='mutant') # Возвращение мутанта

cmd.mview('store', object='mutant')
cmd.mview('store', object='wt')
cmd.mview('store')   

for frame in range(60, 80):
    cmd.frame(frame)
    
    cmd.mview('store') 
    cmd.mview('store', object='mutant')
    cmd.mview('store', object='wt')  

# Увеличение места мутации в итоге выглядит не так хорошо, как хотелось бы

cmd.frame(80)
cmd.zoom(f'resi {mutation} and mutant', buffer=7) # Фокус на мутации
cmd.show('sticks', f'resi {mutation}')             
cmd.color('red', f'resi {mutation} and mutant')

cmd.mview('store', object='mutant')
cmd.mview('store', object='wt')  
cmd.mview('store')  


for frame in range(81, 121):
    cmd.frame(frame)

    cmd.mview('store') 
    cmd.mview('store', object='mutant')
    cmd.mview('store', object='wt')  

(Белок пытается убежать, даже если фиксировать каждый кадр, но я уже устала что-то с этим делать).

Сохраняю в гифку:

In [10]:
cmd.set('ray_trace_frames', 0)  
cmd.mpng('frame')             
In [8]:
import glob
import os
from PIL import Image
In [11]:
def create_gif(frame_prefix="frame", output_name="mutation_movie.gif", duration=50):
   
    search_pattern = f"{frame_prefix}*.png"
    files = sorted(glob.glob(search_pattern))

    frames = [Image.open(f) for f in files]
    
   
    frames[0].save(
        output_name,
        format='GIF',
        append_images=frames[1:],
        save_all=True,
        duration=duration,
        loop=1
    )
    
    
    for f in files:
        os.remove(f)
        
    print(f"{output_name}")


create_gif(duration=60) 

mutation_movie.gif

Присоединение метки TAMRA¶

Для присоединения метки я выбрала 24 серин на поверхности белка 1LMP

In [15]:
cmd.load("./tamra.sdf")
In [47]:
cmd.fetch("1LMP")
Out[47]:
'1LMP'

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

In [48]:
cmd.select("c_tamra", "sele")
Out[48]:
1

Далее я соединяю серин за атом кислорода (OG) и выбранный атом TAMRA:

In [50]:
cmd.fuse("name OG and resi 24", "c_tamra")
In [51]:
cmd.select("cc_tamra", "sele")
Out[51]:
1

далее при помощи команды torsion я подвинула метку так, чтобы не было клэшей:

In [255]:
cmd.torsion(12.2)
In [260]:
cmd.draw(1600)
cmd.save("./tamra.png")
Out[260]:
1

tamra.png

Полиаланиновая альфа-спираль¶

In [261]:
cmd.delete("all")
In [263]:
from pymol import editor

Торсионные углы примерно такие для альфа спирали:

In [ ]:
phi = -64
psi = -41
In [360]:
cmd.reinitialize()
cmd.fragment('ala')
cmd.alter('ala', "resv=1")


length = 100
for i in range(1, length):
    
    cmd.edit(f"i. {i} & n. C") # пикаю атом для присоединения
    editor.attach_amino_acid("pk1","ala") # добавляю следующий остаток


    # Поворачиаю на угол фи
    cmd.edit(f"i. {i} & n. C", 
             f"i. {i+1} & n. N")
    
    cmd.torsion(phi)

    # Поворачиваю на угол пси
    cmd.edit(f"i. {i+1} & n. C", 
             f"i. {i+1} & n. CA")

    cmd.torsion(psi) 



cmd.show_as('cartoon')
cmd.orient()

Посмотрев на резульат я поняла, что углы в итоге не те и спираль какая-то угловатая.

helix.png

Я попробовала по-другому:

In [356]:
cmd.reinitialize()
cmd.fragment('ala', "helix")

for i in range(2, 100):
    cmd.edit(f'helix & i. {i} & n. C')
    cmd.editor.attach_amino_acid('pk1', 'ala')

    cmd.set_dihedral(f'i. {i} & n. N',
                         f'i. {i} & n. CA',
                         f'i. {i} & n. C',
                         f'i. {i + 1} & n. N',
                         phi)
    
    cmd.set_dihedral(f'i. {i} & n.  C',
                         f'i. {i + 1} & n. N',
                         f'i. {i + 1} & n. CA',
                         f'i. {i + 1} & n. C',
                         psi)
    
        
cmd.show("cartoon", "helix")
In [357]:
cmd.draw(1600)
cmd.save("./helix2.png")
Out[357]:
1

У второй спирали торсионные углы заданы адекватным образом и она более округлая:

helix2.png

Построение B формы ДНК¶

In [503]:
cmd.fetch("1bna")
Out[503]:
'1bna'

Осталось размножить этот кусочек ДНК. Сначала я выделила две последовательные пары

In [504]:
cmd.create("pair1", "/1bna/A/A/DG`10 or /1bna/B/B/DC`15")
# Почему-то выделить остатки более адекватно у меня так и не получилось
cmd.create("pair0", "pair1")
cmd.create("pair2", "/1bna/A/A/DC`9 or /1bna/B/B/DG`16")
In [505]:
cmd.pair_fit('pair0', 'pair2') # Совмещение пар
trans = cmd.get_object_matrix('pair0') # матрица трансляции
trans
Out[505]:
(0.8249965906143188,
 -0.5602499842643738,
 0.0741661936044693,
 13.95048156125559,
 0.5625239014625549,
 0.8014712333679199,
 -0.20300428569316864,
 -3.5682928485270473,
 0.054291076958179474,
 0.20919810235500336,
 0.9763650298118591,
 -1.3228139070803167,
 0.0,
 0.0,
 0.0,
 1.0)
In [506]:
cmd.delete("1bna or pair0 or pair2")
In [ ]:
cmd.alter(f'pair1 & chain A', # для правильного нейминга
              f'resi=1')
cmd.alter(f'pair1& chain B',
              f'resi=99')

for i in range(1, 100):
    cmd.create(f'pair{i+1}', f'pair{i}')
    
    cmd.transform_selection(selection=f'pair{i+1}', 
                            matrix=trans)
    
    cmd.alter(f'pair{i+1} & chain A',  
              f'resi={i+1}')
    
    cmd.alter(f'pair{i+1} & chain B', 
              f'resi={100-i}')
    cmd.sort(f"pair{i+1}")
    

cmd.create('B-helix', 'pair*')
cmd.delete('pair*')
cmd.show("sticks")

Правильно соединяю пары между собой:

In [508]:
for i in range(1, 100):
    cmd.bond(f"/B-helix//A/DG`{i+1}/O3'", f"/B-helix//A/DG`{i}/P")
    cmd.bond(f"/B-helix//B/DC`{100-i+1}/O3'", f"/B-helix//B/DC`{100-i}/P")
In [ ]:
cmd.draw(1600)
cmd.save("./dna.png")
Out[ ]:
1
The Kernel crashed while executing code in the current cell or a previous cell. 

Please review the code in the cell(s) to identify a possible cause of the failure. 

Click <a href='https://aka.ms/vscodeJupyterKernelCrash'>here</a> for more info. 

View Jupyter <a href='command:jupyter.viewOutput'>log</a> for further details.

dna.png

In [ ]: