def sample_clonesize_stat(sample, samdir, freqs=[], numtop=50, args=None): # calculate: number of clones/ counts that lie within each freq # range. Note: freqs must be sorted, or the func will sort it # <numtop>: number of top clones whose freqs will be report stat = CloneSizeStat(sorted(freqs)) stat.set_sample_info(sample) if args: numtop = args[0] clones = libsample.sample_all_clones(samdir) sorted_clones = sorted(clones, reverse=True, key=lambda c: c.freq) for index, clone in enumerate(sorted_clones): if index < numtop: stat.topfreqs.append(clone.freq) for i, minfreq in enumerate(stat.freqs): maxfreq = float('inf') if i + 1 < len(stat.freqs): maxfreq = stat.freqs[i + 1] if minfreq <= clone.freq and clone.freq < maxfreq: stat.numclones[i] += 1 stat.counts[i] += clone.count # convert to frequencies: stat.numclones = [libcommon.get_pc(c, stat.numclone) for c in stat.numclones] stat.counts = [libcommon.get_pc(c, stat.size) for c in stat.counts] # get cumulative stats: stat.numclones_cumul = libcommon.get_cumulative(stat.numclones) stat.counts_cumul = libcommon.get_cumulative(stat.counts) stat.topfreqs_cumul = libcommon.get_cumulative(stat.topfreqs, True) return stat
def test_get_cumulative(self): vals = [1, 0, -1, 0.5, 2.5] forward_vals = [1, 1, 0, 0.5, 3] cumu_vals = lcommon.get_cumulative(vals, forward=True) self.assertEqual(forward_vals, cumu_vals) backward_vals = [3, 2, 2, 3, 2.5] cumu_vals = lcommon.get_cumulative(vals) self.assertEqual(backward_vals, cumu_vals)