PubChem Fingerprint

PubChemデータベースは、独自のフィンガープリントを構築して
Webサイト内での類似度検索に使っています。

そのフィンガープリントの構成は既に公開されているのですが、
881ビットもあるので、ちまちま実装するのは面倒です。


そこでCDKを見てみると…
PubchemFingerprinterクラスが実装されており、パパっと計算できるようです。


import java.io.*;
import org.openscience.cdk.interfaces.*;
import org.openscience.cdk.io.iterator.IteratingSMILESReader;
import org.openscience.cdk.interfaces.IMolecule;

import java.util.BitSet;
import org.openscience.cdk.fingerprint.PubchemFingerprinter;

class pubchemfp {
public static void main(String args[]){

if(args.length!=1){
System.err.println("pubchemfp <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");

PubchemFingerprinter pcfp = new PubchemFingerprinter();
String fp = "";
try{
BitSet fing = pcfp.getFingerprint(imol);
for(int i=0; i<pcfp.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);
}
}
}