The Gaudi Framework  v31r0 (aeb156f0)
DataOnDemandSvc Class Reference

The DataOnDemandSvc listens to incidents typically triggered by the data service of the configurable name "IncidentName". More...

#include <src/IncidentSvc/DataOnDemandSvc.h>

Inheritance diagram for DataOnDemandSvc:
Collaboration diagram for DataOnDemandSvc:

Classes

struct  Leaf
 
struct  Node
 Helper class of the DataOnDemandSvc. More...
 
struct  Protection
 Helper class of the DataOnDemandSvc. More...
 

Public Types

typedef std::vector< std::stringSetup
 
typedef TClass * ClassH
 
typedef GaudiUtils::HashMap< Gaudi::StringKey, NodeNodeMap
 
typedef GaudiUtils::HashMap< Gaudi::StringKey, LeafAlgMap
 
- Public Types inherited from extends< Service, IIncidentListener >
using base_class = extends
 Typedef to this class. More...
 
using extend_interfaces_base = extend_interfaces< Interfaces... >
 Typedef to the base of this class. More...
 
- Public Types inherited from Service
using Factory = Gaudi::PluginService::Factory< IService *(const std::string &, ISvcLocator *)>
 
- Public Types inherited from PropertyHolder< CommonMessaging< implements< IService, IProperty, IStateful > > >
using PropertyHolderImpl = PropertyHolder< CommonMessaging< implements< IService, IProperty, IStateful > > >
 Typedef used to refer to this class from derived classes, as in. More...
 
- Public Types inherited from CommonMessaging< implements< IService, IProperty, IStateful > >
using base_class = CommonMessaging
 
- Public Types inherited from extend_interfaces< Interfaces... >
using ext_iids = typename Gaudi::interface_list_cat< typename Interfaces::ext_iids... >::type
 take union of the ext_iids of all Interfaces... More...
 

Public Member Functions

StatusCode initialize () override
 Inherited Service overrides: Service initialization. More...
 
StatusCode finalize () override
 Inherited Service overrides: Service finalization. More...
 
StatusCode reinitialize () override
 Inherited Service overrides: Service reinitialization. More...
 
void handle (const Incident &incident) override
 IIncidentListener interfaces overrides: incident handling. More...
 
- Public Member Functions inherited from extends< Service, IIncidentListener >
void * i_cast (const InterfaceID &tid) const override
 Implementation of IInterface::i_cast. More...
 
StatusCode queryInterface (const InterfaceID &ti, void **pp) override
 Implementation of IInterface::queryInterface. More...
 
std::vector< std::stringgetInterfaceNames () const override
 Implementation of IInterface::getInterfaceNames. More...
 
- Public Member Functions inherited from Service
const std::stringname () const override
 Retrieve name of the service. More...
 
StatusCode configure () override
 
StatusCode initialize () override
 
StatusCode start () override
 
StatusCode stop () override
 
StatusCode finalize () override
 
StatusCode terminate () override
 
Gaudi::StateMachine::State FSMState () const override
 
Gaudi::StateMachine::State targetFSMState () const override
 
StatusCode reinitialize () override
 
StatusCode restart () override
 
StatusCode sysInitialize () override
 Initialize Service. More...
 
StatusCode sysStart () override
 Initialize Service. More...
 
StatusCode sysStop () override
 Initialize Service. More...
 
StatusCode sysFinalize () override
 Finalize Service. More...
 
StatusCode sysReinitialize () override
 Re-initialize the Service. More...
 
StatusCode sysRestart () override
 Re-initialize the Service. More...
 
 Service (std::string name, ISvcLocator *svcloc)
 Standard Constructor. More...
 
SmartIF< ISvcLocator > & serviceLocator () const override
 Retrieve pointer to service locator. More...
 
StatusCode setProperties ()
 Method for setting declared properties to the values specified for the job. More...
 
template<class T >
StatusCode service (const std::string &name, const T *&psvc, bool createIf=true) const
 Access a service by name, creating it if it doesn't already exist. More...
 
template<class T >
StatusCode service (const std::string &name, T *&psvc, bool createIf=true) const
 
template<typename IFace = IService>
SmartIF< IFace > service (const std::string &name, bool createIf=true) const
 
template<class T >
StatusCode service (const std::string &svcType, const std::string &svcName, T *&psvc) const
 Access a service by name and type, creating it if it doesn't already exist. More...
 
template<class T >
StatusCode declareTool (ToolHandle< T > &handle, std::string toolTypeAndName, bool createIf=true)
 Declare used tool. More...
 
SmartIF< IAuditorSvc > & auditorSvc () const
 The standard auditor service.May not be invoked before sysInitialize() has been invoked. More...
 
- Public Member Functions inherited from PropertyHolder< CommonMessaging< implements< IService, IProperty, IStateful > > >
 PropertyHolder ()=default
 
Gaudi::Details::PropertyBasedeclareProperty (Gaudi::Details::PropertyBase &prop)
 Declare a property. More...
 
Gaudi::Details::PropertyBasedeclareProperty (const std::string &name, TYPE &value, const std::string &doc="none")
 Helper to wrap a regular data member and use it as a regular property. More...
 
Gaudi::Details::PropertyBasedeclareProperty (const std::string &name, Gaudi::Property< TYPE, VERIFIER, HANDLERS > &prop, const std::string &doc="none")
 Declare a PropertyBase instance setting name and documentation. More...
 
Gaudi::Details::PropertyBasedeclareRemoteProperty (const std::string &name, IProperty *rsvc, const std::string &rname="")
 Declare a remote property. More...
 
StatusCode setProperty (const Gaudi::Details::PropertyBase &p) override
 set the property form another property More...
 
StatusCode setProperty (const std::string &s) override
 set the property from the formatted string More...
 
StatusCode setProperty (const std::string &n, const std::string &v) override
 set the property from name and the value More...
 
StatusCode setProperty (const std::string &name, const TYPE &value)
 set the property form the value More...
 
StatusCode getProperty (Gaudi::Details::PropertyBase *p) const override
 get the property More...
 
const Gaudi::Details::PropertyBasegetProperty (const std::string &name) const override
 get the property by name More...
 
StatusCode getProperty (const std::string &n, std::string &v) const override
 convert the property to the string More...
 
const std::vector< Gaudi::Details::PropertyBase * > & getProperties () const override
 get all properties More...
 
bool hasProperty (const std::string &name) const override
 Return true if we have a property with the given name. More...
 
 PropertyHolder (const PropertyHolder &)=delete
 
PropertyHolderoperator= (const PropertyHolder &)=delete
 
- Public Member Functions inherited from CommonMessaging< implements< IService, IProperty, IStateful > >
MSG::Level msgLevel () const
 get the cached level (originally extracted from the embedded MsgStream) More...
 
bool msgLevel (MSG::Level lvl) const
 get the output level from the embedded MsgStream More...
 
MSG::Level outputLevel () const
 Backward compatibility function for getting the output level. More...
 
- Public Member Functions inherited from CommonMessagingBase
virtual ~CommonMessagingBase ()=default
 Virtual destructor. More...
 
const SmartIF< IMessageSvc > & msgSvc () const
 The standard message service. More...
 
MsgStreammsgStream () const
 Return an uninitialized MsgStream. More...
 
MsgStreammsgStream (const MSG::Level level) const
 Predefined configurable message stream for the efficient printouts. More...
 
MsgStreamalways () const
 shortcut for the method msgStream(MSG::ALWAYS) More...
 
MsgStreamfatal () const
 shortcut for the method msgStream(MSG::FATAL) More...
 
MsgStreamerr () const
 shortcut for the method msgStream(MSG::ERROR) More...
 
MsgStreamerror () const
 shortcut for the method msgStream(MSG::ERROR) More...
 
MsgStreamwarning () const
 shortcut for the method msgStream(MSG::WARNING) More...
 
MsgStreaminfo () const
 shortcut for the method msgStream(MSG::INFO) More...
 
MsgStreamdebug () const
 shortcut for the method msgStream(MSG::DEBUG) More...
 
MsgStreamverbose () const
 shortcut for the method msgStream(MSG::VERBOSE) More...
 
MsgStreammsg () const
 shortcut for the method msgStream(MSG::INFO) More...
 

Protected Member Functions

StatusCode configureHandler (Leaf &leaf)
 Configure handler for leaf. More...
 
StatusCode execHandler (const std::string &tag, Leaf &leaf)
 Execute leaf handler (algorithm) More...
 
StatusCode execHandler (const std::string &tag, Node &node)
 Execute node handler (simple object creation using seal reflection) More...
 
StatusCode setupNodeHandlers ()
 Initialize node handlers. More...
 
StatusCode setupAlgHandlers ()
 Initialize leaf handlers. More...
 
StatusCode setup ()
 Setup routine (called by (re-) initialize. More...
 
void i_setNodeHandler (const std::string &name, const std::string &type)
 Internal method to initialize a node handler. More...
 
StatusCode i_setAlgHandler (const std::string &name, const Gaudi::Utils::TypeNameString &alg)
 Internal method to initialize an algorithm handler. More...
 
StatusCode update ()
 update the handlers More...
 
void dump (const MSG::Level level, const bool mode=true) const
 dump the content of DataOnDemand service More...
 
- Protected Member Functions inherited from Service
 ~Service () override
 Standard Destructor. More...
 
int outputLevel () const
 get the Service's output level More...
 
- Protected Member Functions inherited from PropertyHolder< CommonMessaging< implements< IService, IProperty, IStateful > > >
Gaudi::Details::PropertyBaseproperty (const std::string &name) const
 
- Protected Member Functions inherited from CommonMessaging< implements< IService, IProperty, IStateful > >
MSG::Level setUpMessaging () const
 Set up local caches. More...
 
MSG::Level resetMessaging ()
 Reinitialize internal states. More...
 
void updateMsgStreamOutputLevel (int level)
 Update the output level of the cached MsgStream. More...
 

Private Types

typedef std::map< std::string, std::stringMap
 

Private Member Functions

void force_update (Gaudi::Details::PropertyBase &p)
 
void deprecated_property (Gaudi::Details::PropertyBase &p)
 

Private Attributes

SmartIF< IIncidentSvcm_incSvc = nullptr
 Incident service. More...
 
SmartIF< IAlgManagerm_algMgr = nullptr
 Algorithm manager. More...
 
SmartIF< IDataProviderSvcm_dataSvc = nullptr
 Data provider reference. More...
 
SmartIF< IToolSvcm_toolSvc
 Data provider reference. More...
 
AlgMap m_algs
 Map of algorithms to handle incidents. More...
 
NodeMap m_nodes
 Map of "empty" objects to be placed as intermediate nodes. More...
 
bool m_updateRequired = true
 
ChronoEntity m_total
 
unsigned long long m_statAlg = 0
 
unsigned long long m_statNode = 0
 
unsigned long long m_stat = 0
 
ChronoEntity m_timer_nodes
 
ChronoEntity m_timer_algs
 
ChronoEntity m_timer_all
 
bool m_locked_nodes = false
 
bool m_locked_algs = false
 
bool m_locked_all = false
 
std::vector< IDODNodeMapper * > m_nodeMappers
 
std::vector< IDODAlgMapper * > m_algMappers
 
Gaudi::Property< std::stringm_trapType {this, "IncidentName", "DataFault", "the type of handled Incident"}
 
Gaudi::Property< std::stringm_dataSvcName {this, "DataSvc", "EventDataSvc", "DataSvc name"}
 
Gaudi::Property< bool > m_partialPath {this, "UsePreceedingPath", true, "allow creation of partial leaves"}
 
Gaudi::Property< bool > m_dump
 
Gaudi::Property< bool > m_init {this, "PreInitialize", false, "(pre)initialize all algorithms"}
 
Gaudi::Property< bool > m_allowInitFailure
 
Gaudi::Property< Setupm_algMapping
 
Gaudi::Property< Setupm_nodeMapping
 
Gaudi::Property< Mapm_algMap {this, "AlgMap", {}, &DataOnDemandSvc::force_update, "mapping {'data': 'algorithm'}"}
 
Gaudi::Property< Mapm_nodeMap {this, "NodeMap", {}, &DataOnDemandSvc::force_update, "mapping {'data': 'type'}"}
 
Gaudi::Property< std::stringm_prefix {this, "Prefix", "/Event/"}
 
Gaudi::Property< std::vector< std::string > > m_nodeMapTools
 
Gaudi::Property< std::vector< std::string > > m_algMapTools
 

Additional Inherited Members

- Protected Attributes inherited from Service
Gaudi::StateMachine::State m_state = Gaudi::StateMachine::OFFLINE
 Service state. More...
 
Gaudi::StateMachine::State m_targetState = Gaudi::StateMachine::OFFLINE
 Service state. More...
 
Gaudi::Property< int > m_outputLevel {this, "OutputLevel", MSG::NIL, "output level"}
 
Gaudi::Property< bool > m_auditInit {this, "AuditServices", false, "[[deprecated]] unused"}
 
Gaudi::Property< bool > m_auditorInitialize {this, "AuditInitialize", false, "trigger auditor on initialize()"}
 
Gaudi::Property< bool > m_auditorStart {this, "AuditStart", false, "trigger auditor on start()"}
 
Gaudi::Property< bool > m_auditorStop {this, "AuditStop", false, "trigger auditor on stop()"}
 
Gaudi::Property< bool > m_auditorFinalize {this, "AuditFinalize", false, "trigger auditor on finalize()"}
 
Gaudi::Property< bool > m_auditorReinitialize {this, "AuditReinitialize", false, "trigger auditor on reinitialize()"}
 
Gaudi::Property< bool > m_auditorRestart {this, "AuditRestart", false, "trigger auditor on restart()"}
 
SmartIF< IAuditorSvcm_pAuditorSvc
 Auditor Service. More...
 

Detailed Description

The DataOnDemandSvc listens to incidents typically triggered by the data service of the configurable name "IncidentName".

In the job options handlers can be declared, which allow to configure this service. Such handlers are either:

  • Node handlers, if objects other than the default object type have to be instantiated. DataOnDemandSvc.Nodes = { "DATA='/Event/Rec' TYPE='DataObject'", "DATA='/Event/Rec/Muon' TYPE='DataObject'" };
  • Leaf handlers (Algorithms), which get instantiated and executed on demand. DataOnDemandSvc.Algorithms = { "DATA='/Event/Rec/Muon/Digits' TYPE='MuonDigitAlg/MyMuonDigits'" }; If the algorithm name is omitted the class name will be the instance name.

The handlers only get called if the exact path matches. In the event already the partial path to any handler is missing a leaf handler may be triggered, which includes the partial paths ( DataOnDemandSvc.UsePreceedingPath = true )

2006-10-15: New options (using map-like semantics:)

{ "Phys/StdLoosePions/Particles" : "PreLoadParticles/StdLoosePions" ,
"Phys/StdLoosePions/Vertioces" : "PreLoadParticles/StdLoosePions" } ;
{ "Phys" : "DataObject" ,
"MC" : "DataObject" } ;

New treatment of preceding paths. for each registered leaf or node the all parent nodes are added into the node-map with default directory type 'DataObject'

The major properties are equipped with handlers (more or less mandatory for interactive work in python)

From now the default prefix ( "/Event/" ) could be omitted from any data-item. It will be added automatically.

Author
M.Frank
Version
1.0

Definition at line 90 of file DataOnDemandSvc.h.

Member Typedef Documentation

typedef TClass* DataOnDemandSvc::ClassH

Definition at line 95 of file DataOnDemandSvc.h.

Definition at line 267 of file DataOnDemandSvc.h.

Definition at line 94 of file DataOnDemandSvc.h.

Member Function Documentation

StatusCode DataOnDemandSvc::configureHandler ( Leaf leaf)
protected

Configure handler for leaf.

Parameters
leaf[IN] Reference to leaf handler
Returns
StatusCode indicating success or failure

Definition at line 385 of file DataOnDemandSvc.cpp.

385  {
386  if ( l.algorithm ) { return StatusCode::SUCCESS; }
387  if ( !m_algMgr ) { return StatusCode::FAILURE; }
388  l.algorithm = m_algMgr->algorithm( l.name, false );
389  if ( l.algorithm ) { return StatusCode::SUCCESS; }
390  // create it!
391  StatusCode sc = m_algMgr->createAlgorithm( l.type, l.name, l.algorithm, true );
392  if ( sc.isFailure() ) {
393  error() << "Failed to create algorithm " << l.type << "('" << l.name << "')" << endmsg;
394  l.algorithm = nullptr;
395  return sc; // RETURN
396  }
397  if ( l.algorithm->isInitialized() ) { return StatusCode::SUCCESS; }
398  // initialize it!
399  sc = l.algorithm->sysInitialize();
400  if ( sc.isFailure() ) {
401  error() << "Failed to initialize algorithm " << l.type << "('" << l.name << "')" << endmsg;
402  l.algorithm = nullptr;
403  return sc; // RETURN
404  }
405  if ( Gaudi::StateMachine::RUNNING == l.algorithm->FSMState() ) { return StatusCode::SUCCESS; }
406  // run it!
407  sc = l.algorithm->sysStart();
408  if ( sc.isFailure() ) {
409  error() << "Failed to 'run' algorithm " << l.type << "('" << l.name << "')" << endmsg;
410  l.algorithm = nullptr;
411  return sc; // RETURN
412  }
413  return StatusCode::SUCCESS;
414 }
virtual SmartIF< IAlgorithm > & algorithm(const Gaudi::Utils::TypeNameString &typeName, const bool createIf=true)=0
Returns a smart pointer to a service.
constexpr static const auto SUCCESS
Definition: StatusCode.h:85
bool isFailure() const
Definition: StatusCode.h:130
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:50
dictionary l
Definition: gaudirun.py:517
SmartIF< IAlgManager > m_algMgr
Algorithm manager.
virtual StatusCode createAlgorithm(const std::string &algtype, const std::string &algname, IAlgorithm *&alg, bool managed=false, bool checkIfExists=true )=0
Create an instance of a algorithm type that has been declared beforehand and assigns to it a name...
constexpr static const auto FAILURE
Definition: StatusCode.h:86
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:192
void DataOnDemandSvc::deprecated_property ( Gaudi::Details::PropertyBase p)
inlineprivate

Definition at line 210 of file DataOnDemandSvc.h.

210  {
211  warning() << p.name() << " " << p.documentation() << endmsg;
212  force_update( p );
213  };
const std::string name() const
property name
Definition: Property.h:36
void force_update(Gaudi::Details::PropertyBase &p)
MsgStream & warning() const
shortcut for the method msgStream(MSG::WARNING)
std::string documentation() const
property documentation
Definition: Property.h:38
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:192
void DataOnDemandSvc::dump ( const MSG::Level  level,
const bool  mode = true 
) const
protected

dump the content of DataOnDemand service

Parameters
levelthe printout level
modethe printout mode

Definition at line 605 of file DataOnDemandSvc.cpp.

605  {
606  if ( m_algs.empty() && m_nodes.empty() ) { return; }
607 
610  for ( auto& alg : m_algs ) {
611  auto check = _m.find( alg.first );
612  if ( _m.end() != check ) {
613  warning() << " The data item is activated for '" << check->first << "' as '" << check->second.first << "'"
614  << endmsg;
615  }
616  const Leaf& l = alg.second;
617  std::string nam = ( l.name == l.type ? l.type : ( l.type + "/" + l.name ) );
618  //
619  if ( !mode && 0 == l.num ) { continue; }
620  //
621  std::string val;
622  if ( mode ) {
623  val = ( !l.algorithm ) ? "F" : "T";
624  } else {
625  val = std::to_string( l.num );
626  }
627  //
628  _m[no_prefix( alg.first, m_prefix )] = {nam, val};
629  }
630  // nodes:
631  for ( const auto& node : m_nodes ) {
632  auto check = _m.find( node.first );
633  if ( _m.end() != check ) {
634  warning() << " The data item is already activated for '" << check->first << "' as '" << check->second.first << "'"
635  << endmsg;
636  }
637  const Node& n = node.second;
638  std::string nam = "'" + n.name + "'";
639  //
640  std::string val;
641 
642  if ( !mode && 0 == n.num ) { continue; }
643 
644  if ( mode ) {
645  val = ( 0 == n.clazz ) ? "F" : "T";
646  } else {
647  val = std::to_string( n.num );
648  }
649  //
650  _m[no_prefix( node.first, m_prefix )] = {nam, val};
651  }
652  //
653  if ( _m.empty() ) { return; }
654 
655  // find the correct formats
656  size_t n1 = 0;
657  size_t n2 = 0;
658  size_t n3 = 0;
659  for ( const auto& i : _m ) {
660  n1 = std::max( n1, i.first.size() );
661  n2 = std::max( n2, i.second.first.size() );
662  n3 = std::max( n3, i.second.second.size() );
663  }
664  if ( 10 > n1 ) { n1 = 10; }
665  if ( 10 > n2 ) { n2 = 10; }
666  if ( 60 < n1 ) { n1 = 60; }
667  if ( 60 < n2 ) { n2 = 60; }
668  //
669 
670  const std::string _f = " | %%1$-%1%.%1%s | %%2$-%2%.%2%s | %%3$%3%.%3%s |";
671  boost::format _ff( _f );
672  _ff % n1 % n2 % n3;
673 
674  const std::string _format = _ff.str();
675 
676  auto& msg = msgStream( level );
677 
678  if ( mode ) {
679  msg << "Data-On-Demand Actions enabled for:";
680  } else {
681  msg << "Data-On-Demand Actions has been used for:";
682  }
683 
684  boost::format fmt1( _format );
685  fmt1 % "Address" % "Creator" % ( mode ? "S" : "#" );
686  //
687  const std::string header = fmt1.str();
688  std::string line = std::string( header.size(), '-' );
689  line[0] = ' ';
690 
691  msg << '\n' << line << '\n' << header << '\n' << line;
692 
693  // make the actual printout:
694  for ( const auto& item : _m ) {
695  boost::format fmt( _format );
696  msg << '\n' << ( fmt % item.first % item.second.first % item.second.second );
697  }
698 
699  msg << '\n' << line << endmsg;
700 }
MsgStream & msg() const
shortcut for the method msgStream(MSG::INFO)
T empty(T...args)
GAUDI_API std::string format(const char *,...)
MsgStream format utility "a la sprintf(...)".
Definition: MsgStream.cpp:109
T to_string(T...args)
T end(T...args)
STL class.
GAUDI_API std::string header(const int ID=Default)
get the recommended header by enum
STL class.
Gaudi::Property< std::string > m_prefix
MsgStream & warning() const
shortcut for the method msgStream(MSG::WARNING)
bool empty() const
Definition: Map.h:191
NodeMap m_nodes
Map of "empty" objects to be placed as intermediate nodes.
T max(T...args)
dictionary l
Definition: gaudirun.py:517
T find(T...args)
T size(T...args)
AlgMap m_algs
Map of algorithms to handle incidents.
MsgStream & msgStream() const
Return an uninitialized MsgStream.
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:192
StatusCode DataOnDemandSvc::execHandler ( const std::string tag,
Leaf leaf 
)
protected

Execute leaf handler (algorithm)

Parameters
tag[IN] Path to requested leaf
leaf[IN] Reference to leaf handler
Returns
StatusCode indicating success or failure

Definition at line 569 of file DataOnDemandSvc.cpp.

569  {
571  //
572  if ( l.executing ) { return StatusCode::FAILURE; } // RETURN
573  //
574  if ( !l.algorithm ) {
575  StatusCode sc = configureHandler( l );
576  if ( sc.isFailure() ) {
577  error() << "Failed to configure handler for: " << l.name << "[" << l.type << "] " << tag << endmsg;
578  return sc; // RETURN
579  }
580  }
581  //
582  Chrono atimer( m_total );
583  //
584  Protection p( l.executing );
585  // FIXME: this will cause problems for Hive, as we need to set
586  // the EventContext of the called Algorithm.
587  // if (!l.algorithm->getContext()) {
588  // l.algorithm->setContext( &Gaudi::Hive::currentContext() );
589  // }
590  StatusCode sc = l.algorithm->sysExecute( Gaudi::Hive::currentContext() );
591  if ( sc.isFailure() ) {
592  error() << "Failed to execute the algorithm:" << l.algorithm->name() << " for location:" << tag << endmsg;
593  return sc; // RETURN
594  }
595  ++l.num;
596  //
597  return StatusCode::SUCCESS;
598 }
ChronoEntity m_timer_algs
constexpr static const auto SUCCESS
Definition: StatusCode.h:85
A small utility class for chronometry of user codes.
Definition: Chrono.h:25
bool isFailure() const
Definition: StatusCode.h:130
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:50
GAUDI_API const EventContext & currentContext()
dictionary l
Definition: gaudirun.py:517
Helper object, useful for measurement of CPU-performance of highly-recursive structures, e.g.
Definition: LockedChrono.h:50
constexpr static const auto FAILURE
Definition: StatusCode.h:86
ChronoEntity m_total
StatusCode configureHandler(Leaf &leaf)
Configure handler for leaf.
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:192
StatusCode DataOnDemandSvc::execHandler ( const std::string tag,
Node node 
)
protected

Execute node handler (simple object creation using seal reflection)

Parameters
tag[IN] Path to requested leaf
node[IN] Reference to node handler
Returns
StatusCode indicating success or failure

Definition at line 529 of file DataOnDemandSvc.cpp.

529  {
530 
532 
533  if ( n.executing ) { return StatusCode::FAILURE; } // RETURN
534 
535  Protection p( n.executing );
536 
538 
539  if ( n.dataObject ) {
540  object.reset( new DataObject() );
541  } else {
542  // try to recover the handler
543  if ( !n.clazz ) { n.clazz = TClass::GetClass( n.name.c_str() ); }
544  if ( !n.clazz ) {
545  error() << "Failed to get dictionary for class '" << n.name << "' for location:" << tag << endmsg;
546  return StatusCode::FAILURE; // RETURN
547  }
548 
549  object.reset( reinterpret_cast<DataObject*>( n.clazz->New() ) );
550 
551  if ( !object ) {
552  error() << "Failed to create an object of type:" << n.clazz->GetName() << " for location:" << tag << endmsg;
553  return StatusCode::FAILURE; // RETURN
554  }
555  }
556  //
557  StatusCode sc = m_dataSvc->registerObject( tag, object.release() );
558  if ( sc.isFailure() ) {
559  error() << "Failed to register an object of type:" << n.name << " at location:" << tag << endmsg;
560  return sc; // RETURN
561  }
562  ++n.num;
563  //
564  return StatusCode::SUCCESS;
565 }
constexpr static const auto SUCCESS
Definition: StatusCode.h:85
bool isFailure() const
Definition: StatusCode.h:130
SmartIF< IDataProviderSvc > m_dataSvc
Data provider reference.
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:50
T reset(T...args)
StatusCode registerObject(boost::string_ref fullPath, DataObject *pObject)
Register object with the data store.
STL class.
Helper object, useful for measurement of CPU-performance of highly-recursive structures, e.g.
Definition: LockedChrono.h:50
ChronoEntity m_timer_nodes
constexpr static const auto FAILURE
Definition: StatusCode.h:86
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:192
StatusCode DataOnDemandSvc::finalize ( )
override

Inherited Service overrides: Service finalization.

Definition at line 201 of file DataOnDemandSvc.cpp.

201  {
202  //
203  info() << "Handled \"" << m_trapType.value() << "\" incidents: " << m_statAlg << "/" << m_statNode << "/" << m_stat
204  << "(Alg/Node/Total)." << endmsg;
205  if ( m_dump || msgLevel( MSG::DEBUG ) ) {
206  info() << m_total.outputUserTime( "Algorithm timing: Mean(+-rms)/Min/Max:%3%(+-%4%)/%6%/%7%[ms] ",
208  << m_total.outputUserTime( "Total:%2%[s]", System::Sec ) << endmsg;
209  info() << m_timer_nodes.outputUserTime( "Nodes timing: Mean(+-rms)/Min/Max:%3%(+-%4%)/%6%/%7%[ms] ",
211  << m_timer_nodes.outputUserTime( "Total:%2%[s]", System::Sec ) << endmsg;
212  info() << m_timer_algs.outputUserTime( "Algs timing: Mean(+-rms)/Min/Max:%3%(+-%4%)/%6%/%7%[ms] ",
214  << m_timer_algs.outputUserTime( "Total:%2%[s]", System::Sec ) << endmsg;
215  info() << m_timer_all.outputUserTime( "All timing: Mean(+-rms)/Min/Max:%3%(+-%4%)/%6%/%7%[ms] ",
217  << m_timer_all.outputUserTime( "Total:%2%[s]", System::Sec ) << endmsg;
218  }
219  // dump it!
220  if ( m_dump ) {
221  dump( MSG::INFO, false );
222  } else if ( msgLevel( MSG::DEBUG ) ) {
223  dump( MSG::DEBUG, false );
224  }
225  //
226  if ( m_incSvc ) {
228  m_incSvc.reset();
229  }
230  m_algMgr.reset();
231  m_dataSvc.reset();
232  if ( m_toolSvc ) { // we may not have retrieved the ToolSvc
233  // Do not call releaseTool if the ToolSvc was already finalized.
235  for ( const auto& i : m_nodeMappers ) m_toolSvc->releaseTool( i ).ignore();
236  for ( const auto& i : m_algMappers ) m_toolSvc->releaseTool( i ).ignore();
237  } else {
238  warning() << "ToolSvc already finalized: cannot release tools. Check options." << endmsg;
239  }
240  m_nodeMappers.clear();
241  m_algMappers.clear();
242  m_toolSvc.reset();
243  }
244  return Service::finalize();
245 }
ChronoEntity m_timer_all
StatusCode finalize() override
Definition: Service.cpp:164
ChronoEntity m_timer_algs
MsgStream & info() const
shortcut for the method msgStream(MSG::INFO)
SmartIF< IIncidentSvc > m_incSvc
Incident service.
Gaudi::Property< std::string > m_trapType
SmartIF< IDataProviderSvc > m_dataSvc
Data provider reference.
unsigned long long m_stat
MsgStream & warning() const
shortcut for the method msgStream(MSG::WARNING)
void clear(STATE_TYPE _i=std::ios_base::failbit)
Definition: MsgStream.h:171
void dump(const MSG::Level level, const bool mode=true) const
dump the content of DataOnDemand service
std::vector< IDODNodeMapper * > m_nodeMappers
std::string outputUserTime() const
print the chrono ;
SmartIF< IAlgManager > m_algMgr
Algorithm manager.
SmartIF< IToolSvc > m_toolSvc
Data provider reference.
ChronoEntity m_timer_nodes
const StatusCode & ignore() const
Ignore/check StatusCode.
Definition: StatusCode.h:153
Gaudi::StateMachine::State FSMState() const override
Definition: Service.h:52
virtual StatusCode releaseTool(IAlgTool *tool)=0
Release the tool.
ChronoEntity m_total
void reset(TYPE *ptr=nullptr)
Set the internal pointer to the passed one disposing of the old one.
Definition: SmartIF.h:86
virtual void removeListener(IIncidentListener *lis, const std::string &type="")=0
Remove listener.
Gaudi::Property< bool > m_dump
std::vector< IDODAlgMapper * > m_algMappers
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:192
unsigned long long m_statNode
unsigned long long m_statAlg
MSG::Level msgLevel() const
get the cached level (originally extracted from the embedded MsgStream)
void DataOnDemandSvc::force_update ( Gaudi::Details::PropertyBase p)
inlineprivate

Definition at line 206 of file DataOnDemandSvc.h.

206  {
207  verbose() << "updated property " << p.name() << ", forcing update" << endmsg;
208  m_updateRequired = true;
209  };
const std::string name() const
property name
Definition: Property.h:36
MsgStream & verbose() const
shortcut for the method msgStream(MSG::VERBOSE)
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:192
void DataOnDemandSvc::handle ( const Incident incident)
override

IIncidentListener interfaces overrides: incident handling.

Definition at line 467 of file DataOnDemandSvc.cpp.

467  {
468 
470 
471  ++m_stat;
472  // proper incident type?
473  if ( incident.type() != m_trapType ) { return; } // RETURN
474  const DataIncident* inc = dynamic_cast<const DataIncident*>( &incident );
475  if ( !inc ) { return; } // RETURN
476  // update if needed!
477  if ( m_updateRequired ) { update(); }
478 
479  if ( msgLevel( MSG::VERBOSE ) ) {
480  verbose() << "Incident: [" << incident.type() << "] "
481  << " = " << incident.source() << " Location:" << inc->tag() << endmsg;
482  }
483  // ==========================================================================
484  Gaudi::StringKey tag( inc->tag() );
485  // ==========================================================================
486  auto icl = m_nodes.find( tag );
487  if ( icl != m_nodes.end() ) {
488  StatusCode sc = execHandler( tag, icl->second );
489  if ( sc.isSuccess() ) { ++m_statNode; }
490  return; // RETURN
491  }
492  // ==========================================================================
493  auto ialg = m_algs.find( tag );
494  if ( ialg != m_algs.end() ) {
495  StatusCode sc = execHandler( tag, ialg->second );
496  if ( sc.isSuccess() ) { ++m_statAlg; }
497  return; // RETURN
498  }
499  // ==========================================================================
500  // Fall back on the tools
501  if ( m_toolSvc ) {
502  if ( msgLevel( MSG::VERBOSE ) ) verbose() << "Try to find mapping with mapping tools" << endmsg;
503  Finder finder( no_prefix( inc->tag(), m_prefix ), m_nodeMappers, m_algMappers );
504  // - try the node mappers
505  std::string node = finder.node();
506  if ( isGood( node ) ) {
507  // if one is found update the internal node mapping and try again.
508  if ( msgLevel( MSG::VERBOSE ) ) verbose() << "Found Node handler: " << node << endmsg;
509  i_setNodeHandler( inc->tag(), node );
510  handle( incident );
511  --m_stat; // avoid double counting because of recursion
512  return;
513  }
514  // - try alg mappings
515  Gaudi::Utils::TypeNameString alg = finder.alg();
516  if ( isGood( alg ) ) {
517  // we got an algorithm, update alg map and try to handle again
518  if ( msgLevel( MSG::VERBOSE ) ) verbose() << "Found Algorithm handler: " << alg << endmsg;
519  i_setAlgHandler( inc->tag(), alg ).ignore();
520  handle( incident );
521  --m_stat; // avoid double counting because of recursion
522  return;
523  }
524  }
525 }
void i_setNodeHandler(const std::string &name, const std::string &type)
Internal method to initialize a node handler.
ChronoEntity m_timer_all
const std::string & type() const
Access to the incident type.
Definition: Incident.h:38
const std::string & source() const
Access to the source of the incident.
Definition: Incident.h:44
bool isSuccess() const
Definition: StatusCode.h:267
void handle(const Incident &incident) override
IIncidentListener interfaces overrides: incident handling.
MsgStream & verbose() const
shortcut for the method msgStream(MSG::VERBOSE)
Gaudi::Property< std::string > m_trapType
The helper class to represent the efficient "key" for access.
Definition: StringKey.h:34
STL class.
Gaudi::Property< std::string > m_prefix
unsigned long long m_stat
iterator end()
Definition: Map.h:130
Helper class to parse a string of format "type/name".
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:50
iterator find(const key_type &key)
Definition: Map.h:147
NodeMap m_nodes
Map of "empty" objects to be placed as intermediate nodes.
std::vector< IDODNodeMapper * > m_nodeMappers
SmartIF< IToolSvc > m_toolSvc
Data provider reference.
Helper object, useful for measurement of CPU-performance of highly-recursive structures, e.g.
Definition: LockedChrono.h:50
AlgMap m_algs
Map of algorithms to handle incidents.
Data service incident class.
StatusCode i_setAlgHandler(const std::string &name, const Gaudi::Utils::TypeNameString &alg)
Internal method to initialize an algorithm handler.
std::vector< IDODAlgMapper * > m_algMappers
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:192
unsigned long long m_statNode
unsigned long long m_statAlg
StatusCode update()
update the handlers
MSG::Level msgLevel() const
get the cached level (originally extracted from the embedded MsgStream)
StatusCode DataOnDemandSvc::i_setAlgHandler ( const std::string name,
const Gaudi::Utils::TypeNameString alg 
)
protected

Internal method to initialize an algorithm handler.

Definition at line 112 of file DataOnDemandSvc.cpp.

112  {
113  Leaf leaf( alg.type(), alg.name() );
114  if ( m_init ) {
115  StatusCode sc = configureHandler( leaf );
116  if ( sc.isFailure() ) {
117  if ( m_allowInitFailure ) {
118  // re-store the content of the leaf object to try again to initialize
119  // the algorithm later (on demand)
120  leaf = Leaf( alg.type(), alg.name() );
121  } else
122  return sc;
123  }
124  }
125  m_algs[name] = leaf;
126  return StatusCode::SUCCESS;
127 }
const std::string & name() const override
Retrieve name of the service.
Definition: Service.cpp:274
constexpr static const auto SUCCESS
Definition: StatusCode.h:85
Gaudi::Property< bool > m_init
bool isFailure() const
Definition: StatusCode.h:130
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:50
AlgMap m_algs
Map of algorithms to handle incidents.
const std::string & type() const
const std::string & name() const
StatusCode configureHandler(Leaf &leaf)
Configure handler for leaf.
Gaudi::Property< bool > m_allowInitFailure
void DataOnDemandSvc::i_setNodeHandler ( const std::string name,
const std::string type 
)
protected

Internal method to initialize a node handler.

Definition at line 106 of file DataOnDemandSvc.cpp.

106  {
107  ClassH cl = TClass::GetClass( type.c_str() );
108  if ( !cl ) { warning() << "Failed to access dictionary class for " << name << " of type:" << type << endmsg; }
109  m_nodes[name] = Node( cl, false, type );
110 }
const std::string & name() const override
Retrieve name of the service.
Definition: Service.cpp:274
MsgStream & warning() const
shortcut for the method msgStream(MSG::WARNING)
NodeMap m_nodes
Map of "empty" objects to be placed as intermediate nodes.
T c_str(T...args)
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:192
StatusCode DataOnDemandSvc::initialize ( )
override

Inherited Service overrides: Service initialization.

Definition at line 181 of file DataOnDemandSvc.cpp.

181  {
182  // initialize the Service Base class
184  if ( sc.isFailure() ) { return sc; }
185  sc = setup();
186  if ( sc.isFailure() ) { return sc; }
187  //
188  if ( m_dump ) {
189  dump( MSG::INFO );
190  } else if ( msgLevel( MSG::DEBUG ) ) {
191  dump( MSG::DEBUG );
192  }
193  //
194  if ( m_init ) { return update(); }
195  //
196  return StatusCode::SUCCESS;
197 }
StatusCode initialize() override
Definition: Service.cpp:60
constexpr static const auto SUCCESS
Definition: StatusCode.h:85
Gaudi::Property< bool > m_init
bool isFailure() const
Definition: StatusCode.h:130
StatusCode setup()
Setup routine (called by (re-) initialize.
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:50
void dump(const MSG::Level level, const bool mode=true) const
dump the content of DataOnDemand service
Gaudi::Property< bool > m_dump
StatusCode update()
update the handlers
MSG::Level msgLevel() const
get the cached level (originally extracted from the embedded MsgStream)
StatusCode DataOnDemandSvc::reinitialize ( )
override

Inherited Service overrides: Service reinitialization.

re-initialization of the service

Definition at line 249 of file DataOnDemandSvc.cpp.

249  {
250  // reinitialize the Service Base class
251  if ( m_incSvc ) {
253  m_incSvc.reset();
254  }
255  m_algMgr.reset();
256  m_dataSvc.reset();
257  for ( const auto& i : m_nodeMappers ) m_toolSvc->releaseTool( i ).ignore();
258  m_nodeMappers.clear();
259  for ( const auto& i : m_algMappers ) m_toolSvc->releaseTool( i ).ignore();
260  m_algMappers.clear();
261  m_toolSvc.reset();
262  //
264  if ( sc.isFailure() ) { return sc; }
265  //
266  sc = setup();
267  if ( sc.isFailure() ) { return sc; }
268  //
269  if ( m_dump ) {
270  dump( MSG::INFO );
271  } else if ( msgLevel( MSG::DEBUG ) ) {
272  dump( MSG::DEBUG );
273  }
274  //
275  return StatusCode::SUCCESS;
276 }
SmartIF< IIncidentSvc > m_incSvc
Incident service.
constexpr static const auto SUCCESS
Definition: StatusCode.h:85
Gaudi::Property< std::string > m_trapType
bool isFailure() const
Definition: StatusCode.h:130
SmartIF< IDataProviderSvc > m_dataSvc
Data provider reference.
StatusCode setup()
Setup routine (called by (re-) initialize.
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:50
StatusCode reinitialize() override
Definition: Service.cpp:237
void dump(const MSG::Level level, const bool mode=true) const
dump the content of DataOnDemand service
std::vector< IDODNodeMapper * > m_nodeMappers
SmartIF< IAlgManager > m_algMgr
Algorithm manager.
SmartIF< IToolSvc > m_toolSvc
Data provider reference.
const StatusCode & ignore() const
Ignore/check StatusCode.
Definition: StatusCode.h:153
virtual StatusCode releaseTool(IAlgTool *tool)=0
Release the tool.
void reset(TYPE *ptr=nullptr)
Set the internal pointer to the passed one disposing of the old one.
Definition: SmartIF.h:86
virtual void removeListener(IIncidentListener *lis, const std::string &type="")=0
Remove listener.
Gaudi::Property< bool > m_dump
std::vector< IDODAlgMapper * > m_algMappers
MSG::Level msgLevel() const
get the cached level (originally extracted from the embedded MsgStream)
StatusCode DataOnDemandSvc::setup ( )
protected

Setup routine (called by (re-) initialize.

Definition at line 280 of file DataOnDemandSvc.cpp.

280  {
281  if ( !( m_algMgr = serviceLocator() ) ) // assignment meant
282  {
283  error() << "Failed to retrieve the IAlgManager interface." << endmsg;
284  return StatusCode::FAILURE;
285  }
286 
287  if ( !( m_incSvc = serviceLocator()->service( "IncidentSvc" ) ) ) // assignment meant
288  {
289  error() << "Failed to retrieve Incident service." << endmsg;
290  return StatusCode::FAILURE;
291  }
292  m_incSvc->addListener( this, m_trapType );
293 
294  if ( !( m_dataSvc = serviceLocator()->service( m_dataSvcName ) ) ) // assignment meant
295  {
296  error() << "Failed to retrieve the data provider interface of " << m_dataSvcName << endmsg;
297  return StatusCode::FAILURE;
298  }
299 
300  // No need to get the ToolSvc if we are not using tools
301  if ( !( m_nodeMapTools.empty() && m_algMapTools.empty() ) ) {
302  if ( !( m_toolSvc = serviceLocator()->service( "ToolSvc" ) ) ) // assignment meant
303  {
304  error() << "Failed to retrieve ToolSvc" << endmsg;
305  return StatusCode::FAILURE;
306  }
307 
308  // load the node mapping tools
309  IDODNodeMapper* nodetool = nullptr;
310  for ( const auto& i : m_nodeMapTools ) {
311  const StatusCode sc = m_toolSvc->retrieveTool( i, nodetool );
312  if ( sc.isFailure() ) return sc;
313  m_nodeMappers.push_back( nodetool );
314  }
315  IDODAlgMapper* algtool = nullptr;
316  for ( const auto& i : m_algMapTools ) {
317  const StatusCode sc = m_toolSvc->retrieveTool( i, algtool );
318  if ( sc.isFailure() ) return sc;
319  m_algMappers.push_back( algtool );
320  }
321  }
322  return update();
323 }
SmartIF< IIncidentSvc > m_incSvc
Incident service.
Gaudi::Property< std::string > m_trapType
bool isFailure() const
Definition: StatusCode.h:130
StatusCode retrieveTool(const std::string &type, T *&tool, const IInterface *parent=nullptr, bool createIf=true)
Retrieve specified tool sub-type with tool dependent part of the name automatically assigned...
Definition: IToolSvc.h:138
SmartIF< IDataProviderSvc > m_dataSvc
Data provider reference.
StatusCode service(const Gaudi::Utils::TypeNameString &name, T *&svc, bool createIf=true)
Templated method to access a service by name.
Definition: ISvcLocator.h:76
Gaudi::Property< std::vector< std::string > > m_algMapTools
T push_back(T...args)
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
Interface of tools used by the DataOnDemandSvc to choose the type of node to be created at a path...
Gaudi::Property< std::vector< std::string > > m_nodeMapTools
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:50
std::vector< IDODNodeMapper * > m_nodeMappers
Interface of tools used by the DataOnDemandSvc to choose the algorithm to be run to produce the data ...
Definition: IDODAlgMapper.h:17
SmartIF< IAlgManager > m_algMgr
Algorithm manager.
SmartIF< IToolSvc > m_toolSvc
Data provider reference.
Gaudi::Property< std::string > m_dataSvcName
virtual void addListener(IIncidentListener *lis, const std::string &type="", long priority=0, bool rethrow=false, bool singleShot=false)=0
Add listener.
constexpr static const auto FAILURE
Definition: StatusCode.h:86
StatusCode service(const std::string &name, const T *&psvc, bool createIf=true) const
Access a service by name, creating it if it doesn&#39;t already exist.
Definition: Service.h:83
SmartIF< ISvcLocator > & serviceLocator() const override
Retrieve pointer to service locator.
Definition: Service.cpp:277
std::vector< IDODAlgMapper * > m_algMappers
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:192
StatusCode update()
update the handlers
StatusCode DataOnDemandSvc::setupAlgHandlers ( )
protected

Initialize leaf handlers.

Definition at line 356 of file DataOnDemandSvc.cpp.

356  {
357  std::string typ, tag;
358 
359  for ( auto alg : m_algMapping ) {
360  using Parser = Gaudi::Utils::AttribStringParser;
361  for ( auto attrib : Parser( alg ) ) {
362  switch ( ::toupper( attrib.tag[0] ) ) {
363  case 'D':
364  tag = std::move( attrib.value );
365  break;
366  case 'T':
367  typ = std::move( attrib.value );
368  break;
369  }
370  }
371  Gaudi::Utils::TypeNameString item( typ );
372  if ( m_algMap.end() != m_algMap.find( tag ) || m_nodeMap.end() != m_nodeMap.find( tag ) ) {
373  warning() << "The obsolete property 'Algorithms' redefines the action for '" + tag + "' to be '" + item.type() +
374  "/" + item.name() + "'"
375  << endmsg;
376  }
377  m_algMap[tag] = item.type() + "/" + item.name();
378  }
379  m_updateRequired = true;
380  return StatusCode::SUCCESS;
381 }
Parse attribute strings allowing iteration over the various attributes.
constexpr static const auto SUCCESS
Definition: StatusCode.h:85
Gaudi::Property< Map > m_nodeMap
STL class.
Gaudi::Property< Setup > m_algMapping
Helper class to parse a string of format "type/name".
Gaudi::Property< Map > m_algMap
MsgStream & warning() const
shortcut for the method msgStream(MSG::WARNING)
T move(T...args)
void toupper(std::string &s)
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:192
StatusCode DataOnDemandSvc::setupNodeHandlers ( )
protected

Initialize node handlers.

Definition at line 327 of file DataOnDemandSvc.cpp.

327  {
328  std::string nam, typ, tag;
330  // Setup for node leafs, where simply a constructor is called...
331  for ( auto node : m_nodeMapping ) {
332  using Parser = Gaudi::Utils::AttribStringParser;
333  for ( auto attrib : Parser( node ) ) {
334  switch ( ::toupper( attrib.tag[0] ) ) {
335  case 'D':
336  tag = std::move( attrib.value );
337  break;
338  case 'T':
339  nam = std::move( attrib.value );
340  break;
341  }
342  }
343  if ( m_algMap.end() != m_algMap.find( tag ) || m_nodeMap.end() != m_nodeMap.find( tag ) ) {
344  warning() << "The obsolete property 'Nodes' redefines the action for '" + tag + "' to be '" + nam + "'" << endmsg;
345  }
346  m_nodeMap[tag] = nam;
347  }
348  //
349  m_updateRequired = true;
350  //
351  return sc;
352 }
Parse attribute strings allowing iteration over the various attributes.
constexpr static const auto SUCCESS
Definition: StatusCode.h:85
Gaudi::Property< Map > m_nodeMap
STL class.
Gaudi::Property< Map > m_algMap
MsgStream & warning() const
shortcut for the method msgStream(MSG::WARNING)
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:50
T move(T...args)
Gaudi::Property< Setup > m_nodeMapping
void toupper(std::string &s)
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:192
StatusCode DataOnDemandSvc::update ( )
protected

update the handlers

convert obsolete "Nodes" into new "NodeMap"

convert obsolete "Algorithms" into new "AlgMap"

add the default prefix

add the default prefix

get all directories

setup algorithms

setup nodes

Definition at line 132 of file DataOnDemandSvc.cpp.

132  {
133  if ( !m_updateRequired ) { return StatusCode::SUCCESS; }
134 
136  StatusCode sc = setupNodeHandlers(); // convert "Nodes" new "NodeMap"
137  if ( sc.isFailure() ) {
138  error() << "Failed to setup old \"Nodes\"" << endmsg;
139  return sc;
140  }
142  sc = setupAlgHandlers(); // convert "Algorithms" into "AlgMap"
143  if ( sc.isFailure() ) {
144  error() << "Failed to setup old \"Algorithms\"" << endmsg;
145  return sc;
146  }
148  add_prefix( m_algMap, m_prefix );
150  add_prefix( m_nodeMap, m_prefix );
153  if ( m_partialPath ) { get_dirs( m_algMap, dirs ); }
154  if ( m_partialPath ) { get_dirs( m_nodeMap, dirs ); }
155  //
156  auto _e = dirs.find( "/Event" );
157  if ( dirs.end() != _e ) { dirs.erase( _e ); }
158  // add all directories as nodes
159  for ( const auto& dir : dirs ) {
160  if ( m_algMap.end() == m_algMap.find( dir ) && m_nodeMap.end() == m_nodeMap.find( dir ) )
161  m_nodeMap[dir] = "DataObject";
162  }
163  //
164  m_algs.clear();
165  m_nodes.clear();
166  //
168  for ( const auto& alg : m_algMap ) {
169  if ( i_setAlgHandler( alg.first, alg.second ).isFailure() ) return StatusCode::FAILURE;
170  }
172  for ( const auto& node : m_nodeMap ) { i_setNodeHandler( node.first, node.second ); }
174  m_updateRequired = false;
175  //
176  return StatusCode::SUCCESS;
177 }
void i_setNodeHandler(const std::string &name, const std::string &type)
Internal method to initialize a node handler.
constexpr static const auto SUCCESS
Definition: StatusCode.h:85
Gaudi::Property< Map > m_nodeMap
T end(T...args)
bool isFailure() const
Definition: StatusCode.h:130
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
Gaudi::Property< std::string > m_prefix
Gaudi::Property< Map > m_algMap
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:50
StatusCode setupNodeHandlers()
Initialize node handlers.
T erase(T...args)
NodeMap m_nodes
Map of "empty" objects to be placed as intermediate nodes.
Gaudi::Property< bool > m_partialPath
T find(T...args)
AlgMap m_algs
Map of algorithms to handle incidents.
constexpr static const auto FAILURE
Definition: StatusCode.h:86
void clear()
Definition: Map.h:185
StatusCode setupAlgHandlers()
Initialize leaf handlers.
StatusCode i_setAlgHandler(const std::string &name, const Gaudi::Utils::TypeNameString &alg)
Internal method to initialize an algorithm handler.
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:192

Member Data Documentation

Gaudi::Property<Map> DataOnDemandSvc::m_algMap {this, "AlgMap", {}, &DataOnDemandSvc::force_update, "mapping {'data': 'algorithm'}"}
private

Definition at line 268 of file DataOnDemandSvc.h.

std::vector<IDODAlgMapper*> DataOnDemandSvc::m_algMappers
private

Definition at line 244 of file DataOnDemandSvc.h.

Gaudi::Property<Setup> DataOnDemandSvc::m_algMapping
private
Initial value:
{
this, "Algorithms", {}, &DataOnDemandSvc::deprecated_property, "[[deprecated]] use AlgMap"}

Definition at line 262 of file DataOnDemandSvc.h.

Gaudi::Property<std::vector<std::string> > DataOnDemandSvc::m_algMapTools
private
Initial value:
{
this, "AlgMappingTools", {}, "list of tools of type IDODAlgMapper"}

Definition at line 275 of file DataOnDemandSvc.h.

SmartIF<IAlgManager> DataOnDemandSvc::m_algMgr = nullptr
private

Algorithm manager.

Definition at line 219 of file DataOnDemandSvc.h.

AlgMap DataOnDemandSvc::m_algs
private

Map of algorithms to handle incidents.

Definition at line 225 of file DataOnDemandSvc.h.

Gaudi::Property<bool> DataOnDemandSvc::m_allowInitFailure
private
Initial value:
{
this, "AllowPreInitializeFailure", false,
"allow (pre)initialization of algorithms to fail without stopping the application"}

Definition at line 258 of file DataOnDemandSvc.h.

SmartIF<IDataProviderSvc> DataOnDemandSvc::m_dataSvc = nullptr
private

Data provider reference.

Definition at line 221 of file DataOnDemandSvc.h.

Gaudi::Property<std::string> DataOnDemandSvc::m_dataSvcName {this, "DataSvc", "EventDataSvc", "DataSvc name"}
private

Definition at line 248 of file DataOnDemandSvc.h.

Gaudi::Property<bool> DataOnDemandSvc::m_dump
private
Initial value:
{
this, "Dump", false,
[this]( auto& ) {
},
"dump configuration and stastics, if set to True after initialize it triggers a dump immediately"}

Definition at line 251 of file DataOnDemandSvc.h.

SmartIF<IIncidentSvc> DataOnDemandSvc::m_incSvc = nullptr
private

Incident service.

Definition at line 217 of file DataOnDemandSvc.h.

Gaudi::Property<bool> DataOnDemandSvc::m_init {this, "PreInitialize", false, "(pre)initialize all algorithms"}
private

Definition at line 257 of file DataOnDemandSvc.h.

bool DataOnDemandSvc::m_locked_algs = false
private

Definition at line 240 of file DataOnDemandSvc.h.

bool DataOnDemandSvc::m_locked_all = false
private

Definition at line 241 of file DataOnDemandSvc.h.

bool DataOnDemandSvc::m_locked_nodes = false
private

Definition at line 239 of file DataOnDemandSvc.h.

Gaudi::Property<Map> DataOnDemandSvc::m_nodeMap {this, "NodeMap", {}, &DataOnDemandSvc::force_update, "mapping {'data': 'type'}"}
private

Definition at line 269 of file DataOnDemandSvc.h.

std::vector<IDODNodeMapper*> DataOnDemandSvc::m_nodeMappers
private

Definition at line 243 of file DataOnDemandSvc.h.

Gaudi::Property<Setup> DataOnDemandSvc::m_nodeMapping
private
Initial value:
{
this, "Nodes", {}, &DataOnDemandSvc::deprecated_property, "[[deprecated]] use NodeMap"}

Definition at line 264 of file DataOnDemandSvc.h.

Gaudi::Property<std::vector<std::string> > DataOnDemandSvc::m_nodeMapTools
private
Initial value:
{
this, "NodeMappingTools", {}, "list of tools of type IDODNodeMapper"}

Definition at line 273 of file DataOnDemandSvc.h.

NodeMap DataOnDemandSvc::m_nodes
private

Map of "empty" objects to be placed as intermediate nodes.

Definition at line 227 of file DataOnDemandSvc.h.

Gaudi::Property<bool> DataOnDemandSvc::m_partialPath {this, "UsePreceedingPath", true, "allow creation of partial leaves"}
private

Definition at line 250 of file DataOnDemandSvc.h.

Gaudi::Property<std::string> DataOnDemandSvc::m_prefix {this, "Prefix", "/Event/"}
private

Definition at line 271 of file DataOnDemandSvc.h.

unsigned long long DataOnDemandSvc::m_stat = 0
private

Definition at line 234 of file DataOnDemandSvc.h.

unsigned long long DataOnDemandSvc::m_statAlg = 0
private

Definition at line 232 of file DataOnDemandSvc.h.

unsigned long long DataOnDemandSvc::m_statNode = 0
private

Definition at line 233 of file DataOnDemandSvc.h.

ChronoEntity DataOnDemandSvc::m_timer_algs
private

Definition at line 237 of file DataOnDemandSvc.h.

ChronoEntity DataOnDemandSvc::m_timer_all
private

Definition at line 238 of file DataOnDemandSvc.h.

ChronoEntity DataOnDemandSvc::m_timer_nodes
private

Definition at line 236 of file DataOnDemandSvc.h.

SmartIF<IToolSvc> DataOnDemandSvc::m_toolSvc
private

Data provider reference.

Definition at line 223 of file DataOnDemandSvc.h.

ChronoEntity DataOnDemandSvc::m_total
private

Definition at line 231 of file DataOnDemandSvc.h.

Gaudi::Property<std::string> DataOnDemandSvc::m_trapType {this, "IncidentName", "DataFault", "the type of handled Incident"}
private

Definition at line 247 of file DataOnDemandSvc.h.

bool DataOnDemandSvc::m_updateRequired = true
private

Definition at line 229 of file DataOnDemandSvc.h.


The documentation for this class was generated from the following files: