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
typedef Gaudi::PluginService::Factory< IService *, const std::string &, ISvcLocator * > Factory
 
- 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...
 
 DataOnDemandSvc (const std::string &name, ISvcLocator *svc)
 Standard initializing service constructor. More...
 
 ~DataOnDemandSvc () override=default
 Standard destructor. 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...
 
 ~extends () override=default
 Virtual destructor. 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 declarePrivateTool (ToolHandle< T > &handle, std::string toolTypeAndName="", bool createIf=true)
 Declare used Private tool. More...
 
template<class T >
StatusCode declarePublicTool (ToolHandle< T > &handle, std::string toolTypeAndName="", bool createIf=true)
 Declare used Public 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
 
 ~PropertyHolder () override=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, TYPE &value, const std::string &doc="none") const
 
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
 
Gaudi::Details::PropertyBasedeclareProperty (const std::string &name, GaudiHandleBase &ref, const std::string &doc="none")
 Specializations for various GaudiHandles. More...
 
Gaudi::Details::PropertyBasedeclareProperty (const std::string &name, GaudiHandleArrayBase &ref, const std::string &doc="none")
 
Gaudi::Details::PropertyBasedeclareProperty (const std::string &name, DataObjectHandleBase &ref, const std::string &doc="none")
 
- Public Member Functions inherited from CommonMessagingBase
virtual ~CommonMessagingBase ()=default
 Virtual destructor. More...
 
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...
 
MSG::Level msgLevel () const
 get the output level from the embedded MsgStream More...
 
MSG::Level outputLevel () const __attribute__((deprecated))
 Backward compatibility function for getting the output level. More...
 
bool msgLevel (MSG::Level lvl) const
 get the output level from the embedded MsgStream More...
 
- Public Member Functions inherited from extend_interfaces< Interfaces... >
 ~extend_interfaces () override=default
 Virtual destructor. 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 > >
void updateMsgStreamOutputLevel (int level)
 Update the output level of the cached MsgStream. More...
 

Private Types

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

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
 
ulonglong m_statAlg = 0
 
ulonglong m_statNode = 0
 
ulonglong 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 {this, "Algorithms", {}, "[[deprecated]] use AlgMap"}
 
Gaudi::Property< Setupm_nodeMapping {this, "Nodes", {}, "[[deprecated]] use NodeMap"}
 
Gaudi::Property< Mapm_algMap {this, "AlgMap", {}, "mapping {'data': 'algorithm'}"}
 
Gaudi::Property< Mapm_nodeMap {this, "NodeMap", {}, "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 96 of file DataOnDemandSvc.h.

Definition at line 264 of file DataOnDemandSvc.h.

Definition at line 95 of file DataOnDemandSvc.h.

Constructor & Destructor Documentation

DataOnDemandSvc::DataOnDemandSvc ( const std::string name,
ISvcLocator svc 
)

Standard initializing service constructor.

Parameters
name[IN] Service instance name
svc[IN] Pointer to service locator
Returns
Reference to DataOnDemandSvc object.

Definition at line 40 of file DataOnDemandSvc.cpp.

40  : base_class( name, svc )
41 {
42  m_dump.declareUpdateHandler( [this]( Gaudi::Details::PropertyBase& ) {
44  dump( MSG::ALWAYS );
45  }
46  } );
47 
48  auto force_update = [this]( Gaudi::Details::PropertyBase& p ) {
49  verbose() << "updated property " << p.name() << ", forcig update" << endmsg;
50  m_updateRequired = true;
51  };
52  m_algMap.declareUpdateHandler( force_update );
53  m_nodeMap.declareUpdateHandler( force_update );
54 
55  auto deprecated_property = [this, force_update]( Gaudi::Details::PropertyBase& p ) {
56  warning() << p.name() << " " << p.documentation() << endmsg;
57  force_update( p );
58  };
59  m_algMapping.declareUpdateHandler( deprecated_property );
60  m_nodeMapping.declareUpdateHandler( deprecated_property );
61  // ==========================================================================
62 }
MsgStream & verbose() const
shortcut for the method msgStream(MSG::VERBOSE)
Gaudi::Property< Map > m_nodeMap
extends base_class
Typedef to this class.
Definition: extends.h:14
Gaudi::Property< Setup > m_algMapping
Gaudi::Property< Map > m_algMap
MsgStream & warning() const
shortcut for the method msgStream(MSG::WARNING)
PropertyBase base class allowing PropertyBase* collections to be "homogeneous".
Definition: Property.h:32
void dump(const MSG::Level level, const bool mode=true) const
dump the content of DataOnDemand service
Gaudi::Property< Setup > m_nodeMapping
Gaudi::StateMachine::State FSMState() const override
Definition: Service.h:54
Gaudi::Property< bool > m_dump
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:244
DataOnDemandSvc::~DataOnDemandSvc ( )
overridedefault

Standard destructor.

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 454 of file DataOnDemandSvc.cpp.

455 {
456  if ( l.algorithm ) {
457  return StatusCode::SUCCESS;
458  }
459  if ( !m_algMgr ) {
460  return StatusCode::FAILURE;
461  }
462  l.algorithm = m_algMgr->algorithm( l.name, false );
463  if ( l.algorithm ) {
464  return StatusCode::SUCCESS;
465  }
466  // create it!
467  StatusCode sc = m_algMgr->createAlgorithm( l.type, l.name, l.algorithm, true );
468  if ( sc.isFailure() ) {
469  error() << "Failed to create algorithm " << l.type << "('" << l.name << "')" << endmsg;
470  l.algorithm = nullptr;
471  return sc; // RETURN
472  }
473  if ( l.algorithm->isInitialized() ) {
474  return StatusCode::SUCCESS;
475  }
476  // initialize it!
477  sc = l.algorithm->sysInitialize();
478  if ( sc.isFailure() ) {
479  error() << "Failed to initialize algorithm " << l.type << "('" << l.name << "')" << endmsg;
480  l.algorithm = nullptr;
481  return sc; // RETURN
482  }
483  if ( Gaudi::StateMachine::RUNNING == l.algorithm->FSMState() ) {
484  return StatusCode::SUCCESS;
485  }
486  // run it!
487  sc = l.algorithm->sysStart();
488  if ( sc.isFailure() ) {
489  error() << "Failed to 'run' algorithm " << l.type << "('" << l.name << "')" << endmsg;
490  l.algorithm = nullptr;
491  return sc; // RETURN
492  }
493  return StatusCode::SUCCESS;
494 }
virtual SmartIF< IAlgorithm > & algorithm(const Gaudi::Utils::TypeNameString &typeName, const bool createIf=true)=0
Returns a smart pointer to a service.
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...
bool isFailure() const
Test for a status code of FAILURE.
Definition: StatusCode.h:84
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:26
dictionary l
Definition: gaudirun.py:421
SmartIF< IAlgManager > m_algMgr
Algorithm manager.
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:244
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 709 of file DataOnDemandSvc.cpp.

710 {
711  if ( m_algs.empty() && m_nodes.empty() ) {
712  return;
713  }
714 
717  for ( auto& alg : m_algs ) {
718  auto check = _m.find( alg.first );
719  if ( _m.end() != check ) {
720  warning() << " The data item is activated for '" << check->first << "' as '" << check->second.first << "'"
721  << endmsg;
722  }
723  const Leaf& l = alg.second;
724  std::string nam = ( l.name == l.type ? l.type : ( l.type + "/" + l.name ) );
725  //
726  if ( !mode && 0 == l.num ) {
727  continue;
728  }
729  //
730  std::string val;
731  if ( mode ) {
732  val = ( !l.algorithm ) ? "F" : "T";
733  } else {
734  val = std::to_string( l.num );
735  }
736  //
737  _m[no_prefix( alg.first, m_prefix )] = {nam, val};
738  }
739  // nodes:
740  for ( const auto& node : m_nodes ) {
741  auto check = _m.find( node.first );
742  if ( _m.end() != check ) {
743  warning() << " The data item is already activated for '" << check->first << "' as '" << check->second.first << "'"
744  << endmsg;
745  }
746  const Node& n = node.second;
747  std::string nam = "'" + n.name + "'";
748  //
749  std::string val;
750 
751  if ( !mode && 0 == n.num ) {
752  continue;
753  }
754 
755  if ( mode ) {
756  val = ( 0 == n.clazz ) ? "F" : "T";
757  } else {
758  val = std::to_string( n.num );
759  }
760  //
761  _m[no_prefix( node.first, m_prefix )] = {nam, val};
762  }
763  //
764  if ( _m.empty() ) {
765  return;
766  }
767 
768  // find the correct formats
769  size_t n1 = 0;
770  size_t n2 = 0;
771  size_t n3 = 0;
772  for ( const auto& i : _m ) {
773  n1 = std::max( n1, i.first.size() );
774  n2 = std::max( n2, i.second.first.size() );
775  n3 = std::max( n3, i.second.second.size() );
776  }
777  if ( 10 > n1 ) {
778  n1 = 10;
779  }
780  if ( 10 > n2 ) {
781  n2 = 10;
782  }
783  if ( 60 < n1 ) {
784  n1 = 60;
785  }
786  if ( 60 < n2 ) {
787  n2 = 60;
788  }
789  //
790 
791  const std::string _f = " | %%1$-%1%.%1%s | %%2$-%2%.%2%s | %%3$%3%.%3%s |";
792  boost::format _ff( _f );
793  _ff % n1 % n2 % n3;
794 
795  const std::string _format = _ff.str();
796 
797  auto& msg = msgStream( level );
798 
799  if ( mode ) {
800  msg << "Data-On-Demand Actions enabled for:";
801  } else {
802  msg << "Data-On-Demand Actions has been used for:";
803  }
804 
805  boost::format fmt1( _format );
806  fmt1 % "Address" % "Creator" % ( mode ? "S" : "#" );
807  //
808  const std::string header = fmt1.str();
809  std::string line = std::string( header.size(), '-' );
810  line[0] = ' ';
811 
812  msg << '\n' << line << '\n' << header << '\n' << line;
813 
814  // make the actual printout:
815  for ( const auto& item : _m ) {
816  boost::format fmt( _format );
817  msg << '\n' << ( fmt % item.first % item.second.first % item.second.second );
818  }
819 
820  msg << '\n' << line << endmsg;
821 }
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:119
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:184
NodeMap m_nodes
Map of "empty" objects to be placed as intermediate nodes.
T max(T...args)
dictionary l
Definition: gaudirun.py:421
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:244
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 670 of file DataOnDemandSvc.cpp.

671 {
673  //
674  if ( l.executing ) {
675  return StatusCode::FAILURE;
676  } // RETURN
677  //
678  if ( !l.algorithm ) {
679  StatusCode sc = configureHandler( l );
680  if ( sc.isFailure() ) {
681  error() << "Failed to configure handler for: " << l.name << "[" << l.type << "] " << tag << endmsg;
682  return sc; // RETURN
683  }
684  }
685  //
686  Chrono atimer( m_total );
687  //
688  Protection p( l.executing );
689  // FIXME: this will cause problems for Hive, as we need to set
690  // the EventContext of the called Algorithm.
691  // if (!l.algorithm->getContext()) {
692  // l.algorithm->setContext( &Gaudi::Hive::currentContext() );
693  // }
694  StatusCode sc = l.algorithm->sysExecute();
695  if ( sc.isFailure() ) {
696  error() << "Failed to execute the algorithm:" << l.algorithm->name() << " for location:" << tag << endmsg;
697  return sc; // RETURN
698  }
699  ++l.num;
700  //
701  return StatusCode::SUCCESS;
702 }
ChronoEntity m_timer_algs
A small utility class for chronometry of user codes.
Definition: Chrono.h:25
bool isFailure() const
Test for a status code of FAILURE.
Definition: StatusCode.h:84
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:26
dictionary l
Definition: gaudirun.py:421
Helper object, useful for measurement of CPU-performance of highly-recursive structures, e.g.
Definition: LockedChrono.h:52
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:244
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 625 of file DataOnDemandSvc.cpp.

626 {
627 
629 
630  if ( n.executing ) {
631  return StatusCode::FAILURE;
632  } // RETURN
633 
634  Protection p( n.executing );
635 
637 
638  if ( n.dataObject ) {
639  object.reset( new DataObject() );
640  } else {
641  // try to recover the handler
642  if ( !n.clazz ) {
643  n.clazz = TClass::GetClass( n.name.c_str() );
644  }
645  if ( !n.clazz ) {
646  error() << "Failed to get dictionary for class '" << n.name << "' for location:" << tag << endmsg;
647  return StatusCode::FAILURE; // RETURN
648  }
649 
650  object.reset( reinterpret_cast<DataObject*>( n.clazz->New() ) );
651 
652  if ( !object ) {
653  error() << "Failed to create an object of type:" << n.clazz->GetName() << " for location:" << tag << endmsg;
654  return StatusCode::FAILURE; // RETURN
655  }
656  }
657  //
658  StatusCode sc = m_dataSvc->registerObject( tag, object.release() );
659  if ( sc.isFailure() ) {
660  error() << "Failed to register an object of type:" << n.name << " at location:" << tag << endmsg;
661  return sc; // RETURN
662  }
663  ++n.num;
664  //
665  return StatusCode::SUCCESS;
666 }
bool isFailure() const
Test for a status code of FAILURE.
Definition: StatusCode.h:84
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:26
T reset(T...args)
STL class.
Helper object, useful for measurement of CPU-performance of highly-recursive structures, e.g.
Definition: LockedChrono.h:52
ChronoEntity m_timer_nodes
virtual StatusCode registerObject(const std::string &fullPath, DataObject *pObject)=0
Register object with the data store.
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:244
StatusCode DataOnDemandSvc::finalize ( )
override

Inherited Service overrides: Service finalization.

Definition at line 261 of file DataOnDemandSvc.cpp.

262 {
263  //
264  info() << "Handled \"" << m_trapType.value() << "\" incidents: " << m_statAlg << "/" << m_statNode << "/" << m_stat
265  << "(Alg/Node/Total)." << endmsg;
266  if ( m_dump || msgLevel( MSG::DEBUG ) ) {
267  info() << m_total.outputUserTime( "Algorithm timing: Mean(+-rms)/Min/Max:%3%(+-%4%)/%6%/%7%[ms] ",
269  << m_total.outputUserTime( "Total:%2%[s]", System::Sec ) << endmsg;
270  info() << m_timer_nodes.outputUserTime( "Nodes timing: Mean(+-rms)/Min/Max:%3%(+-%4%)/%6%/%7%[ms] ",
272  << m_timer_nodes.outputUserTime( "Total:%2%[s]", System::Sec ) << endmsg;
273  info() << m_timer_algs.outputUserTime( "Algs timing: Mean(+-rms)/Min/Max:%3%(+-%4%)/%6%/%7%[ms] ",
275  << m_timer_algs.outputUserTime( "Total:%2%[s]", System::Sec ) << endmsg;
276  info() << m_timer_all.outputUserTime( "All timing: Mean(+-rms)/Min/Max:%3%(+-%4%)/%6%/%7%[ms] ",
278  << m_timer_all.outputUserTime( "Total:%2%[s]", System::Sec ) << endmsg;
279  }
280  // dump it!
281  if ( m_dump ) {
282  dump( MSG::INFO, false );
283  } else if ( msgLevel( MSG::DEBUG ) ) {
284  dump( MSG::DEBUG, false );
285  }
286  //
287  if ( m_incSvc ) {
289  m_incSvc.reset();
290  }
291  m_algMgr.reset();
292  m_dataSvc.reset();
293  if ( m_toolSvc ) { // we may not have retrieved the ToolSvc
294  // Do not call releaseTool if the ToolSvc was already finalized.
296  for ( const auto& i : m_nodeMappers ) m_toolSvc->releaseTool( i ).ignore();
297  for ( const auto& i : m_algMappers ) m_toolSvc->releaseTool( i ).ignore();
298  } else {
299  warning() << "ToolSvc already finalized: cannot release tools. Check options." << endmsg;
300  }
301  m_nodeMappers.clear();
302  m_algMappers.clear();
303  m_toolSvc.reset();
304  }
305  return Service::finalize();
306 }
ChronoEntity m_timer_all
StatusCode finalize() override
Definition: Service.cpp:174
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.
ulonglong m_statNode
MsgStream & warning() const
shortcut for the method msgStream(MSG::WARNING)
void clear(STATE_TYPE _i=std::ios_base::failbit)
Definition: MsgStream.h:222
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
Gaudi::StateMachine::State FSMState() const override
Definition: Service.h:54
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:88
virtual void removeListener(IIncidentListener *lis, const std::string &type="")=0
Remove listener.
void ignore() const
Definition: StatusCode.h:106
MSG::Level msgLevel() const
get the output level from the embedded MsgStream
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:244
void DataOnDemandSvc::handle ( const Incident incident)
override

IIncidentListener interfaces overrides: incident handling.

Definition at line 552 of file DataOnDemandSvc.cpp.

553 {
554 
556 
557  ++m_stat;
558  // proper incident type?
559  if ( incident.type() != m_trapType ) {
560  return;
561  } // RETURN
562  const DataIncident* inc = dynamic_cast<const DataIncident*>( &incident );
563  if ( !inc ) {
564  return;
565  } // RETURN
566  // update if needed!
567  if ( m_updateRequired ) {
568  update();
569  }
570 
571  if ( msgLevel( MSG::VERBOSE ) ) {
572  verbose() << "Incident: [" << incident.type() << "] "
573  << " = " << incident.source() << " Location:" << inc->tag() << endmsg;
574  }
575  // ==========================================================================
576  Gaudi::StringKey tag( inc->tag() );
577  // ==========================================================================
578  auto icl = m_nodes.find( tag );
579  if ( icl != m_nodes.end() ) {
580  StatusCode sc = execHandler( tag, icl->second );
581  if ( sc.isSuccess() ) {
582  ++m_statNode;
583  }
584  return; // RETURN
585  }
586  // ==========================================================================
587  auto ialg = m_algs.find( tag );
588  if ( ialg != m_algs.end() ) {
589  StatusCode sc = execHandler( tag, ialg->second );
590  if ( sc.isSuccess() ) {
591  ++m_statAlg;
592  }
593  return; // RETURN
594  }
595  // ==========================================================================
596  // Fall back on the tools
597  if ( m_toolSvc ) {
598  if ( msgLevel( MSG::VERBOSE ) ) verbose() << "Try to find mapping with mapping tools" << endmsg;
599  Finder finder( no_prefix( inc->tag(), m_prefix ), m_nodeMappers, m_algMappers );
600  // - try the node mappers
601  std::string node = finder.node();
602  if ( isGood( node ) ) {
603  // if one is found update the internal node mapping and try again.
604  if ( msgLevel( MSG::VERBOSE ) ) verbose() << "Found Node handler: " << node << endmsg;
605  i_setNodeHandler( inc->tag(), node );
606  handle( incident );
607  --m_stat; // avoid double counting because of recursion
608  return;
609  }
610  // - try alg mappings
611  Gaudi::Utils::TypeNameString alg = finder.alg();
612  if ( isGood( alg ) ) {
613  // we got an algorithm, update alg map and try to handle again
614  if ( msgLevel( MSG::VERBOSE ) ) verbose() << "Found Algorithm handler: " << alg << endmsg;
615  i_setAlgHandler( inc->tag(), alg ).ignore();
616  handle( incident );
617  --m_stat; // avoid double counting because of recursion
618  return;
619  }
620  }
621 }
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:41
const std::string & source() const
Access to the source of the incident.
Definition: Incident.h:47
bool isSuccess() const
Test for a status code of SUCCESS.
Definition: StatusCode.h:74
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:35
STL class.
ulonglong m_statNode
Gaudi::Property< std::string > m_prefix
iterator end()
Definition: Map.h:132
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:26
iterator find(const key_type &key)
Definition: Map.h:149
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:52
AlgMap m_algs
Map of algorithms to handle incidents.
Data service incident class.
MSG::Level msgLevel() const
get the output level from the embedded MsgStream
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:244
StatusCode update()
update the handlers
StatusCode DataOnDemandSvc::i_setAlgHandler ( const std::string name,
const Gaudi::Utils::TypeNameString alg 
)
protected

Internal method to initialize an algorithm handler.

Definition at line 153 of file DataOnDemandSvc.cpp.

154 {
155  Leaf leaf( alg.type(), alg.name() );
156  if ( m_init ) {
157  StatusCode sc = configureHandler( leaf );
158  if ( sc.isFailure() ) {
159  if ( m_allowInitFailure ) {
160  // re-store the content of the leaf object to try again to initialize
161  // the algorithm later (on demand)
162  leaf = Leaf( alg.type(), alg.name() );
163  } else
164  return sc;
165  }
166  }
167  m_algs[name] = leaf;
168  return StatusCode::SUCCESS;
169 }
const std::string & name() const override
Retrieve name of the service.
Definition: Service.cpp:289
Gaudi::Property< bool > m_init
bool isFailure() const
Test for a status code of FAILURE.
Definition: StatusCode.h:84
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:26
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 144 of file DataOnDemandSvc.cpp.

145 {
146  ClassH cl = TClass::GetClass( type.c_str() );
147  if ( !cl ) {
148  warning() << "Failed to access dictionary class for " << name << " of type:" << type << endmsg;
149  }
150  m_nodes[name] = Node( cl, false, type );
151 }
const std::string & name() const override
Retrieve name of the service.
Definition: Service.cpp:289
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:244
StatusCode DataOnDemandSvc::initialize ( )
override

Inherited Service overrides: Service initialization.

Definition at line 234 of file DataOnDemandSvc.cpp.

235 {
236  // initialize the Service Base class
238  if ( sc.isFailure() ) {
239  return sc;
240  }
241  sc = setup();
242  if ( sc.isFailure() ) {
243  return sc;
244  }
245  //
246  if ( m_dump ) {
247  dump( MSG::INFO );
248  } else if ( msgLevel( MSG::DEBUG ) ) {
249  dump( MSG::DEBUG );
250  }
251  //
252  if ( m_init ) {
253  return update();
254  }
255  //
256  return StatusCode::SUCCESS;
257 }
StatusCode initialize() override
Definition: Service.cpp:64
Gaudi::Property< bool > m_init
bool isFailure() const
Test for a status code of FAILURE.
Definition: StatusCode.h:84
StatusCode setup()
Setup routine (called by (re-) initialize.
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:26
void dump(const MSG::Level level, const bool mode=true) const
dump the content of DataOnDemand service
MSG::Level msgLevel() const
get the output level from the embedded MsgStream
Gaudi::Property< bool > m_dump
StatusCode update()
update the handlers
StatusCode DataOnDemandSvc::reinitialize ( )
override

Inherited Service overrides: Service reinitialization.

re-initialization of the service

Definition at line 310 of file DataOnDemandSvc.cpp.

311 {
312  // reinitialize the Service Base class
313  if ( m_incSvc ) {
315  m_incSvc.reset();
316  }
317  m_algMgr.reset();
318  m_dataSvc.reset();
319  for ( const auto& i : m_nodeMappers ) m_toolSvc->releaseTool( i ).ignore();
320  m_nodeMappers.clear();
321  for ( const auto& i : m_algMappers ) m_toolSvc->releaseTool( i ).ignore();
322  m_algMappers.clear();
323  m_toolSvc.reset();
324  //
326  if ( sc.isFailure() ) {
327  return sc;
328  }
329  //
330  sc = setup();
331  if ( sc.isFailure() ) {
332  return sc;
333  }
334  //
335  if ( m_dump ) {
336  dump( MSG::INFO );
337  } else if ( msgLevel( MSG::DEBUG ) ) {
338  dump( MSG::DEBUG );
339  }
340  //
341  return StatusCode::SUCCESS;
342 }
SmartIF< IIncidentSvc > m_incSvc
Incident service.
Gaudi::Property< std::string > m_trapType
bool isFailure() const
Test for a status code of FAILURE.
Definition: StatusCode.h:84
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:26
StatusCode reinitialize() override
Definition: Service.cpp:250
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.
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:88
virtual void removeListener(IIncidentListener *lis, const std::string &type="")=0
Remove listener.
void ignore() const
Definition: StatusCode.h:106
MSG::Level msgLevel() const
get the output level from the embedded MsgStream
Gaudi::Property< bool > m_dump
std::vector< IDODAlgMapper * > m_algMappers
StatusCode DataOnDemandSvc::setup ( )
protected

Setup routine (called by (re-) initialize.

Definition at line 346 of file DataOnDemandSvc.cpp.

347 {
348  if ( !( m_algMgr = serviceLocator() ) ) // assignment meant
349  {
350  error() << "Failed to retrieve the IAlgManager interface." << endmsg;
351  return StatusCode::FAILURE;
352  }
353 
354  if ( !( m_incSvc = serviceLocator()->service( "IncidentSvc" ) ) ) // assignment meant
355  {
356  error() << "Failed to retrieve Incident service." << endmsg;
357  return StatusCode::FAILURE;
358  }
359  m_incSvc->addListener( this, m_trapType );
360 
361  if ( !( m_dataSvc = serviceLocator()->service( m_dataSvcName ) ) ) // assignment meant
362  {
363  error() << "Failed to retrieve the data provider interface of " << m_dataSvcName << endmsg;
364  return StatusCode::FAILURE;
365  }
366 
367  // No need to get the ToolSvc if we are not using tools
368  if ( !( m_nodeMapTools.empty() && m_algMapTools.empty() ) ) {
369  if ( !( m_toolSvc = serviceLocator()->service( "ToolSvc" ) ) ) // assignment meant
370  {
371  error() << "Failed to retrieve ToolSvc" << endmsg;
372  return StatusCode::FAILURE;
373  }
374 
375  // load the node mapping tools
376  IDODNodeMapper* nodetool = nullptr;
377  for ( const auto& i : m_nodeMapTools ) {
378  const StatusCode sc = m_toolSvc->retrieveTool( i, nodetool );
379  if ( sc.isFailure() ) return sc;
380  m_nodeMappers.push_back( nodetool );
381  }
382  IDODAlgMapper* algtool = nullptr;
383  for ( const auto& i : m_algMapTools ) {
384  const StatusCode sc = m_toolSvc->retrieveTool( i, algtool );
385  if ( sc.isFailure() ) return sc;
386  m_algMappers.push_back( algtool );
387  }
388  }
389  return update();
390 }
SmartIF< IIncidentSvc > m_incSvc
Incident service.
Gaudi::Property< std::string > m_trapType
bool isFailure() const
Test for a status code of FAILURE.
Definition: StatusCode.h:84
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:146
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:78
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:26
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.
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:85
SmartIF< ISvcLocator > & serviceLocator() const override
Retrieve pointer to service locator.
Definition: Service.cpp:292
std::vector< IDODAlgMapper * > m_algMappers
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:244
StatusCode update()
update the handlers
StatusCode DataOnDemandSvc::setupAlgHandlers ( )
protected

Initialize leaf handlers.

Definition at line 424 of file DataOnDemandSvc.cpp.

425 {
426  std::string typ, tag;
427 
428  for ( auto alg : m_algMapping ) {
429  using Parser = Gaudi::Utils::AttribStringParser;
430  for ( auto attrib : Parser( alg ) ) {
431  switch (::toupper( attrib.tag[0] ) ) {
432  case 'D':
433  tag = std::move( attrib.value );
434  break;
435  case 'T':
436  typ = std::move( attrib.value );
437  break;
438  }
439  }
440  Gaudi::Utils::TypeNameString item( typ );
441  if ( m_algMap.end() != m_algMap.find( tag ) || m_nodeMap.end() != m_nodeMap.find( tag ) ) {
442  warning() << "The obsolete property 'Algorithms' redefines the action for '" + tag + "' to be '" + item.type() +
443  "/" + item.name() + "'"
444  << endmsg;
445  }
446  m_algMap[tag] = item.type() + "/" + item.name();
447  }
448  m_updateRequired = true;
449  return StatusCode::SUCCESS;
450 }
Parse attribute strings allowing iteration over the various attributes.
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:244
StatusCode DataOnDemandSvc::setupNodeHandlers ( )
protected

Initialize node handlers.

Definition at line 394 of file DataOnDemandSvc.cpp.

395 {
396  std::string nam, typ, tag;
398  // Setup for node leafs, where simply a constructor is called...
399  for ( auto node : m_nodeMapping ) {
400  using Parser = Gaudi::Utils::AttribStringParser;
401  for ( auto attrib : Parser( node ) ) {
402  switch (::toupper( attrib.tag[0] ) ) {
403  case 'D':
404  tag = std::move( attrib.value );
405  break;
406  case 'T':
407  nam = std::move( attrib.value );
408  break;
409  }
410  }
411  if ( m_algMap.end() != m_algMap.find( tag ) || m_nodeMap.end() != m_nodeMap.find( tag ) ) {
412  warning() << "The obsolete property 'Nodes' redefines the action for '" + tag + "' to be '" + nam + "'" << endmsg;
413  }
414  m_nodeMap[tag] = nam;
415  }
416  //
417  m_updateRequired = true;
418  //
419  return sc;
420 }
Parse attribute strings allowing iteration over the various attributes.
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:26
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:244
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 174 of file DataOnDemandSvc.cpp.

175 {
176  if ( !m_updateRequired ) {
177  return StatusCode::SUCCESS;
178  }
179 
181  StatusCode sc = setupNodeHandlers(); // convert "Nodes" new "NodeMap"
182  if ( sc.isFailure() ) {
183  error() << "Failed to setup old \"Nodes\"" << endmsg;
184  return sc;
185  }
187  sc = setupAlgHandlers(); // convert "Algorithms" into "AlgMap"
188  if ( sc.isFailure() ) {
189  error() << "Failed to setup old \"Algorithms\"" << endmsg;
190  return sc;
191  }
193  add_prefix( m_algMap, m_prefix );
195  add_prefix( m_nodeMap, m_prefix );
198  if ( m_partialPath ) {
199  get_dirs( m_algMap, dirs );
200  }
201  if ( m_partialPath ) {
202  get_dirs( m_nodeMap, dirs );
203  }
204  //
205  auto _e = dirs.find( "/Event" );
206  if ( dirs.end() != _e ) {
207  dirs.erase( _e );
208  }
209  // add all directories as nodes
210  for ( const auto& dir : dirs ) {
211  if ( m_algMap.end() == m_algMap.find( dir ) && m_nodeMap.end() == m_nodeMap.find( dir ) )
212  m_nodeMap[dir] = "DataObject";
213  }
214  //
215  m_algs.clear();
216  m_nodes.clear();
217  //
219  for ( const auto& alg : m_algMap ) {
220  if ( i_setAlgHandler( alg.first, alg.second ).isFailure() ) return StatusCode::FAILURE;
221  }
223  for ( const auto& node : m_nodeMap ) {
224  i_setNodeHandler( node.first, node.second );
225  }
227  m_updateRequired = false;
228  //
229  return StatusCode::SUCCESS;
230 }
void i_setNodeHandler(const std::string &name, const std::string &type)
Internal method to initialize a node handler.
Gaudi::Property< Map > m_nodeMap
T end(T...args)
bool isFailure() const
Test for a status code of FAILURE.
Definition: StatusCode.h:84
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:26
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.
void clear()
Definition: Map.h:178
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:244

Member Data Documentation

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

Definition at line 265 of file DataOnDemandSvc.h.

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

Definition at line 246 of file DataOnDemandSvc.h.

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

Definition at line 261 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 272 of file DataOnDemandSvc.h.

SmartIF<IAlgManager> DataOnDemandSvc::m_algMgr = nullptr
private

Algorithm manager.

Definition at line 221 of file DataOnDemandSvc.h.

AlgMap DataOnDemandSvc::m_algs
private

Map of algorithms to handle incidents.

Definition at line 227 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 257 of file DataOnDemandSvc.h.

SmartIF<IDataProviderSvc> DataOnDemandSvc::m_dataSvc = nullptr
private

Data provider reference.

Definition at line 223 of file DataOnDemandSvc.h.

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

Definition at line 250 of file DataOnDemandSvc.h.

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

Definition at line 253 of file DataOnDemandSvc.h.

SmartIF<IIncidentSvc> DataOnDemandSvc::m_incSvc = nullptr
private

Incident service.

Definition at line 219 of file DataOnDemandSvc.h.

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

Definition at line 256 of file DataOnDemandSvc.h.

bool DataOnDemandSvc::m_locked_algs = false
private

Definition at line 242 of file DataOnDemandSvc.h.

bool DataOnDemandSvc::m_locked_all = false
private

Definition at line 243 of file DataOnDemandSvc.h.

bool DataOnDemandSvc::m_locked_nodes = false
private

Definition at line 241 of file DataOnDemandSvc.h.

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

Definition at line 266 of file DataOnDemandSvc.h.

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

Definition at line 245 of file DataOnDemandSvc.h.

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

Definition at line 262 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 270 of file DataOnDemandSvc.h.

NodeMap DataOnDemandSvc::m_nodes
private

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

Definition at line 229 of file DataOnDemandSvc.h.

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

Definition at line 252 of file DataOnDemandSvc.h.

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

Definition at line 268 of file DataOnDemandSvc.h.

ulonglong DataOnDemandSvc::m_stat = 0
private

Definition at line 236 of file DataOnDemandSvc.h.

ulonglong DataOnDemandSvc::m_statAlg = 0
private

Definition at line 234 of file DataOnDemandSvc.h.

ulonglong DataOnDemandSvc::m_statNode = 0
private

Definition at line 235 of file DataOnDemandSvc.h.

ChronoEntity DataOnDemandSvc::m_timer_algs
private

Definition at line 239 of file DataOnDemandSvc.h.

ChronoEntity DataOnDemandSvc::m_timer_all
private

Definition at line 240 of file DataOnDemandSvc.h.

ChronoEntity DataOnDemandSvc::m_timer_nodes
private

Definition at line 238 of file DataOnDemandSvc.h.

SmartIF<IToolSvc> DataOnDemandSvc::m_toolSvc
private

Data provider reference.

Definition at line 225 of file DataOnDemandSvc.h.

ChronoEntity DataOnDemandSvc::m_total
private

Definition at line 233 of file DataOnDemandSvc.h.

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

Definition at line 249 of file DataOnDemandSvc.h.

bool DataOnDemandSvc::m_updateRequired = true
private

Definition at line 231 of file DataOnDemandSvc.h.


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