+require 'maasha/biopieces'
+require 'maasha/fastq'
+
+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=>'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
+
+num = 0
+last = false
+
+Biopieces.open(options[:stream_in], options[:stream_out]) do |input, output|
+ unless options[:data_in] and options[:data_in].first == '-'
+ input.each_record do |record|
+ output.puts record
+ end
+ end
+
+ if options[:data_in]
+ options[:data_in].each do |file|
+ encoding = options[:encoding].downcase.to_sym
+
+ Fastq.open(file, mode='r') do |fastq|
+ fastq.each do |entry|
+ if encoding == :auto
+ if entry.qual_base33?
+ encoding = :base_33
+ elsif entry.qual_base64?
+ encoding = :base_64
+ else
+ raise SeqError, "Could not auto-detect quality score encoding"
+ end
+ end
+
+ entry.qual_convert!(encoding, :base_33)
+ entry.qual_coerce!(:base_33)
+
+ if num < MAX_TEST
+ raise SeqError, "Quality score outside valid range" unless entry.qual_valid?(:base_33)
+ end
+
+ output.puts entry.to_bp
+ num += 1
+
+ if options[:num] == num
+ last = true
+ break
+ end
+ end
+ end
+
+ break if last
+ end
+ end
+end