2 #include "AliSignalProcesor.h"
5 ClassImp(AliSignalProcesor)
8 Double_t asymgauss(Double_t* x, Double_t* par)
10 // par[0] = normalization
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;
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)));
34 Double_t exp2 = par5save*TMath::Exp(-par5save*(dx-0.5*par5save*sigma2))
35 *(1-TMath::Erf((par5save*sigma2-dx)/(sqrt2*par2save)));
38 return par[0]*(exp1+par[4]*exp2);
41 Double_t asymgaussN(Double_t* x, Double_t* par)
43 // par[0] = normalization
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;
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;
65 Double_t exp1 = par3save*TMath::Exp(-par3save*(dx-0.5*par3save*sigma2))
66 *0.5*(1-TMath::Erf((par3save*sigma2-dx)/(sqrt2*par2save)));
68 Double_t exp2 = par5save*TMath::Exp(-par5save*(dx-0.5*par5save*sigma2))
69 *0.5*(1-TMath::Erf((par5save*sigma2-dx)/(sqrt2*par2save)));
72 return par[0]*(1.*exp1+par[4]*exp2)/(1.+par[4]);
76 TF1 * AliSignalProcesor::GetAsymGauss()
78 TF1 * f1 = new TF1("asymg",asymgaussN,-10,40,6);
84 void AliSignalProcesor::SplineSmoother(Double_t *ampin, Double_t *ampout, Int_t n)
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];
95 // add charge to the end
96 for (Int_t i=0;i<10;i++){
97 in[2*(n-1)+i]=ampin[n-1];
101 for (Int_t i=1;i<n-1;i++){
103 in[2*i+1] = (9.*(ampin[i]+ampin[i+1])-(ampin[i-1]+ampin[i+2]))/16.;
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.;
112 for (int i=0;i<n;i++){
113 ampout[i] = out[2*i+1];
120 void AliSignalProcesor::TailCancelationALTRO(Double_t *ampin, Double_t *ampout, Float_t K, Float_t L,
126 ampout[0] = ampin[0];
128 for (int i=1;i<n;i++){
129 ampout[i] = ampin[i] + (K-L)*temp;
130 temp = ampin[i] + K*temp;
136 void AliSignalProcesor::TailCancelationTRD(Double_t *ampin, Double_t *ampout, Float_t r, Float_t c,
143 for (Int_t i=0; i<n; i++){
144 ampout[i] = ampin[i]-reminder;
146 reminder = r*(reminder+c*ampout[i]);
151 void AliSignalProcesor::TailMaker(Double_t *ampin, Double_t *ampout, Float_t lambda,
155 Double_t l = TMath::Exp(-lambda);
158 for (Int_t i=n-1; i>0; i--){
159 ampout[i] = ampin[i]+temp;
161 temp = l*(temp+ampin[i]);
165 void AliSignalProcesor::TailCancelationALTRO1(Double_t *ampin, Double_t *ampout, Float_t norm,
166 Float_t lambda, Int_t n)
169 Double_t l = TMath::Exp(-lambda);
170 Double_t k = l*(1.-norm*lambda);
172 return TailCancelationALTRO(ampin,ampout,k,l,n);
176 void AliSignalProcesor::TailCancelationTRD1(Double_t *ampin, Double_t *ampout, Float_t norm,
177 Float_t lambda, Int_t n)
181 Double_t r = TMath::Exp(-lambda);
182 Double_t c = norm*lambda;
183 return TailCancelationTRD(ampin,ampout,r,c,n);
189 void AliSignalProcesor::TailCancelationMI(Double_t *ampin, Double_t *ampout, Float_t norm,
190 Float_t lambda, Int_t n)
193 Double_t L = TMath::Exp(-lambda*0.5);
194 Double_t K = L*(1.-norm*lambda*0.5);
199 for (Int_t i=0;i<n*2+20;i++){
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];
208 for (Int_t i=1;i<n-2;i++){
210 in[2*i+1] = (9.*(ampin[i]+ampin[i+1])-(ampin[i-1]+ampin[i+2]))/16;
216 for (int i=1;i<=2*n;i++){
217 out[i] = in[i] + (K-L)*temp;
218 temp = in[i] + K*temp;
222 for (int i=0;i<n;i++){
223 ampout[i] = out[2*i+1];
231 void AliSignalProcesor::TailMakerSpline(Double_t *ampin, Double_t *ampout, Float_t lambda,
235 Double_t l = TMath::Exp(-lambda*0.5);
240 for (Int_t i=0;i<n*2+20;i++){
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];
249 // add charge to the end
250 for (Int_t i=0;i<10;i++){
251 in[2*(n-1)+i]=ampin[n-1];
255 for (Int_t i=1;i<n-2;i++){
257 in[2*i+1] = (9.*(ampin[i]+ampin[i+1])-(ampin[i-1]+ampin[i+2]))/16;
264 for (int i=2*n;i>=0;i--){
265 out[i] = in[i] + temp;
266 temp = l*(temp+in[i]);
270 for (int i=0;i<n;i++){
271 ampout[i] = out[2*i+1];