ATLAS Offline Software
Toggle main menu visibility
Loading...
Searching...
No Matches
LArCalorimeter
LArSamplesMon
src
ShapeDrawer.cxx
Go to the documentation of this file.
1
/*
2
Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3
*/
4
5
#include "
LArSamplesMon/ShapeDrawer.h
"
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
"
17
#include "
LArCafJobs/SimpleShape.h
"
18
#include "
LArSamplesMon/Chi2Calc.h
"
19
20
#include <iostream>
21
using
std::cout;
22
using
std::endl;
23
24
using namespace
LArSamples
;
25
26
27
TGraphErrors*
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
41
TGraphErrors*
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
49
bool
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
98
bool
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
133
bool
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
172
bool
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
180
bool
ShapeDrawer::drawAndDelete
(
const
char
* title,
181
std::vector<std::unique_ptr<const AbsShape> >&& shapes,
182
std::unique_ptr<const AbsShape>
reference
,
183
std::unique_ptr<const AbsShape> refSamples)
const
184
{
185
std::vector<const AbsShape*> shapes1;
186
for
(
const
std::unique_ptr<const AbsShape>& p : shapes)
187
shapes1.push_back (p.get());
188
bool
result =
draw
(title, shapes1,
reference
.get(), refSamples.get());
189
return
result;
190
}
191
192
193
bool
ShapeDrawer::drawAndDelete
(
const
char
* title,
194
std::unique_ptr<const AbsShape> shape,
195
std::unique_ptr<const AbsShape>
reference
,
196
std::unique_ptr<const AbsShape> refSamples)
const
197
{
198
bool
result =
draw
(title, shape.get(),
reference
.get(), refSamples.get());
199
return
result;
200
}
201
202
203
bool
ShapeDrawer::colorize
(TGraphErrors* data,
unsigned
int
index
)
const
204
{
205
if
(!data)
return
false
;
206
const
int
nColors = 5;
207
int
colors[nColors] = { 2,4,6,8,14 };
208
209
data->SetMarkerColor(colors[
index
%nColors]);
// use the 5 colors above
210
data->SetMarkerStyle(20 + ((
index
/nColors) % 50));
// for more choices change marker style from 20->30. Afterwards, loop back...
211
data->SetMarkerSize(1);
212
return
true
;
213
}
214
215
216
bool
ShapeDrawer::yAxisLimits
(
const
std::vector<const AbsShape*>& shapes,
double
& yMin,
double
& yMax)
const
217
{
218
yMin = 0;
219
yMax = 0;
220
for
(
unsigned
int
i = 0; i < shapes.size(); i++) {
221
double
sMin = shapes[i]->minValue(
true
);
222
double
sMax = shapes[i]->maxValue(
true
);
223
if
(sMin < yMin) yMin = sMin;
224
if
(sMax > yMax) yMax = sMax;
225
}
226
yMin *= 1.2;
227
yMax *= 1.2;
228
return
true
;
229
}
230
ref
const std::regex ref(r_ef)
AbsShape.h
Chi2Calc.h
ShapeDrawer.h
SimpleShape.h
LArSamples::AbsShape
Definition
AbsShape.h:28
LArSamples::AbsShape::graph
TGraphErrors * graph(bool timeInUnitOfSamples=false) const
Definition
AbsShape.cxx:186
LArSamples::Chi2Calc
Definition
Chi2Calc.h:26
LArSamples::Chi2Calc::chi2
double chi2(const AbsShape &data, const AbsShape &reference, const ScaledErrorData *shapeError=0, int lwb=-1, int upb=-1)
Definition
Chi2Calc.cxx:60
LArSamples::Chi2Calc::nDof
unsigned int nDof() const
Definition
Chi2Calc.h:47
LArSamples::ShapeDrawer::colorize
bool colorize(TGraphErrors *data, unsigned int index) const
Definition
ShapeDrawer.cxx:203
LArSamples::ShapeDrawer::drawData
bool drawData(const char *title, const std::vector< const AbsShape * > &shapes, const AbsShape *reference, bool first=true, TLegend *legend=0) const
Definition
ShapeDrawer.cxx:133
LArSamples::ShapeDrawer::yAxisLimits
bool yAxisLimits(const std::vector< const AbsShape * > &shapes, double &yMin, double &yMax) const
Definition
ShapeDrawer.cxx:216
LArSamples::ShapeDrawer::draw
TGraphErrors * draw(const AbsShape *shape, const char *title="", bool drawAxes=true, const char *gopt="P") const
Definition
ShapeDrawer.cxx:41
LArSamples::ShapeDrawer::drawRef
bool drawRef(const char *title, const AbsShape *reference, const AbsShape *refSamples, bool first=true, TLegend *legend=0) const
Definition
ShapeDrawer.cxx:98
LArSamples::ShapeDrawer::graph
TGraphErrors * graph(const AbsShape &shape, const char *title="") const
Definition
ShapeDrawer.cxx:27
LArSamples::ShapeDrawer::drawAndDelete
bool drawAndDelete(const char *title, std::vector< std::unique_ptr< const AbsShape > > &&shapes, std::unique_ptr< const AbsShape > reference=0, std::unique_ptr< const AbsShape > refSamples=0) const
Definition
ShapeDrawer.cxx:180
LArSamples::ShapeDrawer::m_pars
int m_pars
Definition
ShapeDrawer.h:59
reference
Definition
hcg.cxx:440
LArSamples
Definition
AbsShape.h:24
LArSamples::SamplingTimeUnits
@ SamplingTimeUnits
Definition
ShapeDrawer.h:24
LArSamples::DataFirst
@ DataFirst
Definition
ShapeDrawer.h:24
LArSamples::AtlasStyle
@ AtlasStyle
Definition
ShapeDrawer.h:24
LArSamples::Legend
@ Legend
Definition
ShapeDrawer.h:24
index
Definition
index.py:1
Generated on
for ATLAS Offline Software by
1.17.0