[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 メーリングリストの案内