diff --git a/algo/base/DigiData.cxx b/algo/base/DigiData.cxx index 179c8ca31508e322b1bd1222b70bc417a9aafd7b..79fd5a4836022d2caae819e0715f3fcf0a1ecfe7 100644 --- a/algo/base/DigiData.cxx +++ b/algo/base/DigiData.cxx @@ -119,14 +119,16 @@ DigiEvent::DigiEvent(const CbmDigiEvent& storable) : DigiData(storable.fData) , fNumber(storable.fNumber) , fTime(storable.fTime) + , fSelectionTriggers(storable.fSelectionTriggers) { } CbmDigiEvent DigiEvent::ToStorable() const { return CbmDigiEvent{ - .fData = DigiData::ToStorable(), - .fNumber = fNumber, - .fTime = fTime, + .fData = DigiData::ToStorable(), + .fNumber = fNumber, + .fTime = fTime, + .fSelectionTriggers = fSelectionTriggers, }; } diff --git a/algo/base/DigiData.h b/algo/base/DigiData.h index c19b685d996ea4fadc68b7c50e170f356e3c3a44..09b82d933478c57b65087b93e1d0a799120d287b 100644 --- a/algo/base/DigiData.h +++ b/algo/base/DigiData.h @@ -7,6 +7,7 @@ #include "CbmBmonDigi.h" #include "CbmDigiData.h" #include "CbmDigiEvent.h" +#include "CbmEventTriggers.h" #include "CbmFsdDigi.h" #include "CbmMuchDigi.h" #include "CbmPsdDigi.h" @@ -80,6 +81,7 @@ namespace cbm::algo // FIXME: Event number not set yet! uint64_t fNumber = -1; ///< Event identifier double fTime = 0; ///< Event trigger time [ns] + CbmEventTriggers fSelectionTriggers; static std::vector<DigiEvent> FromCbmDigiEvents(const std::vector<CbmDigiEvent>& events); static std::vector<CbmDigiEvent> ToCbmDigiEvents(const std::vector<DigiEvent>& events); diff --git a/algo/evselector/RecoEventSelectorMonitor.h b/algo/evselector/RecoEventSelectorMonitor.h index de2eb4a27eb94094ab06e4c0f877bec9d86f8b53..ae6524f804edd794bb3ec7bc0d3a377c64ba2946 100644 --- a/algo/evselector/RecoEventSelectorMonitor.h +++ b/algo/evselector/RecoEventSelectorMonitor.h @@ -19,12 +19,14 @@ namespace cbm::algo::evselect /// \brief Counter keys for the event selector monitor enum class ECounter { + Timeslices, ///< number of processed timeslices EventsTotal, ///< Total number of events processed EventsNeStsHits, ///< Events with not enough STS hits EventsNeTofHits, ///< Events with enough STS hits, but not enough TOF hits EventsNeBmonHits, ///< Events with not enough BMon hits EventsNeTracks, ///< Events with enough hits, but not enough tracks EventsSelected, ///< Number of selected events + LambdaCandidates, ///< Number of lambda-candidates, returned by KFParticleFinder END }; @@ -53,11 +55,13 @@ namespace cbm::algo::evselect /// \brief Default constructor Monitor() : ca::Monitor<ECounter, ETimer>("Event-selector Monitor") { + SetCounterName(ECounter::Timeslices, "processed timeslices"); SetCounterName(ECounter::EventsTotal, "total events"); SetCounterName(ECounter::EventsNeStsHits, "events discarded by N STS hits"); SetCounterName(ECounter::EventsNeTofHits, "events discarded by N TOF hits"); SetCounterName(ECounter::EventsNeBmonHits, "events discarded by N BMon hits"); SetCounterName(ECounter::EventsNeTracks, "events discarded by N tracks"); + SetCounterName(ECounter::LambdaCandidates, "potential lambda candidates"); SetCounterName(ECounter::EventsSelected, "selected events"); SetTimerName(ETimer::EventReconstruction, "event reconstruction"); @@ -67,6 +71,8 @@ namespace cbm::algo::evselect SetTimerName(ETimer::TrdHitFinder, "hit finding in TRD"); SetTimerName(ETimer::TrackFinder, "track finding"); SetTimerName(ETimer::V0Finder, "V0 finding"); + + SetRatioKeys({ECounter::Timeslices}); } private: diff --git a/algo/global/Reco.cxx b/algo/global/Reco.cxx index f312ebaaab85e36f0a9c689883a4e9c09e8ca13e..0f192df1b6c68934269a1eea7e5561b73dd6aa5d 100644 --- a/algo/global/Reco.cxx +++ b/algo/global/Reco.cxx @@ -45,10 +45,6 @@ #include <xpu/host.h> -// DEBUG: BEGIN -#include <set> -// DEBUG: END - using namespace cbm::algo; using fles::Subsystem; @@ -427,16 +423,16 @@ RecoResults Reco::Run(const fles::Timeslice& ts) // --- Reconstruct and select digi events if (fbReconstructDigiEvents) { - size_t nDiscardedEvents{0}; + fEvSelectingMonitor.IncrementCounter(evselect::ECounter::Timeslices); fEvSelectingMonitor.IncrementCounter(evselect::ECounter::EventsTotal, events.size()); - for (const auto& event : events) { + for (auto& event : events) { fEvSelectingMonitor.StartTimer(evselect::ETimer::EventReconstruction); - if (!ReconstructEvent(event)) { - ++nDiscardedEvents; - } + event.fSelectionTriggers = ReconstructEvent(event); fEvSelectingMonitor.StopTimer(evselect::ETimer::EventReconstruction); } - L_(info) << "Rate of discarded events " << double(nDiscardedEvents) / events.size(); + auto v0FinderMonitor = fV0Finder->GetMonitor(); + fEvSelectingMonitor.IncrementCounter(evselect::ECounter::LambdaCandidates, + v0FinderMonitor.GetCounterValue(kfp::ECounter::KfpLambdaCandidates)); } // --- Filter data for output @@ -525,8 +521,9 @@ void Reco::PrintTimings(xpu::timings& timings) } } -bool Reco::ReconstructEvent(const DigiEvent& digiEvent) +CbmEventTriggers Reco::ReconstructEvent(const DigiEvent& digiEvent) { + CbmEventTriggers triggers(0); RecoResults recoEvent; //* BMON hit reconstruction { @@ -550,7 +547,7 @@ bool Reco::ReconstructEvent(const DigiEvent& digiEvent) fEvSelectingMonitor.StopTimer(evselect::ETimer::StsHitFinder); if (stsResults.hits.NElements() < 4) { // TODO: Provide a config for cuts (testing mode for now) fEvSelectingMonitor.IncrementCounter(evselect::ECounter::EventsNeStsHits); - return false; + return triggers; } recoEvent.stsHits = stsResults.hits; } @@ -563,7 +560,7 @@ bool Reco::ReconstructEvent(const DigiEvent& digiEvent) fEvSelectingMonitor.StopTimer(evselect::ETimer::TofHitFinder); if (hits.NElements() < 2) { // TODO: Provide a config for cuts (testing mode for now) fEvSelectingMonitor.IncrementCounter(evselect::ECounter::EventsNeTofHits); - return false; + return triggers; } recoEvent.tofHits = std::move(hits); } @@ -597,18 +594,19 @@ bool Reco::ReconstructEvent(const DigiEvent& digiEvent) fEvSelectingMonitor.StopTimer(evselect::ETimer::TrackFinder); if (recoEvent.tracks.size() < 2) { // Reject all events with less then two tracks fEvSelectingMonitor.IncrementCounter(evselect::ECounter::EventsNeTracks); - return false; + return triggers; } } //* V0-selector fEvSelectingMonitor.StartTimer(evselect::ETimer::V0Finder); - auto triggers = fV0Finder->ProcessEvent(recoEvent); + triggers = fV0Finder->ProcessEvent(recoEvent); + if (triggers.Test(CbmEventTriggers::ETrigger::Lambda)) { + L_(info) << "!!! Found event with potential lambda candidates"; + fEvSelectingMonitor.IncrementCounter(evselect::ECounter::EventsSelected); + } fEvSelectingMonitor.StopTimer(evselect::ETimer::V0Finder); - - - fEvSelectingMonitor.IncrementCounter(evselect::ECounter::EventsSelected); - return true; + return triggers; } diff --git a/algo/global/Reco.h b/algo/global/Reco.h index eb8ba804acabac619f33f00f9c84bf5b6074fcee..35cb5c34626c8dc84ba994478e83a305522cfd98 100644 --- a/algo/global/Reco.h +++ b/algo/global/Reco.h @@ -11,6 +11,8 @@ #include <xpu/host.h> // fwd declarations +class CbmEventTriggers; + namespace fles { class Timeslice; @@ -133,7 +135,7 @@ namespace cbm::algo void Init(const Options&); RecoResults Run(const fles::Timeslice&); - bool ReconstructEvent(const DigiEvent& event); + CbmEventTriggers ReconstructEvent(const DigiEvent& event); void Finalize(); void PrintTimings(xpu::timings&); diff --git a/algo/kfp/KfpV0FinderChain.cxx b/algo/kfp/KfpV0FinderChain.cxx index e23bc9e812d3bfd6357e011032e448830fd23c4d..96dc60a593ee94df51cfde7a736e4f1c15c541a8 100644 --- a/algo/kfp/KfpV0FinderChain.cxx +++ b/algo/kfp/KfpV0FinderChain.cxx @@ -27,7 +27,21 @@ V0FinderChain::V0FinderChain(const std::unique_ptr<qa::Manager>& qaManager) // --------------------------------------------------------------------------------------------------------------------- // -void V0FinderChain::Finalize() { L_(info) << fMonitorRun.ToString(); } +void V0FinderChain::Finalize() +{ + GetMonitor(); // A hack to update the run monitor + L_(info) << fMonitorRun.ToString(); +} + +// --------------------------------------------------------------------------------------------------------------------- +// +cbm::algo::kfp::V0FinderMonitorData_t V0FinderChain::GetMonitor() +{ + cbm::algo::kfp::V0FinderMonitorData_t monitorData = fMonitorTimeslice; + fMonitorTimeslice.Reset(); + fMonitorRun.AddMonitorData(monitorData); + return monitorData; +} // --------------------------------------------------------------------------------------------------------------------- // @@ -76,8 +90,6 @@ try { } const auto& pion{particles[iPion]}; const auto& proton{particles[iProton]}; - L_(info) << "!!!!!!!!!!! > pion: " << pion.minDca; - L_(info) << "!!!!!!!!!!! > proton: " << proton.minDca; // ----- Define a BMON diamond if (fBmonDefinedAddresses.empty()) { @@ -139,12 +151,10 @@ catch (const std::exception& err) { // V0FinderChain::EventOutput V0FinderChain::ProcessEvent(const RecoResults& recoEvent) { - EventOutput res; - res.triggers = fFinder.Process(recoEvent); - res.monitor = fFinder.GetEventMonitor(); + EventOutput res = fFinder.Process(recoEvent); if (fpFinderQa != nullptr) { fpFinderQa->Exec(recoEvent, fFinder); } - fMonitorRun.AddMonitorData(res.monitor); + fMonitorTimeslice.AddMonitorData(fFinder.GetEventMonitor()); return res; } diff --git a/algo/kfp/KfpV0FinderChain.h b/algo/kfp/KfpV0FinderChain.h index 8053c93f79f686f5952542afa68e706a89c90f6d..95f10ebbab5e8c6c6086e8ce00d5a1c3ad4fa2ab 100644 --- a/algo/kfp/KfpV0FinderChain.h +++ b/algo/kfp/KfpV0FinderChain.h @@ -31,12 +31,7 @@ namespace cbm::algo /// \brief A chain for the V0 finder class V0FinderChain : public SubChain { public: - /// \struct EventOutput - /// \brief Output from the event - struct EventOutput { - CbmEventTriggers triggers; ///< Set of triggers - kfp::V0FinderMonitorData_t monitor; ///< Monitor - }; + using EventOutput = CbmEventTriggers; /// \brief Default constructor V0FinderChain() = default; @@ -63,6 +58,9 @@ namespace cbm::algo /// \brief Finalizes the instance (called in the end of the run) void Finalize(); + /// \brief Gets a monitor + kfp::V0FinderMonitorData_t GetMonitor(); + /// \brief Sets BMON diamond addresses array /// \note The addresses must be taken from bmon::Hitfind::GetDiamondAddresses() void SetBmonDefinedAddresses(const PODVector<uint32_t>& addresses) { fBmonDefinedAddresses = addresses; } @@ -76,6 +74,7 @@ namespace cbm::algo private: kfp::V0Finder fFinder; ///< Instance of the V0-finding algorithm kfp::V0FinderMonitor fMonitorRun; ///< Monitor per run + kfp::V0FinderMonitorData_t fMonitorTimeslice; ///< Monitor per timeslice std::unique_ptr<kfp::V0FinderQa> fpFinderQa{nullptr}; ///< QA module PODVector<uint32_t> fBmonDefinedAddresses; ///< Available addresses of BMON }; diff --git a/algo/kfp/KfpV0FinderMonitor.h b/algo/kfp/KfpV0FinderMonitor.h index 5bb4311b66902a148b6d3bb93d7461a1df31a089..d60d5b135478e2e6d379a26b69e8755d9b2bd96b 100644 --- a/algo/kfp/KfpV0FinderMonitor.h +++ b/algo/kfp/KfpV0FinderMonitor.h @@ -92,6 +92,8 @@ namespace cbm::algo::kfp SetTimerName(ETimer::PreselectTracks, "Track preselection"); SetTimerName(ETimer::InitKfp, "KFParticleFinder initialization"); SetTimerName(ETimer::ExecKfp, "KFParticleFinder execution"); + + SetRatioKeys({ECounter::EventsTotal, ECounter::TracksTotal, ECounter::TracksSelected}); } private: diff --git a/core/data/CbmEventTriggers.h b/core/data/CbmEventTriggers.h index 841d86bd4a0bc680469527a9dfa2507c914a3cd6..a2c252df56bab630e79c7e776830b70e0fbbcd99 100644 --- a/core/data/CbmEventTriggers.h +++ b/core/data/CbmEventTriggers.h @@ -16,24 +16,30 @@ #include <Rtypes.h> // for ClassDef #endif +#include <boost/serialization/access.hpp> + /// \class CbmEventTriggers /// \brief Class to store different triggers for a given event class CbmEventTriggers { public: /// \enum ETrigger - /// \brief Defines a trigger address - enum class ETrigger : uint8_t + /// \brief Defines a trigger bitmask + enum class ETrigger : uint32_t { - Lambda = 0b00000001, ///< Lambda-trigger - Ks = 0b00000010 ///< Ks-trigger + Lambda = 0x00000001, ///< Lambda-trigger + Ks = 0x00000002 ///< Ks-trigger }; //using Trigger_t = std::underlying_type_t<ETrigger>; - using Trigger_t = uint8_t; + using Trigger_t = uint32_t; /// \brief Default constructor CbmEventTriggers() = default; + /// \brief A constructor from integer + /// \param bitmap A bitmap of the triggers + explicit CbmEventTriggers(uint32_t bitmap) { fBitmap = bitmap; } + /// \brief Copy constructor CbmEventTriggers(const CbmEventTriggers&) = default; @@ -49,33 +55,47 @@ class CbmEventTriggers { /// \brief Move assignment operator CbmEventTriggers& operator=(CbmEventTriggers&&) = default; + /// \brief Gets a bitmap + /// \return bitmap (integer) + Trigger_t GetBitmap() const { return fBitmap; } + /// \brief Sets a trigger /// \param key Trigger key - void Set(ETrigger key) { fTriggers |= static_cast<Trigger_t>(key); } + void Set(ETrigger key) { fBitmap |= static_cast<Trigger_t>(key); } /// \brief Resets a trigger /// \param key Trigger key - void Reset(ETrigger key) { fTriggers &= ~static_cast<Trigger_t>(key); } + void Reset(ETrigger key) { fBitmap &= ~static_cast<Trigger_t>(key); } + + /// \brief Resets all the triggers + void ResetAll() { fBitmap = 0; } /// \brief Tests a particular single trigger /// \param key Trigger key - bool Test(ETrigger key) const { return static_cast<bool>(fTriggers & static_cast<Trigger_t>(key)); } + bool Test(ETrigger key) const { return static_cast<bool>(fBitmap & static_cast<Trigger_t>(key)); } - /// \brief Tests, if ALL the triggers in the mask are on - /// \param mask Trigger mask - bool TestAll(Trigger_t mask) const { return mask == (fTriggers & mask); } + /// \brief Tests, if ALL the triggers in the bitmask are on + /// \param bitmask Trigger bitmask + bool TestAll(Trigger_t bitmask) const { return bitmask == (fBitmap & bitmask); } - /// \brief Tests, if ANY of the triggers in the mask are on - /// \param mask Trigger mask - bool TestAny(Trigger_t mask) const { return static_cast<bool>(fTriggers | mask); } + /// \brief Tests, if ANY of the triggers in the bitmask are on + /// \param bitmask Trigger bitmask + bool TestAny(Trigger_t bitmask) const { return static_cast<bool>(fBitmap | bitmask); } /// \brief String representation of the class content std::string ToString() const; private: - Trigger_t fTriggers{0}; + Trigger_t fBitmap{0}; ///< bitmap storing the triggers according to ETrigger + + friend class boost::serialization::access; + template<class Archive> + void serialize(Archive& ar, const unsigned int /*version*/) + { + ar& fBitmap; + } #if !defined(NO_ROOT) && !XPU_IS_HIP_CUDA - ClassDefNV(CbmEventTriggers, 1); + ClassDefNV(CbmEventTriggers, 2); #endif }; diff --git a/core/data/global/CbmDigiEvent.h b/core/data/global/CbmDigiEvent.h index 242740e57133ed58695947df108315761048f528..ec90985bbd4561a9c2a9ccfdef496caaa32b7ee7 100644 --- a/core/data/global/CbmDigiEvent.h +++ b/core/data/global/CbmDigiEvent.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2021-22 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt +/* Copyright (C) 2021-25 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt SPDX-License-Identifier: GPL-3.0-only Authors: Volker Friese [committer] */ @@ -6,6 +6,7 @@ #define CBMDIGIEVENT_H 1 #include "CbmDigiData.h" +#include "CbmEventTriggers.h" #include <boost/serialization/access.hpp> @@ -14,29 +15,32 @@ ** @brief Collection of digis from all detector systems within one event ** @author Volker Friese <v.friese@gsi.de> ** @since 7.12.2022 - ** @version 2.0 + ** @version 3.0 **/ class CbmDigiEvent { public: - CbmDigiData fData; ///< Event data - uint64_t fNumber; ///< Event identifier - double fTime; ///< Event trigger time [ns] - - - friend class boost::serialization::access; - /** @brief BOOST serializer**/ - template<class Archive> - void serialize(Archive& ar, const unsigned int /*version*/) - { - ar& fData; - ar& fNumber; - ar& fTime; - } + CbmDigiData fData; ///< Event data + uint64_t fNumber; ///< Event identifier + double fTime; ///< Event trigger time [ns] + CbmEventTriggers fSelectionTriggers; ///< Event selection triggers + + friend class boost::serialization::access; + /** @brief BOOST serializer**/ + template<class Archive> + void serialize(Archive& ar, const unsigned int version) + { + ar& fData; + ar& fNumber; + ar& fTime; + if (version >= 3) { + ar& fSelectionTriggers; + } + } // --- ROOT serializer #ifndef NO_ROOT - ClassDefNV(CbmDigiEvent, 2); + ClassDefNV(CbmDigiEvent, 3); #endif /** @brief Clear content **/ @@ -45,6 +49,7 @@ public: fData.Clear(); fNumber = 0; fTime = 0.; + fSelectionTriggers.ResetAll(); } };