複数分子の取扱い
前回では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でも同様に独自クラスを定義できます。
Category: OpenBabel, プログラミング関連