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

Запускаем Pymol как RPC сервер:

 pymol -x -R

Импортируем прокси для работы с PyMOL, переходим в рабочую директорию:

In [1]:
import xmlrpc.client as xmlrpclib
cmd = xmlrpclib.ServerProxy('http://localhost:9123')
import os
cmd.do(f'cd {os.getcwd()}')

1. Подготовка структуры

Импортируем структуру, создаем список с CA атомами:

In [2]:
cmd.do('''
reini
fetch 1cll, async=0
as cartoon, all

python
r = []
cmd.iterate('name CA and backbone', 'r.append(resi)')
length = len(r)
python end
''')

Красим структуру градиентом, используя итерацию по остаткам:

In [3]:
cmd.do('''
python
import numpy as np

colors = np.linspace(1, 0.3, length)
for k, i in enumerate(r):
    cmd.set_color(f'col{k}', [colors[-k-1], 1, colors[k]])
    cmd.set('cartoon_color', f'col{k}', f'resi {i}')
python end
''')

2. Работа с movie

Проходим по каждому 10-му CA атому структуры

In [4]:
cmd.do('''
python
numframes = 1 + 10 * (length - 12)
cmd.mview('reset')
cmd.mset(1, numframes)
for i in range(len(r) - 11):
    cmd.frame((10*i)+1)
    selection = f'n. CA and resi {r[i]}+{r[i+10]}'
    cmd.orient(selection)
    cmd.zoom(selection, buffer=8)
    cmd.mview('store')
cmd.frame(0)
cmd.mview('reinterpolate', power=1)
cmd.mplay()
python end
''')

Сохраняем каждый 50-й кадр:

In [5]:
cmd.do('''
python
cmd.mstop()
for x in range(0, numframes, 50):
    cmd.mpng('mv/', x + 1, x + 1, mode=1, width=480, height=270)
python end
''')

Создаем файл .gif

In [6]:
import imageio
import os

filenames = sorted(os.listdir('mv'))[1:]
with imageio.get_writer('movie.gif', mode='I') as writer:   
    for filename in filenames:
        filepath = os.path.join('mv', filename)
        image = imageio.imread(filepath)
        writer.append_data(image)

os.rename('movie.gif', 'movie.gif.png')

Отображение того, что получилось:

In [7]:
from IPython.display import Image, display

display(Image(filename='movie.gif.png'))