The Gaudi Framework  master (b9786168)
Loading...
Searching...
No Matches
ChronoStatSvc.h
Go to the documentation of this file.
1/***********************************************************************************\
2* (c) Copyright 1998-2024 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// ============================================================================
13// include files
14// ============================================================================
15// STD & STL
16// ============================================================================
17#include <atomic>
18#include <fstream>
19#include <functional>
20#include <map>
21#include <mutex>
22#include <string>
23// ============================================================================
24// GaudiKernel
25// ============================================================================
28#include <GaudiKernel/Kernel.h>
29#include <GaudiKernel/Service.h>
32// ============================================================================
34// ============================================================================
35class ISvcLocator;
36class IMessageSvc;
37// ============================================================================
46class ChronoStatSvc : public extends<Service, IChronoStatSvc, IIncidentListener> {
47public:
48 // ============================================================================
50 using ChronoMap = std::map<IChronoStatSvc::ChronoTag, ChronoEntity>;
51 using StatMap = std::map<IChronoStatSvc::StatTag, StatEntity>;
52 // ============================================================================
53public:
54 // ============================================================================
56 StatusCode initialize() override;
58 StatusCode finalize() override;
59 // ============================================================================
60public:
61 // ============================================================================
65 ChronoEntity* chronoStart( const IChronoStatSvc::ChronoTag& chronoTag ) override;
66 // ============================================================================
70 const ChronoEntity* chronoStop( const IChronoStatSvc::ChronoTag& chronoTag ) override;
71 // ============================================================================
75 IChronoStatSvc::ChronoTime chronoDelta( const IChronoStatSvc::ChronoTag& chronoTag,
76 IChronoStatSvc::ChronoType theType ) override;
77 // ============================================================================
81 void chronoPrint( const IChronoStatSvc::ChronoTag& chronoTag ) override;
82 // ============================================================================
86 ChronoStatus chronoStatus( const IChronoStatSvc::ChronoTag& chronoTag ) override;
87 // ============================================================================
92 void stat( const IChronoStatSvc::StatTag& statTag, const IChronoStatSvc::StatFlag& statFlag ) override;
93 // ============================================================================
98 void statPrint( const IChronoStatSvc::ChronoTag& statTag ) override;
99 // ============================================================================
105 const ChronoEntity* chrono( const IChronoStatSvc::ChronoTag& t ) const override;
106 // ============================================================================
112 StatEntity* stat( const IChronoStatSvc::StatTag& t ) override;
113 // ============================================================================
118 ChronoStatSvc( const std::string& name, ISvcLocator* svcloc ) : base_class( name, svcloc ) {}
119
121 void merge( const ChronoStatSvc& css );
122 // ============================================================================
123
124public:
125 void handle( const Incident& incident ) override;
126
127protected:
128 // ============================================================================
129 // print the "Stat" part of the ChronoStatSvc
130 void printStats();
131 // ============================================================================
132private:
133 // ============================================================================
134 // default/copy constructor and assignment are disabled
135 ChronoStatSvc() = delete;
136 ChronoStatSvc( const ChronoStatSvc& ) = delete;
138 // ============================================================================
140 void saveStats();
141 // ============================================================================
142public:
143 // ============================================================================
144 // Standard Destructor
145 ~ChronoStatSvc() override = default;
146 // ============================================================================
147private:
148 bool isMT() const;
149
150 ChronoEntity& getEntity( const ChronoTag& chronoTag ) {
151 auto lock = std::scoped_lock{ m_mutex };
152 return m_chronoEntities[chronoTag];
153 }
154
155 // basically limit the integer to MSG::Level range
156 static MSG::Level int2level( int l ) {
157 return static_cast<MSG::Level>(
158 std::max( std::min( l, static_cast<int>( MSG::FATAL ) ), static_cast<int>( MSG::NIL ) ) );
159 }
160 // ============================================================================
164 mutable std::mutex m_mutex;
165
168
173
174 Gaudi::Property<bool> m_chronoTableFlag{ this, "ChronoPrintOutTable", true,
175 "decide if the final printout should be performed" };
176 Gaudi::Property<bool> m_chronoCoutFlag{ this, "ChronoDestinationCout", false,
177 "define the destination of the table to be printed" };
179 this, "ChronoPrintLevel", MSG::INFO, [this]( auto& ) { m_chronoPrintLevel = int2level( m_intChronoPrintLevel ); },
180 "print level" };
181 Gaudi::Property<bool> m_chronoOrderFlag{ this, "ChronoTableToBeOrdered", true, "should the printout be ordered" };
182 Gaudi::Property<bool> m_printUserTime{ this, "PrintUserTime", true };
183 Gaudi::Property<bool> m_printSystemTime{ this, "PrintSystemTime", false };
184 Gaudi::Property<bool> m_printEllapsedTime{ this, "PrintEllapsedTime", false };
185 Gaudi::Property<bool> m_statTableFlag{ this, "StatPrintOutTable", true,
186 "decide if the final printout should be performed" };
187 Gaudi::Property<bool> m_statCoutFlag{ this, "StatDestinationCout", false,
188 "define the destination of the table to be printed" };
190 [this]( auto& ) { m_statPrintLevel = int2level( m_intStatPrintLevel ); },
191 "print level" };
192 Gaudi::Property<bool> m_statOrderFlag{ this, "StatTableToBeOrdered", true, "should the printout be ordered" };
193
195 this, "AsciiStatsOutputFile", "",
196 "Name of the output file storing the stats. If empty, no statistics will be saved (default)" };
197
199 this, "StatTableHeader",
200 " | Counter | # | sum | mean/eff^* | rms/err^* | min | max |",
201 "The header row for the output Stat-table" };
202 Gaudi::Property<bool> m_useEffFormat{ this, "UseEfficiencyRowFormat", true,
203 "Use the special format for printout of efficiency counters" };
204
205 Gaudi::Property<std::string> m_perEventFile{ this, "PerEventFile", "", "File name for per-event deltas" };
206
207 ServiceHandle<IInterface> m_hiveWhiteBoardSvc{ this, "HiveWhiteBoardSvc", "EventDataSvc" };
208
209 using TimeMap = std::map<ChronoTag, std::vector<IChronoSvc::ChronoTime>>;
211 std::ofstream m_ofd;
212
213 // ============================================================================
214};
215// ============================================================================
216// The END
217// ============================================================================
a small helper class for implementation of ChronoStatSvc service, It also could be used as some local...
The Chrono & Stat Sservice: service implements the IChronoStatSvc interface and provides the basic ch...
ChronoStatus chronoStatus(const IChronoStatSvc::ChronoTag &chronoTag) override
Implementation of IChronoStatSvc::chronoStatus.
Gaudi::Property< bool > m_statCoutFlag
Gaudi::Property< int > m_intStatPrintLevel
Gaudi::Property< std::string > m_statsOutFileName
Gaudi::Property< std::string > m_header
ServiceHandle< IInterface > m_hiveWhiteBoardSvc
ChronoStatSvc(const ChronoStatSvc &)=delete
StatusCode initialize() override
Implementation of IService::initialize()
~ChronoStatSvc() override=default
ChronoEntity * chronoStart(const IChronoStatSvc::ChronoTag &chronoTag) override
Implementation of IChronoStatSvc::chronoStart.
std::map< ChronoTag, std::vector< IChronoSvc::ChronoTime > > TimeMap
IChronoStatSvc::ChronoTime chronoDelta(const IChronoStatSvc::ChronoTag &chronoTag, IChronoStatSvc::ChronoType theType) override
Implementation of IchronoStatSvc::chronoDelta.
bool isMT() const
void saveStats()
dump the statistics into an ASCII file for offline processing
StatusCode finalize() override
Implementation of IService::finalize()
StatMap m_statEntities
stat part
const ChronoEntity * chrono(const IChronoStatSvc::ChronoTag &t) const override
extract the chrono entity for the given tag (name)
Gaudi::Property< bool > m_statTableFlag
Gaudi::Property< bool > m_chronoOrderFlag
std::mutex m_mutex
Mutex protecting m_chronoEntities.
Gaudi::Property< bool > m_chronoTableFlag
Gaudi::Property< bool > m_chronoCoutFlag
TimeMap m_perEvtTime
ChronoStatSvc & operator=(const ChronoStatSvc &)=delete
void stat(const IChronoStatSvc::StatTag &statTag, const IChronoStatSvc::StatFlag &statFlag) override
Implementation of IChronoStatSvc::stat add statistical information to the entity ,...
ChronoMap m_chronoEntities
chrono part
Gaudi::Property< bool > m_printUserTime
ChronoEntity & getEntity(const ChronoTag &chronoTag)
std::ofstream m_ofd
MSG::Level m_chronoPrintLevel
level of info printing
const ChronoEntity * chronoStop(const IChronoStatSvc::ChronoTag &chronoTag) override
Implementation of IChronoStatSvc::chronoStop.
static MSG::Level int2level(int l)
Gaudi::Property< bool > m_useEffFormat
MSG::Level m_statPrintLevel
level of info printing
void handle(const Incident &incident) override
Gaudi::Property< int > m_intChronoPrintLevel
ChronoStatSvc()=delete
ChronoStatSvc(const std::string &name, ISvcLocator *svcloc)
Default constructor.
void chronoPrint(const IChronoStatSvc::ChronoTag &chronoTag) override
Implementation of IChronoStatSvc::chronoPrint.
Gaudi::Property< std::string > m_perEventFile
void statPrint(const IChronoStatSvc::ChronoTag &statTag) override
prints (using message service) info about statistical entity, tagged by its name
std::map< IChronoStatSvc::StatTag, StatEntity > StatMap
Gaudi::Property< bool > m_printSystemTime
void merge(const ChronoStatSvc &css)
Compound assignment operator.
Gaudi::Property< bool > m_statOrderFlag
std::map< IChronoStatSvc::ChronoTag, ChronoEntity > ChronoMap
some useful typedefs
Gaudi::Property< bool > m_printEllapsedTime
Implementation of property with value of concrete type.
Definition PropertyFwd.h:27
The IMessage is the interface implemented by the message service.
Definition IMessageSvc.h:34
The ISvcLocator is the interface implemented by the Service Factory in the Application Manager to loc...
Definition ISvcLocator.h:42
Base class for all Incidents (computing events).
Definition Incident.h:24
Handle to be used in lieu of naked pointers to services.
const std::string & name() const override
Retrieve name of the service.
Definition Service.cpp:333
backward compatible StatEntity class.
Definition StatEntity.h:23
This class is used for returning status codes from appropriate routines.
Definition StatusCode.h:64
Base class used to extend a class implementing other interfaces.
Definition extends.h:19
@ NIL
Definition IMessageSvc.h:22
@ FATAL
Definition IMessageSvc.h:22
@ INFO
Definition IMessageSvc.h:22