{
"cells": [
{
"cell_type": "markdown",
"id": "a64a9863",
"metadata": {},
"source": [
"# testUnfold5a\n",
"Test program for the classes TUnfoldDensity and TUnfoldBinning\n",
"\n",
"A toy test of the TUnfold package\n",
"\n",
"This is an example of unfolding a two-dimensional distribution\n",
"also using an auxiliary measurement to constrain some background\n",
"\n",
"The example comprises several macros\n",
" - testUnfold5a.C create root files with TTree objects for\n",
" signal, background and data\n",
" - write files testUnfold5_signal.root\n",
" testUnfold5_background.root\n",
" testUnfold5_data.root\n",
"\n",
" - testUnfold5b.C create a root file with the TUnfoldBinning objects\n",
" - write file testUnfold5_binning.root\n",
"\n",
" - testUnfold5c.C loop over trees and fill histograms based on the\n",
" TUnfoldBinning objects\n",
" - read testUnfold5_binning.root\n",
" testUnfold5_signal.root\n",
" testUnfold5_background.root\n",
" testUnfold5_data.root\n",
"\n",
" - write testUnfold5_histograms.root\n",
"\n",
" - testUnfold5d.C run the unfolding\n",
" - read testUnfold5_histograms.root\n",
" - write testUnfold5_result.root\n",
" testUnfold5_result.ps\n",
"\n",
"\n",
" **Version 17.6, in parallel to changes in TUnfold**\n",
"\n",
"#### History:\n",
" - Version 17.5, in parallel to changes in TUnfold\n",
" - Version 17.4, in parallel to changes in TUnfold\n",
" - Version 17.3, in parallel to changes in TUnfold\n",
" - Version 17.2, in parallel to changes in TUnfold\n",
" - Version 17.1, in parallel to changes in TUnfold\n",
" - Version 17.0 example for multi-dimensional unfolding\n",
"\n",
" This file is part of TUnfold.\n",
"\n",
" TUnfold is free software: you can redistribute it and/or modify\n",
" it under the terms of the GNU General Public License as published by\n",
" the Free Software Foundation, either version 3 of the License, or\n",
" (at your option) any later version.\n",
"\n",
" TUnfold is distributed in the hope that it will be useful,\n",
" but WITHOUT ANY WARRANTY; without even the implied warranty of\n",
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n",
" GNU General Public License for more details.\n",
"\n",
" You should have received a copy of the GNU General Public License\n",
" along with TUnfold. If not, see .\n",
"\n",
"\n",
"\n",
"**Author:** Stefan Schmitt DESY, 14.10.2008 \n",
"This notebook tutorial was automatically generated with ROOTBOOK-izer from the macro found in the ROOT repository on Tuesday, May 19, 2026 at 08:05 PM."
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "9343a2f0",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2026-05-19T20:05:14.402010Z",
"iopub.status.busy": "2026-05-19T20:05:14.401869Z",
"iopub.status.idle": "2026-05-19T20:05:14.406265Z",
"shell.execute_reply": "2026-05-19T20:05:14.405684Z"
}
},
"outputs": [],
"source": [
"%%cpp -d\n",
"\n",
"#include \n",
"#include \n",
"#include \n",
"#include \n",
"#include \n",
"#include \n",
"\n",
"using std::cout;\n",
"\n",
"TRandom *g_rnd=nullptr;\n",
"\n",
"class ToyEvent {\n",
"public:\n",
" void GenerateDataEvent(TRandom *rnd);\n",
" void GenerateSignalEvent(TRandom *rnd);\n",
" void GenerateBgrEvent(TRandom *rnd);\n",
" // reconstructed quantities\n",
" inline Double_t GetPtRec(void) const { return fPtRec; }\n",
" inline Double_t GetEtaRec(void) const { return fEtaRec; }\n",
" inline Double_t GetDiscriminator(void) const {return fDiscriminator; }\n",
" inline Bool_t IsTriggered(void) const { return fIsTriggered; }\n",
"\n",
" // generator level quantities\n",
" inline Double_t GetPtGen(void) const {\n",
" if(IsSignal()) return fPtGen;\n",
" else return -1.0;\n",
" }\n",
" inline Double_t GetEtaGen(void) const {\n",
" if(IsSignal()) return fEtaGen;\n",
" else return 999.0;\n",
" }\n",
" inline Bool_t IsSignal(void) const { return fIsSignal; }\n",
"protected:\n",
"\n",
" void GenerateSignalKinematics(TRandom *rnd,Bool_t isData);\n",
" void GenerateBgrKinematics(TRandom *rnd,Bool_t isData);\n",
" void GenerateReco(TRandom *rnd);\n",
"\n",
" // reconstructed quantities\n",
" Double_t fPtRec;\n",
" Double_t fEtaRec;\n",
" Double_t fDiscriminator;\n",
" Bool_t fIsTriggered;\n",
" // generated quantities\n",
" Double_t fPtGen;\n",
" Double_t fEtaGen;\n",
" Bool_t fIsSignal;\n",
"\n",
" static Double_t kDataSignalFraction;\n",
"\n",
"};\n",
"Double_t ToyEvent::kDataSignalFraction=0.8;"
]
},
{
"cell_type": "markdown",
"id": "373523e2",
"metadata": {},
"source": [
" Definition of a helper function: "
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "a0484739",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2026-05-19T20:05:14.414435Z",
"iopub.status.busy": "2026-05-19T20:05:14.414298Z",
"iopub.status.idle": "2026-05-19T20:05:14.423804Z",
"shell.execute_reply": "2026-05-19T20:05:14.421385Z"
}
},
"outputs": [],
"source": [
"%%cpp -d\n",
"void ToyEvent::GenerateDataEvent(TRandom *rnd) {\n",
" fIsSignal=rnd->Uniform()0.0) {\n",
" fEtaGen=TMath::Power(rnd->Uniform(),eta_p2)*etaMax;\n",
" if(rnd->Uniform()>=0.5) fEtaGen= -fEtaGen;\n",
" } else {\n",
" fEtaGen=rnd->Uniform(-etaMax,etaMax);\n",
" }\n",
" Double_t n=e_n + e_n_eta*fEtaGen;\n",
" Double_t T0=e_T0 + e_T0_eta*fEtaGen;\n",
" fPtGen=(TMath::Power(rnd->Uniform(),1./(1.-n))-1.)*T0;\n",
" /* static int print=100;\n",
" if(print) {\n",
" cout<Exp(isData ? 2.5 : 2.5);\n",
" fEtaRec=rnd->Uniform(-3.,3.);\n",
"}"
]
},
{
"cell_type": "markdown",
"id": "ebc0b0ee",
"metadata": {},
"source": [
" Definition of a helper function: "
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "41c03aca",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2026-05-19T20:05:14.562698Z",
"iopub.status.busy": "2026-05-19T20:05:14.562518Z",
"iopub.status.idle": "2026-05-19T20:05:14.568111Z",
"shell.execute_reply": "2026-05-19T20:05:14.567777Z"
}
},
"outputs": [],
"source": [
"%%cpp -d\n",
"void ToyEvent::GenerateReco(TRandom *rnd) {\n",
" if(fIsSignal) {\n",
" Double_t expEta=TMath::Exp(fEtaGen);\n",
" Double_t eGen=fPtGen*(expEta+1./expEta);\n",
" Double_t sigmaE=0.1*TMath::Sqrt(eGen)+(0.01+0.002*TMath::Abs(fEtaGen))\n",
" *eGen;\n",
" Double_t eRec;\n",
" do {\n",
" eRec=rnd->Gaus(eGen,sigmaE);\n",
" } while(eRec<=0.0);\n",
" Double_t sigmaEta=0.1+0.02*fEtaGen;\n",
" fEtaRec=rnd->Gaus(fEtaGen,sigmaEta);\n",
" fPtRec=eRec/(expEta+1./expEta);\n",
" do {\n",
" Double_t tauDiscr=0.08-0.04/(1.+fPtRec/10.0);\n",
" Double_t sigmaDiscr=0.01;\n",
" fDiscriminator=1.0-rnd->Exp(tauDiscr)+rnd->Gaus(0.,sigmaDiscr);\n",
" } while((fDiscriminator<=0.)||(fDiscriminator>=1.));\n",
" /* static int print=100;\n",
" if(print) {\n",
" cout< \"<Exp(tauDiscr)+rnd->Gaus(0.,sigmaDiscr);\n",
" } while((fDiscriminator<=0.)||(fDiscriminator>=1.));\n",
" }\n",
" fIsTriggered=(rnd->Uniform()<1./(TMath::Exp(-fPtRec+3.5)+1.));\n",
"}"
]
},
{
"cell_type": "markdown",
"id": "ec3bfa6a",
"metadata": {},
"source": [
"random generator"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "1ab45d77",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2026-05-19T20:05:14.585471Z",
"iopub.status.busy": "2026-05-19T20:05:14.585318Z",
"iopub.status.idle": "2026-05-19T20:05:14.936698Z",
"shell.execute_reply": "2026-05-19T20:05:14.927688Z"
}
},
"outputs": [],
"source": [
"g_rnd=new TRandom3();"
]
},
{
"cell_type": "markdown",
"id": "fe0853c8",
"metadata": {},
"source": [
"data and MC number of events"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "f74b8b98",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2026-05-19T20:05:14.947153Z",
"iopub.status.busy": "2026-05-19T20:05:14.946990Z",
"iopub.status.idle": "2026-05-19T20:05:15.173725Z",
"shell.execute_reply": "2026-05-19T20:05:15.171746Z"
}
},
"outputs": [],
"source": [
"const Int_t neventData = 20000;\n",
"Double_t const neventSignalMC =2000000;\n",
"Double_t const neventBgrMC =2000000;\n",
"\n",
"Float_t etaRec,ptRec,discr,etaGen,ptGen;\n",
"Int_t istriggered,issignal;"
]
},
{
"cell_type": "markdown",
"id": "0eac2cb0",
"metadata": {},
"source": [
"==================================================================\n",
"Step 1: generate data TTree"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "391e8323",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2026-05-19T20:05:15.198143Z",
"iopub.status.busy": "2026-05-19T20:05:15.197978Z",
"iopub.status.idle": "2026-05-19T20:05:15.429063Z",
"shell.execute_reply": "2026-05-19T20:05:15.418159Z"
}
},
"outputs": [],
"source": [
"TFile *dataFile=new TFile(\"testUnfold5_data.root\",\"recreate\");\n",
"TTree *dataTree=new TTree(\"data\",\"event\");\n",
"\n",
"dataTree->Branch(\"etarec\",&etaRec,\"etarec/F\");\n",
"dataTree->Branch(\"ptrec\",&ptRec,\"ptrec/F\");\n",
"dataTree->Branch(\"discr\",&discr,\"discr/F\");"
]
},
{
"cell_type": "markdown",
"id": "6db8ed9c",
"metadata": {},
"source": [
"for real data, only the triggered events are available"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "be740cf1",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2026-05-19T20:05:15.440098Z",
"iopub.status.busy": "2026-05-19T20:05:15.439937Z",
"iopub.status.idle": "2026-05-19T20:05:15.669958Z",
"shell.execute_reply": "2026-05-19T20:05:15.663495Z"
}
},
"outputs": [],
"source": [
"dataTree->Branch(\"istriggered\",&istriggered,\"istriggered/I\");"
]
},
{
"cell_type": "markdown",
"id": "26d8140f",
"metadata": {},
"source": [
"data truth parameters"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "190eb030",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2026-05-19T20:05:15.675914Z",
"iopub.status.busy": "2026-05-19T20:05:15.675776Z",
"iopub.status.idle": "2026-05-19T20:05:16.105178Z",
"shell.execute_reply": "2026-05-19T20:05:16.100081Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"fill data tree\n",
" data event 0\n",
" data event 100000\n"
]
}
],
"source": [
"dataTree->Branch(\"etagen\",&etaGen,\"etagen/F\");\n",
"dataTree->Branch(\"ptgen\",&ptGen,\"ptgen/F\");\n",
"dataTree->Branch(\"issignal\",&issignal,\"issignal/I\");\n",
"\n",
"cout<<\"fill data tree\\n\";\n",
"\n",
"Int_t nEvent=0,nTriggered=0;\n",
"while(nTriggeredFill();\n",
"\n",
" if(!(nEvent%100000)) cout<<\" data event \"<Write();\n",
"delete dataTree;\n",
"delete dataFile;"
]
},
{
"cell_type": "markdown",
"id": "75849073",
"metadata": {},
"source": [
"==================================================================\n",
"Step 2: generate signal TTree"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "c1980618",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2026-05-19T20:05:16.110147Z",
"iopub.status.busy": "2026-05-19T20:05:16.110006Z",
"iopub.status.idle": "2026-05-19T20:05:17.562518Z",
"shell.execute_reply": "2026-05-19T20:05:17.562169Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"fill signal tree\n",
" signal event 0\n",
" signal event 100000\n",
" signal event 200000\n",
" signal event 300000\n",
" signal event 400000\n",
" signal event 500000\n",
" signal event 600000\n",
" signal event 700000\n",
" signal event 800000\n",
" signal event 900000\n",
" signal event 1000000\n",
" signal event 1100000\n",
" signal event 1200000\n",
" signal event 1300000\n",
" signal event 1400000\n",
" signal event 1500000\n",
" signal event 1600000\n",
" signal event 1700000\n",
" signal event 1800000\n",
" signal event 1900000\n"
]
}
],
"source": [
"TFile *signalFile=new TFile(\"testUnfold5_signal.root\",\"recreate\");\n",
"TTree *signalTree=new TTree(\"signal\",\"event\");\n",
"\n",
"signalTree->Branch(\"etarec\",&etaRec,\"etarec/F\");\n",
"signalTree->Branch(\"ptrec\",&ptRec,\"ptrec/F\");\n",
"signalTree->Branch(\"discr\",&discr,\"discr/F\");\n",
"signalTree->Branch(\"istriggered\",&istriggered,\"istriggered/I\");\n",
"signalTree->Branch(\"etagen\",&etaGen,\"etagen/F\");\n",
"signalTree->Branch(\"ptgen\",&ptGen,\"ptgen/F\");\n",
"\n",
"cout<<\"fill signal tree\\n\";\n",
"\n",
"for(int ievent=0;ieventFill();\n",
"}\n",
"\n",
"signalTree->Write();\n",
"delete signalTree;\n",
"delete signalFile;"
]
},
{
"cell_type": "markdown",
"id": "1bef3f7c",
"metadata": {},
"source": [
"==============================================================\n",
"Step 3: generate background MC TTree"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "dc5aa45e",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2026-05-19T20:05:17.566250Z",
"iopub.status.busy": "2026-05-19T20:05:17.566123Z",
"iopub.status.idle": "2026-05-19T20:05:25.845283Z",
"shell.execute_reply": "2026-05-19T20:05:25.844635Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"fill background tree\n",
" background event 0\n",
" background event 100000\n",
" background event 200000\n",
" background event 300000\n",
" background event 400000\n",
" background event 500000\n",
" background event 600000\n",
" background event 700000\n",
" background event 800000\n",
" background event 900000\n",
" background event 1000000\n",
" background event 1100000\n",
" background event 1200000\n",
" background event 1300000\n",
" background event 1400000\n",
" background event 1500000\n",
" background event 1600000\n",
" background event 1700000\n",
" background event 1800000\n",
" background event 1900000\n"
]
}
],
"source": [
"TFile *bgrFile=new TFile(\"testUnfold5_background.root\",\"recreate\");\n",
"TTree *bgrTree=new TTree(\"background\",\"event\");\n",
"\n",
"bgrTree->Branch(\"etarec\",&etaRec,\"etarec/F\");\n",
"bgrTree->Branch(\"ptrec\",&ptRec,\"ptrec/F\");\n",
"bgrTree->Branch(\"discr\",&discr,\"discr/F\");\n",
"bgrTree->Branch(\"istriggered\",&istriggered,\"istriggered/I\");\n",
"\n",
"cout<<\"fill background tree\\n\";\n",
"\n",
"for(int ievent=0;ieventFill();\n",
"}\n",
"\n",
"bgrTree->Write();\n",
"delete bgrTree;\n",
"delete bgrFile;"
]
},
{
"cell_type": "markdown",
"id": "c88e4760",
"metadata": {},
"source": [
"Draw all canvases "
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "e2846e0a",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2026-05-19T20:05:25.874551Z",
"iopub.status.busy": "2026-05-19T20:05:25.874400Z",
"iopub.status.idle": "2026-05-19T20:05:26.078246Z",
"shell.execute_reply": "2026-05-19T20:05:26.077658Z"
}
},
"outputs": [],
"source": [
"gROOT->GetListOfCanvases()->Draw()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "ROOT C++",
"language": "c++",
"name": "root"
},
"language_info": {
"codemirror_mode": "text/x-c++src",
"file_extension": ".C",
"mimetype": " text/x-c++src",
"name": "c++"
}
},
"nbformat": 4,
"nbformat_minor": 5
}