今回の話題はOpenBabelを利用した類似構造検索(Similarity Search)についてです。いまどきSimilarity Searchなど、わざわざプログラミングしなくても使い勝手の良いソフトウェアは沢山あります。さらにはOpenBabelの標準のコマンドでも簡単に実行できます。しかし敢えてC++を使って(Pythonじゃなくて)プログラミングしてSimilarity Searchしたい!という変な人だけ以下の詳細を読んでみてください。記事が長くなりそうなので前後編に分けております。
はじめに
創薬化学には「構造活性相関」という言葉が必ず出てきます。構造と活性の間に相関があるということは、構造式が似ている或る2つの化合物を比較すると生理活性も似ているということです。一部の例外として”Activity Cliff”という現象も見られますが、構造活性相関は概ね正しく、創薬化学における一つの原理であると思います。したがって、活性が有ることが分かっている化合物に類似した構造のものを探すことは、創薬の基本中の基本ということになります。
問題設定
何かの薬を一つ例にとって、その参照化合物とライブラリ中の全ての化合物とのSimilarityを計算することを目的にします。このブログは3月のまさに花粉が飛んでいる時期に書いていますので、参照化合物として抗ヒスタミン薬の一つであるFexofenadine(アレグラなど)とします。Similarityの値は、構造式を一旦フィンガープリントに変換した後に、フィンガープリント同士を比較して谷本係数が計算されます。ここでは一般的に広く利用されているECFP4というフィンガープリントを利用することにします。
ここで紹介するプログラムは”SimSearch.cpp“です。リンクをクリックしてダウンロードしてください。そして利用する化合物ファイルはSMILES形式で、”Fexofenadine.smi“と”test19.smi“もダウンロードしてください。
結果がおかしい?
3個のファイルをダウンロード出来たらコンパイルしてみましょう。コマンドは以前のOpenBabel関連の記事と同じく以下のようになります。
g++ -std=c++11 SimSearch.cpp -I/usr/local/include/openbabel-2.0 -L/usr/local/lib -lopenbabel
プログラムを実行すると次のような出力になります。
$ ./a.out
101845628 -1
123506854 0.482589
139808122 -1
141260304 -1
14677762 -1
150332786 -1
150598871 -1
150622200 0.494637
150794865 -1
22667272 -1
3348 0.730604
57619841 -1
57619845 -1
57619846 -1
67722853 0.560463
67767321 0.466235
68320883 -1
71141694 -1
9936344 -1
この結果の第一列はテスト化合物のIDで、第二列がFexofenadineとのSimilarityの値となります。しかしながら-1となってるものが多く、何かがおかしいです。色々しらべた結果OpenBabelのversion 2.4ではダメで、新しいversion 3.1にする必要があることが分かりました。
Anaconda最高!
OpenBabelのインストールについては以前のブログで紹介しました。そのブログを少し読んでいただければ分かりますが、OpenBabelを最初からビルドするのはとても面倒です。”CMakeLists.txt”を読むとか二度とやりたくないので、何か別の方法がないかなぁと考えていたらAnacondaが使えることが分かりました。Anacondaを利用したOpenBabel 3.1のインストール手順は以下の通りです。(Anaconda自体の解説はここでは省きます。)
- テキストエディタなどを利用して、以下の内容を”env.yml”というファイル名で作成します。
name: ob3
channels:
- conda-forge
- bioconda
- defaults
dependencies:
- openbabel=3.1
- python=3.8
2. 以下のcondaコマンドで仮想環境を構築します。
$ conda env create -f env.yml
3. 作成した仮想環境を有効化します。
$ conda activate ob3
以上の手順でOpenBabel 3.1が利用可能になります。OpenBabelのライブラリは$HOME/anaconda3/envs/ob3/lib
の下に配置されます。そしてヘッダーファイルは$HOME/anaconda3/envs/ob3/include
の下に配置されます。
Anacondaを通してのC++用ライブラリのインストールはOpenBabelに限りません。AnacondaってPython専用のツールと思ってましたが、ヘッダーファイルもインストールされることを知って、「C++プログラマーにも使える!」と感動しました。知っていた人からすれば何を当たり前のことで感動しているの?って感じでしょうけどね。いずれにしても、面倒なビルドをやらなくても良いのは楽ですね。
再度コンパイル
Anacondaでインストールしたヘッダーファイルとライブラリを利用して、C++プログラムをコンパイルします。以下のような簡単なスクリプトをコマンドを実行してください。
g++ -std=c++11 SimSearch.cpp -I${HOME}/anaconda3/envs/ob3/include/openbabel3 \
-L${HOME}/anaconda3/envs/ob3/lib \
-Wl,-rpath=${HOME}/anaconda3/envs/ob3/lib -l openbabel
ここで”-Wl,-rpath=…”というオプションを指定することにより、特定のディレクトリの.soファイルをリンクすることを強制しています。これを入れないとversion 2.4の方のライブラリがリンクされてしまい、計算結果がおかしいままになる可能性があります。コンパイル出来たら実行してみましょう。
以下のような出力になるはずです。
$ ./a.out
101845628 0.191489
123506854 0.720588
139808122 0.433735
141260304 0.723077
14677762 0.623188
150332786 0.582278
150598871 0.575
150622200 0.671642
150794865 0.594937
22667272 0.469136
3348 1
57619841 0.196721
57619845 0.186992
57619846 0.196721
67722853 0.525
67767321 0.551282
68320883 0.487805
71141694 0.896552
9936344 0.769231
続きは後編で
プログラムの解説などは後編でやります。
Category: Linux関連, OpenBabel, プログラミング関連