2006年07月22日

CDKで分子の重ね合わせ

CDKを使った分子の重ね合わせについてメモしたいと思います。CDKではKabschのアルゴリズムを用いて重ね合わせを行っており、このアルゴリズムは、CDK以外にも多くのソフトウェアで採用されています。以下に原著論文を挙げておきます。

Kabsch, W. A solution for the best rotation to relate two sets of vectors. Acta. Crystal, (1976) 32A:922-923.

Kabsch, W. A discussion of the solution for the best rotation to related two sets of vectors. Acta. Crystal, (1978) 34A:827-828.

今回は、2つのフェノール分子の重ね合わせを行ってみます。
重ね合わせには、KabchAlignmentクラスを利用します。まず、重ね合わせたい2つの分子mol1,mol2(IAtomContainerクラス)を引数として、インスタンスを作成します。この場合、mol1にmol2を重ねることになります。次に、align()メソッドで重ね合わせを行います。そして、getRMSD()メソッドにより、2つの分子の重なり具合を示すRMSDを得ることができます。

 KabschAlignment kca=null;
 try {
  kca = new KabschAlignment(mol1,mol2);
  kca.align();
  System.out.println(kca.getRMSD());
 } catch (CDKException e) {
  e.printStackTrace();
 }

重ね合わせを行ったmol2の座標がほしい場合は、まず、getCenterOfMass()メソッドによりmol1の中心座標を取得し、mol2を平行移動します。次に、rotateAtomContainer(IAtomContainer ac)メソッドを用いて、回転させることにより得ることができます。

 Point3d mol1_mass = kca.getCenterOfMass();
 for(int i=0;i<mol2.getAtomCount();i++){
  Atom atom = (Atom)mol2.getAtomAt(i);
  atom.setX3d(atom.getX3d() - mol1_mass.x);
  atom.setY3d(atom.getY3d() - mol1_mass.y);
  atom.setZ3d(atom.getZ3d() - mol1_mass.z);
 }
 kca.rotateAtomContainer(mol2);

sp.PNG

ただし、この例では、2つのフェノールの原子の番号付けは同じになっています。番号付けが異なる場合は、そのまま対応する原子同士で重ね合わせが行われるため、適切な結果を得ることができません。対策として、Morgan法などで番号付けを揃えておく、または、obfitのように部分構造検索を利用して重ね合わせる原子ペアを取得するなどが考えられます。



banner_02.gif
人気ブログランキング(クリックして応援してね)


posted by わばのり at 15:02| Comment(0) | TrackBack(0) | CDK | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。