1#ifndef SCRAN_QC_CRISPR_QUALITY_CONTROL_HPP
2#define SCRAN_QC_CRISPR_QUALITY_CONTROL_HPP
11#include "sanisizer/sanisizer.hpp"
48template<
typename Sum_ =
double,
typename Detected_ =
int,
typename Value_ =
double,
typename Index_ =
int>
102template<
typename Value_,
typename Index_,
typename Sum_,
typename Detected_>
131template<
typename Sum_ =
double,
typename Detected_ =
int,
typename Value_ =
double,
typename Index_ =
int>
171template<
typename Sum_ =
double,
typename Detected_ =
int,
typename Value_ =
double,
typename Index_ =
int>
176 const auto NC = mat.
ncol();
181#ifdef SCRAN_QC_TEST_INIT
185 x.
sum = output.
sum.data();
188#ifdef SCRAN_QC_TEST_INIT
195#ifdef SCRAN_QC_TEST_INIT
202#ifdef SCRAN_QC_TEST_INIT
228template<
typename Float_,
class Host_,
typename Sum_,
typename Detected_,
typename Value_,
typename Index_,
typename BlockSource_>
230 constexpr bool unblocked = std::is_same<BlockSource_, bool>::value;
232 if constexpr(unblocked) {
233 return sanisizer::create<std::vector<Float_> >(n);
240 static_assert(std::is_floating_point<Float_>::value);
241 std::vector<Float_> maxprop;
243 for (I<
decltype(n)> i = 0; i < n; ++i) {
244 maxprop.push_back(
static_cast<Float_
>(res.
max_value[i]) /
static_cast<Float_
>(res.
sum[i]));
250 if constexpr(unblocked) {
257 for (I<
decltype(n)> i = 0; i < n; ++i) {
259 if constexpr(unblocked){
260 return prop_res.median;
262 return prop_res[block[i]].median;
265 if (maxprop[i] >= limit) {
268 maxprop[i] = std::numeric_limits<Float_>::quiet_NaN();
277 host.get_max_value() = [&]{
278 if constexpr(unblocked) {
286template<
class Host_,
typename Sum_,
typename Detected_,
typename Value_,
typename Index_,
typename BlockSource_,
typename Output_>
287void crispr_filter(
const Host_& host,
const std::size_t n,
const ComputeCrisprQcMetricsBuffers<Sum_, Detected_, Value_, Index_>& metrics, BlockSource_ block, Output_*
const output) {
288 constexpr bool unblocked = std::is_same<BlockSource_, bool>::value;
289 std::fill_n(output, n, 1);
291 const auto& mv = host.get_max_value();
292 for (I<
decltype(n)> i = 0; i < n; ++i) {
294 if constexpr(unblocked) {
300 output[i] = output[i] && (metrics.max_value[i] >= thresh);
304template<
typename Sum_,
typename Detected_,
typename Value_,
typename Index_>
305ComputeCrisprQcMetricsBuffers<const Sum_, const Detected_, const Value_, const Index_> to_buffer(
const ComputeCrisprQcMetricsResults<Sum_, Detected_, Value_, Index_>& metrics) {
306 ComputeCrisprQcMetricsBuffers<const Sum_, const Detected_, const Value_, const Index_> buffer;
307 buffer.sum = metrics.sum.data();
308 buffer.detected = metrics.detected.data();
309 buffer.max_value = metrics.max_value.data();
310 buffer.max_index = metrics.max_index.data();
325template<
typename Float_ =
double>
343 Float_ my_max_value = 0;
358 template<
typename Sum_,
typename Detected_,
typename Value_,
typename Index_,
typename Output_>
360 internal::crispr_filter(*
this, num, metrics,
false, output);
374 template<
typename Sum_,
typename Detected_,
typename Value_,
typename Index_,
typename Output_>
376 return filter(metrics.
max_value.size(), internal::to_buffer(metrics), output);
389 template<
typename Output_ =
unsigned char,
typename Sum_,
typename Detected_,
typename Value_,
typename Index_>
391 auto output = sanisizer::create<std::vector<Output_> >(metrics.
max_value.size()
392#ifdef SCRAN_QC_TEST_INIT
396 filter(metrics, output.data());
434template<
typename Float_ =
double,
typename Sum_,
typename Detected_,
typename Value_,
typename Index_>
436 const std::size_t num,
441 internal::crispr_populate<Float_>(output, num, metrics,
false, options);
457template<
typename Float_ =
double,
typename Sum_,
typename Detected_,
typename Value_,
typename Index_>
470template<
typename Float_ =
double>
490 std::vector<Float_> my_sum;
491 std::vector<Float_> my_max_value;
509 template<
typename Sum_,
typename Detected_,
typename Value_,
typename Index_,
typename Block_,
typename Output_>
511 internal::crispr_filter(*
this, num, metrics, block, output);
528 template<
typename Sum_,
typename Detected_,
typename Value_,
typename Index_,
typename Block_,
typename Output_>
530 filter(metrics.
max_value.size(), internal::to_buffer(metrics), block, output);
547 template<
typename Output_ =
unsigned char,
typename Sum_,
typename Detected_,
typename Value_,
typename Index_,
typename Block_>
549 auto output = sanisizer::create<std::vector<Output_> >(metrics.
max_value.size()
550#ifdef SCRAN_QC_TEST_INIT
554 filter(metrics, block, output.data());
578template<
typename Float_ =
double,
typename Sum_,
typename Detected_,
typename Value_,
typename Index_,
typename Block_>
580 const std::size_t num,
582 const Block_*
const block,
586 internal::crispr_populate<Float_>(output, num, metrics, block, options);
604template<
typename Float_ =
double,
typename Sum_,
typename Detected_,
typename Value_,
typename Index_,
typename Block_>
607 const Block_*
const block,
Define QC filter thresholds using a MAD-based approach.
Filter on using CRISPR-based QC metrics with blocking.
Definition crispr_quality_control.hpp:471
void filter(const std::size_t num, const ComputeCrisprQcMetricsBuffers< Sum_, Detected_, Value_, Index_ > &metrics, const Block_ *const block, Output_ *const output) const
Definition crispr_quality_control.hpp:510
std::vector< Float_ > & get_max_value()
Definition crispr_quality_control.hpp:485
void filter(const ComputeCrisprQcMetricsResults< Sum_, Detected_, Value_, Index_ > &metrics, const Block_ *const block, Output_ *const output) const
Definition crispr_quality_control.hpp:529
const std::vector< Float_ > & get_max_value() const
Definition crispr_quality_control.hpp:477
std::vector< Output_ > filter(const ComputeCrisprQcMetricsResults< Sum_, Detected_, Value_, Index_ > &metrics, const Block_ *const block) const
Definition crispr_quality_control.hpp:548
Filter for high-quality cells using CRISPR-based metrics.
Definition crispr_quality_control.hpp:326
std::vector< Output_ > filter(const ComputeCrisprQcMetricsResults< Sum_, Detected_, Value_, Index_ > &metrics) const
Definition crispr_quality_control.hpp:390
Float_ get_max_value() const
Definition crispr_quality_control.hpp:331
Float_ & get_max_value()
Definition crispr_quality_control.hpp:338
void filter(const std::size_t num, const ComputeCrisprQcMetricsBuffers< Sum_, Detected_, Value_, Index_ > &metrics, Output_ *const output) const
Definition crispr_quality_control.hpp:359
void filter(const ComputeCrisprQcMetricsResults< Sum_, Detected_, Value_, Index_ > &metrics, Output_ *const output) const
Definition crispr_quality_control.hpp:375
virtual Index_ ncol() const=0
Simple quality control for single-cell data.
Definition adt_quality_control.hpp:23
CrisprQcBlockedFilters< Float_ > compute_crispr_qc_filters_blocked(const std::size_t num, const ComputeCrisprQcMetricsBuffers< Sum_, Detected_, Value_, Index_ > &metrics, const Block_ *const block, const ComputeCrisprQcFiltersOptions &options)
Definition crispr_quality_control.hpp:579
std::vector< ChooseFilterThresholdsResults< Float_ > > choose_filter_thresholds_blocked(const std::vector< FindMedianMadResults< Float_ > > &mms, const ChooseFilterThresholdsOptions &options)
Definition choose_filter_thresholds.hpp:225
void compute_crispr_qc_metrics(const tatami::Matrix< Value_, Index_ > &mat, const ComputeCrisprQcMetricsBuffers< Sum_, Detected_, Value_, Index_ > &output, const ComputeCrisprQcMetricsOptions &options)
Definition crispr_quality_control.hpp:103
CrisprQcFilters< Float_ > compute_crispr_qc_filters(const std::size_t num, const ComputeCrisprQcMetricsBuffers< Sum_, Detected_, Value_, Index_ > &metrics, const ComputeCrisprQcFiltersOptions &options)
Definition crispr_quality_control.hpp:435
FindMedianMadResults< Float_ > find_median_mad(std::size_t num, Float_ *metrics, const FindMedianMadOptions &options)
Definition find_median_mad.hpp:81
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
std::vector< FindMedianMadResults< Output_ > > find_median_mad_blocked(const std::size_t num, const Value_ *const metrics, const Block_ *const block, FindMedianMadWorkspace< Output_ > *workspace, const FindMedianMadOptions &options)
Definition find_median_mad.hpp:273
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
Options for compute_crispr_qc_filters().
Definition crispr_quality_control.hpp:215
double max_value_num_mads
Definition crispr_quality_control.hpp:220
Buffers for compute_crispr_qc_metrics().
Definition crispr_quality_control.hpp:49
Sum_ * sum
Definition crispr_quality_control.hpp:54
Detected_ * detected
Definition crispr_quality_control.hpp:60
Index_ * max_index
Definition crispr_quality_control.hpp:72
Value_ * max_value
Definition crispr_quality_control.hpp:66
Options for compute_crispr_qc_metrics().
Definition crispr_quality_control.hpp:28
int num_threads
Definition crispr_quality_control.hpp:33
Results of compute_crispr_qc_metrics().
Definition crispr_quality_control.hpp:132
std::vector< Index_ > max_index
Definition crispr_quality_control.hpp:151
std::vector< Value_ > max_value
Definition crispr_quality_control.hpp:146
std::vector< Detected_ > detected
Definition crispr_quality_control.hpp:141
std::vector< Sum_ > sum
Definition crispr_quality_control.hpp:136
Buffers for per_cell_qc_metrics().
Definition per_cell_qc_metrics.hpp:80
Value_ * max_value
Definition per_cell_qc_metrics.hpp:116
Index_ * max_index
Definition per_cell_qc_metrics.hpp:110
Sum_ * sum
Definition per_cell_qc_metrics.hpp:98
Detected_ * detected
Definition per_cell_qc_metrics.hpp:104
Options for per_cell_qc_metrics().
Definition per_cell_qc_metrics.hpp:25
int num_threads
Definition per_cell_qc_metrics.hpp:66