29 size_t nDiamondsInSetup{setup.
diamonds.size()};
30 if (nDiamondsInSetup == 0) {
31 throw std::runtime_error(
"No diamonds found in the BMON calibration config");
34 throw std::runtime_error(
"Wrong diamond selection mask: for a single diamond it must be zero, and for multiple"
35 " diamonds it must be non-zero");
38 if (nDiamondsInSetup > 1) {
45 std::sort(setup.
diamonds.begin(), setup.
diamonds.end(), [&](
const auto& lhs,
const auto& rhs) {
46 return GetDiamondIndex(lhs.refAddress) < GetDiamondIndex(rhs.refAddress);
54 for (
size_t iDiamond = 0; iDiamond < nDiamondsInSetup; ++iDiamond) {
59 fAlgo = std::vector<std::vector<Clusterizer>>(
fNofThreads, std::vector<Clusterizer>());
60 for (
auto& algoPerThread :
fAlgo) {
61 algoPerThread.reserve(nDiamondsInSetup);
62 for (
size_t iDiamond = 0; iDiamond < nDiamondsInSetup; ++iDiamond) {
63 auto par = std::make_unique<ClusterizerPars>();
64 const auto& diamondPar = setup.
diamonds[iDiamond];
65 par->fAddress = diamondPar.refAddress;
66 par->fDeadStrips = diamondPar.deadStrips;
67 par->fdMaxTimeDist = diamondPar.maxTimeDist;
68 par->fTimeRes = diamondPar.timeRes;
69 algoPerThread.emplace_back(std::move(*par));
72 L_(info) <<
"--- Configured hitfinder algorithms for BMON.";
80 auto& resHits = std::get<0>(res);
81 auto& resMoni = std::get<1>(res);
82 auto& resDigiIds = std::get<2>(res);
84 auto& algoPerThread =
fAlgo[iThread];
87 size_t nDiamonds = algoPerThread.size();
90 for (int32_t iDigi = 0; iDigi < static_cast<int32_t>(digisIn.size()); ++iDigi) {
91 const auto& digi = digisIn[iDigi];
93 if (algoPerThread[iDiamond].SelectDigi(digi)) {
94 vDigiStorage[iDiamond].emplace_back(digi, iDigi);
103 for (
size_t iDiamond = 0; iDiamond < algoPerThread.size(); ++iDiamond) {
104 auto [
hits, digiIds] = algoPerThread[iDiamond](vDigiStorage[iDiamond]);
105 vNhitsPerDiamond[iDiamond] =
hits.size();
106 vHitsFlat.insert(vHitsFlat.end(), std::make_move_iterator(
hits.begin()), std::make_move_iterator(
hits.end()));
107 resDigiIds.insert(resDigiIds.end(), std::make_move_iterator(digiIds.begin()),
108 std::make_move_iterator(digiIds.end()));