Files
pymol/README.md
2024-09-07 09:12:14 +08:00

164 lines
4.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 目录结构说明
asset放一些学习资料github仓库放不下就放到网盘中去。
plugin为自建的pymol的插件开发的一些代码
scripts为一些脚本文件主要是测试代码
## pymol 资源学习绘图
[各种作用力绘图](https://proteintools.uni-bayreuth.de./)
## 环境安装
```shell
conda install -c conda-forge ffmpeg pymol-open-source biopython loguru
```
## 最高质量渲染
```shell
util.performance(0)
rebuild
```
PyMOL可以用多种方式进行录制
1. **命令行录制**: 使用`log_open``log_close`命令可以将PyMOL的命令行操作记录到文本文件。
```
cmd.log_open('filename.log')
... # Your operations
cmd.log_close()
```
2. **Ray Tracing**: 使用`ray`命令渲染高质量的图片,然后用其他软件将图片合成为视频。
3. **使用`mset`和`mview`创建动画**: 如你之前所述,通过这两个命令创建动画,然后使用`mpng`命令将动画导出为PNG帧最后用其他软件将其合成为视频。
```
cmd.mpng('frame_prefix_', 1, 60)
```
4. **屏幕录制软件**: 使用外部屏幕录制软件如OBS、Camtasia等进行录制。
5. **PyMOL API和脚本**: 使用PyMOL的Python API和PyMOL脚本可以更精细地控制录制内容。
## PyMOL工作目录
使用`cd`命令改变PyMOL的工作目录。例如
```
cmd.cd("/path/to/new/directory")
```
## 图片渲染
设置600DPI
```shell
width = int(1920 * (600 / 72))
height = int(1080 * (600 / 72))
cmd.ray(width, height)
```
得到帧1至帧60的PNG图片
```shell
cmd.mset("1 x60 61 x60")
cmd.scene('frame1', 'store')
cmd.mview('store', state=1, scene='frame1')
cmd.scene('frame2', 'store')
cmd.mview('store', state=60, scene='frame2')
cmd.mview('interpolate')
for i in range(1, 61):
cmd.frame(i)
cmd.ray(1920, 1080, 300)
cmd.mpng(f'frame_prefix_{i}.png')
```
```shell
from dataclasses import dataclass, field
from typing import Tuple
from pathlib import Path
@dataclass
class PyMOLAnimator:
resolution: Tuple[int, int] = (1920, 1080)
dpi: int = 300
frame_count: int = 120
output_dir: Path = field(default_factory=lambda: Path('./'))
def save_frames(self, scene_1: str, scene_2: str):
import pymol.cmd as cmd
# 设置动画帧数
cmd.mset(f"1 x{self.frame_count} {self.frame_count+1} x{self.frame_count}")
# 存储第一帧和最后一帧
cmd.scene(scene_1, 'store')
cmd.mview('store', state=1, scene=scene_1)
cmd.scene(scene_2, 'store')
cmd.mview('store', state=self.frame_count, scene=scene_2)
# 插值以创建动画
cmd.mview('interpolate')
output_path = self.output_dir / 'frame_prefix_'
# 保存每一帧为PNG图片
for i in range(1, self.frame_count+1):
cmd.frame(i)
cmd.ray(self.resolution[0], self.resolution[1], self.dpi)
cmd.mpng(str(output_path) + f'{i}.png')
# 使用
animator = PyMOLAnimator((1920, 1080), 300, 120, Path('/path/to/save'))
animator.save_frames('frame1', 'frame2')
```
## 场景设置
`cmd.mview`和`cmd.scene`两者都用于存储视图状态,但用途和范围有所不同:
### `cmd.mview`
- **主要用途**: 用于电影插值,在电影播放中创建平滑过渡。
- **存储内容**: 主要存储相机和对象矩阵,用于电影帧之间的插值。
- **特定于帧**: 可以为电影中的特定帧或帧范围存储视图。
- **动画专用**: 主要用于创建复杂的电影动画。
```
cmd.mview('store', state=1, scene='frame1')
```
这会在状态1下用场景名`frame1`存储当前相机和对象矩阵。
### `cmd.scene`
- **主要用途**: 存储和恢复场景,方便用户随时回到特定的视图和设置。
- **存储内容**: 存储相机视图、所有对象的活动信息、所有原子的可见性和颜色、所有的表示形式和全局帧索引。
- **不特定于帧**: 主要用于一般目的的视图保存和恢复。
```
cmd.scene('MyScene', 'store', 'This is my special scene')
```
这会存储一个名为"MyScene"的场景,并附带一条消息。