1#ifndef SCRAN_NORM_CENTER_SIZE_FACTORS_HPP
2#define SCRAN_NORM_CENTER_SIZE_FACTORS_HPP
4#include "tatami_stats/tatami_stats.hpp"
78template<
typename SizeFactor_>
80 static_assert(std::is_floating_point<SizeFactor_>::value);
82 decltype(num) denom = 0;
86 auto& diag = (diagnostics == NULL ? tmpdiag : *diagnostics);
87 for (
decltype(num) i = 0; i < num; ++i) {
88 auto val = size_factors[i];
89 if (!internal::is_invalid(val, diag)) {
95 mean = std::accumulate(size_factors, size_factors + num,
static_cast<SizeFactor_
>(0));
124template<
typename SizeFactor_>
128 for (
decltype(num) i = 0; i < num; ++i){
129 size_factors[i] /= mean;
153template<
typename SizeFactor_,
typename Block_>
155 static_assert(std::is_floating_point<SizeFactor_>::value);
156 auto ngroups = tatami_stats::total_groups(block, num);
157 auto group_mean = sanisizer::create<std::vector<SizeFactor_> >(ngroups);
158 auto group_num = sanisizer::create<std::vector<
decltype(num)> >(ngroups);
162 auto& diag = (diagnostics == NULL ? tmpdiag : *diagnostics);
163 for (
decltype(num) i = 0; i < num; ++i) {
164 auto val = size_factors[i];
165 if (!internal::is_invalid(val, diag)) {
167 group_mean[b] += val;
172 for (
decltype(num) i = 0; i < num; ++i) {
174 group_mean[b] += size_factors[i];
179 for (
decltype(ngroups) g = 0; g < ngroups; ++g) {
181 group_mean[g] /= group_num[g];
206template<
typename SizeFactor_,
typename Block_>
210 if (options.
block_mode == CenterBlockMode::PER_BLOCK) {
211 for (
decltype(num) i = 0; i < num; ++i) {
212 const auto& div = group_mean[block[i]];
214 size_factors[i] /= div;
218 }
else if (options.
block_mode == CenterBlockMode::LOWEST) {
221 for (
auto m : group_mean) {
225 if (!found || m < min) {
233 for (
decltype(num) i = 0; i < num; ++i) {
234 size_factors[i] /= min;
Scaling normalization of single-cell data.
Definition center_size_factors.hpp:19
SizeFactor_ center_size_factors(std::size_t num, SizeFactor_ *size_factors, SizeFactorDiagnostics *diagnostics, const CenterSizeFactorsOptions &options)
Definition center_size_factors.hpp:125
std::vector< SizeFactor_ > center_size_factors_blocked(std::size_t num, SizeFactor_ *size_factors, const Block_ *block, SizeFactorDiagnostics *diagnostics, const CenterSizeFactorsOptions &options)
Definition center_size_factors.hpp:207
CenterBlockMode
Definition center_size_factors.hpp:24
std::vector< SizeFactor_ > center_size_factors_blocked_mean(std::size_t num, const SizeFactor_ *size_factors, const Block_ *block, SizeFactorDiagnostics *diagnostics, const CenterSizeFactorsOptions &options)
Definition center_size_factors.hpp:154
SizeFactor_ center_size_factors_mean(std::size_t num, const SizeFactor_ *size_factors, SizeFactorDiagnostics *diagnostics, const CenterSizeFactorsOptions &options)
Definition center_size_factors.hpp:79
Sanitize invalid size factors.
Options for center_size_factors() and center_size_factors_blocked().
Definition center_size_factors.hpp:29
CenterBlockMode block_mode
Definition center_size_factors.hpp:47
bool ignore_invalid
Definition center_size_factors.hpp:61
Diagnostics for the size factors.
Definition sanitize_size_factors.hpp:18