Class: Transrate::ScoreOptimiser
- Inherits:
-
Object
- Object
- Transrate::ScoreOptimiser
- Defined in:
- lib/transrate/score_optimiser.rb
Overview
This class is used to calculate the basic transrate score. It is also used to automatically optimise the score by calculating a cutoff that maximises the number of reads that map while also minimising the number of low scoring contigs.
Instance Method Summary collapse
-
#geomean(x) ⇒ Object
Calculate the geometric mean of an array of numbers.
-
#initialize(assembly, read_metrics) ⇒ ScoreOptimiser
constructor
A new instance of ScoreOptimiser.
- #optimal_score(prefix = 'assembly') ⇒ Object
- #raw_score ⇒ Object
Constructor Details
#initialize(assembly, read_metrics) ⇒ ScoreOptimiser
Returns a new instance of ScoreOptimiser.
11 12 13 14 15 16 17 |
# File 'lib/transrate/score_optimiser.rb', line 11 def initialize assembly, read_metrics @assembly = assembly @fragments = read_metrics.fragments read_stats = read_metrics.read_stats @total = read_stats[:fragments] @good = read_stats[:good_mappings] end |
Instance Method Details
#geomean(x) ⇒ Object
Calculate the geometric mean of an array of numbers
62 63 64 65 66 67 |
# File 'lib/transrate/score_optimiser.rb', line 62 def geomean x sum = 0.0 x.each{ |v| sum += Math.log(v) } sum /= x.size Math.exp sum end |
#optimal_score(prefix = 'assembly') ⇒ Object
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
# File 'lib/transrate/score_optimiser.rb', line 25 def optimal_score(prefix='assembly') return [@optimal, @cutoff] unless @optimal.nil? product = 0 good = 0 @assembly.assembly.each do |key, contig| product += Math.log(contig.score) good += contig.good end count = @assembly.size cutoffscores = {} contigs_sorted = {} @assembly.assembly.sort_by { |k,v| v.score }.each do |a,b| contigs_sorted[a] = b end contigs_sorted.each do |key, contig| product -= Math.log(contig.score) good -= contig.good count -= 1 score = Math.exp(product / count) * (good/@fragments.to_f) cutoffscores[contig.score] = score end @optimal = 0 @cutoff = 0 out = CSV.open("#{prefix}_score_optimisation.csv", 'w') out << %w[cutoff assembly_score] cutoffscores.each do |c, score| out << [c.round(5), score.round(5)] if score > @optimal @optimal = score @cutoff = c end end return [@optimal, @cutoff] end |
#raw_score ⇒ Object
19 20 21 22 23 |
# File 'lib/transrate/score_optimiser.rb', line 19 def raw_score scores = @assembly.assembly.values.map{ |c| c.score } @contig_score = geomean scores @contig_score * (@good / @total.to_f) end |