OpenBabelでC++プログラミング ~超入門 その3~

複数分子の取扱い

 前回ではSDファイルの読み込み等の話題を扱いました。実はサンプルプログラムについて言及しなかった点がありました。それはvectorでOBMolクラスの配列を取り扱っていることです。通常SDファイルには複数の分子が記述されているので、あえて配列に読み込みました。今回はもうちょっと便利な分子の配列の作り方について語りたいと思います。

とりあえず実行してみる

 今回はSDファイル中の分子を分子量の小さい順に並び替えるという簡単なプログラムです。分子量に限らず何かしらのパラメーターで並び替えるという操作は非常に使用頻度が高いです。とりあえずリンクをクリックして、SDファイル”EGFR_lig.sdf”ソースコード”sortMOL.cpp”をダウンロードして実行してみましょう。コンパイルは以下のようにします。

g++ -std=c++11 sortMOL.cpp -I/home/username/app/include/openbabel-2.0 -L/home/username/app/lib -lopenbabel

 実行結果は以下のようになります。

ソート前
id              MW      logP
9549299         413.40  4.50
78358313        445.60  3.30
9843206         387.40  4.80
6711154         365.30  4.00
11566580        355.80  3.60
132117821       490.00  3.10
127264586       490.00  3.10
118797290       397.60  4.60
126496758       487.50  3.40
129627019       436.50  4.70
91668194        415.40  1.20

ソート後
id              MW      logP
11566580        355.80  3.60
6711154         365.30  4.00
9843206         387.40  4.80
118797290       397.60  4.60
9549299         413.40  4.50
91668194        415.40  1.20
129627019       436.50  4.70
78358313        445.60  3.30
126496758       487.50  3.40
132117821       490.00  3.10
127264586       490.00  3.10

OBMolクラスの継承

 今回のサンプルプログラムのポイントとしてはOBMolクラスを継承して使用するということです。C++での継承は注意すべき点もあって面倒なのですが、慣れると便利です。わざわざOpenBabelを利用してプログラムを作るということは、分子の状態を変更するような操作をすることが多いと思われるので、クラスを継承して独自の分子操作関数を追加すると便利だし効率的です。以下にソースコードの一部分を示します。OBMolクラスを継承して”MyMol”という新しいクラスを定義しています。

class MyMol : public OBMol {
 public:
  double MW;
  double logP;

 public:
  MyMol() : MW(0), logP(0) {}

  MyMol(const MyMol& Obj) : OBMol(Obj) {
    MW = Obj.MW;
    logP = Obj.logP;
  }

  MyMol& operator=(const MyMol& Obj) {
    if (this == &Obj) return *this;
    OBMol::operator=(Obj);
    MW = Obj.MW;
    logP = Obj.logP;
    return *this;
  }

  MyMol& operator+=(const MyMol& Obj) {
    OBMol::operator+=(Obj);
    return *this;
  }
};

 このMyMolクラスでは独自に分子量の値を保存する”MW”とlogPの値を保存する”logP”の2つのメンバ変数を定義しています。本来ならprivateで宣言するのですが、面倒なのでpublicにしています。ある程度大きいプログラムを作ろうとするときはprivateにして下さいね。メンバメソッドの方はコンストラクタ、コピーコンストラクタ、代入演算子、分子追加演算子(+=)の4つを定義しています。この4つを定義すればOBMolを引き継げます。ここで分子追加演算子とは2個の独立した分子を1つにまとめるときに使用します。例えばタンパク質とリガンド分子とかです。

 以上のように独自の分子クラスを定義して、複数の分子をvectorやmapなどのSTLで扱うと非常に便利です。ここではOpenBabelでの例ですが、RDKitでも同様に独自クラスを定義できます。