The Gaudi Framework  v36r1 (3e2fb5a8)
AlgTool.h
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 #ifndef GAUDIKERNEL_ALGTOOL_H
12 #define GAUDIKERNEL_ALGTOOL_H
13 // ============================================================================
14 // Include files
16 #include "GaudiKernel/DataObjID.h"
17 #include "GaudiKernel/IAlgTool.h"
22 #include "GaudiKernel/IProperty.h"
23 #include "GaudiKernel/IService.h"
24 #include "GaudiKernel/IStateful.h"
26 #include "GaudiKernel/IToolSvc.h"
28 #include "GaudiKernel/ToolHandle.h"
29 #include <Gaudi/PluginService.h>
30 
31 #include "GaudiKernel/DataHandle.h"
34 
35 template <class T>
37 
38 class ToolHandleInfo;
39 
40 #include <list>
41 #include <vector>
42 
43 // Forward declarations
44 class ToolSvc;
45 
46 class ToolVisitor;
47 
61  : public DataHandleHolderBase<
62  PropertyHolder<CommonMessaging<implements<IAlgTool, IDataHandleHolder, IProperty, IStateful>>>> {
63  friend ToolSvc;
64  friend class ToolVisitor;
65 
66 public:
67  using Factory = Gaudi::PluginService::Factory<IAlgTool*( const std::string&, const std::string&, const IInterface* )>;
68 
70  StatusCode queryInterface( const InterfaceID& riid, void** ppvUnknown ) override;
71 
73  const std::string& name() const override;
74 
76  const std::string& type() const override;
77 
79  const IInterface* parent() const override;
80 
81  // State machine implementation
82  StatusCode configure() override { return StatusCode::SUCCESS; }
83  StatusCode initialize() override;
84  StatusCode start() override;
85  StatusCode stop() override;
86  StatusCode finalize() override;
87  StatusCode terminate() override { return StatusCode::SUCCESS; }
88  StatusCode reinitialize() override;
89  StatusCode restart() override;
90  Gaudi::StateMachine::State FSMState() const override { return m_state; }
91  Gaudi::StateMachine::State targetFSMState() const override { return m_targetState; }
92 
94  StatusCode sysInitialize() override;
95 
97  StatusCode sysStart() override;
98 
100  StatusCode sysStop() override;
101 
103  StatusCode sysFinalize() override;
104 
106  StatusCode sysReinitialize() override;
107 
109  StatusCode sysRestart() override;
110 
111 public:
117  AlgTool( std::string type, std::string name, const IInterface* parent );
118 
120  SmartIF<ISvcLocator>& serviceLocator() const override;
121 
123  ISvcLocator* svcLoc() const { return serviceLocator(); }
124 
128  IDataProviderSvc* evtSvc() const;
129 
131  IToolSvc* toolSvc() const;
132 
133  [[deprecated( "not to be called explicitly, will be removed in v36r0" )]] StatusCode setProperties() {
134  if ( !serviceLocator() ) return StatusCode::FAILURE;
135  bindPropertiesTo( serviceLocator()->getOptsSvc() );
136  return StatusCode::SUCCESS;
137  }
138 
142  template <class T>
143  StatusCode service( std::string_view name, T*& svc, bool createIf = true ) const {
144  return service_i( name, createIf, T::interfaceID(), (void**)&svc );
145  }
146 
149  template <class T>
150  StatusCode service( std::string_view type, std::string_view name, T*& svc ) const {
151  return service_i( type, name, T::interfaceID(), reinterpret_cast<void**>( &svc ) );
152  }
153 
155  SmartIF<IService> service( std::string_view name, const bool createIf = true, const bool quiet = false ) const;
156 
157  template <typename T>
158  SmartIF<T> service( std::string_view name, const bool createIf = true, const bool quiet = false ) const {
159  return SmartIF<T>( service( name, createIf, quiet ) );
160  }
161 
162 protected:
163  template <typename I>
164  void declareInterface( I* i ) {
165  m_interfaceList.emplace_back( I::interfaceID(), i );
166  }
167 
168 public:
169  using PropertyHolderImpl::declareProperty;
170 
171  template <class T>
173  const std::string& doc = "none" ) {
174  this->declareTool( hndl, hndl.typeAndName() ).ignore();
175  return PropertyHolderImpl::declareProperty( name, hndl, doc );
176  }
177 
178  template <class T>
179  StatusCode declareTool( ToolHandle<T>& handle, bool createIf = true ) {
180  return this->declareTool( handle, handle.typeAndName(), createIf );
181  }
182 
183  template <class T>
184  StatusCode declareTool( ToolHandle<T>& handle, std::string toolTypeAndName, bool createIf = true ) {
185 
186  StatusCode sc = handle.initialize( toolTypeAndName, handle.isPublic() ? nullptr : this, createIf );
187  if ( UNLIKELY( !sc ) ) {
188  throw GaudiException{std::string{"Cannot create handle for "} + ( handle.isPublic() ? "public" : "private" ) +
189  " tool " + toolTypeAndName,
190  name(), sc};
191  }
192 
193  m_toolHandles.push_back( &handle );
194 
195  return sc;
196  }
197 
198  // ==========================================================================
199  // declare ToolHandleArrays to the AlgTool
200  template <class T>
202  const std::string& doc = "none" ) {
203  addToolsArray( hndlArr );
204  return PropertyHolderImpl::declareProperty( name, hndlArr, doc );
205  }
206 
207  template <class T>
209  m_toolHandleArrays.push_back( &hndlArr );
210  }
211 
212 public:
213  void acceptDHVisitor( IDataHandleVisitor* ) const override;
214 
215 public:
216  void registerTool( IAlgTool* tool ) const {
217  if ( UNLIKELY( msgLevel( MSG::DEBUG ) ) ) debug() << "Registering tool " << tool->name() << endmsg;
218  m_tools.push_back( tool );
219  }
220 
221  void deregisterTool( IAlgTool* tool ) const {
222  auto it = std::find( m_tools.begin(), m_tools.end(), tool );
223  if ( it != m_tools.end() ) {
224  if ( UNLIKELY( msgLevel( MSG::DEBUG ) ) ) debug() << "De-Registering tool " << tool->name() << endmsg;
225  m_tools.erase( it );
226  } else {
227  if ( UNLIKELY( msgLevel( MSG::DEBUG ) ) ) debug() << "Could not de-register tool " << tool->name() << endmsg;
228  }
229  }
230 
231  const std::vector<IAlgTool*>& tools() const;
232 
233 protected:
234  std::vector<IAlgTool*>& tools();
235 
238 
239 private:
240  // place IAlgTools defined via ToolHandles in m_tools
241  void initToolHandles() const;
242 
243 public:
244  // ==========================================================================
246  IAuditorSvc* auditorSvc() const;
247 
257  inline IMonitorSvc* monitorSvc() const {
258  // If not already located try to locate it without forcing a creation
259  if ( !m_pMonitorSvc ) m_pMonitorSvc = service( m_monitorSvcName, false, true );
260  return m_pMonitorSvc.get();
261  }
262 
268  template <class T>
269  void declareInfo( const std::string& name, const T& var, const std::string& desc ) const {
270  IMonitorSvc* mS = monitorSvc();
271  if ( mS ) mS->declareInfo( name, var, desc, this );
272  }
273 
281  void declareInfo( const std::string& name, const std::string& format, const void* var, int size,
282  const std::string& desc ) const {
283  IMonitorSvc* mS = monitorSvc();
284  if ( mS ) mS->declareInfo( name, format, var, size, desc, this );
285  }
286 
287  // Standard destructor.
288  ~AlgTool() override;
289 
290 private:
292 
295  const IInterface* m_parent = nullptr;
296 
302 
304 
305  // Properties
306  // initialize output level from MessageSvc and initialize messaging (before enabling update handler)
307  Gaudi::Property<int> m_outputLevel{
308  this, "OutputLevel", setUpMessaging(),
309  [this]( Gaudi::Details::PropertyBase& ) { this->updateMsgStreamOutputLevel( this->m_outputLevel ); },
310  "output level"};
311 
312  Gaudi::Property<std::string> m_monitorSvcName{this, "MonitorService", "MonitorSvc",
313  "name to use for Monitor Service"};
314 
315  Gaudi::Property<bool> m_auditInit{this, "AuditTools", false, "[[deprecated]] unused"};
316  Gaudi::Property<bool> m_auditorInitialize{this, "AuditInitialize", false, "trigger auditor on initialize()"};
317  Gaudi::Property<bool> m_auditorStart{this, "AuditStart", false, "trigger auditor on start()"};
318  Gaudi::Property<bool> m_auditorStop{this, "AuditStop", false, "trigger auditor on stop()"};
319  Gaudi::Property<bool> m_auditorFinalize{this, "AuditFinalize", false, "trigger auditor on finalize()"};
320  Gaudi::Property<bool> m_auditorReinitialize{this, "AuditReinitialize", false, "trigger auditor on reinitialize()"};
321  Gaudi::Property<bool> m_auditorRestart{this, "AuditRestart", false, "trigger auditor on restart()"};
322 
323  // tools used by tool
327  mutable bool m_toolHandlesInit = false;
328 
330  StatusCode service_i( std::string_view algName, bool createIf, const InterfaceID& iid, void** ppSvc ) const;
331  StatusCode service_i( std::string_view svcType, std::string_view svcName, const InterfaceID& iid, void** ppS ) const;
332 
335 };
336 
337 #endif // GAUDIKERNEL_ALGTOOL_H
MSG::DEBUG
@ DEBUG
Definition: IMessageSvc.h:25
Gaudi::Details::PropertyBase
PropertyBase base class allowing PropertyBase* collections to be "homogeneous".
Definition: PropertyBase.h:35
AlgTool::service
SmartIF< T > service(std::string_view name, const bool createIf=true, const bool quiet=false) const
Definition: AlgTool.h:158
AlgTool::declareProperty
Gaudi::Details::PropertyBase * declareProperty(const std::string &name, ToolHandleArray< T > &hndlArr, const std::string &doc="none")
Definition: AlgTool.h:201
DataHandleHolderBase
Definition: DataHandleHolderBase.h:34
AlgTool::svcLoc
ISvcLocator * svcLoc() const
shortcut for the method service locator
Definition: AlgTool.h:123
IService.h
std::string
STL class.
IAlgTool
Definition: IAlgTool.h:33
details::size
constexpr auto size(const T &, Args &&...) noexcept
Definition: AnyDataWrapper.h:22
AlgTool::m_pMonitorSvc
SmartIF< IMonitorSvc > m_pMonitorSvc
Online Monitoring Service.
Definition: AlgTool.h:300
std::list
STL class.
AlgTool::m_toolHandles
std::vector< BaseToolHandle * > m_toolHandles
Definition: AlgTool.h:325
AlgTool::targetFSMState
Gaudi::StateMachine::State targetFSMState() const override
Definition: AlgTool.h:91
AlgTool::addToolsArray
void addToolsArray(ToolHandleArray< T > &hndlArr)
Definition: AlgTool.h:208
AlgTool::m_updateDataHandles
std::unique_ptr< IDataHandleVisitor > m_updateDataHandles
Hook for for derived classes to provide a custom visitor for data handles.
Definition: AlgTool.h:237
AlgTool::InterfaceList
std::list< std::pair< InterfaceID, void * > > InterfaceList
Definition: AlgTool.h:291
AlgTool::declareInterface
void declareInterface(I *i)
Definition: AlgTool.h:164
AlgTool::declareTool
StatusCode declareTool(ToolHandle< T > &handle, bool createIf=true)
Definition: AlgTool.h:179
AlgTool::registerTool
void registerTool(IAlgTool *tool) const
Definition: AlgTool.h:216
std::vector< IAlgTool * >
std::find
T find(T... args)
AlgTool::m_svcLocator
SmartIF< ISvcLocator > m_svcLocator
Pointer to Service Locator service.
Definition: AlgTool.h:297
ISvcLocator
Definition: ISvcLocator.h:46
GaudiException
Definition: GaudiException.h:31
AlgTool::m_evtSvc
SmartIF< IDataProviderSvc > m_evtSvc
Event data service.
Definition: AlgTool.h:298
AlgTool::declareTool
StatusCode declareTool(ToolHandle< T > &handle, std::string toolTypeAndName, bool createIf=true)
Definition: AlgTool.h:184
AlgTool::declareInfo
void declareInfo(const std::string &name, const std::string &format, const void *var, int size, const std::string &desc) const
Declare monitoring information (special case)
Definition: AlgTool.h:281
DataObjID.h
AlgTool::m_tools
std::vector< IAlgTool * > m_tools
Definition: AlgTool.h:324
ToolSvc
Definition: ToolSvc.h:34
IMonitorSvc
Definition: IMonitorSvc.h:33
IOTest.start
start
Definition: IOTest.py:108
IMessageSvc.h
IAuditorSvc.h
IDataProviderSvc.h
AlgTool::FSMState
Gaudi::StateMachine::State FSMState() const override
Definition: AlgTool.h:90
DataObjectHandle
DataObjectHandle.h GaudiKernel/DataObjectHandle.h.
Definition: AlgTool.h:36
AlgTool::ToolSvc
friend ToolSvc
Definition: AlgTool.h:63
IToolSvc.h
AlgTool::declareInfo
void declareInfo(const std::string &name, const T &var, const std::string &desc) const
Declare monitoring information.
Definition: AlgTool.h:269
Gaudi::StateMachine::State
State
Allowed states for classes implementing the state machine (ApplicationMgr, Algorithm,...
Definition: StateMachine.h:22
PluginService.h
ToolHandle
Definition: ToolHandle.h:135
bug_34121.tool
tool
Definition: bug_34121.py:17
Gaudi::StateMachine::CONFIGURED
@ CONFIGURED
Definition: StateMachine.h:24
TimingHistograms.name
name
Definition: TimingHistograms.py:23
AlgTool::declareProperty
Gaudi::Details::PropertyBase * declareProperty(const std::string &name, ToolHandle< T > &hndl, const std::string &doc="none")
Definition: AlgTool.h:172
StatusCode
Definition: StatusCode.h:65
AlgTool::monitorSvc
IMonitorSvc * monitorSvc() const
Access the monitor service.
Definition: AlgTool.h:257
IMonitorSvc::declareInfo
virtual void declareInfo(const std::string &name, const bool &var, const std::string &desc, const IInterface *owner)=0
Declare monitoring information.
AlgTool::terminate
StatusCode terminate() override
Definition: AlgTool.h:87
ToolHandleInfo
General info and helper functions for toolhandles and arrays.
Definition: ToolHandle.h:41
IAlgTool.h
ToolHandleArray
Definition: ToolHandle.h:345
AlgTool::m_type
std::string m_type
AlgTool type (concrete class name)
Definition: AlgTool.h:293
AlgTool::Factory
Gaudi::PluginService::Factory< IAlgTool *(const std::string &, const std::string &, const IInterface *)> Factory
Definition: AlgTool.h:67
IStateful.h
AlgTool::m_ptoolSvc
SmartIF< IToolSvc > m_ptoolSvc
Tool service.
Definition: AlgTool.h:299
AlgTool::m_toolHandleArrays
std::vector< GaudiHandleArrayBase * > m_toolHandleArrays
Definition: AlgTool.h:326
SmartIF< ISvcLocator >
CommonMessaging.h
format
GAUDI_API std::string format(const char *,...)
MsgStream format utility "a la sprintf(...)".
Definition: MsgStream.cpp:119
endmsg
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:203
IDataHandleVisitor
Definition: IDataHandleHolder.h:46
ToolHandleInfo::isPublic
bool isPublic() const noexcept
Definition: ToolHandle.h:50
IMonitorSvc.h
AlgTool::m_interfaceList
InterfaceList m_interfaceList
Interface list.
Definition: AlgTool.h:303
gaudirun.type
type
Definition: gaudirun.py:154
StatusCode::SUCCESS
constexpr static const auto SUCCESS
Definition: StatusCode.h:100
AlgTool::service
StatusCode service(std::string_view name, T *&svc, bool createIf=true) const
Access a service by name, creating it if it doesn't already exist.
Definition: AlgTool.h:143
IAuditorSvc
Definition: IAuditorSvc.h:25
AlgTool
Definition: AlgTool.h:62
IDataHandleHolder.h
DataHandleHolderBase.h
ToolHandle.h
AlgTool::deregisterTool
void deregisterTool(IAlgTool *tool) const
Definition: AlgTool.h:221
extends< BASE, IDataHandleHolder >::queryInterface
StatusCode queryInterface(const InterfaceID &ti, void **pp) override
Implementation of IInterface::queryInterface.
Definition: extends.h:38
IInterface
Definition: IInterface.h:237
DataHandle.h
AlgTool::m_name
const std::string m_name
AlgTool full name.
Definition: AlgTool.h:294
AlgTool::m_pAuditorSvc
SmartIF< IAuditorSvc > m_pAuditorSvc
Auditor Service.
Definition: AlgTool.h:301
ToolHandle::initialize
StatusCode initialize(const std::string &toolTypeAndName, const IInterface *parent=nullptr, bool createIf=true)
Definition: ToolHandle.h:210
IProperty.h
ToolHandle::typeAndName
std::string typeAndName() const override
Definition: ToolHandle.h:270
IDataProviderSvc
Definition: IDataProviderSvc.h:53
InterfaceID
Definition: IInterface.h:39
StatusCode::FAILURE
constexpr static const auto FAILURE
Definition: StatusCode.h:101
UNLIKELY
#define UNLIKELY(x)
Definition: Kernel.h:106
ISvcLocator.h
std::unique_ptr< IDataHandleVisitor >
IToolSvc
Definition: IToolSvc.h:29
PropertyHolder.h
AlgTool::configure
StatusCode configure() override
Definition: AlgTool.h:82
GAUDI_API
#define GAUDI_API
Definition: Kernel.h:81
Gaudi::Property< int >
AlgTool::setProperties
StatusCode setProperties()
Definition: AlgTool.h:133
AlgTool::service
StatusCode service(std::string_view type, std::string_view name, T *&svc) const
Access a service by name, type creating it if it doesn't already exist.
Definition: AlgTool.h:150