pymatgen:分子碎片与开环模型
实际切断六种分子的成键图,比较唯一碎片、环键和UFF开环初始模型。
阅读本篇目录
想为断键、反应或碎片能量计算准备候选,可以先切分分子的成键图,再为需要的碎片指定电荷、自旋和量化计算。本篇演示的是这一步的几何与拓扑准备。
unzip pymatgen-molecule-tools-wave712-*.zip
cd pymatgen-molecule-tools
bash prepare.sh
bash run.sh
bash plot.sh
使用pymatgen2026.9.24、Python3.11和个人目录OpenBabel3.1.0。六种分子的输入来自实际GFN2优化,准备方法见成键图与官能团。

1. 从乙醇开始#
bash python.sh - <<'PY'
from pymatgen.core import Molecule
from pymatgen.analysis.fragmenter import Fragmenter
m = Molecule.from_file('inputs/ethanol.xyz')
fragments = Fragmenter(m, depth=1, open_rings=False)
print('唯一碎片数:', fragments.total_unique_fragments)
for label, group in fragments.unique_frag_dict.items():
print(label, len(group))
PY
depth=1演示一次断键层级;open_rings=False先不打开环。程序通过图同构合并相同连接的碎片,所以唯一碎片数不等于键数,也不等于把每次切分的两半直接累加。
2. 实际得到多少碎片#
| 母分子 | 单次断键、不开环的唯一碎片数 |
|---|---|
| 乙醇 | 8 |
| 水 | 2 |
| 二甲醚 | 4 |
| 苯 | 2 |
| 乙腈 | 6 |
| 甲酸 | 7 |
cat reference-data/Molecule-single-cut-fragments.csv
ls reference-structures/*fragment*.json
JSON保留MoleculeGraph及坐标。标签如C2 H5 O1 E7包含元素计数和边数,同一标签下还可能有不同连接的图;不能只按这个短标签去重或判断化学相同。
3. 苯为什么不开环时只有两个碎片#
切断苯的一条环内C–C连接后,其他路径仍把整个图连在一起,不会分成两个独立连通分量。切C–H则可得到C₆H₅与H,等价位置通过图去重后只留下两类碎片。
需要开环初始模型时,显式运行:
bash python.sh - <<'PY'
from pymatgen.core import Molecule
from pymatgen.analysis.fragmenter import Fragmenter
m = Molecule.from_file('inputs/benzene.xyz')
fragments = Fragmenter(m, depth=1, open_rings=True, opt_steps=100)
print(fragments.total_unique_fragments)
PY
本例得到3个唯一图,比不开环多一个C₆H₆开环图。其原子数和组成保持,连接由12条变为11条,配套程序保存了实际UFF处理后的模型。
cat reference-structures/benzene-open-ring-UFF.xyz
opt_steps=100是这里辅助UFF几何处理的步数。开环模型没有经过DFT优化,不代表过渡态、反应路径或势垒;这些问题需要另外采用适合的方法。
4. 把碎片变成能量计算输入#
先选择要研究的反应通道,再明确每个碎片的组成、电荷、自旋多重度和结构优化条件。图切分没有自动给出这些状态的正确量化能量。
同一母分子可以有中性均裂或带电异裂通道,不能把不同通道的能量混在一起。本例保存的拓扑候选主要用于文件准备和筛选;真正计算断键能可接着看实际水分子断键能。
5. 换自己的分子#
先检查建图是否合理,再选择深度与是否开环。深度增加会迅速增加候选和去重工作量,优先从小深度和明确的键开始。离子、金属配位和特殊键型还需要适用的建图策略。
参考结果在reference-data和reference-structures,自己运行的输出在analysis和results;重画图片用bash plot.sh。接口见pymatgen Fragmenter。