{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# How to write a Python ROOTBook\n", "
\n", "In order to use [ROOT](root.cern.ch) in a Python notebook, we first need to import the ROOT module. During the import, all notebook related functionalities are activated. That's it. \n", "We will see also how the user can mark cells containing C++ statements with the **%%cpp** magic, producing *de facto* multilanguage ROOTBooks." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "data": { "application/javascript": [ "\n", "require(['notebook'],\n", " function() {\n", " IPython.CodeCell.config_defaults.highlight_modes['magic_text/x-c++src'] = {'reg':[/^%%cpp/]};\n", " console.log(\"JupyROOT - %%cpp magic configured\");\n", " }\n", ");\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Welcome to JupyROOT 6.07/07\n" ] } ], "source": [ "import ROOT" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we are ready to use [PyROOT](https://root.cern.ch/how/how-use-pyroot-root-python-bindings), the [ROOT](root.cern.ch) Python bindings. For example, we create a [ROOT histogram](https://root.cern.ch/doc/master/classTH1F.html) and fill it with [random numbers](https://root.cern.ch/doc/master/classTRandom.html) distributed according to a Gaussian." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "h = ROOT.TH1F(\"gauss\",\"Example histogram\",64,-4,4)\n", "h.FillRandom(\"gaus\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, we create a [canvas](https://root.cern.ch/doc/master/classTCanvas.html), the entity which holds graphics primitives." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [], "source": [ "c = ROOT.TCanvas(\"myCanvasName\",\"The Canvas Title\",800,600)\n", "h.Draw()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For the histogram to be displayed in the notebook, we need to draw the canvas." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "c.Draw()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It is not active by default yet, but Javascript visualisation can be activated for testing purposes. The plot below will be interactive: click on it and discover the [JSROOT](https://root.cern.ch/js/) capabilities!" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "\n", "
\n", "
\n", "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%jsroot on\n", "c.Draw()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Before moving forward, let's save our histogram on a file. All ROOT objects can be written to [ROOT files](https://root.cern.ch/doc/master/classTFile.html) out-of-the-box." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [], "source": [ "outputFile = ROOT.TFile(\"output.root\",\"RECREATE\")\n", "h.Write()\n", "outputFile.Close()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's check what is the content of the file with the [*rootls*](https://root.cern.ch/how/how-quickly-inspect-content-file) command line utility" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "TH1F Aug 26 17:34 gauss \"Example histogram\"\n" ] } ], "source": [ "%%bash \n", "rootls -l output.root" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "## Interleave Python with C++: the %%cpp magic\n", "Thanks to ROOT, it is possibile to write cells in C++ within a Python notebook. This can be done using the %%cpp magic. Magics are a feature of Jupyter notebooks and when importing the ROOT module, the %%cpp magic was registered." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "This is a C++ cell\n" ] } ], "source": [ "%%cpp\n", "cout << \"This is a C++ cell\" << endl;" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Not bad. On the other hand, ROOT offers much more than this. Thanks to its [interpreter](https://root.cern.ch/cling) and [type system](https://root.cern.ch/doc/master/classTClass.html), entities such as functions, classes and variables, created in a C++ cell, can be accessed from within Python (and viceversa, partially)." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": true }, "outputs": [], "source": [ "%%cpp\n", "class A{\n", " public:\n", " A(){cout << \"Constructor of A!\" << endl;}\n", "};" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Constructor of A!\n" ] } ], "source": [ "a = ROOT.A()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The Python and C++ worlds are so entangled that we can find back in C++ the entities created in Python. To illustrate this, from within a C++ cell, we are going to fit a function in the gauss histogram displayed above and then re-draw the canvas." ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " FCN=47.4997 FROM MIGRAD STATUS=CONVERGED 53 CALLS 54 TOTAL\n", " EDM=8.44224e-09 STRATEGY= 1 ERROR MATRIX ACCURATE \n", " EXT PARAMETER STEP FIRST \n", " NO. NAME VALUE ERROR SIZE DERIVATIVE \n", " 1 Constant 2.46469e+02 4.31494e+00 1.19094e-02 -2.44811e-05\n", " 2 Mean 1.04782e-02 1.43576e-02 4.87656e-05 -6.34020e-03\n", " 3 Sigma 1.00315e+00 1.03818e-02 9.45504e-06 -2.70309e-02\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%%cpp\n", "gauss->Fit(\"gaus\", \"S\");\n", "myCanvasName->Draw();" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Complete interoperability is possible. Let's move now to the options offered by the %%cpp magic.\n", "## The options of the %%cpp magic\n", "\n", "The %%cpp magic accepts two options: -d and -a. Their documentation can be seen by typing:\n" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": true }, "outputs": [], "source": [ "%%cpp?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A window will appear at the bottom of the page, showing the documentation." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Declaration of functions\n", "\n", "The **-d** option needs to be used when declaring functions: we must to be explicit." ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%%cpp -d\n", "void f() {\n", " cout << \"This is function f\" << endl;\n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As usual, function f can also be accessed from Python." ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "This is again Python\n", "This is function f\n" ] } ], "source": [ "print \"This is again Python\"\n", "ROOT.f()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The implementation of the function can be inspected within a C++ cell:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(void (*)()) Function @0x7f500801f030\n", " at :1:\n", "void f() {\n", " cout << \"This is function f\" << endl;\n", "}\n", "\n" ] } ], "source": [ "%%cpp\n", "f" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Advanced: ACliC\n", "The **-a** allows to compile the cell code with ACLiC. This is not so relevant for performance since the ROOT interpreter just in time compiles the C++ code. Nevertheless, ACLiC is most useful when the automatic creation of dictionaries is required, for example in presence of I/O operations." ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Info in : creating shared library /eos/user/x/xvallspl/SWAN_projects/rootbinder/notebooks/64a4a5eb_C.so\n" ] } ], "source": [ "%%cpp -a\n", "class CompileMe {\n", "public:\n", " CompileMe() {}\n", " void run() {}\n", "};" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's verify that the dictionary is there:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ROOT.TClass.GetClass(\"CompileMe\").HasDictionary()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that the class created previously A has no dictionary." ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ROOT.TClass.GetClass(\"A\").HasDictionary()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.10" } }, "nbformat": 4, "nbformat_minor": 0 }