🎯为什么需要另一个分子可视化工具

PyMOL是结构生物学领域最广泛使用的分子可视化工具。Warren DeLano在2000年将其开源,给了整整一代结构生物学家一个可以免费使用、修改和学习的工具。但PyMOL的代码库已经积累了25年的历史——C语言核心、OpenGL渲染管线、Python 2时代的脚本接口。安装一个完整的PyMOL需要数百MB的依赖,在浏览器中无法运行,GPU渲染仍依赖legacy OpenGL。

Patinae(原名PyMOL-RS)的回答是:保留你熟悉的命令语言和选择代数,但用Rust从零重写整个引擎。不是包装,不是移植——是一个全新的代码库和渲染栈。

关键数字:~12MB单文件可执行 · 兼容99% PyMOL命令 · WebGPU渲染(非OpenGL) · Rust内存安全 · 跑在桌面/Python/浏览器三端

12MB是什么概念?PyMOL的conda安装包通常在300-500MB以上(包含Python运行时、NumPy、Qt等依赖)。Patinae把渲染器、命令运行时、文件解析器、选择引擎、插件系统全部编译进一个~12MB的原生可执行文件——这得益于Rust的零运行时依赖特性和wgpu的原生编译。你不需要安装Python,不需要装Qt,不需要任何运行时——./patinae protein.pdb就够了。

🏗️架构:不是单体,是15个独立crate

Patinae最精妙的设计决策是模块化到crate级别。整个项目不是一个巨型二进制——它是15个独立可用的Rust crate,每个都有明确的职责边界:

🏗️ Patinae Crate 架构
层级 Crate 职责
应用层 patinae 原生桌面应用(Slint UI shell)
patinae-cmd 命令解析器与执行器
patinae-plugin 插件SDK
patinae-framework 共享消息与核心组件
渲染层 patinae-render WebGPU渲染引擎(wgpu)
patinae-scene 视图状态、场景图、相机、输入
领域层 patinae-mol 核心数据模型:Atom, Bond, Molecule
patinae-io 格式解析与写入(PDB/mmCIF/MOL2等)
patinae-select 选择语言解析器与求值器
patinae-session 会话保存与加载(.prs / .pse导入)
patinae-algos 对齐、对称性、序列分析算法
基础层 patinae-color 命名颜色、调色板、方案、色带
patinae-settings 配置与设置系统
patinae-plugin-host 运行时插件宿主

这意味着什么?如果你只需要在Rust pipeline里解析PDB文件——use patinae-io就够了。如果你只需要选择代数引擎——use patinae-select。如果你要构建自己的查看器——组合scene、renderer、command runtime和你自己的前端。没有单体依赖,没有"为了用一个函数拉入整个GUI"的问题。

这种crate拆分不是过度工程——它是Patinae能同时跑在桌面、Python和浏览器的基础。三端共享同一套领域层和渲染层crate,只是前端不同:Slint桌面UI、PyO3 Python绑定、WASM浏览器viewer。

WebGPU渲染:GPU impostor与并行 marching cubes

Patinae的渲染器是一个完整的WebGPU实现——不是OpenGL,不是Vulkan抽象层,是wgpu(Rust的WebGPU实现,同时支持原生和WASM编译)。这个选择带来三个关键优势:

1. GPU Impostor着色器

传统的分子可视化用OpenGL绘制球体和圆柱体——要么用大量三角形(慢),要么用点精灵(质量差)。Patinae用GPU ray-sphere impostor技术:每个球体只渲染一个四边形(4个顶点),在fragment shader里做光线-球体求交,计算出正确的深度和法线。这意味着你可以渲染数十万个原子而不掉帧——因为GPU做的不是几何体渲染,而是像素级的光线追踪

圆柱体(键)同理——GPU ray-cylinder impostor。双键和芳香键也能正确渲染。

2. 并行 Marching Cubes 分子表面

分子表面(SAS/SES/VdW)是结构生物学可视化的核心。传统PyMOL用CPU计算marching cubes,对大蛋白来说很慢。Patinae用GPU compute shader并行化marching cubes——据项目声称比传统方法快1000倍。这不是夸张:GPU的并行度天然适合marching cubes的体素独立计算。

3. 多光源Phong着色 + 阴影

Patinae支持多方向阴影映射(multi-directional shadow mapping)和多光源Phong着色。还有一个独特的"Skripkin模式"——一个受结构生物信息学美学启发的光照预设,多方向柔光照亮二级结构细节。这在传统PyMOL中需要Ray tracing才能实现,Patinae在实时渲染中就做到了。

渲染后处理包括:WBOIT(weighted blended order-independent transparency,顺序无关透明度)、FXAA(快速近似抗锯齿)、SSAO(屏幕空间环境光遮蔽)、轮廓/剪影后处理。这些都是现代游戏引擎级别的技术——Patinae把它们带到了分子可视化里。

渲染内存配置

Patinae在启动时选择渲染内存配置——这是一个启动时决策,不是运行时设置:

# 按GPU能力自动选择(默认) ./patinae protein.pdb # 强制平衡模式(降低scratch-target压力) PATINAE_RENDER_MEMORY_PROFILE=balanced patinae protein.pdb # 轻量模式(禁用SSAO/FXAA等可选特性) PATINAE_RENDER_MEMORY_PROFILE=lite patinae protein.pdb # 手动指定内存预算(MB) PATINAE_RENDER_MEMORY_PROFILE=manual:1024 patinae protein.pdb

这让Patinae能跑在从高端GPU到集成显卡的任何设备上——包括浏览器里的WASM WebGPU。

💬命令语言:99% PyMOL兼容的肌肉记忆

这是Patinae最实用的设计:如果你会PyMOL,你就会Patinae。同样的命令语法,同样的选择代数,同样的肌肉记忆。Patinae重新实现了这门语言,而不是包装它。

Patinae> fetch 1alk Patinae> show cartoon Patinae> color chain Patinae> show surface Patinae> set transparency, 0.7 Patinae> select site, byres near_to 5 of resn ZN Patinae> show sticks, site Patinae> set stick_color, atomic, site Patinae> save my_session.prs

选择代数

完整的选择语言支持:布尔代数(and/or/not)、距离操作符(around/near_to/within)、扩展操作符(byres/bychain/expand)、数值比较、slash-macro语法。全部与PyMOL兼容:

# 选择A链的所有CA原子 chain A and name CA # 选择配体5Å内的所有残基 byres around 5 ligand # 选择聚合物且非溶剂 polymer and not solvent

完整命令集

支持的核心命令包括:load, fetch, show, hide, color, select, zoom, center, orient, png, ray, align, cealign, symexp, isomesh, isosurface, isodot——以及脚本执行(.pml文件)和会话文件(.prs原生格式,.pse导入兼容)。

🐍三栖部署:桌面、Python、浏览器

Patinae最独特的特征是同一套Rust crate编译到三个目标,每个都是一等公民:

1. 原生桌面应用

# 单文件可执行 patinae protein.pdb # 或从源码构建 git clone https://github.com/zmactep/pymol-rs cd pymol-rs make patinae ./target/release/patinae

桌面应用基于Slint UI(v0.4.0从egui迁移到Slint),提供命令行、对象面板、序列查看器、插件面板、鼠标拾取、原生文件工作流和GPU视口。macOS、Linux、Windows三平台——cargo build一次搞定。

2. Python / Jupyter

pip install patinae
from patinae import cmd cmd.load("protein.pdb") cmd.show("cartoon") cmd.color("green", "chain A") cmd.select("site", "byres around 5 ligand") site_atoms = cmd.count_atoms("site") cmd.do("set ambient, 0.8")

Python包通过PyO3绑定暴露熟悉的cmd.*接口——与PyMOL的Python API一致。还包含一个anywidget Jupyter查看器,可以在notebook中交互式查看分子:

from patinae.widget import Viewer view = Viewer() view.show() cmd = view.get_cmd() cmd.fetch("1CRN") cmd.show("cartoon") cmd.color("green", "chain A")

3. 浏览器(WebAssembly + WebGPU)

这是最令人兴奋的部分。Patinae编译成WASM,通过WebGPU在浏览器中运行——不是截图,是真正的交互式3D分子查看器。发布为@patinae/viewer npm包:

<div id="viewer" style="width: 800px; height: 600px"></div> <script type="module"> import { PatinaeViewer } from "@patinae/viewer"; const viewer = new PatinaeViewer(document.getElementById("viewer")); await viewer.init(); await viewer.loadUrl("https://models.rcsb.org/1IGT.bcif.gz", { name: "1IGT", format: "bcif", }); viewer.execute("show cartoon"); viewer.execute("color green, chain A"); </script>

还支持自定义元素(custom element)注册——一行HTML标签就能嵌入分子查看器:

<patinae-viewer src="https://models.rcsb.org/1IGT.bcif.gz" command="show cartoon; color green, chain A"> </patinae-viewer>

这意味着你可以在论文 supplementary page、教学网站、Lab wiki里直接嵌入交互式3D分子查看器——读者不需要安装任何东西,只需要一个支持WebGPU的浏览器。

🧩插件系统:在分子查看器里跑DOOM

Patinae的插件系统不是事后添加的——它是架构的核心部分。插件是编译为动态库(.dylib/.so/.dll)的原生Rust代码,从~/.patinae/plugins/加载。插件可以注册命令、提供UI面板、挂钩命令管道、通过Patinae插件API与查看器交互。

🧩 参考插件
插件 功能
hello 最小化插件生命周期与命令注册示例
raytracer GPU光线追踪:BVH加速、阴影、透明度、边缘检测
ipc 进程间通信——外部工具集成(Unix socket控制)
python 嵌入式CPython解释器——在桌面应用内跑Python脚本

为了展示插件系统的强大程度——他们真的在Patinae里跑了DOOM。作为插件demo。这虽然是个玩笑,但它证明了一个严肃的观点:Patinae的插件API足够通用,可以承载完全无关的渲染逻辑。你可以用它构建自定义分析工具、交互式教学模块、或者任何你能想象的可视化插件。

📊能力清单:格式、表示、分析

📋 Patinae 完整能力清单

文件格式:PDB, mmCIF, bCIF (BinaryCIF), MOL2, SDF/MOL, XYZ, GRO, CCP4/MRC(电子密度图), XTC/TRR(轨迹), gzip压缩输入

表示类型:球体(spheres)、棒(sticks)、线(lines)、卡通(cartoon)、缎带(ribbon)、表面(surface: SAS/SES/VdW)、网格(mesh)、点(dots)、标签(labels)、等值面(isomesh)、等值面填充(isosurface)、等值点(isodot)

结构分析:

  • Kabsch叠合与CE结构对齐
  • 距离、角度、二面角测量(带视觉反馈)
  • 晶体学对称性扩展(全部230个空间群)
  • 从几何自动分配二级结构
  • 电子密度图加载与等值线

会话:Patinae原生.prs会话保存/加载,PyMOL .pse会话导入

光线追踪:raytracer插件提供离线GPU光线追踪——BVH加速、阴影、透明度、边缘检测

⚖️Patinae vs PyMOL vs 竞品

⚖️ 分子可视化工具对比
特性 PyMOL Patinae megane PyChem-Pro
语言 C / Python Rust Rust / Python 纯Python
渲染 OpenGL WebGPU (wgpu) Three.js / WebGL QPainter (软件)
二进制大小 ~300MB+ ~12MB npm包 Python依赖
浏览器运行 ✅ WASM+WebGPU ✅ WebGL
PyMOL命令兼容 原生 99% ❌ 自有API 部分类似
内存安全 C核心有风险 Rust保证 Rust保证 Python保证
大规模原子 GPU impostor 1M+ @ 60fps 小分子为主
插件系统 Python Rust dylib + Python Python
模块化crate ❌ 单体 ✅ 15个独立crate 部分
光线追踪 内置CPU GPU插件 软件离线

Patinae的独特定位是:唯一一个同时具备PyMOL命令兼容性、WebGPU渲染、浏览器运行能力和12MB单文件大小的工具。megane在浏览器和大规模原子方面更强(1M+ atoms @ 60fps),但不兼容PyMOL命令。PyChem-Pro是纯Python教学工具,不适合高性能场景。

💡对结构生物学工作流的启示

1. 浏览器原生分子可视化不再是妥协

过去在浏览器里看分子意味着要么用静态图片,要么用基于WebGL的简化查看器(如3Dmol.js/NGL)。Patinae的WASM+WebGPU方案意味着你可以获得接近原生的渲染质量——GPU impostor着色器、多光源Phong、SSAO——全部在浏览器里。这对论文supplementary、教学平台、协作工具的意义是巨大的。

2. Rust crate模型改变了分子软件的复用方式

传统上,分子可视化工具是单体应用——你要么用整个PyMOL,要么不用。Patinae的crate模型意味着你可以只拿走你需要的部分:在Rust pipeline里用patinae-io解析mmCIF,用patinae-select做原子选择,用patinae-algos做Kabsch对齐——不需要GUI,不需要渲染器。这和Python生态中RDKit的"库优先"哲学一致,但带到了Rust和GPU渲染的世界。

3. 12MB意味着可嵌入

12MB的单文件大小意味着Patinae可以嵌入到任何地方——Docker镜像、CI pipeline、教学容器、甚至其他应用的内置查看器。不需要安装Python运行时,不需要conda环境,不需要apt-get install。这对HPC环境(通常没有root权限)和教学环境(学生不需要配置环境)特别有价值。

4. 命令兼容性是迁移的关键

Patinae最聪明的决策是保持99%的PyMOL命令兼容。结构生物学领域有数十年积累的.pml脚本和PyMOL工作流。如果要求用户学习全新的命令语言,迁移成本会阻止采用。Patinae让你带着现有的脚本和肌肉记忆迁移——这是一个降低门槛的工程决策,不是技术妥协。

📄项目信息

📄 Patinae (原 PyMOL-RS)

仓库:github.com/zmactep/pymol-rs

网站:zmactep.github.io/pymol-rs

许可证:BSD 3-Clause

语言:Rust (核心), Python (绑定), TypeScript (web viewer)

版本:v0.4.3

二进制大小:~12MB(单文件可执行)

快速开始:

# 下载预编译二进制 patinae protein.pdb # Python包 pip install patinae # 从源码构建 git clone https://github.com/zmactep/pymol-rs cd pymol-rs && make patinae ./target/release/patinae # Web viewer npm install @patinae/viewer
一句话总结:Patinae不是"用Rust重写的PyMOL"——它是一个现代分子可视化平台:12MB单文件、WebGPU渲染、三栖部署(桌面/Python/浏览器)、15个独立crate、99% PyMOL命令兼容。它证明了25年后,Warren DeLano的开源精神可以在Rust和WebGPU的时代继续传承。