28#include <fmt/format.h>
42 DigitFilteringTask(
bool useMC,
bool useStatusMap) : mUseMC{useMC}, mUseStatusMap{useStatusMap} {}
51 auto stop = [
this]() {
52 LOG(info) <<
"digit filtering duration = "
53 << std::chrono::duration<double, std::milli>(mElapsedTime).count() <<
" ms";
60 for (
auto i = 0;
i < rofs.size();
i++) {
65 for (
auto i = 0;
i <
digits.size();
i++) {
76 auto iRofs = pc.
inputs().
get<gsl::span<ROFRecord>>(
"rofs");
77 auto iDigits = pc.
inputs().
get<gsl::span<Digit>>(
"digits");
83 auto tStart = std::chrono::high_resolution_clock::now();
86 LOGP(info,
"performing sanity checks");
90 if (error.nofOutOfBounds > 0) {
92 LOGP(error,
"in a TF with {} rofs and {} digits", iRofs.size(), iDigits.size());
104 bool selectSignal =
false;
109 statusMap ? *statusMap : defaultStatusMap,
118 for (
const auto& irof : iRofs) {
119 const auto digits = iDigits.subspan(irof.getFirstIdx(), irof.getNEntries());
122 for (
auto i = 0;
i <
digits.size();
i++) {
124 if (mIsGoodDigit(d)) {
125 oDigits.emplace_back(d);
127 oLabels->addElements(oLabels->getIndexedSize(), iLabels->getLabels(
i + irof.getFirstIdx()));
131 int nofGoodDigits = oDigits.size() - cursor;
132 if (nofGoodDigits > 0) {
135 oRofs.emplace_back(
ROFRecord(irof.getBCData(),
139 cursor += nofGoodDigits;
144 auto labelMsg = mUseMC ? fmt::format(
"| {} labels (out of {})", oLabels->getNElements(), iLabels->getNElements()) :
"";
146 LOGP(info,
"Kept after filtering : {} rofs (out of {}) | {} digits (out of {}) {}",
147 oRofs.size(), iRofs.size(),
148 oDigits.size(), iDigits.size(),
151 if (mTimeCalib != 0) {
156 LOGP(error,
"Sanity check failed");
158 auto tEnd = std::chrono::high_resolution_clock::now();
159 mElapsedTime += tEnd - tStart;
163 bool mRejectBackground{
false};
164 bool mSanityCheck{
false};
166 bool mUseStatusMap{
false};
168 int32_t mTimeCalib{0};
169 uint32_t mStatusMask{0};
171 std::chrono::duration<double> mElapsedTime{};
177 std::string_view inputDigitDataDescription,
178 std::string_view outputDigitDataDescription,
179 std::string_view inputDigitRofDataDescription,
180 std::string_view outputDigitRofDataDescription,
181 std::string_view inputDigitLabelDataDescription,
182 std::string_view outputDigitLabelDataDescription)
186 fmt::format(
"digits:MCH/{}/0;rofs:MCH/{}/0",
187 inputDigitDataDescription,
188 inputDigitRofDataDescription);
190 input += fmt::format(
";labels:MCH/{}/0", inputDigitLabelDataDescription);
196 input +=
";statusmap:MCH/STATUSMAP/0";
200 fmt::format(
"digits:MCH/{}/0;rofs:MCH/{}/0",
201 outputDigitDataDescription,
202 outputDigitRofDataDescription);
204 output += fmt::format(
";labels:MCH/{}/0", outputDigitLabelDataDescription);
207 std::vector<OutputSpec> outputs;
209 for (
auto& matcher : matchers) {
217 AlgorithmSpec{adaptFromTask<DigitFilteringTask>(useMC, useStatusMap)},
Definition of a container to keep Monte Carlo truth external to simulation objects.
static const DigitFilterParam & Instance()
decltype(auto) make(const Output &spec, Args... args)
ServiceRegistryRef services()
DataAllocator & outputs()
The data allocator is used to allocate memory for the output data.
InputRecord & inputs()
The inputs associated with this processing context.
void run(ProcessingContext &pc)
DigitFilteringTask(bool useMC, bool useStatusMap)
void init(InitContext &ic)
void shiftDigitsTime(gsl::span< ROFRecord > rofs, gsl::span< Digit > digits)
MCH digit implementation.
const BCData & getBCData() const
get the interaction record
Defining PrimaryVertex explicitly as messageable.
std::vector< ConfigParamSpec > Options
std::vector< InputSpec > select(char const *matcher="")
std::vector< InputSpec > Inputs
o2::framework::DataProcessorSpec getDigitFilteringSpec(bool useMC, std::string_view specName="mch-digit-filtering", std::string_view inputDigitDataDescription="DIGITS", std::string_view outputDigitDataDescription="F-DIGITS", std::string_view inputDigitRofDataDescription="DIGITROFS", std::string_view outputDigitRofDataDescription="F-DIGITROFS", std::string_view inputDigitLabelDataDescription="DIGITLABELS", std::string_view outputDigitLabelDataDescription="F-DIGITLABELS")
std::string asString(const o2::mch::TrackMCH &t)
std::function< bool(const Digit &)> DigitFilter
DigitFilter createDigitFilter(uint32_t minADC, bool rejectBackground, bool selectSignal, const StatusMap &statusMap={}, uint32_t statusMask=0)
bool isOK(const SanityError &error)
SanityError sanityCheck(gsl::span< const ROFRecord > rofs, gsl::span< const T > items)
static OutputSpec asOutputSpec(InputSpec const &spec)
uint32_t statusMask
mask to reject digits based on the statusmap (0 = no rejection)
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"
std::vector< Digit > digits