X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=bp_bin%2Fremove_primers;h=6544afce3087b02dd53f83f8202e7f7c647c4aa5;hb=5de6112b70b59420b245ce636a8b2e3c90acbe00;hp=4e4e2e7fe48abdb101f4de2ae0a7e59e1097a1d3;hpb=bc41bf1f0f46fbf4c6468a0bc55bdb093c496084;p=biopieces.git diff --git a/bp_bin/remove_primers b/bp_bin/remove_primers index 4e4e2e7..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,26 +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 - seq.subseq!(pos) + 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 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 - pos = reverse.first.pos - seq.subseq!(0, pos) + 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 = 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