{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "b0ef2009",
   "metadata": {},
   "source": [
    "# df007_snapshot\n",
    "Write ROOT data with RDataFrame.\n",
    "\n",
    "This tutorial shows how to write out datasets in ROOT format using RDataFrame.\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "**Author:** Danilo Piparo (CERN)  \n",
    "<i><small>This notebook tutorial was automatically generated with <a href= \"https://github.com/root-project/root/blob/master/documentation/doxygen/converttonotebook.py\">ROOTBOOK-izer</a> from the macro found in the ROOT repository  on Tuesday, May 19, 2026 at 08:09 PM.</small></i>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "adf770bc",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:09:29.990217Z",
     "iopub.status.busy": "2026-05-19T20:09:29.990060Z",
     "iopub.status.idle": "2026-05-19T20:09:30.990216Z",
     "shell.execute_reply": "2026-05-19T20:09:30.983414Z"
    }
   },
   "outputs": [],
   "source": [
    "import ROOT"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9b18ba47",
   "metadata": {},
   "source": [
    "A simple helper function to fill a test tree: this makes the example stand-alone."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "fbaa997a",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:09:31.008931Z",
     "iopub.status.busy": "2026-05-19T20:09:31.008741Z",
     "iopub.status.idle": "2026-05-19T20:09:31.136441Z",
     "shell.execute_reply": "2026-05-19T20:09:31.133397Z"
    }
   },
   "outputs": [],
   "source": [
    "def fill_tree(treeName, fileName):\n",
    "    df = ROOT.RDataFrame(10000)\n",
    "    df.Define(\"b1\", \"(int) rdfentry_\")\\\n",
    "      .Define(\"b2\", \"(float) rdfentry_ * rdfentry_\").Snapshot(treeName, fileName)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ca667268",
   "metadata": {},
   "source": [
    "We prepare an input tree to run on"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "adac7618",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:09:31.150557Z",
     "iopub.status.busy": "2026-05-19T20:09:31.150419Z",
     "iopub.status.idle": "2026-05-19T20:09:32.916914Z",
     "shell.execute_reply": "2026-05-19T20:09:32.907435Z"
    }
   },
   "outputs": [],
   "source": [
    "fileName = \"df007_snapshot_py.root\"\n",
    "outFileName = \"df007_snapshot_output_py.root\"\n",
    "outFileNameAllColumns = \"df007_snapshot_output_allColumns_py.root\"\n",
    "treeName = \"myTree\"\n",
    "fill_tree(treeName, fileName)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "759f1269",
   "metadata": {},
   "source": [
    "We read the tree from the file and create a RDataFrame"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "65ecb341",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:09:32.919314Z",
     "iopub.status.busy": "2026-05-19T20:09:32.919187Z",
     "iopub.status.idle": "2026-05-19T20:09:33.033496Z",
     "shell.execute_reply": "2026-05-19T20:09:33.033069Z"
    }
   },
   "outputs": [],
   "source": [
    "d = ROOT.RDataFrame(treeName, fileName)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0c6389db",
   "metadata": {},
   "source": [
    "## Select entries\n",
    "We now select some entries in the dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "060c7a50",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:09:33.048352Z",
     "iopub.status.busy": "2026-05-19T20:09:33.048214Z",
     "iopub.status.idle": "2026-05-19T20:09:33.217623Z",
     "shell.execute_reply": "2026-05-19T20:09:33.207016Z"
    }
   },
   "outputs": [],
   "source": [
    "d_cut = d.Filter(\"b1 % 2 == 0\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0e2386d1",
   "metadata": {},
   "source": [
    "## Enrich the dataset\n",
    "Build some temporary columns: we'll write them out"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "8a0877e2",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:09:33.229009Z",
     "iopub.status.busy": "2026-05-19T20:09:33.228883Z",
     "iopub.status.idle": "2026-05-19T20:09:33.370239Z",
     "shell.execute_reply": "2026-05-19T20:09:33.369752Z"
    }
   },
   "outputs": [],
   "source": [
    "getVector_code ='''\n",
    "std::vector<float> getVector (float b2)\n",
    "{\n",
    "   std::vector<float> v;\n",
    "   for (int i = 0; i < 3; i++) v.push_back(b2*i);\n",
    "   return v;\n",
    "}\n",
    "'''\n",
    "ROOT.gInterpreter.Declare(getVector_code)\n",
    "\n",
    "d2 = d_cut.Define(\"b1_square\", \"b1 * b1\") \\\n",
    "          .Define(\"b2_vector\", \"getVector( b2 )\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3fc25773",
   "metadata": {},
   "source": [
    "## Write it to disk in ROOT format\n",
    "We now write to disk a new dataset with one of the variables originally\n",
    "present in the tree and the new variables.\n",
    "The user can explicitly specify the types of the columns as template\n",
    "arguments of the Snapshot method, otherwise they will be automatically\n",
    "inferred."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "9782e53f",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:09:33.372094Z",
     "iopub.status.busy": "2026-05-19T20:09:33.371981Z",
     "iopub.status.idle": "2026-05-19T20:09:34.401806Z",
     "shell.execute_reply": "2026-05-19T20:09:34.380467Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<cppyy.gbl.ROOT.RDF.RResultPtr<ROOT::RDF::RInterface<ROOT::Detail::RDF::RLoopManager> > object at 0x557141898260>"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "d2.Snapshot(treeName, outFileName, \\\n",
    "    [\"b1\", \"b1_square\", \"b2_vector\"])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3a893dad",
   "metadata": {},
   "source": [
    "Open the new file and list the columns of the tree"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "e0cdafb0",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:09:34.415187Z",
     "iopub.status.busy": "2026-05-19T20:09:34.415039Z",
     "iopub.status.idle": "2026-05-19T20:09:34.582907Z",
     "shell.execute_reply": "2026-05-19T20:09:34.582582Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "These are the columns b1, b1_square and b2_vector:\n",
      "Branch: b1\n",
      "Branch: b1_square\n",
      "Branch: b2_vector\n"
     ]
    }
   ],
   "source": [
    "f1 = ROOT.TFile(outFileName)\n",
    "t = f1[treeName]\n",
    "print(\"These are the columns b1, b1_square and b2_vector:\")\n",
    "for branch in t.GetListOfBranches():\n",
    "    print(\"Branch: %s\" %branch.GetName())\n",
    "\n",
    "f1.Close()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8e8eadaa",
   "metadata": {},
   "source": [
    "We are not forced to write the full set of column names. We can also\n",
    "specify a regular expression for that. In case nothing is specified, all\n",
    "columns are persistified."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "4c667432",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:09:34.584693Z",
     "iopub.status.busy": "2026-05-19T20:09:34.584556Z",
     "iopub.status.idle": "2026-05-19T20:09:34.847076Z",
     "shell.execute_reply": "2026-05-19T20:09:34.846429Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<cppyy.gbl.ROOT.RDF.RResultPtr<ROOT::RDF::RInterface<ROOT::Detail::RDF::RLoopManager> > object at 0x5571487fe0a0>"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "d2.Snapshot(treeName, outFileNameAllColumns)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e64bf44f",
   "metadata": {},
   "source": [
    "Open the new file and list the columns of the tree"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "86d32ed6",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:09:34.850152Z",
     "iopub.status.busy": "2026-05-19T20:09:34.850027Z",
     "iopub.status.idle": "2026-05-19T20:09:34.954843Z",
     "shell.execute_reply": "2026-05-19T20:09:34.954014Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "These are all the columns available to this dataframe:\n",
      "Branch: b1_square\n",
      "Branch: b2_vector\n",
      "Branch: b1\n",
      "Branch: b2\n"
     ]
    }
   ],
   "source": [
    "f2 = ROOT.TFile(outFileNameAllColumns)\n",
    "t = f2[treeName]\n",
    "print(\"These are all the columns available to this dataframe:\")\n",
    "for branch in t.GetListOfBranches():\n",
    "    print(\"Branch: %s\" %branch.GetName())\n",
    "\n",
    "f2.Close()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7b0d57e3",
   "metadata": {},
   "source": [
    "We can also get a fresh RDataFrame out of the snapshot and restart the\n",
    "analysis chain from it."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "540847a3",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:09:34.956267Z",
     "iopub.status.busy": "2026-05-19T20:09:34.956135Z",
     "iopub.status.idle": "2026-05-19T20:09:36.025645Z",
     "shell.execute_reply": "2026-05-19T20:09:36.024810Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Info in <TCanvas::Print>: png file df007_snapshot.png has been created\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saved figure to df007_snapshot.png\n"
     ]
    }
   ],
   "source": [
    "snapshot_df = d2.Snapshot(treeName, outFileName, [\"b1_square\"]);\n",
    "h = snapshot_df.Histo1D(\"b1_square\")\n",
    "\n",
    "c = ROOT.TCanvas()\n",
    "h.Draw()\n",
    "c.SaveAs(\"df007_snapshot.png\")\n",
    "\n",
    "print(\"Saved figure to df007_snapshot.png\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c79b1edb",
   "metadata": {},
   "source": [
    "Draw all canvases "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "623c03e5",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:09:36.027115Z",
     "iopub.status.busy": "2026-05-19T20:09:36.026980Z",
     "iopub.status.idle": "2026-05-19T20:09:36.201123Z",
     "shell.execute_reply": "2026-05-19T20:09:36.200299Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "\n",
       "<div id=\"root_plot_1779221376190\" style=\"width: 700px; height: 500px; position: relative\">\n",
       "</div>\n",
       "\n",
       "</div>\n",
       "<script>\n",
       "   function process_root_plot_1779221376190() {\n",
       "      function execCode(Core) {\n",
       "         Core.settings.HandleKeys = false;\n",
       "         \n",
       "Core.unzipJSON(21980,'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').then(json => {\n",
       "   const obj = Core.parse(json);\n",
       "   Core.draw('root_plot_1779221376190', obj, '');\n",
       "});\n",
       "\n",
       "      }\n",
       "      const servers = ['/static/', 'https://root.cern/js/7.11.0/', 'https://jsroot.gsi.de/7.11.0/'],\n",
       "            path = 'build/jsroot';\n",
       "      if (typeof JSROOT !== 'undefined')\n",
       "         execCode(JSROOT);\n",
       "      else if (typeof requirejs !== 'undefined') {\n",
       "         servers.forEach((s,i) => { servers[i] = s + path; });\n",
       "         requirejs.config({ paths: { 'jsroot' : servers } })(['jsroot'],  execCode);\n",
       "      } else {\n",
       "         const config = document.getElementById('jupyter-config-data');\n",
       "         if (config)\n",
       "            servers[0] = (JSON.parse(config.innerHTML || '{}')?.baseUrl || '/') + 'static/';\n",
       "         else\n",
       "            servers.shift();\n",
       "         function loadJsroot() {\n",
       "            return !servers.length ? 0 : import(servers.shift() + path + '.js').catch(loadJsroot).then(() => execCode(JSROOT));\n",
       "         }\n",
       "         loadJsroot();\n",
       "      }\n",
       "   }\n",
       "   process_root_plot_1779221376190();\n",
       "</script>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from ROOT import gROOT \n",
    "gROOT.GetListOfCanvases().Draw()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
