ファーマコフォア検索

ファーマコフォア (pharmacophore)とは、分子構造の抽象的な特徴を3次元空間上に配置したものです。
たとえば、2つの窒素原子と1つの酸素原子が以下のように配置した
ファーマコフォアを定義してみます。

CDKのPharmacophoreMatcherクラスを使って、この条件にあう分子を検索できるようです。
以下、サンプルコードです。
(編集中)


/* ph4_search.java */

import java.io.*;
import org.openscience.cdk.interfaces.*;
import org.openscience.cdk.io.iterator.IteratingMDLReader;
import org.openscience.cdk.DefaultChemObjectBuilder;

import org.openscience.cdk.isomorphism.matchers.QueryAtomContainer;
import org.openscience.cdk.pharmacophore.*;


class ph4_search {

public static void main(String args[]){

if(args.length!=1){
System.err.println("ph4 <sd-file>");
System.exit(1);
}
FileInputStream fis = null;
IteratingMDLReader isr = null;
try{
fis = new FileInputStream(new File(args[0]) );
isr = new IteratingMDLReader(fis, DefaultChemObjectBuilder.getInstance() );
} catch (Exception e) {
e.printStackTrace();
}

PharmacophoreQuery query = new PharmacophoreQuery();

PharmacophoreQueryAtom o = new PharmacophoreQueryAtom("D", "[OX1]");
PharmacophoreQueryAtom n1 = new PharmacophoreQueryAtom("A", "[N]");
PharmacophoreQueryAtom n2 = new PharmacophoreQueryAtom("A", "[N]");
query.addAtom(o);
query.addAtom(n1);
query.addAtom(n2);
PharmacophoreQueryBond b1 = new PharmacophoreQueryBond(o, n1, 4.0, 4.5);
PharmacophoreQueryBond b2 = new PharmacophoreQueryBond(o, n2, 4.0, 5.0);
PharmacophoreQueryBond b3 = new PharmacophoreQueryBond(n1, n2, 5.4, 5.8);
query.addBond(b1);
query.addBond(b2);
query.addBond(b3);

while( isr.hasNext() ){
IMolecule imol = (IMolecule)isr.next();
String id = (String)imol.getProperty("cdk:Title");
PharmacophoreMatcher matcher = new PharmacophoreMatcher();
matcher.setPharmacophoreQuery(query);
try{
if( matcher.matches(imol, true) ){
System.out.printf("%s\n", id);
}
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
}

これを応用すれば、
何千種類ものファーマコフォア・パターンを予め定義しておいて、
各分子がそれぞれのパターンに適合するかを{0, 1}のベクトルで表現する
「ファーマコフォア・フィンガープリント」も実装可能です。
(注:PharmacophoreQueryAtomのSMARTSパターンに制約があるようなので、
 市販ソフトほどの使い勝手はありません)