This is an example of unfolding a two-dimensional distribution also using an auxiliary measurement to constrain some background
 
TUnfoldBinning "detector" has 360 bins [1,361] nTH1x=360
  TUnfoldBinning "detectordistribution" has 360 bins [1,361] nTH1x=360
   distribution: 360 bins
    "pt" nbin=8 plus overflow
    "eta" nbin=10
    "discriminator" nbin=4
TUnfoldBinning "generator" has 115 bins [1,116] nTH1x=115
  TUnfoldBinning "signal" has 25 bins [1,26] nTH1x=25
   distribution: 25 bins
    "ptgen" nbin=3 plus underflow plus overflow
    "etagen" nbin=3 plus underflow plus overflow
  TUnfoldBinning "background" has 90 bins [26,116] nTH1x=90
   distribution: 90 bins
    "ptrec" nbin=8 plus overflow
    "etarec" nbin=10
loop over data events
loop over MC signal events
loop over MC background events
   
 
 
#include <iostream>
#include <map>
#include <cmath>
#ifndef READ_BINNING_CINT
#else
#endif
 
using namespace std;
 
 
void testUnfold5c()
{
  
 
  
  
 
  TFile *outputFile=
new TFile(
"testUnfold5_histograms.root",
"recreate");
 
 
  
  
  
 
#ifdef READ_BINNING_CINT
  TFile *binningSchemes=
new TFile(
"testUnfold5_binning.root");
 
#endif
 
 
 
  
#ifndef READ_BINNING_CINT
  if(error) cout<<"error="<<error<<" from TDOMParser\n";
  detectorBinning=
  generatorBinning=
#else
  binningSchemes->
GetObject(
"detector",detectorBinning);
 
  binningSchemes->
GetObject(
"generator",generatorBinning);
 
 
  delete binningSchemes;
#endif
  detectorBinning->
Write();
 
  generatorBinning->
Write();
 
 
  if(detectorBinning) {
  } else {
     cout<<"could not read 'detector' binning\n";
  }
  if(generatorBinning) {
  } else {
     cout<<"could not read 'generator' binning\n";
  }
 
  
     detectorBinning->
FindNode(
"detectordistribution");
 
 
 
     generatorBinning->
FindNode(
"background");
 
 
  
 
  
  
 
  Float_t etaRec,ptRec,discr,etaGen,ptGen;
 
  Int_t istriggered,issignal;
 
 
 
 
  TFile *dataFile=
new TFile(
"testUnfold5_data.root");
 
 
  if(!dataTree) {
     cout<<"could not read 'data' tree\n";
  }
 
  
  
 
 
  cout<<"loop over data events\n";
 
     if(dataTree->
GetEntry(ievent)<=0) 
break;
 
     
     if(istriggered) {
        histDataReco->
Fill(binNumber);
 
     }
     
     if(issignal) {
        
        histDataTruth->
Fill(binNumber);
 
     } else {
        
        histDataTruth->
Fill(binNumber);
 
     }
  }
 
  delete dataTree;
  delete dataFile;
 
  
  
  
 
 
     (generatorBinning,detectorBinning,"histMCGenRec");
 
  TFile *signalFile=
new TFile(
"testUnfold5_signal.root");
 
 
  if(!signalTree) {
     cout<<"could not read 'signal' tree\n";
  }
 
 
  cout<<"loop over MC signal events\n";
 
     if(signalTree->
GetEntry(ievent)<=0) 
break;
 
 
     
 
     
     
     if(istriggered) {
     }
     histMCGenRec->
Fill(genBin,recBin);
 
  }
 
  delete signalTree;
  delete signalFile;
 
  TFile *bgrFile=
new TFile(
"testUnfold5_background.root");
 
 
  if(!bgrTree) {
     cout<<"could not read 'background' tree\n";
  }
 
 
  cout<<"loop over MC background events\n";
 
 
     
     
     if(istriggered) {
        
        
           (ptRec,etaRec,discr);
        histMCGenRec->
Fill(genBin,recBin);
 
     }
  }
 
  delete bgrTree;
  delete bgrFile;
 
  delete outputFile;
 
}
virtual TXMLDocument * GetXMLDocument() const
Returns the TXMLDocument.
 
Int_t ParseFile(const char *filename) override
Parse the XML file where filename is the XML file name.
 
Bool_t cd() override
Change current directory to "this" directory.
 
TObject * Get(const char *namecycle) override
Return pointer to object identified by namecycle.
 
void GetObject(const char *namecycle, T *&ptr)
Get an object with proper type checking.
 
A ROOT file is a suite of consecutive data records (TKey instances) with a well defined format.
 
Int_t Write(const char *name=nullptr, Int_t opt=0, Int_t bufsiz=0) override
Write memory objects to this file.
 
TH1 is the base class of all histogram classes in ROOT.
 
virtual Int_t Fill(Double_t x)
Increment bin with abscissa X by 1.
 
static void SetDefaultSumw2(Bool_t sumw2=kTRUE)
When this static function is called with sumw2=kTRUE, all new histograms will automatically activate ...
 
Service class for 2-D histogram classes.
 
Int_t Fill(Double_t) override
Invalid Fill method.
 
virtual Int_t Write(const char *name=nullptr, Int_t option=0, Int_t bufsize=0)
Write this object to the current directory.
 
A TTree represents a columnar dataset.
 
virtual Int_t GetEntry(Long64_t entry, Int_t getall=0)
Read all branches of entry and return total number of bytes read.
 
virtual Int_t SetBranchAddress(const char *bname, void *add, TBranch **ptr=nullptr)
Change branch address, dealing with clone trees properly.
 
virtual void SetBranchStatus(const char *bname, Bool_t status=1, UInt_t *found=nullptr)
Set branch status to Process or DoNotProcess.
 
virtual Long64_t GetEntriesFast() const
 
virtual void ResetBranchAddresses()
Tell all of our branches to drop their current objects and allocate new ones.
 
static TUnfoldBinningXML * ImportXML(const TXMLDocument *document, const char *name)
Import a binning scheme from an XML file.
 
Binning schemes for use with the unfolding algorithm TUnfoldDensity.
 
void PrintStream(std::ostream &out, Int_t indent=0, int debug=0) const
Print some information about this binning tree.
 
TH1 * CreateHistogram(const char *histogramName, Bool_t originalAxisBinning=kFALSE, Int_t **binMap=nullptr, const char *histogramTitle=nullptr, const char *axisSteering=nullptr) const
Create a THxx histogram capable to hold the bins of this binning node and its children.
 
Int_t GetGlobalBinNumber(Double_t x) const
Locate a bin in a one-dimensional distribution.
 
static TH2D * CreateHistogramOfMigrations(TUnfoldBinning const *xAxis, TUnfoldBinning const *yAxis, char const *histogramName, Bool_t originalXAxisBinning=kFALSE, Bool_t originalYAxisBinning=kFALSE, char const *histogramTitle=nullptr)
Create a TH2D histogram capable to hold the bins of the two input binning schemes on the x and y axes...
 
TUnfoldBinning const * FindNode(char const *name) const
Traverse the tree and return the first node which matches the given name.
 
TXMLDocument contains a pointer to an xmlDoc structure, after the parser returns a tree built during ...