| # Gaudi Framework, version v20r3
Generated: 24 Nov 2008

# Algorithm.h

Go to the documentation of this file.

    00001 // $Id: Algorithm.h,v 1.34 2008/06/02 14:20:38 marcocle Exp $
    00002 // ============================================================================
    00003 #ifndef GAUDIKERNEL_ALGORITHM_H
    00004 #define GAUDIKERNEL_ALGORITHM_H
    00005 // ============================================================================
    00006 // Include files
    00007 // ============================================================================
    00008 #include "GaudiKernel/IProperty.h"
    00009 #include "GaudiKernel/IAlgorithm.h"
    00010 #include "GaudiKernel/IService.h"
    00011 #include "GaudiKernel/PropertyMgr.h"
    00012 #include "GaudiKernel/ISvcLocator.h"
    00013 #include "GaudiKernel/IMessageSvc.h"
    00014 #include "GaudiKernel/IStateful.h"
    00015
    00016 #include <string>
    00017 #include <vector>
    00018
    00019 // Extra include files (forward declarations should be sufficient)
    00020 #include "GaudiKernel/IDataProviderSvc.h"
    00021 #include "GaudiKernel/IHistogramSvc.h"
    00022 #include "GaudiKernel/IConversionSvc.h"
    00023 #include "GaudiKernel/INTupleSvc.h"
    00024 #include "GaudiKernel/IChronoStatSvc.h"
    00025 #include "GaudiKernel/IRndmGenSvc.h"
    00026 #include "GaudiKernel/IAuditorSvc.h"
    00027 #include "GaudiKernel/IToolSvc.h"
    00028 #include "GaudiKernel/IMonitorSvc.h"
    00029 #include "GaudiKernel/IExceptionSvc.h"
    00030 #include "GaudiKernel/Property.h"
    00031
    00032 #ifndef PACKAGE_VERSION
    00033 #define PACKAGE_VERSION "unknown"
    00034 #endif
    00035
    00061 class Algorithm : virtual public IAlgorithm,
    00062                   virtual public IProperty,
    00063                   virtual public IStateful {
    00064 public:
    00065
    00070   Algorithm( const std::string& name, ISvcLocator *svcloc,
    00071              const std::string& version=PACKAGE_VERSION );
    00073   virtual ~Algorithm();
    00074
    00080   virtual StatusCode sysStart();
    00081
    00087   virtual StatusCode sysInitialize();
    00088
    00089
    00095   virtual StatusCode sysReinitialize();
    00096
    00101   virtual StatusCode sysRestart();
    00102
    00110   virtual StatusCode sysExecute();
    00111
    00115   virtual StatusCode sysStop();
    00116
    00121   virtual StatusCode sysFinalize();
    00122
    00128   virtual StatusCode sysBeginRun( );
    00129
    00135   virtual StatusCode sysEndRun( );
    00136
    00144   virtual const std::string& name() const;
    00145
    00146   virtual const std::string& version() const;
    00147
    00149   virtual StatusCode configure () { return StatusCode::SUCCESS ; }
    00151   virtual StatusCode terminate () { return StatusCode::SUCCESS ; }
    00152
    00154   virtual StatusCode initialize () { return StatusCode::SUCCESS ; }
    00156   virtual StatusCode start () { return StatusCode::SUCCESS ; }
    00158   virtual StatusCode stop () { return StatusCode::SUCCESS ; }
    00160   virtual StatusCode finalize   () { return StatusCode::SUCCESS ; }
    00161
    00163   virtual StatusCode reinitialize ();
    00165   virtual StatusCode restart ();
    00166
    00168   virtual bool isExecuted( ) const;
    00169
    00171   virtual void setExecuted( bool state );
    00172
    00176   virtual void resetExecuted( );
    00177
    00181   virtual StatusCode beginRun();
    00182
    00184   virtual StatusCode endRun();
    00185
    00187   virtual Gaudi::StateMachine::State FSMState() const { return m_state; }
    00188
    00190   virtual Gaudi::StateMachine::State targetFSMState() const { return m_targetState; }
    00191
    00193   virtual bool isEnabled( ) const;
    00194
    00196   virtual bool filterPassed( ) const;
    00197
    00199   virtual void setFilterPassed( bool state );
    00200
    00202   template <class T>
    00203   StatusCode service
    00204   ( const std::string& name, T*& psvc, bool createIf = true ) const {
    00205     return service_i(name, createIf, T::interfaceID(), (void**)&psvc);
    00206   }
    00207
    00209   template <class T>
    00210   StatusCode service( const std::string& svcType, const std::string& svcName,
    00211                       T*& psvc) const {
    00212     return service_i(svcType, svcName, T::interfaceID(), (void**)&psvc);
    00213   }
    00214
    00216   void setOutputLevel( int level );
    00217
    00221   IAuditorSvc* auditorSvc() const;
    00222
    00226   IChronoStatSvc* chronoSvc() const;
    00228   IChronoStatSvc* chronoStatService() const;
    00229
    00233   IDataProviderSvc* detSvc() const;
    00234
    00236   IDataProviderSvc* detDataService() const;
    00237
    00241   IConversionSvc* detCnvSvc() const;
    00242
    00244   IConversionSvc* detDataCnvService() const;
    00245
    00249   IDataProviderSvc* eventSvc() const;
    00251   IDataProviderSvc* evtSvc  () const { return eventSvc() ; }
    00253   IDataProviderSvc* eventDataService() const;
    00254
    00258   IConversionSvc*   eventCnvSvc() const;
    00260   IConversionSvc*   eventDataCnvService() const;
    00261
    00265   IHistogramSvc* histoSvc() const;
    00267   IHistogramSvc* histogramDataService() const;
    00268
    00273   IMessageSvc*      msgSvc() const;
    00274
    00276   IMessageSvc*      messageService() const;
    00277
    00281   INTupleSvc* ntupleSvc() const;
    00282
    00284   INTupleSvc* ntupleService() const;
    00285
    00289   // IAIDATupleSvc* atupleSvc() const;
    00290
    00291
    00295   IRndmGenSvc* randSvc() const;
    00296
    00298   IToolSvc* toolSvc() const;
    00299
    00301   IExceptionSvc* exceptionSvc() const;
    00302
    00308   ISvcLocator* serviceLocator() const;
    00310   ISvcLocator* svcLoc        () const { return serviceLocator() ; }
    00311
    00324   StatusCode createSubAlgorithm( const std::string& type,
    00325                                  const std::string& name, Algorithm*& pSubAlg );
    00326
    00328   std::vector<Algorithm*>* subAlgorithms() const;
    00329
    00331   virtual StatusCode setProperty( const Property& p );
    00333   virtual StatusCode setProperty( const std::string& s );
    00335   virtual StatusCode setProperty( const std::string& n, const std::string& v);
    00337   virtual StatusCode getProperty(Property* p) const;
    00339   virtual const Property& getProperty( const std::string& name) const;
    00341   virtual StatusCode getProperty( const std::string& n, std::string& v ) const;
    00343   virtual const std::vector<Property*>& getProperties( ) const;
    00344
    00352   StatusCode setProperties();
    00353   // ==========================================================================
    00383   template <class T>
    00384   Property* declareProperty
    00385   ( const std::string& name              ,
    00386     T&                 property          ,
    00387     const std::string& doc      = "none" ) const
    00388   {
    00389     return m_propertyMgr->declareProperty(name, property, doc);
    00390   }
    00391   // ==========================================================================
    00393   Property* declareRemoteProperty
    00394   ( const std::string& name       ,
    00395     IProperty*         rsvc       ,
    00396     const std::string& rname = "" ) const
    00397   {
    00398     return m_propertyMgr -> declareRemoteProperty ( name , rsvc , rname );
    00399   }
    00400   // ==========================================================================
    00410   inline IMonitorSvc* monitorSvc() const
    00411   {
    00412     // If not already located try to locate it without forcing a creation
    00413     if ( !m_pMonitorSvc ){
    00414       service_i( m_monitorSvcName, false,
    00415                  IMonitorSvc::interfaceID(), pp_cast<void>(&m_pMonitorSvc) );
    00416     }
    00417     return m_pMonitorSvc;
    00418   }
    00419
    00425   template <class T>
    00426   void declareInfo( const std::string& name,
    00427                     const T& var,
    00428                     const std::string& desc ) const
    00429   {
    00430     IMonitorSvc* mS = monitorSvc();
    00431     if ( mS ) mS->declareInfo(name, var, desc, this);
    00432   }
    00433
    00441   void declareInfo( const std::string& name,
    00442                     const std::string& format,
    00443                     const void* var,
    00444                     int size,
    00445                     const std::string& desc ) const
    00446   {
    00447     IMonitorSvc* mS = monitorSvc();
    00448     if ( mS ) mS->declareInfo(name, format, var, size, desc, this);
    00449   }
    00450
    00452   unsigned long addRef();
    00454   unsigned long release();
    00456   StatusCode queryInterface(const InterfaceID& riid, void**);
    00457   // ==========================================================================
    00458 public:
    00459   // ==========================================================================
    00501   template <class TYPE>
    00502   StatusCode setProperty
    00503   ( const std::string& name  ,
    00504     const TYPE&        value )
    00505   { return Gaudi::Utils::setProperty ( m_propertyMgr , name , value ) ; }
    00506   // ==========================================================================
    00507 protected:
    00508
    00510   bool isInitialized( ) const { return Gaudi::StateMachine::INITIALIZED == m_state; }
    00511
    00513   bool isFinalized( ) const { return Gaudi::StateMachine::CONFIGURED == m_state; }
    00514
    00516   int  outputLevel() const { return (int)m_outputLevel ; }
    00517
    00519   IntegerProperty & outputLevelProperty() { return m_outputLevel; }
    00520
    00522   void initOutputLevel(Property& prop);
    00523
    00524
    00525 private:
    00526
    00527   long m_refCount;
    00528   std::string m_name;
    00529   std::string m_version;
    00530   std::vector<Algorithm *>* m_subAlgms;
    00531
    00532   mutable IMessageSvc*      m_MS;
    00533   mutable IDataProviderSvc* m_EDS;
    00534   mutable IConversionSvc*   m_ECS;
    00535   mutable IDataProviderSvc* m_DDS;
    00536   mutable IConversionSvc*   m_DCS;
    00537   mutable IHistogramSvc*    m_HDS;
    00538   mutable INTupleSvc*       m_NTS;
    00539   //  mutable IAIDATupleSvc*    m_ATS;      ///< AIDA tuple service
    00540   mutable IChronoStatSvc*   m_CSS;
    00541   mutable IRndmGenSvc*      m_RGS;
    00542   mutable IExceptionSvc*    m_EXS;
    00543   mutable IAuditorSvc*      m_pAuditorSvc;
    00544   mutable IToolSvc*         m_ptoolSvc;
    00545   mutable IMonitorSvc*      m_pMonitorSvc;
    00546   std::string               m_monitorSvcName;
    00547   ISvcLocator* m_pSvcLocator;
    00548   PropertyMgr* m_propertyMgr;
    00549   IntegerProperty m_outputLevel;
    00550   int          m_errorMax;
    00551   int          m_errorCount;
    00552   BooleanProperty m_auditInit;
    00553   bool         m_auditorInitialize;
    00554   bool         m_auditorReinitialize;
    00555   bool         m_auditorRestart;
    00556   bool         m_auditorExecute;
    00557   bool         m_auditorFinalize;
    00558   bool         m_auditorBeginRun;
    00559   bool         m_auditorEndRun;
    00560   bool         m_auditorStart;
    00561   bool         m_auditorStop;
    00562   bool         m_filterPassed;
    00563   bool         m_isEnabled;
    00564   bool         m_isExecuted;
    00565   Gaudi::StateMachine::State m_state;
    00566   Gaudi::StateMachine::State m_targetState;
    00567   bool         m_isFinalized;
    00568
    00570   StatusCode service_i(const std::string& svcName,
    00571                        bool createIf,
    00572                        const InterfaceID& iid,
    00573                        void** ppSvc) const;
    00574   StatusCode service_i(const std::string& svcType,
    00575                        const std::string& svcName,
    00576                        const InterfaceID& iid,
    00577                        void** ppSvc) const;
    00578
    00580   Algorithm(const Algorithm& a);
    00581
    00583   Algorithm& operator=(const Algorithm& rhs);
    00584 };
    00585
    00586 #endif //GAUDIKERNEL_ALGORITHM_H