lederhosen 0.5.7 → 1.0.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/lederhosen.gemspec +4 -9
- data/lib/lederhosen/helpers.rb +7 -0
- data/lib/lederhosen/tasks/cluster.rb +26 -38
- data/lib/lederhosen/tasks/make_udb.rb +25 -0
- data/lib/lederhosen/tasks/otu_table.rb +85 -26
- data/lib/lederhosen/version.rb +3 -3
- data/readme.md +11 -64
- data/spec/cli_spec.rb +11 -50
- data/spec/data/test.uc +684 -0
- data/spec/helpers_spec.rb +4 -0
- metadata +7 -12
- data/lib/lederhosen/tasks/add_names.rb +0 -98
- data/lib/lederhosen/tasks/join.rb +0 -68
- data/lib/lederhosen/tasks/name.rb +0 -38
- data/lib/lederhosen/tasks/sort.rb +0 -25
- data/lib/lederhosen/tasks/squish.rb +0 -51
- data/spec/data/blat.txt +0 -86
- data/spec/data/otus.csv +0 -4
data/lederhosen.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "lederhosen"
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "1.0.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Austin G. Davis-Richardson"]
|
12
|
-
s.date = "2012-
|
12
|
+
s.date = "2012-10-30"
|
13
13
|
s.description = "Various tools for OTU clustering"
|
14
14
|
s.email = "harekrishna@gmail.com"
|
15
15
|
s.executables = ["lederhosen"]
|
@@ -30,18 +30,14 @@ Gem::Specification.new do |s|
|
|
30
30
|
"lib/lederhosen/buffer.rb",
|
31
31
|
"lib/lederhosen/cli.rb",
|
32
32
|
"lib/lederhosen/helpers.rb",
|
33
|
-
"lib/lederhosen/tasks/add_names.rb",
|
34
33
|
"lib/lederhosen/tasks/cluster.rb",
|
35
|
-
"lib/lederhosen/tasks/join.rb",
|
36
34
|
"lib/lederhosen/tasks/k_filter.rb",
|
37
|
-
"lib/lederhosen/tasks/
|
35
|
+
"lib/lederhosen/tasks/make_udb.rb",
|
38
36
|
"lib/lederhosen/tasks/otu_filter.rb",
|
39
37
|
"lib/lederhosen/tasks/otu_table.rb",
|
40
38
|
"lib/lederhosen/tasks/rep_reads.rb",
|
41
|
-
"lib/lederhosen/tasks/sort.rb",
|
42
39
|
"lib/lederhosen/tasks/split.rb",
|
43
40
|
"lib/lederhosen/tasks/split_fasta.rb",
|
44
|
-
"lib/lederhosen/tasks/squish.rb",
|
45
41
|
"lib/lederhosen/tasks/trim.rb",
|
46
42
|
"lib/lederhosen/tasks/uc_filter.rb",
|
47
43
|
"lib/lederhosen/tasks/uc_stats.rb",
|
@@ -53,8 +49,7 @@ Gem::Specification.new do |s|
|
|
53
49
|
"spec/data/ILT_L_9_B_001_3.txt.gz",
|
54
50
|
"spec/data/ILT_L_9_B_002_1.txt.gz",
|
55
51
|
"spec/data/ILT_L_9_B_002_3.txt.gz",
|
56
|
-
"spec/data/
|
57
|
-
"spec/data/otus.csv",
|
52
|
+
"spec/data/test.uc",
|
58
53
|
"spec/helpers_spec.rb",
|
59
54
|
"spec/misc_spec.rb",
|
60
55
|
"spec/spec_helper.rb"
|
data/lib/lederhosen/helpers.rb
CHANGED
@@ -2,6 +2,12 @@ module Lederhosen
|
|
2
2
|
class Helpers
|
3
3
|
class << self
|
4
4
|
|
5
|
+
# reverse complement a DNA sequence
|
6
|
+
# assumes only GATCN nucleotides
|
7
|
+
def reverse_complement(s)
|
8
|
+
s.reverse.tr('GATCNgatcn','CTAGNctagn')
|
9
|
+
end
|
10
|
+
|
5
11
|
# Function for grouping qseq files produced by splitting illumina
|
6
12
|
# reads by barcode
|
7
13
|
#
|
@@ -36,6 +42,7 @@ module Lederhosen
|
|
36
42
|
seqb = trim b
|
37
43
|
unless [seqa, seqb].include? nil
|
38
44
|
if seqb.length >= min_length && seqa.length >= min_length
|
45
|
+
seqb = reverse_complement(seqb)
|
39
46
|
out_handle.puts ">#{i}:0\n#{seqa}\n>#{i}:1\n#{seqb}"
|
40
47
|
end
|
41
48
|
end
|
@@ -1,58 +1,46 @@
|
|
1
|
-
##
|
2
|
-
# FINALLY, CLUSTER!
|
3
|
-
#
|
4
|
-
|
5
1
|
module Lederhosen
|
2
|
+
|
6
3
|
class CLI
|
7
4
|
|
8
|
-
desc
|
9
|
-
"cluster a fasta file using UCLUST"
|
5
|
+
desc 'cluster', 'reference-based clustering using usearch'
|
10
6
|
|
11
|
-
method_option :input,
|
12
|
-
method_option :
|
13
|
-
method_option :
|
14
|
-
method_option :
|
15
|
-
method_option :
|
16
|
-
method_option :
|
17
|
-
method_option :maxrejects, :type => :numeric, :default => 8
|
18
|
-
method_option :lib, :type => :string
|
19
|
-
method_option :libonly, :type => :boolean, :default => false
|
7
|
+
method_option :input, :type => :string, :required => true
|
8
|
+
method_option :database, :type => :string, :required => true
|
9
|
+
method_option :threads, :type => :numeric, :default => 0
|
10
|
+
method_option :identity, :type => :numeric, :required => true
|
11
|
+
method_option :output, :type => :string, :required => true
|
12
|
+
method_option :strand, :type => :string, :default => 'plus'
|
20
13
|
|
21
14
|
def cluster
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
libonly = options[:libonly]
|
31
|
-
|
32
|
-
ohai "clustering #{input}, saving to #{output}"
|
15
|
+
input = options[:input]
|
16
|
+
database = options[:database]
|
17
|
+
threads = options[:threads]
|
18
|
+
identity = options[:identity]
|
19
|
+
output = options[:output]
|
20
|
+
strand = options[:strand]
|
21
|
+
|
22
|
+
ohai "clustering #{input} to #{database} and saving to #{output}"
|
33
23
|
|
34
24
|
options.each_pair do |key, value|
|
35
25
|
ohai "#{key} = #{value}"
|
36
26
|
end
|
37
27
|
|
38
|
-
cmd = [
|
39
|
-
|
40
|
-
"--input #{input}",
|
41
|
-
"--uc #{output}",
|
28
|
+
cmd = ['usearch',
|
29
|
+
"--usearch_local #{input}",
|
42
30
|
"--id #{identity}",
|
43
|
-
"--
|
44
|
-
"--
|
45
|
-
"--
|
46
|
-
"--w #{wordlen}"
|
31
|
+
"--uc #{output}",
|
32
|
+
"--db #{database}",
|
33
|
+
"--strand #{strand}"
|
47
34
|
]
|
48
35
|
|
49
|
-
|
50
|
-
|
36
|
+
# threads = 0 : use all threads (default)
|
37
|
+
if threads != 0
|
38
|
+
cmd << "--threads #{threads}"
|
39
|
+
end
|
51
40
|
|
52
41
|
cmd = cmd.join(' ')
|
53
42
|
|
54
|
-
|
43
|
+
run cmd
|
55
44
|
end
|
56
|
-
|
57
45
|
end
|
58
46
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Lederhosen
|
2
|
+
class CLI
|
3
|
+
|
4
|
+
desc 'make_udb', 'format database for usearch'
|
5
|
+
|
6
|
+
method_option :input, :type => :string, :required => true
|
7
|
+
method_option :output, :type => :string, :required => true
|
8
|
+
|
9
|
+
def make_udb
|
10
|
+
input = options[:input]
|
11
|
+
output = options[:output]
|
12
|
+
word_length = options[:word_length]
|
13
|
+
|
14
|
+
ohai "making udb w/ #{input}, saving as #{output}."
|
15
|
+
|
16
|
+
cmd = ['usearch',
|
17
|
+
"-makeudb_usearch #{input}",
|
18
|
+
"-output #{output}"]
|
19
|
+
|
20
|
+
cmd = cmd.join(' ')
|
21
|
+
|
22
|
+
run cmd
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -2,50 +2,109 @@
|
|
2
2
|
# MAKE TABLES
|
3
3
|
#
|
4
4
|
|
5
|
-
|
5
|
+
require 'set'
|
6
6
|
|
7
7
|
module Lederhosen
|
8
8
|
class CLI
|
9
9
|
|
10
10
|
desc "otu_table",
|
11
|
-
"create an OTU abundance matrix from
|
11
|
+
"create an OTU abundance matrix from USEARCH output"
|
12
12
|
|
13
|
-
method_option :
|
14
|
-
method_option :output,
|
13
|
+
method_option :files, :type => :string, :required => true
|
14
|
+
method_option :output, :type => :string, :required => true
|
15
|
+
method_option :level, :type => :string, :required => true, :banner => 'valid options: domain, kingdom, phylum, class, order, genus, or species'
|
15
16
|
|
16
17
|
def otu_table
|
17
|
-
input
|
18
|
-
output
|
18
|
+
input = Dir[options[:files]]
|
19
|
+
output = options[:output]
|
20
|
+
level = options[:level].downcase
|
19
21
|
|
20
|
-
ohai "generating
|
22
|
+
ohai "generating #{level} table from #{input.size} file(s) and saving to #{output}."
|
21
23
|
|
22
|
-
#
|
24
|
+
fail "bad level: #{level}" unless %w{domain phylum class order family genus species kingdom}.include? level
|
25
|
+
|
26
|
+
sample_cluster_count = Hash.new { |h, k| h[k] = Hash.new { |h, k| h[k] = 0 } }
|
23
27
|
|
24
|
-
|
25
|
-
clstr_counts = clstr_info[:clstr_counts] # clstr_counts[:clstr][sample.to_i] = reads
|
26
|
-
clstrnr_to_seed = clstr_info[:clstrnr_to_seed]
|
27
|
-
samples = clstr_info[:samples]
|
28
|
+
all_names = Set.new
|
28
29
|
|
29
|
-
#
|
30
|
-
|
31
|
-
|
30
|
+
# Load cluster table
|
31
|
+
input.each do |input_file|
|
32
|
+
File.open(input_file) do |handle|
|
33
|
+
handle.each do |line|
|
34
|
+
dat = parse_usearch_line(line.strip)
|
35
|
+
next if dat.nil?
|
36
|
+
name = dat[level] rescue ohai(dat.inspect)
|
32
37
|
|
33
|
-
|
34
|
-
|
35
|
-
|
38
|
+
all_names << name
|
39
|
+
sample_cluster_count[input_file][name] += 1
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
36
43
|
|
37
|
-
|
38
|
-
|
44
|
+
ohai "found #{all_names.size} unique taxa at #{level} level"
|
45
|
+
|
46
|
+
# save to csv
|
47
|
+
File.open(output, 'w') do |handle|
|
48
|
+
header = all_names.to_a.compact.sort
|
49
|
+
handle.puts "#{level.capitalize},#{header.join(',')}"
|
50
|
+
samples = sample_cluster_count.keys.sort
|
39
51
|
|
40
52
|
samples.each do |sample|
|
41
|
-
|
42
|
-
|
43
|
-
|
53
|
+
handle.print "#{sample}"
|
54
|
+
header.each do |name|
|
55
|
+
handle.print ",#{sample_cluster_count[sample][name]}"
|
44
56
|
end
|
45
|
-
|
57
|
+
handle.print "\n"
|
46
58
|
end
|
47
59
|
end
|
48
60
|
end
|
49
61
|
|
50
|
-
|
51
|
-
|
62
|
+
no_tasks do
|
63
|
+
# parse a line of usearch output
|
64
|
+
# return a hash in the form:
|
65
|
+
# { :taxonomy => '', :identity => 0.00, ... }
|
66
|
+
# unless the line is not a "hit" in which case
|
67
|
+
# the function returns nil
|
68
|
+
def parse_usearch_line(str)
|
69
|
+
|
70
|
+
# skip non hits
|
71
|
+
return nil unless str =~ /^H/
|
72
|
+
|
73
|
+
str = str.split
|
74
|
+
|
75
|
+
taxonomic_description = str[9]
|
76
|
+
identity = str[3].to_f
|
77
|
+
|
78
|
+
# parse taxonomic_description
|
79
|
+
taxonomies = parse_taxonomy(taxonomic_description)
|
80
|
+
|
81
|
+
{ :identity => identity }.merge(taxonomies)
|
82
|
+
end
|
83
|
+
|
84
|
+
# parse a taxonomic description using the
|
85
|
+
# taxcollector format returning name at each level (genus, etc...)
|
86
|
+
def parse_taxonomy(taxonomy)
|
87
|
+
|
88
|
+
levels = { 'domain' => 0,
|
89
|
+
'kingdom' => 0,
|
90
|
+
'phylum' => 1,
|
91
|
+
'class' => 2,
|
92
|
+
'order' => 3,
|
93
|
+
'family' => 4,
|
94
|
+
'genus' => 5,
|
95
|
+
'species' => 6 }
|
96
|
+
|
97
|
+
names = Hash.new
|
98
|
+
|
99
|
+
levels.each_pair do |level, num|
|
100
|
+
name = taxonomy.match(/\[#{num}\](\w*)[;\[]/)[1] rescue nil
|
101
|
+
names[level] = name
|
102
|
+
end
|
103
|
+
|
104
|
+
names
|
105
|
+
end
|
106
|
+
|
107
|
+
end # no tasks
|
108
|
+
|
109
|
+
end # class CLI
|
110
|
+
end # module Lederhosen
|
data/lib/lederhosen/version.rb
CHANGED
data/readme.md
CHANGED
@@ -8,8 +8,7 @@ Lederhosen is free and open source under the [MIT open source license](http://op
|
|
8
8
|
|
9
9
|
## How do I get Lederhosen?
|
10
10
|
|
11
|
-
0. Obtain & Install [
|
12
|
-
1. Obtain & Install [BLAT](http://genome.ucsc.edu/FAQ/FAQblat.html#blat3)
|
11
|
+
0. Obtain & Install [USEARCH](http://www.drive5.com/) (32bit is fine)
|
13
12
|
2. Get a copy of [TaxCollector](http://github.com/audy/taxcollector)
|
14
13
|
3. Install Lederhosen by typing:
|
15
14
|
|
@@ -35,80 +34,28 @@ Lederhosen is just a convenient wrapper for UCLUST and BLAT with some scripts fo
|
|
35
34
|
|
36
35
|
Lederhosen is invoked by typing `lederhosen [TASK]`
|
37
36
|
|
38
|
-
###
|
37
|
+
### Trim Reads
|
39
38
|
|
40
39
|
Trim (Illumina) reads using quality scores. Output will be a directory of fasta files. Reads can optionally be gzipped.
|
41
40
|
|
42
41
|
lederhosen trim --reads_dir=reads/*.txt --out_dir=trimmed/
|
43
42
|
|
44
|
-
###
|
43
|
+
### Create Database
|
45
44
|
|
46
|
-
|
45
|
+
Create UDB database required by usearch from TaxCollector
|
47
46
|
|
48
|
-
lederhosen
|
47
|
+
lederhosen make_udb --input=taxcollector.fa --output=taxcollector.udb
|
49
48
|
|
50
|
-
|
49
|
+
### Cluster Reads using USEARCH
|
51
50
|
|
52
|
-
|
51
|
+
Cluster reads using USEARCH. Output is a uc file.
|
53
52
|
|
54
|
-
|
53
|
+
lederhosen cluster --input=trimmed/*.fasta --identity=0.95 --output=clusters_95.uc --database=taxcollector.udb
|
55
54
|
|
56
|
-
|
57
|
-
|
58
|
-
lederhosen sort --input=joined.fasta --output=sorted.fasta
|
59
|
-
|
60
|
-
### k_filter
|
61
|
-
|
62
|
-
K-mer abundance noise filtering. This step is experimental and optional. It may reduce the time it takes to perform the clustering.
|
63
|
-
|
64
|
-
lederhosen k_filter --input=joined.fasta --output=filtered.fasta --k=10 --cutoff=50
|
65
|
-
|
66
|
-
### cluster
|
67
|
-
|
68
|
-
Cluster reads using UCLUST. Output is a uc file.
|
69
|
-
|
70
|
-
lederhosen cluster --input=sorted.fasta --identity=0.80 --output=clusters.uc
|
71
|
-
|
72
|
-
### uc_filter
|
73
|
-
|
74
|
-
Filter UC file removing singleton clusters or clusters that are only present in a few samples. This greatly reduces the noise of the data without removing many of the reads.
|
75
|
-
|
76
|
-
lederhosen uc_filter --input=clusters.uc --output=clusters.uc.filtered --reads=50 --samples=10
|
77
|
-
|
78
|
-
### otu_table
|
55
|
+
### Generate OTU tables
|
79
56
|
|
80
57
|
Create an OTU abundance table where rows are samples and columns are clusters. The entries are the number of reads for that cluster in a sample.
|
81
58
|
|
82
|
-
lederhosen otu_table --clusters=
|
83
|
-
|
84
|
-
### rep_reads
|
85
|
-
|
86
|
-
Get representative reads for each cluster. Output is a single fasta file.
|
87
|
-
|
88
|
-
lederhosen rep_reads --clusters=clusters.uc --joined=joined.fasta --output=representative_reads.fasta
|
89
|
-
|
90
|
-
### split
|
91
|
-
|
92
|
-
Get all reads belonging to each cluster. Output is a directory containing a fasta file for each cluster. The fasta file contains the joined reads.
|
93
|
-
|
94
|
-
lederhosen split --clusters=clusters.uc --reads=joined.fasta --min-clst-size=100
|
95
|
-
|
96
|
-
### name
|
97
|
-
|
98
|
-
Identify clusters in a database using the representative reads. This is a simple wrapper for BLAT. The output is a tab-delimited file similar to a BLAST output file. For this step you need to have BLAT installed and also a [TaxCollector](http://github.com/audy/taxcollector) database.
|
99
|
-
|
100
|
-
lederhosen name --reps=representative_reads.fasta --database taxcollector.fa --output blast_like_output.txt
|
101
|
-
|
102
|
-
### add_names
|
103
|
-
|
104
|
-
Add phylogenetic classification of clusters to OTU abundance file.
|
105
|
-
|
106
|
-
lederhosen add_names --blat=blat_output.txt --level=taxonomic_level --table=otu_file.csv --output=named_out_file.csv
|
107
|
-
|
108
|
-
Where `taxonomic_level` can be: kingdom, domain, phylum, class, order, family, genus or species. This method only works with a TaxCollector database.
|
109
|
-
|
110
|
-
### squish
|
111
|
-
|
112
|
-
Squish an OTU abundance file by column name (phylogenetic description)
|
59
|
+
lederhosen otu_table --clusters=clusters_95.uc --output=genus.csv --level=genus
|
113
60
|
|
114
|
-
|
61
|
+
Level can be Kingdom, Domain, Phylum, Class, Order, Family or Genus. To make tables at all levels do:
|
data/spec/cli_spec.rb
CHANGED
@@ -17,35 +17,20 @@ describe Lederhosen::CLI do
|
|
17
17
|
$?.success?.should be_true
|
18
18
|
end
|
19
19
|
|
20
|
-
it '
|
21
|
-
`./bin/lederhosen
|
20
|
+
it 'can create a usearch udb using usearch' do
|
21
|
+
`./bin/lederhosen make_udb --input #{$test_dir}/trimmed/ILT_L_9_B_001.fasta --output #{$test_dir}/test_db.udb`
|
22
22
|
$?.success?.should be_true
|
23
23
|
end
|
24
24
|
|
25
|
-
it '
|
26
|
-
|
27
|
-
# included in specs/data
|
28
|
-
`./bin/lederhosen cluster --input=#{$test_dir}/joined.fasta --output=#{$test_dir}/joined.libonly.uc --lib=#{$test_dir}/joined.fasta --libonly --identity 0.95 --maxaccepts 500 --maxrejects 12`
|
25
|
+
it 'can cluster reads using usearch' do
|
26
|
+
`./bin/lederhosen cluster --input #{$test_dir}/trimmed/ILT_L_9_B_001.fasta --database #{$test_dir}/test_db.udb --identity 0.95 --output #{$test_dir}/clusters.uc`
|
29
27
|
end
|
30
28
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
it 'should k_filter reads' do
|
37
|
-
`./bin/lederhosen k_filter --input=#{$test_dir}/sorted.fasta --output=#{$test_dir}/filtered.fasta -k=15 --cutoff 1`
|
38
|
-
$?.success?.should be_true
|
39
|
-
end
|
40
|
-
|
41
|
-
it 'should cluster reads' do
|
42
|
-
`./bin/lederhosen cluster --identity=0.80 --input=#{$test_dir}/filtered.fasta --output=#{$test_dir}/clusters.uc`
|
43
|
-
$?.success?.should be_true
|
44
|
-
end
|
45
|
-
|
46
|
-
it 'should build OTU abundance matrices' do
|
47
|
-
`./bin/lederhosen otu_table --clusters=#{$test_dir}/clusters.uc --output=#{$test_dir}/otu_table.csv`
|
48
|
-
$?.success?.should be_true
|
29
|
+
%w{domain phylum class ORDER Family genus species}.each do |level|
|
30
|
+
it "should build #{level} abundance matrix" do
|
31
|
+
`./bin/lederhosen otu_table --files=spec/data/test.uc --output=#{$test_dir}/otu_table.csv --level=#{level}`
|
32
|
+
$?.success?.should be_true
|
33
|
+
end
|
49
34
|
end
|
50
35
|
|
51
36
|
it 'should filter OTU abundance matrices' do
|
@@ -54,33 +39,9 @@ describe Lederhosen::CLI do
|
|
54
39
|
end
|
55
40
|
|
56
41
|
it 'should split a fasta file into smaller fasta files (optionally gzipped)' do
|
57
|
-
`./bin/lederhosen split_fasta --input=#{$test_dir}/
|
58
|
-
$?.success?.should be_true
|
59
|
-
end
|
60
|
-
|
61
|
-
it 'should split joined.fasta into reads for each cluster' do
|
62
|
-
`./bin/lederhosen split --reads=#{$test_dir}/joined.fasta --clusters=#{$test_dir}/clusters.uc --out-dir=#{$test_dir}/split --min-clst-size=1`
|
63
|
-
$?.success?.should be_true
|
64
|
-
end
|
65
|
-
|
66
|
-
it 'should create a fasta file containing representative reads for each cluster' do
|
67
|
-
`./bin/lederhosen rep_reads --clusters=#{$test_dir}/clusters.uc --joined=#{$test_dir}/filtered.fasta --output=#{$test_dir}/representatives.fasta`
|
42
|
+
`./bin/lederhosen split_fasta --input=#{$test_dir}/trimmed/ILT_L_9_B_001.fasta --out-dir=#{$test_dir}/split/ --gzip true -n 100`
|
68
43
|
$?.success?.should be_true
|
69
44
|
end
|
70
45
|
|
71
|
-
|
72
|
-
it 'should identify clusters given a taxcollector database'
|
73
|
-
|
74
|
-
it 'should add names to otu abundance matrix given blat output' do
|
75
|
-
levels = %w{kingdom domain phylum class order genus speces}
|
76
|
-
# Ruby 1.9 vs Ruby 1.8
|
77
|
-
level = levels.sample rescue levels.choice
|
78
|
-
`./bin/lederhosen add_names --table=spec/data/otus.csv --blat=spec/data/blat.txt --level=#{level} --output=#{$test_dir}/named_otus.csv`
|
79
|
-
$?.success?.should be_true
|
80
|
-
end
|
81
|
-
|
82
|
-
it 'should squish otu abundance matrix by same name' do
|
83
|
-
`./bin/lederhosen squish --csv-file=#{$test_dir}/named_otus.csv --output=#{$test_dir}/squished.csv`
|
84
|
-
$?.success?.should be_true
|
85
|
-
end
|
46
|
+
it 'should create a fasta file containing representative reads for each cluster'
|
86
47
|
end
|