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;
63 for (I<
decltype(num)> i = 0; i < num; ++i) {
64 const auto val = size_factors[i];
65 if (!internal::is_invalid(val, tmpdiag)) {
75 mean = std::accumulate(size_factors, size_factors + num,
static_cast<SizeFactor_
>(0));
100template<
typename SizeFactor_,
typename Block_>
102 const std::size_t num,
103 const SizeFactor_*
const size_factors,
104 const Block_*
const block,
107 static_assert(std::is_floating_point<SizeFactor_>::value);
108 const auto ngroups = tatami_stats::total_groups(block, num);
109 auto group_mean = sanisizer::create<std::vector<SizeFactor_> >(ngroups);
110 auto group_num = sanisizer::create<std::vector<I<
decltype(num)>> >(ngroups);
114 for (I<
decltype(num)> i = 0; i < num; ++i) {
115 const auto val = size_factors[i];
116 if (!internal::is_invalid(val, tmpdiag)) {
117 const auto b = block[i];
118 group_mean[b] += val;
127 for (I<
decltype(num)> i = 0; i < num; ++i) {
128 const auto b = block[i];
129 group_mean[b] += size_factors[i];
134 for (I<
decltype(ngroups)> g = 0; g < ngroups; ++g) {
136 group_mean[g] /= group_num[g];
193template<
typename SizeFactor_>
204 const SizeFactor_ mult = options.
center / mean;
205 for (I<
decltype(num)> i = 0; i < num; ++i){
206 size_factors[i] *= mult;
293template<
typename SizeFactor_,
typename Block_>
295 const std::size_t num,
296 SizeFactor_*
const size_factors,
297 const Block_*
const block,
304 const auto ngroups = group_mean.size();
306 if (options.
block_mode == CenterBlockMode::PER_BLOCK) {
307 std::vector<SizeFactor_> fac;
308 fac.reserve(ngroups);
309 for (I<
decltype(ngroups)> g = 0; g < ngroups; ++g) {
310 const auto gm = group_mean[g];
312 fac.emplace_back(1 / gm);
318 for (I<
decltype(num)> i = 0; i < num; ++i) {
319 size_factors[i] *= fac[block[i]];
323 for (
auto& gm : group_mean) {
332 }
else if (options.
block_mode == CenterBlockMode::LOWEST) {
335 for (
const auto m : group_mean) {
339 if (!found || m < min) {
347 const SizeFactor_ mult = 1 / min;
348 for (I<
decltype(num)> i = 0; i < num; ++i) {
349 size_factors[i] *= mult;
353 for (
auto& gm : group_mean) {
363 throw std::runtime_error(
"'custom_centers' should be set for custom block centers");
366 const auto ngroups = group_mean.size();
367 if (custom.size() != ngroups) {
368 throw std::runtime_error(
"length of 'custom_centers' should be equal to the number of groups");
371 std::vector<SizeFactor_> fac;
372 fac.reserve(ngroups);
373 for (I<
decltype(ngroups)> g = 0; g < ngroups; ++g) {
374 const auto gm = group_mean[g];
376 fac.emplace_back(custom[g] / gm);
382 for (I<
decltype(num)> i = 0; i < num; ++i) {
383 size_factors[i] *= fac[block[i]];
387 for (I<
decltype(ngroups)> g = 0; g < ngroups; ++g) {
388 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:101
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:294
CenterBlockMode
Definition center_size_factors.hpp:219
SizeFactor_ center_size_factors(const std::size_t num, SizeFactor_ *const size_factors, const CenterSizeFactorsOptions &options)
Definition center_size_factors.hpp:194
Sanitize invalid size factors.
Options for center_size_factors_blocked().
Definition center_size_factors.hpp:224
std::optional< std::vector< double > > custom_centers
Definition center_size_factors.hpp:266
CenterBlockMode block_mode
Definition center_size_factors.hpp:260
bool ignore_invalid
Definition center_size_factors.hpp:229
SizeFactorDiagnostics * diagnostics
Definition center_size_factors.hpp:235
bool report_final
Definition center_size_factors.hpp:272
Options for center_size_factors().
Definition center_size_factors.hpp:146
bool ignore_invalid
Definition center_size_factors.hpp:155
bool report_final
Definition center_size_factors.hpp:174
double center
Definition center_size_factors.hpp:162
SizeFactorDiagnostics * diagnostics
Definition center_size_factors.hpp:168
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