Loading [MathJax]/extensions/tex2jax.js
The Gaudi Framework  v31r0 (aeb156f0)
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
SequencerTimerTool.cpp
Go to the documentation of this file.
1 // Include files
2 
3 // From ROOT
4 #include "TH1D.h"
5 
6 // from Gaudi
9 #include "GaudiUtils/Aida2ROOT.h"
10 
11 // local
12 #include "SequencerTimerTool.h"
13 
14 //-----------------------------------------------------------------------------
15 // Implementation file for class : SequencerTimerTool
16 //
17 // 2004-05-19 : Olivier Callot
18 //-----------------------------------------------------------------------------
19 
20 // Declaration of the Tool Factory
22 
23 //=============================================================================
24 // Standard constructor, initializes variables
25 //=============================================================================
26 SequencerTimerTool::SequencerTimerTool( const std::string& type, const std::string& name, const IInterface* parent )
27  : GaudiHistoTool( type, name, parent ) {
28  declareInterface<ISequencerTimerTool>( this );
29 
30  // Histograms are disabled by default in this tool.
31  setProperty( "HistoProduce", false ).ignore();
32 }
33 //=========================================================================
34 //
35 //=========================================================================
38  if ( sc.isFailure() ) return sc;
39  double sum = 0;
40  TimerForSequencer norm( "normalize", m_headerSize, m_normFactor );
41  norm.start();
42  IRndmGenSvc* rsvc = svc<IRndmGenSvc>( "RndmGenSvc", true );
43  { // Use dummy loop suggested by Vanya Belyaev:
45  gauss.initialize( rsvc, Rndm::Gauss( 0., 1.0 ) ).ignore();
46  unsigned int shots = m_shots;
47  while ( 0 < --shots ) { sum += gauss() * sum; }
48  }
49  norm.stop();
50  double time = norm.lastCpu();
51  m_speedRatio = 1. / time;
52  info() << "This machine has a speed about " << format( "%6.2f", 1000. * m_speedRatio )
53  << " times the speed of a 2.8 GHz Xeon." << endmsg;
55  return sc;
56 }
57 
58 //=========================================================================
59 // Finalize : Report timers
60 //=========================================================================
62 
63  std::string line( m_headerSize + 68, '-' );
64  info() << line << endmsg << "This machine has a speed about " << format( "%6.2f", 1000. * m_speedRatio )
65  << " times the speed of a 2.8 GHz Xeon.";
66  if ( m_normalised ) info() << " *** All times are renormalized ***";
67  info() << endmsg << TimerForSequencer::header( m_headerSize ) << endmsg << line << endmsg;
68 
69  std::string lastName;
70  for ( const auto& timr : m_timerList ) {
71  if ( lastName == timr.name() ) continue; // suppress duplicate
72  lastName = timr.name();
73  info() << timr << endmsg;
74  }
75  info() << line << endmsg;
76 
77  return GaudiHistoTool::finalize();
78 }
79 
80 //=========================================================================
81 // Return the index of a specified name. Trailing and leading spaces ignored
82 //=========================================================================
84  auto beg = name.find_first_not_of( " \t" );
85  auto end = name.find_last_not_of( " \t" );
86  auto temp = name.substr( beg, end - beg + 1 );
87  auto i = std::find_if( std::begin( m_timerList ), std::end( m_timerList ), [&]( const TimerForSequencer& timer ) {
88  beg = timer.name().find_first_not_of( " \t" );
89  end = timer.name().find_last_not_of( " \t" );
90  return timer.name().compare( beg, end - beg + 1, temp ) == 0;
91  } );
92  return i != std::end( m_timerList ) ? std::distance( std::begin( m_timerList ), i ) : -1;
93 }
94 
95 //=========================================================================
96 // Build and save the histograms
97 //=========================================================================
99  if ( produceHistos() ) {
100  info() << "Saving Timing histograms" << endmsg;
101  const size_t bins = m_timerList.size();
102  AIDA::IHistogram1D* histoTime = book( "ElapsedTime", 0, bins, bins );
103  AIDA::IHistogram1D* histoCPU = book( "CPUTime", 0, bins, bins );
104  AIDA::IHistogram1D* histoCount = book( "Count", 0, bins, bins );
105  TH1D* tHtime = Gaudi::Utils::Aida2ROOT::aida2root( histoTime );
106  TH1D* tHCPU = Gaudi::Utils::Aida2ROOT::aida2root( histoCPU );
107  TH1D* tHCount = Gaudi::Utils::Aida2ROOT::aida2root( histoCount );
108  for ( const auto& tfsq : m_timerList ) {
109  tHtime->Fill( tfsq.name().c_str(), tfsq.elapsedTotal() );
110  tHCPU->Fill( tfsq.name().c_str(), tfsq.cpuTotal() );
111  tHCount->Fill( tfsq.name().c_str(), tfsq.count() );
112  }
113  }
114 }
115 
116 //=============================================================================
117 // Add a timer
118 //=============================================================================
120  std::string myName( 2 * m_indent, ' ' );
121  myName += name;
122  if ( myName.size() < m_headerSize ) { myName += std::string( m_headerSize - myName.size(), ' ' ); }
124  return m_timerList.size() - 1;
125 }
126 
127 //=============================================================================
StatusCode initialize() override
initialize method, to compute the normalization factor
StatusCode setProperty(IProperty *component, const std::string &name, const TYPE &value, const std::string &doc)
simple function to set the property of the given object from the value
Definition: Property.h:1178
Auxiliary class.
static std::string header(std::string::size_type size)
header matching the previous format
T distance(T...args)
GAUDI_API std::string format(const char *,...)
MsgStream format utility "a la sprintf(...)".
Definition: MsgStream.cpp:109
T find_first_not_of(T...args)
Gaudi::Property< bool > m_normalised
StatusCode finalize() override
standard finalization method
double sum(double x, double y, double z)
uint64_t stop()
Stop time measurement and return the last elapsed time.
STL namespace.
T end(T...args)
double lastCpu() const
returns the last measured time
Parameters for the Gauss random number generation.
void start()
Start a time measurement.
int indexByName(const std::string &name) override
returns the index of the counter with that name, or -1
bool isFailure() const
Definition: StatusCode.h:130
Simple class to extend the functionality of class GaudiTool.
STL class.
#define DECLARE_COMPONENT(type)
Gaudi::Property< int > m_shots
void saveHistograms() override
prepares and saves the timing histograms
Random number accessor This small class encapsulates the use of the random number generator...
Random Generator service interface definition Definition of a interface for a service to access rando...
Definition: IRndmGenSvc.h:35
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:50
Definition of the basic interface.
Definition: IInterface.h:244
static TH1D * aida2root(AIDA::IHistogram1D *aida)
get the underlying pointer for 1D-histogram
Definition: Aida2ROOT.cpp:71
AIDA::IHistogram1D * book(const std::string &title, const double low=0, const double high=100, const unsigned long bins=100) const
book the 1D histogram
Definition: GaudiHistos.h:1849
int addTimer(const std::string &name) override
add a timer entry with the specified name
T move(T...args)
T find_last_not_of(T...args)
int m_indent
Amount of indentation.
T find_if(T...args)
T size(T...args)
T begin(T...args)
constexpr double gauss
StatusCode initialize() override
standard initialization method
const StatusCode & ignore() const
Ignore/check StatusCode.
Definition: StatusCode.h:153
bool produceHistos() const
get the flag for histogram production (property "HistoProduce")
Definition: GaudiHistos.h:2371
Implements the time measurement inside a sequencer.
const std::string & name() const
returns the name
std::vector< TimerForSequencer > m_timerList
T substr(T...args)
virtual StatusCode initialize(const SmartIF< IRndmGenSvc > &svc, const IRndmGen::Param &par)
Initialization.
Gaudi::Property< std::string::size_type > m_headerSize
StatusCode finalize() override
finalize method, to print the time summary table
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:192
virtual const std::string & name() const =0
Retrieve the name of the instance.
T compare(T...args)
double m_normFactor
Factor to convert to standard CPU (1 GHz PIII)
T emplace_back(T...args)