MDAnalysis自定义分析与双进程运行
用原生AnalysisFromFunction计算质量质心和回转半径,比较串行与两个工作进程的完整字段及帧序。
阅读本篇目录
已有分析模块不能直接表达自己的逐帧量时,可以把函数交给 AnalysisFromFunction,使用MDAnalysis统一的轨迹切片、结果保存和并行框架。本篇用质量质心与回转半径平方,演示一套完整操作。
下载完整真实轨迹、拓扑、分析脚本和数据图包,先按平均结构篇的共用步骤运行一次,本篇读取同一批结果,不重复提交。
1. 先写清楚函数的输出#
import numpy as np
from MDAnalysis.analysis.base import AnalysisFromFunction
def moments(atoms):
x=np.asarray(atoms.positions,float)
m=np.asarray(atoms.masses,float)
center=m@x/m.sum()
rg2=np.sum(m*np.sum((x-center)**2,axis=1))/m.sum()
return np.r_[center,rg2]
每帧返回4列:质心x/y/z,单位Å;以及质量权回转半径平方,单位Ų。回转半径本身应对第四列开平方,不应把Rg²标成Å。质量来自已核对的GROMACS原生导出数据,分析前已按真实键使蛋白完整。
2. 原生串行与双进程调用#
serial=AnalysisFromFunction(moments,u.atoms).run(backend='serial')
parallel=AnalysisFromFunction(moments,u.atoms).run(
backend='multiprocessing',n_workers=2,n_parts=2)
values=parallel.results.timeseries
frames=parallel.results.frames
times=parallel.results.times
在可独立运行的Python脚本中,把启动分析的主流程放进 if __name__=='__main__':。函数应定义在可导入的模块顶层,避免把无法序列化的临时对象或文件句柄传给工作进程。
本例最多两个工作进程,使用已分配的CPU资源。环境没有安装Dask,本包不启动Dask后端;不能把multiprocessing结果说成所有后端都已运行。
3. 不只比较平均值#
本例比较51帧×4列的全部字段,同时检查返回的帧号0—50和实际时间0—100ps顺序。这里的帧号属于抽样后的内存轨迹,原始保存帧0、20至1000另存在 original_saved_frames 中。
串行与双进程结果逐字段一致,并与原始坐标的独立质量加权计算对应。这个小例子不用于报告一般性能加速比;轨迹读取、任务划分和序列化可能使小任务的并行反而不划算。

4. 在终端导出结果#
export PATH="/public/toolkit/miniconda3/envs/qvasp-2.26/bin:$PATH"
python - <<'PYDATA'
import numpy as np
x=np.load('analysis-fields.npz')
v=x['multiprocessing_moments'].copy()
v[:,3]=np.sqrt(v[:,3])
np.savetxt('protein-moments.csv',np.column_stack([x['multiprocessing_times_ps'],v]),delimiter=',',header='time_ps,COM_x_A,COM_y_A,COM_z_A,Rg_A',comments='')
print('全部字段最大串并行差:',abs(x['serial_moments']-x['multiprocessing_moments']).max())
PYDATA
head -n 5 protein-moments.csv
已有数组只需 python plot.py 重画,不必重复跑分析。扩展自己的函数前,先明确每列单位、拓扑与PBC处理,再确认函数可逐帧独立计算;需要历史帧状态或不可拆分积分的算法,不应直接照搬这个并行模板。参考MDAnalysis2.9分析框架。
按分析目标选择教程#
| 目标 | 已有实操作用入口 |
|---|---|
| 读取、选区、PBC与RMS | 输入与几何、距离与接触 |
| 平均结构与质量权对齐 | 平均结构与迭代参考 |
| RDF、氢键、MSD | RDF与氢键扩散操作、水的配对距离和介电 |
| 氢键持续、取向与水桥 | 水的关联、WaterBridgeAnalysis |
| 三维/线密度 | 三维水密度、固定盒线密度 |
| 蛋白二级结构、二面角与内坐标 | DSSP与二面角、BAT与HELANAL |
| 蛋白接触、GNM与PCA | 基础网络与PCA、全原子接触残基网络 |
| 膜与孔道 | 膜叶识别、HOLE实际轮廓 |
| RNA几何 | 碱基配对距离、RNA构象量 |
| 聚合物 | 链与持续长度 |
| 路径、集合与降维 | 路径相似、集合比较、SPE嵌入、扩散映射与独立求解 |
各篇针对实际版本和数据解释适用范围,不把一个模块的一个例子外推成所有参数和可选依赖都已运行。当前扩散映射原生特征向量需要按该篇核对,配套独立求解单独标记;旧的legacy X3DNA接口需要额外的外部程序,本专题尚未提供该旧接口的实算,核酸几何可先用已展示的nucleicacids/nuclinfo操作。