{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "c8185b74",
   "metadata": {},
   "source": [
    "# distrdf002_dask_connection\n",
    "Configure a Dask connection and fill two histograms distributedly.\n",
    "\n",
    "This tutorial shows the ingredients needed to setup the connection to a Dask\n",
    "cluster (e.g. a `LocalCluster` for a single machine). After this initial\n",
    "setup, an RDataFrame with distributed capabilities is created and connected\n",
    "to a Dask `Client` instance. Finally, a couple of histograms are drawn from\n",
    "the created columns in the dataset. Relevant documentation can be found at\n",
    "http://distributed.dask.org/en/stable .\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "**Author:** Vincenzo Eduardo Padulano  \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:10 PM.</small></i>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "89f8dbe2",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:10:53.567746Z",
     "iopub.status.busy": "2026-05-19T20:10:53.567615Z",
     "iopub.status.idle": "2026-05-19T20:10:54.836132Z",
     "shell.execute_reply": "2026-05-19T20:10:54.835284Z"
    }
   },
   "outputs": [],
   "source": [
    "from dask.distributed import LocalCluster, Client\n",
    "import ROOT\n",
    "\n",
    "\n",
    "def create_connection():\n",
    "    \"\"\"\n",
    "    Setup connection to a Dask cluster. Two ingredients are needed:\n",
    "    1. Creating a cluster object that represents computing resources. This can be\n",
    "       done in various ways depending on the type of resources at disposal. To use\n",
    "       only the local machine (e.g. your laptop), a `LocalCluster` object can be\n",
    "       used. This step can be skipped if you have access to an existing Dask\n",
    "       cluster; in that case, the cluster administrator should provide you with a\n",
    "       URL to connect to the cluster in step 2. More options for cluster creation\n",
    "       can be found in the Dask docs at\n",
    "       http://distributed.dask.org/en/stable/api.html#cluster .\n",
    "    2. Creating a Dask client object that connects to the cluster. This accepts\n",
    "       directly the object previously created. In case the cluster was setup\n",
    "       externally, you need to provide an endpoint URL to the client, e.g.\n",
    "       'https://myscheduler.domain:8786'.\n",
    "\n",
    "    Through Dask, you can connect to various types of cluster resources. For\n",
    "    example, you can connect together a set of machines through SSH and use them\n",
    "    to run your computations. This is done through the `SSHCluster` class. For\n",
    "    example:\n",
    "\n",
    "    ```python\n",
    "    from dask.distributed import SSHCluster\n",
    "    cluster = SSHCluster(\n",
    "        # A list with machine host names, the first name will be used as\n",
    "        # scheduler, following names will become workers.\n",
    "        hosts=[\"machine1\",\"machine2\",\"machine3\"],\n",
    "        # A dictionary of options for each worker node, here we set the number\n",
    "        # of cores to be used on each node.\n",
    "        worker_options={\"nprocs\":4,},\n",
    "    )\n",
    "    ```\n",
    "\n",
    "    Another common usecase is interfacing Dask to a batch system like HTCondor or\n",
    "    Slurm. A separate package called dask-jobqueue (https://jobqueue.dask.org)\n",
    "    extends the available Dask cluster classes to enable running Dask computations\n",
    "    as batch jobs. In this case, the cluster object usually receives the parameters\n",
    "    that would be written in the job description file. For example:\n",
    "\n",
    "    ```python\n",
    "    from dask_jobqueue import HTCondorCluster\n",
    "    cluster = HTCondorCluster(\n",
    "        cores=1,\n",
    "        memory='2000MB',\n",
    "        disk='1000MB',\n",
    "    )\n",
    "    # Use the scale method to send as many jobs as needed\n",
    "    cluster.scale(4)\n",
    "    ```\n",
    "\n",
    "    In this tutorial, a cluster object is created for the local machine, using\n",
    "    multiprocessing (processes=True) on 2 workers (n_workers=2) each using only\n",
    "    1 core (threads_per_worker=1) and 2GiB of RAM (memory_limit=\"2GiB\").\n",
    "    \"\"\"\n",
    "    cluster = LocalCluster(n_workers=2, threads_per_worker=1, processes=True, memory_limit=\"2GiB\")\n",
    "    client = Client(cluster)\n",
    "    return client"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b41186bc",
   "metadata": {},
   "source": [
    "This tutorial uses Python multiprocessing, so the creation of the cluster\n",
    "needs to be wrapped in the main clause as described in the Python docs\n",
    "https://docs.python.org/3/library/multiprocessing.html"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "7d732ff9",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:10:54.854380Z",
     "iopub.status.busy": "2026-05-19T20:10:54.854031Z",
     "iopub.status.idle": "2026-05-19T20:11:00.298866Z",
     "shell.execute_reply": "2026-05-19T20:11:00.276080Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Info in <TCanvas::Print>: png file distrdf002_dask_connection.png has been created\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saved figure to distrdf002_dask_connection.png\n"
     ]
    }
   ],
   "source": [
    "if __name__ == \"__main__\":\n",
    "\n",
    "    # Create the connection to the mock Dask cluster on the local machine\n",
    "    connection = create_connection()\n",
    "    # Create an RDataFrame that will use Dask as a backend for computations\n",
    "    df = ROOT.RDataFrame(1000, executor=connection)\n",
    "\n",
    "    # Set the random seed and define two columns of the dataset with random numbers.\n",
    "    ROOT.gRandom.SetSeed(1)\n",
    "    df_1 = df.Define(\"gaus\", \"gRandom->Gaus(10, 1)\").Define(\"exponential\", \"gRandom->Exp(10)\")\n",
    "\n",
    "    # Book an histogram for each column\n",
    "    h_gaus = df_1.Histo1D((\"gaus\", \"Normal distribution\", 50, 0, 30), \"gaus\")\n",
    "    h_exp = df_1.Histo1D((\"exponential\", \"Exponential distribution\", 50, 0, 30), \"exponential\")\n",
    "\n",
    "    # Plot the histograms side by side on a canvas\n",
    "    c = ROOT.TCanvas(\"distrdf002\", \"distrdf002\", 800, 400)\n",
    "    c.Divide(2, 1)\n",
    "    c.cd(1)\n",
    "    h_gaus.DrawCopy()\n",
    "    c.cd(2)\n",
    "    h_exp.DrawCopy()\n",
    "\n",
    "    # Save the canvas\n",
    "    c.SaveAs(\"distrdf002_dask_connection.png\")\n",
    "    print(\"Saved figure to distrdf002_dask_connection.png\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f8e5c4e9",
   "metadata": {},
   "source": [
    "Draw all canvases "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "f7a658fe",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:11:00.329164Z",
     "iopub.status.busy": "2026-05-19T20:11:00.328957Z",
     "iopub.status.idle": "2026-05-19T20:11:00.613826Z",
     "shell.execute_reply": "2026-05-19T20:11:00.592998Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "\n",
       "<div id=\"root_plot_1779221460526\" style=\"width: 800px; height: 400px; position: relative\">\n",
       "</div>\n",
       "\n",
       "</div>\n",
       "<script>\n",
       "   function process_root_plot_1779221460526() {\n",
       "      function execCode(Core) {\n",
       "         Core.settings.HandleKeys = false;\n",
       "         \n",
       "Core.unzipJSON(30937,'WkwIcCIA2XgAeAHtnWtzWzeS97+KijUvERbul4PaF77Em3keO3bFzsTeqdQUbVE21zKppejEmal8961fA+eQlCxvknUmyayrLPk0gHPQABr/bnQD0D9mf9v9cLFcL94sZ8PsyZ3F+rvF5TfL54/Xi4vLV5vdTM3Ovl6v/uvt8s93Z4NWs7Pbq91le3r4/D+XL3akzyj28GK32qw78f9X69PZ4NTsbPrS8I/31XVTBc5567xXs7P7q/XyzuZ8s50NppOPdz+cL/fkN6vT3atG3ludn/fCMAs5FtZaXl+e7R4sti9X69mg56R8tXr56krS7c1ut3lzXOzJ5uI44enZCiasmp092z/eao98+OnlbrGjllIoc0TdahQv39su3iyv8k3alYZP5Y4bNBUdk8dP8vphz/DJ25vt6XL7ePX33nsHiQ82p8s2rk9N+/9Z//+pbX37rP//dLe59fzy0erd8vx1f2O3eR85G1KJNP3oBZeky/avHCfMhs9awtdHbzGaX+/fOSTHav5y9EL7yF/2rxwnTNWMTdltnvbWSFOuk4yk1saGaLPxOmkXTFazgw88e906qn8AEj5HcjZ8xhdszNkkq73TRqeAoJxvvv/y7p3e64fE068vJINBfXbw/M2U+sX0dOv55dGHbj2/PPrWreeX+9duPb/cv/n1uzcyHejiH/aP794s3rUGff3D9Pjk1XK3mA1OGvZq1Z9uXV4sX+y+WuxWm9aKL9++eb7ctucnqxev3+0ff2iP9zcve+L9zct92t9b7qPF6aPFas30UbOzO9vN5eWrxap/cCIfbToUHco10tXovUg/2JyuzlbL09lwtji/XKrZ2b9vV6fvjskf9uSt55d3NpvtQfnPT1e7xXMm/G77lg/cW71bnh61e/z0o+3qzWq3+m55eQ3z7q8ugdQRbju52G5nw1+/VbPNxY6HH9Xs7PN3yxeXs2H99vxczc6+bPh8urrcbU/PtLbA5pPVDn6upH759s2jxflytxtBkw78cvludz317p8fP7p/69lsmP1pfFSzs7ubt8/Pl7ffnp2NA/jVcrdYrem93vanl6u/L7++HPOfHZOS+9VycT4bLJVLdqMN9Der9enm+yebC6bUIf3skO7QtS/wxRKg7gLx/Tjp77ya9Zl9Z7HbXevwW7td02m07Ont5e775XLdQfuIks68t928ebK5mA1m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').then(json => {\n",
       "   const obj = Core.parse(json);\n",
       "   Core.draw('root_plot_1779221460526', 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_1779221460526();\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"
  },
  "widgets": {
   "application/vnd.jupyter.widget-state+json": {
    "state": {
     "a1e4cd14769746efb456f516d45772ad": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "a2a58b29476b4422bee09961f780c43e": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "VBoxModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "VBoxModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "VBoxView",
       "box_style": "",
       "children": [],
       "layout": "IPY_MODEL_a1e4cd14769746efb456f516d45772ad",
       "tabbable": null,
       "tooltip": null
      }
     }
    },
    "version_major": 2,
    "version_minor": 0
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
