ROOT logo
#include "TFile.h"
#include "TH1.h"
#include "TH1D.h"
#include "TMath.h"

#include <Riostream.h>

//
// Multiply two histos of variable bin width
//
TH1 * MultiplyHistos(TH1 *h1, TH1 *h2) {
  
  Int_t nbins1 = h1->GetNbinsX();
  Int_t nbins2 = h2->GetNbinsX();
  Double_t binwidth1 = h1->GetBinWidth(1);
  Double_t binwidth2 = h2->GetBinWidth(1);

  if ( nbins1!=nbins2 || binwidth1!=binwidth2 ) {
    cout << "Histos do not have the same binning, do not seem compatible" << endl;
    return NULL;
  }

  //
  // Get the bins & limits
  Double_t *limits = new Double_t[nbins1+1];
  Double_t xlow=0., binwidth=0.;
  for (Int_t i=1; i<=nbins1; i++) {
    binwidth = h1->GetBinWidth(i);
    xlow = h1->GetBinLowEdge(i);
    limits[i-1] = xlow;
  }
  limits[nbins1] = xlow + binwidth;

  TH1D *hMultiply = new TH1D("hMultiply","hMultiply",nbins1,limits);

  Double_t value=0., err=0.;
  for (Int_t ibin=1; ibin<=nbins1; ibin++) {
    value = h1->GetBinContent(ibin) * h2->GetBinContent(ibin);
    err = value * TMath::Sqrt(  (h1->GetBinError(ibin)/h1->GetBinContent(ibin)) * (h1->GetBinError(ibin)/h1->GetBinContent(ibin))  +
				(h2->GetBinError(ibin)/h2->GetBinContent(ibin)) * (h2->GetBinError(ibin)/h2->GetBinContent(ibin))   );
    hMultiply->SetBinContent(ibin,value);
    hMultiply->SetBinError(ibin,err);
  }
  
  return (TH1*)hMultiply;
}

//
// Main function
// 
void ComputeEfficiencyInputFromTwoSteps (const char* recolhc10d3filename="Distributions.root",
					 const char* recolhc10d3histoname="RECPIDpt",
					 const char* simuAcclhc10d3filename="Distributions.root",
					 const char* simuAcclhc10d3histoname="MCAccpt",
					 const char* simuLimAcclhc10d4filename="",
					 const char* simuLimAcclhc10d4histoname="MCLimAccpt",
					 const char* simuAcclhc10d4filename="",
					 const char* simuAcclhc10d4histoname="MCAccpt",
					 const char* outfilename="ComputeEfficiencyInputFromTwoSteps.root") 
{

  TFile *recolhc10d3file = new TFile(recolhc10d3filename,"read");
  TH1D *hrecolhc10d3 = (TH1D*)recolhc10d3file->Get(recolhc10d3histoname);

  TFile *simuAcclhc10d3file = new TFile(simuAcclhc10d3filename,"read");
  TH1D *hsimuAcclhc10d3 = (TH1D*)simuAcclhc10d3file->Get(simuAcclhc10d3histoname);

  TFile *simuLimAcclhc10d4file = new TFile(simuLimAcclhc10d4filename,"read");
  TH1D *hsimuLimAcclhc10d4 = (TH1D*)simuLimAcclhc10d4file->Get(simuLimAcclhc10d4histoname);

  TFile *simuAcclhc10d4file = new TFile(simuAcclhc10d4filename,"read");
  TH1D *hsimuAcclhc10d4 = (TH1D*)simuAcclhc10d4file->Get(simuAcclhc10d4histoname);


  TFile *out = new TFile(outfilename,"recreate");
  TH1D *hRecoPIDCorr = (TH1D*)MultiplyHistos(hrecolhc10d3,hsimuAcclhc10d4);
  hRecoPIDCorr->SetNameTitle("hRecoPIDCorr","hRecoPIDCorr");
  TH1D *hSimuCorr = (TH1D*)MultiplyHistos(hsimuAcclhc10d3,hsimuLimAcclhc10d4);
  hSimuCorr->SetNameTitle("hSimuCorr","hSimuCorr");

  out->cd(); 
  hRecoPIDCorr->Write();
  hSimuCorr->Write();
  out->Close();

}
 ComputeEfficiencyInputFromTwoSteps.C:1
 ComputeEfficiencyInputFromTwoSteps.C:2
 ComputeEfficiencyInputFromTwoSteps.C:3
 ComputeEfficiencyInputFromTwoSteps.C:4
 ComputeEfficiencyInputFromTwoSteps.C:5
 ComputeEfficiencyInputFromTwoSteps.C:6
 ComputeEfficiencyInputFromTwoSteps.C:7
 ComputeEfficiencyInputFromTwoSteps.C:8
 ComputeEfficiencyInputFromTwoSteps.C:9
 ComputeEfficiencyInputFromTwoSteps.C:10
 ComputeEfficiencyInputFromTwoSteps.C:11
 ComputeEfficiencyInputFromTwoSteps.C:12
 ComputeEfficiencyInputFromTwoSteps.C:13
 ComputeEfficiencyInputFromTwoSteps.C:14
 ComputeEfficiencyInputFromTwoSteps.C:15
 ComputeEfficiencyInputFromTwoSteps.C:16
 ComputeEfficiencyInputFromTwoSteps.C:17
 ComputeEfficiencyInputFromTwoSteps.C:18
 ComputeEfficiencyInputFromTwoSteps.C:19
 ComputeEfficiencyInputFromTwoSteps.C:20
 ComputeEfficiencyInputFromTwoSteps.C:21
 ComputeEfficiencyInputFromTwoSteps.C:22
 ComputeEfficiencyInputFromTwoSteps.C:23
 ComputeEfficiencyInputFromTwoSteps.C:24
 ComputeEfficiencyInputFromTwoSteps.C:25
 ComputeEfficiencyInputFromTwoSteps.C:26
 ComputeEfficiencyInputFromTwoSteps.C:27
 ComputeEfficiencyInputFromTwoSteps.C:28
 ComputeEfficiencyInputFromTwoSteps.C:29
 ComputeEfficiencyInputFromTwoSteps.C:30
 ComputeEfficiencyInputFromTwoSteps.C:31
 ComputeEfficiencyInputFromTwoSteps.C:32
 ComputeEfficiencyInputFromTwoSteps.C:33
 ComputeEfficiencyInputFromTwoSteps.C:34
 ComputeEfficiencyInputFromTwoSteps.C:35
 ComputeEfficiencyInputFromTwoSteps.C:36
 ComputeEfficiencyInputFromTwoSteps.C:37
 ComputeEfficiencyInputFromTwoSteps.C:38
 ComputeEfficiencyInputFromTwoSteps.C:39
 ComputeEfficiencyInputFromTwoSteps.C:40
 ComputeEfficiencyInputFromTwoSteps.C:41
 ComputeEfficiencyInputFromTwoSteps.C:42
 ComputeEfficiencyInputFromTwoSteps.C:43
 ComputeEfficiencyInputFromTwoSteps.C:44
 ComputeEfficiencyInputFromTwoSteps.C:45
 ComputeEfficiencyInputFromTwoSteps.C:46
 ComputeEfficiencyInputFromTwoSteps.C:47
 ComputeEfficiencyInputFromTwoSteps.C:48
 ComputeEfficiencyInputFromTwoSteps.C:49
 ComputeEfficiencyInputFromTwoSteps.C:50
 ComputeEfficiencyInputFromTwoSteps.C:51
 ComputeEfficiencyInputFromTwoSteps.C:52
 ComputeEfficiencyInputFromTwoSteps.C:53
 ComputeEfficiencyInputFromTwoSteps.C:54
 ComputeEfficiencyInputFromTwoSteps.C:55
 ComputeEfficiencyInputFromTwoSteps.C:56
 ComputeEfficiencyInputFromTwoSteps.C:57
 ComputeEfficiencyInputFromTwoSteps.C:58
 ComputeEfficiencyInputFromTwoSteps.C:59
 ComputeEfficiencyInputFromTwoSteps.C:60
 ComputeEfficiencyInputFromTwoSteps.C:61
 ComputeEfficiencyInputFromTwoSteps.C:62
 ComputeEfficiencyInputFromTwoSteps.C:63
 ComputeEfficiencyInputFromTwoSteps.C:64
 ComputeEfficiencyInputFromTwoSteps.C:65
 ComputeEfficiencyInputFromTwoSteps.C:66
 ComputeEfficiencyInputFromTwoSteps.C:67
 ComputeEfficiencyInputFromTwoSteps.C:68
 ComputeEfficiencyInputFromTwoSteps.C:69
 ComputeEfficiencyInputFromTwoSteps.C:70
 ComputeEfficiencyInputFromTwoSteps.C:71
 ComputeEfficiencyInputFromTwoSteps.C:72
 ComputeEfficiencyInputFromTwoSteps.C:73
 ComputeEfficiencyInputFromTwoSteps.C:74
 ComputeEfficiencyInputFromTwoSteps.C:75
 ComputeEfficiencyInputFromTwoSteps.C:76
 ComputeEfficiencyInputFromTwoSteps.C:77
 ComputeEfficiencyInputFromTwoSteps.C:78
 ComputeEfficiencyInputFromTwoSteps.C:79
 ComputeEfficiencyInputFromTwoSteps.C:80
 ComputeEfficiencyInputFromTwoSteps.C:81
 ComputeEfficiencyInputFromTwoSteps.C:82
 ComputeEfficiencyInputFromTwoSteps.C:83
 ComputeEfficiencyInputFromTwoSteps.C:84
 ComputeEfficiencyInputFromTwoSteps.C:85
 ComputeEfficiencyInputFromTwoSteps.C:86
 ComputeEfficiencyInputFromTwoSteps.C:87