bioinformatics
pymol
分子動力学法

macOS/CentOS 7へのオープンソース版PyMOLのインストール方法

PyMOLはプラグイン機能が非常に強力で、様々な追加機能をインストールすることが可能です。この機能はPyMOLのPluginというメニューから利用することができます。

2017年9月にPyMOL 2.0がリリースされました。これと同時にWindows, macOS ,Linux用の最新版バイナリPyMOLも配布されるようになり、ver.0.99までの古いバイナリしか持てなかった人々は歓喜しました。また2018年3月19日からはPyMOL ver.2.1のソースコード公開も再開し、「Unofficialながらもソースコードからのビルド&インストールしたい方はこれでどうぞ」ということが可能になりました。バイナリも引き続き配布を続けるようです。

ソースコード版はバイナリ版と違ってインストールが難しい代わりに、ライセンス認証が(現在のところ)永続的に不必要となり、かつ自由にソースをいじれるなので、玄人向けと言えるでしょう。ここではソースコード版からのインストール方法を記します。

2018年7月31日追記: PyMOL 2.2がリリースされました。ソースコードの公開はこれまでのsourceforgeからGitHubに移りました。
2018年8月9日追記: オープンソースPyMOL 2.2をmacOS Homebrewで一発インストールする方法を追記しました。

環境

また、Homebrewで入れたものを優先的に使うよう、~/.bash_profile(or ~/.bashrc)などの設定ファイルにHomebrewのパッケージの優先度を上げるための

export PATH="/usr/local/bin:$PATH"

を追記しておきます。

概要

PyMOL 2以降ではlegacyで時代遅れなpython2がなくても動作するようになったようです。よって現行のPython 3.7のみで動作させることができるようです(追記:……なんですけど、プラグインはPython 2系の文法で書いてあることが多いので動かないものもままあります。やはりPython 2.7を使うべきだったか……?)。またGUIインターフェースとしてこれまでtcl-tkを使っていたようでしたが、これもPyQt(ぱいきゅーと)5などのきれいなインタフェースを利用できるようになりました。

ただしlegacyプラグインなどを使う場合は時々tcl-tkを使う必要があったり、相変わらずPyMOLはたくさんのプログラム依存の上に成り立っているため、少なくとも以下のプログラムをインストールしておく必要があります。

  • C++11 compiler (e.g. gcc 4.4+)
  • Python 2.6+
  • Tcl/Tk (via tkinter)
  • Pmw (Python Megawidgets)
  • OpenGL
  • GLEW
  • GLUT (freeglut)
  • libpng
  • freetype
  • glm (OpenGL Mathematics) (※ver. 2.2以降で必須)
  • libxml2 (optional, for COLLADA export, disable with --no-libxml)
  • msgpack-c 1.0+ (optional, for fast MMTF loading, disable with --use-msgpackc=no)
  • PyQt5, PyQt4, or PySide (optional, will fall back to Tk interface)
  • simplemmtf (optional, for MMTF export)

を用意しておく必要があります。optionalとついているものは無くても動作しますが、今回はlibxml2とPyQt5を使用してインストールを試みます。mmtfってのはpdbの最新式バイナリ型PDBファイルで、ものすごくファイルサイズを圧縮できるのが特徴です( https://mmtf.rcsb.org/index.html )。PyMOL 2.2からmmtf形式へのエクスポートにも対応したようです。興味がある方はこれも入れてインストールしてみましょう。

macOSのHomebrewで一発インストールする

2018年8月9日に私がインストール用のHomebrew Formulaのpymol.rb を作成し、その後、brewsci/homebrew-bioに登録してもらいました。これにより、非常に簡単にインストールすることができます。
やり方は、最新版のXquartzをインストールしておいた状態で、

brew tap brewsci/bio
brew install pymol

5分くらいかかりますが、これで一発でインストールすることが可能だと思われます。たぶん。
終わったら、ターミナルを開いて

pymol #または /usr/local/bin/pymol

でオープンソース版pymolが立ち上がります。このときターミナルにメッセージが流れるのが煩わしいと感じる場合は

pymol > /dev/null 2>&1 &

で開くのも良いでしょう。

この記事のここ以下に書かれているのは、このpymol.rbでやっている実際の処理内容とその詳細な手順です。

Homebrewを使ったPython3.7, libxml2のインストール

まずHomebrewを使って必要なソフトウェアを入れていきます。

brew tap homebrew/core
brew tap homebrew/science

たぶんhomebrew/corehomebrew/scienceはtap済みであることがほとんどだと思いますが念のため。

また、Homebrewで入れたものを優先的に使うよう、~/.bash_profile(or ~/.bashrc)などの設定ファイルにHomebrewのパッケージの優先度を上げるための

export PATH="/usr/local/bin:$PATH"

を追記してターミナルを再起動します。

さて、ここから順にインストールしていきます。

Python 3.7のインストール(/usr/local/bin/python3.7が存在しない場合)

まずはPython 3.7をインストールします(現行は3.7.0)……が、先にmacOSを使っている方でwhich python3.7と打ってみたときに/usr/local/bin/python3.7と表示されたときには要注意です。すでに他の方法で/usr/local/bin/以下にpython3.7がインストールされている可能性があります。例えば、Python公式のウェブサイトが配布しているPython3インストーラーを使っている場合などです。これについては後述します。
続いて、

ls -la /usr/local/bin/python3.7

と打ってみたときに何も表示されないか、または

lrwxr-xr-x  1 Agsmith  admin  38  7 25 19:44 /usr/local/bin/python3.7 -> ../Cellar/python/3.7.0/bin/python3.7

という風にCellar以下のpythonが表示された場合は問題ありません。CellarのものはHomebrewですでにインストールされていることを表しています。もし、ここでそれ以外の結果、例えば/Library/Frameworks/~~と続くPATHが表示された場合には、これから使おうとするPython3.7はHomebrewでインストールしたPython3.7ではありません。その場合は別の方策を考える必要があります(後述)。

brew install python3

終わったら一度ターミナルを落として再起動させてからpip3 install --upgrade pip setuptools wheelを入力し、後で使うpip3をアップグレードしておきます。

終わったら、以下のコマンドを入力して、/usr/local/bin/python3.7 の実体を確認しておきます。

$ ls -lt `which python3.7`
lrwxr-xr-x  1 Agsmith  admin  38  7 25 19:44 /usr/local/bin/python3.7 -> ../Cellar/python/3.7.0/bin/python3.7
$ ls -lt `which pip3.7`
lrwxr-xr-x  1 Agsmith  admin  35  7 25 19:44 /usr/local/bin/pip3.7 -> ../Cellar/python/3.7.0/bin/pip3.7

ここで、ともに-> ../Cellar/python/3.X.X の文字が見えれば成功です。/usr/local/bin/python3.7のコマンドが、HomebrewでインストールしたCellar以下のディレクトリに存在する本体に結びついていることがわかります。

これを確認したらlibxml2のインストールに進みます。

/usr/local/bin/python3.7がすでに存在している環境の場合

もし

$ ls -lt `which python3.7`
lrwxr-xr-x  1 Agsmith  admin  35  7 25 19:44 /usr/local/bin/pip3.7 -> /Library/Frameworks/Python.framework/Versions~

というふうに、which python3.7(とwhich pip3.7)の結果がHomebrewでのPython3インストールの前からすでに/usr/local/bin/python3.7になっていたり、その実体を指し示すところがともにシステム直下の/Library/Frameworks/~となっている場合は、おそらくあなたはmacOS専用のインストーラーdmgをインストールしてきたPython3使いの方だと思います。この場合、HomebrewでインストールしたPython3とは別のPython3が共存することになります(性能はどちらもほぼ同じです)。ただ、現在の設定ではHomebrewの方でインストールしたPython3ではなく、Python3公式サイトのインストーラーを使って入れた方のPython3が優先的に選ばれる設定になっています。

もしシステム直下のPython3環境を使い込んでいるということがなければ、そのシンボリックリンクをいったん消すことでHomebrewのPython3を優先的に使わせることができるようになると思います。

$ rm /usr/local/bin/{python3,python3.7}
$ brew reinstall python3
$ brew unlink python3 && brew link python3
$ ls -lt `which python3.7`

これを実行して/Cellar/python~~が表示されるようになれば成功です。pip3.7の実体も同様に確かめておきましょう。

最悪、/Library/Frameworks 以下のPython3環境をアンインストール (参考: http://codeaid.jp/python-uninstall/ )してHomebrewのPython3インストール方法を利用すればきっと動きます。

glew, freeglut, libpng, freetype, libxml2のインストール

brew install glew freeglut libpng freetype libxml2

libxml2はmacOSのXcode command-line toolsがインストールされていれば、実は不要です。ですが、最後のインストール時にCPPFLAGSでこれを指定するので、ここでは付けておきます。

glmのインストール (※PyMOL 2.2以降で必須)

OpenGL Mathematics (GLM)はOpenGLで利用する数値計算ライブラリです。これもHomebrewでインストールできます。

brew install glm

glmはまだ開発途上なので、7月31日時点ではver 0.9.9でした。ちなみに、これから先リリースされる予定のmacOS 10.14(Mojave)とかiOS 12では、OpenGL/Open CL、OpenGL ESが非推奨APIとして扱われる予定らしいですよ。もしかしたら将来このglmは消えることになるかもしれませんね。

msgpack-cのインストール (optional)

brew install msgpack

pip3.7を使ったsipとpyqt5とPmwのインストール

先程Python3.7を入れたときに、同時にpip3.7もインストールされたはずです。このpip3.7を使うことで簡単にsipとPyQt5をインストールすることができます。まずはpip3.7 --versionと打ってみて先程インストールしたpython3.7であることを確認します。

$ pip3.7 --version
pip 10.0.1 from /usr/local/lib/python3.7/site-packages/pip (python 3.7)

このPATHが/usr/local/lib/python3.7/site-packagesとなっていることを確認します。他のだったら何かおかしいです。

sip, pyqt5やPmwのインストールについて、これは長らくpipでのサポートが行われていなかったためソースビルドをしている先人の記録がたくさんありますが、今は

pip3.7 install sip pyqt5 pmw 

で終わるようです。ただし、もしこれをやろうとしたときに赤文字で

PermissionError: [Errno 13] Permission denied: '/usr/local/lib/python3.7/site-packages/sip.so'

と出てしまった場合は、

pip3.7 install sip pyqt5 pmw --user

として実行すれば、ユーザーディレクトリ上にインストールしてくれるのでこの問題を(たぶん)回避できます。

pip3.7を使ったMMTF形式サポートパッケージの導入(optional)

MMTF形式の構造ファイルのロードにはmsgpackの導入が必要です。Homebrewでmsgpackをインストールしておくと、後のpymolインストール時に自動的にmsgpackを探知してサポートONになります。ここで、pythonからmsgpackを使えるようにpipで必要なモジュールを入れておきます。

pip3.7 install msgpack-python msgpack-tool mmtf-python

で終わるようです。

sip, PyQt5, pmwの動作検証

pymolのインストールのためには、今Homebrewで入れたpython3から直接sipとPyQt5の2つを正しく呼び出せることが必要不可欠です。ターミナル上でまずpython3を起動し、import sipimport PyQt5を打ってみてsipとPyQt5のインポートを試みます。

$ python3
Python 3.7.0 (default, Jul 21 2018, 00:19:24)
[Clang 9.1.0 (clang-902.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sip
>>> import PyQt5
>>> import Pmw
>>>

と表示されることを確認します。ここでもしimport sipimport PyQt5import Pmwを入力してエンターを押したときに、エラーメッセージっぽいのが流れてしまった場合には失敗です。上のように何もメッセージが出ず次の入力待ちになったら成功です。Ctrl-Dを押してPython3を終了します。

PyMOL 2.2のソースコードからのインストール

これで準備はできました。GitHubからソースコードをダウンロードしてきて、そのディレクトリに入ります(※2018年7月下旬からGitHubでの公開になりました)。

git clone https://github.com/schrodinger/pymol-open-source.git
cd pymol-open-source

このディレクトリ内に存在するsetup.pyを起動するとインストールが始まりますが、まずは設定項目をコマンドpython3.7 setup.py --helpで確認しておきましょう。

理解したら、たぶん次のコマンドでうまくいくはずです。

LDFLAGS="-L/usr/local/Cellar/libxml2/2.9.7/lib" \
CPPFLAGS="-I/usr/local/Cellar/libxml2/2.9.7/include/libxml2 -I/usr/local/include/freetype2" \
python3.7 setup.py build install \
--prefix=~/apps/pymol/2.2 \
--pyqt PyQt5 --osx-frameworks

ここでLDFLAGS=CPPFLAGS=はインストールのときのライブラリとヘッダファイルのパスへの環境変数を指定します。今回、libxml2とfreetype2を明示的に書いておかないとインストール途中でlibxml/encoding.h not foundやらft2build.h not foundと出てインストール失敗することがあります(環境によっては不必要かもしれません)。Homebrewで入れた場合バージョンナンバーがついているので、この記事を書いてから時間が経つとここの数字は変わります。適宜環境ごとにパスを調べてから実行しましょう。

また、--prefixにはインストール先を指定します。私は今回~/apps/pymol/2.2をインストール先に指定しました。

1〜2分くらいするとインストールが終わるはずです。終わったらいったんターミナルを終了して再起動させてみてから、いよいよpymolが動くかどうかを次のコマンドで確認してみましょう。

~/apps/pymol/2.2/bin/pymol (/path/to/your/pymol)

これで以下のようにPyMOL 2.2が立ち上がれば成功です。\
pymol1.png

ちなみに不完全なやり方でインストールに失敗すると、上1/3くらいのExternal GUIが現れません。もう一度インストール方法を確かめてみましょう。もしインストールがなにかうまく行かなくて再インストールしたい場合には、setup.pyが存在するディレクトリの中にできているbuildディレクトリを消去してから再インストールしましょう。

(2018年7月31日追記: python3.7がリリースされましたが、これでビルドすると右上のGUIメニューにあるResetとかZoomだかのボタン表示が少し変になります。これはpython3.7の仕様らしいです。まあ実害はないっぽいので気にしないか、python3.6までを使ってビルドしてください。)

MMTF形式の読み込み(optional)

msgpack周りの設定をこなしていれば、MMTF形式の構造ファイルを読み込めるようになります。MMTF形式はMMCIF形式などと比較して大幅(5〜10倍程度)にファイルサイズを小さくすることができる次世代の構造ファイル形式です。構造ファイルの取得は

wget http://mmtf.rcsb.org/v1.0/full/4V9O.mmtf.gz
(または)
curl -O http://mmtf.rcsb.org/v1.0/full/4V9O.mmtf.gz

とすることで可能です。上の例ではPDB: 4V9Oを取得していますが、この4文字を変更することで自由に取得できます。mmtf.gz形式なので一見解凍する必要があるかに見えますが、PyMOLは解凍せずともファイルを開くことができます。

simplemmtfのインストールと、MMTF形式でのPDBファイルの書き出し(optional)

上級者向けの追加設定。この記事の最初の方で述べたsimplemmtfライブラリを使うと、構造をMMTF形式で出力することができます。これを利用するためには https://github.com/schrodinger/simplemmtf-python の clone or Downloadのところからまずzipをダウンロードしてきて解凍し、そのディレクトリ/path/to/simplemmtf-python-masterに入ったあと、

python3 setup.py build install

とすることで簡単にインストールすることができます。このとき、上のコマンドのpython3は必ずPyMOLのインストールのときに使ったpython3と同じ実体のものを使います。

これをインストールした後、任意のpdbファイル(のはずなんだけど、なんかたまにうまくできないこともある)を保存するときに、PyMOLのコマンドインタフェースから

# PyMOL内コマンド
save 4V9O.mmtf, 4V9O, format=mmtf

と指定することで、barという名前でPyMOL中に表示されているオブジェクトをfoo.mmtfで保存することができます。従来のフォーマットよりもさらに小さいファイルサイズになっていることがわかります。また、ここから更にターミナル上で.gzに圧縮することも可能です。

# Terminalで行う
gzip 4V9O.mmtf

これにより4V9O.mmtf.gzが生成されます。こうして出来上がった.mmtf.gzファイルは前項の「MMTF形式の読み込み」の設定が完了していれば読み込むことが可能になっているはずです。PDBフォーマットで3.2 MBくらいあるファイルがMMTF.gzでは330 KBくらいになりました。

ただ、multistateのPDB書き出しにはどうやら対応していないことや、PyMOL上で直接.mmtf.gz形式に書き出すことは不可能みたいです。

プラグインのインストール方法

PyMOL 2からのプラグイン

バイナリ版PyMOL2.0に存在したプラグインはこちらのソースビルド版には初期状態で入っていません。しかし特にAPBS pluginなどは論文で使う研究者も多いはずです。すでにこのバイナリ版PyMOLを持っているならば、/Applications/PyMOL.app/Contents/share/pymol/data/startup/にあったプラグインを~/apps/pymol/2.2/lib/python3.7/site-packages/pymol/pymol_path/data/startupに持ってくると使うことができます。

cp -rp /Applications/PyMOL.app/Contents/share/pymol/data/startup/* /path/to/pymol/2.2/lib/python3.7/site-packages/pymol/pymol_path/data/startup

APBSやPDB2PQRのプラグインへのPATHは各自設定してください。

PyMOL 1時代のlegacyなプラグイン

CentOS 7にソースコードからインストールを試みたときはtcl-tk GUIのプラグインも使えたのですが、Mac OSではtcl-tkを使うGUIプラグインは上のやり方ではうまく動作しませんでした。何がいけなかったんでしょうねえ……。しかしいずれPython2.7は廃止されるのでこれをわざわざ使えるようにすることは必要ないかなと思います。さらに、現在はPymol 2に合わせてほとんどのプラグインが再作成されておりますので、まずはそれを探してみると良いと思います。(→参考:https://pymolwiki.org/index.php/Psico)

CentOS 7にPyMOL 2.2をインストールする場合

環境

  • CentOS 7.4, Intel(R) Core(TM) i7-8700K CPU @ 3.70GHz, メモリ32GB
  • sudo権限が使える場合

インストール方法

上のMacと似たような流れでインストールすることができます。また必要なパッケージのほとんどは管理者のyumを使ってシステムに直接インストールできるのでとても簡単です。rootでない管理者の場合はyumの前にsudoをつけて実行します。

yum -y install epel-release
yum -y install gcc gcc-c++ python-devel tkinter glew-devel freeglut-devel \
libpng-devel freetype-devel libxml2-devel glm-devel msgpack
yum -y install python36u-pip
# pip3.7の場所の確認
which pip3.7
# 現在使用中のpython3環境にpip3.7で追加パッケージをインストールする
pip3.7 install --upgrade pip
pip3.7 install sip pyqt5 pmw
pip3.7 install msgpack-python msgpack-tool mmtf-python
# PyMOL 2.2のソースコードをダウンロードして、ビルド&インストール
cd /path/to/pymol-open-source
# rm -rf build #buildディレクトリが存在する場合は消しておく
python3.7 setup.py build install --prefix=/path/to/pymol/2.2 --pyqt PyQt5

だいたいこの流れでインストールができると思います。ただし、もしGTX 1080TiなどのNVIDIAグラフィックドライバを積んでいる場合にはそちらに切り替えたほうがPyMOLのGUI操作がサクサクになると思われますので、その設定もしておくと良いでしょう。
参考:CentOS 7 上で PyMOL をソースからビルド

2018年7月31日追記:
CentOS 7にインストールするとき、上記のインストール方法の途中でErrorを起こして失敗する場合があります。

layer5/PyMOL.cpp:2396:51: error: invalid conversion from ‘void (*)(GLenum, GLenum, GLuint, GLenum, GLsizei, const GLchar*, const void*) {aka void (*)(unsigned int, unsigned int, unsigned int, unsigned int, int, const char*, const void*)}’ to ‘GLDEBUGPROC {aka void (*)(unsigned int, unsigned int, unsigned int, unsigned int, int, const char*, void*)}’ [-fpermissive]
         glDebugMessageCallback(gl_debug_proc, NULL);

これは既知のバグらしく、さしあたり、このlayer5/PyMOL.cppの2396行目をコメントアウトするとインストールがうまくいくようになります。

#ifdef GL_DEBUG_OUTPUT
      if (!glDebugMessageCallback) {
        printf("glDebugMessageCallback not available\n");
      } else {
        // glDebugMessageCallback(gl_debug_proc, NULL); // ←ここをコメントアウト
        glEnable(GL_DEBUG_OUTPUT);
      }
#else