arXiv:1611.01927 12th Conference on Quark Confinement and the Hadron Spectrum (Confinement XII)
This is an example of unfolding a two-dimensional distribution also using an auxiliary measurement to constrain some background
#include <iostream>
#include <map>
#include <cmath>
void testUnfold7b()
{
TFile *outputFile=new TFile("testUnfold7_histograms.root","recreate");
outputFile->cd();
if(error) {
cout<<"error="<<error<<" from TDOMParser\n";
cout<<"==============================================================\n";
cout<<"Maybe the file testUnfold7binning.xml is missing?\n";
cout<<"The content of the file is included in the comments section\n";
cout<<"of this macro \"testUnfold7b.C\"\n";
cout<<"==============================================================\n";
}
fineBinningRoot=
coarseBinningRoot=
fineBinningRoot->
Write();
coarseBinningRoot->
Write();
if(fineBinningRoot) {
} else {
cout<<"could not read 'detector' binning\n";
}
if(coarseBinningRoot) {
} else {
cout<<"could not read 'generator' binning\n";
}
Int_t isTriggered,isSignal;
outputFile->cd();
TFile *dataFile=new TFile("testUnfold7_data.root");
TTree *dataTree=(TTree *) dataFile->Get("data");
if(!dataTree) {
cout<<"could not read 'data' tree\n";
}
dataTree->ResetBranchAddresses();
dataTree->SetBranchAddress("ptrec",ptRec);
dataTree->SetBranchAddress("istriggered",&isTriggered);
dataTree->SetBranchAddress("ptgen",ptGen);
dataTree->SetBranchAddress("issignal",&isSignal);
dataTree->SetBranchStatus("*",1);
cout<<"loop over data events\n";
#define VAR_REC (ptRec[2])
#define VAR_GEN (ptGen[2])
for(
Int_t ievent=0;ievent<dataTree->GetEntriesFast();ievent++) {
if(dataTree->GetEntry(ievent)<=0) break;
if(isTriggered) {
histDataRecF->
Fill(binF);
histDataRecC->
Fill(binC);
if(!isSignal) {
histDataBgrF->
Fill(binF);
histDataBgrC->
Fill(binC);
}
}
if(isSignal) {
histDataGen->
Fill(binGen);
}
}
delete dataTree;
delete dataFile;
outputFile->cd();
(coarseBinning,fineBinning,"histMcsigGenRecF");
(coarseBinning,coarseBinning,"histMcsigGenRecC");
TFile *signalFile=new TFile("testUnfold7_signal.root");
TTree *signalTree=(TTree *) signalFile->Get("signal");
if(!signalTree) {
cout<<"could not read 'signal' tree\n";
}
signalTree->ResetBranchAddresses();
signalTree->SetBranchAddress("ptrec",&ptRec);
signalTree->SetBranchAddress("istriggered",&isTriggered);
signalTree->SetBranchAddress("ptgen",&ptGen);
signalTree->SetBranchAddress("weight",&weight);
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;
int binC=0,binF=0;
if(isTriggered) {
}
histMcsigGenRecF->
Fill(binGen,binF,weight);
histMcsigGenRecC->
Fill(binGen,binC,weight);
histMcsigRecF->
Fill(binF,weight);
histMcsigRecC->
Fill(binC,weight);
histMcsigGen->
Fill(binGen,weight);
}
delete signalTree;
delete signalFile;
outputFile->cd();
TFile *bgrFile=new TFile("testUnfold7_background.root");
TTree *bgrTree=(TTree *) bgrFile->Get("background");
if(!bgrTree) {
cout<<"could not read 'background' tree\n";
}
bgrTree->ResetBranchAddresses();
bgrTree->SetBranchAddress("ptrec",&ptRec);
bgrTree->SetBranchAddress("istriggered",&isTriggered);
bgrTree->SetBranchAddress("weight",&weight);
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;
if(isTriggered) {
histMcbgrRecF->
Fill(binF,weight);
histMcbgrRecC->
Fill(binC,weight);
}
}
delete bgrTree;
delete bgrFile;
outputFile->Write();
delete outputFile;
}