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 :Hamming, 'maasha/seq/hamming'
+autoload :Levenshtein, 'maasha/seq/levenshtein'
+autoload :Ambiguity, 'maasha/seq/ambiguity'
# Residue alphabets
DNA = %w[a t c g]
"GTG" => "V", "GCG" => "A", "GAG" => "E", "GGG" => "G"
}
-
# Error class for all exceptions to do with Seq.
class SeqError < StandardError; end
# 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]
+ 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.
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
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)
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
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