Basil 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
+