]> git.uio.no Git - u/mrichter/AliRoot.git/blame - STEER/AliSignalProcesor.cxx
New versions of GDC and CDH raw data headers. Some CDH getters are added
[u/mrichter/AliRoot.git] / STEER / AliSignalProcesor.cxx
CommitLineData
ec143d80 1#include "TF1.h"
2#include "AliSignalProcesor.h"
3
4
5ClassImp(AliSignalProcesor)
6
7
8Double_t asymgauss(Double_t* x, Double_t* par)
9{
10 // par[0] = normalization
11 // par[1] = mean
12 // par[2] = sigma
13 // norm0 = 1
14 // par[3] = lambda0
15 // par[4] = norm1
16 // par[5] = lambda1
17 //
18
19 Double_t par1save = par[1];
20 Double_t par2save = par[2];
21 Double_t par3save = par[3];
22 Double_t par5save = par[5];
23 Double_t dx = x[0]-par1save;
24 //
25 //
26 Double_t sigma2 = par2save*par2save;
27 Double_t sqrt2 = TMath::Sqrt(2.);
28 if (-par3save*(dx-0.5*par3save*sigma2)>100) return 0; // avoid overflow
29 if (-par5save*(dx-0.5*par5save*sigma2)>100) return 0; // avoid overflow
30 if (TMath::Abs(par[4])>1) return 0;
31 Double_t exp1 = par3save*TMath::Exp(-par3save*(dx-0.5*par3save*sigma2))
32 *(1-TMath::Erf((par3save*sigma2-dx)/(sqrt2*par2save)));
33
34 Double_t exp2 = par5save*TMath::Exp(-par5save*(dx-0.5*par5save*sigma2))
35 *(1-TMath::Erf((par5save*sigma2-dx)/(sqrt2*par2save)));
36
37
38 return par[0]*(exp1+par[4]*exp2);
39}
40
41Double_t asymgaussN(Double_t* x, Double_t* par)
42{
43 // par[0] = normalization
44 // par[1] = mean
45 // par[2] = sigma
46 // norm0 = 1
47 // par[3] = lambda0
48 // par[4] = norm1
49 // par[5] = lambda1
50 //
51
52 Double_t par1save = par[1];
53 Double_t par2save = par[2];
54 Double_t par3save = par[3];
55 Double_t par5save = par[5];
56 Double_t dx = x[0]-par1save;
57 //
58 //
59 Double_t sigma2 = par2save*par2save;
60 Double_t sqrt2 = TMath::Sqrt(2.);
61 if (-par3save*(dx-0.5*par3save*sigma2)>100) return 0; // avoid overflow
62 if (-par5save*(dx-0.5*par5save*sigma2)>100) return 0; // avoid overflow
63 if (TMath::Abs(par[4])>=1) return 0;
64
65 Double_t exp1 = par3save*TMath::Exp(-par3save*(dx-0.5*par3save*sigma2))
66 *0.5*(1-TMath::Erf((par3save*sigma2-dx)/(sqrt2*par2save)));
67
68 Double_t exp2 = par5save*TMath::Exp(-par5save*(dx-0.5*par5save*sigma2))
69 *0.5*(1-TMath::Erf((par5save*sigma2-dx)/(sqrt2*par2save)));
70
71
72 return par[0]*(1.*exp1+par[4]*exp2)/(1.+par[4]);
73}
74
75
76TF1 * AliSignalProcesor::GetAsymGauss()
77{
78 TF1 * f1 = new TF1("asymg",asymgaussN,-10,40,6);
79 return f1;
80}
81
82
83
84void AliSignalProcesor::SplineSmoother(Double_t *ampin, Double_t *ampout, Int_t n)
85{
86 //
87 //
88 Float_t in[10000];
89 Float_t out[10000];
90 in[0] = ampin[0];
91 in[1] = (ampin[0]+ampin[1])*0.5;
92 in[2*(n-1)] = ampin[n-1];
93 in[2*(n-1)+1] = ampin[n-1];
94 //
95 // add charge to the end
96 for (Int_t i=0;i<10;i++){
97 in[2*(n-1)+i]=ampin[n-1];
98 }
99
100 //
101 for (Int_t i=1;i<n-1;i++){
102 in[2*i] = ampin[i];
103 in[2*i+1] = (9.*(ampin[i]+ampin[i+1])-(ampin[i-1]+ampin[i+2]))/16.;
104 }
105 //
106 out[0] = in[0];
107 for (Int_t i=1;i<=2*n;i++){
108 out[i] = (9.*(in[i]+in[i+1])-(in[i-1]+in[i+2]))/16.;
109 }
110 //
111 //
112 for (int i=0;i<n;i++){
113 ampout[i] = out[2*i+1];
114 }
115}
116
117
118
119
120void AliSignalProcesor::TailCancelationALTRO(Double_t *ampin, Double_t *ampout, Float_t K, Float_t L,
121 Int_t n)
122{
123 //
124 // ALTRO
125 Float_t temp;
126 ampout[0] = ampin[0];
127 temp = ampin[0];
128 for (int i=1;i<n;i++){
129 ampout[i] = ampin[i] + (K-L)*temp;
130 temp = ampin[i] + K*temp;
131 }
132}
133
134//
135//
136void AliSignalProcesor::TailCancelationTRD(Double_t *ampin, Double_t *ampout, Float_t r, Float_t c,
137 Int_t n)
138{
139 //TRD
140 //
141 Double_t reminder=0;
142 //
143 for (Int_t i=0; i<n; i++){
144 ampout[i] = ampin[i]-reminder;
145 //
146 reminder = r*(reminder+c*ampout[i]);
147 }
148
149}
150
151void AliSignalProcesor::TailMaker(Double_t *ampin, Double_t *ampout, Float_t lambda,
152 Int_t n)
153{
154
155 Double_t l = TMath::Exp(-lambda);
156 //
157 Float_t temp=0;
158 for (Int_t i=n-1; i>0; i--){
159 ampout[i] = ampin[i]+temp;
160 //
161 temp = l*(temp+ampin[i]);
162 }
163}
164
165void AliSignalProcesor::TailCancelationALTRO1(Double_t *ampin, Double_t *ampout, Float_t norm,
166 Float_t lambda, Int_t n)
167{
168
169 Double_t l = TMath::Exp(-lambda);
170 Double_t k = l*(1.-norm*lambda);
171
172 return TailCancelationALTRO(ampin,ampout,k,l,n);
173}
174
175
176void AliSignalProcesor::TailCancelationTRD1(Double_t *ampin, Double_t *ampout, Float_t norm,
177 Float_t lambda, Int_t n)
178{
179 //
180 //
181 Double_t r = TMath::Exp(-lambda);
182 Double_t c = norm*lambda;
183 return TailCancelationTRD(ampin,ampout,r,c,n);
184}
185
186
187
188
189void AliSignalProcesor::TailCancelationMI(Double_t *ampin, Double_t *ampout, Float_t norm,
190 Float_t lambda, Int_t n)
191{
192
193 Double_t L = TMath::Exp(-lambda*0.5);
194 Double_t K = L*(1.-norm*lambda*0.5);
195 //
196 //
197 Float_t in[10000];
198 Float_t out[10000];
199 for (Int_t i=0;i<n*2+20;i++){
200 in[i] = 0;
201 out[i]= 0;
202 }
203 in[0] = ampin[0];
204 in[1] = (ampin[0]+ampin[1])*0.5;
205 in[2*(n-1)] = ampin[n-1];
206 in[2*(n-1)+1] = ampin[n-1];
207 //
208 for (Int_t i=1;i<n-2;i++){
209 in[2*i] = ampin[i];
210 in[2*i+1] = (9.*(ampin[i]+ampin[i+1])-(ampin[i-1]+ampin[i+2]))/16;
211 }
212 //
213 Float_t temp;
214 out[0] = in[0];
215 temp = in[0];
216 for (int i=1;i<=2*n;i++){
217 out[i] = in[i] + (K-L)*temp;
218 temp = in[i] + K*temp;
219 }
220 //
221 //
222 for (int i=0;i<n;i++){
223 ampout[i] = out[2*i+1];
224 }
225}
226
227
228
229
230
231void AliSignalProcesor::TailMakerSpline(Double_t *ampin, Double_t *ampout, Float_t lambda,
232 Int_t n)
233{
234
235 Double_t l = TMath::Exp(-lambda*0.5);
236 //
237 //
238 Float_t in[10000];
239 Float_t out[10000];
240 for (Int_t i=0;i<n*2+20;i++){
241 in[i] = 0;
242 out[i]= 0;
243 }
244 in[0] = ampin[0];
245 in[1] = (ampin[0]+ampin[1])*0.5;
246 in[2*(n-1)] = ampin[n-1];
247 in[2*(n-1)+1] = ampin[n-1];
248 //
249 // add charge to the end
250 for (Int_t i=0;i<10;i++){
251 in[2*(n-1)+i]=ampin[n-1];
252 }
253
254 //
255 for (Int_t i=1;i<n-2;i++){
256 in[2*i] = ampin[i];
257 in[2*i+1] = (9.*(ampin[i]+ampin[i+1])-(ampin[i-1]+ampin[i+2]))/16;
258 }
259 //
260 //
261 Float_t temp;
262 out[2*n] = in[2*n];
263 temp = 0;
264 for (int i=2*n;i>=0;i--){
265 out[i] = in[i] + temp;
266 temp = l*(temp+in[i]);
267 }
268 //
269 //
270 for (int i=0;i<n;i++){
271 ampout[i] = out[2*i+1];
272 }
273}