"GTG" => "V", "GCG" => "A", "GAG" => "E", "GGG" => "G"
}
-# Quality scores bases
-SCORE_BASE = 64
-SCORE_MIN = 0
-SCORE_MAX = 40
# Error class for all exceptions to do with Seq.
class SeqError < StandardError; end
class Seq
+ # Quality scores bases
+ SCORE_BASE = 64
+ SCORE_MIN = 0
+ SCORE_MAX = 40
+
include Digest
include Trim
# Method that determines if a quality score string can be
# absolutely identified as base 33.
def qual_base33?
- self.qual.match(/[!-:]/)
+ self.qual.match(/[!-:]/) ? true : false
end
# Method that determines if a quality score string can be
# absolutely identified as base 64.
def qual_base64?
- self.qual.match(/[K-h]/)
+ self.qual.match(/[K-h]/) ? true : false
+ end
+
+ # Method to determine if a quality score is valid.
+ def qual_valid?(encoding)
+ raise SeqError, "Missing qual" if self.qual.nil?
+
+ case encoding.downcase
+ when "sanger" then return true if self.qual.match(/^[!-~]*$/)
+ when "454" then return true if self.qual.match(/^[@-~]*$/)
+ when "solexa" then return true if self.qual.match(/^[;-~]*$/)
+ when "illumina13" then return true if self.qual.match(/^[@-~]*$/)
+ when "illumina15" then return true if self.qual.match(/^[@-~]*$/)
+ when "illumina18" then return true if self.qual.match(/^[!-~]*$/)
+ else raise SeqError, "unknown quality score encoding: #{encoding}"
+ end
+
+ false
end
# Method to convert quality scores inbetween formats.
# 454 base 64, range 0-40
# Solexa base 64, range -5-40
# Illumina13 base 64, range 0-40
- # Illumina15 base 64, range 3-40
+ # Illumina15 base 64, range 0-40
# Illumina18 base 33, range 0-41
def convert_scores!(from, to)
unless from == to
when "illumina13" then na_qual += 64
when "illumina15" then na_qual += 64
when "illumina18" then na_qual += 33
- else raise SeqError, "unknown quality score encoding: #{from}"
+ else raise SeqError, "unknown quality score encoding: #{to}"
end
self.qual = na_qual.to_s