34 const gsl::span<const mch::Digit>&
digits,
36 const gsl::span<const mid::ROFRecord>&
midROFs)
49 for (
const auto& midROF :
midROFs) {
50 if (midROF.nEntries == 0) {
53 auto midBC = midROF.interactionRecord.toLong();
54 mEvents.emplace(std::make_pair(midBC, Event(midBC +
param.triggerRange[0], midBC +
param.triggerRange[1])));
59 auto mchBC =
mchROFs[
i].getBCData().toLong();
60 auto itEvent = mEvents.lower_bound(mchBC -
param.triggerRange[1] + 1);
61 if (itEvent != mEvents.end() && itEvent->second.trgRange[0] < mchBC +
mchROFs[
i].getBCWidth()) {
62 itEvent->second.iMCHROFs.push_back(
i);
63 itEvent->second.maxRORange = std::max(itEvent->second.maxRORange, mchBC +
mchROFs[
i].getBCWidth());
67#pragma GCC diagnostic push
68#pragma GCC diagnostic ignored "-Wstringop-overflow"
70 for (
auto itEvent = mEvents.begin(); itEvent != mEvents.end();) {
71 if (itEvent->second.iMCHROFs.empty()) {
72 itEvent = mEvents.erase(itEvent);
74 auto itNextEvent = std::next(itEvent);
75 if (itNextEvent != mEvents.end() && itNextEvent->second.trgRange[0] < itEvent->second.maxRORange) {
76 itEvent->second.trgRange[1] = itNextEvent->second.trgRange[1];
77 itEvent->second.maxRORange = std::max(itEvent->second.maxRORange, itNextEvent->second.maxRORange);
78 itEvent->second.iMCHROFs.insert(itEvent->second.iMCHROFs.end(),
79 itNextEvent->second.iMCHROFs.begin(), itNextEvent->second.iMCHROFs.end());
80 mEvents.erase(itNextEvent);
82 itEvent = itNextEvent;
86#pragma GCC diagnostic pop
91 for (
const auto&
event : mEvents) {
93 int digitOffset = mDigits.size();
94 for (
auto iMCHROF :
event.second.iMCHROFs) {
95 for (
int iDigit =
mchROFs[iMCHROF].getFirstIdx(); iDigit <=
mchROFs[iMCHROF].getLastIdx(); ++iDigit) {
96 const auto& digit =
digits[iDigit];
97 auto digitLoc = mDigitLoc.emplace(((digit.getDetID() << 16) | digit.getPadID()), mDigits.size());
98 if (digitLoc.second) {
99 mDigits.emplace_back(digit);
100 if (labels !=
nullptr) {
104 auto& digit0 = mDigits[digitLoc.first->second];
105 digit0.setADC(digit0.getADC() + digit.getADC());
106 auto nofSamples = digit0.getNofSamples() + digit.getNofSamples();
107 digit0.setNofSamples((nofSamples > 0x3FF) ? 0x3FF : nofSamples);
108 digit0.setSaturated(digit0.isSaturated() || digit.isSaturated());
109 if (labels !=
nullptr) {
118 mROFs.emplace_back(
ir, digitOffset, mDigits.size() - digitOffset,
119 event.second.trgRange[1] -
param.triggerRange[1] -
event.first + 1);
void run(const gsl::span< const mch::ROFRecord > &mchROFs, const gsl::span< const mch::Digit > &digits, const dataformats::MCLabelContainer *labels, const gsl::span< const mid::ROFRecord > &midROFs)
run the event finder algorithm