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 openbabel を実行してエラーが起きなければ成功です。

(2019/11/22 追記) Open Babel 3.0のリリース時点ではSWIGがないとPythonバインディングコンパイルできないようです。 Python bindings don't build in the 3.0 release tarball due to incorrect path · Issue #2081 · openbabel/openbabel · GitHub

sudo apt install build-essentials cmake python3-dev libeigen3-dev swig wget
wget https://github.com/openbabel/openbabel/archive/openbabel-3-0-0.tar.gz
tar xf openbabel-3-0-0.tar.gz
cd openbabel-openbabel-3-0-0/
mkdir build; cd $_
cmake ..  -DPYTHON_BINDINGS=ON -DRUN_SWIG=ON
make
sudo make install
echo 'export PYTHONPATH=/usr/local/lib:$PYTHONPATH' >> ~/.bashrc
source ~/.bashrc

コンパイルできました。

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);
}

広告コーナー