ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/yangyong/combineICEE/effSigma.C
Revision: 1.1
Committed: Tue Apr 10 20:03:11 2012 UTC (13 years, 1 month ago) by yangyong
Content type: text/plain
Branch: MAIN
CVS Tags: V2012comb, pi0etaee_laser20111122_eefloatalpha, HEAD
Log Message:
LaserTag:
EcalLaserAPDPNRatios_data_20111122_158851_180363
and alpha Tag ( for Endcap Only)
EcalLaserAlphas_lto420-620_progr_data_20111122

File Contents

# User Rev Content
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     }