@type = options[:type]
@qual = options[:qual]
- if @qual and @seq.length != @qual.length
+ if @seq and @qual and @seq.length != @qual.length
raise SeqError, "Sequence length and score length mismatch: #{@seq.length} != #{@qual.length}"
end
end
raise SeqError, "Missing seq_name" if self.seq_name.nil? or self.seq_name == ''
raise SeqError, "Missing seq" if self.seq.nil? or self.seq.empty?
- seq_name = self.seq_name.to_s
- seq = self.seq.to_s
+ seq_name = self.seq_name
+ seq = self.seq.dup
unless wrap.nil?
seq.gsub!(/(.{#{wrap}})/) do |match|
seq.chomp!
end
- ">" + seq_name + $/ + seq + $/
+ ">" + seq_name.to_s + $/ + seq + $/
end
# Method that given a Seq entry returns a FASTQ entry (a string).
# Method to reverse the sequence.
def reverse
- Seq.new(
+ entry = Seq.new(
seq_name: self.seq_name,
seq: self.seq.reverse,
type: self.type,
qual: (self.qual ? self.qual.reverse : self.qual)
)
+
+ entry
end
# Method to reverse the sequence.
# Index method for Seq objects.
def [](*args)
entry = Seq.new
- entry.seq_name = self.seq_name
+ entry.seq_name = self.seq_name.dup if self.seq_name
entry.seq = self.seq[*args]
entry.type = self.type
entry.qual = self.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)
- raise SeqError, "subsequence start: #{start} < 0" if start < 0
- raise SeqError, "subsequence length: #{length} < 0" if length < 0
- raise SeqError, "subsequence start + length > Seq.length: #{start} + #{length} > #{self.length}" if start + length > self.length
-
- if length == 0
- seq = ""
- qual = "" unless self.qual.nil?
- else
- stop = start + length - 1
-
- seq = self.seq[start .. stop]
- qual = self.qual[start .. stop] unless self.qual.nil?
- end
-
- seq_name = self.seq_name.nil? ? nil : self.seq_name.dup
-
- Seq.new(seq_name: seq_name, seq: seq, type: self.type, qual: qual)
- end
-
- # Method that replaces a sequence with a subsequence from a given start position
- # and of a given length.
- def subseq!(start, length = self.length - start)
- s = subseq(start, length)
-
- self.seq_name = s.seq_name
- self.seq = s.seq
- self.type = s.type
- self.qual = s.qual
-
- self
- end
-
# Method that returns a subsequence of a given length
# beginning at a random position.
def subseq_rand(length)
start = rand(self.length - length + 1)
end
- self.subseq(start, length)
+ self[start .. start + length]
end
# Method that returns the residue compositions of a sequence in
regex_start = Regexp.new(start_codons.join('|'), true)
regex_stop = Regexp.new(stop_codons.join('|'), true)
- while pos_beg and pos_beg < self.length - size_min
- if pos_beg = self.seq.index(regex_start, pos_beg)
- if pos_end = self.seq.index(regex_stop, pos_beg)
- length = (pos_end - pos_beg) + 3
+ while pos_beg = self.seq.index(regex_start, pos_beg)
+ pos_end = pos_beg + 3
+
+ while pos_end = self.seq.index(regex_stop, pos_end)
+ length = (pos_end - pos_beg) + 3
- if (length % 3) == 0
- if size_min <= length and length <= size_max
- subseq = self.subseq(pos_beg, length)
+ if (length % 3) == 0
+ if size_min <= length and length <= size_max
+ subseq = self[pos_beg ... pos_beg + length]
- orfs << [subseq, pos_beg, pos_end + 3]
- end
+ orfs << [subseq, pos_beg, pos_end + 3]
end
+
+ break
end
- pos_beg += 1
+ pos_end += 1
end
+
+ pos_beg += 1
end
if pick_longest