From $ROOTSYS/tutorials/math/testUnfold5c.C

// Author: Stefan Schmitt
// DESY, 14.10.2008

//  Version 17.0 example for multi-dimensional unfolding
//

#include <iostream>
#include <map>
#include <cmath>
#include <TMath.h>
#include <TFile.h>
#include <TTree.h>
#include <TH1.h>
#include "TUnfoldBinning.h"

using namespace std;

/*
  This file is part of TUnfold.

  TUnfold is free software: you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation, either version 3 of the License, or
  (at your option) any later version.

  TUnfold is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with TUnfold.  If not, see <http://www.gnu.org/licenses/>.
*/

///////////////////////////////////////////////////////////////////////
// 
// Test program for the classes TUnfoldDensity and TUnfoldBinning
//
// A toy test of the TUnfold package
//
// This is an example of unfolding a two-dimensional distribution
// also using an auxillary measurement to constrain some background
//
// The example comprizes several macros
//   testUnfold5a.C   create root files with TTree objects for
//                      signal, background and data
//            -> write files  testUnfold5_signal.root
//                            testUnfold5_background.root
//                            testUnfold5_data.root
//
//   testUnfold5b.C   create a root file with the TUnfoldBinning objects
//            -> write file  testUnfold5_binning.root
//
//   testUnfold5c.C   loop over trees and fill histograms based on the
//                      TUnfoldBinning objects
//            -> read  testUnfold5_binning.root
//                     testUnfold5_signal.root
//                     testUnfold5_background.root
//                     testUnfold5_data.root
//
//            -> write testUnfold5_histograms.root
//
//   testUnfold5d.C   run the unfolding
//            -> read  testUnfold5_histograms.root
//            -> write testUnfold5_result.root
//                     testUnfold5_result.ps
// 
///////////////////////////////////////////////////////////////////////

void testUnfold5c()
{
  // switch on histogram errors
  TH1::SetDefaultSumw2();

  //=======================================================
  // Step 1: open file to save histograms and binning schemes

  TFile *outputFile=new TFile("testUnfold5_histograms.root","recreate");

  //=======================================================
  // Step 2: read binning from file
  //         and save them to output file

  TFile *binningSchemes=new TFile("testUnfold5_binning.root");

  TUnfoldBinning *detectorBinning,*generatorBinning;

  outputFile->cd();

  binningSchemes->GetObject("detector",detectorBinning);
  binningSchemes->GetObject("generator",generatorBinning);

  delete binningSchemes;

  detectorBinning->Write();
  generatorBinning->Write();

  if(detectorBinning) {
     detectorBinning->PrintStream(cout);
  } else {
     cout<<"could not read 'detector' binning\n";
  }
  if(generatorBinning) {
     generatorBinning->PrintStream(cout);
  } else {
     cout<<"could not read 'generator' binning\n";
  }

  // pointers to various nodes in the bining scheme
  const TUnfoldBinning *detectordistribution=
     detectorBinning->FindNode("detectordistribution");

  const TUnfoldBinning *signalBinning=
     generatorBinning->FindNode("signal");

  const TUnfoldBinning *bgrBinning=
     generatorBinning->FindNode("background");

  // write binnig schemes to output file

  //=======================================================
  // Step 3: book and fill data histograms

  Float_t etaRec,ptRec,discr,etaGen,ptGen;
  Int_t istriggered,issignal;

  outputFile->cd();

  TH1 *histDataReco=detectorBinning->CreateHistogram("histDataReco");
  TH1 *histDataTruth=generatorBinning->CreateHistogram("histDataTruth");

  TFile *dataFile=new TFile("testUnfold5_data.root");
  TTree *dataTree=(TTree *) dataFile->Get("data");

  if(!dataTree) {
     cout<<"could not read 'data' tree\n";
  }
  
  dataTree->ResetBranchAddresses();
  dataTree->SetBranchAddress("etarec",&etaRec);
  dataTree->SetBranchAddress("ptrec",&ptRec);
  dataTree->SetBranchAddress("discr",&discr);
  // for real data, only the triggered events are available
  dataTree->SetBranchAddress("istriggered",&istriggered);
  // data truth parameters
  dataTree->SetBranchAddress("etagen",&etaGen);
  dataTree->SetBranchAddress("ptgen",&ptGen);
  dataTree->SetBranchAddress("issignal",&issignal);
  dataTree->SetBranchStatus("*",1);


  cout<<"loop over data events\n";

  for(Int_t ievent=0;ievent<dataTree->GetEntriesFast();ievent++) {
     if(dataTree->GetEntry(ievent)<=0) break;
     // fill histogram with reconstructed quantities
     if(istriggered) {
        Int_t binNumber=
           detectordistribution->GetGlobalBinNumber(ptRec,etaRec,discr);
        histDataReco->Fill(binNumber);
     }
     // fill histogram with data truth parameters
     if(issignal) {
        // signal has true eta and pt
        Int_t binNumber=signalBinning->GetGlobalBinNumber(ptGen,etaGen);
        histDataTruth->Fill(binNumber);
     } else {
        // background only has reconstructed pt and eta
        Int_t binNumber=bgrBinning->GetGlobalBinNumber(ptRec,etaRec);
        histDataTruth->Fill(binNumber);
     }
  }

  delete dataTree;
  delete dataFile;

  //=======================================================
  // Step 4: book and fill histogram of migrations
  //         it receives events from both signal MC and background MC

  outputFile->cd();

  TH2 *histMCGenRec=TUnfoldBinning::CreateHistogramOfMigrations
     (generatorBinning,detectorBinning,"histMCGenRec");

  TFile *signalFile=new TFile("testUnfold5_signal.root");
  TTree *signalTree=(TTree *) signalFile->Get("signal");

  if(!signalTree) {
     cout<<"could not read 'signal' tree\n";
  }
  
  signalTree->ResetBranchAddresses();
  signalTree->SetBranchAddress("etarec",&etaRec);
  signalTree->SetBranchAddress("ptrec",&ptRec);
  signalTree->SetBranchAddress("discr",&discr);
  signalTree->SetBranchAddress("istriggered",&istriggered);
  signalTree->SetBranchAddress("etagen",&etaGen);
  signalTree->SetBranchAddress("ptgen",&ptGen);
  signalTree->SetBranchStatus("*",1);

  cout<<"loop over MC signal events\n";
  
  for(Int_t ievent=0;ievent<signalTree->GetEntriesFast();ievent++) {
     if(signalTree->GetEntry(ievent)<=0) break;

     // bin number on generator level for signal
     Int_t genBin=signalBinning->GetGlobalBinNumber(ptGen,etaGen);

     // bin number on reconstructed level
     // bin number 0 corresponds to non-reconstructed events
     Int_t recBin=0;
     if(istriggered) {
        recBin=detectordistribution->GetGlobalBinNumber(ptRec,etaRec,discr);
     }
     histMCGenRec->Fill(genBin,recBin);
  }

  delete signalTree;
  delete signalFile;

  TFile *bgrFile=new TFile("testUnfold5_background.root");
  TTree *bgrTree=(TTree *) bgrFile->Get("background");

  if(!bgrTree) {
     cout<<"could not read 'background' tree\n";
  }

  bgrTree->ResetBranchAddresses();
  bgrTree->SetBranchAddress("etarec",&etaRec);
  bgrTree->SetBranchAddress("ptrec",&ptRec);
  bgrTree->SetBranchAddress("discr",&discr);
  bgrTree->SetBranchAddress("istriggered",&istriggered);
  bgrTree->SetBranchStatus("*",1);

  cout<<"loop over MC background events\n";

  for(Int_t ievent=0;ievent<bgrTree->GetEntriesFast();ievent++) {
     if(bgrTree->GetEntry(ievent)<=0) break;

     // here, for background only reconstructed quantities are known
     // and only the reconstructed events are relevant
     if(istriggered) {
        // bin number on generator level for background
        Int_t genBin=bgrBinning->GetGlobalBinNumber(ptRec,etaRec);
        // bin number on reconstructed level
        Int_t recBin=detectordistribution->GetGlobalBinNumber
           (ptRec,etaRec,discr);
        histMCGenRec->Fill(genBin,recBin);
     }
  }

  delete bgrTree;
  delete bgrFile;

  outputFile->Write();
  delete outputFile;

}
 testUnfold5c.C:1
 testUnfold5c.C:2
 testUnfold5c.C:3
 testUnfold5c.C:4
 testUnfold5c.C:5
 testUnfold5c.C:6
 testUnfold5c.C:7
 testUnfold5c.C:8
 testUnfold5c.C:9
 testUnfold5c.C:10
 testUnfold5c.C:11
 testUnfold5c.C:12
 testUnfold5c.C:13
 testUnfold5c.C:14
 testUnfold5c.C:15
 testUnfold5c.C:16
 testUnfold5c.C:17
 testUnfold5c.C:18
 testUnfold5c.C:19
 testUnfold5c.C:20
 testUnfold5c.C:21
 testUnfold5c.C:22
 testUnfold5c.C:23
 testUnfold5c.C:24
 testUnfold5c.C:25
 testUnfold5c.C:26
 testUnfold5c.C:27
 testUnfold5c.C:28
 testUnfold5c.C:29
 testUnfold5c.C:30
 testUnfold5c.C:31
 testUnfold5c.C:32
 testUnfold5c.C:33
 testUnfold5c.C:34
 testUnfold5c.C:35
 testUnfold5c.C:36
 testUnfold5c.C:37
 testUnfold5c.C:38
 testUnfold5c.C:39
 testUnfold5c.C:40
 testUnfold5c.C:41
 testUnfold5c.C:42
 testUnfold5c.C:43
 testUnfold5c.C:44
 testUnfold5c.C:45
 testUnfold5c.C:46
 testUnfold5c.C:47
 testUnfold5c.C:48
 testUnfold5c.C:49
 testUnfold5c.C:50
 testUnfold5c.C:51
 testUnfold5c.C:52
 testUnfold5c.C:53
 testUnfold5c.C:54
 testUnfold5c.C:55
 testUnfold5c.C:56
 testUnfold5c.C:57
 testUnfold5c.C:58
 testUnfold5c.C:59
 testUnfold5c.C:60
 testUnfold5c.C:61
 testUnfold5c.C:62
 testUnfold5c.C:63
 testUnfold5c.C:64
 testUnfold5c.C:65
 testUnfold5c.C:66
 testUnfold5c.C:67
 testUnfold5c.C:68
 testUnfold5c.C:69
 testUnfold5c.C:70
 testUnfold5c.C:71
 testUnfold5c.C:72
 testUnfold5c.C:73
 testUnfold5c.C:74
 testUnfold5c.C:75
 testUnfold5c.C:76
 testUnfold5c.C:77
 testUnfold5c.C:78
 testUnfold5c.C:79
 testUnfold5c.C:80
 testUnfold5c.C:81
 testUnfold5c.C:82
 testUnfold5c.C:83
 testUnfold5c.C:84
 testUnfold5c.C:85
 testUnfold5c.C:86
 testUnfold5c.C:87
 testUnfold5c.C:88
 testUnfold5c.C:89
 testUnfold5c.C:90
 testUnfold5c.C:91
 testUnfold5c.C:92
 testUnfold5c.C:93
 testUnfold5c.C:94
 testUnfold5c.C:95
 testUnfold5c.C:96
 testUnfold5c.C:97
 testUnfold5c.C:98
 testUnfold5c.C:99
 testUnfold5c.C:100
 testUnfold5c.C:101
 testUnfold5c.C:102
 testUnfold5c.C:103
 testUnfold5c.C:104
 testUnfold5c.C:105
 testUnfold5c.C:106
 testUnfold5c.C:107
 testUnfold5c.C:108
 testUnfold5c.C:109
 testUnfold5c.C:110
 testUnfold5c.C:111
 testUnfold5c.C:112
 testUnfold5c.C:113
 testUnfold5c.C:114
 testUnfold5c.C:115
 testUnfold5c.C:116
 testUnfold5c.C:117
 testUnfold5c.C:118
 testUnfold5c.C:119
 testUnfold5c.C:120
 testUnfold5c.C:121
 testUnfold5c.C:122
 testUnfold5c.C:123
 testUnfold5c.C:124
 testUnfold5c.C:125
 testUnfold5c.C:126
 testUnfold5c.C:127
 testUnfold5c.C:128
 testUnfold5c.C:129
 testUnfold5c.C:130
 testUnfold5c.C:131
 testUnfold5c.C:132
 testUnfold5c.C:133
 testUnfold5c.C:134
 testUnfold5c.C:135
 testUnfold5c.C:136
 testUnfold5c.C:137
 testUnfold5c.C:138
 testUnfold5c.C:139
 testUnfold5c.C:140
 testUnfold5c.C:141
 testUnfold5c.C:142
 testUnfold5c.C:143
 testUnfold5c.C:144
 testUnfold5c.C:145
 testUnfold5c.C:146
 testUnfold5c.C:147
 testUnfold5c.C:148
 testUnfold5c.C:149
 testUnfold5c.C:150
 testUnfold5c.C:151
 testUnfold5c.C:152
 testUnfold5c.C:153
 testUnfold5c.C:154
 testUnfold5c.C:155
 testUnfold5c.C:156
 testUnfold5c.C:157
 testUnfold5c.C:158
 testUnfold5c.C:159
 testUnfold5c.C:160
 testUnfold5c.C:161
 testUnfold5c.C:162
 testUnfold5c.C:163
 testUnfold5c.C:164
 testUnfold5c.C:165
 testUnfold5c.C:166
 testUnfold5c.C:167
 testUnfold5c.C:168
 testUnfold5c.C:169
 testUnfold5c.C:170
 testUnfold5c.C:171
 testUnfold5c.C:172
 testUnfold5c.C:173
 testUnfold5c.C:174
 testUnfold5c.C:175
 testUnfold5c.C:176
 testUnfold5c.C:177
 testUnfold5c.C:178
 testUnfold5c.C:179
 testUnfold5c.C:180
 testUnfold5c.C:181
 testUnfold5c.C:182
 testUnfold5c.C:183
 testUnfold5c.C:184
 testUnfold5c.C:185
 testUnfold5c.C:186
 testUnfold5c.C:187
 testUnfold5c.C:188
 testUnfold5c.C:189
 testUnfold5c.C:190
 testUnfold5c.C:191
 testUnfold5c.C:192
 testUnfold5c.C:193
 testUnfold5c.C:194
 testUnfold5c.C:195
 testUnfold5c.C:196
 testUnfold5c.C:197
 testUnfold5c.C:198
 testUnfold5c.C:199
 testUnfold5c.C:200
 testUnfold5c.C:201
 testUnfold5c.C:202
 testUnfold5c.C:203
 testUnfold5c.C:204
 testUnfold5c.C:205
 testUnfold5c.C:206
 testUnfold5c.C:207
 testUnfold5c.C:208
 testUnfold5c.C:209
 testUnfold5c.C:210
 testUnfold5c.C:211
 testUnfold5c.C:212
 testUnfold5c.C:213
 testUnfold5c.C:214
 testUnfold5c.C:215
 testUnfold5c.C:216
 testUnfold5c.C:217
 testUnfold5c.C:218
 testUnfold5c.C:219
 testUnfold5c.C:220
 testUnfold5c.C:221
 testUnfold5c.C:222
 testUnfold5c.C:223
 testUnfold5c.C:224
 testUnfold5c.C:225
 testUnfold5c.C:226
 testUnfold5c.C:227
 testUnfold5c.C:228
 testUnfold5c.C:229
 testUnfold5c.C:230
 testUnfold5c.C:231
 testUnfold5c.C:232
 testUnfold5c.C:233
 testUnfold5c.C:234
 testUnfold5c.C:235
 testUnfold5c.C:236
 testUnfold5c.C:237
 testUnfold5c.C:238
 testUnfold5c.C:239
 testUnfold5c.C:240
 testUnfold5c.C:241
 testUnfold5c.C:242
 testUnfold5c.C:243
 testUnfold5c.C:244
 testUnfold5c.C:245
 testUnfold5c.C:246
 testUnfold5c.C:247
 testUnfold5c.C:248
 testUnfold5c.C:249
 testUnfold5c.C:250
 testUnfold5c.C:251
 testUnfold5c.C:252
 testUnfold5c.C:253
 testUnfold5c.C:254
 testUnfold5c.C:255
 testUnfold5c.C:256
 testUnfold5c.C:257
 testUnfold5c.C:258
 testUnfold5c.C:259
 testUnfold5c.C:260