Structure-CDKをperlで使う

smilesを描画するwebのインターフェースが欲しくて、色々作ってみた

必要なもの

ここら辺を参考に書いた。できたものはCDK-Util-0.01.tar.gzにおいておいた。

  • smi2mol
  • smi2png
  • IUPAC2CML

が可能。IUPAC2PNGも書いたのだけどmake testで豪快にこけるので無視してインストールしてください。podの細かいとこも気にしないように。Iupac2Pngはcdkでcmlをmolに変換するあたりがわからなくてあきらめたけど、そこのコードの部分だけ手直しすれば動くと思う。

っていうか、iupac2pngはopenbabelのモジュール使えばいいじゃんって気付いた途端もういいやってなってしまった。書式コンバートはopenbabelのほうがわかりやすい。ちょっとコード量は増えるけど、こんな感じ。

use strict;
use warnings;
use CDK::Smi2Png;
use CDK::Iupac2Cml;
use Chemistry::OpenBabel;

my $iupac_name = shift;
my $ic = CDK::Iupac2Cml->new();
my $cml = $ic->convert($iupac_name);

my $obMol = new Chemistry::OpenBabel::OBMol;
my $obConversion = new Chemistry::OpenBabel::OBConversion;
$obConversion->SetInAndOutFormats("cml", "smi");
$obConversion->ReadString($obMol, $cml);

my $smi = $obConversion->WriteString($obMol) or die "$! not converted";

$smi = (split(/\t/, $smi))[0];

my $smic = CDK::Smi2Png->new();
$smic->writePNG($smi,200,200,'/home/kzfm/test.png');

で実行する。Imatinibくらいは認識するようだ。

./iupac2png.pl  "4-[(4-methylpiperazin-1-yl)methyl] \
-N-[4-methyl-3-[(4-pyridin-3-ylpyrimidin-2-yl)amino] \
-phenyl]-benzamide"

Imatinib

あとはcatalystとsmi2pngを組み合わせて、chemichoのwebインターフェースに使ったり、iupac2pngでcgiでもつくってbookmarkletでポストできるようにしとけばpubmedとかのIUPAC名をいつでもひける。辞書サーチのプラグインで右クリック呼び出しでもいいけど。

firefoxの個人用ツールバーフォルダ

個人用ツールバーフォルダにつけてるボタンは名前を空欄にしたほうがアイコンチックになってすっきりしてみやすいことにいまさら気付いた。

toolbar

ブックマークレットもアイコンにならんもんじゃろか?増えてくるとあれ~~?とか一瞬悩むことは増えるので。

CDKで型があわねーとかいうエラー

Depth-FirstでみっけたStructure-CDKが使いたいということでcdk-20050826.jarからcdk-20060714.jarにあげたらこの前つくったモジュールが動かなくなった。

sdg.setMolecule(mol);
sdg.generateCoordinates();
mol = sdg.getMolecule();

のところで、

Smi2Mol_899b.java:49: 互換性のない型
検出値  : org.openscience.cdk.interfaces.IMolecule
期待値  : org.openscience.cdk.Molecule
        mol = sdg.getMolecule();
                             ^
エラー 1 

もげー、型が違うってなんでじゃ?

CatalystのTTでeval_perl

Catalystの設定ファイルのyamlにEVAL_PERLを入れておくとTTでperlのコードが使える。

      INCLUDE_PATH:
              - 'root/templates'
      TEMPLATE_EXTENSION: '.tt'
      EVAL_PERL: 1

とかやっておくと

[% PERL %]
    print $stash->{tags};
[% END %]

みたいに書ける。

やりたいことはちょっとした加工だったので、ホントはvirtual method使いたかったのだけど、catalystのどの部分でdefine_vmethod呼べばいいのかイマイチわからなかった。

それにしてもTTでperlのコード書くのはちょっと気持ち悪い。

DBIx::Classを使ってみた

いまいち、Class::DBIとDBIx::Classの違いがわかっていないのだけど、Catalystで作りたいものがあったので Perl/DBICなどみながら、いろいろさわってみてる。

My Kwiki: HomePage

Class::DBI inspired ORM designed to be resultset-oriented rather than table-oriented - so native support for views, aggregates (GROUP BY etc.), better automatic JOIN-ing and the ::Sweet search features done properly.

Class::DBIがテーブル指向なのに対して、DBIx::Classはresultset指向らしい。確かにCDBIだとページの処理用にプラグインがあったりするけどDBIx::Classだとさくさく書けた。

もうちょいドキュメント 読む必要があるけど、なかなか楽しげ。

ちなみに、下の二つは同じらしい。今日書いててちょっと悩んだのでメモ

$c->model('DBIC')->resultset('Items')

2006.10.17追記

DBIx::Class::Manual::Glossary - Clarification of terms used. - search.cpan.org

ResultSet

This is an object representing a set of data. It can either be an entire table, or the results of a query. The actual data is not held in the ResultSet, it is only a description of how to fetch the data.

ResultSetとはデータセットを表すオブジェクトで、テーブル全体であったり、クエリの結果だったりする。

もうすぐYetiなのね

はなと一緒に散歩してたら咲いてたので撮ってみた。

花

もう秋ですな。そろそろカワハギ釣りにもいかないと。 今年の冬は10/20 OPENみたい。

化合物の新着をRSSで

毎晩、化合物のデータベースの新着チェックして物性計算してDBに突っ込むバッチを流してるのに、何でRSS吐くようにしてないんだろうとふと思った。

ついでに週で集計とって、分子量とかlogpの推移をRSSで出力しといたろか。

changelog2blosxomをplaggerで

plaggerでblosxomに投稿する方法はあるのだけど、ネットワーク越しだとちと使いづらい。
で、ふと、XML-RPCインターフェースがあることを思い出したので、試してみたら調子よさそう。という経緯により、plagger使ってMeadowで書いているメモをblosxomにポストするという話だが、折角なのでこのエントリ自体Changelogで書いてみている。

Meadowでメモをとることとかclmemo,Meadowに関しては以下が参考になる。

Windowsで簡単にPlaggerをインストールする方法は簡単すぎ。 さくっとインストールは完了。

assets/plugins/Publish-MT/mt.ttはちょっと書き換えた。

[% FOREACH entry = feed.entries -%]
[% entry.body %]
[% END %]

設定のYAMLはこんな感じ

plugins:
  - module: CustomFeed::ChangeLog
    config:
    changelog_file: C:\home\ohkawa\clmemo.txt

  - module: Filter::Rule 
    rule:
      expression: $args->{entry}->{meta}->{cltag} eq "blosxom"

  - module: Filter::Rule
    rule:
      module: Deduped
      path: C:\Plagger\blosxom.db

  - module: Filter::BreakEntriesToFeeds

  - module: Publish::MT
    config:
      rsd: http://localhost/blosxom-xmlrpc.cgi/RPC2
      username: kzfm
      password: password
      blog_id: 1

plaggerの呼び出しはlispとかでマクロ書いてM-x plaとかC-x C-x Pでやりたいんだけど、Lispわからんので、今のとこはM-x shellでシェル呼び出して実行している。

というわけで、TODOってしとけばgmailにメールするようになってるし、blosxomって付けとけば、下書きにポストするような環境になって結構快適。

PlaggerでChangeLog(4)

Filter::ChangeLogなんて作る必要なかった。既存のFilter::Ruleを利用すればいいだけだった。

    rule:
      expression: $args->{entry}->{meta}->{cltag} eq "TODO"

Net::MovableTypeを使ってblosxomに投稿

あーそういえば、BXRってのがあったなというのを思い出したので、Net::MovableTypeで投稿することを思いついた。

my $mt = new Net::MovableType('http://localhost/blosxom-xmlrpc.cgi/RPC2');
$mt->username('kzfm');
$mt->password('okbkj');
$mt->blogId(1);

$entry = {
    title       => "Hello World from Net::MovableType",
    description => "おーけーおーけーOK牧場"
};

$mt->newPost($entry);

mttest

おー、かなりOK牧場だ。

ちなみにpackage blosxomのnewPostをちょっといじって常にランダムなファイル名を付与するようにした。ファイル名考えなくていいってだけでも精神的にはかなりラク。

#    if ( defined( $struct->{'postid'} ) ) {
#        $filename = BXR::getFilenameFromPostId( $struct->{'postid'} );
#    }
#    else {
#        $filename = lc( $struct->{'title'} );
#        $filename =~ s/\W+/_/g;
#        $filename =~ s/_+$//;
#        $filename = BXR::getRandomFilename() unless $filename =~ m/[a-z]/;

これで、Plagger::Plugin::Publish::MTを使ってChangelog2blosxomができるはず。ここまでやれれば、僕はchangelogだけに集中すればよくて、それ以降の処理はplaggerがよきにはからってくれるのでかなり調子いいかも。あとは学会とかセミナーの参加ログもchangelogでとってるのでms-wordにpublishしたいなぁ。