1 |
yangyong |
1.1 |
//******************************************//
|
2 |
|
|
// author:
|
3 |
|
|
//
|
4 |
|
|
// This function evaluates the effective
|
5 |
|
|
// sigma of a histogram.
|
6 |
|
|
//
|
7 |
|
|
//
|
8 |
|
|
// TODO list:
|
9 |
|
|
//
|
10 |
|
|
//
|
11 |
|
|
//
|
12 |
|
|
// Modified by:
|
13 |
|
|
//
|
14 |
|
|
//******************************************//
|
15 |
|
|
|
16 |
|
|
|
17 |
|
|
|
18 |
|
|
|
19 |
|
|
//Double_t effSigma(TH1 * hist)
|
20 |
|
|
|
21 |
|
|
void effSigma(TH1 * hist,double res[])
|
22 |
|
|
|
23 |
|
|
{
|
24 |
|
|
|
25 |
|
|
TAxis *xaxis = hist->GetXaxis();
|
26 |
|
|
Int_t nb = xaxis->GetNbins();
|
27 |
|
|
if(nb < 10) {
|
28 |
|
|
cout << "effsigma: Not a valid histo. nbins = " << nb << endl;
|
29 |
|
|
return ;
|
30 |
|
|
}
|
31 |
|
|
|
32 |
|
|
Double_t bwid = xaxis->GetBinWidth(1);
|
33 |
|
|
if(bwid == 0) {
|
34 |
|
|
cout << "effsigma: Not a valid histo. bwid = " << bwid << endl;
|
35 |
|
|
return ;
|
36 |
|
|
}
|
37 |
|
|
Double_t xmax = xaxis->GetXmax();
|
38 |
|
|
Double_t xmin = xaxis->GetXmin();
|
39 |
|
|
Double_t ave = hist->GetMean();
|
40 |
|
|
Double_t rms = hist->GetRMS();
|
41 |
|
|
|
42 |
|
|
Double_t total=0.;
|
43 |
|
|
for(Int_t i=0; i<nb+2; i++) {
|
44 |
|
|
total+=hist->GetBinContent(i);
|
45 |
|
|
}
|
46 |
|
|
// if(total < 100.) {
|
47 |
|
|
if(total < 50.) {
|
48 |
|
|
cout << "effsigma: Too few entries " << total << endl;
|
49 |
|
|
return ;
|
50 |
|
|
}
|
51 |
|
|
Int_t ierr=0;
|
52 |
|
|
Int_t ismin=999;
|
53 |
|
|
|
54 |
|
|
Double_t rlim=0.683*total;
|
55 |
|
|
Int_t nrms=int(rms/(bwid)); // Set scan size to +/- rms
|
56 |
|
|
if(nrms > nb/10) nrms=nb/10; // Could be tuned...
|
57 |
|
|
|
58 |
|
|
Double_t widmin=9999999.;
|
59 |
|
|
|
60 |
|
|
// cout<<"iscan: "<< xmin <<" "<< xmax <<" "<< ave <<" "<< rms <<" "<< rlim <<" "<< nrms <<endl;
|
61 |
|
|
|
62 |
|
|
int binlow = 1;
|
63 |
|
|
int binhigh = nb;
|
64 |
|
|
|
65 |
|
|
double mean_min = ave;
|
66 |
|
|
|
67 |
|
|
int binlow2 = 1;
|
68 |
|
|
int binhigh2 = nb;
|
69 |
|
|
|
70 |
|
|
|
71 |
|
|
|
72 |
|
|
for(Int_t iscan=-nrms;iscan<nrms+1;iscan++) { // Scan window centre
|
73 |
|
|
Int_t ibm=(ave-xmin)/bwid+1+iscan;
|
74 |
|
|
Double_t x=(ibm-0.5)*bwid+xmin;
|
75 |
|
|
Double_t xj=x;
|
76 |
|
|
Double_t xk=x;
|
77 |
|
|
Int_t jbm=ibm;
|
78 |
|
|
Int_t kbm=ibm;
|
79 |
|
|
Double_t bin=hist->GetBinContent(ibm);
|
80 |
|
|
total=bin;
|
81 |
|
|
|
82 |
|
|
// cout<<"ibm: "<< iscan <<" "<< ibm <<" "<< xj<<" "<< xk <<" "<<jbm <<" "<<kbm <<endl;
|
83 |
|
|
|
84 |
|
|
double mean = bin * x;
|
85 |
|
|
|
86 |
|
|
|
87 |
|
|
for(Int_t j=1;j<nb;j++){
|
88 |
|
|
if(jbm < nb) {
|
89 |
|
|
jbm++;
|
90 |
|
|
xj+=bwid;
|
91 |
|
|
bin=hist->GetBinContent(jbm);
|
92 |
|
|
total+=bin;
|
93 |
|
|
|
94 |
|
|
if(total > rlim) break;
|
95 |
|
|
}
|
96 |
|
|
else ierr=1;
|
97 |
|
|
if(kbm > 0) {
|
98 |
|
|
kbm--;
|
99 |
|
|
xk-=bwid;
|
100 |
|
|
bin=hist->GetBinContent(kbm);
|
101 |
|
|
total+=bin;
|
102 |
|
|
|
103 |
|
|
if(total > rlim) break;
|
104 |
|
|
}
|
105 |
|
|
else ierr=1;
|
106 |
|
|
}
|
107 |
|
|
Double_t dxf=(total-rlim)*bwid/bin;
|
108 |
|
|
Double_t wid=(xj-xk+bwid-dxf)*0.5;
|
109 |
|
|
|
110 |
|
|
|
111 |
|
|
//cout<<"dxf: "<< total <<" "<< rlim <<" "<< bwid <<" "<< bin <<" "<< wid <<" "<< xj<<" "<<xk<<" "<< dxf <<endl;
|
112 |
|
|
|
113 |
|
|
if(wid < widmin) {
|
114 |
|
|
widmin=wid;
|
115 |
|
|
ismin=iscan;
|
116 |
|
|
|
117 |
|
|
binlow = kbm;
|
118 |
|
|
binhigh = jbm;
|
119 |
|
|
|
120 |
|
|
|
121 |
|
|
binlow2 = ibm - 2*(ibm - kbm);
|
122 |
|
|
binhigh2 = ibm + 2*(-ibm + jbm);
|
123 |
|
|
|
124 |
|
|
}
|
125 |
|
|
|
126 |
|
|
// cout<<"widmin: "<< wid<<" "<< widmin <<" "<< ismin <<" "<<ibm <<" "<< jbm<<" "<< kbm <<" "<<x <<" "<< xj <<" "<< xk <<" "<<(ibm-0.5)*bwid+xmin<<" "<<
|
127 |
|
|
//" "<< (jbm-0.5)*bwid+xmin <<" "<<(kbm-0.5)*bwid+xmin <<endl;
|
128 |
|
|
|
129 |
|
|
}
|
130 |
|
|
if(ismin == nrms || ismin == -nrms) ierr=3;
|
131 |
|
|
if(ierr != 0) cout << "effsigma: Error of type " << ierr << endl;
|
132 |
|
|
|
133 |
|
|
//return widmin;
|
134 |
|
|
|
135 |
|
|
double mean = 0;
|
136 |
|
|
double n =0;
|
137 |
|
|
for(int b = binlow ; b<= binhigh; b++){
|
138 |
|
|
|
139 |
|
|
if( b<1 || b> nb) continue;
|
140 |
|
|
|
141 |
|
|
double x= (b-0.5)*bwid+xmin;
|
142 |
|
|
mean += hist->GetBinContent(b) * x;
|
143 |
|
|
n += hist->GetBinContent(b);
|
144 |
|
|
}
|
145 |
|
|
|
146 |
|
|
mean /= n;
|
147 |
|
|
|
148 |
|
|
double mean2 = 0;
|
149 |
|
|
double n2 =0;
|
150 |
|
|
for(int b = binlow2 ; b<= binhigh2; b++){
|
151 |
|
|
|
152 |
|
|
if( b<1 || b> nb) continue;
|
153 |
|
|
|
154 |
|
|
double x= (b-0.5)*bwid+xmin;
|
155 |
|
|
mean2 += hist->GetBinContent(b) * x;
|
156 |
|
|
n2 += hist->GetBinContent(b);
|
157 |
|
|
}
|
158 |
|
|
|
159 |
|
|
mean2 /= n2;
|
160 |
|
|
|
161 |
|
|
|
162 |
|
|
//cout<<widmin <<" "<<mean <<endl;
|
163 |
|
|
|
164 |
|
|
res[0] = mean;
|
165 |
|
|
res[1] = mean2;
|
166 |
|
|
|
167 |
|
|
res[2] = widmin;
|
168 |
|
|
|
169 |
|
|
|
170 |
|
|
}
|