class BioTCM::Layer

A basic data model representing one layer, containing one node table and one edge table.

Usage

Load a layer

layer = BioTCM::Layer.load('co-occurrence')
#   co-occurrence/nodes.tab
#   co-occurrence/edges.tab

layer = BioTCM::Layer.load('co-occurrence', prefix: '[20150405]')
#   co-occurrence/[20150405]nodes.tab
#   co-occurrence/[20150405]edges.tab

Save the layer

layer.save('co-occurrence', prefix: '[20150405]')
#   co-occurrence/[20150405]nodes.tab
#   co-occurrence/[20150405]edges.tab

Constants

VERSION

Version

Attributes

edge_tab[R]

Table of edges @return [BioTCM::Table]

node_tab[R]

Table of nodes @return [BioTCM::Table]

Public Class Methods

load( path = nil, prefix: '', colname: { source: 'Source', target: 'Target', interaction: nil } ) click to toggle source

Load a layer from disk @param path [String] @param colname [Hash] A hash for column name mapping @return [Layer]

# File lib/biotcm/layer.rb, line 40
def self.load(
  path = nil,
  prefix: '',
  colname: {
    source: 'Source',
    target: 'Target',
    interaction: nil
  }
)
  # Path convention
  if path
    edge_path = File.expand_path(prefix + 'edges.tab', path)
    node_path = File.expand_path(prefix + 'nodes.tab', path)
  end
  fin = File.open(edge_path)

  # Headline
  col = fin.gets.chomp.split("\t")
  unless (i_src = col.index(colname[:source]))
    raise ArgumentError, "Cannot find source node column: #{colname[:source]}"
  end
  unless (i_tgt = col.index(colname[:target]))
    raise ArgumentError, "Cannot find target node column: #{colname[:target]}"
  end
  col[i_src] = col[i_tgt] = nil
  if colname[:interaction]
    unless (i_typ = col.index(colname[:interaction]))
      raise ArgumentError, "Cannot find interaction type column: #{colname[:interaction]}"
    end
    col[i_typ] = nil
  else
    i_typ = nil
  end
  col.compact!

  # Initialize members
  node_tab = BioTCM::Table.new
  edge_tab = BioTCM::Table.new(primary_key: [colname[:source], colname[:interaction], colname[:target]].compact.join("\t"), col_keys: col)
  # Load edge_file
  node_in_table = node_tab.instance_variable_get(:@row_keys)
  col_size = edge_tab.col_keys.size
  fin.each do |line|
    col = line.chomp.split("\t")
    src = col[i_src]
    tgt = col[i_tgt]
    typ = i_typ ? col[i_typ] : nil

    # Insert nodes
    node_tab.row(src, []) unless node_in_table[src]
    node_tab.row(tgt, []) unless node_in_table[tgt]

    # Insert edge
    col[i_src] = col[i_tgt] = nil
    col[i_typ] = nil if i_typ
    col.compact!
    raise ArgumentError, "Row size inconsistent in line #{fin.lineno + 2}" unless col.size == col_size
    edge_tab.row([src, typ, tgt].compact.join("\t"), col)
  end

  # Load node_file
  if node_path
    tab = BioTCM::Table.load(node_path)
    node_tab.primary_key = tab.primary_key
    node_tab = node_tab.merge(tab)
  end

  new(edge_tab: edge_tab, node_tab: node_tab)
end
new(edge_tab: nil, node_tab: nil) click to toggle source

Create a layer from an edge tab and a node tab @param edge_tab [Table] @param node_tab [Table]

# File lib/biotcm/layer.rb, line 112
def initialize(edge_tab: nil, node_tab: nil)
  @edge_tab = edge_tab || BioTCM::Table.new(primary_key: "Source\tTarget")
  @node_tab = node_tab || BioTCM::Table.new(primary_key: 'Node')
end

Public Instance Methods

save(path, prefix = '') click to toggle source

Save the layer to disk @param path [String] path to output directory @param prefix [String]

# File lib/biotcm/layer.rb, line 120
def save(path, prefix = '')
  FileUtils.mkdir_p(path)
  @edge_tab.save(File.expand_path(prefix + 'edges.tab', path))
  @node_tab.save(File.expand_path(prefix + 'nodes.tab', path))
end