{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "728ed8a8",
   "metadata": {},
   "source": [
    "# rf510_wsnamedsets\n",
    "'ORGANIZATION AND SIMULTANEOUS FITS' RooFit tutorial macro #510\n",
    "\n",
    "Working with named parameter sets and parameter snapshots in\n",
    "workspaces\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:32 PM.</small></i>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "4ca294f9",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:32:32.125742Z",
     "iopub.status.busy": "2026-05-19T20:32:32.125614Z",
     "iopub.status.idle": "2026-05-19T20:32:33.099072Z",
     "shell.execute_reply": "2026-05-19T20:32:33.098650Z"
    }
   },
   "outputs": [],
   "source": [
    "import ROOT\n",
    "\n",
    "\n",
    "def fillWorkspace(w):\n",
    "    # Create model\n",
    "    # -----------------------\n",
    "\n",
    "    # Declare observable x\n",
    "    x = ROOT.RooRealVar(\"x\", \"x\", 0, 10)\n",
    "\n",
    "    # Create two Gaussian PDFs g1(x,mean1,sigma) anf g2(x,mean2,sigma) and\n",
    "    # their parameters\n",
    "    mean = ROOT.RooRealVar(\"mean\", \"mean of gaussians\", 5, 0, 10)\n",
    "    sigma1 = ROOT.RooRealVar(\"sigma1\", \"width of gaussians\", 0.5)\n",
    "    sigma2 = ROOT.RooRealVar(\"sigma2\", \"width of gaussians\", 1)\n",
    "\n",
    "    sig1 = ROOT.RooGaussian(\"sig1\", \"Signal component 1\", x, mean, sigma1)\n",
    "    sig2 = ROOT.RooGaussian(\"sig2\", \"Signal component 2\", x, mean, sigma2)\n",
    "\n",
    "    # Build Chebychev polynomial p.d.f.\n",
    "    a0 = ROOT.RooRealVar(\"a0\", \"a0\", 0.5, 0.0, 1.0)\n",
    "    a1 = ROOT.RooRealVar(\"a1\", \"a1\", -0.2, 0.0, 1.0)\n",
    "    bkg = ROOT.RooChebychev(\"bkg\", \"Background\", x, [a0, a1])\n",
    "\n",
    "    # Sum the signal components into a composite signal p.d.f.\n",
    "    sig1frac = ROOT.RooRealVar(\"sig1frac\", \"fraction of component 1 in signal\", 0.8, 0.0, 1.0)\n",
    "    sig = ROOT.RooAddPdf(\"sig\", \"Signal\", [sig1, sig2], [sig1frac])\n",
    "\n",
    "    # Sum the composite signal and background\n",
    "    bkgfrac = ROOT.RooRealVar(\"bkgfrac\", \"fraction of background\", 0.5, 0.0, 1.0)\n",
    "    model = ROOT.RooAddPdf(\"model\", \"g1+g2+a\", [bkg, sig], [bkgfrac])\n",
    "\n",
    "    # Import model into p.d.f.\n",
    "    w.Import(model)\n",
    "\n",
    "    # Encode definition of parameters in workspace\n",
    "    # ---------------------------------------------------------------------------------------\n",
    "\n",
    "    # Define named sets \"parameters\" and \"observables\", list which variables should be considered\n",
    "    # parameters and observables by the users convention\n",
    "    #\n",
    "    # Variables appearing in sets _must_ live in the workspace already, the autoImport flag\n",
    "    # of defineSet must be set to import them on the fly. Named sets contain only references\n",
    "    # to the original variables, the value of observables in named sets already\n",
    "    # reflect their 'current' value\n",
    "    params = model.getParameters({x})\n",
    "    w.defineSet(\"parameters\", params)\n",
    "    w.defineSet(\"observables\", {x})\n",
    "\n",
    "    # Encode reference value for parameters in workspace\n",
    "    # ---------------------------------------------------------------------------------------------------\n",
    "\n",
    "    # Define a parameter 'snapshot' in the p.d.f.\n",
    "    # Unlike a named set, parameter snapshot stores an independent set of values for\n",
    "    # a given set of variables in the workspace. The values can be stored and reloaded\n",
    "    # into the workspace variable objects using the loadSnapshot() and saveSnapshot()\n",
    "    # methods. A snapshot saves the value of each variable, errors that are stored\n",
    "    # with it as well as the 'Constant' flag that is used in fits to determine if a\n",
    "    # parameter is kept fixed or not.\n",
    "\n",
    "    # Do a dummy fit to a (supposedly) reference dataset here and store the results\n",
    "    # of that fit into a snapshot\n",
    "    refData = model.generate({x}, 10000)\n",
    "    model.fitTo(refData, PrintLevel=-1)\n",
    "\n",
    "    # The kTRUE flag imports the values of the objects in (*params) into the workspace\n",
    "    # If not set, present values of the workspace parameters objects are stored\n",
    "    w.saveSnapshot(\"reference_fit\", params, True)\n",
    "\n",
    "    # Make another fit with the signal componentforced to zero\n",
    "    # and save those parameters too\n",
    "\n",
    "    bkgfrac.setVal(1)\n",
    "    bkgfrac.setConstant(True)\n",
    "    bkgfrac.removeError()\n",
    "    model.fitTo(refData, PrintLevel=-1)\n",
    "\n",
    "    w.saveSnapshot(\"reference_fit_bkgonly\", params, True)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4f66cccf",
   "metadata": {},
   "source": [
    "Create model and dataset\n",
    "-----------------------------------------------"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "103d036b",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:32:33.105198Z",
     "iopub.status.busy": "2026-05-19T20:32:33.105060Z",
     "iopub.status.idle": "2026-05-19T20:32:33.608328Z",
     "shell.execute_reply": "2026-05-19T20:32:33.607639Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#0] WARNING:InputArguments -- The parameter 'sigma1' with range [-inf, inf] of the RooGaussian 'sig1' exceeds the safe range of (0, inf). Advise to limit its range.\n",
      "[#0] WARNING:InputArguments -- The parameter 'sigma2' with range [-inf, inf] of the RooGaussian 'sig2' exceeds the safe range of (0, inf). Advise to limit its range.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:ObjectHandling -- RooWorkspace::import(w) importing RooAddPdf::model\n",
      "[#1] INFO:ObjectHandling -- RooWorkspace::import(w) importing RooChebychev::bkg\n",
      "[#1] INFO:ObjectHandling -- RooWorkspace::import(w) importing RooRealVar::x\n",
      "[#1] INFO:ObjectHandling -- RooWorkspace::import(w) importing RooRealVar::a0\n",
      "[#1] INFO:ObjectHandling -- RooWorkspace::import(w) importing RooRealVar::a1\n",
      "[#1] INFO:ObjectHandling -- RooWorkspace::import(w) importing RooRealVar::bkgfrac\n",
      "[#1] INFO:ObjectHandling -- RooWorkspace::import(w) importing RooAddPdf::sig\n",
      "[#1] INFO:ObjectHandling -- RooWorkspace::import(w) importing RooGaussian::sig1\n",
      "[#1] INFO:ObjectHandling -- RooWorkspace::import(w) importing RooRealVar::mean\n",
      "[#1] INFO:ObjectHandling -- RooWorkspace::import(w) importing RooRealVar::sigma1\n",
      "[#1] INFO:ObjectHandling -- RooWorkspace::import(w) importing RooRealVar::sig1frac\n",
      "[#1] INFO:ObjectHandling -- RooWorkspace::import(w) importing RooGaussian::sig2\n",
      "[#1] INFO:ObjectHandling -- RooWorkspace::import(w) importing RooRealVar::sigma2\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:Fitting -- RooAbsPdf::fitTo(model) 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 858.435 μs\n",
      "[#1] INFO:Fitting -- RooAddition::defaultErrorLevel(nll_model_modelData) Summation contains a RooNLLVar, using its error level\n",
      "[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:Fitting -- RooAbsPdf::fitTo(model) fixing normalization set for coefficient determination to observables in data\n",
      "[#1] INFO:Fitting -- Creation of NLL object took 325.222 μs\n",
      "[#1] INFO:Fitting -- RooAddition::defaultErrorLevel(nll_model_modelData) Summation contains a RooNLLVar, using its error level\n",
      "[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      "[#0] ERROR:Minimization -- RooMinimizer::calculateHessErrors() Error when calculating Hessian\n"
     ]
    }
   ],
   "source": [
    "w = ROOT.RooWorkspace(\"w\")\n",
    "fillWorkspace(w)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2497daf4",
   "metadata": {},
   "source": [
    "Exploit convention encoded in named set \"parameters\" and \"observables\"\n",
    "to use workspace contents w/o need for introspected"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "66b3b83e",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:32:33.609942Z",
     "iopub.status.busy": "2026-05-19T20:32:33.609814Z",
     "iopub.status.idle": "2026-05-19T20:32:33.720243Z",
     "shell.execute_reply": "2026-05-19T20:32:33.719571Z"
    }
   },
   "outputs": [],
   "source": [
    "model = w[\"model\"]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "673a0465",
   "metadata": {},
   "source": [
    "Generate data from p.d.f. in given observables"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "54078328",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:32:33.722343Z",
     "iopub.status.busy": "2026-05-19T20:32:33.722217Z",
     "iopub.status.idle": "2026-05-19T20:32:33.835175Z",
     "shell.execute_reply": "2026-05-19T20:32:33.834481Z"
    }
   },
   "outputs": [],
   "source": [
    "data = model.generate(w.set(\"observables\"), 1000)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1d7439e8",
   "metadata": {},
   "source": [
    "Fit model to data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "e85189c5",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:32:33.837409Z",
     "iopub.status.busy": "2026-05-19T20:32:33.837278Z",
     "iopub.status.idle": "2026-05-19T20:32:33.946354Z",
     "shell.execute_reply": "2026-05-19T20:32:33.945745Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:Fitting -- RooAbsPdf::fitTo(model) fixing normalization set for coefficient determination to observables in data\n",
      "[#1] INFO:Fitting -- Creation of NLL object took 237.872 μs\n",
      "[#1] INFO:Fitting -- RooAddition::defaultErrorLevel(nll_model_modelData) 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": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.fitTo(data, PrintLevel=-1)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b94c2ebf",
   "metadata": {},
   "source": [
    "Plot fitted model and data on frame of first (only) observable"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "5a9fe847",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:32:33.948212Z",
     "iopub.status.busy": "2026-05-19T20:32:33.948084Z",
     "iopub.status.idle": "2026-05-19T20:32:34.113273Z",
     "shell.execute_reply": "2026-05-19T20:32:34.112564Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<cppyy.gbl.RooPlot object at 0x561888d84b80>"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "frame = (w.set(\"observables\").first()).frame()\n",
    "data.plotOn(frame)\n",
    "model.plotOn(frame)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8873e05f",
   "metadata": {},
   "source": [
    "Overlay plot with model with reference parameters as stored in snapshots"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "2a537f6e",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:32:34.115047Z",
     "iopub.status.busy": "2026-05-19T20:32:34.114920Z",
     "iopub.status.idle": "2026-05-19T20:32:34.233943Z",
     "shell.execute_reply": "2026-05-19T20:32:34.233399Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<cppyy.gbl.RooPlot object at 0x561888d84b80>"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "w.loadSnapshot(\"reference_fit\")\n",
    "model.plotOn(frame, LineColor=\"r\")\n",
    "w.loadSnapshot(\"reference_fit_bkgonly\")\n",
    "model.plotOn(frame, LineColor=\"r\", LineStyle=\"--\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "15ae409a",
   "metadata": {},
   "source": [
    "Draw the frame on the canvas"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "5034b882",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:32:34.236198Z",
     "iopub.status.busy": "2026-05-19T20:32:34.236042Z",
     "iopub.status.idle": "2026-05-19T20:32:34.450779Z",
     "shell.execute_reply": "2026-05-19T20:32:34.450166Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Info in <TCanvas::Print>: png file rf510_wsnamedsets.png has been created\n"
     ]
    }
   ],
   "source": [
    "c = ROOT.TCanvas(\"rf510_wsnamedsets\", \"rf503_wsnamedsets\", 600, 600)\n",
    "ROOT.gPad.SetLeftMargin(0.15)\n",
    "frame.GetYaxis().SetTitleOffset(1.4)\n",
    "frame.Draw()\n",
    "\n",
    "c.SaveAs(\"rf510_wsnamedsets.png\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "41241c26",
   "metadata": {},
   "source": [
    "Print workspace contents"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "dbb125b8",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:32:34.452986Z",
     "iopub.status.busy": "2026-05-19T20:32:34.452855Z",
     "iopub.status.idle": "2026-05-19T20:32:34.563940Z",
     "shell.execute_reply": "2026-05-19T20:32:34.563334Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "RooWorkspace(w) w contents\n",
      "\n",
      "variables\n",
      "---------\n",
      "(a0,a1,bkgfrac,mean,sig1frac,sigma1,sigma2,x)\n",
      "\n",
      "p.d.f.s\n",
      "-------\n",
      "RooChebychev::bkg[ x=x coefList=(a0,a1) ] = 1\n",
      "RooAddPdf::model[ bkgfrac * bkg + [%] * sig ] = 1/1\n",
      "RooAddPdf::sig[ sig1frac * sig1 + [%] * sig2 ] = 0.999807/1\n",
      "RooGaussian::sig1[ x=x mean=mean sigma=sigma1 ] = 0.999765\n",
      "RooGaussian::sig2[ x=x mean=mean sigma=sigma2 ] = 0.999941\n",
      "\n",
      "parameter snapshots\n",
      "-------------------\n",
      "reference_fit = (a0=0.488363 +/- 0.0241765,a1=0.0249649 +/- 0.0384439,bkgfrac=0.484424 +/- 0.0115194,mean=5.01085 +/- 0.0103629,sigma1=0.5[C],sig1frac=0.757184 +/- 0.0357497,sigma2=1[C])\n",
      "reference_fit_bkgonly = (a0=0.469143 +/- 0,a1=7.71653e-08 +/- 0,bkgfrac=1[C],mean=5.01085 +/- 0,sigma1=0.5[C],sig1frac=0.757184 +/- 0,sigma2=1[C])\n",
      "\n",
      "named sets\n",
      "----------\n",
      "observables:(x)\n",
      "parameters:(a0,a1,bkgfrac,mean,sig1frac,sigma1,sigma2)\n",
      "\n"
     ]
    }
   ],
   "source": [
    "w.Print()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "59075316",
   "metadata": {},
   "source": [
    "Workspace will remain in memory after macro finishes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "6555d497",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:32:34.565860Z",
     "iopub.status.busy": "2026-05-19T20:32:34.565715Z",
     "iopub.status.idle": "2026-05-19T20:32:34.684249Z",
     "shell.execute_reply": "2026-05-19T20:32:34.683865Z"
    }
   },
   "outputs": [],
   "source": [
    "ROOT.gDirectory.Add(w)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4bca9fdc",
   "metadata": {},
   "source": [
    "Draw all canvases "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "4bb01007",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:32:34.686562Z",
     "iopub.status.busy": "2026-05-19T20:32:34.686436Z",
     "iopub.status.idle": "2026-05-19T20:32:34.870107Z",
     "shell.execute_reply": "2026-05-19T20:32:34.869343Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "\n",
       "<div id=\"root_plot_1779222754860\" style=\"width: 600px; height: 600px; position: relative\">\n",
       "</div>\n",
       "\n",
       "</div>\n",
       "<script>\n",
       "   function process_root_plot_1779222754860() {\n",
       "      function execCode(Core) {\n",
       "         Core.settings.HandleKeys = false;\n",
       "         \n",
       "Core.unzipJSON(34987,'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').then(json => {\n",
       "   const obj = Core.parse(json);\n",
       "   Core.draw('root_plot_1779222754860', 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_1779222754860();\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
}
