ATLAS Offline Software
Loading...
Searching...
No Matches
ShapeDrawer.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
3*/
4
6
7#include "TH1.h"
8#include "TGraphErrors.h"
9#include "TPaveText.h"
10#include "TStyle.h"
11#include "TLatex.h"
12#include "TLegend.h"
13#include "TLegendEntry.h"
14#include "TList.h"
15
16#include "LArCafJobs/AbsShape.h"
19
20#include <iostream>
21using std::cout;
22using std::endl;
23
24using namespace LArSamples;
25
26
27TGraphErrors* ShapeDrawer::graph(const AbsShape& shape, const char* title) const
28{
29 bool samplingTimeUnits = (m_pars & SamplingTimeUnits) != 0;
30 TGraphErrors* graph = shape.graph(samplingTimeUnits);
31 graph->SetTitle(title);
32 graph->SetMarkerStyle(20);
33 graph->SetMarkerSize(0.4);
34 graph->GetXaxis()->SetTitle(samplingTimeUnits ? "Sample Index" : "Time [ns]");
35 graph->GetYaxis()->SetTitle("ADC counts");
36 graph->GetYaxis()->SetTitleOffset(1.25);
37 return graph;
38}
39
40
41TGraphErrors* ShapeDrawer::draw(const AbsShape* shape, const char* title, bool drawAxes, const char* gopt) const
42{
43 TGraphErrors* g = graph(*shape, title);
44 g->Draw(TString(drawAxes ? "A" : "") + gopt); // X=no errors
45 return g;
46}
47
48
49bool ShapeDrawer::draw(const char* title, const std::vector<const AbsShape*>& shapes,
50 const AbsShape* reference, const AbsShape* refSamples) const
51{
52 if (shapes.empty()) return false;
53
54 if (m_pars & AtlasStyle) {
55 gStyle->SetTitleXOffset(1.0);
56 gStyle->SetPadTopMargin(0.13);
57 gStyle->SetPadBottomMargin(0.12);
58 gStyle->SetPadRightMargin(0.05);
59 gStyle->SetPadLeftMargin(0.12);
60 }
61
62 TLegend* legend = nullptr;
63 if (m_pars & AtlasStyle) {
64 legend = new TLegend(0.45, 0.7, 0.8, 0.5, "", "NDC");
65 }
66 else if ((m_pars & Legend) && shapes.size() <= 4){
67 legend = new TLegend(0.6, 0.85, 0.85, 0.85 - 0.1*shapes.size(), "", "NDC");
68 }
69
70 if (legend) {
71 legend->SetFillColor(0);
72 legend->SetLineColor(0);
73 legend->SetShadowColor(0);
74 legend->SetTextSize(0.06);
75 legend->SetMargin(0.12);
76 }
77
78 if (m_pars & DataFirst) {
79 if (!drawData(title, shapes, reference, true, legend)) return false;
80 if (reference && !drawRef(title, reference, refSamples, false, legend)) return false;
81 if (m_pars & AtlasStyle) {
82 if (!drawData(title, shapes, reference, false)) return false;
83 TLatex l;
84 l.SetNDC();
85 l.SetTextSize(0.06);
86 l.DrawLatex(0.12,0.89, title);
87 }
88 }
89 else {
90 if (reference && !drawRef(title, reference, refSamples, true)) return false;
91 if (!drawData(title, shapes, reference, false)) return false;
92 }
93 if (legend && shapes.size() > 1) legend->Draw();
94 return true;
95}
96
97
98bool ShapeDrawer::drawRef(const char* title, const AbsShape* reference, const AbsShape* refSamples, bool first, TLegend* legend) const
99{
100 if (m_pars & AtlasStyle) {
101 //SimpleShape* overSampledRef = reference->resample(125);
102 //TGraphErrors* ref = graph(*overSampledRef);
103 TGraphErrors* ref = graph(*reference);
104 ref->SetName("reference");
105 ref->SetMarkerStyle(21);
106 ref->SetMarkerSize(0.3);
107 ref->SetMarkerColor(4);
108 ref->SetLineColor(4);
109 ref->SetLineWidth(3);
110 ref->Draw("XC");
111 if (legend) {
112 TGraphErrors* refBigMarkers = new TGraphErrors(*ref);
113 refBigMarkers->SetMarkerSize(1);
114 legend->AddEntry(refBigMarkers, "Prediction", "L");
115 ((TLegendEntry*)legend->GetListOfPrimitives()->Last())->SetTextColor(ref->GetMarkerColor());
116 }
117 return true;
118 }
119
120 TGraphErrors* ref = draw(reference, title, first, "CPX");
121 ref->SetName("reference");
122
123 if (refSamples) {
124 TGraphErrors* ref2 = graph(*refSamples);
125 ref->SetName("reference_samples");
126 ref2->SetMarkerSize(1);
127 ref2->Draw("P");
128 }
129 return true;
130}
131
132
133bool ShapeDrawer::drawData(const char* title, const std::vector<const AbsShape*>& shapes, const AbsShape* reference,
134 bool first, TLegend* legend) const
135{
136 Chi2Calc c2c;
137 double yMin = 0, yMax = 0;
138 if (!yAxisLimits(shapes, yMin, yMax)) return false;
139 cout << "Y limits = " << yMin << " " << yMax << endl;
140 for (unsigned int i = 0; i < shapes.size(); i++) {
141 if (!shapes[i]) return false;
142 TGraphErrors* data = graph(*shapes[i], title);
143 data->SetMinimum(yMin);
144 data->SetMaximum(yMax);
145 data->SetName(Form("data%d", i));
146 if (m_pars & AtlasStyle) {
147 data->GetXaxis()->SetLimits(-10, 800);
148 data->SetMarkerColor(2);
149 data->SetMarkerStyle(20);
150 data->SetMarkerSize(1.3);
151 }
152 else
153 if (!colorize(data, i)) return false;
154 data->Draw("P" + TString((first && i == 0) ? "A" : ""));
155 if (!legend) continue;
156 if (m_pars & AtlasStyle) {
157 legend->AddEntry(data, "Data", "P");
158 ((TLegendEntry*)legend->GetListOfPrimitives()->Last())->SetTextColor(data->GetMarkerColor());
159 }
160 else {
161 if (!reference || i >= 4) continue; // no chi2 printout...
162 double c2 = c2c.chi2(*shapes[i], *reference);
163 legend->AddEntry(data, Form("#chi^{2}/n = %.2f/%-2d", c2, c2c.nDof()), "P");
164 ((TLegendEntry*)legend->GetListOfPrimitives()->Last())->SetTextColor(data->GetMarkerColor());
165 }
166 }
167
168 return true;
169}
170
171
172bool ShapeDrawer::draw(const char* title, const AbsShape* shape, const AbsShape* reference, const AbsShape* refSamples) const
173{
174 std::vector<const AbsShape*> shapes;
175 shapes.push_back(shape);
176 return draw(title, shapes, reference, refSamples);
177}
178
179
180bool ShapeDrawer::drawAndDelete(const char* title, const std::vector<const AbsShape*>& shapes,
181 const AbsShape* reference, const AbsShape* refSamples) const
182{
183 bool result = draw(title, shapes, reference, refSamples);
184 for (const AbsShape* shape : shapes)
185 delete shape;
186 delete reference;
187 delete refSamples;
188 return result;
189}
190
191
192bool ShapeDrawer::drawAndDelete(const char* title, const AbsShape* shape, const AbsShape* reference, const AbsShape* refSamples) const
193{
194 bool result = draw(title, shape, reference, refSamples);
195 delete shape;
196 delete reference;
197 delete refSamples;
198 return result;
199}
200
201
202bool ShapeDrawer::colorize(TGraphErrors* data, unsigned int index) const
203{
204 if (!data) return false;
205 const int nColors = 5;
206 int colors[nColors] = { 2,4,6,8,14 };
207
208 data->SetMarkerColor(colors[index%nColors]); // use the 5 colors above
209 data->SetMarkerStyle(20 + ((index/nColors) % 50)); // for more choices change marker style from 20->30. Afterwards, loop back...
210 data->SetMarkerSize(1);
211 return true;
212}
213
214
215bool ShapeDrawer::yAxisLimits(const std::vector<const AbsShape*>& shapes, double& yMin, double& yMax) const
216{
217 yMin = 0;
218 yMax = 0;
219 for (unsigned int i = 0; i < shapes.size(); i++) {
220 double sMin = shapes[i]->minValue(true);
221 double sMax = shapes[i]->maxValue(true);
222 if (sMin < yMin) yMin = sMin;
223 if (sMax > yMax) yMax = sMax;
224 }
225 yMin *= 1.2;
226 yMax *= 1.2;
227 return true;
228}
229
const boost::regex ref(r_ef)
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
TGraphErrors * graph(bool timeInUnitOfSamples=false) const
Definition AbsShape.cxx:186
double chi2(const AbsShape &data, const AbsShape &reference, const ScaledErrorData *shapeError=0, int lwb=-1, int upb=-1)
Definition Chi2Calc.cxx:60
unsigned int nDof() const
Definition Chi2Calc.h:47
bool colorize(TGraphErrors *data, unsigned int index) const
bool drawData(const char *title, const std::vector< const AbsShape * > &shapes, const AbsShape *reference, bool first=true, TLegend *legend=0) const
bool yAxisLimits(const std::vector< const AbsShape * > &shapes, double &yMin, double &yMax) const
TGraphErrors * draw(const AbsShape *shape, const char *title="", bool drawAxes=true, const char *gopt="P") const
bool drawRef(const char *title, const AbsShape *reference, const AbsShape *refSamples, bool first=true, TLegend *legend=0) const
TGraphErrors * graph(const AbsShape &shape, const char *title="") const
bool drawAndDelete(const char *title, const std::vector< const AbsShape * > &shapes, const AbsShape *reference=0, const AbsShape *refSamples=0) const
@ SamplingTimeUnits
Definition ShapeDrawer.h:22
Definition index.py:1