1#ifndef SCRAN_SUGGEST_CRISPR_QC_FILTERS_H
2#define SCRAN_SUGGEST_CRISPR_QC_FILTERS_H
4#include "../utils/macros.hpp"
115 template<
bool overwrite = true,
typename Float,
typename Integer,
typename Output>
118 throw std::runtime_error(
"should use filter_blocked() for multiple batches");
120 filter_<overwrite>(n, buffers, output, [](
size_t i) ->
size_t {
return 0; });
134 template<
typename Output = u
int8_t>
136 std::vector<Output> output(metrics.
sums.size());
158 template<
bool overwrite = true,
typename Block,
typename Float,
typename Integer,
typename Output>
161 filter_<overwrite>(n, buffers, output, [&](
size_t i) -> Block {
return block[i]; });
163 filter<overwrite>(n, buffers, output);
181 template<
typename Output = u
int8_t,
typename Block>
183 std::vector<Output> output(metrics.
sums.size());
189 template<
bool overwrite,
typename Float,
typename Integer,
typename Output,
typename Function>
191 for (
size_t i = 0; i < n; ++i) {
195 if (quality_control::is_less_than<double>(candidate,
max_count[b])) {
200 if constexpr(overwrite) {
219 template<
typename Float,
typename Integer>
221 return run_blocked(n,
static_cast<int*
>(NULL), buffers);
248 template<
typename Block,
typename Float,
typename Integer>
251 std::vector<int> starts;
252 std::vector<Block> subblock;
259 std::vector<double> workspace(n);
260 std::vector<double> subvalues;
261 subvalues.reserve(n);
269 for (
size_t i = 0; i < n; ++i) {
271 if (quality_control::is_greater_than_or_equal_to(p, prop_res.medians[block[i]])) {
272 subvalues.push_back(p * buffers.
sums[i]);
273 subblock.push_back(block[i]);
277 for (
size_t i = 0; i < n; ++i) {
279 if (quality_control::is_greater_than_or_equal_to(p, prop_res.medians[0])) {
280 subvalues.push_back(p * buffers.
sums[i]);
291 const Block* bptr = NULL;
294 bptr = subblock.data();
298 auto sums_res = meddler.
run_blocked(subvalues.size(), bptr, starts, subvalues.data(), workspace.data());
303 auto sums_filt = filter.
run(std::move(sums_res));
305 output.
max_count = std::move(sums_filt.lower);
322 template<
typename Block>
Define outlier filters using a MAD-based approach.
Compute per-cell quality control metrics from a CRISPR guide count matrix.
Create filters to identify low-quality cells from CRISPR-derived QC metrics.
Definition SuggestCrisprQcFilters.hpp:55
Thresholds run(size_t n, const PerCellCrisprQcMetrics::Buffers< Float, Integer > &buffers) const
Definition SuggestCrisprQcFilters.hpp:220
Thresholds run_blocked(size_t n, const Block *block, const PerCellCrisprQcMetrics::Buffers< Float, Integer > &buffers) const
Definition SuggestCrisprQcFilters.hpp:249
Thresholds run_blocked(const PerCellCrisprQcMetrics::Results &metrics, const Block *block) const
Definition SuggestCrisprQcFilters.hpp:323
SuggestCrisprQcFilters & set_num_mads(double n=Defaults::num_mads)
Definition SuggestCrisprQcFilters.hpp:77
Thresholds run(const PerCellCrisprQcMetrics::Results &metrics) const
Definition SuggestCrisprQcFilters.hpp:230
Functions for single-cell RNA-seq analyses.
Definition AggregateAcrossCells.hpp:18
Define outlier filters from the median and MAD.
Definition ChooseOutlierFilters.hpp:30
ChooseOutlierFilters & set_num_mads(double n=Defaults::num_mads)
Definition ChooseOutlierFilters.hpp:92
Thresholds run(ComputeMedianMad::Results x) const
Definition ChooseOutlierFilters.hpp:273
ChooseOutlierFilters & set_upper(bool u=Defaults::upper)
Definition ChooseOutlierFilters.hpp:81
Buffers for direct storage of the calculated statistics.
Definition PerCellCrisprQcMetrics.hpp:73
Float * max_proportion
Definition PerCellCrisprQcMetrics.hpp:87
Float * sums
Definition PerCellCrisprQcMetrics.hpp:77
Result store for QC metric calculations.
Definition PerCellCrisprQcMetrics.hpp:142
Buffers buffers()
Definition PerCellCrisprQcMetrics.hpp:178
std::vector< double > max_proportion
Definition PerCellCrisprQcMetrics.hpp:166
std::vector< double > sums
Definition PerCellCrisprQcMetrics.hpp:156
Default parameters.
Definition SuggestCrisprQcFilters.hpp:60
static constexpr double num_mads
Definition SuggestCrisprQcFilters.hpp:64
Thresholds to define outliers on each metric.
Definition SuggestCrisprQcFilters.hpp:90
void filter(size_t n, const PerCellCrisprQcMetrics::Buffers< Float, Integer > &buffers, Output *output) const
Definition SuggestCrisprQcFilters.hpp:116
std::vector< Output > filter_blocked(const PerCellCrisprQcMetrics::Results &metrics, const Block *block) const
Definition SuggestCrisprQcFilters.hpp:182
void filter_blocked(size_t n, const Block *block, const PerCellCrisprQcMetrics::Buffers< Float, Integer > &buffers, Output *output) const
Definition SuggestCrisprQcFilters.hpp:159
std::vector< double > max_count
Definition SuggestCrisprQcFilters.hpp:96
std::vector< Output > filter(const PerCellCrisprQcMetrics::Results &metrics) const
Definition SuggestCrisprQcFilters.hpp:135