1#ifndef SCRAN_QC_CRISPR_QUALITY_CONTROL_HPP
2#define SCRAN_QC_CRISPR_QUALITY_CONTROL_HPP
11#include "sanisizer/sanisizer.hpp"
12#include "quickstats/quickstats.hpp"
48template<
typename Sum_ =
double,
typename Detected_ =
int,
typename Value_ =
double,
typename Index_ =
int>
105template<
typename Value_,
typename Index_,
typename Sum_,
typename Detected_>
134template<
typename Sum_ =
double,
typename Detected_ =
int,
typename Value_ =
double,
typename Index_ =
int>
177template<
typename Sum_ =
double,
typename Detected_ =
int,
typename Value_ =
double,
typename Index_ =
int>
182 const auto NC = mat.
ncol();
187#ifdef SCRAN_QC_TEST_INIT
191 x.
sum = output.
sum.data();
194#ifdef SCRAN_QC_TEST_INIT
201#ifdef SCRAN_QC_TEST_INIT
208#ifdef SCRAN_QC_TEST_INIT
232template<
typename Float_,
class Host_,
typename Sum_,
typename Detected_,
typename Value_,
typename Index_,
typename BlockSource_>
233void compute_crispr_qc_filters_internal(
235 const std::size_t num_cells,
238 const std::size_t num_blocks,
241 constexpr bool unblocked = std::is_same<BlockSource_, bool>::value;
243 if constexpr(unblocked) {
244 return sanisizer::create<std::vector<Float_> >(num_cells);
251 static_assert(std::is_floating_point<Float_>::value);
252 std::vector<Float_> maxprop;
253 maxprop.reserve(num_cells);
254 for (I<
decltype(num_cells)> i = 0; i < num_cells; ++i) {
255 maxprop.push_back(
static_cast<Float_
>(res.
max_value[i]) /
static_cast<Float_
>(res.
sum[i]));
259 if constexpr(unblocked) {
260 std::copy_n(maxprop.begin(), num_cells, buffer.begin());
261 return quickstats::median<Float_>(num_cells, buffer.data());
263 std::vector<Float_> output;
264 output.reserve(num_blocks);
265 process_blocks_for_choose_filter_thresholds(
271 [&](
const std::size_t len, Float_*
const ptr) ->
void {
272 output.push_back(quickstats::median<Float_>(len, ptr));
279 for (I<
decltype(num_cells)> i = 0; i < num_cells; ++i) {
281 if constexpr(unblocked){
284 return prop_res[block[i]];
287 if (maxprop[i] >= limit) {
290 maxprop[i] = std::numeric_limits<Float_>::quiet_NaN();
295 ChooseFilterThresholdsOptions copt;
299 host.get_max_value() = [&]{
300 if constexpr(unblocked) {
308template<
class Host_,
typename Sum_,
typename Detected_,
typename Value_,
typename Index_,
typename BlockSource_,
typename Output_>
309void apply_crispr_qc_filters_internal(
312 const ComputeCrisprQcMetricsBuffers<Sum_, Detected_, Value_, Index_>& metrics,
314 Output_*
const output
316 constexpr bool unblocked = std::is_same<BlockSource_, bool>::value;
317 std::fill_n(output, n, 1);
319 const auto& mv = host.get_max_value();
320 for (I<
decltype(n)> i = 0; i < n; ++i) {
322 if constexpr(unblocked) {
328 output[i] = output[i] && (metrics.max_value[i] >= thresh);
332template<
typename Sum_,
typename Detected_,
typename Value_,
typename Index_>
333ComputeCrisprQcMetricsBuffers<const Sum_, const Detected_, const Value_, const Index_> crispr_qc_results_to_buffers(
const ComputeCrisprQcMetricsResults<Sum_, Detected_, Value_, Index_>& metrics) {
334 ComputeCrisprQcMetricsBuffers<const Sum_, const Detected_, const Value_, const Index_> buffer;
335 buffer.sum = metrics.sum.data();
336 buffer.detected = metrics.detected.data();
337 buffer.max_value = metrics.max_value.data();
338 buffer.max_index = metrics.max_index.data();
351template<
typename Float_ =
double>
369 Float_ my_max_value = 0;
384 template<
typename Sum_,
typename Detected_,
typename Value_,
typename Index_,
typename Output_>
386 apply_crispr_qc_filters_internal(*
this, num_cells, metrics,
false, output);
400 template<
typename Sum_,
typename Detected_,
typename Value_,
typename Index_,
typename Output_>
402 return filter(metrics.
max_value.size(), crispr_qc_results_to_buffers(metrics), output);
415 template<
typename Output_ =
unsigned char,
typename Sum_,
typename Detected_,
typename Value_,
typename Index_>
417 auto output = sanisizer::create<std::vector<Output_> >(metrics.
max_value.size()
418#ifdef SCRAN_QC_TEST_INIT
422 filter(metrics, output.data());
460template<
typename Float_ =
double,
typename Sum_,
typename Detected_,
typename Value_,
typename Index_>
462 const std::size_t num_cells,
467 compute_crispr_qc_filters_internal<Float_>(output, num_cells, metrics,
false, 0, options);
483template<
typename Float_ =
double,
typename Sum_,
typename Detected_,
typename Value_,
typename Index_>
496template<
typename Float_ =
double>
516 std::vector<Float_> my_sum;
517 std::vector<Float_> my_max_value;
535 template<
typename Sum_,
typename Detected_,
typename Value_,
typename Index_,
typename Block_,
typename Output_>
537 apply_crispr_qc_filters_internal(*
this, num_cells, metrics, block, output);
554 template<
typename Sum_,
typename Detected_,
typename Value_,
typename Index_,
typename Block_,
typename Output_>
556 filter(metrics.
max_value.size(), crispr_qc_results_to_buffers(metrics), block, output);
573 template<
typename Output_ =
unsigned char,
typename Sum_,
typename Detected_,
typename Value_,
typename Index_,
typename Block_>
575 auto output = sanisizer::create<std::vector<Output_> >(metrics.
max_value.size()
576#ifdef SCRAN_QC_TEST_INIT
580 filter(metrics, block, output.data());
605template<
typename Float_ =
double,
typename Sum_,
typename Detected_,
typename Value_,
typename Index_,
typename Block_>
607 const std::size_t num_cells,
609 const Block_*
const block,
610 const std::size_t num_blocks,
614 compute_crispr_qc_filters_internal<Float_>(output, num_cells, metrics, block, num_blocks, options);
633template<
typename Float_ =
double,
typename Sum_,
typename Detected_,
typename Value_,
typename Index_,
typename Block_>
636 const Block_*
const block,
637 const std::size_t num_blocks,
Define QC filter thresholds using a MAD-based approach.
Filter on using CRISPR-based QC metrics with blocking.
Definition crispr_quality_control.hpp:497
std::vector< Float_ > & get_max_value()
Definition crispr_quality_control.hpp:511
void filter(const ComputeCrisprQcMetricsResults< Sum_, Detected_, Value_, Index_ > &metrics, const Block_ *const block, Output_ *const output) const
Definition crispr_quality_control.hpp:555
void filter(const std::size_t num_cells, const ComputeCrisprQcMetricsBuffers< Sum_, Detected_, Value_, Index_ > &metrics, const Block_ *const block, Output_ *const output) const
Definition crispr_quality_control.hpp:536
const std::vector< Float_ > & get_max_value() const
Definition crispr_quality_control.hpp:503
std::vector< Output_ > filter(const ComputeCrisprQcMetricsResults< Sum_, Detected_, Value_, Index_ > &metrics, const Block_ *const block) const
Definition crispr_quality_control.hpp:574
Filter for high-quality cells using CRISPR-based metrics.
Definition crispr_quality_control.hpp:352
std::vector< Output_ > filter(const ComputeCrisprQcMetricsResults< Sum_, Detected_, Value_, Index_ > &metrics) const
Definition crispr_quality_control.hpp:416
Float_ get_max_value() const
Definition crispr_quality_control.hpp:357
Float_ & get_max_value()
Definition crispr_quality_control.hpp:364
void filter(const ComputeCrisprQcMetricsResults< Sum_, Detected_, Value_, Index_ > &metrics, Output_ *const output) const
Definition crispr_quality_control.hpp:401
void filter(const std::size_t num_cells, const ComputeCrisprQcMetricsBuffers< Sum_, Detected_, Value_, Index_ > &metrics, Output_ *const output) const
Definition crispr_quality_control.hpp:385
virtual Index_ ncol() const=0
Simple quality control for single-cell data.
Definition adt_quality_control.hpp:22
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
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
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:106
CrisprQcFilters< Float_ > compute_crispr_qc_filters(const std::size_t num_cells, const ComputeCrisprQcMetricsBuffers< Sum_, Detected_, Value_, Index_ > &metrics, const ComputeCrisprQcFiltersOptions &options)
Definition crispr_quality_control.hpp:461
CrisprQcBlockedFilters< Float_ > compute_crispr_qc_filters_blocked(const std::size_t num_cells, const ComputeCrisprQcMetricsBuffers< Sum_, Detected_, Value_, Index_ > &metrics, const Block_ *const block, const std::size_t num_blocks, const ComputeCrisprQcFiltersOptions &options)
Definition crispr_quality_control.hpp:606
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_crispr_qc_filters().
Definition crispr_quality_control.hpp:221
double max_value_num_mads
Definition crispr_quality_control.hpp:226
Buffers for compute_crispr_qc_metrics().
Definition crispr_quality_control.hpp:49
Sum_ * sum
Definition crispr_quality_control.hpp:55
Detected_ * detected
Definition crispr_quality_control.hpp:62
Index_ * max_index
Definition crispr_quality_control.hpp:75
Value_ * max_value
Definition crispr_quality_control.hpp:69
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:135
std::vector< Index_ > max_index
Definition crispr_quality_control.hpp:157
std::vector< Value_ > max_value
Definition crispr_quality_control.hpp:152
std::vector< Detected_ > detected
Definition crispr_quality_control.hpp:146
std::vector< Sum_ > sum
Definition crispr_quality_control.hpp:140
Buffers for per_cell_qc_metrics().
Definition per_cell_qc_metrics.hpp:97
Value_ * max_value
Definition per_cell_qc_metrics.hpp:127
Index_ * max_index
Definition per_cell_qc_metrics.hpp:134
Sum_ * sum
Definition per_cell_qc_metrics.hpp:115
Detected_ * detected
Definition per_cell_qc_metrics.hpp:121
Options for per_cell_qc_metrics().
Definition per_cell_qc_metrics.hpp:25
int num_threads
Definition per_cell_qc_metrics.hpp:83