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
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 yangyong 1.2 //******************************************//
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     }