| 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