Module: Bio::BioAlignment::Pal2Nal
- Included in:
- Alignment
- Defined in:
- lib/bio-alignment/pal2nal.rb
Instance Method Summary collapse
-
#pal2nal(nt_aln, options = { :codon_table => 1, :do_validate => true }) ⇒ Object
Protein to nucleotide alignment, using a codon table for testing.
Instance Method Details
#pal2nal(nt_aln, options = { :codon_table => 1, :do_validate => true }) ⇒ Object
Protein to nucleotide alignment, using a codon table for testing. If :do_validate is false, translation for validation is skipped (note CodonSequence translation is lazy).
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
# File 'lib/bio-alignment/pal2nal.rb', line 9 def pal2nal nt_aln, = { :codon_table => 1, :do_validate => true } do_validate = [:do_validate] aa_aln = self codon_aln = Alignment.new aa_aln.each_with_index do | aaseq, i | ntseq = nt_aln.sequences[i] raise "pal2nal sequence IDs do not match (for #{aaseq.id} != #{ntseq.id})" if aaseq.id != ntseq.id raise "pal2nal sequence size does not match (for #{aaseq.id}'s #{aaseq.to_s.size}!= #{ntseq.to_s.size * 3})" if aaseq.id != ntseq.id # create a Codon sequence out of the nucleotide sequence (no gaps) codonseq = CodonSequence.new(ntseq.id, ntseq.seq, ) codon_pos = 0 result = [] # now fill the result array by finding codons and gaps, and testing for valid amino acids aaseq.each do | aa | result << if aa.gap? '---' # inject codon gap else codon = codonseq[codon_pos] # validate codon translates to amino acid raise "codon does not match amino acid (for #{aaseq.id}, position #{codon_pos}, #{codon} translates to #{codon.to_aa} instead of #{aa.to_s})" if do_validate and codon.to_aa != aa.to_s codon_pos += 1 codon.to_s end end # the new result is transformed to a gapped CodonSequence codon_seq = CodonSequence.new(aaseq.id, result.join(''), ) codon_aln.sequences << codon_seq end codon_aln end |