rbbt-util 5.21.127 → 5.21.128

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: 2b39b4950994d49ab0541d19a8e7d3ac45245c1e
4
- data.tar.gz: 28ac4746e480b19a5c9005671f15a29a97586f46
3
+ metadata.gz: d2e38a07f3d52f96131185d87edc11c40f7a5ea5
4
+ data.tar.gz: 920dab12666bcce73c7121959c22d99a0c2b2b57
5
5
  SHA512:
6
- metadata.gz: 1722d689b494dedf1095a53f288b063dd12c2aa1ce01a05c3e92b17172266facd7445879d10e75d7aac65ebe22c502d37398e9345e19ffaf7297d680400b84df
7
- data.tar.gz: 57e25447236ba7c6e5f28be95c687513c1259f742ddbdbe0d7957b695b9c17177e3c0105c821638871afec07e2249a3a9b2ff6c5015c9288ff0c018664fc4765
6
+ metadata.gz: 98919775334053530f302b4e98d31cefcec11bc38f3b1809c27ffec15befccd2a6819841aaa15389334fb2813fdf95253037696c0488de33f7d3b50c5ec98715
7
+ data.tar.gz: 1e2eae9c61741de2c300b935efd98009ba9babb8e5947d7b4c048a4be1eabfc28c2f2e79021f1b77df442340a7ed7cbbf3bf414501408141b00129c5e41df556
data/lib/rbbt/workflow.rb CHANGED
@@ -355,9 +355,11 @@ module Workflow
355
355
 
356
356
  def set_step_dependencies(step)
357
357
  if step.info.include? :dependencies
358
- step.dependencies = step.info[:dependencies].collect do |task, job, path|
359
- next if job.nil?
360
- load_step(path)
358
+ Misc.insist do
359
+ step.dependencies = step.info[:dependencies].collect do |task, job, path|
360
+ next if job.nil?
361
+ load_step(path)
362
+ end
361
363
  end
362
364
  end
363
365
  end
@@ -367,12 +367,12 @@ class Step
367
367
  end
368
368
 
369
369
  def dirty_files
370
+ canfail_paths = self.canfail_paths
370
371
  dirty_files = rec_dependencies.reject{|dep|
371
372
  (defined?(WorkflowRESTClient) && WorkflowRESTClient::RemoteStep === dep) ||
372
373
  (dep.path && (Open.exists?(dep.path) || Open.remote?(dep.path))) ||
373
- (dep.error? && ! dep.recoverable_error?)
374
+ ((dep.error? || dep.aborted?) && (! dep.recoverable_error? || canfail_paths.include?(dep.path)))
374
375
  }
375
-
376
376
  end
377
377
 
378
378
  def dirty?
@@ -550,6 +550,7 @@ module Workflow
550
550
  inputs = rec_inputs(name).uniq
551
551
  input_types = rec_input_types(name)
552
552
  input_descriptions = rec_input_descriptions(name)
553
+ input_use = rec_input_use(name)
553
554
  input_defaults = rec_input_defaults(name)
554
555
  input_options = rec_input_options(name)
555
556
  export = case
@@ -575,6 +576,7 @@ module Workflow
575
576
  :input_descriptions => input_descriptions,
576
577
  :input_defaults => input_defaults,
577
578
  :input_options => input_options,
579
+ :input_use => input_use,
578
580
  :result_type => result_type,
579
581
  :result_description => result_description,
580
582
  :dependencies => dependencies
@@ -696,6 +698,35 @@ module Workflow
696
698
  acc
697
699
  }.tap{|h| IndiferentHash.setup(h)}
698
700
  end
701
+
702
+ def rec_input_use(taskname)
703
+ task = task_from_dep(taskname)
704
+ deps = rec_dependencies(taskname)
705
+ inputs = {}
706
+ task.inputs.each do |input|
707
+ name = task.name
708
+ workflow = (task.workflow || self).to_s
709
+
710
+ inputs[input] ||= {}
711
+ inputs[input][workflow] ||= []
712
+ inputs[input][workflow] << name
713
+ end
714
+
715
+ dep_inputs = Task.dep_inputs deps, self
716
+
717
+ dep_inputs.each do |dep,is|
718
+ name = dep.name
719
+ workflow = dep.workflow
720
+
721
+ is.each do |input|
722
+ inputs[input] ||= {}
723
+ inputs[input][workflow] ||= []
724
+ inputs[input][workflow] << name
725
+ end
726
+ end
727
+
728
+ inputs
729
+ end
699
730
 
700
731
  def rec_input_descriptions(taskname)
701
732
  rec_inputs = rec_inputs(taskname)
@@ -126,11 +126,12 @@ class Step
126
126
  end
127
127
 
128
128
  if dependency.aborted? or (dependency.error? and dependency.recoverable_error?) or (!Open.remote?(dependency.path) && dependency.missing?)
129
+ Log.warn "Cleaning dep. #{Log.color :red, dependency.task_name.to_s}"
129
130
  dependency.clean
130
131
  raise TryAgain
131
132
  end
132
133
 
133
- if not dependency.started?
134
+ if ! dependency.started? && ! dependency.error?
134
135
  log_dependency_exec(dependency, :starting)
135
136
  dependency.run(true)
136
137
  raise TryAgain
@@ -157,6 +158,7 @@ class Step
157
158
  end
158
159
 
159
160
  rescue TryAgain
161
+ Log.low "Retrying dep. #{Log.color :yellow, dependency.task_name.to_s} -- [#{dependency.status}] #{dependency.messages.last}"
160
162
  retry
161
163
  rescue Aborted, Interrupt
162
164
  Log.error "Aborted dep. #{Log.color :red, dependency.task_name.to_s}"
@@ -267,6 +269,24 @@ class Step
267
269
  end
268
270
  end
269
271
 
272
+ def canfail_paths
273
+ if info[:canfail_paths]
274
+ Set.new(info[:canfail_paths])
275
+ else
276
+ canfail_paths = Set.new
277
+ all_deps = rec_dependencies + [self]
278
+ all_deps.each do |dep|
279
+ next if canfail_paths.include? dep.path
280
+ next unless ComputeDependency === dep && dep.canfail?
281
+ canfail_paths << dep.path
282
+ canfail_paths += dep.rec_dependencies.collect{|d| d.path }
283
+ end
284
+ canfail_paths
285
+ set_info :canfail_paths, canfail_paths.to_a
286
+ canfail_paths
287
+ end
288
+ end
289
+
270
290
  def run_dependencies
271
291
  dep_step = {}
272
292
 
@@ -281,11 +301,17 @@ class Step
281
301
  dep.rec_dependencies
282
302
  end.compact.flatten.uniq
283
303
 
304
+ canfail_paths = self.canfail_paths
305
+
284
306
  seen_paths = Set.new
285
307
  all_deps.uniq.each do |step|
286
308
  next if seen_paths.include? step.path
287
309
  seen_paths << step.path
288
- Step.prepare_for_execution(step) unless step == self
310
+ begin
311
+ Step.prepare_for_execution(step) unless step == self
312
+ rescue DependencyError
313
+ raise $! unless canfail_paths.include? step.path
314
+ end
289
315
  next unless step.dependencies and step.dependencies.any?
290
316
  step.dependencies.each do |step_dep|
291
317
  next if step_dep.done? or step_dep.running? or (ComputeDependency === step_dep and step_dep.compute == :nodup)
@@ -346,7 +372,11 @@ class Step
346
372
  Log.medium "Processing pre dependencies: #{Misc.fingerprint(pre_deps)} - #{Log.color :blue, self.path}" if pre_deps.any?
347
373
  pre_deps.each do |step|
348
374
  next if compute_deps.include? step
349
- execute_and_dup(step, dep_step, false)
375
+ begin
376
+ execute_and_dup(step, dep_step, false)
377
+ rescue Exception
378
+ raise $! unless canfail_paths.include?(step.path)
379
+ end
350
380
  end
351
381
 
352
382
  Log.medium "Computing pre dependencies: #{Misc.fingerprint(compute_pre_deps)} - #{Log.color :blue, self.path}" if compute_pre_deps.any?
@@ -357,7 +387,11 @@ class Step
357
387
  Log.medium "Processing last dependencies: #{Misc.fingerprint(last_deps)} - #{Log.color :blue, self.path}" if last_deps.any?
358
388
  last_deps.each do |step|
359
389
  next if compute_deps.include? step
360
- execute_and_dup(step, dep_step)
390
+ begin Exception
391
+ execute_and_dup(step, dep_step)
392
+ rescue
393
+ raise $! unless canfail_paths.include? step.path
394
+ end
361
395
  end
362
396
 
363
397
  Log.medium "Computing last dependencies: #{Misc.fingerprint(compute_last_deps)} - #{Log.color :blue, self.path}" if compute_last_deps.any?
@@ -365,6 +399,13 @@ class Step
365
399
  run_compute_dependencies(type, list, dep_step)
366
400
  end
367
401
 
402
+ Log.medium "Aborting waiting dangling dependencies"
403
+ all_deps.each do |dep|
404
+ next if dep.done?
405
+ next unless canfail_paths.include? dep.path
406
+ dep.abort if dep.waiting?
407
+ end
408
+
368
409
  end
369
410
 
370
411
  def stop_dependencies
@@ -24,6 +24,14 @@ class Step
24
24
  new_inputs = inputs.collect do |i|
25
25
  begin
26
26
  if Step === i
27
+ if i.error?
28
+ e = i.get_exception
29
+ if e
30
+ raise e
31
+ else
32
+ raise DependencyError, "Error in dep. #{Log.blue e.path}"
33
+ end
34
+ end
27
35
  step = true
28
36
  i.produce unless i.done? || i.error? || i.started?
29
37
  if i.done?
@@ -106,11 +114,12 @@ class Step
106
114
 
107
115
  outdated_time = []
108
116
  outdated_dep = []
117
+ canfail_paths = self.canfail_paths
109
118
  checks.each do |dep|
110
119
  if dep.done? && self.done? && (File.mtime(dep.path) > File.mtime(self.path))
111
120
  outdated_time << dep
112
121
  end
113
- if ! dep.done? || ! dep.updated?
122
+ if (! dep.done? && ! canfail_paths.include?(dep.path)) || ! dep.updated?
114
123
  outdated_dep << dep
115
124
  end
116
125
  end
data/share/Rlib/util.R CHANGED
@@ -523,7 +523,44 @@ rbbt.png_plot <- function(filename, p, width=500, height=500, ...){
523
523
  eval(parse(text=p));
524
524
  }
525
525
 
526
- rbbt.heatmap <- function(filename, data, width=500, height=500, take_log=FALSE, stdize=TRUE, ...){
526
+ rbbt.pheatmap <- function(filename, data, width=800, height=800, take_log=FALSE, stdize=FALSE, positive=FALSE, ...){
527
+ rbbt.require('pheatmap')
528
+
529
+ opar = par()
530
+ png(filename=filename, width=width, height=height);
531
+
532
+ data = as.matrix(data)
533
+ data[is.nan(data)] = NA
534
+
535
+ data = data[rowSums(is.na(data))==0, ]
536
+
537
+ if (take_log){
538
+ for (study in colnames(data)){
539
+ skip = sum(data[, study] <= 0) != 0
540
+ if (!skip){
541
+ data[, study] = log(data[, study])
542
+ }
543
+ }
544
+ data = data[, colSums(is.na(data))==0]
545
+ }
546
+
547
+
548
+ if (stdize){
549
+ rbbt.require('pls')
550
+ data = stdize(data)
551
+ }
552
+
553
+ if (positive){
554
+ pheatmap(data,color= colorRampPalette(c("white", "red"))(100), ...)
555
+ }else{
556
+ pheatmap(data, ...)
557
+ }
558
+
559
+ dev.off();
560
+ par(opar)
561
+ }
562
+
563
+ rbbt.heatmap <- function(filename, data, width=800, height=800, take_log=FALSE, stdize=FALSE, ...){
527
564
  opar = par()
528
565
  png(filename=filename, width=width, height=height);
529
566
 
@@ -24,15 +24,13 @@ end
24
24
 
25
25
  values = file.read.split("\n").collect{|v| v.to_f}
26
26
 
27
- res = TmpFile.with_file do |tmp|
27
+ res = TmpFile.with_file nil, :extension => 'png' do |tmp|
28
28
  R.run <<-EOF
29
29
  values = #{R.ruby2R values}
30
30
  d = density(values)
31
- df = data.frame(x=d$x, y=d$y)
32
- rbbt.tsv.write(file='#{ tmp }', df)
31
+ rbbt.png_plot(filename = '#{tmp}', 'plot(d)')
33
32
  EOF
34
33
 
35
- Open.read(tmp)
34
+ `op '#{tmp}'`
36
35
  end
37
36
 
38
- puts res.split("\n")[1..-1].collect{|l| l.split("\t")[1,2] * "\t"} * "\n"
@@ -0,0 +1,58 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rbbt-util'
4
+ require 'rbbt/util/simpleopt'
5
+
6
+ $0 = "rbbt #{$previous_commands*""} #{ File.basename(__FILE__) }" if $previous_commands
7
+
8
+ options = SOPT.setup <<EOF
9
+
10
+ Produce a heatmap
11
+
12
+ $ rbbt stat heatmap [options] <filename.tsv> [file.png]
13
+
14
+ -h--help Print this help
15
+ -w--width* Image Width
16
+ -h--height* Image Height
17
+ -s--size* Image Size (Height and Width)
18
+ -l--logs Take logs
19
+ -p--positive single color heatmap (positive values
20
+
21
+ EOF
22
+ if options[:help]
23
+ if defined? rbbt_usage
24
+ rbbt_usage
25
+ else
26
+ puts SOPT.usage
27
+ end
28
+ exit 0
29
+ end
30
+
31
+ file, png = ARGV
32
+
33
+ raise "No file" if file.nil?
34
+
35
+ width, height, size, logs, positive = options.values_at :width, :height, :size, :logs, :positive
36
+
37
+ size = 800 if size.nil?
38
+ width = size if width.nil?
39
+ height = size if height.nil?
40
+ logs = false if logs.nil?
41
+ positive = false if positive.nil?
42
+
43
+
44
+ require 'rbbt/util/R'
45
+ if png
46
+ R.run <<-EOF
47
+ data = rbbt.tsv('#{file}')
48
+ rbbt.pheatmap('#{png}', data, positive=#{R.ruby2R positive})
49
+ EOF
50
+ else
51
+ TmpFile.with_file(nil, :extension => 'png') do |png|
52
+ R.run <<-EOF
53
+ data = rbbt.tsv('#{file}')
54
+ rbbt.pheatmap('#{png}', data, width=#{ width }, height=#{ height }, take_log=#{R.ruby2R logs}, positive=#{R.ruby2R positive})
55
+ EOF
56
+ `op #{png}`
57
+ end
58
+ end
@@ -9,8 +9,18 @@ workflow = ARGV.shift
9
9
  wf = Workflow.require_workflow workflow
10
10
  dir = $command_dir = wf.libdir.share.rbbt_commands
11
11
 
12
+ def prev_dir(prev)
13
+ rbbt_command_dir = $rbbt_command_dir
14
+
15
+ prev.each do |previous_command|
16
+ rbbt_command_dir = rbbt_command_dir[previous_command]
17
+ end
18
+
19
+ rbbt_command_dir
20
+ end
21
+
12
22
  def commands(prev)
13
- rbbt_command_dir = $command_dir
23
+ rbbt_command_dir = prev_dir(prev)
14
24
 
15
25
  command_file_dirs = rbbt_command_dir.find_all
16
26
  command_files = command_file_dirs.collect{|d| d.glob('*') }.flatten
@@ -24,6 +34,9 @@ begin
24
34
  while ARGV.any?
25
35
  command = ARGV.shift
26
36
  case
37
+ when File.directory?(dir[command].find)
38
+ prev << command
39
+ dir = dir[command]
27
40
  when File.directory?(dir[command].find)
28
41
  prev << command
29
42
  dir = dir[command]
@@ -54,7 +67,13 @@ puts " #{File.basename($0)} #{$previous_commands * " "} cmd"
54
67
  puts
55
68
  puts Log.color :magenta, "Subcommands:"
56
69
  puts
70
+
57
71
  commands(prev).each do |command|
72
+ directory = File.directory? dir[command].find
73
+ if directory
74
+ puts " " << Log.color(:blue, command)
75
+ else
58
76
  puts " " << command
77
+ end
59
78
  end
60
79
 
@@ -222,5 +222,10 @@ class TestWorkflow < Test::Unit::TestCase
222
222
  end
223
223
  end
224
224
 
225
+ def test_rec_input_use
226
+ assert TestWF.rec_input_use(:double_dep).include?(:times)
227
+ assert TestWF.rec_input_use(:double_dep)[:times].include?(TestWF)
228
+ assert TestWF.rec_input_use(:double_dep)[:times][TestWF].include?(:repeat)
229
+ end
225
230
 
226
231
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rbbt-util
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.21.127
4
+ version: 5.21.128
5
5
  platform: ruby
6
6
  authors:
7
7
  - Miguel Vazquez
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-03-08 00:00:00.000000000 Z
11
+ date: 2018-05-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -358,6 +358,7 @@ files:
358
358
  - share/rbbt_commands/rsync
359
359
  - share/rbbt_commands/stat/abs
360
360
  - share/rbbt_commands/stat/density
361
+ - share/rbbt_commands/stat/heatmap
361
362
  - share/rbbt_commands/stat/log
362
363
  - share/rbbt_commands/stat/pvalue.qqplot
363
364
  - share/rbbt_commands/study/maf2study