lib/bio/shell/plugin/seq.rb in bio-1.0.0 vs lib/bio/shell/plugin/seq.rb in bio-1.1.0

- old
+ new

@@ -1,13 +1,13 @@ # # = bio/shell/plugin/seq.rb - plugin for biological sequence manipulations # # Copyright:: Copyright (C) 2005 # Toshiaki Katayama <k@bioruby.org> -# License:: Ruby's +# License:: The Ruby License # -# $Id: seq.rb,v 1.17 2006/02/09 20:48:53 k Exp $ +# $Id: seq.rb,v 1.21 2007/04/05 23:35:41 trevor Exp $ # module Bio::Shell private @@ -15,11 +15,11 @@ # Convert sequence to colored HTML string def htmlseq(str) if str.kind_of?(Bio::Sequence) seq = str else - seq = seq(str) + seq = getseq(str) end if seq.is_a?(Bio::Sequence::AA) scheme = Bio::ColorScheme::Taylor else @@ -39,16 +39,25 @@ html += "</div>\n" return html end + def sixtrans(str) + seq = getseq(str) + [ 1, 2, 3, -1, -2, -3 ].each do |frame| + title = "Translation #{frame.to_s.rjust(2)}" + puts seq.translate(frame).to_fasta(title, 60) + end + end + + # Displays some basic properties of the sequence. def seqstat(str) max = 150 - seq = seq(str) + seq = getseq(str) rep = "\n* * * Sequence statistics * * *\n\n" - if seq.respond_to?(:complement) + if seq.moltype == Bio::Sequence::NA fwd = seq rev = seq.complement if seq.length > max dot = " ..." fwd = fwd.subseq(1, max) @@ -121,16 +130,16 @@ end # Displays a DNA sequence by ascii art in B-type double helix. # Argument need to be at least 16 bases in length. def doublehelix(str) - seq = seq(str) - if str.length < 16 + seq = getseq(str) + if seq.length < 16 warn "Error: Sequence must be longer than 16 bases." return end - if ! seq.respond_to?(:complement) + if seq.moltype != Bio::Sequence::NA warn "Error: Sequence must be a DNA sequence." return end pairs = [ [5, 0], [4, 2], [3, 3], [2, 4], [1, 4], [0, 3], [0, 2], [1, 0] ] @@ -148,9 +157,27 @@ end class String + + def step(window_size) + i = 0 + 0.step(self.length - window_size, window_size) do |i| + yield self[i, window_size] + end + yield self[i + window_size .. -1] if i + window_size < self.length + end + + def skip(window_size, step_size = 1) + i = 0 + 0.step(self.length - window_size, step_size) do |i| + yield [self[i, window_size], i + 1, i + window_size] + end + from = i + step_size + to = [self.length, i + step_size + window_size].min + yield [self[from, window_size], from + 1, to] if from + 1 <= to + end def to_naseq Bio::Sequence::NA.new(self) end