From 7c451e71bdc8c562ea67cd12711f59b344084a9e Mon Sep 17 00:00:00 2001 From: Dominik Smith <smith@th.physik.uni-frankfurt.de> Date: Tue, 7 Nov 2023 12:20:58 +0100 Subject: [PATCH] More improvements to cbm::algo::tof::Calibrate. --- algo/detectors/tof/Calibrate.cxx | 56 ++++++++++++++++++-------- algo/detectors/tof/Calibrate.h | 35 ++++------------ algo/detectors/tof/CalibratorChain.cxx | 3 +- reco/tasks/CbmTaskTofClusterizer.cxx | 7 ++-- reco/tasks/CbmTaskTofClusterizer.h | 2 +- 5 files changed, 54 insertions(+), 49 deletions(-) diff --git a/algo/detectors/tof/Calibrate.cxx b/algo/detectors/tof/Calibrate.cxx index f21207af04..36a6efaf82 100644 --- a/algo/detectors/tof/Calibrate.cxx +++ b/algo/detectors/tof/Calibrate.cxx @@ -14,6 +14,29 @@ using fles::Subsystem; namespace cbm::algo::tof { + // ----- Constructor ------------------------------------------------------ + Calibrate::Calibrate(tof::CalibrateSetup params) : fTofConfig(params) + { + 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]; + 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(); + rpcOffset.push_back(rpcOffset.back() + 2 * NbChan); //Factor 2 for channel sides + } + } + } + mChannelDeadTime = std::vector<double>(rpcOffset.back(), std::numeric_limits<double>::quiet_NaN()); + } + + // ----- Execution ------------------------------------------------------- Calibrate::resultType Calibrate::operator()(gsl::span<const CbmTofDigi> digiIn) { @@ -29,14 +52,13 @@ namespace cbm::algo::tof std::fill(mChannelDeadTime.begin(), mChannelDeadTime.end(), std::numeric_limits<double>::quiet_NaN()); - for (size_t iDigi = 0; iDigi < digiIn.size(); iDigi++) { - - CbmTofDigi pDigi = digiIn[iDigi]; - const double SmType = pDigi.GetType(); - const double Sm = pDigi.GetSm(); - const double Rpc = pDigi.GetRpc(); - const double Chan = pDigi.GetChannel(); - const double Side = pDigi.GetSide(); + for (const auto& entry : digiIn) { + CbmTofDigi digi = entry; + const double SmType = digi.GetType(); + const double Sm = digi.GetSm(); + const double Rpc = digi.GetRpc(); + const double Chan = digi.GetChannel(); + const double Side = digi.GetSide(); const int NbRpc = fTofConfig.NbRpc[SmType]; auto& rpcs = fTofConfig.rpcs; @@ -48,22 +70,24 @@ namespace cbm::algo::tof CalibrateSetup::Rpc& rpcPar = fTofConfig.rpcs.at(SmType).at(Sm * NbRpc + Rpc); CalibrateSetup::Channel& chanPar = rpcPar.chanPar[Chan]; - if (rpcPar.swapChannelSides && 5 != SmType && 8 != SmType) { - pDigi.SetAddress(Sm, Rpc, Chan, (0 == Side) ? 1 : 0, SmType); - } - // Check dead time const size_t chanIdx = rpcOffset[smOffset[smTypeOffset[SmType] + Sm] + Rpc] + Chan + Side * rpcPar.chanPar.size(); double& deadTime = mChannelDeadTime[chanIdx]; - if (!std::isnan(deadTime) && pDigi.GetTime() <= deadTime) { - mChannelDeadTime[chanIdx] = pDigi.GetTime() + rpcPar.channelDeadtime; + if (!std::isnan(deadTime) && digi.GetTime() <= deadTime) { + mChannelDeadTime[chanIdx] = digi.GetTime() + rpcPar.channelDeadtime; + monitor.fDigiDeadTimeCount++; continue; } - mChannelDeadTime[chanIdx] = pDigi.GetTime() + rpcPar.channelDeadtime; + mChannelDeadTime[chanIdx] = digi.GetTime() + rpcPar.channelDeadtime; + + // 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); + } // Create calibrated digi - CbmTofDigi& pCalDigi = calDigiOut.emplace_back(pDigi); + CbmTofDigi& pCalDigi = calDigiOut.emplace_back(digi); // calibrate Digi Time pCalDigi.SetTime(pCalDigi.GetTime() - chanPar.vCPTOff[Side]); diff --git a/algo/detectors/tof/Calibrate.h b/algo/detectors/tof/Calibrate.h index 00005a3804..7523e77d51 100644 --- a/algo/detectors/tof/Calibrate.h +++ b/algo/detectors/tof/Calibrate.h @@ -31,6 +31,7 @@ namespace cbm::algo::tof xpu::timings fTime; size_t fNumDigis = 0; size_t fDigiCalibUnknownRPC = 0; + size_t fDigiDeadTimeCount = 0; std::string print() const { @@ -59,37 +60,12 @@ namespace cbm::algo::tof **/ resultType operator()(gsl::span<const CbmTofDigi> digiIn); - /** @brief Default constructor **/ - Calibrate() {}; + /** @brief Constructor **/ + Calibrate(tof::CalibrateSetup params); /** @brief Destructor **/ ~Calibrate() {}; - /** @brief Set parameters for TOF calibrator and initialize channel dead time arrays **/ - void SetParams(tof::CalibrateSetup params) - { - fTofConfig = params; - 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]; - 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(); - rpcOffset.push_back(rpcOffset.back() + 2 * NbChan); //Factor 2 for channel sides - } - } - } - mChannelDeadTime = std::vector<double>(rpcOffset.back(), std::numeric_limits<double>::quiet_NaN()); - } - private: // members /** @brief Parameters for TOF calibrator **/ tof::CalibrateSetup fTofConfig {}; @@ -97,8 +73,13 @@ namespace cbm::algo::tof /** @brief Storage for deadtime check **/ std::vector<double> mChannelDeadTime; + /** @brief Offset of super module type **/ std::vector<size_t> smTypeOffset; + + /** @brief Offset of super module **/ std::vector<size_t> smOffset; + + /** @brief Offset of RPC **/ std::vector<size_t> rpcOffset; }; } // namespace cbm::algo::tof diff --git a/algo/detectors/tof/CalibratorChain.cxx b/algo/detectors/tof/CalibratorChain.cxx index adddf722ce..075413a691 100644 --- a/algo/detectors/tof/CalibratorChain.cxx +++ b/algo/detectors/tof/CalibratorChain.cxx @@ -11,8 +11,7 @@ using namespace cbm::algo::tof; void CalibratorChain::Init() { auto setup = config::ReadFromFile<CalibrateSetup>(Opts().ParamsDir() / "TofCalibratePar.yaml"); - fCalibrate = std::make_unique<Calibrate>(); - fCalibrate->SetParams(setup); + fCalibrate = std::make_unique<Calibrate>(setup); } CalibratorChain::ReturnType CalibratorChain::Run(gsl::span<CbmTofDigi> digis) diff --git a/reco/tasks/CbmTaskTofClusterizer.cxx b/reco/tasks/CbmTaskTofClusterizer.cxx index d818277c29..4af3613f00 100644 --- a/reco/tasks/CbmTaskTofClusterizer.cxx +++ b/reco/tasks/CbmTaskTofClusterizer.cxx @@ -313,8 +313,9 @@ bool CbmTaskTofClusterizer::InitAlgos() fAlgo = std::make_unique<cbm::algo::tof::Hitfind>( cbm::algo::config::ReadFromFile<cbm::algo::tof::HitfindSetup>("TofHitfinderPar.yaml")); - // Read calibration parameters pass to algo - fCalibrate.SetParams(cbm::algo::config::ReadFromFile<cbm::algo::tof::CalibrateSetup>("TofCalibratePar.yaml")); + // Read calibration parameters initialize algo + fCalibrate = std::make_unique<cbm::algo::tof::Calibrate>( + cbm::algo::config::ReadFromFile<cbm::algo::tof::CalibrateSetup>("TofCalibratePar.yaml")); return true; } @@ -350,7 +351,7 @@ bool CbmTaskTofClusterizer::BuildClusters() } //Calibrate digis - *fTofCalDigiVec = fCalibrate(fTofDigiVec).first; + *fTofCalDigiVec = (*fCalibrate)(fTofDigiVec).first; //Call cluster finder auto [clusters, monitor, indices] = (*fAlgo)(*fTofCalDigiVec); diff --git a/reco/tasks/CbmTaskTofClusterizer.h b/reco/tasks/CbmTaskTofClusterizer.h index 78fb5059bc..049daf203a 100644 --- a/reco/tasks/CbmTaskTofClusterizer.h +++ b/reco/tasks/CbmTaskTofClusterizer.h @@ -131,7 +131,7 @@ private: std::unique_ptr<cbm::algo::tof::Hitfind> fAlgo; // Calibrator algo - cbm::algo::tof::Calibrate fCalibrate; + std::unique_ptr<cbm::algo::tof::Calibrate> fCalibrate; const CbmTsEventHeader* fTsHeader; -- GitLab