Basil 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ rspec -c -f d
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm use 1.8.7@basil --create
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source :rubygems
2
+ gemspec
3
+ gem "dna"
4
+ gem "awesome_print"
5
+ gem "trollop"
6
+ gem "rspec"
7
+ gem "awesome_print"
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,74 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "Basil"
8
+ s.version = "0.1.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Austin G. Davis-Richardson"]
12
+ s.date = "2012-09-18"
13
+ s.description = "Separate Illumin and 454 sequence output by barcode"
14
+ s.email = "harekrishna@gmail.com"
15
+ s.executables = ["basil"]
16
+ s.files = [
17
+ ".rspec",
18
+ ".rvmrc",
19
+ "Gemfile",
20
+ "Rakefile",
21
+ "basil.gemspec",
22
+ "bin/basil",
23
+ "lib/basil.rb",
24
+ "lib/basil/barcodes.rb",
25
+ "lib/basil/basil.rb",
26
+ "lib/basil/buffer.rb",
27
+ "lib/basil/cli.rb",
28
+ "readme.md",
29
+ "spec/basil_spec.rb",
30
+ "spec/buffer_spec.rb",
31
+ "spec/cli_spec.rb",
32
+ "spec/data/barcodes.csv",
33
+ "spec/data/illumina/s_1_1_001_qseq.txt",
34
+ "spec/data/illumina/s_1_2_001_qseq.txt",
35
+ "spec/data/illumina/s_1_3_001_qseq.txt",
36
+ "spec/data/test.fasta",
37
+ "spec/data/test.fastq",
38
+ "spec/data/test.qseq",
39
+ "spec/spec_helper.rb"
40
+ ]
41
+ s.homepage = "http://audy.github.com/basil"
42
+ s.licenses = ["MIT"]
43
+ s.require_paths = ["lib"]
44
+ s.rubygems_version = "1.8.24"
45
+ s.summary = "HTPS Demultiplexer"
46
+
47
+ if s.respond_to? :specification_version then
48
+ s.specification_version = 3
49
+
50
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
51
+ s.add_runtime_dependency(%q<Basil>, [">= 0"])
52
+ s.add_runtime_dependency(%q<dna>, [">= 0"])
53
+ s.add_runtime_dependency(%q<trollop>, [">= 0"])
54
+ s.add_runtime_dependency(%q<progressbar>, [">= 0"])
55
+ s.add_development_dependency(%q<jeweler>, [">= 0"])
56
+ s.add_development_dependency(%q<jeweler>, [">= 0"])
57
+ else
58
+ s.add_dependency(%q<Basil>, [">= 0"])
59
+ s.add_dependency(%q<dna>, [">= 0"])
60
+ s.add_dependency(%q<trollop>, [">= 0"])
61
+ s.add_dependency(%q<progressbar>, [">= 0"])
62
+ s.add_dependency(%q<jeweler>, [">= 0"])
63
+ s.add_dependency(%q<jeweler>, [">= 0"])
64
+ end
65
+ else
66
+ s.add_dependency(%q<Basil>, [">= 0"])
67
+ s.add_dependency(%q<dna>, [">= 0"])
68
+ s.add_dependency(%q<trollop>, [">= 0"])
69
+ s.add_dependency(%q<progressbar>, [">= 0"])
70
+ s.add_dependency(%q<jeweler>, [">= 0"])
71
+ s.add_dependency(%q<jeweler>, [">= 0"])
72
+ end
73
+ end
74
+
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib', 'basil'))
4
+
5
+ Basil::CLI.run!
@@ -0,0 +1,8 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+
4
+ Bundler.require :default
5
+
6
+ Dir.glob(File.join(File.dirname(__FILE__), 'basil', '*.rb')).each do |f|
7
+ require f
8
+ end
@@ -0,0 +1,3 @@
1
+ class Barcodes
2
+ # TODO add commonly used barcodes where copyright permits.
3
+ end
@@ -0,0 +1,60 @@
1
+ module Basil
2
+
3
+ class Basil
4
+
5
+ #
6
+ # Gets Basil ready, must specify a barcodes hash with Basil.new barcodes
7
+ #
8
+ # Barcodes hash has regexp for values. If not, strings are converted to regexp
9
+ # Barcode names are keys, used to generate filenames.
10
+ #
11
+ def initialize(barcodes)
12
+ @barcodes = Hash.new
13
+ barcodes.each_pair do |k, v|
14
+ @barcodes[k] = Regexp.new "^#{v}", true
15
+ end
16
+ @barcodes
17
+ end
18
+
19
+ #
20
+ # Finds the barcode (if present)
21
+ #
22
+ # If the barcode is present, returns 'name',
23
+ # and the sequence with the barcode removed
24
+ # If not, returns nil
25
+ #
26
+ def recognize(string)
27
+ matches = @barcodes.each_pair.collect do |k, v|
28
+ k if string[v]
29
+ end
30
+
31
+ matches.compact!
32
+
33
+ if matches.length > 1
34
+ raise Exception, "sequence #{string} has more than one match"
35
+ elsif matches.length == 0
36
+ nil
37
+ else
38
+ barcode = matches.first
39
+ sequence = string.gsub(@barcodes[barcode], '')
40
+ [barcode, sequence]
41
+ end
42
+ end
43
+
44
+ #
45
+ # Parses a barcodes file
46
+ #
47
+ # barcodes are specified in CSV file
48
+ # (unless specified otherwise with :sep => '')
49
+ # barcode_name,sequence
50
+ # the barcode_name will be used to generate the filename
51
+ #
52
+ def self.parse_barcodes(handle, args={})
53
+ sep = args[:sep] || ","
54
+ barcodes = handle.each.collect do |line|
55
+ name, barcode = line.strip.split(sep)
56
+ end
57
+ Hash[*barcodes.flatten]
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,50 @@
1
+ module Basil
2
+ class Buffer
3
+
4
+ #
5
+ # Create a new buffer
6
+ #
7
+ def initialize(args={})
8
+ @buffer = Hash.new { |h, k| h[k] = Array.new }
9
+ @buffer_max = args[:buffer_max] || 100_000
10
+ end
11
+
12
+ #
13
+ # Add an object to the buffer
14
+ #
15
+ def add_to(bucket, obj)
16
+
17
+ @buffer[bucket] << obj
18
+
19
+ if @buffer[bucket].length > @buffer_max
20
+ # write out
21
+ File.open(bucket, 'a+') do |out|
22
+ @buffer[bucket].each do |v|
23
+ out.puts v
24
+ end
25
+ end
26
+
27
+ # clear that bucket
28
+ @buffer[bucket].clear
29
+ end
30
+ end
31
+
32
+ def [](k)
33
+ @buffer[k]
34
+ end
35
+
36
+ #
37
+ # Writes out leftover objects
38
+ #
39
+ def finalize
40
+ @buffer.each_key do |bucket|
41
+ File.open(bucket, 'a+') do |out|
42
+ @buffer[bucket].each do |v|
43
+ out.puts v
44
+ end
45
+ end
46
+ end
47
+ end
48
+
49
+ end
50
+ end
@@ -0,0 +1,102 @@
1
+ module Basil
2
+ class CLI
3
+ class << self
4
+
5
+ def run!
6
+
7
+ opts = parse_arguments
8
+ barcodes = parse_barcodes opts[:barcodes]
9
+ out_dir = opts[:out]
10
+ buffer = Buffer.new
11
+ basil = Basil.new(barcodes)
12
+ handles = Array.new
13
+
14
+ if opts[:illumina]
15
+ if pretrim
16
+ raise "pretrim is not supported with paired-end data"
17
+ end
18
+ else
19
+ reads_handle = File.open(opts[:reads])
20
+ handles << reads_handle
21
+ records_format = records.format
22
+ pretrim = opts[:pretrim] || 0
23
+ afttrim = -1*opts[:afttrim] || -1
24
+ end
25
+
26
+ if File.exist? out_dir
27
+ $stderr.puts "#{out_dir} already exists -- delete or move!"
28
+ exit
29
+ else
30
+ Dir.mkdir(out_dir)
31
+ end
32
+
33
+ records.each do |record|
34
+
35
+ match = basil.recognize record.sequence
36
+ barcode, sequence = match if match
37
+
38
+ unless match
39
+ barcode = 'unknown'
40
+ trimmed_sequence = record.sequence
41
+ end
42
+
43
+ trimmed_sequence = record.sequence[pretrim..afttrim]
44
+
45
+ new_record = Fasta.new :name => record.name, :sequence => trimmed_sequence
46
+ buffer.add_to File.join(out_dir, barcode + ".#{records_format}"), new_record
47
+ end
48
+
49
+ # Finish up
50
+ buffer.finalize
51
+ handles.collect { |x| x.close }
52
+ end
53
+
54
+ def parse_barcodes barcodes
55
+ File.open(barcodes) { |h| Basil.parse_barcodes h }
56
+ end
57
+
58
+ #
59
+ # For parsing illumina-generated output directories containing
60
+ # paired QSEQ files
61
+ #
62
+ def parse_illumina_directory dir
63
+ files = Dir[File.join(dir, '*')]
64
+
65
+ files.collect do |x|
66
+ m = File.basename(x).match(/s_(\d)_(\d)_(\d*)_qseq\.txt/)
67
+ { :lane => m[1], :pair => m[2], :n => m[3], :filename => File.join(dir, m[0]) }
68
+ end.group_by { |x| x[:n] }
69
+ end
70
+
71
+ def parse_arguments
72
+ opts = Trollop::options do
73
+
74
+ version "PRE-RELEASE"
75
+ banner <<-EOS
76
+ Basil is an HTPS demultiplexer
77
+
78
+ Version: #{version}
79
+
80
+ Usage:
81
+ basil [options] -i <reads/directory> -o <output directory>
82
+ where [options] are:
83
+ EOS
84
+
85
+ opt :barcodes, 'barcodes definition file', :short => 'b', :type => String
86
+ opt :reads, 'reads (fastq/fasta/qseq)', :short => 'i', :type => String
87
+ opt :illumina, 'Illumina output directory', :short => 'd'
88
+ opt :out_fmt, 'Output format (default: same format as input)', :short => 'f'
89
+ opt :pretrim, 'trim N nucleotides from start before searching for barcode', :type => Integer
90
+ opt :out, 'output directory', :short => 'o', :type => String
91
+ end
92
+
93
+ filename = ARGV.shift
94
+ Trollop::die :barcodes, "must specify barcodes" if opts[:barcodes].nil?
95
+ Trollop::die :reads, "must specify reads or Illumina directory" if !(opts[:reads] || opts[:illumina])
96
+ Trollop::die "cannot specify both reads and Illumina directory" if opts[:reads] && opts[:illumina]
97
+ Trollop::die :out, "must specify output directory" if !opts[:out]
98
+ opts
99
+ end
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,49 @@
1
+ # Basil
2
+
3
+ Yet another tool for splitting barcoded sequences. It had to be done.
4
+
5
+ ## Installation
6
+
7
+ You're gonna need Ruby 1.8.7 or better.
8
+
9
+ (sudo) gem install basil
10
+
11
+ ## Features
12
+
13
+ **Demultiplexes multiplexed high-throughput sequencing data for Illumina, Roche 454, IonTorrent, _etc_... sequence data in their native formats**
14
+
15
+ - Supports unlimited number of barcodes
16
+ - Trimming from left end of read
17
+ - Barcodes provided as simple .csv file
18
+ - Support input filetypes:
19
+ - Fastq
20
+ - Fasta
21
+
22
+ ## TODO
23
+
24
+ - Support regexp in barcodes input.
25
+
26
+ ## Usage
27
+
28
+ Usage:
29
+ basil [options] -i <reads/directory> -o <output directory>
30
+ where [options] are:
31
+ --barcodes, -b <s>: barcodes definition file
32
+ --reads, -i: reads (fastq/fasta/qseq)
33
+ --illumina, -d: Illumina output directory
34
+ --pretrim, -p <i>: trim N nucleotides from start
35
+ --afttrim, -a <i>: trim N nucleotides from end
36
+ --out, -o <s>: output directory
37
+ --version, -v: Print version and exit
38
+ --help, -h: Show this message
39
+
40
+ ## Barcodes file
41
+
42
+ Barcodes are specified in a simple CSV file:
43
+
44
+ barcode_name,barcode_sequence
45
+ my_awesome_barcode,gggggggg
46
+ my_awesomer_barcode,aaaaaaaa
47
+ my_awesomest_barcode,cccccccc
48
+
49
+ (Eventually, I will add built-in support for commonly-used barcodes)
@@ -0,0 +1,57 @@
1
+ require 'spec_helper'
2
+
3
+ describe Basil::Basil do
4
+
5
+ let (:barcodes) {
6
+ {
7
+ 1 => 'gggg',
8
+ 2 => 'aaaa',
9
+ 3 => 'tttt',
10
+ 4 => 'cccc',
11
+ }
12
+ }
13
+
14
+ let (:basil) { Basil::Basil.new barcodes }
15
+
16
+ let (:dna) { 'ggggnnnn' }
17
+
18
+ it 'can be created' do
19
+ barcodes.should_not raise_error TypeError
20
+ end
21
+
22
+ it 'raises an error if duplicate barcodes are specified' do
23
+ Basil::Basil.new({ 1 => 'gggg', 2 => 'gggg' }).should raise_error
24
+ end
25
+
26
+ it '#recognize returns the name of matched barcode' do
27
+ basil.recognize(dna).first.should == 1
28
+ end
29
+
30
+ it 'accepts regexp for barcodes' do
31
+ basil = Basil::Basil.new({ 1 => /^.GATC/i})
32
+ basil.recognize("NGATC").first.should == 1
33
+ end
34
+
35
+ it 'preserves case sensitivity of regexp' do
36
+ basil = Basil::Basil.new(1 => /^.GATC/)
37
+ basil.recognize("Ngatc").should be_nil
38
+ end
39
+
40
+ it '#recognize is case insensitive' do
41
+ basil.recognize(dna.upcase!).first.should == 1
42
+ end
43
+
44
+ it '#recognize ^ is prepended to barcode regexp if strings are provided' do
45
+ basil.recognize('aggggaaa').should be_nil
46
+ end
47
+
48
+ it 'trims barcode from sequence' do
49
+ basil.recognize(dna).last.should == 'nnnn'
50
+ end
51
+
52
+ it 'can parse a barcodes.csv file producing a hash' do
53
+ parsed_barcodes = File.open('spec/data/barcodes.csv') { |h| Basil::Basil.parse_barcodes h }
54
+ parsed_barcodes.should == { 'a' => 'a'*7, 'g' => 'g'*7, 'c' => 'c'*7, 't' => 't'*7 }
55
+ end
56
+
57
+ end
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ describe Basil::Buffer do
4
+
5
+ let (:buffer) { Basil::Buffer.new }
6
+
7
+ it 'can be created' do
8
+ buffer.should_not raise_error TypeError
9
+ end
10
+
11
+ it 'can be given stuff' do
12
+ buffer['thing'] << 'another thing'
13
+ buffer['thing'].first.should == 'another thing'
14
+ end
15
+ end
@@ -0,0 +1,28 @@
1
+ describe Basil::CLI do
2
+
3
+ it 'should be executable' do
4
+ `bin/basil 2> /dev/null`
5
+ $?.should_not == 0
6
+ end
7
+
8
+ it 'should have a help menu' do
9
+ `bin/basil --help`.include?('help').should be_true
10
+ end
11
+
12
+ it 'should parse barcodes.csv files' do
13
+ barcodes = Basil::CLI.parse_barcodes 'spec/data/barcodes.csv'
14
+ barcodes.should == { "a" => "aaaaaaa", "g" => "ggggggg", "c" => "ccccccc", "t" => "ttttttt"}
15
+ end
16
+
17
+ it 'can parse an illumina output directory' do
18
+ files = Basil::CLI.parse_illumina_directory 'spec/data/illumina'
19
+ directory = {
20
+ "001" => [
21
+ {:lane=>"1", :pair=>"1", :n=>"001", :filename=>"spec/data/illumina/s_1_1_001_qseq.txt"},
22
+ {:lane=>"1", :pair=>"2", :n=>"001", :filename=>"spec/data/illumina/s_1_2_001_qseq.txt"},
23
+ {:lane=>"1", :pair=>"3", :n=>"001", :filename=>"spec/data/illumina/s_1_3_001_qseq.txt"}
24
+ ]
25
+ }
26
+ files.should == directory
27
+ end
28
+ end
@@ -0,0 +1,4 @@
1
+ a,aaaaaaa
2
+ g,ggggggg
3
+ c,ccccccc
4
+ t,ttttttt
@@ -0,0 +1,5 @@
1
+ HWUSI-EAS1700R 5 4 1 975 930 0 2 ....... BBBBBBB 0
2
+ HWUSI-EAS1700R 5 4 1 1051 933 0 2 ....... BBBBBBB 0
3
+ HWUSI-EAS1700R 5 4 1 1233 932 0 2 ....... BBBBBBB 0
4
+ HWUSI-EAS1700R 5 4 1 1266 945 0 2 ....... BBBBBBB 0
5
+ HWUSI-EAS1700R 5 4 1 1373 940 0 2 ....... BBBBBBB 0
@@ -0,0 +1,5 @@
1
+ HWUSI-EAS1700R 5 4 1 975 930 0 2 ....... BBBBBBB 0
2
+ HWUSI-EAS1700R 5 4 1 1051 933 0 2 ....... BBBBBBB 0
3
+ HWUSI-EAS1700R 5 4 1 1233 932 0 2 ....... BBBBBBB 0
4
+ HWUSI-EAS1700R 5 4 1 1266 945 0 2 ....... BBBBBBB 0
5
+ HWUSI-EAS1700R 5 4 1 1373 940 0 2 ....... BBBBBBB 0
@@ -0,0 +1,5 @@
1
+ HWUSI-EAS1700R 5 4 1 975 930 0 2 ....... BBBBBBB 0
2
+ HWUSI-EAS1700R 5 4 1 1051 933 0 2 ....... BBBBBBB 0
3
+ HWUSI-EAS1700R 5 4 1 1233 932 0 2 ....... BBBBBBB 0
4
+ HWUSI-EAS1700R 5 4 1 1266 945 0 2 ....... BBBBBBB 0
5
+ HWUSI-EAS1700R 5 4 1 1373 940 0 2 ....... BBBBBBB 0
@@ -0,0 +1,20 @@
1
+ >1
2
+ AAAAAA
3
+ >2
4
+ GGGGGG
5
+ >3
6
+ TTTTTT
7
+ >4
8
+ CCCCCC
9
+ >5
10
+ AAATTT
11
+ >6
12
+ TTTAAA
13
+ >7
14
+ GGGCCC
15
+ >8
16
+ CCCGGG
17
+ >9
18
+ GAAAAA
19
+ >10
20
+ CAAAAA
@@ -0,0 +1,20 @@
1
+ @a
2
+ aaaaaaa
3
+ +a
4
+ BBBBBBB
5
+ @b
6
+ ttttttt
7
+ +b
8
+ BBBBBBB
9
+ @c
10
+ ccccccc
11
+ @c
12
+ BBBBBBB
13
+ @d
14
+ ggggggg
15
+ @d
16
+ BBBBBBB
17
+ @e
18
+ gagagag
19
+ @e
20
+ BBBBBBB
@@ -0,0 +1,5 @@
1
+ HWUSI-EAS1700R 5 4 1 975 930 0 2 ....... BBBBBBB 0
2
+ HWUSI-EAS1700R 5 4 1 1051 933 0 2 ....... BBBBBBB 0
3
+ HWUSI-EAS1700R 5 4 1 1233 932 0 2 ....... BBBBBBB 0
4
+ HWUSI-EAS1700R 5 4 1 1266 945 0 2 ....... BBBBBBB 0
5
+ HWUSI-EAS1700R 5 4 1 1373 940 0 2 ....... BBBBBBB 0
@@ -0,0 +1,3 @@
1
+ $LOAD_PATH << File.join(File.dirname(__FILE__), 'lib')
2
+
3
+ require 'basil'
metadata ADDED
@@ -0,0 +1,170 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: Basil
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 0
10
+ version: 0.1.0
11
+ platform: ruby
12
+ authors:
13
+ - Austin G. Davis-Richardson
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2012-09-18 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: Basil
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ hash: 3
29
+ segments:
30
+ - 0
31
+ version: "0"
32
+ type: :runtime
33
+ version_requirements: *id001
34
+ - !ruby/object:Gem::Dependency
35
+ name: dna
36
+ prerelease: false
37
+ requirement: &id002 !ruby/object:Gem::Requirement
38
+ none: false
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ hash: 3
43
+ segments:
44
+ - 0
45
+ version: "0"
46
+ type: :runtime
47
+ version_requirements: *id002
48
+ - !ruby/object:Gem::Dependency
49
+ name: trollop
50
+ prerelease: false
51
+ requirement: &id003 !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ hash: 3
57
+ segments:
58
+ - 0
59
+ version: "0"
60
+ type: :runtime
61
+ version_requirements: *id003
62
+ - !ruby/object:Gem::Dependency
63
+ name: progressbar
64
+ prerelease: false
65
+ requirement: &id004 !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ hash: 3
71
+ segments:
72
+ - 0
73
+ version: "0"
74
+ type: :runtime
75
+ version_requirements: *id004
76
+ - !ruby/object:Gem::Dependency
77
+ name: jeweler
78
+ prerelease: false
79
+ requirement: &id005 !ruby/object:Gem::Requirement
80
+ none: false
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ hash: 3
85
+ segments:
86
+ - 0
87
+ version: "0"
88
+ type: :development
89
+ version_requirements: *id005
90
+ - !ruby/object:Gem::Dependency
91
+ name: jeweler
92
+ prerelease: false
93
+ requirement: &id006 !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ hash: 3
99
+ segments:
100
+ - 0
101
+ version: "0"
102
+ type: :development
103
+ version_requirements: *id006
104
+ description: Separate Illumin and 454 sequence output by barcode
105
+ email: harekrishna@gmail.com
106
+ executables:
107
+ - basil
108
+ extensions: []
109
+
110
+ extra_rdoc_files: []
111
+
112
+ files:
113
+ - .rspec
114
+ - .rvmrc
115
+ - Gemfile
116
+ - Rakefile
117
+ - basil.gemspec
118
+ - bin/basil
119
+ - lib/basil.rb
120
+ - lib/basil/barcodes.rb
121
+ - lib/basil/basil.rb
122
+ - lib/basil/buffer.rb
123
+ - lib/basil/cli.rb
124
+ - readme.md
125
+ - spec/basil_spec.rb
126
+ - spec/buffer_spec.rb
127
+ - spec/cli_spec.rb
128
+ - spec/data/barcodes.csv
129
+ - spec/data/illumina/s_1_1_001_qseq.txt
130
+ - spec/data/illumina/s_1_2_001_qseq.txt
131
+ - spec/data/illumina/s_1_3_001_qseq.txt
132
+ - spec/data/test.fasta
133
+ - spec/data/test.fastq
134
+ - spec/data/test.qseq
135
+ - spec/spec_helper.rb
136
+ homepage: http://audy.github.com/basil
137
+ licenses:
138
+ - MIT
139
+ post_install_message:
140
+ rdoc_options: []
141
+
142
+ require_paths:
143
+ - lib
144
+ required_ruby_version: !ruby/object:Gem::Requirement
145
+ none: false
146
+ requirements:
147
+ - - ">="
148
+ - !ruby/object:Gem::Version
149
+ hash: 3
150
+ segments:
151
+ - 0
152
+ version: "0"
153
+ required_rubygems_version: !ruby/object:Gem::Requirement
154
+ none: false
155
+ requirements:
156
+ - - ">="
157
+ - !ruby/object:Gem::Version
158
+ hash: 3
159
+ segments:
160
+ - 0
161
+ version: "0"
162
+ requirements: []
163
+
164
+ rubyforge_project:
165
+ rubygems_version: 1.8.24
166
+ signing_key:
167
+ specification_version: 3
168
+ summary: HTPS Demultiplexer
169
+ test_files: []
170
+