OpenBabel은 오래 전에 사용되던 Babel 프로그램의 오픈소스 계승자라고 할 수 있다. Babel은 이름에서 알 수 있듯이, 화학 구조를 나타내는 다양한 파일 포맷들을 전환해 주는 기능을 한다. 이 목적을 생각해 보면, 결국 이런 종류의 프로그램의 가치는 얼마나 많은 포맷을 지원하는가에 있다는 것을 알 수 있다. 그리고 꾸준히 포맷 지원을 추가하다보면 다른 프로그램들이 하기 어려울 정도의 수준에 이르게 되고, 결국은 그 프로그램이 사실상의 표준이 될 수 밖에 없는데, 지금의 OpenBabel이 그런 위치에 있다고 볼 수 있다.
사실 OpenBabel의 역할이 포맷 전환에 있는 것은 사실이지만, 지금 이 프로그램이 할 수 있는 일은 사실 그보다 훨씬 더 많다. 분자 구조를 처리하는 모든 프로그램이 그렇듯이 분자 표현자의 계산, fingerprint 계산 등의 일을 할 수 있으며, 사실 분자 구조 처리를 위한 기본 루틴이 이미 완성되어 있기 때문에 분자 표현자나 fingerprint 종류를 늘리거나 다른 종류의 기능을 지원하는 것 역시 시간과 노력의 문제일 뿐이라고 볼 수 있다.
1. OpenBabel 설치하기
OpenBabel은 C++로 개발된 프로그램이다. 따라서, 리눅스나 MacOS에서는 간단하게 컴파일을 할 수 있고, 윈도우라면 바이너리를 다운로드하거나 Cygwin 혹은 MingW 환경에서 컴파일을 할 수 있다. rcdk 관련 글에서 언급한 바와 같이, 이 글에서는 윈도우용 설치는 다루지 않고 리눅스에서의 설치만을 다룬다.
user@server:~$ wget http://downloads.sourceforge.net/openbabel/openbabel-2.2.0.tar.gz
user@server:~$ tar -zxvf openbabel-2.2.0.tar.gz
위와 같이 하여 최신 버전을 다운받은 후 압축을 푼다. 현재 최신 안정 버전은 2.2.0이다. 만약 개발 버전을 사용하고 싶은 경우에는 아래와 같이 subversion을 이용하면 된다.
user@server:~$ svn co https://openbabel.svn.sourceforge.net/svnroot/openbabel/openbabel/trunk openbabel
이제 설치는 다른 프로그램들의 컴파일 설치와 마찬가지로 세 단계를 거치면 된다.
user@server:~$ ./configure
user@server:~$ make
user@server:~$ sudo make install
2. OpenBabel 스크립트 지원 설치하기
이렇게 설치한 OpenBabel 프로그램을 이용하여 모든 일들을 할 수도 있지만, ruby나 python같은 언어에서 기능을 불러다 쓰는 것이 가능하다. 이렇게 되면 ruby나 python에서 OpenBabel의 객체들을 직접 불러서 쓸 수 있기 때문에 매우 유용하다. 이렇게 C++ 프로그램의 내용을 다른 언어에서 불러서 쓸 수 있게 해 주는 기능은 SWIG이라는 프로그램에서 지원한다. 현재 OpenBabel이 지원하는 언어는 perl, python, ruby, java, 그리고 C#이다. 여기서는 ruby와 python 바인딩 설치만을 다룬다.
python 바인딩 설치를 위해서는 아래와 같이 하면 된다.
user@server:~$ cd scripts/python
user@server:~$ python setup.py build
user@server:~$ sudo python setup.py install
Ruby 바인딩 설치는 아래와 같이 하면 된다.
user@server:~$ cd scripts/ruby
user@server:~$ ruby extconf.rb
user@server:~$ make
user@server:~$ sudo make install
현재 안정 버전에서는 fingerprint 지원 기능이 빠져 있으므로, 이 기능이 필요한 경우에는 fingerprint 기능이 포함된 (것으로 알려진) r2711 버전을 사용할 수 있다. (내 경우에는 r2711 버전에서도 이 기능이 제대로 작동하지 않았다. 이에 대한 원인이나 해결책은 아직은 없는 상태인 것으로 보인다) r2711 버전을 사용하기 위해서는 아래와 같이 하면 된다.
user@server:~$ cd scripts
user@server:~$ mv openbabel-ruby.i openbabel-ruby.i.backup
user@server:~$ wget http://openbabel.svn.sourceforge.net/viewvc/openbabel/openbabel/branches/openbabel-2-2-x/scripts/openbabel-ruby.i
user@server:~$ cd ruby
user@server:~$ swig -ruby -autorename -c++ -I../../include -o openbabel_ruby.cpp ../openbabel-ruby.i
user@server:~$ ruby extconf.rb
user@server:~$ make
user@server:~$ sudo make install
만약 설치 후 ruby에서 openbabel 기능을 사용할 수 없다면, 이 문제는 여기서 언급된 문제일 것이다. 위의 6번째 줄 실행을 통해 openbabel_ruby.cpp 파일이 생성되었으면, 이 파일에서 Init_OpenBabel이라는 문자열을 찾아서 그 중 두 번째 (아마 8만 몇 천 라인 쯤에 위치하고 있을 것이다) 문자열을 Init_openbabel로 치환한 후에 다시 컴파일을 하면 된다.
3. OpenBabel을 ruby나 python에서 사용하기
설치를 했다면 사용을 해 보자. 일단 루비의 예를 보면 아래와 같다.
user@server:~$ irb
irb(main):001:0> require 'openbabel'
=> true
irb(main):002:0> include OpenBabel
=> Object
irb(main):003:0> conv = OBConversion.new
=> #<OpenBabel::OBConversion:0x3c0dc>
irb(main):004:0> conv.set_in_format 'smi'
=> true
irb(main):005:0> mol = OBMol.new
=> #<OpenBabel::OBMol:0x1c390>
irb(main):006:0> conv.read_string mol, 'Oc1ccccc1'
=> true
irb(main):007:0> mol.num_atoms
=> 7
irb(main):008:0> mol.add_hydrogens
=> true
irb(main):009:0> mol.num_atoms
=> 13
irb(main):010:0> mol.get_mol_wt
=> 94.11124
굳이 설명이 필요 없을 정도로 간단한 예이다. 각 개체에서 사용할 수 있는 메쏘드들은 OpenBabel API 문서를 참고하면 된다. AddHydrogens는 add_hydrogens로, GetMolWt는 get_mol_wt로 쓴 것을 보면 나머지 메쏘드들을 어떻게 써야 할지를 알 수 있을 것이다.
Python에서 사용은 크게 두 가지 방법이 있다.
import openbabel
mol = openbabel.OBMol()
conv = openbabel.OBConversion()
conv.SetInAndOutFormats('smi', 'mdl')
conv.ReadString(mol, "Oc1ccccc1")
mol.NumAtoms()
mol.AddHydrogens()
mol.GetMolWt()
conv.WriteFile(mol, 'phenol.mol')
아니면 pybel을 쓰는 방법이 있다. 아마 pybel을 쓰는 것이 훨씬 더 편리할 것이다.
import pybel
mols = readfile("sdf", "sample.sdf")
for mol in mols:
mol.calcdesc()
Python에서 OpenBabel의 사용은 이 위키 페이지에 잘 정리되어 있으니 여기를 참조하면 된다.
4. 결론
rcdk 관련 글에서 언급한 바와 같이, 잘 만들어진 화학 툴킷을 사용하는 것은 실용적으로 매우 의미있는 일이다. OpenBabel과 같이 매우 성숙한 프로그램을 다양한 언어에서 직접 사용할 수 있다는 것은 매우 유용한 일이 아닐 수 없다. 개발자들에게 박수를!!


댓글을 달아 주세요