_in house_でケモインフォ関連のプログラミングをするのに、二次元構造の立ち上げツール(またはライブラリ)と、構造描画ツールは必須だが、いまのとこCDKを使うという選択肢しかない。
実用PerlプログラミングにInline::Javaを使うとjavaのコードをperlに組み込めると書いてあったので、CDKを組み込んでみたヨ。
まぁ、要するに、
Q.そこまでしてperlで処理したいのか?  
A. もちろんですヨ、奥さん
ということなんだが。
さて、インストールはj2sdkの場所を指定しないといけないのでcpan -iだとこける。そのため地道に、buildディレクトリで再インストール。
$ cd .cpan/build/Inline-Java-0.51
$ perl Makefile.PL J2SDK=/usr/java/jdk1.5.0_08/
$ make java
$ make
$ make test
$ make install
ただ、make javaで
注:入力ファイルの操作のうち、未チェックまたは安全ではないものがあります。
注:詳細については、-Xlint:unchecked オプションを指定して再コンパイルしてください。
とかいう警告が出るが、testは通るのでまぁ気にしないということで。
で、コードを書いてみる。
参考にしたjavaのコード
:::java
    use Inline Java => <<'END_OF_JAVA_CODE' ;
    import java.io.StringWriter;
    import java.io.IOException;
    import org.openscience.cdk.Molecule;
    import org.openscience.cdk.exception.CDKException;
    import org.openscience.cdk.io.MDLWriter;
    import org.openscience.cdk.smiles.SmilesParser;
    import org.openscience.cdk.layout.StructureDiagramGenerator;
    import org.openscience.cdk.tools.HydrogenAdder;
class smi2mol{
    public smi2mol(){
    }
    public String convert(String smi){
    Molecule mol = null;
    try {
        SmilesParser sp = new SmilesParser();
        mol = sp.parseSmiles(smi);
    }catch (Exception ise){
        ise.printStackTrace();
    }
    StringWriter w = null;
    MDLWriter  mw = null;
    try {
        w = new StringWriter();
        mw = new MDLWriter(w);
    } catch (Exception e) {
        e.printStackTrace();
    }
    HydrogenAdder ha = new HydrogenAdder();
    try{
        ha.addExplicitHydrogensToSatisfyValency(mol);
    } catch (Exception e){
        e.printStackTrace();
    }
    StructureDiagramGenerator sdg = new StructureDiagramGenerator();
        try{
        sdg.setMolecule(mol);
        sdg.generateCoordinates();
        mol = sdg.getMolecule();
        mw.write(mol);  
    } catch (Exception e){
        e.printStackTrace();
    }
    return w.toString();
    }
}
END_OF_JAVA_CODE
my $alu = new smi2mol();    
my $smiles_string = shift;
print $alu->convert($smiles_string);
実行してみる
::: sh
    $ perl test.pl "C(=O)O"
  CDK
  5  4  0  0  0  0  0  0  0  0999 V2000
    1.2990   -0.7500    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    0.0000    0.0000    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
    2.5981   -0.0000    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
    1.2990   -2.2500    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
    3.8971   -0.7500    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
  2  1  2  0  0  0  0 
  3  1  1  0  0  0  0 
  1  4  1  0  0  0  0 
  3  5  1  0  0  0  0 
M  END
水素が付加されて、座標も計算されたMOLファイルが出力される。
javaって例外を返す可能性がある場合try,catch構文入れないと強制的にエラーになるのね。try,catch構文は読みやすいけど、強制されんのはちょっとやだナァと。単にフォーマットをコンバートするだけのコードなのに結構長くなっちゃったし。
::: perl
    use CDK;
    use Chemistry::Mol;
my $mol = CDK::smi2sdf($molecule);
print $mol;
みたいにモジュールにしてuseして使えばCDKを意識しなくてよくなる。