1#ifndef SCRAN_QC_RNA_QUALITY_CONTROL_HPP
2#define SCRAN_QC_RNA_QUALITY_CONTROL_HPP
50template<
typename Sum_ =
double,
typename Detected_ =
int,
typename Proportion_ =
double>
105template<
typename Value_,
typename Index_,
typename Subset_,
typename Sum_,
typename Detected_,
typename Proportion_>
108 const std::vector<Subset_>& subsets,
112 const auto NC = mat.
ncol();
113 const auto nsubsets = subsets.size();
119 constexpr bool same_type = std::is_same<Sum_, Proportion_>::value;
120 typename std::conditional<same_type, bool, std::vector<std::vector<Sum_> > >::type placeholder_subset;
124 if constexpr(same_type) {
127 sanisizer::resize(placeholder_subset, nsubsets);
129 for (I<
decltype(nsubsets)> s = 0; s < nsubsets; ++s) {
130 auto& b = placeholder_subset[s];
142 for (I<
decltype(nsubsets)> s = 0 ; s < nsubsets; ++s) {
146 for (Index_ c = 0; c < NC; ++c) {
147 dest[c] =
static_cast<Proportion_
>(src[c]) /
static_cast<Proportion_
>(tmp.
sum[c]);
161template<
typename Sum_ =
double,
typename Detected_ =
int,
typename Proportion_ =
double>
204template<
typename Sum_ =
double,
typename Detected_ =
int,
typename Proportion_ =
double,
typename Value_,
typename Index_,
typename Subset_>
207 const std::vector<Subset_>& subsets,
210 const auto NC = mat.
ncol();
215#ifdef SCRAN_QC_TEST_INIT
219 buffers.
sum = output.
sum.data();
222#ifdef SCRAN_QC_TEST_INIT
228 const auto nsubsets = subsets.size();
231 for (I<
decltype(nsubsets)> s = 0; s < nsubsets; ++s) {
233#ifdef SCRAN_QC_TEST_INIT
270template<
typename Float_,
class Host_,
typename Sum_,
typename Detected_,
typename Proportion_,
typename BlockSource_>
271void compute_rna_qc_filters_internal(
273 const std::size_t num_cells,
276 const std::size_t num_blocks,
279 constexpr bool unblocked = std::is_same<BlockSource_, bool>::value;
281 if constexpr(unblocked) {
282 return sanisizer::create<std::vector<Float_> >(num_cells);
289 ChooseFilterThresholdsOptions opts;
293 host.get_sum() = [&]{
294 if constexpr(unblocked) {
303 ChooseFilterThresholdsOptions opts;
307 host.get_detected() = [&]{
308 if constexpr(unblocked) {
317 ChooseFilterThresholdsOptions opts;
322 auto& subhost = host.get_subset_proportion();
323 sanisizer::resize(subhost, nsubsets);
324 for (I<
decltype(nsubsets)> s = 0; s < nsubsets; ++s) {
327 if constexpr(unblocked) {
337template<
class Host_,
typename Sum_,
typename Detected_,
typename Proportion_,
typename BlockSource_,
typename Output_>
338void apply_rna_qc_filters_internal(
340 const std::size_t num_cells,
341 const ComputeRnaQcMetricsBuffers<Sum_, Detected_, Proportion_>& metrics,
343 Output_*
const output
345 constexpr bool unblocked = std::is_same<BlockSource_, bool>::value;
346 std::fill_n(output, num_cells, 1);
348 const auto& sum = host.get_sum();
349 for (I<
decltype(num_cells)> i = 0; i < num_cells; ++i) {
351 if constexpr(unblocked) {
354 return sum[block[i]];
357 output[i] = output[i] && (metrics.sum[i] >= thresh);
360 const auto& detected = host.get_detected();
361 for (I<
decltype(num_cells)> i = 0; i < num_cells; ++i) {
363 if constexpr(unblocked) {
366 return detected[block[i]];
369 output[i] = output[i] && (metrics.detected[i] >= thresh);
372 const auto nsubsets = metrics.subset_proportion.size();
373 for (I<
decltype(nsubsets)> s = 0; s < nsubsets; ++s) {
374 const auto sub = metrics.subset_proportion[s];
375 const auto& sthresh = host.get_subset_proportion()[s];
376 for (I<
decltype(num_cells)> i = 0; i < num_cells; ++i) {
377 const auto thresh = [&]{
378 if constexpr(unblocked) {
381 return sthresh[block[i]];
384 output[i] = output[i] && (sub[i] <= thresh);
389template<
typename Sum_,
typename Detected_,
typename Proportion_>
390ComputeRnaQcMetricsBuffers<const Sum_, const Detected_, const Proportion_> rna_qc_results_to_buffers(
const ComputeRnaQcMetricsResults<Sum_, Detected_, Proportion_>& metrics) {
391 ComputeRnaQcMetricsBuffers<const Sum_, const Detected_, const Proportion_> buffer;
392 buffer.sum = metrics.sum.data();
393 buffer.detected = metrics.detected.data();
394 buffer.subset_proportion.reserve(metrics.subset_proportion.size());
395 for (
const auto& s : metrics.subset_proportion) {
396 buffer.subset_proportion.push_back(s.data());
408template<
typename Float_ =
double>
430 return my_subset_proportion;
452 return my_subset_proportion;
457 Float_ my_detected = 0;
458 std::vector<Float_> my_subset_proportion;
472 template<
typename Sum_,
typename Detected_,
typename Proportion_,
typename Output_>
474 apply_rna_qc_filters_internal(*
this, num_cells, metrics,
false, output);
487 template<
typename Sum_,
typename Detected_,
typename Proportion_,
typename Output_>
489 return filter(metrics.
sum.size(), rna_qc_results_to_buffers(metrics), output);
501 template<
typename Output_ =
unsigned char,
typename Sum_,
typename Detected_,
typename Proportion_>
503 auto output = sanisizer::create<std::vector<Output_> >(metrics.
sum.size()
504#ifdef SCRAN_QC_TEST_INIT
508 filter(metrics, output.data());
531template<
typename Float_ =
double,
typename Sum_,
typename Detected_,
typename Proportion_>
533 const std::size_t num_cells,
538 compute_rna_qc_filters_internal<Float_>(output, num_cells, metrics,
false, 0, options);
555template<
typename Float_ =
double,
typename Sum_,
typename Detected_,
typename Proportion_>
567template<
typename Float_ =
double>
592 return my_subset_proportion;
617 return my_subset_proportion;
621 std::vector<Float_> my_sum;
622 std::vector<Float_> my_detected;
623 std::vector<std::vector<Float_> > my_subset_proportion;
641 template<
typename Sum_,
typename Detected_,
typename Proportion_,
typename Block_,
typename Output_>
643 apply_rna_qc_filters_internal(*
this, num_cells, metrics, block, output);
660 template<
typename Sum_,
typename Detected_,
typename Proportion_,
typename Block_,
typename Output_>
662 return filter(metrics.
sum.size(), rna_qc_results_to_buffers(metrics), block, output);
679 template<
typename Output_ =
unsigned char,
typename Sum_,
typename Detected_,
typename Proportion_,
typename Block_>
681 auto output = sanisizer::create<std::vector<Output_> >(metrics.
sum.size()
682#ifdef SCRAN_QC_TEST_INIT
686 filter(metrics, block, output.data());
706template<
typename Float_ =
double,
typename Sum_,
typename Detected_,
typename Proportion_,
typename Block_>
708 const std::size_t num_cells,
710 const Block_*
const block,
711 const std::size_t num_blocks,
715 compute_rna_qc_filters_internal<Float_>(output, num_cells, metrics, block, num_blocks, options);
733template<
typename Float_ =
double,
typename Sum_,
typename Detected_,
typename Proportion_,
typename Block_>
736 const Block_*
const block,
737 const std::size_t num_blocks,
Define QC filter thresholds using a MAD-based approach.
Filter for high-quality cells using RNA-based metrics with blocking.
Definition rna_quality_control.hpp:568
std::vector< Output_ > filter(const ComputeRnaQcMetricsResults< Sum_, Detected_, Proportion_ > &metrics, const Block_ *const block) const
Definition rna_quality_control.hpp:680
std::vector< Float_ > & get_detected()
Definition rna_quality_control.hpp:607
std::vector< std::vector< Float_ > > & get_subset_proportion()
Definition rna_quality_control.hpp:616
std::vector< Float_ > & get_sum()
Definition rna_quality_control.hpp:599
void filter(const std::size_t num_cells, const ComputeRnaQcMetricsBuffers< Sum_, Detected_, Proportion_ > &metrics, const Block_ *const block, Output_ *const output) const
Definition rna_quality_control.hpp:642
void filter(const ComputeRnaQcMetricsResults< Sum_, Detected_, Proportion_ > &metrics, const Block_ *const block, Output_ *const output) const
Definition rna_quality_control.hpp:661
const std::vector< Float_ > & get_detected() const
Definition rna_quality_control.hpp:582
const std::vector< Float_ > & get_sum() const
Definition rna_quality_control.hpp:574
const std::vector< std::vector< Float_ > > & get_subset_proportion() const
Definition rna_quality_control.hpp:591
Filter for high-quality cells using RNA-based metrics.
Definition rna_quality_control.hpp:409
void filter(const std::size_t num_cells, const ComputeRnaQcMetricsBuffers< Sum_, Detected_, Proportion_ > &metrics, Output_ *const output) const
Definition rna_quality_control.hpp:473
Float_ & get_detected()
Definition rna_quality_control.hpp:443
Float_ get_detected() const
Definition rna_quality_control.hpp:421
void filter(const ComputeRnaQcMetricsResults< Sum_, Detected_, Proportion_ > &metrics, Output_ *const output) const
Definition rna_quality_control.hpp:488
const std::vector< Float_ > & get_subset_proportion() const
Definition rna_quality_control.hpp:429
std::vector< Float_ > & get_subset_proportion()
Definition rna_quality_control.hpp:451
Float_ get_sum() const
Definition rna_quality_control.hpp:414
Float_ & get_sum()
Definition rna_quality_control.hpp:436
std::vector< Output_ > filter(const ComputeRnaQcMetricsResults< Sum_, Detected_, Proportion_ > &metrics) const
Definition rna_quality_control.hpp:502
virtual Index_ ncol() const=0
Simple quality control for single-cell data.
Definition adt_quality_control.hpp:22
void compute_rna_qc_metrics(const tatami::Matrix< Value_, Index_ > &mat, const std::vector< Subset_ > &subsets, const ComputeRnaQcMetricsBuffers< Sum_, Detected_, Proportion_ > &output, const ComputeRnaQcMetricsOptions &options)
Definition rna_quality_control.hpp:106
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
RnaQcFilters< Float_ > compute_rna_qc_filters(const std::size_t num_cells, const ComputeRnaQcMetricsBuffers< Sum_, Detected_, Proportion_ > &metrics, const ComputeRnaQcFiltersOptions &options)
Definition rna_quality_control.hpp:532
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
RnaQcBlockedFilters< Float_ > compute_rna_qc_filters_blocked(const std::size_t num_cells, const ComputeRnaQcMetricsBuffers< Sum_, Detected_, Proportion_ > &metrics, const Block_ *const block, const std::size_t num_blocks, const ComputeRnaQcFiltersOptions &options)
Definition rna_quality_control.hpp:707
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_rna_qc_filters().
Definition rna_quality_control.hpp:247
double detected_num_mads
Definition rna_quality_control.hpp:252
double subset_proportion_num_mads
Definition rna_quality_control.hpp:264
double sum_num_mads
Definition rna_quality_control.hpp:258
Buffers for compute_rna_qc_metrics().
Definition rna_quality_control.hpp:51
Detected_ * detected
Definition rna_quality_control.hpp:64
Sum_ * sum
Definition rna_quality_control.hpp:57
std::vector< Proportion_ * > subset_proportion
Definition rna_quality_control.hpp:72
Options for compute_rna_qc_metrics().
Definition rna_quality_control.hpp:26
bool subset_containers_have_indices
Definition rna_quality_control.hpp:37
int num_threads
Definition rna_quality_control.hpp:31
Results of compute_rna_qc_metrics().
Definition rna_quality_control.hpp:162
std::vector< Sum_ > sum
Definition rna_quality_control.hpp:167
std::vector< Detected_ > detected
Definition rna_quality_control.hpp:173
std::vector< std::vector< Proportion_ > > subset_proportion
Definition rna_quality_control.hpp:180
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