require 'maasha/bits'
require 'maasha/backtrack'
require 'maasha/digest'
+require 'narray'
#require 'maasha/patscan'
# Residue alphabets
# Hard masks sequence residues where the corresponding quality score
# is below a given cutoff.
- def mask_seq_hard!(cutoff)
+ def mask_seq_hard_old(cutoff)
seq = self.seq.upcase
scores = self.qual
i = 0
self.seq = seq
end
+ # Hard masks sequence residues where the corresponding quality score
+ # is below a given cutoff.
+ def mask_seq_hard!(cutoff)
+ raise SeqError, "seq is nil" if self.seq.nil?
+ raise SeqError, "qual is nil" if self.qual.nil?
+ raise SeqError, "Bad cutoff value: #{cutoff}" unless (SCORE_MIN .. SCORE_MAX).include? cutoff
+
+ na_seq = NArray.to_na(self.seq, "byte")
+ na_qual = NArray.to_na(self.qual, "byte")
+ mask = (na_qual - SCORE_ILLUMINA) < cutoff
+
+ na_seq[mask] = 'N'.ord
+
+ self.seq = na_seq.to_s
+
+ self
+ end
+
# Soft masks sequence residues where the corresponding quality score
# is below a given cutoff.
def mask_seq_soft!(cutoff)
- seq = self.seq.upcase
- scores = self.qual
- i = 0
+ raise SeqError, "seq is nil" if self.seq.nil?
+ raise SeqError, "qual is nil" if self.qual.nil?
+ raise SeqError, "Bad cutoff value: #{cutoff}" unless (SCORE_MIN .. SCORE_MAX).include? cutoff
- scores.each_char do |score|
- seq[i] = seq[i].downcase if score.ord - SCORE_ILLUMINA < cutoff
- i += 1
- end
+ na_seq = NArray.to_na(self.seq, "byte")
+ na_qual = NArray.to_na(self.qual, "byte")
+ mask = (na_qual - SCORE_ILLUMINA) < cutoff
- self.seq = seq
+ na_seq[mask] ^= ' '.ord
+
+ self.seq = na_seq.to_s
+
+ self
end
# Method to convert the quality scores from a specified base
@entry.seq = "--AAAa"
assert_equal(25.00, @entry.soft_mask)
end
+
+ def test_Seq_mask_seq_hard_bang_with_nil_seq_raises
+ @entry.seq = nil
+ @entry.qual = ""
+
+ assert_raise(SeqError) { @entry.mask_seq_hard!(20) }
+ end
+
+ def test_Seq_mask_seq_hard_bang_with_nil_qual_raises
+ @entry.seq = ""
+ @entry.qual = nil
+
+ assert_raise(SeqError) { @entry.mask_seq_hard!(20) }
+ end
+
+ def test_Seq_mask_seq_hard_bang_with_bad_cutoff_raises
+ assert_raise(SeqError) { @entry.mask_seq_hard!(-1) }
+ assert_raise(SeqError) { @entry.mask_seq_hard!(41) }
+ end
+
+ def test_Seq_mask_seq_hard_bang_with_OK_cutoff_dont_raise
+ @entry.seq = "ATCG"
+ @entry.qual = "RSTU"
+
+ assert_nothing_raised { @entry.mask_seq_hard!(0) }
+ assert_nothing_raised { @entry.mask_seq_hard!(40) }
+ end
+
+ def test_Seq_mask_seq_hard_bang_returns_correctly
+ @entry.seq = "ATCG"
+ @entry.qual = "RSTU"
+
+ assert_equal("NNCG", @entry.mask_seq_hard!(20).seq)
+ end
+
+ def test_Seq_mask_seq_soft_bang_with_nil_seq_raises
+ @entry.seq = nil
+ @entry.qual = ""
+
+ assert_raise(SeqError) { @entry.mask_seq_soft!(20) }
+ end
+
+ def test_Seq_mask_seq_soft_bang_with_nil_qual_raises
+ @entry.seq = ""
+ @entry.qual = nil
+
+ assert_raise(SeqError) { @entry.mask_seq_soft!(20) }
+ end
+
+ def test_Seq_mask_seq_soft_bang_returns_correctly
+ @entry.seq = "ATCG"
+ @entry.qual = "RSTU"
+
+ assert_equal("atCG", @entry.mask_seq_soft!(20).seq)
+ end
+
+ def test_Seq_mask_seq_soft_bang_with_bad_cutoff_raises
+ assert_raise(SeqError) { @entry.mask_seq_soft!(-1) }
+ assert_raise(SeqError) { @entry.mask_seq_soft!(41) }
+ end
+
+ def test_Seq_mask_seq_soft_bang_with_OK_cutoff_dont_raise
+ @entry.seq = "ATCG"
+ @entry.qual = "RSTU"
+
+ assert_nothing_raised { @entry.mask_seq_soft!(0) }
+ assert_nothing_raised { @entry.mask_seq_soft!(40) }
+ end
end