1#ifndef SCRAN_NORM_CENTER_SIZE_FACTORS_HPP
2#define SCRAN_NORM_CENTER_SIZE_FACTORS_HPP
10#include "tatami_stats/tatami_stats.hpp"
79template<
typename SizeFactor_>
81 static_assert(std::is_floating_point<SizeFactor_>::value);
83 decltype(I(num)) denom = 0;
87 auto& diag = (diagnostics == NULL ? tmpdiag : *diagnostics);
88 for (
decltype(I(num)) i = 0; i < num; ++i) {
89 const auto val = size_factors[i];
90 if (!internal::is_invalid(val, diag)) {
96 mean = std::accumulate(size_factors, size_factors + num,
static_cast<SizeFactor_
>(0));
125template<
typename SizeFactor_>
129 for (
decltype(I(num)) i = 0; i < num; ++i){
130 size_factors[i] /= mean;
155template<
typename SizeFactor_,
typename Block_>
157 const std::size_t num,
158 const SizeFactor_*
const size_factors,
159 const Block_*
const block,
163 static_assert(std::is_floating_point<SizeFactor_>::value);
164 const auto ngroups = tatami_stats::total_groups(block, num);
165 auto group_mean = sanisizer::create<std::vector<SizeFactor_> >(ngroups);
166 auto group_num = sanisizer::create<std::vector<
decltype(I(num))> >(ngroups);
170 auto& diag = (diagnostics == NULL ? tmpdiag : *diagnostics);
171 for (
decltype(I(num)) i = 0; i < num; ++i) {
172 const auto val = size_factors[i];
173 if (!internal::is_invalid(val, diag)) {
174 const auto b = block[i];
175 group_mean[b] += val;
180 for (
decltype(I(num)) i = 0; i < num; ++i) {
181 const auto b = block[i];
182 group_mean[b] += size_factors[i];
187 for (
decltype(I(ngroups)) g = 0; g < ngroups; ++g) {
189 group_mean[g] /= group_num[g];
215template<
typename SizeFactor_,
typename Block_>
217 const std::size_t num,
218 SizeFactor_*
const size_factors,
219 const Block_*
const block,
225 if (options.
block_mode == CenterBlockMode::PER_BLOCK) {
226 for (
decltype(I(num)) i = 0; i < num; ++i) {
227 const auto& div = group_mean[block[i]];
229 size_factors[i] /= div;
233 }
else if (options.
block_mode == CenterBlockMode::LOWEST) {
236 for (
const auto m : group_mean) {
240 if (!found || m < min) {
248 for (
decltype(I(num)) i = 0; i < num; ++i) {
249 size_factors[i] /= min;
Scaling normalization of single-cell data.
Definition center_size_factors.hpp:20
std::vector< SizeFactor_ > center_size_factors_blocked(const std::size_t num, SizeFactor_ *const size_factors, const Block_ *const block, SizeFactorDiagnostics *const diagnostics, const CenterSizeFactorsOptions &options)
Definition center_size_factors.hpp:216
CenterBlockMode
Definition center_size_factors.hpp:25
SizeFactor_ center_size_factors_mean(const std::size_t num, const SizeFactor_ *const size_factors, SizeFactorDiagnostics *const diagnostics, const CenterSizeFactorsOptions &options)
Definition center_size_factors.hpp:80
std::vector< SizeFactor_ > center_size_factors_blocked_mean(const std::size_t num, const SizeFactor_ *const size_factors, const Block_ *const block, SizeFactorDiagnostics *const diagnostics, const CenterSizeFactorsOptions &options)
Definition center_size_factors.hpp:156
SizeFactor_ center_size_factors(const std::size_t num, SizeFactor_ *const size_factors, SizeFactorDiagnostics *const diagnostics, const CenterSizeFactorsOptions &options)
Definition center_size_factors.hpp:126
Sanitize invalid size factors.
Options for center_size_factors() and center_size_factors_blocked().
Definition center_size_factors.hpp:30
CenterBlockMode block_mode
Definition center_size_factors.hpp:48
bool ignore_invalid
Definition center_size_factors.hpp:62
Diagnostics for the size factors.
Definition sanitize_size_factors.hpp:20