Loading [MathJax]/extensions/tex2jax.js
The Gaudi Framework  v38r1p1 (ae26267b)
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
Sequencer.cpp
Go to the documentation of this file.
1 /***********************************************************************************\
2 * (c) Copyright 1998-2019 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 // Sequencer class
12 // Implements:
13 // 1) Common functionality of IInterface
14 // 2) Default behavior for the IAlgorithm
15 #include <Gaudi/Sequencer.h>
16 
17 #include <GaudiKernel/Chrono.h>
21 #include <GaudiKernel/Stat.h>
23 
24 #define ON_DEBUG if ( msgLevel( MSG::DEBUG ) )
25 #define ON_VERBOSE if ( msgLevel( MSG::VERBOSE ) )
26 
27 namespace Gaudi {
29  auto is_good = decodeMemberNames();
30  if ( !is_good ) {
31  error() << "Unable to configure one or more sequencer members " << endmsg;
32  return is_good;
33  }
34 
35  is_good = decodeBranchMemberNames();
36  if ( !is_good ) {
37  error() << "Unable to configure one or more branch members " << endmsg;
38  return is_good;
39  }
40 
41  // We have to "decode" members before calling base class initialize
42  is_good = Sequence::initialize();
43  if ( !is_good ) return is_good;
44 
45  // Loop over all branches
46  // (Sequence does not know about branches)
47  for ( auto& alg : branchAlgorithms() ) {
48  is_good = alg->sysInitialize();
49  if ( is_good.isFailure() ) {
50  error() << "Unable to initialize Algorithm " << alg->name() << endmsg;
51  return is_good;
52  }
53  }
54 
55  return is_good;
56  }
57 
59  // Bypass the loop if this sequencer is disabled
60  if ( isEnabled() ) {
61  // Loop over all branch members calling their reinitialize functions
62  // if they are not disabled.
63  for ( auto& alg : branchAlgorithms() ) {
64  if ( alg->isEnabled() ) { alg->reinitialize().ignore(); }
65  }
66  return Sequence::reinitialize();
67  }
68  return StatusCode::SUCCESS;
69  }
70 
73  ON_DEBUG debug() << name() << " Sequencer::execute()" << endmsg;
74 
75  auto& state = execState( ctx );
76 
77  // Bypass the loop if this sequencer is disabled or has already been executed
78  if ( isEnabled() && !( execState( ctx ).state() == AlgExecState::State::Done ) ) {
79  Gaudi::Algorithm* lastAlgorithm;
80  result = execute( ctx, *subAlgorithms(), m_isInverted, lastAlgorithm );
81  if ( result.isSuccess() ) {
82  const bool passed = state.filterPassed();
83  if ( !passed && m_shortCircuit ) {
84 
85  // Filter failed and stop override not set. Execute the
86  // branch if there is one associated with the filter
87  // algorithm that failed. Note that the first member on
88  // the branch is the failing algorithm and so should
89  // be skipped.
90  const auto& theAlgs = branchAlgorithms();
91  if ( !theAlgs.empty() ) {
92  Gaudi::Algorithm* branchAlgorithm = theAlgs[0];
93  if ( lastAlgorithm == branchAlgorithm ) {
94 
95  // Branch specified - Loop over branch members
96  result = execute( ctx, branchAlgorithms(), m_isBranchInverted, lastAlgorithm, 1 );
97  if ( result.isSuccess() ) {
98 
99  // The final filter passed state will be set true if either
100  // of the main or branches passed, otherwise false.
101 
102  // Save the branch filter passed state.
103  setBranchFilterPassed( ctx, state.filterPassed() );
104  }
105  }
106  }
107  }
108  }
109 
110  // Prevent multiple executions of this sequencer for the current event
111  state.setState( AlgExecState::State::Done );
112  }
113  return result;
114  }
115 
117  // Loop over all branch members calling their finalize functions
118  // if they are not disabled. Note that the Sequence::finalize
119  // function already does this for the main members.
120  for ( auto& alg : branchAlgorithms() ) {
121  if ( alg->sysFinalize().isFailure() ) { error() << "Unable to finalize Algorithm " << alg->name() << endmsg; }
122  }
123  return Sequence::finalize();
124  }
125 
127  auto is_good = Sequence::start();
128  if ( !is_good ) return is_good;
129 
130  // Loop over all branches
131  for ( auto& alg : branchAlgorithms() ) {
132  is_good = alg->sysStart();
133  if ( !is_good ) {
134  error() << "Unable to start Algorithm " << alg->name() << endmsg;
135  return is_good;
136  }
137  }
138 
139  return is_good;
140  }
141 
143  // Loop over all branch members calling their finalize functions
144  // if they are not disabled.
145  for ( auto& alg : branchAlgorithms() ) {
146  if ( alg->sysStop().isFailure() ) { error() << "Unable to stop Algorithm " << alg->name() << endmsg; }
147  }
148  return Sequence::stop();
149  }
150 
152  auto lock = std::scoped_lock{ m_branchFilterMutex };
153  return m_branchFilterPassed[ctx.slot()];
154  }
155 
157  auto lock = std::scoped_lock{ m_branchFilterMutex };
158  m_branchFilterPassed[ctx.slot()] = state;
159  }
160 
161  StatusCode Sequencer::append( Gaudi::Algorithm* pAlgorithm ) { return append( pAlgorithm, *subAlgorithms() ); }
162 
164  return append( pAlgorithm, branchAlgorithms() );
165  }
166 
168  Gaudi::Algorithm*& pAlgorithm ) {
169  return createAndAppend( type, name, pAlgorithm, *subAlgorithms() );
170  }
171 
173  Gaudi::Algorithm*& pAlgorithm ) {
174  return createAndAppend( type, name, pAlgorithm, branchAlgorithms() );
175  }
176 
177  StatusCode Sequencer::remove( Gaudi::Algorithm* pAlgorithm ) { return remove( pAlgorithm->name() ); }
178 
179  StatusCode Sequencer::remove( const std::string& algname ) { return remove( algname, *subAlgorithms() ); }
180 
182  return removeFromBranch( pAlgorithm->name() );
183  }
184 
185  StatusCode Sequencer::removeFromBranch( const std::string& algname ) { return remove( algname, branchAlgorithms() ); }
186 
188 
190 
192  // Decode the membership list
194  }
195 
197  // Decode the branch membership list
199  }
200 
206  // Check that the specified algorithm doesn't already exist in the membership list
207  if ( std::find( std::begin( theAlgs ), std::end( theAlgs ), pAlgorithm ) != std::end( theAlgs ) ) {
208  return StatusCode::FAILURE;
209  }
210  theAlgs.push_back( pAlgorithm );
211  pAlgorithm->addRef();
212  return StatusCode::SUCCESS;
213  }
214 
216  Gaudi::Algorithm*& pAlgorithm, std::vector<Gaudi::Algorithm*>& theAlgs ) {
217  auto theAlgMgr = serviceLocator()->service<IAlgManager>( "ApplicationMgr" );
218  if ( !theAlgMgr ) return StatusCode::FAILURE;
219 
220  IAlgorithm* tmp;
221  StatusCode result = theAlgMgr->createAlgorithm( type, algName, tmp );
222  if ( result.isSuccess() ) {
223  try {
224  pAlgorithm = dynamic_cast<Gaudi::Algorithm*>( tmp );
225  theAlgs.push_back( pAlgorithm );
226  } catch ( ... ) {
227  error() << "Unable to create Algorithm " << algName << endmsg;
228  result = StatusCode::FAILURE;
229  }
230  }
231 
232  return result;
233  }
234 
236  std::vector<Gaudi::Algorithm*>& theAlgs, std::vector<bool>& theLogic ) {
237  StatusCode result;
238  auto theAlgMgr = serviceLocator()->service<IAlgManager>( "ApplicationMgr" );
239  if ( theAlgMgr ) {
240  // Clear the existing list of algorithms
241  theAlgs.clear();
242 
243  // Build the list of member algorithms from the contents of the
244  // theNames list.
245  for ( const auto& n : theNames.value() ) {
246 
247  // Parse the name for a syntax of the form:
248  //
249  // <type>/<name>
250  //
251  // Where <name> is the algorithm instance name, and <type> is the
252  // algorithm class type (being a subclass of Algorithm).
254  std::string theName = typeName.name();
255  std::string theType = typeName.type();
256 
257  // Parse the name for a syntax of the form:
258  //
259  // <name>:invert
260  //
261  // Where <name> is the algorithm instance name and ":invert"
262  // indicates that the filter passed logic is inverted.
263  bool isInverted = false;
264  std::string::size_type invert = theName.find_first_of( ":" );
265  // Skip all occurrences of "::" (allow namespaces)
266  while ( std::string::npos != invert && invert < ( theName.size() - 1 ) && theName[invert + 1] == ':' )
267  invert = theName.find_first_of( ":", invert + 2 );
268  if ( std::string::npos != invert ) {
269  if ( theName == theType ) {
270  // This means that we got something like "Type:invert",
271  // so we have to strip the ":invert" from the type too.
272  theType = theType.substr( 0, invert );
273  }
274  theName = theName.substr( 0, invert );
275  isInverted = true;
276  }
277  // Check whether the supplied name corresponds to an existing
278  // Algorithm object.
279  SmartIF<IAlgorithm>& theIAlg = theAlgMgr->algorithm( theName, false );
280  Gaudi::Algorithm* theAlgorithm = nullptr;
282  if ( theIAlg ) {
283  try {
284  theAlgorithm = dynamic_cast<Gaudi::Algorithm*>( theIAlg.get() );
285  } catch ( ... ) {
286  warning() << theName << " is not an Algorithm - Failed dynamic cast" << endmsg;
287  theAlgorithm = nullptr; // release
288  }
289  }
290  if ( theAlgorithm ) {
291 
292  // The specified Algorithm already exists - just append it to the membership list.
293  status = append( theAlgorithm, theAlgs );
294  if ( status.isSuccess() ) {
295  ON_DEBUG debug() << theName << " already exists - appended to member list" << endmsg;
296  } else {
297  warning() << theName << " already exists - append failed!!!" << endmsg;
298  result = StatusCode::FAILURE;
299  }
300  } else {
301 
302  // The specified name doesn't exist - create a new object of the specified type
303  // and append it to the membership list.
304  status = createAndAppend( theType, theName, theAlgorithm, theAlgs );
305  if ( status.isSuccess() ) {
306  ON_DEBUG debug() << theName << " doesn't exist - created and appended to member list" << endmsg;
307  } else {
308  warning() << theName << " doesn't exist - creation failed!!!" << endmsg;
309  result = StatusCode::FAILURE;
310  }
311  }
312  if ( status.isSuccess() ) theLogic.push_back( isInverted );
313  }
314  }
315  // Print membership list
316  if ( result.isSuccess() && theAlgs.size() != 0 ) {
317  info() << "Member list: ";
318  auto ai = theAlgs.begin();
319  auto li = theLogic.begin();
320  for ( ; ai != theAlgs.end(); ++ai, ++li ) {
321 
322  if ( ai != theAlgs.begin() ) info() << ", ";
323  auto alg = *ai;
324  if ( alg->name() == System::typeinfoName( typeid( *alg ) ) )
325  info() << alg->name();
326  else
327  info() << System::typeinfoName( typeid( *alg ) ) << "/" << alg->name();
328 
329  if ( *li ) info() << ":invert";
330  }
331  info() << endmsg;
332  }
333  return result;
334  }
335 
337  const std::vector<bool>& theLogic, Gaudi::Algorithm*& lastAlgorithm,
338  std::size_t first ) const {
340 
341  auto& state = execState( ctx );
342  state.setFilterPassed( !m_modeOR ); // for OR, result will be false, unless (at least) one is true
343  // for AND, result will be true, unless (at least) one is false
344  // also see comment below ....)
345 
346  // Reset the branch filter passed flag
347  setBranchFilterPassed( ctx, false );
348 
349  auto exists = [&]( const std::string_view loc ) -> bool {
350  DataObject* tmp{ nullptr };
351  return evtSvc()->retrieveObject( loc, tmp ).isSuccess();
352  };
353 
354  // Do not execute if one or more of the m_vetoObjs exist in TES
355  if ( const auto it = find_if( begin( m_vetoObjs ), end( m_vetoObjs ), exists ); it != end( m_vetoObjs ) ) {
356  if ( msgLevel( MSG::DEBUG ) ) debug() << *it << " found, skipping event " << endmsg;
357  return result;
358  }
359 
360  // Execute if m_requireObjs is empty
361  // or if one or more of the m_requireObjs exist in TES
362  if ( !( m_requireObjs.empty() || any_of( begin( m_requireObjs ), end( m_requireObjs ), exists ) ) ) {
363  return result;
364  }
365 
366  // Loop over all algorithms calling their execute functions if they
367  // are (a) not disabled, and (b) aren't already executed. Note that
368  // in the latter case the filter state is still examined. Terminate
369  // the loop if an algorithm indicates that it's filter didn't pass.
370  auto size = theAlgs.size();
371  for ( auto i = first; i < size; i++ ) {
372  lastAlgorithm = theAlgs[i];
373  result = executeMember( lastAlgorithm, ctx );
374  if ( result.isSuccess() ) {
375  if ( !m_ignoreFilter ) {
376  // Take the filter passed status of this algorithm as my own status.
377  // Note that we take into account inverted logic.
378  bool passed = lastAlgorithm->execState( ctx ).filterPassed();
379  bool isInverted = theLogic[i];
380  if ( isInverted ) passed = !passed;
381 
382  // in OR mode, we don't care about things
383  // which are false, as they leave our current state alone (provided
384  // we stared as 'false'!), and in AND mode, we keep our current
385  // state until someone returns 'false' (provided we started as 'true')
386  if ( m_modeOR ? passed : !passed ) {
387  state.setFilterPassed( m_modeOR );
388  if ( m_shortCircuit ) { break; }
389  }
390  }
391  } else {
392  break;
393  }
394  }
395  if ( m_invert ) state.setFilterPassed( !state.filterPassed() );
396  return result;
397  }
398 
399  StatusCode Sequencer::executeMember( Gaudi::Algorithm* theAlgorithm, const EventContext& context ) const {
401  if ( theAlgorithm->isEnabled() ) {
402  if ( theAlgorithm->execState( context ).state() != AlgExecState::State::Done ) {
403  result = theAlgorithm->sysExecute( context );
404  }
405  }
406  return result;
407  }
408 
411 
412  // Test that the algorithm exists in the member list
413  for ( auto& alg : theAlgs ) {
414  if ( alg->name() == algname ) {
415 
416  // Algorithm with specified name exists in the algorithm list - remove it
417  // THIS ISN'T IMPLEMENTED YET!!!!
418  info() << "Sequencer::remove( ) isn't implemented yet!!!!!" << endmsg;
419  result = StatusCode::SUCCESS;
420  break;
421  }
422  }
423  return result;
424  }
425 
427  if ( m_invert ) os << '~';
428 
429  auto& theAlgs = *subAlgorithms();
430  if ( theAlgs.empty() ) return os << ( ( !m_modeOR ) ? "CFTrue" : "CFFalse" );
431 
432  // if we have only one element, we do not need a name
433  if ( theAlgs.size() > 1 ) os << "seq(";
434 
435  const auto algs_count = theAlgs.size();
436  const auto op = m_shortCircuit ? ( m_modeOR ? " | " : " & " ) : " >> ";
437  size_t i = 0;
438  while ( i < algs_count ) {
439  if ( i ) os << op;
440  if ( m_isInverted[i] ) os << '~';
441  theAlgs[i]->toControlFlowExpression( os );
442  ++i;
443  }
444  if ( theAlgs.size() > 1 ) os << ')';
445  return os;
446  }
447 } // namespace Gaudi
MSG::DEBUG
@ DEBUG
Definition: IMessageSvc.h:25
Gaudi::Sequencer::toControlFlowExpression
std::ostream & toControlFlowExpression(std::ostream &os) const override
Produce string representation of the control flow expression.
Definition: Sequencer.cpp:426
Gaudi::Algorithm::sysExecute
StatusCode sysExecute(const EventContext &ctx) override
The actions to be performed by the algorithm on an event.
Definition: Algorithm.cpp:327
IAlgManager.h
Gaudi::Sequencer::setBranchFilterPassed
void setBranchFilterPassed(const EventContext &ctx, bool state) const
Set the branch filter passed flag for the last event.
Definition: Sequencer.cpp:156
std::string
STL class.
details::size
constexpr auto size(const T &, Args &&...) noexcept
Definition: AnyDataWrapper.h:22
Gaudi::Sequence::initialize
StatusCode initialize() override
Initialization method invoked by the framework.
Definition: Sequence.cpp:24
AlgExecState::state
State state() const
Definition: IAlgExecStateSvc.h:42
Gaudi::Algorithm::name
const std::string & name() const override
The identifying name of the algorithm object.
Definition: Algorithm.cpp:528
StatusCode::isSuccess
bool isSuccess() const
Definition: StatusCode.h:314
Gaudi::Sequencer::reinitialize
StatusCode reinitialize() override
Sequencer Reinitialization.
Definition: Sequencer.cpp:58
Gaudi::Sequencer::stop
StatusCode stop() override
Sequencer stop.
Definition: Sequencer.cpp:142
GaudiException.h
Gaudi::Algorithm::type
const std::string & type() const override
The type of the algorithm object.
Definition: Algorithm.h:165
std::vector< Gaudi::Algorithm * >
std::find
T find(T... args)
std::string::size
T size(T... args)
Gaudi::Sequencer::executeMember
StatusCode executeMember(Gaudi::Algorithm *theAlgorithm, const EventContext &context) const
Execute member algorithm.
Definition: Sequencer.cpp:399
Gaudi::Algorithm::serviceLocator
SmartIF< ISvcLocator > & serviceLocator() const override
The standard service locator.
Definition: Algorithm.cpp:572
Gaudi::Sequencer::appendToBranch
StatusCode appendToBranch(Gaudi::Algorithm *pAlgorithm)
Append an algorithm to the sequencer branch.
Definition: Sequencer.cpp:163
Gaudi::Sequencer::m_names
Gaudi::Property< std::vector< std::string > > m_names
Definition: Sequencer.h:173
Gaudi::Sequence::finalize
StatusCode finalize() override
System finalization.
Definition: Sequence.cpp:36
Gaudi::Sequencer::branchAlgorithms
const std::vector< Gaudi::Algorithm * > & branchAlgorithms() const
List of branch algorithms.
Definition: Sequencer.cpp:187
Gaudi::Sequencer::append
StatusCode append(Gaudi::Algorithm *pAlgorithm)
Append an algorithm to the sequencer.
Definition: Sequencer.cpp:161
Gaudi::Sequencer::m_modeOR
Gaudi::Property< bool > m_modeOR
Definition: Sequencer.h:194
System::typeinfoName
GAUDI_API const std::string typeinfoName(const std::type_info &)
Get platform independent information about the class type.
Definition: System.cpp:313
Gaudi::Sequence::stop
StatusCode stop() override
System stop.
Definition: Sequence.cpp:66
Gaudi::Sequencer::m_requireObjs
Gaudi::Property< std::vector< std::string > > m_requireObjs
Definition: Sequencer.h:200
CommonMessaging< implements< IAlgorithm, IDataHandleHolder, IProperty, IStateful > >::msgLevel
MSG::Level msgLevel() const
get the cached level (originally extracted from the embedded MsgStream)
Definition: CommonMessaging.h:148
Sequencer.h
Gaudi::Sequence::start
StatusCode start() override
System start.
Definition: Sequence.cpp:54
std::vector::clear
T clear(T... args)
Gaudi::Sequencer::removeFromBranch
StatusCode removeFromBranch(Gaudi::Algorithm *pAlgorithm)
Definition: Sequencer.cpp:181
Gaudi::Sequencer::decodeNames
StatusCode decodeNames(Gaudi::Property< std::vector< std::string >> &theNames, std::vector< Gaudi::Algorithm * > &theAlgs, std::vector< bool > &theLogic)
Decode algorithm names, creating or appending algorithms as appropriate.
Definition: Sequencer.cpp:235
Gaudi::Sequencer::m_shortCircuit
Gaudi::Property< bool > m_shortCircuit
Definition: Sequencer.h:192
std::vector::push_back
T push_back(T... args)
ManySmallAlgs.alg
alg
Definition: ManySmallAlgs.py:80
IAlgManager
Definition: IAlgManager.h:37
Gaudi::Algorithm::isEnabled
bool isEnabled() const override
Is this algorithm enabled or disabled?
Definition: Algorithm.cpp:538
Gaudi::Utils::TypeNameString
Helper class to parse a string of format "type/name".
Definition: TypeNameString.h:20
GaudiPython.Pythonizations.ctx
ctx
Definition: Pythonizations.py:578
StatusCode
Definition: StatusCode.h:65
Gaudi::Sequencer::m_isInverted
std::vector< bool > m_isInverted
Definition: Sequencer.h:203
Gaudi::Sequencer::initialize
StatusCode initialize() override
Initialization of a sequencer.
Definition: Sequencer.cpp:28
IAlgorithm
Definition: IAlgorithm.h:38
Gaudi::Sequencer::finalize
StatusCode finalize() override
Sequencer finalization.
Definition: Sequencer.cpp:116
Gaudi::Sequencer::m_branchFilterPassed
std::map< EventContext::ContextID_t, bool > m_branchFilterPassed
Definition: Sequencer.h:208
std::ostream
STL class.
CLHEP::begin
double * begin(CLHEP::HepVector &v)
Definition: TupleAlg.cpp:45
Gaudi::Algorithm::execState
AlgExecState & execState(const EventContext &ctx) const override
reference to AlgExecState of Alg
Definition: Algorithm.cpp:540
Gaudi::Algorithm
Base class from which all concrete algorithm classes should be derived.
Definition: Algorithm.h:90
Gaudi::Sequencer::m_isBranchInverted
std::vector< bool > m_isBranchInverted
Definition: Sequencer.h:205
Gaudi::Sequencer::decodeMemberNames
StatusCode decodeMemberNames()
Decode Member Name list.
Definition: Sequencer.cpp:191
SmartIF< IAlgorithm >
Gaudi::Sequencer::branchFilterPassed
bool branchFilterPassed(const EventContext &ctx) const
Was the branch filter passed for the last event?
Definition: Sequencer.cpp:151
endmsg
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:203
Gaudi::Sequencer::execute
StatusCode execute(const EventContext &ctx) const override
The actions to be performed by the sequencer on an event.
Definition: Sequencer.cpp:71
Gaudi::Sequencer::m_branchNames
Gaudi::Property< std::vector< std::string > > m_branchNames
Definition: Sequencer.h:182
Gaudi
Header file for std:chrono::duration-based Counters.
Definition: __init__.py:1
GaudiPluginService.cpluginsvc.n
n
Definition: cpluginsvc.py:234
Stat.h
std::string::substr
T substr(T... args)
ON_DEBUG
#define ON_DEBUG
Definition: Sequencer.cpp:24
gaudirun.type
type
Definition: gaudirun.py:160
ThreadLocalContext.h
Gaudi::Sequencer::start
StatusCode start() override
Sequencer finalization.
Definition: Sequencer.cpp:126
ConditionsStallTest.name
name
Definition: ConditionsStallTest.py:76
StatusCode::SUCCESS
constexpr static const auto SUCCESS
Definition: StatusCode.h:100
Gaudi::Algorithm::evtSvc
SmartIF< IDataProviderSvc > & evtSvc() const
shortcut for method eventSvc
Definition: Algorithm.h:248
SmartIF::get
TYPE * get() const
Get interface pointer.
Definition: SmartIF.h:86
GaudiDict::typeName
std::string typeName(const std::type_info &typ)
Definition: Dictionary.cpp:31
std::begin
T begin(T... args)
Gaudi::Sequencer::m_vetoObjs
Gaudi::Property< std::vector< std::string > > m_vetoObjs
Definition: Sequencer.h:198
Chrono.h
EventContext
Definition: EventContext.h:34
DataObject
Definition: DataObject.h:40
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:103
AlgExecState::filterPassed
bool filterPassed() const
Definition: IAlgExecStateSvc.h:41
std::string::find_first_of
T find_first_of(T... args)
Gaudi::Sequencer::decodeBranchMemberNames
StatusCode decodeBranchMemberNames()
Decode branch member name list.
Definition: Sequencer.cpp:196
Gaudi::Sequencer::createAndAppendToBranch
StatusCode createAndAppendToBranch(const std::string &type, const std::string &name, Gaudi::Algorithm *&pAlgorithm)
Create a algorithm and append it to the sequencer branch.
Definition: Sequencer.cpp:172
Gaudi::Sequencer::createAndAppend
StatusCode createAndAppend(const std::string &type, const std::string &name, Gaudi::Algorithm *&pAlgorithm)
Create a algorithm and append it to the sequencer.
Definition: Sequencer.cpp:167
std::size_t
Gaudi::Sequencer::m_invert
Gaudi::Property< bool > m_invert
Definition: Sequencer.h:196
std::end
T end(T... args)
IOTest.end
end
Definition: IOTest.py:123
Gaudi::Sequencer::remove
StatusCode remove(Gaudi::Algorithm *pAlgorithm)
Remove the specified algorithm from the sequencer.
Definition: Sequencer.cpp:177
StatusCode::FAILURE
constexpr static const auto FAILURE
Definition: StatusCode.h:101
ISvcLocator.h
compareRootHistos.state
state
Definition: compareRootHistos.py:496
Gaudi::Sequencer::m_branchAlgs
std::vector< Gaudi::Algorithm * > m_branchAlgs
Definition: Sequencer.h:204
Gaudi::Sequencer::m_ignoreFilter
Gaudi::Property< bool > m_ignoreFilter
Definition: Sequencer.h:195
Gaudi::Property
Implementation of property with value of concrete type.
Definition: Property.h:39
Gaudi::Sequencer::m_branchFilterMutex
std::mutex m_branchFilterMutex
Definition: Sequencer.h:207
Gaudi::Sequence::reinitialize
StatusCode reinitialize() override
Reinitialization method invoked by the framework.
Definition: Sequence.cpp:76