MACCS keys

指紋を認識するアルゴリズムでは、線(隆線)の切れ目や分岐点の座標情報を抽出して
登録/照合を行うタイプが主流だそうです。
これら特徴点の数や位置は人によって異なりますので、個人認証にぴったりというわけです。


化合物にも、フィンガープリント(fingerprint, 指紋)とよばれる特徴付けの手法があります。
その原理は、規定の部分構造を持つか持たないかで、"1"もしくは"0"にそれぞれ値が定まるという
シンプルなものです。通常、数百〜数十万種(それ以上の場合も)の部分構造が規定されますので、
数百〜数十万個並んだ0と1によって化学構造の"指紋"を表現することになります。


たとえば、昔からよく知られているフィンガープリントに、
Symyx社(合併前はMDL社)の「MACCS key(まっくすきー)」があります。
166ビット(つまり166種の部分構造)バージョンと960ビットバージョンが
ありますが、部分構造の内容が公開されているのは前者のみです。


数年前までは、商用ソフトでしか実装されていなかったのですが、
オープンソースのRDKit、OpenBabel、CDK、そろって利用できるようになりました。
CDKを使って計算するコードは、以下のとおり。


import java.io.*;
import org.openscience.cdk.interfaces.*;
import org.openscience.cdk.io.iterator.IteratingSMILESReader;
import org.openscience.cdk.interfaces.IMolecule;
import org.openscience.cdk.tools.manipulator.AtomContainerManipulator;
import java.util.BitSet;
import org.openscience.cdk.fingerprint.MACCSFingerprinter;

class maccs {
public static void main(String args[]){
if(args.length!=1){
System.err.println("maccs <smiles-file>");
System.exit(1);
}
FileInputStream fis = null;
IteratingSMILESReader isr = null;
try{
fis = new FileInputStream(new File(args[0]));
isr = new IteratingSMILESReader(fis);
} catch (Exception e) {
e.printStackTrace();
}
while( isr.hasNext() ){
IMolecule imol = (IMolecule)isr.next();
String id = (String)imol.getProperty("cdk:Title");

MACCSFingerprinter ma = new MACCSFingerprinter();
String fp = "";
try{
BitSet fing = ma.getFingerprint(imol);
for(int i=0; i<ma.getSize(); i++){
if( fing.get(i) ){
fp = fp + ",1";
} else {
fp = fp + ",0";
}
}
} catch (Exception e1) {
e1.printStackTrace();
}
System.out.printf("%s%s\n", id, fp);
}
}
}

コンマ区切りで{0,1}の数列が出力されれば成功です。