Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
PyROOTModule.cxx
Go to the documentation of this file.
1// Author: Enric Tejedor CERN 06/2018
2// Original PyROOT code by Wim Lavrijsen, LBL
3
4/*************************************************************************
5 * Copyright (C) 1995-2018, Rene Brun and Fons Rademakers. *
6 * All rights reserved. *
7 * *
8 * For the licensing terms see $ROOTSYS/LICENSE. *
9 * For the list of contributors see $ROOTSYS/README/CREDITS. *
10 *************************************************************************/
11
12// Bindings
13#include "PyROOTPythonize.h"
14#include "PyROOTStrings.h"
15#include "PyROOTWrapper.h"
16#include "RPyROOTApplication.h"
17#include "FacadeHelpers.hxx"
18
19// Cppyy
20#include "CPyCppyy.h"
21#include "CallContext.h"
22#include "ProxyWrappers.h"
23#include "Utility.h"
24
25// ROOT
26#include "TROOT.h"
27#include "TSystem.h"
28#include "RConfigure.h"
29
30// Standard
31#include <string>
32#include <sstream>
33#include <utility>
34#include <vector>
35
36using namespace CPyCppyy;
37
38namespace PyROOT {
40}
41
42// Methods offered by the interface
43static PyMethodDef gPyROOTMethods[] = {
44 {(char *)"AddDirectoryWritePyz", (PyCFunction)PyROOT::AddDirectoryWritePyz, METH_VARARGS,
45 (char *)"Allow to use seamlessly from Python the templated TDirectory::WriteObject method"},
46 {(char *)"AddCPPInstancePickling", (PyCFunction)PyROOT::AddCPPInstancePickling, METH_VARARGS,
47 (char *)"Add a custom pickling mechanism for Cppyy Python proxy objects"},
48 {(char *)"AddDirectoryGetAttrPyz", (PyCFunction)PyROOT::AddDirectoryGetAttrPyz, METH_VARARGS,
49 (char *)"Attr syntax for TDirectory, TDirectoryFile and TFile"},
50 {(char *)"AddBranchAttrSyntax", (PyCFunction)PyROOT::AddBranchAttrSyntax, METH_VARARGS,
51 (char *)"Allow to access branches as tree attributes"},
52 {(char *)"AddFileOpenPyz", (PyCFunction)PyROOT::AddFileOpenPyz, METH_VARARGS,
53 (char *)"Make TFile::Open a constructor, adjusting for example the reference count"},
54 {(char *)"AddTDirectoryFileGetPyz", (PyCFunction)PyROOT::AddTDirectoryFileGetPyz, METH_VARARGS,
55 (char *)"Get objects inside TDirectoryFile and TFile instantiations"},
56 {(char *)"AddTClassDynamicCastPyz", (PyCFunction)PyROOT::AddTClassDynamicCastPyz, METH_VARARGS,
57 (char *)"Cast the void* returned by TClass::DynamicCast to the right type"},
58 {(char *)"AddTObjectEqNePyz", (PyCFunction)PyROOT::AddTObjectEqNePyz, METH_VARARGS,
59 (char *)"Add equality and inequality comparison operators to TObject"},
60 {(char *)"AddUsingToClass", (PyCFunction)PyROOT::AddUsingToClass, METH_VARARGS,
61 (char *)"Add 'using' overloads for a given method to a class"},
62 {(char *)"SetBranchAddressPyz", (PyCFunction)PyROOT::SetBranchAddressPyz, METH_VARARGS,
63 (char *)"Fully enable the use of TTree::SetBranchAddress from Python"},
64 {(char *)"BranchPyz", (PyCFunction)PyROOT::BranchPyz, METH_VARARGS,
65 (char *)"Fully enable the use of TTree::Branch from Python"},
66 {(char *)"AddSetItemTCAPyz", (PyCFunction)PyROOT::AddSetItemTCAPyz, METH_VARARGS,
67 (char *)"Customize the setting of an item of a TClonesArray"},
68 {(char *)"AddPrettyPrintingPyz", (PyCFunction)PyROOT::AddPrettyPrintingPyz, METH_VARARGS,
69 (char *)"Add pretty printing pythonization"},
70 {(char *)"GetEndianess", (PyCFunction)PyROOT::GetEndianess, METH_NOARGS, (char *)"Get endianess of the system"},
71 {(char *)"AsRVec", (PyCFunction)PyROOT::AsRVec, METH_O, (char *)"Get object with array interface as RVec"},
72#ifdef R__HAS_DATAFRAME
73 {(char *)"AsRTensor", (PyCFunction)PyROOT::AsRTensor, METH_O, (char *)"Get object with array interface as RTensor"},
74 {(char *)"MakeNumpyDataFrame", (PyCFunction)PyROOT::MakeNumpyDataFrameImpl, METH_O,
75 (char *)"Make RDataFrame from dictionary of numpy arrays"},
76#endif
77 {(char *)"InitApplication", (PyCFunction)PyROOT::RPyROOTApplication::InitApplication, METH_VARARGS,
78 (char *)"Initialize interactive ROOT use from Python"},
79 {(char *)"InstallGUIEventInputHook", (PyCFunction)PyROOT::RPyROOTApplication::InstallGUIEventInputHook, METH_NOARGS,
80 (char *)"Install an input hook to process GUI events"},
81 {(char *)"_CPPInstance__expand__", (PyCFunction)PyROOT::CPPInstanceExpand, METH_VARARGS,
82 (char *)"Deserialize a pickled object"},
83 {(char *)"ClearProxiedObjects", (PyCFunction)PyROOT::ClearProxiedObjects, METH_NOARGS,
84 (char *)"Clear proxied objects regulated by PyROOT"},
85 {(char *)"CreateBufferFromAddress", (PyCFunction)PyROOT::CreateBufferFromAddress, METH_O,
86 (char *)"Create a LowLevelView object on the received address"},
87 {NULL, NULL, 0, NULL}};
88
89#define QuoteIdent(ident) #ident
90#define QuoteMacro(macro) QuoteIdent(macro)
91#define LIBROOTPYZ_NAME "libROOTPythonizations" QuoteMacro(PY_MAJOR_VERSION) "_" QuoteMacro(PY_MINOR_VERSION)
92#define LIBCPPYY_NAME "libcppyy" QuoteMacro(PY_MAJOR_VERSION) "_" QuoteMacro(PY_MINOR_VERSION)
93
94#define CONCAT(a, b, c, d) a##b##c##d
95#define LIBROOTPYZ_INIT_FUNCTION(a, b, c, d) CONCAT(a, b, c, d)
96
97#if PY_VERSION_HEX >= 0x03000000
98struct module_state {
99 PyObject *error;
100};
101
102#define GETSTATE(m) ((struct module_state *)PyModule_GetState(m))
103
104static int rootmodule_traverse(PyObject *m, visitproc visit, void *arg)
105{
106 Py_VISIT(GETSTATE(m)->error);
107 return 0;
108}
109
110static int rootmodule_clear(PyObject *m)
111{
112 Py_CLEAR(GETSTATE(m)->error);
113 return 0;
114}
115
116static struct PyModuleDef moduledef = {PyModuleDef_HEAD_INIT, LIBROOTPYZ_NAME, NULL,
117 sizeof(struct module_state), gPyROOTMethods, NULL,
118 rootmodule_traverse, rootmodule_clear, NULL};
119
120/// Initialization of extension module libROOTPythonizations
121
122#define PYROOT_INIT_ERROR return NULL
123LIBROOTPYZ_INIT_FUNCTION(extern "C" PyObject* PyInit_libROOTPythonizations, PY_MAJOR_VERSION, _, PY_MINOR_VERSION) ()
124#else // PY_VERSION_HEX >= 0x03000000
125#define PYROOT_INIT_ERROR return
126LIBROOTPYZ_INIT_FUNCTION(extern "C" void initlibROOTPythonizations, PY_MAJOR_VERSION, _, PY_MINOR_VERSION) ()
127#endif
128{
129 using namespace PyROOT;
130
131 // load commonly used python strings
134
135// setup PyROOT
136#if PY_VERSION_HEX >= 0x03000000
137 gRootModule = PyModule_Create(&moduledef);
138#else
139 gRootModule = Py_InitModule(const_cast<char *>(LIBROOTPYZ_NAME), gPyROOTMethods);
140#endif
141 if (!gRootModule)
143
144 // keep gRootModule, but do not increase its reference count even as it is borrowed,
145 // or a self-referencing cycle would be created
146
147 // Make sure libcppyy has been imported
148 PyImport_ImportModule(LIBCPPYY_NAME);
149
150 // setup PyROOT
151 PyROOT::Init();
152
153 // signal policy: don't abort interpreter in interactive mode
155
156 // inject ROOT namespace for convenience
157 PyModule_AddObject(gRootModule, (char *)"ROOT", CreateScopeProxy("ROOT"));
158
159#if PY_VERSION_HEX >= 0x03000000
160 Py_INCREF(gRootModule);
161 return gRootModule;
162#endif
163}
_object PyObject
#define PYROOT_INIT_ERROR
#define LIBROOTPYZ_INIT_FUNCTION(a, b, c, d)
#define LIBROOTPYZ_NAME
static PyMethodDef gPyROOTMethods[]
#define LIBCPPYY_NAME
#define gROOT
Definition TROOT.h:405
#define _(A, B)
Definition cfortran.h:108
static PyObject * InstallGUIEventInputHook(PyObject *self, PyObject *args)
Install a method hook for sending events to the GUI.
static PyObject * InitApplication(PyObject *self, PyObject *args)
Initialize an RPyROOTApplication.
Set of helper functions that are invoked from the pythonizors, on the Python side.
PyObject * CreateScopeProxy(Cppyy::TCppScope_t)
PyObject * GetEndianess(PyObject *self, PyObject *args)
Get endianess of the system.
PyObject * AddSetItemTCAPyz(PyObject *self, PyObject *args)
Customize the setting of an item of a TClonesArray.
PyObject * AddTObjectEqNePyz(PyObject *self, PyObject *args)
Add pythonization for equality and inequality operators in TObject.
bool CreatePyStrings()
PyObject * MakeNumpyDataFrameImpl(PyObject *self, PyObject *obj)
Make an RDataFrame from a dictionary of numpy arrays.
PyObject * AddTDirectoryFileGetPyz(PyObject *self, PyObject *args)
Add pythonisation of TDirectoryFile::Get()
PyObject * SetBranchAddressPyz(PyObject *self, PyObject *args)
Add pythonization for TTree::SetBranchAddress.
Definition TTreePyz.cxx:196
PyObject * BranchPyz(PyObject *self, PyObject *args)
Add pythonization for TTree::Branch.
Definition TTreePyz.cxx:394
PyObject * ClearProxiedObjects(PyObject *self, PyObject *args)
PyObject * AsRTensor(PyObject *self, PyObject *obj)
Adopt memory of a Python object with array interface using an RTensor.
void Init()
PyObject * AddUsingToClass(PyObject *self, PyObject *args)
Add base class overloads of a given method to a derived class.
PyObject * AddCPPInstancePickling(PyObject *self, PyObject *args)
Set reduce attribute for CPPInstance objects.
PyObject * AddBranchAttrSyntax(PyObject *self, PyObject *args)
Allow branches to be accessed as attributes of a tree.
Definition TTreePyz.cxx:174
PyObject * AddDirectoryWritePyz(PyObject *self, PyObject *args)
Add pythonisation of TDirectory::WriteObject.
PyObject * AddDirectoryGetAttrPyz(PyObject *self, PyObject *args)
Add attr syntax to TDirectory.
PyObject * AsRVec(PyObject *self, PyObject *obj)
Adopt memory of a Python object with array interface using an RVec.
Definition RVecPyz.cxx:29
PyObject * CreateBufferFromAddress(PyObject *self, PyObject *addr)
Get a buffer starting at a given address.
PyObject * CPPInstanceExpand(PyObject *self, PyObject *args)
Deserialize pickled objects.
PyObject * AddTClassDynamicCastPyz(PyObject *self, PyObject *args)
Add pythonization for TClass::DynamicCast.
Definition TClassPyz.cxx:89
PyObject * gRootModule
PyObject * AddPrettyPrintingPyz(PyObject *self, PyObject *args)
Add pretty printing pythonization.
PyObject * AddFileOpenPyz(PyObject *self, PyObject *args)
Make TFile::Open equivalent to a constructor.
Definition TFilePyz.cxx:23
static bool SetGlobalSignalPolicy(bool setProtected)
TMarker m
Definition textangle.C:8