Gaudi Framework, version v21r10p1

Home   Generated: 29 Jul 2010

EventSelector.cpp

Go to the documentation of this file.
00001 // $Id: EventSelector.cpp,v 1.46 2008/10/30 18:01:03 marcocle Exp $
00002 
00003 // Include files
00004 #include "GaudiKernel/xtoa.h"
00005 #include "GaudiKernel/SmartIF.h"
00006 #include "GaudiKernel/Incident.h"
00007 #include "GaudiKernel/SvcFactory.h"
00008 #include "GaudiKernel/Tokenizer.h"
00009 #include "GaudiKernel/MsgStream.h"
00010 #include "GaudiKernel/IIncidentSvc.h"
00011 #include "GaudiKernel/ISvcLocator.h"
00012 #include "GaudiKernel/ISvcManager.h"
00013 #include "GaudiKernel/IToolSvc.h"
00014 #include "GaudiKernel/IDataStreamTool.h"
00015 #include "GaudiKernel/IAddressCreator.h"
00016 #include "GaudiKernel/PropertyMgr.h"
00017 #include "GaudiKernel/EventSelectorDataStream.h"
00018 #include "GaudiKernel/AppReturnCode.h"
00019 
00020 #include "EventSelector.h"
00021 #include "EventIterator.h"
00022 #include <climits>
00023 
00024 DECLARE_SERVICE_FACTORY(EventSelector)
00025 
00026 // Standard constructor
00027 EventSelector::EventSelector(const std::string& name, ISvcLocator* svcloc )
00028   : base_class( name, svcloc)
00029 {
00030   m_incidentSvc       = 0;
00031   m_toolSvc           = 0;
00032   m_streamCount       = 0;
00033   m_firstEvent        = 0;
00034   m_evtPrintFrequency = 10;
00035   m_evtMax            = INT_MAX;
00036   declareProperty( "Input",      m_streamSpecs);
00037   declareProperty( "FirstEvent", m_firstEvent);
00038   declareProperty( "EvtMax",     m_evtMax);
00039   declareProperty( "PrintFreq",  m_evtPrintFrequency);
00040   declareProperty( "StreamManager",  m_streamManager="DataStreamTool");
00041   m_reconfigure = false;
00042 }
00043 
00044 // Standard destructor
00045 EventSelector::~EventSelector()
00046 {
00047 }
00048 
00049 StatusCode
00050 EventSelector::resetCriteria(const std::string& /* criteria */,
00051                              Context&           /* context  */)  const
00052 {
00053   return StatusCode::FAILURE;
00054 }
00055 
00056 // Progress report
00057 void EventSelector::printEvtInfo(const EvtSelectorContext* iter) const {
00058   if ( 0 != iter )  {
00059     long count = iter->numEvent();
00060     // Print an message every m_evtPrintFrequency events
00061     if ( 0 == iter->context() )   {
00062       MsgStream log(msgSvc(), name());
00063       log << MSG::INFO << "End of event input reached." << endmsg;
00064     }
00065     else if( iter->numStreamEvent() == -1 ) {
00066       // Intial value for this stream
00067     }
00068     else if( m_evtPrintFrequency != -1 && (count % m_evtPrintFrequency == 0))   {
00069       MsgStream log(msgSvc(), name());
00070       log << MSG::ALWAYS << "Reading Event record " << count+1
00071           << ". Record number within stream " << iter->ID()+1
00072           << ": " << iter->numStreamEvent()+1 << endmsg;
00073     }
00074   }
00075   else  {
00076     MsgStream log(msgSvc(), name());
00077     log << MSG::INFO << "End of event input reached." << endmsg;
00078   }
00079 }
00080 
00081 // IEvtSelector::first()
00082 StatusCode
00083 EventSelector::firstOfNextStream(bool shutDown, EvtSelectorContext& iter) const {
00084   StatusCode status = StatusCode::SUCCESS;
00085   IDataStreamTool::size_type iter_id = (m_reconfigure) ? 0 : iter.ID()+1;
00086   if ( m_reconfigure ) const_cast<EventSelector*>(this)->m_reconfigure = false;
00087   if ( shutDown )   {
00088     if ( iter.ID() >= 0 && iter.ID() < (long)m_streamtool->size() )   {
00089       const EventSelectorDataStream* s = m_streamtool->getStream(iter.ID());
00090       if ( s->isInitialized() )    {
00091         EventSelector* thisPtr = const_cast<EventSelector*>(this);
00092         if ( s->selector() && iter.context() )  {
00093           Context* ctxt = iter.context();
00094           s->selector()->releaseContext(ctxt).ignore();
00095           iter.set(0,0);
00096         }
00097         status = thisPtr->m_streamtool->finalizeStream(const_cast<EventSelectorDataStream*>(s));
00098         iter.set(0,0);
00099       }
00100     }
00101   }
00102 
00103   const EventSelectorDataStream* s ;
00104   status = m_streamtool->getNextStream( s , iter_id );
00105 
00106   if ( status.isSuccess() )   {
00107 
00108     if ( !s->isInitialized() )    {
00109       EventSelector* thisPtr = const_cast<EventSelector*>(this);
00110       status = thisPtr->m_streamtool->initializeStream(const_cast<EventSelectorDataStream*>(s));
00111     }
00112 
00113     if ( status.isSuccess() ) {
00114       const IEvtSelector* sel = s->selector();
00115       if ( sel )    {
00116         Context* ctxt = 0;
00117         status = sel->createContext(ctxt);
00118         if ( status.isSuccess() )   {
00119           status = sel->resetCriteria(s->criteria(), *ctxt);
00120           if ( status.isSuccess() )   {
00121             MsgStream log(msgSvc(), name());
00122             iter.set(this, iter_id, ctxt, 0);
00123             log << MSG::INFO << *s << endmsg;
00124             m_incidentSvc->fireIncident(Incident(s->dbName(),IncidentType::BeginInputFile));
00125             return StatusCode::SUCCESS;
00126           }
00127         }
00128       }
00129     }
00130     if(s!=NULL) {
00131       m_incidentSvc->fireIncident(Incident(s->dbName(),IncidentType::FailInputFile));
00132       // Set the return code to 2
00133       SmartIF<IProperty> appmgr(serviceLocator());
00134       Gaudi::setAppReturnCode(appmgr, 2).ignore();
00135     }
00136   }
00137 
00138   iter.set(this, -1, 0, 0);
00139   status.setChecked();
00140   //m_incidentSvc->fireIncident(Incident(s->dbName(),IncidentType::FailInputFile));
00141   return StatusCode::FAILURE;
00142 }
00143 
00144 // IEvtSelector::first()
00145 StatusCode
00146 EventSelector::lastOfPreviousStream(bool shutDown, EvtSelectorContext& iter) const {
00147   StatusCode status = StatusCode::SUCCESS;
00148   if ( shutDown )   {
00149     if ( iter.ID() >= 0 && iter.ID() < (long)m_streamtool->size() )   {
00150       const EventSelectorDataStream* s = m_streamtool->getStream(iter.ID());
00151       if ( s->isInitialized() )    {
00152         EventSelector* thisPtr = const_cast<EventSelector*>(this);
00153         if ( s->selector() && iter.context() )  {
00154           Context* ctxt = iter.context();
00155           s->selector()->releaseContext(ctxt);
00156           iter.set(0,0);
00157         }
00158         status = thisPtr->m_streamtool->finalizeStream(const_cast<EventSelectorDataStream*>(s));
00159         iter.set(0,0);
00160       }
00161     }
00162   }
00163 
00164   IDataStreamTool::size_type iter_id = iter.ID()-1;
00165   const EventSelectorDataStream* s ;
00166   status = m_streamtool->getPreviousStream( s , iter_id );
00167 
00168   if ( status.isSuccess() )   {
00169 
00170     if ( !s->isInitialized() )    {
00171       EventSelector* thisPtr = const_cast<EventSelector*>(this);
00172       status = thisPtr->m_streamtool->initializeStream(const_cast<EventSelectorDataStream*>(s));
00173     }
00174     if ( status.isSuccess() )   {
00175       const IEvtSelector* sel = s->selector();
00176       if ( sel )  {
00177         Context* ctxt = 0;
00178         status = sel->createContext(ctxt);
00179         if ( status.isSuccess() )   {
00180           status = sel->resetCriteria(s->criteria(), *ctxt);
00181           if ( status.isSuccess() )   {
00182             MsgStream log(msgSvc(), name());
00183             iter.set(this, iter_id, ctxt, 0);
00184             log << MSG::INFO << *s << endmsg;
00185             return StatusCode::SUCCESS;
00186           }
00187         }
00188       }
00189     }
00190   }
00191 
00192   iter.set(this, -1, 0, 0);
00193   return StatusCode::FAILURE;
00194 }
00195 
00197 StatusCode EventSelector::createContext(Context*& refpCtxt) const
00198 {
00199   // Max event is zero. Return begin = end
00200   refpCtxt = 0;
00201   if ( m_firstEvent < 0 ) {
00202     MsgStream log(msgSvc(), name());
00203     log << MSG::ERROR  << "First Event = " << m_firstEvent << " not valid" << endmsg;
00204     log << MSG::ERROR  << "It should be > 0 " << endmsg;
00205     return StatusCode::FAILURE;    // if failure => iterators = end();
00206   }
00207   EvtSelectorContext* ctxt = new EvtSelectorContext(this);
00208   ctxt->set(0, -1, 0, 0);
00209   firstOfNextStream(true, *ctxt).ignore();
00210   refpCtxt = ctxt;
00211   long nskip = m_firstEvent;
00212   while( --nskip > 0 )    {
00213     StatusCode sc = next(*refpCtxt);
00214     if ( sc.isFailure() ) {
00215       MsgStream log(msgSvc(), name());
00216       log << MSG::ERROR << " createContext() failed to start with event number "
00217           << m_firstEvent << endmsg;
00218       releaseContext(refpCtxt);
00219       refpCtxt = 0;
00220       return StatusCode::FAILURE;
00221     }
00222   }
00223   return StatusCode::SUCCESS;
00224 }
00225 
00227 StatusCode EventSelector::next(Context& refCtxt) const  {
00228   return next(refCtxt, 1);
00229 }
00230 
00232 StatusCode EventSelector::next(Context& refCtxt, int /* jump */ ) const  {
00233   EvtSelectorContext *pIt  = dynamic_cast<EvtSelectorContext*>(&refCtxt);
00234   if ( pIt )    {
00235     if ( pIt->ID() != -1 ) {
00236       const EventSelectorDataStream* s = m_streamtool->getStream(pIt->ID());
00237       Context* it = pIt->context();
00238       IEvtSelector* sel = s->selector();
00239       if ( it && sel )    { // First exploit the current stream
00240         StatusCode sc = sel->next(*it);  // This stream is empty: advance to the next stream
00241         if ( !sc.isSuccess() )   {
00242           if(s!=NULL) m_incidentSvc->fireIncident(Incident(s->dbName(),IncidentType::EndInputFile));
00243           sc = firstOfNextStream(true, *pIt);
00244           if (sc.isSuccess() ) sc = next(*pIt);
00245         }
00246         else  {
00247           pIt->increaseCounters(false);
00248           pIt->set(it, 0);
00249           printEvtInfo(pIt);
00250         }
00251         return sc;
00252       }
00253       else if ( m_reconfigure )  {
00254         StatusCode sc = firstOfNextStream(false, *pIt);
00255         printEvtInfo(pIt);
00256         return sc;
00257       }
00258     }
00259     else if ( m_reconfigure )  {
00260       StatusCode sc = firstOfNextStream(false, *pIt);
00261       printEvtInfo(pIt);
00262       return sc;
00263     }
00264     pIt->increaseCounters(false);
00265   }
00266   printEvtInfo(pIt);
00267   return StatusCode::FAILURE;
00268 }
00269 
00271 StatusCode EventSelector::previous(Context& refCtxt) const  {
00272   return previous(refCtxt, 1);
00273 }
00274 
00276 StatusCode EventSelector::previous(Context& refCtxt, int jump) const  {
00277   EvtSelectorContext *pIt  = dynamic_cast<EvtSelectorContext*>(&refCtxt);
00278   if ( pIt && jump > 0 )    {
00279     StatusCode sc = StatusCode::SUCCESS;
00280     for ( int i = 0; i < jump && sc.isSuccess(); ++i ) {
00281       const EventSelectorDataStream* s = m_streamtool->getStream(pIt->ID());
00282       Context* it = pIt->context();
00283       IEvtSelector* sel = s->selector();
00284       if ( it && sel )    { // First exploit the current stream
00285                             // This stream is empty: advance to the next stream
00286         sc = sel->previous(*it);  // This stream is empty: advance to the next stream
00287         if ( !sc.isSuccess() )   {
00288           sc = lastOfPreviousStream(true, *pIt);
00289         }
00290         else  {
00291           pIt->increaseCounters(false);
00292           pIt->set(it, 0);
00293         }
00294         printEvtInfo(pIt);
00295         if ( !sc.isSuccess() ) {
00296           return sc;
00297         }
00298       }
00299       pIt->increaseCounters(false);
00300     }
00301     return sc;
00302   }
00303   printEvtInfo(pIt);
00304   return StatusCode::FAILURE;
00305 }
00306 
00308 StatusCode EventSelector::last(Context& refCtxt) const {
00309   EvtSelectorContext *pIt  = dynamic_cast<EvtSelectorContext*>(&refCtxt);
00310   if ( pIt )    {
00311   }
00312   return StatusCode::FAILURE;
00313 }
00314 
00316 StatusCode EventSelector::rewind(Context& refCtxt) const  {
00317   EvtSelectorContext *ctxt  = dynamic_cast<EvtSelectorContext*>(&refCtxt);
00318   if ( ctxt )    {
00319     ctxt->set(0, -1, 0, 0);
00320     firstOfNextStream(true, *ctxt);
00321     long nskip = m_firstEvent;
00322     while( --nskip > 0 )    {
00323       StatusCode sc = next(*ctxt);
00324       if ( sc.isFailure() ) {
00325         MsgStream log(msgSvc(), name());
00326         log << MSG::ERROR << "rewind() failed to start with event number "
00327             << m_firstEvent << endmsg;
00328         return StatusCode::FAILURE;
00329       }
00330     }
00331     return StatusCode::SUCCESS;
00332   }
00333   return StatusCode::FAILURE;
00334 }
00335 
00337 StatusCode
00338 EventSelector::createAddress(const Context&   refCtxt,
00339                              IOpaqueAddress*& refpAddr) const
00340 {
00341   const EvtSelectorContext *cpIt  = dynamic_cast<const EvtSelectorContext*>(&refCtxt);
00342   EvtSelectorContext *pIt  = const_cast<EvtSelectorContext*>(cpIt);
00343   refpAddr = 0;
00344   if ( pIt )    {
00345     const EventSelectorDataStream* s = m_streamtool->getStream(pIt->ID());
00346     Context* it = pIt->context();
00347     IEvtSelector* sel = s->selector();
00348     if ( it && sel )    {
00349       IOpaqueAddress* pAddr = 0;
00350       StatusCode sc = sel->createAddress(*it, pAddr);
00351       if ( sc.isSuccess() )  {
00352         refpAddr = pAddr;
00353       }
00354       pIt->set(it, pAddr);
00355       return sc;
00356     }
00357   }
00358   return StatusCode::FAILURE;
00359 }
00360 
00361 // Release existing event iteration context
00362 StatusCode EventSelector::releaseContext(Context*& refCtxt) const  {
00363   const EvtSelectorContext *cpIt = dynamic_cast<const EvtSelectorContext*>(refCtxt);
00364   EvtSelectorContext       *pIt  = const_cast<EvtSelectorContext*>(cpIt);
00365   if ( pIt && pIt->ID() >= 0 && pIt->ID() < (long)m_streamtool->size() ) {
00366     const EventSelectorDataStream* s = m_streamtool->getStream(pIt->ID());
00367     Context* it = pIt->context();
00368     IEvtSelector* sel = s->selector();
00369     if ( it && sel )    {
00370       StatusCode sc = sel->releaseContext(it);
00371       if ( sc.isSuccess() )  {
00372         refCtxt = 0;
00373         delete pIt;
00374         return sc;
00375       }
00376     }
00377   }
00378   if ( pIt )   {
00379     delete pIt;
00380   }
00381   return StatusCode::SUCCESS;
00382 }
00383 
00385 StatusCode EventSelector::initialize()    {
00386   // Initialize base class
00387   StatusCode status = Service::initialize();
00388   MsgStream logger(msgSvc(), name());
00389   if ( !status.isSuccess() )    {
00390     logger << MSG::ERROR << "Error initializing base class Service!" << endmsg;
00391     return status;
00392   }
00393   // Get the references to the services that are needed by the ApplicationMgr itself
00394   m_incidentSvc = serviceLocator()->service("IncidentSvc");
00395   if( !m_incidentSvc.isValid() )  {
00396     logger << MSG::FATAL << "Error retrieving IncidentSvc." << endmsg;
00397     return StatusCode::FAILURE;
00398   }
00399   if ( m_evtMax != INT_MAX )   {
00400     logger << MSG::ERROR << "EvtMax is an obsolete property of the event selector." << endmsg;
00401     logger << MSG::ERROR << "Please set \"ApplicationMgr.EvtMax = " << m_evtMax
00402            << ";\" to process the requested number of events." << endmsg;
00403     return StatusCode::FAILURE;
00404   }
00405 
00406   m_toolSvc = serviceLocator()->service("ToolSvc");
00407   if ( !m_toolSvc.isValid() ) {
00408     logger << MSG::ERROR << " Could not locate the Tool Service! " << endmsg;
00409     return StatusCode::FAILURE;
00410   }
00411 
00412   status = m_toolSvc->retrieveTool(m_streamManager.c_str(), m_streamtool, this);
00413 
00414   if( status.isFailure() ) {
00415     logger << MSG::ERROR << "Error initializing "
00416            << m_streamManager << endmsg;
00417     return status;
00418   }
00419 
00420   status = m_streamtool->clear();
00421   if( status.isFailure() ) {
00422     // Message already printed by the tool
00423     return status;
00424   }
00425 
00426   status = m_streamtool->addStreams(m_streamSpecs);
00427 
00428   m_streamSpecsLast = m_streamSpecs;
00429 
00430   m_streamID          = 0;
00431 
00432   return status;
00433 }
00434 
00435 // Re-initialize
00436 StatusCode EventSelector::reinitialize() {
00437   if ( FSMState() != Gaudi::StateMachine::INITIALIZED ) {
00438     MsgStream logger(msgSvc(), name());
00439     logger << MSG::ERROR << "Cannot reinitialize: service not in state initialized" << endmsg;
00440     return StatusCode::FAILURE;
00441   }
00442 
00443   if( m_streamSpecsLast != m_streamSpecs ) {
00444     StatusCode status = m_streamtool->clear();
00445     if ( status.isFailure() ) return status;
00446     m_streamSpecsLast = m_streamSpecs;
00447     m_reconfigure = true;
00448     return m_streamtool->addStreams(m_streamSpecs);
00449   }
00450 
00451   return StatusCode::SUCCESS;
00452 }
00453 
00454 //
00455 StatusCode EventSelector::finalize()    {
00456 
00457   MsgStream log(msgSvc(), name());
00458 
00459   log << MSG::DEBUG << "finalize()" << endmsg;
00460 
00461   m_incidentSvc = 0;
00462 
00463   if (m_streamtool) {
00464     if (m_toolSvc.isValid()) {
00465       m_toolSvc->releaseTool(m_streamtool).ignore();
00466     } else {
00467       // It should not be possible to get here
00468       m_streamtool->release();
00469     }
00470     m_streamtool = 0;
00471   }
00472 
00473   m_toolSvc = 0;
00474 
00475   return Service::finalize();
00476 }
00477 

Generated at Thu Jul 29 10:12:51 2010 for Gaudi Framework, version v21r10p1 by Doxygen version 1.5.6 written by Dimitri van Heesch, © 1997-2004