GaudiCommon.icpp
Go to the documentation of this file.
1 // ============================================================================
2 // include files
3 // ============================================================================
4 // STL & STD
5 // ============================================================================
6 #include <algorithm>
7 #include <numeric>
8 #include <cstdlib>
9 // ============================================================================
10 /* @file GaudiCommon.cpp
11  *
12  * Implementation file for class : GaudiCommon
13  *
14  * @author Chris Jones Christopher.Rob.Jones@cern.ch
15  * @author Vanya BELYAEV Ivan.Belyaev@itep.ru
16  * @author Rob Lambert Rob.Lambert@cern.ch
17  * @date 2009-08-04
18  */
19 // GaudiKernel
20 // ============================================================================
21 #include "GaudiKernel/AlgTool.h"
22 #include "GaudiKernel/Algorithm.h"
26 #include "GaudiKernel/IProperty.h"
28 #include "GaudiKernel/IToolSvc.h"
29 #include "GaudiKernel/MsgStream.h"
31 #include "GaudiKernel/Property.h"
33 #include "GaudiKernel/SmartRef.h"
34 #include "GaudiKernel/Stat.h"
35 #include "GaudiKernel/StatEntity.h"
36 #include "GaudiKernel/System.h"
37 #include "GaudiKernel/reverse.h"
38 // ============================================================================
39 // GaudiAlg
40 // ============================================================================
42 #include "GaudiAlg/GaudiCommon.h"
43 #include "GaudiAlg/GaudiTool.h"
44 #include "GaudiAlg/Print.h"
45 // ============================================================================
46 // GaudiUtils
47 // ============================================================================
48 #include "GaudiUtils/RegEx.h"
49 // ============================================================================
50 // Boost
51 // ============================================================================
52 #include "boost/format.hpp"
53 #include "boost/tokenizer.hpp"
54 // ============================================================================
55 // Disable warning on windows
56 #ifdef _WIN32
57 #pragma warning( disable : 4661 ) // incomplete explicit templates
58 #endif
59 // ============================================================================
60 
61 // ============================================================================
62 // constructor initialisation
63 // ============================================================================
64 template <class PBASE>
66 {
67  m_errorsPrint.declareUpdateHandler( &GaudiCommon<PBASE>::printErrorHandler, this );
68  m_propsPrint.declareUpdateHandler( &GaudiCommon<PBASE>::printPropsHandler, this );
69  m_statPrint.declareUpdateHandler( &GaudiCommon<PBASE>::printStatHandler, this );
70 
71  // setup context from parent if available
72  if ( parent ) {
73  if ( const GaudiAlgorithm* gAlg = dynamic_cast<const GaudiAlgorithm*>( parent ) ) {
74  m_context = gAlg->context();
75  m_rootInTES = gAlg->rootInTES();
76  } else if ( const GaudiTool* gTool = dynamic_cast<const GaudiTool*>( parent ) ) {
77  m_context = gTool->context();
78  m_rootInTES = gTool->rootInTES();
79  }
80  }
81 
82  // Get the job option service
83  auto jos = PBASE::template service<IJobOptionsSvc>("JobOptionsSvc");
84  if (!jos) Exception("Cannot get JobOptionsSvc");
85 
86  // Get the "Context" option if in the file...
87  const auto myList = jos->getProperties( this->name() );
88  if ( myList ) {
89  // Iterate over the list to set the options
90  for ( const auto& iter : *myList ) {
91  const Gaudi::Property<std::string>* sp = dynamic_cast<const Gaudi::Property<std::string>*>( iter );
92  if ( sp ) {
93  if ( iter->name().compare( "Context" ) == 0 ) {
94  m_context = sp->value();
95  } else if ( iter->name().compare( "RootInTES" ) == 0 ) {
96  m_rootInTES = sp->value();
97  }
98  }
99  }
100  }
101 }
102 //=============================================================================
103 
104 //=============================================================================
105 // Initialise the common functionality
106 //=============================================================================
107 template <class PBASE>
109 #ifdef __ICC
110  i_gcInitialize
111 #else
112  initialize
113 #endif
114  ()
115 {
116 
117  // initialize base class
118  const StatusCode sc = PBASE::initialize();
119  if ( sc.isFailure() ) {
120  return Error( "Failed to initialise base class PBASE", sc );
121  }
122 
123  // some debug printout
124  if ( this->msgLevel( MSG::DEBUG ) ) {
125  this->debug() << "Initialize base class GaudiCommon<" << System::typeinfoName( typeid( PBASE ) ) << ">" << endmsg;
126  if ( !context().empty() ) this->debug() << "Created with context = '" << context() << "'" << endmsg;
127  }
128 
129  // Check rootInTES ends with a /
130  if ( !m_rootInTES.empty() && m_rootInTES[m_rootInTES.size() - 1] != '/' ) m_rootInTES = m_rootInTES + "/";
131 
132  // Set up the CounterSummarySvc May need to be changed
133  m_counterSummarySvc = this->svcLoc()->service( "CounterSummarySvc", false );
134  if ( this->msgLevel( MSG::DEBUG ) ) {
135  if ( !m_counterSummarySvc )
136  this->debug() << "could not locate CounterSummarySvc, no counter summary will be made" << endmsg;
137  else
138  this->debug() << "found CounterSummarySvc OK" << endmsg;
139  }
140 
141  // properties will be printed if asked for or in "MSG::DEBUG" mode
142  if ( propsPrint() ) {
143  printProps( MSG::ALWAYS );
144  } else if ( this->msgLevel( MSG::DEBUG ) ) {
145  printProps( MSG::DEBUG );
146  }
147 
148  // update DataHandles to point to full TES location
149 
150  // get root of DataManager
151  SmartIF<IDataManagerSvc> dataMgrSvc( PBASE::evtSvc() );
152  auto rootName = dataMgrSvc->rootName();
153  if ( !rootName.empty() && '/' != rootName.back() ) rootName += "/";
154 
155  auto fixLocation = [this, rootName] ( const std::string & location ) -> std::string {
156  auto tokens = boost::tokenizer<boost::char_separator<char>>{location, boost::char_separator<char>{":"}};
157  auto result = std::accumulate( tokens.begin(), tokens.end(), std::string{},
158  [&](std::string s, const std::string& tok) {
159  std::string r = fullTESLocation(tok, UseRootInTES);
160  //check whether we have an absolute path if yes use it - else prepend DataManager Root
161  if (r[0]!='/') r = rootName + r;
162  return s.empty() ? r : s + ':' + r;
163  } );
164  if ( result != location && this->msgLevel( MSG::DEBUG ) )
165  this->debug() << "Changing " << location << " to " << result << endmsg;
166  return result;
167  };
168 
169  class DHHFixer : public IDataHandleVisitor
170  {
171  public:
172  DHHFixer( std::function<std::string( const std::string& )> f ): m_f( std::move( f ) ) {}
173  void visit( const IDataHandleHolder* idhh ) override {
174  if (!idhh) return;
175 
176  std::string r;
177  for ( auto h : idhh->inputHandles() ) {
178  r = m_f( h->objKey() );
179  if ( r != h->objKey() ) h->updateKey( r );
180  }
181  for ( auto h : idhh->outputHandles() ) {
182  r = m_f( h->objKey() );
183  if ( r != h->objKey() ) h->updateKey( r );
184  }
185  }
186 
187  private:
189  };
190 
191  this->m_updateDataHandles = std::make_unique<DHHFixer>( fixLocation );
192 
193  return sc;
194 }
195 //=============================================================================
196 
197 //=============================================================================
198 // Finalize the common functionality
199 //=============================================================================
200 template <class PBASE>
202 #ifdef __ICC
203  i_gcFinalize
204 #else
205  finalize
206 #endif
207  ()
208 {
210 
211  // print the general information about statistical counters
212  if ( this->msgLevel( MSG::DEBUG ) || ( statPrint() && !counters().empty() ) ) {
213  // print general statistical counters
214  printStat( statPrint() ? MSG::ALWAYS : MSG::DEBUG );
215  }
216  // add all counters to the CounterSummarySvc
217  if ( m_counterSummarySvc && this->svcLoc()->existsService( "CounterSummarySvc" ) ) {
218  if ( this->msgLevel( MSG::DEBUG ) ) this->debug() << "adding counters to CounterSummarySvc" << endmsg;
219 
220  Gaudi::Utils::RegEx::matchList statList{m_statEntityList.value()};
221  Gaudi::Utils::RegEx::matchList counterList{m_counterList.value()};
222 
223  for ( const auto& i : this->counters() ) {
224  if ( statList.Or( i.first ) )
225  m_counterSummarySvc->addCounter( this->name(), i.first, i.second, Gaudi::CounterSummary::SaveStatEntity );
226  else if ( counterList.Or( i.first ) )
227  m_counterSummarySvc->addCounter( this->name(), i.first, i.second );
228  }
229  }
230  // release all located tools and services
231  if ( this->msgLevel( MSG::DEBUG ) ) {
232  this->debug() << "Tools to release :";
233  for ( const auto& i : m_managedTools ) {
234  this->debug() << " " << i->name();
235  }
236  this->debug() << endmsg;
237  }
238  while ( !m_managedTools.empty() ) {
239  sc = releaseTool( m_managedTools.back() ) && sc;
240  }
241 
242  // release all located services
243  if ( this->msgLevel( MSG::DEBUG ) ) {
244  this->debug() << "Services to release :";
245  for ( const auto& i : m_services ) this->debug() << " " << i->name();
246  this->debug() << endmsg;
247  }
248  while ( !m_services.empty() ) {
249  sc = releaseSvc( m_services.front() ) && sc;
250  }
251 
252  // release the CounterSummarySvc manually
253  m_counterSummarySvc.reset();
254 
255  // format printout
256  if ( !m_errors.empty() || !m_warnings.empty() || !m_exceptions.empty() ) {
257  this->always() << "Exceptions/Errors/Warnings/Infos Statistics : " << m_exceptions.size() << "/" << m_errors.size()
258  << "/" << m_warnings.size() << "/" << m_infos.size() << endmsg;
259  if ( errorsPrint() ) {
260  printErrors();
261  }
262  }
263 
264  // clear *ALL* counters explicitly
265  m_counters.clear();
266  m_exceptions.clear();
267  m_infos.clear();
268  m_warnings.clear();
269  m_errors.clear();
270  m_counterList.clear();
271  m_statEntityList.clear();
272 
273  // finalize base class
274  return sc && PBASE::finalize();
275 }
276 //=============================================================================
277 
278 //=============================================================================
279 // Methods related to tools and services
280 //=============================================================================
281 
282 // ============================================================================
283 // manual forced (and 'safe') release of the active tool or service
284 // ============================================================================
285 template <class PBASE>
287 {
288  if ( !interface ) {
289  return Error( "release(IInterface):: IInterface* points to NULL!" );
290  }
291  // dispatch between tools and services
292  const IAlgTool* algTool = dynamic_cast<const IAlgTool*>( interface );
293  // perform the actual release
294  return algTool ? releaseTool( algTool ) : releaseSvc( interface );
295 }
296 // ============================================================================
297 
298 // ============================================================================
299 // manual forced (and 'save') release of the tool
300 // ============================================================================
301 template <class PBASE>
303 {
304  if ( !algTool ) {
305  return Error( "releaseTool(IAlgTool):: IAlgTool* points to NULL!" );
306  }
307  if ( !this->toolSvc() ) {
308  return Error( "releaseTool(IAlgTool):: IToolSvc* points to NULL!" );
309  }
310  // find a tool in the list of active tools
311  auto it = std::find( m_managedTools.begin(), m_managedTools.end(), algTool );
312  if ( m_managedTools.end() == it ) {
313  return Warning( "releaseTool(IAlgTool):: IAlgTool* is not active" );
314  }
315  // get the tool
316  IAlgTool* t = *it;
317  // cache name
318  const std::string name = t->name();
319  if ( this->msgLevel( MSG::DEBUG ) ) {
320  this->debug() << "Releasing tool '" << name << "'" << endmsg;
321  }
322  // remove the tool from the lists
323  PBASE::deregisterTool( t );
324  m_managedTools.erase( it );
325  // release tool
326  if ( this->msgLevel( MSG::DEBUG ) ) {
327  this->debug() << "The tool '" << t->name() << "' of type '" << System::typeinfoName( typeid( *t ) )
328  << "' is released" << endmsg;
329  }
330  const StatusCode sc = this->toolSvc()->releaseTool( t );
331  return sc.isSuccess() ? sc : Warning( "releaseTool(IAlgTool):: error from IToolSvc releasing " + name, sc );
332 }
333 // ============================================================================
334 
335 // ============================================================================
336 // manual forced (and 'safe') release of the service
337 // ============================================================================
338 template <class PBASE>
340 {
341  if ( !Svc ) return Error( "releaseSvc(IInterface):: IInterface* points to NULL!" );
342  SmartIF<IService> svc{const_cast<IInterface*>( Svc )};
343  if ( !svc ) return Warning( "releaseSvc(IInterface):: IInterface* is not a service" );
344  auto it = std::lower_bound( std::begin( m_services ), std::end( m_services ), svc, GaudiCommon_details::svc_lt );
345  if ( it == m_services.end() || !GaudiCommon_details::svc_eq( *it, svc ) ) {
346  return Warning( "releaseSvc(IInterface):: IInterface* is not active" );
347  }
348  if ( this->msgLevel( MSG::DEBUG ) ) {
349  this->debug() << "Releasing service '" << ( *it )->name() << "'" << endmsg;
350  }
351  m_services.erase( it );
352  return StatusCode::SUCCESS;
353 }
354 // ============================================================================
355 // ============================================================================
356 
357 // ============================================================================
358 // Add the given service to the list of active services
359 // ============================================================================
360 template <class PBASE>
362 {
363  if ( svc ) {
364  auto i = std::lower_bound( std::begin( m_services ), std::end( m_services ), svc, GaudiCommon_details::svc_lt );
365  if ( i == std::end( m_services ) || !GaudiCommon_details::svc_eq( *i, svc ) ) {
366  m_services.insert( i, std::move( svc ) );
367  } else {
368  this->warning() << "Service " << svc->name() << " already present -- skipping" << endmsg;
369  }
370  }
371 }
372 // ============================================================================
373 
374 //=============================================================================
375 // Methods related to messaging
376 //=============================================================================
377 
378 // ============================================================================
379 // Print the error message and return status code
380 // ============================================================================
381 template <class PBASE>
382 StatusCode GaudiCommon<PBASE>::Error( const std::string& msg, const StatusCode st, const size_t mx ) const
383 {
384  // increase local counter of errors
385  const size_t num = ++m_errors[msg];
386  // If suppressed, just return
387  if ( num > mx ) {
388  return st;
389  } else if ( UNLIKELY( num == mx ) ) // issue one-time suppression message
390  {
391  return Print( "The ERROR message is suppressed : '" + msg + "'", st, MSG::ERROR );
392  }
393  // return message
394  return Print( msg, st, MSG::ERROR );
395 }
396 // ============================================================================
397 
398 // ============================================================================
399 // Print the warning message and return status code
400 // ============================================================================
401 template <class PBASE>
402 StatusCode GaudiCommon<PBASE>::Warning( const std::string& msg, const StatusCode st, const size_t mx ) const
403 {
404  // increase local counter of warnings
405  const size_t num = ++m_warnings[msg];
406  // If suppressed, just return
407  if ( num > mx ) {
408  return st;
409  } else if ( UNLIKELY( num == mx ) ) // issue one-time suppression message
410  {
411  return Print( "The WARNING message is suppressed : '" + msg + "'", st, MSG::WARNING );
412  }
413  // return message
414  return Print( msg, st, MSG::WARNING );
415 }
416 // ============================================================================
417 
418 // ============================================================================
419 // Print the info message and return status code
420 // ============================================================================
421 template <class PBASE>
422 StatusCode GaudiCommon<PBASE>::Info( const std::string& msg, const StatusCode st, const size_t mx ) const
423 {
424  // increase local counter of warnings
425  const size_t num = ++m_infos[msg];
426  // If suppressed, just return
427  if ( num > mx ) {
428  return st;
429  } else if ( UNLIKELY( num == mx ) ) // issue one-time suppression message
430  {
431  return Print( "The INFO message is suppressed : '" + msg + "'", st, MSG::INFO );
432  }
433  // return message
434  return Print( msg, st, MSG::INFO );
435 }
436 // ============================================================================
437 
438 // ============================================================================
439 // Print the message and return status code
440 // ============================================================================
441 template <class PBASE>
443 {
444  // perform printout ?
445  if ( !this->msgLevel( lvl ) ) {
446  return st;
447  } // RETURN
448 
449  // use the predefined stream
450  MsgStream& str = this->msgStream( lvl );
451  if ( typePrint() ) {
452  str << System::typeinfoName( typeid( *this ) ) << ":: ";
453  }
454 
455  // print the message
456  str << msg;
457 
458  // test status code
459  if ( st.isSuccess() ) {
460  } else if ( StatusCode::FAILURE != st.getCode() ) {
461  str << " StatusCode=" << st.getCode();
462  } else {
463  str << " StatusCode=FAILURE";
464  }
465 
466  // perform print operation
467  str << endmsg;
468 
469  // return
470  return st;
471 }
472 // ============================================================================
473 
474 // ============================================================================
475 // Create and (re)-throw the exception
476 // ============================================================================
477 template <class PBASE>
478 void GaudiCommon<PBASE>::Exception( const std::string& msg, const GaudiException& exc, const StatusCode sc ) const
479 {
480  // increase local counter of exceptions
481  ++m_exceptions[msg];
482  Print( "Exception (re)throw: " + msg, sc, MSG::FATAL ).ignore();
483  throw GaudiException( this->name() + ":: " + msg, this->name(), sc, exc );
484 }
485 // ============================================================================
486 
487 // ============================================================================
488 // Create and (re)-throw the exception
489 // ============================================================================
490 template <class PBASE>
491 void GaudiCommon<PBASE>::Exception( const std::string& msg, const std::exception& exc, const StatusCode sc ) const
492 {
493  // increase local counter of exceptions
494  ++m_exceptions[msg];
495  Print( "Exception (re)throw: " + msg, sc, MSG::FATAL ).ignore();
496  throw GaudiException( this->name() + ":: " + msg + "(" + exc.what() + ")", "", sc );
497 }
498 // ============================================================================
499 
500 // ============================================================================
501 // Create and throw the exception
502 // ============================================================================
503 template <class PBASE>
505 {
506  // increase local counter of exceptions
507  ++m_exceptions[msg];
508  Print( "Exception throw: " + msg, sc, MSG::FATAL ).ignore();
509  throw GaudiException( this->name() + ":: " + msg, "", sc );
510 }
511 // ============================================================================
512 
513 // ============================================================================
514 // perform the actual printout of counters
515 // ============================================================================
516 template <class PBASE>
518 {
519  // print statistics
520  if ( counters().empty() ) {
521  return 0;
522  }
523  MsgStream& msg = this->msgStream( level );
524  //
525  msg << "Number of counters : " << counters().size();
526  //
527  if ( !counters().empty() ) {
528  msg << std::endl << m_header.value();
529  }
530  //
531  for ( const auto& entry : counters() ) {
532  msg << std::endl
533  << Gaudi::Utils::formatAsTableRow( entry.first, entry.second, m_useEffFormat, m_format1, m_format2 );
534  }
535  //
536  msg << endmsg;
537  //
538  return counters().size();
539 }
540 // ============================================================================
541 
542 // ============================================================================
543 // perform the actual printout of error counters
544 // ============================================================================
545 template <class PBASE>
547 {
548  // format for printout
549  boost::format ftm( " #%|-10s| = %|.8s| %|23t| Message = '%s'" );
550 
551  auto print = [&]( const Counter& c, const std::string& label ) {
552  for ( const auto& i : c ) {
553  this->msgStream( level ) << ( ftm % label % i.second % i.first ) << endmsg;
554  }
555  };
556 
557  print( m_exceptions, "EXCEPTIONS" );
558  print( m_errors, "ERRORS" );
559  print( m_warnings, "WARNINGS" );
560  print( m_infos, "INFOS" );
561 
562  // return total number of errors+warnings+exceptions
563  return m_exceptions.size() + m_errors.size() + m_warnings.size() + m_infos.size();
564 }
565 // ============================================================================
566 
567 // ============================================================================
571 // ============================================================================
572 template <class PBASE>
574 {
575 
576  // print ALL properties
577  MsgStream& msg = this->msgStream( level );
578  const auto& properties = this->getProperties();
579  msg << "List of ALL properties of " << System::typeinfoName( typeid( *this ) ) << "/" << this->name()
580  << " #properties = " << properties.size() << endmsg;
581  for ( const auto& property : reverse( properties ) ) {
582  msg << "Property ['Name': Value] = " << *property << endmsg;
583  }
584  return properties.size();
585 }
586 // ============================================================================
587 
588 // ============================================================================
589 // Methods for dealing with the TES and TDS
590 // ============================================================================
591 
592 // ============================================================================
593 // put results into Gaudi Event Transient Store
594 // ============================================================================
595 template <class PBASE>
597  const bool useRootInTES ) const
598 {
599  // check arguments
600  Assert( svc, "put():: Invalid 'service'!" );
601  Assert( object, "put():: Invalid 'Object'!" );
602  Assert( !location.empty(), "put():: Invalid 'address' = '' " );
603  // final data location
604  const std::string& fullLocation = fullTESLocation( location, useRootInTES );
605  // register the object!
606  const StatusCode status = '/' == fullLocation[0] ? svc->registerObject( fullLocation, object )
607  : svc->registerObject( "/Event/" + fullLocation, object );
608  // check the result!
609  if ( status.isFailure() ) {
610  Exception( "put():: could not register '" + System::typeinfoName( typeid( *object ) ) + "' at address '" +
611  fullLocation + "'",
612  status );
613  }
614  if ( this->msgLevel( MSG::DEBUG ) ) {
615  Print( "The object of type '" + System::typeinfoName( typeid( *object ) ) + "' is registered in TS at address '" +
616  fullLocation + "'",
617  status, MSG::DEBUG )
618  .ignore();
619  }
620  return object;
621 }
622 // ============================================================================
623 
624 // ============================================================================
625 // Handle method for changes in the 'ErrorsPrint'
626 // ============================================================================
627 template <class PBASE>
629 {
630  // no action if not yet initialized
631  if ( this->FSMState() < Gaudi::StateMachine::INITIALIZED ) {
632  return;
633  }
634  if ( this->errorsPrint() ) {
635  this->printErrors();
636  }
637 }
638 // ============================================================================
639 // Handle method for changes in the 'PropertiesPrint'
640 // ============================================================================
641 template <class PBASE>
643 {
644  // no action if not yet initialized
645  if ( this->FSMState() < Gaudi::StateMachine::INITIALIZED ) {
646  return;
647  }
648  if ( this->propsPrint() ) {
649  this->printProps( MSG::ALWAYS );
650  }
651 }
652 // ============================================================================
653 // Handle method for changes in the 'StatPrint'
654 // ============================================================================
655 template <class PBASE>
657 {
658  // no action if not yet initialized
659  if ( this->FSMState() < Gaudi::StateMachine::INITIALIZED ) {
660  return;
661  }
662  if ( this->statPrint() ) {
663  this->printStat( MSG::ALWAYS );
664  }
665 }
666 // ============================================================================
667 
668 // ============================================================================
669 // The END
670 // ============================================================================
Definition of the MsgStream class used to transmit messages.
Definition: MsgStream.h:24
void printErrorHandler(Gaudi::Details::PropertyBase &)
handler for "ErrorPrint" property
T empty(T...args)
virtual const std::string & rootName() const =0
Get Name of root Event.
Header file for class GaudiAlgorithm.
Define general base for Gaudi exception.
void printStatHandler(Gaudi::Details::PropertyBase &)
handler for "StatPrint" property
GAUDI_API std::string format(const char *,...)
MsgStream format utility "a la sprintf(...)".
Definition: MsgStream.cpp:119
StatusCode releaseSvc(const IInterface *svc) const
manual forced (and &#39;safe&#39;) release of the service
DataObject * put(IDataProviderSvc *svc, DataObject *object, const std::string &location, const bool useRootInTES=true) const
Register a data object or container into Gaudi Event Transient Store.
Implementation of property with value of concrete type.
Definition: Property.h:314
unsigned long getCode() const
Get the status code by value.
Definition: StatusCode.h:91
GAUDI_API const std::string typeinfoName(const std::type_info &)
Get platform independent information about the class type.
Definition: System.cpp:299
void addToServiceList(SmartIF< IService > svc) const
Add the given service to the list of acquired services.
constexpr const struct GaudiCommon_details::svc_eq_t svc_eq
bool isSuccess() const
Test for a status code of SUCCESS.
Definition: StatusCode.h:74
StatusCode Error(const std::string &msg, const StatusCode st=StatusCode::FAILURE, const size_t mx=10) const
Print the error message and return with the given StatusCode.
Header file for class GaudiAlgorithm.
T endl(T...args)
Gaudi::Details::PropertyBase * property(const std::string &name) const
#define UNLIKELY(x)
Definition: Kernel.h:126
void printPropsHandler(Gaudi::Details::PropertyBase &)
handler for "PropertiesPrint" property
T end(T...args)
Data provider interface definition.
T lower_bound(T...args)
bool isFailure() const
Test for a status code of FAILURE.
Definition: StatusCode.h:84
GAUDI_API std::string formatAsTableRow(const StatEntity &counter, const bool flag, const std::string &format1=" |%|7d| |%|11.7g| |%|#11.5g| |%|#10.5g| |%|#10.5g| |%|#10.5g| |", const std::string &format2="*|%|7d| |%|11.5g| |(%|#9.7g| +- %|-#8.6g|)%%| ----- | ----- |")
print the counter in a form of the table row
Definition: StatEntity.cpp:299
STL class.
virtual std::vector< Gaudi::DataHandle * > inputHandles() const =0
virtual std::vector< Gaudi::DataHandle * > outputHandles() const =0
virtual void visit(const IDataHandleHolder *)=0
constexpr const struct GaudiCommon_details::svc_lt_t svc_lt
T what(T...args)
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:26
Definition of the basic interface.
Definition: IInterface.h:234
StatusCode Print(const std::string &msg, const StatusCode st=StatusCode::SUCCESS, const MSG::Level lev=MSG::INFO) const
Print the message and return with the given StatusCode.
The useful base class for data processing algorithms.
StatusCode Warning(const std::string &msg, const StatusCode st=StatusCode::FAILURE, const size_t mx=10) const
Print the warning message and return with the given StatusCode.
collection of useful utilities to print certain objects (currently used for implementation in class G...
PropertyBase base class allowing PropertyBase* collections to be "homogeneous".
Definition: Property.h:32
STL class.
T move(T...args)
reverse_wrapper< T > reverse(T &&iterable)
Definition: reverse.h:33
T find(T...args)
T begin(T...args)
void print(string text)
Definition: mergesort.cpp:33
StatusCode releaseTool(const IAlgTool *tool) const
manual forced (and &#39;safe&#39;) release of the tool
The interface implemented by the AlgTool base class.
Definition: IAlgTool.h:23
string s
Definition: gaudirun.py:245
The useful base class for tools.
Definition: GaudiTool.h:101
Implements the common functionality between GaudiTools and GaudiAlgorithms.
Definition: GaudiCommon.h:80
StatusCode Info(const std::string &msg, const StatusCode st=StatusCode::SUCCESS, const size_t mx=10) const
Print the info message and return with the given StatusCode.
const ValueType & value() const
Backward compatibility (.
Definition: Property.h:463
long printStat(const MSG::Level level=MSG::ALWAYS) const
perform the actual printout of statistical counters
T accumulate(T...args)
virtual StatusCode registerObject(const std::string &fullPath, DataObject *pObject)=0
Register object with the data store.
const std::vector< Gaudi::Details::PropertyBase * > & getProperties() const override
get all properties
A DataObject is the base class of any identifiable object on any data store.
Definition: DataObject.h:30
StatusCode release(const IInterface *interface) const
Manual forced (and &#39;safe&#39;) release of the active tool or service.
long printProps(const MSG::Level level=MSG::ALWAYS) const
perform the actual printout of properties
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:244
virtual const std::string & name() const =0
Retrieve the name of the instance.
void initGaudiCommonConstructor(const IInterface *parent=nullptr)
Constructor initializations.
long printErrors(const MSG::Level level=MSG::ALWAYS) const
perform the actual printout of error counters
void Exception(const std::string &msg, const GaudiException &exc, const StatusCode sc=StatusCode(StatusCode::FAILURE, true)) const
Create and (re)-throw a given GaudiException.