Class: Bio::Nexus::NexusMatrix

Inherits:
Object
  • Object
show all
Defined in:
lib/bio/db/nexus.rb

Overview

DESCRIPTION

Bio::Nexus::NexusMatrix represents a characters or distance matrix, where the names are stored in column zero.

USAGE

require 'bio/db/nexus'

# Create a new parser:
nexus = Bio::Nexus.new( nexus_data_as_string )
# Get distances block(s):   
distances_block = nexus.get_distances_blocks[ 0 ]
# Get matrix as Bio::Nexus::NexusMatrix object:
matrix = distances_blocks.get_matrix
# Get value (column 0 are names):
val = matrix.get_value( 1, 5 )
# Return first row as String (all columns except column 0),
# values are separated by "_":
row_str_0 = matrix.get_row_string( 0, "_" )
# Return all rows named "ciona" as String (all columns except column 0),
# values are separated by "+":
ciona_rows = matrix.get_row_strings_by_name( "ciona", "+" )

Defined Under Namespace

Classes: NexusMatrixError

Instance Method Summary collapse

Constructor Details

#initializeNexusMatrix

Creates new NexusMatrix.

[View source]

1585
1586
1587
1588
1589
# File 'lib/bio/db/nexus.rb', line 1585

def initialize()
  @rows = Hash.new
  @max_row = -1
  @max_col = -1
end

Instance Method Details

#get_max_colObject

Returns the maximal columns number.


Returns

Integer

[View source]

1641
1642
1643
# File 'lib/bio/db/nexus.rb', line 1641

def get_max_col 
  return @max_col
end

#get_max_rowObject

Returns the maximal row number.


Returns

Integer

[View source]

1648
1649
1650
# File 'lib/bio/db/nexus.rb', line 1648

def get_max_row 
  return @max_row
end

#get_name(row) ⇒ Object

Convenience method which return the value of column 0 and row ‘row’ which is usually the name.


Arguments:

  • (required) row: Integer

Returns

String

[View source]

1667
1668
1669
# File 'lib/bio/db/nexus.rb', line 1667

def get_name( row )
  get_value( row, 0 ).to_s
end

#get_row_string(row, spacer = "") ⇒ Object

Returns the values of columns 1 to maximal column length in row ‘row’ concatenated as string. Individual values can be separated by ‘spacer’.


Arguments:

  • (required) row: Integer

  • (optional) spacer: String

Returns

String

[View source]

1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
# File 'lib/bio/db/nexus.rb', line 1680

def get_row_string( row, spacer = "" )
  row_str = String.new
  if is_empty?
    return row_str
  end
  for col in 1 .. get_max_col
    row_str << get_value( row, col ) << spacer
  end
  row_str
end

#get_row_strings_by_name(name, spacer = "") ⇒ Object

Returns all rows as Array of Strings separated by ‘spacer’ for which column 0 is ‘name’.


Arguments:

  • (required) name: String

  • (optional) spacer: String

Returns

Array

[View source]

1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
# File 'lib/bio/db/nexus.rb', line 1698

def get_row_strings_by_name( name, spacer = "" )
  row_strs = Array.new
  if is_empty?
    return row_strs
  end
  for row in 0 .. get_max_row
    if ( get_value( row, 0 ) == name )
      row_strs.push( get_row_string( row, spacer ) )  
    end
  end
  row_strs
end

#get_value(row, col) ⇒ Object

Returns the value at row ‘row’ and column ‘col’.


Arguments:

  • (required) row: Integer

  • (required) col: Integer

Returns

Object

[View source]

1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
# File 'lib/bio/db/nexus.rb', line 1623

def get_value( row, col )
  if ( ( row > get_max_row() ) || ( row < 0 ) ) 
    raise( NexusMatrixError, "value for row (" + row.to_s +
      ") is out of range [max row: " + get_max_row().to_s + "]" )
  elsif ( ( col > get_max_col() ) || ( row < 0 ) )
    raise( NexusMatrixError, "value for column (" + col.to_s +
     ") is out of range [max column: " + get_max_col().to_s + "]" )
  end
  r = @rows[ row ]
  if ( ( r == nil ) || ( r.length < 1 ) ) 
    return nil
  end
  r[ col ]
end

#is_empty?Boolean

Returns true of matrix is empty.


Returns

true or false

Returns:

  • (Boolean)
[View source]

1656
1657
1658
# File 'lib/bio/db/nexus.rb', line 1656

def is_empty?
  return get_max_col < 0 || get_max_row < 0
end

#set_value(row, col, value) ⇒ Object

Sets the value at row ‘row’ and column ‘col’ to ‘value’.


Arguments:

  • (required) row: Integer

  • (required) col: Integer

  • (required) value: Object

[View source]

1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
# File 'lib/bio/db/nexus.rb', line 1597

def set_value( row, col, value ) 
  if ( ( row < 0 ) || ( col < 0 ) )
      raise( NexusTableError, "attempt to use negative values for row or column" )
  end
  if ( row > get_max_row() ) 
    set_max_row( row )
  end
  if ( col > get_max_col() ) 
    set_max_col( col )
  end
  row_map = nil
  if ( @rows.has_key?( row ) ) 
    row_map = @rows[ row ]
  else 
    row_map = Hash.new
    @rows[ row ] = row_map
  end
  row_map[ col ] = value
end

#to_nexus_row_array(spacer = "", append_delimiter = true) ⇒ Object

Helper method to produce nexus formatted data.


Arguments:

  • (optional) spacer: String

  • (optional) append_delimiter: true or false

Returns

Array

[View source]

1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
# File 'lib/bio/db/nexus.rb', line 1733

def to_nexus_row_array( spacer = "", append_delimiter = true )
  ary = Array.new
  if is_empty?
    return ary
  end
  max_length = 10
  for row in 0 .. get_max_row
    l = get_value( row, 0 ).length
    if ( l > max_length )
      max_length = l
    end
  end  
  for row in 0 .. get_max_row
    row_str = String.new
    ary.push( row_str )
    name = get_value( row, 0 )
    name = name.ljust( max_length + 1 )
    row_str << name << " " << get_row_string( row, spacer )
    if ( spacer != nil && spacer.length > 0 )
      row_str.chomp!( spacer )
    end
    if ( append_delimiter && row == get_max_row )
      row_str << DELIMITER 
    end
  end
  ary
end

#to_sObject Also known as: to_str

Returns matrix as String, returns “empty” if empty.


Returns

String

[View source]

1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
# File 'lib/bio/db/nexus.rb', line 1714

def to_s
  if is_empty?
    return "empty"  
  end
  str = String.new
  row_array = to_nexus_row_array( spacer = " ", false )
  row_array.each do | row |
    str << row << END_OF_LINE
  end
  str
end