_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を意識しなくてよくなる。