class FrequencyTable

Attributes

frequency_table[RW]
position_table[RW]
sequences[RW]

Public Class Methods

new() click to toggle source
# File lib/scbi_cominer/classes/frequency_table.rb, line 5
def initialize
  @frequency_table = {}
  @position_table = {}
  @sequences =[]
end

Public Instance Methods

add_fasta(name,fasta, in_consensus_offset, align_clip_start, align_clip_end) click to toggle source
# File lib/scbi_cominer/classes/frequency_table.rb, line 107
def add_fasta(name,fasta, in_consensus_offset, align_clip_start, align_clip_end)

  @sequences.push({:name=>name,:fasta=>fasta})
  index = @sequences.length
  
  fasta_u=fasta.upcase
  
  i = (align_clip_start.to_i+in_consensus_offset.to_i)-2
  
  # seq_i=in_seq_offset.to_i
  
  # while !(c=fasta_u[seq_i]).nil?
  # puts ("_"*i+fasta[align_clip_start.to_i-1..align_clip_end.to_i-1])[0..80]+'...'
  fasta[align_clip_start.to_i-1..align_clip_end.to_i-1].upcase.each_char do |c|

    #get current freq
    freq = @frequency_table[c]
    if freq.nil?
      @frequency_table[c] = []
      freq = @frequency_table[c]
    end

    #increment current freq
    if freq[i].nil?
      freq[i] = 1
    else
      freq[i]+=1
    end

    #get current pos
    pos = @position_table[c]
    if pos.nil?
      @position_table[c] = []
      pos = @position_table[c]
    end

    #increment current freq
    if pos[i].nil?
      pos[i] = [index]
    else
      pos[i].push index
    end

    #increment pos
    i +=1
  end

  #   puts "  "+fasta[0..30]
end
add_read(read) click to toggle source
# File lib/scbi_cominer/classes/frequency_table.rb, line 99
def add_read(read)
  add_fasta(read.name, read.fasta, read.start_in_consensus, read.align_clip_start, read.align_clip_end)
end
add_sequence(seq, offset) click to toggle source
# File lib/scbi_cominer/classes/frequency_table.rb, line 103
def add_sequence(seq, offset)
  add_fasta(seq.seq_name,seq.seq_fasta)
end
consensus_freq(pos) click to toggle source

cuenta las secuencias efectivas de la posicion pos

# File lib/scbi_cominer/classes/frequency_table.rb, line 62
def consensus_freq(pos)
  ke=nil
  m = 0

  @frequency_table.each { |k,v|

    if (!v[pos].nil?) && (k!='-') && (k!='*')
      if v[pos] >= m
        m = v[pos]
        ke=k
      end

    end

  }

  return [ke,m]
  #return @sequences.count
end
extract_col(pos) click to toggle source
# File lib/scbi_cominer/classes/frequency_table.rb, line 157
def extract_col(pos)

  h={}

  @frequency_table.each do |k,v|

    if (!v[pos].nil?) && (k!='-') && (k!='*')
      if v[pos]>0
        h[k]=v[pos]
      end
    end

  end

  return h

end
inspect() click to toggle source
# File lib/scbi_cominer/classes/frequency_table.rb, line 229
def inspect

  # return  @frequency_table.to_json
  
  res = ''

  @frequency_table.each do |c,v|

    res += c+':'+(v[0..30].map{|c1|  c1 ||= 0 }).join("")+"...more.\n"

  end

  @position_table.each do |c,v|

    #                 res += c+':'+(v[0..10].map{|c1|  (c1 && ('['+c1.map{|c2| @sequences[c2-1].seq_name}.join(","))+']') || "[]" }).join(" - ")+"...more.\n"
    res += c+':'+(v[0..10].map{|c1|  (c1 && ('['+c1.map{|c2| @sequences[c2-1][:name]}.join(","))+']') || "[]" }).join(" - ")+"...more.\n"

  end

  return res

end
inspect_pos(pos_start,pos_end) click to toggle source
# File lib/scbi_cominer/classes/frequency_table.rb, line 252
def inspect_pos(pos_start,pos_end)


  res = ''

  @frequency_table.each do |c,v|

    res += c+':'+(v[pos_start..pos_end].map{|c1|  c1 ||= 0 }).join("")+"...more.\n"

  end

  return res
end
max_length() click to toggle source
# File lib/scbi_cominer/classes/frequency_table.rb, line 83
def max_length
  m = 0
  mk = nil

  @frequency_table.each { |k,v|

    if v.length>m
      m = v.length
      mk = k
    end

  }

  return m
end
max_length_key() click to toggle source
# File lib/scbi_cominer/classes/frequency_table.rb, line 11
def max_length_key
  m = 0
  mk = nil

  @frequency_table.each { |k,v|

    if v.length>m
      m = v.length
      mk = k
    end

  }

  return mk
end
nseq(pos) click to toggle source

cuenta las secuencias efectivas de la posicion pos

# File lib/scbi_cominer/classes/frequency_table.rb, line 28
def nseq(pos)
  m = 0

  @frequency_table.each { |k,v|

    if (!v[pos].nil?) && (k!='-')
      #puts v[pos].to_s + k if pos==0
      m += v[pos]
    end

  }

  return m
  #return @sequences.count
end
nseq_valid(pos) click to toggle source

cuenta las secuencias efectivas de la posicion pos

# File lib/scbi_cominer/classes/frequency_table.rb, line 45
def nseq_valid(pos)
  m = 0

  @frequency_table.each { |k,v|

    if (!v[pos].nil?) && (k!='-') && (k!='*')
      #puts v[pos].to_s + k if pos==0
      m += v[pos]
    end

  }

  return m
  #return @sequences.count
end
valid_snp(pos) click to toggle source
# File lib/scbi_cominer/classes/frequency_table.rb, line 175
def valid_snp(pos)
  res = false

  # a valid SNP is a change in at least two valid sequences.

  total_seqs = nseq_valid(pos)
  consensus_base, consensus_frequency = consensus_freq(pos)
  #   puts h.to_json
  # change a pos

  #if pos = 128
  #                   @frequency_table['A'][pos]=1
  #                   @frequency_table['C'][pos]=2
  #                   @frequency_table['T'][pos]=0
  #                   @frequency_table['G'][pos]=4
  #   end
  #
  if consensus_frequency <= total_seqs - 2

    h = extract_col(pos)



    h.each do |k,v|
      if (k!=consensus_base) && (v>=2)
        res = true
        #                                     puts "#{k} is #{v}>=2"
        break
      end
    end


  end

  #   puts inspect_pos(pos,pos)
  #   puts "POS: #{pos}"
  #   puts res.to_s
  #  puts "base #{consensus_base}, freq #{consensus_frequency}, tot: #{total_seqs}"
  #   puts '-' * 20

  #puts "nseq[#{pos}] =  #{total_seqs} => #{consensus_base}: #{consensus_frequency}"

  #   @frequency_table.each { |k,v|
  #
  #           puts "#{k}:#{v[pos] ||= '0'}"
  #
  #
  #   }
  #
  #   puts res.to_s

  return res
end