pymatgen:分子成键图与官能团
用六种实际分子几何识别成键、杂原子和官能团原子集合,理解图标签与化学性质的区别。
阅读本篇目录
分子XYZ保存元素和坐标,通常不直接保存化学键。做官能团或碎片分析前,先检查程序由几何识别出了哪些连接。
本例复用实际乙醇、水分子几何,并在鸢算科技集群用xTB6.7.1、GFN2、--opt tight --acc 0.1实际优化二甲醚、苯、乙腈和甲酸。后处理使用pymatgen2026.9.24,分析六个分子的成键图和官能团原子集合,不把图识别结果当作新的量化能量。
unzip pymatgen-molecule-tools-wave712-*.zip
cd pymatgen-molecule-tools
bash results.sh
bash plot.sh

1. 在个人目录准备依赖#
module load pymatgen/2026.9.24
bash prepare.sh
环境为Python3.11、NumPy/SciPy、NetworkX、Matplotlib和pymatgen。几何成键使用OpenBabel3.1.0,由社区预编译包openbabel-wheel3.1.1.22提供。prepare.sh按固定wheel哈希写入当前目录的toolchain/python,不向公共Python环境安装。
之后用随包python.sh调用这个个人依赖。已有实际结构,执行下面的分析不会重新跑GFN2优化:
bash run.sh
ls analysis
ls results
2. 先看输入和原子顺序#
inputs/ethanol.xyz:
9
energy: -11.391867310820 gnorm: 0.000299419718 xtb: 6.7.1 (edcfbbe)
C 1.17784801515601 -0.40510999568080 -0.00000000123948
C -0.00334370518500 0.55304603376793 -0.00000000342139
O -1.19421126728805 -0.20645321724354 0.00000000429925
H -1.95104546120814 0.38770866536088 0.00000000693101
H 0.03869188425904 1.19716762052906 0.89093357695092
H 0.03869187939527 1.19716761632670 -0.89093358681782
H 2.11045230827543 0.15200225770504 0.00000001134330
H 1.13629716646230 -1.03862249390825 0.88157637899625
H 1.13629718013315 -1.03862248685702 -0.88157638704205
XYZ中的坐标单位Å,图和Python接口的原子编号从0开始。后续出现{2,3}这样的集合,是对应文件中的原子序号;换结构或重新排序后不能照抄。
3. 提取官能团#
bash python.sh - <<'PY'
from pymatgen.core import Molecule
from pymatgen.analysis.functional_groups import FunctionalGroupExtractor
m = Molecule.from_file('inputs/ethanol.xyz')
extractor = FunctionalGroupExtractor(m, optimize=False)
groups = extractor.get_all_functional_groups()
print('杂原子:', extractor.get_heteroatoms())
print('特殊碳:', extractor.get_special_carbon())
print('原子集合:', groups)
print(extractor.categorize_functional_groups(groups))
PY
optimize=False保留输入坐标,不在识别时自动补氢或改构型。本例乙醇的杂原子为0起算的O位点2;羟基集合为{2,3},另识别出一个甲基集合。二甲醚则有两个甲基集合,乙腈识别出含C≡N的集合,甲酸的含氧部分与连接原子组成一组。
输出中的[OH]、[CH3]等是提取子图的SMILES标签,不表示母分子实际带有相应自由基或电荷。电子态仍应由完整分子的量化计算确定。
4. 苯环为什么单独设置#
groups = extractor.get_all_functional_groups(catch_basic=False)
这行是可选参数示意;分析苯时先把m换成inputs/benzene.xyz并重新建立提取器。本例苯采用catch_basic=False,避免基本环集合与已经识别出的芳香集合重叠。原生算法可能返回重叠原子集合,不能直接把集合条数当作唯一的化学官能团数。
5. 检查实际成键#
cat reference-data/Molecule-tool-summary.csv
cat reference-data/Molecule-functional-groups.csv
cat reference-data/Molecule-bonds.csv
| 分子 | 原子数 | 连接边数 |
|---|---|---|
| 乙醇 | 9 | 8 |
| 水 | 3 | 2 |
| 二甲醚 | 9 | 8 |
| 苯 | 12 | 12 |
| 乙腈 | 6 | 5 |
| 甲酸 | 5 | 4 |
这里一条边表示一对原子连接,三键不会被计作三条独立边。图为三维结构的主轴投影,便于看连接和编号;精确键长、键角仍应从三维坐标读取。
换自己的分子时,先检查氢是否完整、坐标单位和成键结果。金属配位、离子体系或特殊键型需要适用的建图策略,不能只依赖默认距离感知。
继续阅读分子匹配与去重和碎片与开环。接口见pymatgen官能团模块。