JOELibの
AbstractDatabaseクラスを用いたHashcodeの生成についてメモしたいと思います。このクラスにはHashcodeを生成するために以下の3つのメソッドが用意されています。
getHashcode(JOEMol mol)
getSMILESHashcode(JOEMol mol)
getMoleculeHASH(JOEMol mol)
ただし、最後のメソッドは上2つのメソッドの結果を同時に返すメソッドですので実質的には2種類のHashcodeを得ることができます。
それでは、getHashcodeとgetSMILESHashcodeの違いを具体的に見てみます。入力した分子構造は、L体、D体のアラニンの部分構造です。
JOEMol mol1 = new JOEMol();
JOEMol mol2 = new JOEMol();
String smiles1 = "CC(=O)[C@H](C)N";
String smiles2 = "CC(=O)[C@@H](C)N";
JOESmilesParser.smiToMol(mol1, smiles1, "mol1");
JOESmilesParser.smiToMol(mol2, smiles2, "mol2");
int hashcode1 = AbstractDatabase.getHashcode(mol1);
int hashcode2 = AbstractDatabase.getHashcode(mol2);
int smileshash1 = AbstractDatabase.getSMILESHashcode(mol1);
int smileshash2 = AbstractDatabase.getSMILESHashcode(mol2);
System.out.println("getHashcode()");
System.out.println(hashcode1);
System.out.println(hashcode2);
System.out.println("getSMILESHashcode()");
System.out.println(smileshash1);
System.out.println(smileshash2);
結果:
getHashcode()
-715427484
-715427484
getSMILESHashcode()
1803284766
1004112044
getHashcode()ではD体、L体の区別ができないないのに対し、getSMILESHashcode()では区別されています。大きな違いはここにあるのですが、どちらのメソッドも入力する分子の番号付けが変わると異なるHashcodeが生成されてします。したがって、Morgan法などで再番号付けされた分子構造を入力しなければ特定の分子に対してユニークなHashcodeを得ることができませんので注意が必要です。

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