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