All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
EventSelector.cpp
Go to the documentation of this file.
1 // Include files
2 #include "GaudiKernel/SmartIF.h"
3 #include "GaudiKernel/Incident.h"
8 #include "GaudiKernel/IToolSvc.h"
13 
14 #include "EventSelector.h"
15 #include "EventIterator.h"
16 #include <climits>
17 
19 
21 EventSelector::resetCriteria(const std::string& /* criteria */,
22  Context& /* context */) const
23 {
24  return StatusCode::FAILURE;
25 }
26 
27 // Progress report
29  if ( iter ) {
30  long count = iter->numEvent();
31  // Print an message every m_evtPrintFrequency events
32  if ( 0 == iter->context() ) {
33  info() << "End of event input reached." << endmsg;
34  }
35  else if( iter->numStreamEvent() == -1 ) {
36  // Intial value for this stream
37  }
38  else if( m_evtPrintFrequency != -1 && (count % m_evtPrintFrequency == 0)) {
39  always() << "Reading Event record " << count+1
40  << ". Record number within stream " << iter->ID()+1
41  << ": " << iter->numStreamEvent()+1 << endmsg;
42  }
43  }
44  else {
45  info() << "End of event input reached." << endmsg;
46  }
47 }
48 
49 // IEvtSelector::first()
53  IDataStreamTool::size_type iter_id = (m_reconfigure) ? 0 : iter.ID()+1;
54  if ( m_reconfigure ) const_cast<EventSelector*>(this)->m_reconfigure = false;
55  if ( shutDown ) {
56  if ( iter.ID() >= 0 && iter.ID() < (long)m_streamtool->size() ) {
58  if ( s->isInitialized() ) {
59  EventSelector* thisPtr = const_cast<EventSelector*>(this);
60  if ( s->selector() && iter.context() ) {
61  Context* ctxt = iter.context();
62  s->selector()->releaseContext(ctxt).ignore();
63  iter.set(0,0);
64  }
65  status = thisPtr->m_streamtool->finalizeStream(const_cast<EventSelectorDataStream*>(s));
66  iter.set(0,0);
67  }
68  }
69  }
70 
71  const EventSelectorDataStream* s ;
72  status = m_streamtool->getNextStream( s , iter_id );
73 
74  if ( status.isSuccess() ) {
75 
76  if (s) {
77  if ( !s->isInitialized() ) {
78  EventSelector* thisPtr = const_cast<EventSelector*>(this);
79  status = thisPtr->m_streamtool->initializeStream(const_cast<EventSelectorDataStream*>(s));
80  }
81 
82  if ( status.isSuccess() ) {
83  const IEvtSelector* sel = s->selector();
84  if ( sel ) {
85  Context* ctxt = nullptr;
86  status = sel->createContext(ctxt);
87  if ( status.isSuccess() ) {
88  status = sel->resetCriteria(s->criteria(), *ctxt);
89  if ( status.isSuccess() ) {
90  iter.set(this, iter_id, ctxt, 0);
91  info() << *s << endmsg;
92  m_incidentSvc->fireIncident(Incident(s->dbName(),IncidentType::BeginInputFile));
93  return StatusCode::SUCCESS;
94  }
95  }
96  }
97  }
98  m_incidentSvc->fireIncident(Incident(s->dbName(),IncidentType::FailInputFile));
99  }
100  }
101 
102  iter.set(this, -1, 0, 0);
103  status.setChecked();
104  //m_incidentSvc->fireIncident(Incident(s->dbName(),IncidentType::FailInputFile));
105  return StatusCode::FAILURE;
106 }
107 
108 // IEvtSelector::first()
112  if ( shutDown ) {
113  if ( iter.ID() >= 0 && iter.ID() < (long)m_streamtool->size() ) {
115  if ( s->isInitialized() ) {
116  EventSelector* thisPtr = const_cast<EventSelector*>(this);
117  if ( s->selector() && iter.context() ) {
118  Context* ctxt = iter.context();
119  s->selector()->releaseContext(ctxt);
120  iter.set(0,0);
121  }
122  status = thisPtr->m_streamtool->finalizeStream(const_cast<EventSelectorDataStream*>(s));
123  iter.set(0,0);
124  }
125  }
126  }
127 
128  IDataStreamTool::size_type iter_id = iter.ID()-1;
129  const EventSelectorDataStream* s = nullptr;
130  status = m_streamtool->getPreviousStream( s , iter_id );
131 
132  if ( status.isSuccess() ) {
133 
134  if ( !s->isInitialized() ) {
135  EventSelector* thisPtr = const_cast<EventSelector*>(this);
136  status = thisPtr->m_streamtool->initializeStream(const_cast<EventSelectorDataStream*>(s));
137  }
138  if ( status.isSuccess() ) {
139  const IEvtSelector* sel = s->selector();
140  if ( sel ) {
141  Context* ctxt = nullptr;
142  status = sel->createContext(ctxt);
143  if ( status.isSuccess() ) {
144  status = sel->resetCriteria(s->criteria(), *ctxt);
145  if ( status.isSuccess() ) {
146  iter.set(this, iter_id, ctxt, 0);
147  info() << *s << endmsg;
148  return StatusCode::SUCCESS;
149  }
150  }
151  }
152  }
153  }
154 
155  iter.set(this, -1, 0, 0);
156  return StatusCode::FAILURE;
157 }
158 
160 StatusCode EventSelector::createContext(Context*& refpCtxt) const
161 {
162  // Max event is zero. Return begin = end
163  refpCtxt = nullptr;
164  if ( m_firstEvent < 0 ) {
165  error() << "First Event = " << m_firstEvent << " not valid" << endmsg;
166  error() << "It should be > 0 " << endmsg;
167  return StatusCode::FAILURE; // if failure => iterators = end();
168  }
169  EvtSelectorContext* ctxt = new EvtSelectorContext(this);
170  ctxt->set(0, -1, 0, 0);
171  firstOfNextStream(true, *ctxt).ignore();
172  refpCtxt = ctxt;
173  long nskip = m_firstEvent;
174  while( --nskip > 0 ) {
175  StatusCode sc = next(*refpCtxt);
176  if ( sc.isFailure() ) {
177  error() << " createContext() failed to start with event number "
178  << m_firstEvent << endmsg;
179  releaseContext(refpCtxt);
180  refpCtxt = nullptr;
181  return StatusCode::FAILURE;
182  }
183  }
184  return StatusCode::SUCCESS;
185 }
186 
188 StatusCode EventSelector::next(Context& refCtxt) const {
189  return next(refCtxt, 1);
190 }
191 
193 StatusCode EventSelector::next(Context& refCtxt, int /* jump */ ) const {
194  EvtSelectorContext *pIt = dynamic_cast<EvtSelectorContext*>(&refCtxt);
195  if ( pIt ) {
196  if ( pIt->ID() != -1 ) {
198  Context* it = pIt->context();
199  IEvtSelector* sel = s->selector();
200  if ( it && sel ) { // First exploit the current stream
201  StatusCode sc = sel->next(*it); // This stream is empty: advance to the next stream
202  if ( !sc.isSuccess() ) {
203  m_incidentSvc->fireIncident(Incident(s->dbName(),IncidentType::EndInputFile));
204  sc = firstOfNextStream(true, *pIt);
205  if (sc.isSuccess() ) sc = next(*pIt);
206  }
207  else {
208  pIt->increaseCounters(false);
209  pIt->set(it, 0);
210  printEvtInfo(pIt);
211  }
212  return sc;
213  }
214  else if ( m_reconfigure ) {
215  StatusCode sc = firstOfNextStream(false, *pIt);
216  printEvtInfo(pIt);
217  return sc;
218  }
219  }
220  else if ( m_reconfigure ) {
221  StatusCode sc = firstOfNextStream(false, *pIt);
222  printEvtInfo(pIt);
223  return sc;
224  }
225  pIt->increaseCounters(false);
226  }
227  printEvtInfo(pIt);
228  return StatusCode::FAILURE;
229 }
230 
232 StatusCode EventSelector::previous(Context& refCtxt) const {
233  return previous(refCtxt, 1);
234 }
235 
237 StatusCode EventSelector::previous(Context& refCtxt, int jump) const {
238  EvtSelectorContext *pIt = dynamic_cast<EvtSelectorContext*>(&refCtxt);
239  if ( pIt && jump > 0 ) {
241  for ( int i = 0; i < jump && sc.isSuccess(); ++i ) {
243  Context* it = pIt->context();
244  IEvtSelector* sel = s->selector();
245  if ( it && sel ) { // First exploit the current stream
246  // This stream is empty: advance to the next stream
247  sc = sel->previous(*it); // This stream is empty: advance to the next stream
248  if ( !sc.isSuccess() ) {
249  sc = lastOfPreviousStream(true, *pIt);
250  }
251  else {
252  pIt->increaseCounters(false);
253  pIt->set(it, 0);
254  }
255  printEvtInfo(pIt);
256  if ( !sc.isSuccess() ) {
257  return sc;
258  }
259  }
260  pIt->increaseCounters(false);
261  }
262  return sc;
263  }
264  printEvtInfo(pIt);
265  return StatusCode::FAILURE;
266 }
267 
269 StatusCode EventSelector::last(Context& refCtxt) const {
270  EvtSelectorContext *pIt = dynamic_cast<EvtSelectorContext*>(&refCtxt);
271  if ( pIt ) {
272  }
273  return StatusCode::FAILURE;
274 }
275 
277 StatusCode EventSelector::rewind(Context& refCtxt) const {
278  EvtSelectorContext *ctxt = dynamic_cast<EvtSelectorContext*>(&refCtxt);
279  if ( ctxt ) {
280  ctxt->set(0, -1, 0, 0);
281  firstOfNextStream(true, *ctxt);
282  long nskip = m_firstEvent;
283  while( --nskip > 0 ) {
284  StatusCode sc = next(*ctxt);
285  if ( sc.isFailure() ) {
286  error() << "rewind() failed to start with event number "
287  << m_firstEvent << endmsg;
288  return StatusCode::FAILURE;
289  }
290  }
291  return StatusCode::SUCCESS;
292  }
293  return StatusCode::FAILURE;
294 }
295 
298 EventSelector::createAddress(const Context& refCtxt,
299  IOpaqueAddress*& refpAddr) const
300 {
301  const EvtSelectorContext *cpIt = dynamic_cast<const EvtSelectorContext*>(&refCtxt);
302  EvtSelectorContext *pIt = const_cast<EvtSelectorContext*>(cpIt);
303  refpAddr = nullptr;
304  if ( pIt ) {
306  Context* it = pIt->context();
307  IEvtSelector* sel = s->selector();
308  if ( it && sel ) {
309  IOpaqueAddress* pAddr = nullptr;
310  StatusCode sc = sel->createAddress(*it, pAddr);
311  if ( sc.isSuccess() ) refpAddr = pAddr;
312  pIt->set(it, pAddr);
313  return sc;
314  }
315  }
316  return StatusCode::FAILURE;
317 }
318 
319 // Release existing event iteration context
320 StatusCode EventSelector::releaseContext(Context*& refCtxt) const {
321  const EvtSelectorContext *cpIt = dynamic_cast<const EvtSelectorContext*>(refCtxt);
323  if ( pIt && pIt->ID() >= 0 && pIt->ID() < (long)m_streamtool->size() ) {
324  const EventSelectorDataStream* s = m_streamtool->getStream(pIt->ID());
325  Context* it = pIt->context();
326  IEvtSelector* sel = s->selector();
327  if ( it && sel ) {
328  StatusCode sc = sel->releaseContext(it);
329  if ( sc.isSuccess() ) {
330  refCtxt = nullptr;
331  return sc;
332  }
333  }
334  }
335  return StatusCode::SUCCESS;
336 }
337 
340  // Initialize base class
341  StatusCode status = Service::initialize();
342  if ( !status.isSuccess() ) {
343  error() << "Error initializing base class Service!" << endmsg;
344  return status;
345  }
346  // Get the references to the services that are needed by the ApplicationMgr itself
347  m_incidentSvc = serviceLocator()->service("IncidentSvc");
348  if( !m_incidentSvc ) {
349  fatal() << "Error retrieving IncidentSvc." << endmsg;
350  return StatusCode::FAILURE;
351  }
352  if ( m_evtMax != INT_MAX ) {
353  error() << "EvtMax is an obsolete property of the event selector." << endmsg;
354  error() << "Please set \"ApplicationMgr.EvtMax = " << m_evtMax
355  << ";\" to process the requested number of events." << endmsg;
356  return StatusCode::FAILURE;
357  }
358 
359  m_toolSvc = serviceLocator()->service("ToolSvc");
360  if ( !m_toolSvc ) {
361  error() << " Could not locate the Tool Service! " << endmsg;
362  return StatusCode::FAILURE;
363  }
364  // make sure we finalize _prior_ to ToolSvc... we are about to get a
365  // a pointer to a tool which gets finalized and released by the ToolSvc
366  // during ToolSvc::finalize, and we don't want dangling pointers...
368  auto prio = mgr->getPriority("ToolSvc");
369  mgr->setPriority(name(),prio+1).ignore();
370 
372 
373  if( status.isFailure() ) {
374  error() << "Error initializing "
375  << m_streamManager << endmsg;
376  return status;
377  }
378 
379  status = m_streamtool->clear();
380  if( status.isFailure() ) {
381  // Message already printed by the tool
382  return status;
383  }
384 
386 
388 
389  m_streamID = 0;
390 
391  return status;
392 }
393 
394 // Re-initialize
397  error() << "Cannot reinitialize: service not in state initialized" << endmsg;
398  return StatusCode::FAILURE;
399  }
400 
402  StatusCode status = m_streamtool->clear();
403  if ( status.isFailure() ) return status;
405  m_reconfigure = true;
407  }
408 
409  return StatusCode::SUCCESS;
410 }
411 
412 //
414 
415  if (msgLevel(MSG::DEBUG)) {
416  debug() << "finalize()" << endmsg;
417  }
418 
419  m_incidentSvc = nullptr;
420 
421  if (m_streamtool) {
422  if (m_toolSvc) {
424  } else {
425  // It should not be possible to get here
427  }
428  m_streamtool = nullptr;
429  }
430  m_toolSvc.reset();
431 
432  return Service::finalize();
433 }
StatusCode lastOfPreviousStream(bool shutDown, EvtSelectorContext &it) const
Retrieve last entry of the previous data stream.
SmartIF< IIncidentSvc > m_incidentSvc
Reference to the indicent service.
Definition: EventSelector.h:64
StatusCode createContext(Context *&refpCtxt) const override
Create a new event loop context.
bool isInitialized() const
Check initialization status.
StatusCode initialize() override
Definition: Service.cpp:64
IEvtSelector::Context * context() const
Access "real" iterator.
Definition: EventIterator.h:70
virtual StatusCode finalizeStream(EventSelectorDataStream *)=0
const std::string & name() const override
Retrieve name of the service.
Definition: Service.cpp:289
StatusCode rewind(Context &refCtxt) const override
Rewind the dataset.
StatusCode resetCriteria(const std::string &cr, Context &c) const override
Will set a new criteria for the selection of the next list of events and will change the state of the...
StatusCode finalize() override
Definition: Service.cpp:174
MsgStream & info() const
shortcut for the method msgStream(MSG::INFO)
StatusCode releaseContext(Context *&refCtxt) const override
Release existing event iteration context.
The Event Selector Interface.
Definition: IEvtSelector.h:18
bool isSuccess() const
Test for a status code of SUCCESS.
Definition: StatusCode.h:74
IDataStreamTool * m_streamtool
Definition: EventSelector.h:68
IEvtSelector * selector() const
Retrieve event selector object.
sel
Definition: IOTest.py:84
long int m_streamID
Definition: EventSelector.h:60
virtual void printEvtInfo(const EvtSelectorContext *iter) const
Progress report.
STL namespace.
StatusCode firstOfNextStream(bool shutDown, EvtSelectorContext &it) const
Retrieve first entry of the next data stream.
virtual StatusCode previous(Context &c) const =0
Fetch the previous event.
bool isFailure() const
Test for a status code of FAILURE.
Definition: StatusCode.h:84
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:146
#define DECLARE_COMPONENT(type)
Definition: PluginService.h:36
virtual int getPriority(const std::string &name) const =0
StreamSpecs m_streamSpecsLast
Input stream specifiers (last used)
Definition: EventSelector.h:73
virtual StatusCode addStreams(const StreamSpecs &)=0
StatusCode service(const Gaudi::Utils::TypeNameString &name, T *&svc, bool createIf=true)
Templated method to access a service by name.
Definition: ISvcLocator.h:78
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
Gaudi::Property< int > m_evtPrintFrequency
Definition: EventSelector.h:83
virtual void fireIncident(const Incident &incident)=0
Fire an Incident.
Gaudi::Property< std::string > m_streamManager
Definition: EventSelector.h:84
StatusCode reinitialize() override
Service override: Reinitialize service.
StatusCode last(Context &c) const override
Access last item in the iteration.
virtual StatusCode clear()=0
Definition of class EventIterator.
Definition: EventIterator.h:32
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:26
virtual EventSelectorDataStream * getStream(size_type)=0
Gaudi::Property< int > m_evtMax
Definition: EventSelector.h:82
virtual StatusCode resetCriteria(const std::string &cr, Context &c) const =0
Will set a new criteria for the selection of the next list of events and will change the state of the...
StatusCode initialize() override
IService implementation: Db event selector override.
Gaudi::Property< StreamSpecs > m_streamSpecs
Definition: EventSelector.h:80
Gaudi::Property< int > m_firstEvent
Definition: EventSelector.h:81
virtual StatusCode releaseContext(Context *&) const =0
Release the Context object.
long numStreamEvent() const
Access counter within stream.
virtual StatusCode setPriority(const std::string &name, int pri)=0
StatusCode finalize() override
IService implementation: Service finalization.
virtual StatusCode getPreviousStream(const EventSelectorDataStream *&, size_type &)=0
SmartIF< IToolSvc > m_toolSvc
Definition: EventSelector.h:66
virtual unsigned long release()=0
Release Interface instance.
STL class.
void set(const IEvtSelector *sel, IDataStreamTool::size_type id, IEvtSelector::Context *it, IOpaqueAddress *pA)
Set the address of the iterator.
Definition: EventIterator.h:53
MsgStream & debug() const
shortcut for the method msgStream(MSG::DEBUG)
Definition of class EventSelectorDataStream.
StatusCode createAddress(const Context &refCtxt, IOpaqueAddress *&refpAddr) const override
Create new Opaque address corresponding to the current record.
Base class for all Incidents (computing events).
Definition: Incident.h:17
StatusCode previous(Context &refCtxt) const override
Get previous iteration item from the event loop context.
virtual IDataStreamTool::size_type ID() const
Stream identifier.
Definition: EventIterator.h:95
string s
Definition: gaudirun.py:245
Gaudi::StateMachine::State FSMState() const override
Definition: Service.h:54
virtual StatusCode next(Context &c) const =0
Fetch the next event or the first event if it will be use soon after the creation of the context...
virtual StatusCode releaseTool(IAlgTool *tool)=0
Release the tool.
IDataStreamTool::size_type increaseCounters(bool reset=false)
Increase counters.
Definition: EventIterator.h:74
virtual StatusCode createContext(Context *&c) const =0
Create and return a context object that will keep track of the state of selection.
Definition of class EventSelector.
Definition: EventSelector.h:53
void reset(TYPE *ptr=nullptr)
Set the internal pointer to the passed one disposing of the old one.
Definition: SmartIF.h:88
virtual size_type size()=0
virtual StatusCode initializeStream(EventSelectorDataStream *)=0
virtual StatusCode createAddress(const Context &c, IOpaqueAddress *&iop) const =0
Create an IOpaqueAddress object from the event fetched.
const std::string & criteria() const
Retrieve stream criteria.
bool m_reconfigure
Reconfigure occurred.
Definition: EventSelector.h:71
Opaque address interface definition.
MsgStream & fatal() const
shortcut for the method msgStream(MSG::FATAL)
void ignore() const
Definition: StatusCode.h:106
virtual StatusCode getNextStream(const EventSelectorDataStream *&, size_type &)=0
MSG::Level msgLevel() const
get the output level from the embedded MsgStream
long numEvent() const
Access counter.
Definition: EventIterator.h:99
MsgStream & always() const
shortcut for the method msgStream(MSG::ALWAYS)
SmartIF< ISvcLocator > & serviceLocator() const override
Retrieve pointer to service locator.
Definition: Service.cpp:292
const std::string & dbName() const
Retrieve stream dbName.
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:244
StatusCode next(Context &refCtxt) const override
Get next iteration item from the event loop context.
void setChecked() const
Ignore the checking code;.
Definition: StatusCode.h:103