Class: Bio::Phylip::DistanceMatrix
- Defined in:
- lib/bio/appl/phylip/distance_matrix.rb
Overview
This is a parser class for phylip distance matrix data created by dnadist, protdist, or restdist commands.
Instance Attribute Summary collapse
-
#matrix ⇒ Object
readonly
distance matrix (returns Ruby’s Matrix object).
-
#original_matrix ⇒ Object
readonly
matrix contains values as original strings.
-
#otu_names ⇒ Object
readonly
names of OTUs.
-
#otus ⇒ Object
readonly
number of OTUs.
Class Method Summary collapse
-
.generate(matrix, otu_names = nil, options = {}) ⇒ Object
Generates a new phylip distance matrix formatted text as a string.
Instance Method Summary collapse
-
#initialize(str) ⇒ DistanceMatrix
constructor
creates a new distance matrix object.
Constructor Details
#initialize(str) ⇒ DistanceMatrix
creates a new distance matrix object
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
# File 'lib/bio/appl/phylip/distance_matrix.rb', line 27 def initialize(str) data = str.strip.split(/(?:\r\n|\r|\n)/) @otus = data.shift.to_s.strip.to_i prev = nil data.collect! do |x| if /\A +/ =~ x and prev then prev.concat x.strip.split(/\s+/) nil else prev = x.strip.split(/\s+/) prev end end data.compact! if data.size != @otus then raise "inconsistent data (OTUs=#{@otus} but #{data.size} rows)" end @otu_names = data.collect { |x| x.shift } mat = data.collect do |x| if x.size != @otus then raise "inconsistent data (OTUs=#{@otus} but #{x.size} columns)" end x.collect { |y| y.to_f } end @matrix = Matrix.rows(mat, false) @original_matrix = Matrix.rows(data, false) end |
Instance Attribute Details
#matrix ⇒ Object (readonly)
distance matrix (returns Ruby’s Matrix object)
56 57 58 |
# File 'lib/bio/appl/phylip/distance_matrix.rb', line 56 def matrix @matrix end |
#original_matrix ⇒ Object (readonly)
matrix contains values as original strings. Use it when you doubt precision of floating-point numbers.
60 61 62 |
# File 'lib/bio/appl/phylip/distance_matrix.rb', line 60 def original_matrix @original_matrix end |
#otu_names ⇒ Object (readonly)
names of OTUs
66 67 68 |
# File 'lib/bio/appl/phylip/distance_matrix.rb', line 66 def otu_names @otu_names end |
#otus ⇒ Object (readonly)
number of OTUs
63 64 65 |
# File 'lib/bio/appl/phylip/distance_matrix.rb', line 63 def otus @otus end |
Class Method Details
.generate(matrix, otu_names = nil, options = {}) ⇒ Object
Generates a new phylip distance matrix formatted text as a string.
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
# File 'lib/bio/appl/phylip/distance_matrix.rb', line 69 def self.generate(matrix, otu_names = nil, = {}) if matrix.row_size != matrix.column_size then raise "must be a square matrix" end otus = matrix.row_size names = (0...otus).collect do |i| name = ((otu_names and otu_names[i]) or "OTU#{i.to_s}") name end data = (0...otus).collect do |i| x = (0...otus).collect { |j| sprintf("%9.6f", matrix[i, j]) } x.unshift(sprintf("%-10s", names[i])[0, 10]) str = x[0, 7].join(' ') + "\n" 7.step(otus + 1, 7) do |k| str << ' ' + x[k, 7].join(' ') + "\n" end str end sprintf("%5d\n", otus) + data.join('') end |