class Qu::Thermo::Hybrid

Public Class Methods

new(qseq, sseq, mono=50, diva=1.5, dntp=0.25, oligo=50) click to toggle source
# File lib/qu/thermo.rb, line 8
def initialize(qseq, sseq, mono=50, diva=1.5, dntp=0.25, oligo=50)
  # qseq: 5' -> 3'
  # sseq: 3' -> 5'
  @qseq = qseq.upcase
  @sseq = sseq.upcase
  @mono = mono.to_f
  @diva = diva.to_f
  @dntp = dntp.to_f
  @oligo = oligo.to_f

  @dh, @ds = delta_hs
  @adjusted_mono = (@mono + diva2mono) / 1000.0
  @adjusted_ds = @ds + 0.368 * (@sseq.size - 1) * Math.log(@adjusted_mono, Math::E)
end

Public Instance Methods

dg() click to toggle source
# File lib/qu/thermo.rb, line 23
def dg
  (@dh * 1000 - (273.15 + 37) * @adjusted_ds) / 1000.0
end
dg_tm() click to toggle source
# File lib/qu/thermo.rb, line 31
def dg_tm
  return dg, tm
end
tm() click to toggle source
# File lib/qu/thermo.rb, line 27
def tm
  @dh * 1000.0 / (@adjusted_ds + 1.987 * Math.log(@oligo / 1000000000.0 / 4, Math::E)) - 273.15
end

Private Instance Methods

delta_hs() click to toggle source
# File lib/qu/thermo.rb, line 47
def delta_hs
  init_start = "init#{@qseq[0]}#{@sseq[0]}"
  init_stop = "init#{@qseq[-1]}#{@sseq[-1]}"

  dh = ds = 0
  if DH.include?(init_start) and DH.include?(init_stop)
    dh = DH[init_start] + DH[init_stop]
    ds = DS[init_start] + DS[init_stop]
  end

  (0...(@qseq.size - 1)).each do |i|
    dinuc = "#{@qseq[i...(i+2)]}#{@sseq[i...(i+2)]}"
    if DH.include?(dinuc) and DS.include?(dinuc)
      dh += DH[dinuc]
      ds += DS[dinuc]
    end
  end

  return dh, ds
end
diva2mono() click to toggle source
# File lib/qu/thermo.rb, line 37
def diva2mono
  @dntp = 0 if @diva == 0

  $stderr.puts "Error conc for diva and mono" if @diva < 0 or @dntp < 0

  @diva = @dntp if @diva < @dntp

  return 120 * (Math.sqrt(@diva - @dntp))
end