[BioRuby-ja] Bio::Alignment::EnumerableExtension#consensus_iupac
遠藤大二
dendoh @ rakuno.ac.jp
2007年 7月 26日 (木) 12:29:35 UTC
後藤様
>consensus_iupac メソッドを使ってください。
degenerated nuclotide は、mafft alignment で一件でも − が有ると ?
になってしまいます。alignment の状況によっては −
があっても善意に解釈したいときもあります。そのような善意解釈ようのメソッドを作ってみました。NArrayを使うので一般用ではありませんが、何か御参考になればと思い下記に送ります。問題点など御指摘いただけると幸いです。
require 'bio'
require 'narray'
# 配列を一旦整数の配列にします
def convert_n(array_l)
nuclno={"-"=>0, "a"=>1, "c"=>2, "g"=>4, "t"=>8, "m"=>3, "r"=>5,
"w"=>9, "s"=>6, "y"=>10, "k"=>12, "v"=>7, "h"=>11, "d"=>13, "b"=>14,
"n"=>15}
array_n=[]
array_l.each {|x|
array_n << nuclno[x]
}
return array_n
end
# 整数のNArray配列を塩基配列に戻します
def rev_convert_seq(seqn_narray)
nuclno={"-"=>0, "a"=>1, "c"=>2, "g"=>4, "t"=>8, "m"=>3, "r"=>5,
"w"=>9, "s"=>6, "y"=>10, "k"=>12, "v"=>7, "h"=>11, "d"=>13, "b"=>14,
"n"=>15}
nucllet=nuclno.invert
seq_l=[]
seqn_narray.each {|x|
seq_l << nucllet[x]
}
return seq_l
end
# MAFFT用のオブジェクトを作成
factory = Bio::MAFFT.new
# オプションを設定
factory.options = %w[ --maxiterate 1000 ]
# 配列データの例
seqs = [
'atgcaacgca' * 50,
'aagcaacgcg' * 50,
'acgcaaagca' * 50,
'acgcgatgca' * 50
]
seqs = seqs.collect { |s| Bio::Sequence::NA.new(s) }
# アライメントオブジェクトの作成
aseq=Bio::Alignment.new(seqs)
# MAFFTでアライメントを行う
#aligned = aseq.do_align(factory)
## MAFFTでアライメントを行う方法その2
result = factory.query(aseq)
aligned = result.alignment
print aligned.output_clustal
puts aligned.consensus_iupac
# 結果出力の例
# print aligned.output_clustal
# puts aligned.consensus_string
a_seq=[]
aligned.each {|x|
e_seq=x.to_s.downcase
@ssize=e_seq.length
a_seq << e_seq.split(//)
# p a_seq
}
mtx_seq=[]
a_seq.each {|element|
mtx_seq << convert_n(element)
}
# degenerated nucleotide の算出をbitor演算に置き換えました
bs_na_seq=NArray.int(@ssize)
mtx_seq.each {|n_seq|
na_seq=NArray.to_na(n_seq)
bs_na_seq = bs_na_seq|na_seq
}
# 整数のNArray配列を塩基配列に戻します
a_deg_seq=rev_convert_seq(bs_na_seq)
deg_seq=a_deg_seq.join("")
p deg_seq
> > ffa.alignment でアライメントオブジェクト
> > (Bio::Alignment::OriginalAlignmentクラスのオブジェクト)
> > が得られるので、それを使ってください。
> >
> > Bio::Alignment::EnumerableExtension は、Enumerableという
> > 性質を持つRubyのオブジェクトをAlignmentっぽく扱うために拡張する
> > ためのモジュールですので、上記のようには使えません。
> > ちなみに、BioRubyが用意しているアライメント用のクラス
> > (Bio::Alignment::OriginalAlignmentなど)は、内部でこれを
> > 利用しています。
>
> ただ、実は、単なるコンセンサスだけではなく、degenerated
> nuclotideも記載したいと考えております。もし、そのようなメソッドがあれば、教えていただけると大変助かります。
--
酪農学園大学 獣医学部 放射線学教室
遠藤大二
Tel: 011-388-4847
Fax:011-387-5890
BioRuby-ja メーリングリストの案内