GaudiTool.cpp
Go to the documentation of this file.
1 // ============================================================================
2 // Include files
3 // ============================================================================
4 // GaudiKernel
5 // ============================================================================
6 #include "GaudiKernel/IChronoStatSvc.h"
7 #include "GaudiKernel/IIncidentSvc.h"
8 #include "GaudiKernel/IDataProviderSvc.h"
9 #include "GaudiKernel/IHistogramSvc.h"
10 #include "GaudiKernel/INTupleSvc.h"
11 #include "GaudiKernel/IAlgContextSvc.h"
12 #include "GaudiKernel/Bootstrap.h"
13 // ============================================================================
14 // GaudiAlg
15 // ============================================================================
16 #include "GaudiAlg/GaudiTool.h"
17 #include "GaudiAlg/GaudiAlgorithm.h"
18 // ============================================================================
26 // ============================================================================
27 // templated methods
28 // ============================================================================
29 #include "GaudiCommon.icpp"
30 // ============================================================================
31 template class GaudiCommon<AlgTool>;
32 // ============================================================================
39 // ============================================================================
40 namespace GaudiToolServices
41 {
43  const std::string s_EventDataSvc = "EventDataSvc" ;
45  const std::string s_DetectorDataSvc = "DetectorDataSvc" ;
47  const std::string s_ChronoStatSvc = "ChronoStatSvc" ;
49  const std::string s_IncidentSvc = "IncidentSvc" ;
51  const std::string s_HistoSvc = "HistogramDataSvc" ;
52 }
53 // ============================================================================
54 namespace GaudiToolLocal
55 {
56  // ==========================================================================
60  class Counter final
61  {
62  public:
63  // ========================================================================
64  // constructor
65  Counter ( std::string msg = " Misbalance ")
66  : m_message ( std::move(msg) )
67  {};
68  // destructor
69  ~Counter() { report(); }
70  // ========================================================================
71  public:
72  // ========================================================================
74  long increment ( const std::string& object ) { return ++m_map[object] ; }
76  long decrement ( const std::string& object ) { return --m_map[object] ; }
78  long counts ( const std::string& object ) { return m_map[object] ; }
80  void report() const
81  {
83  if ( !GaudiTool::summaryEnabled() ) { return ; } // RETURN
84  //
85  for ( const auto& entry : m_map )
86  {
87  if( entry.second ) {
88  std::cout << "GaudiTool WARNING " << m_message
89  << "'" << entry.first << "' Counts = " << entry.second
90  << std::endl ;
91  }
92  }
93  }
94  // ========================================================================
95  private:
96  // ========================================================================
97  typedef std::map<std::string,long> Map;
98  Map m_map ;
99  std::string m_message ;
100  // ========================================================================
101  };
102  // ==========================================================================
108  static Counter s_InstanceCounter ( " Create/Destroy (mis)balance " ) ;
109  // ==========================================================================
115  static Counter s_FinalizeCounter ( " Initialize/Finalize (mis)balance " ) ;
116  // ==========================================================================
117 }
118 // ============================================================================
120 // ============================================================================
121 bool GaudiTool::s_enableSummary = true ; // summary is enabled
122 // ============================================================================
123 // enable/disable summary
124 // ============================================================================
125 bool GaudiTool::enableSummary ( bool value ) // enable/disable summary
126 {
128  return summaryEnabled () ;
129 }
130 // ============================================================================
131 // is summary enabled?
132 // ============================================================================
133 bool GaudiTool::summaryEnabled () // is summary enabled?
134 { return s_enableSummary ; }
135 // ============================================================================
136 // Standard constructor
137 // ============================================================================
138 GaudiTool::GaudiTool ( const std::string& this_type ,
139  const std::string& this_name ,
140  const IInterface* parent )
141  : GaudiCommon<AlgTool> ( this_type , this_name , parent )
142  , m_local ( this_type + "/" + this_name )
143 {
144  declareProperty
145  ( "ContextService" ,
147  "The name of Algorithm Context Service" ) ;
148  // make instance counts
149  GaudiToolLocal::s_InstanceCounter.increment ( m_local ) ;
150 }
151 // ============================================================================
152 // destructor
153 // ============================================================================
155 {
156  GaudiToolLocal::s_InstanceCounter.decrement ( m_local ) ;
157 }
158 // ============================================================================
159 // standard initialization method
160 // ============================================================================
162 {
163  // initialize the base class
165  if ( sc.isFailure() ) { return sc; }
166 
167  // increment the counter
168  GaudiToolLocal::s_FinalizeCounter.increment( m_local ) ;
169 
170  // are we a public tool ?
171  m_isPublic = isPublic();
172 
173  // return
174  return sc;
175 }
176 // ============================================================================
177 // standard finalization method
178 // ============================================================================
180 {
181  if ( msgLevel(MSG::DEBUG) )
182  debug() << " ==> Finalize the base class GaudiTool " << endmsg;
183 
184  // clear "explicit services"
185  m_evtSvc = nullptr ;
186  m_detSvc = nullptr ;
187  m_chronoSvc = nullptr ;
188  m_incSvc = nullptr ;
189  m_histoSvc = nullptr ;
190 
191  // finalize the base class
193  if ( sc.isFailure() ) { return sc; }
194 
195  // Decrement the counter
196  GaudiToolLocal::s_FinalizeCounter.decrement( m_local ) ;
197 
198  // return
199  return sc;
200 }
201 // ============================================================================
202 // Determines if this tool is public or not (i.e. owned by the ToolSvc).
203 // ============================================================================
205 {
206  const IAlgTool * tool = this;
207  // Recurse down the ownership tree, to see with we ever end up at the ToolSvc
208  bool ownedByToolSvc = false;
209  unsigned int sanityCheck(0);
210  while ( tool && ++sanityCheck < 99999 )
211  {
212  ownedByToolSvc = ( NULL != dynamic_cast<const IToolSvc*>(tool->parent()) );
213  if ( ownedByToolSvc ) { break; }
214  // if parent is also a tool, try again
215  tool = dynamic_cast<const IAlgTool*>(tool->parent());
216  }
217  return ownedByToolSvc;
218 }
219 // ============================================================================
220 // accessor to detector service
221 // ============================================================================
223 {
224  if ( !m_detSvc )
225  {
226  m_detSvc =
227  svc<IDataProviderSvc>( GaudiToolServices::s_DetectorDataSvc , true ) ;
228  }
229  return m_detSvc ;
230 }
231 // ============================================================================
232 // The standard N-Tuple
233 // ============================================================================
235 {
236  if ( !m_ntupleSvc )
237  {
238  m_ntupleSvc = svc<INTupleSvc>( "NTupleSvc" , true ) ;
239  }
240  return m_ntupleSvc ;
241 }
242 // ============================================================================
243 // The standard event collection service
244 // ============================================================================
246 {
247  if ( !m_evtColSvc )
248  {
249  m_evtColSvc = svc< INTupleSvc > ( "EvtTupleSvc" , true ) ;
250  }
251  return m_evtColSvc ;
252 }
253 // ============================================================================
254 // accessor to event service service
255 // ============================================================================
257 {
258  if ( !m_evtSvc )
259  {
260  m_evtSvc =
261  svc<IDataProviderSvc>( GaudiToolServices::s_EventDataSvc , true ) ;
262  }
263  return m_evtSvc ;
264 }
265 // ============================================================================
266 // accessor to Incident Service
267 // ============================================================================
269 {
270  if ( !m_incSvc )
271  {
272  m_incSvc =
273  svc<IIncidentSvc> ( GaudiToolServices::s_IncidentSvc , true ) ;
274  }
275  return m_incSvc ;
276 }
277 // ============================================================================
278 // accessor to Chrono & Stat Service
279 // ============================================================================
281 {
282  if ( !m_chronoSvc )
283  {
284  m_chronoSvc =
285  svc<IChronoStatSvc> ( GaudiToolServices::s_ChronoStatSvc , true ) ;
286  }
287  return m_chronoSvc ;
288 }
289 // ============================================================================
290 // accessor to histogram Service
291 // ============================================================================
293 {
294  if ( !m_histoSvc )
295  {
296  m_histoSvc = svc<IHistogramSvc> ( GaudiToolServices::s_HistoSvc, true ) ;
297  }
298  return m_histoSvc;
299 }
300 // ============================================================================
301 // accessor to Algorithm Context Service
302 // ============================================================================
304 {
305  if ( !m_contextSvc )
306  {
307  m_contextSvc = svc<IAlgContextSvc> ( m_contextSvcName , true ) ;
308  }
309  return m_contextSvc;
310 }
311 // ============================================================================
312 // The END
313 // ============================================================================
IChronoStatSvc * chronoSvc() const
accessor to Chrono & Stat Service
Definition: GaudiTool.cpp:280
IIncidentSvc * incSvc() const
accessor to Incident Service
Definition: GaudiTool.cpp:268
The interface implemented by the IToolSvc base class.
Definition: IToolSvc.h:17
IAlgContextSvc * contextSvc() const
acessor to the Algorithm Context Service
Definition: GaudiTool.cpp:303
INTupleSvc * m_evtColSvc
pointer to the event tag collection service
Definition: GaudiTool.h:802
std::string m_contextSvcName
Algorithm Context Service.
Definition: GaudiTool.h:816
bool m_isPublic
Flag to say if the tool is a public or private tool.
Definition: GaudiTool.h:821
long counts(const std::string &object)
current count
Definition: GaudiTool.cpp:78
void report() const
make a report
Definition: GaudiTool.cpp:80
IHistogramSvc * histoSvc() const
acessor to the histogram service
Definition: GaudiTool.cpp:292
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:244
Counter(std::string msg=" Misbalance ")
Definition: GaudiTool.cpp:65
const std::string s_ChronoStatSvc
the default name for Chrono & Stat Service
Definition: GaudiTool.cpp:47
STL namespace.
static bool s_enableSummary
enable printout of summary?
Definition: GaudiTool.h:831
static bool enableSummary(bool)
enable/disable summary
Definition: GaudiTool.cpp:125
StatusCode finalize() override
standard finalization method
Data provider interface definition.
IDataProviderSvc * evtSvc() const
accessor to event service service
Definition: GaudiTool.cpp:256
INTupleSvc * ntupleSvc() const
Access the standard N-Tuple.
Definition: GaudiTool.cpp:234
bool isFailure() const
Test for a status code of FAILURE.
Definition: StatusCode.h:86
const std::string s_IncidentSvc
the default name for Incident Service
Definition: GaudiTool.cpp:49
Collection of default services names to be used for class GaudiTool.
The IChronoStatSvc is the interface implemented by the ChronoStatService.
INTupleSvc * evtColSvc() const
Access the standard event collection service.
Definition: GaudiTool.cpp:245
MsgStream & debug() const
shortcut for the method msgStream(MSG::DEBUG)
const std::string s_HistoSvc
the default name for Histogram Service
Definition: GaudiTool.cpp:51
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:26
IDataProviderSvc * m_detSvc
pointer to Detector Data Service
Definition: GaudiTool.h:806
Definition of the basic interface.
Definition: IInterface.h:234
GaudiTool()=delete
no default/copy constructor, no assignment
~GaudiTool() override
destructor, virtual and protected
Definition: GaudiTool.cpp:154
Definition of the IHistogramSvc interface class.
Definition: IHistogramSvc.h:47
bool isPublic() const
Determines if this tool is public or not (i.e. owned by the ToolSvc).
Definition: GaudiTool.cpp:204
long increment(const std::string &object)
make the increment
Definition: GaudiTool.cpp:74
const std::string s_DetectorDataSvc
the default name for Detector Data Service
Definition: GaudiTool.cpp:45
StatusCode initialize() override
standard initialization method
virtual const IInterface * parent() const =0
The parent of the concrete AlgTool.
std::map< std::string, long > Map
Definition: GaudiTool.cpp:97
IIncidentSvc * m_incSvc
pointer to Incident Service
Definition: GaudiTool.h:810
simple local counter
Definition: GaudiTool.cpp:60
IChronoStatSvc * m_chronoSvc
pointer to Chrono & Stat Service
Definition: GaudiTool.h:808
Base class from which all the concrete tool classes should be derived.
Definition: AlgTool.h:34
The interface implemented by the AlgTool base class.
Definition: IAlgTool.h:22
StatusCode finalize() override
standard finalization method
Definition: GaudiTool.cpp:179
IAlgContextSvc * m_contextSvc
Algorithm Context Service.
Definition: GaudiTool.h:814
const std::string s_EventDataSvc
the default name for Event Data Service
Definition: GaudiTool.cpp:43
An abstract interface for Algorithm Context Service.
const std::string m_local
full tool name "type/name"
Definition: GaudiTool.h:826
INTupleSvc * m_ntupleSvc
pointer to the N-Tuple service
Definition: GaudiTool.h:800
IDataProviderSvc * m_evtSvc
pointer to Event Data Service
Definition: GaudiTool.h:804
long decrement(const std::string &object)
make the decrement
Definition: GaudiTool.cpp:76
TOOL * tool(const std::string &type, const std::string &name, const IInterface *parent=0, bool create=true) const
Useful method for the easy location of tools.
static bool summaryEnabled()
is summary enabled?
Definition: GaudiTool.cpp:133
The interface implemented by the IncidentSvc service.
Definition: IIncidentSvc.h:21
StatusCode initialize() override
standard initialization method
Definition: GaudiTool.cpp:161
IDataProviderSvc * detSvc() const
accessor to detector service
Definition: GaudiTool.cpp:222
MSG::Level msgLevel() const
get the output level from the embedded MsgStream
IHistogramSvc * m_histoSvc
pointer for histogram service
Definition: GaudiTool.h:812