[BioRuby-ja] マルチファスタの取り扱いで質問2点

Shuji SHIGENOBU shige @ nibb.ac.jp
2005年 4月 26日 (火) 13:38:50 EDT


こんにちは,基生研の重信です.

話の流れからそれてしまいますが,私は,multi-FASTAからの配列の取得には
NCBI BLASTに付属のfastacmdを自作のRubyラッパーを介して使っています.ご存
じかもしれませんがfastacmd自体の使い方はこんな感じです.

$ fastacmd -d nr -s P25724 #ひとつのシークエンスをとってくるとき
$ fastacmd -d nr -s P25724,AAB59189,AAA28715" #複数のシークエンスをとっ
てくるとき.

formatdbでデータベースをフォーマットする際に -o オプションをつける必要が
あります.NCBIがFTPで提供しているntやnrなどのblastdbはそのまま使えます.

もちろんこれをRuby scriptの中で使いたいので,Rubyでwrapperを作りました.
以下に主要部分を書いておきます.(変なところがあったら皆さんつっこんで下
さい).

eachメソッドで全entryを走査できますし,Enumerableをincludeしているので,
collectやselectなどのメソッドもつかえます.ベンチマークをとったことはあ
りませんので他の方法と比べて速いかどうかはわかりませんけれども.ご参考に
なれば.


# blastdb.rb
# -- Ruby Wrapper for NCBI fastacmd
#
# author: Shuji SHIGENOBU <shige @ nibb.ac.jp>

require 'bio/db/fasta'
require 'bio/io/flatfile'
require 'open3'

module Bio

class BlastDB

include Enumerable

FASTACMD = 'fastacmd'

def initialize(db)
@database = db
end

def get_by_id(id)
cmd = "#{FASTACMD} -d #{@database} -s #{id}"
begin
inn, out, err = Open3.popen3(cmd)
result = out.read
err_msg = err.read
fas = Bio::FastaFormat.new(result)
return fas
rescue
raise "[Error] command execution failed : #{cmd}\n#{err_msg}"
ensure
inn.close; out.close; err.close
end
end

def get_by_ids(ids) # ids: Array object
cmd = "#{FASTACMD} -d #{@database} -s #{ids.join(',')}"
begin
inn, out, err = Open3.popen3(cmd)
err_msg = err.read
fas_set = Bio::FlatFile.new(Bio::FastaFormat, out).to_a
return fas_set
rescue
raise "[Error] command execution failed : #{cmd}\n#{err_msg}"
ensure
inn.close; out.close; err.close
end
end

def each_entry
cmd = "#{FASTACMD} -d #{@database} -D T"
io = IO.popen(cmd)
f = Bio::FlatFile.new(Bio::FastaFormat, io)
f.each_entry do |e|
yield e
end
io.close
end

alias :each :each_entry

end

end

if __FILE__ == $0
#test code

bdb = Bio::BlastDB.new("/db/myblastdb")

# Retrieve one sequence
puts bdb.get_by_id("P25724")

# Retrieve one more sequences
bdb.get_by_ids(["P25724", "AAB59189", "AAA28715"]).each do |fas|
puts fas
end

# Iterate all sequences
bdb.each do |fas|
p [fas.definition[0..30], fas.seq.size]
end

end


-- 
---
Shuji SHIGENOBU, Ph.D.
shige @ nibb.ac.jp

National Institutes of Natural Sciences
Okazaki Institute for Integrative Bioscience
National Institute for Basic Biology

Higashiyama, Myodaiji, Okazaki 444-8787
Japan

Phone: +81-564-59-5876
Fax:   +81-564-59-5879



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