1#ifndef SCRAN_QC_CHOOSE_FILTER_THRESHOLDS_HPP
2#define SCRAN_QC_CHOOSE_FILTER_THRESHOLDS_HPP
66template<
typename Float_>
88template<
typename Float_>
89Float_ unlog_threshold(
const Float_ val,
const bool was_logged) {
91 if (std::isinf(val)) {
102template<
bool lower_,
typename Float_>
103std::vector<Float_> strip_threshold(
const std::vector<ChooseFilterThresholdsResults<Float_> >& res) {
104 std::vector<Float_> output;
105 output.reserve(res.size());
106 for (
const auto& r : res) {
107 if constexpr(lower_) {
108 output.push_back(r.lower);
110 output.push_back(r.upper);
135template<
typename Float_>
137 static_assert(std::is_floating_point<Float_>::value);
139 Float_& lthresh = output.
lower;
140 Float_& uthresh = output.
upper;
141 lthresh = -std::numeric_limits<Float_>::infinity();
142 uthresh = std::numeric_limits<double>::infinity();
144 const auto median = mm.
median;
145 const auto mad = mm.
mad;
146 if (!std::isnan(median) && !std::isnan(mad)) {
147 auto delta = std::max(
static_cast<Float_
>(options.
min_diff), options.
num_mads * mad);
149 lthresh = internal::unlog_threshold(median - delta, options.
log);
152 uthresh = internal::unlog_threshold(median + delta, options.
log);
171template<
typename Float_>
193template<
typename Value_,
typename Float_>
217template<
typename Float_>
222 std::vector<ChooseFilterThresholdsResults<Float_> > output;
223 output.reserve(mms.size());
224 for (
auto& mm : mms) {
245template<
typename Value_,
typename Block_,
typename Float_>
247 const std::size_t num,
248 const Value_*
const metrics,
249 const Block_*
const block,
Simple quality control for single-cell data.
Definition adt_quality_control.hpp:23
std::vector< ChooseFilterThresholdsResults< Float_ > > choose_filter_thresholds_blocked(const std::vector< FindMedianMadResults< Float_ > > &mms, const ChooseFilterThresholdsOptions &options)
Definition choose_filter_thresholds.hpp:218
FindMedianMadResults< Float_ > find_median_mad(std::size_t num, Float_ *metrics, const FindMedianMadOptions &options)
Definition find_median_mad.hpp:81
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
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
double min_diff
Definition choose_filter_thresholds.hpp:46
bool lower
Definition choose_filter_thresholds.hpp:26
Results of compute_adt_qc_metrics().
Definition choose_filter_thresholds.hpp:67
Float_ upper
Definition choose_filter_thresholds.hpp:80
Float_ lower
Definition choose_filter_thresholds.hpp:73