diff --git a/algo/detectors/tof/Calibrate.cxx b/algo/detectors/tof/Calibrate.cxx index 3c2199751715a97012e00a593cabb8ab7ecae666..f21207af04fa267d1a78fda4c2c5999c883b0bd0 100644 --- a/algo/detectors/tof/Calibrate.cxx +++ b/algo/detectors/tof/Calibrate.cxx @@ -27,8 +27,7 @@ namespace cbm::algo::tof auto& monitor = result.second; calDigiOut.reserve(digiIn.size()); - // channel deadtime map - std::unordered_map<int32_t, double> mChannelDeadTime; + std::fill(mChannelDeadTime.begin(), mChannelDeadTime.end(), std::numeric_limits<double>::quiet_NaN()); for (size_t iDigi = 0; iDigi < digiIn.size(); iDigi++) { @@ -54,13 +53,14 @@ namespace cbm::algo::tof } // Check dead time - const int32_t iAddr = pDigi.GetAddress(); - auto it = mChannelDeadTime.find(iAddr); - if (it != mChannelDeadTime.end() && pDigi.GetTime() <= it->second) { - it->second = pDigi.GetTime() + rpcPar.channelDeadtime; + 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; continue; } - mChannelDeadTime[iAddr] = pDigi.GetTime() + rpcPar.channelDeadtime; + mChannelDeadTime[chanIdx] = pDigi.GetTime() + rpcPar.channelDeadtime; // Create calibrated digi CbmTofDigi& pCalDigi = calDigiOut.emplace_back(pDigi); diff --git a/algo/detectors/tof/Calibrate.h b/algo/detectors/tof/Calibrate.h index 5703fcba2d0ec976a2e22469ea1574ce19092953..00005a38048484bd4881329857873ef15f5b7eb1 100644 --- a/algo/detectors/tof/Calibrate.h +++ b/algo/detectors/tof/Calibrate.h @@ -65,10 +65,41 @@ namespace cbm::algo::tof /** @brief Destructor **/ ~Calibrate() {}; - /** @brief Parameters for TOF hitfinders **/ - tof::CalibrateSetup fTofConfig {}; + /** @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 {}; + + /** @brief Storage for deadtime check **/ + std::vector<double> mChannelDeadTime; + + std::vector<size_t> smTypeOffset; + std::vector<size_t> smOffset; + std::vector<size_t> rpcOffset; }; } // namespace cbm::algo::tof diff --git a/algo/detectors/tof/CalibratorChain.cxx b/algo/detectors/tof/CalibratorChain.cxx index f6f422ff0a24c4f55366874aa78d502dfa4c52e8..adddf722cec3b14361e557b3f7c717a199424d9b 100644 --- a/algo/detectors/tof/CalibratorChain.cxx +++ b/algo/detectors/tof/CalibratorChain.cxx @@ -10,9 +10,9 @@ using namespace cbm::algo::tof; void CalibratorChain::Init() { - auto setup = config::ReadFromFile<CalibrateSetup>(Opts().ParamsDir() / "TofCalibratePar.yaml"); - fCalibrate = std::make_unique<Calibrate>(); - fCalibrate->fTofConfig = setup; + auto setup = config::ReadFromFile<CalibrateSetup>(Opts().ParamsDir() / "TofCalibratePar.yaml"); + fCalibrate = std::make_unique<Calibrate>(); + fCalibrate->SetParams(setup); } CalibratorChain::ReturnType CalibratorChain::Run(gsl::span<CbmTofDigi> digis) diff --git a/reco/tasks/CbmTaskTofClusterizer.cxx b/reco/tasks/CbmTaskTofClusterizer.cxx index b44060443a0ec258321f60315647b896925f9604..d818277c293a4be9a56a6826a02108d76f513e30 100644 --- a/reco/tasks/CbmTaskTofClusterizer.cxx +++ b/reco/tasks/CbmTaskTofClusterizer.cxx @@ -314,7 +314,7 @@ bool CbmTaskTofClusterizer::InitAlgos() cbm::algo::config::ReadFromFile<cbm::algo::tof::HitfindSetup>("TofHitfinderPar.yaml")); // Read calibration parameters pass to algo - fCalibrate.fTofConfig = cbm::algo::config::ReadFromFile<cbm::algo::tof::CalibrateSetup>("TofCalibratePar.yaml"); + fCalibrate.SetParams(cbm::algo::config::ReadFromFile<cbm::algo::tof::CalibrateSetup>("TofCalibratePar.yaml")); return true; }