ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

/* $Id$ */

#include <TF1.h>
#include <TMath.h>

#include "AliSignalProcesor.h"
#include "AliMathBase.h"


ClassImp(AliSignalProcesor)


Double_t asymgauss(Double_t* x, Double_t* par)
{
  // par[0] = normalization
  // par[1] = mean
  // par[2] = sigma
  // norm0  = 1
  // par[3] = lambda0
  // par[4] = norm1
  // par[5] = lambda1
  //
  
  Double_t par1save = par[1];    
  Double_t par2save = par[2];
  Double_t par3save = par[3];
  Double_t par5save = par[5];
  Double_t dx   = x[0]-par1save;
  //
  //
  Double_t  sigma2  = par2save*par2save;
  Double_t  sqrt2   = TMath::Sqrt(2.);
  if (-par3save*(dx-0.5*par3save*sigma2)>100) return 0;   // avoid overflow
  if (-par5save*(dx-0.5*par5save*sigma2)>100) return 0;   // avoid overflow 
  if (TMath::Abs(par[4])>1) return 0;
  Double_t  exp1    = par3save*TMath::Exp(-par3save*(dx-0.5*par3save*sigma2))
    *(1-AliMathBase::ErfFast((par3save*sigma2-dx)/(sqrt2*par2save)));

  Double_t  exp2    = par5save*TMath::Exp(-par5save*(dx-0.5*par5save*sigma2))
    *(1-AliMathBase::ErfFast((par5save*sigma2-dx)/(sqrt2*par2save)));


  return par[0]*(exp1+par[4]*exp2);
}

Double_t asymgaussN(Double_t* x, Double_t* par)
{
  // par[0] = normalization
  // par[1] = mean
  // par[2] = sigma
  // norm0  = 1
  // par[3] = lambda0
  // par[4] = norm1
  // par[5] = lambda1
  //
  
  Double_t par1save = par[1];    
  Double_t par2save = par[2];
  Double_t par3save = par[3];
  Double_t par5save = par[5];
  Double_t dx   = x[0]-par1save;
  //
  //
  Double_t  sigma2  = par2save*par2save;
  Double_t  sqrt2   = TMath::Sqrt(2.);
  if (-par3save*(dx-0.5*par3save*sigma2)>100) return 0;   // avoid overflow
  if (-par5save*(dx-0.5*par5save*sigma2)>100) return 0;   // avoid overflow 
  if (TMath::Abs(par[4])>=1) return 0;
  
  Double_t  exp1    = par3save*TMath::Exp(-par3save*(dx-0.5*par3save*sigma2))
    *0.5*(1-AliMathBase::ErfFast((par3save*sigma2-dx)/(sqrt2*par2save)));

  Double_t  exp2    = par5save*TMath::Exp(-par5save*(dx-0.5*par5save*sigma2))
    *0.5*(1-AliMathBase::ErfFast((par5save*sigma2-dx)/(sqrt2*par2save)));


  return par[0]*(1.*exp1+par[4]*exp2)/(1.+par[4]);
}


TF1 * AliSignalProcesor::GetAsymGauss()
{
  TF1 * f1 = new TF1("asymg",asymgaussN,-10,40,6);
  return f1;
}



void AliSignalProcesor::SplineSmoother(const Double_t *ampin, Double_t *ampout, Int_t n) const
{  
  //
  //
  Float_t in[10000];
  Float_t out[10000];
  in[0] = ampin[0];
  in[1] = (ampin[0]+ampin[1])*0.5;
  in[2*(n-1)]    = ampin[n-1];
  in[2*(n-1)+1]  = ampin[n-1];
  //
  // add charge to the end
  for (Int_t i=0;i<10;i++){
    in[2*(n-1)+i]=ampin[n-1];
  }

  //
  for (Int_t i=1;i<n-1;i++){
    in[2*i]    = ampin[i];
    in[2*i+1]  = (9.*(ampin[i]+ampin[i+1])-(ampin[i-1]+ampin[i+2]))/16.;    
  }
  //
  out[0] = in[0];
  for (Int_t i=1;i<=2*n;i++){
    out[i]  = (9.*(in[i]+in[i+1])-(in[i-1]+in[i+2]))/16.;    
  }
  //
  //
  for (int i=0;i<n;i++){
    ampout[i]      = out[2*i+1]; 
  }
}




void AliSignalProcesor::TailCancelationALTRO(const Double_t *ampin, Double_t *ampout, Float_t k, Float_t l, Int_t n) const
{
  //
  // ALTRO
  Float_t temp;
  ampout[0]  = ampin[0];
  temp = ampin[0];
  for (int i=1;i<n;i++){
    ampout[i]   = ampin[i]   + (k-l)*temp;
    temp        = ampin[i]   +  k*temp;
  }
}

//
//
void AliSignalProcesor::TailCancelationTRD(const Double_t *ampin, Double_t *ampout, Float_t r, Float_t c, 
		      Int_t n) const
{
  //TRD
  //
  Double_t reminder=0;
  //
  for (Int_t i=0; i<n; i++){
    ampout[i] = ampin[i]-reminder;
    //
    reminder  = r*(reminder+c*ampout[i]);
  }
  
}

void AliSignalProcesor::TailMaker(const Double_t *ampin, Double_t *ampout, Float_t lambda, 
		      Int_t n) const
{
  
  Double_t l = TMath::Exp(-lambda);
  //
  Float_t temp=0;
  for (Int_t i=n-1; i>0; i--){
    ampout[i] = ampin[i]+temp;
    //
    temp  = l*(temp+ampin[i]);
  }
}

void AliSignalProcesor::TailCancelationALTRO1(Double_t *ampin, Double_t *ampout, Float_t norm, 
					    Float_t lambda, Int_t n)
{
  
  Double_t l = TMath::Exp(-lambda);
  Double_t k = l*(1.-norm*lambda);

  return TailCancelationALTRO(ampin,ampout,k,l,n);
}


void AliSignalProcesor::TailCancelationTRD1(Double_t *ampin, Double_t *ampout, Float_t norm, 
					  Float_t lambda, Int_t n)
{
  //
  //
  Double_t r = TMath::Exp(-lambda);
  Double_t c = norm*lambda;
  return TailCancelationTRD(ampin,ampout,r,c,n);
}




void AliSignalProcesor::TailCancelationMI(const Double_t *ampin, Double_t *ampout, Float_t norm, 
					Float_t lambda, Int_t n) const
{
  
  Double_t l = TMath::Exp(-lambda*0.5);
  Double_t k = l*(1.-norm*lambda*0.5);
  //
  //
  Float_t in[10000];
  Float_t out[10000];
  for (Int_t i=0;i<n*2+20;i++){
    in[i] = 0;
    out[i]= 0;
  }
  in[0] = ampin[0];
  in[1] = (ampin[0]+ampin[1])*0.5;
  in[2*(n-1)]    = ampin[n-1];
  in[2*(n-1)+1]  = ampin[n-1];
  //
  for (Int_t i=1;i<n-2;i++){
    in[2*i]    = ampin[i];
    in[2*i+1]  = (9.*(ampin[i]+ampin[i+1])-(ampin[i-1]+ampin[i+2]))/16;    
  }
  //
  Float_t temp;
  out[0]     = in[0];
  temp       = in[0];
  for (int i=1;i<=2*n;i++){
    out[i]      = in[i]   + (k-l)*temp;
    temp        = in[i]   +  k*temp;
  }
  //
  //
  for (int i=0;i<n;i++){
    ampout[i]      = out[2*i+1];
  }
}





void AliSignalProcesor::TailMakerSpline(const Double_t *ampin, Double_t *ampout, Float_t lambda, 
		      Int_t n) const
{
  
  Double_t l = TMath::Exp(-lambda*0.5);
  //
  //
  Float_t in[10000];
  Float_t out[10000];
  for (Int_t i=0;i<n*2+20;i++){
    in[i] = 0;
    out[i]= 0;
  }
  in[0] = ampin[0];
  in[1] = (ampin[0]+ampin[1])*0.5;
  in[2*(n-1)]    = ampin[n-1];
  in[2*(n-1)+1]  = ampin[n-1];
  //
  // add charge to the end
  for (Int_t i=0;i<10;i++){
    in[2*(n-1)+i]=ampin[n-1];
  }

  //
  for (Int_t i=1;i<n-2;i++){
    in[2*i]    = ampin[i];
    in[2*i+1]  = (9.*(ampin[i]+ampin[i+1])-(ampin[i-1]+ampin[i+2]))/16;    
  }
  //
  //
  Float_t temp;
  out[2*n]     = in[2*n];
  temp         = 0;
  for (int i=2*n;i>=0;i--){
    out[i]      = in[i]   + temp;
    temp        = l*(temp+in[i]);
  }
  //
  //
  for (int i=0;i<n;i++){
    ampout[i]      = out[2*i+1]; 
  }
}
 AliSignalProcesor.cxx:1
 AliSignalProcesor.cxx:2
 AliSignalProcesor.cxx:3
 AliSignalProcesor.cxx:4
 AliSignalProcesor.cxx:5
 AliSignalProcesor.cxx:6
 AliSignalProcesor.cxx:7
 AliSignalProcesor.cxx:8
 AliSignalProcesor.cxx:9
 AliSignalProcesor.cxx:10
 AliSignalProcesor.cxx:11
 AliSignalProcesor.cxx:12
 AliSignalProcesor.cxx:13
 AliSignalProcesor.cxx:14
 AliSignalProcesor.cxx:15
 AliSignalProcesor.cxx:16
 AliSignalProcesor.cxx:17
 AliSignalProcesor.cxx:18
 AliSignalProcesor.cxx:19
 AliSignalProcesor.cxx:20
 AliSignalProcesor.cxx:21
 AliSignalProcesor.cxx:22
 AliSignalProcesor.cxx:23
 AliSignalProcesor.cxx:24
 AliSignalProcesor.cxx:25
 AliSignalProcesor.cxx:26
 AliSignalProcesor.cxx:27
 AliSignalProcesor.cxx:28
 AliSignalProcesor.cxx:29
 AliSignalProcesor.cxx:30
 AliSignalProcesor.cxx:31
 AliSignalProcesor.cxx:32
 AliSignalProcesor.cxx:33
 AliSignalProcesor.cxx:34
 AliSignalProcesor.cxx:35
 AliSignalProcesor.cxx:36
 AliSignalProcesor.cxx:37
 AliSignalProcesor.cxx:38
 AliSignalProcesor.cxx:39
 AliSignalProcesor.cxx:40
 AliSignalProcesor.cxx:41
 AliSignalProcesor.cxx:42
 AliSignalProcesor.cxx:43
 AliSignalProcesor.cxx:44
 AliSignalProcesor.cxx:45
 AliSignalProcesor.cxx:46
 AliSignalProcesor.cxx:47
 AliSignalProcesor.cxx:48
 AliSignalProcesor.cxx:49
 AliSignalProcesor.cxx:50
 AliSignalProcesor.cxx:51
 AliSignalProcesor.cxx:52
 AliSignalProcesor.cxx:53
 AliSignalProcesor.cxx:54
 AliSignalProcesor.cxx:55
 AliSignalProcesor.cxx:56
 AliSignalProcesor.cxx:57
 AliSignalProcesor.cxx:58
 AliSignalProcesor.cxx:59
 AliSignalProcesor.cxx:60
 AliSignalProcesor.cxx:61
 AliSignalProcesor.cxx:62
 AliSignalProcesor.cxx:63
 AliSignalProcesor.cxx:64
 AliSignalProcesor.cxx:65
 AliSignalProcesor.cxx:66
 AliSignalProcesor.cxx:67
 AliSignalProcesor.cxx:68
 AliSignalProcesor.cxx:69
 AliSignalProcesor.cxx:70
 AliSignalProcesor.cxx:71
 AliSignalProcesor.cxx:72
 AliSignalProcesor.cxx:73
 AliSignalProcesor.cxx:74
 AliSignalProcesor.cxx:75
 AliSignalProcesor.cxx:76
 AliSignalProcesor.cxx:77
 AliSignalProcesor.cxx:78
 AliSignalProcesor.cxx:79
 AliSignalProcesor.cxx:80
 AliSignalProcesor.cxx:81
 AliSignalProcesor.cxx:82
 AliSignalProcesor.cxx:83
 AliSignalProcesor.cxx:84
 AliSignalProcesor.cxx:85
 AliSignalProcesor.cxx:86
 AliSignalProcesor.cxx:87
 AliSignalProcesor.cxx:88
 AliSignalProcesor.cxx:89
 AliSignalProcesor.cxx:90
 AliSignalProcesor.cxx:91
 AliSignalProcesor.cxx:92
 AliSignalProcesor.cxx:93
 AliSignalProcesor.cxx:94
 AliSignalProcesor.cxx:95
 AliSignalProcesor.cxx:96
 AliSignalProcesor.cxx:97
 AliSignalProcesor.cxx:98
 AliSignalProcesor.cxx:99
 AliSignalProcesor.cxx:100
 AliSignalProcesor.cxx:101
 AliSignalProcesor.cxx:102
 AliSignalProcesor.cxx:103
 AliSignalProcesor.cxx:104
 AliSignalProcesor.cxx:105
 AliSignalProcesor.cxx:106
 AliSignalProcesor.cxx:107
 AliSignalProcesor.cxx:108
 AliSignalProcesor.cxx:109
 AliSignalProcesor.cxx:110
 AliSignalProcesor.cxx:111
 AliSignalProcesor.cxx:112
 AliSignalProcesor.cxx:113
 AliSignalProcesor.cxx:114
 AliSignalProcesor.cxx:115
 AliSignalProcesor.cxx:116
 AliSignalProcesor.cxx:117
 AliSignalProcesor.cxx:118
 AliSignalProcesor.cxx:119
 AliSignalProcesor.cxx:120
 AliSignalProcesor.cxx:121
 AliSignalProcesor.cxx:122
 AliSignalProcesor.cxx:123
 AliSignalProcesor.cxx:124
 AliSignalProcesor.cxx:125
 AliSignalProcesor.cxx:126
 AliSignalProcesor.cxx:127
 AliSignalProcesor.cxx:128
 AliSignalProcesor.cxx:129
 AliSignalProcesor.cxx:130
 AliSignalProcesor.cxx:131
 AliSignalProcesor.cxx:132
 AliSignalProcesor.cxx:133
 AliSignalProcesor.cxx:134
 AliSignalProcesor.cxx:135
 AliSignalProcesor.cxx:136
 AliSignalProcesor.cxx:137
 AliSignalProcesor.cxx:138
 AliSignalProcesor.cxx:139
 AliSignalProcesor.cxx:140
 AliSignalProcesor.cxx:141
 AliSignalProcesor.cxx:142
 AliSignalProcesor.cxx:143
 AliSignalProcesor.cxx:144
 AliSignalProcesor.cxx:145
 AliSignalProcesor.cxx:146
 AliSignalProcesor.cxx:147
 AliSignalProcesor.cxx:148
 AliSignalProcesor.cxx:149
 AliSignalProcesor.cxx:150
 AliSignalProcesor.cxx:151
 AliSignalProcesor.cxx:152
 AliSignalProcesor.cxx:153
 AliSignalProcesor.cxx:154
 AliSignalProcesor.cxx:155
 AliSignalProcesor.cxx:156
 AliSignalProcesor.cxx:157
 AliSignalProcesor.cxx:158
 AliSignalProcesor.cxx:159
 AliSignalProcesor.cxx:160
 AliSignalProcesor.cxx:161
 AliSignalProcesor.cxx:162
 AliSignalProcesor.cxx:163
 AliSignalProcesor.cxx:164
 AliSignalProcesor.cxx:165
 AliSignalProcesor.cxx:166
 AliSignalProcesor.cxx:167
 AliSignalProcesor.cxx:168
 AliSignalProcesor.cxx:169
 AliSignalProcesor.cxx:170
 AliSignalProcesor.cxx:171
 AliSignalProcesor.cxx:172
 AliSignalProcesor.cxx:173
 AliSignalProcesor.cxx:174
 AliSignalProcesor.cxx:175
 AliSignalProcesor.cxx:176
 AliSignalProcesor.cxx:177
 AliSignalProcesor.cxx:178
 AliSignalProcesor.cxx:179
 AliSignalProcesor.cxx:180
 AliSignalProcesor.cxx:181
 AliSignalProcesor.cxx:182
 AliSignalProcesor.cxx:183
 AliSignalProcesor.cxx:184
 AliSignalProcesor.cxx:185
 AliSignalProcesor.cxx:186
 AliSignalProcesor.cxx:187
 AliSignalProcesor.cxx:188
 AliSignalProcesor.cxx:189
 AliSignalProcesor.cxx:190
 AliSignalProcesor.cxx:191
 AliSignalProcesor.cxx:192
 AliSignalProcesor.cxx:193
 AliSignalProcesor.cxx:194
 AliSignalProcesor.cxx:195
 AliSignalProcesor.cxx:196
 AliSignalProcesor.cxx:197
 AliSignalProcesor.cxx:198
 AliSignalProcesor.cxx:199
 AliSignalProcesor.cxx:200
 AliSignalProcesor.cxx:201
 AliSignalProcesor.cxx:202
 AliSignalProcesor.cxx:203
 AliSignalProcesor.cxx:204
 AliSignalProcesor.cxx:205
 AliSignalProcesor.cxx:206
 AliSignalProcesor.cxx:207
 AliSignalProcesor.cxx:208
 AliSignalProcesor.cxx:209
 AliSignalProcesor.cxx:210
 AliSignalProcesor.cxx:211
 AliSignalProcesor.cxx:212
 AliSignalProcesor.cxx:213
 AliSignalProcesor.cxx:214
 AliSignalProcesor.cxx:215
 AliSignalProcesor.cxx:216
 AliSignalProcesor.cxx:217
 AliSignalProcesor.cxx:218
 AliSignalProcesor.cxx:219
 AliSignalProcesor.cxx:220
 AliSignalProcesor.cxx:221
 AliSignalProcesor.cxx:222
 AliSignalProcesor.cxx:223
 AliSignalProcesor.cxx:224
 AliSignalProcesor.cxx:225
 AliSignalProcesor.cxx:226
 AliSignalProcesor.cxx:227
 AliSignalProcesor.cxx:228
 AliSignalProcesor.cxx:229
 AliSignalProcesor.cxx:230
 AliSignalProcesor.cxx:231
 AliSignalProcesor.cxx:232
 AliSignalProcesor.cxx:233
 AliSignalProcesor.cxx:234
 AliSignalProcesor.cxx:235
 AliSignalProcesor.cxx:236
 AliSignalProcesor.cxx:237
 AliSignalProcesor.cxx:238
 AliSignalProcesor.cxx:239
 AliSignalProcesor.cxx:240
 AliSignalProcesor.cxx:241
 AliSignalProcesor.cxx:242
 AliSignalProcesor.cxx:243
 AliSignalProcesor.cxx:244
 AliSignalProcesor.cxx:245
 AliSignalProcesor.cxx:246
 AliSignalProcesor.cxx:247
 AliSignalProcesor.cxx:248
 AliSignalProcesor.cxx:249
 AliSignalProcesor.cxx:250
 AliSignalProcesor.cxx:251
 AliSignalProcesor.cxx:252
 AliSignalProcesor.cxx:253
 AliSignalProcesor.cxx:254
 AliSignalProcesor.cxx:255
 AliSignalProcesor.cxx:256
 AliSignalProcesor.cxx:257
 AliSignalProcesor.cxx:258
 AliSignalProcesor.cxx:259
 AliSignalProcesor.cxx:260
 AliSignalProcesor.cxx:261
 AliSignalProcesor.cxx:262
 AliSignalProcesor.cxx:263
 AliSignalProcesor.cxx:264
 AliSignalProcesor.cxx:265
 AliSignalProcesor.cxx:266
 AliSignalProcesor.cxx:267
 AliSignalProcesor.cxx:268
 AliSignalProcesor.cxx:269
 AliSignalProcesor.cxx:270
 AliSignalProcesor.cxx:271
 AliSignalProcesor.cxx:272
 AliSignalProcesor.cxx:273
 AliSignalProcesor.cxx:274
 AliSignalProcesor.cxx:275
 AliSignalProcesor.cxx:276
 AliSignalProcesor.cxx:277
 AliSignalProcesor.cxx:278
 AliSignalProcesor.cxx:279
 AliSignalProcesor.cxx:280
 AliSignalProcesor.cxx:281
 AliSignalProcesor.cxx:282
 AliSignalProcesor.cxx:283
 AliSignalProcesor.cxx:284
 AliSignalProcesor.cxx:285
 AliSignalProcesor.cxx:286
 AliSignalProcesor.cxx:287
 AliSignalProcesor.cxx:288
 AliSignalProcesor.cxx:289
 AliSignalProcesor.cxx:290
 AliSignalProcesor.cxx:291
 AliSignalProcesor.cxx:292