1#ifndef SCRAN_QC_RNA_QUALITY_CONTROL_HPP
2#define SCRAN_QC_RNA_QUALITY_CONTROL_HPP
45template<
typename Sum_ =
double,
typename Detected_ =
int,
typename Proportion_ =
double>
97template<
typename Value_,
typename Index_,
typename Subset_,
typename Sum_,
typename Detected_,
typename Proportion_>
100 const std::vector<Subset_>& subsets,
104 const auto NC = mat.
ncol();
105 const auto nsubsets = subsets.size();
111 constexpr bool same_type = std::is_same<Sum_, Proportion_>::value;
112 typename std::conditional<same_type, bool, std::vector<std::vector<Sum_> > >::type placeholder_subset;
116 if constexpr(same_type) {
119 sanisizer::resize(placeholder_subset, nsubsets);
121 for (I<
decltype(nsubsets)> s = 0; s < nsubsets; ++s) {
122 auto& b = placeholder_subset[s];
133 for (I<
decltype(nsubsets)> s = 0 ; s < nsubsets; ++s) {
137 for (Index_ c = 0; c < NC; ++c) {
138 dest[c] =
static_cast<Proportion_
>(src[c]) /
static_cast<Proportion_
>(tmp.
sum[c]);
152template<
typename Sum_ =
double,
typename Detected_ =
int,
typename Proportion_ =
double>
192template<
typename Sum_ =
double,
typename Detected_ =
int,
typename Proportion_ =
double,
typename Value_,
typename Index_,
typename Subset_>
194 const auto NC = mat.
ncol();
199#ifdef SCRAN_QC_TEST_INIT
203 buffers.
sum = output.
sum.data();
206#ifdef SCRAN_QC_TEST_INIT
212 const auto nsubsets = subsets.size();
215 for (I<
decltype(nsubsets)> s = 0; s < nsubsets; ++s) {
217#ifdef SCRAN_QC_TEST_INIT
256template<
typename Float_,
class Host_,
typename Sum_,
typename Detected_,
typename Proportion_,
typename BlockSource_>
258 constexpr bool unblocked = std::is_same<BlockSource_, bool>::value;
260 if constexpr(unblocked) {
261 return sanisizer::create<std::vector<Float_> >(n);
272 host.get_sum() = [&]{
273 if constexpr(unblocked) {
286 host.get_detected() = [&]{
287 if constexpr(unblocked) {
301 auto& subhost = host.get_subset_proportion();
302 sanisizer::resize(subhost, nsubsets);
303 for (I<
decltype(nsubsets)> s = 0; s < nsubsets; ++s) {
306 if constexpr(unblocked) {
316template<
class Host_,
typename Sum_,
typename Detected_,
typename Proportion_,
typename BlockSource_,
typename Output_>
317void rna_filter(
const Host_& host,
const std::size_t n,
const ComputeRnaQcMetricsBuffers<Sum_, Detected_, Proportion_>& metrics, BlockSource_ block, Output_*
const output) {
318 constexpr bool unblocked = std::is_same<BlockSource_, bool>::value;
319 std::fill_n(output, n, 1);
321 const auto& sum = host.get_sum();
322 for (I<
decltype(n)> i = 0; i < n; ++i) {
324 if constexpr(unblocked) {
327 return sum[block[i]];
330 output[i] = output[i] && (metrics.sum[i] >= thresh);
333 const auto& detected = host.get_detected();
334 for (I<
decltype(n)> i = 0; i < n; ++i) {
336 if constexpr(unblocked) {
339 return detected[block[i]];
342 output[i] = output[i] && (metrics.detected[i] >= thresh);
345 const auto nsubsets = metrics.subset_proportion.size();
346 for (I<
decltype(nsubsets)> s = 0; s < nsubsets; ++s) {
347 const auto sub = metrics.subset_proportion[s];
348 const auto& sthresh = host.get_subset_proportion()[s];
349 for (I<
decltype(n)> i = 0; i < n; ++i) {
350 const auto thresh = [&]{
351 if constexpr(unblocked) {
354 return sthresh[block[i]];
357 output[i] = output[i] && (sub[i] <= thresh);
362template<
typename Sum_,
typename Detected_,
typename Proportion_>
363ComputeRnaQcMetricsBuffers<const Sum_, const Detected_, const Proportion_> to_buffer(
const ComputeRnaQcMetricsResults<Sum_, Detected_, Proportion_>& metrics) {
364 ComputeRnaQcMetricsBuffers<const Sum_, const Detected_, const Proportion_> buffer;
365 buffer.sum = metrics.sum.data();
366 buffer.detected = metrics.detected.data();
367 buffer.subset_proportion.reserve(metrics.subset_proportion.size());
368 for (
const auto& s : metrics.subset_proportion) {
369 buffer.subset_proportion.push_back(s.data());
383template<
typename Float_ =
double>
405 return my_subset_proportion;
427 return my_subset_proportion;
432 Float_ my_detected = 0;
433 std::vector<Float_> my_subset_proportion;
447 template<
typename Sum_,
typename Detected_,
typename Proportion_,
typename Output_>
449 internal::rna_filter(*
this, num, metrics,
false, output);
462 template<
typename Sum_,
typename Detected_,
typename Proportion_,
typename Output_>
464 return filter(metrics.
sum.size(), internal::to_buffer(metrics), output);
476 template<
typename Output_ =
unsigned char,
typename Sum_,
typename Detected_,
typename Proportion_>
478 auto output = sanisizer::create<std::vector<Output_> >(metrics.
sum.size()
479#ifdef SCRAN_QC_TEST_INIT
483 filter(metrics, output.data());
506template<
typename Float_ =
double,
typename Sum_,
typename Detected_,
typename Proportion_>
509 internal::rna_populate<Float_>(output, num, metrics,
false, options);
528template<
typename Float_ =
double,
typename Sum_,
typename Detected_,
typename Proportion_>
537template<
typename Float_ =
double>
562 return my_subset_proportion;
587 return my_subset_proportion;
591 std::vector<Float_> my_sum;
592 std::vector<Float_> my_detected;
593 std::vector<std::vector<Float_> > my_subset_proportion;
611 template<
typename Sum_,
typename Detected_,
typename Proportion_,
typename Block_,
typename Output_>
613 internal::rna_filter(*
this, num, metrics, block, output);
630 template<
typename Sum_,
typename Detected_,
typename Proportion_,
typename Block_,
typename Output_>
632 return filter(metrics.
sum.size(), internal::to_buffer(metrics), block, output);
649 template<
typename Output_ =
unsigned char,
typename Sum_,
typename Detected_,
typename Proportion_,
typename Block_>
651 auto output = sanisizer::create<std::vector<Output_> >(metrics.
sum.size()
652#ifdef SCRAN_QC_TEST_INIT
656 filter(metrics, block, output.data());
675template<
typename Float_ =
double,
typename Sum_,
typename Detected_,
typename Proportion_,
typename Block_>
677 const std::size_t num,
679 const Block_*
const block,
683 internal::rna_populate<Float_>(output, num, metrics, block, options);
700template<
typename Float_ =
double,
typename Sum_,
typename Detected_,
typename Proportion_,
typename Block_>
703 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:538
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:612
std::vector< Output_ > filter(const ComputeRnaQcMetricsResults< Sum_, Detected_, Proportion_ > &metrics, const Block_ *const block) const
Definition rna_quality_control.hpp:650
std::vector< Float_ > & get_detected()
Definition rna_quality_control.hpp:577
std::vector< std::vector< Float_ > > & get_subset_proportion()
Definition rna_quality_control.hpp:586
std::vector< Float_ > & get_sum()
Definition rna_quality_control.hpp:569
void filter(const ComputeRnaQcMetricsResults< Sum_, Detected_, Proportion_ > &metrics, const Block_ *const block, Output_ *const output) const
Definition rna_quality_control.hpp:631
const std::vector< Float_ > & get_detected() const
Definition rna_quality_control.hpp:552
const std::vector< Float_ > & get_sum() const
Definition rna_quality_control.hpp:544
const std::vector< std::vector< Float_ > > & get_subset_proportion() const
Definition rna_quality_control.hpp:561
Filter for high-quality cells using RNA-based metrics.
Definition rna_quality_control.hpp:384
Float_ & get_detected()
Definition rna_quality_control.hpp:418
Float_ get_detected() const
Definition rna_quality_control.hpp:396
void filter(const std::size_t num, const ComputeRnaQcMetricsBuffers< Sum_, Detected_, Proportion_ > &metrics, Output_ *const output) const
Definition rna_quality_control.hpp:448
void filter(const ComputeRnaQcMetricsResults< Sum_, Detected_, Proportion_ > &metrics, Output_ *const output) const
Definition rna_quality_control.hpp:463
const std::vector< Float_ > & get_subset_proportion() const
Definition rna_quality_control.hpp:404
std::vector< Float_ > & get_subset_proportion()
Definition rna_quality_control.hpp:426
Float_ get_sum() const
Definition rna_quality_control.hpp:389
Float_ & get_sum()
Definition rna_quality_control.hpp:411
std::vector< Output_ > filter(const ComputeRnaQcMetricsResults< Sum_, Detected_, Proportion_ > &metrics) const
Definition rna_quality_control.hpp:477
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:98
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:507
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:676
std::vector< ChooseFilterThresholdsResults< Float_ > > choose_filter_thresholds_blocked(const std::vector< FindMedianMadResults< Float_ > > &mms, const ChooseFilterThresholdsOptions &options)
Definition choose_filter_thresholds.hpp:225
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
bool lower
Definition choose_filter_thresholds.hpp:26
Options for compute_rna_qc_filters().
Definition rna_quality_control.hpp:231
double detected_num_mads
Definition rna_quality_control.hpp:236
double subset_proportion_num_mads
Definition rna_quality_control.hpp:248
double sum_num_mads
Definition rna_quality_control.hpp:242
Buffers for compute_rna_qc_metrics().
Definition rna_quality_control.hpp:46
Detected_ * detected
Definition rna_quality_control.hpp:57
Sum_ * sum
Definition rna_quality_control.hpp:51
std::vector< Proportion_ * > subset_proportion
Definition rna_quality_control.hpp:64
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:153
std::vector< Sum_ > sum
Definition rna_quality_control.hpp:157
std::vector< Detected_ > detected
Definition rna_quality_control.hpp:162
std::vector< std::vector< Proportion_ > > subset_proportion
Definition rna_quality_control.hpp:168
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