scran_qc
Simple quality control on single-cell data
Loading...
Searching...
No Matches
choose_filter_thresholds.hpp
Go to the documentation of this file.
1#ifndef SCRAN_QC_CHOOSE_FILTER_THRESHOLDS_HPP
2#define SCRAN_QC_CHOOSE_FILTER_THRESHOLDS_HPP
3
4#include <vector>
5#include <limits>
6#include <cmath>
7
8#include "find_median_mad.hpp"
9#include "utils.hpp"
10
16namespace scran_qc {
17
26 bool lower = true;
27
32 bool upper = true;
33
39 double num_mads = 3;
40
46 double min_diff = 0;
47
59 bool log = false;
60};
61
66template<typename Float_>
73 Float_ lower = 0;
74
80 Float_ upper = 0;
81};
82
86namespace internal {
87
88template<typename Float_>
89Float_ unlog_threshold(const Float_ val, const bool was_logged) {
90 if (was_logged) {
91 if (std::isinf(val)) {
92 if (val < 0) {
93 return 0;
94 }
95 } else {
96 return std::exp(val);
97 }
98 }
99 return val;
100}
101
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);
109 } else {
110 output.push_back(r.upper);
111 }
112 }
113 return output;
114}
115
116}
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();
143
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);
148 if (options.lower) {
149 lthresh = internal::unlog_threshold(median - delta, options.log);
150 }
151 if (options.upper) {
152 uthresh = internal::unlog_threshold(median + delta, options.log);
153 }
154 }
155
156 return output;
157}
158
171template<typename Float_>
172ChooseFilterThresholdsResults<Float_> choose_filter_thresholds(const std::size_t num, Float_* const metrics, const ChooseFilterThresholdsOptions& options) {
174 fopt.log = options.log;
175 const auto mm = find_median_mad(num, metrics, fopt);
176 return choose_filter_thresholds(mm, options);
177}
178
193template<typename Value_, typename Float_>
194ChooseFilterThresholdsResults<Float_> choose_filter_thresholds(const std::size_t num, const Value_* const metrics, Float_* const buffer, const ChooseFilterThresholdsOptions& options) {
196 fopt.log = options.log;
197 const auto mm = find_median_mad(num, metrics, buffer, fopt);
198 return choose_filter_thresholds(mm, options);
199}
200
217template<typename Float_>
218std::vector<ChooseFilterThresholdsResults<Float_> > choose_filter_thresholds_blocked(
219 const std::vector<FindMedianMadResults<Float_> >& mms,
220 const ChooseFilterThresholdsOptions& options)
221{
222 std::vector<ChooseFilterThresholdsResults<Float_> > output;
223 output.reserve(mms.size());
224 for (auto& mm : mms) {
225 output.emplace_back(choose_filter_thresholds(mm, options));
226 }
227 return output;
228}
229
245template<typename Value_, typename Block_, typename Float_>
246std::vector<ChooseFilterThresholdsResults<Float_> > choose_filter_thresholds_blocked(
247 const std::size_t num,
248 const Value_* const metrics,
249 const Block_* const block,
250 FindMedianMadWorkspace<Float_>* const workspace,
251 const ChooseFilterThresholdsOptions& options)
252{
254 fopt.log = options.log;
255 const auto mms = find_median_mad_blocked(num, metrics, block, workspace, fopt);
256 return choose_filter_thresholds_blocked(mms, options);
257}
258
259}
260
261#endif
Temporary data structures for find_median_mad_blocked().
Definition find_median_mad.hpp:175
Compute the median and MAD from an array of values.
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
Options for find_median_mad().
Definition find_median_mad.hpp:25
bool log
Definition find_median_mad.hpp:31
Results of find_median_mad().
Definition find_median_mad.hpp:45
Float_ median
Definition find_median_mad.hpp:58
Float_ mad
Definition find_median_mad.hpp:63