21 08 2006 chemoinformatics perl java cdk Tweet
_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のコード
- http://cheminfo.informatics.indiana.edu/~rguha/code/java/
- http://cheminformatics.seesaa.net/article/20455721.html
:::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を意識しなくてよくなる。