OpenBabelのC++ APIについての日本語資料が少なくね?ということでちょっと書く。
(本当はMoldbのHeliumを使おうとしていたがかなりあたらしい環境が必要で挫折した)
今回のお品書きは以下の2つ。
- インストール
- 走らせてみる
#インストール(Root権限を持っていないことを仮定)
とっても簡単。root権限がなくても簡単。
http://openbabel.org/docs/dev/Installation/install.html
基本的にはこちら参照。
wgetなどでtar.gzファイルを持ってきて、
$ tar -xvf openbabel-2.3.1.tar.gz
$ mkdir build
$ cd build
する。
次にcmakeをするのだが、~/Tools/openbabel
にインストールしたければ
$ cmake ../openbabel-2.3.1 -DCMAKE_INSTALL_PREFIX=~/Tools/openbabel
$ make
$ make install
としてやればOK。
ここまでに関しては、依存関係で問題になることもあるのでそちらの方が大変だと思う。
あとはpathを通すことを忘れずに。
.bashrcかなにかに
export LD_LIBRARY_PATH=~/Tools/openbabel/lib:$LD_LIBRARY_PATH
を入れておこう。
#走らせてみる(コンパイルの仕方とか)
今回使うコードは以下の通り。
test.cc
#include <iostream>
#include <string>
#include <sstream>
#include <openbabel/mol.h>
#include <openbabel/obconversion.h>
int main(int argc, char** argv){
// smilesからOBMolを生成
std::string smiles = "c1ccc2ccccc2c1";
std::stringstream ss(smiles);
OpenBabel::OBConversion conv(&ss);
conv.SetInFormat("smi");
OpenBabel::OBMol mol;
conv.Read(&mol);
// OBMolのAtomsを出力
std::cout << "Atom information" << std::endl;
std::cout << "AtomId AtomIdx" << std::endl;
for(OpenBabel::OBAtomIterator ait = mol.BeginAtoms(); ait!=mol.EndAtoms(); ++ait){
std::cout << (*ait)->GetId()
<< " "
<< (*ait)->GetIdx()
<< std::endl;
}
std::cout << std::endl;
// OBMolのBondsを出力
std::cout << "Bond information" << std::endl;
std::cout << "BeginAtomIdx EndAtomIdx" << std::endl;
for(OpenBabel::OBBondIterator bit = mol.BeginBonds(); bit!=mol.EndBonds(); ++bit){
std::cout << (*bit)->GetBeginAtomIdx()
<< " "
<<(*bit)->GetEndAtomIdx()
<< std::endl;
}
return 0;
}
これをコンパイルする。(意図的に2段階に分けてコンパイルしている)
$ g++ -O2 -I~/Tools/openbabel/include/openbabel-2.0 -o test.o -c test.cc
$ g++ -O2 -o test test.o -L~/Tools/openbabel/lib -lopenbabel
これで実行すると以下のような出力が得られる。
$ ./test
Atom information
AtomId AtomIdx
0 1
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10
Bond information
BeginAtomIdx EndAtomIdx
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
4 9
9 10
1 10
実行できた。