class Merger

Public Class Methods

int_value(arr) click to toggle source
# File lib/ms/merger.rb, line 12
def self.int_value(arr)
  if arr.class == Array
    return arr.last + int_value(arr.first)
  else
    return arr
  end
end
merge(half_range,db) click to toggle source
# File lib/ms/merger.rb, line 37
def self.merge(half_range,db)
  prog = Progress.new("Merging Overlaps:")
  db.execute "CREATE TABLE IF NOT EXISTS merged(merge_id INTEGER PRIMARY KEY, merged_vals TEXT, a_vals TEXT, b_vals TEXT)"
  spectra = db.execute "SELECT * FROM spectra"
  spectra = spectra.group_by{|spec| spec[2]}
  total = spectra.size
  merge_id = 0
  k = 0
  spectra.each do |rt,peaks|
    if k.even?
      num = (((k/total)*100).to_i)
      prog.update(num)
    end
    peaks.sort_by!{|a| a[2]} #mz
    peaks_t = peaks.transpose
    pep_ids = peaks_t[1]
    cent_ids = peaks_t[0]
    mzs = peaks_t[3]
    ints = peaks_t[4]
    mzs.each_with_index do |mz,i|
      o_mz = mz
      range = (mz..mz+half_range)
      if range.include?(mzs[i+1])
        metaA_mz = [o_mz, mzs[i+1]]
        meta_int = [ints[i],ints[i+1]]
        sum = ints[i] + ints[i+1]
        new_mz = w_avg(metaA_mz,meta_int)
        db.execute "DELETE FROM spectra WHERE cent_id=#{cent_ids[i]}"
        db.execute "DELETE FROM spectra WHERE cent_id=#{cent_ids[i+1]}"
        db.execute "INSERT INTO spectra VALUES(#{cent_ids[i]},#{pep_ids[i]},#{rt},#{new_mz},#{sum},#{merge_id})"
        db.execute "INSERT INTO merged VALUES(#{merge_id}, '#{cent_ids[i]},#{pep_ids[i]},#{rt},#{new_mz},#{sum}', '#{peaks[i]}', '#{peaks[i+1]}')"
        merge_id += 1
      end
    end
    k += 1
  end
  prog.finish!
end
mz_value(arr) click to toggle source
# File lib/ms/merger.rb, line 4
def self.mz_value(arr)
  if arr.class == Hash
    return arr.keys[0][0]
  else
    return arr
  end
end
w_avg(values,weights) click to toggle source
# File lib/ms/merger.rb, line 20
def self.w_avg(values,weights)
  if values.class == hash
    values = values.values.flatten
  end
  a = []
  int = 0
  mz = 0
  values.each_with_index do |v,i| 
    mz = mz_value(v)
    int = int_value(weights[i])
    a<<mz*int
  end
  a = a.inject(:+)
  b = weights.flatten.inject(:+)
  return a/b
end