29 if (nDiamondsInSetup == 0) {
30 throw std::runtime_error(
"No diamonds found in the BMON calibration config");
33 throw std::runtime_error(
"Wrong diamond selection mask: for a single diamond it must be zero, and for multiple"
34 " diamonds it must be non-zero");
36 if (nDiamondsInSetup > 1) {
44 return GetDiamondIndex(lhs.refAddress) < GetDiamondIndex(rhs.refAddress);
50 diamond.refAddress &= ~CbmTofAddress::GetChannelIdBitmask();
55 for (int32_t iD = 0; iD < nDiamondsInSetup; ++iD) {
67 xpu::push_timer(
"BmonCalibrate");
68 xpu::t_add_bytes(digiIn.size_bytes());
73 auto& calDigiOut = std::get<0>(result);
74 auto& monitor = std::get<1>(result);
75 calDigiOut.reserve(digiIn.size());
81 for (
const auto& digi : digiIn) {
82 uint32_t address =
static_cast<uint32_t
>(digi.GetAddress());
85 if (iDiamond >= diamonds.size()
87 monitor.fDigiCalibUnknownRPC++;
92 const auto& diamondPar = diamonds[iDiamond];
93 const auto& channelPar = diamondPar.chanPar[iChannel];
99 if (!std::isnan(deadTime) && digi.GetTime() <= deadTime) {
100 fChannelDeadTime[iChannelGlb] = digi.GetTime() + diamondPar.channelDeadtime;
101 monitor.fDigiDeadTimeCount++;
104 fChannelDeadTime[iChannelGlb] = digi.GetTime() + diamondPar.channelDeadtime;
107 CbmBmonDigi& pCalDigi = calDigiOut.emplace_back(digi);
114 const double dTot = std::max(pCalDigi.
GetCharge() - channelPar.vCPTotOff, 0.001);
117 pCalDigi.
SetCharge(dTot * channelPar.vCPTotGain);
120 const std::vector<double>& walk = channelPar.vCPWalk;
121 const double dTotBinSize = (diamondPar.TOTMax - diamondPar.TOTMin) / diamondPar.numClWalkBinX;
122 int32_t iWx = std::max((int32_t)((pCalDigi.
GetCharge() - diamondPar.TOTMin) / dTotBinSize), 0);
123 iWx = std::min(iWx, diamondPar.numClWalkBinX - 1);
125 const double dDTot = (pCalDigi.
GetCharge() - diamondPar.TOTMin) / dTotBinSize - (double) iWx - 0.5;
126 double dWT = walk[iWx];
130 if (iWx < diamondPar.numClWalkBinX - 1) {
131 dWT += dDTot * (walk[iWx + 1] - walk[iWx]);
136 dWT -= dDTot * (walk[iWx - 1] - walk[iWx]);
144 for (std::size_t i = 1; i < calDigiOut.size(); ++i) {
147 while (j > 0 && calDigiOut[j - 1].GetTime() > digi.
GetTime()) {
148 calDigiOut[j] = calDigiOut[j - 1];
151 calDigiOut[j] = digi;
158 monitor.fTime = xpu::pop_timer();
159 monitor.fNumDigis = digiIn.size();