miga-base 0.4.1.0 → 0.4.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/miga +2 -244
- data/lib/miga/cli/action/about.rb +44 -0
- data/lib/miga/cli/action/add.rb +139 -0
- data/lib/miga/cli/action/add_result.rb +26 -0
- data/lib/miga/cli/action/console.rb +19 -0
- data/lib/miga/cli/action/daemon.rb +74 -0
- data/lib/miga/cli/action/date.rb +18 -0
- data/lib/miga/cli/action/doctor.rb +210 -0
- data/lib/miga/cli/action/edit.rb +24 -0
- data/lib/miga/cli/action/files.rb +31 -0
- data/lib/miga/cli/action/find.rb +48 -0
- data/lib/miga/cli/action/generic.rb +44 -0
- data/lib/miga/cli/action/get.rb +132 -0
- data/lib/miga/cli/action/init.rb +343 -0
- data/lib/miga/cli/action/ln.rb +42 -0
- data/lib/miga/cli/action/ls.rb +55 -0
- data/lib/miga/cli/action/ncbi_get.rb +218 -0
- data/lib/miga/cli/action/new.rb +45 -0
- data/lib/miga/cli/action/next_step.rb +27 -0
- data/lib/miga/cli/action/plugins.rb +28 -0
- data/lib/miga/cli/action/rm.rb +25 -0
- data/lib/miga/cli/action/run.rb +39 -0
- data/lib/miga/cli/action/stats.rb +140 -0
- data/lib/miga/cli/action/summary.rb +49 -0
- data/lib/miga/cli/action/tax_dist.rb +102 -0
- data/lib/miga/cli/action/tax_index.rb +47 -0
- data/lib/miga/cli/action/tax_set.rb +59 -0
- data/lib/miga/cli/action/tax_test.rb +77 -0
- data/lib/miga/cli/action.rb +66 -0
- data/lib/miga/cli/base.rb +90 -0
- data/lib/miga/cli.rb +426 -0
- data/lib/miga/project/result.rb +14 -6
- data/lib/miga/remote_dataset.rb +1 -1
- data/lib/miga/tax_index.rb +5 -4
- data/lib/miga/taxonomy/base.rb +63 -0
- data/lib/miga/taxonomy.rb +87 -92
- data/lib/miga/version.rb +6 -6
- data/test/taxonomy_test.rb +49 -9
- data/utils/distance/commands.rb +11 -11
- data/utils/distance/pipeline.rb +5 -5
- metadata +43 -49
- data/actions/about.rb +0 -43
- data/actions/add.rb +0 -129
- data/actions/add_result.rb +0 -30
- data/actions/daemon.rb +0 -55
- data/actions/date.rb +0 -14
- data/actions/doctor.rb +0 -201
- data/actions/edit.rb +0 -33
- data/actions/files.rb +0 -43
- data/actions/find.rb +0 -41
- data/actions/get.rb +0 -105
- data/actions/init.rb +0 -301
- data/actions/ln.rb +0 -47
- data/actions/ls.rb +0 -61
- data/actions/ncbi_get.rb +0 -192
- data/actions/new.rb +0 -44
- data/actions/next_step.rb +0 -33
- data/actions/plugins.rb +0 -25
- data/actions/rm.rb +0 -29
- data/actions/run.rb +0 -45
- data/actions/stats.rb +0 -149
- data/actions/summary.rb +0 -57
- data/actions/tax_dist.rb +0 -106
- data/actions/tax_index.rb +0 -46
- data/actions/tax_set.rb +0 -63
- data/actions/tax_test.rb +0 -80
@@ -0,0 +1,63 @@
|
|
1
|
+
# @package MiGA
|
2
|
+
# @license Artistic-2.0
|
3
|
+
|
4
|
+
class MiGA::Taxonomy < MiGA::MiGA
|
5
|
+
|
6
|
+
class << self
|
7
|
+
|
8
|
+
##
|
9
|
+
# Returns cannonical rank (Symbol) for the +rank+ String.
|
10
|
+
def normalize_rank(rank)
|
11
|
+
return rank.to_sym if @@_KNOWN_RANKS_H[rank.to_sym]
|
12
|
+
rank = rank.to_s.downcase
|
13
|
+
return nil if rank == 'no rank'
|
14
|
+
rank = @@RANK_SYNONYMS[rank] unless @@RANK_SYNONYMS[rank].nil?
|
15
|
+
rank = rank.to_sym
|
16
|
+
return nil unless @@_KNOWN_RANKS_H[rank]
|
17
|
+
rank
|
18
|
+
end
|
19
|
+
|
20
|
+
##
|
21
|
+
# Initialize from JSON-derived Hash +o+.
|
22
|
+
def json_create(o)
|
23
|
+
new(o['str'], nil, o['alt'])
|
24
|
+
end
|
25
|
+
|
26
|
+
def KNOWN_RANKS() @@KNOWN_RANKS; end
|
27
|
+
def LONG_RANKS() @@LONG_RANKS; end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
module MiGA::Taxonomy::Base
|
34
|
+
|
35
|
+
##
|
36
|
+
# Cannonical ranks.
|
37
|
+
@@KNOWN_RANKS = %w{ns d k p c o f g s ssp str ds}.map { |r| r.to_sym }
|
38
|
+
@@_KNOWN_RANKS_H = Hash[ @@KNOWN_RANKS.map { |i| [i, true] } ]
|
39
|
+
|
40
|
+
##
|
41
|
+
# Long names of the cannonical ranks.
|
42
|
+
@@LONG_RANKS = { root: 'root', ns: 'namespace', d: 'domain', k: 'kingdom',
|
43
|
+
p: 'phylum', c: 'class', o: 'order', f: 'family', g: 'genus', s: 'species',
|
44
|
+
ssp: 'subspecies', str: 'strain', ds: 'dataset' }
|
45
|
+
|
46
|
+
##
|
47
|
+
# Synonms for cannonical ranks.
|
48
|
+
@@RANK_SYNONYMS = {
|
49
|
+
'namespace' => 'ns',
|
50
|
+
'domain' => 'd', 'superkingdom' => 'd',
|
51
|
+
'kingdom' => 'k',
|
52
|
+
'phylum' => 'p',
|
53
|
+
'class' => 'c',
|
54
|
+
'order' => 'o',
|
55
|
+
'family' => 'f',
|
56
|
+
'genus' => 'g',
|
57
|
+
'species' => 's', 'sp' => 's',
|
58
|
+
'subspecies' => 'ssp',
|
59
|
+
'strain' => 'str', 'isolate' => 'str', 'culture' => 'str',
|
60
|
+
'dataset' => 'ds', 'organism' => 'ds', 'genome' => 'ds', 'specimen' => 'ds'
|
61
|
+
}
|
62
|
+
|
63
|
+
end
|
data/lib/miga/taxonomy.rb
CHANGED
@@ -1,60 +1,12 @@
|
|
1
1
|
# @package MiGA
|
2
2
|
# @license Artistic-2.0
|
3
3
|
|
4
|
+
require 'miga/taxonomy/base'
|
5
|
+
|
4
6
|
##
|
5
7
|
# Taxonomic classifications in MiGA.
|
6
8
|
class MiGA::Taxonomy < MiGA::MiGA
|
7
|
-
|
8
|
-
|
9
|
-
##
|
10
|
-
# Cannonical ranks.
|
11
|
-
def self.KNOWN_RANKS() @@KNOWN_RANKS ; end
|
12
|
-
@@KNOWN_RANKS = %w{ns d k p c o f g s ssp str ds}.map{|r| r.to_sym}
|
13
|
-
@@_KNOWN_RANKS_H = Hash[ @@KNOWN_RANKS.map{ |i| [i,true] } ]
|
14
|
-
|
15
|
-
##
|
16
|
-
# Long names of the cannonical ranks.
|
17
|
-
def self.LONG_RANKS() @@LONG_RANKS ; end
|
18
|
-
@@LONG_RANKS = {root: 'root', ns: 'namespace', d: 'domain', k: 'kingdom',
|
19
|
-
p: 'phylum', c: 'class', o: 'order', f: 'family', g: 'genus', s: 'species',
|
20
|
-
ssp: 'subspecies', str: 'strain', ds: 'dataset'}
|
21
|
-
|
22
|
-
##
|
23
|
-
# Synonms for cannonical ranks.
|
24
|
-
@@RANK_SYNONYMS = {
|
25
|
-
'namespace' => 'ns',
|
26
|
-
'domain' => 'd', 'superkingdom' => 'd',
|
27
|
-
'kingdom' => 'k',
|
28
|
-
'phylum' => 'p',
|
29
|
-
'class' => 'c',
|
30
|
-
'order' => 'o',
|
31
|
-
'family' => 'f',
|
32
|
-
'genus' => 'g',
|
33
|
-
'species' => 's', 'sp' => 's',
|
34
|
-
'subspecies' => 'ssp',
|
35
|
-
'strain' => 'str', 'isolate' => 'str', 'culture' => 'str',
|
36
|
-
'dataset' => 'ds', 'organism' => 'ds', 'genome' => 'ds', 'specimen' => 'ds'
|
37
|
-
}
|
38
|
-
|
39
|
-
##
|
40
|
-
# Initialize from JSON-derived Hash +o+.
|
41
|
-
def self.json_create(o)
|
42
|
-
new(o['str'], nil, o['alt'])
|
43
|
-
end
|
44
|
-
|
45
|
-
##
|
46
|
-
# Returns cannonical rank (Symbol) for the +rank+ String.
|
47
|
-
def self.normalize_rank(rank)
|
48
|
-
return rank.to_sym if @@_KNOWN_RANKS_H[rank.to_sym]
|
49
|
-
rank = rank.to_s.downcase
|
50
|
-
return nil if rank == 'no rank'
|
51
|
-
rank = @@RANK_SYNONYMS[rank] unless @@RANK_SYNONYMS[rank].nil?
|
52
|
-
rank = rank.to_sym
|
53
|
-
return nil unless @@_KNOWN_RANKS_H[rank]
|
54
|
-
rank
|
55
|
-
end
|
56
|
-
|
57
|
-
# Instance-level
|
9
|
+
include MiGA::Taxonomy::Base
|
58
10
|
|
59
11
|
##
|
60
12
|
# Taxonomic hierarchy Hash.
|
@@ -69,46 +21,47 @@ class MiGA::Taxonomy < MiGA::MiGA
|
|
69
21
|
# String, Array, or Hash entries as defined above (except +ranks+ are not
|
70
22
|
# allowed).
|
71
23
|
def initialize(str, ranks = nil, alt = [])
|
24
|
+
reset(str, ranks)
|
25
|
+
@alt = (alt || []).map { |i| Taxonomy.new(i) }
|
26
|
+
end
|
27
|
+
|
28
|
+
##
|
29
|
+
# Reset ranks (including namespace) while leaving alternatives untouched.
|
30
|
+
# See #initialize for +str+ and +ranks+.
|
31
|
+
def reset(str, ranks = nil)
|
72
32
|
@ranks = {}
|
73
33
|
if ranks.nil?
|
74
|
-
|
75
|
-
self << str
|
76
|
-
else
|
77
|
-
"#{str} ".scan(/([A-Za-z]+):([^:]*)( )/){ |r,n,_| self << {r=>n} }
|
78
|
-
end
|
34
|
+
initialize_by_str(str)
|
79
35
|
else
|
80
|
-
|
81
|
-
str = str.split(/\s+/) unless str.is_a? Array
|
82
|
-
raise "Unequal number of ranks (#{ranks.size}) " +
|
83
|
-
"and names (#{str.size}):#{ranks} => #{str}" unless
|
84
|
-
ranks.size==str.size
|
85
|
-
(0 .. str.size).each{ |i| self << "#{ranks[i]}:#{str[i]}" }
|
36
|
+
initialize_by_ranks(str, ranks)
|
86
37
|
end
|
87
|
-
|
38
|
+
initialize_by_str(str)
|
88
39
|
end
|
89
|
-
|
40
|
+
|
90
41
|
##
|
91
42
|
# Add +value+ to the hierarchy, that can be an Array, a String, or a Hash, as
|
92
43
|
# described in #initialize.
|
93
44
|
def <<(value)
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
45
|
+
case value
|
46
|
+
when Hash
|
47
|
+
value.each do |r, n|
|
48
|
+
next if n.nil? || n == ''
|
49
|
+
@ranks[self.class.normalize_rank(r)] = n.tr('_', ' ')
|
98
50
|
end
|
99
|
-
|
100
|
-
value.each{ |v| self << v }
|
101
|
-
|
102
|
-
|
103
|
-
self << { rank => name }
|
51
|
+
when Array
|
52
|
+
value.each { |v| self << v }
|
53
|
+
when String
|
54
|
+
self << Hash[*value.split(':', 2)]
|
104
55
|
else
|
105
|
-
raise
|
56
|
+
raise 'Unsupported class: ' + value.class.name
|
106
57
|
end
|
107
58
|
end
|
108
|
-
|
59
|
+
|
109
60
|
##
|
110
61
|
# Get +rank+ value.
|
111
|
-
def [](rank)
|
62
|
+
def [](rank)
|
63
|
+
@ranks[rank.to_sym]
|
64
|
+
end
|
112
65
|
|
113
66
|
##
|
114
67
|
# Get the alternative taxonomies.
|
@@ -126,17 +79,38 @@ class MiGA::Taxonomy < MiGA::MiGA
|
|
126
79
|
when Integer
|
127
80
|
([self] + @alt)[which]
|
128
81
|
else
|
129
|
-
([self] + @alt).find{ |i| i.namespace.to_s == which.to_s }
|
82
|
+
([self] + @alt).find { |i| i.namespace.to_s == which.to_s }
|
130
83
|
end
|
131
84
|
end
|
132
|
-
|
85
|
+
|
86
|
+
##
|
87
|
+
# Add an alternative taxonomy. If the namespace matches an existing namespace,
|
88
|
+
# the alternative (or master) is replaced instead if +replace+ is true.
|
89
|
+
def add_alternative(tax, replace = true)
|
90
|
+
raise 'Unsupported taxonomy class.' unless tax.is_a? MiGA::Taxonomy
|
91
|
+
alt_ns = alternative(tax.namespace)
|
92
|
+
if !replace || tax.namespace.nil? || alt_ns.nil?
|
93
|
+
@alt << tax
|
94
|
+
else
|
95
|
+
alt_ns.reset(tax.to_s)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
##
|
100
|
+
# Removes (and returns) all alternative taxonomies.
|
101
|
+
def delete_alternative
|
102
|
+
alt = @alt.dup
|
103
|
+
@alt = []
|
104
|
+
alt
|
105
|
+
end
|
106
|
+
|
133
107
|
##
|
134
108
|
# Evaluates if the loaded taxonomy includes +taxon+. It assumes that +taxon+
|
135
109
|
# only has one informative rank. The evaluation is case-insensitive.
|
136
|
-
def
|
110
|
+
def in?(taxon)
|
137
111
|
r = taxon.ranks.keys.first
|
138
|
-
return false if self[
|
139
|
-
self[
|
112
|
+
return false if self[r].nil?
|
113
|
+
self[r].casecmp(taxon[r]).zero?
|
140
114
|
end
|
141
115
|
|
142
116
|
##
|
@@ -145,22 +119,24 @@ class MiGA::Taxonomy < MiGA::MiGA
|
|
145
119
|
# If +with_namespace+ is true, it includes also the namespace.
|
146
120
|
def sorted_ranks(force_ranks = false, with_namespace = false)
|
147
121
|
@@KNOWN_RANKS.map do |r|
|
148
|
-
next if
|
149
|
-
|
122
|
+
next if
|
123
|
+
(r == :ns && !with_namespace) || (ranks[r].nil? && !force_ranks)
|
150
124
|
[r, ranks[r]]
|
151
125
|
end.compact
|
152
126
|
end
|
153
127
|
|
154
128
|
##
|
155
129
|
# Namespace of the taxonomy (a String) or +nil+.
|
156
|
-
def namespace
|
157
|
-
|
130
|
+
def namespace
|
131
|
+
self[:ns]
|
132
|
+
end
|
133
|
+
|
158
134
|
##
|
159
135
|
# Get the most general rank as a two-entry Array (rank and value).
|
160
136
|
# If +force_ranks+ is true, it always returns the value for domain (d)
|
161
137
|
# even if undefined.
|
162
138
|
def highest(force_ranks = false)
|
163
|
-
sorted_ranks.first
|
139
|
+
sorted_ranks(force_ranks).first
|
164
140
|
end
|
165
141
|
|
166
142
|
##
|
@@ -170,21 +146,40 @@ class MiGA::Taxonomy < MiGA::MiGA
|
|
170
146
|
def lowest(force_ranks = false)
|
171
147
|
sorted_ranks(force_ranks).last
|
172
148
|
end
|
173
|
-
|
149
|
+
|
174
150
|
##
|
175
151
|
# Generate cannonical String for the taxonomy. If +force_ranks+ is true,
|
176
152
|
# it returns all the standard ranks even if undefined.
|
177
153
|
def to_s(force_ranks = false)
|
178
|
-
sorted_ranks(force_ranks, true)
|
179
|
-
map{ |r| "#{r[0]}:#{(r[1] || '').gsub(/[\s:]/, '_')}" }.join(' ')
|
154
|
+
sorted_ranks(force_ranks, true)
|
155
|
+
.map { |r| "#{r[0]}:#{(r[1] || '').gsub(/[\s:]/, '_')}" }.join(' ')
|
180
156
|
end
|
181
|
-
|
157
|
+
|
182
158
|
##
|
183
159
|
# Generate JSON-formated String representing the taxonomy.
|
184
160
|
def to_json(*a)
|
185
|
-
hsh = { JSON.create_id => self.class.name, 'str' =>
|
161
|
+
hsh = { JSON.create_id => self.class.name, 'str' => to_s }
|
186
162
|
hsh['alt'] = alternative.map(&:to_s) unless alternative.empty?
|
187
163
|
hsh.to_json(*a)
|
188
164
|
end
|
189
|
-
|
165
|
+
|
166
|
+
private
|
167
|
+
|
168
|
+
def initialize_by_str(str)
|
169
|
+
case str
|
170
|
+
when Array, Hash
|
171
|
+
self << str
|
172
|
+
else
|
173
|
+
"#{str} ".scan(/([A-Za-z]+):([^:]*)( )/) { |r, n, _| self << { r => n } }
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
def initialize_by_ranks(str, ranks)
|
178
|
+
ranks = ranks.split(/\s+/) unless ranks.is_a? Array
|
179
|
+
str = str.split(/\s+/) unless str.is_a? Array
|
180
|
+
unless ranks.size == str.size
|
181
|
+
raise "Unequal number of ranks and names: #{ranks} => #{str}"
|
182
|
+
end
|
183
|
+
str.each_with_index { |i, k| self << "#{ranks[k]}:#{i}" }
|
184
|
+
end
|
190
185
|
end
|
data/lib/miga/version.rb
CHANGED
@@ -4,22 +4,22 @@ require 'date'
|
|
4
4
|
##
|
5
5
|
# High-level minimal requirements for the MiGA::MiGA class.
|
6
6
|
module MiGA
|
7
|
-
|
7
|
+
|
8
8
|
##
|
9
9
|
# Current version of MiGA. An Array with three values:
|
10
10
|
# - Float representing the major.minor version.
|
11
11
|
# - Integer representing gem releases of the current version.
|
12
12
|
# - Integer representing minor changes that require new version number.
|
13
|
-
VERSION = [0.4,
|
14
|
-
|
13
|
+
VERSION = [0.4, 2, 0]
|
14
|
+
|
15
15
|
##
|
16
16
|
# Nickname for the current major.minor version.
|
17
17
|
VERSION_NAME = 'aquatint'
|
18
|
-
|
18
|
+
|
19
19
|
##
|
20
20
|
# Date of the current gem release.
|
21
|
-
VERSION_DATE = Date.new(2019,
|
22
|
-
|
21
|
+
VERSION_DATE = Date.new(2019, 9, 8)
|
22
|
+
|
23
23
|
##
|
24
24
|
# Reference of MiGA.
|
25
25
|
CITATION = 'Rodriguez-R et al (2018). ' \
|
data/test/taxonomy_test.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require 'test_helper'
|
2
|
+
require 'miga/taxonomy'
|
3
3
|
|
4
4
|
class TaxonomyTest < Test::Unit::TestCase
|
5
5
|
|
@@ -40,23 +40,32 @@ class TaxonomyTest < Test::Unit::TestCase
|
|
40
40
|
tx << { :genus => "v3" }
|
41
41
|
assert_equal("v3", tx[:g])
|
42
42
|
tx << "s:v3_0"
|
43
|
-
assert(tx.
|
43
|
+
assert(tx.in? MiGA::Taxonomy.new("species:v3_0"))
|
44
44
|
assert_raise(RuntimeError) { tx << 123 }
|
45
45
|
end
|
46
46
|
|
47
47
|
def test_init_methods
|
48
|
-
tx = MiGA::Taxonomy.new({:
|
49
|
-
assert_equal(
|
50
|
-
tx = MiGA::Taxonomy.new(
|
51
|
-
assert_equal(
|
48
|
+
tx = MiGA::Taxonomy.new({k: 'Mascot', c: 'Cereal', s: 'Melvin'})
|
49
|
+
assert_equal('k:Mascot c:Cereal s:Melvin', tx.to_s)
|
50
|
+
tx = MiGA::Taxonomy.new('Mascot College Buzz', 'k c s')
|
51
|
+
assert_equal('k:Mascot c:College s:Buzz', tx.to_s)
|
52
52
|
assert_raise do
|
53
|
-
tx = MiGA::Taxonomy.new(
|
53
|
+
tx = MiGA::Taxonomy.new('Mascot State Georgia Peach', 'k c s')
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
57
|
-
def
|
57
|
+
def test_rank_order
|
58
|
+
tx = MiGA::Taxonomy.new({k: 'Mascot', s: 'Melvin', c: 'Cereal'})
|
59
|
+
assert_equal([:d, nil], tx.highest(true))
|
60
|
+
assert_equal([:k, 'Mascot'], tx.highest)
|
61
|
+
assert_equal([:ds, nil], tx.lowest(true))
|
62
|
+
assert_equal([:s, 'Melvin'], tx.lowest)
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_alternative
|
58
66
|
tx = MiGA::Taxonomy.new('ns:a s:Arnie', nil,
|
59
67
|
['ns:b s:Bernie','ns:c s:Cornie','s:Darnie'])
|
68
|
+
# Fields
|
60
69
|
assert_equal('ns:a s:Arnie', tx.to_s)
|
61
70
|
assert_equal([[:s, 'Arnie']], tx.sorted_ranks)
|
62
71
|
assert_equal('ns:a s:Arnie', tx.alternative(0).to_s)
|
@@ -65,11 +74,42 @@ class TaxonomyTest < Test::Unit::TestCase
|
|
65
74
|
assert_equal('s:Darnie', tx.alternative('').to_s)
|
66
75
|
assert_nil(tx.alternative(:x))
|
67
76
|
assert_equal(3, tx.alternative.size)
|
77
|
+
# JSON
|
68
78
|
js = tx.to_json
|
69
79
|
tx_js = JSON.parse(js, {symbolize_names: false, create_additions: true})
|
70
80
|
assert_equal(tx.to_s, tx_js.to_s)
|
71
81
|
assert_equal(tx.alternative(2).to_s, tx_js.alternative(2).to_s)
|
72
82
|
assert_equal(tx.alternative.size, tx_js.alternative.size)
|
83
|
+
# Add
|
84
|
+
tx.add_alternative(tx.alternative(3))
|
85
|
+
assert_equal(4, tx.alternative.size)
|
86
|
+
tx.add_alternative(tx.alternative(2))
|
87
|
+
assert_equal(4, tx.alternative.size)
|
88
|
+
# Delete
|
89
|
+
alt = tx.delete_alternative
|
90
|
+
assert_equal(4, alt.size)
|
91
|
+
assert(tx.alternative.empty?)
|
92
|
+
end
|
93
|
+
|
94
|
+
def test_reset
|
95
|
+
tx = MiGA::Taxonomy.new('ns:Letters d:Latin s:A', nil,
|
96
|
+
['ns:Words d:English s:A', 'ns:Music d:Tone s:A'])
|
97
|
+
# Reset
|
98
|
+
assert_equal(2, tx.alternative.size)
|
99
|
+
assert_equal('Letters', tx.namespace)
|
100
|
+
tx.reset('g:A')
|
101
|
+
assert_equal(2, tx.alternative.size)
|
102
|
+
assert_nil(tx.namespace)
|
103
|
+
tx.reset('ns:Letters d:Latin s:A')
|
104
|
+
assert_equal('Letters', tx.namespace)
|
105
|
+
# Change of alternative
|
106
|
+
assert_equal('ns:Words d:English s:A', tx.alternative('Words').to_s)
|
107
|
+
tx.add_alternative(MiGA::Taxonomy.new('ns:Words d:Spanish s:A'))
|
108
|
+
assert_equal('ns:Words d:Spanish s:A', tx.alternative('Words').to_s)
|
109
|
+
# Change of master
|
110
|
+
assert_equal('ns:Letters d:Latin s:A', tx.to_s)
|
111
|
+
tx.add_alternative(MiGA::Taxonomy.new('ns:Letters d:Unicode s:A'))
|
112
|
+
assert_equal('ns:Letters d:Unicode s:A', tx.to_s)
|
73
113
|
end
|
74
114
|
|
75
115
|
end
|
data/utils/distance/commands.rb
CHANGED
@@ -3,14 +3,14 @@ module MiGA::DistanceRunner::Commands
|
|
3
3
|
# Estimates or calculates AAI against +target+
|
4
4
|
def aai(target)
|
5
5
|
# Check if the request makes sense
|
6
|
-
return nil if target.nil?
|
6
|
+
return nil if target.nil? || target.result(:essential_genes).nil?
|
7
7
|
# Check if it's been calculated
|
8
8
|
y = stored_value(target, :aai)
|
9
|
-
return y unless y.nil?
|
9
|
+
return y unless y.nil? || y.zero?
|
10
10
|
# Try hAAI (except in clade projects)
|
11
11
|
unless @ref_project.is_clade?
|
12
12
|
y = haai(target)
|
13
|
-
return y unless y.nil?
|
13
|
+
return y unless y.nil? || y.zero?
|
14
14
|
end
|
15
15
|
# Full AAI
|
16
16
|
aai_cmd(
|
@@ -27,10 +27,10 @@ module MiGA::DistanceRunner::Commands
|
|
27
27
|
dataset.name, target.name, tmp_dbs[:haai],
|
28
28
|
aai_save_rbm: 'no-save-rbm', aai_p: opts[:haai_p])
|
29
29
|
checkpoint :haai
|
30
|
-
return nil if haai.nil?
|
30
|
+
return nil if haai.nil? || haai.zero? || haai > 90.0
|
31
31
|
aai = 100.0 - Math.exp(2.435076 + 0.4275193*Math.log(100.0-haai))
|
32
32
|
SQLite3::Database.new(tmp_dbs[:aai]) do |conn|
|
33
|
-
conn.execute
|
33
|
+
conn.execute 'insert into aai values(?, ?, ?, 0, 0, 0)',
|
34
34
|
[dataset.name, target.name, aai]
|
35
35
|
end
|
36
36
|
checkpoint :aai
|
@@ -43,10 +43,10 @@ module MiGA::DistanceRunner::Commands
|
|
43
43
|
# Check if the request makes sense
|
44
44
|
t = tmp_file('largecontigs.fa')
|
45
45
|
r = target.result(:assembly)
|
46
|
-
return nil if r.nil?
|
46
|
+
return nil if r.nil? || !File.size?(t)
|
47
47
|
# Check if it's been calculated
|
48
48
|
y = stored_value(target, :ani)
|
49
|
-
return y unless y.nil?
|
49
|
+
return y unless y.nil? || y.zero?
|
50
50
|
# Run it
|
51
51
|
ani_cmd(
|
52
52
|
t, r.file_path(:largecontigs),
|
@@ -58,7 +58,7 @@ module MiGA::DistanceRunner::Commands
|
|
58
58
|
# Returns +nil+ otherwise
|
59
59
|
def ani_after_aai(target, aai_limit = 85.0)
|
60
60
|
aai = aai(target)
|
61
|
-
(aai.nil?
|
61
|
+
(aai.nil? || aai < aai_limit) ? nil : ani(target)
|
62
62
|
end
|
63
63
|
|
64
64
|
##
|
@@ -69,7 +69,7 @@ module MiGA::DistanceRunner::Commands
|
|
69
69
|
--name1 "#{n1}" --name2 "#{n2}" \
|
70
70
|
-t "#{o[:thr]}" -a --lookup-first "--#{o[:aai_save_rbm]}" \
|
71
71
|
-p "#{o[:aai_p] || "blast+"}"`.chomp
|
72
|
-
(v.nil?
|
72
|
+
(v.nil? || v.empty?) ? 0 : v.to_f
|
73
73
|
end
|
74
74
|
|
75
75
|
##
|
@@ -82,7 +82,7 @@ module MiGA::DistanceRunner::Commands
|
|
82
82
|
-o /dev/stdout 2>/dev/null`.chomp.split(/\s+/)
|
83
83
|
unless out.empty?
|
84
84
|
SQLite3::Database.new(db) do |conn|
|
85
|
-
conn.execute
|
85
|
+
conn.execute 'insert into ani values(?, ?, ?, 0, ?, ?)',
|
86
86
|
[n1, n2, out[2], out[3], out[4]]
|
87
87
|
end
|
88
88
|
end
|
@@ -93,6 +93,6 @@ module MiGA::DistanceRunner::Commands
|
|
93
93
|
-t "#{opts[:thr]}" -a --no-save-regions --no-save-rbm \
|
94
94
|
--lookup-first -p "#{o[:ani_p] || "blast+"}"`.chomp
|
95
95
|
end
|
96
|
-
v.nil?
|
96
|
+
v.nil? || v.empty? ? 0 : v.to_f
|
97
97
|
end
|
98
98
|
end
|
data/utils/distance/pipeline.rb
CHANGED
@@ -6,13 +6,13 @@ module MiGA::DistanceRunner::Pipeline
|
|
6
6
|
# classification and cluster number
|
7
7
|
def classify(clades, classif, metric, result_fh, val_cls=nil)
|
8
8
|
dir = File.expand_path(classif, clades)
|
9
|
-
med = File.expand_path(
|
9
|
+
med = File.expand_path('miga-project.medoids', dir)
|
10
10
|
return [classif,val_cls] unless File.size? med
|
11
11
|
max_val = 0
|
12
|
-
val_med =
|
12
|
+
val_med = ''
|
13
13
|
val_cls = nil
|
14
14
|
i_n = 0
|
15
|
-
File.open(med,
|
15
|
+
File.open(med, 'r') do |med_fh|
|
16
16
|
med_fh.each_line do |med_ln|
|
17
17
|
i_n += 1
|
18
18
|
med_ln.chomp!
|
@@ -36,7 +36,7 @@ module MiGA::DistanceRunner::Pipeline
|
|
36
36
|
return unless File.size? db
|
37
37
|
out_base = File.expand_path(dataset.name, home)
|
38
38
|
ds_matrix = "#{out_base}.txt"
|
39
|
-
ds_matrix_fh = File.open(ds_matrix,
|
39
|
+
ds_matrix_fh = File.open(ds_matrix, 'w')
|
40
40
|
ds_matrix_fh.puts %w[a b value].join("\t")
|
41
41
|
# Find all values in the database
|
42
42
|
seq2 = []
|
@@ -54,7 +54,7 @@ module MiGA::DistanceRunner::Pipeline
|
|
54
54
|
end
|
55
55
|
end
|
56
56
|
ds_matrix_fh.close
|
57
|
-
ref_tree = File.expand_path(
|
57
|
+
ref_tree = File.expand_path('utils/ref-tree.R', MiGA::MiGA.root_path)
|
58
58
|
`"#{ref_tree}" "#{ds_matrix}" "#{out_base}" "#{dataset.name}"`
|
59
59
|
File.unlink ds_matrix
|
60
60
|
end
|