69 LOG(info) <<
"initializing preclusterizer";
71 mPreClusterFinder.
init();
73 auto stop = [
this]() {
74 LOG(info) <<
"reset precluster finder duration = " << mTimeResetPreClusterFinder.count() <<
" ms";
75 LOG(info) <<
"load digits duration = " << mTimeLoadDigits.count() <<
" ms";
76 LOG(info) <<
"discard high occupancy duration = " << mTimeDiscardHighOccupancy.count() <<
" ms";
77 LOG(info) <<
"precluster finder duration = " << mTimePreClusterFinder.count() <<
" ms";
78 LOG(info) <<
"store precluster duration = " << mTimeStorePreClusters.count() <<
" ms";
80 auto tStart = std::chrono::high_resolution_clock::now();
81 this->mPreClusterFinder.
deinit();
82 auto tEnd = std::chrono::high_resolution_clock::now();
83 LOG(info) <<
"deinitializing preclusterizer in: "
84 << std::chrono::duration<double, std::milli>(tEnd - tStart).count() <<
" ms";
86 LOGP(warning,
"{}", error.
asString());
91 auto checkNoLeftoverDigits = ic.
options().
get<std::string>(
"check-no-leftover-digits");
92 if (checkNoLeftoverDigits ==
"quiet") {
94 }
else if (checkNoLeftoverDigits ==
"error") {
96 }
else if (checkNoLeftoverDigits ==
"fatal") {
99 mDiscardHighOccDEs = ic.
options().
get<
bool>(
"discard-high-occupancy-des");
100 mDiscardHighOccEvents = ic.
options().
get<
bool>(
"discard-high-occupancy-events");
101 mSanityCheck = ic.
options().
get<
bool>(
"sanity-check");
110 auto digitROFs = pc.
inputs().
get<gsl::span<ROFRecord>>(
"digitrofs");
118 if (error.nofOutOfBounds > 0) {
121 LOGP(error,
"in a TF with {} rofs and {} digits", digitROFs.size(),
digits.size());
132 int nDigitsInRofs = 0;
133 for (
const auto& digitROF : digitROFs) {
134 nDigitsInRofs += digitROF.getNEntries();
138 mPreClusters.clear();
145 preClusterROFs.reserve(digitROFs.size());
146 mUsedDigits.reserve(
digits.size());
147 int nRemovedDigits(0);
149 for (
const auto& digitROF : digitROFs) {
152 auto tStart = std::chrono::high_resolution_clock::now();
153 mPreClusterFinder.
reset();
154 auto tEnd = std::chrono::high_resolution_clock::now();
155 mTimeResetPreClusterFinder += tEnd - tStart;
158 tStart = std::chrono::high_resolution_clock::now();
159 mPreClusterFinder.
loadDigits(
digits.subspan(digitROF.getFirstIdx(), digitROF.getNEntries()));
160 tEnd = std::chrono::high_resolution_clock::now();
161 mTimeLoadDigits += tEnd - tStart;
164 tStart = std::chrono::high_resolution_clock::now();
165 nRemovedDigits += mPreClusterFinder.
discardHighOccupancy(mDiscardHighOccDEs, mDiscardHighOccEvents);
166 tEnd = std::chrono::high_resolution_clock::now();
167 mTimeDiscardHighOccupancy += tEnd - tStart;
170 tStart = std::chrono::high_resolution_clock::now();
171 int nPreClusters = mPreClusterFinder.
run();
172 tEnd = std::chrono::high_resolution_clock::now();
173 mTimePreClusterFinder += tEnd - tStart;
176 tStart = std::chrono::high_resolution_clock::now();
177 preClusterROFs.emplace_back(digitROF.getBCData(), mPreClusters.size(), nPreClusters, digitROF.getBCWidth());
179 tEnd = std::chrono::high_resolution_clock::now();
180 mTimeStorePreClusters += tEnd - tStart;
184 if (nRemovedDigits + mUsedDigits.size() != nDigitsInRofs) {
186 switch (mCheckNoLeftoverDigits) {
190 static int nAlarms = 0;
192 LOG(warning) <<
"some digits have been lost during the preclustering";
196 throw runtime_error(
"some digits have been lost during the preclustering");
208 errorMap.forEach([&preClusterErrors](
Error error) {
209 preClusterErrors.emplace_back(error);
211 mErrorMap.
add(errorMap);
213 LOGP(info,
"Processed {} digit rofs with {} digits and output {} precluster rofs with {} preclusters and {} digits",
216 preClusterROFs.size(),
217 mPreClusters.size(), mUsedDigits.size());