The Gaudi Framework  v29r0 (ff2e7097)
EventSelector.cpp
Go to the documentation of this file.
1 // Include files
8 #include "GaudiKernel/IToolSvc.h"
9 #include "GaudiKernel/Incident.h"
10 #include "GaudiKernel/MsgStream.h"
12 #include "GaudiKernel/SmartIF.h"
13 
14 #include "EventIterator.h"
15 #include "EventSelector.h"
16 #include <climits>
17 
19 
20 StatusCode EventSelector::resetCriteria( const std::string& /* criteria */, Context& /* context */ ) const
21 {
22  return StatusCode::FAILURE;
23 }
24 
25 // Progress report
27 {
28  if ( iter ) {
29  long count = iter->numEvent();
30  // Print an message every m_evtPrintFrequency events
31  if ( 0 == iter->context() ) {
32  info() << "End of event input reached." << endmsg;
33  } else if ( iter->numStreamEvent() == -1 ) {
34  // Intial value for this stream
35  } else if ( m_evtPrintFrequency != -1 && ( count % m_evtPrintFrequency == 0 ) ) {
36  always() << "Reading Event record " << count + 1 << ". Record number within stream " << iter->ID() + 1 << ": "
37  << iter->numStreamEvent() + 1 << endmsg;
38  }
39  } else {
40  info() << "End of event input reached." << endmsg;
41  }
42 }
43 
44 // IEvtSelector::first()
46 {
48  IDataStreamTool::size_type iter_id = ( m_reconfigure ) ? 0 : iter.ID() + 1;
49  if ( m_reconfigure ) const_cast<EventSelector*>( this )->m_reconfigure = false;
50  if ( shutDown ) {
51  if ( iter.ID() >= 0 && iter.ID() < (long)m_streamtool->size() ) {
53  if ( s->isInitialized() ) {
54  EventSelector* thisPtr = const_cast<EventSelector*>( this );
55  if ( s->selector() && iter.context() ) {
56  Context* ctxt = iter.context();
57  s->selector()->releaseContext( ctxt ).ignore();
58  iter.set( 0, 0 );
59  }
60  status = thisPtr->m_streamtool->finalizeStream( const_cast<EventSelectorDataStream*>( s ) );
61  iter.set( 0, 0 );
62  }
63  }
64  }
65 
67  status = m_streamtool->getNextStream( s, iter_id );
68 
69  if ( status.isSuccess() ) {
70 
71  if ( s ) {
72  if ( !s->isInitialized() ) {
73  EventSelector* thisPtr = const_cast<EventSelector*>( this );
74  status = thisPtr->m_streamtool->initializeStream( const_cast<EventSelectorDataStream*>( s ) );
75  }
76 
77  if ( status.isSuccess() ) {
78  const IEvtSelector* sel = s->selector();
79  if ( sel ) {
80  Context* ctxt = nullptr;
81  status = sel->createContext( ctxt );
82  if ( status.isSuccess() ) {
83  status = sel->resetCriteria( s->criteria(), *ctxt );
84  if ( status.isSuccess() ) {
85  iter.set( this, iter_id, ctxt, 0 );
86  info() << *s << endmsg;
87  m_incidentSvc->fireIncident( Incident( s->dbName(), IncidentType::BeginInputFile ) );
88  return StatusCode::SUCCESS;
89  }
90  }
91  }
92  }
93  m_incidentSvc->fireIncident( Incident( s->dbName(), IncidentType::FailInputFile ) );
94  }
95  }
96 
97  iter.set( this, -1, 0, 0 );
98  status.setChecked();
99  // m_incidentSvc->fireIncident(Incident(s->dbName(),IncidentType::FailInputFile));
100  return StatusCode::FAILURE;
101 }
102 
103 // IEvtSelector::first()
105 {
107  if ( shutDown ) {
108  if ( iter.ID() >= 0 && iter.ID() < (long)m_streamtool->size() ) {
109  const EventSelectorDataStream* s = m_streamtool->getStream( iter.ID() );
110  if ( s->isInitialized() ) {
111  EventSelector* thisPtr = const_cast<EventSelector*>( this );
112  if ( s->selector() && iter.context() ) {
113  Context* ctxt = iter.context();
114  s->selector()->releaseContext( ctxt );
115  iter.set( 0, 0 );
116  }
117  status = thisPtr->m_streamtool->finalizeStream( const_cast<EventSelectorDataStream*>( s ) );
118  iter.set( 0, 0 );
119  }
120  }
121  }
122 
123  IDataStreamTool::size_type iter_id = iter.ID() - 1;
124  const EventSelectorDataStream* s = nullptr;
125  status = m_streamtool->getPreviousStream( s, iter_id );
126 
127  if ( status.isSuccess() ) {
128 
129  if ( !s->isInitialized() ) {
130  EventSelector* thisPtr = const_cast<EventSelector*>( this );
131  status = thisPtr->m_streamtool->initializeStream( const_cast<EventSelectorDataStream*>( s ) );
132  }
133  if ( status.isSuccess() ) {
134  const IEvtSelector* sel = s->selector();
135  if ( sel ) {
136  Context* ctxt = nullptr;
137  status = sel->createContext( ctxt );
138  if ( status.isSuccess() ) {
139  status = sel->resetCriteria( s->criteria(), *ctxt );
140  if ( status.isSuccess() ) {
141  iter.set( this, iter_id, ctxt, 0 );
142  info() << *s << endmsg;
143  return StatusCode::SUCCESS;
144  }
145  }
146  }
147  }
148  }
149 
150  iter.set( this, -1, 0, 0 );
151  return StatusCode::FAILURE;
152 }
153 
155 StatusCode EventSelector::createContext( Context*& refpCtxt ) const
156 {
157  // Max event is zero. Return begin = end
158  refpCtxt = nullptr;
159  if ( m_firstEvent < 0 ) {
160  error() << "First Event = " << m_firstEvent << " not valid" << endmsg;
161  error() << "It should be > 0 " << endmsg;
162  return StatusCode::FAILURE; // if failure => iterators = end();
163  }
164  EvtSelectorContext* ctxt = new EvtSelectorContext( this );
165  ctxt->set( 0, -1, 0, 0 );
166  firstOfNextStream( true, *ctxt ).ignore();
167  refpCtxt = ctxt;
168  long nskip = m_firstEvent;
169  while ( --nskip > 0 ) {
170  StatusCode sc = next( *refpCtxt );
171  if ( sc.isFailure() ) {
172  error() << " createContext() failed to start with event number " << m_firstEvent << endmsg;
173  releaseContext( refpCtxt );
174  refpCtxt = nullptr;
175  return StatusCode::FAILURE;
176  }
177  }
178  return StatusCode::SUCCESS;
179 }
180 
182 StatusCode EventSelector::next( Context& refCtxt ) const { return next( refCtxt, 1 ); }
183 
185 StatusCode EventSelector::next( Context& refCtxt, int /* jump */ ) const
186 {
187  EvtSelectorContext* pIt = dynamic_cast<EvtSelectorContext*>( &refCtxt );
188  if ( pIt ) {
189  if ( pIt->ID() != -1 ) {
190  const EventSelectorDataStream* s = m_streamtool->getStream( pIt->ID() );
191  Context* it = pIt->context();
192  IEvtSelector* sel = s->selector();
193  if ( it && sel ) { // First exploit the current stream
194  StatusCode sc = sel->next( *it ); // This stream is empty: advance to the next stream
195  if ( !sc.isSuccess() ) {
196  m_incidentSvc->fireIncident( Incident( s->dbName(), IncidentType::EndInputFile ) );
197  sc = firstOfNextStream( true, *pIt );
198  if ( sc.isSuccess() ) sc = next( *pIt );
199  } else {
200  pIt->increaseCounters( false );
201  pIt->set( it, 0 );
202  printEvtInfo( pIt );
203  }
204  return sc;
205  } else if ( m_reconfigure ) {
206  StatusCode sc = firstOfNextStream( false, *pIt );
207  printEvtInfo( pIt );
208  return sc;
209  }
210  } else if ( m_reconfigure ) {
211  StatusCode sc = firstOfNextStream( false, *pIt );
212  printEvtInfo( pIt );
213  return sc;
214  }
215  pIt->increaseCounters( false );
216  }
217  printEvtInfo( pIt );
218  return StatusCode::FAILURE;
219 }
220 
222 StatusCode EventSelector::previous( Context& refCtxt ) const { return previous( refCtxt, 1 ); }
223 
225 StatusCode EventSelector::previous( Context& refCtxt, int jump ) const
226 {
227  EvtSelectorContext* pIt = dynamic_cast<EvtSelectorContext*>( &refCtxt );
228  if ( pIt && jump > 0 ) {
230  for ( int i = 0; i < jump && sc.isSuccess(); ++i ) {
231  const EventSelectorDataStream* s = m_streamtool->getStream( pIt->ID() );
232  Context* it = pIt->context();
233  IEvtSelector* sel = s->selector();
234  if ( it && sel ) { // First exploit the current stream
235  // This stream is empty: advance to the next stream
236  sc = sel->previous( *it ); // This stream is empty: advance to the next stream
237  if ( !sc.isSuccess() ) {
238  sc = lastOfPreviousStream( true, *pIt );
239  } else {
240  pIt->increaseCounters( false );
241  pIt->set( it, 0 );
242  }
243  printEvtInfo( pIt );
244  if ( !sc.isSuccess() ) {
245  return sc;
246  }
247  }
248  pIt->increaseCounters( false );
249  }
250  return sc;
251  }
252  printEvtInfo( pIt );
253  return StatusCode::FAILURE;
254 }
255 
257 StatusCode EventSelector::last( Context& refCtxt ) const
258 {
259  EvtSelectorContext* pIt = dynamic_cast<EvtSelectorContext*>( &refCtxt );
260  if ( pIt ) {
261  }
262  return StatusCode::FAILURE;
263 }
264 
266 StatusCode EventSelector::rewind( Context& refCtxt ) const
267 {
268  EvtSelectorContext* ctxt = dynamic_cast<EvtSelectorContext*>( &refCtxt );
269  if ( ctxt ) {
270  ctxt->set( 0, -1, 0, 0 );
271  firstOfNextStream( true, *ctxt );
272  long nskip = m_firstEvent;
273  while ( --nskip > 0 ) {
274  StatusCode sc = next( *ctxt );
275  if ( sc.isFailure() ) {
276  error() << "rewind() failed to start with event number " << m_firstEvent << endmsg;
277  return StatusCode::FAILURE;
278  }
279  }
280  return StatusCode::SUCCESS;
281  }
282  return StatusCode::FAILURE;
283 }
284 
286 StatusCode EventSelector::createAddress( const Context& refCtxt, IOpaqueAddress*& refpAddr ) const
287 {
288  const EvtSelectorContext* cpIt = dynamic_cast<const EvtSelectorContext*>( &refCtxt );
289  EvtSelectorContext* pIt = const_cast<EvtSelectorContext*>( cpIt );
290  refpAddr = nullptr;
291  if ( pIt ) {
292  const EventSelectorDataStream* s = m_streamtool->getStream( pIt->ID() );
293  Context* it = pIt->context();
294  IEvtSelector* sel = s->selector();
295  if ( it && sel ) {
296  IOpaqueAddress* pAddr = nullptr;
297  StatusCode sc = sel->createAddress( *it, pAddr );
298  if ( sc.isSuccess() ) refpAddr = pAddr;
299  pIt->set( it, pAddr );
300  return sc;
301  }
302  }
303  return StatusCode::FAILURE;
304 }
305 
306 // Release existing event iteration context
307 StatusCode EventSelector::releaseContext( Context*& refCtxt ) const
308 {
309  const EvtSelectorContext* cpIt = dynamic_cast<const EvtSelectorContext*>( refCtxt );
311  if ( pIt && pIt->ID() >= 0 && pIt->ID() < (long)m_streamtool->size() ) {
312  const EventSelectorDataStream* s = m_streamtool->getStream( pIt->ID() );
313  Context* it = pIt->context();
314  IEvtSelector* sel = s->selector();
315  if ( it && sel ) {
316  StatusCode sc = sel->releaseContext( it );
317  if ( sc.isSuccess() ) {
318  refCtxt = nullptr;
319  return sc;
320  }
321  }
322  }
323  return StatusCode::SUCCESS;
324 }
325 
328 {
329  // Initialize base class
330  StatusCode status = Service::initialize();
331  if ( !status.isSuccess() ) {
332  error() << "Error initializing base class Service!" << endmsg;
333  return status;
334  }
335  // Get the references to the services that are needed by the ApplicationMgr itself
336  m_incidentSvc = serviceLocator()->service( "IncidentSvc" );
337  if ( !m_incidentSvc ) {
338  fatal() << "Error retrieving IncidentSvc." << endmsg;
339  return StatusCode::FAILURE;
340  }
341  if ( m_evtMax != INT_MAX ) {
342  error() << "EvtMax is an obsolete property of the event selector." << endmsg;
343  error() << "Please set \"ApplicationMgr.EvtMax = " << m_evtMax << ";\" to process the requested number of events."
344  << endmsg;
345  return StatusCode::FAILURE;
346  }
347 
348  m_toolSvc = serviceLocator()->service( "ToolSvc" );
349  if ( !m_toolSvc ) {
350  error() << " Could not locate the Tool Service! " << endmsg;
351  return StatusCode::FAILURE;
352  }
353  // make sure we finalize _prior_ to ToolSvc... we are about to get a
354  // a pointer to a tool which gets finalized and released by the ToolSvc
355  // during ToolSvc::finalize, and we don't want dangling pointers...
357  auto prio = mgr->getPriority( "ToolSvc" );
358  mgr->setPriority( name(), prio + 1 ).ignore();
359 
361 
362  if ( status.isFailure() ) {
363  error() << "Error initializing " << m_streamManager << endmsg;
364  return status;
365  }
366 
367  status = m_streamtool->clear();
368  if ( status.isFailure() ) {
369  // Message already printed by the tool
370  return status;
371  }
372 
374 
376 
377  m_streamID = 0;
378 
379  return status;
380 }
381 
382 // Re-initialize
384 {
386  error() << "Cannot reinitialize: service not in state initialized" << endmsg;
387  return StatusCode::FAILURE;
388  }
389 
390  if ( m_streamSpecsLast != m_streamSpecs ) {
391  StatusCode status = m_streamtool->clear();
392  if ( status.isFailure() ) return status;
394  m_reconfigure = true;
396  }
397 
398  return StatusCode::SUCCESS;
399 }
400 
401 //
403 {
404 
405  if ( msgLevel( MSG::DEBUG ) ) {
406  debug() << "finalize()" << endmsg;
407  }
408 
409  m_incidentSvc = nullptr;
410 
411  if ( m_streamtool ) {
412  if ( m_toolSvc ) {
414  } else {
415  // It should not be possible to get here
417  }
418  m_streamtool = nullptr;
419  }
420  m_toolSvc.reset();
421 
422  return Service::finalize();
423 }
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:73
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:75
IDataStreamTool * m_streamtool
Definition: EventSelector.h:68
IEvtSelector * selector() const
Retrieve event selector object.
sel
Definition: IOTest.py:95
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: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:139
#define DECLARE_COMPONENT(type)
Definition: PluginService.h:33
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:79
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:28
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.
Definition: EventIterator.h:98
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:56
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:94
string s
Definition: gaudirun.py:253
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:75
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:92
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:109
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:96
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:209
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:108