Запускаем Pymol как RPC сервер:
pymol -x -R
Импортируем прокси для работы с PyMOL, переходим в рабочую директорию:
import xmlrpc.client as xmlrpclib
cmd = xmlrpclib.ServerProxy('http://localhost:9123')
import os
cmd.do(f'cd {os.getcwd()}')
Импортируем структуру, создаем список с CA атомами:
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
''')
Красим структуру градиентом, используя итерацию по остаткам:
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
''')
Проходим по каждому 10-му CA атому структуры
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-й кадр:
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
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')
Отображение того, что получилось:
from IPython.display import Image, display
display(Image(filename='movie.gif.png'))