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