X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=code_ruby%2Flib%2Fmaasha%2Fseq.rb;h=73bf0552938cef82fa937aa43ff7be23b190c94b;hb=0ab290c76c4e253ea809f9a7c2321a28de72b286;hp=92ce19edaee4a9176487272a8f1a89c32c7ee806;hpb=a945a21356f87f679f433279e502676f425ac8ee;p=biopieces.git diff --git a/code_ruby/lib/maasha/seq.rb b/code_ruby/lib/maasha/seq.rb index 92ce19e..73bf055 100644 --- a/code_ruby/lib/maasha/seq.rb +++ b/code_ruby/lib/maasha/seq.rb @@ -27,8 +27,11 @@ require 'maasha/seq/digest' require 'maasha/seq/trim' require 'narray' -autoload :BackTrack, 'maasha/seq/backtrack.rb' -autoload :Dynamic, 'maasha/seq/dynamic.rb' +autoload :BackTrack, 'maasha/seq/backtrack' +autoload :Dynamic, 'maasha/seq/dynamic' +autoload :Homopolymer, 'maasha/seq/homopolymer' +autoload :Levenshtein, 'maasha/seq/levenshtein' +autoload :Ambiguity, 'maasha/seq/ambiguity' # Residue alphabets DNA = %w[a t c g] @@ -67,7 +70,6 @@ TRANS_TAB11 = { "GTG" => "V", "GCG" => "A", "GAG" => "E", "GGG" => "G" } - # Error class for all exceptions to do with Seq. class SeqError < StandardError; end @@ -383,8 +385,18 @@ class Seq # Method to determine the Hamming Distance between # two Sequence objects (case insensitive). - def hamming_distance(seq) - self.seq.upcase.hamming_distance(seq.seq.upcase) + def hamming_distance(entry, options = nil) + if options and options[:ambiguity] + Ambiguity.hamming_distance(self.seq, entry.seq) + else + self.seq.upcase.hamming_distance(entry.seq.upcase) + end + end + + # Method to determine the Edit Distance between + # two Sequence objects (case insensitive). + def edit_distance(entry) + Levenshtein.distance(self.seq, entry.seq) end # Method that generates a random sequence of a given length and type. @@ -416,6 +428,15 @@ class Seq self end + # Method to add two Seq objects. + def +(entry) + new_entry = Seq.new() + new_entry.seq = self.seq + entry.seq + new_entry.type = self.type if self.type == entry.type + new_entry.qual = self.qual + entry.qual if self.qual and entry.qual + new_entry + end + # Method to concatenate sequence entries. def <<(entry) raise SeqError, "sequences of different types" unless self.type == entry.type @@ -427,6 +448,25 @@ class Seq self end + # Index method for Seq objects. + def [](*args) + entry = Seq.new + entry.seq_name = self.seq_name + entry.seq = self.seq[*args] + entry.type = self.type + entry.qual = self.qual[*args] unless self.qual.nil? + + entry + end + + # Index assignment method for Seq objects. + def []=(*args, entry) + self.seq[*args] = entry.seq[*args] + self.qual[*args] = entry.qual[*args] unless self.qual.nil? + + self + end + # Method that returns a subsequence of from a given start position # and of a given length. def subseq(start, length = self.length - start) @@ -444,7 +484,9 @@ class Seq qual = self.qual[start .. stop] unless self.qual.nil? end - Seq.new(self.seq_name, seq, self.type, qual) # TODO changed self.seq_name.dup to self.seq_name -> consequence? + seq_name = self.seq_name.nil? ? nil : self.seq_name.dup + + Seq.new(seq_name, seq, self.type, qual) end # Method that replaces a sequence with a subsequence from a given start position @@ -485,23 +527,6 @@ class Seq comp end - # Method that returns the length of the longest homopolymeric stretch - # found in a sequence. - def homopol_max(min = 1) - return 0 if self.seq.nil? or self.seq.empty? - - found = false - - self.seq.upcase.scan(/A{#{min},}|T{#{min},}|G{#{min},}|C{#{min},}|N{#{min},}/) do |match| - found = true - min = match.size > min ? match.size : min - end - - return 0 unless found - - min - end - # Method that returns the percentage of hard masked residues # or N's in a sequence. def hard_mask