🤖

PyMOLコマンドの作り方

2024/11/20に公開

PyMOLはPythonで動いているので、PyMOLのコマンドラインからPythonのコードを実行することができます。
慣れていない方はGUIの方が操作しやすいと思いますが、慣れたらコマンドの方が使いやすくなる方もいます。  
デフォルトで定義されているコマンド以外も使えたりすると地味に便利なので、作り方をメモしておきます。

PythonのコードとPyMOLのコマンドの違い

前述の通り、PyMOLはPythonで動いているのでPyMOLのコマンドラインからPythonのコードを実行できます。  
例えば、

print('Hello')

をコマンドラインで実行するとHelloが出力されます。  
Pythonなので、

function(arg1, arg2, ...)

の形式となっているはずです。  
一方、PyMOLのコマンドはというと

show surface

のように()が省略されています。関数の定義の仕方によっては、stringsを表す''も省略することができます。  
コードを書く側としては面倒ですが(笑)、コマンドを使う側としては地味に便利な部分です。

cmd.extend('function_name', function)について

cmd functionはPyMOLのライブラリにデフォルトで入っている関数で、PyMOLの色んな動作や機能はこの辺に格納されています。  
cmd.extendはPythonの関数をPyMOLのコマンドに変換する関数です。function_nameはデフォルトのPyMOLコマンドと重複しないようにする必要があります。
慣れるまでは引数の書き方だけ違和感があるかもしれません。例えばpythonでは、

def test(arg1, arg2, arg3):
    ...
cmd.extend('test', test)

のように引数を設定しますが、実際に使うPyMOLのコマンドは

test arg1, arg2, arg3

となります。何を言ってるかよくわからないですが、その場合はあまり気にしなくても大丈夫です。

オリジナルコマンドの例

例として下記の関数を定義したファイルを作ってPyMOLで実行してみます。まずは下記のようなPythonスクリプトを用意します。

testcall.py
def testcall(text):
    print(text)
cmd.extend('testcall', testcall)

次にtestcall.pyと同じディレクトリでPyMOLを起動し、PyMOLのコマンドラインでtestcall.pyを実行します。

run testcall.py

testcall.pyを読み込めたら、コマンドを実行してみましょう。

testcall This is a test for PyMOL
#This is a test for PyMOL

pythonのprint関数と同様に文章を出力できたと思います。print関数で必要な()''を省略できるので、地味に便利です。
また、Pythonと同様に、定義しておいた難しい関数をシンプルなコマンドで動かすことができます。

オブジェクトを操作してみる

下記のスクリプトを保存して、同じディレクトリでPyMOLを起動してください。

chain_colors.py
def cc():
    util.color_chains("(enabled and name CA)", _self=cmd)
cmd.extend('cc',cc)

PyMOLのコマンドラインで次のコマンドを実行してください。

PyMOL
fetch 8OIZ
run chain_color.py
cc

8OIZはMolecular GlueであるPomalidomideを介したCRBN-DDB1の三者複合体の構造です。chainごとにカラーリングが変わったと思います。  
これはGUIで8OIZのオブジェクトでcolor by chainを実行するのと同じスクリプトです。  
自分がよく使う一連の処理を定義しておくと、とても便利です。

Discussion