X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=bp_bin%2Fremove_primers;h=6544afce3087b02dd53f83f8202e7f7c647c4aa5;hb=5de6112b70b59420b245ce636a8b2e3c90acbe00;hp=108f5856746485329dbc812daf56d07693b42f33;hpb=2f5b5f513a71b88e241bd917dd9107270959f8d6;p=biopieces.git diff --git a/bp_bin/remove_primers b/bp_bin/remove_primers index 108f585..6544afc 100755 --- a/bp_bin/remove_primers +++ b/bp_bin/remove_primers @@ -32,6 +32,9 @@ 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} @@ -44,28 +47,46 @@ options = Biopieces.options_parse(ARGV, casts) Biopieces.open(options[:stream_in], options[:stream_out]) do |input, output| input.each do |record| - if record.has_key? :SEQ - 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 - len = seq.length - pos - seq.subseq!(pos, len) if len > 0 + if record[:SEQ] + forward = false + reverse = false + entry = Seq.new_bp(record) + + entry.patscan(options[:forward].to_s, + max_mismatches: options[:mismatches], + max_insertions: options[:insertions], + max_deletions: options[:deletions]) do |match| + record[:FORWARD_POS] = match.pos + record[:FORWARD_LEN] = match.length + pos = match.pos + match.length + len = entry.length - pos + entry = entry[pos ... pos + len] if len > 0 + forward = true + break end - if pos < seq.length && reverse = seq.patscan(options[:reverse].to_s, pos, options[:mismatches], options[:insertions], options[:deletions]) - record[:REVERSE_POS] = reverse.first.pos - record[:REVERSE_LEN] = reverse.first.length + entry.patscan(options[:reverse].to_s, + max_mismatches: options[:mismatches], + max_insertions: options[:insertions], + max_deletions: options[:deletions]) do |match| + record[:REVERSE_POS] = match.pos + record[:REVERSE_LEN] = match.length pos = 0 - len = reverse.first.pos - seq.subseq!(pos, len) if len > 0 + len = match.pos + + if len == 0 + entry.seq = "" + entry.qual = "" if entry.qual + else + entry = entry[pos ... pos + len] + end + + reverse = true + break end - if pos > 0 - record.merge!(seq.to_bp) + if forward or reverse + record.merge!(entry.to_bp) end output.puts record