AMBER 用 ソフトウェア開発
概要
- AMBER による MD 計算解析プログラム開発のための Tips
NetCDF タイプのトラジェクトリの読み込み
概要
- AMBER のトラジェクトリファイルにはテキストベースの .mdcrd とバイナリベースの .nc が存在する
- .nc は NetCDF というフォーマットなので、そのフォーマットに従えば、どんなプログラムでも利用できる (ソフトウェア独自でないため、プログラムの開発や管理がしやすい; テキストベースだと AMBER のバージョンによって微妙に異なることがある)
- 詳しくは Wikipedia を参照 (https://ja.wikipedia.org/wiki/NetCDF)
- .nc はサイズが .mdcrd に比べて小さく、高速に読み書きできるようだ。
- この .nc ファイルを読み込めるプログラムを開発するための方法を紹介する
方法
- Python には NetCDF を読み込むためのモジュールがあるので、それを利用する
- netcdf モジュールのインストール
- Python 2.x
$ sudo apt-get install python-netcdf4
- Python 3.x
$ sudo apt-get install python3-netcdf4
- コード (Python 3.x) (hoge.nc を読み込む場合)
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import netCDF4 nc = netCDF4.Dataset("hoge.nc", "r") # トラジェクトリ内のフレーム数取得 frame = len(nc.dimensions["frame"]) print(frame) # 1フレームあたりの総原子数取得 atom = len(nc.dimensions["atom"]) print(atom) # frame 0 (最初のフレーム) の時間 (ps) time_ps = nc.variables["time"]["0"] print(time_ps) # frame 1 (2フレーム目) の全原子の座標 coord_frame = nc.variables["coordinates"][1] print(coord_frame) # frame 1 (2フレーム目) の 10 番目の原子の座標 coord_atom10 = nc.variables["coordinates"][1][9] print(coord_atom10) # frame 1 (2フレーム目) のセルサイズ cell_length = nc.variables["cell_lengths"][1] nc.close()
- 与える引数は
- 第一引数は「文字列型」で与える
- 第二引数以降は、int 型で与える (スライスによる範囲でデータを取得することも可能)
- 座標は Numpy の配列形式で返ってくる (リストにしたいなら .tolist() メソッドを使うと良い)
- 取得可能なデータ、返ってくる型は、参考サイトの nctaj.pdf の Example にあるデータを参照
- 対象のトラジェクトリに記述されているデータは
ncdump -h hoge.nc
で調べることができる (Example にあっても、計算条件で入れていないデータは入っていない; 私の場合、velocities は入っていなかった)
- 参考サイト
- Python で netcdf を読み込む方法
- AMBER の nc ファイルの仕様 AMBER File Specifications
Tips
- AMBER の NetCDF の座標データなどは Numpy の配列データなので、Numpy についての知識があると便利かもしれない。
- Netcdf はピンポイントでデータを取得できるため、mdcrd に比べて高速に処理できる。
- mdcrd はフレーム間の区切り文字や特徴がないため、次のフレームまでデータ数をカウント。フレームあたりの全原子数分読み込まないと、フレームの終わりがわからないため、全データを読み込む必要がある。