The Gaudi Framework  v29r0 (ff2e7097)
DataOnDemandSvc.h
Go to the documentation of this file.
1 #ifndef GAUDISVC_DATAONDEMANDSVC_H
2 #define GAUDISVC_DATAONDEMANDSVC_H
3 // ============================================================================
4 // Include Files
5 // ============================================================================
6 // STD & STL
7 // ============================================================================
8 #include <map>
9 #include <vector>
10 // ============================================================================
11 // GaudiKernel
12 // ============================================================================
17 #include "GaudiKernel/Service.h"
18 #include "GaudiKernel/StatEntity.h"
19 #include "GaudiKernel/StringKey.h"
20 // ============================================================================
21 // ROOT TClass
22 // ============================================================================
23 #include "TClass.h"
24 // ============================================================================
25 // Forward declarations
26 // ============================================================================
27 class IAlgTool;
28 class IAlgorithm;
29 class IAlgManager;
30 class IIncidentSvc;
31 class IDataProviderSvc;
32 class IToolSvc;
33 // ============================================================================
90 class DataOnDemandSvc : public extends<Service, IIncidentListener>
91 {
92 public:
93  // ==========================================================================
94  // Typedefs
96  typedef TClass* ClassH;
97  // ==========================================================================
102  struct Protection {
103  bool& m_bool;
104  Protection( bool& b ) : m_bool( b ) { m_bool = true; }
105  ~Protection() { m_bool = false; }
106  };
107  // ==========================================================================
113  struct Node {
114  // ========================================================================
116  ClassH clazz; // the actual class
118  unsigned long num = 0;
119  bool executing = false;
121  bool dataObject = false; // trivial object? DataObject?
122  // =======================================================================
123  Node() = default;
124  // ========================================================================
125  Node( ClassH c, bool e, std::string n )
126  : clazz( c ), name( std::move( n ) ), executing( e ), dataObject( "DataObject" == name )
127  {
128  }
129  //
130  Node( const Node& c )
131  : clazz( c.clazz ), name( c.name ), num( c.num ), executing( c.executing ), dataObject( c.dataObject )
132  {
133  }
134  // ========================================================================
135  };
136  // ==========================================================================
138  struct Leaf {
139  IAlgorithm* algorithm = nullptr;
142  unsigned long num = 0;
143  bool executing = false;
144  Leaf() = default;
145  Leaf( const Leaf& l ) = default;
146  Leaf( std::string t, std::string n ) : name( std::move( n ) ), type( std::move( t ) ) {}
147  };
148  // ==========================================================================
149 public:
150  // ==========================================================================
154  StatusCode initialize() override;
156  StatusCode finalize() override;
158  StatusCode reinitialize() override;
160  void handle( const Incident& incident ) override;
166  DataOnDemandSvc( const std::string& name, // Service instance name
167  ISvcLocator* svc ); // Pointer to service locator
169  ~DataOnDemandSvc() override = default; // Standard destructor
170  // ==========================================================================
171 protected:
172  // ==========================================================================
178  // ==========================================================================
184  StatusCode execHandler( const std::string& tag, Leaf& leaf );
185  // ==========================================================================
191  StatusCode execHandler( const std::string& tag, Node& node );
192  // ==========================================================================
195  // ==========================================================================
198  // ==========================================================================
200  StatusCode setup();
202  void i_setNodeHandler( const std::string& name, const std::string& type );
205  // ==========================================================================
206 protected:
207  // ==========================================================================
209  StatusCode update();
214  void dump( const MSG::Level level, const bool mode = true ) const;
215  // ==========================================================================
216 private:
217  // ==========================================================================
227  AlgMap m_algs;
229  NodeMap m_nodes;
230 
231  bool m_updateRequired = true;
232  // ==========================================================================
237  // ==========================================================================
241  bool m_locked_nodes = false;
242  bool m_locked_algs = false;
243  bool m_locked_all = false;
244  // ==========================================================================
247  // ==========================================================================
248  // Properties
249  Gaudi::Property<std::string> m_trapType{this, "IncidentName", "DataFault", "the type of handled Incident"};
250  Gaudi::Property<std::string> m_dataSvcName{this, "DataSvc", "EventDataSvc", "DataSvc name"};
251 
252  Gaudi::Property<bool> m_partialPath{this, "UsePreceedingPath", true, "allow creation of partial leaves"};
254  this, "Dump", false,
255  "dump configuration and stastics, if set to True after initialize it triggers a dump immediately"};
256  Gaudi::Property<bool> m_init{this, "PreInitialize", false, "(pre)initialize all algorithms"};
258  this, "AllowPreInitializeFailure", false,
259  "allow (pre)initialization of algorithms to fail without stopping the application"};
260 
261  Gaudi::Property<Setup> m_algMapping{this, "Algorithms", {}, "[[deprecated]] use AlgMap"};
262  Gaudi::Property<Setup> m_nodeMapping{this, "Nodes", {}, "[[deprecated]] use NodeMap"};
263 
265  Gaudi::Property<Map> m_algMap{this, "AlgMap", {}, "mapping {'data': 'algorithm'}"};
266  Gaudi::Property<Map> m_nodeMap{this, "NodeMap", {}, "mapping {'data': 'type'}"};
267 
268  Gaudi::Property<std::string> m_prefix{this, "Prefix", "/Event/"};
269 
271  this, "NodeMappingTools", {}, "list of tools of type IDODNodeMapper"};
273  this, "AlgMappingTools", {}, "list of tools of type IDODAlgMapper"};
274 };
275 // ============================================================================
276 
277 // ============================================================================
278 // The END
279 // ============================================================================
280 #endif // GAUDISVC_DATAONDEMANDSVC_H
281 // ============================================================================
void i_setNodeHandler(const std::string &name, const std::string &type)
Internal method to initialize a node handler.
The interface implemented by the IToolSvc base class.
Definition: IToolSvc.h:19
ChronoEntity m_timer_all
The ISvcLocator is the interface implemented by the Service Factory in the Application Manager to loc...
Definition: ISvcLocator.h:25
const std::string & name() const override
Retrieve name of the service.
Definition: Service.cpp:289
The DataOnDemandSvc listens to incidents typically triggered by the data service of the configurable ...
Implementation of property with value of concrete type.
Definition: Property.h:319
ChronoEntity m_timer_algs
a small helper class for implementation of ChronoStatSvc service, It also could be used as some local...
Definition: ChronoEntity.h:21
SmartIF< IIncidentSvc > m_incSvc
Incident service.
void handle(const Incident &incident) override
IIncidentListener interfaces overrides: incident handling.
std::vector< std::string > Setup
The IAlgManager is the interface implemented by the Algorithm Factory in the Application Manager to s...
Definition: IAlgManager.h:27
Gaudi::Property< std::string > m_trapType
STL namespace.
Gaudi::Property< Map > m_nodeMap
Gaudi::Property< bool > m_init
Data provider interface definition.
StatusCode initialize() override
Inherited Service overrides: Service initialization.
STL class.
SmartIF< IDataProviderSvc > m_dataSvc
Data provider reference.
ulonglong m_statNode
Gaudi::Property< Setup > m_algMapping
Gaudi::Property< std::vector< std::string > > m_algMapTools
ClassH clazz
the actual class
Gaudi::Property< std::string > m_prefix
Gaudi::Property< std::vector< std::string > > m_nodeMapTools
Helper class to parse a string of format "type/name".
Gaudi::Property< Map > m_algMap
StatusCode setup()
Setup routine (called by (re-) initialize.
StatusCode execHandler(const std::string &tag, Leaf &leaf)
Execute leaf handler (algorithm)
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:28
StatusCode setupNodeHandlers()
Initialize node handlers.
Helper class of the DataOnDemandSvc.
NodeMap m_nodes
Map of "empty" objects to be placed as intermediate nodes.
void dump(const MSG::Level level, const bool mode=true) const
dump the content of DataOnDemand service
The IAlgorithm is the interface implemented by the Algorithm base class.
Definition: IAlgorithm.h:28
dictionary l
Definition: gaudirun.py:440
Gaudi::Property< bool > m_partialPath
std::vector< IDODNodeMapper * > m_nodeMappers
SmartIF< IAlgManager > m_algMgr
Algorithm manager.
Node(ClassH c, bool e, std::string n)
SmartIF< IToolSvc > m_toolSvc
Data provider reference.
AlgMap m_algs
Map of algorithms to handle incidents.
Base class used to extend a class implementing other interfaces.
Definition: extends.h:10
Gaudi::Property< Setup > m_nodeMapping
Leaf(std::string t, std::string n)
ChronoEntity m_timer_nodes
Gaudi::Property< std::string > m_dataSvcName
Base class for all Incidents (computing events).
Definition: Incident.h:17
The interface implemented by the AlgTool base class.
Definition: IAlgTool.h:23
DataOnDemandSvc(const std::string &name, ISvcLocator *svc)
Standard initializing service constructor.
StatusCode finalize() override
Inherited Service overrides: Service finalization.
GaudiUtils::HashMap< Gaudi::StringKey, Node > NodeMap
~DataOnDemandSvc() override=default
Standard destructor.
ChronoEntity m_total
StatusCode setupAlgHandlers()
Initialize leaf handlers.
Helper class of the DataOnDemandSvc.
StatusCode i_setAlgHandler(const std::string &name, const Gaudi::Utils::TypeNameString &alg)
Internal method to initialize an algorithm handler.
Gaudi::Property< bool > m_dump
StatusCode configureHandler(Leaf &leaf)
Configure handler for leaf.
Gaudi::Property< bool > m_allowInitFailure
std::vector< IDODAlgMapper * > m_algMappers
std::map< std::string, std::string > Map
The interface implemented by the IncidentSvc service.
Definition: IIncidentSvc.h:23
StatusCode reinitialize() override
Inherited Service overrides: Service reinitialization.
StatusCode update()
update the handlers
GaudiUtils::HashMap< Gaudi::StringKey, Leaf > AlgMap