diff --git a/algo/CMakeLists.txt b/algo/CMakeLists.txt index 1811fe30e8ef76e31df9cb666b847bc9d1c2545e..fe4e905d41b6310df50cd9e8f8c7870765494d0c 100644 --- a/algo/CMakeLists.txt +++ b/algo/CMakeLists.txt @@ -95,6 +95,7 @@ set(SRCS detectors/tof/Unpack.cxx detectors/tof/Hitfind.cxx detectors/tof/HitfinderChain.cxx + detectors/tof/CalibratorChain.cxx detectors/bmon/ReadoutConfig.cxx detectors/bmon/Unpack.cxx detectors/trd/ReadoutConfig.cxx diff --git a/algo/detectors/tof/Calibrate.cxx b/algo/detectors/tof/Calibrate.cxx index b94cdc8cc1799388ab687c8b73a461e5e1869598..9b5697daa7d011f56fa6c88f0168053f0cdf5775 100644 --- a/algo/detectors/tof/Calibrate.cxx +++ b/algo/detectors/tof/Calibrate.cxx @@ -15,7 +15,7 @@ using fles::Subsystem; namespace cbm::algo::tof { // ----- Execution ------------------------------------------------------- - Calibrate::resultType Calibrate::operator()(gsl::span<CbmTofDigi> digiIn) + Calibrate::resultType Calibrate::operator()(gsl::span<const CbmTofDigi> digiIn) { xpu::push_timer("TofCalibrate"); xpu::t_add_bytes(digiIn.size_bytes()); @@ -97,7 +97,6 @@ namespace cbm::algo::tof } monitor.fTime = xpu::pop_timer(); - L_(debug) << MakeReport("Calibrate", monitor.fTime); return result; } diff --git a/algo/detectors/tof/Calibrate.h b/algo/detectors/tof/Calibrate.h index 9d8a60b0dd6b333236937cfabb22bdb084baf037..1e3f2b3a7d081062a65369fcf2e5ef16c2aa7643 100644 --- a/algo/detectors/tof/Calibrate.h +++ b/algo/detectors/tof/Calibrate.h @@ -29,6 +29,7 @@ namespace cbm::algo::tof **/ struct CalibrateMonitorData { xpu::timings fTime; + size_t fNumDigis = 0; size_t fDigiCalibUnknownRPC = 0; std::string print() const @@ -56,7 +57,7 @@ namespace cbm::algo::tof ** ** @note Modifies input digis for time calibration **/ - resultType operator()(gsl::span<CbmTofDigi> digiIn); + resultType operator()(gsl::span<const CbmTofDigi> digiIn); /** @brief Default constructor **/ Calibrate() {}; @@ -68,8 +69,6 @@ namespace cbm::algo::tof tof::HitfindSetup fTofConfig {}; private: // members - /** @brief Applies calibration to input digis **/ - std::vector<CbmTofDigi> CalibRawDigis(gsl::span<CbmTofDigi> digiVec, CalibrateMonitorData& monitor); }; } // namespace cbm::algo::tof diff --git a/algo/detectors/tof/CalibratorChain.cxx b/algo/detectors/tof/CalibratorChain.cxx new file mode 100644 index 0000000000000000000000000000000000000000..4a9a35147af665d16d7464779c630ef8929ad1ec --- /dev/null +++ b/algo/detectors/tof/CalibratorChain.cxx @@ -0,0 +1,24 @@ +/* Copyright (C) 2023 Facility for Antiproton and Ion Research in Europe, Darmstadt + SPDX-License-Identifier: GPL-3.0-only + Authors: Dominik Smith [committer], Felix Weiglhofer */ +#include "CalibratorChain.h" + +#include "config/Yaml.h" + +using namespace cbm::algo; +using namespace cbm::algo::tof; + +void CalibratorChain::Init() +{ + auto setup = config::ReadFromFile<HitfindSetup>(Opts().ParamsDir() / "TofHitfinderPar.yaml"); + fCalibrate = std::make_unique<Calibrate>(); + fCalibrate->fTofConfig = setup; +} + +CalibratorChain::ReturnType CalibratorChain::Run(gsl::span<CbmTofDigi> digis) +{ + auto ret = (*fCalibrate)(digis); + + L_(error) << "TOF Digis with unknown RPCs: " << std::get<1>(ret).fDigiCalibUnknownRPC; + return ret; +} diff --git a/algo/detectors/tof/CalibratorChain.h b/algo/detectors/tof/CalibratorChain.h new file mode 100644 index 0000000000000000000000000000000000000000..e22780d3cad4964177461437a3039b47f8e0e7ba --- /dev/null +++ b/algo/detectors/tof/CalibratorChain.h @@ -0,0 +1,37 @@ +/* Copyright (C) 2023 Facility for Antiproton and Ion Research in Europe, Darmstadt + SPDX-License-Identifier: GPL-3.0-only + Authors: Dominik Smith [committer], Felix Weiglhofer */ +#pragma once + +#include "CbmTofDigi.h" + +#include <gsl/span> +#include <memory> + +#include "Calibrate.h" +#include "HitfindSetup.h" +#include "SubChain.h" + +namespace cbm::algo::tof +{ + + class CalibratorChain : public SubChain { + + public: + using ReturnType = Calibrate::resultType; + + CalibratorChain() = default; + ~CalibratorChain() = default; + + void Init(); + + /** + * @brief Apply calibration to digis + */ + ReturnType Run(gsl::span<CbmTofDigi> digis); + + private: + std::unique_ptr<Calibrate> fCalibrate; + }; + +} // namespace cbm::algo::tof diff --git a/algo/detectors/tof/Hitfind.cxx b/algo/detectors/tof/Hitfind.cxx index 92bee7da8a0d63622462310ff94e0caa2a1be345..72fed21efc4db484174b0433d1390deab5d4838b 100644 --- a/algo/detectors/tof/Hitfind.cxx +++ b/algo/detectors/tof/Hitfind.cxx @@ -81,7 +81,6 @@ namespace cbm::algo::tof monitor.fTime = xpu::pop_timer(); monitor.fNumDigis = digiIn.size(); monitor.fNumHits = clustersFlat.size(); - L_(debug) << MakeReport("Hitfind", monitor.fTime); // Create ouput vector clusterTs = PartitionedVector(std::move(clustersFlat), rpcSizes, rpcAddresses); diff --git a/algo/global/Reco.cxx b/algo/global/Reco.cxx index 674372b5ba040681167c3794df5723becb5ecbd0..83ebb30c9d07fbe8f88bc4cf3d6678d26be03d7b 100644 --- a/algo/global/Reco.cxx +++ b/algo/global/Reco.cxx @@ -87,6 +87,7 @@ void Reco::Init(const Options& opts) // TOF Hitfinder fTofHitFinder.Init(); + fTofCalibrator.Init(); // Tracking fTracking.Init(); @@ -153,9 +154,11 @@ RecoResults Reco::Run(const fles::Timeslice& ts) PartitionedVector<tof::Hit> tofHits; if (Opts().HasStep(Step::LocalReco) && Opts().HasDetector(fles::Subsystem::TOF)) { - auto [hits, monitor, caldigis] = fTofHitFinder.Run(unpackResult.first.fTof); - tofHits = std::move(hits); - QueueTofRecoMetrics(monitor); + auto [caldigis, calmonitor] = fTofCalibrator.Run(unpackResult.first.fTof); + auto [hits, hitmonitor] = fTofHitFinder.Run(caldigis); + tofHits = std::move(hits); + QueueTofCalibMetrics(calmonitor); + QueueTofRecoMetrics(hitmonitor); } // --- Tracking @@ -294,6 +297,20 @@ void Reco::QueueTofRecoMetrics(const tof::HitfindMonitorData& mon) }); } +void Reco::QueueTofCalibMetrics(const tof::CalibrateMonitorData& mon) +{ + if (!HasMonitor()) return; + + GetMonitor().QueueMetric("cbmreco", {{"hostname", fles::system::current_hostname()}, {"child", Opts().ChildId()}}, + { + {"tofCalibTimeTotal", mon.fTime.wall()}, + {"tofCalibThroughput", mon.fTime.throughput()}, + {"tofCalibNumDigisIn", mon.fNumDigis}, + {"tofCalibUnknownRPC", mon.fDigiCalibUnknownRPC}, + }); +} + + void Reco::QueueEvbuildMetrics(const evbuild::EventbuildChainMonitorData& mon) { if (!HasMonitor()) return; diff --git a/algo/global/Reco.h b/algo/global/Reco.h index da5aa9774834e23bcb632725b295de6b48e15608..f0a7c2b6d6109a86fc51241b2a7dbe9c42932660 100644 --- a/algo/global/Reco.h +++ b/algo/global/Reco.h @@ -4,6 +4,7 @@ #ifndef CBM_ALGO_GLOBAL_RECO_H #define CBM_ALGO_GLOBAL_RECO_H +#include "tof/CalibratorChain.h" #include "tof/HitfinderChain.h" #include <xpu/host.h> @@ -58,6 +59,7 @@ namespace cbm::algo // TOF tof::HitfinderChain fTofHitFinder; + tof::CalibratorChain fTofCalibrator; // Eventbuilding std::unique_ptr<evbuild::EventbuildChain> fEventBuild; @@ -70,6 +72,7 @@ namespace cbm::algo void QueueUnpackerMetrics(const fles::Timeslice&, const UnpackMonitorData&, const DigiData&); void QueueStsRecoMetrics(const sts::HitfinderMonitor&); void QueueTofRecoMetrics(const tof::HitfindMonitorData&); + void QueueTofCalibMetrics(const tof::CalibrateMonitorData&); void QueueEvbuildMetrics(const evbuild::EventbuildChainMonitorData&); void QueueTrackingMetrics(const ca::TrackingMonitorData&); void QueueProcessingMetrics(const ProcessingMonitor&);