| # Gaudi Framework, version v21r6 |

Home |  | Generated: 11 Nov 2009

# EventSelectorDataStream.cpp

Go to the documentation of this file.

    00001 //====================================================================
    00002 //      EventSelectorDataStream.cpp
    00003 //--------------------------------------------------------------------
    00004 //
    00005 //      Package    : EventSelectorDataStream  (The LHCb Event Selector Package)
    00006 //
    00007 //
    00008 //      Author     : M.Frank
    00009 //      Created    : 4/10/00
    00010 //      Changes    : R. Lambert 2009-09-04
    00011 //
    00012 //====================================================================
    00013 #define GAUDISVC_EVENTSELECTOR_EVENTSELECTORDATASTREAM_CPP 1
    00014 // Include files
    00015 #include "GaudiKernel/Tokenizer.h"
    00016 #include "GaudiKernel/IService.h"
    00017 #include "GaudiKernel/ISvcLocator.h"
    00018 #include "GaudiKernel/IConversionSvc.h"
    00019 #include "GaudiKernel/IDataManagerSvc.h"
    00020 #include "GaudiKernel/IPersistencySvc.h"
    00021 #include "GaudiKernel/PropertyMgr.h"
    00022 #include "GaudiKernel/MsgStream.h"
    00023 #include "GaudiKernel/EventSelectorDataStream.h"
    00024
    00025
    00026 // Output friend
    00027 MsgStream& operator<<(MsgStream& s, const EventSelectorDataStream& obj)    {
    00028   s << "Stream:"   << obj.name() << " Def:" << obj.definition();
    00029   return s;
    00030 }
    00031
    00032 // Output friend
    00033 std::ostream& operator<<(std::ostream& s, const EventSelectorDataStream& obj)    {
    00034   s << "Stream:"   << obj.name() << " Def:" << obj.definition();
    00035   return s;
    00036 }
    00037
    00038 // Standard Constructor
    00039 EventSelectorDataStream::EventSelectorDataStream(const std::string& nam, const std::string& def, ISvcLocator* svcloc)
    00040 : m_pSelector(0),
    00041   m_pSvcLocator(svcloc)
    00042 {
    00043   m_name = nam;
    00044   m_definition = def;
    00045   m_initialized = false;
    00046   m_properties = new Properties();
    00047 }
    00048
    00049 // Standard Constructor
    00050 EventSelectorDataStream::~EventSelectorDataStream()   {
    00051   setSelector(0);
    00052   delete m_properties;
    00053 }
    00054
    00055 // Set selector
    00056 void EventSelectorDataStream::setSelector(IEvtSelector* pSelector)   {
    00057   if ( 0 != pSelector   )  pSelector->addRef();
    00058   if ( 0 != m_pSelector )  m_pSelector->release();
    00059   m_pSelector = pSelector;
    00060 }
    00061
    00062 // Allow access to individual properties by name
    00063 StringProperty* EventSelectorDataStream::property(const std::string& nam)    {
    00064   for ( Properties::iterator i = m_properties->begin(); i != m_properties->end(); i++ )   {
    00065     if ( (*i).name() == nam )    {
    00066       return &(*i);
    00067     }
    00068   }
    00069   return 0;
    00070 }
    00071
    00072 // Allow access to individual properties by name
    00073 const StringProperty* EventSelectorDataStream::property(const std::string& nam)   const  {
    00074   for ( Properties::const_iterator i = m_properties->begin(); i != m_properties->end(); i++ )   {
    00075     if ( (*i).name() == nam )    {
    00076       return &(*i);
    00077     }
    00078   }
    00079   return 0;
    00080 }
    00081
    00082 // Parse input criteria
    00083 StatusCode EventSelectorDataStream::initialize()   {
    00084   bool isData = true;
    00085   std::string auth, dbtyp, item, crit, sel, svc, stmt;
    00086   std::string cnt    = "/Event";
    00087   std::string db     = "<Unknown>";
    00088   Tokenizer tok(true);
    00089
    00090   SmartIF<IDataManagerSvc> eds(m_pSvcLocator->service("EventDataSvc"));
    00091   if( !eds.isValid() ) {
    00092     std::cout << "ERROR: Unable to localize interface IDataManagerSvc from service EventDataSvc"
    00093               << std::endl;
    00094     return StatusCode::FAILURE;
    00095   }
    00096   else {
    00097     cnt = eds->rootName();
    00098   }
    00099   m_selectorType = m_criteria = m_dbName= "";
    00100   m_properties->erase(m_properties->begin(), m_properties->end());
    00101
    00102   tok.analyse(m_definition, " ", "", "", "=", "'", "'");
    00103   for ( Tokenizer::Items::iterator i = tok.items().begin(); i != tok.items().end(); i++ )   {
    00104     long hash = -1;
    00105     const std::string& tag = (*i).tag();
    00106     const std::string& val = (*i).value();
    00107     switch( ::toupper(tag[0]) )    {
    00108     case 'A':
    00109       auth = val;
    00110       break;
    00111     case 'C':
    00112       svc  = "EvtTupleSvc";
    00113       isData = false;
    00114     case 'E':
    00115       hash = val.find('#');
    00116       if ( hash > 0 )   {
    00117         cnt  = val.substr(0,hash);
    00118         item = val.substr(hash+1, val.length()-hash-1);
    00119       }
    00120       else    {
    00121         cnt  = val;
    00122         item = "Address";
    00123       }
    00124       break;
    00125     case 'D':
    00126       m_criteria     = "FILE " + val;
    00127       m_dbName=val;
    00128       break;
    00129     case 'F':
    00130       switch( ::toupper(tag[1]) )    {
    00131       case 'I':
    00132         dbtyp        = "SICB";
    00133         m_criteria   = "FILE " + val;
    00134         m_dbName=val;
    00135         break;
    00136       case 'U':
    00137         stmt = val;
    00138         break;
    00139       default:
    00140         break;
    00141       }
    00142       break;
    00143     case 'J':
    00144       m_criteria     = "JOBID " + val;
    00145       m_dbName=val;
    00146       dbtyp          = "SICB";
    00147       break;
    00148     case 'T':
    00149       switch( ::toupper(tag[1]) )    {
    00150       case 'Y':
    00151         dbtyp = val;
    00152         break;
    00153       case 'A':
    00154         m_criteria   = "TAPE " + val;
    00155         m_dbName=val;
    00156         dbtyp        = "SICB";
    00157         break;
    00158       default:
    00159         break;
    00160       }
    00161       break;
    00162     case 'S':
    00163       switch( ::toupper(tag[1]) )    {
    00164       case 'E':
    00165         sel = val;
    00166         break;
    00167       case 'V':
    00168         svc = val;
    00169         break;
    00170       default:
    00171         break;
    00172       }
    00173       break;
    00174     default:
    00175       m_properties->push_back(StringProperty(tag,val));
    00176       break;
    00177     }
    00178   }
    00179   if ( !isData )    { // Unfortunately options do not come in order...
    00180     m_selectorType = "EventCollectionSelector";
    00181   }
    00182   else if ( dbtyp == "SICB" )    {
    00183     m_selectorType = "SicbEventSelector";
    00184   }
    00185   else if ( dbtyp.substr(0,4) == "POOL" )    {
    00186     m_selectorType = "PoolDbEvtSelector";
    00187   }
    00188   else if ( svc.empty() ) {
    00189     m_selectorType = "DbEvtSelector";
    00190   }
    00191   else  {
    00192     m_selectorType = svc;
    00193   }
    00194   StatusCode status = StatusCode::SUCCESS;
    00195   if ( svc.length() == 0 && dbtyp.length() != 0 )    {
    00196     SmartIF<IPersistencySvc> ipers(m_pSvcLocator->service("EventPersistencySvc"));
    00197     if ( ipers.isValid() )   {
    00198       IConversionSvc* icnvSvc = 0;
    00199       status = ipers->getService(dbtyp, icnvSvc);
    00200       if ( status.isSuccess() )   {
    00201         IService* isvc = 0;
    00202         status = icnvSvc->queryInterface(IService::interfaceID(), pp_cast<void>(&isvc));
    00203         if ( status.isSuccess() )   {
    00204           svc = isvc->name();
    00205           isvc->release();
    00206         }
    00207       }
    00208     }
    00209   }
    00210   m_properties->push_back( StringProperty("Function",      stmt));
    00211   m_properties->push_back( StringProperty("CnvService",    svc));
    00212   m_properties->push_back( StringProperty("Authentication",auth));
    00213   m_properties->push_back( StringProperty("Container",     cnt));
    00214   m_properties->push_back( StringProperty("Item",          item));
    00215   m_properties->push_back( StringProperty("Criteria",      sel));
    00216   m_properties->push_back( StringProperty("DbType",        dbtyp));
    00217   m_properties->push_back( StringProperty("DB",            m_criteria));
    00218   m_initialized = status.isSuccess();
    00219   return status;
    00220 }
    00221
    00222 // Parse input criteria
    00223 StatusCode EventSelectorDataStream::finalize()   {
    00224   setSelector(0);
    00225   if ( m_properties )  {
    00226     m_properties->clear();
    00227   }
    00228   m_initialized = false;
    00229   return StatusCode::SUCCESS;
    00230 }