options = Biopieces.options_parse(ARGV, casts)
if options[:forward_rc]
- options[:forward] = Seq.new("test", options[:forward_rc], 'dna').revcomp.seq
+ options[:forward] = Seq.new("test", options[:forward_rc], 'dna').reverse.complement.seq
end
if options[:reverse_rc]
- options[:reverse] = Seq.new("test", options[:reverse_rc], 'dna').revcomp.seq
+ options[:reverse] = Seq.new("test", options[:reverse_rc], 'dna').reverse.complement.seq
end
raise ArgumentError, "no adaptor specified" unless options[:forward] or options[:reverse]
seq = Seq.new
seq.seq = primer
seq.type = 'dna'
- seq.revcomp
+ seq.reverse!.complement!
descriptor ? seq.seq + descriptor : seq.seq
end
infile = File.join(tmpdir, "in.fna")
if options[:forward_rc]
- options[:forward] = Seq.new("test", options[:forward_rc], 'dna').revcomp.seq
+ options[:forward] = Seq.new("test", options[:forward_rc], 'dna').reverse.complement.seq
end
if options[:reverse_rc]
- options[:reverse] = Seq.new("test", options[:reverse_rc], 'dna').revcomp.seq
+ options[:reverse] = Seq.new("test", options[:reverse_rc], 'dna').reverse.complement.seq
end
raise ArgumentError, "no adaptor specified" unless options[:forward] or options[:reverse]
while coverage(sum) < max_cov
entry = self.subseq_rand(size)
- entry.revcomp if strand == '-'
+ entry.reverse!.complement! if strand == '-'
if block_given?
yield entry
newseq = Seq.new(nil, @seq.seq[int_beg..int_end], "dna")
unless newseq.seq.nil?
- newseq.revcomp if comp
+ newseq.reverse!.complement! if comp
@subseq.seq << (order ? " " + newseq.seq : newseq.seq)
end
newseq = Seq.new(nil, @seq.seq[pos], "dna")
unless newseq.seq.nil?
- newseq.revcomp if comp
+ newseq.reverse!.complement! if comp
@subseq.seq << (order ? " " + newseq.seq : newseq.seq)
end
# by inspecting the first 100 residues.
def type_guess!
self.type = self.type_guess
+ self
end
# Returns the length of a sequence.
key
end
- # Method to reverse complement sequence.
- def reverse_complement
- self.reverse
- self.complement
- self
+ # Method to reverse the sequence.
+ def reverse
+ Seq.new(self.seq_name, self.seq.reverse, self.type, self.qual ? self.qual.reverse : self.qual)
end
- alias :revcomp :reverse_complement
-
# Method to reverse the sequence.
- def reverse
+ def reverse!
self.seq.reverse!
self.qual.reverse! if self.qual
self
def complement
raise SeqError, "Cannot complement 0 length sequence" if self.length == 0
+ entry = Seq.new
+ entry.seq_name = self.seq_name
+ entry.type = self.type
+ entry.qual = self.qual
+
+ if self.is_dna?
+ entry.seq = self.seq.tr('AGCUTRYWSMKHDVBNagcutrywsmkhdvbn', 'TCGAAYRWSKMDHBVNtcgaayrwskmdhbvn')
+ elsif self.is_rna?
+ entry.seq = self.seq.tr('AGCUTRYWSMKHDVBNagcutrywsmkhdvbn', 'UCGAAYRWSKMDHBVNucgaayrwskmdhbvn')
+ else
+ raise SeqError, "Cannot complement sequence type: #{self.type}"
+ end
+
+ entry
+ end
+
+ # Method that complements sequence including ambiguity codes.
+ def complement!
+ raise SeqError, "Cannot complement 0 length sequence" if self.length == 0
+
if self.is_dna?
self.seq.tr!('AGCUTRYWSMKHDVBNagcutrywsmkhdvbn', 'TCGAAYRWSKMDHBVNtcgaayrwskmdhbvn')
elsif self.is_rna?
else
raise SeqError, "Cannot complement sequence type: #{self.type}"
end
+
+ self
end
# Method to determine the Hamming Distance between
((self.seq.scan(/[a-z]/).size.to_f / (self.len - self.indels).to_f) * 100).round(2)
end
- # Hard masks sequence residues where the corresponding quality score
- # is below a given cutoff.
- def mask_seq_hard_old(cutoff)
- seq = self.seq.upcase
- scores = self.qual
- i = 0
-
- scores.each_char do |score|
- seq[i] = 'N' if score.ord - SCORE_BASE < cutoff
- i += 1
- end
-
- self.seq = seq
- end
-
# Hard masks sequence residues where the corresponding quality score
# is below a given cutoff.
def mask_seq_hard!(cutoff)
def test_Seq_reverse_returns_correctly
@entry.seq = "ATCG"
- assert_equal("GCTA", @entry.reverse.seq)
+ new_entry = @entry.reverse
+ assert_equal("GCTA", new_entry.seq)
+ assert_equal("ATCG", @entry.seq)
+ end
+
+ def test_Seq_reverse_bang_returns_correctly
+ @entry.seq = "ATCG"
+ @entry.reverse!
+ assert_equal("GCTA", @entry.seq)
end
def test_Seq_complement_raises_if_no_sequence
def test_Seq_complement_for_DNA_is_correct
@entry.seq = 'ATCGatcg'
@entry.type = 'dna'
- assert_equal("TAGCtagc", @entry.complement)
+ comp = @entry.complement
+ assert_equal("TAGCtagc", comp.seq)
+ assert_equal("ATCGatcg", @entry.seq)
end
def test_Seq_complement_for_RNA_is_correct
@entry.seq = 'AUCGaucg'
@entry.type = 'rna'
- assert_equal("UAGCuagc", @entry.complement)
+ comp = @entry.complement
+ assert_equal("UAGCuagc", comp.seq)
+ assert_equal("AUCGaucg", @entry.seq)
+ end
+
+ def test_Seq_complement_bang_raises_if_no_sequence
+ @entry.type = 'dna'
+ assert_raise(SeqError) { @entry.complement! }
+ end
+
+ def test_Seq_complement_bang_raises_on_bad_type
+ @entry.seq = 'ATCG'
+ @entry.type = 'protein'
+ assert_raise(SeqError) { @entry.complement! }
end
- def test_Seq_reverse_complement_for_DNA_is_correct
+ def test_Seq_complement_bang_for_DNA_is_correct
@entry.seq = 'ATCGatcg'
@entry.type = 'dna'
- assert_equal("cgatCGAT", @entry.reverse_complement.seq)
+ assert_equal("TAGCtagc", @entry.complement!.seq)
end
- def test_Seq_reverse_complement_for_RNA_is_correct
+ def test_Seq_complement_bang_for_RNA_is_correct
@entry.seq = 'AUCGaucg'
@entry.type = 'rna'
- assert_equal("cgauCGAU", @entry.reverse_complement.seq)
+ assert_equal("UAGCuagc", @entry.complement!.seq)
end
+
def test_Seq_hamming_distance_returns_correctly
seq1 = Seq.new("test1", "ATCG")
seq2 = Seq.new("test2", "atgg")