class Bio::Abif

Description

This class inherits from the SangerChromatogram superclass. It captures the information contained within an ABIF format chromatogram file generated by DNA sequencing. See the SangerChromatogram class for usage.

Constants

DATA_TYPES
PACK_TYPES

Attributes

chemistry[RW]

The chemistry used when sequencing e.g Dye terminators => 'term.' (String)

sample_title[RW]

The sample title as entered when sequencing the sample (String)

Public Class Methods

new(string) click to toggle source

see SangerChromatogram class for how to create an Abif object and its usage

# File lib/bio/db/sanger_chromatogram/abif.rb, line 37
def initialize(string)
  header = string.slice(0,128)
  # read in header info
  @chromatogram_type, @version, @directory_tag_name, @directory_tag_number, @directory_element_type, @directory_element_size, @directory_number_of_elements, @directory_data_size, @directory_data_offset, @directory_data_handle= header.unpack("a4 n a4 N n n N N N N")
  @version = @version/100.to_f
  get_directory_entries(string)
  # get sequence
  @sequence = @directory_entries["PBAS"][1].data.map{|char| char.chr.downcase}.join("")
  #get peak indices
  @peak_indices = @directory_entries["PLOC"][1].data
  #get qualities
  @qualities = @directory_entries["PCON"][1].data
  # get sample title
  @sample_title = @directory_entries["SMPL"][1].data
  @directory_entries["PDMF"].size > 2 ? @dye_mobility = @directory_entries["PDMF"][2].data : @dye_mobility = @directory_entries["PDMF"][1].data
  #get trace data
  @chemistry = @directory_entries["phCH"][1].data
  base_order = @directory_entries["FWO_"][1].data.map{|char| char.chr.downcase}
  (9..12).each do |data_index|
    self.instance_variable_set("@#{base_order[data_index-9]}trace", @directory_entries["DATA"][data_index].data)
  end

end

Public Instance Methods

data(name, tag_number = 1) click to toggle source

Returns the data for the name. If not found, returns nil.


Arguments:

  • (required) name: (String) name of the data

  • (required) tag_number: (Integer) tag number (default 1)

Returns

any data type or nil

# File lib/bio/db/sanger_chromatogram/abif.rb, line 68
def data(name, tag_number = 1)
  d = @directory_entries[name]
  d ? d[tag_number].data : nil
end

Private Instance Methods

get_directory_entries(string) click to toggle source
# File lib/bio/db/sanger_chromatogram/abif.rb, line 74
def get_directory_entries(string)
  @directory_entries = Hash.new
  offset = @directory_data_offset
  @directory_number_of_elements.times do
    entry = DirectoryEntry.new
    entry_fields = string.slice(offset, @directory_element_size)
    entry.name, entry.tag_number, entry.element_type, entry.element_size, entry.number_of_elements, entry.data_size, entry.data_offset = entry_fields.unpack("a4 N n n N N N")
    # populate the entry with the data it refers to
    if entry.data_size > 4
      get_entry_data(entry, string)
    else
      get_entry_data(entry, entry_fields)
    end
    if @directory_entries.has_key?(entry.name)
      @directory_entries[entry.name][entry.tag_number] = entry
    else
      @directory_entries[entry.name] = Array.new
      @directory_entries[entry.name][entry.tag_number] = entry
    end
    offset += @directory_element_size
  end
end
get_entry_data(entry, string) click to toggle source
# File lib/bio/db/sanger_chromatogram/abif.rb, line 96
def get_entry_data(entry, string)
  if entry.data_size > 4
    raw_data = string.slice(entry.data_offset, entry.data_size)
  else
    raw_data = string.slice(20,4)
  end
  if entry.element_type > 1023
    # user defined data: not processed as yet by this bioruby module
    entry.data = raw_data
  else
    pack_type = PACK_TYPES[DATA_TYPES[entry.element_type]]
    pack_type.match(/\*/) ? unpack_string = pack_type : unpack_string = "#{pack_type}#{entry.number_of_elements}"
    entry.data = raw_data.unpack(unpack_string)
    if pack_type == "CA*" # pascal string where the first byte is a charcter count and should therefore be removed
      entry.data.shift
    end
  end
end