113 lines
3.1 KiB
Python
113 lines
3.1 KiB
Python
from loguru import logger
|
||
from pymol import cmd
|
||
import subprocess
|
||
from pathlib import Path
|
||
|
||
# 删除当前目录下的*.mp4和*.png文件
|
||
for file_path in Path('.').glob('*.mp4'):
|
||
file_path.unlink()
|
||
|
||
for file_path in Path('.').glob('*.png'):
|
||
file_path.unlink()
|
||
|
||
# 设置日志文件
|
||
logger.add("pymol_animation.log")
|
||
cmd.log_open('pymol_animation_cmd.log')
|
||
# 最高渲染质量
|
||
cmd.util.performance(0)
|
||
cmd.rebuild()
|
||
# 初始化并加载4i24结构
|
||
cmd.reinitialize('everything')
|
||
cmd.fetch('4i24')
|
||
cmd.copy('4i24_mutated', '4i24') # 复制4i24到4i24_mutated
|
||
# 假设protgrey和colorp.color_mole是你自定义的函数
|
||
protgrey('4i24')
|
||
protgrey('4i24_mutated')
|
||
colorp.color_mole(obj='hetatm')
|
||
cmd.hide('everything', '4i24_mutated')
|
||
i = '4i24_mutated' # object
|
||
j = 'A' # chain
|
||
k = '797' # site
|
||
mutate_site = f"/{i}//{j}/{k}"
|
||
mutation_type = 'GLY'
|
||
# 对4i24_mutated进行突变
|
||
cmd.select('mut_res', mutate_site)
|
||
cmd.wizard("mutagenesis")
|
||
cmd.refresh_wizard()
|
||
cmd.get_wizard().set_mode(mutation_type)
|
||
cmd.get_wizard().do_select(mutate_site)
|
||
cmd.get_wizard().apply()
|
||
cmd.set_wizard("done")
|
||
cmd.show('sticks', mutate_site)
|
||
cmd.hide('everything', '4i24_mutated')
|
||
|
||
# 先打关键帧然后创建视频
|
||
|
||
# 创建第一个关键帧
|
||
selection1 = "/4i24//A/797"
|
||
cmd.scene('scene1', 'store')
|
||
cmd.orient(selection1)
|
||
cmd.show('sticks', selection1)
|
||
|
||
|
||
# 创建第二个关键帧
|
||
selection2 = "/4i24//A/1C9"
|
||
cmd.select("both_residues", f"{selection1} or {selection2}")
|
||
cmd.orient("both_residues")
|
||
cmd.scene('scene2', 'store')
|
||
|
||
# 设置动画和mview
|
||
cmd.mset("1 x900") # 创建一个总共1200帧的动画框架,每秒120帧共计10秒
|
||
# 第一个关键帧: 1帧
|
||
cmd.mview(action='store', first=1, scene='scene1')
|
||
|
||
# 第二个关键帧: 300帧
|
||
cmd.mview(action='store', first=300, scene='scene2')
|
||
|
||
# 插值以平滑过渡
|
||
cmd.mview('interpolate', first=1, last=300)
|
||
|
||
residue_to_show = "/4i24//A/797" # 用你想显示的残基替换
|
||
cmd.mdo(360, f"show lines, {residue_to_show}; label {residue_to_show}/n, f'res {residue_to_show}(CYS)'")
|
||
|
||
# 隐藏4i24对象: 600帧
|
||
cmd.mdo(600, "hide everything, 4i24")
|
||
|
||
# 显示4i24_mutated对象: 610帧
|
||
cmd.mdo(610, "show cartoon, 4i24_mutated")
|
||
|
||
# 显示突变残基: 620帧
|
||
cmd.mdo(620, "show sticks, /4i24_mutated//A/797")
|
||
|
||
# 为残基添加标签: 630帧
|
||
residue_to_show = "/4i24_mutated//A/797"
|
||
cmd.mdo(630, f"show lines, {residue_to_show}; label {residue_to_show}/n, f'res {residue_to_show}(GLY)'")
|
||
|
||
# 插值以平滑过渡
|
||
cmd.mview('interpolate', first=300, last=900)
|
||
|
||
# 设置viewport尺寸为1080P(1920x1080像素)
|
||
cmd.viewport(1920, 1080)
|
||
cmd.mplay() # 播放动画
|
||
|
||
# 光线追踪和保存每一帧
|
||
# for frame in range(1, 901):
|
||
# cmd.frame(frame)
|
||
# logger.info(f"Rendering frame {frame}")
|
||
# cmd.refresh()
|
||
# cmd.ray(width=1920, height=1080)
|
||
# cmd.png(f"frame_transition_{frame:04d}.png")
|
||
|
||
# 使用ffmpeg合成视频
|
||
# subprocess.run([
|
||
# 'ffmpeg',
|
||
# '-framerate', '120', # 120帧/秒
|
||
# '-i', 'frame_transition_%04d.png',
|
||
# '-c:v', 'libx264',
|
||
# '-pix_fmt', 'yuv420p',
|
||
# 'transition_video.mp4'
|
||
# ])
|
||
|
||
|
||
# ffmpeg -framerate 120 -i frame_transition_%04d.png -c:v libx264 -pix_fmt yuv420p transition_video.mp4
|