miga-base 0.7.12.1 → 0.7.15.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 +7 -26
- data/lib/miga/cli/action/browse.rb +34 -6
- data/lib/miga/cli/action/browse/summary.html +5 -0
- data/lib/miga/cli/action/classify_wf.rb +1 -3
- data/lib/miga/cli/action/daemon.rb +6 -1
- data/lib/miga/cli/action/derep_wf.rb +19 -10
- data/lib/miga/cli/action/quality_wf.rb +2 -5
- data/lib/miga/cli/action/wf.rb +4 -4
- data/lib/miga/common.rb +35 -2
- data/lib/miga/daemon.rb +15 -4
- data/lib/miga/daemon/base.rb +25 -1
- data/lib/miga/result.rb +9 -7
- data/lib/miga/version.rb +2 -2
- data/scripts/aai_distances.bash +11 -11
- data/scripts/ani_distances.bash +10 -10
- data/scripts/haai_distances.bash +11 -11
- data/test/daemon_test.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0160b454e26886637f28dea78ab57e66b1c53ee3fca610c64339f3265ce86afb
|
4
|
+
data.tar.gz: 6df1a7bfc7ebf0493265cd6be8f8600a575b3c20f07ec43f7c25b8de3035b5c8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 00245e9a4d698ed335f1777bd1f9156ecc2ba325c4ef66f42f01f9e59c70e4bfb42a588a7be62271dd55df73e2fc737a29e24253487ba55e9d8645a43508d91c
|
7
|
+
data.tar.gz: 12c8beb33f81fc7114d957a59982d4bfab1deceb21db27dde1a93f474d4ab5918308ac04d351c86b9a71f8a6804e0311b3230ccbad16de320523246f1e7e3f9b
|
data/lib/miga/cli.rb
CHANGED
@@ -110,30 +110,9 @@ class MiGA::Cli < MiGA::MiGA
|
|
110
110
|
end
|
111
111
|
|
112
112
|
##
|
113
|
-
#
|
114
|
-
|
115
|
-
|
116
|
-
# The report goes to $stderr iff --verborse
|
117
|
-
def advance(step, n = 0, total = nil, bin = true)
|
118
|
-
return unless self[:verbose]
|
119
|
-
|
120
|
-
adv = total.nil? ? (n == 0 ? '' : num_suffix(n, bin)) :
|
121
|
-
('%.1f%% (%s/%s)' % [100.0 * n / total,
|
122
|
-
num_suffix(n, bin), num_suffix(total, bin)])
|
123
|
-
$stderr.print("[%s] %s %s \r" % [Time.now, step, adv])
|
124
|
-
end
|
125
|
-
|
126
|
-
def num_suffix(n, bin = false)
|
127
|
-
p = ''
|
128
|
-
{ T: 4, G: 3, M: 2, K: 1 }.each do |k, x|
|
129
|
-
v = (bin ? 1024 : 1e3)**x
|
130
|
-
if n > v
|
131
|
-
n = '%.1f' % (n / v)
|
132
|
-
p = k
|
133
|
-
break
|
134
|
-
end
|
135
|
-
end
|
136
|
-
"#{n}#{p}"
|
113
|
+
# Same as MiGA::MiGA#advance, but checks if the CLI is verbose
|
114
|
+
def advance(*par)
|
115
|
+
super(*par) if self[:verbose]
|
137
116
|
end
|
138
117
|
|
139
118
|
##
|
@@ -189,8 +168,9 @@ class MiGA::Cli < MiGA::MiGA
|
|
189
168
|
end
|
190
169
|
|
191
170
|
##
|
192
|
-
# Perform the task requested (see #task)
|
193
|
-
|
171
|
+
# Perform the task requested (see #task); if +abort_on_error+, abort on
|
172
|
+
# error
|
173
|
+
def launch(abort_on_error = false)
|
194
174
|
begin
|
195
175
|
raise "See `miga -h`" if action.nil?
|
196
176
|
|
@@ -199,6 +179,7 @@ class MiGA::Cli < MiGA::MiGA
|
|
199
179
|
$stderr.puts "Exception: #{err}"
|
200
180
|
$stderr.puts ''
|
201
181
|
err.backtrace.each { |l| $stderr.puts "DEBUG: #{l}" }
|
182
|
+
abort if abort_on_error
|
202
183
|
err
|
203
184
|
end
|
204
185
|
end
|
@@ -15,12 +15,12 @@ class MiGA::Cli::Action::Browse < MiGA::Cli::Action
|
|
15
15
|
p = cli.load_project
|
16
16
|
create_empty_page(p)
|
17
17
|
generate_project_page(p)
|
18
|
-
say 'Creating dataset pages'
|
18
|
+
cli.say 'Creating dataset pages'
|
19
19
|
cli.load_project.each_dataset do |d|
|
20
20
|
generate_dataset_page(p, d)
|
21
21
|
end
|
22
22
|
generate_datasets_index(p)
|
23
|
-
say "Open in your browser: #{File.join(p.path, 'index.html')}"
|
23
|
+
cli.say "Open in your browser: #{File.join(p.path, 'index.html')}"
|
24
24
|
end
|
25
25
|
|
26
26
|
private
|
@@ -28,7 +28,7 @@ class MiGA::Cli::Action::Browse < MiGA::Cli::Action
|
|
28
28
|
##
|
29
29
|
# Create an empty page with necessary assets for project +p+
|
30
30
|
def create_empty_page(p)
|
31
|
-
say 'Creating project page'
|
31
|
+
cli.say 'Creating project page'
|
32
32
|
FileUtils.mkdir_p(browse_file(p, '.'))
|
33
33
|
%w[favicon-32.png style.css].each do |i|
|
34
34
|
FileUtils.cp(template_file(i), browse_file(p, i))
|
@@ -46,7 +46,9 @@ class MiGA::Cli::Action::Browse < MiGA::Cli::Action
|
|
46
46
|
|
47
47
|
# Summaries
|
48
48
|
summaries = Dir["#{p.path}/*.tsv"].map do |i|
|
49
|
-
|
49
|
+
b = File.basename(i, '.tsv')
|
50
|
+
generate_summary_page(i, p)
|
51
|
+
"<li><a href='s-#{b}.html'>#{format_name(b)}</a></li>"
|
50
52
|
end.join('')
|
51
53
|
|
52
54
|
# Project index page
|
@@ -59,6 +61,32 @@ class MiGA::Cli::Action::Browse < MiGA::Cli::Action
|
|
59
61
|
write_file(p, 'index.html') { build_from_template('index.html', data) }
|
60
62
|
end
|
61
63
|
|
64
|
+
##
|
65
|
+
# Create page for the summary +path+ in project +p+
|
66
|
+
def generate_summary_page(path, p)
|
67
|
+
b = File.basename(path, '.tsv')
|
68
|
+
table = '<table class="table table-hover table-responsive">'
|
69
|
+
File.open(path, 'r') do |fh|
|
70
|
+
fh.each do |ln|
|
71
|
+
r = ln.chomp.split("\t")
|
72
|
+
if $. == 1
|
73
|
+
table += '<thead><tr>' +
|
74
|
+
r.map { |i| "<th scope=col>#{format_name(i)}</th>" }.join(' ') +
|
75
|
+
'</tr></thead><tbody>'
|
76
|
+
else
|
77
|
+
table += "<tr><th scope=row>#{r.shift}</th>" +
|
78
|
+
r.map { |i| "<td>#{i}</td>" }.join(' ') + "</tr>"
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
table += '</tbody></table>'
|
83
|
+
write_file(p, "s-#{b}.html") do
|
84
|
+
build_from_template(
|
85
|
+
'summary.html', file: "#{b}.tsv", name: format_name(b), table: table
|
86
|
+
)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
62
90
|
##
|
63
91
|
# Create page for dataset +d+ within project +p+
|
64
92
|
def generate_dataset_page(p, d)
|
@@ -75,7 +103,7 @@ class MiGA::Cli::Action::Browse < MiGA::Cli::Action
|
|
75
103
|
##
|
76
104
|
# Create pages for reference and query dataset indexes
|
77
105
|
def generate_datasets_index(p)
|
78
|
-
say 'Creating index pages'
|
106
|
+
cli.say 'Creating index pages'
|
79
107
|
data = format_dataset_index(p)
|
80
108
|
data.each do |k, v|
|
81
109
|
write_file(p, "#{k}_datasets.html") do
|
@@ -162,7 +190,7 @@ class MiGA::Cli::Action::Browse < MiGA::Cli::Action
|
|
162
190
|
links = []
|
163
191
|
res.each_file do |key, _|
|
164
192
|
name = format_name(key)
|
165
|
-
links << "<a href='
|
193
|
+
links << "<a href='../#{res.file_path(key, true)}'>#{name}</a><br/>"
|
166
194
|
end
|
167
195
|
links.empty? ? nil : links.join('')
|
168
196
|
end
|
@@ -42,9 +42,7 @@ class MiGA::Cli::Action::ClassifyWf < MiGA::Cli::Action
|
|
42
42
|
'--no-summaries',
|
43
43
|
'Do not generate intermediate step summaries'
|
44
44
|
) { |v| cli[:summaries] = v }
|
45
|
-
opts_for_wf(
|
46
|
-
opt, 'Input genome assemblies (nucleotides, FastA)', qual: false
|
47
|
-
)
|
45
|
+
opts_for_wf(opt, 'Input genome assemblies (nucleotides, FastA)')
|
48
46
|
end
|
49
47
|
end
|
50
48
|
|
@@ -6,7 +6,7 @@ require 'miga/daemon'
|
|
6
6
|
|
7
7
|
class MiGA::Cli::Action::Daemon < MiGA::Cli::Action
|
8
8
|
def parse_cli
|
9
|
-
cli.defaults = { daemon_opts: [] }
|
9
|
+
cli.defaults = { daemon_opts: [], show_log: false }
|
10
10
|
cli.expect_operation = true
|
11
11
|
cli.parse do |opt|
|
12
12
|
opt.separator 'Available operations:'
|
@@ -45,6 +45,10 @@ class MiGA::Cli::Action::Daemon < MiGA::Cli::Action
|
|
45
45
|
'--json PATH',
|
46
46
|
'Path to a custom daemon definition in json format'
|
47
47
|
) { |v| cli[:json] = v }
|
48
|
+
opt.on(
|
49
|
+
'--show-log',
|
50
|
+
'Display log on advance instead of the progress summary'
|
51
|
+
) { |v| cli[:show_log] = v }
|
48
52
|
cli.opt_common(opt)
|
49
53
|
|
50
54
|
opt.separator 'Daemon options:'
|
@@ -73,6 +77,7 @@ class MiGA::Cli::Action::Daemon < MiGA::Cli::Action
|
|
73
77
|
d = MiGA::Daemon.new(p, cli[:json])
|
74
78
|
dopts = %i[latency maxjobs nodelist ppn shutdown_when_done]
|
75
79
|
dopts.each { |k| d.runopts(k, cli[k]) }
|
80
|
+
d.show_log! if cli[:show_log]
|
76
81
|
d.daemon(cli.operation, cli[:daemon_opts])
|
77
82
|
end
|
78
83
|
end
|
@@ -27,10 +27,13 @@ class MiGA::Cli::Action::DerepWf < MiGA::Cli::Action
|
|
27
27
|
'--threshold FLOAT', Float,
|
28
28
|
"Metric threshold (%) to dereplicate. By default: #{cli[:threshold]}"
|
29
29
|
) { |v| cli[:threshold] = v }
|
30
|
+
opt.on(
|
31
|
+
'--quality',
|
32
|
+
'Use genome with highest quality as clade representatives (default)'
|
33
|
+
) { |v| cli[:criterion] = :quality }
|
30
34
|
opt.on(
|
31
35
|
'--medoids',
|
32
|
-
'Use medoids as clade representatives'
|
33
|
-
'By default: Use genome with the highest quality'
|
36
|
+
'Use medoids as clade representatives'
|
34
37
|
) { |v| cli[:criterion] = :medoids }
|
35
38
|
opt.on(
|
36
39
|
'--no-collection',
|
@@ -47,12 +50,18 @@ class MiGA::Cli::Action::DerepWf < MiGA::Cli::Action
|
|
47
50
|
|
48
51
|
def perform
|
49
52
|
# Input data
|
50
|
-
p = create_project(
|
51
|
-
|
52
|
-
|
53
|
-
|
53
|
+
p = create_project(
|
54
|
+
:assembly,
|
55
|
+
{
|
56
|
+
run_project_stats: false,
|
57
|
+
run_clades: false,
|
58
|
+
gsp_metric: cli[:metric],
|
59
|
+
:"gsp_#{cli[:metric]}" => cli[:threshold]
|
60
|
+
},
|
61
|
+
{ run_mytaxa_scan: false, run_ssu: false }
|
62
|
+
)
|
54
63
|
unless cli[:threshold] >= 0.0 && cli[:threshold] <= 100.0
|
55
|
-
raise
|
64
|
+
raise 'The threshold of identity must be in the range [0,100]'
|
56
65
|
end
|
57
66
|
|
58
67
|
# Run
|
@@ -65,8 +74,8 @@ class MiGA::Cli::Action::DerepWf < MiGA::Cli::Action
|
|
65
74
|
private
|
66
75
|
|
67
76
|
def dereplicate(p)
|
68
|
-
cli.say
|
69
|
-
r = p.result(:clade_finding) or raise
|
77
|
+
cli.say 'Extracting genomospecies clades'
|
78
|
+
r = p.result(:clade_finding) or raise 'Result unavailable: run failed'
|
70
79
|
c_f = r.file_path(:clades_gsp) or raise 'Result incomplete: run failed'
|
71
80
|
clades = File.readlines(c_f).map { |i| i.chomp.split("\t") }
|
72
81
|
rep = representatives(p)
|
@@ -87,7 +96,7 @@ class MiGA::Cli::Action::DerepWf < MiGA::Cli::Action
|
|
87
96
|
end
|
88
97
|
|
89
98
|
def representatives(p)
|
90
|
-
cli.say
|
99
|
+
cli.say 'Identifying representatives'
|
91
100
|
f = File.expand_path('representatives.txt', cli[:outdir])
|
92
101
|
if cli[:criterion] == :medoids
|
93
102
|
FileUtils.cp(p.result(:clade_finding).file_path(:medoids_gsp), f)
|
@@ -9,16 +9,13 @@ class MiGA::Cli::Action::QualityWf < MiGA::Cli::Action
|
|
9
9
|
|
10
10
|
def parse_cli
|
11
11
|
default_opts_for_wf
|
12
|
-
cli.defaults = { mytaxa: false }
|
12
|
+
cli.defaults = { mytaxa: false, min_qual: 'no' }
|
13
13
|
cli.parse do |opt|
|
14
14
|
opt.on(
|
15
15
|
'-m', '--mytaxa-scan',
|
16
16
|
'Perform MyTaxa scan analysis'
|
17
17
|
) { |v| cli[:mytaxa] = v }
|
18
|
-
opts_for_wf(
|
19
|
-
opt, 'Input genome assemblies (nucleotides, FastA)',
|
20
|
-
qual: false
|
21
|
-
)
|
18
|
+
opts_for_wf(opt, 'Input genome assemblies (nucleotides, FastA)')
|
22
19
|
end
|
23
20
|
end
|
24
21
|
|
data/lib/miga/cli/action/wf.rb
CHANGED
@@ -9,7 +9,7 @@ module MiGA::Cli::Action::Wf
|
|
9
9
|
cli.defaults = {
|
10
10
|
clean: false, regexp: MiGA::Cli.FILE_REGEXP,
|
11
11
|
project_type: :genomes, dataset_type: :popgenome,
|
12
|
-
ncbi_draft: true
|
12
|
+
ncbi_draft: true, min_qual: 25.0
|
13
13
|
}
|
14
14
|
end
|
15
15
|
|
@@ -42,10 +42,10 @@ module MiGA::Cli::Action::Wf
|
|
42
42
|
end
|
43
43
|
if params[:qual]
|
44
44
|
opt.on(
|
45
|
-
'--min-qual FLOAT',
|
45
|
+
'--min-qual FLOAT',
|
46
46
|
'Minimum genome quality to include in analysis',
|
47
|
-
|
48
|
-
) { |v| cli[:min_qual] = v }
|
47
|
+
"By default: #{cli[:min_qual]}"
|
48
|
+
) { |v| cli[:min_qual] = v == 'no' ? v : v.to_f }
|
49
49
|
end
|
50
50
|
if params[:cleanup]
|
51
51
|
opt.on(
|
data/lib/miga/common.rb
CHANGED
@@ -6,6 +6,7 @@ require 'miga/json'
|
|
6
6
|
require 'miga/common/base'
|
7
7
|
require 'miga/common/path'
|
8
8
|
require 'miga/common/format'
|
9
|
+
require 'stringio'
|
9
10
|
|
10
11
|
##
|
11
12
|
# Generic class used to handle system-wide information and methods, and parent
|
@@ -38,10 +39,42 @@ class MiGA::MiGA
|
|
38
39
|
##
|
39
40
|
# Print +par+ ensuring new line at the end.
|
40
41
|
# Date/time-stamp each line.
|
41
|
-
# If the first parameter is +IO
|
42
|
+
# If the first parameter is +IO+ or +StringIO+ the output is sent there,
|
42
43
|
# otherwise it's sent to +$stderr+
|
43
44
|
def say(*par)
|
44
|
-
io = par.first
|
45
|
+
io = like_io?(par.first) ? par.shift : $stderr
|
45
46
|
io.puts(*par.map { |i| "[#{Time.now}] #{i}" })
|
46
47
|
end
|
48
|
+
|
49
|
+
##
|
50
|
+
# Reports the advance of a task at +step+ (String), the +n+ out of +total+.
|
51
|
+
# The advance is reported in powers of 1,024 if +bin+ is true, or powers of
|
52
|
+
# 1,000 otherwise.
|
53
|
+
# The report goes to $stderr iff --verborse
|
54
|
+
def advance(step, n = 0, total = nil, bin = true)
|
55
|
+
adv = total.nil? ? (n == 0 ? '' : num_suffix(n, bin)) :
|
56
|
+
('%.1f%% (%s/%s)' % [100.0 * n / total,
|
57
|
+
num_suffix(n, bin), num_suffix(total, bin)])
|
58
|
+
$stderr.print("[%s] %s %s \r" % [Time.now, step, adv])
|
59
|
+
end
|
60
|
+
|
61
|
+
##
|
62
|
+
# Return formatted number +n+ with the appropriate units as
|
63
|
+
# powers of 1,000 (if +bin+ if false) or 1,024 (otherwise)
|
64
|
+
def num_suffix(n, bin = false)
|
65
|
+
p = ''
|
66
|
+
{ T: 4, G: 3, M: 2, K: 1 }.each do |k, x|
|
67
|
+
v = (bin ? 1024 : 1e3)**x
|
68
|
+
if n > v
|
69
|
+
n = '%.1f' % (n / v)
|
70
|
+
p = k
|
71
|
+
break
|
72
|
+
end
|
73
|
+
end
|
74
|
+
"#{n}#{p}"
|
75
|
+
end
|
76
|
+
|
77
|
+
def like_io?(obj)
|
78
|
+
obj.is_a?(IO) || obj.is_a?(StringIO)
|
79
|
+
end
|
47
80
|
end
|
data/lib/miga/daemon.rb
CHANGED
@@ -72,6 +72,7 @@ class MiGA::Daemon < MiGA::MiGA
|
|
72
72
|
say '-----------------------------------'
|
73
73
|
say 'MiGA:%s launched' % project.name
|
74
74
|
say '-----------------------------------'
|
75
|
+
miga_say "Saving log to: #{output_file}" unless show_log?
|
75
76
|
recalculate_status!
|
76
77
|
load_status
|
77
78
|
say 'Configuration options:'
|
@@ -91,7 +92,8 @@ class MiGA::Daemon < MiGA::MiGA
|
|
91
92
|
flush!
|
92
93
|
if (loop_i % 12).zero?
|
93
94
|
purge!
|
94
|
-
|
95
|
+
# TEMPORARILY DISABLED:
|
96
|
+
# recalculate_status!
|
95
97
|
end
|
96
98
|
save_status
|
97
99
|
sleep(latency)
|
@@ -110,10 +112,12 @@ class MiGA::Daemon < MiGA::MiGA
|
|
110
112
|
say(*msg) if verbosity >= level
|
111
113
|
end
|
112
114
|
|
115
|
+
alias miga_say say
|
116
|
+
|
113
117
|
##
|
114
118
|
# Same as +l_say+ with +level = 1+
|
115
119
|
def say(*msg)
|
116
|
-
super(*msg) if verbosity >= 1
|
120
|
+
super(logfh, *msg) if verbosity >= 1
|
117
121
|
end
|
118
122
|
|
119
123
|
##
|
@@ -172,6 +176,12 @@ class MiGA::Daemon < MiGA::MiGA
|
|
172
176
|
o = true if ds.ref?
|
173
177
|
queue_job(:d, ds)
|
174
178
|
end
|
179
|
+
unless show_log?
|
180
|
+
n = project.dataset_names.count
|
181
|
+
k = jobs_to_run.size + jobs_running.size
|
182
|
+
advance('Datasets:', n - k, n, false)
|
183
|
+
miga_say if k == 0
|
184
|
+
end
|
175
185
|
o
|
176
186
|
end
|
177
187
|
|
@@ -331,8 +341,9 @@ class MiGA::Daemon < MiGA::MiGA
|
|
331
341
|
kill: %w[pid]
|
332
342
|
}.each do |k, v|
|
333
343
|
if !runopts(k).nil? && runopts(k) =~ /%(\d+\$)?[ds]/
|
334
|
-
runopts(
|
335
|
-
|
344
|
+
runopts(
|
345
|
+
k, runopts(k).gsub(/%(\d+\$)?d/, '%\\1s') % v.map { |i| "{{#{i}}}" }
|
346
|
+
)
|
336
347
|
end
|
337
348
|
end
|
338
349
|
runopts(:format_version, 1)
|
data/lib/miga/daemon/base.rb
CHANGED
@@ -17,7 +17,7 @@ module MiGA::Daemon::Base
|
|
17
17
|
if !force && v == 0 && k != :verbosity
|
18
18
|
raise "Daemon's #{k} cannot be set to zero"
|
19
19
|
end
|
20
|
-
when :shutdown_when_done
|
20
|
+
when :shutdown_when_done, :show_log
|
21
21
|
v = !!v
|
22
22
|
when :nodelist
|
23
23
|
if v =~ /^\$/
|
@@ -73,4 +73,28 @@ module MiGA::Daemon::Base
|
|
73
73
|
def verbosity
|
74
74
|
runopts(:verbosity) || 1
|
75
75
|
end
|
76
|
+
|
77
|
+
##
|
78
|
+
# Writing file handler (IO) to the log file
|
79
|
+
def logfh
|
80
|
+
show_log? ? $stderr : (@logfh ||= File.open(output_file, 'w'))
|
81
|
+
end
|
82
|
+
|
83
|
+
##
|
84
|
+
# Display log instead of the progress summary
|
85
|
+
def show_log!
|
86
|
+
@show_log = true
|
87
|
+
end
|
88
|
+
|
89
|
+
##
|
90
|
+
# Display progress summary instead of the log
|
91
|
+
def show_summary!
|
92
|
+
@runopts[:show_log] = false
|
93
|
+
end
|
94
|
+
|
95
|
+
##
|
96
|
+
# Display log instead of the progress summary?
|
97
|
+
def show_log?
|
98
|
+
@runopts[:show_log] ||= false
|
99
|
+
end
|
76
100
|
end
|
data/lib/miga/result.rb
CHANGED
@@ -81,20 +81,22 @@ class MiGA::Result < MiGA::MiGA
|
|
81
81
|
end
|
82
82
|
|
83
83
|
##
|
84
|
-
# Directory containing the result
|
85
|
-
|
86
|
-
|
84
|
+
# Directory containing the result; by default an absolute path, if
|
85
|
+
# +relative+ is true returns the path relative to the parent project
|
86
|
+
def dir(relative = false)
|
87
|
+
relative ? relative_dir : File.dirname(path)
|
87
88
|
end
|
88
89
|
|
89
90
|
##
|
90
|
-
# Absolute path to the file(s) defined by symbol +k
|
91
|
-
|
91
|
+
# Absolute path to the file(s) defined by symbol +k+, or relative
|
92
|
+
# path if +relative+ is true
|
93
|
+
def file_path(k, relative = false)
|
92
94
|
k = k.to_sym
|
93
95
|
f = self[:files].nil? ? nil : self[:files][k]
|
94
96
|
return nil if f.nil?
|
95
|
-
return File.
|
97
|
+
return File.join(dir(relative), f) unless f.is_a? Array
|
96
98
|
|
97
|
-
f.map { |fi| File.
|
99
|
+
f.map { |fi| File.join(dir(relative), fi) }
|
98
100
|
end
|
99
101
|
|
100
102
|
##
|
data/lib/miga/version.rb
CHANGED
@@ -8,7 +8,7 @@ module MiGA
|
|
8
8
|
# - Float representing the major.minor version.
|
9
9
|
# - Integer representing gem releases of the current version.
|
10
10
|
# - Integer representing minor changes that require new version number.
|
11
|
-
VERSION = [0.7,
|
11
|
+
VERSION = [0.7, 15, 0]
|
12
12
|
|
13
13
|
##
|
14
14
|
# Nickname for the current major.minor version.
|
@@ -16,7 +16,7 @@ module MiGA
|
|
16
16
|
|
17
17
|
##
|
18
18
|
# Date of the current gem release.
|
19
|
-
VERSION_DATE = Date.new(2020,
|
19
|
+
VERSION_DATE = Date.new(2020, 8, 12)
|
20
20
|
|
21
21
|
##
|
22
22
|
# Reference of MiGA.
|
data/scripts/aai_distances.bash
CHANGED
@@ -13,17 +13,20 @@ echo -n "" > miga-project.log
|
|
13
13
|
DS=$(miga ls -P "$PROJECT" --ref --no-multi --active)
|
14
14
|
|
15
15
|
# Extract values
|
16
|
-
|
17
|
-
|
18
|
-
echo "
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
16
|
+
rm -f miga-project.txt
|
17
|
+
(
|
18
|
+
echo "metric a b value sd n omega" | tr " " "\\t"
|
19
|
+
for i in $DS ; do
|
20
|
+
echo "SELECT CASE WHEN omega!=0 THEN 'AAI' ELSE 'hAAI_AAI' END," \
|
21
|
+
" seq1, seq2, aai, sd, n, omega from aai;" \
|
22
|
+
| sqlite3 "$i.db" | tr "\\|" "\\t"
|
23
|
+
echo "$i" >> miga-project.log
|
24
|
+
done
|
25
|
+
) | gzip -9c > miga-project.txt.gz
|
23
26
|
|
24
27
|
# R-ify
|
25
28
|
echo "
|
26
|
-
aai <- read.table('miga-project.txt', sep='\\t', h=T, as.is=TRUE);
|
29
|
+
aai <- read.table(gzfile('miga-project.txt.gz'), sep='\\t', h=T, as.is=TRUE);
|
27
30
|
save(aai, file='miga-project.Rdata');
|
28
31
|
if(sum(aai[,'a'] != aai[,'b']) > 0){
|
29
32
|
h <- hist(aai[aai[,'a'] != aai[,'b'], 'value'], breaks=100, plot=FALSE);
|
@@ -35,9 +38,6 @@ if(sum(aai[,'a'] != aai[,'b']) > 0){
|
|
35
38
|
}
|
36
39
|
" | R --vanilla
|
37
40
|
|
38
|
-
# Gzip
|
39
|
-
gzip -9 -f miga-project.txt
|
40
|
-
|
41
41
|
# Finalize
|
42
42
|
miga date > "miga-project.done"
|
43
43
|
miga add_result -P "$PROJECT" -r "$SCRIPT" -f
|
data/scripts/ani_distances.bash
CHANGED
@@ -13,16 +13,19 @@ echo -n "" > miga-project.log
|
|
13
13
|
DS=$(miga ls -P "$PROJECT" --ref --no-multi --active)
|
14
14
|
|
15
15
|
# Extract values
|
16
|
-
|
17
|
-
|
18
|
-
echo "
|
19
|
-
|
20
|
-
|
21
|
-
|
16
|
+
rm -f miga-project.txt
|
17
|
+
(
|
18
|
+
echo "metric a b value sd n omega" | tr " " "\\t"
|
19
|
+
for i in $DS ; do
|
20
|
+
echo "SELECT 'ANI', seq1, seq2, ani, sd, n, omega from ani ;" \
|
21
|
+
| sqlite3 "$i.db" | tr "\\|" "\\t"
|
22
|
+
echo "$i" >> miga-project.log
|
23
|
+
done
|
24
|
+
) | gzip -9c > miga-project.txt.gz
|
22
25
|
|
23
26
|
# R-ify
|
24
27
|
echo "
|
25
|
-
ani <- read.table('miga-project.txt', sep='\\t', h=T, as.is=TRUE);
|
28
|
+
ani <- read.table(gzfile('miga-project.txt.gz'), sep='\\t', h=T, as.is=TRUE);
|
26
29
|
save(ani, file='miga-project.Rdata');
|
27
30
|
if(sum(ani[,'a'] != ani[,'b']) > 0){
|
28
31
|
h <- hist(ani[ani[,'a'] != ani[,'b'], 'value'], breaks=100, plot=FALSE);
|
@@ -34,9 +37,6 @@ if(sum(ani[,'a'] != ani[,'b']) > 0){
|
|
34
37
|
}
|
35
38
|
" | R --vanilla
|
36
39
|
|
37
|
-
# Gzip
|
38
|
-
gzip -9 -f miga-project.txt
|
39
|
-
|
40
40
|
# Finalize
|
41
41
|
miga date > "miga-project.done"
|
42
42
|
miga add_result -P "$PROJECT" -r "$SCRIPT" -f
|
data/scripts/haai_distances.bash
CHANGED
@@ -17,30 +17,30 @@ echo -n "" > miga-project.log
|
|
17
17
|
DS=$(miga ls -P "$PROJECT" --ref --no-multi --active)
|
18
18
|
|
19
19
|
# Extract values
|
20
|
-
|
21
|
-
|
22
|
-
echo "
|
23
|
-
|
24
|
-
|
25
|
-
|
20
|
+
rm -f miga-project.txt
|
21
|
+
(
|
22
|
+
echo "metric a b value sd n omega" | tr " " "\\t"
|
23
|
+
for i in $DS ; do
|
24
|
+
echo "SELECT 'hAAI', seq1, seq2, aai, sd, n, omega from aai ;" \
|
25
|
+
| sqlite3 "$i.db" | tr "\\|" "\\t"
|
26
|
+
echo "$i" >> miga-project.log
|
27
|
+
done
|
28
|
+
) | gzip -9c > miga-project.txt.gz
|
26
29
|
|
27
30
|
# R-ify
|
28
31
|
echo "
|
29
|
-
haai <- read.table('miga-project.txt', sep='\\t', h=T, as.is=TRUE);
|
32
|
+
haai <- read.table(gzfile('miga-project.txt.gz'), sep='\\t', h=T, as.is=TRUE);
|
30
33
|
save(haai, file='miga-project.Rdata');
|
31
34
|
if(sum(haai[,'a'] != haai[,'b']) > 0){
|
32
35
|
h <- hist(haai[haai[,'a'] != haai[,'b'], 'value'], breaks=100, plot=FALSE);
|
33
36
|
write.table(
|
34
37
|
cbind(h[['breaks']][-length(h[['breaks']])],
|
35
|
-
h[['breaks']][-1],h[['counts']]),
|
38
|
+
h[['breaks']][-1], h[['counts']]),
|
36
39
|
file='miga-project.hist', quote=FALSE, sep='\\t',
|
37
40
|
col.names=FALSE, row.names=FALSE);
|
38
41
|
}
|
39
42
|
" | R --vanilla
|
40
43
|
|
41
|
-
# Gzip
|
42
|
-
gzip -9 -f miga-project.txt
|
43
|
-
|
44
44
|
# Finalize
|
45
45
|
miga date > "miga-project.done"
|
46
46
|
miga add_result -P "$PROJECT" -r "$SCRIPT" -f
|
data/test/daemon_test.rb
CHANGED
@@ -9,7 +9,7 @@ class DaemonTest < Test::Unit::TestCase
|
|
9
9
|
def setup
|
10
10
|
initialize_miga_home(
|
11
11
|
<<~DAEMON
|
12
|
-
{ "maxjobs": 1, "ppn": 1, "latency": 2, "varsep": " ",
|
12
|
+
{ "maxjobs": 1, "ppn": 1, "latency": 2, "varsep": " ", "show_log": true,
|
13
13
|
"var": "{{key}}={{value}}", "cmd": "echo {{task_name}} >/dev/null",
|
14
14
|
"alive": "echo 1 # {{pid}}", "type": "bash", "format_version": 1 }
|
15
15
|
DAEMON
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: miga-base
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.15.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Luis M. Rodriguez-R
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-08-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: daemons
|
@@ -128,6 +128,7 @@ files:
|
|
128
128
|
- lib/miga/cli/action/browse/layout.html
|
129
129
|
- lib/miga/cli/action/browse/redirect.html
|
130
130
|
- lib/miga/cli/action/browse/style.css
|
131
|
+
- lib/miga/cli/action/browse/summary.html
|
131
132
|
- lib/miga/cli/action/classify_wf.rb
|
132
133
|
- lib/miga/cli/action/console.rb
|
133
134
|
- lib/miga/cli/action/daemon.rb
|