1#ifndef SCRAN_NORM_CENTER_SIZE_FACTORS_HPP
2#define SCRAN_NORM_CENTER_SIZE_FACTORS_HPP
10#include "sanisizer/sanisizer.hpp"
56template<
typename SizeFactor_>
58 static_assert(std::is_floating_point<SizeFactor_>::value);
60 I<
decltype(num_cells)> denom = 0;
64 for (I<
decltype(num_cells)> i = 0; i < num_cells; ++i) {
65 const auto val = size_factors[i];
66 if (!internal::is_invalid(val, tmpdiag)) {
76 mean = std::accumulate(size_factors, size_factors + num_cells,
static_cast<SizeFactor_
>(0));
103template<
typename SizeFactor_,
typename Block_>
105 const std::size_t num_cells,
106 const SizeFactor_*
const size_factors,
107 const Block_*
const block,
108 const std::size_t num_blocks,
111 static_assert(std::is_floating_point<SizeFactor_>::value);
112 auto block_mean = sanisizer::create<std::vector<SizeFactor_> >(num_blocks);
113 auto block_num = sanisizer::create<std::vector<I<
decltype(num_cells)> > >(num_blocks);
117 for (I<
decltype(num_cells)> i = 0; i < num_cells; ++i) {
118 const auto val = size_factors[i];
119 if (!internal::is_invalid(val, tmpdiag)) {
120 const auto b = block[i];
121 block_mean[b] += val;
130 for (I<
decltype(num_cells)> i = 0; i < num_cells; ++i) {
131 const auto b = block[i];
132 block_mean[b] += size_factors[i];
137 for (I<
decltype(num_blocks)> g = 0; g < num_blocks; ++g) {
139 block_mean[g] /= block_num[g];
196template<
typename SizeFactor_>
207 const SizeFactor_ mult = options.
center / mean;
208 for (I<
decltype(num_cells)> i = 0; i < num_cells; ++i){
209 size_factors[i] *= mult;
297template<
typename SizeFactor_,
typename Block_>
299 const std::size_t num_cells,
300 SizeFactor_*
const size_factors,
301 const Block_*
const block,
302 const std::size_t num_blocks,
310 if (options.
block_mode == CenterBlockMode::PER_BLOCK) {
311 std::vector<SizeFactor_> fac;
312 fac.reserve(num_blocks);
313 for (I<
decltype(num_blocks)> g = 0; g < num_blocks; ++g) {
314 const auto gm = block_mean[g];
316 fac.emplace_back(1 / gm);
322 for (I<
decltype(num_cells)> i = 0; i < num_cells; ++i) {
323 size_factors[i] *= fac[block[i]];
327 for (
auto& gm : block_mean) {
336 }
else if (options.
block_mode == CenterBlockMode::LOWEST) {
339 for (
const auto m : block_mean) {
343 if (!found || m < min) {
351 const SizeFactor_ mult = 1 / min;
352 for (I<
decltype(num_cells)> i = 0; i < num_cells; ++i) {
353 size_factors[i] *= mult;
357 for (
auto& gm : block_mean) {
367 throw std::runtime_error(
"'custom_centers' should be set for custom block centers");
370 if (custom.size() != num_blocks) {
371 throw std::runtime_error(
"length of 'custom_centers' should be equal to the number of blocks");
374 std::vector<SizeFactor_> fac;
375 fac.reserve(num_blocks);
376 for (I<
decltype(num_blocks)> g = 0; g < num_blocks; ++g) {
377 const auto gm = block_mean[g];
379 fac.emplace_back(custom[g] / gm);
385 for (I<
decltype(num_cells)> i = 0; i < num_cells; ++i) {
386 size_factors[i] *= fac[block[i]];
390 for (I<
decltype(num_blocks)> g = 0; g < num_blocks; ++g) {
391 auto& gm = block_mean[g];
Scaling normalization of single-cell data.
Definition center_size_factors.hpp:20
SizeFactor_ center_size_factors(const std::size_t num_cells, SizeFactor_ *const size_factors, const CenterSizeFactorsOptions &options)
Definition center_size_factors.hpp:197
std::vector< SizeFactor_ > center_size_factors_blocked(const std::size_t num_cells, SizeFactor_ *const size_factors, const Block_ *const block, const std::size_t num_blocks, const CenterSizeFactorsBlockedOptions &options)
Definition center_size_factors.hpp:298
CenterBlockMode
Definition center_size_factors.hpp:222
SizeFactor_ compute_mean_size_factor(const std::size_t num_cells, const SizeFactor_ *const size_factors, const ComputeMeanSizeFactorOptions &options)
Definition center_size_factors.hpp:57
std::vector< SizeFactor_ > compute_mean_size_factor_blocked(const std::size_t num_cells, const SizeFactor_ *const size_factors, const Block_ *const block, const std::size_t num_blocks, const ComputeMeanSizeFactorOptions &options)
Definition center_size_factors.hpp:104
Sanitize invalid size factors.
Options for center_size_factors_blocked().
Definition center_size_factors.hpp:227
std::optional< std::vector< double > > custom_centers
Definition center_size_factors.hpp:269
CenterBlockMode block_mode
Definition center_size_factors.hpp:263
bool ignore_invalid
Definition center_size_factors.hpp:232
SizeFactorDiagnostics * diagnostics
Definition center_size_factors.hpp:238
bool report_final
Definition center_size_factors.hpp:275
Options for center_size_factors().
Definition center_size_factors.hpp:149
bool ignore_invalid
Definition center_size_factors.hpp:158
bool report_final
Definition center_size_factors.hpp:177
double center
Definition center_size_factors.hpp:165
SizeFactorDiagnostics * diagnostics
Definition center_size_factors.hpp:171
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:21