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.

### Methods

generate new

### Attributes

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

### Public Class methods

generate(matrix, otu_names = nil, options = {})

Generates a new phylip distance matrix formatted text as a string.

[Source]

        # 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

new(str)

creates a new distance matrix object

[Source]

        # 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

[Validate]