{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "893cf7f4",
   "metadata": {},
   "source": [
    "# rf616_morphing\n",
    "Use Morphing in RooFit.\n",
    "\n",
    "This tutorial shows how to use template morphing inside RooFit. As input we have several\n",
    "Gaussian distributions. The output is one gaussian, with a specific mean value.\n",
    "Since likelihoods are often used within the framework of morphing, we provide a\n",
    "way to estimate the negative log likelihood (nll).\n",
    "\n",
    "Based on example of Kyle Cranmer https://gist.github.com/cranmer/46fff8d22015e5a26619.\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "**Author:** Robin Syring  \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:33 PM.</small></i>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "3cece6f8",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:33:57.904544Z",
     "iopub.status.busy": "2026-05-19T20:33:57.904424Z",
     "iopub.status.idle": "2026-05-19T20:33:58.874058Z",
     "shell.execute_reply": "2026-05-19T20:33:58.865435Z"
    }
   },
   "outputs": [],
   "source": [
    "import ROOT"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cdede8ed",
   "metadata": {},
   "source": [
    "Number of samples to fill the histograms"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "e4409e39",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:33:58.875765Z",
     "iopub.status.busy": "2026-05-19T20:33:58.875621Z",
     "iopub.status.idle": "2026-05-19T20:33:59.031424Z",
     "shell.execute_reply": "2026-05-19T20:33:59.019646Z"
    }
   },
   "outputs": [],
   "source": [
    "n_samples = 1000"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "082aa65f",
   "metadata": {},
   "source": [
    "Kills warning messages"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "9073a6a1",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:33:59.040348Z",
     "iopub.status.busy": "2026-05-19T20:33:59.040209Z",
     "iopub.status.idle": "2026-05-19T20:33:59.215248Z",
     "shell.execute_reply": "2026-05-19T20:33:59.214208Z"
    }
   },
   "outputs": [],
   "source": [
    "ROOT.RooMsgService.instance().setGlobalKillBelow(ROOT.RooFit.WARNING)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5237c1da",
   "metadata": {},
   "source": [
    "morphing as a baseline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "93d70008",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:33:59.216798Z",
     "iopub.status.busy": "2026-05-19T20:33:59.216659Z",
     "iopub.status.idle": "2026-05-19T20:33:59.322377Z",
     "shell.execute_reply": "2026-05-19T20:33:59.321262Z"
    }
   },
   "outputs": [],
   "source": [
    "def morphing(setting):\n",
    "    # set up a frame for plotting\n",
    "    frame1 = x_var.frame()\n",
    "\n",
    "    # define binning for morphing\n",
    "    bin_mu_x = ROOT.RooBinning(4, 0.0, 4.0)\n",
    "    grid = ROOT.RooMomentMorphFuncND.Grid(bin_mu_x)\n",
    "    x_var.setBins(50)\n",
    "\n",
    "    # number of 'sampled' Gaussians, if you change it, adjust the binning properly\n",
    "    for i in range(5):\n",
    "        # Create the sampled Gaussian\n",
    "        workspace.factory(f\"Gaussian::g{i}(x, mu{i}[{i}], {sigma})\".format(i=i))\n",
    "\n",
    "        # Fill the histograms\n",
    "        hist = workspace[f\"g{i}\"].generateBinned([x_var], n_samples * 100)\n",
    "        # Make sure that every bin is filled and we don't get zero probability\n",
    "        for i_bin in range(hist.numEntries()):\n",
    "            hist.add(hist.get(i_bin), 1.0)\n",
    "\n",
    "        # Add the pdf to the workspace, the inOrder of 1 is necessary for calculation of the nll\n",
    "        # Adjust it to 0 to see binning\n",
    "        workspace.Import(ROOT.RooHistPdf(f\"histpdf{i}\", f\"histpdf{i}\", [x_var], hist, intOrder=1))\n",
    "\n",
    "        # Add the pdf to the grid and to the plot\n",
    "        grid.addPdf(workspace[f\"histpdf{i}\"], int(i))\n",
    "        workspace[f\"histpdf{i}\"].plotOn(frame1)\n",
    "\n",
    "    # Create the morphing and add it to the workspace\n",
    "    morph_func = ROOT.RooMomentMorphFuncND(\"morph_func\", \"morph_func\", [mu_var], [x_var], grid, setting)\n",
    "\n",
    "    # Normalizes the morphed object to be a pdf, set it false to prevent warning messages and gain computational speed up\n",
    "    morph_func.setPdfMode()\n",
    "\n",
    "    # Creating the morphed pdf\n",
    "    morph = ROOT.RooWrapperPdf(\"morph\", \"morph\", morph_func, True)\n",
    "    workspace.Import(morph)\n",
    "    workspace[\"morph\"].plotOn(frame1, LineColor=\"r\")\n",
    "\n",
    "    return frame1"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "02597efc",
   "metadata": {},
   "source": [
    "Define the \"observed\" data in a workspade"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "202c2a7e",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:33:59.323870Z",
     "iopub.status.busy": "2026-05-19T20:33:59.323737Z",
     "iopub.status.idle": "2026-05-19T20:33:59.427880Z",
     "shell.execute_reply": "2026-05-19T20:33:59.426761Z"
    }
   },
   "outputs": [],
   "source": [
    "def build_ws(mu_observed, sigma):\n",
    "    ws = ROOT.RooWorkspace()\n",
    "    ws.factory(f\"Gaussian::gauss(x[-5,15], mu[{mu_observed},0,4], {sigma})\".format(mu_observed=mu_observed))\n",
    "\n",
    "    return ws"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "90d8db90",
   "metadata": {},
   "source": [
    "The \"observed\" data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "872ef9cc",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:33:59.429360Z",
     "iopub.status.busy": "2026-05-19T20:33:59.429227Z",
     "iopub.status.idle": "2026-05-19T20:33:59.658862Z",
     "shell.execute_reply": "2026-05-19T20:33:59.658221Z"
    }
   },
   "outputs": [],
   "source": [
    "mu_observed = 2.5\n",
    "sigma = 1.5\n",
    "workspace = build_ws(mu_observed, sigma)\n",
    "x_var = workspace[\"x\"]\n",
    "mu_var = workspace[\"mu\"]\n",
    "gauss = workspace.pdf(\"gauss\")\n",
    "obs_data = gauss.generate(x_var, n_samples)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "669ed5d4",
   "metadata": {},
   "source": [
    "Create the exact negative log likelihood functions for Gaussian model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "1133ad47",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:33:59.660525Z",
     "iopub.status.busy": "2026-05-19T20:33:59.660402Z",
     "iopub.status.idle": "2026-05-19T20:33:59.808027Z",
     "shell.execute_reply": "2026-05-19T20:33:59.807410Z"
    }
   },
   "outputs": [],
   "source": [
    "nll_gauss = gauss.createNLL(obs_data)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6162b054",
   "metadata": {},
   "source": [
    "Compute the morphed nll"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "61184238",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:33:59.809730Z",
     "iopub.status.busy": "2026-05-19T20:33:59.809585Z",
     "iopub.status.idle": "2026-05-19T20:34:00.227775Z",
     "shell.execute_reply": "2026-05-19T20:34:00.227142Z"
    }
   },
   "outputs": [],
   "source": [
    "frame1 = morphing(ROOT.RooMomentMorphFuncND.Linear)\n",
    "\n",
    "nll_morph = workspace[\"morph\"].createNLL(obs_data)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "00a69ecd",
   "metadata": {},
   "source": [
    "Plot the negative logarithmic summed likelihood"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "2ed56e7f",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:34:00.229433Z",
     "iopub.status.busy": "2026-05-19T20:34:00.229310Z",
     "iopub.status.idle": "2026-05-19T20:34:00.482100Z",
     "shell.execute_reply": "2026-05-19T20:34:00.481470Z"
    }
   },
   "outputs": [],
   "source": [
    "frame2 = mu_var.frame(Title=\"Negative log Likelihood\")\n",
    "nll_gauss.plotOn(frame2, LineColor=\"b\", ShiftToZero=True, Name=\"gauss\")\n",
    "nll_morph.plotOn(frame2, LineColor=\"r\", ShiftToZero=True, Name=\"morphed\")\n",
    "\n",
    "c = ROOT.TCanvas(\"rf616_morphing\", \"rf616_morphing\", 800, 400)\n",
    "c.Divide(2)\n",
    "c.cd(1)\n",
    "ROOT.gPad.SetLeftMargin(0.15)\n",
    "frame1.GetYaxis().SetTitleOffset(1.8)\n",
    "frame1.Draw()\n",
    "c.cd(2)\n",
    "ROOT.gPad.SetLeftMargin(0.15)\n",
    "frame2.GetYaxis().SetTitleOffset(1.8)\n",
    "frame2.Draw()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "841b769f",
   "metadata": {},
   "source": [
    "Compute the minimum via minuit and display the results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "a025b264",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:34:00.483821Z",
     "iopub.status.busy": "2026-05-19T20:34:00.483696Z",
     "iopub.status.idle": "2026-05-19T20:34:00.647906Z",
     "shell.execute_reply": "2026-05-19T20:34:00.647278Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "  RooFitResult: minimized FCN value: 1862.97, estimated distance to minimum: 2.32702e-05\n",
      "                covariance matrix quality: Full, accurate covariance matrix\n",
      "                Status : MINIMIZE=0 \n",
      "\n",
      "    Floating Parameter    FinalValue +/-  Error   \n",
      "  --------------------  --------------------------\n",
      "                    mu    2.5399e+00 +/-  4.74e-02\n",
      "\n",
      "\n",
      "  RooFitResult: minimized FCN value: 1862.82, estimated distance to minimum: 9.31473e-06\n",
      "                covariance matrix quality: Full, accurate covariance matrix\n",
      "                Status : MINIMIZE=0 \n",
      "\n",
      "    Floating Parameter    FinalValue +/-  Error   \n",
      "  --------------------  --------------------------\n",
      "                    mu    2.5372e+00 +/-  4.08e-02\n",
      "\n"
     ]
    }
   ],
   "source": [
    "for nll in [nll_gauss, nll_morph]:\n",
    "    minimizer = ROOT.RooMinimizer(nll)\n",
    "    minimizer.setPrintLevel(-1)\n",
    "    minimizer.minimize(\"Minuit2\")\n",
    "    result = minimizer.save()\n",
    "    result.Print()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e471ecde",
   "metadata": {},
   "source": [
    "Draw all canvases "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "aa8c7270",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:34:00.649275Z",
     "iopub.status.busy": "2026-05-19T20:34:00.649150Z",
     "iopub.status.idle": "2026-05-19T20:34:00.844119Z",
     "shell.execute_reply": "2026-05-19T20:34:00.843548Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "\n",
       "<div id=\"root_plot_1779222840833\" style=\"width: 800px; height: 400px; position: relative\">\n",
       "</div>\n",
       "\n",
       "</div>\n",
       "<script>\n",
       "   function process_root_plot_1779222840833() {\n",
       "      function execCode(Core) {\n",
       "         Core.settings.HandleKeys = false;\n",
       "         \n",
       "Core.unzipJSON(49059,'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').then(json => {\n",
       "   const obj = Core.parse(json);\n",
       "   Core.draw('root_plot_1779222840833', 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_1779222840833();\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
}
