部分構造検索 (1)

個人的な偏見ですが、フリーソフトの部分構造検索には疑心を抱いていて、
いちど検出率を確認してみようと思った次第です。


まずは、UniversalIsomorphismTesterクラスを使ってみます。
「Cannot percieve atom type for 〜」の警告が鬱陶しいので、
今回は、SDファイルを入力としました。
同時に、部分構造をSMILES形式で引数に入れます。

java -cp $CLASSPATH is_subgraph


/* is_subgraph.java */

import java.io.*;
import org.openscience.cdk.io.iterator.IteratingMDLReader;
import org.openscience.cdk.interfaces.IMolecule;
import org.openscience.cdk.interfaces.IAtomContainer;
import org.openscience.cdk.isomorphism.UniversalIsomorphismTester;
import org.openscience.cdk.smiles.SmilesParser;
import org.openscience.cdk.smiles.SmilesGenerator;
import org.openscience.cdk.DefaultChemObjectBuilder;


class is_subgraph {
public static void main(String args[]){
if(args.length!=2){
System.err.println("is_subgraph <query-smarts> <sd-file>");
System.exit(1);
}
SmilesParser sp = new SmilesParser(DefaultChemObjectBuilder.getInstance());
IAtomContainer SMIquery;
FileInputStream fis = null;
IteratingMDLReader isr = null;
try{
fis = new FileInputStream(new File(args[1]));
isr = new IteratingMDLReader(fis, DefaultChemObjectBuilder.getInstance() );
} catch (Exception e) {
e.printStackTrace();
}

while( isr.hasNext() ){
IMolecule imol = (IMolecule)isr.next();
String id = (String)imol.getProperty("DATABASE_ID");
//String id = (String)imol.getProperty("cdk:Title");
boolean isSubstructure = false;
try {
SMIquery = sp.parseSmiles(args[0]);
isSubstructure = UniversalIsomorphismTester.isSubgraph(imol, SMIquery);
} catch (Exception e1) {
e1.printStackTrace();
}
if(isSubstructure == false ) continue;
SmilesGenerator sg = new SmilesGenerator();
try {
System.out.printf("%s\t%s\n", sg.createSMILES(imol), id);
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
}

つづく。