{
"cells": [
{
"cell_type": "markdown",
"id": "839c8879",
"metadata": {},
"source": [
"# rf403_weightedevts\n",
"\n",
"'DATA AND CATEGORIES' RooFit tutorial macro #403\n",
"\n",
"Using weights in unbinned datasets\n",
"\n",
"\n",
"\n",
"\n",
"**Author:** Clemens Lange, Wouter Verkerke (C version) \n",
"This notebook tutorial was automatically generated with ROOTBOOK-izer from the macro found in the ROOT repository on Tuesday, March 19, 2024 at 07:16 PM."
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "cda1d7fc",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2024-03-19T19:16:07.998700Z",
"iopub.status.busy": "2024-03-19T19:16:07.998373Z",
"iopub.status.idle": "2024-03-19T19:16:10.228947Z",
"shell.execute_reply": "2024-03-19T19:16:10.227539Z"
}
},
"outputs": [],
"source": [
"from __future__ import print_function\n",
"import ROOT"
]
},
{
"cell_type": "markdown",
"id": "a52be5ef",
"metadata": {},
"source": [
"Create observable and unweighted dataset\n",
"-------------------------------------------"
]
},
{
"cell_type": "markdown",
"id": "50397af1",
"metadata": {},
"source": [
"Declare observable"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "6c37f3f9",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2024-03-19T19:16:10.242961Z",
"iopub.status.busy": "2024-03-19T19:16:10.242539Z",
"iopub.status.idle": "2024-03-19T19:16:10.575383Z",
"shell.execute_reply": "2024-03-19T19:16:10.573430Z"
}
},
"outputs": [],
"source": [
"x = ROOT.RooRealVar(\"x\", \"x\", -10, 10)\n",
"x.setBins(40)"
]
},
{
"cell_type": "markdown",
"id": "e7bbc918",
"metadata": {},
"source": [
"Construction a uniform pdf"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "9d169548",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2024-03-19T19:16:10.594650Z",
"iopub.status.busy": "2024-03-19T19:16:10.594012Z",
"iopub.status.idle": "2024-03-19T19:16:10.888137Z",
"shell.execute_reply": "2024-03-19T19:16:10.882624Z"
}
},
"outputs": [],
"source": [
"p0 = ROOT.RooPolynomial(\"px\", \"px\", x)"
]
},
{
"cell_type": "markdown",
"id": "4c225cfe",
"metadata": {},
"source": [
"Sample 1000 events from pdf"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "5ad14c81",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2024-03-19T19:16:10.894842Z",
"iopub.status.busy": "2024-03-19T19:16:10.894176Z",
"iopub.status.idle": "2024-03-19T19:16:11.161770Z",
"shell.execute_reply": "2024-03-19T19:16:11.157424Z"
}
},
"outputs": [],
"source": [
"data = p0.generate({x}, 1000)"
]
},
{
"cell_type": "markdown",
"id": "43feeb19",
"metadata": {},
"source": [
"Calculate weight and make dataset weighted\n",
"--------------------------------------------------"
]
},
{
"cell_type": "markdown",
"id": "ed56e68f",
"metadata": {},
"source": [
"Construct formula to calculate (fake) weight for events"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "b058fabd",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2024-03-19T19:16:11.172482Z",
"iopub.status.busy": "2024-03-19T19:16:11.172044Z",
"iopub.status.idle": "2024-03-19T19:16:11.523348Z",
"shell.execute_reply": "2024-03-19T19:16:11.521978Z"
}
},
"outputs": [],
"source": [
"wFunc = ROOT.RooFormulaVar(\"w\", \"event weight\", \"(x*x+10)\", [x])"
]
},
{
"cell_type": "markdown",
"id": "2c345965",
"metadata": {},
"source": [
"Add column with variable w to previously generated dataset"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "dc973d95",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2024-03-19T19:16:11.529184Z",
"iopub.status.busy": "2024-03-19T19:16:11.527920Z",
"iopub.status.idle": "2024-03-19T19:16:11.664380Z",
"shell.execute_reply": "2024-03-19T19:16:11.662740Z"
}
},
"outputs": [],
"source": [
"w = data.addColumn(wFunc)"
]
},
{
"cell_type": "markdown",
"id": "3bcd9944",
"metadata": {},
"source": [
"Dataset d is now a dataset with two observable (x,w) with 1000 entries"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "f98d8338",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2024-03-19T19:16:11.669149Z",
"iopub.status.busy": "2024-03-19T19:16:11.668654Z",
"iopub.status.idle": "2024-03-19T19:16:11.833767Z",
"shell.execute_reply": "2024-03-19T19:16:11.815637Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"RooDataSet::pxData[x,w] = 1000 entries\n"
]
}
],
"source": [
"data.Print()"
]
},
{
"cell_type": "markdown",
"id": "0c0069cb",
"metadata": {},
"source": [
"Instruct dataset wdata in interpret w as event weight rather than as\n",
"observable"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "987ff5a7",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2024-03-19T19:16:11.841190Z",
"iopub.status.busy": "2024-03-19T19:16:11.838253Z",
"iopub.status.idle": "2024-03-19T19:16:12.204785Z",
"shell.execute_reply": "2024-03-19T19:16:12.192141Z"
}
},
"outputs": [],
"source": [
"wdata = ROOT.RooDataSet(data.GetName(), data.GetTitle(), data, data.get(), \"\", w.GetName())"
]
},
{
"cell_type": "markdown",
"id": "6334f010",
"metadata": {},
"source": [
"Dataset d is now a dataset with one observable (x) with 1000 entries and\n",
"a sum of weights of ~430K"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "f540e26c",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2024-03-19T19:16:12.209472Z",
"iopub.status.busy": "2024-03-19T19:16:12.209088Z",
"iopub.status.idle": "2024-03-19T19:16:12.329651Z",
"shell.execute_reply": "2024-03-19T19:16:12.328573Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"RooDataSet::pxData[x,weight:w] = 1000 entries (43238.9 weighted)\n"
]
}
],
"source": [
"wdata.Print()"
]
},
{
"cell_type": "markdown",
"id": "9833e3f9",
"metadata": {},
"source": [
"Unbinned ML fit to weighted data\n",
"---------------------------------------------------------------"
]
},
{
"cell_type": "markdown",
"id": "05fd417f",
"metadata": {},
"source": [
"Construction quadratic polynomial pdf for fitting"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "85674593",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2024-03-19T19:16:12.339085Z",
"iopub.status.busy": "2024-03-19T19:16:12.338681Z",
"iopub.status.idle": "2024-03-19T19:16:12.498236Z",
"shell.execute_reply": "2024-03-19T19:16:12.497058Z"
}
},
"outputs": [],
"source": [
"a0 = ROOT.RooRealVar(\"a0\", \"a0\", 1)\n",
"a1 = ROOT.RooRealVar(\"a1\", \"a1\", 0, -1, 1)\n",
"a2 = ROOT.RooRealVar(\"a2\", \"a2\", 1, 0, 10)\n",
"p2 = ROOT.RooPolynomial(\"p2\", \"p2\", x, [a0, a1, a2], 0)"
]
},
{
"cell_type": "markdown",
"id": "973ee84d",
"metadata": {},
"source": [
"Fit quadratic polynomial to weighted data"
]
},
{
"cell_type": "markdown",
"id": "e2082fcd",
"metadata": {},
"source": [
"NOTE: A plain Maximum likelihood fit to weighted data does in general\n",
" NOT result in correct error estimates, individual\n",
" event weights represent Poisson statistics themselves.\n",
"\n",
"Fit with 'wrong' errors"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "07b40e16",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2024-03-19T19:16:12.511088Z",
"iopub.status.busy": "2024-03-19T19:16:12.510678Z",
"iopub.status.idle": "2024-03-19T19:16:12.867234Z",
"shell.execute_reply": "2024-03-19T19:16:12.862612Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[#1] INFO:Fitting -- RooAbsPdf::fitTo(p2_over_p2_Int[x]) fixing normalization set for coefficient determination to observables in data\n",
"[#1] INFO:Fitting -- using CPU computation library compiled with -mavx2\n",
"[#0] WARNING:InputArguments -- RooAbsPdf::fitTo(p2): WARNING: a likelihood fit is requested of what appears to be weighted data.\n",
" While the estimated values of the parameters will always be calculated taking the weights into account,\n",
" there are multiple ways to estimate the errors of the parameters. You are advised to make an\n",
" explicit choice for the error calculation:\n",
" - Either provide SumW2Error(true), to calculate a sum-of-weights-corrected HESSE error matrix\n",
" (error will be proportional to the number of events in MC).\n",
" - Or provide SumW2Error(false), to return errors from original HESSE error matrix\n",
" (which will be proportional to the sum of the weights, i.e., a dataset with events).\n",
" - Or provide AsymptoticError(true), to use the asymptotically correct expression\n",
" (for details see https://arxiv.org/abs/1911.01303).\"\n",
"[#1] INFO:Fitting -- RooAddition::defaultErrorLevel(nll_p2_over_p2_Int[x]_pxData) Summation contains a RooNLLVar, using its error level\n",
"[#1] INFO:Minimization -- RooAbsMinimizerFcn::setOptimizeConst: activating const optimization\n",
"[#1] INFO:Minimization -- RooAbsMinimizerFcn::setOptimizeConst: deactivating const optimization\n"
]
}
],
"source": [
"r_ml_wgt = p2.fitTo(wdata, Save=True, PrintLevel=-1)"
]
},
{
"cell_type": "markdown",
"id": "3ff6c0e7",
"metadata": {},
"source": [
"A first order correction to estimated parameter errors in an\n",
"(unbinned) ML fit can be obtained by calculating the\n",
"covariance matrix as\n",
"\n",
" V' = V C-1 V\n",
"\n",
"where V is the covariance matrix calculated from a fit\n",
"to -logL = - sum [ w_i log f(x_i) ] and C is the covariance\n",
"matrix calculated from -logL' = -sum [ w_i^2 log f(x_i) ]\n",
"(i.e. the weights are applied squared)\n",
"\n",
"A fit in self mode can be performed as follows:"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "2e2ba878",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2024-03-19T19:16:12.883850Z",
"iopub.status.busy": "2024-03-19T19:16:12.883453Z",
"iopub.status.idle": "2024-03-19T19:16:13.060110Z",
"shell.execute_reply": "2024-03-19T19:16:13.051469Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[#1] INFO:Fitting -- RooAbsPdf::fitTo(p2_over_p2_Int[x]) fixing normalization set for coefficient determination to observables in data\n",
"[#1] INFO:Fitting -- RooAddition::defaultErrorLevel(nll_p2_over_p2_Int[x]_pxData) Summation contains a RooNLLVar, using its error level\n",
"[#1] INFO:Minimization -- RooAbsMinimizerFcn::setOptimizeConst: activating const optimization\n",
"[#1] INFO:Fitting -- RooAbsPdf::fitTo(p2) Calculating sum-of-weights-squared correction matrix for covariance matrix\n",
"[#1] INFO:Minimization -- RooAbsMinimizerFcn::setOptimizeConst: deactivating const optimization\n"
]
}
],
"source": [
"r_ml_wgt_corr = p2.fitTo(wdata, Save=True, SumW2Error=True, PrintLevel=-1)"
]
},
{
"cell_type": "markdown",
"id": "9ae00b26",
"metadata": {},
"source": [
"Plot weighted data and fit result\n",
"---------------------------------------------------------------"
]
},
{
"cell_type": "markdown",
"id": "123da8d2",
"metadata": {},
"source": [
"Construct plot frame"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "fc444947",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2024-03-19T19:16:13.071767Z",
"iopub.status.busy": "2024-03-19T19:16:13.071387Z",
"iopub.status.idle": "2024-03-19T19:16:13.361626Z",
"shell.execute_reply": "2024-03-19T19:16:13.359227Z"
}
},
"outputs": [],
"source": [
"frame = x.frame(Title=\"Unbinned ML fit, chi^2 fit to weighted data\")"
]
},
{
"cell_type": "markdown",
"id": "1ed5c673",
"metadata": {},
"source": [
"Plot data using sum-of-weights-squared error rather than Poisson errors"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "b40b4259",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2024-03-19T19:16:13.376674Z",
"iopub.status.busy": "2024-03-19T19:16:13.376182Z",
"iopub.status.idle": "2024-03-19T19:16:13.631749Z",
"shell.execute_reply": "2024-03-19T19:16:13.624592Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"wdata.plotOn(frame, DataError=\"SumW2\")"
]
},
{
"cell_type": "markdown",
"id": "950fd4af",
"metadata": {},
"source": [
"Overlay result of 2nd order polynomial fit to weighted data"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "d48f8cc0",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2024-03-19T19:16:13.650698Z",
"iopub.status.busy": "2024-03-19T19:16:13.650316Z",
"iopub.status.idle": "2024-03-19T19:16:13.896366Z",
"shell.execute_reply": "2024-03-19T19:16:13.885742Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"p2.plotOn(frame)"
]
},
{
"cell_type": "markdown",
"id": "e485b023",
"metadata": {},
"source": [
"ML fit of pdf to equivalent unweighted dataset\n",
"---------------------------------------------------------------------"
]
},
{
"cell_type": "markdown",
"id": "cdf6d25d",
"metadata": {},
"source": [
"Construct a pdf with the same shape as p0 after weighting"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "ccf095df",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2024-03-19T19:16:13.905188Z",
"iopub.status.busy": "2024-03-19T19:16:13.904799Z",
"iopub.status.idle": "2024-03-19T19:16:14.130547Z",
"shell.execute_reply": "2024-03-19T19:16:14.115597Z"
}
},
"outputs": [],
"source": [
"genPdf = ROOT.RooGenericPdf(\"genPdf\", \"x*x+10\", [x])"
]
},
{
"cell_type": "markdown",
"id": "da860f95",
"metadata": {},
"source": [
"Sample a dataset with the same number of events as data"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "93c5e272",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2024-03-19T19:16:14.137016Z",
"iopub.status.busy": "2024-03-19T19:16:14.136643Z",
"iopub.status.idle": "2024-03-19T19:16:14.292132Z",
"shell.execute_reply": "2024-03-19T19:16:14.290806Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[#1] INFO:NumericIntegration -- RooRealIntegral::init(genPdf_Int[x]) using numeric integrator RooIntegrator1D to calculate Int(x)\n",
"[#1] INFO:NumericIntegration -- RooRealIntegral::init(genPdf_Int[x]) using numeric integrator RooIntegrator1D to calculate Int(x)\n"
]
}
],
"source": [
"data2 = genPdf.generate({x}, 1000)"
]
},
{
"cell_type": "markdown",
"id": "1d5f830b",
"metadata": {},
"source": [
"Sample a dataset with the same number of weights as data"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "abd08b60",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2024-03-19T19:16:14.300096Z",
"iopub.status.busy": "2024-03-19T19:16:14.299717Z",
"iopub.status.idle": "2024-03-19T19:16:14.466490Z",
"shell.execute_reply": "2024-03-19T19:16:14.465360Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[#1] INFO:NumericIntegration -- RooRealIntegral::init(genPdf_Int[x]) using numeric integrator RooIntegrator1D to calculate Int(x)\n",
"[#1] INFO:NumericIntegration -- RooRealIntegral::init(genPdf_Int[x]) using numeric integrator RooIntegrator1D to calculate Int(x)\n"
]
}
],
"source": [
"data3 = genPdf.generate({x}, 43000)"
]
},
{
"cell_type": "markdown",
"id": "b72af949",
"metadata": {},
"source": [
"Fit the 2nd order polynomial to both unweighted datasets and save the\n",
"results for comparison"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "5f4549fa",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2024-03-19T19:16:14.480192Z",
"iopub.status.busy": "2024-03-19T19:16:14.479813Z",
"iopub.status.idle": "2024-03-19T19:16:14.687643Z",
"shell.execute_reply": "2024-03-19T19:16:14.674415Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[#1] INFO:Fitting -- RooAbsPdf::fitTo(p2_over_p2_Int[x]) fixing normalization set for coefficient determination to observables in data\n",
"[#1] INFO:Fitting -- RooAddition::defaultErrorLevel(nll_p2_over_p2_Int[x]_genPdfData) Summation contains a RooNLLVar, using its error level\n",
"[#1] INFO:Minimization -- RooAbsMinimizerFcn::setOptimizeConst: activating const optimization\n",
"[#1] INFO:Minimization -- RooAbsMinimizerFcn::setOptimizeConst: deactivating const optimization\n",
"[#1] INFO:Fitting -- RooAbsPdf::fitTo(p2_over_p2_Int[x]) fixing normalization set for coefficient determination to observables in data\n",
"[#1] INFO:Fitting -- RooAddition::defaultErrorLevel(nll_p2_over_p2_Int[x]_genPdfData) Summation contains a RooNLLVar, using its error level\n",
"[#1] INFO:Minimization -- RooAbsMinimizerFcn::setOptimizeConst: activating const optimization\n",
"[#1] INFO:Minimization -- RooAbsMinimizerFcn::setOptimizeConst: deactivating const optimization\n"
]
}
],
"source": [
"r_ml_unw10 = p2.fitTo(data2, Save=True, PrintLevel=-1)\n",
"r_ml_unw43 = p2.fitTo(data3, Save=True, PrintLevel=-1)"
]
},
{
"cell_type": "markdown",
"id": "affe1976",
"metadata": {},
"source": [
"Chis2 fit of pdf to binned weighted dataset\n",
"---------------------------------------------------------------------------"
]
},
{
"cell_type": "markdown",
"id": "fe63080e",
"metadata": {},
"source": [
"Construct binned clone of unbinned weighted dataset"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "e6c2468e",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2024-03-19T19:16:14.697193Z",
"iopub.status.busy": "2024-03-19T19:16:14.696774Z",
"iopub.status.idle": "2024-03-19T19:16:14.882551Z",
"shell.execute_reply": "2024-03-19T19:16:14.866233Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"DataStore pxData_binned (Generated From px_binned)\n",
" Contains 40 entries\n",
" Observables: \n",
" 1) x = 9.75 L(-10 - 10) B(40) \"x\"\n",
"Binned Dataset pxData_binned (Generated From px_binned)\n",
" Contains 40 bins with a total weight of 43238.9\n",
" Observables: 1) x = 9.75 L(-10 - 10) B(40) \"x\"\n"
]
}
],
"source": [
"binnedData = wdata.binnedClone()\n",
"binnedData.Print(\"v\")"
]
},
{
"cell_type": "markdown",
"id": "8f3e7abd",
"metadata": {},
"source": [
"Perform chi2 fit to binned weighted dataset using sum-of-weights errors\n",
"\n",
"NB: Within the usual approximations of a chi2 fit, chi2 fit to weighted\n",
"data using sum-of-weights-squared errors does give correct error\n",
"estimates"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "0ce63cb4",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2024-03-19T19:16:14.897072Z",
"iopub.status.busy": "2024-03-19T19:16:14.896681Z",
"iopub.status.idle": "2024-03-19T19:16:15.321047Z",
"shell.execute_reply": "2024-03-19T19:16:15.301535Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"0"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Minuit2Minimizer: Minimize with max-calls 1000 convergence for edm < 1 strategy 1\n",
"Minuit2Minimizer : Valid minimum - status = 0\n",
"FVAL = 31.3747451817532266\n",
"Edm = 4.13511525432537654e-08\n",
"Nfcn = 29\n",
"a1\t = -0.009989\t +/- 0.0262975\t(limited)\n",
"a2\t = 0.106373\t +/- 0.0101849\t(limited)\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Info in : MnSeedGenerator Computing seed using NumericalGradient calculator\n",
"Info in : MnSeedGenerator Initial state: FCN = 32.33995323 Edm = 0.8968537843 NCalls = 7\n",
"Info in : MnSeedGenerator Initial state \n",
" Minimum value : 32.33995323\n",
" Edm : 0.8968537843\n",
" Internal parameters:\t[ -0.00121057482 -1.372915994]\t\n",
" Internal gradient :\t[ 27.17902731 -203.7916428]\t\n",
" Internal covariance matrix:\n",
"[[ 0.00060495515 0]\n",
" [ 0 7.5618996e-05]]]\n",
"Info in : VariableMetricBuilder Start iterating until Edm is < 0.002 with call limit = 1000\n",
"Info in : VariableMetricBuilder 0 - FCN = 32.33995323 Edm = 0.8968537843 NCalls = 7\n",
"Info in : VariableMetricBuilder 1 - FCN = 31.37772394 Edm = 0.002313012125 NCalls = 13\n",
"Info in : VariableMetricBuilder 2 - FCN = 31.37474518 Edm = 3.566880129e-08 NCalls = 19\n",
"Info in : VariableMetricBuilder After Hessian\n",
"Info in : VariableMetricBuilder 3 - FCN = 31.37474518 Edm = 4.135115254e-08 NCalls = 29\n",
"Info in : Minuit2Minimizer::Hesse Using max-calls 1000\n",
"Info in : Minuit2Minimizer::Hesse Hesse is valid - matrix is accurate\n"
]
}
],
"source": [
"chi2 = p2.createChi2(binnedData, ROOT.RooFit.DataError(\"SumW2\"))\n",
"m = ROOT.RooMinimizer(chi2)\n",
"m.migrad()\n",
"m.hesse()"
]
},
{
"cell_type": "markdown",
"id": "cfd78956",
"metadata": {},
"source": [
"Plot chi^2 fit result on frame as well"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "7c5d455e",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2024-03-19T19:16:15.356878Z",
"iopub.status.busy": "2024-03-19T19:16:15.356476Z",
"iopub.status.idle": "2024-03-19T19:16:15.665865Z",
"shell.execute_reply": "2024-03-19T19:16:15.656073Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"r_chi2_wgt = m.save()\n",
"p2.plotOn(frame, LineStyle=\"--\", LineColor=\"r\")"
]
},
{
"cell_type": "markdown",
"id": "94d186e7",
"metadata": {},
"source": [
"Compare fit results of chi2, L fits to (un)weighted data\n",
"------------------------------------------------------------"
]
},
{
"cell_type": "markdown",
"id": "1c116be9",
"metadata": {},
"source": [
"Note that ML fit on 1Kevt of weighted data is closer to result of ML fit on 43Kevt of unweighted data\n",
"than to 1Kevt of unweighted data, the reference chi^2 fit with SumW2 error gives a result closer to\n",
"that of an unbinned ML fit to 1Kevt of unweighted data."
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "352f7057",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2024-03-19T19:16:15.700994Z",
"iopub.status.busy": "2024-03-19T19:16:15.700600Z",
"iopub.status.idle": "2024-03-19T19:16:16.189863Z",
"shell.execute_reply": "2024-03-19T19:16:16.184842Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"==> ML Fit results on 1K unweighted events\n",
"==> ML Fit results on 43K unweighted events\n",
"==> ML Fit results on 1K weighted events with a summed weight of 43K\n",
"==> Corrected ML Fit results on 1K weighted events with a summed weight of 43K\n",
"==> Chi2 Fit results on 1K weighted events with a summed weight of 43K\n",
"\n",
" RooFitResult: minimized FCN value: 2766.49, estimated distance to minimum: 0.000399952\n",
" covariance matrix quality: Full, accurate covariance matrix\n",
" Status : MINIMIZE=0 HESSE=0 \n",
"\n",
" Floating Parameter FinalValue +/- Error \n",
" -------------------- --------------------------\n",
" a1 8.9483e-03 +/- 2.70e-02\n",
" a2 1.0177e-01 +/- 1.69e-02\n",
"\n",
"\n",
" RooFitResult: minimized FCN value: 118892, estimated distance to minimum: 0.000206627\n",
" covariance matrix quality: Full, accurate covariance matrix\n",
" Status : MINIMIZE=0 HESSE=0 \n",
"\n",
" Floating Parameter FinalValue +/- Error \n",
" -------------------- --------------------------\n",
" a1 -1.2106e-03 +/- 4.02e-03\n",
" a2 9.7573e-02 +/- 2.37e-03\n",
"\n",
"\n",
" RooFitResult: minimized FCN value: 119682, estimated distance to minimum: 1.25398e-05\n",
" covariance matrix quality: Full, accurate covariance matrix\n",
" Status : MINIMIZE=0 HESSE=0 \n",
"\n",
" Floating Parameter FinalValue +/- Error \n",
" -------------------- --------------------------\n",
" a1 -4.8713e-03 +/- 4.03e-03\n",
" a2 9.8645e-02 +/- 2.41e-03\n",
"\n",
"\n",
" RooFitResult: minimized FCN value: 119682, estimated distance to minimum: 79498.5\n",
" covariance matrix quality: Full, accurate covariance matrix\n",
" Status : MINIMIZE=0 HESSE=0 HESSE=0 \n",
"\n",
" Floating Parameter FinalValue +/- Error \n",
" -------------------- --------------------------\n",
" a1 -4.8565e-03 +/- 3.00e-02\n",
" a2 9.8652e-02 +/- 2.99e-02\n",
"\n",
"\n",
" RooFitResult: minimized FCN value: 31.3747, estimated distance to minimum: 4.135e-08\n",
" covariance matrix quality: Full, accurate covariance matrix\n",
" Status : MIGRAD=0 HESSE=0 \n",
"\n",
" Floating Parameter FinalValue +/- Error \n",
" -------------------- --------------------------\n",
" a1 -9.9890e-03 +/- 2.63e-02\n",
" a2 1.0637e-01 +/- 1.02e-02\n",
"\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Info in : png file rf403_weightedevts.png has been created\n"
]
}
],
"source": [
"print(\"==> ML Fit results on 1K unweighted events\")\n",
"r_ml_unw10.Print()\n",
"print(\"==> ML Fit results on 43K unweighted events\")\n",
"r_ml_unw43.Print()\n",
"print(\"==> ML Fit results on 1K weighted events with a summed weight of 43K\")\n",
"r_ml_wgt.Print()\n",
"print(\"==> Corrected ML Fit results on 1K weighted events with a summed weight of 43K\")\n",
"r_ml_wgt_corr.Print()\n",
"print(\"==> Chi2 Fit results on 1K weighted events with a summed weight of 43K\")\n",
"r_chi2_wgt.Print()\n",
"\n",
"c = ROOT.TCanvas(\"rf403_weightedevts\", \"rf403_weightedevts\", 600, 600)\n",
"ROOT.gPad.SetLeftMargin(0.15)\n",
"frame.GetYaxis().SetTitleOffset(1.8)\n",
"frame.Draw()\n",
"\n",
"c.SaveAs(\"rf403_weightedevts.png\")"
]
},
{
"cell_type": "markdown",
"id": "e4a5af4e",
"metadata": {},
"source": [
"Draw all canvases "
]
},
{
"cell_type": "code",
"execution_count": 24,
"id": "c8cbd399",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2024-03-19T19:16:16.208718Z",
"iopub.status.busy": "2024-03-19T19:16:16.208312Z",
"iopub.status.idle": "2024-03-19T19:16:16.481148Z",
"shell.execute_reply": "2024-03-19T19:16:16.480043Z"
}
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"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.8.10"
}
},
"nbformat": 4,
"nbformat_minor": 5
}