require 'pp'
require 'maasha/biopieces'
require 'maasha/seq'
+require 'maasha/seq/backtrack'
+
+include BackTrack
casts = []
casts << {:long=>'forward', :short=>'f', :type=>'string', :mandatory=>true, :default=>nil, :allowed=>nil, :disallowed=>nil}
Biopieces.open(options[:stream_in], options[:stream_out]) do |input, output|
input.each do |record|
if record.has_key? :SEQ
+ forward = false
+ reverse = false
seq = Seq.new_bp(record)
- pos = 0
- if forward = seq.patscan(options[:forward].to_s, pos, options[:mismatches], options[:insertions], options[:deletions])
- record[:FORWARD_POS] = forward.last.pos
- record[:FORWARD_LEN] = forward.last.length
- pos = forward.last.pos + forward.last.length
- seq.subseq!(pos)
+ seq.patscan(options[:forward].to_s, 0, options[:mismatches], options[:insertions], options[:deletions]) do |match|
+ record[:FORWARD_POS] = match.pos
+ record[:FORWARD_LEN] = match.length
+ pos = match.pos + match.length
+ len = seq.length - pos
+ seq.subseq!(pos, len) if len > 0
+ forward = true
+ break
end
- if reverse = seq.patscan(options[:reverse].to_s, pos, options[:mismatches], options[:insertions], options[:deletions])
- record[:REVERSE_POS] = reverse.last.pos
- record[:REVERSE_LEN] = reverse.last.length
- pos = reverse.last.pos
- seq.subseq!(pos)
+ seq.patscan(options[:reverse].to_s, 0, options[:mismatches], options[:insertions], options[:deletions]) do |match|
+ record[:REVERSE_POS] = match.pos
+ record[:REVERSE_LEN] = match.length
+ pos = 0
+ len = match.pos
+
+ if len == 0
+ seq.seq = ""
+ seq.qual = "" if seq.qual
+ else
+ seq.subseq!(pos, len)
+ end
+
+ reverse = true
+ break
end
- if pos > 0
+ if forward or reverse
record.merge!(seq.to_bp)
end