miga-base 0.7.3.1 → 0.7.8.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.
- checksums.yaml +4 -4
- data/lib/miga/cli.rb +10 -8
- data/lib/miga/cli/action.rb +2 -3
- data/lib/miga/cli/action/about.rb +5 -6
- data/lib/miga/cli/action/add.rb +18 -12
- data/lib/miga/cli/action/add_result.rb +2 -3
- data/lib/miga/cli/action/archive.rb +1 -2
- data/lib/miga/cli/action/classify_wf.rb +8 -6
- data/lib/miga/cli/action/console.rb +0 -1
- data/lib/miga/cli/action/daemon.rb +7 -7
- data/lib/miga/cli/action/date.rb +0 -1
- data/lib/miga/cli/action/derep_wf.rb +5 -4
- data/lib/miga/cli/action/doctor.rb +71 -82
- data/lib/miga/cli/action/doctor/base.rb +102 -0
- data/lib/miga/cli/action/edit.rb +14 -2
- data/lib/miga/cli/action/files.rb +8 -8
- data/lib/miga/cli/action/find.rb +5 -6
- data/lib/miga/cli/action/generic.rb +7 -7
- data/lib/miga/cli/action/get.rb +20 -17
- data/lib/miga/cli/action/get_db.rb +8 -2
- data/lib/miga/cli/action/index_wf.rb +1 -1
- data/lib/miga/cli/action/init.rb +53 -41
- data/lib/miga/cli/action/init/daemon_helper.rb +65 -43
- data/lib/miga/cli/action/lair.rb +7 -7
- data/lib/miga/cli/action/ln.rb +6 -6
- data/lib/miga/cli/action/ls.rb +1 -2
- data/lib/miga/cli/action/ncbi_get.rb +11 -3
- data/lib/miga/cli/action/new.rb +4 -4
- data/lib/miga/cli/action/next_step.rb +0 -1
- data/lib/miga/cli/action/preproc_wf.rb +3 -3
- data/lib/miga/cli/action/quality_wf.rb +1 -1
- data/lib/miga/cli/action/rm.rb +2 -3
- data/lib/miga/cli/action/run.rb +8 -8
- data/lib/miga/cli/action/stats.rb +8 -4
- data/lib/miga/cli/action/summary.rb +7 -6
- data/lib/miga/cli/action/tax_dist.rb +8 -4
- data/lib/miga/cli/action/tax_index.rb +3 -4
- data/lib/miga/cli/action/tax_set.rb +7 -6
- data/lib/miga/cli/action/tax_test.rb +6 -5
- data/lib/miga/cli/action/wf.rb +25 -19
- data/lib/miga/cli/base.rb +34 -32
- data/lib/miga/cli/objects_helper.rb +27 -18
- data/lib/miga/cli/opt_helper.rb +3 -2
- data/lib/miga/common.rb +2 -5
- data/lib/miga/common/base.rb +15 -16
- data/lib/miga/common/format.rb +8 -5
- data/lib/miga/common/hooks.rb +1 -4
- data/lib/miga/common/path.rb +4 -9
- data/lib/miga/common/with_daemon.rb +5 -2
- data/lib/miga/common/with_daemon_class.rb +1 -1
- data/lib/miga/common/with_result.rb +2 -1
- data/lib/miga/daemon.rb +93 -44
- data/lib/miga/daemon/base.rb +30 -11
- data/lib/miga/dataset.rb +47 -37
- data/lib/miga/dataset/base.rb +52 -37
- data/lib/miga/dataset/hooks.rb +3 -4
- data/lib/miga/dataset/result.rb +17 -1
- data/lib/miga/dataset/status.rb +6 -5
- data/lib/miga/json.rb +5 -7
- data/lib/miga/lair.rb +4 -0
- data/lib/miga/metadata.rb +4 -3
- data/lib/miga/project.rb +29 -20
- data/lib/miga/project/base.rb +52 -37
- data/lib/miga/project/dataset.rb +33 -26
- data/lib/miga/project/hooks.rb +0 -3
- data/lib/miga/project/result.rb +14 -5
- data/lib/miga/remote_dataset.rb +85 -72
- data/lib/miga/remote_dataset/base.rb +11 -13
- data/lib/miga/remote_dataset/download.rb +34 -12
- data/lib/miga/result.rb +48 -53
- data/lib/miga/result/base.rb +0 -2
- data/lib/miga/result/dates.rb +1 -3
- data/lib/miga/result/source.rb +15 -16
- data/lib/miga/result/stats.rb +37 -27
- data/lib/miga/tax_dist.rb +6 -3
- data/lib/miga/tax_index.rb +17 -17
- data/lib/miga/taxonomy.rb +6 -1
- data/lib/miga/taxonomy/base.rb +19 -15
- data/lib/miga/version.rb +19 -16
- data/scripts/project_stats.bash +3 -0
- data/scripts/stats.bash +1 -1
- data/test/common_test.rb +3 -11
- data/test/daemon_helper.rb +38 -0
- data/test/daemon_test.rb +91 -99
- data/test/dataset_test.rb +63 -59
- data/test/format_test.rb +3 -11
- data/test/hook_test.rb +50 -55
- data/test/json_test.rb +7 -8
- data/test/lair_test.rb +22 -28
- data/test/metadata_test.rb +6 -14
- data/test/project_test.rb +33 -40
- data/test/remote_dataset_test.rb +26 -32
- data/test/result_stats_test.rb +17 -27
- data/test/result_test.rb +41 -34
- data/test/tax_dist_test.rb +2 -4
- data/test/tax_index_test.rb +4 -10
- data/test/taxonomy_test.rb +7 -9
- data/test/test_helper.rb +42 -1
- data/test/with_daemon_test.rb +14 -22
- data/utils/adapters.fa +13 -0
- data/utils/cleanup-databases.rb +6 -5
- data/utils/distance/base.rb +0 -1
- data/utils/distance/commands.rb +19 -12
- data/utils/distance/database.rb +24 -21
- data/utils/distance/pipeline.rb +23 -10
- data/utils/distance/runner.rb +20 -16
- data/utils/distance/temporal.rb +1 -3
- data/utils/distances.rb +1 -1
- data/utils/domain-ess-genes.rb +7 -7
- data/utils/index_metadata.rb +5 -4
- data/utils/mytaxa_scan.rb +18 -16
- data/utils/representatives.rb +5 -4
- data/utils/requirements.txt +1 -1
- data/utils/subclade/base.rb +0 -1
- data/utils/subclade/pipeline.rb +7 -6
- data/utils/subclade/runner.rb +9 -9
- data/utils/subclade/temporal.rb +0 -2
- data/utils/subclades-compile.rb +39 -37
- data/utils/subclades.rb +1 -1
- metadata +6 -4
data/lib/miga/result/base.rb
CHANGED
data/lib/miga/result/dates.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
|
2
1
|
require 'miga/result/base'
|
3
2
|
|
4
3
|
##
|
@@ -29,7 +28,7 @@ module MiGA::Result::Dates
|
|
29
28
|
end
|
30
29
|
|
31
30
|
private
|
32
|
-
|
31
|
+
|
33
32
|
##
|
34
33
|
# Internal function to detect start and end dates
|
35
34
|
def date_at(event)
|
@@ -42,4 +41,3 @@ module MiGA::Result::Dates
|
|
42
41
|
Time.parse(date) unless date.nil?
|
43
42
|
end
|
44
43
|
end
|
45
|
-
|
data/lib/miga/result/source.rb
CHANGED
@@ -1,30 +1,30 @@
|
|
1
|
-
|
2
1
|
require 'miga/result/base'
|
3
2
|
|
4
3
|
##
|
5
4
|
# Helper module including functions to access the source of results
|
6
5
|
module MiGA::Result::Source
|
7
|
-
|
8
6
|
##
|
9
7
|
# Load and return the source (parent object) of a result
|
10
8
|
def source
|
11
|
-
@source ||=
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
9
|
+
@source ||=
|
10
|
+
if MiGA::Project.RESULT_DIRS[key]
|
11
|
+
project
|
12
|
+
else
|
13
|
+
project.dataset(File.basename(path, '.json'))
|
14
|
+
end
|
16
15
|
end
|
17
16
|
|
18
17
|
##
|
19
18
|
# Detect the result key assigned to this result
|
20
19
|
def key
|
21
|
-
@key ||=
|
22
|
-
:
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
20
|
+
@key ||=
|
21
|
+
if relative_dir == 'data/90.stats' && file_path(:metadata_index)
|
22
|
+
:project_stats
|
23
|
+
else
|
24
|
+
MiGA::Result.RESULT_DIRS.find do |k, v|
|
25
|
+
"data/#{v}" == relative_dir
|
26
|
+
end.first
|
27
|
+
end
|
28
28
|
end
|
29
29
|
|
30
30
|
##
|
@@ -51,7 +51,6 @@ module MiGA::Result::Source
|
|
51
51
|
# so the path referencing is identical to that of +self.path+ whenever they
|
52
52
|
# need to be compared.
|
53
53
|
def project_path
|
54
|
-
path[
|
54
|
+
path[0..path.rindex('/data/') - 1]
|
55
55
|
end
|
56
56
|
end
|
57
|
-
|
data/lib/miga/result/stats.rb
CHANGED
@@ -1,11 +1,9 @@
|
|
1
|
-
|
2
1
|
require 'zlib'
|
3
2
|
require 'miga/result/base'
|
4
3
|
|
5
4
|
##
|
6
5
|
# Helper module including stats-specific functions for results
|
7
6
|
module MiGA::Result::Stats
|
8
|
-
|
9
7
|
##
|
10
8
|
# (Re-)calculate and save the statistics for the result
|
11
9
|
def compute_stats
|
@@ -23,46 +21,55 @@ module MiGA::Result::Stats
|
|
23
21
|
def compute_stats_raw_reads
|
24
22
|
stats = {}
|
25
23
|
if self[:files][:pair1].nil?
|
26
|
-
s = MiGA::MiGA.seqs_length(file_path(:single), :fastq, gc: true)
|
24
|
+
s = MiGA::MiGA.seqs_length(file_path(:single), :fastq, gc: true, x: true)
|
27
25
|
stats = {
|
28
26
|
reads: s[:n],
|
29
27
|
length_average: [s[:avg], 'bp'],
|
30
28
|
length_standard_deviation: [s[:sd], 'bp'],
|
31
|
-
g_c_content: [s[:gc], '%']
|
29
|
+
g_c_content: [s[:gc], '%'],
|
30
|
+
x_content: [s[:x], '%']
|
31
|
+
}
|
32
32
|
else
|
33
|
-
s1 = MiGA::MiGA.seqs_length(file_path(:pair1), :fastq, gc: true)
|
34
|
-
s2 = MiGA::MiGA.seqs_length(file_path(:pair2), :fastq, gc: true)
|
33
|
+
s1 = MiGA::MiGA.seqs_length(file_path(:pair1), :fastq, gc: true, x: true)
|
34
|
+
s2 = MiGA::MiGA.seqs_length(file_path(:pair2), :fastq, gc: true, x: true)
|
35
35
|
stats = {
|
36
36
|
read_pairs: s1[:n],
|
37
37
|
forward_length_average: [s1[:avg], 'bp'],
|
38
38
|
forward_length_standard_deviation: [s1[:sd], 'bp'],
|
39
39
|
forward_g_c_content: [s1[:gc], '%'],
|
40
|
+
forward_x_content: [s1[:x], '%'],
|
40
41
|
reverse_length_average: [s2[:avg], 'bp'],
|
41
42
|
reverse_length_standard_deviation: [s2[:sd], 'bp'],
|
42
|
-
reverse_g_c_content: [s2[:gc], '%']
|
43
|
+
reverse_g_c_content: [s2[:gc], '%'],
|
44
|
+
reverse_x_content: [s2[:x], '%']
|
45
|
+
}
|
43
46
|
end
|
44
47
|
stats
|
45
48
|
end
|
46
49
|
|
47
50
|
def compute_stats_trimmed_fasta
|
48
51
|
f = self[:files][:coupled].nil? ? file_path(:single) : file_path(:coupled)
|
49
|
-
s = MiGA::MiGA.seqs_length(f, :fasta, gc: true)
|
52
|
+
s = MiGA::MiGA.seqs_length(f, :fasta, gc: true, x: true)
|
50
53
|
{
|
51
54
|
reads: s[:n],
|
52
55
|
length_average: [s[:avg], 'bp'],
|
53
56
|
length_standard_deviation: [s[:sd], 'bp'],
|
54
|
-
g_c_content: [s[:gc], '%']
|
57
|
+
g_c_content: [s[:gc], '%'],
|
58
|
+
x_content: [s[:x], '%']
|
55
59
|
}
|
56
60
|
end
|
57
61
|
|
58
62
|
def compute_stats_assembly
|
59
|
-
s = MiGA::MiGA.seqs_length(
|
60
|
-
n50: true, gc: true
|
63
|
+
s = MiGA::MiGA.seqs_length(
|
64
|
+
file_path(:largecontigs), :fasta, n50: true, gc: true, x: true
|
65
|
+
)
|
61
66
|
{
|
62
67
|
contigs: s[:n],
|
63
68
|
n50: [s[:n50], 'bp'],
|
64
69
|
total_length: [s[:tot], 'bp'],
|
65
|
-
|
70
|
+
longest_sequence: [s[:max], 'bp'],
|
71
|
+
g_c_content: [s[:gc], '%'],
|
72
|
+
x_content: [s[:x], '%']
|
66
73
|
}
|
67
74
|
end
|
68
75
|
|
@@ -70,7 +77,8 @@ module MiGA::Result::Stats
|
|
70
77
|
s = MiGA::MiGA.seqs_length(file_path(:proteins), :fasta)
|
71
78
|
stats = {
|
72
79
|
predicted_proteins: s[:n],
|
73
|
-
average_length: [s[:avg], 'aa']
|
80
|
+
average_length: [s[:avg], 'aa']
|
81
|
+
}
|
74
82
|
asm = source.result(:assembly)
|
75
83
|
unless asm.nil? or asm[:stats][:total_length].nil?
|
76
84
|
stats[:coding_density] =
|
@@ -92,7 +100,7 @@ module MiGA::Result::Stats
|
|
92
100
|
def compute_stats_essential_genes
|
93
101
|
stats = {}
|
94
102
|
if source.is_multi?
|
95
|
-
stats = {median_copies: 0, mean_copies: 0}
|
103
|
+
stats = { median_copies: 0, mean_copies: 0 }
|
96
104
|
File.open(file_path(:report), 'r') do |fh|
|
97
105
|
fh.each_line do |ln|
|
98
106
|
if /^! (Mean|Median) number of copies per model: (.*)\./.match(ln)
|
@@ -103,8 +111,8 @@ module MiGA::Result::Stats
|
|
103
111
|
else
|
104
112
|
# Fix estimate by domain
|
105
113
|
if !(tax = source.metadata[:tax]).nil? &&
|
106
|
-
|
107
|
-
|
114
|
+
%w[Archaea Bacteria].include?(tax[:d]) &&
|
115
|
+
file_path(:raw_report).nil?
|
108
116
|
scr = "#{MiGA::MiGA.root_path}/utils/domain-ess-genes.rb"
|
109
117
|
rep = file_path(:report)
|
110
118
|
rc_p = File.expand_path('.miga_rc', ENV['HOME'])
|
@@ -115,7 +123,7 @@ module MiGA::Result::Stats
|
|
115
123
|
add_file(:report, "#{source.name}.ess/log.domain")
|
116
124
|
end
|
117
125
|
# Extract/compute quality values
|
118
|
-
stats = {completeness: [0.0, '%'], contamination: [0.0, '%']}
|
126
|
+
stats = { completeness: [0.0, '%'], contamination: [0.0, '%'] }
|
119
127
|
File.open(file_path(:report), 'r') do |fh|
|
120
128
|
fh.each_line do |ln|
|
121
129
|
if /^! (Completeness|Contamination): (.*)%/.match(ln)
|
@@ -124,22 +132,24 @@ module MiGA::Result::Stats
|
|
124
132
|
end
|
125
133
|
end
|
126
134
|
stats[:quality] = stats[:completeness][0] - stats[:contamination][0] * 5
|
127
|
-
source.metadata[:quality] =
|
128
|
-
|
129
|
-
when
|
130
|
-
when
|
131
|
-
|
132
|
-
|
135
|
+
source.metadata[:quality] =
|
136
|
+
case stats[:quality]
|
137
|
+
when 80..100; :excellent
|
138
|
+
when 50..80; :high
|
139
|
+
when 20..50; :intermediate
|
140
|
+
else; :low
|
141
|
+
end
|
133
142
|
source.save
|
134
143
|
end
|
135
144
|
stats
|
136
145
|
end
|
137
146
|
|
138
147
|
def compute_stats_ssu
|
139
|
-
stats = {ssu: 0, complete_ssu: 0}
|
148
|
+
stats = { ssu: 0, complete_ssu: 0 }
|
140
149
|
Zlib::GzipReader.open(file_path(:gff)) do |fh|
|
141
150
|
fh.each_line do |ln|
|
142
151
|
next if ln =~ /^#/
|
152
|
+
|
143
153
|
rl = ln.chomp.split("\t")
|
144
154
|
len = (rl[4].to_i - rl[3].to_i).abs + 1
|
145
155
|
stats[:max_length] = [stats[:max_length] || 0, len].max
|
@@ -158,9 +168,9 @@ module MiGA::Result::Stats
|
|
158
168
|
stats[:aai] = [$2.to_f, '%']
|
159
169
|
3.times { fh.gets }
|
160
170
|
fh.each_line do |ln|
|
161
|
-
|
162
|
-
|
163
|
-
stats[:"#{
|
171
|
+
next unless ln.chomp =~ /^\s*(\S+)\s+(.+)\s+([0-9\.e-]+)\s+\**\s*$/
|
172
|
+
|
173
|
+
stats[:"#{$1}_pvalue"] = $3.to_f unless $1 == 'root'
|
164
174
|
end
|
165
175
|
end
|
166
176
|
stats
|
data/lib/miga/tax_dist.rb
CHANGED
@@ -10,7 +10,6 @@ require 'zlib'
|
|
10
10
|
module MiGA::TaxDist
|
11
11
|
# Class-level
|
12
12
|
class << self
|
13
|
-
|
14
13
|
##
|
15
14
|
# Absolute path to the :intax or :novel data file (determined by +test+) for
|
16
15
|
# AAI, determined for options +opts+. Supported options:
|
@@ -20,8 +19,10 @@ module MiGA::TaxDist
|
|
20
19
|
engine = opts[:engine].to_s.downcase.to_sym
|
21
20
|
test = test.to_s.downcase.to_sym
|
22
21
|
return nil unless %i[intax novel].include? test
|
22
|
+
|
23
23
|
engine = :blast if %i[blast+ blat].include? engine
|
24
24
|
return nil unless %i[blast diamond].include? engine
|
25
|
+
|
25
26
|
File.expand_path("../_data/aai-#{test}-#{engine}.tsv.gz", __FILE__)
|
26
27
|
end
|
27
28
|
|
@@ -43,6 +44,7 @@ module MiGA::TaxDist
|
|
43
44
|
keys.each do |i|
|
44
45
|
v = row.shift
|
45
46
|
next if v == 'NA' # <- missing data
|
47
|
+
|
46
48
|
rank = i.zero? ? :root : MiGA::Taxonomy.KNOWN_RANKS[i]
|
47
49
|
vals[rank] = v.to_f
|
48
50
|
end
|
@@ -63,8 +65,8 @@ module MiGA::TaxDist
|
|
63
65
|
# with cannonical rank (as in MiGA::Taxonomy) and estimated p-value.
|
64
66
|
def aai_taxtest(aai, test, opts = {})
|
65
67
|
meaning = {
|
66
|
-
most_likely:
|
67
|
-
probably:
|
68
|
+
most_likely: [0.00, 0.01],
|
69
|
+
probably: [0.01, 0.10],
|
68
70
|
possibly_even: [0.10, 0.50]
|
69
71
|
}
|
70
72
|
pvalues = aai_pvalues(aai, test, opts)
|
@@ -73,6 +75,7 @@ module MiGA::TaxDist
|
|
73
75
|
lwr, upr = thresholds
|
74
76
|
min = pvalues.values.select { |v| v < upr }.max
|
75
77
|
return out if min.nil?
|
78
|
+
|
76
79
|
if min >= lwr
|
77
80
|
v = pvalues.select { |_, vj| vj == min }
|
78
81
|
out[phrase] = (test == :intax ? v.reverse_each : v).first
|
data/lib/miga/tax_index.rb
CHANGED
@@ -6,7 +6,6 @@ require 'miga/taxonomy'
|
|
6
6
|
##
|
7
7
|
# Indexing methods based on taxonomy.
|
8
8
|
class MiGA::TaxIndex < MiGA::MiGA
|
9
|
-
|
10
9
|
# Instance-level
|
11
10
|
|
12
11
|
##
|
@@ -26,9 +25,11 @@ class MiGA::TaxIndex < MiGA::MiGA
|
|
26
25
|
# Index +dataset+, a MiGA::Dataset object.
|
27
26
|
def <<(dataset)
|
28
27
|
return nil if dataset.metadata[:tax].nil?
|
28
|
+
|
29
29
|
taxon = @root
|
30
30
|
MiGA::Taxonomy.KNOWN_RANKS.each do |rank|
|
31
31
|
next if rank == :ns
|
32
|
+
|
32
33
|
taxon = taxon.add_child(rank, dataset.metadata[:tax][rank])
|
33
34
|
end
|
34
35
|
taxon.add_dataset dataset
|
@@ -43,7 +44,7 @@ class MiGA::TaxIndex < MiGA::MiGA
|
|
43
44
|
select = []
|
44
45
|
loop do
|
45
46
|
new_taxa = []
|
46
|
-
taxa.map{ |tx| tx.children }.flatten.each do |ch|
|
47
|
+
taxa.map { |tx| tx.children }.flatten.each do |ch|
|
47
48
|
if ch.rank == rank
|
48
49
|
select << ch
|
49
50
|
elsif not ch.children.empty?
|
@@ -59,7 +60,8 @@ class MiGA::TaxIndex < MiGA::MiGA
|
|
59
60
|
# Generate JSON String for the index.
|
60
61
|
def to_json
|
61
62
|
MiGA::Json.generate(
|
62
|
-
{ root: root.to_hash, datasets: datasets.map{ |d| d.name } }
|
63
|
+
{ root: root.to_hash, datasets: datasets.map { |d| d.name } }
|
64
|
+
)
|
63
65
|
end
|
64
66
|
|
65
67
|
##
|
@@ -72,7 +74,6 @@ end
|
|
72
74
|
##
|
73
75
|
# Helper class for MiGA::TaxIndex.
|
74
76
|
class MiGA::TaxIndexTaxon < MiGA::MiGA
|
75
|
-
|
76
77
|
# Instance-level
|
77
78
|
|
78
79
|
##
|
@@ -96,14 +97,14 @@ class MiGA::TaxIndexTaxon < MiGA::MiGA
|
|
96
97
|
|
97
98
|
##
|
98
99
|
# String representation of the taxon.
|
99
|
-
def tax_str
|
100
|
+
def tax_str; "#{rank}:#{name.nil? ? '?' : name}"; end
|
100
101
|
|
101
102
|
##
|
102
103
|
# Add child at +rank+ with +name+.
|
103
104
|
def add_child(rank, name)
|
104
105
|
rank = rank.to_sym
|
105
106
|
name = name.miga_name unless name.nil?
|
106
|
-
child = children.find{ |it| it.rank==rank and it.name==name }
|
107
|
+
child = children.find { |it| it.rank == rank and it.name == name }
|
107
108
|
if child.nil?
|
108
109
|
child = MiGA::TaxIndexTaxon.new(rank, name)
|
109
110
|
@children << child
|
@@ -113,45 +114,44 @@ class MiGA::TaxIndexTaxon < MiGA::MiGA
|
|
113
114
|
|
114
115
|
##
|
115
116
|
# Add dataset at the current taxon (not children).
|
116
|
-
def add_dataset(dataset) @datasets << dataset
|
117
|
+
def add_dataset(dataset) @datasets << dataset; end
|
117
118
|
|
118
119
|
##
|
119
120
|
# Get the number of datasets in the taxon (including children).
|
120
121
|
def datasets_count
|
121
|
-
children.map{ |it| it.datasets_count }.reduce(datasets.size, :+)
|
122
|
+
children.map { |it| it.datasets_count }.reduce(datasets.size, :+)
|
122
123
|
end
|
123
124
|
|
124
125
|
##
|
125
126
|
# Get all the datasets in the taxon (including children).
|
126
127
|
def all_datasets
|
127
|
-
children.map{ |it| it.datasets }.reduce(datasets, :+)
|
128
|
+
children.map { |it| it.datasets }.reduce(datasets, :+)
|
128
129
|
end
|
129
130
|
|
130
131
|
##
|
131
132
|
# JSON String of the taxon.
|
132
133
|
def to_json(*a)
|
133
|
-
{ str:tax_str, datasets:datasets.map{|d| d.name},
|
134
|
-
children:children }.to_json(a)
|
134
|
+
{ str: tax_str, datasets: datasets.map { |d| d.name },
|
135
|
+
children: children }.to_json(a)
|
135
136
|
end
|
136
137
|
|
137
138
|
##
|
138
139
|
# Hash representation of the taxon.
|
139
140
|
def to_hash
|
140
|
-
{ str:tax_str, datasets:datasets.map{|d| d.name},
|
141
|
-
children:children.map{ |it| it.to_hash } }
|
141
|
+
{ str: tax_str, datasets: datasets.map { |d| d.name },
|
142
|
+
children: children.map { |it| it.to_hash } }
|
142
143
|
end
|
143
144
|
|
144
145
|
##
|
145
146
|
# Tabular String of the taxon.
|
146
|
-
def to_tab(unknown, indent=0)
|
147
|
+
def to_tab(unknown, indent = 0)
|
147
148
|
o = ''
|
148
149
|
if unknown or not datasets.empty? or not name.nil?
|
149
150
|
o = "#{' ' * indent}#{tax_str}: #{datasets_count}\n"
|
150
151
|
end
|
151
152
|
indent += 2
|
152
|
-
datasets.each{ |ds| o << "#{' ' * indent}# #{ds.name}\n" }
|
153
|
-
children.each{ |it| o << it.to_tab(unknown, indent) }
|
153
|
+
datasets.each { |ds| o << "#{' ' * indent}# #{ds.name}\n" }
|
154
|
+
children.each { |it| o << it.to_tab(unknown, indent) }
|
154
155
|
o
|
155
156
|
end
|
156
|
-
|
157
157
|
end
|
data/lib/miga/taxonomy.rb
CHANGED
@@ -45,6 +45,7 @@ class MiGA::Taxonomy < MiGA::MiGA
|
|
45
45
|
when Hash
|
46
46
|
value.each do |r, n|
|
47
47
|
next if n.nil? || n == ''
|
48
|
+
|
48
49
|
@ranks[self.class.normalize_rank(r)] = n.tr('_', ' ')
|
49
50
|
end
|
50
51
|
when Array
|
@@ -87,6 +88,7 @@ class MiGA::Taxonomy < MiGA::MiGA
|
|
87
88
|
# the alternative (or master) is replaced instead if +replace+ is true.
|
88
89
|
def add_alternative(tax, replace = true)
|
89
90
|
raise 'Unsupported taxonomy class.' unless tax.is_a? MiGA::Taxonomy
|
91
|
+
|
90
92
|
alt_ns = alternative(tax.namespace)
|
91
93
|
if !replace || tax.namespace.nil? || alt_ns.nil?
|
92
94
|
@alt << tax
|
@@ -96,7 +98,7 @@ class MiGA::Taxonomy < MiGA::MiGA
|
|
96
98
|
end
|
97
99
|
|
98
100
|
##
|
99
|
-
# Removes (and returns) all alternative taxonomies.
|
101
|
+
# Removes (and returns) all alternative taxonomies.
|
100
102
|
def delete_alternative
|
101
103
|
alt = @alt.dup
|
102
104
|
@alt = []
|
@@ -109,6 +111,7 @@ class MiGA::Taxonomy < MiGA::MiGA
|
|
109
111
|
def in?(taxon)
|
110
112
|
r = taxon.ranks.keys.first
|
111
113
|
return false if self[r].nil?
|
114
|
+
|
112
115
|
self[r].casecmp(taxon[r]).zero?
|
113
116
|
end
|
114
117
|
|
@@ -120,6 +123,7 @@ class MiGA::Taxonomy < MiGA::MiGA
|
|
120
123
|
@@KNOWN_RANKS.map do |r|
|
121
124
|
next if
|
122
125
|
(r == :ns && !with_namespace) || (ranks[r].nil? && !force_ranks)
|
126
|
+
|
123
127
|
[r, ranks[r]]
|
124
128
|
end.compact
|
125
129
|
end
|
@@ -179,6 +183,7 @@ class MiGA::Taxonomy < MiGA::MiGA
|
|
179
183
|
unless ranks.size == str.size
|
180
184
|
raise "Unequal number of ranks and names: #{ranks} => #{str}"
|
181
185
|
end
|
186
|
+
|
182
187
|
str.each_with_index { |i, k| self << "#{ranks[k]}:#{i}" }
|
183
188
|
end
|
184
189
|
end
|