|
|
我之前也找了好久怎么转换,后面发现MDAnalysis包非常方便。下面是我写的代码,记得在有MDAnalysis的环境中运行:
- #!/usr/bin/env python
- """
- Amber转Gromacs极简脚本
- """
- import MDAnalysis as mda
- import sys
- def convert_amber_to_gmx(prmtop, nc_traj, output_prefix="system"):
- """
- 最简单的转换函数
- """
- print(f"转换: {prmtop} + {nc_traj} -> {output_prefix}.{{gro,xtc}}")
-
- # 1. 加载文件
- print("加载Amber文件...")
- u = mda.Universe(prmtop, nc_traj)
-
- print(f" 原子数: {len(u.atoms):,}")
- print(f" 残基数: {len(u.residues):,}")
- print(f" 轨迹帧数: {len(u.trajectory):,}")
-
- # 2. 保存第一帧为gro
- print("保存结构文件...")
- u.trajectory[0] # 跳转到第一帧
- u.atoms.write(f"{output_prefix}.gro")
- print(f" ✓ {output_prefix}.gro")
-
- # 3. 保存轨迹为xtc
- print("转换轨迹文件...")
- with mda.Writer(f"{output_prefix}.xtc", u.atoms.n_atoms) as W:
- for i, ts in enumerate(u.trajectory):
- W.write(u.atoms)
- if i % 100 == 0:
- print(f" 已处理 {i+1}/{len(u.trajectory)} 帧")
-
- print(f" ✓ {output_prefix}.xtc")
- print("转换完成!")
-
- return f"{output_prefix}.gro", f"{output_prefix}.xtc"
- # 命令行接口
- if __name__ == "__main__":
- if len(sys.argv) < 3:
- print("用法: python amber2gmx.py amber.prmtop trajectory.nc [output_prefix]")
- print("示例: python amber2gmx.py system.prmtop md.nc system")
- sys.exit(1)
-
- prmtop_file = sys.argv[1]
- nc_file = sys.argv[2]
- output = sys.argv[3] if len(sys.argv) > 3 else "system"
-
- convert_amber_to_gmx(prmtop_file, nc_file, output)
复制代码 |
|