{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "79284aa1",
   "metadata": {},
   "source": [
    "# rf210_angularconv\n",
    "Convolution in cyclical angular observables theta, and\n",
    "construction of p.d.f in terms of transformed angular\n",
    "coordinates, e.g. cos(theta), the convolution\n",
    "is performed in theta rather than cos(theta)\n",
    "\n",
    "(require ROOT to be compiled with --enable-fftw3)\n",
    "\n",
    "pdf(theta)    = ROOT.T(theta)          (x) gauss(theta)\n",
    "pdf(cosTheta) = ROOT.T(acos(cosTheta)) (x) gauss(acos(cosTheta))\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "**Author:**  Clemens Lange, Wouter Verkerke (C version)  \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:30 PM.</small></i>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "59e0b0ec",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:30:16.487826Z",
     "iopub.status.busy": "2026-05-19T20:30:16.487705Z",
     "iopub.status.idle": "2026-05-19T20:30:17.440677Z",
     "shell.execute_reply": "2026-05-19T20:30:17.439991Z"
    }
   },
   "outputs": [],
   "source": [
    "import ROOT"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f1598b2c",
   "metadata": {},
   "source": [
    "Set up component pdfs\n",
    "---------------------------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6a7557ab",
   "metadata": {},
   "source": [
    "Define angle psi"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "a217d8b2",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:30:17.443363Z",
     "iopub.status.busy": "2026-05-19T20:30:17.443232Z",
     "iopub.status.idle": "2026-05-19T20:30:17.600347Z",
     "shell.execute_reply": "2026-05-19T20:30:17.599744Z"
    }
   },
   "outputs": [],
   "source": [
    "psi = ROOT.RooRealVar(\"psi\", \"psi\", 0, 3.14159268)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c4938588",
   "metadata": {},
   "source": [
    "Define physics p.d.f T(psi)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "e9b46508",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:30:17.602569Z",
     "iopub.status.busy": "2026-05-19T20:30:17.602442Z",
     "iopub.status.idle": "2026-05-19T20:30:17.787389Z",
     "shell.execute_reply": "2026-05-19T20:30:17.786803Z"
    }
   },
   "outputs": [],
   "source": [
    "Tpsi = ROOT.RooGenericPdf(\"Tpsi\", \"1+sin(2*@0)\", [psi])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "722053cc",
   "metadata": {},
   "source": [
    "Define resolution R(psi)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "53ecc56a",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:30:17.789553Z",
     "iopub.status.busy": "2026-05-19T20:30:17.789427Z",
     "iopub.status.idle": "2026-05-19T20:30:17.911252Z",
     "shell.execute_reply": "2026-05-19T20:30:17.910719Z"
    }
   },
   "outputs": [],
   "source": [
    "gbias = ROOT.RooRealVar(\"gbias\", \"gbias\", 0.2, 0.0, 1)\n",
    "greso = ROOT.RooRealVar(\"greso\", \"greso\", 0.3, 0.1, 1.0)\n",
    "Rpsi = ROOT.RooGaussian(\"Rpsi\", \"Rpsi\", psi, gbias, greso)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e3d29e68",
   "metadata": {},
   "source": [
    "Define cos(psi) and function psif that calculates psi from cos(psi)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "ed032d5d",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:30:17.912981Z",
     "iopub.status.busy": "2026-05-19T20:30:17.912856Z",
     "iopub.status.idle": "2026-05-19T20:30:18.030178Z",
     "shell.execute_reply": "2026-05-19T20:30:18.029648Z"
    }
   },
   "outputs": [],
   "source": [
    "cpsi = ROOT.RooRealVar(\"cpsi\", \"cos(psi)\", -1, 1)\n",
    "psif = ROOT.RooFormulaVar(\"psif\", \"acos(cpsi)\", [cpsi])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "01e039b8",
   "metadata": {},
   "source": [
    "Define physics p.d.f. also as function of cos(psi): T(psif(cpsi)) = T(cpsi)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "12f0c74e",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:30:18.032260Z",
     "iopub.status.busy": "2026-05-19T20:30:18.032134Z",
     "iopub.status.idle": "2026-05-19T20:30:18.171440Z",
     "shell.execute_reply": "2026-05-19T20:30:18.170738Z"
    }
   },
   "outputs": [],
   "source": [
    "Tcpsi = ROOT.RooGenericPdf(\"T\", \"1+sin(2*@0)\", [psif])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e3f7973f",
   "metadata": {},
   "source": [
    "Construct convolution pdf in psi\n",
    "--------------------------------------------------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "31b5a852",
   "metadata": {},
   "source": [
    "Define convoluted p.d.f. as function of psi: M=[T(x)R](psi) = M(psi)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "f8437703",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:30:18.173036Z",
     "iopub.status.busy": "2026-05-19T20:30:18.172905Z",
     "iopub.status.idle": "2026-05-19T20:30:18.291181Z",
     "shell.execute_reply": "2026-05-19T20:30:18.290641Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:Caching -- Changing internal binning of variable 'psi' in FFT 'Mf' from 100 to 930 to improve the precision of the numerical FFT. This can be done manually by setting an additional binning named 'cache'.\n"
     ]
    }
   ],
   "source": [
    "Mpsi = ROOT.RooFFTConvPdf(\"Mf\", \"Mf\", psi, Tpsi, Rpsi)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b2259130",
   "metadata": {},
   "source": [
    "Set the buffer fraction to zero to obtain a ROOT.True cyclical\n",
    "convolution"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "5acfb4b7",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:30:18.292565Z",
     "iopub.status.busy": "2026-05-19T20:30:18.292435Z",
     "iopub.status.idle": "2026-05-19T20:30:18.400033Z",
     "shell.execute_reply": "2026-05-19T20:30:18.399492Z"
    }
   },
   "outputs": [],
   "source": [
    "Mpsi.setBufferFraction(0)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "68fec3cb",
   "metadata": {},
   "source": [
    "Sample, fit and plot convoluted pdf (psi)\n",
    "--------------------------------------------------------------------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f171604e",
   "metadata": {},
   "source": [
    "Generate some events in observable psi"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "91d9b318",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:30:18.401853Z",
     "iopub.status.busy": "2026-05-19T20:30:18.401725Z",
     "iopub.status.idle": "2026-05-19T20:30:18.574413Z",
     "shell.execute_reply": "2026-05-19T20:30:18.573877Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:Eval -- RooRealVar::setRange(psi) new range named 'refrange_fft_Mf' created with bounds [0,3.14159]\n",
      "[#1] INFO:NumericIntegration -- RooRealIntegral::init(Tpsi_Int[psi]) using numeric integrator RooIntegrator1D to calculate Int(psi)\n",
      "[#1] INFO:Caching -- RooAbsCachedPdf::getCache(Mf) creating new cache 0x556f0f28dac0 with pdf Tpsi_CONV_Rpsi_CACHE_Obs[psi]_NORM_psi for nset (psi) with code 0\n",
      "[#1] INFO:NumericIntegration -- RooRealIntegral::init(Tpsi_Int[psi]) using numeric integrator RooIntegrator1D to calculate Int(psi)\n",
      "[#1] INFO:Caching -- RooAbsCachedPdf::getCache(Mf) creating new cache 0x556f0f3f9b40 with pdf Tpsi_CONV_Rpsi_CACHE_Obs[psi]_NORM_psi for nset (psi) with code 0\n"
     ]
    }
   ],
   "source": [
    "data_psi = Mpsi.generate({psi}, 10000)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0a02af31",
   "metadata": {},
   "source": [
    "Fit convoluted model as function of angle psi"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "25e4e8c7",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:30:18.576070Z",
     "iopub.status.busy": "2026-05-19T20:30:18.575940Z",
     "iopub.status.idle": "2026-05-19T20:30:18.777942Z",
     "shell.execute_reply": "2026-05-19T20:30:18.777343Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:NumericIntegration -- RooRealIntegral::init(Tpsi_Int[psi]) using numeric integrator RooIntegrator1D to calculate Int(psi)\n",
      "[#1] INFO:Caching -- RooAbsCachedPdf::getCache(Mf) creating new cache 0x556f07d16e50 with pdf Tpsi_CONV_Rpsi_CACHE_Obs[psi]_NORM_psi for nset (psi) with code 0\n",
      "[#1] INFO:Fitting -- RooAbsPdf::fitTo(Mf_over_Mf_Int[psi]) fixing normalization set for coefficient determination to observables in data\n",
      "[#1] INFO:Fitting -- using generic CPU library compiled with no vectorizations\n",
      "[#1] INFO:Fitting -- Creation of NLL object took 1.41934 ms\n",
      "[#1] INFO:Fitting -- RooAddition::defaultErrorLevel(nll_Mf_over_Mf_Int[psi]_MfData) Summation contains a RooNLLVar, using its error level\n",
      "[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<cppyy.gbl.RooFitResult object at 0x(nil)>"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Mpsi.fitTo(data_psi, PrintLevel=-1)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5b1dcd1e",
   "metadata": {},
   "source": [
    "Plot cos(psi) frame with Mf(cpsi)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "5eb1cbaf",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:30:18.779523Z",
     "iopub.status.busy": "2026-05-19T20:30:18.779390Z",
     "iopub.status.idle": "2026-05-19T20:30:18.956975Z",
     "shell.execute_reply": "2026-05-19T20:30:18.956463Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:NumericIntegration -- RooRealIntegral::init(Tpsi_Int[psi]) using numeric integrator RooIntegrator1D to calculate Int(psi)\n",
      "[#1] INFO:Caching -- RooAbsCachedPdf::getCache(Mf) creating new cache 0x556f0f9c9d40 with pdf Tpsi_CONV_Rpsi_CACHE_Obs[psi]_NORM_psi for nset (psi) with code 0\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<cppyy.gbl.RooPlot object at 0x556f0f831af0>"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "frame1 = psi.frame(Title=\"Cyclical convolution in angle psi\")\n",
    "data_psi.plotOn(frame1)\n",
    "Mpsi.plotOn(frame1)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2cc11ebe",
   "metadata": {},
   "source": [
    "Overlay comparison to unsmeared physics p.d.f ROOT.T(psi)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "bbd52f5c",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:30:18.959001Z",
     "iopub.status.busy": "2026-05-19T20:30:18.958871Z",
     "iopub.status.idle": "2026-05-19T20:30:19.072886Z",
     "shell.execute_reply": "2026-05-19T20:30:19.072323Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:NumericIntegration -- RooRealIntegral::init(Tpsi_Int[psi]) using numeric integrator RooIntegrator1D to calculate Int(psi)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<cppyy.gbl.RooPlot object at 0x556f0f831af0>"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Tpsi.plotOn(frame1, LineColor=\"r\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "815ee9a2",
   "metadata": {},
   "source": [
    "Construct convolution pdf in cos(psi)\n",
    "--------------------------------------------------------------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e61c061a",
   "metadata": {},
   "source": [
    "Define convoluted p.d.f. as function of cos(psi): M=[T(x)R](psif cpsi)) = M(cpsi:\n",
    "\n",
    "Need to give both observable psi here (for definition of convolution)\n",
    "and function psif here (for definition of observables, in cpsi)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "a1db4ce3",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:30:19.074524Z",
     "iopub.status.busy": "2026-05-19T20:30:19.074393Z",
     "iopub.status.idle": "2026-05-19T20:30:19.185117Z",
     "shell.execute_reply": "2026-05-19T20:30:19.184569Z"
    }
   },
   "outputs": [],
   "source": [
    "Mcpsi = ROOT.RooFFTConvPdf(\"Mf\", \"Mf\", psif, psi, Tpsi, Rpsi)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "66d005e3",
   "metadata": {},
   "source": [
    "Set the buffer fraction to zero to obtain a ROOT.True cyclical\n",
    "convolution"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "c608acc6",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:30:19.186771Z",
     "iopub.status.busy": "2026-05-19T20:30:19.186634Z",
     "iopub.status.idle": "2026-05-19T20:30:19.289843Z",
     "shell.execute_reply": "2026-05-19T20:30:19.289323Z"
    }
   },
   "outputs": [],
   "source": [
    "Mcpsi.setBufferFraction(0)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2211463b",
   "metadata": {},
   "source": [
    "Sample, fit and plot convoluted pdf (cospsi)\n",
    "--------------------------------------------------------------------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8a63a187",
   "metadata": {},
   "source": [
    "Generate some events"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "a01858fc",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:30:19.291899Z",
     "iopub.status.busy": "2026-05-19T20:30:19.291771Z",
     "iopub.status.idle": "2026-05-19T20:30:19.419307Z",
     "shell.execute_reply": "2026-05-19T20:30:19.418878Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:NumericIntegration -- RooRealIntegral::init(Tpsi_Int[psi]) using numeric integrator RooIntegrator1D to calculate Int(psi)\n",
      "[#1] INFO:Caching -- RooAbsCachedPdf::getCache(Mf) creating new cache 0x556f0f98f0c0 with pdf Tpsi_CONV_Rpsi_CACHE_Obs[cpsi]_NORM_cpsi for nset (cpsi) with code 0\n",
      "[#1] INFO:NumericIntegration -- RooRealIntegral::init(Tpsi_CONV_Rpsi_CACHE_Obs[cpsi]_NORM_cpsi_Int[cpsi]) using numeric integrator RooIntegrator1D to calculate Int(cpsi)\n",
      "[#1] INFO:NumericIntegration -- RooRealIntegral::init(Tpsi_Int[psi]) using numeric integrator RooIntegrator1D to calculate Int(psi)\n",
      "[#1] INFO:Caching -- RooAbsCachedPdf::getCache(Mf) creating new cache 0x556f0fb6e740 with pdf Tpsi_CONV_Rpsi_CACHE_Obs[cpsi]_NORM_cpsi for nset (cpsi) with code 0\n",
      "[#1] INFO:NumericIntegration -- RooRealIntegral::init(Tpsi_CONV_Rpsi_CACHE_Obs[cpsi]_NORM_cpsi_Int[cpsi]) using numeric integrator RooIntegrator1D to calculate Int(cpsi)\n"
     ]
    }
   ],
   "source": [
    "data_cpsi = Mcpsi.generate({cpsi}, 10000)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b79096e2",
   "metadata": {},
   "source": [
    "set psi constant to exclude to be a parameter of the fit"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "23a16d32",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:30:19.432502Z",
     "iopub.status.busy": "2026-05-19T20:30:19.432362Z",
     "iopub.status.idle": "2026-05-19T20:30:19.542073Z",
     "shell.execute_reply": "2026-05-19T20:30:19.541488Z"
    }
   },
   "outputs": [],
   "source": [
    "psi.setConstant(True)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "627912ee",
   "metadata": {},
   "source": [
    "Fit convoluted model as function of cos(psi)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "e9c27ba2",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:30:19.543964Z",
     "iopub.status.busy": "2026-05-19T20:30:19.543833Z",
     "iopub.status.idle": "2026-05-19T20:30:19.668043Z",
     "shell.execute_reply": "2026-05-19T20:30:19.667531Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:NumericIntegration -- RooRealIntegral::init(Tpsi_Int[psi]) using numeric integrator RooIntegrator1D to calculate Int(psi)\n",
      "[#1] INFO:Caching -- RooAbsCachedPdf::getCache(Mf) creating new cache 0x556f0f8aba40 with pdf Tpsi_CONV_Rpsi_CACHE_Obs[cpsi]_NORM_cpsi for nset (cpsi) with code 0\n",
      "[#1] INFO:Fitting -- RooAbsPdf::fitTo(Mf_over_Mf_Int[cpsi]) fixing normalization set for coefficient determination to observables in data\n",
      "[#1] INFO:Fitting -- Creation of NLL object took 856.624 μs\n",
      "[#1] INFO:Fitting -- RooAddition::defaultErrorLevel(nll_Mf_over_Mf_Int[cpsi]_MfData) Summation contains a RooNLLVar, using its error level\n",
      "[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      "[#1] INFO:NumericIntegration -- RooRealIntegral::init(Mf_Int[cpsi]) using numeric integrator RooIntegrator1D to calculate Int(cpsi)\n",
      "[#1] INFO:NumericIntegration -- RooRealIntegral::init(Tpsi_Int[psi]) using numeric integrator RooIntegrator1D to calculate Int(psi)\n",
      "[#1] INFO:Caching -- RooAbsCachedPdf::getCache(Mf) creating new cache 0x556f0f9b05e0 with pdf Tpsi_CONV_Rpsi_CACHE_Obs[cpsi] for nset () with code 1\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<cppyy.gbl.RooFitResult object at 0x(nil)>"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Mcpsi.fitTo(data_cpsi, PrintLevel=-1)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "92e2cf6c",
   "metadata": {},
   "source": [
    "Plot cos(psi) frame with Mf(cpsi)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "4f339dc0",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:30:19.669999Z",
     "iopub.status.busy": "2026-05-19T20:30:19.669870Z",
     "iopub.status.idle": "2026-05-19T20:30:19.778379Z",
     "shell.execute_reply": "2026-05-19T20:30:19.777557Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<cppyy.gbl.RooPlot object at 0x556f0fa64b20>"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:NumericIntegration -- RooRealIntegral::init(Tpsi_Int[psi]) using numeric integrator RooIntegrator1D to calculate Int(psi)\n",
      "[#1] INFO:Caching -- RooAbsCachedPdf::getCache(Mf) creating new cache 0x556f0f8aba40 with pdf Tpsi_CONV_Rpsi_CACHE_Obs[cpsi]_NORM_cpsi for nset (cpsi) with code 0\n",
      "[#1] INFO:NumericIntegration -- RooRealIntegral::init(Tpsi_CONV_Rpsi_CACHE_Obs[cpsi]_NORM_cpsi_Int[cpsi]) using numeric integrator RooIntegrator1D to calculate Int(cpsi)\n"
     ]
    }
   ],
   "source": [
    "frame2 = cpsi.frame(Title=\"Same convolution in psi, in cos(psi)\")\n",
    "data_cpsi.plotOn(frame2)\n",
    "Mcpsi.plotOn(frame2)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e1c2343d",
   "metadata": {},
   "source": [
    "Overlay comparison to unsmeared physics p.d.f ROOT.Tf(cpsi)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "b8a6ed21",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:30:19.779882Z",
     "iopub.status.busy": "2026-05-19T20:30:19.779750Z",
     "iopub.status.idle": "2026-05-19T20:30:19.885832Z",
     "shell.execute_reply": "2026-05-19T20:30:19.884825Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:NumericIntegration -- RooRealIntegral::init(T_Int[cpsi]) using numeric integrator RooIntegrator1D to calculate Int(cpsi)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<cppyy.gbl.RooPlot object at 0x556f0fa64b20>"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Tcpsi.plotOn(frame2, LineColor=\"r\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dabc841e",
   "metadata": {},
   "source": [
    "Draw frame on canvas"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "24bc4444",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:30:19.887438Z",
     "iopub.status.busy": "2026-05-19T20:30:19.887308Z",
     "iopub.status.idle": "2026-05-19T20:30:20.118789Z",
     "shell.execute_reply": "2026-05-19T20:30:20.118200Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Info in <TCanvas::Print>: png file rf210_angularconv.png has been created\n"
     ]
    }
   ],
   "source": [
    "c = ROOT.TCanvas(\"rf210_angularconv\", \"rf210_angularconv\", 800, 400)\n",
    "c.Divide(2)\n",
    "c.cd(1)\n",
    "ROOT.gPad.SetLeftMargin(0.15)\n",
    "frame1.GetYaxis().SetTitleOffset(1.4)\n",
    "frame1.Draw()\n",
    "c.cd(2)\n",
    "ROOT.gPad.SetLeftMargin(0.15)\n",
    "frame2.GetYaxis().SetTitleOffset(1.4)\n",
    "frame2.Draw()\n",
    "\n",
    "c.SaveAs(\"rf210_angularconv.png\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "25d2984b",
   "metadata": {},
   "source": [
    "Draw all canvases "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "3e206d05",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:30:20.120780Z",
     "iopub.status.busy": "2026-05-19T20:30:20.120650Z",
     "iopub.status.idle": "2026-05-19T20:30:20.304877Z",
     "shell.execute_reply": "2026-05-19T20:30:20.304079Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "\n",
       "<div id=\"root_plot_1779222620294\" style=\"width: 800px; height: 400px; position: relative\">\n",
       "</div>\n",
       "\n",
       "</div>\n",
       "<script>\n",
       "   function process_root_plot_1779222620294() {\n",
       "      function execCode(Core) {\n",
       "         Core.settings.HandleKeys = false;\n",
       "         \n",
       "Core.unzipJSON(53859,'WkwIZEcAY9IAeAHtvWtzXEeSpvlXaLD+0LMbOhPucfU8X5a6jWpWKtEkVRc52jJZigTIXIEABwAlqsfqv689HicTiUxQoqak6qptqZuojBMnTtw9/PrG/zr55ubHV6cX65enJ6uTrz5YX3y/vv7z6bdfXqxfXb+4vDkJJ2d/utj8z9enf/jwZBXDydn7m5vr8evzb//f06c3PD/htc9f3WwuL5bE/725eHaySuHkbPel1f+6r663VZBS1pRzODn7dHNx+sHl+eXVyUqW5Jc3P56f3ib/vHl282IkP96cny8v01iS25dj9OKnZzefra+eby5OVnHiyReb5y8OHr1/eXNz+fLua19dvrr74PHZhkZoODl7cvvz4fjJhx9f36xvqMWMd+6kHo4UhT++Wr88PWw3zw46vnvvbod2r24fbz9J8f2R4ZPvX149O736cvPvy+jtPfzs8tnpmNfHMv73yfK/j3WM7ZPlfx/fXD789vrR5s3p+XdLiZvL+5Inq2aVrt8pkJoP2W2Ruw9OVu+NB3+6U4rZ/NNtmf3ktpp/u1NgfOTfbovcfbCrZtuVm8vHS2+8K8dJZjJG0VK1S44tpiI9nOx94Ml3Y6CWD5Ckndvkyeo9vqC1d2kac4oSW2GhnF/+8McPP1hGfT/x+E+vPINJfbL3+8+7p5/sfj389vrOhx5+e33nWw+/vb4t9vDb69uSf3rz0rcDQ/zj7c83L9dvRof+9OPu51cvTm/WJ6vkHXuxWX49vH51+vTmi/XN5nL04o+vX357ejV+f7V5+t2b258/jp+fXj5fHn56+fz22b+P3EfrZ4/Wmwu2Tzg5++Dq8vr6xXqzfHCXfHS5kKL9dc3qGunbJf3Z5bPN2eb02cnqbH1+fRpOzv7b1ebZm7vJH2+TD7+9/uDy8mrv/Y+ebW7W37Lhb65e84GPN29On93p9/bTj642Lzc3m+9Pr49o3qeba0jqltwuyfXV1cnq67+Ek8tXN/z4azg5++jN6dPrk9XF6/PzcHL2x0Gfr85U4jfri+evz9dXTy8vvod6frW5oVn3Z/7x9ctH6/PTm5stCWU4/3j65ub46Yd/+PLRpw+fnKxO/mX7M5ycfXj5+tvz0/dfn51tp/OL05v15oKxXEbi8fXm30//dL3Nf3I36blfnK7PT1ZK5Z490kL6z5uLZ5c/fHX5ig22n36yn14I2e0Ln5xCtpfl8cOWBHzw4mTZ5x+sb26Ohv/hzc044ejZ4/dPb344Pb1YSPidlI/px1eXL7+6fHWykok19fjZ+gYK6Ykn2wRH3MORkL+Gk+8+u/z+9PNX6//5erdSvvvilBG5+/Dsk83zF5/SheW08lW7vnn6Yjus33354vKHj74/vbj58mZ98/p6tzi/e/j65pLlsXvzs9OL1++vr0aaxfPwKctvV+Lsi9P1s88vzn/cljj78+bmxeXrm/2Vul29n6yvl7W3fbL/1tcHh/ivxipw0r+VVfjz6bdODTYXz9/GL7AyPjhfX18vW4X3BoOy/+AVi/QkrrSUsPybZRVDDHFWf8qvtIqeG+fseVrKXHZl4lyXN3nelnf53VfdgoqEnmfjd89Bpc5ChTks/2aRlZgG6Rqk6Sy6ajX4/8+SVhI1LP9mySvRFpZ/s5SVlBSWf7PUlbQeln+ztJXGHJZ/s/SVqoXl3yy20qxh+Tdr9JfFKB9nlbtJXYmlICZBap81raTXIJ1kmjWPemsJUuKsZSU9kROklFlp1dLIHGdtKyklSNYgKc7aV5KKd7DXWW0lrQSNlZbMKa4kafCqa5qTrCQ1WhCkxjnpSlIMUnrgwymNenofZRkqHfWUNKeyEmnBy+cyp7qSmGmBNzm1lUQLXiDpnPpKNPu4arQ52e2olzLnuJIWg3fXZM6yYoq9zanMWVeqEnx8SDJUfTQyxTnnlQ8xs6Z5zmXlY0ozxOZcV3zGcrA65zaqYaBym3NfeY3izZyzrSS34J0QnUv0RvgSm4usJNfga3Yu6uOwJNLK+vZ3XrW8/V1WRba/60rb9ndbpe3PzsJePmOrGDILuMw1rmKoffxm65iM37qiU76t5soOkmQjh03E6vDihURvI1GpQ0Yl1XdSWmrx2n2Tylyp3hPa5kb9noh5bjSAhPQ4N1rgiVLntt3DzG+jBZ4T+9xoAYle5uYNKCVUmdt2J6c2t231kuZmnFO8FOceV6OB/JZV8W7wW1fdh4HfbOFBXeLcWZU+DCTG9l0+xTap2wRbd1cJG9eHgTJsWx/tEGdbCFfqJGRQJMkkBvESg3xZ8hyplUQeiawkBhVjUcXZBhkz/3Lzt5rwvPvv3Pht/ltTiLPEuBKRkIsTBYniKzRryDpL1EEUjOmVWWJa9RbEVw3Z2fshpYZEsqxUe0gtlDxLrCspMTQ2qM0SIRnV35XKp9ieGlIKqiQZklAZVZnFaWthD+ksAhmTkCQoKfVRhRhVmwXaym/+aZkF4spsMvB8V8po8VjPAnWNEsyCxDiLtBUEjv5InwXqyrqrFgSKbivpRsUyi8aVZGhWDlKh79CxMW6dpK68WGyh2yyaVpq8njgLpLUXjoXANhdoq6TgpEx5ufpWV+mjzVDXvSNAo6xM2JImszIlkMTxb9YIbUph+TcrcyL0x//NGsugt5D1WZmUnpwExFljW7E3m4TGl/tKk41mSZs12opSEOsyK1PCKqDwrCKrJmEUnlXU6fJSelYmhfooPKtkSo7Cs0qh5Cg8K/MBRZdG6VmljdZuK+27znmt5u3dVstxBzkajZ7Vp4TWjnqZktFX6WlWnxLvrKY8q+Zdb71mJmXpLY1WqPjtqGrb9ncU7rsOUzht9zC0LeY5bbcxi4lzi528nOIjPTaz50edE/t5m+/pPZ7A02NX836RObGxl9c92XcchCehbYPdKDLneMsYxTnHwRNQnJTuSpK65VNIZY4TTpQ5R0ZjUC/6l30zO+33/mQ2M2lO45LmzNKJuutfljjS5EedM8wSTeQE9bRS19K9LMlTMXv7xdvBq/RG/JCjsKe2pD7OWZzUj34JpJ4iPOegoUCcs3LOjC7pMiWDZ5wz7NDSJY60zKZduuRdZn0sXRr5UBL1Lo98uI+lSwyB9m2Xxuu27ZO/nSJJKvCXk3hyzNqc0/bQ86LJT70x33NOfvDuCvrJuyvHcPikzYUluawRvlJMdlM90rdTT4uK3U7+yM+jP6OPc2FJjnq8ycUqTR6zNhdr25R/y/s+OjgX866TijrXyBT4qTjXOLh0ytRIn33S5hrpsU/aXOPg1uEYWIVjh3kTK+Rr7LAl3b3Ly7TNlTOF/DFtc3US5itwVMkqHCvQu1Q5WnyHjc9J8s/RRRrIyeKLcHl5jMe2W7IvPtSFa4fqUXLsjqVznCqsxjEc6guBWZsrS3LbP8pBsZb+sUoqJGvssCW9HPzL9FenWaN/PtTOpfsOW9LjeBsLpKptu0fdcOmjd54a+3N5M90KUTWNQYEjqXDn7DH/PYZj/Palwc+2JYSj2XNbCOEy7HNj1S1NLDI3Ft2SpHDZ9dczb6ef7rWFvfEmzG1hcKjJXx69G5l9SwOdOnRo4DKuReYeByXwSZn7QgSdSPS4m3NyluYM2tOX1bi0d+7b1eiUprMWl7XndewGGx5zUORRxbIIeZkXOUoXssKbTgmXT94SQnIWcjS62zlHtwQ56tw5R8ey95f7LuV17GgRTK4vQKonsZwOY3TmzhG6pet8FiLJahvEuEMjlySFF054adKyGpdRmPuyGrc1jb1KiiYhMy4VwWwvtGs0isW49I1t0REZlyFiW/Q0Bmmsm7nfEkhanPy8oE3j3YVqLwd1T1v5YLx8S7O9IhdRtkXzvozSs1NsvuPfzU6xx+abe3ZJaVkneUuw6We+bQ6ty7fNGZ/ZNYeO5V1zxsvb5vChsm2NJ5YRGkf03BEXl3nxjpTdMvLvFlq0UOc+pMZlQOdeRouWAZ97oUWeiyqkeItuk7RooY/dZcjlPOh1HGhj2uY+5MgxaXN3QXIhnH0IkqO1c6/jeB9LYe5175Clfhcnb786xmfba5cod0WHSLnNa4sqZNugtpx+2ya1sbC3g9LGwh4Uu7exsLcdbYMZ2o1CQ7LZSti9jYW9HQgEzZHJiupjYY/jr/cxbdtX+5i1cWj07nM2TonenQdamoPE6WtrTC4y50IzfYz62PrbOsbW39XhW3+pwpazx4stlHo7AguhXupfmAM/pvpCpJfEIIrb2Vxo9G4+Fxq9/czuAPIFvdBo/5AtJHpJ3FJoxs32SDQr2CDSy1kcdbaFTI9abKHTS09sS6eXqbaFTo/BtIVn2KYGx7DMtC2EeslctGu+pmgU4gYDP/7NBrFkHY9/s6nP4DhDTfOqJMRqSRT1ZZ4RjdtsWlclugSeEfrbKhuCumQ+2le5BwTPXGdTW+UaSgyS+2wprjLkM0iR2ZKscg7emDxb0lVOwclTmy2lVdaA+F3RJORVjgGNW9XZUlklC8XQhc2W6ir1UIeK0FJbpRYQkRs19FUqAQG4UYOhNqk1SKuz5bhKKdQWpNlsWVZJkeaRjS3rKrnIJ73MltNKLSAL9zZbzivtriQw1BoFtVUraAtnQ5NWQ2tBjBoaGoJmQYwaEFZDZyXLbNlWqqEPvs5cjxZc9GuzQRwt9IJOajZIYw+9BpU0W0F7EHoPKmW2kldSg6G96rMVFwhRhKnMBl0swXRJseVdPaF8E/4OlctIudhsdaQqfFWwtqRYMsGQ81HVoDNAF6Fis9VESlBceNIb46vWk2XkpiW3juRQXFhtI0kn+2y10y2J9JIkCtmAasKTDdVnQFWq0mZr4knUYZ5E5RNQCY2kj5CILkm0xAHtBSpwgzL2IK5rIIl2YegLPdlGknrJRZgPgpaD0YYykqQZZbYePYmmwJMykjSDXHTXrvQYyTSSNCPPhkKOXLpPEoVsEKX7JOtI0gySbSRpRpoNAsnLNIOkeTLRjDSbjVahexKdDSGqo31ckmOs0DeJzAaVRDtNM0iOGUw0g+SYwUQz0MH5gpJEM0j6inLtqid9SUlmfdtsiPQ5CFqsiC4NpR1pFnwnjTIKgrFNo1UPklFHeH5aCRroGjQ23keDiUZ6my4j3bdp1DJBsqER5/3m6UJzPM2pAtkJGgv5rk6VQntIS1zZchR7UjzpZgxydYUyfehKJEryJG3x3OxJmpLILStUOrTEk5VkpSFoHFHgoU/cJrsnaYbn2gptHqOCilGjl3XtIEmhIsiZMaaqNBLzhzFkzuq6ulWMIYPX1SVNn+B20UFCnWi2K/GWNA11dneYOYy2oDKi5dAvb8xY/k4jqR4BzDDbBOnUn+BYljT1I4RhWnKrBGk0jEOn2GlPQhe7pGlPQjgcelH0kzG5RcD1pEOT2yC8gnq2MxqpQ5Yx3EDBJULeqZ807YHAU/+g9xIh8dRPmvoh8tTPCUD9OXFYDD0m45EzR8lI055cOGgEet6oP1eOIemMOfXnxiE10l5/5wgb1irGIxsH3EgzHiVy/Ln5rdKeIhyOrhat1F+Ug3SkqX/hid3GxXyUvCqU50CnfvjiFqQjOFB/qSvOSE97fW1VaQ/5Xl9fsXY8Tf+LrTBxofd1VXmNaBBHmvqqrNBZk5+pr7rBcKSpr6YVY4OFLlNfzStMi56mvlpW1OVp6qvVFd2epn+1rVxrDx/h9fUVxj/Sro6vtjKsf6Spr0WsSiPN+HIsRBoMvaNCDgYEHH9Ajc4zM0ROEXmQVxwj4wF1cjywabq5mVAiBwRaVh6o1wphoVoeeLWYBaiWB14tdjv2aHRjm0QOCsW0yANmlqOCpesPqJbDwi2OvMHa4rhgMWL5RM8fOTBYjbwhVMuRwfK7fYBOHqslbzD+HBssMH9Awzg48tIOrAWRo4Ml5m/QMA4PuDN/wABtdXD+gJa6Em4ZD6Glrg9ZxsMpvR8ijCkWC5rux8gypk7LOUh85fEGLeUogSz5A1rKYTLoDKZGHsAQLHPLAzcCOSXoQSCzbgZia/sDrC5bS5A/cAsNdoftNzClcKa4IaIH6CnWIF/NpLGtuOmBrvUAQXWDEAPRG4ZScYOQG9BbgMBiERJjvbUAgcUmJEa3WoDAYhYS7Dik3UqEGocGbdNDU+VpGuxmCLoEi0cayYX2VLfYYBrCasn7EGBsQ5iEPU37MA75Yu4YGQXrEEYW+gPBxUCkvrZ76LQPXQoUH3Mu9aPdW5Y6BNdNRFB4iwGCi5XIbc6kqR/tHhTfJDTGC32KbwQJEFysRAqFJ+31Y2FkTWuA4Ar6PSg8acYHpYpvkxQguMIBg2nLUhiGNF2p75ocILjiBwwLPgcIrnDA+CaC6SddVppY/4gEpOsKG6anqZ8DxrdUDRBc4YDJ1FcxzIqk4bvAnEJwJceV+gZrAYIrmOSh4KSpH5u877ceIMCCHOHbrQcIsCBJZJcOQqF+ZAnffRYgwII04QyKi5giyBOuZ4ihMB5IFJ7WAEEWZApPp5CpH6nC0yVAkKUgo8Ja1ABBloKW1BmwAEGWgvYWTsRCpj0Fmy2Mo7hpVQrtI50CBFow2Xs6Bwi0FNpHfg0QaCm0j3TDmC1SaB9pC4n2VNqHtBID9Foq7SOtAXItlfaRziHRnkr7SJcAsZZK+0i3kBiPOsaPNYSRUirti0FhjWlPpX2kJUC5pdI+0imot4f2kcZsjqmV9pGuAbItqGQ8jTREmvaRDydOmvm1wJqBiEsb84uvi9CeVpZ89iDpuqThSEgjL1Ieros06480xl0cid5/fYYv2b+4o97Jx+eX65ukJ+Hk3L3HSgkn35+svjbNwRTRrwZTaEsPphYsxWCYeJMGSylYysFSCZZqsASN6sGSBcsxWJZgWYPlFCznYBnhER8RaFsPli1YicGKBCsarKRgJQfDBl5qsAJN7MGKBasxWJVgVYPVFKziaFKC1RqsQkt7sGrBWgzWJFjTYC0FazlYQxStwVoL1qDDFqzHYF2CdQ3WU7Ceg3WE1BoMWur024JZDIYN2jSYpWA4uFgJZoiwLZhB992ujh4GShxdExKxQLhmNGKLgQRH2IYI8Y047ETIboTWRghshK+OkNYIPY0uFUNJI+QzwiVHCGeET4iQyAgnHCGOEYoYYQ8itDBCACNUL8LMRuhdhMhFeNcIeYvuuAQhi3AEERIWoVsR9jNCsSJLLsJtRhZbhCpFllkczjuUYFVFFDMRmhMLJVwrB1MZOeMj6pcITxk54SPcZORoj2hbImd6RNMSkUgiJ3pEuRI5yiOsZOQMjwgIkcM7okKJ8JCRoxunYxgs/lACB4IIBxlhqSNHdYSBjJzREdYxwntGGMYIFxj9aHemgWM5wixFDuQI3xg5iqNRArYxchJHGMbInKO1gGngD04OzPnwamLOUURw3vMHiZ85d0YRLYM4hzj8IZhz5w+FOR+OAcy5+0uhGuBU5Y87UlAHc47cz/HIH+pgzp0hHB5ZzLmzg8KcI6xzdvGHEsw5QjjnEYoM6mDOnflDoOZg4Q8lmHN32HI+D/GYY4E/lGDOXRkozLn7x7nHizDn7uCGGAuh5g8lmHP3sHMpdHiGMefOvrmHnPNtLhQ6wzZcSJhzZ9dcOnM+zeUuaf0vf/3rX8Nv5c2JV/tbvTlHoMJPBJYsHpu4b19d8OLWxXk8ebD7wEGEBMm9KIjDAIjb0BAhIOM4NuSz9dV3p1d7sSbjwd4nlwe7+ImvTt/cPLx4jv81DqgkR2acImPg+eeb5xcnaEVGeu/7ZH98iZd7dQ/j9ZvNsc/4w5ubhzzHcfvZ5vvN9eby4vpkVdx7mpy9D366/vZ0G/9CfZ4eNWRq8PTnZ2fXpx6YAp1dHu6anbzdm6fffXp68ZywmjhFnJx9DrZFvS/4nR8WuznfOprvXtlWj2Pyk3+aHvp0/m/08H/80/RwN0G/cA7fX1/thRW9v77aLgp3wSZQi216/ujLsSc+vFr/MMIxRvrzVze3oR8jsUR/jMQSAPL5q5sPh7/9CC3DCZ5N5Nvo81c3C0mgE5+/uvnYQ7GWVz/eLHEBRx70vOAPn21uiCfbpr+6vDx3B3oejNCVDy4vbi5fX10vUQsPb5bmHFDMhzc3bGInUj9BC/QXEgP2Ct0fQUd0khQREZOnPrp49tHV1eUSycXO9qS/TlUfv754upAFMknuUTGSyxSSSyjM8jL9J7m8zL4nuTffn54+P714th9vQ+vG0z0Ky4duH27r3obg8YktWdi9yPgtSzGcnH1CLMTp9QENX55++Wr9lFgAr3sXF7fXh11Q3PKMNu7eu9ua3avbx9tXD6r29w77vffwNtjok801C3K/PTzie0tzaqTb2/e2FY/R2b66fbq8eNAa3vpsc7F5+frl/zi9urwN9SDjTqiik/gR9fLo6vTs9Oq/fXr79ni+N3DjwX43aen+09t+jqcfnp59crIqkUnbPfnzyardffL4ZIT77F55sjx4tN5ffI/Wd9YWle8e3dbsj45DNB+tn93pOmP3aP3sOOTz0frZPVGfj9bPWOyPb4dnefLkzhPOxiVWiQo3T79bIpUerV+N2MrHC9HYPXhygnny5OzLp1enpxcfr5869aF5kLW94SfJPthbtjzan49tqb39wyskb3cPT7YLaCyr8c7VS6joSZ2yB9Lw0GmGEchIykkMwulI/nkb70TeJyTE+3FztXn14enTzcv1+fUuqMhJ8sLt6I5l2Oudv3DQPX+23z/WkT/c6+AuvTuqBpMCAzJCgXeldiTQy4zu2O5t+rP9Pt0ZxOfyDxcXp1df0D3eZKv5Z69PVl8TSPTgAX9EHwhC/4P8oG/T9UF+IJWURl7Iyyu3KX+0/1zj3dd3eT0ueT0+yPFBfpD9Ta/7N/rzF4jL6frZ6RWntcdM+bDtUh9vbj7eLpqyLBqPxGIWdzm+lnzUnq7PvTCz/98vNxc83DICH6xf7Se/2rzcsZOtd5OenWL84eX6+Skf2hH4D9YXz85P//xic/3d6dUX64vnS/DyeP7+5Zvl2Zi98dRbshe++W+by/PNxfbpErg4Xv1gc/X0/JDaL1nEndLovQPwMSz3R29ePd5ne7YPn+w/fHLfm9uHd97kxc/Wbz7cPPfgehbh51c3Ly4/WL88vVov1OdYXHu0fvarxd8xY2+V2B6tn71NXkOSYoT2KBbJLfFZcvfG7+BkPJbCDsg1g3EPsf49RP+9OFXtSXqp0WpDU3HiMfvvaZ9aT5a1W+utMrXE8Kep1JibNBRgmFdPPKRfi02xlFy7aU6cuHcD/GuZtGmM0rR0dL7+wjbev7QpCbkWU8vO527RAE5WJpNK7s2qplQJ8TyAAkgydU1mrVsqR7gA2icUbNas1TuZJ6v3ZNJaS7JSUlU0nA4PsA3m/+5k1SYrZmZdNXZ0hD+BH5C6TrHHGGMqpfPqAZZA7ZN6fuwJjY6/sB2CVDMjG2OUWtUYoC3sACgDx7nbVg6Mgffi1KSUXqKqSe9K/QtmAJAE987zNn9IBNFqEk01lo6m7RCTQKtMZlpjaaK18MJSHoiC+5bLNttrb91KUZPWUrfo87/DKJhiZJDNrLWau/rHb2EH7s3eghrEKRujFmNUTUX48hbkANCMw7yBXhCnPGYixpwBYeAMG+gJkx3l3AFFuLc1d2AS3vbG26veASncV/tPAiukSbIU08p8LAgLmuKkTYrWqDU7/MkvBFyA4v4OuLADtPnFgAsH8v27l38bRMM3sq/BPEJwGNnvCtPw6wX3LyzQ3yW230WWLaDQ4Qi7CP027oKt8etyF/eB29zZiaDc3LMN90UU+jPSi0h6zJr9jXzZx3/64weMyYBR+snx+0Q+fNvoFQfcWBbmGfg/37y63nxTSj2LZz3J+gwJY7D8J6uTD358er55uj5/ALLI5flr4JwebC4erFFwP3h1veHlvdkYWoy/kdv75Tr3Pz49PUfqxH50cvYWnfmiMH8bdNUyJm9cWbs3BEsn/6n17Kgwv91gIsDWdnL2eIfo89hRfO6s9sfjTcBnzj7eXF0vmtNP19tfwH3pVmp+efrh5vrV+XoPKQcxbicI+gLBBHGLXPPZ5bNP198u6Z8wAbzbhP14OGEOkHL94P/5rw/+9QGGCj9SH/wXGvKPM4kTHJ0L1jv9xWJl+Qlzyd403jOJ/uzvPndvMW6829z9++Hc/WNN0v9PpujAHrNnrIlODT66uLnaoNnyDl+/fvnDsrn5ud3o/N4idvnvJeOz9Rs0zvcekIs2GtFsGGn+eHn1cqvqhA4tFpWBdHX25ajOCc8d5ECME5w8x4bQd+fFBlzVrTp0C1/ltb2/uUCb+dHV1efAbdE00p9/f3p1dn75AxYfJKirK8jcXaefijeQO/344QM0lLv+HPILv75p/RWb5ee5gS8uLzEA8PJ9R597tOzQxF588xlmpTVvO3U6WZ1Q+vL51frlg8uzByP7m1fnlzffwDnw4t75zwr6G05/Bv6nT3+4v0OL+x9fXW4uQKBcDrefmqI4/LKwmZUWm9WUQ5xQgSiSrJJovSTr0kKccFAppWXgVZDNUpPaYiXRtPVWcIyKk8asMRW8y+KkqVSxTIDupBVxNLVGebWeiyScf+KU1HptmsBqmVIV1DalUz6ZVjP8a+KUNeMkgh9LnHIpJUVLnfK5V8u110L5Ij1VbaaUL9la6w1Al6l0Ecs1F8pX0YoPkVK+5ow8iSNWnGorOWvWSvkWay89EXc4tdS1ZW1ABk2tWrWoOBbFqUc8cyT5+PWkRTXC/cWp12Sp4f0Vp24llWT4yMTJtLZqPfv4WenSS6s+ftatRql4uckUlciMiq/OFIvmlErGH2mKPfVsueFIM+ExU0t2T69Jcq1dkuKiNEnr0ZoH104arUiSjh/QpDma2nBaQn+VcokJb5spxdTQmOEaNCX0DrXjyzSlWotpd/+bKaFL6C3jLDRltay5Vjybplxjz7Ggc5Ipm2qpBQ+jqWiqTXPG12kqpcTeU8NJZyq9FvAe8SiaqjTTqAn3p6lmS6m6389Ue2xF6XiQqYlK7dEdoqaWU+kMNOVby6i1qo9fjzVLaXhgTT21nqR54MTUq2luNfv4WYy1ptLwmposaWyW8eKTiT1hBb0dKqJsODwRdjVFrUlZ9pVEaS0nxUMNRZlJMUmqQSfRWFrBQ00nKWIWrROQM0lPOVbz0CpXAqqikgw6aa6aeqvE3kzaWi25Wgo6pWixxQpglk4px8yCr9SfmljU3AifmnJMyY0FlM+Jp4mIrSnXKiVqwU10ytZKrdKJbJuKduvq3m+Kqo7JTYRETcWkS8JLUqeqSdV6b5Sn6ly6B0JNtddYpWWi16YmLbdWa6d8yx3VJRF9U+sxRSsOzjN1PLBKzj5+PcOYpubj11supSXcEXWyWKxRLb8TCjZUgSRq77HErjWkyTVkeEBmEklqqpaqkqgpFu018dtyrr116yFNoqX33KRWh5N88g50shbiKd3JnKBEvDwJrSC6CzQvXNPAoivLP8JNPGRk+V8CtRa0Ng+H8XCWEaaCm6EHWQ4ncXdQwwmRd/AqxE8QT0IPcyGshnKE9xC5huM+oT+EFBEmJaMt+Nqxnx2VyYNEBrybO/bhbeiub2H4KwKvZ0aIZq2hRUCFqhAdmztxsBlH50AsrQSmogYAuHT5wdeoPAA5FXA5pTueSVQh/58qWFYE7JVAwGwkfrdU/9vDMge/BmezO5930KBHfNeOSdsyYnfYq4/Q3f78YrhzZp7gvhZd+fTR4xeb5y/+hvLohn+++Nd9ilky9o3OIZxCn2qOFlOWhkWgBptyRSetFUKVS+jQvJS1l5ZZ+cHYkb3WlhsepjbFVHtPpZaU8a23yVKKOWfJXksQdLgZ04nTJ1w9py49So9d1L1Ip2oxx9Q6DWOV+dnYem2luAOvTFJLajEl69WdVo8fsJWrJkum7BSdCIEpNeWqzd1Zp16jFnyIm3JMHL3hxJa+p24NH2GditQqSXFL5pjRyTJHbq3JcCI/fiNNpZu0Al3C7VanJEVLz1UjLudHL6RJTUqFxYnuipumIiX1WnOSRjszymspMWKVSnzBpKau2TRXNqkTLItVpYOAzAOVyqETc/QYlsNWpalqMbGSLGWccdNkUMbSU0u4PqepNTHOSoMU80CyH6+5NfeqPWrmPT3NEXuZ9tzcr1mnZkmcZ+u43jPgpj1bjWU4fqeppVIw9zQmwauNCmOJyzm+zEddU1ivZFmsSMPL+mg1yWTdrTS4MMOf6MTZZNpLFBg2GlZyzClrZSbuaZjAeppw9EnhDZlSb7HVWmIruIjLpCWXVq3l7iQ3Tj231CRlYwxZ1ZJYn1qiZXceP1jmxmGdxbqVGLP78k+pwQl3WA0V9qv10kpLWk2JEDjcbTZxVKYce6mF+AS39sGoqtSWE99IuZZaOf4zTvt9yrFq6UlSTgmkgKn13pplKUWbldBg71OqWKJKlR7qZDFZM021tywa2qSlxVrELaGNN2psltyEFVvXULDHpSi1S+upCt9oGGRSTGrwKpXOdh72mKWFMsH4Jik1d7ZEKFOsNUo2FVaJhDz1mquoxtRz0RYyHEaJmqzknK2+UxGN2ntTEasERqQpO2NsllMkAiJPsTOm3QxCCRuRU67EK2jB4z9PVmtKudYGEeITpfSKeTbm1I6/kA/rvKdnrUb4DPgrTSFPJZceq5klRWI4elAma2JWGjOTtIaK/Vmywq8hQxw/OGp3ZZVjcYUTY63cM/G55J5iI9Cg9RQanDtGRcOYWZn4ozeKQQwtIpR0FiCRH7crciBzP3m3I/Bro3RVlmdGZgvGnmhNxDClerQGe8AQYKAtnU2ipWnuLRGDQVwF8laMLUsyAngkTtFUNaXCFBNgMRm7KGkz8zgBnaKv1FRT88gN5TxJpWqL0WBldGopKY0r3QNVBAqQDaEjGRQAnp1zT2ptTOK9D5xx79JbhZolBIDetPeYCU3iCIqaU6+pjqiDozcSVBWpo6l5BCDLsRaLpaeoHnA8WW+qrtY1TqmjN7IfEGbaelEoUZow4vNfJX7nKD8jjivsueIOwRulIHo3aeo9KVPiiCouAsGb5smKpizeGyS6PBFORLBSq4mJzJOWZJjAC1SRB5xbe83KU61u001iTLWUKWrqKWYEm3F69ti1aGloC7wSBDppOZZMLNNRQ4+6mrNoK1EanBFD0ZOmGItAEUCUmTSl3lspojrq4PS03GsvHqSbOT2TFA6iRvjNUc/S1PDpEDGRxoF7tJrSxI6LmmpJsOdpyqmW0hUyBC+SOF61NYFUI7setQsBMIm1aBWKTyU5EeUlXaCZviDNIgyPNWKUZOqWMkcltM95N+nSoHZ01l+4u8ZRxSTJyXqLxUN3UMFws0Mxd3SwqRUEv2jNisc3HW61OKEvqlotl0SoH8xetJy0qnZi5Tixcm2lpySVQLop19KQxVNMxHP1iXVbmJcMNwfRka6aa6wu24bG8ZPUTKN1NY7BBE9UWpWixFy1qfZUIOiiBjNXpx611NoqnY81wE+3mjgNKsc01LAU6QWpNhLRVCfcKcRqVm25Q4Sl5qQ5Iv0W7dDtWtEe1EZIlHFQVkm15piJltJ3KsKMRUTe1PkGa9q6WCwtGcJlmTRy4KduMNkcKFDwiPxMh/x0qNV5VzyPENymanAaqSkUnvP44BvlsNp7OtdR4+RqpXaiIstUGSCxxnQAPnf4oHFslVwULVe00CZYafQ+Ir36iXPwoMIW7Le8TQkuPraCk1Rhno4mvyR1GaQWKYX1UlBGcqZU9Abt+IVarFS4M1hr1uDdRckp9s2PWG3cVney+gkr2je7+0C+GXeAqMD7baljDyffXFxevfy39TkXHkRPvtxcrM/f31wsTn87s5x7unxz8eXm+cu1a86/Od0ZI/D1CSffXK1/2Bko3pNw8s3l1eY5n/uzX/fgNoH9KNx9hfyi7f1di/EbajF+dUeH83e2a3zw+ur7t/qJFC1p39nhs7NvMD99/ep685d988ajq0vurMKxwe0bBxaN6kaJt9s08KT8Sf/Vn7dpYDT5CZsG3vU/adOow6bBTUJJMgeEwrWE5cHiUBYxbQxjOJlxiouraEKdH9Fmt9bBOEVRiIRFjHCc9u0k0nu2UmqkPFwqsayN8loElQsquDgpRoMEc4Q5Y+fSFqeEmrMgEpJolQ8AURCnjAK9xdwpz/mraq1Qft80UyI6/66d8iVRopVC+cJzFLCUL26nqMQf7xxivZcVzWpGh0SGoZdI3Sjf0NnXhHoxTojkHLeJ8nvWoI78lyOsGvJxh48CkSBOkOpcrPjwmVtGevPh2x9XQ5mbWiKOmUDLFK0W+HXUUFgsOizHFKlFiutTplsDlEySosEeoVedBJU59gy3hljqEdmZ8ooxhqBjtPm3UykTfDgMMbHaU8Iw1E0JLJ8SloncCxHRU/KOtQZ7M93avGTKmK/ggCmf0dL3UmCGp4IpDc025ZF7EYLhLqedlU2mCn+sWuF0p5oSl2YBeCATigj4VNQ/U7WaK2w0xW+tbDK1QnfNQ/+nhmGgdfXh63wYXTrlu5ucakeqmW4XrLjiCTHeh89Y7S1XHz6UAREu2I0Z2LWQ3FHG3xr2dIoNvlEqiH+TYItoEYAFnYS+oL6nvLiVyzJwf9PtHtFJE1PegRXQSWG5alOg/ibF4oP6hvLJN2Lp4MRNO1uiorKpAAlw08aUsX7UVMHDmDKjp2oA+k0Zu1pXlONoALe7UqeSc7UYW6Q8jGIsrjVVlB3InACo6ITqKrVeAO2bbs2XOjWscsYeJYHBpbBhSDBhGCko3zDlwS1S/pYQ6NSxPhijTILmY8GjvGHXEhpAgm2BKEH5W4tpwmJruK9zSYSrdHLu4EckLLboXbRiCwFJoKFVwxayoz13f7YUI/Ybt4q0FDPuxtDMnzeM1HBr4/+62hSl9yS1oEmzcPSgpalhMmI3p940tD41aw1lCIbdFnqa4OJdSY2tJ3SUBMiQKWK+BehjSqkx3kUzJMIMPS1aHLh1l0Ly1LMaBEgd8gKdQGMQtBaHNRN32VdrsSUYUVGIbm295wSxwYKDNqRlbGZYdlKcsmRli1bsj6lMmA8r5kAnFMkmFH7WMIu61Jyn3HqL2pV9IblPHZ13zzlDMwpmq669xlyw25Q6WcVUqCl2iFLF+izduiUEM6w9kxi7pOQO/onUNuXUsTDWnrHnNFqJ4iNHc1iD5kvA0JKzErAQTQjgLWPTxFzb2lRTbNjra0Md2mzKCZrZiYMA58yN1SpZe2SHCsEA1rp21eRAEx09WsnJOAJQ7fbkUlzU0npxYLM01cKWtpod16KjdG7aUkyuDuVBzG4PtuIW5q6co6jwY4F8SHean2sp2U90WlrZOpGZRZ3emutQm2mOzeHzCjaPgs69Z38jTSUikBm0V3zEeklVULrjvsCYsgKLoRYEhqPmieEraPAdJakSWpFZwV4Oq95U6ETqrSfofElTzcBvSCqAvEi2Cfu2Sm7Rka5ywWcCYwHKR4Dr4lSrNKlela8v3B44CiuBH5Kw5aPCKakV7IJaJ81sA7T/nCKKhV8Va6u484DUKTYER7R2LEmUZSh6c4wc3CCnuNIFOSgOrBgWUKwFssfJbMVZnggdNaK0Oxo4lkrOjbaGzvC0FjVbbYlbugwtoQJkgiICRFoOQZRhCPGxQxdKL61ZT+x9CQwxea0VPCksVOAhOpdJpog9JZSCIlCtupm41lA48yP+Iz0zjiHXyUyaaC+9goCTsQRrZsO2jEYkmetE0WMLNq2QytQj6ncn8liFMX6js0Gf5uDEtLTmmmtierF8Tp2BaNE04a6imXAL0Yw9HKQY1SlVU2T+XP0QgB/LrXkPgQMS4/BkKjXnjpdBQxEoTZK1jkFbkJwzwUhoNdnYFQZPIfe1JrROFf1PTvCAA+CnTrnjjwD5dzziyQpcUYEWQH8atnh1XZkNo7HvjZQtxeGsAHsa0RrjsIF1VxHHTWGetHEEZriurFZTVPdPqBOHWDFjLdSghvcJ5pQsasqAsgKzwKcSFwTZbNayJfgS8LI6diLYwxIh4yGjyEoNpabWJo2JTagri1V0zi0U4mJK5WitistMyRytPbsaqfKGTSl1jFWu/GZ9odi1xrkGzk/taB8zBL/UnsvPP/Cz8B/BQH1XMXGPvHakkYC03iG+d1US/ywi61e45r+D0Cr/5/Xm4l/1//i/ons57/njoe7+KY+836XX36XX36XX36XX36XX/4TSq9m0BOryH2iQhw8kVpiXWHBfqW4P06mklLCKCDfpicDNdElSJbs/lOLXgKEGg6o7x8XJcO7FfdEtpalOXRRv5pocaB51RBtW3wjYYe6TtJKq6yMRWQouQFqbdaynDqo9DcnAT3kkxzS1TNh4Vvf8rR1LPob+kl1F1tA5VOy/AugpglNEO5JbRtocMp830yKqMcC4J7xIkfAQ2cDyRW6steeEJzT+ic6BwjzCPYOWO42gZ6O53JZbJqAbi1jBAINbI3oQ3DV7B4fR+qTamxa1iFpVzCZ0dwjRqblzpGG4QwZWdZPv3Vmiku0brdSCGL18o5oVrQg921pys4JD5bYVpSUxYDJ37cTWT1+3PcHu7ICW275mPolougxGE4QFvB+X4RLsVi4AL/PeUS6Cirgd8hTRHALfvsyJ5JjdtL/MGqKqVSy622ltKL8QAsoy8QnHYrQU26XRsEM6fvmyePATdu/U7fJqGDWpdrv+ErCXTMJ2hTYUXO73tqxhV8IgVS+rXC0K8AFARI59QM8G4OfYKQhf+F7s9hKsPn7HwRJCNUbh4vEFoeN9gi+FDU1a6EjZ0iu+2wVZopVJElCnuIDjA416CXtva2YFPWpNk/SGK0DHeGyhtCnjie/qNJwkC3AKuWIYxxUD+OEJh0lBUQNyQchojCU3ijX8AlPFH6pYR2ECqGoSHHi0YwvuhbsWGn4sOIc1LiBxx0JUKbUhwLm4RzM7fkwZf8YyldoUFz3pWB8w5lfkbUWNCziu60YsqebYe8MY7QgAMVaUWq3jLoXnEgINrmzo/SRLRdWUc2+LH7wQriC5RHyyUN5jSU+9aHfI0zgJvtWo/lsmA3cxXALx/UDLIKfveUSGv9YIGCA2g1AKPkWcAO4ZDqZKQbacmWQwVZf24NiIrw7+XN5iq60qmtNtn4j8kNaB7h29xixRquvrl3HJaABdUb6MnCHpupLIlwDOPFEYmN3o803c9reTk3FKrbgCLNNneMNhfFkmuEY2boJcbpdAr1KhkdtFoi6RG5fi+SpKFavHANX2ddaK9u6C8nYlWoJmxLasVVTeKXd89pfVLCi+rea0Xe94PmTAqJcN0aU1xHUQkX3LlKR4AzpELXAMMcairTTHxf2ZB/8UQuxd+e1Ymj2k+L+xNPvw8R++/PLhZx+93Q77L1enZycrsV9dkP72HNiOd4pr++rR+ntHDuP1+yLbfkUYImy4oAS8RxBML6hzII/19D3i0Z4I0Y99qrVFvI8QuQHXIXxDpSTBgQTc5y24TpuqVG1JUyN+hW8vaCUObfRkm3LrHnQZZ8pIVY91ebGPr21BTvC5Bf2k1Z4cFmcfm4DW/+ECBEwszV++WD+7/GEPm+mDyyugztbPNq+vR+zjLjpgNx1LcPwN0cmMN1hf94PcbjMHwq0yFofwbjuE21v82QVp7NPLi+enhJknFBOfra+eby4czobeotb4ZRGgh8Ad65vTN29bLTR86aV30Hv6jgAI7zoa28HZx7/bDQaZC4bgAh64p8f56bjKoeN5ubkZsbUjyJUR/NxdZXYR5vj1u8a6ZI0mf/1LOLkk3vXri9fn54A//+UI/vl3PLHbVcgkHIFJPj5znFmm4Mntz4fjJyUeXztMLehFvHMn9XCkKOyYJ4eOJOBzHKyC3XtbOLWB5bh7dft4+0mK70Ot8cl94rB78Q56idMkh9TKTliilG5wcls4sUY0WiO8Lw14KQieA3DxX4sVj9EdwSN2sWeNEWrGMBzAicWKv22MESfVzMrdAoZ9B24mHh3kWsVVfS/3ZCU5IaEansDF1Ku82cf8+pvwxAjPRO5FJHRwtD/d+XaOZR9R7B8XTizj48t/tebSEtO4RQv77v5Z3mY79cVOiAetWKlWuNtiD68MvDAteSow0DHhOoHH0hYujO8fr5Zt7gATq8RyGsJrSQ51tgcmVu6AiTH57wwldgwX9ttCiR039e8AJIZLJFBhflDy840juixP129OVqroRtxxg5ABcn4hgJgf4pun323xHzZPv1vwuW9huz+93GJ2f3q5Bex+tH7myKCDq3DkzBfrzQKyvUs+ulzYjn2yRJWHFOmzy2ebs80+hCfYvG9ukXhJ7uHQPPz2+oPLy6s9yE9AvtffAs2/YF19vHlz+uzh9avTpzdfrG82e6DJ+yhYh3zEgFO4WL8EHmGLQeEXwYAmMY5UFzw+enP69JexLHfLLwzJMUIYoLM7gIa3ZP8OIHa/XACdPjhUSe4dnIdn5l3g7mN4UhcN/OiRsdT9MNyefsfbb3+h89qdhf6ry1S/GXDY01vksHXN3zqK8W5Rfrl+eXqIGvbqehNAD3t6ef2vr643R8ZKR+/6G+fip+FDGO0jV9vfEDxsv6f/OOBTW9qxEwx+EfSUezQPBDFf9ANCjI/+/dGn3nJ5yLuhT/0ccpj+Dho2yNmvDvj2O2iY6xf24Oy38Hzsoh0v9x+5s/5OoGHHh+MReMV/JtCwg+H49YNr/uNBw+Aa4F5/PRYMseenj31YvqNj/5ejhr3nShz+Nv9b/G/yv8Lfbv7Xc7vnds/tnts8t3lu89zmuc1zq+dWz62eWz23em7x3OK5xXOL5xbPzZ6bPTd7bvbc7LnJc5PnJs9Nnps8Vz1XPVc9Vz1XPVc8VzxXPFc8Vzw3em703Oi50XN3CODLf8TLRPDQIka5CLJZBB4sYlgTMoQMIWPgrpGhjqBGhpKhlHBTXCIjkZHISGQkSmQyMhmZjExGJsPB2BzRrJBRyChkVEpUSlQyKhmVjEZGI6OR0choZHQyOhmO0LbAnAFvRoZbHY0SRgmzn48oWIIUMzejgjlEDE4HQQg3Baz5QXLwn8rF9Q5C5G9xl+r40YjvA3AoheSxfhmf0VAH7FAORCaowxvV0Hpoxv/jGCBc7Rm4pJN7grkfk4Rfr4gJ3y/KBC9kAXniDkSecSemx47jmwEQlN9jHvwOQmBiMKoPR47ld12AmRbgKGBLCNwBr2x4QQwwJ8pg5uOaStwnwBDwe9M1+NWGPCMNyAvRTYQb8W3C1r09fkcj9yVyIThm+wH6FGNoA/TqH8Gf9ZcALv3vAi3dKfeOAEtHABpl0mKNu8lR/1XinQ9gUO7BMDkAJDmC+gBrIRJV0nAgNwBIjoocvJGICRsQQl1xtLkHxOToGznljCnakSI04J1y8OAAbSUfoZYc4LOUCf92xXMpY1n/+RL3oJgcosQc4J4cjXCdVDqBLNxyqpWg/LufqJMDQihB9H4nxhHsSZuaOhxT61pqvBcY5QDvphEqmURVWitc+tqAJGiixWLNJRNjfgSzc4Cl0vHyar27qZMrUI/QuI4eHMBzCfQ5e4iAuWeK0ddeciKMNOFUM3HVB3EGwCFxgfIxglADzgbcHtCxHNErJmIbUGb7HcyH3xBODgVcqVRJftntlLR5SF/qHYIMoSf0oqSKmxEPcGvidtqaHHrxEB7pPhSwIiNoE6Qibsk9/KgQ8RA7iJuFMReiLnMp1nrN4ELwAIhEMS75JT6KKEOgyGruy6W5xHekTrtygTYTbFBzVTw38PRSAEGUmMfuAZBgxVQTM8LJ3APtCKHr+BNS7kCP3VeiVeI/kwKzSSVHKFZHSFh3cdZAWczN740h7s0BQgjaccwV7rEHKisCLyRFe+H8PGpGnmIBAwdEKqI7QJu5i9B12LUjxC6ATEppNRtORz5+B/BbCcgV7GKEi3JyASlZva3gbXitIMqBXWfE8/ocsL+rWB33Nt+D6XXwjXum7QCr7R7AsqNJoAXu0ocX5L3r62iN3t2RQsRex70xayHc7JcjiRkIKkq4jLJu7QgnbKjS3xVi6Qg/g2CanIlQxQAZ8zESyj0oJgeQJEdAH4WIQaarCohpYIMcFTl4I0+4bQHoWipU8RjF5J5vEEImpmrF744uxw8O8FYI/zsALTmAaCGwqsdcgUYhpOgditwDY3IAFXMIfHKENtOIREtNc4GnUMfeuos2Q0gY91NprAVXwWPgE+6wYotzrXki2vceaJQD1JvO2QcGW86tDNBI8AdrSUTsDuScI7Cdu2gqNoLGIsHzeBoeI3K9A0QXMe4gyAG60AaeHo5z+GxmoIDZSFlqMjzxCUvnwSGQUBeF9EcgqRzFLzqYWWTI/Jb5w0+IR76CQVXNw+4E5iGBtGMdFASHF8zYzgHWhf0WzOng1RAzSWDeu+CAlSp4WVuWhuc0mIV3PurB62JgDBM46CRRulR4QHHIRuVkA4EO7EpclDHrg0+QDL7DPUZxWCwE7Yu3NDk5c3dOIVgeaKsG+HAh0p1aPBKYWNIWQbdz+Ky7GF33fOMAfuwI1oso3gp4IneQIfjcB2V1iIZ1ALZGUHiWlDOR4zgcZ3A08cZMBcBFBshyTg1IDfEw3qN2FDA7OKEBKAbM6gim66hzR7hdGbBgTvoq0SFCj1C4PKI745WbCICltzXBgDQhxjZRbRHiCqsBTjDQOLHZJ8IsHR3i6KNH37hn5u4Att0DWnY0CQCWVQZEc3K0uqMVdrRKD7YkCBMZsGUi6Qdr9IvxxCJOFuBgSjYoxR20MA6yu8GMB3eVDIvDkQOownXsTfaBA+hbEJb8td8YWel3pcVQdPyGSotf3R78G+Mrod/9pwJYGh5HPwFAzQvfn6y+fo+7CWLU4D/Ce64CNRuqXG4Udv3w0KGaa0aJfeehYzFtX3RtqVXPGNnZf7vm1NR/86d7qe4vdn+le6Y/buOvZzbPbJ7pHx/YT9Uzq2dWz/QHxUuW8dszi2d6U7JnZs/Mnpk9038mz0yemcYTzxzqYs9Uz1TPVM/0P+KZ4pnimTKe08/omdEzo2c6jH/sxCKg92gq7fQ91wuPCzrAaPJLJByHCrWrI02NwA3gmPy6DMCb/EIMx4TySy8c9wnVrSM7+dUVDt/k11M48pQjTvkvvuM4Va4w5vm4aoPn4zoNVMU8d8wovxTDgaFcU8xzv9rC44v9+g8HjeK5Y1z5JR6OY+W6Y54P3TGVDwUyFQwtsqugXYvOinIrBH9cLc7CIwEJ4v8Yo2Wh/qzumZW9u7Hm65qmkrVnUD2IhCKm4+6Dkie/KaNzpwWxfIUh7oBsR6I8SsiNazIIxioAqEvIBTyExltgUAuxJoAdZWkg9nTHQ0hw89yb0IHMB6PCtAGJy+UTIcEvaOReTDQ3GlIEJxWUoJ4SAIjEI8E2dySaxi0SrswDlrs6vi5RMg1QGW4/ybApKpMQ1JTQCxGNIn2qRUFY4EZUWB3QachWVClonBGXQeggTAncqEIQU25c3FLh4sqk4CCBjxPzeAEwTZQNZmlAVEQDyZOIgIIepALHbMWimgcRiaPcl0T4DtF6xFIlwJpEk9TOpRLcsGLJsYAKYEiqUwHvJYLNzaQA0BFTQ9AiyrAB4QGUORiwoK73oB2mLWYgmbRhOMDMwf0voK3FIow5l0s4sL7k5MghHgMGMAUYPcBYRAYHPC1i04BzAQ8ut9I7kK45IWwwIFwunDzyTBQw4Gwgy4bcJ0MVlRoInU2JMgIbyRoKFrXEemuxJOFKFtRVhLfVkgg0I5oJVFOsN7UUIlL5MGu2ZiCJUL6UWEKtE+I2l4I0kJ8JTGrcE0C8VAXMhzBEFeCzoyQunmjMdHOUIT6BtWQCLKa4moxd43hAXDPjsV8t9DKBRw4qFveNYFKZlDA/EFxBag7GZTIEhYK/QdidoZHu5mBLgLdYA1iEgam9d9cHAgVtAG0lFK+YMqaSgaBv0RIXCeA3rSCvAQuGCBRtyj1LJeqqEBuKYEWEXa4Ai2MZAWxMwBcHhMkjGwWUVS40KASgagTViZjVCkJSEEX97rGCyv0LDsMDMn9rXEVACS6LBnofJFnwgxKX2PQINosjzUrKAO+CPsaV0SMEswLBy50xycUK/4YgjqByDgKZAM9fQX+mSIYKICwbwCYBPKEutQDyn0FAkdxA3nM85ZaJnM02gRNUU+o101Ci2LiLKXLTCxGpoBZVQZQATAxWbvK7CwzRjOErDcSqIXdzoxLxp2hXwIA1AzWruPDPXQQ5GZfpgJWEqp5AOFfrVi6rybkrPuxI+hWQ9ghKPMhHQN1kLsxOXH0MbDD2rSm2AmRw9Qu0eVBNoROlcCuy1DoJwZRNUkpogmudMoNHiKaruVn3oEk3ax0ayQOGEnnYceN4AKIOMUPKFqcW6K4mq2xCf+ABfEXAXnODGzGrHM1I5zxIE+SrgGAdGdLq+DdAUNXuV0bUOBW2FshXxOeWDsQc4araOxqHUsF4TDlVMJd5kLCKpEY8gPoDmVCLOlkkLpCpBjdLMAthHgUPOFsHrqw0bJM29Qa6PTcsETacCshIoONoyuwDHXeFFEXnMhY5ykH81wlPdaoL0LGiBh/7hmuhGiGnrsBGW69ZHFoLvRLAUkDX+WUZhfMkxgmy5zoJzRhaJwIcCpePVPplacoamwrQf4xVtynlBo6dX4MA0JSfSGwSAuyJmARoORdAkwAEb30CgIwVzNmWwJuzbMCONxCJEvSQq564jiR3cN5+9oFzDf8IdtK7ovI74f4cLvrfOFLyNxKlvhqgPz8jSd2NGt33p/kPR/35XaRy8eZ3kQoZCtHmP6tIhecJ/zocpcYEzqJhg+rIrLlbBHU4GSwnPAiXCGJoqDCloOyDHADgXYWPdUGiOAQ/iG5IfdXvUSKes4RSwWuNAFli8i6hYCRE+c+NCsg4uU5gpOz+c6a9aRGLHIVFXfgi2I7rJbFUAB5AAxWwWuMSI20TEgCaes0VfyVH/AWvn4OM47dOGfuScOgXfIR0Uq5L9MsGsnGtT+eeFaD84F65Toczjht6uJ+S69f8ir8OmmJy+QChVkXggoDeQ52Plxe3qGTRzs0aCN6xElKNmQEoGXcUQ2fj/whl5CIOAKqxlfbWABVxpUBPCGDwMbBHXH0IB8sFIMlBtR3/lptggGtEIcHFOvv/Cba5CLohN4b6jY1t0sg5HbkvApBDgF25RUYRxBzFGUjHyv1SmPGR9mCnCC4HTZ9LgqRMrasqOnbWAwIiCKTFr7rJCXHQuGWpmHEZZw64kDr7xn0wCGrKsuiN20+4S9EhC1vkBhxkJDUBs9CBejPd5YqZhOOKxIawz30PAEmmWhQHiswdYmAWAlGbHamhc+EC2Jwh48HBvROGf0IJJSEqWBTYbgAbYKhhwEsFNCg3VjFXqQEeyt0xjoxZemfGuI+GB33KAqpPAWBUla3h8A+sR7oYWp0E1PMKKiPVsrucLQKNtbYKJxURIbkJCWgP5LPINWOW4ROjBVO2V+aKDI181NhvkQuFQOUEOZStnIBMkvHPPUPahGhvLSeX1rF9te5g3Nlwk0NrwNUoDfBwv4DQpm7cswVQCTKbpqnDlacM0BAP3GFHidE2v86M20JbA0qFSXRuFg8Da4YBF4HLJjFx2Tz7hssOqswlUA4oEyTXqXB1Sq9AZcNk418pLHLE88F1485Q2oR4AOKMwxPDv9cBu6LcyOQsP7OrBtSmYy81kF0J39TO/Vpg8nLhGODWYDBxiSPWceUWaEOulwYhUu7vxGZDEfOrb9ijAyQKVhc9AoA75pdH5glvJC7ywzWJWyIRcIpfvZeRITtww4kbXks15FDDI5dbPpHlGXtDC8SmNgBQAWzKAGsWkFuzI+46WhK26lg1A6uD6Gkd5h8Lal+An7g/gzthYh5uN2ZTk8oVg9zDBDSUASrOFAFR7UnHYuYeGcy/QDhzl2hFPgDHyDBuY86NMSbHaGoTt56hSKps0tG0NLGeuaHFMs5MNtRYWJuSw6d3AG24OQVkLMQ+YIetoHsAOgs85I6nlnA5HvK1wzCJW5ajtkJbaufiWy69YQdC0N222LhLl/tkXOoFWJxv5AbAa4HquGDmCKyAV7t3EUogNQdbB9nVl6rv2lZSHrIaW4q2cw0jHSdaGJVP0wTuUwBRTCugv2AYI4SzhVoRLtVJ7n2FIZPdAPIqkr+jwqAKMJac710UOG9/8E8h89xl+I+shAdr7jcWfd4VJCaXX92AtUMl+fnLz/9DQGK428H/EzXXnW4hYnBQazkqFy86MCtxoqhzx38oS0Eb28LEAE5s3Jio3N/9O0rMMUoMQAO3+Bz/cSgx7xrs+s8CFIPEgCGDyx66tPuAYv4ClNDTq80rbmByyJxPNs9fnG+ev7j54PLi4vTpzW1cvkfZj2DTs/X59elf/z/ejPX8').then(json => {\n",
       "   const obj = Core.parse(json);\n",
       "   Core.draw('root_plot_1779222620294', 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_1779222620294();\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
}
