https://github.com/csw/bioruby-maf
Raw File
Tip revision: 624447dd9d61f9b9b5acebfe669e10a7aae5596d authored by Clayton Wheeler on 21 June 2012, 19:50:34 UTC
Implemented concurrent index scans.
Tip revision: 624447d
maf_index
#!/usr/bin/env ruby

require 'benchmark'
require 'bio-maf'
require 'optparse'
require 'ostruct'

PRINTERS = {
  'flat' => :FlatPrinter,
  'stack' => :CallStackPrinter,
  'graph' => :GraphHtmlPrinter
}

$options = OpenStruct.new
$options.mode = :build
$options.reader = Bio::MAF::ChunkReader

def build_index(maf, index)
  parser = Bio::MAF::Parser.new(maf, :chunk_reader => $options.reader)
  idx = Bio::MAF::KyotoIndex.build(parser, index)
  idx.close
end

op = OptionParser.new do |opts|
  opts.banner = "Usage: maf_index [options] <maf> <index>"
  #opts.separator ""
  #opts.separator "Options:"
  opts.on("--time", "print elapsed time") do
    $options.bench = true
  end
  opts.on("-d", "--dump") do
    $options.mode = :dump
  end
  opts.on("-t", "--threaded") do
    $options.reader = Bio::MAF::ThreadedChunkReader
  end
  opts.on("--ruby-prof PATH", "Profile with ruby-prof") do |pspec|
    require 'ruby-prof'
    if pspec =~ /(\w+):(.+)/
      $options.ruby_prof_printer = RubyProf.const_get(PRINTERS.fetch($1))
      $options.ruby_prof_path = $2
    else
      $options.ruby_prof_printer = Ruby_Prof::FlatPrinter
      $options.ruby_prof_path = pspec
    end
  end
end

op.parse!(ARGV)

maf_p = ARGV.shift if $options.mode == :build
index_p = ARGV.shift

unless (maf_p || $options.mode == :dump) && index_p
  $stderr.puts op
  exit 1
end

if $options.ruby_prof_path
  RubyProf.start
end

case $options.mode
when :build
  if ! $options.bench
    build_index(maf_p, index_p)
  else
    bm_res = Benchmark.measure do
      build_index(maf_p, index_p)
    end
    puts bm_res
  end
when :dump
  idx = Bio::MAF::KyotoIndex.open(index_p)
  idx.dump
else
  raise "Unsupported mode: #{$options.mode}"
end

if $options.ruby_prof_path
  res = RubyProf.stop
  printer = $options.ruby_prof_printer.new(res)
  File.open($options.ruby_prof_path, 'w') do |f|
    printer.print(f)
  end
end
back to top