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