kivantium活動日記

プログラムを使っていろいろやります

Open Babelのビルドとインストール

Open Babel は化学で使われる分子フォーマット間の変換によく使われるソフトです。

開発されたばかりの機能を使うためには自分でビルドしてインストールする必要があるのですが、Pythonバインディングコンパイルするところにハマったのでメモしておきます。 基本的にはInstall Open Babelを見ればいいです。 環境はUbuntu 16.04を使いました。

Anacondaでリリース済みバージョンを使う

Anacondaをインストールしていれば

conda -c openbabel openbabel

とすればよいです。

自分でコンパイルする

Anacondaを使っていない場合

必要なライブラリをインストールします。

sudo apt install cmake python-dev libxml2-dev zlib1g-dev libeigen2-dev libcairo2-dev swig2.0

ビルドとインストールは以下のようにします。

git clone https://github.com/openbabel/openbabel.git
cd openbabel
mkdir build
cd build
cmake .. -DPYTHON_BINDINGS=ON 
make
sudo make install
echo 'export PYTHONPATH=/usr/local/lib:$PYTHONPATH' >> ~/.bashrc
source ~/.bashrc

pythonを起動して import pybel を実行してエラーが起きなければ成功です。

Anacondaを使っている場合

Pybel import crashes Anaconda Python3.6 Ubuntu · Issue #1805 · openbabel/openbabel · GitHub に書いてあります。

conda install cmake lxml swig

cmake .. -DPYTHON_BINDINGS=ON -DRUN_SWIG=ON -DCMAKE_INSTALL_PREFIX=~/anaconda3 -DPYTHON_INCLUDE_DIR=~/anaconda3/include/python3.6m/ -DCMAKE_LIBRARY_PATH=~/anaconda3/lib -DSWIG_DIR=~/anaconda3/share/swig/3.0.12/ -DSWIG_EXECUTABLE=~/anaconda3/bin/swig -DPYTHON_LIBRARY=~/anaconda3/lib/libpython3.6m.so

make && make install

C++で使う

インストールすると obabelなどの通常のコマンドラインツールが使えるようになります。

より複雑なことをするにはC++Pythonなどでコードを書くことになります。 以下に標準入力からSMILESを読んで、3次元座標を計算した後、標準出力にSDFを吐くコード例を示します。 エラー処理は省略しています。

#include <iostream>

#include <openbabel/mol.h>
#include <openbabel/obconversion.h>
#include <openbabel/builder.h>

int main(int argc,char **argv) {
    OpenBabel::OBConversion conv(&std::cin, &std::cout);
    OpenBabel::OBMol mol;
    OpenBabel::OBBuilder builder;

    conv.SetInAndOutFormats("SMI", "SDF");
    conv.Read(&mol);
    builder.Build(mol);
    conv.Write(&mol);
}

コンパイルは以下のように行います。ディレクトリは環境によって異なるかもしれません。

g++ -I /usr/local/include/openbabel-2.0/  -L /usr/local/lib/openbabel/2.4.90/ hoge.cpp  -lopenbabel

Makefileの例を示します。ディレクトリ名は適宜変更してください。

CC = g++
CXXFLAGS = -I /usr/local/include/openbabel-2.0/
LDFLAGS = -L /usr/local/lib/openbabel/2.4.90/
LDLIBS = -lopenbabel

all: hoge fuga

SMILESをstringで指定する例

#include <iostream>
#include <string>
#include <sstream>

#include <openbabel/mol.h>
#include <openbabel/obconversion.h>
#include <openbabel/builder.h>

int main(int argc, char** argv){
  std::string smiles = "FCl(=O)=O";
  std::stringstream ss(smiles);
  OpenBabel::OBConversion conv(&ss, &std::cout);
  conv.SetInAndOutFormats("smi", "sdf");
  OpenBabel::OBMol mol;
  conv.Read(&mol);

  OpenBabel::OBBuilder builder;
  builder.Build(mol);

  conv.Write(&mol);
}

特定商取引法に定められた事項は請求により遅滞なく提供する