00001
00002
00003
00004 #ifndef GAUDIPYTHON_ALGORITHM_H
00005 #define GAUDIPYTHON_ALGORITHM_H
00006
00007
00008
00009
00010
00011 #include "GaudiKernel/Algorithm.h"
00012 #include "GaudiKernel/Bootstrap.h"
00013
00014
00015
00016 #include "GaudiPython/GaudiPython.h"
00017
00018
00019
00020 #include "Python.h"
00021
00022
00023 namespace GaudiPython
00024 {
00026 StatusCode call_python_method ( PyObject* self , const char* method ) ;
00027 };
00028
00029 namespace GaudiPython
00030 {
00031
00035 class PyAlgorithm : public Algorithm
00036 {
00037 public:
00042 PyAlgorithm
00043 ( PyObject* self ,
00044 const std::string& name ) ;
00045 public:
00046 StatusCode initialize () ;
00047 StatusCode start () ;
00048 StatusCode beginRun () ;
00049 StatusCode endRun () ;
00050 StatusCode execute () ;
00051 StatusCode stop () ;
00052 StatusCode finalize () ;
00053 IAlgorithm* myself() { return this; }
00054 private:
00055 PyObject* m_self;
00056 };
00057
00064 template <class ALGORITHM>
00065 class PyAlg :
00066 public ALGORITHM ,
00067 public virtual IAlgorithm ,
00068 public virtual IProperty
00069 {
00070 public:
00075 PyAlg
00076 ( PyObject* self ,
00077 const std::string& name )
00078 : ALGORITHM ( name , Gaudi::svcLocator() )
00079 , m_self ( self )
00080 {
00081
00082 setProperty ( "TypePrint" , "false" ) ;
00083 setProperty ( "StatPrint" , "true" ) ;
00084
00085
00086
00087 addRef() ;
00088 addRef() ;
00089 }
00090 protected:
00092 virtual ~PyAlg() {}
00093 PyObject* _obj() const { return m_self ; }
00094 public:
00095
00096 virtual StatusCode initialize ()
00097 { return GaudiPython::call_python_method ( m_self , "initialize" ) ; }
00098
00099 virtual StatusCode start ()
00100 { return GaudiPython::call_python_method ( m_self , "start" ) ; }
00101
00102 virtual StatusCode beginRun ()
00103 { return GaudiPython::call_python_method ( m_self , "beginRun" ) ; }
00104 virtual StatusCode endRun ()
00105 { return GaudiPython::call_python_method ( m_self , "endRun" ) ; }
00106
00107 virtual StatusCode execute ()
00108 { return GaudiPython::call_python_method ( m_self , "execute" ) ; }
00109
00110 virtual StatusCode stop ()
00111 { return GaudiPython::call_python_method ( m_self , "stop" ) ; }
00112 virtual StatusCode finalize ()
00113 { return GaudiPython::call_python_method ( m_self , "finalize" ) ; }
00114
00115 virtual IAlgorithm* ialgorithm () { return this ; }
00116 virtual IProperty* iproperty () { return this ; }
00117
00118
00119 virtual StatusCode initialize_ () { return ALGORITHM::initialize () ; }
00120 virtual StatusCode finalize_ () { return ALGORITHM::finalize () ; }
00121
00122 private:
00123
00124 PyAlg() ;
00125
00126 PyAlg ( const PyAlg& );
00127
00128 PyAlg& operator=( const PyAlg& ) ;
00129 private:
00130
00131 PyObject* m_self;
00132 } ;
00133
00134 }
00135
00136
00137
00138
00139 #endif // GAUDIPYTHON_ALGORITHM_H
00140