diff --git a/algo/detectors/tof/Calibrate.cxx b/algo/detectors/tof/Calibrate.cxx index c7eb9fa79d9acd84d19f6a81f6bf75229643f3f5..0ba00227e29573c7a172c0021a9c5b092dd52bde 100644 --- a/algo/detectors/tof/Calibrate.cxx +++ b/algo/detectors/tof/Calibrate.cxx @@ -15,20 +15,17 @@ using fles::Subsystem; namespace cbm::algo::tof { // ----- Constructor ------------------------------------------------------ - Calibrate::Calibrate(tof::CalibrateSetup params) : fTofConfig(params) + Calibrate::Calibrate(tof::CalibrateSetup setup) : fSetup(setup), smTypeOffset(1, 0), smOffset(1, 0), rpcOffset(1, 0) { - smTypeOffset.resize(1, 0); - smOffset.resize(1, 0); - rpcOffset.resize(1, 0); - - for (uint32_t SmType = 0; SmType < fTofConfig.NbSm.size(); SmType++) { - int32_t NbSm = fTofConfig.NbSm[SmType]; - int32_t NbRpc = fTofConfig.NbRpc[SmType]; + // Initialize offset arrays for channel deadtime check + for (uint32_t SmType = 0; SmType < fSetup.NbSm.size(); SmType++) { + int32_t NbSm = fSetup.NbSm[SmType]; + int32_t NbRpc = fSetup.NbRpc[SmType]; smTypeOffset.push_back(smTypeOffset.back() + NbSm); for (int32_t Sm = 0; Sm < NbSm; Sm++) { smOffset.push_back(smOffset.back() + NbRpc); for (int32_t Rpc = 0; Rpc < NbRpc; Rpc++) { - int32_t NbChan = fTofConfig.rpcs[SmType][Sm * NbRpc + Rpc].chanPar.size(); + int32_t NbChan = fSetup.rpcs[SmType][Sm * NbRpc + Rpc].chanPar.size(); rpcOffset.push_back(rpcOffset.back() + 2 * NbChan); //Factor 2 for channel sides } } @@ -58,20 +55,20 @@ namespace cbm::algo::tof const double Rpc = digi.GetRpc(); const double Chan = digi.GetChannel(); const double Side = digi.GetSide(); - const int NbRpc = fTofConfig.NbRpc[SmType]; + const int NbRpc = fSetup.NbRpc[SmType]; - auto& rpcs = fTofConfig.rpcs; + auto& rpcs = fSetup.rpcs; if (SmType >= rpcs.size() || Sm * NbRpc + Rpc >= rpcs.at(SmType).size()) { monitor.fDigiCalibUnknownRPC++; continue; } - CalibrateSetup::Rpc& rpcPar = fTofConfig.rpcs.at(SmType).at(Sm * NbRpc + Rpc); + CalibrateSetup::Rpc& rpcPar = fSetup.rpcs.at(SmType).at(Sm * NbRpc + Rpc); CalibrateSetup::Channel& chanPar = rpcPar.chanPar[Chan]; // Check dead time const size_t chanIdx = rpcOffset[smOffset[smTypeOffset[SmType] + Sm] + Rpc] + Chan + Side * rpcPar.chanPar.size(); - double& deadTime = mChannelDeadTime[chanIdx]; + const double deadTime = mChannelDeadTime[chanIdx]; if (!std::isnan(deadTime) && digi.GetTime() <= deadTime) { mChannelDeadTime[chanIdx] = digi.GetTime() + rpcPar.channelDeadtime; @@ -92,18 +89,16 @@ namespace cbm::algo::tof pCalDigi.SetTime(pCalDigi.GetTime() - chanPar.vCPTOff[Side]); // subtract Offset - double dTot = pCalDigi.GetTot() - chanPar.vCPTotOff[Side]; - if (dTot < 0.001) dTot = 0.001; + const double dTot = std::max(pCalDigi.GetTot() - chanPar.vCPTotOff[Side], 0.001); + // calibrate Digi ToT pCalDigi.SetTot(dTot * chanPar.vCPTotGain[Side]); // walk correction std::vector<double>& walk = chanPar.vCPWalk[Side]; const double dTotBinSize = (rpcPar.TOTMax - rpcPar.TOTMin) / rpcPar.numClWalkBinX; - int32_t iWx = (int32_t)((pCalDigi.GetTot() - rpcPar.TOTMin) / dTotBinSize); - - if (0 > iWx) { iWx = 0; } - if (iWx >= rpcPar.numClWalkBinX) { iWx = rpcPar.numClWalkBinX - 1; } + int32_t iWx = std::max((int32_t)((pCalDigi.GetTot() - rpcPar.TOTMin) / dTotBinSize), 0); + iWx = std::min(iWx, rpcPar.numClWalkBinX - 1); const double dDTot = (pCalDigi.GetTot() - rpcPar.TOTMin) / dTotBinSize - (double) iWx - 0.5; double dWT = walk[iWx]; @@ -134,9 +129,8 @@ namespace cbm::algo::tof // 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); - + monitor.fTime = xpu::pop_timer(); + monitor.fNumDigis = digiIn.size(); return result; } diff --git a/algo/detectors/tof/Calibrate.h b/algo/detectors/tof/Calibrate.h index 7523e77d51f163d84f7a8190e998b3ea72dc4ff8..fbeb793915090ef5d25cf0b739c068ddf42452bd 100644 --- a/algo/detectors/tof/Calibrate.h +++ b/algo/detectors/tof/Calibrate.h @@ -36,7 +36,9 @@ namespace cbm::algo::tof std::string print() const { std::stringstream ss; - ss << "Calibrate stats: num unknown RPC " << fDigiCalibUnknownRPC << ", time " << fTime.wall() << std::endl; + ss << "Calibrate stats: processed digis " << fNumDigis << ", num unknown RPC " << fDigiCalibUnknownRPC + << ", num deadtime skips " << fDigiDeadTimeCount << ", time " << fTime.wall() << " ms ( " << fTime.throughput() + << " GB/s )" << std::endl; return ss.str(); } }; @@ -61,14 +63,11 @@ namespace cbm::algo::tof resultType operator()(gsl::span<const CbmTofDigi> digiIn); /** @brief Constructor **/ - Calibrate(tof::CalibrateSetup params); - - /** @brief Destructor **/ - ~Calibrate() {}; + explicit Calibrate(tof::CalibrateSetup params); private: // members /** @brief Parameters for TOF calibrator **/ - tof::CalibrateSetup fTofConfig {}; + tof::CalibrateSetup fSetup; /** @brief Storage for deadtime check **/ std::vector<double> mChannelDeadTime; diff --git a/reco/tasks/CbmTaskTofClusterizer.cxx b/reco/tasks/CbmTaskTofClusterizer.cxx index 4af3613f00b939bf647b0e60bb1218a66b4b2976..6d47357c756b26c1677d65b17afe29841d8f20a9 100644 --- a/reco/tasks/CbmTaskTofClusterizer.cxx +++ b/reco/tasks/CbmTaskTofClusterizer.cxx @@ -351,7 +351,9 @@ bool CbmTaskTofClusterizer::BuildClusters() } //Calibrate digis - *fTofCalDigiVec = (*fCalibrate)(fTofDigiVec).first; + auto [caldigis, calmonitor] = (*fCalibrate)(fTofDigiVec); + *fTofCalDigiVec = std::move(caldigis); + LOG(info) << calmonitor.print(); //Call cluster finder auto [clusters, monitor, indices] = (*fAlgo)(*fTofCalDigiVec);