]>
Commit | Line | Data |
---|---|---|
b0f5e3fc | 1 | ////////////////////////////////////////////////////////////////////////// |
2 | // Alice ITS class to help keep statistical information // | |
3 | // // | |
4 | // version: 0.0.0 Draft. // | |
5 | // Date: April 18 1999 // | |
6 | // By: Bjorn S. Nilsen // | |
7 | // // | |
8 | ////////////////////////////////////////////////////////////////////////// | |
9 | #include <stdio.h> | |
10 | #include <math.h> | |
11 | #include <TMath.h> | |
12 | ||
13 | #include "AliITSstatistics.h" | |
14 | ||
15 | ClassImp(AliITSstatistics) | |
16 | ||
17 | // | |
7537d03c | 18 | AliITSstatistics::AliITSstatistics() : TObject(), |
19 | fN(0), | |
20 | fOrder(0), | |
21 | fX(0), | |
22 | fW(0){ | |
b0f5e3fc | 23 | // |
24 | // default contructor | |
25 | // | |
b0f5e3fc | 26 | } |
27 | ||
28 | ||
7537d03c | 29 | AliITSstatistics::AliITSstatistics(Int_t order) : TObject(), |
30 | fN(0), | |
31 | fOrder(order), | |
32 | fX(0), | |
33 | fW(0){ | |
b0f5e3fc | 34 | // |
35 | // contructor to a specific order in the moments | |
36 | // | |
07025d6d | 37 | fX = new Double_t[order]; |
38 | fW = new Double_t[order]; | |
39 | for(Int_t i=0;i<order;i++) {fX[i] = 0.0; fW[i] = 0.0;} | |
b0f5e3fc | 40 | return; |
41 | } | |
42 | ||
43 | AliITSstatistics::~AliITSstatistics(){ | |
44 | // | |
45 | // default destructor | |
46 | // | |
07025d6d | 47 | if(fX!=0) delete[] fX; |
48 | if(fW!=0) delete[] fW; | |
49 | fX = 0; | |
50 | fW = 0; | |
b0f5e3fc | 51 | fN = 0; |
52 | fOrder = 0; | |
53 | } | |
54 | //_______________________________________________________________ | |
7537d03c | 55 | AliITSstatistics& AliITSstatistics::operator=(const AliITSstatistics &source){ |
b0f5e3fc | 56 | // operator = |
57 | ||
b0f5e3fc | 58 | if(this==&source) return *this; |
e8189707 | 59 | if(source.fOrder!=0){ |
60 | this->fOrder = source.fOrder; | |
61 | this->fN = source.fN; | |
07025d6d | 62 | this->fX = new Double_t[this->fOrder]; |
63 | this->fW = new Double_t[this->fOrder]; | |
e8189707 | 64 | for(Int_t i=0;i<source.fOrder;i++){ |
07025d6d | 65 | this->fX[i] = source.fX[i]; |
66 | this->fW[i] = source.fW[i]; | |
e8189707 | 67 | } // end for i |
68 | }else{ | |
07025d6d | 69 | this->fX = 0; |
70 | this->fW = 0; | |
e8189707 | 71 | this->fN = 0; |
72 | this->fOrder = 0; | |
73 | }// end if source.fOrder!=0 | |
74 | return *this; | |
b0f5e3fc | 75 | } |
76 | //_______________________________________________________________ | |
7537d03c | 77 | AliITSstatistics::AliITSstatistics(const AliITSstatistics &source) : TObject(source), |
78 | fN(0), | |
79 | fOrder(0), | |
80 | fX(0), | |
81 | fW(0){ | |
b0f5e3fc | 82 | // Copy constructor |
83 | ||
e8189707 | 84 | if(this==&source) return; |
85 | if(source.fOrder!=0){ | |
86 | this->fOrder = source.fOrder; | |
87 | this->fN = source.fN; | |
07025d6d | 88 | this->fX = new Double_t[this->fOrder]; |
89 | this->fW = new Double_t[this->fOrder]; | |
e8189707 | 90 | for(Int_t i=0;i<source.fOrder;i++){ |
07025d6d | 91 | this->fX[i] = source.fX[i]; |
92 | this->fW[i] = source.fW[i]; | |
e8189707 | 93 | } // end for i |
94 | }else{ | |
07025d6d | 95 | this->fX = 0; |
96 | this->fW = 0; | |
e8189707 | 97 | this->fN = 0; |
98 | this->fOrder = 0; | |
99 | }// end if source.fOrder!=0 | |
b0f5e3fc | 100 | } |
101 | //_______________________________________________________________ | |
102 | void AliITSstatistics::Reset(){ | |
103 | // | |
104 | // reset all values to zero | |
105 | // | |
07025d6d | 106 | for(Int_t i=0;i<fOrder;i++) {fX[i] = 0.0; fW[i] = 0.0;} |
b0f5e3fc | 107 | fN = 0; |
108 | return; | |
109 | } | |
110 | ||
e8189707 | 111 | //_______________________________________________________________ |
112 | void AliITSstatistics::AddValue(Double_t x,Double_t w){ | |
b0f5e3fc | 113 | // |
114 | // accumulate element x with weight w. | |
115 | // | |
e8189707 | 116 | |
117 | //it was AddValue(Double_t x,Double_t w=1.0); | |
118 | ||
b0f5e3fc | 119 | Double_t y=1.0,z=1.0; |
e8189707 | 120 | |
b0f5e3fc | 121 | Int_t i; |
e8189707 | 122 | const Double_t kBig=1.0e+38; |
b0f5e3fc | 123 | |
e8189707 | 124 | if(y>kBig || x>kBig || w>kBig) return; |
b0f5e3fc | 125 | |
b0f5e3fc | 126 | fN++; |
127 | for(i=0;i<fOrder;i++){ | |
128 | y *= x; | |
129 | z *= w; | |
07025d6d | 130 | fX[i] += y*w; |
131 | fW[i] += z; | |
b0f5e3fc | 132 | } // end for i |
133 | } | |
134 | ||
135 | Double_t AliITSstatistics::GetNth(Int_t order){ | |
136 | // This give the unbiased estimator for the RMS. | |
137 | Double_t s; | |
138 | ||
07025d6d | 139 | if(fW[0]!=0.0&&order<=fOrder) s = fX[order-1]/fW[0]; |
b0f5e3fc | 140 | else { |
141 | s = 0.0; | |
07025d6d | 142 | printf("AliITSstatistics: error in GetNth: fOrder=%d fN=%d fW[0]=%f\n", |
143 | fOrder,fN,fW[0]); | |
b0f5e3fc | 144 | } // end else |
145 | return s; | |
146 | } | |
147 | ||
148 | Double_t AliITSstatistics::GetRMS(){ | |
149 | // This give the unbiased estimator for the RMS. | |
150 | Double_t x,x2,w,ww,s; | |
151 | ||
152 | x = GetMean(); // first order | |
153 | x2 = GetNth(2); // second order | |
07025d6d | 154 | w = fW[0]; // first order - 1. |
155 | ww = fW[1]; // second order - 1. | |
b0f5e3fc | 156 | |
157 | if(w*w==ww) return (-1.0); | |
158 | s = (x2-x*x)*w*w/(w*w-ww); | |
159 | return TMath::Sqrt(s); | |
160 | } | |
161 | ||
162 | Double_t AliITSstatistics::GetErrorMean(){ | |
163 | //This is the error in the mean or the square root of the variance of the mean. | |
164 | Double_t rms,w,ww,s; | |
165 | ||
166 | rms = GetRMS(); | |
07025d6d | 167 | w = fW[0]; |
168 | ww = fW[1]; | |
b0f5e3fc | 169 | s = rms*rms*ww/(w*w); |
170 | return TMath::Sqrt(s); | |
171 | } | |
172 | ||
173 | ||
174 | Double_t AliITSstatistics::GetErrorRMS(){ | |
175 | //This is the error in the mean or the square root of the variance of the mean. | |
176 | // at this moment this routine is only defined for weights=1. | |
177 | Double_t x,x2,x3,x4,w,ww,m2,m4,n,s; | |
178 | ||
07025d6d | 179 | if(fW[0]!=(Double_t)fN||GetN()<4) return (-1.); |
b0f5e3fc | 180 | x = GetMean(); // first order |
181 | x2 = GetNth(2); // second order | |
07025d6d | 182 | w = fW[0]; // first order - 1. |
183 | ww = fW[1]; // second order - 1. | |
b0f5e3fc | 184 | if(w*w==ww) return (-1.0); |
185 | s = (x2-x*x)*w*w/(w*w-ww); | |
186 | ||
187 | m2 = s; | |
188 | n = (Double_t) GetN(); | |
189 | x3 = GetNth(3); | |
190 | x4 = GetNth(4); | |
191 | // This equation assumes that all of the weights are equal to 1. | |
192 | m4 = (n/(n-1.))*(x4-3.*x*x3+6.*x*x*x2-2.*x*x*x*x); | |
193 | s = (m4-(n-3.)*m2*m2/(n-1.))/n; | |
194 | return TMath::Sqrt(s); | |
195 | } |