class Ulla::CLI

Public Class Methods

calculate_pid(seq1, seq2, unit) click to toggle source
# File lib/ulla/cli.rb, line 76
def self.calculate_pid(seq1, seq2, unit)
  begin
    self.calculate_pid_cpp(seq1, seq2, unit)
  rescue
    self.calculate_pid_rb(seq1, seq2, unit)
  end
end
Ulla::CLI::calculate_pid(seq1, seq2, unit) → Float click to toggle source

Calculate PID between two sequences

# File lib/ulla/cli.rb, line 12
def self.calculate_pid_rb(seq1, seq2, unit)
  aas1  = seq1.scan(/\S{#{unit}}/)
  aas2  = seq2.scan(/\S{#{unit}}/)
  gap   = ($gap || '-') * unit
  align = 0 # no. of aligned columns
  ident = 0 # no. of identical columns
  intgp = 0 # no. of internal gaps

  if (aas1.size != aas2.size)
    $logger.error "Cannot calculate PID between unaligned sequences"
    $logger.error seq1, seq2
    exit 1
  end

  (0...aas1.size).each do |i|
    if (aas1[i] != gap) && (aas2[i] != gap)
      align += 1
      if aas1[i] == aas2[i]
        ident += 1
      end
    elsif (((aas1[i] == gap) && (aas2[i] != gap)) ||
            ((aas1[i] != gap) && (aas2[i] == gap)))
      intgp += 1
    end
  end

  100.0 * ident / (align + intgp)
end