The Gaudi Framework  v40r0 (475e45c1)
DataOnDemandSvc.cpp
Go to the documentation of this file.
1 /***********************************************************************************\
2 * (c) Copyright 1998-2025 CERN for the benefit of the LHCb and ATLAS collaborations *
3 * *
4 * This software is distributed under the terms of the Apache version 2 licence, *
5 * copied verbatim in the file "LICENSE". *
6 * *
7 * In applying this licence, CERN does not waive the privileges and immunities *
8 * granted to it by virtue of its status as an Intergovernmental Organization *
9 * or submit itself to any jurisdiction. *
10 \***********************************************************************************/
11 #include "DataOnDemandSvc.h"
13 #include <GaudiKernel/Chrono.h>
15 #include <GaudiKernel/DataObject.h>
17 #include <GaudiKernel/IAlgorithm.h>
21 #include <GaudiKernel/IToolSvc.h>
23 #include <GaudiKernel/MsgStream.h>
25 #include <GaudiKernel/ToStream.h>
27 #include <fmt/format.h>
28 #include <map>
29 #include <math.h>
30 #include <set>
31 #include <string>
32 
33 namespace {
34 
40  inline std::string no_prefix( const std::string& value, const std::string& prefix ) {
41  return boost::algorithm::starts_with( value, prefix ) ? value.substr( prefix.size() ) : value;
42  }
49  template <class MAP>
50  inline size_t add_prefix( MAP& _map, const std::string& prefix ) {
51  // empty prefix
52  if ( prefix.empty() ) { return 0; }
54  auto it = std::find_if_not( _map.begin(), _map.end(), [&]( typename MAP::ValueType::const_reference i ) {
55  return boost::algorithm::starts_with( i.first, prefix );
56  } );
57  if ( it == _map.end() ) return 0;
58  std::string key = prefix + it->first;
59  std::string value = std::move( it->second ); // steal the value we're about to erase..
60  _map.erase( it );
61  _map[key] = std::move( value ); // and move it into its new location
62  return 1 + add_prefix( _map, prefix ); // RETURN, recursion
63  }
69  template <class SET>
70  inline size_t get_dir( const std::string& object, SET& _set ) {
71  std::string::size_type ifind = object.rfind( '/' );
72  // stop recursion
73  if ( std::string::npos == ifind ) { return 0; }
74  if ( 0 == ifind ) { return 0; }
75  const std::string top = std::string( object, 0, ifind );
76  _set.insert( top );
77  return 1 + get_dir( top, _set ); // RETURN, recursion
78  }
84  template <class MAP, class SET>
85  inline size_t get_dirs( const MAP& _map, SET& _set ) {
86  size_t size = _set.size();
87  for ( const auto& item : _map ) { get_dir( item.first, _set ); }
88  return _set.size() - size;
89  }
90 } // namespace
91 
92 void DataOnDemandSvc::i_setNodeHandler( const std::string& name, const std::string& type ) {
93  ClassH cl = TClass::GetClass( type.c_str() );
94  if ( !cl ) { warning() << "Failed to access dictionary class for " << name << " of type:" << type << endmsg; }
95  m_nodes[name] = Node( cl, false, type );
96 }
97 
99  Leaf leaf( alg.type(), alg.name() );
100  if ( m_init ) {
101  StatusCode sc = configureHandler( leaf );
102  if ( sc.isFailure() ) {
103  if ( m_allowInitFailure ) {
104  // re-store the content of the leaf object to try again to initialize
105  // the algorithm later (on demand)
106  leaf = Leaf( alg.type(), alg.name() );
107  } else
108  return sc;
109  }
110  }
111  m_algs[name] = leaf;
112  return StatusCode::SUCCESS;
113 }
114 
116  if ( !m_updateRequired ) { return StatusCode::SUCCESS; }
117 
118  // convert obsolete "Nodes" into new "NodeMap"
119  StatusCode sc = setupNodeHandlers(); // convert "Nodes" new "NodeMap"
120  if ( sc.isFailure() ) {
121  error() << "Failed to setup old \"Nodes\"" << endmsg;
122  return sc;
123  }
124  // convert obsolete "Algorithms" into new "AlgMap"
125  sc = setupAlgHandlers(); // convert "Algorithms" into "AlgMap"
126  if ( sc.isFailure() ) {
127  error() << "Failed to setup old \"Algorithms\"" << endmsg;
128  return sc;
129  }
130  // add the default prefix
131  add_prefix( m_algMap, m_prefix );
132  // add the default prefix
133  add_prefix( m_nodeMap, m_prefix );
134  // get all directories
135  std::set<std::string> dirs;
136  if ( m_partialPath ) { get_dirs( m_algMap, dirs ); }
137  if ( m_partialPath ) { get_dirs( m_nodeMap, dirs ); }
138 
139  auto _e = dirs.find( "/Event" );
140  if ( dirs.end() != _e ) { dirs.erase( _e ); }
141  // add all directories as nodes
142  for ( const auto& dir : dirs ) {
143  if ( m_algMap.end() == m_algMap.find( dir ) && m_nodeMap.end() == m_nodeMap.find( dir ) )
144  m_nodeMap[dir] = "DataObject";
145  }
146 
147  m_algs.clear();
148  m_nodes.clear();
149 
150  // setup algorithms
151  for ( const auto& alg : m_algMap ) {
152  if ( i_setAlgHandler( alg.first, alg.second ).isFailure() ) return StatusCode::FAILURE;
153  }
154  // setup nodes
155  for ( const auto& node : m_nodeMap ) { i_setNodeHandler( node.first, node.second ); }
156 
157  m_updateRequired = false;
158 
159  return StatusCode::SUCCESS;
160 }
162  // initialize the Service Base class
164  if ( sc.isFailure() ) { return sc; }
165  sc = setup();
166  if ( sc.isFailure() ) { return sc; }
167  //
168  if ( m_dump ) {
169  dump( MSG::INFO );
170  } else if ( msgLevel( MSG::DEBUG ) ) {
171  dump( MSG::DEBUG );
172  }
173 
174  if ( m_init ) { return update(); }
175 
176  return StatusCode::SUCCESS;
177 }
179  info() << "Handled \"" << m_trapType.value() << "\" incidents: " << m_statAlg << "/" << m_statNode << "/" << m_stat
180  << "(Alg/Node/Total)." << endmsg;
181  if ( m_dump || msgLevel( MSG::DEBUG ) ) {
182  info() << m_total.outputUserTime( "Algorithm timing: Mean(+-rms)/Min/Max:%3%(+-%4%)/%6%/%7%[ms] ",
184  << m_total.outputUserTime( "Total:%2%[s]", System::Sec ) << endmsg;
185  info() << m_timer_nodes.outputUserTime( "Nodes timing: Mean(+-rms)/Min/Max:%3%(+-%4%)/%6%/%7%[ms] ",
187  << m_timer_nodes.outputUserTime( "Total:%2%[s]", System::Sec ) << endmsg;
188  info() << m_timer_algs.outputUserTime( "Algs timing: Mean(+-rms)/Min/Max:%3%(+-%4%)/%6%/%7%[ms] ",
190  << m_timer_algs.outputUserTime( "Total:%2%[s]", System::Sec ) << endmsg;
191  info() << m_timer_all.outputUserTime( "All timing: Mean(+-rms)/Min/Max:%3%(+-%4%)/%6%/%7%[ms] ",
193  << m_timer_all.outputUserTime( "Total:%2%[s]", System::Sec ) << endmsg;
194  }
195  // dump it!
196  if ( m_dump ) {
197  dump( MSG::INFO, false );
198  } else if ( msgLevel( MSG::DEBUG ) ) {
199  dump( MSG::DEBUG, false );
200  }
201 
202  if ( m_incSvc ) {
203  m_incSvc->removeListener( this, m_trapType );
204  m_incSvc.reset();
205  }
206  m_algMgr.reset();
207  m_dataSvc.reset();
208  if ( m_toolSvc ) { // we may not have retrieved the ToolSvc
209  // Do not call releaseTool if the ToolSvc was already finalized.
211  for ( const auto& i : m_nodeMappers ) m_toolSvc->releaseTool( i ).ignore();
212  for ( const auto& i : m_algMappers ) m_toolSvc->releaseTool( i ).ignore();
213  } else {
214  warning() << "ToolSvc already finalized: cannot release tools. Check options." << endmsg;
215  }
216  m_nodeMappers.clear();
217  m_algMappers.clear();
218  m_toolSvc.reset();
219  }
220  return Service::finalize();
221 }
223  // reinitialize the Service Base class
224  if ( m_incSvc ) {
225  m_incSvc->removeListener( this, m_trapType );
226  m_incSvc.reset();
227  }
228  m_algMgr.reset();
229  m_dataSvc.reset();
230  for ( const auto& i : m_nodeMappers ) m_toolSvc->releaseTool( i ).ignore();
231  m_nodeMappers.clear();
232  for ( const auto& i : m_algMappers ) m_toolSvc->releaseTool( i ).ignore();
233  m_algMappers.clear();
234  m_toolSvc.reset();
235 
237  if ( sc.isFailure() ) { return sc; }
238 
239  sc = setup();
240  if ( sc.isFailure() ) { return sc; }
241 
242  if ( m_dump ) {
243  dump( MSG::INFO );
244  } else if ( msgLevel( MSG::DEBUG ) ) {
245  dump( MSG::DEBUG );
246  }
247 
248  return StatusCode::SUCCESS;
249 }
251  if ( !( m_algMgr = serviceLocator() ) ) // assignment meant
252  {
253  error() << "Failed to retrieve the IAlgManager interface." << endmsg;
254  return StatusCode::FAILURE;
255  }
256 
257  if ( !( m_incSvc = serviceLocator()->service( "IncidentSvc" ) ) ) // assignment meant
258  {
259  error() << "Failed to retrieve Incident service." << endmsg;
260  return StatusCode::FAILURE;
261  }
262  m_incSvc->addListener( this, m_trapType );
263 
264  if ( !( m_dataSvc = serviceLocator()->service( m_dataSvcName ) ) ) // assignment meant
265  {
266  error() << "Failed to retrieve the data provider interface of " << m_dataSvcName << endmsg;
267  return StatusCode::FAILURE;
268  }
269 
270  // No need to get the ToolSvc if we are not using tools
271  if ( !( m_nodeMapTools.empty() && m_algMapTools.empty() ) ) {
272  if ( !( m_toolSvc = serviceLocator()->service( "ToolSvc" ) ) ) // assignment meant
273  {
274  error() << "Failed to retrieve ToolSvc" << endmsg;
275  return StatusCode::FAILURE;
276  }
277 
278  // load the node mapping tools
279  IDODNodeMapper* nodetool = nullptr;
280  for ( const auto& i : m_nodeMapTools ) {
281  const StatusCode sc = m_toolSvc->retrieveTool( i, nodetool );
282  if ( sc.isFailure() ) return sc;
283  m_nodeMappers.push_back( nodetool );
284  }
285  IDODAlgMapper* algtool = nullptr;
286  for ( const auto& i : m_algMapTools ) {
287  const StatusCode sc = m_toolSvc->retrieveTool( i, algtool );
288  if ( sc.isFailure() ) return sc;
289  m_algMappers.push_back( algtool );
290  }
291  }
292  return update();
293 }
295  std::string nam, typ, tag;
297  // Setup for node leafs, where simply a constructor is called...
298  for ( auto node : m_nodeMapping ) {
299  using Parser = Gaudi::Utils::AttribStringParser;
300  for ( auto attrib : Parser( node ) ) {
301  switch ( ::toupper( attrib.tag[0] ) ) {
302  case 'D':
303  tag = std::move( attrib.value );
304  break;
305  case 'T':
306  nam = std::move( attrib.value );
307  break;
308  }
309  }
310  if ( m_algMap.end() != m_algMap.find( tag ) || m_nodeMap.end() != m_nodeMap.find( tag ) ) {
311  warning() << "The obsolete property 'Nodes' redefines the action for '" + tag + "' to be '" + nam + "'" << endmsg;
312  }
313  m_nodeMap[tag] = nam;
314  }
315 
316  m_updateRequired = true;
317 
318  return sc;
319 }
321  std::string typ, tag;
322 
323  for ( auto alg : m_algMapping ) {
324  using Parser = Gaudi::Utils::AttribStringParser;
325  for ( auto attrib : Parser( alg ) ) {
326  switch ( ::toupper( attrib.tag[0] ) ) {
327  case 'D':
328  tag = std::move( attrib.value );
329  break;
330  case 'T':
331  typ = std::move( attrib.value );
332  break;
333  }
334  }
335  Gaudi::Utils::TypeNameString item( typ );
336  if ( m_algMap.end() != m_algMap.find( tag ) || m_nodeMap.end() != m_nodeMap.find( tag ) ) {
337  warning() << "The obsolete property 'Algorithms' redefines the action for '" + tag + "' to be '" + item.type() +
338  "/" + item.name() + "'"
339  << endmsg;
340  }
341  m_algMap[tag] = item.type() + "/" + item.name();
342  }
343  m_updateRequired = true;
344  return StatusCode::SUCCESS;
345 }
347  if ( l.algorithm ) { return StatusCode::SUCCESS; }
348  if ( !m_algMgr ) { return StatusCode::FAILURE; }
349  l.algorithm = m_algMgr->algorithm( l.name, false );
350  if ( l.algorithm ) { return StatusCode::SUCCESS; }
351  // create it!
352  StatusCode sc = m_algMgr->createAlgorithm( l.type, l.name, l.algorithm, true );
353  if ( sc.isFailure() ) {
354  error() << "Failed to create algorithm " << l.type << "('" << l.name << "')" << endmsg;
355  l.algorithm = nullptr;
356  return sc;
357  }
358  if ( l.algorithm->isInitialized() ) { return StatusCode::SUCCESS; }
359  // initialize it!
360  sc = l.algorithm->sysInitialize();
361  if ( sc.isFailure() ) {
362  error() << "Failed to initialize algorithm " << l.type << "('" << l.name << "')" << endmsg;
363  l.algorithm = nullptr;
364  return sc;
365  }
366  if ( Gaudi::StateMachine::RUNNING == l.algorithm->FSMState() ) { return StatusCode::SUCCESS; }
367  // run it!
368  sc = l.algorithm->sysStart();
369  if ( sc.isFailure() ) {
370  error() << "Failed to 'run' algorithm " << l.type << "('" << l.name << "')" << endmsg;
371  l.algorithm = nullptr;
372  return sc;
373  }
374  return StatusCode::SUCCESS;
375 }
376 
377 // local algorithms
378 namespace {
381  struct ToolGetter {
383  std::string path;
385  ToolGetter( std::string _path ) : path( std::move( _path ) ) {}
387  inline std::string operator()( IDODNodeMapper* t ) const { return t->nodeTypeForPath( path ); }
389  inline Gaudi::Utils::TypeNameString operator()( IDODAlgMapper* t ) const { return t->algorithmForPath( path ); }
390  };
391 
394  inline bool isGood( const std::string& r ) { return !r.empty(); }
395  inline bool isGood( const Gaudi::Utils::TypeNameString& r ) { return !r.name().empty(); }
397 
400  class Finder {
401  const ToolGetter getter;
402  const std::vector<IDODNodeMapper*>& nodes;
403  const std::vector<IDODAlgMapper*>& algs;
405  template <class R, class C>
406  R find( const C& l ) const {
407  for ( auto& i : l ) {
408  auto result = getter( i );
409  if ( isGood( result ) ) return result;
410  }
411  return R{ "" };
412  }
413 
414  public:
416  Finder( std::string _path, const std::vector<IDODNodeMapper*>& _nodes, const std::vector<IDODAlgMapper*>& _algs )
417  : getter( std::move( _path ) ), nodes( _nodes ), algs( _algs ) {}
419  inline std::string node() const { return find<std::string>( nodes ); }
421  inline Gaudi::Utils::TypeNameString alg() const { return find<Gaudi::Utils::TypeNameString>( algs ); }
422  };
423 } // namespace
424 
425 void DataOnDemandSvc::handle( const Incident& incident ) {
426 
428 
429  ++m_stat;
430  // proper incident type?
431  if ( incident.type() != m_trapType ) { return; }
432  const DataIncident* inc = dynamic_cast<const DataIncident*>( &incident );
433  if ( !inc ) { return; }
434  // update if needed!
435  if ( m_updateRequired ) {
436  if ( !update() ) throw GaudiException( "Failed to update", name(), StatusCode::FAILURE );
437  }
438 
439  if ( msgLevel( MSG::VERBOSE ) ) {
440  verbose() << "Incident: [" << incident.type() << "] "
441  << " = " << incident.source() << " Location:" << inc->tag() << endmsg;
442  }
443 
444  Gaudi::StringKey tag( inc->tag() );
445 
446  auto icl = m_nodes.find( tag );
447  if ( icl != m_nodes.end() ) {
448  StatusCode sc = execHandler( tag, icl->second );
449  if ( sc.isSuccess() ) { ++m_statNode; }
450  return;
451  }
452 
453  auto ialg = m_algs.find( tag );
454  if ( ialg != m_algs.end() ) {
455  StatusCode sc = execHandler( tag, ialg->second );
456  if ( sc.isSuccess() ) { ++m_statAlg; }
457  return;
458  }
459 
460  // Fall back on the tools
461  if ( m_toolSvc ) {
462  if ( msgLevel( MSG::VERBOSE ) ) verbose() << "Try to find mapping with mapping tools" << endmsg;
463  Finder finder( no_prefix( inc->tag(), m_prefix ), m_nodeMappers, m_algMappers );
464  // - try the node mappers
465  std::string node = finder.node();
466  if ( isGood( node ) ) {
467  // if one is found update the internal node mapping and try again.
468  if ( msgLevel( MSG::VERBOSE ) ) verbose() << "Found Node handler: " << node << endmsg;
469  i_setNodeHandler( inc->tag(), node );
470  handle( incident );
471  --m_stat; // avoid double counting because of recursion
472  return;
473  }
474  // - try alg mappings
475  Gaudi::Utils::TypeNameString alg = finder.alg();
476  if ( isGood( alg ) ) {
477  // we got an algorithm, update alg map and try to handle again
478  if ( msgLevel( MSG::VERBOSE ) ) verbose() << "Found Algorithm handler: " << alg << endmsg;
479  i_setAlgHandler( inc->tag(), alg ).ignore();
480  handle( incident );
481  --m_stat; // avoid double counting because of recursion
482  return;
483  }
484  }
485 }
486 StatusCode DataOnDemandSvc::execHandler( const std::string& tag, Node& n ) {
487 
489 
490  if ( n.executing ) { return StatusCode::FAILURE; }
491 
492  Protection p( n.executing );
493 
494  std::unique_ptr<DataObject> object;
495 
496  if ( n.dataObject ) {
497  object.reset( new DataObject() );
498  } else {
499  // try to recover the handler
500  if ( !n.clazz ) { n.clazz = TClass::GetClass( n.name.c_str() ); }
501  if ( !n.clazz ) {
502  error() << "Failed to get dictionary for class '" << n.name << "' for location:" << tag << endmsg;
503  return StatusCode::FAILURE;
504  }
505 
506  object.reset( reinterpret_cast<DataObject*>( n.clazz->New() ) );
507 
508  if ( !object ) {
509  error() << "Failed to create an object of type:" << n.clazz->GetName() << " for location:" << tag << endmsg;
510  return StatusCode::FAILURE;
511  }
512  }
513  //
514  StatusCode sc = m_dataSvc->registerObject( tag, object.release() );
515  if ( sc.isFailure() ) {
516  error() << "Failed to register an object of type:" << n.name << " at location:" << tag << endmsg;
517  return sc;
518  }
519  ++n.num;
520  //
521  return StatusCode::SUCCESS;
522 }
523 StatusCode DataOnDemandSvc::execHandler( const std::string& tag, Leaf& l ) {
525 
526  if ( l.executing ) { return StatusCode::FAILURE; }
527 
528  if ( !l.algorithm ) {
529  StatusCode sc = configureHandler( l );
530  if ( sc.isFailure() ) {
531  error() << "Failed to configure handler for: " << l.name << "[" << l.type << "] " << tag << endmsg;
532  return sc;
533  }
534  }
535 
536  Chrono atimer( m_total );
537 
538  Protection p( l.executing );
539  // FIXME: this will cause problems for Hive, as we need to set
540  // the EventContext of the called Algorithm.
541  // if (!l.algorithm->getContext()) {
542  // l.algorithm->setContext( &Gaudi::Hive::currentContext() );
543  // }
544  StatusCode sc = l.algorithm->sysExecute( Gaudi::Hive::currentContext() );
545  if ( sc.isFailure() ) {
546  error() << "Failed to execute the algorithm:" << l.algorithm->name() << " for location:" << tag << endmsg;
547  return sc;
548  }
549  ++l.num;
550 
551  return StatusCode::SUCCESS;
552 }
553 void DataOnDemandSvc::dump( const MSG::Level level, const bool mode ) const {
554  if ( m_algs.empty() && m_nodes.empty() ) { return; }
555 
556  typedef std::pair<std::string, std::string> Pair;
557  std::map<std::string, Pair> _m;
558  for ( auto& alg : m_algs ) {
559  auto check = _m.find( alg.first );
560  if ( _m.end() != check ) {
561  warning() << " The data item is activated for '" << check->first << "' as '" << check->second.first << "'"
562  << endmsg;
563  }
564  const Leaf& l = alg.second;
565  std::string nam = ( l.name == l.type ? l.type : ( l.type + "/" + l.name ) );
566 
567  if ( !mode && 0 == l.num ) { continue; }
568 
569  std::string val;
570  if ( mode ) {
571  val = ( !l.algorithm ) ? "F" : "T";
572  } else {
573  val = std::to_string( l.num );
574  }
575 
576  _m[no_prefix( alg.first, m_prefix )] = { nam, val };
577  }
578  // nodes:
579  for ( const auto& node : m_nodes ) {
580  auto check = _m.find( node.first );
581  if ( _m.end() != check ) {
582  warning() << " The data item is already activated for '" << check->first << "' as '" << check->second.first << "'"
583  << endmsg;
584  }
585  const Node& n = node.second;
586  std::string nam = "'" + n.name + "'";
587 
588  std::string val;
589 
590  if ( !mode && 0 == n.num ) { continue; }
591 
592  if ( mode ) {
593  val = ( 0 == n.clazz ) ? "F" : "T";
594  } else {
595  val = std::to_string( n.num );
596  }
597 
598  _m[no_prefix( node.first, m_prefix )] = { nam, val };
599  }
600 
601  if ( _m.empty() ) { return; }
602 
603  // set width of the columns
604  size_t n1 = 10; // minimum width
605  size_t n2 = 10; // minimum width
606  size_t n3 = 0;
607  for ( const auto& i : _m ) {
608  n1 = std::max( n1, i.first.size() );
609  n2 = std::max( n2, i.second.first.size() );
610  n3 = std::max( n3, i.second.second.size() );
611  }
612  n1 = std::min( n1, size_t{ 60 } ); // maximum width
613  n2 = std::min( n2, size_t{ 60 } ); // maximum width
614 
615  auto& msg = msgStream( level );
616 
617  if ( mode ) {
618  msg << "Data-On-Demand Actions enabled for:";
619  } else {
620  msg << "Data-On-Demand Actions has been used for:";
621  }
622 
623  const auto header = fmt::format( " | {3:<{0}.{0}s} | {4:<{1}.{1}s} | {5:>{2}.{2}s} |", n1, n2, n3, "Address",
624  "Creator", ( mode ? "S" : "#" ) );
625  const auto line = fmt::format( " {0:-^{1}}", "", header.size() - 1 );
626  msg << '\n' << line << '\n' << header << '\n' << line;
627 
628  // make the actual printout:
629  for ( const auto& item : _m ) {
630  msg << fmt::format( "\n | {3:<{0}.{0}s} | {4:<{1}.{1}s} | {5:>{2}.{2}s} |", n1, n2, n3, item.first,
631  item.second.first, item.second.second );
632  }
633 
634  msg << '\n' << line << endmsg;
635 }
636 
MSG::DEBUG
@ DEBUG
Definition: IMessageSvc.h:22
DataOnDemandSvc::m_locked_nodes
bool m_locked_nodes
Definition: DataOnDemandSvc.h:218
System::milliSec
@ milliSec
Definition: Timing.h:54
GaudiPython.Bindings.DataObject
DataObject
Definition: Bindings.py:82
toupper
void toupper(std::string &s)
Definition: ExceptionSvc.cpp:36
DataOnDemandSvc::i_setAlgHandler
StatusCode i_setAlgHandler(const std::string &name, const Gaudi::Utils::TypeNameString &alg)
Internal method to initialize an algorithm handler.
Definition: DataOnDemandSvc.cpp:98
DataOnDemandSvc::i_setNodeHandler
void i_setNodeHandler(const std::string &name, const std::string &type)
Internal method to initialize a node handler.
Definition: DataOnDemandSvc.cpp:92
IAlgManager.h
Service::initialize
StatusCode initialize() override
Definition: Service.cpp:118
Incident::source
const std::string & source() const
Access to the source of the incident.
Definition: Incident.h:49
details::size
constexpr auto size(const T &, Args &&...) noexcept
Definition: AnyDataWrapper.h:23
Gaudi::Utils::TypeNameString::name
const std::string & name() const
Definition: TypeNameString.h:48
DataOnDemandSvc::m_algMapping
Gaudi::Property< Setup > m_algMapping
Definition: DataOnDemandSvc.h:240
DataOnDemandSvc::m_algMapTools
Gaudi::Property< std::vector< std::string > > m_algMapTools
Definition: DataOnDemandSvc.h:253
DataOnDemandSvc::initialize
StatusCode initialize() override
Inherited Service overrides: Service initialization.
Definition: DataOnDemandSvc.cpp:161
Gaudi::Hive::currentContext
GAUDI_API const EventContext & currentContext()
Definition: ThreadLocalContext.cpp:30
AtlasMCRecoFullPrecedenceDump.path
path
Definition: AtlasMCRecoFullPrecedenceDump.py:49
GaudiUtils::Map::find
iterator find(const key_type &key)
Definition: Map.h:133
StatusCode::isSuccess
bool isSuccess() const
Definition: StatusCode.h:314
MSG::INFO
@ INFO
Definition: IMessageSvc.h:22
GaudiPartProp.decorators.std
std
Definition: decorators.py:32
DataOnDemandSvc::configureHandler
StatusCode configureHandler(Leaf &leaf)
Configure handler for leaf.
Definition: DataOnDemandSvc.cpp:346
DataOnDemandSvc::m_allowInitFailure
Gaudi::Property< bool > m_allowInitFailure
Definition: DataOnDemandSvc.h:236
SmartIF::reset
void reset(TYPE *ptr=nullptr)
Set the internal pointer to the passed one disposing of the old one.
Definition: SmartIF.h:88
GaudiException
Definition: GaudiException.h:29
DataOnDemandSvc::setupAlgHandlers
StatusCode setupAlgHandlers()
Initialize leaf handlers.
Definition: DataOnDemandSvc.cpp:320
Gaudi::Utils::Histos::Formats::header
GAUDI_API std::string header(const int ID=Default)
get the recommended header by enum
Definition: HistoTableFormat.cpp:186
DataOnDemandSvc::Protection
Definition: DataOnDemandSvc.h:96
GaudiMP.FdsRegistry.msg
msg
Definition: FdsRegistry.py:19
DataOnDemandSvc::setup
StatusCode setup()
Setup routine (called by (re-) initialize.
Definition: DataOnDemandSvc.cpp:250
DataIncident.h
conf.release
string release
Definition: conf.py:27
DataOnDemandSvc::m_dataSvc
SmartIF< IDataProviderSvc > m_dataSvc
Data provider reference.
Definition: DataOnDemandSvc.h:200
DataOnDemandSvc::m_algMappers
std::vector< IDODAlgMapper * > m_algMappers
Definition: DataOnDemandSvc.h:223
gaudirun.prefix
string prefix
Definition: gaudirun.py:361
DataOnDemandSvc::m_locked_algs
bool m_locked_algs
Definition: DataOnDemandSvc.h:219
Service::service
SmartIF< IFace > service(const std::string &name, bool createIf=true) const
Definition: Service.h:79
GaudiPartProp.Nodes.Node
Node
Definition: Nodes.py:247
ToStream.h
LockedChrono.h
DataOnDemandSvc::ClassH
TClass * ClassH
Definition: DataOnDemandSvc.h:90
CommonMessaging< implements< IService, IProperty, IStateful > >::msgLevel
MSG::Level msgLevel() const
get the cached level (originally extracted from the embedded MsgStream)
Definition: CommonMessaging.h:147
Service::finalize
StatusCode finalize() override
Definition: Service.cpp:223
IDataProviderSvc.h
GaudiUtils::Map::empty
bool empty() const
Definition: Map.h:177
Service::FSMState
Gaudi::StateMachine::State FSMState() const override
Definition: Service.h:55
IIncidentSvc.h
IDODAlgMapper
Interface of tools used by the DataOnDemandSvc to choose the algorithm to be run to produce the data ...
Definition: IDODAlgMapper.h:23
IToolSvc.h
ManySmallAlgs.alg
alg
Definition: ManySmallAlgs.py:81
DataOnDemandSvc::m_algMgr
SmartIF< IAlgManager > m_algMgr
Algorithm manager.
Definition: DataOnDemandSvc.h:198
bug_34121.t
t
Definition: bug_34121.py:31
DataOnDemandSvc::m_stat
unsigned long long m_stat
Definition: DataOnDemandSvc.h:213
Gaudi::StringKey
Definition: StringKey.h:35
GaudiUtils::Map::clear
void clear()
Definition: Map.h:171
Chrono
Definition: Chrono.h:27
Gaudi::Utils::TypeNameString
Helper class to parse a string of format "type/name".
Definition: TypeNameString.h:19
Gaudi::StateMachine::CONFIGURED
@ CONFIGURED
Definition: StateMachine.h:23
DataOnDemandSvc::m_partialPath
Gaudi::Property< bool > m_partialPath
Definition: DataOnDemandSvc.h:228
Service::name
const std::string & name() const override
Retrieve name of the service
Definition: Service.cpp:333
StatusCode
Definition: StatusCode.h:64
DataOnDemandSvc::m_trapType
Gaudi::Property< std::string > m_trapType
Definition: DataOnDemandSvc.h:225
ChronoEntity::outputUserTime
std::string outputUserTime() const
print the chrono ;
Definition: ChronoEntity.cpp:68
DataOnDemandSvc::m_toolSvc
SmartIF< IToolSvc > m_toolSvc
Data provider reference.
Definition: DataOnDemandSvc.h:202
DataIncident
DataOnDemandSvc::m_nodeMap
Gaudi::Property< Map > m_nodeMap
Definition: DataOnDemandSvc.h:247
axes_labels.check
def check(causes, result)
Definition: axes_labels.py:47
Gaudi::Property::value
const ValueType & value() const
Definition: Property.h:229
DataOnDemandSvc::execHandler
StatusCode execHandler(const std::string &tag, Leaf &leaf)
Execute leaf handler (algorithm)
Definition: DataOnDemandSvc.cpp:523
Gaudi::Utils::LockedChrono
Definition: LockedChrono.h:53
AttribStringParser.h
DataOnDemandSvc::Node
Definition: DataOnDemandSvc.h:106
SmartIF< IStateful >
genconfuser.verbose
verbose
Definition: genconfuser.py:28
DataOnDemandSvc::m_prefix
Gaudi::Property< std::string > m_prefix
Definition: DataOnDemandSvc.h:249
format
GAUDI_API std::string format(const char *,...)
MsgStream format utility "a la sprintf(...)".
Definition: MsgStream.cpp:99
endmsg
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:198
DataOnDemandSvc::m_dump
Gaudi::Property< bool > m_dump
Definition: DataOnDemandSvc.h:229
gaudirun.level
level
Definition: gaudirun.py:364
Gaudi::StateMachine::RUNNING
@ RUNNING
Definition: StateMachine.h:25
TypeNameString.h
DataOnDemandSvc::m_updateRequired
bool m_updateRequired
Definition: DataOnDemandSvc.h:208
DataOnDemandSvc::m_statNode
unsigned long long m_statNode
Definition: DataOnDemandSvc.h:212
Gaudi::Utils::TypeNameString::type
const std::string & type() const
Definition: TypeNameString.h:47
cpluginsvc.n
n
Definition: cpluginsvc.py:234
GaudiUtils::Map::end
iterator end()
Definition: Map.h:122
StatusCode::ignore
const StatusCode & ignore() const
Allow discarding a StatusCode without warning.
Definition: StatusCode.h:139
DataOnDemandSvc::m_nodeMapTools
Gaudi::Property< std::vector< std::string > > m_nodeMapTools
Definition: DataOnDemandSvc.h:251
DataOnDemandSvc::dump
void dump(const MSG::Level level, const bool mode=true) const
dump the content of DataOnDemand service
Definition: DataOnDemandSvc.cpp:553
StatusCode::isFailure
bool isFailure() const
Definition: StatusCode.h:129
DataOnDemandSvc::m_algMap
Gaudi::Property< Map > m_algMap
Definition: DataOnDemandSvc.h:246
DataOnDemandSvc::m_algs
AlgMap m_algs
Map of algorithms to handle incidents.
Definition: DataOnDemandSvc.h:204
MSG::Level
Level
Definition: IMessageSvc.h:22
gaudirun.type
type
Definition: gaudirun.py:160
ThreadLocalContext.h
DataOnDemandSvc::m_nodeMapping
Gaudi::Property< Setup > m_nodeMapping
Definition: DataOnDemandSvc.h:242
System::Sec
@ Sec
Definition: Timing.h:54
MSG::VERBOSE
@ VERBOSE
Definition: IMessageSvc.h:22
StatusCode::SUCCESS
constexpr static const auto SUCCESS
Definition: StatusCode.h:99
ConditionsStallTest.name
name
Definition: ConditionsStallTest.py:77
DataOnDemandSvc::m_dataSvcName
Gaudi::Property< std::string > m_dataSvcName
Definition: DataOnDemandSvc.h:226
DataObject.h
gaudirun.l
dictionary l
Definition: gaudirun.py:583
DataOnDemandSvc::setupNodeHandlers
StatusCode setupNodeHandlers()
Initialize node handlers.
Definition: DataOnDemandSvc.cpp:294
DECLARE_COMPONENT
#define DECLARE_COMPONENT(type)
Definition: PluginServiceV1.h:45
DataOnDemandSvc.h
Chrono.h
DataObject
Definition: DataObject.h:37
DataOnDemandSvc::m_nodes
NodeMap m_nodes
Map of "empty" objects to be placed as intermediate nodes.
Definition: DataOnDemandSvc.h:206
Service::reinitialize
StatusCode reinitialize() override
Definition: Service.cpp:296
DataOnDemandSvc::m_timer_algs
ChronoEntity m_timer_algs
Definition: DataOnDemandSvc.h:216
plotSpeedupsPyRoot.line
line
Definition: plotSpeedupsPyRoot.py:198
DataOnDemandSvc::finalize
StatusCode finalize() override
Inherited Service overrides: Service finalization.
Definition: DataOnDemandSvc.cpp:178
DataOnDemandSvc::update
StatusCode update()
update the handlers
Definition: DataOnDemandSvc.cpp:115
Incident::type
const std::string & type() const
Access to the incident type.
Definition: Incident.h:43
IAlgorithm.h
StatusCode::FAILURE
constexpr static const auto FAILURE
Definition: StatusCode.h:100
ISvcLocator.h
DataOnDemandSvc::m_timer_nodes
ChronoEntity m_timer_nodes
Definition: DataOnDemandSvc.h:215
AlgSequencer.top
top
Definition: AlgSequencer.py:37
DataOnDemandSvc::m_timer_all
ChronoEntity m_timer_all
Definition: DataOnDemandSvc.h:217
Incident
Definition: Incident.h:24
Gaudi::Utils::AttribStringParser
Parse attribute strings allowing iteration over the various attributes.
Definition: AttribStringParser.h:39
DataOnDemandSvc::reinitialize
StatusCode reinitialize() override
Inherited Service overrides: Service reinitialization.
Definition: DataOnDemandSvc.cpp:222
ProduceConsume.key
key
Definition: ProduceConsume.py:84
DataOnDemandSvc::Leaf
Definition: DataOnDemandSvc.h:121
DataOnDemandSvc::m_locked_all
bool m_locked_all
Definition: DataOnDemandSvc.h:220
CollWrite.algs
algs
Definition: CollWrite.py:33
SET
#define SET(x)
DataOnDemandSvc::m_init
Gaudi::Property< bool > m_init
Definition: DataOnDemandSvc.h:235
MsgStream.h
DataOnDemandSvc
Definition: DataOnDemandSvc.h:87
DataOnDemandSvc::m_total
ChronoEntity m_total
Definition: DataOnDemandSvc.h:210
Service::serviceLocator
SmartIF< ISvcLocator > & serviceLocator() const override
Retrieve pointer to service locator
Definition: Service.cpp:336
DataOnDemandSvc::m_incSvc
SmartIF< IIncidentSvc > m_incSvc
Incident service.
Definition: DataOnDemandSvc.h:196
DataOnDemandSvc::handle
void handle(const Incident &incident) override
IIncidentListener interfaces overrides: incident handling.
Definition: DataOnDemandSvc.cpp:425
IDODNodeMapper
Interface of tools used by the DataOnDemandSvc to choose the type of node to be created at a path.
Definition: IDODNodeMapper.h:23
DataOnDemandSvc::m_nodeMappers
std::vector< IDODNodeMapper * > m_nodeMappers
Definition: DataOnDemandSvc.h:222
DataOnDemandSvc::m_statAlg
unsigned long long m_statAlg
Definition: DataOnDemandSvc.h:211