class Bio::Phylip::DistanceMatrix
This is a parser class for phylip distance matrix data created by dnadist, protdist, or restdist commands.
Attributes
distance matrix (returns Ruby’s Matrix object)
matrix contains values as original strings. Use it when you doubt precision of floating-point numbers.
names of OTUs
number of OTUs
Public Class Methods
Source
# File lib/bio/appl/phylip/distance_matrix.rb 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
Generates a new phylip distance matrix formatted text as a string.
Source
# File lib/bio/appl/phylip/distance_matrix.rb 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
creates a new distance matrix object