1#ifndef SCRAN_QC_ADT_QUALITY_CONTROL_HPP
2#define SCRAN_QC_ADT_QUALITY_CONTROL_HPP
11#include "sanisizer/sanisizer.hpp"
50template<
typename Sum_ =
double,
typename Detected_ =
int>
108template<
typename Value_,
typename Index_,
typename Subset_,
typename Sum_,
typename Detected_>
111 const std::vector<Subset_>& subsets,
133template<
typename Sum_ =
double,
typename Detected_ =
int>
174template<
typename Sum_ =
double,
typename Detected_ =
int,
typename Value_,
typename Index_,
typename Subset_>
177 const std::vector<Subset_>& subsets,
180 const auto NC = mat.
ncol();
185#ifdef SCRAN_QC_TEST_INIT
189 x.
sum = output.
sum.data();
192#ifdef SCRAN_QC_TEST_INIT
198 const auto nsubsets = subsets.size();
200 sanisizer::resize(output.
subset_sum, nsubsets);
201 for (I<
decltype(nsubsets)> s = 0; s < nsubsets; ++s) {
203#ifdef SCRAN_QC_TEST_INIT
240template<
typename Float_,
class Host_,
typename Sum_,
typename Detected_,
typename BlockSource_>
241void compute_adt_qc_filters_internal(
243 const std::size_t num_cells,
246 const std::size_t num_blocks,
249 constexpr bool unblocked = std::is_same<BlockSource_, bool>::value;
251 if constexpr(unblocked) {
252 return sanisizer::create<std::vector<Float_> >(num_cells);
259 ChooseFilterThresholdsOptions opts;
264 host.get_detected() = [&]{
265 if constexpr(unblocked) {
275 auto& host_subsets = host.get_subset_sum();
276 sanisizer::resize(host_subsets, nsubsets);
278 ChooseFilterThresholdsOptions opts;
283 for (I<
decltype(nsubsets)> s = 0; s < nsubsets; ++s) {
285 host.get_subset_sum()[s] = [&]{
286 if constexpr(unblocked) {
296template<
class Host_,
typename Sum_,
typename Detected_,
typename BlockSource_,
typename Output_>
297void apply_adt_qc_filters_internal(
299 const std::size_t num_cells,
300 const ComputeAdtQcMetricsBuffers<Sum_, Detected_>& metrics,
302 Output_*
const output
304 constexpr bool unblocked = std::is_same<BlockSource_, bool>::value;
305 std::fill_n(output, num_cells, 1);
307 const auto& detected = host.get_detected();
308 for (I<
decltype(num_cells)> i = 0; i < num_cells; ++i) {
310 if constexpr(unblocked) {
313 return detected[block[i]];
316 output[i] = output[i] && (metrics.detected[i] >= thresh);
319 const auto nsubsets = metrics.subset_sum.size();
320 for (I<
decltype(nsubsets)> s = 0; s < nsubsets; ++s) {
321 const auto sub = metrics.subset_sum[s];
322 const auto& sthresh = host.get_subset_sum()[s];
323 for (I<
decltype(num_cells)> i = 0; i < num_cells; ++i) {
325 if constexpr(unblocked) {
328 return sthresh[block[i]];
331 output[i] = output[i] && (sub[i] <= thresh);
336template<
typename Sum_,
typename Detected_>
337ComputeAdtQcMetricsBuffers<const Sum_, const Detected_> adt_qc_results_to_buffers(
const ComputeAdtQcMetricsResults<Sum_, Detected_>& metrics) {
338 ComputeAdtQcMetricsBuffers<const Sum_, const Detected_> buffer;
339 buffer.sum = metrics.sum.data();
340 buffer.detected = metrics.detected.data();
341 buffer.subset_sum.reserve(metrics.subset_sum.size());
342 for (
const auto& s : metrics.subset_sum) {
343 buffer.subset_sum.push_back(s.data());
357template<
typename Float_ =
double>
372 return my_subset_sum;
387 return my_subset_sum;
391 Float_ my_detected = 0;
392 std::vector<Float_> my_subset_sum;
407 template<
typename Sum_,
typename Detected_,
typename Output_>
409 apply_adt_qc_filters_internal(*
this, num_cells, metrics,
false, output);
422 template<
typename Sum_,
typename Detected_,
typename Output_>
424 return filter(metrics.
detected.size(), adt_qc_results_to_buffers(metrics), output);
437 template<
typename Output_ =
unsigned char,
typename Sum_,
typename Detected_>
439 auto output = sanisizer::create<std::vector<Output_> >(metrics.
detected.size()
440#ifdef SCRAN_QC_TEST_INIT
444 filter(metrics, output.data());
474template<
typename Float_ =
double,
typename Sum_,
typename Detected_>
476 const std::size_t num_cells,
481 compute_adt_qc_filters_internal<Float_>(output, num_cells, metrics,
false, 0, options);
495template<
typename Float_ =
double,
typename Sum_,
typename Detected_>
506template<
typename Float_ =
double>
523 return my_subset_sum;
540 return my_subset_sum;
544 std::vector<Float_> my_sum;
545 std::vector<Float_> my_detected;
546 std::vector<std::vector<Float_> > my_subset_sum;
563 template<
typename Sum_,
typename Detected_,
typename Block_,
typename Output_>
565 apply_adt_qc_filters_internal(*
this, num_cells, metrics, block, output);
581 template<
typename Sum_,
typename Detected_,
typename Block_,
typename Output_>
583 return filter(metrics.
detected.size(), adt_qc_results_to_buffers(metrics), block, output);
599 template<
typename Output_ =
unsigned char,
typename Sum_,
typename Detected_,
typename Block_>
601 auto output = sanisizer::create<std::vector<Output_> >(metrics.
detected.size()
602#ifdef SCRAN_QC_TEST_INIT
606 filter(metrics, block, output.data());
629template<
typename Float_ =
double,
typename Sum_,
typename Detected_,
typename Block_>
631 const std::size_t num_cells,
633 const Block_*
const block,
634 const std::size_t num_blocks,
638 compute_adt_qc_filters_internal<Float_>(output, num_cells, metrics, block, num_blocks, options);
655template<
typename Float_ =
double,
typename Sum_,
typename Detected_,
typename Block_>
658 const Block_*
const block,
659 const std::size_t num_blocks,
Define QC filter thresholds using a MAD-based approach.
Filter on ADT-based QC metrics with blocking.
Definition adt_quality_control.hpp:507
void filter(const ComputeAdtQcMetricsResults< Sum_, Detected_ > &metrics, const Block_ *const block, Output_ *const output) const
Definition adt_quality_control.hpp:582
std::vector< std::vector< Float_ > > & get_subset_sum()
Definition adt_quality_control.hpp:539
void filter(const std::size_t num_cells, const ComputeAdtQcMetricsBuffers< Sum_, Detected_ > &metrics, const Block_ *block, Output_ *const output) const
Definition adt_quality_control.hpp:564
std::vector< Float_ > & get_detected()
Definition adt_quality_control.hpp:530
const std::vector< Float_ > & get_detected() const
Definition adt_quality_control.hpp:513
std::vector< Output_ > filter(const ComputeAdtQcMetricsResults< Sum_, Detected_ > &metrics, const Block_ *const block) const
Definition adt_quality_control.hpp:600
const std::vector< std::vector< Float_ > > & get_subset_sum() const
Definition adt_quality_control.hpp:522
Filter for high-quality cells using ADT-based metrics.
Definition adt_quality_control.hpp:358
Float_ & get_detected()
Definition adt_quality_control.hpp:378
std::vector< Output_ > filter(const ComputeAdtQcMetricsResults< Sum_, Detected_ > &metrics) const
Definition adt_quality_control.hpp:438
Float_ get_detected() const
Definition adt_quality_control.hpp:363
const std::vector< Float_ > & get_subset_sum() const
Definition adt_quality_control.hpp:371
std::vector< Float_ > & get_subset_sum()
Definition adt_quality_control.hpp:386
void filter(const ComputeAdtQcMetricsResults< Sum_, Detected_ > &metrics, Output_ *const output) const
Definition adt_quality_control.hpp:423
void filter(const std::size_t num_cells, const ComputeAdtQcMetricsBuffers< Sum_, Detected_ > &metrics, Output_ *const output) const
Definition adt_quality_control.hpp:408
virtual Index_ ncol() const=0
Simple quality control for single-cell data.
Definition adt_quality_control.hpp:22
std::vector< ChooseFilterThresholdsResults< Float_ > > choose_filter_thresholds_blocked(const std::size_t num_cells, const Value_ *const metrics, const Block_ *const block, const std::size_t num_blocks, ChooseFilterThresholdsBlockedWorkspace< Float_ > &workspace, const ChooseFilterThresholdsOptions &options)
Definition choose_filter_thresholds.hpp:327
AdtQcFilters< Float_ > compute_adt_qc_filters(const std::size_t num_cells, const ComputeAdtQcMetricsBuffers< Sum_, Detected_ > &metrics, const ComputeAdtQcFiltersOptions &options)
Definition adt_quality_control.hpp:475
AdtQcBlockedFilters< Float_ > compute_adt_qc_filters_blocked(const std::size_t num_cells, const ComputeAdtQcMetricsBuffers< Sum_, Detected_ > &metrics, const Block_ *const block, const std::size_t num_blocks, const ComputeAdtQcFiltersOptions &options)
Definition adt_quality_control.hpp:630
ChooseFilterThresholdsResults< Float_ > choose_filter_thresholds(const std::size_t num_cells, const Value_ *const metrics, Float_ *const buffer, const ChooseFilterThresholdsOptions &options)
Definition choose_filter_thresholds.hpp:194
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:109
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:1001
void resize_container_to_Index_size(Container_ &container, const Index_ x, Args_ &&... args)
Compute per-cell quality control metrics.
Workspace for choose_filter_thresholds_blocked().
Definition choose_filter_thresholds.hpp:220
Options for compute_adt_qc_filters().
Definition adt_quality_control.hpp:217
double detected_min_drop
Definition adt_quality_control.hpp:228
double detected_num_mads
Definition adt_quality_control.hpp:222
double subset_sum_num_mads
Definition adt_quality_control.hpp:234
Buffers for compute_adt_qc_metrics().
Definition adt_quality_control.hpp:51
Detected_ * detected
Definition adt_quality_control.hpp:64
std::vector< Sum_ * > subset_sum
Definition adt_quality_control.hpp:72
Sum_ * sum
Definition adt_quality_control.hpp:57
Options for compute_adt_qc_metrics().
Definition adt_quality_control.hpp:27
bool subset_containers_have_indices
Definition adt_quality_control.hpp:38
int num_threads
Definition adt_quality_control.hpp:32
Results of compute_adt_qc_metrics().
Definition adt_quality_control.hpp:134
std::vector< Detected_ > detected
Definition adt_quality_control.hpp:145
std::vector< Sum_ > sum
Definition adt_quality_control.hpp:139
std::vector< std::vector< Sum_ > > subset_sum
Definition adt_quality_control.hpp:152
Buffers for per_cell_qc_metrics().
Definition per_cell_qc_metrics.hpp:97
Sum_ * sum
Definition per_cell_qc_metrics.hpp:115
Detected_ * detected
Definition per_cell_qc_metrics.hpp:121
std::vector< Sum_ * > subset_sum
Definition per_cell_qc_metrics.hpp:142
Options for per_cell_qc_metrics().
Definition per_cell_qc_metrics.hpp:25
bool subset_containers_have_indices
Definition per_cell_qc_metrics.hpp:77
int num_threads
Definition per_cell_qc_metrics.hpp:83