28double signalCut(
double*
x,
const double* p)
30 double x0 = pow(p[0] / p[2], 1. / p[3]) + p[1];
34 return p[2] * pow(
x[0] - p[1], p[3]);
42double backgroundCut(
double*
x,
const double* p)
45 double x0 = (p[3] * p[2] - p[1] * p[0]) / (p[3] - p[1]);
47 return p[1] * (
x[0] - p[0]);
49 return p[3] * (
x[0] - p[2]);
56 if (digit.getADC() < minADC) {
65 uint16_t minNSamplesBackground = 14;
66 double backgroundParam[4] = {18., 24., -20., 7.0};
68 auto backgroundCut = [backgroundParam](
double*
x) {
69 return ::backgroundCut(
x, backgroundParam);
72 return [backgroundCut, minNSamplesBackground](
const o2::mch::Digit& digit) ->
bool {
73 double nSample = digit.getNofSamples();
74 if (digit.getNofSamples() < minNSamplesBackground || digit.getADC() < backgroundCut(&nSample)) {
83 uint16_t minNSamplesSignal = 17;
84 double signalParam[4] = {80., 16., 12., 1.2};
86 auto signalCut = [signalParam](
double*
x) {
87 return ::signalCut(
x, signalParam);
89 return [signalCut, minNSamplesSignal](
const o2::mch::Digit& digit) ->
bool {
90 double nSample = digit.getNofSamples();
91 if (digit.getNofSamples() < minNSamplesSignal || digit.getADC() < signalCut(&nSample)) {
101void report(
const std::map<
int, std::vector<int>>& rejectList, uint32_t statusMask)
104 for (
const auto it : rejectList) {
105 nbad += it.second.size();
107 LOGP(info,
"Got {} bad channels in {} detection element{} (using statusMask=0x{:x})", nbad,
108 rejectList.size(), rejectList.size() > 1 ?
"s" :
"", statusMask);
114 auto rejectList =
applyMask(statusMap, statusMask);
115 report(rejectList, statusMask);
118 bool goodChannel{
true};
119 auto deID = digit.getDetID();
120 auto it = rejectList.find(digit.getDetID());
121 if (it != rejectList.end()) {
123 goodChannel = std::find(it->second.begin(), it->second.end(), digit.getPadID()) == it->second.end();
130 bool rejectBackground,
135 std::vector<DigitFilter> parts;
138 parts.emplace_back(createMinAdcCut(minADC));
140 if (rejectBackground) {
141 parts.emplace_back(createRejectBackground());
144 parts.emplace_back(createSelectSignal());
146 if (!statusMap.
empty() && statusMask) {
149 return [parts](
const Digit& digit) {
150 for (
const auto& p : parts) {
MCH digit implementation.
std::map< int, std::vector< int > > applyMask(const o2::mch::StatusMap &statusMap, uint32_t mask)
std::function< bool(const Digit &)> DigitFilter
DigitFilter createDigitFilter(uint32_t minADC, bool rejectBackground, bool selectSignal, const StatusMap &statusMap={}, uint32_t statusMask=0)
DigitFilter createBadChannelFilter(const StatusMap &statusMap, uint32_t statusMask)
void report(const std::map< int, std::vector< int > > &rejectList, uint32_t statusMask)