ATLAS Offline Software
Toggle main menu visibility
Loading...
Searching...
No Matches
Trigger
TrigAnalysis
TrigInDetAnalysisUser
Resplot
src
rmsFrac.cxx
Go to the documentation of this file.
1
9
10
11
12
#include <cmath>
13
#include <iostream>
14
15
#include "
rmsFrac.h
"
16
17
namespace
generate
{
18
19
20
21
double
GetEntries
(TH1D*
h
,
int
ilow,
int
ihi) {
22
double
sum = 0;
23
for
(
int
i=ilow ; i<=ihi ; i++ ) sum +=
h
->GetBinContent(i);
24
return
sum;
25
}
26
27
double
GetEntries
(TH1D*
h
) {
28
return
GetEntries
(
h
,1,
h
->GetNbinsX());
29
}
30
31
32
33
void
getRange
(TH1D* s,
int
imax
,
double
frac
,
34
int
& lowerbin,
int
& upperbin,
double
& lowerfrac,
double
& upperfrac ) {
35
36
upperbin =
imax
;
37
lowerbin =
imax
;
38
39
upperfrac = 0;
40
lowerfrac = 0;
41
42
double
entries
=
GetEntries
(s,0,
int
(s->GetNbinsX())+1);
43
44
if
(
entries
>0 ) {
45
46
double
sumn = s->GetBinContent(
imax
);
47
double
tsum = s->GetBinContent(
imax
);
48
49
int
i=1;
50
while
(
true
) {
51
52
const
int
upperbin_i =
imax
+i;
53
const
int
lowerbin_i =
imax
-i;
54
55
if
( upperbin_i>s->GetNbinsX() || lowerbin_i<1 )
break
;
56
57
tsum += s->GetBinContent(upperbin_i) + s->GetBinContent(lowerbin_i);
58
59
// std::cout << i << " frac: " << lowersum
60
// << "\tx " << s->GetBinCenter(lowerbin)
61
// << "\t " << s->GetBinCenter(upperbin)
62
// << "\ttsum " << tsum
63
// << "\tentries " << entries
64
// << std::endl;
65
66
if
( tsum>=
entries
*
frac
)
break
;
67
68
sumn = tsum;
69
70
lowerfrac = sumn/
entries
;
71
72
upperbin = upperbin_i;
73
lowerbin = lowerbin_i;
74
75
i++;
76
}
77
78
upperfrac = tsum/
entries
;
79
}
80
81
}
82
83
84
85
double
findMean
(TH1D* s,
double
frac
=0.95) {
86
87
const
bool
interpolate_flag =
true
;
88
89
// double entries = GetEntries(s,0,int(s->GetNbinsX())+1);
90
double
entries
= s->GetEffectiveEntries();
// s,0,int(s->GetNbinsX())+1);
91
92
// std::cout << "\nfindMean() " << s->GetName() << "\tentries: " << entries << std::endl;
93
97
if
( (1-
frac
)*
entries
<1 )
return
0;
98
99
s->GetXaxis()->SetRange(1,s->GetNbinsX());
100
101
double
mean
= s->GetMean();
102
double
meane = s->GetMeanError();
103
104
int
upperbin = 0;
105
int
lowerbin = 0;
106
107
double
upperfrac = 0;
108
double
lowerfrac = 0;
109
110
int
imax
= 0;
111
112
int
it=0;
113
constexpr
int
it_max=20;
114
constexpr
int
it_max_report=20;
116
for
( ; it<it_max ; it++ ) {
117
118
119
// std::cout << it << "\tmean " << mean << " +- " << meane << std::endl;
120
121
imax
= s->GetXaxis()->FindBin(
mean
);
122
123
upperbin =
imax
;
124
lowerbin =
imax
;
125
126
upperfrac = 0;
127
lowerfrac = 0;
128
129
getRange
( s,
imax
,
frac
, lowerbin, upperbin, lowerfrac, upperfrac );
130
131
s->GetXaxis()->SetRange(lowerbin, upperbin);
132
133
double
m = s->GetMean();
134
double
me = s->GetMeanError();
135
136
if
( it>0 ) {
137
if
(
mean
==m ||
138
std::fabs(
mean
-m)<me*1e-5 ||
139
std::fabs(
mean
-m)<meane*1e-5 ) {
140
mean
= m;
141
meane = me;
142
// std::cout << "break after " << it << " iterations" << std::endl;
143
break
;
144
}
145
}
146
//cppcheck-suppress oppositeInnerCondition
147
if
( it>=it_max_report ) {
148
//coverity[DEADCODE]
149
std::cerr << s->GetName() <<
"\tMax iterations "
<< it <<
" reached"
<< std::endl;
150
}
151
152
mean
= m;
153
meane = me;
154
155
}
156
157
// std::cout << s->GetName() << "\tmean " << mean << " +- " << meane << std::endl;
158
159
if
( interpolate_flag ) {
160
161
s->GetXaxis()->SetRange(lowerbin-1, upperbin+1);
162
163
double
m = s->GetMean();
164
// double me = s->GetMeanError();
165
166
s->GetXaxis()->SetRange(1,s->GetNbinsX());
167
168
if
( upperfrac==lowerfrac )
return
0;
169
170
double
inter_mean =
mean
+ (
frac
-lowerfrac)*(m-
mean
)/(upperfrac-lowerfrac);
171
172
return
inter_mean;
173
}
174
else
{
175
s->GetXaxis()->SetRange(1,s->GetNbinsX());
176
return
mean
;
177
}
178
179
}
180
181
182
183
int
findMax
(TH1D* s) {
184
int
imax
= 1;
185
for
(
int
i=2 ; i<=s->GetNbinsX() ; i++ ) {
187
if
( s->GetBinContent(i)>s->GetBinContent(
imax
) )
imax
= i;
188
}
189
return
imax
;
190
}
191
192
193
194
195
double
rmsFrac
(TH1D* s,
double
frac
,
double
mean
) {
196
197
double
rms = 0;
198
double
erms = 0;
199
200
const
bool
interpolate_flag =
true
;
201
202
if
( s==0 ) { std::cerr <<
"rmsFrac() histogram s = "
<< s << std::endl;
return
0; }
203
if
( s->GetXaxis()==0) { std::cerr <<
"rmsFrac() histogram s->GetXaxis() not definied for histogram "
<< s->GetName() << std::endl;
return
0; }
204
205
// std::cout << "rmsFrac() " << s->GetName() << " " << GetEntries(s) << " " << GetEntries(s, 0, s->GetNbinsX()+1) << std::endl;
206
207
// double entries = GetEntries(s,0,int(s->GetNbinsX())+1);
208
double
entries
= s->GetEffectiveEntries();
// s,0,int(s->GetNbinsX())+1);
209
213
if
( (1-
frac
)*
entries
<1 )
return
0;
214
215
s->GetXaxis()->SetRange(1,s->GetNbinsX());
216
217
double
m =
mean
;
218
219
int
imax
= s->GetXaxis()->FindBin(m);
220
221
// std::cout << "rmsFrac() mean " << m << " " << imax << " max " << s->GetBinCenter(findMax(s)) << " " << findMax(s) << std::endl;
222
// std::cout << "rmsFrac() entries: " << entries << "\t" << GetEntries(s) << "\t" << GetEntries(s,0,s->GetNbinsX()+1) << std::endl;
223
224
int
upperbin =
imax
;
225
int
lowerbin =
imax
;
226
227
double
upperfrac = 0;
228
double
lowerfrac = 0;
229
230
if
(
entries
>0 ) {
231
getRange
( s,
imax
,
frac
, lowerbin, upperbin, lowerfrac, upperfrac );
232
}
233
234
// std::cout << "rmsFrac() " << s->GetName() << "\tlower bin " << lowerbin << "\t upper bin " << upperbin << std::endl;
235
236
// if ( upperbin!=lowerbin ) {
237
if
(
true
) {
238
239
std::vector<double> stats;
240
241
// std::cout << "rmsFrac() GetEntries " << s->GetName() << " " << GetEntries(s) << std::endl;
242
243
if
( interpolate_flag ) {
// && upperfrac!=lowerfrac ) {
244
245
double
rlower = 0;
246
double
erlower = 0;
247
s->GetXaxis()->SetRange(lowerbin, upperbin);
248
rlower = s->GetRMS();
249
// std::cout << "rmsFrac() GetEntries " << s->GetName() << " " << GetEntries(s,lowerbin,upperbin)/sentries << "\trlower " << rlower << std::endl;
250
251
double
rupper = 0;
252
double
erupper = 0;
253
s->GetXaxis()->SetRange(lowerbin-1, upperbin+1);
254
rupper = s->GetRMS();
255
// std::cout << "rmsFrac() GetEntries " << s->GetName() << " " << GetEntries(s,lowerbin-1,upperbin+1)/sentries << "\trupper " << rupper << std::endl;
256
257
// std::cout << "rmsFrac() Range " << s->GetBinLowEdge(lowerbin) << " - " << s->GetBinLowEdge(upperbin+1) << std::endl;
258
259
if
( upperfrac!=lowerfrac ) {
260
rms = rlower + (
frac
-lowerfrac)*(rupper-rlower)/(upperfrac-lowerfrac);
261
erms = erlower + (
frac
-lowerfrac)*(erupper-erlower)/(upperfrac-lowerfrac);
262
}
263
else
{
264
rms = erms = 0;
265
}
266
267
}
268
else
{
269
s->GetXaxis()->SetRange(lowerbin, upperbin);
270
rms = s->GetRMS();
271
}
272
}
273
274
275
s->GetXaxis()->SetRange(1,s->GetNbinsX());
276
277
return
rms;
278
279
}
280
281
282
double
rmsFrac
(TH1D* s,
double
frac
) {
283
return
rmsFrac
(s,
frac
,
findMean
( s,
frac
) );
284
}
285
286
287
double
rms95
(TH1D* s,
double
mean
) {
288
double
rms =
rmsFrac
(s, 0.95,
mean
);
289
// printf("rms95 %12.10lf %12.10lf inv %12.10lf\n", rms, rms/0.8711151572, rms*1.1479538518 );
290
// rms *= 1.1479538518;
291
s->GetXaxis()->SetRange(1,s->GetNbinsX());
292
return
rms;
293
}
294
295
double
rms95
(TH1D* s) {
296
double
rms =
rmsFrac
(s, 0.95);
297
// printf("rms95 %12.10lf %12.10lf inv %12.10lf\n", rms, rms/0.8711151572, rms*1.1479538518 );
298
// rms *= 1.1479538518;
299
s->GetXaxis()->SetRange(1,s->GetNbinsX());
300
return
rms;
301
}
302
303
}
imax
int imax(int i, int j)
Definition
TileLaserTimingTool.cxx:33
h
Header file for AthHistogramAlgorithm.
mean
void mean(std::vector< double > &bins, std::vector< double > &values, const std::vector< std::string > &files, const std::string &histname, const std::string &tplotname, const std::string &label="")
Definition
dependence.cxx:254
entries
double entries
Definition
listroot.cxx:49
generate
Definition
generate.cxx:28
generate::findMax
int findMax(TH1D *s)
Definition
rmsFrac.cxx:183
generate::frac
const double frac
Definition
generate.cxx:295
generate::rms95
double rms95(TH1D *s, double mean)
get the fraction of the rms95 value with respect to the rms95 value of a gaussian
Definition
rmsFrac.cxx:287
generate::GetEntries
double GetEntries(TH1D *h, int ilow, int ihi)
Definition
rmsFrac.cxx:21
generate::findMean
double findMean(TH1D *s, double frac=0.95)
Definition
rmsFrac.cxx:85
generate::getRange
void getRange(TH1D *s, int imax, double frac, int &lowerbin, int &upperbin, double &lowerfrac, double &upperfrac)
Definition
rmsFrac.cxx:33
generate::rmsFrac
double rmsFrac(TH1D *s, double frac, double mean)
Definition
rmsFrac.cxx:195
rmsFrac.h
Generated on
for ATLAS Offline Software by
1.17.0