The Gaudi Framework  v30r4 (9b837755)
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 96 of file DataOnDemandSvc.h.

Definition at line 276 of file DataOnDemandSvc.h.

Definition at line 95 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 429 of file DataOnDemandSvc.cpp.

430 {
431  if ( l.algorithm ) {
432  return StatusCode::SUCCESS;
433  }
434  if ( !m_algMgr ) {
435  return StatusCode::FAILURE;
436  }
437  l.algorithm = m_algMgr->algorithm( l.name, false );
438  if ( l.algorithm ) {
439  return StatusCode::SUCCESS;
440  }
441  // create it!
442  StatusCode sc = m_algMgr->createAlgorithm( l.type, l.name, l.algorithm, true );
443  if ( sc.isFailure() ) {
444  error() << "Failed to create algorithm " << l.type << "('" << l.name << "')" << endmsg;
445  l.algorithm = nullptr;
446  return sc; // RETURN
447  }
448  if ( l.algorithm->isInitialized() ) {
449  return StatusCode::SUCCESS;
450  }
451  // initialize it!
452  sc = l.algorithm->sysInitialize();
453  if ( sc.isFailure() ) {
454  error() << "Failed to initialize algorithm " << l.type << "('" << l.name << "')" << endmsg;
455  l.algorithm = nullptr;
456  return sc; // RETURN
457  }
458  if ( Gaudi::StateMachine::RUNNING == l.algorithm->FSMState() ) {
459  return StatusCode::SUCCESS;
460  }
461  // run it!
462  sc = l.algorithm->sysStart();
463  if ( sc.isFailure() ) {
464  error() << "Failed to 'run' algorithm " << l.type << "('" << l.name << "')" << endmsg;
465  l.algorithm = nullptr;
466  return sc; // RETURN
467  }
468  return StatusCode::SUCCESS;
469 }
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 FAILURE
Definition: StatusCode.h:88
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
Definition: StatusCode.h:139
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:51
constexpr static const auto SUCCESS
Definition: StatusCode.h:87
dictionary l
Definition: gaudirun.py:453
SmartIF< IAlgManager > m_algMgr
Algorithm manager.
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:209
void DataOnDemandSvc::deprecated_property ( Gaudi::Details::PropertyBase p)
inlineprivate

Definition at line 216 of file DataOnDemandSvc.h.

217  {
218  warning() << p.name() << " " << p.documentation() << endmsg;
219  force_update( p );
220  };
const std::string name() const
property name
Definition: Property.h:39
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:41
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:209
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 684 of file DataOnDemandSvc.cpp.

685 {
686  if ( m_algs.empty() && m_nodes.empty() ) {
687  return;
688  }
689 
692  for ( auto& alg : m_algs ) {
693  auto check = _m.find( alg.first );
694  if ( _m.end() != check ) {
695  warning() << " The data item is activated for '" << check->first << "' as '" << check->second.first << "'"
696  << endmsg;
697  }
698  const Leaf& l = alg.second;
699  std::string nam = ( l.name == l.type ? l.type : ( l.type + "/" + l.name ) );
700  //
701  if ( !mode && 0 == l.num ) {
702  continue;
703  }
704  //
705  std::string val;
706  if ( mode ) {
707  val = ( !l.algorithm ) ? "F" : "T";
708  } else {
709  val = std::to_string( l.num );
710  }
711  //
712  _m[no_prefix( alg.first, m_prefix )] = {nam, val};
713  }
714  // nodes:
715  for ( const auto& node : m_nodes ) {
716  auto check = _m.find( node.first );
717  if ( _m.end() != check ) {
718  warning() << " The data item is already activated for '" << check->first << "' as '" << check->second.first << "'"
719  << endmsg;
720  }
721  const Node& n = node.second;
722  std::string nam = "'" + n.name + "'";
723  //
724  std::string val;
725 
726  if ( !mode && 0 == n.num ) {
727  continue;
728  }
729 
730  if ( mode ) {
731  val = ( 0 == n.clazz ) ? "F" : "T";
732  } else {
733  val = std::to_string( n.num );
734  }
735  //
736  _m[no_prefix( node.first, m_prefix )] = {nam, val};
737  }
738  //
739  if ( _m.empty() ) {
740  return;
741  }
742 
743  // find the correct formats
744  size_t n1 = 0;
745  size_t n2 = 0;
746  size_t n3 = 0;
747  for ( const auto& i : _m ) {
748  n1 = std::max( n1, i.first.size() );
749  n2 = std::max( n2, i.second.first.size() );
750  n3 = std::max( n3, i.second.second.size() );
751  }
752  if ( 10 > n1 ) {
753  n1 = 10;
754  }
755  if ( 10 > n2 ) {
756  n2 = 10;
757  }
758  if ( 60 < n1 ) {
759  n1 = 60;
760  }
761  if ( 60 < n2 ) {
762  n2 = 60;
763  }
764  //
765 
766  const std::string _f = " | %%1$-%1%.%1%s | %%2$-%2%.%2%s | %%3$%3%.%3%s |";
767  boost::format _ff( _f );
768  _ff % n1 % n2 % n3;
769 
770  const std::string _format = _ff.str();
771 
772  auto& msg = msgStream( level );
773 
774  if ( mode ) {
775  msg << "Data-On-Demand Actions enabled for:";
776  } else {
777  msg << "Data-On-Demand Actions has been used for:";
778  }
779 
780  boost::format fmt1( _format );
781  fmt1 % "Address" % "Creator" % ( mode ? "S" : "#" );
782  //
783  const std::string header = fmt1.str();
784  std::string line = std::string( header.size(), '-' );
785  line[0] = ' ';
786 
787  msg << '\n' << line << '\n' << header << '\n' << line;
788 
789  // make the actual printout:
790  for ( const auto& item : _m ) {
791  boost::format fmt( _format );
792  msg << '\n' << ( fmt % item.first % item.second.first % item.second.second );
793  }
794 
795  msg << '\n' << line << endmsg;
796 }
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:120
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:201
NodeMap m_nodes
Map of "empty" objects to be placed as intermediate nodes.
T max(T...args)
dictionary l
Definition: gaudirun.py:453
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:209
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 645 of file DataOnDemandSvc.cpp.

646 {
648  //
649  if ( l.executing ) {
650  return StatusCode::FAILURE;
651  } // RETURN
652  //
653  if ( !l.algorithm ) {
654  StatusCode sc = configureHandler( l );
655  if ( sc.isFailure() ) {
656  error() << "Failed to configure handler for: " << l.name << "[" << l.type << "] " << tag << endmsg;
657  return sc; // RETURN
658  }
659  }
660  //
661  Chrono atimer( m_total );
662  //
663  Protection p( l.executing );
664  // FIXME: this will cause problems for Hive, as we need to set
665  // the EventContext of the called Algorithm.
666  // if (!l.algorithm->getContext()) {
667  // l.algorithm->setContext( &Gaudi::Hive::currentContext() );
668  // }
669  StatusCode sc = l.algorithm->sysExecute( Gaudi::Hive::currentContext() );
670  if ( sc.isFailure() ) {
671  error() << "Failed to execute the algorithm:" << l.algorithm->name() << " for location:" << tag << endmsg;
672  return sc; // RETURN
673  }
674  ++l.num;
675  //
676  return StatusCode::SUCCESS;
677 }
constexpr static const auto FAILURE
Definition: StatusCode.h:88
ChronoEntity m_timer_algs
A small utility class for chronometry of user codes.
Definition: Chrono.h:25
bool isFailure() const
Definition: StatusCode.h:139
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:51
GAUDI_API const EventContext & currentContext()
constexpr static const auto SUCCESS
Definition: StatusCode.h:87
dictionary l
Definition: gaudirun.py:453
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:209
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 600 of file DataOnDemandSvc.cpp.

601 {
602 
604 
605  if ( n.executing ) {
606  return StatusCode::FAILURE;
607  } // RETURN
608 
609  Protection p( n.executing );
610 
612 
613  if ( n.dataObject ) {
614  object.reset( new DataObject() );
615  } else {
616  // try to recover the handler
617  if ( !n.clazz ) {
618  n.clazz = TClass::GetClass( n.name.c_str() );
619  }
620  if ( !n.clazz ) {
621  error() << "Failed to get dictionary for class '" << n.name << "' for location:" << tag << endmsg;
622  return StatusCode::FAILURE; // RETURN
623  }
624 
625  object.reset( reinterpret_cast<DataObject*>( n.clazz->New() ) );
626 
627  if ( !object ) {
628  error() << "Failed to create an object of type:" << n.clazz->GetName() << " for location:" << tag << endmsg;
629  return StatusCode::FAILURE; // RETURN
630  }
631  }
632  //
633  StatusCode sc = m_dataSvc->registerObject( tag, object.release() );
634  if ( sc.isFailure() ) {
635  error() << "Failed to register an object of type:" << n.name << " at location:" << tag << endmsg;
636  return sc; // RETURN
637  }
638  ++n.num;
639  //
640  return StatusCode::SUCCESS;
641 }
constexpr static const auto FAILURE
Definition: StatusCode.h:88
bool isFailure() const
Definition: StatusCode.h:139
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:51
T reset(T...args)
constexpr static const auto SUCCESS
Definition: StatusCode.h:87
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:52
ChronoEntity m_timer_nodes
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:209
StatusCode DataOnDemandSvc::finalize ( )
override

Inherited Service overrides: Service finalization.

Definition at line 236 of file DataOnDemandSvc.cpp.

237 {
238  //
239  info() << "Handled \"" << m_trapType.value() << "\" incidents: " << m_statAlg << "/" << m_statNode << "/" << m_stat
240  << "(Alg/Node/Total)." << endmsg;
241  if ( m_dump || msgLevel( MSG::DEBUG ) ) {
242  info() << m_total.outputUserTime( "Algorithm timing: Mean(+-rms)/Min/Max:%3%(+-%4%)/%6%/%7%[ms] ",
244  << m_total.outputUserTime( "Total:%2%[s]", System::Sec ) << endmsg;
245  info() << m_timer_nodes.outputUserTime( "Nodes timing: Mean(+-rms)/Min/Max:%3%(+-%4%)/%6%/%7%[ms] ",
247  << m_timer_nodes.outputUserTime( "Total:%2%[s]", System::Sec ) << endmsg;
248  info() << m_timer_algs.outputUserTime( "Algs timing: Mean(+-rms)/Min/Max:%3%(+-%4%)/%6%/%7%[ms] ",
250  << m_timer_algs.outputUserTime( "Total:%2%[s]", System::Sec ) << endmsg;
251  info() << m_timer_all.outputUserTime( "All timing: Mean(+-rms)/Min/Max:%3%(+-%4%)/%6%/%7%[ms] ",
253  << m_timer_all.outputUserTime( "Total:%2%[s]", System::Sec ) << endmsg;
254  }
255  // dump it!
256  if ( m_dump ) {
257  dump( MSG::INFO, false );
258  } else if ( msgLevel( MSG::DEBUG ) ) {
259  dump( MSG::DEBUG, false );
260  }
261  //
262  if ( m_incSvc ) {
264  m_incSvc.reset();
265  }
266  m_algMgr.reset();
267  m_dataSvc.reset();
268  if ( m_toolSvc ) { // we may not have retrieved the ToolSvc
269  // Do not call releaseTool if the ToolSvc was already finalized.
271  for ( const auto& i : m_nodeMappers ) m_toolSvc->releaseTool( i ).ignore();
272  for ( const auto& i : m_algMappers ) m_toolSvc->releaseTool( i ).ignore();
273  } else {
274  warning() << "ToolSvc already finalized: cannot release tools. Check options." << endmsg;
275  }
276  m_nodeMappers.clear();
277  m_algMappers.clear();
278  m_toolSvc.reset();
279  }
280  return Service::finalize();
281 }
ChronoEntity m_timer_all
StatusCode finalize() override
Definition: Service.cpp:173
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:187
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:165
Gaudi::StateMachine::State FSMState() const override
Definition: Service.h:53
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:92
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:209
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 211 of file DataOnDemandSvc.h.

212  {
213  verbose() << "updated property " << p.name() << ", forcing update" << endmsg;
214  m_updateRequired = true;
215  };
const std::string name() const
property name
Definition: Property.h:39
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:209
void DataOnDemandSvc::handle ( const Incident incident)
override

IIncidentListener interfaces overrides: incident handling.

Definition at line 527 of file DataOnDemandSvc.cpp.

528 {
529 
531 
532  ++m_stat;
533  // proper incident type?
534  if ( incident.type() != m_trapType ) {
535  return;
536  } // RETURN
537  const DataIncident* inc = dynamic_cast<const DataIncident*>( &incident );
538  if ( !inc ) {
539  return;
540  } // RETURN
541  // update if needed!
542  if ( m_updateRequired ) {
543  update();
544  }
545 
546  if ( msgLevel( MSG::VERBOSE ) ) {
547  verbose() << "Incident: [" << incident.type() << "] "
548  << " = " << incident.source() << " Location:" << inc->tag() << endmsg;
549  }
550  // ==========================================================================
551  Gaudi::StringKey tag( inc->tag() );
552  // ==========================================================================
553  auto icl = m_nodes.find( tag );
554  if ( icl != m_nodes.end() ) {
555  StatusCode sc = execHandler( tag, icl->second );
556  if ( sc.isSuccess() ) {
557  ++m_statNode;
558  }
559  return; // RETURN
560  }
561  // ==========================================================================
562  auto ialg = m_algs.find( tag );
563  if ( ialg != m_algs.end() ) {
564  StatusCode sc = execHandler( tag, ialg->second );
565  if ( sc.isSuccess() ) {
566  ++m_statAlg;
567  }
568  return; // RETURN
569  }
570  // ==========================================================================
571  // Fall back on the tools
572  if ( m_toolSvc ) {
573  if ( msgLevel( MSG::VERBOSE ) ) verbose() << "Try to find mapping with mapping tools" << endmsg;
574  Finder finder( no_prefix( inc->tag(), m_prefix ), m_nodeMappers, m_algMappers );
575  // - try the node mappers
576  std::string node = finder.node();
577  if ( isGood( node ) ) {
578  // if one is found update the internal node mapping and try again.
579  if ( msgLevel( MSG::VERBOSE ) ) verbose() << "Found Node handler: " << node << endmsg;
580  i_setNodeHandler( inc->tag(), node );
581  handle( incident );
582  --m_stat; // avoid double counting because of recursion
583  return;
584  }
585  // - try alg mappings
586  Gaudi::Utils::TypeNameString alg = finder.alg();
587  if ( isGood( alg ) ) {
588  // we got an algorithm, update alg map and try to handle again
589  if ( msgLevel( MSG::VERBOSE ) ) verbose() << "Found Algorithm handler: " << alg << endmsg;
590  i_setAlgHandler( inc->tag(), alg ).ignore();
591  handle( incident );
592  --m_stat; // avoid double counting because of recursion
593  return;
594  }
595  }
596 }
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
Definition: StatusCode.h:287
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.
Gaudi::Property< std::string > m_prefix
unsigned long long m_stat
iterator end()
Definition: Map.h:134
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:51
iterator find(const key_type &key)
Definition: Map.h:151
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.
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:209
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 128 of file DataOnDemandSvc.cpp.

129 {
130  Leaf leaf( alg.type(), alg.name() );
131  if ( m_init ) {
132  StatusCode sc = configureHandler( leaf );
133  if ( sc.isFailure() ) {
134  if ( m_allowInitFailure ) {
135  // re-store the content of the leaf object to try again to initialize
136  // the algorithm later (on demand)
137  leaf = Leaf( alg.type(), alg.name() );
138  } else
139  return sc;
140  }
141  }
142  m_algs[name] = leaf;
143  return StatusCode::SUCCESS;
144 }
const std::string & name() const override
Retrieve name of the service.
Definition: Service.cpp:288
Gaudi::Property< bool > m_init
bool isFailure() const
Definition: StatusCode.h:139
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:51
constexpr static const auto SUCCESS
Definition: StatusCode.h:87
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 119 of file DataOnDemandSvc.cpp.

120 {
121  ClassH cl = TClass::GetClass( type.c_str() );
122  if ( !cl ) {
123  warning() << "Failed to access dictionary class for " << name << " of type:" << type << endmsg;
124  }
125  m_nodes[name] = Node( cl, false, type );
126 }
const std::string & name() const override
Retrieve name of the service.
Definition: Service.cpp:288
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:209
StatusCode DataOnDemandSvc::initialize ( )
override

Inherited Service overrides: Service initialization.

Definition at line 209 of file DataOnDemandSvc.cpp.

210 {
211  // initialize the Service Base class
213  if ( sc.isFailure() ) {
214  return sc;
215  }
216  sc = setup();
217  if ( sc.isFailure() ) {
218  return sc;
219  }
220  //
221  if ( m_dump ) {
222  dump( MSG::INFO );
223  } else if ( msgLevel( MSG::DEBUG ) ) {
224  dump( MSG::DEBUG );
225  }
226  //
227  if ( m_init ) {
228  return update();
229  }
230  //
231  return StatusCode::SUCCESS;
232 }
StatusCode initialize() override
Definition: Service.cpp:63
Gaudi::Property< bool > m_init
bool isFailure() const
Definition: StatusCode.h:139
StatusCode setup()
Setup routine (called by (re-) initialize.
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:51
void dump(const MSG::Level level, const bool mode=true) const
dump the content of DataOnDemand service
constexpr static const auto SUCCESS
Definition: StatusCode.h:87
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 285 of file DataOnDemandSvc.cpp.

286 {
287  // reinitialize the Service Base class
288  if ( m_incSvc ) {
290  m_incSvc.reset();
291  }
292  m_algMgr.reset();
293  m_dataSvc.reset();
294  for ( const auto& i : m_nodeMappers ) m_toolSvc->releaseTool( i ).ignore();
295  m_nodeMappers.clear();
296  for ( const auto& i : m_algMappers ) m_toolSvc->releaseTool( i ).ignore();
297  m_algMappers.clear();
298  m_toolSvc.reset();
299  //
301  if ( sc.isFailure() ) {
302  return sc;
303  }
304  //
305  sc = setup();
306  if ( sc.isFailure() ) {
307  return sc;
308  }
309  //
310  if ( m_dump ) {
311  dump( MSG::INFO );
312  } else if ( msgLevel( MSG::DEBUG ) ) {
313  dump( MSG::DEBUG );
314  }
315  //
316  return StatusCode::SUCCESS;
317 }
SmartIF< IIncidentSvc > m_incSvc
Incident service.
Gaudi::Property< std::string > m_trapType
bool isFailure() const
Definition: StatusCode.h:139
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:51
StatusCode reinitialize() override
Definition: Service.cpp:249
void dump(const MSG::Level level, const bool mode=true) const
dump the content of DataOnDemand service
constexpr static const auto SUCCESS
Definition: StatusCode.h:87
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:165
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:92
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 321 of file DataOnDemandSvc.cpp.

322 {
323  if ( !( m_algMgr = serviceLocator() ) ) // assignment meant
324  {
325  error() << "Failed to retrieve the IAlgManager interface." << endmsg;
326  return StatusCode::FAILURE;
327  }
328 
329  if ( !( m_incSvc = serviceLocator()->service( "IncidentSvc" ) ) ) // assignment meant
330  {
331  error() << "Failed to retrieve Incident service." << endmsg;
332  return StatusCode::FAILURE;
333  }
334  m_incSvc->addListener( this, m_trapType );
335 
336  if ( !( m_dataSvc = serviceLocator()->service( m_dataSvcName ) ) ) // assignment meant
337  {
338  error() << "Failed to retrieve the data provider interface of " << m_dataSvcName << endmsg;
339  return StatusCode::FAILURE;
340  }
341 
342  // No need to get the ToolSvc if we are not using tools
343  if ( !( m_nodeMapTools.empty() && m_algMapTools.empty() ) ) {
344  if ( !( m_toolSvc = serviceLocator()->service( "ToolSvc" ) ) ) // assignment meant
345  {
346  error() << "Failed to retrieve ToolSvc" << endmsg;
347  return StatusCode::FAILURE;
348  }
349 
350  // load the node mapping tools
351  IDODNodeMapper* nodetool = nullptr;
352  for ( const auto& i : m_nodeMapTools ) {
353  const StatusCode sc = m_toolSvc->retrieveTool( i, nodetool );
354  if ( sc.isFailure() ) return sc;
355  m_nodeMappers.push_back( nodetool );
356  }
357  IDODAlgMapper* algtool = nullptr;
358  for ( const auto& i : m_algMapTools ) {
359  const StatusCode sc = m_toolSvc->retrieveTool( i, algtool );
360  if ( sc.isFailure() ) return sc;
361  m_algMappers.push_back( algtool );
362  }
363  }
364  return update();
365 }
constexpr static const auto FAILURE
Definition: StatusCode.h:88
SmartIF< IIncidentSvc > m_incSvc
Incident service.
Gaudi::Property< std::string > m_trapType
bool isFailure() const
Definition: StatusCode.h:139
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:139
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:79
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:51
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:84
SmartIF< ISvcLocator > & serviceLocator() const override
Retrieve pointer to service locator.
Definition: Service.cpp:291
std::vector< IDODAlgMapper * > m_algMappers
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:209
StatusCode update()
update the handlers
StatusCode DataOnDemandSvc::setupAlgHandlers ( )
protected

Initialize leaf handlers.

Definition at line 399 of file DataOnDemandSvc.cpp.

400 {
401  std::string typ, tag;
402 
403  for ( auto alg : m_algMapping ) {
404  using Parser = Gaudi::Utils::AttribStringParser;
405  for ( auto attrib : Parser( alg ) ) {
406  switch (::toupper( attrib.tag[0] ) ) {
407  case 'D':
408  tag = std::move( attrib.value );
409  break;
410  case 'T':
411  typ = std::move( attrib.value );
412  break;
413  }
414  }
415  Gaudi::Utils::TypeNameString item( typ );
416  if ( m_algMap.end() != m_algMap.find( tag ) || m_nodeMap.end() != m_nodeMap.find( tag ) ) {
417  warning() << "The obsolete property 'Algorithms' redefines the action for '" + tag + "' to be '" + item.type() +
418  "/" + item.name() + "'"
419  << endmsg;
420  }
421  m_algMap[tag] = item.type() + "/" + item.name();
422  }
423  m_updateRequired = true;
424  return StatusCode::SUCCESS;
425 }
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)
constexpr static const auto SUCCESS
Definition: StatusCode.h:87
void toupper(std::string &s)
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:209
StatusCode DataOnDemandSvc::setupNodeHandlers ( )
protected

Initialize node handlers.

Definition at line 369 of file DataOnDemandSvc.cpp.

370 {
371  std::string nam, typ, tag;
373  // Setup for node leafs, where simply a constructor is called...
374  for ( auto node : m_nodeMapping ) {
375  using Parser = Gaudi::Utils::AttribStringParser;
376  for ( auto attrib : Parser( node ) ) {
377  switch (::toupper( attrib.tag[0] ) ) {
378  case 'D':
379  tag = std::move( attrib.value );
380  break;
381  case 'T':
382  nam = std::move( attrib.value );
383  break;
384  }
385  }
386  if ( m_algMap.end() != m_algMap.find( tag ) || m_nodeMap.end() != m_nodeMap.find( tag ) ) {
387  warning() << "The obsolete property 'Nodes' redefines the action for '" + tag + "' to be '" + nam + "'" << endmsg;
388  }
389  m_nodeMap[tag] = nam;
390  }
391  //
392  m_updateRequired = true;
393  //
394  return sc;
395 }
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:51
T move(T...args)
constexpr static const auto SUCCESS
Definition: StatusCode.h:87
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:209
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 149 of file DataOnDemandSvc.cpp.

150 {
151  if ( !m_updateRequired ) {
152  return StatusCode::SUCCESS;
153  }
154 
156  StatusCode sc = setupNodeHandlers(); // convert "Nodes" new "NodeMap"
157  if ( sc.isFailure() ) {
158  error() << "Failed to setup old \"Nodes\"" << endmsg;
159  return sc;
160  }
162  sc = setupAlgHandlers(); // convert "Algorithms" into "AlgMap"
163  if ( sc.isFailure() ) {
164  error() << "Failed to setup old \"Algorithms\"" << endmsg;
165  return sc;
166  }
168  add_prefix( m_algMap, m_prefix );
170  add_prefix( m_nodeMap, m_prefix );
173  if ( m_partialPath ) {
174  get_dirs( m_algMap, dirs );
175  }
176  if ( m_partialPath ) {
177  get_dirs( m_nodeMap, dirs );
178  }
179  //
180  auto _e = dirs.find( "/Event" );
181  if ( dirs.end() != _e ) {
182  dirs.erase( _e );
183  }
184  // add all directories as nodes
185  for ( const auto& dir : dirs ) {
186  if ( m_algMap.end() == m_algMap.find( dir ) && m_nodeMap.end() == m_nodeMap.find( dir ) )
187  m_nodeMap[dir] = "DataObject";
188  }
189  //
190  m_algs.clear();
191  m_nodes.clear();
192  //
194  for ( const auto& alg : m_algMap ) {
195  if ( i_setAlgHandler( alg.first, alg.second ).isFailure() ) return StatusCode::FAILURE;
196  }
198  for ( const auto& node : m_nodeMap ) {
199  i_setNodeHandler( node.first, node.second );
200  }
202  m_updateRequired = false;
203  //
204  return StatusCode::SUCCESS;
205 }
void i_setNodeHandler(const std::string &name, const std::string &type)
Internal method to initialize a node handler.
constexpr static const auto FAILURE
Definition: StatusCode.h:88
Gaudi::Property< Map > m_nodeMap
T end(T...args)
bool isFailure() const
Definition: StatusCode.h:139
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:51
StatusCode setupNodeHandlers()
Initialize node handlers.
T erase(T...args)
NodeMap m_nodes
Map of "empty" objects to be placed as intermediate nodes.
constexpr static const auto SUCCESS
Definition: StatusCode.h:87
Gaudi::Property< bool > m_partialPath
T find(T...args)
AlgMap m_algs
Map of algorithms to handle incidents.
void clear()
Definition: Map.h:195
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:209

Member Data Documentation

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

Definition at line 277 of file DataOnDemandSvc.h.

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

Definition at line 251 of file DataOnDemandSvc.h.

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

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

SmartIF<IAlgManager> DataOnDemandSvc::m_algMgr = nullptr
private

Algorithm manager.

Definition at line 226 of file DataOnDemandSvc.h.

AlgMap DataOnDemandSvc::m_algs
private

Map of algorithms to handle incidents.

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

SmartIF<IDataProviderSvc> DataOnDemandSvc::m_dataSvc = nullptr
private

Data provider reference.

Definition at line 228 of file DataOnDemandSvc.h.

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

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

SmartIF<IIncidentSvc> DataOnDemandSvc::m_incSvc = nullptr
private

Incident service.

Definition at line 224 of file DataOnDemandSvc.h.

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

Definition at line 266 of file DataOnDemandSvc.h.

bool DataOnDemandSvc::m_locked_algs = false
private

Definition at line 247 of file DataOnDemandSvc.h.

bool DataOnDemandSvc::m_locked_all = false
private

Definition at line 248 of file DataOnDemandSvc.h.

bool DataOnDemandSvc::m_locked_nodes = false
private

Definition at line 246 of file DataOnDemandSvc.h.

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

Definition at line 278 of file DataOnDemandSvc.h.

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

Definition at line 250 of file DataOnDemandSvc.h.

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

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

NodeMap DataOnDemandSvc::m_nodes
private

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

Definition at line 234 of file DataOnDemandSvc.h.

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

Definition at line 257 of file DataOnDemandSvc.h.

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

Definition at line 280 of file DataOnDemandSvc.h.

unsigned long long DataOnDemandSvc::m_stat = 0
private

Definition at line 241 of file DataOnDemandSvc.h.

unsigned long long DataOnDemandSvc::m_statAlg = 0
private

Definition at line 239 of file DataOnDemandSvc.h.

unsigned long long DataOnDemandSvc::m_statNode = 0
private

Definition at line 240 of file DataOnDemandSvc.h.

ChronoEntity DataOnDemandSvc::m_timer_algs
private

Definition at line 244 of file DataOnDemandSvc.h.

ChronoEntity DataOnDemandSvc::m_timer_all
private

Definition at line 245 of file DataOnDemandSvc.h.

ChronoEntity DataOnDemandSvc::m_timer_nodes
private

Definition at line 243 of file DataOnDemandSvc.h.

SmartIF<IToolSvc> DataOnDemandSvc::m_toolSvc
private

Data provider reference.

Definition at line 230 of file DataOnDemandSvc.h.

ChronoEntity DataOnDemandSvc::m_total
private

Definition at line 238 of file DataOnDemandSvc.h.

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

Definition at line 254 of file DataOnDemandSvc.h.

bool DataOnDemandSvc::m_updateRequired = true
private

Definition at line 236 of file DataOnDemandSvc.h.


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