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