vienna_rna 0.1.0 → 0.1.1

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 CHANGED
@@ -52,12 +52,20 @@ module ViennaRna
52
52
  end
53
53
  end
54
54
  end
55
+
56
+ def debugger
57
+ STDERR.puts yield if ViennaRna.debug
58
+ end
55
59
  end
56
60
 
57
61
  attr_reader :data, :response, :runtime
58
62
 
59
63
  def exec_name
60
- executable_name || "rna#{self.class.name.split('::').last.underscore}"
64
+ if executable_name
65
+ executable_name.respond_to?(:call) ? self.class.module_exec(&executable_name) : executable_name
66
+ else
67
+ "rna#{self.class.name.split('::').last.underscore}"
68
+ end
61
69
  end
62
70
 
63
71
  def exec_sequence_format
@@ -80,7 +88,7 @@ module ViennaRna
80
88
  post_process if respond_to?(:post_process)
81
89
  end
82
90
 
83
- puts "Total runtime: %.3f sec." % runtime.real if ViennaRna.debug
91
+ debugger { "Total runtime: %.3f sec." % runtime.real }
84
92
  end
85
93
  end
86
94
 
@@ -101,9 +109,13 @@ module ViennaRna
101
109
  "echo #{exec_sequence_format} | #{exec_name} #{stringify_flags(flags)}"
102
110
  end
103
111
 
104
- puts command if ViennaRna.debug
112
+ debugger { command }
105
113
 
106
114
  %x[#{command}]
107
115
  end
116
+
117
+ def debugger(&block)
118
+ self.class.debugger(&block)
119
+ end
108
120
  end
109
121
  end
@@ -1,20 +1,11 @@
1
1
  require "tempfile"
2
+ require "bigdecimal"
2
3
 
3
4
  module ViennaRna
4
- class Fftbor < Base
5
- def run_command(flags)
6
- file = Tempfile.new("rna")
7
- file.write("%s\n" % data.seq)
8
- file.write("%s\n" % data.safe_structure)
9
- file.close
10
-
11
- "./FFTbor %s" % file.path
12
- end
13
-
5
+ class Fftbor < Xbor
14
6
  def partition
15
- # Scaling factor (Z{1, n}): 586.684
16
7
  response.split(/\n/).find { |line| line =~ /^Scaling factor.*:\s+(\d+\.\d+)/ }
17
- $1.to_f
8
+ BigDecimal.new($1)
18
9
  end
19
10
 
20
11
  def total_count
@@ -23,11 +14,7 @@ module ViennaRna
23
14
  end
24
15
 
25
16
  def distribution
26
- self.class.parse(response).map { |row| row[1].to_f }
27
- end
28
-
29
- def self.parse(response)
30
- response.split(/\n/).select { |line| line =~ /^\d+\t\d+(\.\d+)?/ }.map { |line| line.split(/\t/) }
17
+ self.class.parse(response).map { |row| BigDecimal.new(row[1]) }
31
18
  end
32
19
  end
33
20
  end
@@ -1,16 +1,8 @@
1
1
  require "tempfile"
2
+ require "bigdecimal"
2
3
 
3
4
  module ViennaRna
4
- class Rnabor < Base
5
- def run_command(flags)
6
- file = Tempfile.new("rna")
7
- file.write("%s\n" % data.seq)
8
- file.write("%s\n" % data.safe_structure)
9
- file.close
10
-
11
- "./RNAbor -nodangle %s" % file.path
12
- end
13
-
5
+ class Rnabor < Xbor
14
6
  def partition
15
7
  non_zero_shells.sum
16
8
  end
@@ -23,16 +15,15 @@ module ViennaRna
23
15
  (non_zero_counts = self.class.parse(response).map { |row| row[2].to_i }) + [0] * (data.seq.length - non_zero_counts.length + 1)
24
16
  end
25
17
 
26
- def distribution
27
- (non_zero_distribution = non_zero_shells.map { |i| i / partition }) + [0.0] * (data.seq.length - non_zero_distribution.length + 1)
18
+ def distribution(options = {})
19
+ options = { precision: 4 }.merge(options)
20
+
21
+ distribution_before_precision = (non_zero_distribution = non_zero_shells.map { |i| i / partition }) + [0.0] * (data.seq.length - non_zero_distribution.length + 1)
22
+ distribution_before_precision.map { |value| options[:precision].zero? ? value : (value * 10 ** options[:precision]).truncate / 10.0 ** options[:precision] }
28
23
  end
29
24
 
30
25
  def non_zero_shells
31
- self.class.parse(response).map { |row| row[1].to_f }
32
- end
33
-
34
- def self.parse(response)
35
- response.split(/\n/)[2..-1].map { |line| line.split(/\t/) }
26
+ self.class.parse(response).map { |row| BigDecimal.new(row[1]) }
36
27
  end
37
28
  end
38
29
  end
@@ -0,0 +1,21 @@
1
+ require "tempfile"
2
+ require "bigdecimal"
3
+
4
+ module ViennaRna
5
+ class Xbor < Base
6
+ self.executable_name = -> { name.demodulize.gsub(/^([A-Z].*)bor$/) { |match| $1.upcase + "bor" } }
7
+
8
+ def run_command(flags)
9
+ file = Tempfile.new("rna")
10
+ file.write("%s\n" % data.seq)
11
+ file.write("%s\n" % data.safe_structure)
12
+ file.close
13
+
14
+ "./%s -nodangle %s" % [exec_name, file.path]
15
+ end
16
+
17
+ def self.parse(response)
18
+ response.split(/\n/).select { |line| line =~ /^\d+\t\d+/ }.map { |line| line.split(/\t/) }
19
+ end
20
+ end
21
+ end
data/lib/vienna_rna.rb CHANGED
@@ -3,11 +3,6 @@ require "active_support/inflector"
3
3
  require "active_support/core_ext/class"
4
4
  require "active_support/core_ext/module/aliasing"
5
5
 
6
- # Clean up this include order.
7
- Dir[File.join(File.dirname(__FILE__), "/modules/*")].each do |file|
8
- require file
9
- end
10
-
11
6
  module Enumerable
12
7
  def sum
13
8
  inject(&:+)
@@ -17,6 +12,10 @@ end
17
12
  module ViennaRna
18
13
  @debug = true
19
14
 
15
+ Dir[File.join(File.dirname(__FILE__), "/modules/*")].each do |file|
16
+ autoload File.basename(file, ".rb").camelize.to_sym, file
17
+ end
18
+
20
19
  def self.const_missing(name)
21
20
  if Base.exec_exists?(name)
22
21
  module_eval do
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.1.0
4
+ version: 0.1.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-06-21 00:00:00.000000000 Z
12
+ date: 2012-06-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bio
@@ -51,13 +51,13 @@ extra_rdoc_files: []
51
51
  files:
52
52
  - ./lib/modules/base.rb
53
53
  - ./lib/modules/batch.rb
54
- - ./lib/modules/fft_in_r.rb
55
54
  - ./lib/modules/fftbor.rb
56
55
  - ./lib/modules/fold.rb
57
56
  - ./lib/modules/heat.rb
58
57
  - ./lib/modules/rnabor.rb
59
58
  - ./lib/modules/subopt.rb
60
59
  - ./lib/modules/utils.rb
60
+ - ./lib/modules/xbor.rb
61
61
  - ./lib/vienna_rna.rb
62
62
  homepage: http://rubygems.org/gems/vienna_rna
63
63
  licenses: []
@@ -1,26 +0,0 @@
1
- module ViennaRna
2
- class FftInR < Base
3
- attr_reader :processed_response, :points, :total_count, :precision
4
-
5
- def initialize(points, total_count, precision)
6
- @points = points
7
- @total_count = total_count
8
- @precision = precision
9
- end
10
-
11
- def run_command
12
- vector = "c(%s)" % points.map { |point| 10 ** precision * point / total_count }.join(", ")
13
- "Rscript -e 'vector <- #{vector}; fft(vector) / length(vector);'" % vector
14
- end
15
-
16
- def post_process
17
- @processed_response = response.split(/\n/).map do |line|
18
- line.strip.match(/\[\d+\]\s+(.*)$/)[1].split(/\s+/)
19
- end.flatten.map do |i|
20
- i.match(/(-?\d+\.\d+e[\+-]\d+)/)[1].to_f
21
- end.map do |i|
22
- precision.zero? ? i : i.truncate / 10.0 ** precision
23
- end
24
- end
25
- end
26
- end