scran_norm
Scaling normalization of single-cell data
Loading...
Searching...
No Matches
choose_pseudo_count.hpp
Go to the documentation of this file.
1#ifndef SCRAN_NORM_CHOOSE_PSEUDO_COUNT_HPP
2#define SCRAN_NORM_CHOOSE_PSEUDO_COUNT_HPP
3
4#include <algorithm>
5#include <vector>
6#include <cstddef>
7#include <cassert>
8#include <array>
9
10#include "quickstats/quickstats.hpp"
11#include "sanisizer/sanisizer.hpp"
12
13#include "utils.hpp"
14
20namespace scran_norm {
21
31 double quantile = 0.05;
32
37 double max_bias = 0.1;
38
43 double min_value = 1;
44};
45
80template<typename Float_>
81Float_ choose_pseudo_count_raw(const std::size_t num, Float_* const size_factors, const ChoosePseudoCountOptions& options) {
82 // Avoid problems with zeros.
83 I<decltype(num)> actual_num = 0;
84 for (I<decltype(num)> i = 0; i < num; ++i) {
85 const auto val = size_factors[i];
86 if (std::isfinite(val) && val > 0) {
87 if (i != actual_num) {
88 size_factors[actual_num] = val;
89 }
90 ++actual_num;
91 }
92 }
93
94 if (actual_num == 0) {
95 return options.min_value;
96 }
97
98 if (options.quantile < 0 || options.quantile >= 0.5) {
99 throw std::runtime_error("'quantile' should be in [0, 0.5)");
100 }
101 quickstats::MultipleQuantilesFixedNumber<Float_> comp(actual_num, std::vector<double>{ options.quantile, 1.0 - options.quantile });
102 std::array<Float_, 2> sf;
103 comp(size_factors, [&](std::size_t i, Float_ val) -> void {
104 sf[i] = val;
105 });
106 const Float_ lower_sf = sf[0];
107 const Float_ upper_sf = sf[1];
108
109 // Very confusing formulation in Equation 3, but whatever.
110 const Float_ pseudo_count = (1.0 / lower_sf - 1.0 / upper_sf) / (8 * options.max_bias);
111
112 return std::max(options.min_value, pseudo_count);
113}
114
127template<typename Float_>
128Float_ choose_pseudo_count(const std::size_t num, const Float_* const size_factors, const ChoosePseudoCountOptions& options) {
129 std::vector<Float_> buffer(size_factors, size_factors + num);
130 return choose_pseudo_count_raw(num, buffer.data(), options);
131}
132
133}
134
135#endif
Scaling normalization of single-cell data.
Definition center_size_factors.hpp:20
Float_ choose_pseudo_count(const std::size_t num, const Float_ *const size_factors, const ChoosePseudoCountOptions &options)
Definition choose_pseudo_count.hpp:128
Float_ choose_pseudo_count_raw(const std::size_t num, Float_ *const size_factors, const ChoosePseudoCountOptions &options)
Definition choose_pseudo_count.hpp:81
Options for choose_pseudo_count().
Definition choose_pseudo_count.hpp:25
double quantile
Definition choose_pseudo_count.hpp:31
double max_bias
Definition choose_pseudo_count.hpp:37
double min_value
Definition choose_pseudo_count.hpp:43