72 if ( fPySelf && fPySelf != Py_None )
76 std::string opt = GetOption();
77 std::string::size_type pos = opt.find(
'#' );
78 std::string module = opt.substr( 0, pos );
79 std::string user = (pos == std::string::npos) ?
"" : opt.substr( pos+1, std::string::npos );
84 SetOption( user.c_str() );
88 Abort(
"failed to load provided python module" );
93 PyObject* tpysel = PyObject_GetAttrString(
94 PyImport_AddModule( const_cast< char* >(
"libPyROOT" ) ),
95 const_cast< char* >(
"TPySelector" ) );
98 PyObject* pymod = PyImport_AddModule( const_cast< char* >( module.c_str() ) );
101 PyObject* dict = PyModule_GetDict( pymod );
105 PyObject* allvalues = PyDict_Values( dict );
108 for (
int i = 0; i < PyList_GET_SIZE( allvalues ); ++i ) {
109 PyObject* value = PyList_GET_ITEM( allvalues, i );
112 if ( PyType_Check( value ) && PyObject_IsSubclass( value, tpysel ) ) {
113 if ( PyObject_RichCompareBool( value, tpysel, Py_NE ) ) {
122 Py_DECREF( allvalues );
127 Abort(
"no TSelector derived class available in provided module" );
132 PyObject*
self = PyObject_Call( pyclass, args, 0 );
134 Py_DECREF( pyclass );
138 if ( ! PyErr_Occurred() )
139 PyErr_SetString( PyExc_RuntimeError,
"could not create python selector" );
146 Py_XDECREF( fPySelf );
165 Py_INCREF( Py_None );
173 PyObject* pymethod = PyObject_GetAttrString(
fPySelf, const_cast< char* >( method ) );
176 result = PyObject_CallFunction( pymethod, const_cast< char* >(
"O" ), pyobject );
178 result = PyObject_CallFunction( pymethod, const_cast< char* >(
"" ) );
183 Py_INCREF( Py_None );
187 Py_XDECREF( pymethod );
205 Py_INCREF( Py_None );
226 if ( result && result != Py_None ) {
230 }
else if ( result == Py_None ) {
264 Py_XDECREF( result );
277 Py_XDECREF( result );
299 Py_XDECREF( result );
314 result =
CallSelf(
"SlaveBegin", pytree );
317 result =
CallSelf(
"SlaveBegin", Py_None );
323 Py_XDECREF( result );
336 Abort(
"no python selector instance available" );
341 const_cast< char* >(
"Process" ), const_cast< char* >(
"L" ), entry );
362 Py_XDECREF( result );
375 Py_XDECREF( result );
383 if ( ! why && PyErr_Occurred() ) {
384 PyObject *pytype = 0, *pyvalue = 0, *pytrace = 0;
385 PyErr_Fetch( &pytype, &pyvalue, &pytrace );
388 PyObject* pystr = PyObject_Str( pyvalue );
392 PyErr_Restore( pytype, pyvalue, pytrace );
virtual void Abort(const char *why, EAbort what=kAbortProcess)
If no 'why' given, read from python error.
virtual const char * GetName() const
Returns name of object.
virtual Bool_t Notify()
Forward call to derived Notify() if available.
static Bool_t Exec(const char *cmd)
Execute a python statement (e.g. "import ROOT").
virtual Int_t GetEntry(Long64_t entry=0, Int_t getall=0)
Read all branches of entry and return total number of bytes read.
virtual Int_t GetEntry(Long64_t entry, Int_t getall=0)
Boilerplate get entry; same as for generated code; not forwarded.
virtual void Begin(TTree *tree=0)
First function called, and used to setup the python self; forward call.
virtual Int_t Version() const
PyObject * CallSelf(const char *method, PyObject *pyobject=0)
Forward <method> to python.
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString...
virtual void SlaveBegin(TTree *tree)
First function called on worker node, needs to make sure python self is setup, then store the tree to...
virtual Bool_t Process(Long64_t entry)
Actual processing; call is forwarded to python self.
virtual void Init(TTree *tree)
Initialize with the current tree to be used; not forwarded (may be called multiple times...
#define PyROOT_PyUnicode_AsString
virtual TTree * GetTree() const
virtual void SlaveTerminate()
End of client; call is forwarded to python self.
TObject * fObject
! Current object if processing object (vs. TTree)
Bool_t ObjectProxy_Check(T *object)
virtual void Abort(const char *why, EAbort what=kAbortProcess)
Abort processing.
static Bool_t UnregisterObject(TObject *object)
stop tracking <object>, without notification
virtual void Terminate()
End of job; call is forwarded to python self.
TPySelector(TTree *=0, PyObject *self=0)
virtual ~TPySelector()
Destructor. Only deref if still holding on to Py_None (circular otherwise).
typedef void((*Func_t)())
A TTree object has a header with a name and a title.
Bool_t MethodProxy_CheckExact(T *object)
PyObject * BindCppObject(Cppyy::TCppObject_t object, Cppyy::TCppType_t klass, Bool_t isRef=kFALSE)
if the object is a null pointer, return a typed one (as needed for overloading)