pymol
分子動力学法

Pymolでトラジェクトリの最初の構造を取り除く方法

はじめに:PymolでのMDトラジェクトリの読み込み

これは,銀すみ先生の記事に述べられている通りに実行すれば簡単に行うことができます。しかしながら,最初に読み込んだ構造が残ってしまいます。

Pymolではそもそも,PymolWikiに述べられている通り,stateとしてトラジェクトリをロードしています。stateを操作する関係のコマンドをみると,split_stateのようなそれらしいものがありますが,これはNMR向けのコマンドで残念ながら,今回の目的には沿いません。

こういったことを念頭に置き,Pymolでトラジェクトリの最初の構造を取り除く方法を調べてみました。その結果,次のような方法が考えられることがわかりました。
1. <ベストプラクティス> stateオプション
2. <堅実> 一枚目切り出し
3. <ゴリ押し> createコマンド

1. <ベストプラクティス> stateオプション

今回の調査でベストプラクティスとなったのは,load_trajコマンドを実行するとき,state=1とすることです。

load ayase.pdb
load_traj traj.trj, ayase.pdb, state = 1

wikiの関連箇所を抜き出しますと,

USAGE
load_traj filename [,object [,state [,format [,interval [,average ]
[,start [,stop [,max [,selection [,image [,shift
[, plugin ]
]]]]]]]]]

ARGUMENTS
filename = str: trajectory file path
object = str: name of the molecular object where the trajectory should be appended as states {default: guess from filename}
state = int: object state where to start appending states. To discard the currently loaded coordinates, use state=1. To append new states, use state=0 {default: 0}
format = str: specify file type instead of guessing from file extension (only affects AMBER .trj format, use "plugin" argument for Molfile Plugin types) {default: }

state=1のとき現在読み込んでいる座標を破棄しますとあります。これで目標達成です。ちなみに,load_trajではなく,loadでも同じ挙動になるようです。

2. <堅実> 一枚目切り出し

こちらは,堅実に,最初に読み込む構造を,トラジェクトリの最初のスナップショットから切り取ったものにするという方法です。一見ひと手間多いように見えますが,トラジェクトリの変換は必要になる工程であるので,そのスクリプトに埋め込むことで,自動化することができると思います。銀すみ先生の記事に大体の方法は書かれています。

3. <ゴリ押し> createコマンド

最後に,「state=1 するの忘れた!読み込み直さずどうしても一枚目を消したい!」という場合に使えるかもしれないゴリ押しの方法です。使うのはcreateコマンドです。詳細はwikiを参照していただき,使い方を抜き出すと,こんな感じです。

create name, (selection) [,source_state [,target_state ] ]

create name = (selection) [,source_state [,target_state ] ] # (DEPRECATED)
name = object to create (or modify)
selection = atoms to include in the new object
source_state (default: 0 - copy all states)
target_state (default: 0)

発想としては,source_statetarget_stateを使って全てのスナップショットを一枚ずつずらしていくというものです。そのためのpymolスクリプトは,例えばこんな感じのものを用意します。

del_first.py
from pymol import cmd

first = 2
last  = 100
gro = 'nowat'
for s in range(first, last):
    cmd.create('new'+ gro, gro, s, s - 1)

これで,最初のstateをdeleteすることができると思います。

まとめ

3つの方法を提案してみましたが,基本的には方法1と方法2が良いのかなと思います。方法3については,細かい挙動など不明なので,調査し次第書き加えたいと思います。
また,他にも良い方法ご存知でしたらぜひ教えて頂きたいと思います。