Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
pyroot004_NumbaDeclare.py
Go to the documentation of this file.
1## \file
2## \ingroup tutorial_pyroot
3## \notebook -nodraw
4## This tutorial illustrates how PyROOT supports declaring C++ callables from
5## Python callables making them, for example, usable with RDataFrame. The feature
6## uses the numba Python package for just-in-time compilation of the Python callable
7## and supports fundamental types and ROOT::RVec thereof.
8##
9## \macro_code
10## \macro_output
11##
12## \date March 2020
13## \author Stefan Wunsch
14
15import ROOT
16
17# To mark a Python callable to be used from C++, you have to use the decorator
18# provided by PyROOT passing the C++ types of the input arguments and the return
19# value.
20@ROOT.Numba.Declare(['float', 'int'], 'float')
21def pypow(x, y):
22 return x**y
23
24# The Python callable is now available from C++ in the Numba namespace.
25# For example, we can use it from the interpreter.
26ROOT.gInterpreter.ProcessLine('cout << "2^3 = " << Numba::pypow(2, 3) << endl;')
27
28# Or we can use the callable as well within a RDataFrame workflow.
29data = ROOT.RDataFrame(4).Define('x', '(float)rdfentry_')\
30 .Define('x_pow3', 'Numba::pypow(x, 3)')\
31 .AsNumpy()
32
33print('pypow({}, 3) = {}'.format(data['x'], data['x_pow3']))
34
35# ROOT uses the numba Python package to create C++ functions from python ones.
36# We support as input and return types of the callable fundamental types and
37# ROOT::RVec thereof. See the following callable computing the power of the
38# elements in an array.
39@ROOT.Numba.Declare(['RVec<float>', 'int'], 'RVec<float>')
40def pypowarray(x, y):
41 return x**y
42
43ROOT.gInterpreter.ProcessLine('''
44ROOT::RVec<float> x = {0, 1, 2, 3};
45cout << "pypowarray(" << x << ", 3) = " << Numba::pypowarray(x, 3) << endl;
46''')
47
48# and now with RDataFrame
49s = ROOT.RDataFrame(1).Define('x', 'ROOT::RVecF{1,2,3}')\
50 .Define('x2', 'Numba::pypowarray(x, 2)')\
51 .Sum('x2') # 1 + 4 + 9 == 14
52print('sum(pypowarray({ 1, 2, 3 }, 2)) = ', s.GetValue())
ROOT's RDataFrame offers a high level interface for analyses of data stored in TTree,...