1#ifndef SCRAN_QC_RNA_QUALITY_CONTROL_HPP
2#define SCRAN_QC_RNA_QUALITY_CONTROL_HPP
43template<
typename Sum_ =
double,
typename Detected_ =
int,
typename Proportion_ =
double>
93template<
typename Value_,
typename Index_,
typename Subset_,
typename Sum_,
typename Detected_,
typename Proportion_>
96 const std::vector<Subset_>& subsets,
100 const auto NC = mat.
ncol();
101 const auto nsubsets = subsets.size();
107 constexpr bool same_type = std::is_same<Sum_, Proportion_>::value;
108 typename std::conditional<same_type, bool, std::vector<std::vector<Sum_> > >::type placeholder_subset;
112 if constexpr(same_type) {
115 sanisizer::resize(placeholder_subset, nsubsets);
117 for (
decltype(I(nsubsets)) s = 0; s < nsubsets; ++s) {
118 auto& b = placeholder_subset[s];
129 for (
decltype(I(nsubsets)) s = 0 ; s < nsubsets; ++s) {
133 for (Index_ c = 0; c < NC; ++c) {
134 dest[c] =
static_cast<Proportion_
>(src[c]) /
static_cast<Proportion_
>(tmp.
sum[c]);
146template<
typename Sum_ =
double,
typename Detected_ =
int,
typename Proportion_ =
double>
184template<
typename Sum_ =
double,
typename Detected_ =
int,
typename Proportion_ =
double,
typename Value_,
typename Index_,
typename Subset_>
186 const auto NC = mat.
ncol();
191#ifdef SCRAN_QC_TEST_INIT
195 buffers.
sum = output.
sum.data();
198#ifdef SCRAN_QC_TEST_INIT
204 const auto nsubsets = subsets.size();
207 for (
decltype(I(nsubsets)) s = 0; s < nsubsets; ++s) {
209#ifdef SCRAN_QC_TEST_INIT
248template<
typename Float_,
class Host_,
typename Sum_,
typename Detected_,
typename Proportion_,
typename BlockSource_>
250 constexpr bool unblocked = std::is_same<BlockSource_, bool>::value;
252 if constexpr(unblocked) {
253 return sanisizer::create<std::vector<Float_> >(n);
264 host.get_sum() = [&]{
265 if constexpr(unblocked) {
278 host.get_detected() = [&]{
279 if constexpr(unblocked) {
293 auto& subhost = host.get_subset_proportion();
294 sanisizer::resize(subhost, nsubsets);
295 for (
decltype(I(nsubsets)) s = 0; s < nsubsets; ++s) {
298 if constexpr(unblocked) {
308template<
class Host_,
typename Sum_,
typename Detected_,
typename Proportion_,
typename BlockSource_,
typename Output_>
309void rna_filter(
const Host_& host,
const std::size_t n,
const ComputeRnaQcMetricsBuffers<Sum_, Detected_, Proportion_>& metrics, BlockSource_ block, Output_*
const output) {
310 constexpr bool unblocked = std::is_same<BlockSource_, bool>::value;
311 std::fill_n(output, n, 1);
313 const auto& sum = host.get_sum();
314 for (
decltype(I(n)) i = 0; i < n; ++i) {
316 if constexpr(unblocked) {
319 return sum[block[i]];
322 output[i] = output[i] && (metrics.sum[i] >= thresh);
325 const auto& detected = host.get_detected();
326 for (
decltype(I(n)) i = 0; i < n; ++i) {
328 if constexpr(unblocked) {
331 return detected[block[i]];
334 output[i] = output[i] && (metrics.detected[i] >= thresh);
337 const auto nsubsets = metrics.subset_proportion.size();
338 for (
decltype(I(nsubsets)) s = 0; s < nsubsets; ++s) {
339 const auto sub = metrics.subset_proportion[s];
340 const auto& sthresh = host.get_subset_proportion()[s];
341 for (
decltype(I(n)) i = 0; i < n; ++i) {
342 const auto thresh = [&]{
343 if constexpr(unblocked) {
346 return sthresh[block[i]];
349 output[i] = output[i] && (sub[i] <= thresh);
354template<
typename Sum_,
typename Detected_,
typename Proportion_>
355ComputeRnaQcMetricsBuffers<const Sum_, const Detected_, const Proportion_> to_buffer(
const ComputeRnaQcMetricsResults<Sum_, Detected_, Proportion_>& metrics) {
356 ComputeRnaQcMetricsBuffers<const Sum_, const Detected_, const Proportion_> buffer;
357 buffer.sum = metrics.sum.data();
358 buffer.detected = metrics.detected.data();
359 buffer.subset_proportion.reserve(metrics.subset_proportion.size());
360 for (
const auto& s : metrics.subset_proportion) {
361 buffer.subset_proportion.push_back(s.data());
375template<
typename Float_ =
double>
397 return my_subset_proportion;
419 return my_subset_proportion;
424 Float_ my_detected = 0;
425 std::vector<Float_> my_subset_proportion;
439 template<
typename Sum_,
typename Detected_,
typename Proportion_,
typename Output_>
441 internal::rna_filter(*
this, num, metrics,
false, output);
454 template<
typename Sum_,
typename Detected_,
typename Proportion_,
typename Output_>
456 return filter(metrics.
sum.size(), internal::to_buffer(metrics), output);
468 template<
typename Output_ =
unsigned char,
typename Sum_,
typename Detected_,
typename Proportion_>
470 auto output = sanisizer::create<std::vector<Output_> >(metrics.
sum.size()
471#ifdef SCRAN_QC_TEST_INIT
475 filter(metrics, output.data());
497template<
typename Float_ =
double,
typename Sum_,
typename Detected_,
typename Proportion_>
500 internal::rna_populate<Float_>(output, num, metrics,
false, options);
519template<
typename Float_ =
double,
typename Sum_,
typename Detected_,
typename Proportion_>
528template<
typename Float_ =
double>
553 return my_subset_proportion;
578 return my_subset_proportion;
582 std::vector<Float_> my_sum;
583 std::vector<Float_> my_detected;
584 std::vector<std::vector<Float_> > my_subset_proportion;
602 template<
typename Sum_,
typename Detected_,
typename Proportion_,
typename Block_,
typename Output_>
604 internal::rna_filter(*
this, num, metrics, block, output);
621 template<
typename Sum_,
typename Detected_,
typename Proportion_,
typename Block_,
typename Output_>
623 return filter(metrics.
sum.size(), internal::to_buffer(metrics), block, output);
640 template<
typename Output_ =
unsigned char,
typename Sum_,
typename Detected_,
typename Proportion_,
typename Block_>
642 auto output = sanisizer::create<std::vector<Output_> >(metrics.
sum.size()
643#ifdef SCRAN_QC_TEST_INIT
647 filter(metrics, block, output.data());
666template<
typename Float_ =
double,
typename Sum_,
typename Detected_,
typename Proportion_,
typename Block_>
668 const std::size_t num,
670 const Block_*
const block,
674 internal::rna_populate<Float_>(output, num, metrics, block, options);
691template<
typename Float_ =
double,
typename Sum_,
typename Detected_,
typename Proportion_,
typename Block_>
694 const Block_*
const block,
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:529
void filter(const std::size_t num, const ComputeRnaQcMetricsBuffers< Sum_, Detected_, Proportion_ > &metrics, const Block_ *const block, Output_ *const output) const
Definition rna_quality_control.hpp:603
std::vector< Output_ > filter(const ComputeRnaQcMetricsResults< Sum_, Detected_, Proportion_ > &metrics, const Block_ *const block) const
Definition rna_quality_control.hpp:641
std::vector< Float_ > & get_detected()
Definition rna_quality_control.hpp:568
std::vector< std::vector< Float_ > > & get_subset_proportion()
Definition rna_quality_control.hpp:577
std::vector< Float_ > & get_sum()
Definition rna_quality_control.hpp:560
void filter(const ComputeRnaQcMetricsResults< Sum_, Detected_, Proportion_ > &metrics, const Block_ *const block, Output_ *const output) const
Definition rna_quality_control.hpp:622
const std::vector< Float_ > & get_detected() const
Definition rna_quality_control.hpp:543
const std::vector< Float_ > & get_sum() const
Definition rna_quality_control.hpp:535
const std::vector< std::vector< Float_ > > & get_subset_proportion() const
Definition rna_quality_control.hpp:552
Filter for high-quality cells using RNA-based metrics.
Definition rna_quality_control.hpp:376
Float_ & get_detected()
Definition rna_quality_control.hpp:410
Float_ get_detected() const
Definition rna_quality_control.hpp:388
void filter(const std::size_t num, const ComputeRnaQcMetricsBuffers< Sum_, Detected_, Proportion_ > &metrics, Output_ *const output) const
Definition rna_quality_control.hpp:440
void filter(const ComputeRnaQcMetricsResults< Sum_, Detected_, Proportion_ > &metrics, Output_ *const output) const
Definition rna_quality_control.hpp:455
const std::vector< Float_ > & get_subset_proportion() const
Definition rna_quality_control.hpp:396
std::vector< Float_ > & get_subset_proportion()
Definition rna_quality_control.hpp:418
Float_ get_sum() const
Definition rna_quality_control.hpp:381
Float_ & get_sum()
Definition rna_quality_control.hpp:403
std::vector< Output_ > filter(const ComputeRnaQcMetricsResults< Sum_, Detected_, Proportion_ > &metrics) const
Definition rna_quality_control.hpp:469
virtual Index_ ncol() const=0
Simple quality control for single-cell data.
Definition adt_quality_control.hpp:23
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:94
RnaQcFilters< Float_ > compute_rna_qc_filters(const std::size_t num, const ComputeRnaQcMetricsBuffers< Sum_, Detected_, Proportion_ > &metrics, const ComputeRnaQcFiltersOptions &options)
Definition rna_quality_control.hpp:498
RnaQcBlockedFilters< Float_ > compute_rna_qc_filters_blocked(const std::size_t num, const ComputeRnaQcMetricsBuffers< Sum_, Detected_, Proportion_ > &metrics, const Block_ *const block, const ComputeRnaQcFiltersOptions &options)
Definition rna_quality_control.hpp:667
std::vector< ChooseFilterThresholdsResults< Float_ > > choose_filter_thresholds_blocked(const std::vector< FindMedianMadResults< Float_ > > &mms, const ChooseFilterThresholdsOptions &options)
Definition choose_filter_thresholds.hpp:218
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
bool lower
Definition choose_filter_thresholds.hpp:26
Options for compute_rna_qc_filters().
Definition rna_quality_control.hpp:223
double detected_num_mads
Definition rna_quality_control.hpp:228
double subset_proportion_num_mads
Definition rna_quality_control.hpp:240
double sum_num_mads
Definition rna_quality_control.hpp:234
Buffers for compute_rna_qc_metrics().
Definition rna_quality_control.hpp:44
Detected_ * detected
Definition rna_quality_control.hpp:55
Sum_ * sum
Definition rna_quality_control.hpp:49
std::vector< Proportion_ * > subset_proportion
Definition rna_quality_control.hpp:62
Options for compute_rna_qc_metrics().
Definition rna_quality_control.hpp:27
int num_threads
Definition rna_quality_control.hpp:32
Results of compute_rna_qc_metrics().
Definition rna_quality_control.hpp:147
std::vector< Sum_ > sum
Definition rna_quality_control.hpp:151
std::vector< Detected_ > detected
Definition rna_quality_control.hpp:156
std::vector< std::vector< Proportion_ > > subset_proportion
Definition rna_quality_control.hpp:162
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