All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
AlgExecStateSvc.cpp
Go to the documentation of this file.
1 #include "AlgExecStateSvc.h"
7 
9 
11 
12 //=============================================================================
13 
14 
15 AlgExecStateSvc::AlgExecStateSvc( const std::string& name, ISvcLocator* svcLoc ):
16 base_class(name,svcLoc), m_isInit(false)
17 {
18 
19 }
20 
21 //-----------------------------------------------------------------------------
22 
24 
25 }
26 
27 //-----------------------------------------------------------------------------
28 
29 void
31 
32  std::string wbn;
33 
34  // seriously? do we have no way of getting a Service by type???
36  for (auto &is : lst) {
37  IHiveWhiteBoard *iwb = dynamic_cast<IHiveWhiteBoard*>(is);
38  if (iwb != 0) {
39  wbn = is->name();
41  verbose() << "HiveWhiteBoard service name is " << wbn << endmsg;
42  break;
43  }
44  }
45 
47  wbs = serviceLocator()->service(wbn,false);
48 
49  if (wbs.isValid()) {
52  } else {
55  }
56 
57  if (msgLevel(MSG::DEBUG))
58  debug() << "resizing state containers to : " << m_algStates.size()
59  << endmsg;
60 
62  if (!algMan.isValid()) {
63  fatal() << "could not get the AlgManager" << endmsg;
64  throw GaudiException("In AlgExecStateSvc, unable to get the AlgManager!",
65  "AlgExecStateSvc",StatusCode::FAILURE);
66  }
67 
68  m_isInit = true;
69 
70  auto algos = algMan->getAlgorithms();
71  for (auto &alg : algos) {
72  addAlg( alg );
73  }
74 
75  for (auto &alg : m_preInitAlgs) {
76  addAlg( alg );
77  }
78 
79 
80  if (msgLevel( MSG::VERBOSE )) {
83  verbose() << "dumping state:\n" << ost.str() << endmsg;
84  }
85 
86 }
87 
88 //-----------------------------------------------------------------------------
89 
90 void
92 
93  if (!m_isInit) {
94  fatal() << "AlgExecStateSvc not initialized before first use" << endmsg;
95  throw GaudiException("AlgExecStateSvc not initialized before first use!",
96  "AlgExecStateSvc",StatusCode::FAILURE);
97  }
98 }
99 
100 //-----------------------------------------------------------------------------
101 
104 
105  // Initialise mother class (read properties, ...)
107  if (!sc.isSuccess()) {
108  warning () << "Base class could not be initialized" << endmsg;
109  return StatusCode::FAILURE;
110  }
111 
112  // moved all initialization to init(). hopefully it will get called in time....
113 
114  return StatusCode::SUCCESS;
115 
116 }
117 
118 //-----------------------------------------------------------------------------
119 
122 
123  return StatusCode::SUCCESS;
124 
125 }
126 
127 //-----------------------------------------------------------------------------
128 
129 void
131 
132  ost << "Event: " << trans(m_eventStatus.at(ctx.slot())) << std::endl;
133  ost << "Algs: " << m_algStates.at(ctx.slot()).size() << std::endl;
134 
135  size_t ml(0);
136  for (auto &e : m_algStates.at(ctx.slot())) {
137  if ( e.first.str().length() > ml ) {
138  ml = e.first.str().length();
139  }
140  }
141 
142  ost << " - Slot " << ctx.slot() << std::endl;
143  const AlgStateMap_t& m = m_algStates.at(ctx.slot());
144  for (auto &e : m) {
145  ost << " + " << std::setw(ml) << e.first.str() << " " << e.second
146  << std::endl;
147  }
148 
149 }
150 
151 //-----------------------------------------------------------------------------
152 
153 void
155  return addAlg(iAlg->nameKey());
156 }
157 
158 //-----------------------------------------------------------------------------
159 
160 void
162 
163 
164  if (!m_isInit) {
165  if (msgLevel(MSG::DEBUG))
166  debug() << "preInit: will add Alg " << alg.str() << " later" << endmsg;
167  m_preInitAlgs.push_back( alg );
168  return;
169  }
170 
171  if (m_algStates.size() > 0) {
172  if (m_algStates.at(0).find(alg) != m_algStates.at(0).end()) {
173  // already added
174  return;
175  }
176  }
177 
178  {
179  // in theory, this should only get called during initialization (serial)
180  // so shouldn't have to protect with a mutex...
182 
183  AlgExecState s;
184  for (size_t i = 0; i<m_algStates.size(); ++i) {
185  m_algStates.at(i)[alg] = s;
186  }
187 
188  m_errorCount[alg] = 0;
189 
190  }
191 
192  if (msgLevel(MSG::DEBUG))
193  debug() << "adding alg " << alg.str() << " to "
194  << m_algStates.size() << " slots" << endmsg;
195 
196 }
197 
198 //-----------------------------------------------------------------------------
199 
200 const AlgExecState&
202  const EventContext& ctx) const {
203 
204  checkInit();
205 
206  AlgStateMap_t::const_iterator itr = m_algStates.at(ctx.slot()).find( algName );
207 
208  if (UNLIKELY( itr == m_algStates.at(ctx.slot()).end() ) ) {
209  throw GaudiException{std::string{"cannot find Alg "}
210  + algName.str() + " in AlgStateMap", name(), StatusCode::FAILURE};
211  }
212 
213  return itr->second;
214 
215 }
216 
217 //-----------------------------------------------------------------------------
218 
219 const AlgExecState&
221  const EventContext& ctx) const {
222 
223  return algExecState(iAlg->nameKey(), ctx);
224 
225 }
226 
227 //-----------------------------------------------------------------------------
228 
229 AlgExecState&
231  const EventContext& ctx) {
232 
234 
235  AlgStateMap_t::iterator itr = m_algStates.at(ctx.slot()).find( iAlg->nameKey() );
236 
237  if (UNLIKELY( itr == m_algStates.at(ctx.slot()).end() ) ) {
238  throw GaudiException{std::string{"cannot find Alg "}
239  + iAlg->name() + " in AlgStateMap", name(), StatusCode::FAILURE};
240  }
241 
242  return itr->second;
243 
244 }
245 
246 //-----------------------------------------------------------------------------
247 
250 
251  checkInit();
252 
253  return m_algStates.at(ctx.slot());
254 }
255 
256 //-----------------------------------------------------------------------------
257 
258 const EventStatus::Status&
260  checkInit();
261  return m_eventStatus.at(ctx.slot());
262 }
263 
264 //-----------------------------------------------------------------------------
265 
266 void
269  m_eventStatus.at(ctx.slot()) = sc;
270 }
271 
272 //-----------------------------------------------------------------------------
273 
274 void
275 AlgExecStateSvc::updateEventStatus(const bool& fail, const EventContext& ctx) {
277  if (m_eventStatus.at(ctx.slot()) == EventStatus::Success) {
278  if (fail)
280  } else if (m_eventStatus.at(ctx.slot()) == EventStatus::Invalid) {
281  if (! fail) {
283  } else {
285  }
286  }
287 }
288 
289 
290 //-----------------------------------------------------------------------------
291 
292 void
294 
295  if (msgLevel(MSG::DEBUG))
296  verbose() << "reset(" << ctx.slot() << ")" << endmsg;
297 
299  for (auto &e : m_algStates.at(ctx.slot())) {
300  e.second.reset();
301  }
302 
304 
305 }
306 
307 //-----------------------------------------------------------------------------
308 
309 unsigned int
311  AlgErrorMap_t::const_iterator itr = m_errorCount.find( iAlg->nameKey() );
312 
313  if (itr != m_errorCount.end()) {
314  return itr->second;
315  } else {
316  error() << "Unable to find Algorithm \"" << iAlg->name() << "\" in map"
317  << " of ErrorCounts" << endmsg;
318  return 0;
319  }
320 }
321 
322 //-----------------------------------------------------------------------------
323 
324 void
326  AlgErrorMap_t::iterator itr = m_errorCount.find( iAlg->nameKey() );
327  if (itr != m_errorCount.end()) {
328  itr->second = 0;
329  } else {
330  error() << "Unable to find Algorithm \"" << iAlg->name() << "\" in map"
331  << " of ErrorCounts" << endmsg;
332  }
333 }
334 
335 //-----------------------------------------------------------------------------
336 
337 unsigned int
339  AlgErrorMap_t::iterator itr = m_errorCount.find( iAlg->nameKey() );
340  if (itr != m_errorCount.end()) {
341  return (++(itr->second));
342  } else {
343  error() << "Unable to find Algorithm \"" << iAlg->name() << "\" in map"
344  << " of ErrorCounts" << endmsg;
345  return 0;
346  }
347 }
348 
349 //-----------------------------------------------------------------------------
350 
353  switch (s) {
354  case EventStatus::Invalid :
355  return "Invalid";
356  case EventStatus::Success :
357  return "Success";
358  case EventStatus::AlgFail :
359  return "AlgFail";
360  case EventStatus::AlgStall :
361  return "AlgStall";
362  case EventStatus::Other :
363  return "Other";
364  default :
365  return "Should not happen";
366  }
367 
368 }
void resetErrorCount(const IAlgorithm *iAlg) override
StatusCode initialize() override
Definition: Service.cpp:64
A service that keeps track of the execution state of Algorithm *.
Define general base for Gaudi exception.
The ISvcLocator is the interface implemented by the Service Factory in the Application Manager to loc...
Definition: ISvcLocator.h:25
virtual StatusCode finalize() override final
const std::string & name() const override
Retrieve name of the service.
Definition: Service.cpp:289
const AlgExecState & algExecState(const Gaudi::StringKey &algName, const EventContext &ctx) const override
ContextID_t slot() const
Definition: EventContext.h:41
AlgStates_t m_algStates
bool isSuccess() const
Test for a status code of SUCCESS.
Definition: StatusCode.h:74
MsgStream & verbose() const
shortcut for the method msgStream(MSG::VERBOSE)
T endl(T...args)
#define UNLIKELY(x)
Definition: Kernel.h:126
void dump(std::ostringstream &ost, const EventContext &ctx) const override
STL namespace.
T end(T...args)
std::vector< EventStatus::Status > m_eventStatus
void updateEventStatus(const bool &b, const EventContext &ctx) override
std::once_flag m_initFlag
T call_once(T...args)
This class represents an entry point to all the event specific data.
Definition: EventContext.h:25
STL class.
The helper class to represent the efficient "key" for access.
Definition: StringKey.h:35
T setw(T...args)
T resize(T...args)
STL class.
void checkInit() const
T at(T...args)
StatusCode service(const Gaudi::Utils::TypeNameString &name, T *&svc, bool createIf=true)
Templated method to access a service by name.
Definition: ISvcLocator.h:78
T push_back(T...args)
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
MsgStream & warning() const
shortcut for the method msgStream(MSG::WARNING)
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:26
constexpr double m
Definition: SystemOfUnits.h:93
AlgErrorMap_t m_errorCount
GAUDI_API const EventContext & currentContext()
unsigned int incrementErrorCount(const IAlgorithm *iAlg) override
auto end(reverse_wrapper< T > &w)
Definition: reverse.h:50
#define DECLARE_SERVICE_FACTORY(x)
Definition: Service.h:242
std::string trans(const EventStatus::Status &sc) const
virtual const Gaudi::StringKey & nameKey() const =0
StringKey rep of name.
unsigned int algErrorCount(const IAlgorithm *iAlg) const override
The IAlgorithm is the interface implemented by the Algorithm base class.
Definition: IAlgorithm.h:27
const AlgStateMap_t & algExecStates(const EventContext &ctx) const override
std::mutex m_mut
T find(T...args)
void reset(const EventContext &ctx) override
T size(T...args)
MsgStream & debug() const
shortcut for the method msgStream(MSG::DEBUG)
bool isValid() const
Allow for check if smart pointer is valid.
Definition: SmartIF.h:62
const EventStatus::Status & eventStatus(const EventContext &ctx) const override
~AlgExecStateSvc()
Destructor.
string s
Definition: gaudirun.py:245
virtual const std::list< IService * > & getServices() const =0
Get a reference to a service and create it if it does not exists.
virtual StatusCode initialize() override final
virtual const std::vector< IAlgorithm * > & getAlgorithms() const =0
Return the list of Algorithms.
MsgStream & fatal() const
shortcut for the method msgStream(MSG::FATAL)
virtual size_t getNumberOfStores() const =0
Get the number of &#39;slots&#39;.
MSG::Level msgLevel() const
get the output level from the embedded MsgStream
void setEventStatus(const EventStatus::Status &sc, const EventContext &ctx) override
const std::string & str() const
the actual string
Definition: StringKey.h:47
SmartIF< ISvcLocator > & serviceLocator() const override
Retrieve pointer to service locator.
Definition: Service.cpp:292
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:244
void addAlg(IAlgorithm *iAlg) override
std::vector< Gaudi::StringKey > m_preInitAlgs