Loading [MathJax]/extensions/tex2jax.js
The Gaudi Framework  v31r0 (aeb156f0)
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
ChronoStatSvc.h
Go to the documentation of this file.
1 #ifndef GAUDISVC_CHRONOSTATSVC_H__
2 #define GAUDISVC_CHRONOSTATSVC_H__
3 // ============================================================================
4 // include files
5 // ============================================================================
6 // STD & STL
7 // ============================================================================
8 #include <atomic>
9 #include <fstream>
10 #include <functional>
11 #include <map>
12 #include <mutex>
13 #include <string>
14 // ============================================================================
15 // GaudiKernel
16 // ============================================================================
19 #include "GaudiKernel/Kernel.h"
20 #include "GaudiKernel/Service.h"
23 // ============================================================================
25 // ============================================================================
26 class ISvcLocator;
27 class IMessageSvc;
28 // ============================================================================
37 class ChronoStatSvc : public extends<Service, IChronoStatSvc, IIncidentListener> {
38 public:
39  // ============================================================================
43  // ============================================================================
44 public:
45  // ============================================================================
47  StatusCode initialize() override;
49  StatusCode finalize() override;
50  // ============================================================================
51 public:
52  // ============================================================================
56  ChronoEntity* chronoStart( const IChronoStatSvc::ChronoTag& chronoTag ) override;
57  // ============================================================================
61  const ChronoEntity* chronoStop( const IChronoStatSvc::ChronoTag& chronoTag ) override;
62  // ============================================================================
66  IChronoStatSvc::ChronoTime chronoDelta( const IChronoStatSvc::ChronoTag& chronoTag,
67  IChronoStatSvc::ChronoType theType ) override;
68  // ============================================================================
72  void chronoPrint( const IChronoStatSvc::ChronoTag& chronoTag ) override;
73  // ============================================================================
77  ChronoStatus chronoStatus( const IChronoStatSvc::ChronoTag& chronoTag ) override;
78  // ============================================================================
83  void stat( const IChronoStatSvc::StatTag& statTag, const IChronoStatSvc::StatFlag& statFlag ) override;
84  // ============================================================================
89  void statPrint( const IChronoStatSvc::ChronoTag& statTag ) override;
90  // ============================================================================
96  const ChronoEntity* chrono( const IChronoStatSvc::ChronoTag& t ) const override;
97  // ============================================================================
103  StatEntity* stat( const IChronoStatSvc::StatTag& t ) override;
104  // ============================================================================
109  ChronoStatSvc( const std::string& name, ISvcLocator* svcloc ) : base_class( name, svcloc ) {}
110 
112  void merge( const ChronoStatSvc& css );
113  // ============================================================================
114 
115 public:
116  void handle( const Incident& incident ) override;
117 
118 protected:
119  // ============================================================================
120  // print the "Stat" part of the ChronoStatSvc
121  void printStats();
122  // ============================================================================
123 private:
124  // ============================================================================
125  // default/copy constructor and assignment are disabled
126  ChronoStatSvc() = delete;
127  ChronoStatSvc( const ChronoStatSvc& ) = delete;
128  ChronoStatSvc& operator=( const ChronoStatSvc& ) = delete;
129  // ============================================================================
131  void saveStats();
132  // ============================================================================
133 private:
134  bool isMT() const;
135 
136  ChronoEntity& getEntity( const ChronoTag& chronoTag ) {
137  lock_t lock( m_mutex );
138  return m_chronoEntities[chronoTag];
139  }
140 
141  // basically limit the integer to MSG::Level range
142  static MSG::Level int2level( int l ) {
143  return static_cast<MSG::Level>(
144  std::max( std::min( l, static_cast<int>( MSG::FATAL ) ), static_cast<int>( MSG::NIL ) ) );
145  };
146  // ============================================================================
148  ChronoMap m_chronoEntities;
152 
155 
157  StatMap m_statEntities;
160 
161  Gaudi::Property<bool> m_chronoTableFlag{this, "ChronoPrintOutTable", true,
162  "decide if the final printout should be performed"};
163  Gaudi::Property<bool> m_chronoCoutFlag{this, "ChronoDestinationCout", false,
164  "define the destination of the table to be printed"};
166  this, "ChronoPrintLevel", MSG::INFO, [this]( auto& ) { m_chronoPrintLevel = int2level( m_intChronoPrintLevel ); },
167  "print level"};
168  Gaudi::Property<bool> m_chronoOrderFlag{this, "ChronoTableToBeOrdered", true, "should the printout be ordered"};
169  Gaudi::Property<bool> m_printUserTime{this, "PrintUserTime", true};
170  Gaudi::Property<bool> m_printSystemTime{this, "PrintSystemTime", false};
171  Gaudi::Property<bool> m_printEllapsedTime{this, "PrintEllapsedTime", false};
172  Gaudi::Property<bool> m_statTableFlag{this, "StatPrintOutTable", true,
173  "decide if the final printout should be performed"};
174  Gaudi::Property<bool> m_statCoutFlag{this, "StatDestinationCout", false,
175  "define the destination of the table to be printed"};
177  [this]( auto& ) { m_statPrintLevel = int2level( m_intStatPrintLevel ); },
178  "print level"};
179  Gaudi::Property<bool> m_statOrderFlag{this, "StatTableToBeOrdered", true, "should the printout be ordered"};
180 
182  this, "AsciiStatsOutputFile", "",
183  "Name of the output file storing the stats. If empty, no statistics will be saved (default)"};
184 
186  this, "StatTableHeader",
187  " | Counter | # | sum | mean/eff^* | rms/err^* | min | max |",
188  "The header row for the output Stat-table"};
189  Gaudi::Property<bool> m_useEffFormat{this, "UseEfficiencyRowFormat", true,
190  "Use the special format for printout of efficiency counters"};
191 
192  Gaudi::Property<std::string> m_perEventFile{this, "PerEventFile", "", "File name for per-event deltas"};
193 
194  ServiceHandle<IInterface> m_hiveWhiteBoardSvc{this, "HiveWhiteBoardSvc", "EventDataSvc"};
195 
197  TimeMap m_perEvtTime;
199 
200  // ============================================================================
201 };
202 // ============================================================================
203 // The END
204 // ============================================================================
205 #endif // GAUDISVC_CHRONOSTATSVC_H
Gaudi::Property< int > m_intStatPrintLevel
ChronoStatSvc & operator=(const ChronoStatSvc &)=delete
ChronoEntity & getEntity(const ChronoTag &chronoTag)
The ISvcLocator is the interface implemented by the Service Factory in the Application Manager to loc...
Definition: ISvcLocator.h:25
const std::string & name() const override
Retrieve name of the service.
Definition: Service.cpp:274
ChronoStatus chronoStatus(const IChronoStatSvc::ChronoTag &chronoTag) override
Implementation of IChronoStatSvc::chronoStatus.
Gaudi::Property< std::string > m_header
Implementation of property with value of concrete type.
Definition: Property.h:352
StatMap m_statEntities
stat part
a small helper class for implementation of ChronoStatSvc service, It also could be used as some local...
Definition: ChronoEntity.h:21
Gaudi::Property< bool > m_statCoutFlag
IChronoStatSvc::ChronoTime chronoDelta(const IChronoStatSvc::ChronoTag &chronoTag, IChronoStatSvc::ChronoType theType) override
Implementation of IchronoStatSvc::chronoDelta.
Gaudi::Property< bool > m_chronoOrderFlag
Gaudi::Property< bool > m_printUserTime
std::mutex m_mutex
Mutex protecting m_chronoEntities.
void stat(const IChronoStatSvc::StatTag &statTag, const IChronoStatSvc::StatFlag &statFlag) override
Implementation of IChronoStatSvc::stat add statistical information to the entity , tagged by its name.
std::map< IChronoStatSvc::ChronoTag, ChronoEntity > ChronoMap
some useful typedefs
Definition: ChronoStatSvc.h:41
void statPrint(const IChronoStatSvc::ChronoTag &statTag) override
prints (using message service) info about statistical entity, tagged by its name
STL class.
T min(T...args)
const ChronoEntity * chrono(const IChronoStatSvc::ChronoTag &t) const override
extract the chrono entity for the given tag (name)
STL class.
void merge(const ChronoStatSvc &css)
Compound assignment operator.
std::map< ChronoTag, std::vector< IChronoSvc::ChronoTime > > TimeMap
ChronoStatSvc()=delete
bool isMT() const
Gaudi::Property< bool > m_useEffFormat
void saveStats()
dump the statistics into an ASCII file for offline processing
Gaudi::Property< int > m_intChronoPrintLevel
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:50
TimeMap m_perEvtTime
static MSG::Level int2level(int l)
The IMessage is the interface implemented by the message service.
Definition: IMessageSvc.h:37
const ChronoEntity * chronoStop(const IChronoStatSvc::ChronoTag &chronoTag) override
Implementation of IChronoStatSvc::chronoStop.
Gaudi::Property< bool > m_statOrderFlag
Gaudi::Property< bool > m_chronoTableFlag
ServiceHandle< IInterface > m_hiveWhiteBoardSvc
std::ofstream m_ofd
T max(T...args)
MSG::Level m_chronoPrintLevel
level of info printing
StatusCode initialize() override
Implementation of IService::initialize()
dictionary l
Definition: gaudirun.py:517
Gaudi::Property< bool > m_printEllapsedTime
Base class used to extend a class implementing other interfaces.
Definition: extends.h:10
void handle(const Incident &incident) override
Gaudi::Property< bool > m_statTableFlag
Base class for all Incidents (computing events).
Definition: Incident.h:17
ChronoEntity * chronoStart(const IChronoStatSvc::ChronoTag &chronoTag) override
Implementation of IChronoStatSvc::chronoStart.
std::lock_guard< std::mutex > lock_t
Gaudi::Property< std::string > m_statsOutFileName
MSG::Level m_statPrintLevel
level of info printing
Gaudi::Property< bool > m_chronoCoutFlag
ChronoStatSvc(const std::string &name, ISvcLocator *svcloc)
Default constructor.
backward compatible StatEntity class.
Definition: Counters.h:837
void chronoPrint(const IChronoStatSvc::ChronoTag &chronoTag) override
Implementation of IChronoStatSvc::chronoPrint.
std::map< IChronoStatSvc::StatTag, StatEntity > StatMap
Definition: ChronoStatSvc.h:42
The Chrono & Stat Sservice: service implements the IChronoStatSvc interface and provides the basic ch...
Definition: ChronoStatSvc.h:37
ChronoMap m_chronoEntities
chrono part
Gaudi::Property< bool > m_printSystemTime
StatusCode finalize() override
Implementation of IService::finalize()
Gaudi::Property< std::string > m_perEventFile