[BioRuby-ja] BLASTscoreの取り扱いエラー

Naohisa GOTO ngoto @ gen-info.osaka-u.ac.jp
2008年 7月 29日 (火) 08:41:23 UTC


後藤です。

On Mon, 28 Jul 2008 18:17:07 +0900
Hiromi Matsumae <matsumae @ bioinfo.tmd.ac.jp> wrote:

> 東京医歯大の松前と申します。
> 
> Ruby1.8.6 / Bioruby1.2.1でBLASTの結果をパースしていたと 
> ころ、
> e-valueを取り出す段階で、以下のようなエラーを吐きました。
> 
> /ruby/site_ruby/1.8/bio/appl/blast/format0.rb:1023:in `parse_score':  
> StringScanner::Error (StringScanner::Error)
> from (eval):1:in `evalue'
> 
> 躓いたファイルを見てみると、e-valueが問題ではなく、
> scoreの値が、1.628e+04となっており、
> このscoreの値を試しに100に書き換えたところ、
> この問題は回避されましたので、ご注意いただければと思います。
> 既出でしたら申し訳ありません。

お知らせありがとうございました。
確かに、長い配列間でBLASTを実行すると、スコアが指数表記になりますが、
それに十分に対応できていませんでした。

以下、手元で試した結果の抜粋です。(BLASTN 2.2.15 と 2.2.18 で確認)
==============================================================================
>gi|47118301|dbj|BA000007.2| Escherichia coli O157:H7 str. Sakai DNA,
               complete genome
          Length = 5498450

 Score = 1.090e+07 bits (5498450), Expect = 0.0
 Identities = 5498450/5498450 (100%)
 Strand = Plus / Plus
==============================================================================

開発中のバージョンでは修正したので、次のバージョンでは反映されると思います。
修正内容は
http://github.com/ngoto/bioruby/commit/9256ce8e0c25d9097db2267829b294e9a8b38823
を参照してください。

bioruby-1.2.1 に対する、スコアに関するところだけを直す最低限のパッチは
以下のとおりです。
==============================================================================
--- lib/bio/appl/blast/format0.rb.ORIG~	2007-12-28 02:28:57.000000000 +0900
+++ lib/bio/appl/blast/format0.rb	2008-07-29 17:36:19.000000000 +0900
@@ -972,7 +972,7 @@
                   ev = sc[1].to_s
                   ev = '1' + ev if ev[0] == ?e
                   @evalue = ev.to_f
-                elsif sc.skip(/Score *\= *([e\-\.\d]+) *bits *\( *([e\-\.\d]+) *\)/) then
+                elsif sc.skip(/Score *\= *([e\+\-\.\d]+) *bits *\( *([e\+\-\.\d]+) *\)/) then
                   bs = sc[1]
                   bs = '1' + bs if bs[0] == ?e
                   @bit_score = bs.to_f
@@ -1016,7 +1016,7 @@
                   if sc[2] then
                     @hit_frame = sc[3].to_i
                   end
-                elsif sc.skip(/Score *\= *([e\-\.\d]+) +\(([e\-\.\d]+) *bits *\)/) then
+                elsif sc.skip(/Score *\= *([e\+\-\.\d]+) +\(([e\+\-\.\d]+) *bits *\)/) then
                   #WU-BLAST
                   @score = sc[1].to_i
                   bs = sc[2]
==============================================================================


-- 
後藤 直久  ngoto @ gen-info.osaka-u.ac.jp / ng @ bioruby.org



BioRuby-ja メーリングリストの案内