235 lines
6.4 KiB
Markdown
235 lines
6.4 KiB
Markdown
# 目录结构说明
|
||
|
||
asset放一些学习资料,github仓库放不下就放到网盘中去。
|
||
|
||
plugin为自建的pymol的插件开发的一些代码
|
||
|
||
scripts为一些脚本文件,主要是测试代码
|
||
|
||
|
||
## pymol 资源学习绘图
|
||
|
||
[各种作用力绘图](https://proteintools.uni-bayreuth.de./)
|
||
|
||
|
||
## 环境安装
|
||
|
||
```shell
|
||
conda install -c conda-forge ffmpeg pymol-open-source biopython loguru ipython rdkit click -y
|
||
```
|
||
|
||
## 最高质量渲染
|
||
|
||
```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"的场景,并附带一条消息。
|
||
|
||
### `select` and `create`
|
||
|
||
```shell
|
||
选择所有蛋白质: select 8g2c_pro, polymer.protein
|
||
|
||
创建一个新的对象: create 8g2c_pro, polymer.protein
|
||
|
||
选择所有核酸: select 8g2c_nucleic, polymer.nucleic
|
||
|
||
创建一个新的对象: create 8g2c_nucleic, polymer.nucleic
|
||
|
||
选择小分子: select 8g2c_tyk, resn TYK
|
||
```
|
||
|
||
### 背景美化
|
||
|
||
```shell
|
||
# 1. 设置背景为白色,并将表面透明度设置为 50%
|
||
bg_color white # 设置背景颜色为白色
|
||
set transparency, 0.5 # 设置所有表面透明度为 50%
|
||
|
||
# 2. 使表面显示使用原子自身的颜色
|
||
set surface_color_by_atom, 1 # 启用表面按原子颜色显示
|
||
|
||
# 3. 蛋白质:着色为橙色,并显示表面
|
||
color orange, polymer.protein # 将所有蛋白质(polymer.protein)着色为橙色
|
||
show surface, polymer.protein # 显示蛋白质的表面
|
||
|
||
# 4. 核酸:着色为白色,并显示表面
|
||
color white, polymer.nucleic # 将所有核酸(polymer.nucleic)着色为白色
|
||
show surface, polymer.nucleic # 显示核酸的表面
|
||
|
||
# 5. 小分子:根据分子的 ligand id(这里假设用 organic 选择小分子)着色为红色,并显示表面
|
||
color red, organic # 将所有小分子(organic)着色为红色
|
||
show surface, organic # 显示小分子的表面
|
||
```
|
||
|
||
## 删除辅因子
|
||
|
||
```shell
|
||
# 删除8G2C中的辅因子(保留TYK)
|
||
cmd.remove("resn K or resn MG or resn SF4 or resn ZN")
|
||
|
||
# 删除8G2D中的辅因子(保留TYK)
|
||
cmd.remove("resn K or resn MG or resn SF4 or resn ZN")
|
||
```
|
||
|
||
## 一些用法笔记
|
||
|
||
```bash
|
||
# 关闭阴影渲染
|
||
set ray_shadows, off
|
||
set ray_shadow, 0.2
|
||
# 透明度
|
||
set transparency_mode, 2 # 会优化表面渲染效果,半透明看起来更自然。
|
||
set transparency, 0.5
|
||
# 创建蛋白质与核苷酸对象
|
||
create Protein_obj, polymer.protein
|
||
create RNA_obj, resn A+U+G+C+RA+RU+RG+RC
|
||
```
|
||
|
||
## Schrodinger_Suites linux install
|
||
|
||
```shell
|
||
cd Schrodinger_Suites_2021-2_Linux-x86_64
|
||
bash INSTALL (或者chmod u+x INSTALL ,之后 ./INSTALL )
|
||
(接下来选安装路径,比如/home/laiguanxue/softwares/Schrodinger_Suites_2023)
|
||
(后面一路yes)
|
||
(将Crack/patcher拷贝到安装路径中)
|
||
chmod u+x schrodinger-2023-3-patcher-linux
|
||
./schrodinger-2023-3-patcher-linux
|
||
(之后选择破解的版本)
|
||
``` |