ATLAS Offline Software
Loading...
Searching...
No Matches
rmsFrac.cxx
Go to the documentation of this file.
1
9
10
11
12#include <cmath>
13
14#include "rmsFrac.h"
15
16namespace generate {
17
18
19
20double 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
26double GetEntries(TH1D* h) {
27 return GetEntries(h,1,h->GetNbinsX());
28}
29
30
31
32void 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
84double 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
182int 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
194double 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
281double rmsFrac(TH1D* s, double frac) {
282 return rmsFrac(s, frac, findMean( s, frac ) );
283}
284
285
286double 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
294double 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}
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:182
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:286
double GetEntries(TH1D *h, int ilow, int ihi)
Definition rmsFrac.cxx:20
double findMean(TH1D *s, double frac=0.95)
Definition rmsFrac.cxx:84
void getRange(TH1D *s, int imax, double frac, int &lowerbin, int &upperbin, double &lowerfrac, double &upperfrac)
Definition rmsFrac.cxx:32
double rmsFrac(TH1D *s, double frac, double mean)
Definition rmsFrac.cxx:194