+ # Method to coerce quality scores to be within the 0-40 range.
+ def qual_coerce!(encoding)
+ raise SeqError, "Missing qual" if self.qual.nil?
+
+ case encoding
+ when :base_33 then self.qual.tr!("[J-~]", "I")
+ when :base_64 then self.qual.tr!("[i-~]", "h")
+ else raise SeqError, "unknown quality score encoding: #{encoding}"
+ end
+
+ self
+ end
+
+ # Method to convert quality scores.
+ def qual_convert!(from, to)
+ raise SeqError, "unknown quality score encoding: #{from}" unless from == :base_33 or from == :base_64
+ raise SeqError, "unknown quality score encoding: #{to}" unless to == :base_33 or to == :base_64
+
+ if from == :base_33 and to == :base_64
+ na_qual = NArray.to_na(self.qual, "byte")
+ na_qual += 64 - 33
+ self.qual = na_qual.to_s
+ elsif from == :base_64 and to == :base_33
+ self.qual.tr!("[;-?]", "@") # Handle negative Solexa values from -5 to -1 (set these to 0).
+ na_qual = NArray.to_na(self.qual, "byte")
+ na_qual -= 64 - 33