MDAnalysis专题

MDAnalysis蛋白轨迹路径比较

实际比较Hausdorff与离散Fréchet路径距离,使用共同参考对齐、原生PSAnalysis和完整距离矩阵。

更新于 2026-11-08约 4 分钟阅读按任务与环境选择适用配置
阅读本篇目录

两条轨迹经过相近构象,不一定按相同顺序经过。Hausdorff距离比较“到过哪些构象”,离散Fréchet距离还考虑访问顺序。本例使用集群已有泛素轨迹的51帧、每帧76个Cα原子,先统一对齐同一参考结构,再做路径比较。

1 下载、运行和看图#

下载水分子动力学与蛋白路径比较完整示例,保存为water-paths.zip。该包使用MDAnalysis 2.9.0,独立扩展waterdynamics 1.2.0和PathSimAnalysis 1.2.1;两项扩展只安装在示例目录的.deps中。

python3 -m zipfile -e water-paths.zip .
cd mdanalysis-water-paths
bash setup.sh
bash run.sh
bash verify.sh
bash plot.sh

results/FULL-FIELDS.npz是完整数值,results/VALIDATION.json列出逐项核对,plots/保存4张图片。脚本发现已有同名输出目录会停止,第二次运行可以用bash run.sh --output results-new指定新目录;不要把旧结果当成新轨迹。

compact-inputs/protein-paths.npz保存共同参考坐标。比较4条路径:完整51帧、前26帧、后26帧、完整路径倒序。前后半段共享中间帧;倒序只是相同坐标的顺序对照,不是又跑了一条逆时间MD。

2 直接调用路径距离#

source env.sh
"$YS_PY" - <<'PYCODE'
import numpy as np
import pathsimanalysis as psa
x = np.load('compact-inputs/protein-paths.npz')['positions_A'].astype(float)
print('full vs reversed Hausdorff:', psa.hausdorff(x, x[::-1]))
print('full vs reversed Frechet:', psa.discrete_frechet(x, x[::-1]))
print('first vs second Hausdorff:', psa.hausdorff(x[:26], x[25:]))
print('first vs second Frechet:', psa.discrete_frechet(x[:26], x[25:]))
PYCODE

本例距离单位为Å,每一对构象用全部76个Cα的均方根距离,不再逐对重新最优拟合:

比较 Hausdorff / Å 离散Fréchet / Å
完整路径与倒序 0 1.113112
前半与后半 0.806516 0.855143

完整与倒序经过同一组构象,所以Hausdorff为0;Fréchet仍可区分访问顺序。数值越大只代表此坐标定义下的几何差异越大,不直接等于能垒、自由能差或动力学速率。

3 多条轨迹用PSAnalysis组织#

配套脚本写出真实Cα坐标的PDB/DCD,并实际运行以下流程:

analysis = psa.PSAnalysis(
    universes, select='all', path_select='all', labels=labels,
    targetdir='results/psa'
)
analysis.generate_paths(align=False, save=True, store=True)
analysis.paths = [p.astype(np.float64) for p in analysis.paths]
analysis.run(metric='hausdorff')
hausdorff_matrix = analysis.D.copy()
analysis.run(metric='discrete_frechet')
frechet_matrix = analysis.D.copy()

这里align=False是因为全部轨迹已用同一参考对齐;不是建议跳过结构对齐。显式转换为双精度只改变计算精度,每个坐标值保持不变,避免Fréchet动态规划继续使用默认单精度。自己的轨迹若未统一对齐,应先选相同原子、相同顺序、相同参考,不能对每一对构象各用不同参考后再宣称距离具有同一几何含义。

source env.sh
"$YS_PY" - <<'PYCODE'
import numpy as np
f = np.load('results/FULL-FIELDS.npz')
print('Hausdorff matrix:')
print(f['path_hausdorff_A'])
print('Frechet matrix:')
print(f['path_discrete_frechet_A'])
np.savetxt('path-hausdorff.dat', f['path_hausdorff_A'])
np.savetxt('path-frechet.dat', f['path_discrete_frechet_A'])
PYCODE

两类完整路径距离矩阵与实际泛素Cα结构

4 平均距离和最近邻帧#

包中还实际运行hausdorff_avg、hausdorff_wavg和hausdorff_neighbors。前两项是最近邻距离的平均变体,会减弱单个极端构象的作用,但不满足真正距离度量的全部性质;不要与取最大值的标准Hausdorff混用。hausdorff_neighbors给出两个方向每个构象对应的最近帧,适合找出两条路径在哪一段分开。

所有4×4矩阵均保存在FULL-FIELDS.npz,最近邻索引和距离也完整保留。这里的51帧来自短时间轨迹,路径不同不等于已发现两个稳定态,更不能据此宣称构象空间采样收敛。

参考:PathSimAnalysis原生API。

需要根据你的体系选择资源?联系讨论计算需求。实际可用软件与权限,以当前账户和运行环境为准。

查看配图

放大后可滚动查看细节,按 Esc 关闭。

100%查看原图 ↗