1#ifndef SCRAN_QC_CRISPR_QUALITY_CONTROL_HPP
2#define SCRAN_QC_CRISPR_QUALITY_CONTROL_HPP
11#include "sanisizer/sanisizer.hpp"
45template<
typename Sum_ =
double,
typename Detected_ =
int,
typename Value_ =
double,
typename Index_ =
int>
97template<
typename Value_,
typename Index_,
typename Sum_,
typename Detected_>
123template<
typename Sum_ =
double,
typename Detected_ =
int,
typename Value_ =
double,
typename Index_ =
int>
161template<
typename Sum_ =
double,
typename Detected_ =
int,
typename Value_ =
double,
typename Index_ =
int>
166 const auto NC = mat.
ncol();
171#ifdef SCRAN_QC_TEST_INIT
175 x.
sum = output.
sum.data();
178#ifdef SCRAN_QC_TEST_INIT
185#ifdef SCRAN_QC_TEST_INIT
192#ifdef SCRAN_QC_TEST_INIT
218template<
typename Float_,
class Host_,
typename Sum_,
typename Detected_,
typename Value_,
typename Index_,
typename BlockSource_>
220 constexpr bool unblocked = std::is_same<BlockSource_, bool>::value;
222 if constexpr(unblocked) {
223 return sanisizer::create<std::vector<Float_> >(n);
230 static_assert(std::is_floating_point<Float_>::value);
231 std::vector<Float_> maxprop;
233 for (
decltype(I(n)) i = 0; i < n; ++i) {
234 maxprop.push_back(
static_cast<Float_
>(res.
max_value[i]) /
static_cast<Float_
>(res.
sum[i]));
240 if constexpr(unblocked) {
247 for (
decltype(I(n)) i = 0; i < n; ++i) {
249 if constexpr(unblocked){
250 return prop_res.median;
252 return prop_res[block[i]].median;
255 if (maxprop[i] >= limit) {
258 maxprop[i] = std::numeric_limits<Float_>::quiet_NaN();
267 host.get_max_value() = [&]{
268 if constexpr(unblocked) {
276template<
class Host_,
typename Sum_,
typename Detected_,
typename Value_,
typename Index_,
typename BlockSource_,
typename Output_>
277void crispr_filter(
const Host_& host,
const std::size_t n,
const ComputeCrisprQcMetricsBuffers<Sum_, Detected_, Value_, Index_>& metrics, BlockSource_ block, Output_*
const output) {
278 constexpr bool unblocked = std::is_same<BlockSource_, bool>::value;
279 std::fill_n(output, n, 1);
281 const auto& mv = host.get_max_value();
282 for (
decltype(I(n)) i = 0; i < n; ++i) {
284 if constexpr(unblocked) {
290 output[i] = output[i] && (metrics.max_value[i] >= thresh);
294template<
typename Sum_,
typename Detected_,
typename Value_,
typename Index_>
295ComputeCrisprQcMetricsBuffers<const Sum_, const Detected_, const Value_, const Index_> to_buffer(
const ComputeCrisprQcMetricsResults<Sum_, Detected_, Value_, Index_>& metrics) {
296 ComputeCrisprQcMetricsBuffers<const Sum_, const Detected_, const Value_, const Index_> buffer;
297 buffer.sum = metrics.sum.data();
298 buffer.detected = metrics.detected.data();
299 buffer.max_value = metrics.max_value.data();
300 buffer.max_index = metrics.max_index.data();
315template<
typename Float_ =
double>
333 Float_ my_max_value = 0;
348 template<
typename Sum_,
typename Detected_,
typename Value_,
typename Index_,
typename Output_>
350 internal::crispr_filter(*
this, num, metrics,
false, output);
364 template<
typename Sum_,
typename Detected_,
typename Value_,
typename Index_,
typename Output_>
366 return filter(metrics.
max_value.size(), internal::to_buffer(metrics), output);
379 template<
typename Output_ =
unsigned char,
typename Sum_,
typename Detected_,
typename Value_,
typename Index_>
381 auto output = sanisizer::create<std::vector<Output_> >(metrics.
max_value.size()
382#ifdef SCRAN_QC_TEST_INIT
386 filter(metrics, output.data());
424template<
typename Float_ =
double,
typename Sum_,
typename Detected_,
typename Value_,
typename Index_>
426 const std::size_t num,
431 internal::crispr_populate<Float_>(output, num, metrics,
false, options);
447template<
typename Float_ =
double,
typename Sum_,
typename Detected_,
typename Value_,
typename Index_>
460template<
typename Float_ =
double>
480 std::vector<Float_> my_sum;
481 std::vector<Float_> my_max_value;
499 template<
typename Sum_,
typename Detected_,
typename Value_,
typename Index_,
typename Block_,
typename Output_>
501 internal::crispr_filter(*
this, num, metrics, block, output);
518 template<
typename Sum_,
typename Detected_,
typename Value_,
typename Index_,
typename Block_,
typename Output_>
520 filter(metrics.
max_value.size(), internal::to_buffer(metrics), block, output);
537 template<
typename Output_ =
unsigned char,
typename Sum_,
typename Detected_,
typename Value_,
typename Index_,
typename Block_>
539 auto output = sanisizer::create<std::vector<Output_> >(metrics.
max_value.size()
540#ifdef SCRAN_QC_TEST_INIT
544 filter(metrics, block, output.data());
568template<
typename Float_ =
double,
typename Sum_,
typename Detected_,
typename Value_,
typename Index_,
typename Block_>
570 const std::size_t num,
572 const Block_*
const block,
576 internal::crispr_populate<Float_>(output, num, metrics, block, options);
594template<
typename Float_ =
double,
typename Sum_,
typename Detected_,
typename Value_,
typename Index_,
typename Block_>
597 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:461
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:500
std::vector< Float_ > & get_max_value()
Definition crispr_quality_control.hpp:475
void filter(const ComputeCrisprQcMetricsResults< Sum_, Detected_, Value_, Index_ > &metrics, const Block_ *const block, Output_ *const output) const
Definition crispr_quality_control.hpp:519
const std::vector< Float_ > & get_max_value() const
Definition crispr_quality_control.hpp:467
std::vector< Output_ > filter(const ComputeCrisprQcMetricsResults< Sum_, Detected_, Value_, Index_ > &metrics, const Block_ *const block) const
Definition crispr_quality_control.hpp:538
Filter for high-quality cells using CRISPR-based metrics.
Definition crispr_quality_control.hpp:316
std::vector< Output_ > filter(const ComputeCrisprQcMetricsResults< Sum_, Detected_, Value_, Index_ > &metrics) const
Definition crispr_quality_control.hpp:380
Float_ get_max_value() const
Definition crispr_quality_control.hpp:321
Float_ & get_max_value()
Definition crispr_quality_control.hpp:328
void filter(const std::size_t num, const ComputeCrisprQcMetricsBuffers< Sum_, Detected_, Value_, Index_ > &metrics, Output_ *const output) const
Definition crispr_quality_control.hpp:349
void filter(const ComputeCrisprQcMetricsResults< Sum_, Detected_, Value_, Index_ > &metrics, Output_ *const output) const
Definition crispr_quality_control.hpp:365
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:569
std::vector< ChooseFilterThresholdsResults< Float_ > > choose_filter_thresholds_blocked(const std::vector< FindMedianMadResults< Float_ > > &mms, const ChooseFilterThresholdsOptions &options)
Definition choose_filter_thresholds.hpp:218
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:98
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:425
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:828
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: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
Options for compute_crispr_qc_filters().
Definition crispr_quality_control.hpp:205
double max_value_num_mads
Definition crispr_quality_control.hpp:210
Buffers for compute_crispr_qc_metrics().
Definition crispr_quality_control.hpp:46
Sum_ * sum
Definition crispr_quality_control.hpp:51
Detected_ * detected
Definition crispr_quality_control.hpp:57
Index_ * max_index
Definition crispr_quality_control.hpp:69
Value_ * max_value
Definition crispr_quality_control.hpp:63
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:124
std::vector< Index_ > max_index
Definition crispr_quality_control.hpp:143
std::vector< Value_ > max_value
Definition crispr_quality_control.hpp:138
std::vector< Detected_ > detected
Definition crispr_quality_control.hpp:133
std::vector< Sum_ > sum
Definition crispr_quality_control.hpp:128
Buffers for per_cell_qc_metrics().
Definition per_cell_qc_metrics.hpp:78
Value_ * max_value
Definition per_cell_qc_metrics.hpp:114
Index_ * max_index
Definition per_cell_qc_metrics.hpp:108
Sum_ * sum
Definition per_cell_qc_metrics.hpp:96
Detected_ * detected
Definition per_cell_qc_metrics.hpp:102
Options for per_cell_qc_metrics().
Definition per_cell_qc_metrics.hpp:25
int num_threads
Definition per_cell_qc_metrics.hpp:66