1#ifndef SCRAN_NORM_CENTER_SIZE_FACTORS_HPP
2#define SCRAN_NORM_CENTER_SIZE_FACTORS_HPP
10#include "tatami_stats/tatami_stats.hpp"
55template<
typename SizeFactor_>
57 static_assert(std::is_floating_point<SizeFactor_>::value);
59 I<
decltype(num)> denom = 0;
64 for (I<
decltype(num)> i = 0; i < num; ++i) {
65 const auto val = size_factors[i];
66 if (!internal::is_invalid(val, diag)) {
72 mean = std::accumulate(size_factors, size_factors + num,
static_cast<SizeFactor_
>(0));
97template<
typename SizeFactor_,
typename Block_>
99 const std::size_t num,
100 const SizeFactor_*
const size_factors,
101 const Block_*
const block,
104 static_assert(std::is_floating_point<SizeFactor_>::value);
105 const auto ngroups = tatami_stats::total_groups(block, num);
106 auto group_mean = sanisizer::create<std::vector<SizeFactor_> >(ngroups);
107 auto group_num = sanisizer::create<std::vector<I<
decltype(num)>> >(ngroups);
112 for (I<
decltype(num)> i = 0; i < num; ++i) {
113 const auto val = size_factors[i];
114 if (!internal::is_invalid(val, diag)) {
115 const auto b = block[i];
116 group_mean[b] += val;
121 for (I<
decltype(num)> i = 0; i < num; ++i) {
122 const auto b = block[i];
123 group_mean[b] += size_factors[i];
128 for (I<
decltype(ngroups)> g = 0; g < ngroups; ++g) {
130 group_mean[g] /= group_num[g];
187template<
typename SizeFactor_>
198 const SizeFactor_ mult = options.
center / mean;
199 for (I<
decltype(num)> i = 0; i < num; ++i){
200 size_factors[i] *= mult;
287template<
typename SizeFactor_,
typename Block_>
289 const std::size_t num,
290 SizeFactor_*
const size_factors,
291 const Block_*
const block,
298 const auto ngroups = group_mean.size();
300 if (options.
block_mode == CenterBlockMode::PER_BLOCK) {
301 std::vector<SizeFactor_> fac;
302 fac.reserve(ngroups);
303 for (I<
decltype(ngroups)> g = 0; g < ngroups; ++g) {
304 const auto gm = group_mean[g];
306 fac.emplace_back(1 / gm);
312 for (I<
decltype(num)> i = 0; i < num; ++i) {
313 size_factors[i] *= fac[block[i]];
317 for (
auto& gm : group_mean) {
325 }
else if (options.
block_mode == CenterBlockMode::LOWEST) {
328 for (
const auto m : group_mean) {
332 if (!found || m < min) {
340 const SizeFactor_ mult = 1 / min;
341 for (I<
decltype(num)> i = 0; i < num; ++i) {
342 size_factors[i] *= mult;
346 for (
auto& gm : group_mean) {
356 throw std::runtime_error(
"'custom_centers' should be set for custom block centers");
359 const auto ngroups = group_mean.size();
360 if (custom.size() != ngroups) {
361 throw std::runtime_error(
"length of 'custom_centers' should be equal to the number of groups");
364 std::vector<SizeFactor_> fac;
365 fac.reserve(ngroups);
366 for (I<
decltype(ngroups)> g = 0; g < ngroups; ++g) {
367 const auto gm = group_mean[g];
369 fac.emplace_back(custom[g] / gm);
375 for (I<
decltype(num)> i = 0; i < num; ++i) {
376 size_factors[i] *= fac[block[i]];
380 for (I<
decltype(ngroups)> g = 0; g < ngroups; ++g) {
381 auto& gm = group_mean[g];
Scaling normalization of single-cell data.
Definition center_size_factors.hpp:20
std::vector< SizeFactor_ > compute_mean_size_factor_blocked(const std::size_t num, const SizeFactor_ *const size_factors, const Block_ *const block, const ComputeMeanSizeFactorOptions &options)
Definition center_size_factors.hpp:98
SizeFactor_ compute_mean_size_factor(const std::size_t num, const SizeFactor_ *const size_factors, const ComputeMeanSizeFactorOptions &options)
Definition center_size_factors.hpp:56
std::vector< SizeFactor_ > center_size_factors_blocked(const std::size_t num, SizeFactor_ *const size_factors, const Block_ *const block, const CenterSizeFactorsBlockedOptions &options)
Definition center_size_factors.hpp:288
CenterBlockMode
Definition center_size_factors.hpp:213
SizeFactor_ center_size_factors(const std::size_t num, SizeFactor_ *const size_factors, const CenterSizeFactorsOptions &options)
Definition center_size_factors.hpp:188
Sanitize invalid size factors.
Options for center_size_factors() and center_size_factors_blocked().
Definition center_size_factors.hpp:218
std::optional< std::vector< double > > custom_centers
Definition center_size_factors.hpp:262
CenterBlockMode block_mode
Definition center_size_factors.hpp:255
bool ignore_invalid
Definition center_size_factors.hpp:224
SizeFactorDiagnostics * diagnostics
Definition center_size_factors.hpp:230
bool report_final
Definition center_size_factors.hpp:268
Options for center_size_factors().
Definition center_size_factors.hpp:140
bool ignore_invalid
Definition center_size_factors.hpp:149
bool report_final
Definition center_size_factors.hpp:168
double center
Definition center_size_factors.hpp:156
SizeFactorDiagnostics * diagnostics
Definition center_size_factors.hpp:162
Options for compute_mean_size_factor() and compute_mean_size_factor_blocked().
Definition center_size_factors.hpp:25
bool ignore_invalid
Definition center_size_factors.hpp:32
SizeFactorDiagnostics * diagnostics
Definition center_size_factors.hpp:41
Diagnostics for the size factors.
Definition sanitize_size_factors.hpp:20