]> git.donarmstrong.com Git - biopieces.git/blobdiff - bp_bin/read_fastq
added pair-end power to read_fastq
[biopieces.git] / bp_bin / read_fastq
index 78a3fcceaf689bcf198e2544fb45316e8c92cb4b..0c5b9b2cff975de128aa8306db786d7af5ef1882 100755 (executable)
 require 'maasha/biopieces'
 require 'maasha/fastq'
 
+MAX_TEST = 1_000
+
 allowed_enc = 'auto,base_33,base_64'
 
 casts = []
 casts << {:long=>'data_in',  :short=>'i', :type=>'files!', :mandatory=>false, :default=>nil,    :allowed=>nil,         :disallowed=>nil}
+casts << {:long=>'data_in2', :short=>'j', :type=>'files!', :mandatory=>false, :default=>nil,    :allowed=>nil,         :disallowed=>nil}
 casts << {:long=>'num',      :short=>'n', :type=>'uint',   :mandatory=>false, :default=>nil,    :allowed=>nil,         :disallowed=>'0'}
 casts << {:long=>'encoding', :short=>'e', :type=>'string', :mandatory=>false, :default=>'auto', :allowed=>allowed_enc, :disallowed=>nil}
 
 options = Biopieces.options_parse(ARGV, casts)
 
-MAX_TEST = 1_000
+encoding = options[:encoding].to_sym
 
 num  = 0
 last = false
@@ -52,11 +55,59 @@ Biopieces.open(options[:stream_in], options[:stream_out]) do |input, output|
     end
   end
 
-  if options[:data_in]
-    options[:data_in].each do |file|
-      encoding = options[:encoding].downcase.to_sym
+  if options[:data_in] and options[:data_in2]
+    raise "data_in files differ" if options[:data_in].size != options[:data_in2].size
+
+    (0 ... options[:data_in].size).each do |i|
+      file1 = options[:data_in][i]
+      file2 = options[:data_in2][i]
+
+      io1 = Fastq.open(file1, 'r')
+      io2 = Fastq.open(file2, 'r')
+
+      while not io1.eof? and not io2.eof?
+        entry1 = io1.get_entry
+        entry2 = io2.get_entry
+
+        if encoding == :auto
+          if entry1.qual_base33? or entry2.qual_base33?
+            encoding = :base_33
+          elsif entry1.qual_base64? or entry2.qual_base64?
+            encoding = :base_64
+          else
+            raise SeqError, "Could not auto-detect quality score encoding"
+          end
+        end
+
+        entry1.qual_convert!(encoding, :base_33)
+        entry2.qual_convert!(encoding, :base_33)
+        entry1.qual_coerce!(:base_33)
+        entry2.qual_coerce!(:base_33)
 
-      Fastq.open(file, mode='r') do |fastq|
+        if num < MAX_TEST
+          raise SeqError, "Quality score outside valid range" unless entry1.qual_valid?(:base_33)
+          raise SeqError, "Quality score outside valid range" unless entry2.qual_valid?(:base_33)
+        end
+
+        output.puts entry1.to_bp
+        output.puts entry2.to_bp
+
+        num += 2
+
+        if options[:num] and num >= options[:num]
+          last = true
+          break
+        end
+      end
+
+      io1.close
+      io2.close
+
+      break if last
+    end
+  elsif options[:data_in]
+    options[:data_in].each do |file|
+      Fastq.open(file, 'r') do |fastq|
         fastq.each do |entry|
           if encoding == :auto
             if entry.qual_base33?