ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/yangyong/combineICEB/effSigma.C
Revision: 1.3
Committed: Mon Aug 27 21:37:39 2012 UTC (12 years, 8 months ago) by yangyong
Content type: text/plain
Branch: MAIN
CVS Tags: V2012combv2c, HEAD
Changes since 1.2: +0 -2 lines
Error occurred while calculating annotation data.
Log Message:
*** empty log message ***

File Contents

# Content
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 xmin = xaxis->GetXmin();
38 Double_t ave = hist->GetMean();
39 Double_t rms = hist->GetRMS();
40
41 Double_t total=0.;
42 for(Int_t i=0; i<nb+2; i++) {
43 total+=hist->GetBinContent(i);
44 }
45 // if(total < 100.) {
46 if(total < 50.) {
47 cout << "effsigma: Too few entries " << total << endl;
48 return ;
49 }
50 Int_t ierr=0;
51 Int_t ismin=999;
52
53 Double_t rlim=0.683*total;
54 Int_t nrms=int(rms/(bwid)); // Set scan size to +/- rms
55 if(nrms > nb/10) nrms=nb/10; // Could be tuned...
56
57 Double_t widmin=9999999.;
58
59 // cout<<"iscan: "<< xmin <<" "<< xmax <<" "<< ave <<" "<< rms <<" "<< rlim <<" "<< nrms <<endl;
60
61 int binlow = 1;
62 int binhigh = nb;
63
64
65 int binlow2 = 1;
66 int binhigh2 = nb;
67
68
69
70 for(Int_t iscan=-nrms;iscan<nrms+1;iscan++) { // Scan window centre
71 Int_t ibm=(ave-xmin)/bwid+1+iscan;
72 Double_t x=(ibm-0.5)*bwid+xmin;
73 Double_t xj=x;
74 Double_t xk=x;
75 Int_t jbm=ibm;
76 Int_t kbm=ibm;
77 Double_t bin=hist->GetBinContent(ibm);
78 total=bin;
79
80 // cout<<"ibm: "<< iscan <<" "<< ibm <<" "<< xj<<" "<< xk <<" "<<jbm <<" "<<kbm <<endl;
81
82 double mean = bin * x;
83
84
85 for(Int_t j=1;j<nb;j++){
86 if(jbm < nb) {
87 jbm++;
88 xj+=bwid;
89 bin=hist->GetBinContent(jbm);
90 total+=bin;
91
92 if(total > rlim) break;
93 }
94 else ierr=1;
95 if(kbm > 0) {
96 kbm--;
97 xk-=bwid;
98 bin=hist->GetBinContent(kbm);
99 total+=bin;
100
101 if(total > rlim) break;
102 }
103 else ierr=1;
104 }
105 Double_t dxf=(total-rlim)*bwid/bin;
106 Double_t wid=(xj-xk+bwid-dxf)*0.5;
107
108
109 //cout<<"dxf: "<< total <<" "<< rlim <<" "<< bwid <<" "<< bin <<" "<< wid <<" "<< xj<<" "<<xk<<" "<< dxf <<endl;
110
111 if(wid < widmin) {
112 widmin=wid;
113 ismin=iscan;
114
115 binlow = kbm;
116 binhigh = jbm;
117
118
119 binlow2 = ibm - 2*(ibm - kbm);
120 binhigh2 = ibm + 2*(-ibm + jbm);
121
122 }
123
124 // cout<<"widmin: "<< wid<<" "<< widmin <<" "<< ismin <<" "<<ibm <<" "<< jbm<<" "<< kbm <<" "<<x <<" "<< xj <<" "<< xk <<" "<<(ibm-0.5)*bwid+xmin<<" "<<
125 //" "<< (jbm-0.5)*bwid+xmin <<" "<<(kbm-0.5)*bwid+xmin <<endl;
126
127 }
128 if(ismin == nrms || ismin == -nrms) ierr=3;
129 if(ierr != 0) cout << "effsigma: Error of type " << ierr << endl;
130
131 //return widmin;
132
133 double mean = 0;
134 double n =0;
135 for(int b = binlow ; b<= binhigh; b++){
136
137 if( b<1 || b> nb) continue;
138
139 double x= (b-0.5)*bwid+xmin;
140 mean += hist->GetBinContent(b) * x;
141 n += hist->GetBinContent(b);
142 }
143
144 mean /= n;
145
146 double mean2 = 0;
147 double n2 =0;
148 for(int b = binlow2 ; b<= binhigh2; b++){
149
150 if( b<1 || b> nb) continue;
151
152 double x= (b-0.5)*bwid+xmin;
153 mean2 += hist->GetBinContent(b) * x;
154 n2 += hist->GetBinContent(b);
155 }
156
157 mean2 /= n2;
158
159
160 //cout<<widmin <<" "<<mean <<endl;
161
162 res[0] = mean;
163 res[1] = mean2;
164
165 res[2] = widmin;
166
167
168 }