The Gaudi Framework  master (42b00024)
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
Sequence.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 <Gaudi/Sequence.h>
13 
14 #include <numeric>
15 #include <string>
16 #include <vector>
17 
18 using Gaudi::Sequence;
19 
20 namespace {
21  template <StatusCode ( Gaudi::Algorithm::*f )(), typename C>
22  bool for_algorithms( C& c ) {
23  return std::accumulate( std::begin( c ), std::end( c ), true,
24  []( bool b, Gaudi::Algorithm* a ) { return ( a->*f )().isSuccess() && b; } );
25  }
26 } // namespace
27 
28 StatusCode Sequence::initialize() {
30 
31  // initialize sub-algorithms
32  if ( !for_algorithms<&Algorithm::sysInitialize>( m_subAlgms ) ) {
33  error() << "error initializing one or several sub-algorithms of Sequence " << name() << endmsg;
34  return StatusCode::FAILURE;
35  }
36 
37  return StatusCode::SUCCESS;
38 }
39 
41  // Bypass the finalialization if the algorithm hasn't been initilized.
42  // Note: this check is also in Gaudi::Algorithm::sysFinalize
44 
45  // finalize sub-algorithms
46  if ( !for_algorithms<&Algorithm::sysFinalize>( m_subAlgms ) ) {
47  error() << "error finalizing one or several sub-algorithms of Sequence " << name() << endmsg;
48  return StatusCode::FAILURE;
49  }
50 
51  m_subAlgms.clear();
52 
53  return Algorithm::finalize();
54 }
55 
57  if ( !Algorithm::start() ) return StatusCode::FAILURE;
58 
59  // start sub-algorithms
60  if ( !for_algorithms<&Algorithm::sysStart>( m_subAlgms ) ) {
61  error() << "error starting one or several sub-algorithms of Sequence " << name() << endmsg;
62  return StatusCode::FAILURE;
63  }
64 
65  return StatusCode::SUCCESS;
66 }
67 
69  // stop sub-algorithms
70  if ( !for_algorithms<&Algorithm::sysStop>( m_subAlgms ) ) {
71  error() << "error stopping one or several sub-algorithms of Sequence " << name() << endmsg;
72  return StatusCode::FAILURE;
73  }
74 
75  return Algorithm::stop();
76 }
77 
79  // re-initialize sub-algorithms
80  if ( !for_algorithms<&Algorithm::sysReinitialize>( m_subAlgms ) ) {
81  error() << "error re-initializing one or several sub-algorithms of Sequence " << name() << endmsg;
82  return StatusCode::FAILURE;
83  }
84 
85  return Algorithm::reinitialize();
86 }
87 
89  // re-start sub-algorithms
90  if ( !for_algorithms<&Algorithm::sysRestart>( m_subAlgms ) ) {
91  error() << "error re-restarting one or several sub-algorithms of Sequence " << name() << endmsg;
92  return StatusCode::FAILURE;
93  }
94 
95  return Algorithm::restart();
96 }
97 
100 
101  // loop through sub-algs
102  for ( auto alg : *subAlgorithms() ) vis->visit( alg );
103 }
104 
105 const std::vector<Gaudi::Algorithm*>* Sequence::subAlgorithms() const { return &m_subAlgms; }
106 
107 std::vector<Gaudi::Algorithm*>* Sequence::subAlgorithms() { return &m_subAlgms; }
108 
109 StatusCode Sequence::createSubAlgorithm( const std::string& type, const std::string& name, Algorithm*& pSubAlgorithm ) {
111  if ( !am ) return StatusCode::FAILURE;
112 
113  // Maybe modify the AppMgr interface to return Algorithm* ??
114  IAlgorithm* tmp;
115  StatusCode sc = am->createAlgorithm( type, name, tmp );
116  if ( sc.isFailure() ) return StatusCode::FAILURE;
117 
118  try {
119  pSubAlgorithm = dynamic_cast<Algorithm*>( tmp );
120  m_subAlgms.push_back( pSubAlgorithm );
121  } catch ( ... ) { sc = StatusCode::FAILURE; }
122  return sc;
123 }
IAlgManager.h
Gaudi::Algorithm::acceptDHVisitor
void acceptDHVisitor(IDataHandleVisitor *) const override
Definition: Algorithm.cpp:183
Gaudi::Algorithm::name
const std::string & name() const override
The identifying name of the algorithm object.
Definition: Algorithm.cpp:524
Gaudi::Sequence::createSubAlgorithm
StatusCode createSubAlgorithm(const std::string &type, const std::string &name, Algorithm *&pSubAlg)
Create a sub algorithm.
Definition: Sequence.cpp:109
Gaudi::Algorithm::type
const std::string & type() const override
The type of the algorithm object.
Definition: Algorithm.h:165
Gaudi::Algorithm::initialize
StatusCode initialize() override
the default (empty) implementation of IStateful::initialize() method
Definition: Algorithm.h:178
Gaudi::Algorithm::serviceLocator
SmartIF< ISvcLocator > & serviceLocator() const override
The standard service locator.
Definition: Algorithm.cpp:568
Gaudi::Sequence::finalize
StatusCode finalize() override
System finalization.
Definition: Sequence.cpp:40
gaudirun.c
c
Definition: gaudirun.py:525
Gaudi::Sequence::stop
StatusCode stop() override
System stop.
Definition: Sequence.cpp:68
Gaudi::Algorithm::start
StatusCode start() override
the default (empty) implementation of IStateful::start() method
Definition: Algorithm.h:180
Gaudi::Sequence::start
StatusCode start() override
System start.
Definition: Sequence.cpp:56
ManySmallAlgs.alg
alg
Definition: ManySmallAlgs.py:81
Gaudi::Sequence::m_subAlgms
std::vector< Algorithm * > m_subAlgms
Sub algorithms.
Definition: Sequence.h:84
Gaudi::Algorithm::isEnabled
bool isEnabled() const override
Is this algorithm enabled or disabled?
Definition: Algorithm.cpp:534
Gaudi::Utils::begin
AttribStringParser::Iterator begin(const AttribStringParser &parser)
Definition: AttribStringParser.h:136
Gaudi::StateMachine::CONFIGURED
@ CONFIGURED
Definition: StateMachine.h:24
StatusCode
Definition: StatusCode.h:65
IAlgorithm
Definition: IAlgorithm.h:38
Gaudi::Algorithm::FSMState
Gaudi::StateMachine::State FSMState() const override
returns the current state of the algorithm
Definition: Algorithm.h:190
Gaudi::Algorithm
Base class from which all concrete algorithm classes should be derived.
Definition: Algorithm.h:90
Gaudi::Sequence::acceptDHVisitor
void acceptDHVisitor(IDataHandleVisitor *) const override
Definition: Sequence.cpp:98
SmartIF< IAlgManager >
endmsg
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:202
IDataHandleVisitor
Definition: IDataHandleHolder.h:46
StatusCode::isFailure
bool isFailure() const
Definition: StatusCode.h:130
gaudirun.type
type
Definition: gaudirun.py:160
Gaudi::Algorithm::finalize
StatusCode finalize() override
the default (empty) implementation of IStateful::finalize() method
Definition: Algorithm.h:184
ConditionsStallTest.name
name
Definition: ConditionsStallTest.py:77
StatusCode::SUCCESS
constexpr static const auto SUCCESS
Definition: StatusCode.h:100
Gaudi::Algorithm::restart
StatusCode restart() override
the default (empty) implementation of IStateful::restart() method
Definition: Algorithm.cpp:509
Sequence.h
Gaudi::Sequence::subAlgorithms
const std::vector< Algorithm * > * subAlgorithms() const
List of sub-algorithms. Returns a pointer to a vector of (sub) Algorithms.
Definition: Sequence.cpp:105
Gaudi::Sequence::restart
StatusCode restart() override
Restart method invoked by the framework.
Definition: Sequence.cpp:88
IOTest.end
end
Definition: IOTest.py:125
Gaudi::Algorithm::reinitialize
StatusCode reinitialize() override
the default (empty) implementation of IStateful::reinitialize() method
Definition: Algorithm.cpp:489
StatusCode::FAILURE
constexpr static const auto FAILURE
Definition: StatusCode.h:101
Gaudi::Sequence
Definition: Sequence.h:18
Gaudi::Algorithm::stop
StatusCode stop() override
the default (empty) implementation of IStateful::stop() method
Definition: Algorithm.h:182
Gaudi::Accumulators::accumulate
void accumulate(Counter &counter, const Container &container, Fun f=Identity{})
A helper function for accumulating data from a container into a counter This is internally using buff...
Definition: Accumulators.h:1229
IDataHandleVisitor::visit
virtual void visit(const IDataHandleHolder *)=0
Gaudi::Sequence::reinitialize
StatusCode reinitialize() override
Reinitialization method invoked by the framework.
Definition: Sequence.cpp:78