from pymol import cmd, stored
import numpy as np
import pymol
import __main__
__main__.pymol_argv = ['pymol', '-x']
pymol.finish_launching()
Загружаем pdb файл, выбираем отображение, сохраняем интересные нам атомы (C-альфа) в список
cmd.do('''
reini
fetch 1cll, async=0
as cartoon, all
''')
stored.r = []
cmd.iterate('1cll and n. CA and backbone', 'stored.r.append(resi)')
length = len(stored.r)
colors = np.linspace(1, 0, length)
for k, i in enumerate(stored.r):
cmd.set_color(f'col{k}', [colors[-k-1], colors[k], 1])
cmd.set('cartoon_color', f'col{k}', f'resi {i}')
Мы проходим по всем (i, i + 7) парам С-альфа атомов и фокусируемся на них, после чего сохраняем кадр.
numframes = 1 + 10 * (length - 9)
cmd.mview('reset')
cmd.mset(1, numframes)
for i in range(len(stored.r) - 8):
cmd.frame((10*i)+1)
selection = f'n. CA and resi {stored.r[i]}+{stored.r[i+7]}'
cmd.orient(selection)
cmd.zoom(selection, buffer=7)
cmd.mview('store')
print((10*i)+1)
cmd.frame(0)
cmd.mview('reinterpolate', power=1)
cmd.mplay()
Тут мы сохраняем покадрово наш мувик, а потом склеиваем кадры в гифку (каждый 4й кадр)
import imageio
import os
cmd.mstop()
dirpath = 'images/'
cmd.mpng(dirpath, mode=1, width=1920/4, height=1080/4)
with imageio.get_writer('movie.gif.png', format='gif', mode='I') as writer:
for x in range(0, numframes, 4):
filename = os.path.join(dirpath, f'{x+1:04}.png')
image = imageio.imread(filename)
writer.append_data(image)
from IPython.display import Image
display(Image(filename='movie.gif.png'))