class Basil::CLI

Public Class Methods

parse_arguments() click to toggle source
# File lib/basil/cli.rb, line 79
    def parse_arguments
      opts = Trollop::options do

        version "PRE-RELEASE"
        banner <<-EOS
Basil is an HTPS demultiplexer

Version: #{version}

Usage:
    basil [options] -i <reads/directory> -o <output directory>
where [options] are:
        EOS

        opt :barcodes, 'barcodes definition file', :short => 'b', :type => String
        opt :reads, 'reads (fastq/fasta/qseq)', :short => 'i', :type => String
        opt :illumina, 'Illumina output directory', :short => 'd'
        opt :out_fmt, 'Output format (default: same format as input)', :short => 'f'
        opt :pretrim, 'trim N nucleotides from start before searching for barcode', :type => Integer
        opt :out, 'output directory', :short => 'o', :type => String
      end

      filename = ARGV.shift
      Trollop::die :barcodes, "must specify barcodes" if opts[:barcodes].nil?
      Trollop::die :reads, "must specify reads or Illumina directory" if !(opts[:reads] || opts[:illumina])
      Trollop::die "cannot specify both reads and Illumina directory" if opts[:reads] && opts[:illumina]
      Trollop::die :out, "must specify output directory" if !opts[:out]
      opts
    end
parse_barcodes(barcodes) click to toggle source
# File lib/basil/cli.rb, line 54
def parse_barcodes barcodes
  barcodes_file =
    # barcodes included in barcodes/ directory?
    if Barcodes.has_barcode? barcodes
      Barcodes.barcode_path(barcodes)
    # barcodes specified by filename
    else
      barcodes
    end
  File.open(barcodes) { |h| Basil.parse_barcodes h }
end
parse_illumina_directory(dir) click to toggle source

For parsing illumina-generated output directories containing paired QSEQ files

# File lib/basil/cli.rb, line 70
def parse_illumina_directory dir
  files = Dir[File.join(dir, '*')]

  files.collect do |x|
    m = File.basename(x).match(/s_(\d)_(\d)_(\d*)_qseq\.txt/)
    { :lane => m[1], :pair => m[2], :n => m[3], :filename => File.join(dir, m[0]) }
  end.group_by { |x| x[:n] }
end
run!() click to toggle source
# File lib/basil/cli.rb, line 5
def run!

  opts           = parse_arguments
  barcodes       = parse_barcodes opts[:barcodes]
  out_dir        = opts[:out]
  buffer         = Buffer.new
  basil          = Basil.new(barcodes)
  handles        = Array.new

  if opts[:illumina]
    if pretrim
      raise "pretrim is not supported with paired-end data"
    end
  else
    reads_handle   = File.open(opts[:reads])
    handles       << reads_handle
    records_format = records.format
    pretrim        = opts[:pretrim] || 0
    afttrim        = -1*opts[:afttrim] || -1
  end

  if File.exist? out_dir
    $stderr.puts "#{out_dir} already exists -- delete or move!"
    exit
  else
    Dir.mkdir(out_dir)
  end

  records.each do |record|

    match = basil.recognize record.sequence
    barcode, sequence = match if match

    unless match
      barcode = 'unknown'
      trimmed_sequence = record.sequence
    end

    trimmed_sequence = record.sequence[pretrim..afttrim]

    new_record = Fasta.new :name => record.name, :sequence => trimmed_sequence
    buffer.add_to File.join(out_dir, barcode + ".#{records_format}"), new_record
  end

  # Finish up
  buffer.finalize
  handles.collect { |x| x.close }
end