rbbt-util 5.15.1 → 5.15.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/etc/app.d/grid_system.rb +1 -1
- data/etc/app.d/resources.rb +4 -2
- data/lib/rbbt/annotations/util.rb +6 -2
- data/lib/rbbt/association/index.rb +16 -5
- data/lib/rbbt/association/util.rb +1 -1
- data/lib/rbbt/entity.rb +53 -1
- data/lib/rbbt/entity/identifiers.rb +4 -1
- data/lib/rbbt/tsv.rb +4 -1
- data/lib/rbbt/tsv/accessor.rb +3 -31
- data/lib/rbbt/tsv/change_id.rb +5 -0
- data/lib/rbbt/tsv/excel.rb +15 -0
- data/lib/rbbt/tsv/index.rb +4 -4
- data/lib/rbbt/tsv/parser.rb +16 -7
- data/lib/rbbt/tsv/util.rb +1 -1
- data/lib/rbbt/util/R.rb +5 -3
- data/lib/rbbt/util/R/model.rb +4 -1
- data/lib/rbbt/util/colorize.rb +3 -2
- data/lib/rbbt/util/concurrency/processes/socket.rb +2 -0
- data/lib/rbbt/util/misc/objects.rb +2 -2
- data/share/Rlib/plot.R +40 -0
- data/share/rbbt_commands/app/start +2 -1
- data/share/rbbt_commands/tsv/unzip +1 -1
- data/share/rbbt_commands/workflow/example +1 -1
- data/share/rbbt_commands/workflow/server +9 -2
- data/test/rbbt/association/test_database.rb +3 -0
- data/test/rbbt/test_tsv.rb +24 -1
- data/test/rbbt/tsv/parallel/test_traverse.rb +7 -3
- data/test/rbbt/tsv/test_manipulate.rb +18 -16
- data/test/rbbt/util/test_misc.rb +5 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 018bba9e3d9b7f80d23369d9534036edee4ead06
|
4
|
+
data.tar.gz: 04bf22adf2e811413c22885bc8178be8cd497902
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a164aec636a2c50eabc7801dd500d8ab38585da8b14abb59e4e9af7830a3754348aabe498c006910f03ad7a970e6118048b51b687fcfb8ac8cf85415641c447a
|
7
|
+
data.tar.gz: a6e0d2485331aa9ff75237e4d1b03a6b7fefa1a1cceb32b9dac44512f7c11c99e4d1078115df4b5340dcec6e035c3bdc4fb5f5a5e6075e501f8ee9d0ac681596
|
data/etc/app.d/grid_system.rb
CHANGED
data/etc/app.d/resources.rb
CHANGED
@@ -1,16 +1,18 @@
|
|
1
1
|
|
2
2
|
EntityRESTHelpers.entity_resources.unshift Rbbt.www.views.find if Rbbt.www.views.exists?
|
3
3
|
RbbtRESTHelpers.template_resources.unshift Rbbt.www.views.find if Rbbt.www.views.exists?
|
4
|
-
|
5
|
-
#load Rbbt.etc['app.d']['foundation.rb'].find if Rbbt.etc['app.d']['foundation.rb'].exists?
|
4
|
+
|
6
5
|
load Rbbt.etc['app.d']['grid_system.rb'].find if Rbbt.etc['app.d']['grid_system.rb'].exists?
|
7
6
|
|
8
7
|
require 'sass-css-importer'
|
9
8
|
|
9
|
+
Sinatra::RbbtRESTMain.add_resource_path(Path.setup(ENV["RBBT_VIEWS_DIR"])) if ENV["RBBT_VIEWS_DIR"] and not ENV["RBBT_VIEWS_DIR"].empty?
|
10
|
+
|
10
11
|
Compass::Frameworks::ALL.each do |importer|
|
11
12
|
next unless importer.respond_to? :path
|
12
13
|
path = importer.stylesheets_directory
|
13
14
|
RbbtRESTHelpers.add_sass_load_path path
|
14
15
|
end
|
16
|
+
|
15
17
|
RbbtRESTHelpers.add_sass_load_path './www/views/compass'
|
16
18
|
|
@@ -25,8 +25,12 @@ module Annotated
|
|
25
25
|
entity_id = info.delete(:entity_id) || info.delete("entity_id")
|
26
26
|
|
27
27
|
annotation_types.each do |mod|
|
28
|
-
|
29
|
-
|
28
|
+
begin
|
29
|
+
mod = Misc.string2const(mod) if String === mod
|
30
|
+
object.extend mod unless mod === object
|
31
|
+
rescue Exception
|
32
|
+
Log.warn "Exception loading annotation into object: #{$!.message}"
|
33
|
+
end
|
30
34
|
end
|
31
35
|
|
32
36
|
object.instance_variable_set(:@annotation_values, info)
|
@@ -68,6 +68,7 @@ module Association
|
|
68
68
|
annotations.each do |target, info|
|
69
69
|
next if target.nil? or target.empty?
|
70
70
|
key = [source, target] * "~"
|
71
|
+
|
71
72
|
if data[key].nil? or info.nil?
|
72
73
|
data[key] = info
|
73
74
|
else
|
@@ -75,12 +76,22 @@ module Association
|
|
75
76
|
info = old_info.zip(info).collect{|p| p * ";;" }
|
76
77
|
data[key] = info
|
77
78
|
end
|
78
|
-
if undirected
|
79
|
-
reverse_key = [target,source] * "~"
|
80
|
-
data[reverse_key] = info unless data.include? reverse_key
|
81
|
-
end
|
82
79
|
end
|
83
80
|
end
|
81
|
+
|
82
|
+
if undirected
|
83
|
+
new_data = {}
|
84
|
+
|
85
|
+
data.through do |key,values|
|
86
|
+
reverse_key = key.split("~").reverse * "~"
|
87
|
+
new_data[reverse_key] = values
|
88
|
+
end
|
89
|
+
|
90
|
+
new_data.each do |key,values|
|
91
|
+
data[key] = values
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
84
95
|
end
|
85
96
|
end
|
86
97
|
end.tap do |data|
|
@@ -219,7 +230,7 @@ module Association
|
|
219
230
|
|
220
231
|
matches.each{|code|
|
221
232
|
s,sep,t = code.partition "~"
|
222
|
-
next if undirected and t > s
|
233
|
+
next if undirected and t > s and source.include? t
|
223
234
|
target_matches[t] ||= []
|
224
235
|
target_matches[t] << code
|
225
236
|
}
|
@@ -124,11 +124,11 @@ module Association
|
|
124
124
|
all_fields.first
|
125
125
|
end
|
126
126
|
|
127
|
-
|
128
127
|
field_headers << header
|
129
128
|
end
|
130
129
|
|
131
130
|
field_pos = info_fields.collect{|f| raise "Field #{f} not found. Options: #{all_fields * ", "}" unless all_fields.include?(f); f == :key ? 0 : all_fields.index(f); }
|
131
|
+
field_pos.delete source_pos
|
132
132
|
|
133
133
|
source_format = specs[:source][2]
|
134
134
|
target_format = specs[:target][2]
|
data/lib/rbbt/entity.rb
CHANGED
@@ -8,7 +8,59 @@ module Entity
|
|
8
8
|
class << self
|
9
9
|
attr_accessor :formats, :entity_property_cache
|
10
10
|
end
|
11
|
-
|
11
|
+
FORMATS = begin
|
12
|
+
hash = {}
|
13
|
+
class << hash
|
14
|
+
alias orig_include? include?
|
15
|
+
|
16
|
+
attr_accessor :find_cache
|
17
|
+
|
18
|
+
def find(value)
|
19
|
+
self.find_cache ||= {}
|
20
|
+
if self.find_cache.include? value
|
21
|
+
self.find_cache[value]
|
22
|
+
else
|
23
|
+
self.find_cache[value] = begin
|
24
|
+
if orig_include? value
|
25
|
+
self.find_cache[value] = value
|
26
|
+
else
|
27
|
+
found = nil
|
28
|
+
each do |k,v|
|
29
|
+
if value =~ /\b#{Regexp.quote k}$/
|
30
|
+
found = k
|
31
|
+
break
|
32
|
+
end
|
33
|
+
end
|
34
|
+
found
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def [](value)
|
41
|
+
res = super
|
42
|
+
return res if res
|
43
|
+
key = find(value)
|
44
|
+
key ? super(key) : nil
|
45
|
+
end
|
46
|
+
|
47
|
+
def []=(key,value)
|
48
|
+
self.find_cache = nil
|
49
|
+
super
|
50
|
+
end
|
51
|
+
|
52
|
+
def include?(value)
|
53
|
+
find(value) != nil
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
hash
|
58
|
+
end
|
59
|
+
|
60
|
+
def self.formats
|
61
|
+
FORMATS
|
62
|
+
end
|
63
|
+
|
12
64
|
dir = (defined?(Rbbt)? Rbbt.var.entity_property : 'var/entity_property')
|
13
65
|
self.entity_property_cache = dir
|
14
66
|
|
@@ -25,12 +25,15 @@ module Entity
|
|
25
25
|
def identifier_files
|
26
26
|
files = identity_type.identifier_files.dup
|
27
27
|
files.collect!{|f| f.annotate f.gsub(/\bNAMESPACE\b/, organism) } if annotations.include? :organism and self.organism
|
28
|
+
if files.select{|f| f =~ /\bNAMESPACE\b/ }.any?
|
29
|
+
Log.warn "Rejecting some identifier files for lack of 'organism': " << files.select{|f| f =~ /\bNAMESPACE\b/ } * ", "
|
30
|
+
end
|
28
31
|
files.reject!{|f| f =~ /\bNAMESPACE\b/ }
|
29
32
|
files
|
30
33
|
end
|
31
34
|
|
32
35
|
def identifier_index(format = nil, source = nil)
|
33
|
-
Persist.memory("Entity index #{identity_type}: #{format} (from #{source || "All"})", :format => format, :source => source) do
|
36
|
+
Persist.memory("Entity index #{identity_type}: #{format} (from #{source || "All"})", :format => format, :source => source, :update => true) do
|
34
37
|
source ||= self.respond_to?(:format)? self.format : nil
|
35
38
|
|
36
39
|
index = TSV.translation_index(identifier_files, format, source, :persist => true)
|
data/lib/rbbt/tsv.rb
CHANGED
@@ -60,6 +60,7 @@ module TSV
|
|
60
60
|
unnamed = Misc.process_options options, :unnamed
|
61
61
|
entity_options = Misc.process_options options, :entity_options
|
62
62
|
|
63
|
+
|
63
64
|
Log.debug "TSV open: #{ filename } - #{Misc.fingerprint options }.#{unnamed ? " [unnamed]" : "[not unnamed]"}"
|
64
65
|
|
65
66
|
data = nil
|
@@ -72,10 +73,12 @@ module TSV
|
|
72
73
|
data.serializer = serializer
|
73
74
|
end
|
74
75
|
|
76
|
+
tsv_grep = Misc.process_options options, :tsv_grep
|
77
|
+
tsv_grep ||= Misc.process_options options, :grep
|
75
78
|
open_options = Misc.pull_keys options, :open
|
76
79
|
|
77
80
|
stream = get_stream source, options.merge(open_options)
|
78
|
-
parse stream, data, options
|
81
|
+
parse stream, data, options.merge(:tsv_grep => tsv_grep)
|
79
82
|
|
80
83
|
data.filename = filename.to_s unless filename.nil?
|
81
84
|
|
data/lib/rbbt/tsv/accessor.rb
CHANGED
@@ -646,35 +646,7 @@ Example:
|
|
646
646
|
new
|
647
647
|
end
|
648
648
|
|
649
|
-
def unzip(field = 0, merge = false)
|
650
|
-
new = {}
|
651
|
-
field_pos = self.identify_field field
|
652
|
-
|
653
|
-
self.through do |key,values|
|
654
|
-
field_values = values.delete_at field_pos
|
655
|
-
zipped = values.zip_fields
|
656
|
-
field_values.zip(zipped).each do |value, *rest|
|
657
|
-
k = [key,value]*":"
|
658
|
-
if merge and new.include? k
|
659
|
-
new[k] = Misc.zip_fields(rest)
|
660
|
-
else
|
661
|
-
new[k] = Misc.zip_fields(rest)
|
662
|
-
end
|
663
|
-
end
|
664
|
-
end
|
665
|
-
|
666
|
-
self.annotate new
|
667
|
-
new.type = :list
|
668
|
-
|
669
|
-
new.key_field = [self.key_field, self.fields[field_pos]] * ":"
|
670
|
-
new_fields = self.fields.dup
|
671
|
-
new_fields.delete_at field_pos
|
672
|
-
new.fields = new_fields
|
673
|
-
|
674
|
-
new
|
675
|
-
end
|
676
|
-
|
677
|
-
def unzip(field = 0, merge = false)
|
649
|
+
def unzip(field = 0, merge = false, sep = ":")
|
678
650
|
new = {}
|
679
651
|
self.annotate new
|
680
652
|
|
@@ -686,7 +658,7 @@ Example:
|
|
686
658
|
next if field_values.nil?
|
687
659
|
zipped = Misc.zip_fields(values)
|
688
660
|
field_values.zip(zipped).each do |field_value,rest|
|
689
|
-
k = [key,field_value]*
|
661
|
+
k = [key,field_value]*sep
|
690
662
|
if new.include? k
|
691
663
|
new[k] = Misc.zip_fields(Misc.zip_fields(new[k]) << rest)
|
692
664
|
else
|
@@ -701,7 +673,7 @@ Example:
|
|
701
673
|
next if field_values.nil?
|
702
674
|
zipped = Misc.zip_fields(values)
|
703
675
|
field_values.zip(zipped).each do |field_value,rest|
|
704
|
-
k = [key,field_value]*
|
676
|
+
k = [key,field_value]*sep
|
705
677
|
new[k] = rest
|
706
678
|
end
|
707
679
|
end
|
data/lib/rbbt/tsv/change_id.rb
CHANGED
@@ -89,7 +89,11 @@ module TSV
|
|
89
89
|
def self.translation_index(files, target = nil, source = nil, options = {})
|
90
90
|
return nil if source == target
|
91
91
|
options = Misc.add_defaults options.dup, :persist => true
|
92
|
+
|
93
|
+
target = Entity.formats.find(target) if Entity.formats.find(target)
|
94
|
+
source = Entity.formats.find(source) if Entity.formats.find(source)
|
92
95
|
fields = (source and not source.empty?) ? [source] : nil
|
96
|
+
|
93
97
|
files.each do |file|
|
94
98
|
if TSV === file
|
95
99
|
all_fields = file.all_fields
|
@@ -126,6 +130,7 @@ module TSV
|
|
126
130
|
|
127
131
|
index = Persist.persist_tsv(nil, Misc.fingerprint(files), {:files => files, :source => source, :target => target}, :prefix => "Translation index", :persist => options[:persist]) do |data|
|
128
132
|
|
133
|
+
iii options.merge(:target => common_field, :fields => fields)
|
129
134
|
index = TSV === file ?
|
130
135
|
file.index(options.merge(:target => common_field, :fields => fields)) :
|
131
136
|
TSV.index(file, options.merge(:target => common_field, :fields => fields))
|
data/lib/rbbt/tsv/excel.rb
CHANGED
@@ -85,6 +85,21 @@ module TSV
|
|
85
85
|
end
|
86
86
|
end
|
87
87
|
|
88
|
+
cells = cells.collect do |v|
|
89
|
+
case v
|
90
|
+
when Float
|
91
|
+
v.to_s.sub(/e(-?\d+)$/,'E\1')
|
92
|
+
when String
|
93
|
+
if v =~ /^-?[\d\.]+e(-?\d+)$/
|
94
|
+
v.sub(/e(-?\d+)$/,'E\1')
|
95
|
+
else
|
96
|
+
v
|
97
|
+
end
|
98
|
+
else
|
99
|
+
v
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
88
103
|
sheet1.row(i).concat cells
|
89
104
|
i += 1
|
90
105
|
end
|
data/lib/rbbt/tsv/index.rb
CHANGED
@@ -16,7 +16,7 @@ module TSV
|
|
16
16
|
persist_options = Misc.pull_keys options, :persist
|
17
17
|
persist_options[:prefix] ||= "Index[#{options[:target] || :key}]"
|
18
18
|
|
19
|
-
Log.debug "Index: #{ filename } - #{options
|
19
|
+
Log.debug "Index: #{ filename } - #{Misc.fingerprint options}"
|
20
20
|
Persist.persist_tsv self, filename, options, persist_options do |new|
|
21
21
|
with_unnamed do
|
22
22
|
target, fields, index_type, order = Misc.process_options options, :target, :fields, :type, :order
|
@@ -116,7 +116,7 @@ module TSV
|
|
116
116
|
end
|
117
117
|
end
|
118
118
|
|
119
|
-
TSV.setup(new, :type => index_type, :filename => filename, :fields => [new_key_field], :key_field => new_fields * ", ")
|
119
|
+
TSV.setup(new, :type => index_type, :filename => filename, :fields => [new_key_field], :key_field => new_fields * ", ", :namespace => namespace)
|
120
120
|
end
|
121
121
|
end
|
122
122
|
end
|
@@ -125,12 +125,12 @@ module TSV
|
|
125
125
|
persist_options = Misc.pull_keys options, :persist
|
126
126
|
persist_options[:prefix] ||= "StaticIndex[#{options[:target] || :key}]"
|
127
127
|
|
128
|
-
Log.debug "Static Index: #{ file } - #{options
|
128
|
+
Log.debug "Static Index: #{ file } - #{Misc.fingerprint options}"
|
129
129
|
Persist.persist_tsv nil, file, options, persist_options do |data|
|
130
130
|
data_options = Misc.pull_keys options, :data
|
131
131
|
identifiers = TSV.open(file, data_options)
|
132
132
|
identifiers.with_monitor :desc => "Creating Index for #{ file }" do
|
133
|
-
|
133
|
+
identifiers.index(options.merge :persist_data => data, :persist => persist_options[:persist])
|
134
134
|
end
|
135
135
|
end
|
136
136
|
end
|
data/lib/rbbt/tsv/parser.rb
CHANGED
@@ -383,6 +383,7 @@ module TSV
|
|
383
383
|
def initialize(stream = nil, options = {})
|
384
384
|
@header_hash = Misc.process_options(options, :header_hash) || "#"
|
385
385
|
@sep = Misc.process_options(options, :sep) || "\t"
|
386
|
+
@tsv_grep = Misc.process_options(options, :tsv_grep)
|
386
387
|
stream = TSV.get_stream stream
|
387
388
|
@stream = stream
|
388
389
|
|
@@ -414,6 +415,8 @@ module TSV
|
|
414
415
|
fix_fields(options)
|
415
416
|
|
416
417
|
@type = @type.strip.to_sym if String === @type
|
418
|
+
#@type ||= :double if merge == true
|
419
|
+
|
417
420
|
case @type
|
418
421
|
when :double
|
419
422
|
self.instance_eval do alias get_values get_values_double end
|
@@ -502,18 +505,24 @@ module TSV
|
|
502
505
|
raise "No block given in TSV::Parser#traverse" unless block_given?
|
503
506
|
|
504
507
|
stream = @stream
|
505
|
-
# get parser
|
506
508
|
|
507
|
-
# grep
|
508
|
-
#if grep and false
|
509
|
-
# stream.rewind if stream.eof?
|
510
|
-
# stream = Open.grep(stream, grep, invert_grep)
|
511
|
-
# self.first_line = stream.gets
|
512
|
-
#end
|
513
509
|
|
514
510
|
# first line
|
515
511
|
line = self.rescue_first_line
|
516
512
|
|
513
|
+
if @tsv_grep
|
514
|
+
|
515
|
+
stream = Open.grep(stream, @tsv_grep, invert_grep)
|
516
|
+
stream.no_fail = true
|
517
|
+
begin
|
518
|
+
match = Open.grep(StringIO.new(line), @tsv_grep, invert_grep).read
|
519
|
+
line = stream.gets if match.empty?
|
520
|
+
rescue Exception
|
521
|
+
Log.exception $!
|
522
|
+
line = stream.gets
|
523
|
+
end
|
524
|
+
end
|
525
|
+
|
517
526
|
progress_monitor, monitor = monitor, nil if Log::ProgressBar === monitor
|
518
527
|
# setup monitor
|
519
528
|
if monitor and (stream.respond_to?(:size) or (stream.respond_to?(:stat) and stream.stat.respond_to? :size)) and stream.respond_to?(:pos)
|
data/lib/rbbt/tsv/util.rb
CHANGED
@@ -152,7 +152,7 @@ module TSV
|
|
152
152
|
pos = fields.index field
|
153
153
|
return pos if pos
|
154
154
|
return identify_field(key_field, fields, field.to_i) if field =~ /^\d+$/
|
155
|
-
raise "Field #{ field } was not found. Options: #{fields * ", "}" if pos.nil?
|
155
|
+
raise "Field #{ field } was not found. Options: (#{key_field || "NO_KEY_FIELD"}), #{(fields || ["NO_FIELDS"]) * ", "}" if pos.nil?
|
156
156
|
else
|
157
157
|
raise "Field #{ field } was not found. Options: (#{key_field || "NO_KEY_FIELD"}), #{(fields || ["NO_FIELDS"]) * ", "}"
|
158
158
|
end
|
data/lib/rbbt/util/R.rb
CHANGED
@@ -4,8 +4,9 @@ require 'rbbt/util/R/eval'
|
|
4
4
|
|
5
5
|
module R
|
6
6
|
|
7
|
-
LIB_DIR = File.join(File.expand_path(File.dirname(__FILE__)),'../../../share/Rlib')
|
7
|
+
LIB_DIR = Path.setup(File.join(File.expand_path(File.dirname(__FILE__)),'../../../share/Rlib'))
|
8
8
|
UTIL = File.join(LIB_DIR, 'util.R')
|
9
|
+
PLOT = File.join(LIB_DIR, 'plot.R')
|
9
10
|
|
10
11
|
def self.run(command, options = {})
|
11
12
|
cmd =<<-EOF
|
@@ -127,10 +128,11 @@ module TSV
|
|
127
128
|
open_options, source = source, nil if Hash === source
|
128
129
|
|
129
130
|
source ||= Misc.process_options open_options, :source
|
130
|
-
source = [source]
|
131
|
+
source = [source] unless Array === source
|
131
132
|
|
132
133
|
require_sources = source.collect{|source|
|
133
|
-
"source
|
134
|
+
source = R::LIB_DIR["plot.R"] if source == :plot
|
135
|
+
"source('#{source}')"
|
134
136
|
} * ";\n" if Array === source and source.any?
|
135
137
|
|
136
138
|
script = require_sources + "\n\n" + script if require_sources
|
data/lib/rbbt/util/R/model.rb
CHANGED
@@ -18,11 +18,14 @@ module R
|
|
18
18
|
class Model
|
19
19
|
R_METHOD = :eval
|
20
20
|
|
21
|
-
attr_accessor :name, :formula
|
21
|
+
attr_accessor :name, :formula, :model_file
|
22
22
|
def initialize(name, formula, data = nil, options = {})
|
23
23
|
@name = name
|
24
24
|
@formula = formula
|
25
25
|
@options = options || {}
|
26
|
+
@model_file = options[:model_file] if options[:model_file]
|
27
|
+
@model_file ||= Misc.sanitize_filename(File.join(options[:model_dir], name)) if options[:model_dir]
|
28
|
+
|
26
29
|
if data and not model_file.exists?
|
27
30
|
method = Misc.process_options options, :fit
|
28
31
|
fit(data, method || "lm", options)
|
data/lib/rbbt/util/colorize.rb
CHANGED
@@ -15,12 +15,13 @@ module Colorize
|
|
15
15
|
start_color = Color.new from_name(start)
|
16
16
|
end_color = Color.new from_name(eend)
|
17
17
|
|
18
|
-
array = array.collect{|v| v.to_f}
|
18
|
+
array = array.collect{|v| n = v.to_f; n = n > 100 ? 100 : n; n < 0.001 ? 0.001 : n}
|
19
19
|
max = array.max
|
20
20
|
min = array.min
|
21
21
|
range = max - min
|
22
22
|
array.collect do |v|
|
23
|
-
|
23
|
+
ratio = (v-min) / range
|
24
|
+
start_color.blend end_color, ratio
|
24
25
|
end
|
25
26
|
end
|
26
27
|
|
@@ -7,11 +7,11 @@ module Misc
|
|
7
7
|
|
8
8
|
dup_array = options.delete :dup_array
|
9
9
|
|
10
|
-
if Entity === field or (Entity.respond_to?(:formats) and Entity.formats.
|
10
|
+
if Entity === field or (Entity.respond_to?(:formats) and (_format = Entity.formats.find(field)))
|
11
11
|
params = options.dup
|
12
12
|
|
13
13
|
params[:format] ||= params.delete "format"
|
14
|
-
params.merge!(:format =>
|
14
|
+
params.merge!(:format => _format) unless _format.nil? or (params.include?(:format) and not ((f = params[:format]).nil? or (String === f and f.empty?)))
|
15
15
|
|
16
16
|
mod = Entity === field ? field : Entity.formats[field]
|
17
17
|
entity = mod.setup(
|
data/share/Rlib/plot.R
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
library(ggplot2)
|
2
|
+
|
3
|
+
geom_entity <- function (real.geom = NULL, mapping = NULL, data = NULL, stat = "identity",
|
4
|
+
position = "identity", ...) {
|
5
|
+
rg <- real.geom(mapping = mapping, data = data, stat = stat,
|
6
|
+
position = position, ...)
|
7
|
+
|
8
|
+
rg$geom <- proto(rg$geom, {
|
9
|
+
draw <- function(., data, ...) {
|
10
|
+
grobs <- list()
|
11
|
+
|
12
|
+
for (i in 1:nrow(data)) {
|
13
|
+
grob <- .super$draw(., data[i,], ...)
|
14
|
+
if (is.null(data$entity.type))
|
15
|
+
grobs[[i]] <- garnishGrob(grob, `data-entity`=data[i,]$entity)
|
16
|
+
else
|
17
|
+
grobs[[i]] <- garnishGrob(grob, `data-entity`=data[i,]$entity, `data-entity-type`=data[i,]$entity.type)
|
18
|
+
}
|
19
|
+
|
20
|
+
ggplot2:::ggname("geom_entity", gTree(children = do.call("gList", grobs)))
|
21
|
+
}
|
22
|
+
|
23
|
+
draw_groups <- function(., data, ...) {
|
24
|
+
grobs <- list()
|
25
|
+
|
26
|
+
for (i in 1:nrow(data)) {
|
27
|
+
grob <- .super$draw_groups(., data[i,], ...)
|
28
|
+
if (is.null(data$entity.type))
|
29
|
+
grobs[[i]] <- garnishGrob(grob, `data-entity`=data[i,]$entity)
|
30
|
+
else
|
31
|
+
grobs[[i]] <- garnishGrob(grob, `data-entity`=data[i,]$entity, `data-entity-type`=data[i,]$entity.type)
|
32
|
+
}
|
33
|
+
|
34
|
+
ggplot2:::ggname("geom_entity", gTree(children = do.call("gList", grobs)))
|
35
|
+
}
|
36
|
+
})
|
37
|
+
|
38
|
+
rg
|
39
|
+
}
|
40
|
+
|
@@ -3,7 +3,7 @@
|
|
3
3
|
require 'rbbt-util'
|
4
4
|
require 'rbbt/util/simpleopt'
|
5
5
|
|
6
|
-
options = SOPT.get "-e--environment*:-p--port*:-s--server*:-f--finder:-R--Rserve_session*:-ho--host*"
|
6
|
+
options = SOPT.get "-e--environment*:-p--port*:-s--server*:-f--finder:-R--Rserve_session*:-ho--host*:--views*"
|
7
7
|
options[:Port] ||= options[:port]
|
8
8
|
options[:Host] ||= "0.0.0.0"
|
9
9
|
options[:Bind] ||= "0.0.0.0"
|
@@ -21,6 +21,7 @@ Misc.in_dir(app_dir) do
|
|
21
21
|
require 'rack'
|
22
22
|
ENV["RBBT_FINDER"] = "true" if options.include?(:finder)
|
23
23
|
ENV["RACK_ENV"] = options[:environment] if options.include?(:environment)
|
24
|
+
ENV["RBBT_VIEWS_DIR"] = options[:views] if options.include?(:views)
|
24
25
|
|
25
26
|
config_ru_file = File.exists?('./config.ru') ? './config.ru' : Rbbt.share['config.ru'].find
|
26
27
|
|
@@ -8,7 +8,7 @@ $0 = "rbbt #{$previous_commands*""} #{ File.basename(__FILE__) }" if $previous_c
|
|
8
8
|
options = SOPT.setup <<EOF
|
9
9
|
Zip fields in a TSV file
|
10
10
|
|
11
|
-
$ rbbt tsv
|
11
|
+
$ rbbt tsv unzip [options] file.tsv
|
12
12
|
|
13
13
|
Display summary information. Works with Tokyocabinet HDB and BDB as well.
|
14
14
|
|
@@ -13,7 +13,7 @@ require 'rbbt/rest/file_server'
|
|
13
13
|
require 'rbbt/rest/knowledge_base'
|
14
14
|
require 'rbbt/rest/helpers'
|
15
15
|
|
16
|
-
options = SOPT.get "-e--environment*:-p--port*:-s--server*:-b--bind*:-e--environment*:-R--RServe_session*:--finder"
|
16
|
+
options = SOPT.get "-e--environment*:-p--port*:-s--server*:-b--bind*:-e--environment*:-R--RServe_session*:--finder:--views*"
|
17
17
|
|
18
18
|
workflow = ARGV.first
|
19
19
|
|
@@ -31,6 +31,8 @@ load Rbbt.etc['app.d/init.rb'].find
|
|
31
31
|
app = class WorkflowRest < Sinatra::Base; self end
|
32
32
|
|
33
33
|
app.register Sinatra::RbbtRESTWorkflow
|
34
|
+
app.register Sinatra::RbbtRESTKnowledgeBase
|
35
|
+
|
34
36
|
app.get '/' do
|
35
37
|
redirect to(File.join('/', wf.to_s))
|
36
38
|
end
|
@@ -43,7 +45,12 @@ app.class_eval do
|
|
43
45
|
eval Rbbt.etc['app.d/finder.rb'].read
|
44
46
|
end
|
45
47
|
|
46
|
-
WorkflowRest.add_workflow wf,
|
48
|
+
WorkflowRest.add_workflow wf, :all
|
49
|
+
|
50
|
+
if options[:views] and not options[:views].empty?
|
51
|
+
Sinatra::RbbtRESTMain.add_resource_path(Path.setup(options[:views]), true)
|
52
|
+
end
|
53
|
+
|
47
54
|
|
48
55
|
WorkflowRest.port = options[:port] || 4567
|
49
56
|
WorkflowRest.bind = options[:bind] || "0.0.0.0"
|
@@ -58,4 +58,7 @@ TP53 NFKB1|GLI1 activation|activation true|true
|
|
58
58
|
assert_equal [["Bilateria"], ["Euteleostomi"], ["Duplicate"]], tsv["ENSG00000000003"]
|
59
59
|
end
|
60
60
|
|
61
|
+
def test_gene_ages
|
62
|
+
assert Association.database('/home/mvazquezg/git/workflows/genomics/share/gene_ages', :source => "FamilyAge", :merge => true, :target => "Ensembl Gene ID", :persist => false).values.first.length > 1
|
63
|
+
end
|
61
64
|
end
|
data/test/rbbt/test_tsv.rb
CHANGED
@@ -308,6 +308,22 @@ b 2
|
|
308
308
|
end
|
309
309
|
end
|
310
310
|
|
311
|
+
def test_tsv_grep
|
312
|
+
content =<<-EOF
|
313
|
+
#: :sep=/\\s+/#:type=:single
|
314
|
+
#Id Value
|
315
|
+
a 1
|
316
|
+
b 2
|
317
|
+
b 3
|
318
|
+
EOF
|
319
|
+
|
320
|
+
TmpFile.with_file(content) do |filename|
|
321
|
+
tsv = TSV.open(filename, :key_field => "Value", :tsv_grep => "2")
|
322
|
+
assert(tsv.include?("2"))
|
323
|
+
assert(! tsv.include?("3"))
|
324
|
+
end
|
325
|
+
end
|
326
|
+
|
311
327
|
def test_grep_invert
|
312
328
|
content =<<-EOF
|
313
329
|
#: :sep=/\\s+/#:type=:single
|
@@ -317,8 +333,9 @@ b 2
|
|
317
333
|
EOF
|
318
334
|
|
319
335
|
TmpFile.with_file(content) do |filename|
|
320
|
-
tsv = TSV.open(filename, :key_field => "Value", :
|
336
|
+
tsv = TSV.open(filename, :key_field => "Value", :tsv_grep => "2", :invert_grep => true)
|
321
337
|
assert(! tsv.include?("2"))
|
338
|
+
assert(tsv.include?("1"))
|
322
339
|
end
|
323
340
|
end
|
324
341
|
|
@@ -326,6 +343,7 @@ b 2
|
|
326
343
|
content =<<-EOF
|
327
344
|
#: :sep=/\\s+/#:type=:single#:namespace=Test
|
328
345
|
#Id Value
|
346
|
+
a 7
|
329
347
|
a 1
|
330
348
|
b 2
|
331
349
|
EOF
|
@@ -334,6 +352,7 @@ b 2
|
|
334
352
|
tsv = TSV.open(filename, :key_field => "Value", :grep => "#\\|2")
|
335
353
|
assert(! tsv.include?("1"))
|
336
354
|
assert(tsv.include?("2"))
|
355
|
+
assert(! tsv.include?("7"))
|
337
356
|
end
|
338
357
|
end
|
339
358
|
|
@@ -533,4 +552,8 @@ row2 A AA AAA
|
|
533
552
|
tsv = datafile_test('identifiers').tsv :persist => true, :shard_function => shard_function
|
534
553
|
assert_equal 10000, tsv.keys.length + 2
|
535
554
|
end
|
555
|
+
|
556
|
+
def test_merge_key_field
|
557
|
+
assert TSV.open('/home/mvazquezg/git/workflows/genomics/share/gene_ages', :key_field => "FamilyAge", :merge => true, :persist => false, :zipped => true, :type => :double).values.first.length > 1
|
558
|
+
end
|
536
559
|
end
|
@@ -394,10 +394,14 @@ class TestTSVParallelThrough < Test::Unit::TestCase
|
|
394
394
|
def test_store_multiple
|
395
395
|
size = 1000
|
396
396
|
array = (1..size).to_a.collect{|n| n.to_s}
|
397
|
-
|
398
|
-
|
399
|
-
|
397
|
+
|
398
|
+
stream = TSV.traverse array, :bar => {:max => size, :desc => "Multiple into stream"}, :cpus => 2, :into => :stream do |e|
|
399
|
+
sleep 0.001
|
400
|
+
res = [e,e+".alt"]
|
401
|
+
res.extend MultipleResult
|
402
|
+
res
|
400
403
|
end
|
404
|
+
|
401
405
|
assert_equal size*2, stream.read.split("\n").length
|
402
406
|
end
|
403
407
|
end
|
@@ -13,12 +13,14 @@ rowa a|aa b|BB C|CC
|
|
13
13
|
|
14
14
|
TmpFile.with_file(content) do |filename|
|
15
15
|
tsv = TSV.open(File.open(filename), :sep => /\s+/, :type => :double)
|
16
|
+
Log.tsv tsv
|
17
|
+
Log.tsv tsv.reorder("ValueA", nil, :zipped => true)
|
16
18
|
assert_equal ["A", "AA", "a", "aa"].sort, tsv.reorder("ValueA", nil, :zipped => true).keys.sort
|
17
19
|
end
|
18
20
|
end
|
19
21
|
|
20
22
|
|
21
|
-
def
|
23
|
+
def _test_through
|
22
24
|
content =<<-EOF
|
23
25
|
#Id ValueA ValueB OtherID
|
24
26
|
row1 a|aa|aaa b Id1|Id2
|
@@ -37,7 +39,7 @@ row3 a C Id4
|
|
37
39
|
end
|
38
40
|
end
|
39
41
|
|
40
|
-
def
|
42
|
+
def _test_reorder_simple
|
41
43
|
content =<<-EOF
|
42
44
|
#Id ValueA ValueB OtherID
|
43
45
|
row1 a|aa|aaa b Id1|Id2
|
@@ -59,7 +61,7 @@ row3 a C Id4
|
|
59
61
|
end
|
60
62
|
end
|
61
63
|
|
62
|
-
def
|
64
|
+
def _test_reorder_remove_field
|
63
65
|
content =<<-EOF
|
64
66
|
#Id ValueA ValueB OtherID
|
65
67
|
row1 a|aa|aaa b Id1|Id2
|
@@ -81,7 +83,7 @@ row3 a C Id4
|
|
81
83
|
end
|
82
84
|
end
|
83
85
|
|
84
|
-
def
|
86
|
+
def _test_slice
|
85
87
|
content =<<-EOF
|
86
88
|
#ID ValueA ValueB Comment
|
87
89
|
row1 a b c
|
@@ -94,7 +96,7 @@ row2 A B C
|
|
94
96
|
end
|
95
97
|
end
|
96
98
|
|
97
|
-
def
|
99
|
+
def _test_select
|
98
100
|
content =<<-EOF
|
99
101
|
#Id ValueA ValueB OtherID
|
100
102
|
row1 a|aa|aaa b Id1|Id2
|
@@ -132,7 +134,7 @@ row3 a C Id4
|
|
132
134
|
end
|
133
135
|
end
|
134
136
|
|
135
|
-
def
|
137
|
+
def _test_select_invert
|
136
138
|
content =<<-EOF
|
137
139
|
#Id ValueA ValueB OtherID
|
138
140
|
row1 a|aa|aaa b Id1|Id2
|
@@ -163,7 +165,7 @@ row3 a C Id4
|
|
163
165
|
end
|
164
166
|
end
|
165
167
|
|
166
|
-
def
|
168
|
+
def _test_process
|
167
169
|
content =<<-EOF
|
168
170
|
#Id ValueA ValueB OtherID
|
169
171
|
row1 a|aa|aaa b Id1|Id2
|
@@ -182,7 +184,7 @@ row3 a C Id4
|
|
182
184
|
end
|
183
185
|
end
|
184
186
|
|
185
|
-
def
|
187
|
+
def _test_add_field
|
186
188
|
content =<<-EOF
|
187
189
|
#Id LetterValue:ValueA LetterValue:ValueB OtherID
|
188
190
|
row1 a|aa|aaa b Id1|Id2
|
@@ -200,7 +202,7 @@ row3 a C Id4
|
|
200
202
|
end
|
201
203
|
end
|
202
204
|
|
203
|
-
def
|
205
|
+
def _test_add_field_double_with_list_result
|
204
206
|
content =<<-EOF
|
205
207
|
#Id LetterValue:ValueA LetterValue:ValueB OtherID
|
206
208
|
row1 a|aa|aaa b Id1|Id2
|
@@ -219,7 +221,7 @@ row3 a C Id4
|
|
219
221
|
end
|
220
222
|
end
|
221
223
|
|
222
|
-
def
|
224
|
+
def _test_through_headless
|
223
225
|
content =<<-EOF
|
224
226
|
row1 a|aa|aaa b Id1|Id2
|
225
227
|
row2 A B Id3
|
@@ -229,17 +231,17 @@ row3 a C Id4
|
|
229
231
|
TmpFile.with_file(content) do |filename|
|
230
232
|
tsv = TSV.open(filename, :sep => /\s+/)
|
231
233
|
|
232
|
-
|
234
|
+
_test = false
|
233
235
|
tsv.through do
|
234
|
-
|
236
|
+
_test = true
|
235
237
|
end
|
236
|
-
assert
|
238
|
+
assert _test
|
237
239
|
|
238
240
|
end
|
239
241
|
|
240
242
|
end
|
241
243
|
|
242
|
-
def
|
244
|
+
def _test_reorder_flat
|
243
245
|
content =<<-EOF
|
244
246
|
#Id ValueA
|
245
247
|
row1 a aa aaa
|
@@ -255,7 +257,7 @@ row3 a
|
|
255
257
|
end
|
256
258
|
end
|
257
259
|
|
258
|
-
def
|
260
|
+
def _test_transpose
|
259
261
|
content =<<-EOF
|
260
262
|
#: :type=:list
|
261
263
|
#Row vA vB vID
|
@@ -273,7 +275,7 @@ row3 a C Id4
|
|
273
275
|
|
274
276
|
end
|
275
277
|
|
276
|
-
def
|
278
|
+
def _test_through_flat
|
277
279
|
content =<<-EOF
|
278
280
|
#: :type=:flat
|
279
281
|
#Row vA
|
data/test/rbbt/util/test_misc.rb
CHANGED
@@ -440,7 +440,7 @@ eum fugiat quo voluptas nulla pariatur?"
|
|
440
440
|
assert_equal "COSMIC", Misc.camel_case("COSMIC")
|
441
441
|
end
|
442
442
|
|
443
|
-
def
|
443
|
+
def _test_texar
|
444
444
|
ppp Misc.html_tag('textarea', "hola\nadios\nagain")
|
445
445
|
end
|
446
446
|
|
@@ -454,4 +454,8 @@ eum fugiat quo voluptas nulla pariatur?"
|
|
454
454
|
puts `ls -l /proc/#{ Process.pid }/fd`
|
455
455
|
end
|
456
456
|
|
457
|
+
def test_snake_case
|
458
|
+
ppp Misc.snake_case("KinaseSARfari")
|
459
|
+
end
|
460
|
+
|
457
461
|
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.15.
|
4
|
+
version: 5.15.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Miguel Vazquez
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-01-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -268,6 +268,7 @@ files:
|
|
268
268
|
- lib/rbbt/workflow/step/run.rb
|
269
269
|
- lib/rbbt/workflow/task.rb
|
270
270
|
- lib/rbbt/workflow/usage.rb
|
271
|
+
- share/Rlib/plot.R
|
271
272
|
- share/Rlib/util.R
|
272
273
|
- share/config.ru
|
273
274
|
- share/install/software/lib/install_helpers
|