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
66 bool log = false;
67};
68
73template<typename Float_>
80 Float_ lower = 0;
81
87 Float_ upper = 0;
88};
89
93namespace internal {
94
95template<typename Float_>
96Float_ unlog_threshold(const Float_ val, const bool was_logged) {
97 if (was_logged) {
98 if (std::isinf(val)) {
99 if (val < 0) {
100 return 0;
101 }
102 } else {
103 return std::exp(val);
104 }
105 }
106 return val;
107}
108
109template<bool lower_, typename Float_>
110std::vector<Float_> strip_threshold(const std::vector<ChooseFilterThresholdsResults<Float_> >& res) {
111 std::vector<Float_> output;
112 output.reserve(res.size());
113 for (const auto& r : res) {
114 if constexpr(lower_) {
115 output.push_back(r.lower);
116 } else {
117 output.push_back(r.upper);
118 }
119 }
120 return output;
121}
122
123}
142template<typename Float_>
144 static_assert(std::is_floating_point<Float_>::value);
146 Float_& lthresh = output.lower;
147 Float_& uthresh = output.upper;
148 lthresh = -std::numeric_limits<Float_>::infinity();
149 uthresh = std::numeric_limits<double>::infinity();
150
151 const auto median = mm.median;
152 const auto mad = mm.mad;
153 if (!std::isnan(median) && !std::isnan(mad)) {
154 auto delta = std::max(static_cast<Float_>(options.min_diff), options.num_mads * mad);
155 if (options.lower) {
156 lthresh = internal::unlog_threshold(median - delta, options.log);
157 }
158 if (options.upper) {
159 uthresh = internal::unlog_threshold(median + delta, options.log);
160 }
161 }
162
163 return output;
164}
165
178template<typename Float_>
179ChooseFilterThresholdsResults<Float_> choose_filter_thresholds(const std::size_t num, Float_* const metrics, const ChooseFilterThresholdsOptions& options) {
181 fopt.log = options.log;
182 const auto mm = find_median_mad(num, metrics, fopt);
183 return choose_filter_thresholds(mm, options);
184}
185
200template<typename Value_, typename Float_>
201ChooseFilterThresholdsResults<Float_> choose_filter_thresholds(const std::size_t num, const Value_* const metrics, Float_* const buffer, const ChooseFilterThresholdsOptions& options) {
203 fopt.log = options.log;
204 const auto mm = find_median_mad(num, metrics, buffer, fopt);
205 return choose_filter_thresholds(mm, options);
206}
207
224template<typename Float_>
225std::vector<ChooseFilterThresholdsResults<Float_> > choose_filter_thresholds_blocked(
226 const std::vector<FindMedianMadResults<Float_> >& mms,
227 const ChooseFilterThresholdsOptions& options)
228{
229 std::vector<ChooseFilterThresholdsResults<Float_> > output;
230 output.reserve(mms.size());
231 for (auto& mm : mms) {
232 output.emplace_back(choose_filter_thresholds(mm, options));
233 }
234 return output;
235}
236
252template<typename Value_, typename Block_, typename Float_>
253std::vector<ChooseFilterThresholdsResults<Float_> > choose_filter_thresholds_blocked(
254 const std::size_t num,
255 const Value_* const metrics,
256 const Block_* const block,
257 FindMedianMadWorkspace<Float_>* const workspace,
258 const ChooseFilterThresholdsOptions& options)
259{
261 fopt.log = options.log;
262 const auto mms = find_median_mad_blocked(num, metrics, block, workspace, fopt);
263 return choose_filter_thresholds_blocked(mms, options);
264}
265
266}
267
268#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:225
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:143
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
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:74
Float_ upper
Definition choose_filter_thresholds.hpp:87
Float_ lower
Definition choose_filter_thresholds.hpp:80
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