The Gaudi Framework  v36r6 (b1ee9983)
Algorithm.cpp
Go to the documentation of this file.
1 /***********************************************************************************\
2 * (c) Copyright 1998-2019 CERN for the benefit of the LHCb and ATLAS collaborations *
3 * *
4 * This software is distributed under the terms of the Apache version 2 licence, *
5 * copied verbatim in the file "LICENSE". *
6 * *
7 * In applying this licence, CERN does not waive the privileges and immunities *
8 * granted to it by virtue of its status as an Intergovernmental Organization *
9 * or submit itself to any jurisdiction. *
10 \***********************************************************************************/
11 #include <Gaudi/Algorithm.h>
12 
13 #include <algorithm>
14 #include <numeric>
15 #include <set>
16 
27 #include "GaudiKernel/INTupleSvc.h"
30 #include "GaudiKernel/IToolSvc.h"
31 #include "GaudiKernel/Kernel.h"
32 
33 #include "GaudiKernel/AlgTool.h"
34 #include "GaudiKernel/Chrono.h"
37 #include "GaudiKernel/Guards.h"
38 #include "GaudiKernel/MsgStream.h"
40 #include "GaudiKernel/Stat.h"
41 #include "GaudiKernel/StringKey.h"
42 #include "GaudiKernel/ToolHandle.h"
43 
44 namespace Gaudi {
45  namespace Details {
47  assert( loc != nullptr );
48  Gaudi::Property<bool> audit{ false };
49  auto appMgr = loc->service<IProperty>( "ApplicationMgr" );
50  if ( appMgr && appMgr->hasProperty( "AuditAlgorithms" ) ) {
51  audit.assign( appMgr->getProperty( "AuditAlgorithms" ) );
52  }
53  return audit.value();
54  }
55  } // namespace Details
56 
57  // IAlgorithm implementation
59 
60  // Bypass the initialization if the algorithm
61  // has already been initialized.
63 
64  // this initializes the messaging, in case property update handlers need to print
65  // and update the property value bypassing the update handler
67 
68  // Set the Algorithm's properties
69  bindPropertiesTo( serviceLocator()->getOptsSvc() );
70 
71  // Bypass the initialization if the algorithm is disabled.
72  // Need to do this after setProperties.
73  if ( !isEnabled() ) return StatusCode::SUCCESS;
74 
76 
77  // TODO: (MCl) where should we do this? initialize or start?
78  // Reset Error count
79  // m_errorCount = 0;
80 
81  // lock the context service
82  Gaudi::Utils::AlgContext cnt( this, registerContext() ? contextSvc().get() : nullptr );
83 
84  // Get WhiteBoard interface if implemented by EventDataSvc
85  m_WB = service( "EventDataSvc" );
86 
87  // check whether timeline should be done
88  m_doTimeline = timelineSvc()->isEnabled();
89 
90  StatusCode sc;
91  // Invoke initialize() method of the derived class inside a try/catch clause
92  try {
93 
94  { // limit the scope of the guard
95  Gaudi::Guards::AuditorGuard guard( this,
96  // check if we want to audit the initialize
97  ( m_auditorInitialize ) ? auditorSvc().get() : nullptr,
99  // Invoke the initialize() method of the derived class
100  sc = initialize();
101  }
102 
103  if ( sc.isSuccess() ) {
104  // Update the state.
106  }
107  } catch ( const GaudiException& Exception ) {
108  fatal() << " Exception with tag=" << Exception.tag() << " is caught " << endmsg;
109  error() << Exception << endmsg;
110  Stat stat( chronoSvc(), Exception.tag() );
111  sc = StatusCode::FAILURE;
112  } catch ( const std::exception& Exception ) {
113  fatal() << " Standard std::exception is caught " << endmsg;
114  error() << Exception.what() << endmsg;
115  Stat stat( chronoSvc(), "*std::exception*" );
116  sc = StatusCode::FAILURE;
117  } catch ( ... ) {
118  fatal() << "UNKNOWN Exception is caught " << endmsg;
119  Stat stat( chronoSvc(), "*UNKNOWN Exception*" );
120  sc = StatusCode::FAILURE;
121  }
122 
123  algExecStateSvc()->addAlg( this );
124 
125  //
127  //
128 
129  // ignore this step if we're a Sequence
130  if ( this->isSequence() ) { return sc; }
131 
132  if ( msgLevel( MSG::DEBUG ) ) {
133  debug() << "input handles: " << inputHandles().size() << endmsg;
134  debug() << "output handles: " << outputHandles().size() << endmsg;
135  }
136 
137  // check for explicit circular data dependencies in declared handles
139  for ( auto& h : outputHandles() ) {
140  if ( !h->objKey().empty() ) out.emplace( h->fullKey() );
141  }
142  for ( auto& h : inputHandles() ) {
143  if ( !h->objKey().empty() && out.find( h->fullKey() ) != out.end() ) {
144  // TODO: this case leads to a segfault as the SC, seemingly, is not propagated up properly
145  error() << "Explicit circular data dependency detected for id " << h->fullKey() << endmsg;
146  sc = StatusCode::FAILURE;
147  }
148  }
149 
150  if ( !sc ) return sc;
151 
153 
154  // visit all sub-algs and tools, build full set. First initialize ToolHandles if needed
155  try {
157  } catch ( const GaudiException& Exception ) {
158  error() << "Failing initializing ToolHandles : " << Exception << endmsg;
159  return StatusCode::FAILURE;
160  }
162  acceptDHVisitor( &avis );
163 
164  // check for implicit circular data deps from child Algs/AlgTools
165  for ( auto& h : m_outputDataObjs ) {
166  auto i = m_inputDataObjs.find( h );
167  if ( i != m_inputDataObjs.end() ) {
168  if ( m_filterCircDeps ) {
169  warning() << "Implicit circular data dependency detected for id " << h << endmsg;
170  m_inputDataObjs.erase( i );
171  } else {
172  error() << "Implicit circular data dependency detected for id " << h << endmsg;
173  sc = StatusCode::FAILURE;
174  }
175  }
176  }
177 
178  if ( !sc ) return sc;
179 
180  if ( msgLevel( MSG::DEBUG ) ) {
181  // sort out DataObjects by path so that logging is reproducable
182  // we define a little helper creating an ordered set from a non ordered one
183  auto sort = []( const DataObjID a, const DataObjID b ) -> bool { return a.fullKey() < b.fullKey(); };
184  auto orderset = [&sort]( const DataObjIDColl& in ) -> std::set<DataObjID, decltype( sort )> {
185  return { in.begin(), in.end(), sort };
186  };
187  // Logging
188  debug() << "Data Deps for " << name();
189  for ( auto h : orderset( m_inputDataObjs ) ) { debug() << "\n + INPUT " << h; }
190  for ( auto id : orderset( avis.ignoredInpKeys() ) ) { debug() << "\n + INPUT IGNORED " << id; }
191  for ( auto h : orderset( m_outputDataObjs ) ) { debug() << "\n + OUTPUT " << h; }
192  for ( auto id : orderset( avis.ignoredOutKeys() ) ) { debug() << "\n + OUTPUT IGNORED " << id; }
193  debug() << endmsg;
194  }
195 
196  // initialize handles
198 
199  return sc;
200  }
201 
203  vis->visit( this );
204 
205  // loop through tools
206  for ( auto tool : tools() ) vis->visit( dynamic_cast<AlgTool*>( tool ) );
207  }
208 
209  // IAlgorithm implementation
211 
212  // Bypass the startup if already running or disabled.
214 
216 
217  // lock the context service
218  Gaudi::Utils::AlgContext cnt( this, registerContext() ? contextSvc().get() : nullptr );
219 
221  // Invoke start() method of the derived class inside a try/catch clause
222  try {
223  { // limit the scope of the guard
224  Gaudi::Guards::AuditorGuard guard( this,
225  // check if we want to audit the initialize
226  ( m_auditorStart ) ? auditorSvc().get() : nullptr, IAuditor::Start );
227  // Invoke the start() method of the derived class
228  sc = start();
229  }
230  if ( sc.isSuccess() ) {
231  // Update the state.
233  }
234  } catch ( const GaudiException& Exception ) {
235  fatal() << "in sysStart(): exception with tag=" << Exception.tag() << " is caught" << endmsg;
236  error() << Exception << endmsg;
237  Stat stat( chronoSvc(), Exception.tag() );
238  sc = StatusCode::FAILURE;
239  } catch ( const std::exception& Exception ) {
240  fatal() << "in sysStart(): standard std::exception is caught" << endmsg;
241  error() << Exception.what() << endmsg;
242  Stat stat( chronoSvc(), "*std::exception*" );
243  sc = StatusCode::FAILURE;
244  } catch ( ... ) {
245  fatal() << "in sysStart(): UNKNOWN Exception is caught" << endmsg;
246  Stat stat( chronoSvc(), "*UNKNOWN Exception*" );
247  sc = StatusCode::FAILURE;
248  }
249 
250  return sc;
251  }
252 
253  // IAlgorithm implementation
255 
256  // Bypass the initialization if the algorithm is disabled.
257  if ( !isEnabled() ) return StatusCode::SUCCESS;
258 
259  // Check that the current status is the correct one.
261  error() << "sysReinitialize(): cannot reinitialize algorithm not initialized" << endmsg;
262  return StatusCode::FAILURE;
263  }
264 
265  // Reset Error count
266  // m_errorCount = 0; // done during start
267 
268  // lock the context service
269  Gaudi::Utils::AlgContext cnt( this, registerContext() ? contextSvc().get() : nullptr );
270 
272  // Invoke reinitialize() method of the derived class inside a try/catch clause
273  try {
274  Gaudi::Guards::AuditorGuard guard( this,
275  // check if we want to audit the initialize
276  ( m_auditorReinitialize ) ? auditorSvc().get() : nullptr,
278  // Invoke the reinitialize() method of the derived class
279  sc = reinitialize();
280  } catch ( const GaudiException& Exception ) {
281  fatal() << "sysReinitialize(): Exception with tag=" << Exception.tag() << " is caught" << endmsg;
282  error() << Exception << endmsg;
283  Stat stat( chronoSvc(), Exception.tag() );
284  sc = StatusCode::FAILURE;
285  } catch ( const std::exception& Exception ) {
286  fatal() << "sysReinitialize(): Standard std::exception is caught" << endmsg;
287  error() << Exception.what() << endmsg;
288  Stat stat( chronoSvc(), "*std::exception*" );
289  sc = StatusCode::FAILURE;
290  } catch ( ... ) {
291  fatal() << "sysReinitialize(): UNKNOWN Exception is caught" << endmsg;
292  Stat stat( chronoSvc(), "*UNKNOWN Exception*" );
293  sc = StatusCode::FAILURE;
294  }
295 
296  return sc;
297  }
298 
299  // IAlgorithm implementation
301 
302  // Bypass the initialization if the algorithm is disabled.
303  if ( !isEnabled() ) return StatusCode::SUCCESS;
304 
305  // Check that the current status is the correct one.
307  error() << "sysRestart(): cannot restart algorithm not started" << endmsg;
308  return StatusCode::FAILURE;
309  }
310 
311  // lock the context service
312  Gaudi::Utils::AlgContext cnt( this, registerContext() ? contextSvc().get() : nullptr );
313 
315  // Invoke reinitialize() method of the derived class inside a try/catch clause
316  try {
317  Gaudi::Guards::AuditorGuard guard( this,
318  // check if we want to audit the initialize
319  ( m_auditorRestart ) ? auditorSvc().get() : nullptr, IAuditor::ReStart );
320  // Invoke the reinitialize() method of the derived class
321  sc = restart();
322  } catch ( const GaudiException& Exception ) {
323  fatal() << "sysRestart(): Exception with tag=" << Exception.tag() << " is caught" << endmsg;
324  error() << Exception << endmsg;
325  Stat stat( chronoSvc(), Exception.tag() );
326  sc = StatusCode::FAILURE;
327  } catch ( const std::exception& Exception ) {
328  fatal() << "sysRestart(): Standard std::exception is caught" << endmsg;
329  error() << Exception.what() << endmsg;
330  Stat stat( chronoSvc(), "*std::exception*" );
331  sc = StatusCode::FAILURE;
332  } catch ( ... ) {
333  fatal() << "sysRestart(): UNKNOWN Exception is caught" << endmsg;
334  Stat stat( chronoSvc(), "*UNKNOWN Exception*" );
335  sc = StatusCode::FAILURE;
336  }
337 
338  return sc;
339  }
340 
342  if ( !isEnabled() ) {
343  if ( msgLevel( MSG::VERBOSE ) ) { verbose() << ".sysExecute(): is not enabled. Skip execution" << endmsg; }
344  return StatusCode::SUCCESS;
345  }
346 
347  AlgExecState& algState = execState( ctx );
348  algState.setState( AlgExecState::State::Executing );
349  StatusCode status;
350 
351  // Should performance profile be performed ?
352  // invoke execute() method of Algorithm class
353  // and catch all uncaught exceptions
354 
355  // lock the context service
356  Gaudi::Utils::AlgContext cnt( this, registerContext() ? contextSvc().get() : nullptr, ctx );
357 
358  Gaudi::Guards::AuditorGuard guard( this,
359  // check if we want to audit the initialize
360  ( m_auditorExecute ) ? auditorSvc().get() : nullptr, IAuditor::Execute, status );
361 
362  try {
363  ITimelineSvc::TimelineRecorder timelineRecoder;
364  if ( m_doTimeline ) { timelineRecoder = timelineSvc()->getRecorder( name(), ctx ); }
365 
366  status = execute( ctx );
367 
369  algState.setFilterPassed( false );
370  } else if ( status.isFailure() ) {
371  status = exceptionSvc()->handleErr( *this, status );
372  }
373 
374  } catch ( const GaudiException& Exception ) {
375 
376  if ( Exception.code() == StatusCode::FAILURE ) {
377  fatal();
378  } else {
379  error() << " Recoverable";
380  }
381 
382  msgStream() << " Exception with tag=" << Exception.tag() << " is caught " << endmsg;
383 
384  error() << Exception << endmsg;
385 
386  // Stat stat( chronoSvc() , Exception.tag() ) ;
387  status = exceptionSvc()->handle( *this, Exception );
388  } catch ( const std::exception& Exception ) {
389 
390  fatal() << " Standard std::exception is caught " << endmsg;
391  error() << Exception.what() << endmsg;
392  // Stat stat( chronoSvc() , "*std::exception*" ) ;
393  status = exceptionSvc()->handle( *this, Exception );
394  } catch ( ... ) {
395 
396  fatal() << "UNKNOWN Exception is caught " << endmsg;
397  // Stat stat( chronoSvc() , "*UNKNOWN Exception*" ) ;
398 
399  status = exceptionSvc()->handle( *this );
400  }
401 
402  if ( status.isFailure() ) {
403  // Increment the error count
404  unsigned int nerr = m_aess->incrementErrorCount( this );
405  // Check if maximum is exeeded
406  if ( nerr < m_errorMax ) {
407  warning() << "Continuing from error (cnt=" << nerr << ", max=" << m_errorMax << ")" << endmsg;
408  // convert to success
409  status = StatusCode::SUCCESS;
410  } else {
411  error() << "Maximum number of errors (" << m_errorMax << ") reached." << endmsg;
412  }
413  }
414 
415  algState.setState( AlgExecState::State::Done, status );
416 
417  return status;
418  }
419 
420  // IAlgorithm implementation
422 
423  // Bypass the startup if already running or disabled.
425 
427 
428  // lock the context service
429  Gaudi::Utils::AlgContext cnt( this, registerContext() ? contextSvc().get() : nullptr );
430 
432  // Invoke stop() method of the derived class inside a try/catch clause
433  try {
434  { // limit the scope of the guard
435  Gaudi::Guards::AuditorGuard guard( this,
436  // check if we want to audit the initialize
437  ( m_auditorStop ) ? auditorSvc().get() : nullptr, IAuditor::Stop );
438 
439  // Invoke the stop() method of the derived class
440  sc = stop();
441  }
442  if ( sc.isSuccess() ) {
443  // Update the state.
445  }
446  } catch ( const GaudiException& Exception ) {
447  fatal() << "in sysStop(): exception with tag=" << Exception.tag() << " is caught" << endmsg;
448  error() << Exception << endmsg;
449  Stat stat( chronoSvc(), Exception.tag() );
450  sc = StatusCode::FAILURE;
451  } catch ( const std::exception& Exception ) {
452  fatal() << "in sysStop(): standard std::exception is caught" << endmsg;
453  error() << Exception.what() << endmsg;
454  Stat stat( chronoSvc(), "*std::exception*" );
455  sc = StatusCode::FAILURE;
456  } catch ( ... ) {
457  fatal() << "in sysStop(): UNKNOWN Exception is caught" << endmsg;
458  Stat stat( chronoSvc(), "*UNKNOWN Exception*" );
459  sc = StatusCode::FAILURE;
460  }
461 
462  return sc;
463  }
464 
466 
467  // Bypass the finalialization if the algorithm hasn't been initilized.
469 
471 
472  // lock the context service
473  Gaudi::Utils::AlgContext cnt( this, registerContext() ? contextSvc().get() : nullptr );
474 
476  // Invoke finalize() method of the derived class inside a try/catch clause
477  try {
478  { // limit the scope of the guard
479  Gaudi::Guards::AuditorGuard guard( this,
480  // check if we want to audit the initialize
481  ( m_auditorFinalize ) ? auditorSvc().get() : nullptr, IAuditor::Finalize );
482  // Invoke the finalize() method of the derived class
483  sc = finalize();
484  }
485  if ( sc.isSuccess() ) {
486  // Indicate that this Algorithm has been finalized to prevent duplicate attempts
488  }
489  } catch ( const GaudiException& Exception ) {
490  fatal() << " Exception with tag=" << Exception.tag() << " is caught " << endmsg;
491  error() << Exception << endmsg;
492  Stat stat( chronoSvc(), Exception.tag() );
493  sc = StatusCode::FAILURE;
494  } catch ( const std::exception& Exception ) {
495  fatal() << " Standard std::exception is caught " << endmsg;
496  error() << Exception.what() << endmsg;
497  Stat stat( chronoSvc(), "*std::exception*" );
498  sc = StatusCode::FAILURE;
499  } catch ( ... ) {
500  fatal() << "UNKNOWN Exception is caught " << endmsg;
501  Stat stat( chronoSvc(), "*UNKNOWN Exception*" );
502  sc = StatusCode::FAILURE;
503  }
504  return sc;
505  }
506 
508  /* @TODO
509  * MCl 2008-10-23: the implementation of reinitialize as finalize+initialize
510  * is causing too many problems
511  *
512  // Default implementation is finalize+initialize
513  StatusCode sc = finalize();
514  if (sc.isFailure()) {
515  error() << "reinitialize(): cannot be finalized" << endmsg;
516  return sc;
517  }
518  sc = initialize();
519  if (sc.isFailure()) {
520  error() << "reinitialize(): cannot be initialized" << endmsg;
521  return sc;
522  }
523  */
524  return StatusCode::SUCCESS;
525  }
526 
528  // Default implementation is stop+start
529  StatusCode sc = stop();
530  if ( sc.isFailure() ) {
531  error() << "restart(): cannot be stopped" << endmsg;
532  return sc;
533  }
534  sc = start();
535  if ( sc.isFailure() ) {
536  error() << "restart(): cannot be started" << endmsg;
537  return sc;
538  }
539  return StatusCode::SUCCESS;
540  }
541 
542  const std::string& Algorithm::name() const { return m_name.str(); }
543 
544  const Gaudi::StringKey& Algorithm::nameKey() const { return m_name; }
545 
546  const std::string& Algorithm::version() const { return m_version; }
547 
548  unsigned int Algorithm::index() const { return m_index; }
549 
550  void Algorithm::setIndex( const unsigned int& idx ) { m_index = idx; }
551 
552  bool Algorithm::isEnabled() const { return m_isEnabled; }
553 
555  return algExecStateSvc()->algExecState( const_cast<IAlgorithm*>( (const IAlgorithm*)this ), ctx );
556  }
557 
558  template <typename IFace>
559  SmartIF<IFace>& Algorithm::get_svc_( SmartIF<IFace>& p, const char* service_name ) const {
560  if ( !p ) {
561  p = this->service( service_name );
562  if ( !p ) {
563  throw GaudiException( "Service [" + std::string{ service_name } + "] not found", this->name(),
565  }
566  }
567  return p;
568  }
569 
570  SmartIF<IAlgExecStateSvc>& Algorithm::algExecStateSvc() const { return get_svc_( m_aess, "AlgExecStateSvc" ); }
571  SmartIF<IAuditorSvc>& Algorithm::auditorSvc() const { return get_svc_( m_pAuditorSvc, "AuditorSvc" ); }
572  SmartIF<IChronoStatSvc>& Algorithm::chronoSvc() const { return get_svc_( m_CSS, "ChronoStatSvc" ); }
573  SmartIF<IDataProviderSvc>& Algorithm::detSvc() const { return get_svc_( m_DDS, "DetectorDataSvc" ); }
574  SmartIF<IConversionSvc>& Algorithm::detCnvSvc() const { return get_svc_( m_DCS, "DetectorPersistencySvc" ); }
575  SmartIF<IDataProviderSvc>& Algorithm::eventSvc() const { return get_svc_( m_EDS, "EventDataSvc" ); }
576  SmartIF<IConversionSvc>& Algorithm::eventCnvSvc() const { return get_svc_( m_ECS, "EventPersistencySvc" ); }
577  SmartIF<IHistogramSvc>& Algorithm::histoSvc() const { return get_svc_( m_HDS, "HistogramDataSvc" ); }
578  SmartIF<INTupleSvc>& Algorithm::ntupleSvc() const { return get_svc_( m_NTS, "NTupleSvc" ); }
579  SmartIF<IRndmGenSvc>& Algorithm::randSvc() const { return get_svc_( m_RGS, "RndmGenSvc" ); }
580  SmartIF<IToolSvc>& Algorithm::toolSvc() const { return get_svc_( m_ptoolSvc, "ToolSvc" ); }
581  SmartIF<IExceptionSvc>& Algorithm::exceptionSvc() const { return get_svc_( m_EXS, "ExceptionSvc" ); }
582  SmartIF<IAlgContextSvc>& Algorithm::contextSvc() const { return get_svc_( m_contextSvc, "AlgContextSvc" ); }
584  SmartIF<IHiveWhiteBoard>& Algorithm::whiteboard() const { return get_svc_( m_WB, "EventDataSvc" ); }
585 
587  return *const_cast<SmartIF<ISvcLocator>*>( &m_pSvcLocator );
588  }
589 
591 
592  auto init_one = [&]( BaseToolHandle* th ) {
593  if ( !th->isEnabled() ) {
594  if ( msgLevel( MSG::DEBUG ) && !th->typeAndName().empty() )
595  debug() << "ToolHandle " << th->typeAndName() << " not used" << endmsg;
596  return;
597  }
598  if ( !th->get() ) {
599  auto sc = th->retrieve();
600  if ( sc.isFailure() ) {
601  throw GaudiException( "Failed to retrieve tool " + th->typeAndName(), this->name(), StatusCode::FAILURE );
602  }
603  }
604  auto tool = th->get();
605  if ( msgLevel( MSG::DEBUG ) )
606  debug() << "Adding " << ( th->isPublic() ? "public" : "private" ) << " ToolHandle tool " << tool->name() << " ("
607  << tool->type() << ")" << endmsg;
609  };
610 
611  for ( auto thArr : m_toolHandleArrays ) {
612  if ( msgLevel( MSG::DEBUG ) )
613  debug() << "Registering all Tools in ToolHandleArray " << thArr->propertyName() << endmsg;
614  // Iterate over its tools:
615  for ( auto toolHandle : thArr->getBaseArray() ) {
616  BaseToolHandle* bth = dynamic_cast<BaseToolHandle*>( toolHandle );
617  if ( bth ) {
618  init_one( bth );
619  } else {
620  error() << "Error retrieving ToolHandle " << toolHandle->typeAndName() << " in ToolHandleArray "
621  << thArr->propertyName() << ". Not registered" << endmsg;
622  }
623  }
624  }
625 
626  for ( BaseToolHandle* th : m_toolHandles ) init_one( th );
627 
628  m_toolHandlesInit = true;
629  }
630 
633  return m_tools;
634  }
635 
638  return m_tools;
639  }
640 
645  StatusCode Algorithm::service_i( std::string_view svcName, bool createIf, const InterfaceID& iid,
646  void** ppSvc ) const {
647  const ServiceLocatorHelper helper( *serviceLocator(), *this );
648  return helper.getService( svcName, createIf, iid, ppSvc );
649  }
650 
651  StatusCode Algorithm::service_i( std::string_view svcType, std::string_view svcName, const InterfaceID& iid,
652  void** ppSvc ) const {
653  const ServiceLocatorHelper helper( *serviceLocator(), *this );
654  return helper.createService( svcType, svcName, iid, ppSvc );
655  }
656 
657  SmartIF<IService> Algorithm::service( std::string_view name, const bool createIf, const bool quiet ) const {
658  const ServiceLocatorHelper helper( *serviceLocator(), *this );
659  return helper.service( name, quiet, createIf );
660  }
661 
663  if ( msgLevel( MSG::DEBUG ) ) { debug() << "Registering tool " << tool->name() << endmsg; }
665  }
666 
669  if ( it != m_tools.end() ) {
670  if ( msgLevel( MSG::DEBUG ) ) debug() << "De-Registering tool " << tool->name() << endmsg;
671  m_tools.erase( it );
672  } else {
673  if ( msgLevel( MSG::DEBUG ) ) debug() << "Could not de-register tool " << tool->name() << endmsg;
674  }
675  }
676 
678  return os << type() << "('" << name() << "')";
679  }
680 
681  unsigned int Algorithm::errorCount() const { return m_aess->algErrorCount( static_cast<const IAlgorithm*>( this ) ); }
682 } // namespace Gaudi
Gaudi::Algorithm::nameKey
const Gaudi::StringKey & nameKey() const override
Definition: Algorithm.cpp:544
ServiceLocatorHelper::service
SmartIF< IService > service(std::string_view name, const bool quiet=false, const bool createIf=true) const
Definition: ServiceLocatorHelper.cpp:50
MSG::DEBUG
@ DEBUG
Definition: IMessageSvc.h:25
Gaudi::Algorithm::m_pSvcLocator
SmartIF< ISvcLocator > m_pSvcLocator
Pointer to service locator service.
Definition: Algorithm.h:474
IAuditor::ReStart
@ ReStart
Definition: IAuditor.h:34
Gaudi::Algorithm::m_auditorExecute
Gaudi::Property< bool > m_auditorExecute
Definition: Algorithm.h:497
Gaudi::Algorithm::m_RGS
SmartIF< IRndmGenSvc > m_RGS
Random Number Generator Service.
Definition: Algorithm.h:464
Gaudi::Algorithm::m_EXS
SmartIF< IExceptionSvc > m_EXS
Exception Handler Service.
Definition: Algorithm.h:465
Gaudi::Algorithm::sysExecute
StatusCode sysExecute(const EventContext &ctx) override
The actions to be performed by the algorithm on an event.
Definition: Algorithm.cpp:341
IAlgManager.h
std::string
STL class.
IAlgTool
Definition: IAlgTool.h:33
Gaudi::Algorithm::index
unsigned int index() const override
Definition: Algorithm.cpp:548
Gaudi::Algorithm::contextSvc
SmartIF< IAlgContextSvc > & contextSvc() const
get Algorithm Context Service
Definition: Algorithm.cpp:582
Gaudi::Algorithm::toolSvc
SmartIF< IToolSvc > & toolSvc() const
The standard ToolSvc service, Return a pointer to the service if present.
Definition: Algorithm.cpp:580
std::exception
STL class.
Gaudi::Algorithm::randSvc
SmartIF< IRndmGenSvc > & randSvc() const
The standard RandomGen service, Return a pointer to the service if present.
Definition: Algorithm.cpp:579
IAuditor::Execute
@ Execute
Definition: IAuditor.h:34
Gaudi::Algorithm::m_errorMax
Gaudi::Property< unsigned int > m_errorMax
Definition: Algorithm.h:488
Gaudi::Algorithm::acceptDHVisitor
void acceptDHVisitor(IDataHandleVisitor *) const override
Definition: Algorithm.cpp:202
Gaudi::Algorithm::name
const std::string & name() const override
The identifying name of the algorithm object.
Definition: Algorithm.cpp:542
Gaudi::Algorithm::eventSvc
SmartIF< IDataProviderSvc > & eventSvc() const
The standard event data service.
Definition: Algorithm.cpp:575
Gaudi::Algorithm::m_pAuditorSvc
SmartIF< IAuditorSvc > m_pAuditorSvc
Auditor Service.
Definition: Algorithm.h:466
StatusCode::isSuccess
bool isSuccess() const
Definition: StatusCode.h:314
Gaudi::Algorithm::m_state
Gaudi::StateMachine::State m_state
flag indicating whether ToolHandle tools have been added to m_tools
Definition: Algorithm.h:527
std::unordered_set< DataObjID, DataObjID_Hasher >
GaudiException.h
Gaudi::Algorithm::type
const std::string & type() const override
The type of the algorithm object.
Definition: Algorithm.h:165
Gaudi::Algorithm::m_isEnabled
Gaudi::Property< bool > m_isEnabled
Definition: Algorithm.h:486
std::vector< IAlgTool * >
Gaudi::StateMachine::FINALIZE
@ FINALIZE
Definition: StateMachine.h:38
std::unordered_set::find
T find(T... args)
Gaudi::Algorithm::sysRestart
StatusCode sysRestart() override
Restart method invoked by the framework.
Definition: Algorithm.cpp:300
ISvcLocator
Definition: ISvcLocator.h:46
Gaudi::Algorithm::initialize
StatusCode initialize() override
the default (empty) implementation of IStateful::initialize() method
Definition: Algorithm.h:178
GaudiException
Definition: GaudiException.h:31
Gaudi::Algorithm::histoSvc
SmartIF< IHistogramSvc > & histoSvc() const
The standard histogram service.
Definition: Algorithm.cpp:577
IRndmGenSvc.h
Gaudi::Algorithm::m_doTimeline
Gaudi::Property< bool > m_doTimeline
Definition: Algorithm.h:503
Gaudi::Algorithm::m_ptoolSvc
SmartIF< IToolSvc > m_ptoolSvc
ToolSvc Service.
Definition: Algorithm.h:467
Gaudi::Algorithm::serviceLocator
SmartIF< ISvcLocator > & serviceLocator() const override
The standard service locator.
Definition: Algorithm.cpp:586
Gaudi::Algorithm::auditorSvc
SmartIF< IAuditorSvc > & auditorSvc() const
The standard auditor service.May not be invoked before sysInitialize() has been invoked.
Definition: Algorithm.cpp:571
StringKey.h
std::unique_ptr::get
T get(T... args)
Gaudi::Algorithm::detSvc
SmartIF< IDataProviderSvc > & detSvc() const
The standard detector data service.
Definition: Algorithm.cpp:573
Gaudi::Algorithm::m_auditorReinitialize
Gaudi::Property< bool > m_auditorReinitialize
Definition: Algorithm.h:494
Gaudi::Algorithm::m_WB
SmartIF< IHiveWhiteBoard > m_WB
Event data service (whiteboard)
Definition: Algorithm.h:457
Gaudi::Functional::FilterDecision::FAILED
@ FAILED
DataHandleHolderBase< PropertyHolder< CommonMessaging< implements< IAlgorithm, IDataHandleHolder, IProperty, IStateful > > > >::outputHandles
std::vector< Gaudi::DataHandle * > outputHandles() const override
Definition: DataHandleHolderBase.h:41
Gaudi::Algorithm::m_HDS
SmartIF< IHistogramSvc > m_HDS
Histogram data service.
Definition: Algorithm.h:461
Gaudi::Algorithm::m_CSS
SmartIF< IChronoStatSvc > m_CSS
Chrono & Stat Service.
Definition: Algorithm.h:463
Gaudi::Algorithm::m_updateDataHandles
std::unique_ptr< IDataHandleVisitor > m_updateDataHandles
Hook for for derived classes to provide a custom visitor for data handles.
Definition: Algorithm.h:478
Gaudi::Algorithm::sysStop
StatusCode sysStop() override
System stop.
Definition: Algorithm.cpp:421
Gaudi::Algorithm::start
StatusCode start() override
the default (empty) implementation of IStateful::start() method
Definition: Algorithm.h:180
Gaudi::Algorithm::eventCnvSvc
SmartIF< IConversionSvc > & eventCnvSvc() const
The standard event data persistency conversion service.
Definition: Algorithm.cpp:576
DHHVisitor
Definition: DataHandleHolderVisitor.h:18
IMessageSvc.h
CommonMessaging< implements< IAlgorithm, IDataHandleHolder, IProperty, IStateful > >::msgLevel
MSG::Level msgLevel() const
get the cached level (originally extracted from the embedded MsgStream)
Definition: CommonMessaging.h:148
IAuditorSvc.h
IDataProviderSvc.h
IExceptionSvc.h
PropertyHolder< CommonMessaging< implements< IAlgorithm, IDataHandleHolder, IProperty, IStateful > > >::bindPropertiesTo
void bindPropertiesTo(Gaudi::Interfaces::IOptionsSvc &optsSvc)
Definition: PropertyHolder.h:252
DataHandleHolderBase< PropertyHolder< CommonMessaging< implements< IAlgorithm, IDataHandleHolder, IProperty, IStateful > > > >::m_outputDataObjs
DataObjIDColl m_outputDataObjs
Definition: DataHandleHolderBase.h:98
Gaudi::Guards::AuditorGuard
Definition: Guards.h:213
DataObjID::fullKey
std::string fullKey() const
combination of the key and the ClassName, mostly for debugging
Definition: DataObjID.cpp:99
Gaudi::StateMachine::INITIALIZE
@ INITIALIZE
Definition: StateMachine.h:35
std::vector::push_back
T push_back(T... args)
Gaudi::Algorithm::chronoSvc
SmartIF< IChronoStatSvc > & chronoSvc() const
The standard Chrono & Stat service, Return a pointer to the service if present.
Definition: Algorithm.cpp:572
IToolSvc.h
Gaudi::Algorithm::deregisterTool
void deregisterTool(IAlgTool *tool) const
Definition: Algorithm.cpp:667
Gaudi::Algorithm::m_ECS
SmartIF< IConversionSvc > m_ECS
Event conversion service.
Definition: Algorithm.h:458
IProperty
Definition: IProperty.h:33
IAuditor::Finalize
@ Finalize
Definition: IAuditor.h:34
Gaudi::Algorithm::initToolHandles
void initToolHandles() const
Definition: Algorithm.cpp:590
Gaudi::Algorithm::m_auditorRestart
Gaudi::Property< bool > m_auditorRestart
Definition: Algorithm.h:496
Gaudi::Algorithm::m_auditorStop
Gaudi::Property< bool > m_auditorStop
Definition: Algorithm.h:501
Gaudi::Algorithm::whiteboard
SmartIF< IHiveWhiteBoard > & whiteboard() const
Definition: Algorithm.cpp:584
Gaudi::Algorithm::m_NTS
SmartIF< INTupleSvc > m_NTS
N tuple service.
Definition: Algorithm.h:462
Gaudi::StringKey
Definition: StringKey.h:44
Gaudi::Algorithm::m_auditorInitialize
Gaudi::Property< bool > m_auditorInitialize
Definition: Algorithm.h:492
Gaudi::Algorithm::isEnabled
bool isEnabled() const override
Is this algorithm enabled or disabled?
Definition: Algorithm.cpp:552
bug_34121.tool
tool
Definition: bug_34121.py:17
CommonMessaging< implements< IAlgorithm, IDataHandleHolder, IProperty, IStateful > >::setUpMessaging
MSG::Level setUpMessaging() const
Set up local caches.
Definition: CommonMessaging.h:174
Gaudi::Functional::details::get
auto get(const Handle &handle, const Algo &, const EventContext &) -> decltype(details::deref(handle.get()))
Definition: FunctionalDetails.h:444
Gaudi::StateMachine::CONFIGURED
@ CONFIGURED
Definition: StateMachine.h:24
TimingHistograms.name
name
Definition: TimingHistograms.py:25
GaudiPython.Pythonizations.ctx
ctx
Definition: Pythonizations.py:588
DataHandleHolderBase< PropertyHolder< CommonMessaging< implements< IAlgorithm, IDataHandleHolder, IProperty, IStateful > > > >::initDataHandleHolder
void initDataHandleHolder()
initializes all handles - called by the sysInitialize method of any descendant of this
Definition: DataHandleHolderBase.h:94
StatusCode
Definition: StatusCode.h:65
Gaudi::Algorithm::m_outputLevel
Gaudi::Property< int > m_outputLevel
Definition: Algorithm.h:482
IAuditor::Stop
@ Stop
Definition: IAuditor.h:34
IAlgorithm
Definition: IAlgorithm.h:38
GaudiPython.Pythonizations.execute
execute
Definition: Pythonizations.py:588
Gaudi::Algorithm::FSMState
Gaudi::StateMachine::State FSMState() const override
returns the current state of the algorithm
Definition: Algorithm.h:190
Gaudi::Algorithm::m_contextSvc
SmartIF< IAlgContextSvc > m_contextSvc
Algorithm Context Service.
Definition: Algorithm.h:469
Gaudi::Details::getDefaultAuditorValue
bool getDefaultAuditorValue(ISvcLocator *loc)
Definition: Algorithm.cpp:46
std::ostream
STL class.
Gaudi::Algorithm::execState
AlgExecState & execState(const EventContext &ctx) const override
reference to AlgExecState of Alg
Definition: Algorithm.cpp:554
IAuditor::Initialize
@ Initialize
Definition: IAuditor.h:34
IAuditor::ReInitialize
@ ReInitialize
Definition: IAuditor.h:34
Gaudi::Algorithm::sysInitialize
StatusCode sysInitialize() override
Initialization method invoked by the framework.
Definition: Algorithm.cpp:58
ITimelineSvc::TimelineRecorder
RAII helper to record timeline events.
Definition: ITimelineSvc.h:44
AlgSequencer.h
h
Definition: AlgSequencer.py:32
AlgExecState::setState
void setState(State s)
Definition: IAlgExecStateSvc.h:46
ISvcLocator::service
StatusCode service(const Gaudi::Utils::TypeNameString &name, T *&svc, bool createIf=true)
Templated method to access a service by name.
Definition: ISvcLocator.h:97
DataHandleHolderVisitor.h
Gaudi::Utils::AlgContext
Definition: IAlgContextSvc.h:84
Gaudi::Property::value
const ValueType & value() const
Backward compatibility (.
Definition: Property.h:240
DataHandleHolderBase< PropertyHolder< CommonMessaging< implements< IAlgorithm, IDataHandleHolder, IProperty, IStateful > > > >::m_inputDataObjs
DataObjIDColl m_inputDataObjs
Definition: DataHandleHolderBase.h:98
DHHVisitor::ignoredOutKeys
const DataObjIDColl & ignoredOutKeys() const
Definition: DataHandleHolderVisitor.h:23
ServiceLocatorHelper
an helper to share the implementation of service() among the various kernel base classes
Definition: ServiceLocatorHelper.h:27
std::unordered_set::erase
T erase(T... args)
ServiceLocatorHelper::getService
StatusCode getService(std::string_view name, bool createIf, const InterfaceID &iid, void **ppSvc) const
Definition: ServiceLocatorHelper.h:51
Gaudi::Algorithm::m_targetState
Gaudi::StateMachine::State m_targetState
Algorithm has been initialized flag.
Definition: Algorithm.h:528
Algorithm.h
SmartIF
Definition: IConverter.h:25
Gaudi::Algorithm::version
const std::string & version() const override
Definition: Algorithm.cpp:546
Gaudi::Algorithm::m_name
Gaudi::StringKey m_name
Algorithm's name for identification.
Definition: Algorithm.h:441
genconfuser.verbose
verbose
Definition: genconfuser.py:30
endmsg
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:203
Gaudi::Algorithm::tools
const std::vector< IAlgTool * > & tools() const
Definition: Algorithm.cpp:631
Gaudi::Algorithm::toControlFlowExpression
std::ostream & toControlFlowExpression(std::ostream &os) const override
Produce string represention of the control flow expression.
Definition: Algorithm.cpp:677
Gaudi::Algorithm::m_EDS
SmartIF< IDataProviderSvc > m_EDS
Event data service.
Definition: Algorithm.h:456
Gaudi::StateMachine::RUNNING
@ RUNNING
Definition: StateMachine.h:26
Gaudi
Header file for std:chrono::duration-based Counters.
Definition: __init__.py:1
Gaudi::Algorithm::exceptionSvc
SmartIF< IExceptionSvc > & exceptionSvc() const
Get the exception Service.
Definition: Algorithm.cpp:581
Gaudi::Algorithm::m_auditorStart
Gaudi::Property< bool > m_auditorStart
Definition: Algorithm.h:500
DataObjID
Definition: DataObjID.h:47
IDataHandleVisitor
Definition: IDataHandleHolder.h:46
Stat.h
DHHVisitor::ignoredInpKeys
const DataObjIDColl & ignoredInpKeys() const
Definition: DataHandleHolderVisitor.h:22
Stat
Definition: Stat.h:56
DataHandleHolderBase< PropertyHolder< CommonMessaging< implements< IAlgorithm, IDataHandleHolder, IProperty, IStateful > > > >::inputHandles
std::vector< Gaudi::DataHandle * > inputHandles() const override
Definition: DataHandleHolderBase.h:38
Gaudi::StateMachine::ChangeState
State GAUDI_API ChangeState(const Transition transition, const State state)
Function to get the new state according to the required transition, checking if the transition is all...
Definition: StateMachine.cpp:19
Gaudi::Algorithm::m_tools
std::vector< IAlgTool * > m_tools
Definition: Algorithm.h:447
StatusCode::isFailure
bool isFailure() const
Definition: StatusCode.h:129
Gaudi::Algorithm::algExecStateSvc
SmartIF< IAlgExecStateSvc > & algExecStateSvc() const
Definition: Algorithm.cpp:570
IAuditor::Start
@ Start
Definition: IAuditor.h:34
Gaudi::Algorithm::sysStart
StatusCode sysStart() override
Reinitialization method invoked by the framework.
Definition: Algorithm.cpp:210
Gaudi::Algorithm::m_toolHandles
std::vector< BaseToolHandle * > m_toolHandles
Definition: Algorithm.h:448
Gaudi::Algorithm::service_i
StatusCode service_i(std::string_view svcName, bool createIf, const InterfaceID &iid, void **ppSvc) const
implementation of service method
Definition: Algorithm.cpp:645
Gaudi::Algorithm::finalize
StatusCode finalize() override
the default (empty) implementation of IStateful::finalize() method
Definition: Algorithm.h:184
MSG::VERBOSE
@ VERBOSE
Definition: IMessageSvc.h:25
StatusCode::SUCCESS
constexpr static const auto SUCCESS
Definition: StatusCode.h:100
IAlgContextSvc.h
Gaudi::Algorithm::m_toolHandleArrays
std::vector< GaudiHandleArrayBase * > m_toolHandleArrays
Definition: Algorithm.h:449
AlgTool
Definition: AlgTool.h:62
BaseToolHandle
Definition: ToolHandle.h:80
Gaudi::Algorithm::sysFinalize
StatusCode sysFinalize() override
System finalization.
Definition: Algorithm.cpp:465
ServiceLocatorHelper.h
std::vector::begin
T begin(T... args)
Gaudi::Algorithm::m_timelineSvc
SmartIF< ITimelineSvc > m_timelineSvc
Timeline Service.
Definition: Algorithm.h:471
ToolHandle.h
Gaudi::Algorithm::restart
StatusCode restart() override
the default (empty) implementation of IStateful::restart() method
Definition: Algorithm.cpp:527
Gaudi::Algorithm::m_toolHandlesInit
bool m_toolHandlesInit
Definition: Algorithm.h:525
Kernel.h
Gaudi::Algorithm::service
StatusCode service(std::string_view name, T *&psvc, bool createIf=true) const
Access a service by name, creating it if it doesn't already exist.
Definition: Algorithm.h:205
Gaudi::StateMachine::INITIALIZED
@ INITIALIZED
Definition: StateMachine.h:25
Chrono.h
Gaudi::StateMachine::START
@ START
Definition: StateMachine.h:36
EventContext
Definition: EventContext.h:34
Gaudi::Algorithm::m_version
std::string m_version
Algorithm's version.
Definition: Algorithm.h:443
Gaudi::Algorithm::m_DDS
SmartIF< IDataProviderSvc > m_DDS
Detector data service.
Definition: Algorithm.h:459
Gaudi::StringKey::str
const std::string & str() const
the actual string
Definition: StringKey.h:56
AlgTool.h
Gaudi::Algorithm::timelineSvc
SmartIF< ITimelineSvc > & timelineSvc() const
Definition: Algorithm.cpp:583
Gaudi::Algorithm::m_filterCircDeps
Gaudi::Property< bool > m_filterCircDeps
Definition: Algorithm.h:522
Gaudi::Algorithm::m_index
unsigned int m_index
Algorithm's index.
Definition: Algorithm.h:444
Gaudi::Algorithm::m_aess
SmartIF< IAlgExecStateSvc > m_aess
Alg execution state mgr.
Definition: Algorithm.h:472
std::unordered_set::end
T end(T... args)
InterfaceID
Definition: IInterface.h:39
Gaudi::Algorithm::reinitialize
StatusCode reinitialize() override
the default (empty) implementation of IStateful::reinitialize() method
Definition: Algorithm.cpp:507
AlgExecState
Definition: IAlgExecStateSvc.h:37
Gaudi::Algorithm::detCnvSvc
SmartIF< IConversionSvc > & detCnvSvc() const
The standard detector data persistency conversion service.
Definition: Algorithm.cpp:574
StatusCode::FAILURE
constexpr static const auto FAILURE
Definition: StatusCode.h:101
Guards.h
IConversionSvc.h
Gaudi::Algorithm::setIndex
void setIndex(const unsigned int &idx) override
set instantiation index of Alg
Definition: Algorithm.cpp:550
ISvcLocator.h
Gaudi::Algorithm::sysReinitialize
StatusCode sysReinitialize() override
Reinitialization method invoked by the framework.
Definition: Algorithm.cpp:254
Gaudi::Algorithm::registerContext
bool registerContext() const
register for Algorithm Context Service?
Definition: Algorithm.h:295
ServiceLocatorHelper::createService
StatusCode createService(std::string_view name, const InterfaceID &iid, void **ppSvc) const
Definition: ServiceLocatorHelper.cpp:33
Gaudi::Algorithm::registerTool
void registerTool(IAlgTool *tool) const
Definition: Algorithm.cpp:662
AlgExecState::setFilterPassed
void setFilterPassed(bool f=true)
Definition: IAlgExecStateSvc.h:45
Gaudi::Algorithm::stop
StatusCode stop() override
the default (empty) implementation of IStateful::stop() method
Definition: Algorithm.h:182
IOTest.appMgr
appMgr
Definition: IOTest.py:108
FunctionalFilterDecision.h
std::set
STL class.
Gaudi::Algorithm::ntupleSvc
SmartIF< INTupleSvc > & ntupleSvc() const
The standard N tuple service.
Definition: Algorithm.cpp:578
Gaudi::Algorithm::get_svc_
SmartIF< IFace > & get_svc_(SmartIF< IFace > &p, const char *service_name) const
Definition: Algorithm.cpp:559
Gaudi::Algorithm::isSequence
bool isSequence() const override
Are we a Sequence?
Definition: Algorithm.h:198
Gaudi::Property< bool >
IDataManagerSvc.h
IHistogramSvc.h
Gaudi::StateMachine::STOP
@ STOP
Definition: StateMachine.h:37
INTupleSvc.h
MsgStream.h
Gaudi::Algorithm::errorCount
unsigned int errorCount() const
Get the number of failures of the algorithm.
Definition: Algorithm.cpp:681
Gaudi::Algorithm::m_DCS
SmartIF< IConversionSvc > m_DCS
Detector conversion service.
Definition: Algorithm.h:460
IDataHandleVisitor::visit
virtual void visit(const IDataHandleHolder *)=0
PrepareBase.out
out
Definition: PrepareBase.py:20
Gaudi::Algorithm::m_auditorFinalize
Gaudi::Property< bool > m_auditorFinalize
Definition: Algorithm.h:498