miga-base 0.2.3.1 → 0.2.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8204affac00281361567c3a597321dd3ab5a5145
4
- data.tar.gz: 62fbd4daf6698b317e9f76b89b352b7bf33d3b54
3
+ metadata.gz: e9353efac39e230da0d999efff1f3839dd5d0c1e
4
+ data.tar.gz: 2860e3b8c6ee0bb18bfb5f8ff753754762253eb6
5
5
  SHA512:
6
- metadata.gz: f1d1b5e052e91e176529a6cec60736f2c21bca0591ba4b184485e59f6d906204ae34c1dba0464f1d5b1d01ed691e599cf15f63b3e1760f89c222187030a2a830
7
- data.tar.gz: 1611ac19a30c23bb7fd79c7acc2d1b0559b03ae3d179dd8881c10d0a828ba447f4546e1ce18b9907a277260656bcb85120054e739395922a505e93f9a84efe70
6
+ metadata.gz: 66086e7e08f1ca5cb27986ebd206d65c71562fe0b9c026673c08c20f543772b015dfe23fd6c1792e9747d1334d331b2feade1ea9225e579c9b4e691575bb16b2
7
+ data.tar.gz: b7801121cb4f332eebe6e88c907c9e68c0f6e3851cd445eb2467cdf84a9091243a0303fecad6505ae6efba7efa5287f4f5c3efc6b9bd44d54ce4af653e8ddc11
@@ -6,7 +6,7 @@
6
6
  o = {q:true, ref:true, update:false}
7
7
  OptionParser.new do |opt|
8
8
  opt_banner(opt)
9
- opt_object(opt, o, [:project, :dataset, :dataset_type])
9
+ opt_object(opt, o, [:project, :dataset, :dataset_type_req])
10
10
  opt.on("-q", "--query",
11
11
  "If set, the dataset is registered as a query, not a reference dataset."
12
12
  ){ |v| o[:ref]=!v }
@@ -43,6 +43,7 @@ end.parse!
43
43
 
44
44
  ##=> Main <=
45
45
  opt_require(o)
46
+ opt_require(o, type:"-t")
46
47
 
47
48
  $stderr.puts "Loading project." unless o[:q]
48
49
  p = MiGA::Project.load(o[:project])
@@ -6,7 +6,7 @@
6
6
  o = {q:true, update:false}
7
7
  OptionParser.new do |opt|
8
8
  opt_banner(opt)
9
- opt_object(opt, o, [:project, :project_type])
9
+ opt_object(opt, o, [:project, :project_type_req])
10
10
  opt.on("-n", "--name STRING",
11
11
  "Name of the project."){ |v| o[:name]=v }
12
12
  opt.on("-d", "--description STRING",
@@ -20,7 +20,7 @@ OptionParser.new do |opt|
20
20
  end.parse!
21
21
 
22
22
  ##=> Main <=
23
- opt_require(o, project:"-P")
23
+ opt_require(o, project:"-P", type:"-t")
24
24
 
25
25
  unless File.exist? "#{ENV["HOME"]}/.miga_rc" and
26
26
  File.exist? "#{ENV["HOME"]}/.miga_daemon.json"
data/actions/daemon.rb CHANGED
@@ -22,6 +22,10 @@ OptionParser.new do |opt|
22
22
  opt.separator ""
23
23
  opt.separator "MiGA options:"
24
24
  opt_object(opt, o, [:project])
25
+ opt.on("--shutdown-when-done",
26
+ "If passed, the daemon will exit when all processing is done.",
27
+ "Otherwise (default), it will stay idle awaiting for new data."
28
+ ){ |v| o[:shutdown_when_done] = v }
25
29
  opt.on("--latency INT",
26
30
  "Number of seconds the daemon will be sleeping."
27
31
  ){ |v| o[:latency]=v.to_i }
@@ -45,7 +49,7 @@ opt_require(o, project:"-P")
45
49
  raise "Project doesn't exist, aborting." unless MiGA::Project.exist? o[:project]
46
50
  p = MiGA::Project.new(o[:project])
47
51
  d = MiGA::Daemon.new(p)
48
- [:latency, :maxjobs, :ppn].each do |k|
52
+ [:latency, :maxjobs, :ppn, :shutdown_when_done].each do |k|
49
53
  d.runopts(k, o[k]) unless o[k].nil?
50
54
  end
51
55
  d.daemon(task, o[:daemon_opts])
data/bin/miga CHANGED
@@ -53,18 +53,24 @@ end
53
53
  def opt_object(opt, o, what=[:project, :dataset])
54
54
  opt.on("-P", "--project PATH", "(Mandatory) Path to the project."
55
55
  ){ |v| o[:project]=v } if what.include? :project
56
- opt.on("-D", "--dataset PATH", "(Mandatory) Name of the dataset."
57
- ){ |v| o[:dataset]=v } if what.include? :dataset
58
- opt.on("-D", "--dataset PATH", "Name of the dataset."
56
+ opt.on("-D", "--dataset STRING",
57
+ (what.include?(:dataset) ? "(Mandatory) " : "") +
58
+ "Name of the dataset."){ |v| o[:dataset]=v } if what.include? :dataset or
59
+ what.include? :dataset_opt
60
+ opt.on("-D", "--dataset STRING", "Name of the dataset."
59
61
  ){ |v| o[:dataset]=v } if what.include? :dataset_opt
60
62
  opt.on("-t", "--type STRING",
63
+ (what.include?(:dataset_type_req) ? "(Mandatory) " : "")+
61
64
  "Type of dataset. Recognized types include:",
62
65
  *MiGA::Dataset.KNOWN_TYPES.map{ |k,v| "~ #{k}: #{v[:description]}" }
63
- ){ |v| o[:type]=v.to_sym } if what.include? :dataset_type
66
+ ){ |v| o[:type]=v.to_sym } if what.include? :dataset_type or
67
+ what.include? :dataset_type_req
64
68
  opt.on("-t", "--type STRING",
69
+ (what.include?(:project_type_req) ? "(Mandatory) " : "") +
65
70
  "Type of dataset. Recognized types include:",
66
71
  *MiGA::Project.KNOWN_TYPES.map{ |k,v| "~ #{k}: #{v[:description]}"}
67
- ){ |v| o[:type]=v.to_sym } if what.include? :project_type
72
+ ){ |v| o[:type]=v.to_sym } if what.include? :project_type or
73
+ what.include? :project_type_req
68
74
  opt.on("-r", "--result STRING",
69
75
  "(Mandatory) Name of the result to add.",
70
76
  "Recognized names for dataset-specific results include:",
data/lib/miga/daemon.rb CHANGED
@@ -66,6 +66,7 @@ class MiGA::Daemon < MiGA::MiGA
66
66
  v = v.to_i if [:latency, :maxjobs, :ppn].include? k
67
67
  raise "Daemon's #{k} cannot be set to zero." if
68
68
  !force and v.is_a? Integer and v==0
69
+ v = !!v if [:shutdown_when_done].include? k
69
70
  @runopts[k] = v
70
71
  end
71
72
  @runopts[k]
@@ -83,6 +84,11 @@ class MiGA::Daemon < MiGA::MiGA
83
84
  # Returns Integer indicating the number of CPUs per job.
84
85
  def ppn() runopts(:ppn) ; end
85
86
 
87
+ ##
88
+ # Returns Boolean indicating if the daemon should shutdown when processing is
89
+ # complete.
90
+ def shutdown_when_done?() !!runopts(:shutdown_when_done) ; end
91
+
86
92
  ##
87
93
  # Initializes the daemon with +opts+.
88
94
  def start(opts=[]) daemon("start", opts) ; end
@@ -106,7 +112,9 @@ class MiGA::Daemon < MiGA::MiGA
106
112
  options = default_options
107
113
  opts.unshift(task)
108
114
  options[:ARGV] = opts
109
- Daemons.run_proc("MiGA:#{project.name}", options) { loop { in_loop } }
115
+ Daemons.run_proc("MiGA:#{project.name}", options) do
116
+ loop { break unless in_loop }
117
+ end
110
118
  end
111
119
 
112
120
  ##
@@ -205,12 +213,12 @@ class MiGA::Daemon < MiGA::MiGA
205
213
  # Launch job
206
214
  if runopts(:type) == "bash"
207
215
  job[:pid] = spawn job[:cmd]
208
- Process.detach job[:pid] unless job[:pid].nil? or job[:pid].empty?
216
+ Process.detach job[:pid] unless [nil, "", 0].include? job[:pid]
209
217
  else
210
218
  job[:pid] = `#{job[:cmd]}`.chomp
211
219
  end
212
220
  # Check if registered
213
- if job[:pid].nil? or job[:pid].empty?
221
+ if [nil, "", 0].include? job[:pid].nil?
214
222
  job[:pid] = nil
215
223
  @jobs_to_run << job
216
224
  say "Unsuccessful #{job[:task_name]}, rescheduling."
@@ -230,7 +238,7 @@ class MiGA::Daemon < MiGA::MiGA
230
238
  end
231
239
 
232
240
  ##
233
- # Run one loop step.
241
+ # Run one loop step. Returns a Boolean indicating if the loop should continue.
234
242
  def in_loop
235
243
  if loop_i == -1
236
244
  say "-----------------------------------"
@@ -250,6 +258,10 @@ class MiGA::Daemon < MiGA::MiGA
250
258
  purge!
251
259
  end
252
260
  sleep(latency)
261
+ if shutdown_when_done? and jobs_running.size+jobs_to_run.size == 0
262
+ return false
263
+ end
264
+ true
253
265
  end
254
266
 
255
267
  ##
data/lib/miga/dataset.rb CHANGED
@@ -43,9 +43,10 @@ class MiGA::Dataset < MiGA::MiGA
43
43
  metagenome: {description: "A metagenome (excluding viromes).",
44
44
  multi: true},
45
45
  virome: {description: "A viral metagenome.", multi: true},
46
- scgenome: {description: "A genome from a single cell.", multi: false},
47
- popgenome: {description: "The genome of a population (including " +
48
- "microdiversity).", :multi=>false}
46
+ scgenome: {description: "A Single-cell Genome Amplification (SGA).",
47
+ multi: false},
48
+ popgenome: {description: "A population genome (including " +
49
+ "metagenomic bins).", :multi=>false}
49
50
  }
50
51
 
51
52
  ##
@@ -108,6 +109,8 @@ class MiGA::Dataset < MiGA::MiGA
108
109
  metadata[:ref] = is_ref
109
110
  @metadata = MiGA::Metadata.new(
110
111
  File.expand_path("metadata/#{name}.json", project.path), metadata )
112
+ raise "Unrecognized dataset type: #{type}." if
113
+ !type.nil? and @@KNOWN_TYPES[type].nil?
111
114
  end
112
115
 
113
116
  ##
@@ -118,6 +121,10 @@ class MiGA::Dataset < MiGA::MiGA
118
121
  self.metadata.save
119
122
  end
120
123
 
124
+ ##
125
+ # Get the type of dataset as Symbol.
126
+ def type ; metadata[:type] ; end
127
+
121
128
  ##
122
129
  # Delete the dataset with all it's contents (including results) and returns
123
130
  # nil.
data/lib/miga/project.rb CHANGED
@@ -65,7 +65,7 @@ class MiGA::Project < MiGA::MiGA
65
65
  single: true, multi: true},
66
66
  genomes: {description: "Collection of genomes.",
67
67
  single: true, multi: false},
68
- clade: {description: "Collection of closely-related genomes (ANI <= 90%).",
68
+ clade: {description: "Collection of closely-related genomes (ANI >= 90%).",
69
69
  single: true, multi: false},
70
70
  metagenomes: {description: "Collection of metagenomes and/or viromes.",
71
71
  single: false, multi: true}
@@ -115,6 +115,8 @@ class MiGA::Project < MiGA::MiGA
115
115
  self.create if not update and not Project.exist? self.path
116
116
  self.load if self.metadata.nil?
117
117
  self.load_plugins
118
+ self.metadata[:type] = :mixed if type.nil?
119
+ raise "Unrecognized project type: #{type}." if @@KNOWN_TYPES[type].nil?
118
120
  end
119
121
 
120
122
  ##
data/lib/miga/version.rb CHANGED
@@ -10,7 +10,7 @@ module MiGA
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.2, 3, 1]
13
+ VERSION = [0.2, 4, 0]
14
14
 
15
15
  ##
16
16
  # Nickname for the current major.minor version.
@@ -18,7 +18,7 @@ module MiGA
18
18
 
19
19
  ##
20
20
  # Date of the current gem release.
21
- VERSION_DATE = Date.new(2017, 3, 14)
21
+ VERSION_DATE = Date.new(2017, 3, 23)
22
22
 
23
23
  ##
24
24
  # Reference of MiGA.
@@ -56,7 +56,7 @@ fx_exists miga-haai || function miga-haai {
56
56
  local HAAI=$(MIGA_AAI_SAVE_RBM="no-save-rbm" miga-aai "$F1" "$F2" "$TH" "$DB")
57
57
  if [[ "$HAAI" != "" && $(perl -e "print 1 if '$HAAI' <= 90") == "1" ]] ; then
58
58
  local AAI=$(perl -e "print (100-exp(2.435076 + 0.4275193*log(100-$HAAI)))")
59
- [[ ! -s $AAI_DB ]] && make_empty_aai_db "$AAI_DB"
59
+ [[ ! -s $AAI_DB ]] && miga-make_empty_aai_db "$AAI_DB"
60
60
  echo "insert into aai values('$N1','$N2','$AAI',0,0,0);" | sqlite3 "$AAI_DB"
61
61
  echo "$AAI"
62
62
  fi
data/scripts/init.bash CHANGED
@@ -162,7 +162,7 @@ case "$dtype" in
162
162
  dmaxjobs=$(ask_user "How many jobs can I launch at once?" "6")
163
163
  dppn=$(ask_user "How many CPUs can I use per job?" "2")
164
164
  echo "Setting up internal daemon defaults, if you don't understand this just leave default values:" >&2
165
- dcmd=$(ask_user "How should I launch tasks? Use %1\$s for script path, %2\$s for variables, %3\$d for CPUs, %4\$s for log file, and %5\$s for task name." "%2\$s '%1\$s' &> '%4\$s'")
165
+ dcmd=$(ask_user "How should I launch tasks? Use %1\$s for script path, %2\$s for variables, %3\$d for CPUs, %4\$s for log file, and %5\$s for task name." "%2\$s '%1\$s' > '%4\$s' 2>&1")
166
166
  dvar=$(ask_user "How should I pass variables? Use %1\$s for keys and %2\$s for values." "%1\$s=%2\$s")
167
167
  dsep=$(ask_user "What should I use to separate variables?" " ")
168
168
  dalive=$(ask_user "How can I know that a process is still alive? Use %1\$s for PID, output should be 1 for running and 0 for non-running." "ps -p '%1\$s'|tail -n+2|wc -l|awk '{print \$1}'")
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.2.3.1
4
+ version: 0.2.4.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: 2017-03-14 00:00:00.000000000 Z
11
+ date: 2017-03-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rest-client
@@ -192,9 +192,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
192
192
  version: '0'
193
193
  requirements: []
194
194
  rubyforge_project:
195
- rubygems_version: 2.0.14.1
195
+ rubygems_version: 2.0.14
196
196
  signing_key:
197
197
  specification_version: 4
198
198
  summary: MiGA
199
199
  test_files: []
200
- has_rdoc: true