Loading [MathJax]/extensions/tex2jax.js
The Gaudi Framework  v31r0 (aeb156f0)
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
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  return StatusCode::FAILURE;
22 }
23 
24 // Progress report
26  if ( iter ) {
27  long count = iter->numEvent();
28  // Print an message every m_evtPrintFrequency events
29  if ( 0 == iter->context() ) {
30  info() << "End of event input reached." << endmsg;
31  } else if ( iter->numStreamEvent() == -1 ) {
32  // Intial value for this stream
33  } else if ( m_evtPrintFrequency != -1 && ( count % m_evtPrintFrequency == 0 ) ) {
34  always() << "Reading Event record " << count + 1 << ". Record number within stream " << iter->ID() + 1 << ": "
35  << iter->numStreamEvent() + 1 << endmsg;
36  }
37  } else {
38  info() << "End of event input reached." << endmsg;
39  }
40 }
41 
42 // IEvtSelector::first()
45  IDataStreamTool::size_type iter_id = ( m_reconfigure ) ? 0 : iter.ID() + 1;
46  if ( m_reconfigure ) const_cast<EventSelector*>( this )->m_reconfigure = false;
47  if ( shutDown ) {
48  if ( iter.ID() >= 0 && iter.ID() < (long)m_streamtool->size() ) {
50  if ( s->isInitialized() ) {
51  EventSelector* thisPtr = const_cast<EventSelector*>( this );
52  if ( s->selector() && iter.context() ) {
53  Context* ctxt = iter.context();
54  s->selector()->releaseContext( ctxt ).ignore();
55  iter.set( 0, 0 );
56  }
57  status = thisPtr->m_streamtool->finalizeStream( const_cast<EventSelectorDataStream*>( s ) );
58  iter.set( 0, 0 );
59  }
60  }
61  }
62 
64  status = m_streamtool->getNextStream( s, iter_id );
65 
66  if ( status.isSuccess() ) {
67 
68  if ( s ) {
69  if ( !s->isInitialized() ) {
70  EventSelector* thisPtr = const_cast<EventSelector*>( this );
71  status = thisPtr->m_streamtool->initializeStream( const_cast<EventSelectorDataStream*>( s ) );
72  }
73 
74  if ( status.isSuccess() ) {
75  const IEvtSelector* sel = s->selector();
76  if ( sel ) {
77  Context* ctxt = nullptr;
78  status = sel->createContext( ctxt );
79  if ( status.isSuccess() ) {
80  status = sel->resetCriteria( s->criteria(), *ctxt );
81  if ( status.isSuccess() ) {
82  iter.set( this, iter_id, ctxt, 0 );
83  info() << *s << endmsg;
84  m_incidentSvc->fireIncident( Incident( s->dbName(), IncidentType::BeginInputFile ) );
85  return StatusCode::SUCCESS;
86  }
87  }
88  }
89  }
90  m_incidentSvc->fireIncident( Incident( s->dbName(), IncidentType::FailInputFile ) );
91  }
92  }
93 
94  iter.set( this, -1, 0, 0 );
95  status.setChecked();
96  // m_incidentSvc->fireIncident(Incident(s->dbName(),IncidentType::FailInputFile));
97  return StatusCode::FAILURE;
98 }
99 
100 // IEvtSelector::first()
103  if ( shutDown ) {
104  if ( iter.ID() >= 0 && iter.ID() < (long)m_streamtool->size() ) {
105  const EventSelectorDataStream* s = m_streamtool->getStream( iter.ID() );
106  if ( s->isInitialized() ) {
107  EventSelector* thisPtr = const_cast<EventSelector*>( this );
108  if ( s->selector() && iter.context() ) {
109  Context* ctxt = iter.context();
110  s->selector()->releaseContext( ctxt );
111  iter.set( 0, 0 );
112  }
113  status = thisPtr->m_streamtool->finalizeStream( const_cast<EventSelectorDataStream*>( s ) );
114  iter.set( 0, 0 );
115  }
116  }
117  }
118 
119  IDataStreamTool::size_type iter_id = iter.ID() - 1;
120  const EventSelectorDataStream* s = nullptr;
121  status = m_streamtool->getPreviousStream( s, iter_id );
122 
123  if ( status.isSuccess() ) {
124 
125  if ( !s->isInitialized() ) {
126  EventSelector* thisPtr = const_cast<EventSelector*>( this );
127  status = thisPtr->m_streamtool->initializeStream( const_cast<EventSelectorDataStream*>( s ) );
128  }
129  if ( status.isSuccess() ) {
130  const IEvtSelector* sel = s->selector();
131  if ( sel ) {
132  Context* ctxt = nullptr;
133  status = sel->createContext( ctxt );
134  if ( status.isSuccess() ) {
135  status = sel->resetCriteria( s->criteria(), *ctxt );
136  if ( status.isSuccess() ) {
137  iter.set( this, iter_id, ctxt, 0 );
138  info() << *s << endmsg;
139  return StatusCode::SUCCESS;
140  }
141  }
142  }
143  }
144  }
145 
146  iter.set( this, -1, 0, 0 );
147  return StatusCode::FAILURE;
148 }
149 
151 StatusCode EventSelector::createContext( Context*& refpCtxt ) const {
152  // Max event is zero. Return begin = end
153  refpCtxt = nullptr;
154  if ( m_firstEvent < 0 ) {
155  error() << "First Event = " << m_firstEvent << " not valid" << endmsg;
156  error() << "It should be > 0 " << endmsg;
157  return StatusCode::FAILURE; // if failure => iterators = end();
158  }
159  EvtSelectorContext* ctxt = new EvtSelectorContext( this );
160  ctxt->set( 0, -1, 0, 0 );
161  firstOfNextStream( true, *ctxt ).ignore();
162  refpCtxt = ctxt;
163  long nskip = m_firstEvent;
164  while ( --nskip > 0 ) {
165  StatusCode sc = next( *refpCtxt );
166  if ( sc.isFailure() ) {
167  error() << " createContext() failed to start with event number " << m_firstEvent << endmsg;
168  releaseContext( refpCtxt );
169  refpCtxt = nullptr;
170  return StatusCode::FAILURE;
171  }
172  }
173  return StatusCode::SUCCESS;
174 }
175 
177 StatusCode EventSelector::next( Context& refCtxt ) const { return next( refCtxt, 1 ); }
178 
180 StatusCode EventSelector::next( Context& refCtxt, int /* jump */ ) const {
181  EvtSelectorContext* pIt = dynamic_cast<EvtSelectorContext*>( &refCtxt );
182  if ( pIt ) {
183  if ( pIt->ID() != -1 ) {
184  const EventSelectorDataStream* s = m_streamtool->getStream( pIt->ID() );
185  Context* it = pIt->context();
186  IEvtSelector* sel = s->selector();
187  if ( it && sel ) { // First exploit the current stream
188  StatusCode sc = sel->next( *it ); // This stream is empty: advance to the next stream
189  if ( !sc.isSuccess() ) {
190  m_incidentSvc->fireIncident( Incident( s->dbName(), IncidentType::EndInputFile ) );
191  sc = firstOfNextStream( true, *pIt );
192  if ( sc.isSuccess() ) sc = next( *pIt );
193  } else {
194  pIt->increaseCounters( false );
195  pIt->set( it, 0 );
196  printEvtInfo( pIt );
197  }
198  return sc;
199  } else if ( m_reconfigure ) {
200  StatusCode sc = firstOfNextStream( false, *pIt );
201  printEvtInfo( pIt );
202  return sc;
203  }
204  } else if ( m_reconfigure ) {
205  StatusCode sc = firstOfNextStream( false, *pIt );
206  printEvtInfo( pIt );
207  return sc;
208  }
209  pIt->increaseCounters( false );
210  }
211  printEvtInfo( pIt );
212  return StatusCode::FAILURE;
213 }
214 
216 StatusCode EventSelector::previous( Context& refCtxt ) const { return previous( refCtxt, 1 ); }
217 
219 StatusCode EventSelector::previous( Context& refCtxt, int jump ) const {
220  EvtSelectorContext* pIt = dynamic_cast<EvtSelectorContext*>( &refCtxt );
221  if ( pIt && jump > 0 ) {
223  for ( int i = 0; i < jump && sc.isSuccess(); ++i ) {
224  const EventSelectorDataStream* s = m_streamtool->getStream( pIt->ID() );
225  Context* it = pIt->context();
226  IEvtSelector* sel = s->selector();
227  if ( it && sel ) { // First exploit the current stream
228  // This stream is empty: advance to the next stream
229  sc = sel->previous( *it ); // This stream is empty: advance to the next stream
230  if ( !sc.isSuccess() ) {
231  sc = lastOfPreviousStream( true, *pIt );
232  } else {
233  pIt->increaseCounters( false );
234  pIt->set( it, 0 );
235  }
236  printEvtInfo( pIt );
237  if ( !sc.isSuccess() ) { return sc; }
238  }
239  pIt->increaseCounters( false );
240  }
241  return sc;
242  }
243  printEvtInfo( pIt );
244  return StatusCode::FAILURE;
245 }
246 
248 StatusCode EventSelector::last( Context& refCtxt ) const {
249  EvtSelectorContext* pIt = dynamic_cast<EvtSelectorContext*>( &refCtxt );
250  if ( pIt ) {}
251  return StatusCode::FAILURE;
252 }
253 
255 StatusCode EventSelector::rewind( Context& refCtxt ) const {
256  EvtSelectorContext* ctxt = dynamic_cast<EvtSelectorContext*>( &refCtxt );
257  if ( ctxt ) {
258  ctxt->set( 0, -1, 0, 0 );
259  firstOfNextStream( true, *ctxt );
260  long nskip = m_firstEvent;
261  while ( --nskip > 0 ) {
262  StatusCode sc = next( *ctxt );
263  if ( sc.isFailure() ) {
264  error() << "rewind() failed to start with event number " << m_firstEvent << endmsg;
265  return StatusCode::FAILURE;
266  }
267  }
268  return StatusCode::SUCCESS;
269  }
270  return StatusCode::FAILURE;
271 }
272 
274 StatusCode EventSelector::createAddress( const Context& refCtxt, IOpaqueAddress*& refpAddr ) const {
275  const EvtSelectorContext* cpIt = dynamic_cast<const EvtSelectorContext*>( &refCtxt );
276  EvtSelectorContext* pIt = const_cast<EvtSelectorContext*>( cpIt );
277  refpAddr = nullptr;
278  if ( pIt ) {
279  const EventSelectorDataStream* s = m_streamtool->getStream( pIt->ID() );
280  Context* it = pIt->context();
281  IEvtSelector* sel = s->selector();
282  if ( it && sel ) {
283  IOpaqueAddress* pAddr = nullptr;
284  StatusCode sc = sel->createAddress( *it, pAddr );
285  if ( sc.isSuccess() ) refpAddr = pAddr;
286  pIt->set( it, pAddr );
287  return sc;
288  }
289  }
290  return StatusCode::FAILURE;
291 }
292 
293 // Release existing event iteration context
294 StatusCode EventSelector::releaseContext( Context*& refCtxt ) const {
295  const EvtSelectorContext* cpIt = dynamic_cast<const EvtSelectorContext*>( refCtxt );
297  if ( pIt && pIt->ID() >= 0 && pIt->ID() < (long)m_streamtool->size() ) {
298  const EventSelectorDataStream* s = m_streamtool->getStream( pIt->ID() );
299  Context* it = pIt->context();
300  IEvtSelector* sel = s->selector();
301  if ( it && sel ) {
302  StatusCode sc = sel->releaseContext( it );
303  if ( sc.isSuccess() ) {
304  refCtxt = nullptr;
305  return sc;
306  }
307  }
308  }
309  return StatusCode::SUCCESS;
310 }
311 
314  // Initialize base class
315  StatusCode status = Service::initialize();
316  if ( !status.isSuccess() ) {
317  error() << "Error initializing base class Service!" << endmsg;
318  return status;
319  }
320  // Get the references to the services that are needed by the ApplicationMgr itself
321  m_incidentSvc = serviceLocator()->service( "IncidentSvc" );
322  if ( !m_incidentSvc ) {
323  fatal() << "Error retrieving IncidentSvc." << endmsg;
324  return StatusCode::FAILURE;
325  }
326  if ( m_evtMax != INT_MAX ) {
327  error() << "EvtMax is an obsolete property of the event selector." << endmsg;
328  error() << "Please set \"ApplicationMgr.EvtMax = " << m_evtMax << ";\" to process the requested number of events."
329  << endmsg;
330  return StatusCode::FAILURE;
331  }
332 
333  m_toolSvc = serviceLocator()->service( "ToolSvc" );
334  if ( !m_toolSvc ) {
335  error() << " Could not locate the Tool Service! " << endmsg;
336  return StatusCode::FAILURE;
337  }
338  // make sure we finalize _prior_ to ToolSvc... we are about to get a
339  // a pointer to a tool which gets finalized and released by the ToolSvc
340  // during ToolSvc::finalize, and we don't want dangling pointers...
342  auto prio = mgr->getPriority( "ToolSvc" );
343  mgr->setPriority( name(), prio + 1 ).ignore();
344 
346 
347  if ( status.isFailure() ) {
348  error() << "Error initializing " << m_streamManager << endmsg;
349  return status;
350  }
351 
352  status = m_streamtool->clear();
353  if ( status.isFailure() ) {
354  // Message already printed by the tool
355  return status;
356  }
357 
359 
361 
362  m_streamID = 0;
363 
364  return status;
365 }
366 
367 // Re-initialize
370  error() << "Cannot reinitialize: service not in state initialized" << endmsg;
371  return StatusCode::FAILURE;
372  }
373 
374  if ( m_streamSpecsLast != m_streamSpecs ) {
375  StatusCode status = m_streamtool->clear();
376  if ( status.isFailure() ) return status;
378  m_reconfigure = true;
380  }
381 
382  return StatusCode::SUCCESS;
383 }
384 
385 //
387 
388  if ( msgLevel( MSG::DEBUG ) ) { debug() << "finalize()" << endmsg; }
389 
390  m_incidentSvc = nullptr;
391 
392  if ( m_streamtool ) {
393  if ( m_toolSvc ) {
395  } else {
396  // It should not be possible to get here
398  }
399  m_streamtool = nullptr;
400  }
401  m_toolSvc.reset();
402 
403  return Service::finalize();
404 }
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:63
StatusCode createContext(Context *&refpCtxt) const override
Create a new event loop context.
bool isInitialized() const
Check initialization status.
StatusCode initialize() override
Definition: Service.cpp:60
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:274
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:164
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
Definition: StatusCode.h:267
IDataStreamTool * m_streamtool
Definition: EventSelector.h:67
IEvtSelector * selector() const
Retrieve event selector object.
sel
Definition: IOTest.py:93
long int m_streamID
Definition: EventSelector.h:59
constexpr static const auto SUCCESS
Definition: StatusCode.h:85
virtual void printEvtInfo(const EvtSelectorContext *iter) const
Progress report.
STL namespace.
const StatusCode & setChecked(bool checked=true) const
Check/uncheck StatusCode.
Definition: StatusCode.h:143
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
Definition: StatusCode.h:130
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:138
virtual int getPriority(const std::string &name) const =0
StreamSpecs m_streamSpecsLast
Input stream specifiers (last used)
Definition: EventSelector.h:72
#define DECLARE_COMPONENT(type)
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:76
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
Gaudi::Property< int > m_evtPrintFrequency
Definition: EventSelector.h:82
virtual void fireIncident(const Incident &incident)=0
Fire an Incident.
Gaudi::Property< std::string > m_streamManager
Definition: EventSelector.h:83
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:50
virtual EventSelectorDataStream * getStream(size_type)=0
Gaudi::Property< int > m_evtMax
Definition: EventSelector.h:81
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:79
Gaudi::Property< int > m_firstEvent
Definition: EventSelector.h:80
virtual StatusCode releaseContext(Context *&) const =0
Release the Context object.
long numStreamEvent() const
Access counter within stream.
Definition: EventIterator.h:93
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:65
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:55
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.
const StatusCode & ignore() const
Ignore/check StatusCode.
Definition: StatusCode.h:153
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:89
string s
Definition: gaudirun.py:312
Gaudi::StateMachine::State FSMState() const override
Definition: Service.h:52
constexpr static const auto FAILURE
Definition: StatusCode.h:86
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:72
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:86
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:70
Opaque address interface definition.
MsgStream & fatal() const
shortcut for the method msgStream(MSG::FATAL)
virtual StatusCode getNextStream(const EventSelectorDataStream *&, size_type &)=0
long numEvent() const
Access counter.
Definition: EventIterator.h:91
MsgStream & always() const
shortcut for the method msgStream(MSG::ALWAYS)
SmartIF< ISvcLocator > & serviceLocator() const override
Retrieve pointer to service locator.
Definition: Service.cpp:277
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:192
StatusCode next(Context &refCtxt) const override
Get next iteration item from the event loop context.
MSG::Level msgLevel() const
get the cached level (originally extracted from the embedded MsgStream)