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);
ただし、この例では、2つのフェノールの原子の番号付けは同じになっています。番号付けが異なる場合は、そのまま対応する原子同士で重ね合わせが行われるため、適切な結果を得ることができません。対策として、Morgan法などで番号付けを揃えておく、または、obfitのように部分構造検索を利用して重ね合わせる原子ペアを取得するなどが考えられます。
人気ブログランキング(クリックして応援してね)