ATLAS Offline Software
Loading...
Searching...
No Matches
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
17namespace generate {
18
19
20
21double 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
27double GetEntries(TH1D* h) {
28 return GetEntries(h,1,h->GetNbinsX());
29}
30
31
32
33void 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
85double 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
183int 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
195double 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
282double rmsFrac(TH1D* s, double frac) {
283 return rmsFrac(s, frac, findMean( s, frac ) );
284}
285
286
287double 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
295double 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}
int imax(int i, int j)
Header file for AthHistogramAlgorithm.
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="")
double entries
Definition listroot.cxx:49
int findMax(TH1D *s)
Definition rmsFrac.cxx:183
const double frac
Definition generate.cxx:295
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
double GetEntries(TH1D *h, int ilow, int ihi)
Definition rmsFrac.cxx:21
double findMean(TH1D *s, double frac=0.95)
Definition rmsFrac.cxx:85
void getRange(TH1D *s, int imax, double frac, int &lowerbin, int &upperbin, double &lowerfrac, double &upperfrac)
Definition rmsFrac.cxx:33
double rmsFrac(TH1D *s, double frac, double mean)
Definition rmsFrac.cxx:195