vienna_rna 0.0.2 → 0.0.4
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.
- data/lib/modules/base.rb +33 -8
- data/lib/modules/batch.rb +26 -1
- data/lib/modules/fold.rb +15 -14
- data/lib/modules/heat.rb +13 -0
- data/lib/modules/rnabor.rb +31 -0
- data/lib/modules/subopt.rb +2 -4
- data/lib/modules/utils.rb +16 -0
- data/lib/vienna_rna.rb +1 -1
- metadata +22 -8
data/lib/modules/base.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module ViennaRna
|
2
2
|
class Base
|
3
|
-
|
3
|
+
class_attribute :executable_name
|
4
4
|
|
5
5
|
class << self
|
6
6
|
def method_added(name)
|
@@ -17,15 +17,34 @@ module ViennaRna
|
|
17
17
|
def exec_exists?(name)
|
18
18
|
!%x[which rna#{name.to_s.downcase}].empty?
|
19
19
|
end
|
20
|
+
|
21
|
+
def run(data, flags = {})
|
22
|
+
new(data).run(flags)
|
23
|
+
end
|
24
|
+
|
25
|
+
def batch(fastas = [])
|
26
|
+
ViennaRna::Batch.new(self, fastas).tap do |batch|
|
27
|
+
if const_defined?(:Batch)
|
28
|
+
@@me = self
|
29
|
+
|
30
|
+
batch.singleton_class.class_eval { include @@me.const_get(:Batch) }
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
20
34
|
end
|
21
35
|
|
22
|
-
attr_reader :fasta
|
36
|
+
attr_reader :fasta, :response
|
23
37
|
|
24
38
|
def exec_name
|
25
|
-
|
39
|
+
executable_name || "rna#{self.class.name.split('::').last.underscore}"
|
40
|
+
end
|
41
|
+
|
42
|
+
def exec_sequence_format
|
43
|
+
fasta.seq
|
26
44
|
end
|
27
45
|
|
28
46
|
def initialize(data)
|
47
|
+
# Doesn't support structures on the third line yet.
|
29
48
|
@fasta = case data
|
30
49
|
when Bio::FastaFormat then data
|
31
50
|
when String then Bio::FastaFormat.new(data.split(/\n/).length > 1 ? data : ">\n%s" % data)
|
@@ -33,9 +52,11 @@ module ViennaRna
|
|
33
52
|
end
|
34
53
|
|
35
54
|
def run_with_hooks(flags = {})
|
36
|
-
|
37
|
-
|
38
|
-
|
55
|
+
tap do
|
56
|
+
pre_run_check unless respond_to?(:run_command)
|
57
|
+
@response = run_without_hooks(flags)
|
58
|
+
post_process if respond_to?(:post_process)
|
59
|
+
end
|
39
60
|
end
|
40
61
|
|
41
62
|
def pre_run_check
|
@@ -45,11 +66,15 @@ module ViennaRna
|
|
45
66
|
end
|
46
67
|
|
47
68
|
def stringify_flags(flags)
|
48
|
-
flags.inject("") { |string, flag| (string + (" -%s %s" % flag)).strip }
|
69
|
+
flags.inject("") { |string, (flag, value)| (string + (value == :empty ? " -%s" % flag : " -%s %s" % [flag, value])).strip }
|
49
70
|
end
|
50
71
|
|
51
72
|
def run(flags = {})
|
52
|
-
|
73
|
+
if respond_to?(:run_command)
|
74
|
+
%x[#{method(:run_command).arity.zero? ? run_command : run_command(flags)}]
|
75
|
+
else
|
76
|
+
%x[echo #{exec_sequence_format} | #{exec_name} #{stringify_flags(flags)}]
|
77
|
+
end
|
53
78
|
end
|
54
79
|
end
|
55
80
|
end
|
data/lib/modules/batch.rb
CHANGED
@@ -1 +1,26 @@
|
|
1
|
-
|
1
|
+
module ViennaRna
|
2
|
+
class Batch
|
3
|
+
include Enumerable
|
4
|
+
|
5
|
+
attr_reader :type, :collection
|
6
|
+
|
7
|
+
def initialize(type, data)
|
8
|
+
@type = type
|
9
|
+
@collection = data.map(&type.method(:new))
|
10
|
+
end
|
11
|
+
|
12
|
+
def each
|
13
|
+
collection.each { |element| yield element }
|
14
|
+
end
|
15
|
+
|
16
|
+
def run(flags = {})
|
17
|
+
tap do
|
18
|
+
if (@memo ||= {})[flags]
|
19
|
+
@memo[flags]
|
20
|
+
else
|
21
|
+
@memo[flags] = map { |element| element.run(flags) }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/modules/fold.rb
CHANGED
@@ -2,23 +2,24 @@ module ViennaRna
|
|
2
2
|
class Fold < Base
|
3
3
|
attr_reader :structure, :mfe
|
4
4
|
|
5
|
-
def post_process
|
6
|
-
|
7
|
-
structure = response.split(/\n/).last.gsub(/ \(\s*(-?\d*\.\d*)\)$/, "")
|
5
|
+
def post_process
|
6
|
+
structure = @response.split(/\n/).last.gsub(/ \(\s*(-?\d*\.\d*)\)$/, "")
|
8
7
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
end
|
8
|
+
unless fasta.seq.length == structure.length
|
9
|
+
raise "Sequence: '#{fasta.seq}'\nStructure: '#{structure}'"
|
10
|
+
else
|
11
|
+
@structure, @mfe = structure, $1.to_f
|
14
12
|
end
|
15
13
|
end
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
14
|
+
|
15
|
+
module Batch
|
16
|
+
def with_different_structures
|
17
|
+
run.inject(Hash.new { |hash, key| hash[key] = [] }) do |hash, folded_sequence|
|
18
|
+
hash.tap do
|
19
|
+
hash[folded_sequence.structure] << folded_sequence
|
20
|
+
end
|
21
|
+
end.values.map(&:first)
|
22
|
+
end
|
22
23
|
end
|
23
24
|
end
|
24
25
|
end
|
data/lib/modules/heat.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
module ViennaRna
|
2
|
+
class Heat < Base
|
3
|
+
attr_reader :specific_heats
|
4
|
+
|
5
|
+
def post_process
|
6
|
+
@specific_heats = @response.split(/\n/).map { |line| line.split(/\s+/).map(&:to_f) }.inject({}) do |hash, (temp, specific_heat)|
|
7
|
+
hash.tap do
|
8
|
+
hash[temp] = specific_heat
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module ViennaRna
|
2
|
+
class Rnabor < Base
|
3
|
+
def run_command(flags)
|
4
|
+
"./RNAbor -s %s -c %s" % [fasta.seq, flags[:scaling_factor]]
|
5
|
+
end
|
6
|
+
|
7
|
+
def parse_total_count
|
8
|
+
response.split(/\n/).find { |line| line =~ /^Z\[\d+\]\[1\]:/ }.match(/^Z\[\d+\]\[1\]:\s*(.*)/)[1].to_i
|
9
|
+
end
|
10
|
+
|
11
|
+
def parse_points
|
12
|
+
self.class.parse(response, "ROOTS AND SOLUTIONS") { |line| line.strip.split(/\s\s+/).map { |value| eval("Complex(#{value})") } }
|
13
|
+
end
|
14
|
+
|
15
|
+
def parse_counts
|
16
|
+
self.class.parse(response, "UNSCALED SUM") { |line| line.strip.split(/:\s*/).map(&:to_f) }
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.parse(response, delimiter)
|
20
|
+
response.split(/\n/).reject do |line|
|
21
|
+
line.empty?
|
22
|
+
end.drop_while do |line|
|
23
|
+
line !~ /^START #{delimiter}/i
|
24
|
+
end.reverse.drop_while do |line|
|
25
|
+
line !~ /^END #{delimiter}/i
|
26
|
+
end.reverse[1..-2].map do |line|
|
27
|
+
yield line
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/lib/modules/subopt.rb
CHANGED
data/lib/modules/utils.rb
CHANGED
@@ -7,6 +7,22 @@ module ViennaRna
|
|
7
7
|
# Force it to not be lazy.
|
8
8
|
Bio::FlatFile.auto(path).to_enum.map { |fasta| fasta }
|
9
9
|
end
|
10
|
+
|
11
|
+
def write_fastas!(fastas, directory, base_name, group_size = 10)
|
12
|
+
fastas.each_slice(group_size).each_with_index do |fasta_group, i|
|
13
|
+
path = File.join(directory, base_name + "_#{i}.fa")
|
14
|
+
|
15
|
+
unless File.exists?(path)
|
16
|
+
File.open(path, "w") do |file|
|
17
|
+
fasta_group.each do |folding|
|
18
|
+
file.write(">%s\n%s\n" % [folding.fasta.definition, folding.fasta.seq])
|
19
|
+
end
|
20
|
+
end
|
21
|
+
else
|
22
|
+
puts "Warning: file '#{path}' exists. Skipping."
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
10
26
|
end
|
11
27
|
end
|
12
28
|
end
|
data/lib/vienna_rna.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require "bio"
|
2
2
|
require "active_support/inflector"
|
3
3
|
require "active_support/core_ext/class"
|
4
|
-
require "active_support/core_ext/module"
|
4
|
+
require "active_support/core_ext/module/aliasing"
|
5
5
|
|
6
6
|
# Clean up this include order.
|
7
7
|
Dir[File.join(File.dirname(__FILE__), "/modules/*")].each do |file|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vienna_rna
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2012-03-26 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bio
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,18 +21,28 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
25
|
-
- !ruby/object:Gem::Dependency
|
26
|
-
name: active_support
|
27
|
-
requirement: &70120459237200 !ruby/object:Gem::Requirement
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
28
25
|
none: false
|
29
26
|
requirements:
|
30
27
|
- - ! '>='
|
31
28
|
- !ruby/object:Gem::Version
|
32
29
|
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: activesupport
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 3.2.5
|
33
38
|
type: :runtime
|
34
39
|
prerelease: false
|
35
|
-
version_requirements:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 3.2.5
|
36
46
|
description: A Ruby API for interacting with the Vienna RNA package.
|
37
47
|
email: evansenter@gmail.com
|
38
48
|
executables: []
|
@@ -45,6 +55,10 @@ files:
|
|
45
55
|
Li9saWIvbW9kdWxlcy9iYXRjaC5yYg==
|
46
56
|
- !binary |-
|
47
57
|
Li9saWIvbW9kdWxlcy9mb2xkLnJi
|
58
|
+
- !binary |-
|
59
|
+
Li9saWIvbW9kdWxlcy9oZWF0LnJi
|
60
|
+
- !binary |-
|
61
|
+
Li9saWIvbW9kdWxlcy9ybmFib3IucmI=
|
48
62
|
- !binary |-
|
49
63
|
Li9saWIvbW9kdWxlcy9zdWJvcHQucmI=
|
50
64
|
- !binary |-
|
@@ -71,7 +85,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
71
85
|
version: '0'
|
72
86
|
requirements: []
|
73
87
|
rubyforge_project:
|
74
|
-
rubygems_version: 1.8.
|
88
|
+
rubygems_version: 1.8.24
|
75
89
|
signing_key:
|
76
90
|
specification_version: 3
|
77
91
|
summary: Bindings to the Vienna RNA package.
|