The Gaudi Framework  v30r4 (9b837755)
ChronoStatSvc Class Reference

The Chrono & Stat Sservice: service implements the IChronoStatSvc interface and provides the basic chronometry and some statistical counts needed by all applications. More...

#include <src/ChronoStatSvc.h>

Inheritance diagram for ChronoStatSvc:
Collaboration diagram for ChronoStatSvc:

Public Types

typedef std::map< IChronoStatSvc::ChronoTag, ChronoEntityChronoMap
 some useful typedefs More...
 
typedef std::map< IChronoStatSvc::StatTag, StatEntityStatMap
 
- Public Types inherited from extends< Service, IChronoStatSvc, IIncidentListener >
using base_class = extends
 Typedef to this class. More...
 
using extend_interfaces_base = extend_interfaces< Interfaces... >
 Typedef to the base of this class. More...
 
- Public Types inherited from Service
using Factory = Gaudi::PluginService::Factory< IService *(const std::string &, ISvcLocator *)>
 
- Public Types inherited from PropertyHolder< CommonMessaging< implements< IService, IProperty, IStateful > > >
using PropertyHolderImpl = PropertyHolder< CommonMessaging< implements< IService, IProperty, IStateful > > >
 Typedef used to refer to this class from derived classes, as in. More...
 
- Public Types inherited from CommonMessaging< implements< IService, IProperty, IStateful > >
using base_class = CommonMessaging
 
- Public Types inherited from extend_interfaces< Interfaces... >
using ext_iids = typename Gaudi::interface_list_cat< typename Interfaces::ext_iids... >::type
 take union of the ext_iids of all Interfaces... More...
 

Public Member Functions

StatusCode initialize () override
 Implementation of IService::initialize() More...
 
StatusCode finalize () override
 Implementation of IService::finalize() More...
 
ChronoEntitychronoStart (const IChronoStatSvc::ChronoTag &chronoTag) override
 Implementation of IChronoStatSvc::chronoStart. More...
 
const ChronoEntitychronoStop (const IChronoStatSvc::ChronoTag &chronoTag) override
 Implementation of IChronoStatSvc::chronoStop. More...
 
IChronoStatSvc::ChronoTime chronoDelta (const IChronoStatSvc::ChronoTag &chronoTag, IChronoStatSvc::ChronoType theType) override
 Implementation of IchronoStatSvc::chronoDelta. More...
 
void chronoPrint (const IChronoStatSvc::ChronoTag &chronoTag) override
 Implementation of IChronoStatSvc::chronoPrint. More...
 
ChronoStatus chronoStatus (const IChronoStatSvc::ChronoTag &chronoTag) override
 Implementation of IChronoStatSvc::chronoStatus. More...
 
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. More...
 
void statPrint (const IChronoStatSvc::ChronoTag &statTag) override
 prints (using message service) info about statistical entity, tagged by its name More...
 
const ChronoEntitychrono (const IChronoStatSvc::ChronoTag &t) const override
 extract the chrono entity for the given tag (name) More...
 
StatEntitystat (const IChronoStatSvc::StatTag &t) override
 extract the stat entity for the given tag (name) More...
 
void merge (const ChronoStatSvc &css)
 Compound assignment operator. More...
 
void handle (const Incident &incident) override
 
- Public Member Functions inherited from extends< Service, IChronoStatSvc, IIncidentListener >
void * i_cast (const InterfaceID &tid) const override
 Implementation of IInterface::i_cast. More...
 
StatusCode queryInterface (const InterfaceID &ti, void **pp) override
 Implementation of IInterface::queryInterface. More...
 
std::vector< std::stringgetInterfaceNames () const override
 Implementation of IInterface::getInterfaceNames. More...
 
- Public Member Functions inherited from Service
const std::stringname () const override
 Retrieve name of the service. More...
 
StatusCode configure () override
 
StatusCode initialize () override
 
StatusCode start () override
 
StatusCode stop () override
 
StatusCode finalize () override
 
StatusCode terminate () override
 
Gaudi::StateMachine::State FSMState () const override
 
Gaudi::StateMachine::State targetFSMState () const override
 
StatusCode reinitialize () override
 
StatusCode restart () override
 
StatusCode sysInitialize () override
 Initialize Service. More...
 
StatusCode sysStart () override
 Initialize Service. More...
 
StatusCode sysStop () override
 Initialize Service. More...
 
StatusCode sysFinalize () override
 Finalize Service. More...
 
StatusCode sysReinitialize () override
 Re-initialize the Service. More...
 
StatusCode sysRestart () override
 Re-initialize the Service. More...
 
 Service (std::string name, ISvcLocator *svcloc)
 Standard Constructor. More...
 
SmartIF< ISvcLocator > & serviceLocator () const override
 Retrieve pointer to service locator. More...
 
StatusCode setProperties ()
 Method for setting declared properties to the values specified for the job. More...
 
template<class T >
StatusCode service (const std::string &name, const T *&psvc, bool createIf=true) const
 Access a service by name, creating it if it doesn't already exist. More...
 
template<class T >
StatusCode service (const std::string &name, T *&psvc, bool createIf=true) const
 
template<typename IFace = IService>
SmartIF< IFace > service (const std::string &name, bool createIf=true) const
 
template<class T >
StatusCode service (const std::string &svcType, const std::string &svcName, T *&psvc) const
 Access a service by name and type, creating it if it doesn't already exist. More...
 
template<class T >
StatusCode declareTool (ToolHandle< T > &handle, std::string toolTypeAndName, bool createIf=true)
 Declare used tool. More...
 
SmartIF< IAuditorSvc > & auditorSvc () const
 The standard auditor service.May not be invoked before sysInitialize() has been invoked. More...
 
- Public Member Functions inherited from PropertyHolder< CommonMessaging< implements< IService, IProperty, IStateful > > >
 PropertyHolder ()=default
 
Gaudi::Details::PropertyBasedeclareProperty (Gaudi::Details::PropertyBase &prop)
 Declare a property. More...
 
Gaudi::Details::PropertyBasedeclareProperty (const std::string &name, TYPE &value, const std::string &doc="none")
 Helper to wrap a regular data member and use it as a regular property. More...
 
Gaudi::Details::PropertyBasedeclareProperty (const std::string &name, Gaudi::Property< TYPE, VERIFIER, HANDLERS > &prop, const std::string &doc="none")
 Declare a PropertyBase instance setting name and documentation. More...
 
Gaudi::Details::PropertyBasedeclareRemoteProperty (const std::string &name, IProperty *rsvc, const std::string &rname="")
 Declare a remote property. More...
 
StatusCode setProperty (const Gaudi::Details::PropertyBase &p) override
 set the property form another property More...
 
StatusCode setProperty (const std::string &s) override
 set the property from the formatted string More...
 
StatusCode setProperty (const std::string &n, const std::string &v) override
 set the property from name and the value More...
 
StatusCode setProperty (const std::string &name, const TYPE &value)
 set the property form the value More...
 
StatusCode getProperty (Gaudi::Details::PropertyBase *p) const override
 get the property More...
 
const Gaudi::Details::PropertyBasegetProperty (const std::string &name) const override
 get the property by name More...
 
StatusCode getProperty (const std::string &n, std::string &v) const override
 convert the property to the string More...
 
const std::vector< Gaudi::Details::PropertyBase * > & getProperties () const override
 get all properties More...
 
bool hasProperty (const std::string &name) const override
 Return true if we have a property with the given name. More...
 
 PropertyHolder (const PropertyHolder &)=delete
 
PropertyHolderoperator= (const PropertyHolder &)=delete
 
- Public Member Functions inherited from CommonMessaging< implements< IService, IProperty, IStateful > >
MSG::Level msgLevel () const
 get the cached level (originally extracted from the embedded MsgStream) More...
 
bool msgLevel (MSG::Level lvl) const
 get the output level from the embedded MsgStream More...
 
MSG::Level outputLevel () const
 Backward compatibility function for getting the output level. More...
 
- Public Member Functions inherited from CommonMessagingBase
virtual ~CommonMessagingBase ()=default
 Virtual destructor. More...
 
const SmartIF< IMessageSvc > & msgSvc () const
 The standard message service. More...
 
MsgStreammsgStream () const
 Return an uninitialized MsgStream. More...
 
MsgStreammsgStream (const MSG::Level level) const
 Predefined configurable message stream for the efficient printouts. More...
 
MsgStreamalways () const
 shortcut for the method msgStream(MSG::ALWAYS) More...
 
MsgStreamfatal () const
 shortcut for the method msgStream(MSG::FATAL) More...
 
MsgStreamerr () const
 shortcut for the method msgStream(MSG::ERROR) More...
 
MsgStreamerror () const
 shortcut for the method msgStream(MSG::ERROR) More...
 
MsgStreamwarning () const
 shortcut for the method msgStream(MSG::WARNING) More...
 
MsgStreaminfo () const
 shortcut for the method msgStream(MSG::INFO) More...
 
MsgStreamdebug () const
 shortcut for the method msgStream(MSG::DEBUG) More...
 
MsgStreamverbose () const
 shortcut for the method msgStream(MSG::VERBOSE) More...
 
MsgStreammsg () const
 shortcut for the method msgStream(MSG::INFO) More...
 

Protected Member Functions

void printStats ()
 
- Protected Member Functions inherited from Service
 ~Service () override
 Standard Destructor. More...
 
int outputLevel () const
 get the Service's output level More...
 
- Protected Member Functions inherited from PropertyHolder< CommonMessaging< implements< IService, IProperty, IStateful > > >
Gaudi::Details::PropertyBaseproperty (const std::string &name) const
 
- Protected Member Functions inherited from CommonMessaging< implements< IService, IProperty, IStateful > >
MSG::Level setUpMessaging () const
 Set up local caches. More...
 
MSG::Level resetMessaging ()
 Reinitialize internal states. More...
 
void updateMsgStreamOutputLevel (int level)
 Update the output level of the cached MsgStream. More...
 

Private Types

typedef std::map< ChronoTag, std::vector< IChronoSvc::ChronoTime > > TimeMap
 

Private Member Functions

 ChronoStatSvc ()=delete
 
 ChronoStatSvc (const ChronoStatSvc &)=delete
 
ChronoStatSvcoperator= (const ChronoStatSvc &)=delete
 
void saveStats ()
 dump the statistics into an ASCII file for offline processing More...
 

Static Private Member Functions

static MSG::Level int2level (int l)
 

Private Attributes

ChronoMap m_chronoEntities
 chrono part More...
 
MSG::Level m_chronoPrintLevel = MSG::INFO
 level of info printing More...
 
StatMap m_statEntities
 stat part More...
 
MSG::Level m_statPrintLevel = MSG::INFO
 level of info printing More...
 
Gaudi::Property< bool > m_chronoTableFlag
 
Gaudi::Property< bool > m_chronoCoutFlag
 
Gaudi::Property< int > m_intChronoPrintLevel
 
Gaudi::Property< bool > m_chronoOrderFlag {this, "ChronoTableToBeOrdered", true, "should the printout be ordered"}
 
Gaudi::Property< bool > m_printUserTime {this, "PrintUserTime", true}
 
Gaudi::Property< bool > m_printSystemTime {this, "PrintSystemTime", false}
 
Gaudi::Property< bool > m_printEllapsedTime {this, "PrintEllapsedTime", false}
 
Gaudi::Property< bool > m_statTableFlag
 
Gaudi::Property< bool > m_statCoutFlag
 
Gaudi::Property< int > m_intStatPrintLevel
 
Gaudi::Property< bool > m_statOrderFlag {this, "StatTableToBeOrdered", true, "should the printout be ordered"}
 
Gaudi::Property< std::stringm_statsOutFileName
 
Gaudi::Property< std::stringm_header
 
Gaudi::Property< bool > m_useEffFormat
 
Gaudi::Property< std::stringm_perEventFile {this, "PerEventFile", "", "File name for per-event deltas"}
 
TimeMap m_perEvtTime
 
std::ofstream m_ofd
 

Additional Inherited Members

- Protected Attributes inherited from Service
Gaudi::StateMachine::State m_state = Gaudi::StateMachine::OFFLINE
 Service state. More...
 
Gaudi::StateMachine::State m_targetState = Gaudi::StateMachine::OFFLINE
 Service state. More...
 
Gaudi::Property< int > m_outputLevel {this, "OutputLevel", MSG::NIL, "output level"}
 
Gaudi::Property< bool > m_auditInit {this, "AuditServices", false, "[[deprecated]] unused"}
 
Gaudi::Property< bool > m_auditorInitialize {this, "AuditInitialize", false, "trigger auditor on initialize()"}
 
Gaudi::Property< bool > m_auditorStart {this, "AuditStart", false, "trigger auditor on start()"}
 
Gaudi::Property< bool > m_auditorStop {this, "AuditStop", false, "trigger auditor on stop()"}
 
Gaudi::Property< bool > m_auditorFinalize {this, "AuditFinalize", false, "trigger auditor on finalize()"}
 
Gaudi::Property< bool > m_auditorReinitialize {this, "AuditReinitialize", false, "trigger auditor on reinitialize()"}
 
Gaudi::Property< bool > m_auditorRestart {this, "AuditRestart", false, "trigger auditor on restart()"}
 
SmartIF< IAuditorSvcm_pAuditorSvc
 Auditor Service. More...
 

Detailed Description

The Chrono & Stat Sservice: service implements the IChronoStatSvc interface and provides the basic chronometry and some statistical counts needed by all applications.

Author
: Vanya BELYAEV Ivan..nosp@m.Bely.nosp@m.aev@i.nosp@m.tep..nosp@m.ru : December 1, 1999

Definition at line 33 of file ChronoStatSvc.h.

Member Typedef Documentation

typedef std::map<IChronoStatSvc::ChronoTag, ChronoEntity> ChronoStatSvc::ChronoMap

some useful typedefs

Definition at line 38 of file ChronoStatSvc.h.

typedef std::map<IChronoStatSvc::StatTag, StatEntity> ChronoStatSvc::StatMap

Definition at line 39 of file ChronoStatSvc.h.

Definition at line 180 of file ChronoStatSvc.h.

Constructor & Destructor Documentation

ChronoStatSvc::ChronoStatSvc ( )
privatedelete
ChronoStatSvc::ChronoStatSvc ( const ChronoStatSvc )
privatedelete

Member Function Documentation

const ChronoEntity * ChronoStatSvc::chrono ( const IChronoStatSvc::ChronoTag &  t) const
override

extract the chrono entity for the given tag (name)

See also
IChronoStatSvc
Parameters
tchrono tag(name)
Returns
pointer to chrono entity

Definition at line 375 of file ChronoStatSvc.cpp.

376 {
377  auto it = m_chronoEntities.find( t );
378  return m_chronoEntities.end() != it ? &( it->second ) : nullptr;
379 }
T end(T...args)
T find(T...args)
ChronoMap m_chronoEntities
chrono part
IChronoStatSvc::ChronoTime ChronoStatSvc::chronoDelta ( const IChronoStatSvc::ChronoTag &  chronoTag,
IChronoStatSvc::ChronoType  theType 
)
override

Implementation of IchronoStatSvc::chronoDelta.

See also
IChronoStatSvc

Definition at line 315 of file ChronoStatSvc.cpp.

317 {
318  return m_chronoEntities[chronoTag].delta( theType );
319 }
ChronoMap m_chronoEntities
chrono part
void ChronoStatSvc::chronoPrint ( const IChronoStatSvc::ChronoTag &  chronoTag)
override

Implementation of IChronoStatSvc::chronoPrint.

See also
IChronoStatSvc

Definition at line 323 of file ChronoStatSvc.cpp.

324 {
325  MsgStream log( msgSvc(), chronoTag );
326  if ( m_printUserTime ) {
327  log << (MSG::Level)m_chronoPrintLevel << m_chronoEntities[chronoTag].outputUserTime() << endmsg;
328  }
329  if ( m_printSystemTime ) {
330  log << (MSG::Level)m_chronoPrintLevel << m_chronoEntities[chronoTag].outputSystemTime() << endmsg;
331  }
332 }
Definition of the MsgStream class used to transmit messages.
Definition: MsgStream.h:24
Gaudi::Property< bool > m_printUserTime
const SmartIF< IMessageSvc > & msgSvc() const
The standard message service.
MSG::Level m_chronoPrintLevel
level of info printing
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:209
ChronoMap m_chronoEntities
chrono part
Gaudi::Property< bool > m_printSystemTime
ChronoEntity * ChronoStatSvc::chronoStart ( const IChronoStatSvc::ChronoTag &  chronoTag)
override

Implementation of IChronoStatSvc::chronoStart.

See also
IChronoStatSvc

Definition at line 297 of file ChronoStatSvc.cpp.

298 {
299  ChronoEntity& entity = m_chronoEntities[chronoTag];
300  entity.start();
301  return &entity;
302 }
a small helper class for implementation of ChronoStatSvc service, It also could be used as some local...
Definition: ChronoEntity.h:21
IChronoSvc::ChronoStatus start()
start the current chrono
ChronoMap m_chronoEntities
chrono part
IChronoStatSvc::ChronoStatus ChronoStatSvc::chronoStatus ( const IChronoStatSvc::ChronoTag &  chronoTag)
override

Implementation of IChronoStatSvc::chronoStatus.

See also
IChronoStatSvc

Definition at line 336 of file ChronoStatSvc.cpp.

337 {
338  return m_chronoEntities[chronoTag].status();
339 }
ChronoMap m_chronoEntities
chrono part
const ChronoEntity * ChronoStatSvc::chronoStop ( const IChronoStatSvc::ChronoTag &  chronoTag)
override

Implementation of IChronoStatSvc::chronoStop.

See also
IChronoStatSvc

Definition at line 306 of file ChronoStatSvc.cpp.

307 {
308  ChronoEntity& entity = m_chronoEntities[chronoTag];
309  entity.stop();
310  return &entity;
311 }
a small helper class for implementation of ChronoStatSvc service, It also could be used as some local...
Definition: ChronoEntity.h:21
IChronoSvc::ChronoStatus stop()
stop the chrono
ChronoMap m_chronoEntities
chrono part
StatusCode ChronoStatSvc::finalize ( )
override

Implementation of IService::finalize()

stop its own chrono

Is the final chrono table to be printed?

decoration

CONTINUE

CONTINUE

stop chrono (if it is still in RUNNING status)

print to std::cout

print to MsgStream

decoration

CONTINUE

CONTINUE

stop chrono (if it is still in RUNNING status)

print to std::cout

print to MsgStream

decoration

CONTINUE

CONTINUE

stop chrono (if it is still in RUNNING status)

print to std::cout

print to MsgStream

clear the temporary container

the final decoration

Is the final stat table to be printed?

< finalize the base class

Definition at line 129 of file ChronoStatSvc.cpp.

130 {
131  std::string local = name() + ".finalize()";
133  MsgStream main_log( msgSvc(), local );
136  chronoStop( name() );
137 
138  if ( m_ofd.is_open() ) {
139  debug() << "writing per-event timing data to '" << m_perEventFile << "'" << endmsg;
140  for ( const auto& itr : m_perEvtTime ) {
141  m_ofd << itr.first.substr( 0, itr.first.length() - 8 ) << " ";
142  for ( const auto& itt : itr.second ) {
143  m_ofd << " " << (long int)( itt );
144  }
145  m_ofd << std::endl;
146  }
147 
148  m_ofd.close();
149  }
150 
155  MsgStream log( msgSvc(), "*****Chrono*****" );
156  const std::string stars( ( m_chronoCoutFlag ) ? 126 : 100, '*' );
157  if ( m_chronoCoutFlag ) {
158  std::cout << stars << std::endl;
159  std::cout << local << " The Final CPU consumption (Chrono) Table "
160  << ( m_chronoOrderFlag ? "(ordered)" : "(not ordered)" ) << std::endl;
161  std::cout << stars << std::endl;
162  } else {
163  log << (MSG::Level)m_chronoPrintLevel << stars << endmsg;
164  log << (MSG::Level)m_chronoPrintLevel << " The Final CPU consumption ( Chrono ) Table "
165  << ( m_chronoOrderFlag ? "(ordered)" : "(not ordered)" ) << endmsg;
166  log << (MSG::Level)m_chronoPrintLevel << stars << endmsg;
167  }
169  { // prepare container for printing
171  tmpCont.reserve( m_chronoEntities.size() );
172  for ( auto& it : m_chronoEntities ) {
173  tmpCont.emplace_back( &it.second, &it.first );
174  }
175  // sort it
176  if ( m_chronoOrderFlag ) std::sort( tmpCont.begin(), tmpCont.end(), CompareFirstOfPointerPair );
177  // print User Time statistics
178  if ( m_printUserTime ) {
179  for ( auto iter = tmpCont.begin(); tmpCont.end() != iter; ++iter ) {
180  //
181  ChronoEntity* entity = iter->first;
182  if ( !entity ) {
183  continue;
184  }
185  const ChronoTag* tag = iter->second;
186  if ( !tag ) {
187  continue;
188  }
189  entity->stop();
191  if ( m_chronoCoutFlag )
193  {
194  std::cout << *tag << "\t" << entity->outputUserTime() << std::endl;
195  } else
196  {
197  MsgStream( msgSvc(), *tag ) << m_chronoPrintLevel << entity->outputUserTime() << endmsg;
198  }
199  //
200  }
201  }
203  if ( m_printSystemTime ) {
207  std::cout << stars << std::endl;
208  } else if ( m_printUserTime && !m_chronoCoutFlag ) {
209  log << (MSG::Level)m_chronoPrintLevel << stars << endmsg;
210  }
212  for ( auto iter = tmpCont.begin(); tmpCont.end() != iter; ++iter ) {
214  ChronoEntity* entity = iter->first;
215  if ( !entity ) {
216  continue;
217  }
218  const ChronoTag* tag = iter->second;
219  if ( !tag ) {
220  continue;
221  }
222  entity->stop();
224  if ( m_chronoCoutFlag )
226  {
227  std::cout << *tag << "\t" << entity->outputSystemTime() << std::endl;
228  } else
229  {
230  MsgStream( msgSvc(), *tag ) << m_chronoPrintLevel << entity->outputSystemTime() << endmsg;
231  }
232  //
233  }
234  }
236  if ( m_printEllapsedTime ) {
240  std::cout << stars << std::endl;
241  } else if ( ( m_printUserTime || m_printSystemTime ) && !m_chronoCoutFlag ) {
242  log << (MSG::Level)m_chronoPrintLevel << stars << endmsg;
243  }
245  for ( const auto& i : tmpCont ) {
247  ChronoEntity* entity = i.first;
248  if ( !entity ) {
249  continue;
250  }
251  const ChronoTag* tag = i.second;
252  if ( !tag ) {
253  continue;
254  }
255  entity->stop();
257  if ( m_chronoCoutFlag )
259  {
260  std::cout << *tag << "\t" << entity->outputElapsedTime() << std::endl;
261  } else
262  {
263  MsgStream( msgSvc(), *tag ) << m_chronoPrintLevel << entity->outputElapsedTime() << endmsg;
264  }
265  //
266  }
267  }
269  tmpCont.clear();
270  }
272  if ( m_chronoCoutFlag ) {
273  std::cout << stars << std::endl;
274  } else {
275  log << m_chronoPrintLevel << stars << endmsg;
276  }
277  }
278 
280 
282  if ( m_statTableFlag ) {
283  printStats();
284  }
285 
286  if ( !m_statsOutFileName.value().empty() ) {
287  saveStats();
288  }
289 
290  main_log << MSG::INFO << " Service finalized successfully " << endmsg;
291 
292  return Service::finalize();
293 }
std::string outputElapsedTime() const
print the chrono ;
Definition of the MsgStream class used to transmit messages.
Definition: MsgStream.h:24
T empty(T...args)
const std::string & name() const override
Retrieve name of the service.
Definition: Service.cpp:288
StatusCode finalize() override
Definition: Service.cpp:173
a small helper class for implementation of ChronoStatSvc service, It also could be used as some local...
Definition: ChronoEntity.h:21
T endl(T...args)
Gaudi::Property< bool > m_chronoOrderFlag
Gaudi::Property< bool > m_printUserTime
T end(T...args)
std::string outputSystemTime() const
print the chrono ;
STL class.
void saveStats()
dump the statistics into an ASCII file for offline processing
constexpr struct CompareFirstOfPointerPair_t CompareFirstOfPointerPair
void clear(STATE_TYPE _i=std::ios_base::failbit)
Definition: MsgStream.h:187
TimeMap m_perEvtTime
T close(T...args)
const ChronoEntity * chronoStop(const IChronoStatSvc::ChronoTag &chronoTag) override
Implementation of IChronoStatSvc::chronoStop.
Gaudi::Property< bool > m_chronoTableFlag
const SmartIF< IMessageSvc > & msgSvc() const
The standard message service.
std::ofstream m_ofd
MSG::Level m_chronoPrintLevel
level of info printing
Gaudi::Property< bool > m_printEllapsedTime
std::string outputUserTime() const
print the chrono ;
T size(T...args)
STL class.
MsgStream & debug() const
shortcut for the method msgStream(MSG::DEBUG)
T begin(T...args)
Gaudi::Property< bool > m_statTableFlag
Gaudi::Property< std::string > m_statsOutFileName
Gaudi::Property< bool > m_chronoCoutFlag
T sort(T...args)
T is_open(T...args)
IChronoSvc::ChronoStatus stop()
stop the chrono
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:209
T reserve(T...args)
ChronoMap m_chronoEntities
chrono part
T emplace_back(T...args)
Gaudi::Property< bool > m_printSystemTime
Gaudi::Property< std::string > m_perEventFile
void ChronoStatSvc::handle ( const Incident incident)
override

Definition at line 534 of file ChronoStatSvc.cpp.

535 {
536 
537  if ( !m_ofd.is_open() ) return;
538 
539  for ( const auto& itr : m_chronoEntities ) {
540  if ( itr.first.find( ":Execute" ) == std::string::npos ) continue;
541 
542  auto itm = m_perEvtTime.find( itr.first );
543  if ( itm == m_perEvtTime.end() ) {
544  m_perEvtTime[itr.first] = {itr.second.delta( IChronoSvc::ELAPSED )};
545  } else {
546  itm->second.push_back( itr.second.delta( IChronoSvc::ELAPSED ) );
547  }
548  }
549 }
T end(T...args)
TimeMap m_perEvtTime
std::ofstream m_ofd
T find(T...args)
T is_open(T...args)
ChronoMap m_chronoEntities
chrono part
StatusCode ChronoStatSvc::initialize ( )
override

Implementation of IService::initialize()

start its own chrono

Definition at line 84 of file ChronoStatSvc.cpp.

85 {
87  if ( sc.isFailure() ) return sc;
89  // Set my own properties
90  sc = setProperties();
91 
92  if ( sc.isFailure() ) {
93  error() << "setting my properties" << endmsg;
94  return StatusCode::FAILURE;
95  }
96 
97  // only add an EndEvent listener if per-event output requested
98  if ( !m_perEventFile.empty() ) {
100  if ( !m_ofd.is_open() ) {
101  error() << "unable to open per-event output file \"" << m_perEventFile << "\"" << endmsg;
102  return StatusCode::FAILURE;
103  } else {
104  auto ii = serviceLocator()->service<IIncidentSvc>( "IncidentSvc" );
105  if ( !ii ) {
106  error() << "Unable to find IncidentSvc" << endmsg;
107  return StatusCode::FAILURE;
108  }
109  ii->addListener( this, IncidentType::EndEvent );
110  }
111  }
112 
114  m_printUserTime = true;
115  }
118  m_chronoTableFlag = true;
119  }
122  chronoStart( name() );
124  return StatusCode::SUCCESS;
125 }
constexpr static const auto FAILURE
Definition: StatusCode.h:88
StatusCode initialize() override
Definition: Service.cpp:63
T open(T...args)
const std::string & name() const override
Retrieve name of the service.
Definition: Service.cpp:288
Gaudi::Property< bool > m_printUserTime
bool isFailure() const
Definition: StatusCode.h:139
StatusCode service(const Gaudi::Utils::TypeNameString &name, T *&svc, bool createIf=true)
Templated method to access a service by name.
Definition: ISvcLocator.h:79
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:51
Gaudi::Property< bool > m_chronoTableFlag
std::ofstream m_ofd
StatusCode setProperties()
Method for setting declared properties to the values specified for the job.
Definition: Service.cpp:294
constexpr static const auto SUCCESS
Definition: StatusCode.h:87
Gaudi::Property< bool > m_printEllapsedTime
ChronoEntity * chronoStart(const IChronoStatSvc::ChronoTag &chronoTag) override
Implementation of IChronoStatSvc::chronoStart.
T is_open(T...args)
SmartIF< ISvcLocator > & serviceLocator() const override
Retrieve pointer to service locator.
Definition: Service.cpp:291
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:209
The interface implemented by the IncidentSvc service.
Definition: IIncidentSvc.h:23
Gaudi::Property< bool > m_printSystemTime
Gaudi::Property< std::string > m_perEventFile
static MSG::Level ChronoStatSvc::int2level ( int  l)
inlinestaticprivate

Definition at line 131 of file ChronoStatSvc.h.

132  {
133  return static_cast<MSG::Level>(
134  std::max( std::min( l, static_cast<int>( MSG::FATAL ) ), static_cast<int>( MSG::NIL ) ) );
135  };
T min(T...args)
T max(T...args)
dictionary l
Definition: gaudirun.py:453
void ChronoStatSvc::merge ( const ChronoStatSvc css)

Compound assignment operator.

Definition at line 56 of file ChronoStatSvc.cpp.

57 {
58 
59  // Add the content of the maps, leave the rest unchanged
60 
61  // Merge Chronomaps
62  for ( auto& item : css.m_chronoEntities ) {
63  const IChronoStatSvc::ChronoTag& key = item.first;
64  const ChronoEntity& val = item.second;
65  if ( m_chronoEntities.count( key ) )
66  m_chronoEntities[key] += val;
67  else
69  }
70 
71  // Merge StatMaps
72  for ( auto& item : css.m_statEntities ) {
73  const IChronoStatSvc::StatTag& key = item.first;
74  const StatEntity& val = item.second;
75  if ( m_statEntities.count( key ) )
76  m_statEntities[key] += val;
77  else
78  m_statEntities.emplace( key, val );
79  }
80 }
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
T count(T...args)
T insert(T...args)
T emplace(T...args)
backward compatible StatEntity class.
Definition: Counters.h:855
ChronoMap m_chronoEntities
chrono part
ChronoStatSvc& ChronoStatSvc::operator= ( const ChronoStatSvc )
privatedelete
void ChronoStatSvc::printStats ( )
protected

nothing to print?

CONTINUE

CONTINUE

decoration

Definition at line 464 of file ChronoStatSvc.cpp.

465 {
467  if ( m_statEntities.empty() ) {
468  return;
469  }
470 
471  MsgStream log( msgSvc(), "******Stat******" );
473  const std::string stars( ( m_statCoutFlag ) ? 126 : 100, '*' );
475  if ( m_statCoutFlag ) {
476  std::cout << stars << std::endl;
477  std::cout << " The Final stat Table " << ( m_statOrderFlag ? "(ordered)" : "(not ordered)" ) << std::endl;
478  std::cout << stars << std::endl;
479  } else {
480  log << m_statPrintLevel << stars << endmsg;
481  log << m_statPrintLevel << " The Final stat Table " << ( m_statOrderFlag ? "(ordered)" : "(not ordered)" )
482  << endmsg;
483  log << m_statPrintLevel << stars << endmsg;
484  }
485 
486  {
487  // prepare container for printing
489  typedef std::vector<SPair> SCont;
490  SCont tmpCont;
492  []( StatMap::const_reference i ) { return std::make_pair( &i.second, &i.first ); } );
493  // sort it
494  if ( m_statOrderFlag ) std::sort( tmpCont.begin(), tmpCont.end(), CompareFirstOfPointerPair );
495  // print the table header
496  if ( m_statCoutFlag ) {
497  std::cout << m_header.value() << std::endl;
498  } else {
499  log << m_statPrintLevel << m_header.value() << endmsg;
500  }
501 
502  // loop over counters and print them:
503  for ( const auto& iter : tmpCont ) {
505  const StatEntity* entity = iter.first;
506  if ( !entity ) {
507  continue;
508  }
509  const StatTag* tag = iter.second;
510  if ( !tag ) {
511  continue;
512  }
513  if ( m_statCoutFlag ) {
515  entity->print( std::cout, true, *tag, m_useEffFormat, "%|-15.15s|%|17t|" );
516  } else {
517  std::ostringstream ost;
518  entity->print( ost, true, *tag, m_useEffFormat, "%|-15.15s|%|17t|" );
519  log << m_statPrintLevel << ost.str() << endmsg;
520  }
521  }
522  tmpCont.clear();
523  }
525  if ( m_statCoutFlag ) {
526  std::cout << stars << std::endl;
527  } else {
528  log << m_statPrintLevel << stars << endmsg;
529  }
530 }
Definition of the MsgStream class used to transmit messages.
Definition: MsgStream.h:24
T empty(T...args)
Gaudi::Property< std::string > m_header
StatMap m_statEntities
stat part
Gaudi::Property< bool > m_statCoutFlag
T endl(T...args)
T end(T...args)
STL class.
Gaudi::Property< bool > m_useEffFormat
constexpr struct CompareFirstOfPointerPair_t CompareFirstOfPointerPair
void clear(STATE_TYPE _i=std::ios_base::failbit)
Definition: MsgStream.h:187
Gaudi::Property< bool > m_statOrderFlag
T make_pair(T...args)
std::ostream & print(std::ostream &o, bool tableFormat, const std::string &name, bool flag=true, std::string fmtHead="%|-48.48s|%|27t|") const
Definition: Counters.h:967
const SmartIF< IMessageSvc > & msgSvc() const
The standard message service.
STL class.
T begin(T...args)
T back_inserter(T...args)
MSG::Level m_statPrintLevel
level of info printing
T sort(T...args)
T transform(T...args)
backward compatible StatEntity class.
Definition: Counters.h:855
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:209
void ChronoStatSvc::saveStats ( )
private

dump the statistics into an ASCII file for offline processing

CONTINUE

CONTINUE

Definition at line 395 of file ChronoStatSvc.cpp.

396 {
397  std::ofstream out( m_statsOutFileName.value(), std::ios_base::out | std::ios_base::trunc );
398  if ( !out.good() ) {
399  info() << "Could not open the output file for writing chrono statistics [" << m_statsOutFileName.value() << "]"
400  << endmsg;
401  return;
402  } else {
403  // format it our way
404  out << std::scientific << std::setprecision( 8 );
405  }
406 
407  // ChronoEntity
409  chronos.reserve( m_chronoEntities.size() );
411  []( ChronoMap::const_reference i ) { return std::make_pair( &i.second, &i.first ); } );
412 
413  // sort it
414  std::sort( std::begin( chronos ), std::end( chronos ), CompareFirstOfPointerPair );
415 
416  // print User Time statistics
417  for ( const auto& iter : chronos ) {
418  //
419  const ChronoEntity* entity = iter.first;
420  if ( !entity ) {
421  continue;
422  }
423 
424  const ChronoTag* tag = iter.second;
425  if ( !tag ) {
426  continue;
427  }
428 
429  // create an entry in the .INI-like table
430  out << "\n[" << *tag << "]\n";
431 
432  // user
433  out << "cpu_user_total = " << entity->uTotalTime() << "\n";
434  out << "cpu_user_min = " << entity->uMinimalTime() << "\n";
435  out << "cpu_user_mean = " << entity->uMeanTime() << "\n";
436  out << "cpu_user_RMS = " << entity->uRMSTime() << "\n";
437  out << "cpu_user_max = " << entity->uMaximalTime() << "\n";
438  out << "cpu_user_nbr = " << entity->nOfMeasurements() << "\n";
439 
440  // system
441  out << "\n"; // just for clarity
442  out << "cpu_system_total = " << entity->kTotalTime() << "\n";
443  out << "cpu_system_min = " << entity->kMinimalTime() << "\n";
444  out << "cpu_system_mean = " << entity->kMeanTime() << "\n";
445  out << "cpu_system_RMS = " << entity->kRMSTime() << "\n";
446  out << "cpu_system_max = " << entity->kMaximalTime() << "\n";
447  out << "cpu_system_nbr = " << entity->nOfMeasurements() << "\n";
448 
449  // real
450  out << "\n"; // just for clarity
451  out << "cpu_real_total = " << entity->eTotalTime() << "\n";
452  out << "cpu_real_min = " << entity->eMinimalTime() << "\n";
453  out << "cpu_real_mean = " << entity->eMeanTime() << "\n";
454  out << "cpu_real_RMS = " << entity->eRMSTime() << "\n";
455  out << "cpu_real_max = " << entity->eMaximalTime() << "\n";
456  out << "cpu_real_nbr = " << entity->nOfMeasurements() << "\n";
457  }
458 
459  out << std::endl;
460 }
double kMaximalTime() const
maximal measurement for kernel time
Definition: ChronoEntity.h:199
double uMinimalTime() const
minimal measurement for user time
Definition: ChronoEntity.h:183
double uTotalTime() const
total user time
Definition: ChronoEntity.h:207
MsgStream & info() const
shortcut for the method msgStream(MSG::INFO)
a small helper class for implementation of ChronoStatSvc service, It also could be used as some local...
Definition: ChronoEntity.h:21
double kTotalTime() const
total Kernel time
Definition: ChronoEntity.h:211
T endl(T...args)
double uRMSTime() const
r.m.s User Time
Definition: ChronoEntity.h:239
T end(T...args)
double kMinimalTime() const
minimal measurement for kernel time
Definition: ChronoEntity.h:187
double eMinimalTime() const
minimal measurement for elapsed time
Definition: ChronoEntity.h:191
double kRMSTime() const
r.m.s Kernel Time
Definition: ChronoEntity.h:235
double kMeanTime() const
average Kernel Time
Definition: ChronoEntity.h:223
STL class.
double eMeanTime() const
average Elapsed Time
Definition: ChronoEntity.h:231
constexpr struct CompareFirstOfPointerPair_t CompareFirstOfPointerPair
T make_pair(T...args)
double eRMSTime() const
r.m.s Elapsed Time
Definition: ChronoEntity.h:243
T scientific(T...args)
double uMeanTime() const
average User Time
Definition: ChronoEntity.h:227
T size(T...args)
STL class.
T begin(T...args)
T back_inserter(T...args)
double eMaximalTime() const
maximal measurement for elapsed time
Definition: ChronoEntity.h:203
unsigned long nOfMeasurements() const
number of chrono measurements
Definition: ChronoEntity.h:179
Gaudi::Property< std::string > m_statsOutFileName
T sort(T...args)
T transform(T...args)
double uMaximalTime() const
maximal measurement for user time
Definition: ChronoEntity.h:195
T setprecision(T...args)
double eTotalTime() const
total Elapsed time
Definition: ChronoEntity.h:215
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:209
T reserve(T...args)
ChronoMap m_chronoEntities
chrono part
void ChronoStatSvc::stat ( const IChronoStatSvc::StatTag &  statTag,
const IChronoStatSvc::StatFlag &  statFlag 
)
override

Implementation of IChronoStatSvc::stat add statistical information to the entity , tagged by its name.

See also
IChronoStatSvc

Definition at line 343 of file ChronoStatSvc.cpp.

344 {
345  auto theIter = m_statEntities.find( statTag );
346 
347  StatEntity* theStat = nullptr;
348  // if new entity, specify the number of events to be skipped
349  if ( theIter == m_statEntities.end() ) {
350  // new stat entity
351  StatEntity& theSe = m_statEntities[statTag];
352  theStat = &theSe;
353  } else {
354  // existing stat entity
355  theStat = &theIter->second;
356  }
357 
358  theStat->addFlag( statFlag );
359 }
StatMap m_statEntities
stat part
T end(T...args)
T find(T...args)
unsigned long addFlag(const double v)
Definition: Counters.h:935
backward compatible StatEntity class.
Definition: Counters.h:855
StatEntity * ChronoStatSvc::stat ( const IChronoStatSvc::StatTag &  t)
override

extract the stat entity for the given tag (name)

See also
IChronoStatSvc
Parameters
tstat tag(name)
Returns
pointer to stat entity

Definition at line 387 of file ChronoStatSvc.cpp.

388 {
389  auto it = m_statEntities.find( t );
390  return m_statEntities.end() != it ? &( it->second ) : nullptr;
391 }
StatMap m_statEntities
stat part
T end(T...args)
T find(T...args)
void ChronoStatSvc::statPrint ( const IChronoStatSvc::ChronoTag &  statTag)
override

prints (using message service) info about statistical entity, tagged by its name

See also
IChronoStatSvc

Definition at line 363 of file ChronoStatSvc.cpp.

364 {
365  MsgStream log( msgSvc(), statTag );
367 }
Definition of the MsgStream class used to transmit messages.
Definition: MsgStream.h:24
StatMap m_statEntities
stat part
const SmartIF< IMessageSvc > & msgSvc() const
The standard message service.
MSG::Level m_statPrintLevel
level of info printing
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:209

Member Data Documentation

Gaudi::Property<bool> ChronoStatSvc::m_chronoCoutFlag
private
Initial value:
{this, "ChronoDestinationCout", false,
"define the destination of the table to be printed"}

Definition at line 149 of file ChronoStatSvc.h.

ChronoMap ChronoStatSvc::m_chronoEntities
private

chrono part

Definition at line 135 of file ChronoStatSvc.h.

Gaudi::Property<bool> ChronoStatSvc::m_chronoOrderFlag {this, "ChronoTableToBeOrdered", true, "should the printout be ordered"}
private

Definition at line 154 of file ChronoStatSvc.h.

MSG::Level ChronoStatSvc::m_chronoPrintLevel = MSG::INFO
private

level of info printing

Definition at line 140 of file ChronoStatSvc.h.

Gaudi::Property<bool> ChronoStatSvc::m_chronoTableFlag
private
Initial value:
{this, "ChronoPrintOutTable", true,
"decide if the final printout should be performed"}

Definition at line 147 of file ChronoStatSvc.h.

Gaudi::Property<std::string> ChronoStatSvc::m_header
private
Initial value:
{
this, "StatTableHeader",
" | Counter | # | sum | mean/eff^* | rms/err^* | min | max |",
"The header row for the output Stat-table"}

Definition at line 171 of file ChronoStatSvc.h.

Gaudi::Property<int> ChronoStatSvc::m_intChronoPrintLevel
private
Initial value:
{
this, "ChronoPrintLevel", MSG::INFO, [this]( auto& ) { m_chronoPrintLevel = int2level( m_intChronoPrintLevel ); },
"print level"}

Definition at line 151 of file ChronoStatSvc.h.

Gaudi::Property<int> ChronoStatSvc::m_intStatPrintLevel
private
Initial value:
{this, "StatPrintLevel", MSG::INFO,
[this]( auto& ) { m_statPrintLevel = int2level( m_intStatPrintLevel ); },
"print level"}

Definition at line 162 of file ChronoStatSvc.h.

std::ofstream ChronoStatSvc::m_ofd
private

Definition at line 182 of file ChronoStatSvc.h.

Gaudi::Property<std::string> ChronoStatSvc::m_perEventFile {this, "PerEventFile", "", "File name for per-event deltas"}
private

Definition at line 178 of file ChronoStatSvc.h.

TimeMap ChronoStatSvc::m_perEvtTime
private

Definition at line 181 of file ChronoStatSvc.h.

Gaudi::Property<bool> ChronoStatSvc::m_printEllapsedTime {this, "PrintEllapsedTime", false}
private

Definition at line 157 of file ChronoStatSvc.h.

Gaudi::Property<bool> ChronoStatSvc::m_printSystemTime {this, "PrintSystemTime", false}
private

Definition at line 156 of file ChronoStatSvc.h.

Gaudi::Property<bool> ChronoStatSvc::m_printUserTime {this, "PrintUserTime", true}
private

Definition at line 155 of file ChronoStatSvc.h.

Gaudi::Property<bool> ChronoStatSvc::m_statCoutFlag
private
Initial value:
{this, "StatDestinationCout", false,
"define the destination of the table to be printed"}

Definition at line 160 of file ChronoStatSvc.h.

StatMap ChronoStatSvc::m_statEntities
private

stat part

Definition at line 143 of file ChronoStatSvc.h.

Gaudi::Property<bool> ChronoStatSvc::m_statOrderFlag {this, "StatTableToBeOrdered", true, "should the printout be ordered"}
private

Definition at line 165 of file ChronoStatSvc.h.

MSG::Level ChronoStatSvc::m_statPrintLevel = MSG::INFO
private

level of info printing

Definition at line 145 of file ChronoStatSvc.h.

Gaudi::Property<std::string> ChronoStatSvc::m_statsOutFileName
private
Initial value:
{
this, "AsciiStatsOutputFile", "",
"Name of the output file storing the stats. If empty, no statistics will be saved (default)"}

Definition at line 167 of file ChronoStatSvc.h.

Gaudi::Property<bool> ChronoStatSvc::m_statTableFlag
private
Initial value:
{this, "StatPrintOutTable", true,
"decide if the final printout should be performed"}

Definition at line 158 of file ChronoStatSvc.h.

Gaudi::Property<bool> ChronoStatSvc::m_useEffFormat
private
Initial value:
{this, "UseEfficiencyRowFormat", true,
"Use the special format for printout of efficiency counters"}

Definition at line 175 of file ChronoStatSvc.h.


The documentation for this class was generated from the following files: