diff --git a/algo/detectors/tof/Calibrate.cxx b/algo/detectors/tof/Calibrate.cxx index 36a6efaf82eef8c7e3852aa9b0b9494823a09500..c7eb9fa79d9acd84d19f6a81f6bf75229643f3f5 100644 --- a/algo/detectors/tof/Calibrate.cxx +++ b/algo/detectors/tof/Calibrate.cxx @@ -52,8 +52,7 @@ namespace cbm::algo::tof std::fill(mChannelDeadTime.begin(), mChannelDeadTime.end(), std::numeric_limits<double>::quiet_NaN()); - for (const auto& entry : digiIn) { - CbmTofDigi digi = entry; + for (const auto& digi : digiIn) { const double SmType = digi.GetType(); const double Sm = digi.GetSm(); const double Rpc = digi.GetRpc(); @@ -81,14 +80,14 @@ namespace cbm::algo::tof } mChannelDeadTime[chanIdx] = digi.GetTime() + rpcPar.channelDeadtime; + // Create calibrated digi + CbmTofDigi& pCalDigi = calDigiOut.emplace_back(digi); + // Check if channel sides need to be swapped if (rpcPar.swapChannelSides && 5 != SmType && 8 != SmType) { - digi.SetAddress(Sm, Rpc, Chan, (0 == Side) ? 1 : 0, SmType); + pCalDigi.SetAddress(Sm, Rpc, Chan, (0 == Side) ? 1 : 0, SmType); } - // Create calibrated digi - CbmTofDigi& pCalDigi = calDigiOut.emplace_back(digi); - // calibrate Digi Time pCalDigi.SetTime(pCalDigi.GetTime() - chanPar.vCPTOff[Side]); @@ -120,8 +119,20 @@ namespace cbm::algo::tof } /// Sort the buffers of hits due to the time offsets applied - std::sort(calDigiOut.begin(), calDigiOut.end(), - [](const CbmTofDigi& a, const CbmTofDigi& b) -> bool { return a.GetTime() < b.GetTime(); }); + // (insert-sort faster than std::sort due to pre-sorting) + for (std::size_t i = 1; i < calDigiOut.size(); ++i) { + CbmTofDigi digi = calDigiOut[i]; + std::size_t j = i; + while (j > 0 && calDigiOut[j - 1].GetTime() > digi.GetTime()) { + calDigiOut[j] = calDigiOut[j - 1]; + --j; + } + calDigiOut[j] = digi; + } + + // Kept for possible unsorted input + // std::sort(calDigiOut.begin(), calDigiOut.end(), + // [](const CbmTofDigi& a, const CbmTofDigi& b) -> bool { return a.GetTime() < b.GetTime(); }); monitor.fTime = xpu::pop_timer(); //L_(info) << MakeReport("CalibrateTime", monitor.fTime);