The Gaudi Framework  master (181af51f)
Loading...
Searching...
No Matches
AlgExecStateSvc.h
Go to the documentation of this file.
1/***********************************************************************************\
2* (c) Copyright 1998-2025 CERN for the benefit of the LHCb and ATLAS collaborations *
3* *
4* This software is distributed under the terms of the Apache version 2 licence, *
5* copied verbatim in the file "LICENSE". *
6* *
7* In applying this licence, CERN does not waive the privileges and immunities *
8* granted to it by virtue of its status as an Intergovernmental Organization *
9* or submit itself to any jurisdiction. *
10\***********************************************************************************/
11#pragma once
12
15#include <GaudiKernel/Service.h>
16
17#include <fmt/format.h>
18
19#include <mutex>
20#include <unordered_map>
21#include <vector>
22
27class AlgExecStateSvc : public extends<Service, IAlgExecStateSvc> {
28
33 public:
34 bool filterPassed() const { return m_filterPassed; }
35 void setFilterPassed( bool f = true ) { m_filterPassed = f; }
39 m_state = s;
40 m_execStatus = sc;
41 }
42 const StatusCode& execStatus() const { return m_execStatus; }
44 void reset() { *this = AlgExecStateInternal{}; }
45
46 friend std::ostream& operator<<( std::ostream& ost, const AlgExecStateInternal& s ) {
47 ost << "e: ";
48 switch ( s.state() ) {
49 case AlgExecStateRef::State::None:
50 return ost << "n";
51 case AlgExecStateRef::State::Executing:
52 return ost << "e";
53 default:
54 return ost << "d f: " << s.filterPassed() << " sc: " << s.execStatus();
55 }
56 }
57
58 private:
59 bool m_filterPassed{ true };
60 AlgExecStateRef::State m_state{ AlgExecStateRef::State::None };
62 };
63
64 using AlgStates = std::vector<AlgExecStateInternal>;
65 using AlgStatesWithSubSlot = std::unordered_map<AlgExecStateRef::AlgKey, AlgExecStateInternal>;
66
67public:
68 using extends::extends;
69
70 AlgExecStateRef algExecState( const IAlgorithm* iAlg, const EventContext& ctx ) override {
71 return { *this, ctx, algKey( iAlg->name() ) };
72 }
73 AlgExecStateRef algExecState( const std::string& algName, const EventContext& ctx ) override {
74 return { *this, ctx, algKey( algName ) };
75 }
76 AlgExecStateRefConst algExecState( const IAlgorithm* iAlg, const EventContext& ctx ) const override {
77 return { *this, ctx, algKey( iAlg->name() ) };
78 }
79 AlgExecStateRefConst algExecState( const std::string& algName, const EventContext& ctx ) const override {
80 return { *this, ctx, algKey( algName ) };
81 }
82 void reset( const EventContext& ctx ) override;
83
86
87 const EventStatus::Status& eventStatus( const EventContext& ctx ) const override;
88 void setEventStatus( const EventStatus::Status& sc, const EventContext& ctx ) override;
89 void updateEventStatus( const bool& b, const EventContext& ctx ) override;
90
91 unsigned int algErrorCount( const IAlgorithm* iAlg ) const override;
92 void resetErrorCount() override;
93 void resetErrorCount( const IAlgorithm* iAlg ) override;
94 unsigned int incrementErrorCount( const IAlgorithm* iAlg ) override;
95
96 void dump( std::ostream& ost, const EventContext& ctx ) const override;
97 void dump( std::ostream&, const EventContext&, AlgExecStateRef::AlgKey ) const override;
98
99private:
100 bool filterPassed( const EventContext&, AlgExecStateRef::AlgKey ) const override;
101 void setFilterPassed( const EventContext&, AlgExecStateRef::AlgKey, bool ) override;
105 const StatusCode& execStatus( const EventContext&, AlgExecStateRef::AlgKey ) const override;
106 void setExecStatus( const EventContext&, AlgExecStateRef::AlgKey, const StatusCode& ) override;
107 const std::string& algName( AlgExecStateRef::AlgKey ) const override;
108
109 AlgExecStateInternal& getInternalState( const EventContext& ctx, AlgExecStateRef::AlgKey k );
110 AlgExecStateInternal const& getInternalState( const EventContext& ctx, AlgExecStateRef::AlgKey k ) const;
111 AlgExecStateRef::AlgKey algKey( const std::string& algName ) const { return m_algNameToIndex.at( algName ); }
112
113 // one vector entry per event slot
114 std::vector<AlgStates> m_algStates;
115 // one map entry per event slot and subslot, with AlgKey as a key, for sparse storage
116 std::vector<std::vector<AlgStatesWithSubSlot>> m_algSubSlotStates;
117 // algorithm name to slot (with heterogeneous lookup), needed to regognize double addition
118 std::unordered_map<Gaudi::StringKey, AlgExecStateRef::AlgKey, Gaudi::StringKeyHash, std::equal_to<>> m_algNameToIndex;
119
120 std::vector<EventStatus::Status> m_eventStatus;
121 std::vector<Gaudi::StringKey> m_preInitAlgs;
122 // keep the names of the algorithms by AlgKey for logging purposes
123 std::vector<std::string> m_algNames;
124
125 // Cannot be a vector as atomics are not copy/move constructible
126 std::unordered_map<AlgExecStateRef::AlgKey, std::atomic<unsigned int>> m_errorCount;
127
128 void init();
129 void checkInit() const;
130 std::once_flag m_initFlag;
131 bool m_isInit{ false };
132
133 mutable std::mutex m_mut;
134};
wrapper on an Algorithm state, const version.
wrapper on an Algorithm state.
AlgExecState::State State
internal state of an algorithm
void setState(AlgExecStateRef::State s)
const StatusCode & execStatus() const
AlgExecStateRef::State state() const
void setState(AlgExecStateRef::State s, const StatusCode &sc)
friend std::ostream & operator<<(std::ostream &ost, const AlgExecStateInternal &s)
void setExecStatus(const StatusCode &sc=StatusCode::SUCCESS)
A service that keeps track of the execution state of Algorithm.
void reset(const EventContext &ctx) override
void dump(std::ostream &ost, const EventContext &ctx) const override
std::vector< std::string > m_algNames
std::vector< EventStatus::Status > m_eventStatus
AlgExecStateRef::AlgKey addAlg(const Gaudi::StringKey &) override
unsigned int incrementErrorCount(const IAlgorithm *iAlg) override
AlgExecStateRef algExecState(const IAlgorithm *iAlg, const EventContext &ctx) override
AlgExecStateRefConst algExecState(const IAlgorithm *iAlg, const EventContext &ctx) const override
void setFilterPassed(const EventContext &, AlgExecStateRef::AlgKey, bool) override
void updateEventStatus(const bool &b, const EventContext &ctx) override
AlgExecStateInternal & getInternalState(const EventContext &ctx, AlgExecStateRef::AlgKey k)
AlgExecStateRefConst algExecState(const std::string &algName, const EventContext &ctx) const override
const StatusCode & execStatus(const EventContext &, AlgExecStateRef::AlgKey) const override
void setState(const EventContext &, AlgExecStateRef::AlgKey, AlgExecStateRef::State) override
std::unordered_map< AlgExecStateRef::AlgKey, std::atomic< unsigned int > > m_errorCount
unsigned int algErrorCount(const IAlgorithm *iAlg) const override
std::vector< std::vector< AlgStatesWithSubSlot > > m_algSubSlotStates
void checkInit() const
void setEventStatus(const EventStatus::Status &sc, const EventContext &ctx) override
AlgExecStateRef algExecState(const std::string &algName, const EventContext &ctx) override
const EventStatus::Status & eventStatus(const EventContext &ctx) const override
std::vector< Gaudi::StringKey > m_preInitAlgs
std::unordered_map< AlgExecStateRef::AlgKey, AlgExecStateInternal > AlgStatesWithSubSlot
bool filterPassed(const EventContext &, AlgExecStateRef::AlgKey) const override
std::once_flag m_initFlag
std::vector< AlgStates > m_algStates
std::unordered_map< Gaudi::StringKey, AlgExecStateRef::AlgKey, Gaudi::StringKeyHash, std::equal_to<> > m_algNameToIndex
const std::string & algName(AlgExecStateRef::AlgKey) const override
AlgExecStateRef::AlgKey algKey(const std::string &algName) const
void setExecStatus(const EventContext &, AlgExecStateRef::AlgKey, const StatusCode &) override
AlgExecStateRef::State state(const EventContext &, AlgExecStateRef::AlgKey) const override
void resetErrorCount() override
std::vector< AlgExecStateInternal > AlgStates
This class represents an entry point to all the event specific data.
Helper class for efficient "key" access for strings.
Definition StringKey.h:66
virtual AlgExecStateRef::AlgKey addAlg(const Gaudi::StringKey &algName)=0
adds a new algorithm to the service
The IAlgorithm is the interface implemented by the Algorithm base class.
Definition IAlgorithm.h:36
This class is used for returning status codes from appropriate routines.
Definition StatusCode.h:64
constexpr static const auto SUCCESS
Definition StatusCode.h:99
constexpr static const auto FAILURE
Definition StatusCode.h:100
Base class used to extend a class implementing other interfaces.
Definition extends.h:19