1#ifndef SCRAN_QC_ADT_QUALITY_CONTROL_HPP
2#define SCRAN_QC_ADT_QUALITY_CONTROL_HPP
11#include "sanisizer/sanisizer.hpp"
43template<
typename Sum_ =
double,
typename Detected_ =
int>
96template<
typename Value_,
typename Index_,
typename Subset_,
typename Sum_,
typename Detected_>
99 const std::vector<Subset_>& subsets,
118template<
typename Sum_ =
double,
typename Detected_ =
int>
154template<
typename Sum_ =
double,
typename Detected_ =
int,
typename Value_,
typename Index_,
typename Subset_>
157 const std::vector<Subset_>& subsets,
160 const auto NC = mat.
ncol();
165#ifdef SCRAN_QC_TEST_INIT
169 x.
sum = output.
sum.data();
172#ifdef SCRAN_QC_TEST_INIT
178 const auto nsubsets = subsets.size();
180 sanisizer::resize(output.
subset_sum, nsubsets);
181 for (
decltype(I(nsubsets)) s = 0; s < nsubsets; ++s) {
183#ifdef SCRAN_QC_TEST_INIT
222template<
typename Float_,
class Host_,
typename Sum_,
typename Detected_,
typename BlockSource_>
224 constexpr bool unblocked = std::is_same<BlockSource_, bool>::value;
226 if constexpr(unblocked) {
227 return sanisizer::create<std::vector<Float_> >(n);
239 host.get_detected() = [&]{
240 if constexpr(unblocked) {
250 auto& host_subsets = host.get_subset_sum();
251 sanisizer::resize(host_subsets, nsubsets);
258 for (
decltype(I(nsubsets)) s = 0; s < nsubsets; ++s) {
260 host.get_subset_sum()[s] = [&]{
261 if constexpr(unblocked) {
271template<
class Host_,
typename Sum_,
typename Detected_,
typename BlockSource_,
typename Output_>
272void adt_filter(
const Host_& host,
const std::size_t n,
const ComputeAdtQcMetricsBuffers<Sum_, Detected_>& metrics, BlockSource_ block, Output_*
const output) {
273 constexpr bool unblocked = std::is_same<BlockSource_, bool>::value;
274 std::fill_n(output, n, 1);
276 const auto& detected = host.get_detected();
277 for (
decltype(I(n)) i = 0; i < n; ++i) {
279 if constexpr(unblocked) {
282 return detected[block[i]];
285 output[i] = output[i] && (metrics.detected[i] >= thresh);
288 const auto nsubsets = metrics.subset_sum.size();
289 for (
decltype(I(nsubsets)) s = 0; s < nsubsets; ++s) {
290 const auto sub = metrics.subset_sum[s];
291 const auto& sthresh = host.get_subset_sum()[s];
292 for (
decltype(I(n)) i = 0; i < n; ++i) {
294 if constexpr(unblocked) {
297 return sthresh[block[i]];
300 output[i] = output[i] && (sub[i] <= thresh);
305template<
typename Sum_,
typename Detected_>
306ComputeAdtQcMetricsBuffers<const Sum_, const Detected_> to_buffer(
const ComputeAdtQcMetricsResults<Sum_, Detected_>& metrics) {
307 ComputeAdtQcMetricsBuffers<const Sum_, const Detected_> buffer;
308 buffer.sum = metrics.sum.data();
309 buffer.detected = metrics.detected.data();
310 buffer.subset_sum.reserve(metrics.subset_sum.size());
311 for (
const auto& s : metrics.subset_sum) {
312 buffer.subset_sum.push_back(s.data());
328template<
typename Float_ =
double>
343 return my_subset_sum;
358 return my_subset_sum;
362 Float_ my_detected = 0;
363 std::vector<Float_> my_subset_sum;
378 template<
typename Sum_,
typename Detected_,
typename Output_>
380 internal::adt_filter(*
this, num, metrics,
false, output);
393 template<
typename Sum_,
typename Detected_,
typename Output_>
395 return filter(metrics.
detected.size(), internal::to_buffer(metrics), output);
408 template<
typename Output_ =
unsigned char,
typename Sum_,
typename Detected_>
410 auto output = sanisizer::create<std::vector<Output_> >(metrics.
detected.size()
411#ifdef SCRAN_QC_TEST_INIT
415 filter(metrics, output.data());
444template<
typename Float_ =
double,
typename Sum_,
typename Detected_>
447 internal::adt_populate<Float_>(output, num, metrics,
false, options);
461template<
typename Float_ =
double,
typename Sum_,
typename Detected_>
472template<
typename Float_ =
double>
489 return my_subset_sum;
506 return my_subset_sum;
510 std::vector<Float_> my_sum;
511 std::vector<Float_> my_detected;
512 std::vector<std::vector<Float_> > my_subset_sum;
529 template<
typename Sum_,
typename Detected_,
typename Block_,
typename Output_>
531 internal::adt_filter(*
this, num, metrics, block, output);
547 template<
typename Sum_,
typename Detected_,
typename Block_,
typename Output_>
549 return filter(metrics.
detected.size(), internal::to_buffer(metrics), block, output);
565 template<
typename Output_ =
unsigned char,
typename Sum_,
typename Detected_,
typename Block_>
567 auto output = sanisizer::create<std::vector<Output_> >(metrics.
detected.size()
568#ifdef SCRAN_QC_TEST_INIT
572 filter(metrics, block, output.data());
594template<
typename Float_ =
double,
typename Sum_,
typename Detected_,
typename Block_>
596 const std::size_t num,
598 const Block_*
const block,
602 internal::adt_populate<Float_>(output, num, metrics, block, options);
618template<
typename Float_ =
double,
typename Sum_,
typename Detected_,
typename Block_>
621 const Block_*
const block,
Define QC filter thresholds using a MAD-based approach.
Filter on ADT-based QC metrics with blocking.
Definition adt_quality_control.hpp:473
void filter(const ComputeAdtQcMetricsResults< Sum_, Detected_ > &metrics, const Block_ *const block, Output_ *const output) const
Definition adt_quality_control.hpp:548
std::vector< std::vector< Float_ > > & get_subset_sum()
Definition adt_quality_control.hpp:505
std::vector< Float_ > & get_detected()
Definition adt_quality_control.hpp:496
void filter(const std::size_t num, const ComputeAdtQcMetricsBuffers< Sum_, Detected_ > &metrics, const Block_ *block, Output_ *const output) const
Definition adt_quality_control.hpp:530
const std::vector< Float_ > & get_detected() const
Definition adt_quality_control.hpp:479
std::vector< Output_ > filter(const ComputeAdtQcMetricsResults< Sum_, Detected_ > &metrics, const Block_ *const block) const
Definition adt_quality_control.hpp:566
const std::vector< std::vector< Float_ > > & get_subset_sum() const
Definition adt_quality_control.hpp:488
Filter for high-quality cells using ADT-based metrics.
Definition adt_quality_control.hpp:329
Float_ & get_detected()
Definition adt_quality_control.hpp:349
void filter(const std::size_t num, const ComputeAdtQcMetricsBuffers< Sum_, Detected_ > &metrics, Output_ *const output) const
Definition adt_quality_control.hpp:379
std::vector< Output_ > filter(const ComputeAdtQcMetricsResults< Sum_, Detected_ > &metrics) const
Definition adt_quality_control.hpp:409
Float_ get_detected() const
Definition adt_quality_control.hpp:334
const std::vector< Float_ > & get_subset_sum() const
Definition adt_quality_control.hpp:342
std::vector< Float_ > & get_subset_sum()
Definition adt_quality_control.hpp:357
void filter(const ComputeAdtQcMetricsResults< Sum_, Detected_ > &metrics, Output_ *const output) const
Definition adt_quality_control.hpp:394
virtual Index_ ncol() const=0
Simple quality control for single-cell data.
Definition adt_quality_control.hpp:23
std::vector< ChooseFilterThresholdsResults< Float_ > > choose_filter_thresholds_blocked(const std::vector< FindMedianMadResults< Float_ > > &mms, const ChooseFilterThresholdsOptions &options)
Definition choose_filter_thresholds.hpp:218
AdtQcFilters< Float_ > compute_adt_qc_filters(const std::size_t num, const ComputeAdtQcMetricsBuffers< Sum_, Detected_ > &metrics, const ComputeAdtQcFiltersOptions &options)
Definition adt_quality_control.hpp:445
AdtQcBlockedFilters< Float_ > compute_adt_qc_filters_blocked(const std::size_t num, const ComputeAdtQcMetricsBuffers< Sum_, Detected_ > &metrics, const Block_ *const block, const ComputeAdtQcFiltersOptions &options)
Definition adt_quality_control.hpp:595
void compute_adt_qc_metrics(const tatami::Matrix< Value_, Index_ > &mat, const std::vector< Subset_ > &subsets, const ComputeAdtQcMetricsBuffers< Sum_, Detected_ > &output, const ComputeAdtQcMetricsOptions &options)
Definition adt_quality_control.hpp:97
void per_cell_qc_metrics(const tatami::Matrix< Value_, Index_ > &mat, const std::vector< Subset_ > &subsets, const PerCellQcMetricsBuffers< Sum_, Detected_, Value_, Index_ > &output, const PerCellQcMetricsOptions &options)
Definition per_cell_qc_metrics.hpp:828
ChooseFilterThresholdsResults< Float_ > choose_filter_thresholds(const FindMedianMadResults< Float_ > &mm, const ChooseFilterThresholdsOptions &options)
Definition choose_filter_thresholds.hpp:136
void resize_container_to_Index_size(Container_ &container, Index_ x, Args_ &&... args)
Compute per-cell quality control metrics.
Options for choose_filter_thresholds().
Definition choose_filter_thresholds.hpp:21
bool upper
Definition choose_filter_thresholds.hpp:32
bool log
Definition choose_filter_thresholds.hpp:59
double num_mads
Definition choose_filter_thresholds.hpp:39
double min_diff
Definition choose_filter_thresholds.hpp:46
bool lower
Definition choose_filter_thresholds.hpp:26
Options for compute_adt_qc_filters().
Definition adt_quality_control.hpp:197
double detected_min_drop
Definition adt_quality_control.hpp:208
double detected_num_mads
Definition adt_quality_control.hpp:202
double subset_sum_num_mads
Definition adt_quality_control.hpp:214
Buffers for compute_adt_qc_metrics().
Definition adt_quality_control.hpp:44
Detected_ * detected
Definition adt_quality_control.hpp:55
std::vector< Sum_ * > subset_sum
Definition adt_quality_control.hpp:62
Sum_ * sum
Definition adt_quality_control.hpp:49
Options for compute_adt_qc_metrics().
Definition adt_quality_control.hpp:28
int num_threads
Definition adt_quality_control.hpp:33
Results of compute_adt_qc_metrics().
Definition adt_quality_control.hpp:119
std::vector< Detected_ > detected
Definition adt_quality_control.hpp:128
std::vector< Sum_ > sum
Definition adt_quality_control.hpp:123
std::vector< std::vector< Sum_ > > subset_sum
Definition adt_quality_control.hpp:134
Buffers for per_cell_qc_metrics().
Definition per_cell_qc_metrics.hpp:78
Sum_ * sum
Definition per_cell_qc_metrics.hpp:96
Detected_ * detected
Definition per_cell_qc_metrics.hpp:102
std::vector< Sum_ * > subset_sum
Definition per_cell_qc_metrics.hpp:122
Options for per_cell_qc_metrics().
Definition per_cell_qc_metrics.hpp:25
int num_threads
Definition per_cell_qc_metrics.hpp:66