wrnap 1.0.1 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/wrnap/etl/infernal.rb +2 -2
- data/lib/wrnap/etl/stockholm.rb +14 -3
- data/lib/wrnap/global/entrez.rb +5 -3
- data/lib/wrnap/global/runner.rb +16 -2
- data/lib/wrnap/graphing/r.rb +23 -40
- data/lib/wrnap/package/base.rb +1 -1
- data/lib/wrnap/package/varna.rb +1 -1
- data/lib/wrnap/package/xbor.rb +1 -1
- data/lib/wrnap/rna/box.rb +20 -2
- data/lib/wrnap/rna/constraints.rb +25 -2
- data/lib/wrnap/rna/context.rb +20 -8
- data/lib/wrnap/rna/extensions.rb +73 -1
- data/lib/wrnap/rna/motifs.rb +28 -21
- data/lib/wrnap/rna/tree.rb +100 -26
- data/lib/wrnap/rna.rb +32 -26
- data/lib/wrnap/version.rb +1 -1
- data/lib/wrnap.rb +9 -8
- data/wrnap.gemspec +10 -8
- metadata +68 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b2cc53a30fd53e8dc635b9a6f0e6b9dfc985eefb
|
4
|
+
data.tar.gz: ce9692b9164e77fac7b6d4e56ed6398500c19e71
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6e5c9b208ddb20f3d9377a40bfa6e5467a35c9012ddd0a0e38bcb47f082de147bd82df8ef7040a9dad2910f87f6bcc18df79b0f187a142f5ba99afa6bcc76d17
|
7
|
+
data.tar.gz: cf74fe53fde6cbdf70a7430d6dee2e56cbbcd12ad64b9a9e6c11a68e279b7a46657ffd2fe1b5d5ed9d813e223016f27479a638b72e8f05537ed1f0762cb22f92
|
data/lib/wrnap/etl/infernal.rb
CHANGED
@@ -7,7 +7,7 @@ module Wrnap
|
|
7
7
|
LOCAL_END = /\*\[\s*\d+\s*\]\*/
|
8
8
|
|
9
9
|
class << self
|
10
|
-
def
|
10
|
+
def load_all(file)
|
11
11
|
output = File.exist?(file) ? File.read(file) : file
|
12
12
|
|
13
13
|
if output =~ /No hits detected that satisfy reporting thresholds/
|
@@ -17,7 +17,7 @@ module Wrnap
|
|
17
17
|
gsub(/^(.*\n)*Hit alignments:\n/, "").
|
18
18
|
gsub(/Internal CM pipeline statistics summary:\n(.*\n)*$/, "").
|
19
19
|
strip.split(?\n).reject(&:empty?).each_slice(10).map { |lines| parse_hit(lines.join(?\n)) }.compact
|
20
|
-
end
|
20
|
+
end.wrnap
|
21
21
|
end
|
22
22
|
|
23
23
|
def parse_hit(output)
|
data/lib/wrnap/etl/stockholm.rb
CHANGED
@@ -4,10 +4,21 @@ module Wrnap
|
|
4
4
|
class << self
|
5
5
|
def load_all(file)
|
6
6
|
entries = Bio::Stockholm::Reader.parse_from_file(file)[0]
|
7
|
-
|
8
|
-
structure = dot_bracket_from_stockholm(entries.gc_features["SS_cons"])
|
7
|
+
structure = consensus_structure_from_file(file)
|
9
8
|
|
10
|
-
|
9
|
+
entries.records.map do |label, record|
|
10
|
+
fit_structure_to_sequence(record.sequence, structure).tap do |rna|
|
11
|
+
rna.comment = if !record.gs_features.nil? && record.gs_features.is_a?(Hash)
|
12
|
+
record.gs_features["AC"].split(/[\/-]/).join(" ")
|
13
|
+
else
|
14
|
+
label.split(/[\/-]/).join(" ")
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end.wrnap
|
18
|
+
end
|
19
|
+
|
20
|
+
def consensus_structure_from_file(file)
|
21
|
+
dot_bracket_from_stockholm(Bio::Stockholm::Reader.parse_from_file(file)[0].gc_features["SS_cons"])
|
11
22
|
end
|
12
23
|
|
13
24
|
def dot_bracket_from_stockholm(structure)
|
data/lib/wrnap/global/entrez.rb
CHANGED
@@ -19,16 +19,18 @@ module Wrnap
|
|
19
19
|
def sequence_from_entrez(id, position, window)
|
20
20
|
Wrnap.debugger { "Retrieving sequence from Entrez: using nuccore DB (id: #{id}, seq_start: #{position + window.min}, seq_stop: #{position + window.max})" }
|
21
21
|
Wrnap.debugger { "> True starting position: #{position} with window #{window.min} to #{window.max}" }
|
22
|
-
|
22
|
+
|
23
23
|
fasta = ::Entrez.EFetch("nuccore", {
|
24
24
|
id: id,
|
25
25
|
seq_start: position + window.min,
|
26
26
|
seq_stop: position + window.max,
|
27
27
|
retmode: :fasta,
|
28
28
|
rettype: :text
|
29
|
-
})
|
29
|
+
})
|
30
|
+
|
31
|
+
Wrnap.debugger { fasta }
|
30
32
|
|
31
|
-
Bio::FastaFormat.new(fasta)
|
33
|
+
Bio::FastaFormat.new(fasta.response.body)
|
32
34
|
end
|
33
35
|
end
|
34
36
|
end
|
data/lib/wrnap/global/runner.rb
CHANGED
@@ -10,6 +10,10 @@ module Wrnap
|
|
10
10
|
def exec_exists?(name)
|
11
11
|
!%x[which RNA#{name.to_s.downcase}].empty? || !%x[which #{name.to_s.downcase}].empty?
|
12
12
|
end
|
13
|
+
|
14
|
+
def exec_name
|
15
|
+
executable_name.respond_to?(:call) ? executable_name[self] : executable_name
|
16
|
+
end
|
13
17
|
|
14
18
|
def run(*data)
|
15
19
|
flags = data.length > 1 && data.last.is_a?(Hash) ? data.pop : {}
|
@@ -40,13 +44,23 @@ module Wrnap
|
|
40
44
|
end
|
41
45
|
|
42
46
|
def pre_run_check
|
43
|
-
if
|
47
|
+
valid_to_run = if self.class.instance_variable_get(:@pre_run_checked)
|
48
|
+
self.class.instance_variable_get(:@valid_to_run)
|
49
|
+
else
|
50
|
+
Wrnap.debugger { "Checking existence of executable %s." % exec_name }
|
51
|
+
self.class.module_eval do
|
52
|
+
@pre_run_checked = true
|
53
|
+
@valid_to_run = !%x[which #{exec_name}].empty?
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
unless valid_to_run
|
44
58
|
raise RuntimeError.new("#{exec_name} is not defined on this machine")
|
45
59
|
end
|
46
60
|
end
|
47
61
|
|
48
62
|
def exec_name
|
49
|
-
|
63
|
+
self.class.exec_name
|
50
64
|
end
|
51
65
|
|
52
66
|
def recursively_merge_flags(flags)
|
data/lib/wrnap/graphing/r.rb
CHANGED
@@ -2,10 +2,10 @@ module Wrnap
|
|
2
2
|
module Graphing
|
3
3
|
module R
|
4
4
|
class << self
|
5
|
-
def graph(&block)
|
5
|
+
def graph(width: 8, height: 6, &block)
|
6
6
|
if const_defined?(:RinRuby)
|
7
7
|
begin
|
8
|
-
(
|
8
|
+
generate_graph(r_instance = RinRuby.new(false), width, height, &block).tap { r_instance.close }
|
9
9
|
rescue RuntimeError => e
|
10
10
|
raise unless e.message == "Unsupported data type on R's end"
|
11
11
|
end
|
@@ -23,11 +23,6 @@ module Wrnap
|
|
23
23
|
y_range = Range.new(y_points.map(&:min).min.floor, y_points.map(&:max).max.ceil)
|
24
24
|
|
25
25
|
graph do |r|
|
26
|
-
r.eval("%s('%s', 6, 6)" % [
|
27
|
-
writing_file?(filename) ? filetype(filename) : "quartz",
|
28
|
-
writing_file?(filename) ? filename : "Graph",
|
29
|
-
])
|
30
|
-
|
31
26
|
r.assign("legend.titles", data.each_with_index.map { |hash, index| hash[:legend] || "Line #{index + 1}" })
|
32
27
|
r.eval("line.colors <- rainbow(%d)" % data.size)
|
33
28
|
r.eval("plot(0, 0, type = 'n', cex = .75, cex.axis = .9, xlab = '', ylab = '', xlim = c(%d, %d), ylim = c(%d, %d))" % [
|
@@ -73,8 +68,6 @@ module Wrnap
|
|
73
68
|
)
|
74
69
|
STR
|
75
70
|
end
|
76
|
-
|
77
|
-
r.eval("dev.off()") if writing_file?(filename)
|
78
71
|
end
|
79
72
|
end
|
80
73
|
|
@@ -115,7 +108,6 @@ module Wrnap
|
|
115
108
|
end
|
116
109
|
end
|
117
110
|
|
118
|
-
|
119
111
|
overlay(
|
120
112
|
formatted_data,
|
121
113
|
title: title,
|
@@ -135,11 +127,6 @@ module Wrnap
|
|
135
127
|
r.assign("histogram.data", data)
|
136
128
|
r.assign("histogram.breaks", breaks)
|
137
129
|
|
138
|
-
r.eval("%s('%s', 6, 6)" % [
|
139
|
-
writing_file?(filename) ? filetype(filename) : "quartz",
|
140
|
-
writing_file?(filename) ? filename : "Graph",
|
141
|
-
])
|
142
|
-
|
143
130
|
r.eval <<-STR
|
144
131
|
hist(
|
145
132
|
histogram.data,
|
@@ -154,8 +141,6 @@ module Wrnap
|
|
154
141
|
STR
|
155
142
|
|
156
143
|
r.eval("abline(v = #{x_arrow}, lty = 'dashed')") if x_arrow
|
157
|
-
|
158
|
-
r.eval("dev.off()") if writing_file?(filename)
|
159
144
|
end
|
160
145
|
end
|
161
146
|
|
@@ -179,26 +164,22 @@ module Wrnap
|
|
179
164
|
x = matrix.x,
|
180
165
|
index1 = F
|
181
166
|
)
|
167
|
+
|
168
|
+
filtered.values <- Filter(function(i) { is.finite(i) & i != 0 }, matrix.x)
|
169
|
+
print(apply(as.matrix(matrix.data), 2, rev))
|
170
|
+
print(c(sort(filtered.values)[2], max(filtered.values)))
|
171
|
+
|
172
|
+
image(
|
173
|
+
x = 1:max(c(dim(matrix.data)[[1]], dim(matrix.data)[[2]])),
|
174
|
+
y = 1:max(c(dim(matrix.data)[[1]], dim(matrix.data)[[2]])),
|
175
|
+
z = as.matrix(matrix.data),
|
176
|
+
col = rev(heat.colors(#{num_colors})),
|
177
|
+
zlim = #{forced_square ? "c(sort(filtered.values)[2], max(filtered.values))" : "c(min(filtered.values), max(filtered.values))"},
|
178
|
+
xlab = "#{x_label} (1-indexed)",
|
179
|
+
ylab = "#{y_label} (1-indexed)"
|
180
|
+
)
|
181
|
+
title(#{expressionify(title || "Matrix Heatmap")})
|
182
182
|
STR
|
183
|
-
|
184
|
-
generate_graph("Heatmap") do
|
185
|
-
<<-STR
|
186
|
-
filtered.values <- Filter(function(i) { is.finite(i) & i != 0 }, matrix.x)
|
187
|
-
print(apply(as.matrix(matrix.data), 2, rev))
|
188
|
-
print(c(sort(filtered.values)[2], max(filtered.values)))
|
189
|
-
|
190
|
-
image(
|
191
|
-
x = 1:max(c(dim(matrix.data)[[1]], dim(matrix.data)[[2]])),
|
192
|
-
y = 1:max(c(dim(matrix.data)[[1]], dim(matrix.data)[[2]])),
|
193
|
-
z = as.matrix(matrix.data),
|
194
|
-
col = rev(heat.colors(#{num_colors})),
|
195
|
-
zlim = #{forced_square ? "c(sort(filtered.values)[2], max(filtered.values))" : "c(min(filtered.values), max(filtered.values))"},
|
196
|
-
xlab = "#{x_label} (1-indexed)",
|
197
|
-
ylab = "#{y_label} (1-indexed)"
|
198
|
-
)
|
199
|
-
title(#{expressionify(title || "Matrix Heatmap")})
|
200
|
-
STR
|
201
|
-
end
|
202
183
|
else
|
203
184
|
puts "Please install the Matrix package for R before using this function."
|
204
185
|
end
|
@@ -207,15 +188,17 @@ module Wrnap
|
|
207
188
|
|
208
189
|
private
|
209
190
|
|
210
|
-
def generate_graph(
|
211
|
-
|
191
|
+
def generate_graph(r, width, height, &block)
|
192
|
+
filename = block.binding.eval("filename")
|
212
193
|
|
213
|
-
r.eval("%s('%s',
|
194
|
+
r.eval("%s('%s', %d, %d)" % [
|
214
195
|
writing_file?(filename) ? filetype(filename) : "quartz",
|
215
196
|
writing_file?(filename) ? filename : "Graph",
|
197
|
+
width,
|
198
|
+
height
|
216
199
|
])
|
217
200
|
|
218
|
-
r
|
201
|
+
yield r
|
219
202
|
|
220
203
|
r.eval("dev.off()") if writing_file?(filename)
|
221
204
|
end
|
data/lib/wrnap/package/base.rb
CHANGED
@@ -10,7 +10,7 @@ module Wrnap
|
|
10
10
|
include Wrnap::Global::Yaml
|
11
11
|
|
12
12
|
class_attribute :executable_name
|
13
|
-
self.executable_name = ->(context) { "RNA#{context.
|
13
|
+
self.executable_name = ->(context) { "RNA#{context.name.split('::').last.underscore}" }
|
14
14
|
|
15
15
|
class_attribute :call_with
|
16
16
|
self.call_with = [:seq]
|
data/lib/wrnap/package/varna.rb
CHANGED
@@ -15,7 +15,7 @@ module Wrnap
|
|
15
15
|
self.quote_flag_params = %w|sequenceDBN structureDBN title|
|
16
16
|
|
17
17
|
def run_command(flags)
|
18
|
-
"java fr.orsay.lri.varna.applications.VARNAcmd %s" % stringify_flags(flags)
|
18
|
+
"java -Djava.awt.headless=true fr.orsay.lri.varna.applications.VARNAcmd %s" % stringify_flags(flags)
|
19
19
|
end
|
20
20
|
end
|
21
21
|
end
|
data/lib/wrnap/package/xbor.rb
CHANGED
@@ -5,7 +5,7 @@ module Wrnap
|
|
5
5
|
E: "/usr/local/bin/rna_turner2004.par"
|
6
6
|
}
|
7
7
|
|
8
|
-
self.executable_name = ->(context) { context.
|
8
|
+
self.executable_name = ->(context) { context.name.demodulize.gsub(/^([A-Z].*)bor$/) { |match| $1.upcase + "bor" } }
|
9
9
|
|
10
10
|
def run_command(flags)
|
11
11
|
file = Tempfile.new("rna")
|
data/lib/wrnap/rna/box.rb
CHANGED
@@ -9,13 +9,19 @@ module Wrnap
|
|
9
9
|
|
10
10
|
class << self
|
11
11
|
def load_all(pattern = "*.fa", &block)
|
12
|
-
new(Dir[File.directory?(pattern) ? pattern + "/*.fa" : pattern].
|
12
|
+
new(Dir[File.directory?(pattern) ? pattern + "/*.fa" : pattern].inject([]) { |array, file| array + RNA.from_fasta(file, &block).rnas })
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
16
|
def initialize(rnas)
|
17
17
|
@rnas = rnas.kind_of?(Array) ? rnas : [rnas]
|
18
18
|
end
|
19
|
+
|
20
|
+
def write_fa!(filename)
|
21
|
+
filename.tap do |filename|
|
22
|
+
File.open(filename, ?w) { |file| file.write(rnas.map(&:formatted_string).join(?\n) + ?\n) }
|
23
|
+
end
|
24
|
+
end
|
19
25
|
|
20
26
|
def pp
|
21
27
|
rnas.each(&:pp) and nil
|
@@ -25,15 +31,27 @@ module Wrnap
|
|
25
31
|
self.class.new(rnas + (arrayish.is_a?(Box) ? arrayish.rnas : arrayish))
|
26
32
|
end
|
27
33
|
|
28
|
-
def_delegators :@rnas, *%i|size length [] []= <<|
|
34
|
+
def_delegators :@rnas, *%i|size length first last [] []= <<|
|
29
35
|
|
30
36
|
def each(&block)
|
37
|
+
return enum_for(:each) unless block_given?
|
31
38
|
rnas.each(&block)
|
32
39
|
end
|
40
|
+
|
41
|
+
def run_in_parallel(method, *args)
|
42
|
+
Wrnap.debug, debug_status = false, Wrnap.debug
|
43
|
+
Parallel.map(self, progress: "Calling %s on %d RNAs" % [method, rnas.size]) { |rna| rna.send(method, *args) }.tap { Wrnap.debug = debug_status }
|
44
|
+
end
|
33
45
|
|
34
46
|
def kind_of?(klass)
|
35
47
|
klass == Array ? true : super
|
36
48
|
end
|
49
|
+
|
50
|
+
def method_missing(name, *args, &block)
|
51
|
+
if (name_str = "#{name}") =~ /^run_\w+$/
|
52
|
+
run_in_parallel(name_str, *args)
|
53
|
+
else super end
|
54
|
+
end
|
37
55
|
|
38
56
|
def inspect
|
39
57
|
"#<Wrnap::Rna::Box with %d RNAs>" % rnas.size
|
@@ -9,6 +9,10 @@ module Wrnap
|
|
9
9
|
def constraint_mask
|
10
10
|
md[:constraint_mask]
|
11
11
|
end
|
12
|
+
|
13
|
+
def show_constraints(&block)
|
14
|
+
ConstraintBox.new(metadata.__rna__).tap { |box| box.instance_eval(&block) }.to_s
|
15
|
+
end
|
12
16
|
|
13
17
|
def build_constraints(&block)
|
14
18
|
meta_rna do |metadata|
|
@@ -23,6 +27,10 @@ module Wrnap
|
|
23
27
|
def initialize(rna)
|
24
28
|
@rna, @constraints = rna, []
|
25
29
|
end
|
30
|
+
|
31
|
+
def n
|
32
|
+
rna.len - 1
|
33
|
+
end
|
26
34
|
|
27
35
|
def between(i, j)
|
28
36
|
Loop.new(i, j)
|
@@ -32,10 +40,25 @@ module Wrnap
|
|
32
40
|
between(i + 1, j - 1)
|
33
41
|
end
|
34
42
|
|
43
|
+
def start_to(i)
|
44
|
+
between(0, i)
|
45
|
+
end
|
46
|
+
|
47
|
+
def end_to(i)
|
48
|
+
between(i, n)
|
49
|
+
end
|
50
|
+
|
51
|
+
def freeze(mask_object)
|
52
|
+
force mask_object
|
53
|
+
prohibit mask_object.unpaired_regions
|
54
|
+
end
|
55
|
+
|
35
56
|
def mask!(mask_object, *args)
|
36
57
|
case mask_object
|
37
|
-
when
|
38
|
-
when
|
58
|
+
when TreeStem then mask_object.preorder_traversal { |node| mask!(node.content, *args) }
|
59
|
+
when Array then mask_object.map { |node| mask!(node, *args) }
|
60
|
+
when Helix then mask_helix!(mask_object, *args)
|
61
|
+
when Loop then mask_loop!(mask_object, symbol: args[0][:symbol])
|
39
62
|
end
|
40
63
|
end
|
41
64
|
|
data/lib/wrnap/rna/context.rb
CHANGED
@@ -1,14 +1,16 @@
|
|
1
1
|
module Wrnap
|
2
2
|
class Rna
|
3
3
|
class Context < Rna
|
4
|
+
extend Forwardable
|
5
|
+
|
4
6
|
attr_reader :accession, :from, :to, :coord_options
|
5
7
|
|
6
8
|
class << self
|
7
9
|
def init_from_entrez(accession, from, to, options = {}, &block)
|
8
10
|
new(
|
9
11
|
accession: accession,
|
10
|
-
from: from,
|
11
|
-
to: to,
|
12
|
+
from: from.to_i,
|
13
|
+
to: to.to_i,
|
12
14
|
options: options,
|
13
15
|
&block
|
14
16
|
)
|
@@ -18,8 +20,8 @@ module Wrnap
|
|
18
20
|
new(
|
19
21
|
sequence: sequence,
|
20
22
|
accession: accession,
|
21
|
-
from: from,
|
22
|
-
to: to,
|
23
|
+
from: from.to_i,
|
24
|
+
to: to.to_i,
|
23
25
|
options: options,
|
24
26
|
&block
|
25
27
|
)
|
@@ -102,6 +104,8 @@ module Wrnap
|
|
102
104
|
end
|
103
105
|
|
104
106
|
alias :seq :sequence
|
107
|
+
|
108
|
+
def_delegator :@raw_sequence, :length, :len
|
105
109
|
|
106
110
|
def extend!(coord_options = {})
|
107
111
|
self.class.init_from_entrez(accession, from, to, coords: coord_options)
|
@@ -126,14 +130,22 @@ module Wrnap
|
|
126
130
|
range
|
127
131
|
end
|
128
132
|
end
|
129
|
-
|
133
|
+
|
130
134
|
def identifier
|
131
|
-
"%s %d %s %d" % [accession,
|
135
|
+
"%s %d %s %d" % [accession, seq_from, plus_strand? ? ?+ : ?-, seq_to]
|
136
|
+
end
|
137
|
+
|
138
|
+
def _id
|
139
|
+
identifier.gsub(/[^A-Z0-9]/, ?_).gsub(/__+/, ?_)
|
132
140
|
end
|
133
141
|
|
134
142
|
def inspect
|
135
|
-
super.
|
143
|
+
if super.match(/Wrnap::(\w+(::)?)+>$/)
|
144
|
+
super.sub(/([\w:]+)>$/) { |_| "%s %s>" % [identifier, $1] }
|
145
|
+
else
|
146
|
+
super
|
147
|
+
end
|
136
148
|
end
|
137
149
|
end
|
138
150
|
end
|
139
|
-
end
|
151
|
+
end
|
data/lib/wrnap/rna/extensions.rb
CHANGED
@@ -39,8 +39,53 @@ module Wrnap
|
|
39
39
|
end
|
40
40
|
|
41
41
|
module InstanceMethods
|
42
|
+
def hamming_distance(other_rna)
|
43
|
+
raise "The two sequences are not the same length" unless len == other_rna.len
|
44
|
+
|
45
|
+
[seq, other_rna.seq].map(&:each_char).map(&:to_a).transpose.select { |array| array.uniq.size > 1 }.count
|
46
|
+
end
|
47
|
+
|
48
|
+
def local_structural_shuffle(dishuffle: false)
|
49
|
+
sequence = " " * len
|
50
|
+
loops, helices = loops_and_helices
|
51
|
+
|
52
|
+
loops.each { |loop| sequence[loop.i..loop.j] = Shuffle.new(loop.in(seq)).send(dishuffle ? :dishuffle : :shuffle) }
|
53
|
+
helices.each do |helix|
|
54
|
+
left_stem, right_stem = if dishuffle
|
55
|
+
Shuffle.new(helix.in(seq)).dishuffle
|
56
|
+
else
|
57
|
+
Shuffle.new(helix.in(seq)).shuffle.map { |array| rand(2).zero? ? array : array.reverse }
|
58
|
+
end.transpose.map(&:join)
|
59
|
+
|
60
|
+
sequence[helix.i..helix.k] = left_stem
|
61
|
+
sequence[helix.l..helix.j] = right_stem.reverse
|
62
|
+
end
|
63
|
+
|
64
|
+
Rna.init_from_string(sequence, str)
|
65
|
+
end
|
66
|
+
|
67
|
+
def local_structural_dishuffle
|
68
|
+
local_structural_shuffle(dishuffle: true)
|
69
|
+
end
|
70
|
+
|
71
|
+
def global_structural_shuffle
|
72
|
+
sequence = " " * len
|
73
|
+
loops, helices = loops_and_helices
|
74
|
+
shuffled_loops = Shuffle.new(loops.map { |loop| loop.in(seq) }.join.split(//)).shuffle
|
75
|
+
shuffled_helices = helices.map { |helix| helix.in(seq) }.inject(&:+).shuffle.map { |array| rand(2).zero? ? array : array.reverse }
|
76
|
+
|
77
|
+
loops.each { |loop| sequence[loop.i..loop.j] = shuffled_loops.shift(loop.length).join }
|
78
|
+
helices.each do |helix|
|
79
|
+
left_stem, right_stem = shuffled_helices.shift(helix.length).transpose.map(&:join)
|
80
|
+
sequence[helix.i..helix.k] = left_stem
|
81
|
+
sequence[helix.l..helix.j] = right_stem.reverse
|
82
|
+
end
|
83
|
+
|
84
|
+
Rna.init_from_string(sequence, str)
|
85
|
+
end
|
86
|
+
|
42
87
|
def dishuffle
|
43
|
-
self.class.shuffle(sequence, 2)
|
88
|
+
Rna.init_from_string(self.class.shuffle(sequence, 2))
|
44
89
|
end
|
45
90
|
|
46
91
|
def gc_content
|
@@ -56,6 +101,33 @@ module Wrnap
|
|
56
101
|
def max_bp_distance(structure)
|
57
102
|
base_pairs(structure).count + ((structure.length - 3) / 2.0).floor
|
58
103
|
end
|
104
|
+
|
105
|
+
def loops_and_helices(structure)
|
106
|
+
[loop_regions(structure), collapsed_helices(structure, lonely_bp: true)]
|
107
|
+
end
|
108
|
+
|
109
|
+
def loop_regions(structure)
|
110
|
+
[structure.split(//), (0...structure.length).to_a].transpose.select { |char, _| char == ?. }.inject([]) do |array, (_, index)|
|
111
|
+
array.tap do
|
112
|
+
matching_loop = array.map(&:last).each_with_index.find { |end_of_loop, _| end_of_loop + 1 == index }
|
113
|
+
matching_loop ? array[matching_loop[-1]][-1] += 1 : array << [index, index]
|
114
|
+
end
|
115
|
+
end.map { |loop_indices| Loop.new(*loop_indices) }
|
116
|
+
end
|
117
|
+
|
118
|
+
def helices(structure)
|
119
|
+
unless (array = base_pairs(structure).sort_by(&:first).map(&:to_a)).empty?
|
120
|
+
array[1..-1].inject([[array.first]]) do |bins, (i, j)|
|
121
|
+
bins.tap { bins[-1][-1] == [i - 1, j + 1] ? bins[-1] << [i, j] : bins << [[i, j]] }
|
122
|
+
end
|
123
|
+
else
|
124
|
+
[]
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
def collapsed_helices(structure, lonely_bp: false)
|
129
|
+
helices(structure).map { |((i, j), *rest)| Helix.new(i, j, rest.length + 1) }.select { |helix| lonely_bp ? helix : helix.length > 1 }
|
130
|
+
end
|
59
131
|
|
60
132
|
def base_pairs(structure)
|
61
133
|
get_pairings(structure).each_with_index.inject(Set.new) do |set, (j, i)|
|
data/lib/wrnap/rna/motifs.rb
CHANGED
@@ -1,23 +1,5 @@
|
|
1
1
|
module Wrnap
|
2
|
-
class Rna
|
3
|
-
module Motifs
|
4
|
-
def helices
|
5
|
-
array = base_pairs.sort_by(&:first).map(&:to_a)
|
6
|
-
|
7
|
-
unless array.empty?
|
8
|
-
array[1..-1].inject([[array.first]]) do |bins, (i, j)|
|
9
|
-
bins.tap { bins[-1][-1] == [i - 1, j + 1] ? bins[-1] << [i, j] : bins << [[i, j]] }
|
10
|
-
end
|
11
|
-
else
|
12
|
-
[]
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
def collapsed_helices(lonely_bp: false)
|
17
|
-
helices.map { |((i, j), *rest)| Helix.new(i, j, rest.length + 1) }.select { |helix| lonely_bp ? helix : helix.length > 1 }
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
2
|
+
class Rna
|
21
3
|
class Helix
|
22
4
|
attr_reader :i, :j, :length
|
23
5
|
|
@@ -28,9 +10,26 @@ module Wrnap
|
|
28
10
|
def k; i + length - 1; end
|
29
11
|
def l; j - length + 1; end
|
30
12
|
|
13
|
+
def in(sequence)
|
14
|
+
(0...length).map do |stem_position|
|
15
|
+
[sequence[i + stem_position], sequence[j - stem_position]]
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
31
19
|
def to_loops
|
32
20
|
[Loop.new(i, k), Loop.new(l, j)]
|
33
21
|
end
|
22
|
+
|
23
|
+
def apply!(structure)
|
24
|
+
structure.tap do
|
25
|
+
structure[i, length] = ?( * length
|
26
|
+
structure[l, length] = ?) * length
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def merge!(helix)
|
31
|
+
@length = helix.k - i + 1
|
32
|
+
end
|
34
33
|
|
35
34
|
def reindex!(rna)
|
36
35
|
tap do
|
@@ -45,7 +44,7 @@ module Wrnap
|
|
45
44
|
end
|
46
45
|
|
47
46
|
def name
|
48
|
-
"(%d..%d, %d..%d)" % [i, k, l, j]
|
47
|
+
"(%d..%d, %d..%d [%d])" % [i, k, l, j, length]
|
49
48
|
end
|
50
49
|
|
51
50
|
def inspect
|
@@ -60,8 +59,16 @@ module Wrnap
|
|
60
59
|
@i, @j = i, j
|
61
60
|
end
|
62
61
|
|
62
|
+
def in(sequence)
|
63
|
+
sequence[i..j]
|
64
|
+
end
|
65
|
+
|
66
|
+
def length
|
67
|
+
j - i + 1
|
68
|
+
end
|
69
|
+
|
63
70
|
def name
|
64
|
-
"(%d, %d)" % [i, j]
|
71
|
+
"(%d, %d [%d])" % [i, j, length]
|
65
72
|
end
|
66
73
|
|
67
74
|
def inspect
|
data/lib/wrnap/rna/tree.rb
CHANGED
@@ -14,19 +14,84 @@ module Wrnap
|
|
14
14
|
extend Forwardable
|
15
15
|
include Enumerable
|
16
16
|
|
17
|
-
STEM_NOTATION_REGEX = /^
|
17
|
+
STEM_NOTATION_REGEX = /^[pt]_?(\d+_)*\d+(_?[ijkl])?$/
|
18
18
|
|
19
|
-
def_delegators :@content, :i, :j
|
19
|
+
def_delegators :@content, :i, :j, :k, :l
|
20
20
|
def_delegator :@content, :length, :stem_length
|
21
|
+
|
22
|
+
def unpaired_regions
|
23
|
+
Wrnap.debugger { "Collecting unpaired regions for %s" % [root.content.name] }
|
24
|
+
|
25
|
+
postorder_traversal.inject([]) do |array, node|
|
26
|
+
array.tap do
|
27
|
+
if node.is_leaf?
|
28
|
+
array << Loop.new(node.k + 1, node.l - 1)
|
29
|
+
end
|
30
|
+
|
31
|
+
if node != self
|
32
|
+
if node.is_only_child?
|
33
|
+
Wrnap.debugger { "Interior node: %s, parent: %s" % [node.content.inspect, node.parent.content.inspect] }
|
34
|
+
|
35
|
+
if node.i - node.parent.k > 0
|
36
|
+
Wrnap.debugger { "Left bulge." }
|
37
|
+
array << Loop.new(node.parent.k + 1, node.i - 1)
|
38
|
+
end
|
39
|
+
|
40
|
+
if node.parent.l - node.j > 0
|
41
|
+
Wrnap.debugger { "Right bulge." }
|
42
|
+
array << Loop.new(node.j + 1, node.parent.l - 1)
|
43
|
+
end
|
44
|
+
else
|
45
|
+
node_index = node.parent.children.each_with_index.find { |child, _| child == node }.last
|
46
|
+
|
47
|
+
if node.is_last_sibling?
|
48
|
+
Wrnap.debugger { "Leaf node, last child: %s" % node.content.inspect }
|
49
|
+
array << Loop.new(node.j + 1, node.parent.l - 1)
|
50
|
+
else
|
51
|
+
if node.is_first_sibling?
|
52
|
+
Wrnap.debugger { "Leaf node, first child: %s" % node.content.inspect }
|
53
|
+
array << Loop.new(node.parent.k + 1, node.i - 1)
|
54
|
+
end
|
55
|
+
|
56
|
+
Wrnap.debugger { "Connecting node, middle child: %s" % node.content.inspect }
|
57
|
+
alexa = node.siblings[node_index]
|
58
|
+
array << Loop.new(node.j + 1, alexa.i - 1)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def detached_copy
|
67
|
+
self.class.new(@name, @content ? @content.clone : nil)
|
68
|
+
end
|
69
|
+
|
70
|
+
def preorder_traversal(&block)
|
71
|
+
return enum_for(:preorder_traversal) unless block_given?
|
72
|
+
yield self
|
73
|
+
children.map { |child| child.preorder_traversal(&block) }
|
74
|
+
end
|
75
|
+
|
76
|
+
def postorder_traversal(&block)
|
77
|
+
return enum_for(:postorder_traversal) unless block_given?
|
78
|
+
children.each { |child| child.postorder_traversal(&block) }
|
79
|
+
yield self
|
80
|
+
end
|
21
81
|
|
22
82
|
def method_missing(name, *args, &block)
|
23
|
-
if name.to_s =~ STEM_NOTATION_REGEX
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
83
|
+
if (method_name = name.to_s) =~ STEM_NOTATION_REGEX
|
84
|
+
call_type = method_name[0]
|
85
|
+
indices = method_name.gsub(/\D+/, ?_).split(?_).reject(&:empty?).map(&:to_i)
|
86
|
+
helix_index = method_name.match(/([ijkl])$/) ? $1 : ""
|
87
|
+
|
88
|
+
if indices.size > 1 && child = children[indices[0] - 1]
|
89
|
+
child.send(call_type + indices[1..-1].join(?_) + helix_index)
|
90
|
+
elsif child = children[indices[0] - 1]
|
91
|
+
case call_type
|
92
|
+
when ?p then helix_index.empty? ? child.content : child.send(helix_index)
|
93
|
+
when ?t then child
|
94
|
+
end
|
30
95
|
end
|
31
96
|
else super end
|
32
97
|
end
|
@@ -85,14 +150,35 @@ module Wrnap
|
|
85
150
|
def coalesce!
|
86
151
|
tap { merge_interior_loops! }
|
87
152
|
end
|
153
|
+
|
154
|
+
def fuse
|
155
|
+
self.class.new(rna, root.dup).tap { |tree| tree.extend_interior_loops! }
|
156
|
+
end
|
88
157
|
|
158
|
+
def fuse!
|
159
|
+
tap { extend_interior_loops! }
|
160
|
+
end
|
161
|
+
|
162
|
+
def extend_interior_loops!
|
163
|
+
handle_interior_loops! do |node, child|
|
164
|
+
node.content.merge!(child.content)
|
165
|
+
child.remove_from_parent!
|
166
|
+
child.children.each { |grandchild| node.add(grandchild) }
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
89
170
|
def merge_interior_loops!
|
171
|
+
handle_interior_loops! do |node, child|
|
172
|
+
node.parent.add(child)
|
173
|
+
node.remove_from_parent!
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
def handle_interior_loops!(&block)
|
90
178
|
root.tap do
|
91
|
-
|
92
|
-
if node.children.count == 1 && !node.is_root?
|
93
|
-
|
94
|
-
node.parent.add(child)
|
95
|
-
node.remove_from_parent!
|
179
|
+
root.postorder_traversal do |node|
|
180
|
+
if node.children.count == 1 && !node.is_root?
|
181
|
+
yield(node, node.children.first)
|
96
182
|
end
|
97
183
|
end
|
98
184
|
|
@@ -119,18 +205,6 @@ module Wrnap
|
|
119
205
|
root.send(name, *args, &block)
|
120
206
|
else super end
|
121
207
|
end
|
122
|
-
|
123
|
-
class << self
|
124
|
-
def preorder_traversal(node, &block)
|
125
|
-
node.children.map { |child| preorder_traversal(child, &block) }
|
126
|
-
yield node
|
127
|
-
end
|
128
|
-
|
129
|
-
def postorder_traversal(node, &block)
|
130
|
-
node.children.map { |child| postorder_traversal(child, &block) }
|
131
|
-
yield node
|
132
|
-
end
|
133
|
-
end
|
134
208
|
end
|
135
209
|
end
|
136
210
|
end
|
data/lib/wrnap/rna.rb
CHANGED
@@ -5,7 +5,6 @@ module Wrnap
|
|
5
5
|
include Wrnap::Rna::Extensions
|
6
6
|
include Wrnap::Rna::Wrnapper
|
7
7
|
include Wrnap::Rna::Metadata
|
8
|
-
include Wrnap::Rna::Motifs
|
9
8
|
include Wrnap::Rna::TreeFunctions
|
10
9
|
include Wrnap::Rna::Constraints
|
11
10
|
|
@@ -44,12 +43,19 @@ module Wrnap
|
|
44
43
|
comment = File.basename(string, string.include?(?.) ? ".%s" % string.split(?.)[-1] : "")
|
45
44
|
string = File.read(string).chomp
|
46
45
|
end
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
46
|
+
|
47
|
+
if string.count(?>) > 1
|
48
|
+
string.split(/>/).reject(&:empty?).map do |rna_string|
|
49
|
+
rna_data = rna_string.split(?\n)
|
50
|
+
init_from_string(*rna_data[1..-1]).copy_name_from(rna_data[0])
|
51
|
+
end.wrnap
|
52
|
+
else
|
53
|
+
init_from_string(*string.split(/\n/).reject { |line| line.start_with?(">") }[0, 3], &block).tap do |rna|
|
54
|
+
if (line = string.split(/\n/).first).start_with?(">") && !(file_comment = line.gsub(/^>\s*/, "")).empty?
|
55
|
+
rna.comment = file_comment
|
56
|
+
elsif comment
|
57
|
+
rna.comment = comment
|
58
|
+
end
|
53
59
|
end
|
54
60
|
end
|
55
61
|
end
|
@@ -62,8 +68,8 @@ module Wrnap
|
|
62
68
|
# This happens when you call a Wrnap library function with the output of something like Wrnap::Fold.run(...).mfe
|
63
69
|
new(
|
64
70
|
sequence: rna.sequence,
|
65
|
-
|
66
|
-
|
71
|
+
structure: rna.structure,
|
72
|
+
second_structure: rna.second_structure,
|
67
73
|
comment: rna.comment,
|
68
74
|
&block
|
69
75
|
)
|
@@ -111,8 +117,8 @@ module Wrnap
|
|
111
117
|
|
112
118
|
def_delegator :@sequence, :length, :len
|
113
119
|
|
114
|
-
def copy_name_from(
|
115
|
-
tap { @comment =
|
120
|
+
def copy_name_from(nameish)
|
121
|
+
tap { @comment = nameish.is_a?(String) ? nameish : nameish.name }
|
116
122
|
end
|
117
123
|
|
118
124
|
def empty_structure
|
@@ -142,15 +148,19 @@ module Wrnap
|
|
142
148
|
end
|
143
149
|
|
144
150
|
alias :two_str :two_structures
|
151
|
+
|
152
|
+
def formatted_string
|
153
|
+
[
|
154
|
+
(">%s" % name if name),
|
155
|
+
("%s" % seq if seq),
|
156
|
+
("%s" % str_1 if str_1),
|
157
|
+
("%s" % str_2 if str_2)
|
158
|
+
].compact.join(?\n)
|
159
|
+
end
|
145
160
|
|
146
161
|
def write_fa!(filename)
|
147
162
|
filename.tap do |filename|
|
148
|
-
File.open(filename, ?w)
|
149
|
-
file.write("> %s\n" % name) if name
|
150
|
-
file.write("%s\n" % seq) if seq
|
151
|
-
file.write("%s\n" % str_1) if str_1
|
152
|
-
file.write("%s\n" % str_2) if str_2
|
153
|
-
end
|
163
|
+
File.open(filename, ?w) { |file| file.write(formatted_string) }
|
154
164
|
end
|
155
165
|
end
|
156
166
|
|
@@ -177,18 +187,14 @@ module Wrnap
|
|
177
187
|
end
|
178
188
|
|
179
189
|
def pp
|
180
|
-
puts(
|
181
|
-
puts("%s" % seq) if seq
|
182
|
-
puts("%s" % str_1) if str_1
|
183
|
-
puts("%s" % str_2) if str_2
|
184
|
-
puts("%s" % meta.inspect) if meta
|
190
|
+
puts(formatted_string)
|
185
191
|
end
|
186
|
-
|
192
|
+
|
187
193
|
def inspect
|
188
194
|
"#<RNA: %s>" % [
|
189
|
-
("#{seq[0, 20] + (len > 20 ? '... [%d]' % len
|
190
|
-
("#{str_1[0, 20] + (str_1.length > 20 ? ' [%d]' %
|
191
|
-
("#{str_2[0, 20] + (str_2.length > 20 ? ' [%d]' %
|
195
|
+
("#{seq[0, 20] + (len > 20 ? '... [%d]' % len : '')}" if seq && !seq.empty?),
|
196
|
+
("#{str_1[0, 20] + (str_1.length > 20 ? ' [%d]' % str_1.length : '')}" if str_1 && !str_1.empty?),
|
197
|
+
("#{str_2[0, 20] + (str_2.length > 20 ? ' [%d]' % str_2.length : '')}" if str_2 && !str_1.empty?),
|
192
198
|
(md.inspect unless md.nil? || md.empty?),
|
193
199
|
(name ? name : "#{self.class.name}")
|
194
200
|
].compact.join(", ")
|
data/lib/wrnap/version.rb
CHANGED
data/lib/wrnap.rb
CHANGED
@@ -1,16 +1,17 @@
|
|
1
|
-
require "
|
1
|
+
require "active_support/core_ext/class"
|
2
|
+
require "active_support/inflector"
|
2
3
|
require "benchmark"
|
3
|
-
require "set"
|
4
|
-
require "tree"
|
5
|
-
require "shuffle"
|
6
|
-
require "tempfile"
|
7
4
|
require "bigdecimal"
|
8
|
-
require "rroc"
|
9
5
|
require "bio"
|
10
6
|
require "bio-stockholm"
|
11
7
|
require "entrez"
|
12
|
-
require "
|
13
|
-
require "
|
8
|
+
require "parallel"
|
9
|
+
require "rroc"
|
10
|
+
require "set"
|
11
|
+
require "shuffle"
|
12
|
+
require "tempfile"
|
13
|
+
require "tree"
|
14
|
+
require "yaml"
|
14
15
|
|
15
16
|
unless %x[which R].empty?
|
16
17
|
require "rinruby"
|
data/wrnap.gemspec
CHANGED
@@ -23,12 +23,14 @@ Gem::Specification.new do |spec|
|
|
23
23
|
spec.add_development_dependency "bundler", "~> 1.6"
|
24
24
|
spec.add_development_dependency "rake"
|
25
25
|
|
26
|
-
spec.add_runtime_dependency "activesupport",
|
27
|
-
spec.add_runtime_dependency "
|
28
|
-
spec.add_runtime_dependency "
|
29
|
-
spec.add_runtime_dependency "
|
30
|
-
spec.add_runtime_dependency "
|
31
|
-
spec.add_runtime_dependency "
|
32
|
-
spec.add_runtime_dependency "
|
33
|
-
spec.add_runtime_dependency "
|
26
|
+
spec.add_runtime_dependency "activesupport", "~> 4.0"
|
27
|
+
spec.add_runtime_dependency "bio", "~> 1.4"
|
28
|
+
spec.add_runtime_dependency "bio-stockholm", "~> 0.0.1"
|
29
|
+
spec.add_runtime_dependency "entrez", "~> 0.5"
|
30
|
+
spec.add_runtime_dependency "parallel", "~> 1.3", ">= 1.3.2"
|
31
|
+
spec.add_runtime_dependency "rinruby", "~> 2.0"
|
32
|
+
spec.add_runtime_dependency "rroc", "~> 0.1"
|
33
|
+
spec.add_runtime_dependency "ruby-progressbar", "~> 1.5", ">= 1.5.1"
|
34
|
+
spec.add_runtime_dependency "rubytree", "~> 0.9"
|
35
|
+
spec.add_runtime_dependency "shuffle", "~> 1.0", ">= 1.0.1"
|
34
36
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wrnap
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Evan Senter
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-10-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -53,89 +53,115 @@ dependencies:
|
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '4.0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: bio
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
61
|
+
version: '1.4'
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
68
|
+
version: '1.4'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: bio-stockholm
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version:
|
75
|
+
version: 0.0.1
|
76
76
|
type: :runtime
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version:
|
82
|
+
version: 0.0.1
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
84
|
+
name: entrez
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: '0.
|
89
|
+
version: '0.5'
|
90
90
|
type: :runtime
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: '0.
|
96
|
+
version: '0.5'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
|
-
name:
|
98
|
+
name: parallel
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
101
|
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: '1.
|
103
|
+
version: '1.3'
|
104
|
+
- - ">="
|
105
|
+
- !ruby/object:Gem::Version
|
106
|
+
version: 1.3.2
|
104
107
|
type: :runtime
|
105
108
|
prerelease: false
|
106
109
|
version_requirements: !ruby/object:Gem::Requirement
|
107
110
|
requirements:
|
108
111
|
- - "~>"
|
109
112
|
- !ruby/object:Gem::Version
|
110
|
-
version: '1.
|
113
|
+
version: '1.3'
|
114
|
+
- - ">="
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: 1.3.2
|
111
117
|
- !ruby/object:Gem::Dependency
|
112
|
-
name:
|
118
|
+
name: rinruby
|
113
119
|
requirement: !ruby/object:Gem::Requirement
|
114
120
|
requirements:
|
115
121
|
- - "~>"
|
116
122
|
- !ruby/object:Gem::Version
|
117
|
-
version:
|
123
|
+
version: '2.0'
|
118
124
|
type: :runtime
|
119
125
|
prerelease: false
|
120
126
|
version_requirements: !ruby/object:Gem::Requirement
|
121
127
|
requirements:
|
122
128
|
- - "~>"
|
123
129
|
- !ruby/object:Gem::Version
|
124
|
-
version:
|
130
|
+
version: '2.0'
|
125
131
|
- !ruby/object:Gem::Dependency
|
126
|
-
name:
|
132
|
+
name: rroc
|
127
133
|
requirement: !ruby/object:Gem::Requirement
|
128
134
|
requirements:
|
129
135
|
- - "~>"
|
130
136
|
- !ruby/object:Gem::Version
|
131
|
-
version: '0.
|
137
|
+
version: '0.1'
|
132
138
|
type: :runtime
|
133
139
|
prerelease: false
|
134
140
|
version_requirements: !ruby/object:Gem::Requirement
|
135
141
|
requirements:
|
136
142
|
- - "~>"
|
137
143
|
- !ruby/object:Gem::Version
|
138
|
-
version: '0.
|
144
|
+
version: '0.1'
|
145
|
+
- !ruby/object:Gem::Dependency
|
146
|
+
name: ruby-progressbar
|
147
|
+
requirement: !ruby/object:Gem::Requirement
|
148
|
+
requirements:
|
149
|
+
- - "~>"
|
150
|
+
- !ruby/object:Gem::Version
|
151
|
+
version: '1.5'
|
152
|
+
- - ">="
|
153
|
+
- !ruby/object:Gem::Version
|
154
|
+
version: 1.5.1
|
155
|
+
type: :runtime
|
156
|
+
prerelease: false
|
157
|
+
version_requirements: !ruby/object:Gem::Requirement
|
158
|
+
requirements:
|
159
|
+
- - "~>"
|
160
|
+
- !ruby/object:Gem::Version
|
161
|
+
version: '1.5'
|
162
|
+
- - ">="
|
163
|
+
- !ruby/object:Gem::Version
|
164
|
+
version: 1.5.1
|
139
165
|
- !ruby/object:Gem::Dependency
|
140
166
|
name: rubytree
|
141
167
|
requirement: !ruby/object:Gem::Requirement
|
@@ -150,6 +176,26 @@ dependencies:
|
|
150
176
|
- - "~>"
|
151
177
|
- !ruby/object:Gem::Version
|
152
178
|
version: '0.9'
|
179
|
+
- !ruby/object:Gem::Dependency
|
180
|
+
name: shuffle
|
181
|
+
requirement: !ruby/object:Gem::Requirement
|
182
|
+
requirements:
|
183
|
+
- - "~>"
|
184
|
+
- !ruby/object:Gem::Version
|
185
|
+
version: '1.0'
|
186
|
+
- - ">="
|
187
|
+
- !ruby/object:Gem::Version
|
188
|
+
version: 1.0.1
|
189
|
+
type: :runtime
|
190
|
+
prerelease: false
|
191
|
+
version_requirements: !ruby/object:Gem::Requirement
|
192
|
+
requirements:
|
193
|
+
- - "~>"
|
194
|
+
- !ruby/object:Gem::Version
|
195
|
+
version: '1.0'
|
196
|
+
- - ">="
|
197
|
+
- !ruby/object:Gem::Version
|
198
|
+
version: 1.0.1
|
153
199
|
description: ''
|
154
200
|
email:
|
155
201
|
- evansenter@gmail.com
|
@@ -226,8 +272,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
226
272
|
version: '0'
|
227
273
|
requirements: []
|
228
274
|
rubyforge_project:
|
229
|
-
rubygems_version: 2.
|
275
|
+
rubygems_version: 2.4.2
|
230
276
|
signing_key:
|
231
277
|
specification_version: 4
|
232
278
|
summary: A comprehensive wrapper (wRNApper) for various RNA CLI programs.
|
233
279
|
test_files: []
|
280
|
+
has_rdoc:
|