BiopythonはbioperlよりもPDBファイルの処理が速かった

みんなのpythonも読んだし、フレームワークでも試してみるかと、djangoとかTurbogearsに手をだしたら、火傷した。

djangoは一通りサンプル動作をさせることができたけど、Turbogearsはコントローラのあたりからさっぱりわからん。
いきなりフレームワークは無謀すぎたかなということで、Biopythonでも入れて、もう少しpython慣れすることに。

easy_install numpy

wget http://www.egenix.com/files/python/egenix-mx-base-2.0.6.tar.gz
python setup.py install

svn co http://www.reportlab.co.uk/svn/public/reportlab/trunk
python setup.py install

wget http://biopython.org/DIST/biopython-1.42.tar.gz
python setup.py install

easy_installはperlでいうところのcpanコマンドみたいで楽チンです(ちゃんと動けば)。動かないのは地味にダウンロード、展開、setup.pyを行なった。

さて、インストールも無事に終了したところで、bioperlと比べてみた。比較したのはpdbファイルの処理。というのは、FMO用のインプット作るときに使っているPDBパーザーつまりBio::Structure::IOがやたらと遅く、不満だったからというありがちな理由。

コードはこんな感じで、1fatっていうpdbファイル読み込んでCalphaを出力してみた。

python

from Bio.PDB.PDBParser import PDBParser

parser=PDBParser(PERMISSIVE=1)
structure=parser.get_structure("1fat", "1fat.pdb")
for model in structure.get_list():
    for chain in model.get_list():
        for residue in chain.get_list():
            if residue.has_id("CA"):
                ca_atom=residue["CA"]
                print ca_atom.get_coord()

perl

use strict;
use Bio::Structure::IO;

my $pdb_file = "1fat.pdb";
my $structio =  Bio::Structure::IO->new(-file => "$pdb_file",
                            -format => 'PDB');

my $struc = $structio->next_structure;
for my $chain ($struc->get_chains) {
    for my $res ($struc->get_residues($chain)) {
        for my $atom ($struc->get_atoms($res)) {
            print join " ",$atom->xyz,"\n" if $atom->pdb_atomname eq " CA ";        
        }
    }
}

で、ベンチマーク

$ time python test.py
real    0m1.161s
user    0m0.996s
sys     0m0.116s

$ time perl pdbtest.pl
real    0m3.183s
user    0m3.056s
sys     0m0.044s

平均とってないけど、何回か実行してみてもpythonのほうがbioperlよりも3倍くらい速かった。bioperlのコードってなんだかなと思うことがままある。pdb_atomnameなんかも4文字で前後にスペース入ってるし。というわけで、SBDD周りのプログラミングはbiopythonのほうが扱いやすい感じがしてる。

ProductName みんなのPython
柴田 淳
ソフトバンククリエイティブ / ?円 ( 2006-08-22 )


余談だが、Turbogears普通に触れる程度までpython覚えてやる(意地でも)とか思ったので、Dive Into Pythonも読み中。

BUGJAのWikiはPHP

どうでもいいひとにとっては些細なことかもしれんがBioperl Users Group in JapanがPHPなのが気になった。

KWIKIとかFreeStyle Wikiとかのperlなwikiという選択肢はなかったのかにゃ。

とか思ったら、本家MediawikiだからPHPなのね。

biophpってあんのかな?とかおもったらあんのね、びびった。

あと、Ajaxとかそんな処理するためにbioprototype.jsとかあればええなぁ。マルチプルアライメントの結果のアミノ酸onmouseoverしたら対応する立体構造の領域がハイライトするとか。そんな素敵なライブラリがあればええかも。

bioperlがWIKIっとる

bioperlがWIKIになっとる!MediaWikiが流行なのかな?

というより、モジュールリファレンスとかbioperl courseはどこだ?

colinux(debian)にBioperlとPerlMolをインストール

colinuxはtelnetとftpの設定してしまえば、後はpoderosaみたいなターミナルソフトでアクセスだ(colinuxのコンソールは使いづらい) あとキーボードを日本語対応にしたり、タイムゾーンを変更したりはココ参照だ。

とりあえず、せっかくdebian入れたことだし、sargeにアップグレードしておく。/etc/apt/source.list変えて、コマンドポチポチするだけダ。apt-getかなり便利と思った。

さて、Linux側の環境を整えたら、BioperlPerlMolをインストールするヨ。

  • PerlMol
  • オブジェクト指向で化合物とか反応を扱う。酸クロとかの反応用のモジュール作っておくとさらに便利。ただし、蛋白質とかの巨大なものを扱うにはどうじゃろか?今ひとつな気もする。構造立ち上げとかしっかりしてくればかなりいいツールになるんじゃないかと思っている。
  • Bioperl
  • とりあえずお約束。フォーマット変換とかは便利。ただし、モジュールの質はまちまち。ドキュメントに不備がある場合、直接コードを読むことになるが、そういうモジュールに限って泣きたくなる度が高い。で、結局自分で書いちゃったみたいな。

PerlMolはCPAN経由で入れる。

perl -MCPAN -e 'install PerlMol'

BioperlはCPAN経由だとやたらとはまって口が半開きになって、なんでだよチクショーなんてむかつきまくってイカリンコ汁が漏れるので、素直にapt-getで(それが大人スタイル)。

Package: bioperl

素直にしこしこapt-get installしましょう。blastとかclustalwなんかも一緒に入れておくと良いですぞ。

Bio::Biblio

PubMed ID から論文のリファレンスを作成して表示するプラグインが欲しいのでbioperlにいい感じのスクリプトが転がってないか調べていたのだが、どうもナサゲ。というより、実はちゃんとみたのが初めてだが、EBIとbless多め、サンプルスクリプト少な目な感じです(biblio関連だけ?)。

半日ぐらい費やして眺めていたらBio::Biblio*あたりはなんとなくわかったが、フェッチするとopenBQSに行ってしまう。-accessでNCBIに変えられるみたいだがイマイチいいサンプルがない。

bioperlに頼らずEutilsのRESTとXML-Parserでゴリゴリやったほうが早かったが、ワンライナーは便利だ。

$ perl -MBio::Biblio -e 'print new Bio::Biblio->get_by_id ("15931766")'

というわけで、週末にでもblosxom用のpubmedリファレンス用のプラグインを作ります。

pubmedプラグイン

blosxomでpubmedの文献リストをってことで、

<pubmed> 12368254 15949046 15942029 </pubmed>

みたいに書くとpubmedからタイトルとかとってきて表示してくれるプラグインを作ってみた。

12368254 15949046 15942029

結局NCBIのEutilsを使ってリストを作ってそれをキャッシュするようにした。後は、NCBIの文献情報にリンク張ったり、表示のおかしいとこなおしたりせねばならんが、、、、、

最近眠い。

bioperlでproxy

こんな感じに設定する。環境変数設定しとけばいいみたいな気もしたし、そういう記述も多かったので、ちょっとはまった。

use Bio::DB::GenBank; $gb = new Bio::DB::GenBank; $gb->proxy(['http'],'http://proxy:port');