1#ifndef SCRAN_NORM_CHOOSE_PSEUDO_COUNT_HPP
2#define SCRAN_NORM_CHOOSE_PSEUDO_COUNT_HPP
10#include "quickstats/quickstats.hpp"
11#include "sanisizer/sanisizer.hpp"
80template<
typename Float_>
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;
94 if (actual_num == 0) {
99 throw std::runtime_error(
"'quantile' should be in [0, 0.5)");
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 {
106 const Float_ lower_sf = sf[0];
107 const Float_ upper_sf = sf[1];
110 const Float_ pseudo_count = (1.0 / lower_sf - 1.0 / upper_sf) / (8 * options.
max_bias);
112 return std::max(options.
min_value, pseudo_count);
127template<
typename Float_>
129 std::vector<Float_> buffer(size_factors, size_factors + num);
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