{ "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 }