0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

OpenBabelをc++からいじってみる

Last updated at Posted at 2015-06-28

OpenBabelのC++ APIについての日本語資料が少なくね?ということでちょっと書く。
(本当はMoldbのHeliumを使おうとしていたがかなりあたらしい環境が必要で挫折した)

今回のお品書きは以下の2つ。

  1. インストール
  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

実行できた。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?