1 |
/*************************************************
|
2 |
Plot histograms together, then plot
|
3 |
their ratio on a histogram below.
|
4 |
|
5 |
Must provied at least 1 histogram
|
6 |
to be the "denomintator", and
|
7 |
up to 3 histograms to be "numerators".
|
8 |
|
9 |
All the plots will be shown together in a
|
10 |
big plot, and below that
|
11 |
will be a plot showing the ratio of all
|
12 |
the "numerators" to the "denominator".
|
13 |
|
14 |
|
15 |
Example use (first step is to prevent a bug in ROOT crashing):
|
16 |
root [1] .O0
|
17 |
root [2] .L plotHistsAndRatio.C
|
18 |
root [3] plotHistsAndRatio(photonEt_BarrelPIDcut,photonEt_Barrel,"Photon E_{T}","E_{T} (GeV)","entries/20 GeV bin")
|
19 |
|
20 |
Michael Anderson
|
21 |
March 18, 2009
|
22 |
*************************************************/
|
23 |
|
24 |
#include "TH1F.h"
|
25 |
#include <vector>
|
26 |
#include <cmath>
|
27 |
|
28 |
TCanvas* plotHistsAndRatio(TH1F* numeratorHist, TH1F* denominatorHist, TString title="", TString xTitle="", TString yTitle="") {
|
29 |
vector<TH1F*> numeratorHistograms;
|
30 |
numeratorHistograms.push_back( numeratorHist );
|
31 |
TCanvas* c1 = plotHistsAndRatio(numeratorHistograms, denominatorHist, title, xTitle, yTitle);
|
32 |
return c1;
|
33 |
}
|
34 |
|
35 |
TCanvas* plotHistsAndRatio(TH1F* numeratorHist1, TH1F* numeratorHist2, TH1F* denominatorHist, TString title="", TString xTitle="", TString yTitle="") {
|
36 |
vector<TH1F*> numeratorHistograms;
|
37 |
numeratorHistograms.push_back( numeratorHist1 );
|
38 |
numeratorHistograms.push_back( numeratorHist2 );
|
39 |
TCanvas* c1 = plotHistsAndRatio(numeratorHistograms, denominatorHist, title, xTitle, yTitle);
|
40 |
return c1;
|
41 |
}
|
42 |
|
43 |
TCanvas* plotHistsAndRatio(TH1F* numeratorHist1, TH1F* numeratorHist2, TH1F* numeratorHist3, TH1F* denominatorHist, TString title="", TString xTitle="", TString yTitle="") {
|
44 |
vector<TH1F*> numeratorHistograms;
|
45 |
numeratorHistograms.push_back( numeratorHist1 );
|
46 |
numeratorHistograms.push_back( numeratorHist2 );
|
47 |
numeratorHistograms.push_back( numeratorHist3 );
|
48 |
TCanvas *c1 = plotHistsAndRatio(numeratorHistograms, denominatorHist, title, xTitle, yTitle);
|
49 |
return c1;
|
50 |
}
|
51 |
|
52 |
TCanvas* plotHistsAndRatio(vector<TH1F*> numeratorHistograms, TH1F* denominatorHist, TString title="", TString xTitle="", TString yTitle="") {
|
53 |
|
54 |
int numberOfNumeratorHists = numeratorHistograms.size();
|
55 |
if (numberOfNumeratorHists>3) {
|
56 |
cout << "Too many histograms for numerator (currently only supports up to 3)" << endl;
|
57 |
exit;
|
58 |
}
|
59 |
if (!denominatorHist) {
|
60 |
cout << "denominatorHist provided does not exist" << endl;
|
61 |
exit;
|
62 |
}
|
63 |
|
64 |
//*************************************************
|
65 |
// Variables
|
66 |
bool topPlotLogY = 1; // 0 = no log; 1= log
|
67 |
TString yTitle2 = "ratio"; // bottom plot y axis title
|
68 |
|
69 |
vector<int> histColors;
|
70 |
histColors.push_back(kBlue); // change colors as you like
|
71 |
histColors.push_back(kRed);
|
72 |
histColors.push_back(kGreen-1);
|
73 |
|
74 |
int histDenominatorColor = kBlack;
|
75 |
|
76 |
float defaultRatioYmin = 1.02;
|
77 |
float defaultRatioYmax = 0.60;
|
78 |
// END of Variables
|
79 |
//*************************************************
|
80 |
|
81 |
TCanvas *c1 = new TCanvas("c1", "c1",0,0,600,500);
|
82 |
c1->Range(0,0,1,1);
|
83 |
|
84 |
vector<TH1F*> hists;
|
85 |
for (int i=0; i<numberOfNumeratorHists; i++) {
|
86 |
hists.push_back( (TH1F*)numeratorHistograms[i]->Clone() );
|
87 |
}
|
88 |
TH1F* denominatorHistogram = (TH1F*)denominatorHist->Clone();
|
89 |
|
90 |
|
91 |
// Create ratio histograms
|
92 |
vector<TH1F*> hist_over_denomHist;
|
93 |
for (int i=0; i<numberOfNumeratorHists; i++) {
|
94 |
hist_over_denomHist.push_back( (TH1F*)numeratorHistograms[i]->Clone() );
|
95 |
hist_over_denomHist[i]->GetTitle();
|
96 |
hist_over_denomHist[i]->Divide(denominatorHistogram);
|
97 |
}
|
98 |
|
99 |
|
100 |
//*************************************************
|
101 |
// Bottom plot
|
102 |
TPad *c1_1 = new TPad("c1_1", "newpad",0.01,0.0.01,0.99,0.32);
|
103 |
c1_1->Draw();
|
104 |
c1_1->cd();
|
105 |
c1_1->SetTopMargin(0.01);
|
106 |
c1_1->SetBottomMargin(0.3);
|
107 |
c1_1->SetRightMargin(0.1);
|
108 |
c1_1->SetFillStyle(0);
|
109 |
|
110 |
|
111 |
hist_over_denomHist[0]->Draw();
|
112 |
hist_over_denomHist[0]->SetLineWidth(1);
|
113 |
hist_over_denomHist[0]->SetLineColor(histColors[0]);
|
114 |
hist_over_denomHist[0]->SetMinimum(defaultRatioYmin);
|
115 |
hist_over_denomHist[0]->SetMaximum(defaultRatioYmax);
|
116 |
hist_over_denomHist[0]->GetYaxis()->SetNdivisions(5);
|
117 |
hist_over_denomHist[0]->SetTitle(";"+xTitle+";"+yTitle2);
|
118 |
hist_over_denomHist[0]->GetXaxis()->SetTitleSize(0.14);
|
119 |
hist_over_denomHist[0]->GetXaxis()->SetLabelSize(0.14);
|
120 |
hist_over_denomHist[0]->GetYaxis()->SetLabelSize(0.11);
|
121 |
hist_over_denomHist[0]->GetYaxis()->SetTitleSize(0.14);
|
122 |
hist_over_denomHist[0]->GetYaxis()->SetTitleOffset(0.28);
|
123 |
for (int i=1; i<numberOfNumeratorHists; i++) {
|
124 |
hist_over_denomHist[i]->SetLineWidth(1);
|
125 |
hist_over_denomHist[i]->SetLineColor(histColors[i]);
|
126 |
hist_over_denomHist[i]->Draw("same");
|
127 |
}
|
128 |
// End bottom plot
|
129 |
//*************************************************
|
130 |
|
131 |
|
132 |
//*************************************************
|
133 |
// Top Plot
|
134 |
c1->cd();
|
135 |
c1_2 = new TPad("c1_2", "newpad",0.01,0.33,0.99,0.99);
|
136 |
c1_2->Draw();
|
137 |
c1_2->cd();
|
138 |
c1_2->SetTopMargin(0.1);
|
139 |
c1_2->SetBottomMargin(0.01);
|
140 |
c1_2->SetRightMargin(0.1);
|
141 |
c1_1->SetFillStyle(0);
|
142 |
|
143 |
denominatorHistogram->SetLineWidth(2);
|
144 |
denominatorHistogram->SetLineColor(histDenominatorColor);
|
145 |
denominatorHistogram->Draw();
|
146 |
denominatorHistogram->SetLabelSize(0.0);
|
147 |
denominatorHistogram->GetXaxis()->SetTitleSize(0.00);
|
148 |
denominatorHistogram->GetYaxis()->SetLabelSize(0.07);
|
149 |
denominatorHistogram->GetYaxis()->SetTitleSize(0.08);
|
150 |
denominatorHistogram->GetYaxis()->SetTitleOffset(0.76);
|
151 |
denominatorHistogram->SetTitle(title+";;"+yTitle);
|
152 |
|
153 |
for (int i=0; i<numberOfNumeratorHists; i++) {
|
154 |
hists[i]->SetLineWidth(2);
|
155 |
hists[i]->SetLineColor(histColors[i]);
|
156 |
hists[i]->Draw("same");
|
157 |
}
|
158 |
|
159 |
c1_2->SetLogy(topPlotLogY);
|
160 |
// End bottom plot
|
161 |
//*************************************************
|
162 |
|
163 |
return c1;
|
164 |
}
|