1#ifndef SCRAN_QC_ADT_QUALITY_CONTROL_HPP
2#define SCRAN_QC_ADT_QUALITY_CONTROL_HPP
11#include "sanisizer/sanisizer.hpp"
45template<
typename Sum_ =
double,
typename Detected_ =
int>
100template<
typename Value_,
typename Index_,
typename Subset_,
typename Sum_,
typename Detected_>
103 const std::vector<Subset_>& subsets,
124template<
typename Sum_ =
double,
typename Detected_ =
int>
162template<
typename Sum_ =
double,
typename Detected_ =
int,
typename Value_,
typename Index_,
typename Subset_>
165 const std::vector<Subset_>& subsets,
168 const auto NC = mat.
ncol();
173#ifdef SCRAN_QC_TEST_INIT
177 x.
sum = output.
sum.data();
180#ifdef SCRAN_QC_TEST_INIT
186 const auto nsubsets = subsets.size();
188 sanisizer::resize(output.
subset_sum, nsubsets);
189 for (I<
decltype(nsubsets)> s = 0; s < nsubsets; ++s) {
191#ifdef SCRAN_QC_TEST_INIT
230template<
typename Float_,
class Host_,
typename Sum_,
typename Detected_,
typename BlockSource_>
232 constexpr bool unblocked = std::is_same<BlockSource_, bool>::value;
234 if constexpr(unblocked) {
235 return sanisizer::create<std::vector<Float_> >(n);
247 host.get_detected() = [&]{
248 if constexpr(unblocked) {
258 auto& host_subsets = host.get_subset_sum();
259 sanisizer::resize(host_subsets, nsubsets);
266 for (I<
decltype(nsubsets)> s = 0; s < nsubsets; ++s) {
268 host.get_subset_sum()[s] = [&]{
269 if constexpr(unblocked) {
279template<
class Host_,
typename Sum_,
typename Detected_,
typename BlockSource_,
typename Output_>
280void adt_filter(
const Host_& host,
const std::size_t n,
const ComputeAdtQcMetricsBuffers<Sum_, Detected_>& metrics, BlockSource_ block, Output_*
const output) {
281 constexpr bool unblocked = std::is_same<BlockSource_, bool>::value;
282 std::fill_n(output, n, 1);
284 const auto& detected = host.get_detected();
285 for (I<
decltype(n)> i = 0; i < n; ++i) {
287 if constexpr(unblocked) {
290 return detected[block[i]];
293 output[i] = output[i] && (metrics.detected[i] >= thresh);
296 const auto nsubsets = metrics.subset_sum.size();
297 for (I<
decltype(nsubsets)> s = 0; s < nsubsets; ++s) {
298 const auto sub = metrics.subset_sum[s];
299 const auto& sthresh = host.get_subset_sum()[s];
300 for (I<
decltype(n)> i = 0; i < n; ++i) {
302 if constexpr(unblocked) {
305 return sthresh[block[i]];
308 output[i] = output[i] && (sub[i] <= thresh);
313template<
typename Sum_,
typename Detected_>
314ComputeAdtQcMetricsBuffers<const Sum_, const Detected_> to_buffer(
const ComputeAdtQcMetricsResults<Sum_, Detected_>& metrics) {
315 ComputeAdtQcMetricsBuffers<const Sum_, const Detected_> buffer;
316 buffer.sum = metrics.sum.data();
317 buffer.detected = metrics.detected.data();
318 buffer.subset_sum.reserve(metrics.subset_sum.size());
319 for (
const auto& s : metrics.subset_sum) {
320 buffer.subset_sum.push_back(s.data());
336template<
typename Float_ =
double>
351 return my_subset_sum;
366 return my_subset_sum;
370 Float_ my_detected = 0;
371 std::vector<Float_> my_subset_sum;
386 template<
typename Sum_,
typename Detected_,
typename Output_>
388 internal::adt_filter(*
this, num, metrics,
false, output);
401 template<
typename Sum_,
typename Detected_,
typename Output_>
403 return filter(metrics.
detected.size(), internal::to_buffer(metrics), output);
416 template<
typename Output_ =
unsigned char,
typename Sum_,
typename Detected_>
418 auto output = sanisizer::create<std::vector<Output_> >(metrics.
detected.size()
419#ifdef SCRAN_QC_TEST_INIT
423 filter(metrics, output.data());
453template<
typename Float_ =
double,
typename Sum_,
typename Detected_>
456 internal::adt_populate<Float_>(output, num, metrics,
false, options);
470template<
typename Float_ =
double,
typename Sum_,
typename Detected_>
481template<
typename Float_ =
double>
498 return my_subset_sum;
515 return my_subset_sum;
519 std::vector<Float_> my_sum;
520 std::vector<Float_> my_detected;
521 std::vector<std::vector<Float_> > my_subset_sum;
538 template<
typename Sum_,
typename Detected_,
typename Block_,
typename Output_>
540 internal::adt_filter(*
this, num, metrics, block, output);
556 template<
typename Sum_,
typename Detected_,
typename Block_,
typename Output_>
558 return filter(metrics.
detected.size(), internal::to_buffer(metrics), block, output);
574 template<
typename Output_ =
unsigned char,
typename Sum_,
typename Detected_,
typename Block_>
576 auto output = sanisizer::create<std::vector<Output_> >(metrics.
detected.size()
577#ifdef SCRAN_QC_TEST_INIT
581 filter(metrics, block, output.data());
603template<
typename Float_ =
double,
typename Sum_,
typename Detected_,
typename Block_>
605 const std::size_t num,
607 const Block_*
const block,
611 internal::adt_populate<Float_>(output, num, metrics, block, options);
627template<
typename Float_ =
double,
typename Sum_,
typename Detected_,
typename Block_>
630 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:482
void filter(const ComputeAdtQcMetricsResults< Sum_, Detected_ > &metrics, const Block_ *const block, Output_ *const output) const
Definition adt_quality_control.hpp:557
std::vector< std::vector< Float_ > > & get_subset_sum()
Definition adt_quality_control.hpp:514
std::vector< Float_ > & get_detected()
Definition adt_quality_control.hpp:505
void filter(const std::size_t num, const ComputeAdtQcMetricsBuffers< Sum_, Detected_ > &metrics, const Block_ *block, Output_ *const output) const
Definition adt_quality_control.hpp:539
const std::vector< Float_ > & get_detected() const
Definition adt_quality_control.hpp:488
std::vector< Output_ > filter(const ComputeAdtQcMetricsResults< Sum_, Detected_ > &metrics, const Block_ *const block) const
Definition adt_quality_control.hpp:575
const std::vector< std::vector< Float_ > > & get_subset_sum() const
Definition adt_quality_control.hpp:497
Filter for high-quality cells using ADT-based metrics.
Definition adt_quality_control.hpp:337
Float_ & get_detected()
Definition adt_quality_control.hpp:357
void filter(const std::size_t num, const ComputeAdtQcMetricsBuffers< Sum_, Detected_ > &metrics, Output_ *const output) const
Definition adt_quality_control.hpp:387
std::vector< Output_ > filter(const ComputeAdtQcMetricsResults< Sum_, Detected_ > &metrics) const
Definition adt_quality_control.hpp:417
Float_ get_detected() const
Definition adt_quality_control.hpp:342
const std::vector< Float_ > & get_subset_sum() const
Definition adt_quality_control.hpp:350
std::vector< Float_ > & get_subset_sum()
Definition adt_quality_control.hpp:365
void filter(const ComputeAdtQcMetricsResults< Sum_, Detected_ > &metrics, Output_ *const output) const
Definition adt_quality_control.hpp:402
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:225
AdtQcFilters< Float_ > compute_adt_qc_filters(const std::size_t num, const ComputeAdtQcMetricsBuffers< Sum_, Detected_ > &metrics, const ComputeAdtQcFiltersOptions &options)
Definition adt_quality_control.hpp:454
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:604
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:101
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:834
ChooseFilterThresholdsResults< Float_ > choose_filter_thresholds(const FindMedianMadResults< Float_ > &mm, const ChooseFilterThresholdsOptions &options)
Definition choose_filter_thresholds.hpp:143
void resize_container_to_Index_size(Container_ &container, const 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:66
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:205
double detected_min_drop
Definition adt_quality_control.hpp:216
double detected_num_mads
Definition adt_quality_control.hpp:210
double subset_sum_num_mads
Definition adt_quality_control.hpp:222
Buffers for compute_adt_qc_metrics().
Definition adt_quality_control.hpp:46
Detected_ * detected
Definition adt_quality_control.hpp:57
std::vector< Sum_ * > subset_sum
Definition adt_quality_control.hpp:64
Sum_ * sum
Definition adt_quality_control.hpp:51
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:125
std::vector< Detected_ > detected
Definition adt_quality_control.hpp:134
std::vector< Sum_ > sum
Definition adt_quality_control.hpp:129
std::vector< std::vector< Sum_ > > subset_sum
Definition adt_quality_control.hpp:140
Buffers for per_cell_qc_metrics().
Definition per_cell_qc_metrics.hpp:80
Sum_ * sum
Definition per_cell_qc_metrics.hpp:98
Detected_ * detected
Definition per_cell_qc_metrics.hpp:104
std::vector< Sum_ * > subset_sum
Definition per_cell_qc_metrics.hpp:124
Options for per_cell_qc_metrics().
Definition per_cell_qc_metrics.hpp:25
int num_threads
Definition per_cell_qc_metrics.hpp:66