00001
00002
00003 #ifndef GAUDIKERNEL_ALGORITHM_H
00004 #define GAUDIKERNEL_ALGORITHM_H
00005
00006
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
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
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
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
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