4651a4cf6dbe3c27c39484756c281b9f3c3b6189
[u/mrichter/AliRoot.git] / TRD / AliTRDparameter.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16 /*
17 $Log$
18 Revision 1.9  2002/10/28 13:02:51  cblume
19 Bug fix in GetTiltingAngle()
20
21 Revision 1.8  2002/10/14 14:57:44  hristov
22 Merging the VirtualMC branch to the main development branch (HEAD)
23
24 Revision 1.5.6.3  2002/10/11 07:26:37  hristov
25 Updating VirtualMC to v3-09-02
26
27 Revision 1.7  2002/09/26 09:26:31  cblume
28 Bug fix in LUT
29
30 Revision 1.6  2002/06/12 09:54:35  cblume
31 Update of tracking code provided by Sergei
32
33 Revision 1.5  2002/04/30 08:30:40  cblume
34 gAlice now only read by AliRunDigitizer. Therefore it is just deleted in AliTRDmerge.C
35
36 Revision 1.4  2002/04/12 12:13:23  cblume
37 Add Jiris changes
38
39 Revision 1.3  2002/03/28 14:59:07  cblume
40 Coding conventions
41
42 Revision 1.2  2002/03/28 10:00:36  hristov
43 Some additional initialisation
44
45 Revision 1.1  2002/03/25 20:01:18  cblume
46 Introduce parameter class
47
48 */
49
50 ///////////////////////////////////////////////////////////////////////////////
51 //                                                                           //
52 //  TRD parameter class                                                      //
53 //                                                                           //
54 ///////////////////////////////////////////////////////////////////////////////
55
56 #include "AliRun.h"
57 #include "AliMagF.h"
58
59 #include "AliTRD.h"
60 #include "AliTRDparameter.h"
61 #include "AliTRDgeometryFull.h"
62
63 ClassImp(AliTRDparameter)
64
65 //_____________________________________________________________________________
66 AliTRDparameter::AliTRDparameter():TNamed()
67 {
68   //
69   // AliTRDparameter default constructor
70   //
71
72   fGeo                = 0;
73   fPRFsmp             = 0;
74   fTRFsmp             = 0;
75   fCTsmp              = 0;
76   fGasGain            = 0.0;
77   fNoise              = 0.0;
78   fChipGain           = 0.0;
79   fADCoutRange        = 0.0;
80   fADCinRange         = 0.0;
81   fADCthreshold       = 0;
82   fDiffusionOn        = 0;
83   fDiffusionT         = 0.0;
84   fDiffusionL         = 0.0;
85   fElAttachOn         = 0;
86   fElAttachProp       = 0.0;
87   fExBOn              = 0;
88   fOmegaTau           = 0.0;
89   fPRFOn              = 0;
90   fTRFOn              = 0;
91   fCTOn               = 0;
92   fTCOn               = 0;
93   fDriftVelocity      = 0.0;
94   fPadCoupling        = 0.0;
95   fTimeCoupling       = 0.0;
96   fTimeBinWidth       = 0.0;
97   fField              = 0.0;
98   fTiltingAngle       = 0.0;
99   fPRFbin             = 0;
100   fPRFlo              = 0.0;
101   fPRFhi              = 0.0;
102   fPRFwid             = 0.0;
103   fPRFpad             = 0;
104   fTRFbin             = 0;
105   fTRFlo              = 0.0;
106   fTRFhi              = 0.0;
107   fTRFwid             = 0.0;
108   fTCnexp             = 0;
109
110   fLUTOn              = 0;  
111   fLUT                = 0;
112   fClusMaxThresh      = 0;
113   fClusSigThresh      = 0;
114
115 }
116
117 //_____________________________________________________________________________
118 AliTRDparameter::AliTRDparameter(const Text_t *name, const Text_t *title)
119                 :TNamed(name,title)
120 {
121   //
122   // AliTRDparameter constructor
123   //
124
125   fGeo                = new AliTRDgeometryFull();
126   fPRFsmp             = 0;
127   fTRFsmp             = 0;
128   fCTsmp              = 0;
129   fGasGain            = 0.0;
130   fNoise              = 0.0;
131   fChipGain           = 0.0;
132   fADCoutRange        = 0.0;
133   fADCinRange         = 0.0;
134   fADCthreshold       = 0;
135   fDiffusionOn        = 0;
136   fDiffusionT         = 0.0;
137   fDiffusionL         = 0.0;
138   fElAttachOn         = 0;
139   fElAttachProp       = 0.0;
140   fExBOn              = 0;
141   fOmegaTau           = 0.0;
142   fPRFOn              = 0;
143   fTRFOn              = 0;
144   fCTOn               = 0;
145   fTCOn               = 0;
146   fDriftVelocity      = 0.0;
147   fPadCoupling        = 0.0;
148   fTimeCoupling       = 0.0;
149   fTimeBinWidth       = 0.0;
150   fField              = 0.0;
151   fTiltingAngle       = 0.0;
152   fPRFbin             = 0;
153   fPRFlo              = 0.0;
154   fPRFhi              = 0.0;
155   fPRFwid             = 0.0;
156   fPRFpad             = 0;
157   fTRFbin             = 0;
158   fTRFlo              = 0.0;
159   fTRFhi              = 0.0;
160   fTRFwid             = 0.0;
161   fTCnexp             = 0;
162
163   fLUTOn              = 0;  
164   fLUT                = 0;
165   fClusMaxThresh      = 0;
166   fClusSigThresh      = 0;
167
168   Init();
169
170 }
171
172
173 //_____________________________________________________________________________
174 AliTRDparameter::AliTRDparameter(const AliTRDparameter &p)
175 {
176   //
177   // AliTRDparameter copy constructor
178   //
179
180   ((AliTRDparameter &) p).Copy(*this);
181
182 }
183
184 ///_____________________________________________________________________________
185 AliTRDparameter::~AliTRDparameter()
186 {
187   //
188   // AliTRDparameter destructor
189   //
190
191   if (fTRFsmp) {
192     delete [] fTRFsmp;
193     fTRFsmp = 0;
194   }
195
196   if (fPRFsmp) {
197     delete [] fPRFsmp;
198     fPRFsmp = 0;
199   }
200
201   if (fCTsmp) {
202     delete [] fCTsmp;
203     fCTsmp  = 0;
204   }
205
206   if (fLUT) {
207     delete [] fLUT;
208     fLUT    = 0;
209   }
210
211   if (fGeo) {
212     delete fGeo;
213     fGeo    = 0;
214   }
215
216 }
217
218 //_____________________________________________________________________________
219 AliTRDparameter &AliTRDparameter::operator=(const AliTRDparameter &p)
220 {
221   //
222   // Assignment operator
223   //
224
225   if (this != &p) ((AliTRDparameter &) p).Copy(*this);
226   return *this;
227
228 }
229
230 //_____________________________________________________________________________
231 void AliTRDparameter::Copy(TObject &p)
232 {
233   //
234   // Copy function
235   //
236
237   Int_t iBin;
238
239   ((AliTRDparameter &) p).fGasGain            = fGasGain;
240   ((AliTRDparameter &) p).fNoise              = fNoise;
241   ((AliTRDparameter &) p).fChipGain           = fChipGain;
242   ((AliTRDparameter &) p).fADCoutRange        = fADCoutRange;
243   ((AliTRDparameter &) p).fADCinRange         = fADCinRange;
244   ((AliTRDparameter &) p).fADCthreshold       = fADCthreshold;
245   ((AliTRDparameter &) p).fDiffusionOn        = fDiffusionOn; 
246   ((AliTRDparameter &) p).fDiffusionT         = fDiffusionT;
247   ((AliTRDparameter &) p).fDiffusionL         = fDiffusionL;
248   ((AliTRDparameter &) p).fElAttachOn         = fElAttachOn;
249   ((AliTRDparameter &) p).fElAttachProp       = fElAttachProp;
250   ((AliTRDparameter &) p).fExBOn              = fExBOn;
251   ((AliTRDparameter &) p).fOmegaTau           = fOmegaTau;
252   ((AliTRDparameter &) p).fLorentzFactor      = fLorentzFactor;
253   ((AliTRDparameter &) p).fDriftVelocity      = fDriftVelocity;
254   ((AliTRDparameter &) p).fPadCoupling        = fPadCoupling;
255   ((AliTRDparameter &) p).fTimeCoupling       = fTimeCoupling;
256   ((AliTRDparameter &) p).fTimeBinWidth       = fTimeBinWidth;
257   ((AliTRDparameter &) p).fField              = fField;
258   ((AliTRDparameter &) p).fPRFOn              = fPRFOn;
259   ((AliTRDparameter &) p).fTRFOn              = fTRFOn;
260   ((AliTRDparameter &) p).fCTOn               = fCTOn;
261   ((AliTRDparameter &) p).fTCOn               = fTCOn;
262   ((AliTRDparameter &) p).fTiltingAngle       = fTiltingAngle;
263   ((AliTRDparameter &) p).fPRFbin             = fPRFbin;
264   ((AliTRDparameter &) p).fPRFlo              = fPRFlo;
265   ((AliTRDparameter &) p).fPRFhi              = fPRFhi;
266   ((AliTRDparameter &) p).fPRFwid             = fPRFwid;
267   ((AliTRDparameter &) p).fPRFpad             = fPRFpad;
268   if (((AliTRDparameter &) p).fPRFsmp) delete [] ((AliTRDparameter &) p).fPRFsmp;
269   ((AliTRDparameter &) p).fPRFsmp = new Float_t[fPRFbin];
270   for (iBin = 0; iBin < fPRFbin; iBin++) {
271     ((AliTRDparameter &) p).fPRFsmp[iBin] = fPRFsmp[iBin];
272   }                                                                             
273   ((AliTRDparameter &) p).fTRFbin             = fTRFbin;
274   ((AliTRDparameter &) p).fTRFlo              = fTRFlo;
275   ((AliTRDparameter &) p).fTRFhi              = fTRFhi;
276   ((AliTRDparameter &) p).fTRFwid             = fTRFwid;
277   if (((AliTRDparameter &) p).fTRFsmp) delete [] ((AliTRDparameter &) p).fTRFsmp;
278   ((AliTRDparameter &) p).fTRFsmp = new Float_t[fTRFbin];
279   for (iBin = 0; iBin < fTRFbin; iBin++) {
280     ((AliTRDparameter &) p).fTRFsmp[iBin] = fTRFsmp[iBin];
281   }                                      
282   if (((AliTRDparameter &) p).fCTsmp)  delete [] ((AliTRDparameter &) p).fCTsmp;
283   ((AliTRDparameter &) p).fCTsmp  = new Float_t[fTRFbin];
284   for (iBin = 0; iBin < fTRFbin; iBin++) {
285     ((AliTRDparameter &) p).fCTsmp[iBin]  = fCTsmp[iBin];
286   }                                      
287   ((AliTRDparameter &) p).fTCnexp             = fTCnexp;
288
289   ((AliTRDparameter &) p).fLUTOn              = fLUTOn;
290   ((AliTRDparameter &) p).fLUTbin             = fLUTbin;
291   if (((AliTRDparameter &) p).fLUT)    delete [] ((AliTRDparameter &) p).fLUT;
292   ((AliTRDparameter &) p).fLUT  = new Float_t[fLUTbin];
293   for (iBin = 0; iBin < fLUTbin; iBin++) {
294     ((AliTRDparameter &) p).fLUT[iBin]  = fLUT[iBin];
295   }                                      
296   ((AliTRDparameter &) p).fClusMaxThresh      = fClusMaxThresh;
297   ((AliTRDparameter &) p).fClusSigThresh      = fClusSigThresh;
298
299 }
300
301 //_____________________________________________________________________________
302 void AliTRDparameter::Init()
303 {
304   //
305   // Initializes the parameter
306   //
307   // The maximum number of pads
308   // and the position of pad 0,0,0
309   //
310   // chambers seen from the top:
311   //     +----------------------------+
312   //     |                            |
313   //     |                            |      ^
314   //     |                            |  rphi|
315   //     |                            |      |
316   //     |0                           |      |
317   //     +----------------------------+      +------>
318   //                                             z
319   // chambers seen from the side:            ^
320   //     +----------------------------+ drift|
321   //     |0                           |      |
322   //     |                            |      |
323   //     +----------------------------+      +------>
324   //                                             z
325   //
326   // IMPORTANT: time bin 0 is now the first one in the drift region
327   // closest to the readout !!!
328   //
329
330   //
331   // ----------------------------------------------------------------------------
332   // The pad definition
333   // ----------------------------------------------------------------------------
334   //
335
336   // The pad size in column direction (rphi-direction)
337   SetColPadSize(0,0.65);
338   SetColPadSize(1,0.68);
339   SetColPadSize(2,0.71);
340   SetColPadSize(3,0.74);
341   SetColPadSize(4,0.77);
342   SetColPadSize(5,0.80);
343
344   // The pad row (z-direction)
345   SetNRowPad();
346
347   // The number of time bins. Default is 100 ns timbin size
348   SetNTimeBin(15);
349
350   // Additional time bins before and after the drift region.
351   // Default is to only sample the drift region
352   SetExpandTimeBin(0,0);
353
354   //
355   // ----------------------------------------------------------------------------
356   // The digitization parameter
357   // ----------------------------------------------------------------------------
358   //
359
360   // The default parameter for the digitization
361   fGasGain        = 4500.;
362   fChipGain       = 12.4;
363   fNoise          = 1000.;
364   fADCoutRange    = 1023.;          // 10-bit ADC
365   fADCinRange     = 1000.;          // 1V input range
366   fADCthreshold   = 1;
367
368   // The drift velocity (cm / mus)
369   fDriftVelocity  = 1.5;
370
371   // Diffusion on
372   fDiffusionOn    = 1;
373
374   // E x B effects
375   fExBOn          = 0;
376
377   // Propability for electron attachment
378   fElAttachOn     = 0;
379   fElAttachProp   = 0.0;
380
381   // The pad response function
382   fPRFOn          = 1;
383
384   // The time response function
385   fTRFOn          = 1;
386
387   // The cross talk
388   fCTOn           = 0;
389
390   // The tail cancelation
391   fTCOn           = 1;
392   
393   // The number of exponentials
394   fTCnexp         = 2;
395
396   // The pad coupling factor (same number as for the TPC)
397   fPadCoupling    = 0.5;
398
399   // The time coupling factor (same number as for the TPC)
400   fTimeCoupling   = 0.4;
401
402   // The tilting angle for the readout pads
403   //SetTiltingAngle(5.0);
404   SetTiltingAngle(0.0);
405
406   // The magnetic field strength in Tesla
407   //fField           = 0.2 * gAlice->Field()->Factor();
408   fField           = 0.4;
409
410   //
411   // ----------------------------------------------------------------------------
412   // The clusterization parameter
413   // ----------------------------------------------------------------------------
414   //
415
416   // The default parameter for the clustering
417   fClusMaxThresh = 3;
418   fClusSigThresh = 1;
419
420   // Use the LUT
421   fLUTOn         = 1;  
422
423   ReInit();
424
425 }
426
427 //_____________________________________________________________________________
428 void AliTRDparameter::ReInit()
429 {
430   //
431   // Reinitializes the parameter class after a change
432   //
433
434   // Calculate the time bin width in ns
435   fTimeBinWidth   = fTimeBinSize / fDriftVelocity * 1000.0;
436
437   // The range and the binwidth for the sampled TRF 
438   fTRFbin = 100;
439   // Start 0.2 mus before the signal
440   fTRFlo  = -0.2 * fDriftVelocity;
441   // End the maximum driftlength after the signal 
442   fTRFhi  = AliTRDgeometry::DrThick() 
443           + fTimeAfter * fTimeBinSize;
444   fTRFwid = (fTRFhi - fTRFlo) / ((Float_t) fTRFbin);
445
446   // Transverse and longitudinal diffusion coefficients (Xe/CO2)
447   fDiffusionT     = GetDiffusionT(fDriftVelocity,fField);
448   fDiffusionL     = GetDiffusionL(fDriftVelocity,fField);
449
450   // omega * tau.= tan(Lorentz-angle)
451   fOmegaTau       = GetOmegaTau(fDriftVelocity,fField);
452
453   // The Lorentz factor
454   if (fExBOn) {
455     fLorentzFactor = 1.0 / (1.0 + fOmegaTau*fOmegaTau);
456   }
457   else {
458     fLorentzFactor = 1.0;
459   }
460
461   // Create the sampled PRF
462   SamplePRF();
463
464   // Create the sampled TRF
465   SampleTRF();
466
467   // Create the LUT
468   FillLUT();
469
470 }
471
472 //_____________________________________________________________________________
473 void AliTRDparameter::SetNRowPad(const Int_t p, const Int_t c, const Int_t npad)
474 {
475   //
476   // Redefines the number of pads in raw direction for
477   // a given plane and chamber number
478   //
479
480   for (Int_t isect = 0; isect < AliTRDgeometry::Nsect(); isect++) {
481
482     fRowMax[p][c][isect] = npad;
483
484     fRowPadSize[p][c][isect] = (fGeo->GetChamberLength(p,c) 
485                                 - 2.* AliTRDgeometry::RpadW())
486                              / ((Float_t) npad);
487
488   }
489
490 }
491
492 //_____________________________________________________________________________
493 void AliTRDparameter::SetNRowPad()
494 {
495   //
496   // Defines the number of pads in row direction
497   //
498
499   Int_t isect;
500   Int_t icham;
501   Int_t iplan;
502
503   Int_t rowMax[kNplan][kNcham] = { { 16, 16, 12, 16, 16 }
504                                  , { 16, 16, 12, 16, 16 }
505                                  , { 16, 16, 12, 16, 16 }
506                                  , { 16, 16, 12, 16, 16 }
507                                  , { 16, 16, 12, 16, 16 }
508                                  , { 16, 16, 12, 16, 16 } };
509
510   Float_t rpadW = AliTRDgeometry::RpadW();
511
512   for (isect = 0; isect < kNsect; isect++) {
513     for (icham = 0; icham < kNcham; icham++) {
514       for (iplan = 0; iplan < kNplan; iplan++) {
515
516         fRowMax[iplan][icham][isect]     = rowMax[iplan][icham];
517
518         fRowPadSize[iplan][icham][isect] = (fGeo->GetChamberLength(iplan,icham) 
519                                             - 2.*rpadW)
520                                          / ((Float_t) rowMax[iplan][icham]);
521
522         Float_t row0 = rpadW - fGeo->GetChamberLength(iplan,0)
523                              - fGeo->GetChamberLength(iplan,1)
524                              - fGeo->GetChamberLength(iplan,2) / 2.;
525         for (Int_t ic = 0; ic < icham; ic++) {
526           row0 += fGeo->GetChamberLength(iplan,icham);
527         }
528         fRow0[iplan][icham][isect]       = row0;
529
530       }
531     }
532   }
533
534 }
535
536 //_____________________________________________________________________________
537 void AliTRDparameter::SetColPadSize(const Int_t p, const Float_t s)
538 {
539   //
540   // Redefines the pad size in column direction
541   //
542
543   Float_t cpadW  = AliTRDgeometry::CpadW();
544
545   fColPadSize[p] = s;
546   fCol0[p]       = - fGeo->GetChamberWidth(p)/2. + cpadW;
547   fColMax[p]     = ((Int_t) ((fGeo->GetChamberWidth(p) - 2.*cpadW) / s));
548
549 }
550
551 //_____________________________________________________________________________
552 void AliTRDparameter::SetNTimeBin(const Int_t nbin)
553 {
554   //
555   // Redefines the number of time bins in the drift region.
556   // The time bin width is defined by the length of the
557   // drift region divided by <nbin>.
558   //
559
560   fTimeMax     = nbin;
561   fTimeBinSize = AliTRDgeometry::DrThick() / ((Float_t) fTimeMax);
562   for (Int_t iplan = 0; iplan < AliTRDgeometry::Nplan(); iplan++) {
563     fTime0[iplan] = AliTRDgeometry::Rmin()
564                   + AliTRDgeometry::CraHght()
565                   + AliTRDgeometry::CdrHght()
566                   + iplan * (AliTRDgeometry::Cheight() 
567                            + AliTRDgeometry::Cspace());
568   }
569
570 }
571
572 //_____________________________________________________________________________
573 Float_t AliTRDparameter::CrossTalk(Float_t time) const
574 {
575   //
576   // Applies the pad-pad capacitive cross talk
577   //
578
579   Int_t iBin = ((Int_t) ((time - fTRFlo) / fTRFwid)); 
580   if ((iBin >= 0) && (iBin < fTRFbin)) {
581     return fCTsmp[iBin];
582   }
583   else {
584     return 0.0;
585   }    
586
587 }
588
589 //_____________________________________________________________________________
590 Int_t AliTRDparameter::Diffusion(Float_t driftlength, Float_t *xyz)
591 {
592   //
593   // Applies the diffusion smearing to the position of a single electron
594   //
595
596   Float_t driftSqrt = TMath::Sqrt(driftlength);
597   Float_t sigmaT = driftSqrt * fDiffusionT;
598   Float_t sigmaL = driftSqrt * fDiffusionL;
599   xyz[0] = gRandom->Gaus(xyz[0], sigmaL * fLorentzFactor);
600   xyz[1] = gRandom->Gaus(xyz[1], sigmaT * fLorentzFactor);
601   xyz[2] = gRandom->Gaus(xyz[2], sigmaT);
602
603   return 1;
604
605 }
606
607 //_____________________________________________________________________________
608 Int_t AliTRDparameter::ExB(Float_t driftlength, Float_t *xyz) const
609 {
610   //
611   // Applies E x B effects to the position of a single electron
612   //
613
614   xyz[0] = xyz[0];
615   xyz[1] = xyz[1] + fOmegaTau * driftlength;
616   xyz[2] = xyz[2];
617
618   return 1;
619
620 }
621
622 //_____________________________________________________________________________
623 Int_t AliTRDparameter::PadResponse(Float_t signal, Float_t dist
624                                  , Int_t plane, Float_t *pad) const
625 {
626   //
627   // Applies the pad response
628   //
629
630   const Int_t kNplan = AliTRDgeometry::kNplan;
631
632   Int_t iBin  = ((Int_t) (( - dist - fPRFlo) / fPRFwid));
633   Int_t iOff  = plane * fPRFbin;
634
635   Int_t iBin0 = iBin - fPRFpad + iOff;
636   Int_t iBin1 = iBin           + iOff;
637   Int_t iBin2 = iBin + fPRFpad + iOff;
638
639   pad[0] = 0.0;
640   pad[1] = 0.0;
641   pad[2] = 0.0;
642   if ((iBin1 >= 0) && (iBin1 < (fPRFbin*kNplan))) {
643
644     if (iBin0 >= 0) {
645       pad[0] = signal * fPRFsmp[iBin0];
646     }
647     pad[1] = signal * fPRFsmp[iBin1];
648     if (iBin2 < (fPRFbin*kNplan)) {
649       pad[2] = signal * fPRFsmp[iBin2];
650     }
651
652     return 1;
653
654   }
655   else {
656
657     return 0;
658
659   }
660
661 }
662
663 //_____________________________________________________________________________
664 Float_t AliTRDparameter::TimeResponse(Float_t time) const
665 {
666   //
667   // Applies the preamp shaper time response
668   //
669
670   Int_t iBin = ((Int_t) ((time - fTRFlo) / fTRFwid)); 
671   if ((iBin >= 0) && (iBin < fTRFbin)) {
672     return fTRFsmp[iBin];
673   }
674   else {
675     return 0.0;
676   }    
677
678 }
679
680 //_____________________________________________________________________________
681 Float_t AliTRDparameter::Col0Tilted(Float_t col0, Float_t rowOffset
682                                   , Int_t plane)
683 {
684   //
685   // Calculates col0 for tilted pads
686   //
687
688   Float_t diff = fTiltingAngle * rowOffset;
689   return (col0 + TMath::Power(-1.0,plane) * diff);
690
691 }
692
693 //_____________________________________________________________________________
694 void AliTRDparameter::SampleTRF()
695 {
696   //
697   // Samples the time response function
698   //
699   // New TRF from Venelin Angelov, simulated with CADENCE
700   // Pad-ground capacitance = 25 pF
701   // Pad-pad cross talk capacitance = 6 pF   
702   //
703
704   Int_t   ipos1;
705   Int_t   ipos2;
706   Float_t diff;
707
708   const Int_t kNpasa     = 252;
709
710   Float_t time[kNpasa]   = { -0.220000, -0.210000, -0.200000, -0.190000 
711                            , -0.180000, -0.170000, -0.160000, -0.150000 
712                            , -0.140000, -0.130000, -0.120000, -0.110000 
713                            , -0.100000, -0.090000, -0.080000, -0.070000 
714                            , -0.060000, -0.050000, -0.040000, -0.030000 
715                            , -0.020000, -0.010000, -0.000000,  0.010000 
716                            ,  0.020000,  0.030000,  0.040000,  0.050000 
717                            ,  0.060000,  0.070000,  0.080000,  0.090000 
718                            ,  0.100000,  0.110000,  0.120000,  0.130000 
719                            ,  0.140000,  0.150000,  0.160000,  0.170000 
720                            ,  0.180000,  0.190000,  0.200000,  0.210000 
721                            ,  0.220000,  0.230000,  0.240000,  0.250000 
722                            ,  0.260000,  0.270000,  0.280000,  0.290000 
723                            ,  0.300000,  0.310000,  0.320000,  0.330000 
724                            ,  0.340000,  0.350000,  0.360000,  0.370000 
725                            ,  0.380000,  0.390000,  0.400000,  0.410000 
726                            ,  0.420000,  0.430000,  0.440000,  0.450000 
727                            ,  0.460000,  0.470000,  0.480000,  0.490000 
728                            ,  0.500000,  0.510000,  0.520000,  0.530000 
729                            ,  0.540000,  0.550000,  0.560000,  0.570000 
730                            ,  0.580000,  0.590000,  0.600000,  0.610000 
731                            ,  0.620000,  0.630000,  0.640000,  0.650000 
732                            ,  0.660000,  0.670000,  0.680000,  0.690000 
733                            ,  0.700000,  0.710000,  0.720000,  0.730000 
734                            ,  0.740000,  0.750000,  0.760000,  0.770000 
735                            ,  0.780000,  0.790000,  0.800000,  0.810000 
736                            ,  0.820000,  0.830000,  0.840000,  0.850000 
737                            ,  0.860000,  0.870000,  0.880000,  0.890000 
738                            ,  0.900000,  0.910000,  0.920000,  0.930000 
739                            ,  0.940000,  0.950000,  0.960000,  0.970000 
740                            ,  0.980000,  0.990000,  1.000000,  1.010000 
741                            ,  1.020000,  1.030000,  1.040000,  1.050000 
742                            ,  1.060000,  1.070000,  1.080000,  1.090000 
743                            ,  1.100000,  1.110000,  1.120000,  1.130000 
744                            ,  1.140000,  1.150000,  1.160000,  1.170000 
745                            ,  1.180000,  1.190000,  1.200000,  1.210000 
746                            ,  1.220000,  1.230000,  1.240000,  1.250000 
747                            ,  1.260000,  1.270000,  1.280000,  1.290000 
748                            ,  1.300000,  1.310000,  1.320000,  1.330000 
749                            ,  1.340000,  1.350000,  1.360000,  1.370000 
750                            ,  1.380000,  1.390000,  1.400000,  1.410000 
751                            ,  1.420000,  1.430000,  1.440000,  1.450000 
752                            ,  1.460000,  1.470000,  1.480000,  1.490000 
753                            ,  1.500000,  1.510000,  1.520000,  1.530000 
754                            ,  1.540000,  1.550000,  1.560000,  1.570000 
755                            ,  1.580000,  1.590000,  1.600000,  1.610000 
756                            ,  1.620000,  1.630000,  1.640000,  1.650000 
757                            ,  1.660000,  1.670000,  1.680000,  1.690000 
758                            ,  1.700000,  1.710000,  1.720000,  1.730000 
759                            ,  1.740000,  1.750000,  1.760000,  1.770000 
760                            ,  1.780000,  1.790000,  1.800000,  1.810000 
761                            ,  1.820000,  1.830000,  1.840000,  1.850000 
762                            ,  1.860000,  1.870000,  1.880000,  1.890000 
763                            ,  1.900000,  1.910000,  1.920000,  1.930000 
764                            ,  1.940000,  1.950000,  1.960000,  1.970000 
765                            ,  1.980000,  1.990000,  2.000000,  2.010000 
766                            ,  2.020000,  2.030000,  2.040000,  2.050000 
767                            ,  2.060000,  2.070000,  2.080000,  2.090000 
768                            ,  2.100000,  2.110000,  2.120000,  2.130000 
769                            ,  2.140000,  2.150000,  2.160000,  2.170000 
770                            ,  2.180000,  2.190000,  2.200000,  2.210000 
771                            ,  2.220000,  2.230000,  2.240000,  2.250000 
772                            ,  2.260000,  2.270000,  2.280000,  2.290000 };
773
774   Float_t signal[kNpasa] = {  0.000000,  0.000000,  0.000000,  0.000000 
775                            ,  0.000000,  0.000000,  0.000000,  0.000396 
776                            ,  0.005096,  0.022877,  0.061891,  0.126614 
777                            ,  0.215798,  0.324406,  0.444507,  0.566817 
778                            ,  0.683465,  0.787089,  0.873159,  0.937146 
779                            ,  0.979049,  0.999434,  1.000000,  0.983579 
780                            ,  0.954134,  0.913364,  0.866365,  0.813703 
781                            ,  0.759910,  0.706116,  0.653454,  0.603624 
782                            ,  0.556625,  0.514156,  0.475085,  0.439977 
783                            ,  0.408834,  0.380578,  0.355549,  0.333352 
784                            ,  0.313647,  0.296093,  0.280351,  0.266195 
785                            ,  0.253397,  0.241789,  0.231257,  0.221574 
786                            ,  0.212627,  0.204417,  0.196772,  0.189581 
787                            ,  0.182956,  0.176784,  0.171008,  0.165515 
788                            ,  0.160419,  0.155606,  0.151076,  0.146716 
789                            ,  0.142639,  0.138845,  0.135221,  0.131767 
790                            ,  0.128482,  0.125368,  0.122424,  0.119592 
791                            ,  0.116931,  0.114326,  0.111891,  0.109513 
792                            ,  0.107248,  0.105096,  0.103058,  0.101019 
793                            ,  0.099151,  0.097282,  0.095527,  0.093715 
794                            ,  0.092129,  0.090544,  0.088958,  0.087429 
795                            ,  0.086014,  0.084598,  0.083239,  0.081880 
796                            ,  0.080634,  0.079388,  0.078143,  0.077010 
797                            ,  0.075878,  0.074745,  0.073669,  0.072593 
798                            ,  0.071574,  0.070612,  0.069649,  0.068686 
799                            ,  0.067780,  0.066874,  0.066025,  0.065176 
800                            ,  0.064326,  0.063533,  0.062684,  0.061948 
801                            ,  0.061212,  0.060419,  0.059740,  0.059003 
802                            ,  0.058324,  0.057644,  0.057022,  0.056342 
803                            ,  0.055663,  0.055096,  0.054473,  0.053851 
804                            ,  0.053284,  0.052718,  0.052152,  0.051585 
805                            ,  0.051019,  0.050566,  0.050000,  0.049490 
806                            ,  0.048981,  0.048528,  0.048018,  0.047508 
807                            ,  0.047055,  0.046602,  0.046149,  0.045696 
808                            ,  0.045300,  0.044904,  0.044451,  0.044054 
809                            ,  0.043658,  0.043205,  0.042865,  0.042469 
810                            ,  0.042072,  0.041733,  0.041336,  0.040997 
811                            ,  0.040657,  0.040260,  0.039921,  0.039581 
812                            ,  0.039241,  0.038958,  0.038618,  0.038335 
813                            ,  0.037995,  0.037656,  0.037373,  0.037089 
814                            ,  0.036806,  0.036467,  0.036183,  0.035900 
815                            ,  0.035617,  0.035334,  0.035108,  0.034824 
816                            ,  0.034541,  0.034315,  0.034032,  0.033805 
817                            ,  0.033522,  0.033296,  0.033069,  0.032786 
818                            ,  0.032559,  0.032333,  0.032106,  0.031880 
819                            ,  0.031653,  0.031427,  0.031200,  0.030974 
820                            ,  0.030804,  0.030578,  0.030351,  0.030125 
821                            ,  0.029955,  0.029785,  0.029558,  0.029332 
822                            ,  0.029162,  0.028992,  0.028766,  0.028596 
823                            ,  0.028426,  0.028199,  0.028086,  0.027860 
824                            ,  0.027746,  0.027633,  0.027463,  0.027293 
825                            ,  0.027180,  0.027067,  0.026954,  0.026954 
826                            ,  0.026840,  0.026727,  0.026727,  0.026614 
827                            ,  0.026614,  0.026614,  0.026557,  0.026501 
828                            ,  0.026501,  0.026501,  0.026501,  0.026501 
829                            ,  0.026501,  0.026501,  0.026501,  0.026387 
830                            ,  0.026387,  0.026387,  0.026387,  0.026387 
831                            ,  0.026387,  0.026387,  0.026387,  0.026387 
832                            ,  0.026387,  0.026387,  0.026387,  0.026387 
833                            ,  0.026387,  0.026274,  0.026274,  0.026274 
834                            ,  0.026274,  0.026274,  0.026274,  0.026274 
835                            ,  0.026274,  0.026274,  0.026274,  0.026274 
836                            ,  0.026274,  0.026274,  0.026274,  0.026161 };
837
838   Float_t xtalk[kNpasa]  = {  0.000000,  0.000000,  0.000000,  0.000000 
839                            ,  0.000000,  0.000000,  0.000000,  0.000113 
840                            ,  0.000793,  0.003058,  0.007305,  0.013194 
841                            ,  0.019706,  0.025821,  0.030634,  0.033465 
842                            ,  0.034145,  0.032729,  0.029615,  0.025198 
843                            ,  0.019989,  0.014496,  0.009003,  0.003964 
844                            , -0.000510, -0.004190, -0.007191, -0.009400 
845                            , -0.010872, -0.011835, -0.012288, -0.012288 
846                            , -0.012005, -0.011495, -0.010872, -0.010136 
847                            , -0.009343, -0.008607, -0.007871, -0.007191 
848                            , -0.006512, -0.005946, -0.005379, -0.004926 
849                            , -0.004473, -0.004077, -0.003737, -0.003398 
850                            , -0.003114, -0.002831, -0.002605, -0.002378 
851                            , -0.002208, -0.002039, -0.001869, -0.001699 
852                            , -0.001585, -0.001472, -0.001359, -0.001246 
853                            , -0.001132, -0.001019, -0.001019, -0.000906 
854                            , -0.000906, -0.000793, -0.000793, -0.000680 
855                            , -0.000680, -0.000680, -0.000566, -0.000566 
856                            , -0.000566, -0.000566, -0.000453, -0.000453 
857                            , -0.000453, -0.000453, -0.000453, -0.000453 
858                            , -0.000340, -0.000340, -0.000340, -0.000340 
859                            , -0.000340, -0.000340, -0.000340, -0.000340 
860                            , -0.000340, -0.000340, -0.000340, -0.000340 
861                            , -0.000340, -0.000227, -0.000227, -0.000227 
862                            , -0.000227, -0.000227, -0.000227, -0.000227 
863                            , -0.000227, -0.000227, -0.000227, -0.000227 
864                            , -0.000227, -0.000227, -0.000227, -0.000227 
865                            , -0.000227, -0.000227, -0.000227, -0.000227 
866                            , -0.000227, -0.000227, -0.000227, -0.000227 
867                            , -0.000227, -0.000227, -0.000227, -0.000227 
868                            , -0.000227, -0.000227, -0.000227, -0.000227 
869                            , -0.000227, -0.000227, -0.000227, -0.000227 
870                            , -0.000227, -0.000227, -0.000227, -0.000113 
871                            , -0.000113, -0.000113, -0.000113, -0.000113 
872                            , -0.000113, -0.000113, -0.000113, -0.000113 
873                            , -0.000113, -0.000113, -0.000113, -0.000113 
874                            , -0.000113, -0.000113, -0.000113, -0.000113 
875                            , -0.000113, -0.000113, -0.000113, -0.000113 
876                            , -0.000113, -0.000113, -0.000113, -0.000113 
877                            , -0.000113, -0.000113, -0.000113, -0.000113 
878                            , -0.000113, -0.000113, -0.000113, -0.000113 
879                            , -0.000113, -0.000113, -0.000113, -0.000113 
880                            , -0.000113, -0.000113, -0.000113, -0.000113 
881                            , -0.000113, -0.000113, -0.000113, -0.000113 
882                            , -0.000113, -0.000113, -0.000113, -0.000113 
883                            , -0.000113, -0.000113, -0.000113, -0.000113 
884                            , -0.000113, -0.000113, -0.000113, -0.000113 
885                            , -0.000113, -0.000113, -0.000113, -0.000113 
886                            , -0.000113, -0.000113, -0.000113, -0.000113 
887                            , -0.000113, -0.000113, -0.000113, -0.000113 
888                            , -0.000113, -0.000113, -0.000113, -0.000113 
889                            , -0.000113, -0.000113, -0.000113, -0.000113 
890                            , -0.000113, -0.000113, -0.000113,  0.000000 
891                            ,  0.000000,  0.000000,  0.000000,  0.000000 
892                            ,  0.000000,  0.000000,  0.000000,  0.000000 
893                            ,  0.000000,  0.000000,  0.000000,  0.000000 
894                            ,  0.000000,  0.000000,  0.000000,  0.000000 
895                            ,  0.000000,  0.000000,  0.000000,  0.000000 
896                            ,  0.000000,  0.000000,  0.000000,  0.000000 
897                            ,  0.000000,  0.000000,  0.000000,  0.000000 
898                            ,  0.000000,  0.000000,  0.000000,  0.000000 
899                            ,  0.000000,  0.000000,  0.000000,  0.000000 
900                            ,  0.000000,  0.000000,  0.000000,  0.000000 };
901
902   // increase CrossTalk to measurements
903   for (Int_t ipasa = 0; ipasa < kNpasa; ipasa++) {
904     xtalk[ipasa] *= 1.75;
905   }
906
907   if (fTRFsmp) delete [] fTRFsmp;
908   fTRFsmp = new Float_t[fTRFbin];
909   if (fCTsmp)  delete [] fCTsmp;
910   fCTsmp  = new Float_t[fTRFbin];
911
912   Float_t loTRF    = TMath::Max(fTRFlo / fDriftVelocity,time[0]);
913   Float_t hiTRF    = TMath::Min(fTRFhi / fDriftVelocity,time[kNpasa-1]);
914   Float_t binWidth = (hiTRF - loTRF) / ((Float_t) fTRFbin);
915
916   // Take the linear interpolation
917   for (Int_t iBin = 0; iBin < fTRFbin; iBin++) {
918
919     Float_t bin = (((Float_t) iBin) + 0.5) * binWidth + loTRF;
920     ipos1 = ipos2 = 0;
921     diff  = 0;
922     do {
923       diff = bin - time[ipos2++];
924     } while (diff > 0);
925     ipos2--;
926     if (ipos2 >= kNpasa) ipos2 = kNpasa - 1;
927     ipos1 = ipos2 - 1;
928
929     fTRFsmp[iBin] = signal[ipos2] 
930                   + diff * (signal[ipos2] - signal[ipos1]) 
931                          / (  time[ipos2] -   time[ipos1]);
932
933     fCTsmp[iBin]  = xtalk[ipos2] 
934                   + diff * (xtalk[ipos2]  -  xtalk[ipos1]) 
935                          / (  time[ipos2] -   time[ipos1]);
936
937   }
938
939 }
940
941 //_____________________________________________________________________________
942 void AliTRDparameter::SamplePRF()
943 {
944   //
945   // Samples the pad response function
946   //
947
948   const Int_t kNplan  = AliTRDgeometry::kNplan;
949   const Int_t kPRFbin = 61;
950
951   Float_t prf[kNplan][kPRFbin] = { { 0.018570, 0.022270, 0.026710, 0.032010
952                                    , 0.038350, 0.045920, 0.054930, 0.065650
953                                    , 0.078370, 0.093420, 0.111150, 0.131940
954                                    , 0.156160, 0.184160, 0.216220, 0.252470
955                                    , 0.292860, 0.337030, 0.384330, 0.433750
956                                    , 0.484010, 0.533630, 0.581150, 0.625200
957                                    , 0.664710, 0.698860, 0.727130, 0.749230
958                                    , 0.765050, 0.774540, 0.777700, 0.774540
959                                    , 0.765050, 0.749230, 0.727130, 0.698860
960                                    , 0.664710, 0.625200, 0.581150, 0.533630
961                                    , 0.484010, 0.433750, 0.384330, 0.337030
962                                    , 0.292860, 0.252470, 0.216220, 0.184160
963                                    , 0.156160, 0.131940, 0.111150, 0.093420
964                                    , 0.078370, 0.065650, 0.054930, 0.045920
965                                    , 0.038350, 0.032010, 0.026710, 0.022270
966                                    , 0.018570                               }
967                                  , { 0.015730, 0.019040, 0.023030, 0.027840
968                                    , 0.033650, 0.040650, 0.049060, 0.059160
969                                    , 0.071260, 0.085710, 0.102910, 0.123270
970                                    , 0.147240, 0.175220, 0.207590, 0.244540
971                                    , 0.286090, 0.331920, 0.381350, 0.433290
972                                    , 0.486290, 0.538710, 0.588870, 0.635280
973                                    , 0.676760, 0.712460, 0.741890, 0.764810
974                                    , 0.781150, 0.790930, 0.794180, 0.790930
975                                    , 0.781150, 0.764810, 0.741890, 0.712460
976                                    , 0.676760, 0.635280, 0.588870, 0.538710
977                                    , 0.486290, 0.433290, 0.381350, 0.331920
978                                    , 0.286090, 0.244540, 0.207590, 0.175220
979                                    , 0.147240, 0.123270, 0.102910, 0.085710
980                                    , 0.071260, 0.059160, 0.049060, 0.040650
981                                    , 0.033650, 0.027840, 0.023030, 0.019040
982                                    , 0.015730                               }
983                                  , { 0.013330, 0.016270, 0.019850, 0.024210
984                                    , 0.029510, 0.035960, 0.043790, 0.053280
985                                    , 0.064740, 0.078580, 0.095190, 0.115070
986                                    , 0.138700, 0.166570, 0.199120, 0.236660
987                                    , 0.279260, 0.326660, 0.378140, 0.432540
988                                    , 0.488260, 0.543440, 0.596200, 0.644900
989                                    , 0.688240, 0.725380, 0.755840, 0.779470
990                                    , 0.796260, 0.806280, 0.809610, 0.806280
991                                    , 0.796260, 0.779470, 0.755840, 0.725380
992                                    , 0.688240, 0.644900, 0.596200, 0.543440
993                                    , 0.488260, 0.432540, 0.378140, 0.326660
994                                    , 0.279260, 0.236660, 0.199120, 0.166570
995                                    , 0.138700, 0.115070, 0.095190, 0.078580
996                                    , 0.064740, 0.053280, 0.043790, 0.035960
997                                    , 0.029510, 0.024210, 0.019850, 0.016270
998                                    , 0.013330                               }
999                                  , { 0.011280, 0.013890, 0.017090, 0.021030
1000                                    , 0.025870, 0.031800, 0.039060, 0.047940
1001                                    , 0.058790, 0.071980, 0.087990, 0.107330
1002                                    , 0.130550, 0.158220, 0.190850, 0.228870
1003                                    , 0.272410, 0.321270, 0.374740, 0.431560
1004                                    , 0.489960, 0.547870, 0.603180, 0.654080
1005                                    , 0.699190, 0.737640, 0.769030, 0.793260
1006                                    , 0.810410, 0.820620, 0.824010, 0.820620
1007                                    , 0.810410, 0.793260, 0.769030, 0.737640
1008                                    , 0.699190, 0.654080, 0.603180, 0.547870
1009                                    , 0.489960, 0.431560, 0.374740, 0.321270
1010                                    , 0.272410, 0.228870, 0.190850, 0.158220
1011                                    , 0.130550, 0.107330, 0.087990, 0.071980
1012                                    , 0.058790, 0.047940, 0.039060, 0.031800
1013                                    , 0.025870, 0.021030, 0.017090, 0.013890
1014                                    , 0.011280                               }
1015                                  , { 0.009550, 0.011860, 0.014720, 0.018270
1016                                    , 0.022660, 0.028100, 0.034820, 0.043120
1017                                    , 0.053340, 0.065900, 0.081280, 0.100040
1018                                    , 0.122800, 0.150180, 0.182800, 0.221170
1019                                    , 0.265550, 0.315790, 0.371180, 0.430370
1020                                    , 0.491430, 0.552030, 0.609840, 0.662860
1021                                    , 0.709630, 0.749290, 0.781490, 0.806220
1022                                    , 0.823650, 0.834000, 0.837430, 0.834000
1023                                    , 0.823650, 0.806220, 0.781490, 0.749290
1024                                    , 0.709630, 0.662860, 0.609840, 0.552030
1025                                    , 0.491430, 0.430370, 0.371180, 0.315790
1026                                    , 0.265550, 0.221170, 0.182800, 0.150180
1027                                    , 0.122800, 0.100040, 0.081280, 0.065900
1028                                    , 0.053340, 0.043120, 0.034820, 0.028100
1029                                    , 0.022660, 0.018270, 0.014720, 0.011860
1030                                    , 0.009550                               }
1031                                  , { 0.008080, 0.010120, 0.012670, 0.015860
1032                                    , 0.019840, 0.024820, 0.031030, 0.038760
1033                                    , 0.048370, 0.060300, 0.075040, 0.093200
1034                                    , 0.115430, 0.142450, 0.174980, 0.213610
1035                                    , 0.258720, 0.310250, 0.367480, 0.429010
1036                                    , 0.492690, 0.555950, 0.616210, 0.671280
1037                                    , 0.719600, 0.760350, 0.793250, 0.818380
1038                                    , 0.836020, 0.846460, 0.849920, 0.846460
1039                                    , 0.836020, 0.818380, 0.793250, 0.760350
1040                                    , 0.719600, 0.671280, 0.616210, 0.555950
1041                                    , 0.492690, 0.429010, 0.367480, 0.310250
1042                                    , 0.258720, 0.213610, 0.174980, 0.142450
1043                                    , 0.115430, 0.093200, 0.075040, 0.060300
1044                                    , 0.048370, 0.038760, 0.031030, 0.024820
1045                                    , 0.019840, 0.015860, 0.012670, 0.010120
1046                                    , 0.008080                               } };
1047
1048   // More sampling precision with linear interpolation
1049   fPRFlo  = -1.5;
1050   fPRFhi  =  1.5;
1051   Float_t pad[kPRFbin];
1052   Int_t   sPRFbin = kPRFbin;  
1053   Float_t sPRFwid = (fPRFhi - fPRFlo) / ((Float_t) sPRFbin);
1054   for (Int_t iPad = 0; iPad < sPRFbin; iPad++) {
1055     pad[iPad] = ((Float_t) iPad + 0.5) * sPRFwid + fPRFlo;
1056   }
1057   fPRFbin = 500;  
1058   fPRFwid = (fPRFhi - fPRFlo) / ((Float_t) fPRFbin);
1059   fPRFpad = ((Int_t) (1.0 / fPRFwid));
1060
1061   if (fPRFsmp) delete [] fPRFsmp;
1062   fPRFsmp = new Float_t[kNplan*fPRFbin];
1063
1064   Int_t   ipos1;
1065   Int_t   ipos2;
1066   Float_t diff;
1067
1068   for (Int_t iPla = 0; iPla < kNplan; iPla++) {
1069
1070     for (Int_t iBin = 0; iBin < fPRFbin; iBin++) {
1071
1072       Float_t bin = (((Float_t) iBin) + 0.5) * fPRFwid + fPRFlo;
1073       ipos1 = ipos2 = 0;
1074       diff  = 0;
1075       do {
1076         diff = bin - pad[ipos2++];
1077       } while ((diff > 0) && (ipos2 < kPRFbin));
1078       if      (ipos2 == kPRFbin) {
1079         fPRFsmp[iPla*fPRFbin+iBin] = prf[iPla][ipos2-1];
1080       }
1081       else if (ipos2 == 1) {
1082         fPRFsmp[iPla*fPRFbin+iBin] = prf[iPla][ipos2-1];
1083       }
1084       else {
1085         ipos2--;
1086         if (ipos2 >= kPRFbin) ipos2 = kPRFbin - 1;
1087         ipos1 = ipos2 - 1;
1088         fPRFsmp[iPla*fPRFbin+iBin] = prf[iPla][ipos2] 
1089                                    + diff * (prf[iPla][ipos2] - prf[iPla][ipos1]) 
1090                                           / sPRFwid;
1091       }
1092
1093     }
1094   } 
1095
1096 }
1097
1098 //_____________________________________________________________________________
1099 void AliTRDparameter::FillLUT()
1100 {
1101   //
1102   // Create the LUT
1103   //
1104
1105   const Int_t kNplan = AliTRDgeometry::kNplan;
1106   const Int_t kNlut  = 128;
1107
1108   fLUTbin = kNplan * kNlut;
1109
1110   // The lookup table from Bogdan
1111   Float_t lut[kNplan][kNlut] = {  
1112     {
1113       0.0070, 0.0150, 0.0224, 0.0298, 0.0374, 0.0454, 0.0533, 0.0611, 
1114       0.0684, 0.0755, 0.0827, 0.0900, 0.0975, 0.1049, 0.1120, 0.1187, 
1115       0.1253, 0.1318, 0.1385, 0.1453, 0.1519, 0.1584, 0.1646, 0.1704, 
1116       0.1762, 0.1821, 0.1879, 0.1938, 0.1996, 0.2053, 0.2108, 0.2160, 
1117       0.2210, 0.2260, 0.2310, 0.2361, 0.2411, 0.2461, 0.2509, 0.2557, 
1118       0.2602, 0.2646, 0.2689, 0.2732, 0.2774, 0.2816, 0.2859, 0.2901, 
1119       0.2942, 0.2983, 0.3022, 0.3061, 0.3099, 0.3136, 0.3172, 0.3207, 
1120       0.3242, 0.3278, 0.3312, 0.3347, 0.3382, 0.3416, 0.3450, 0.3483, 
1121       0.3515, 0.3547, 0.3579, 0.3609, 0.3639, 0.3669, 0.3698, 0.3727, 
1122       0.3756, 0.3785, 0.3813, 0.3842, 0.3870, 0.3898, 0.3926, 0.3952, 
1123       0.3979, 0.4005, 0.4032, 0.4057, 0.4082, 0.4108, 0.4132, 0.4157, 
1124       0.4181, 0.4205, 0.4228, 0.4252, 0.4275, 0.4299, 0.4322, 0.4345, 
1125       0.4367, 0.4390, 0.4412, 0.4434, 0.4456, 0.4478, 0.4499, 0.4520, 
1126       0.4541, 0.4562, 0.4583, 0.4603, 0.4623, 0.4643, 0.4663, 0.4683, 
1127       0.4702, 0.4722, 0.4741, 0.4758, 0.4774, 0.4790, 0.4805, 0.4824, 
1128       0.4844, 0.4863, 0.4883, 0.4902, 0.4921, 0.4940, 0.4959, 0.4978 
1129     },
1130     {
1131       0.0072, 0.0156, 0.0235, 0.0313, 0.0394, 0.0478, 0.0561, 0.0642, 
1132       0.0718, 0.0792, 0.0868, 0.0947, 0.1025, 0.1101, 0.1172, 0.1241, 
1133       0.1309, 0.1378, 0.1449, 0.1518, 0.1586, 0.1650, 0.1710, 0.1770, 
1134       0.1830, 0.1891, 0.1952, 0.2011, 0.2070, 0.2125, 0.2177, 0.2229, 
1135       0.2280, 0.2332, 0.2383, 0.2435, 0.2484, 0.2533, 0.2581, 0.2627, 
1136       0.2670, 0.2714, 0.2757, 0.2799, 0.2842, 0.2884, 0.2927, 0.2968, 
1137       0.3008, 0.3048, 0.3086, 0.3123, 0.3159, 0.3195, 0.3231, 0.3266, 
1138       0.3301, 0.3335, 0.3370, 0.3404, 0.3438, 0.3471, 0.3504, 0.3536, 
1139       0.3567, 0.3598, 0.3628, 0.3657, 0.3686, 0.3715, 0.3744, 0.3772, 
1140       0.3800, 0.3828, 0.3856, 0.3884, 0.3911, 0.3938, 0.3965, 0.3991, 
1141       0.4016, 0.4042, 0.4067, 0.4092, 0.4116, 0.4140, 0.4164, 0.4187, 
1142       0.4211, 0.4234, 0.4257, 0.4280, 0.4302, 0.4325, 0.4347, 0.4369, 
1143       0.4391, 0.4413, 0.4434, 0.4456, 0.4477, 0.4497, 0.4518, 0.4538, 
1144       0.4558, 0.4578, 0.4598, 0.4618, 0.4637, 0.4656, 0.4675, 0.4694, 
1145       0.4713, 0.4732, 0.4750, 0.4766, 0.4781, 0.4797, 0.4813, 0.4832, 
1146       0.4851, 0.4870, 0.4888, 0.4906, 0.4925, 0.4942, 0.4960, 0.4978
1147     },
1148     {
1149       0.0075, 0.0163, 0.0246, 0.0328, 0.0415, 0.0504, 0.0592, 0.0674, 
1150       0.0753, 0.0832, 0.0914, 0.0996, 0.1077, 0.1154, 0.1225, 0.1296, 
1151       0.1369, 0.1442, 0.1515, 0.1585, 0.1652, 0.1714, 0.1776, 0.1839, 
1152       0.1902, 0.1965, 0.2025, 0.2085, 0.2141, 0.2194, 0.2247, 0.2299, 
1153       0.2352, 0.2405, 0.2457, 0.2507, 0.2557, 0.2604, 0.2649, 0.2693, 
1154       0.2737, 0.2780, 0.2823, 0.2867, 0.2909, 0.2951, 0.2992, 0.3033, 
1155       0.3072, 0.3110, 0.3146, 0.3182, 0.3218, 0.3253, 0.3288, 0.3323, 
1156       0.3357, 0.3392, 0.3426, 0.3459, 0.3492, 0.3524, 0.3555, 0.3586, 
1157       0.3616, 0.3645, 0.3674, 0.3703, 0.3731, 0.3759, 0.3787, 0.3815, 
1158       0.3843, 0.3870, 0.3897, 0.3925, 0.3950, 0.3976, 0.4002, 0.4027, 
1159       0.4052, 0.4076, 0.4101, 0.4124, 0.4148, 0.4171, 0.4194, 0.4217, 
1160       0.4239, 0.4262, 0.4284, 0.4306, 0.4328, 0.4350, 0.4371, 0.4393, 
1161       0.4414, 0.4435, 0.4455, 0.4476, 0.4496, 0.4516, 0.4536, 0.4555, 
1162       0.4575, 0.4594, 0.4613, 0.4632, 0.4650, 0.4669, 0.4687, 0.4705, 
1163       0.4723, 0.4741, 0.4758, 0.4773, 0.4789, 0.4804, 0.4821, 0.4839, 
1164       0.4857, 0.4875, 0.4893, 0.4910, 0.4928, 0.4945, 0.4961, 0.4978
1165     },
1166     {
1167       0.0078, 0.0171, 0.0258, 0.0345, 0.0438, 0.0532, 0.0624, 0.0708, 
1168       0.0791, 0.0875, 0.0962, 0.1048, 0.1130, 0.1206, 0.1281, 0.1356, 
1169       0.1432, 0.1508, 0.1582, 0.1651, 0.1716, 0.1780, 0.1845, 0.1910, 
1170       0.1975, 0.2038, 0.2099, 0.2155, 0.2210, 0.2263, 0.2317, 0.2371, 
1171       0.2425, 0.2477, 0.2528, 0.2578, 0.2626, 0.2671, 0.2715, 0.2759, 
1172       0.2803, 0.2846, 0.2890, 0.2933, 0.2975, 0.3016, 0.3056, 0.3095, 
1173       0.3132, 0.3168, 0.3204, 0.3239, 0.3274, 0.3309, 0.3344, 0.3378, 
1174       0.3412, 0.3446, 0.3479, 0.3511, 0.3543, 0.3574, 0.3603, 0.3633, 
1175       0.3662, 0.3690, 0.3718, 0.3747, 0.3774, 0.3802, 0.3829, 0.3857, 
1176       0.3883, 0.3910, 0.3936, 0.3962, 0.3987, 0.4012, 0.4037, 0.4061, 
1177       0.4085, 0.4109, 0.4132, 0.4155, 0.4177, 0.4200, 0.4222, 0.4244, 
1178       0.4266, 0.4288, 0.4309, 0.4331, 0.4352, 0.4373, 0.4394, 0.4414, 
1179       0.4435, 0.4455, 0.4475, 0.4494, 0.4514, 0.4533, 0.4552, 0.4571, 
1180       0.4590, 0.4608, 0.4626, 0.4645, 0.4662, 0.4680, 0.4698, 0.4715, 
1181       0.4733, 0.4750, 0.4766, 0.4781, 0.4796, 0.4812, 0.4829, 0.4846, 
1182       0.4863, 0.4880, 0.4897, 0.4914, 0.4930, 0.4946, 0.4963, 0.4979
1183     },
1184     {
1185       0.0081, 0.0178, 0.0270, 0.0364, 0.0463, 0.0562, 0.0656, 0.0744, 
1186       0.0831, 0.0921, 0.1013, 0.1102, 0.1183, 0.1261, 0.1339, 0.1419, 
1187       0.1499, 0.1576, 0.1648, 0.1715, 0.1782, 0.1849, 0.1917, 0.1984, 
1188       0.2048, 0.2110, 0.2167, 0.2223, 0.2278, 0.2333, 0.2389, 0.2444, 
1189       0.2497, 0.2548, 0.2598, 0.2645, 0.2691, 0.2735, 0.2780, 0.2824, 
1190       0.2868, 0.2912, 0.2955, 0.2997, 0.3038, 0.3078, 0.3116, 0.3152, 
1191       0.3188, 0.3224, 0.3259, 0.3294, 0.3329, 0.3364, 0.3398, 0.3432, 
1192       0.3465, 0.3497, 0.3529, 0.3561, 0.3591, 0.3620, 0.3649, 0.3677, 
1193       0.3705, 0.3733, 0.3761, 0.3788, 0.3816, 0.3843, 0.3869, 0.3896, 
1194       0.3922, 0.3948, 0.3973, 0.3998, 0.4022, 0.4047, 0.4070, 0.4094, 
1195       0.4117, 0.4139, 0.4162, 0.4184, 0.4206, 0.4227, 0.4249, 0.4270, 
1196       0.4291, 0.4313, 0.4334, 0.4354, 0.4375, 0.4395, 0.4415, 0.4435, 
1197       0.4455, 0.4474, 0.4493, 0.4512, 0.4531, 0.4550, 0.4568, 0.4586, 
1198       0.4604, 0.4622, 0.4639, 0.4657, 0.4674, 0.4691, 0.4708, 0.4725, 
1199       0.4742, 0.4758, 0.4773, 0.4788, 0.4803, 0.4819, 0.4836, 0.4852, 
1200       0.4869, 0.4885, 0.4901, 0.4917, 0.4933, 0.4948, 0.4964, 0.4979
1201     },
1202     {
1203       0.0085, 0.0189, 0.0288, 0.0389, 0.0497, 0.0603, 0.0699, 0.0792, 
1204       0.0887, 0.0985, 0.1082, 0.1170, 0.1253, 0.1336, 0.1421, 0.1505, 
1205       0.1587, 0.1662, 0.1733, 0.1803, 0.1874, 0.1945, 0.2014, 0.2081, 
1206       0.2143, 0.2201, 0.2259, 0.2316, 0.2374, 0.2431, 0.2487, 0.2541, 
1207       0.2593, 0.2642, 0.2689, 0.2735, 0.2781, 0.2826, 0.2872, 0.2917, 
1208       0.2961, 0.3003, 0.3045, 0.3086, 0.3125, 0.3162, 0.3198, 0.3235, 
1209       0.3270, 0.3306, 0.3342, 0.3377, 0.3411, 0.3446, 0.3479, 0.3511, 
1210       0.3543, 0.3575, 0.3605, 0.3634, 0.3663, 0.3691, 0.3720, 0.3748, 
1211       0.3775, 0.3803, 0.3830, 0.3857, 0.3884, 0.3911, 0.3937, 0.3962, 
1212       0.3987, 0.4012, 0.4036, 0.4060, 0.4084, 0.4107, 0.4129, 0.4152, 
1213       0.4174, 0.4196, 0.4218, 0.4239, 0.4261, 0.4282, 0.4303, 0.4324, 
1214       0.4344, 0.4365, 0.4385, 0.4405, 0.4425, 0.4445, 0.4464, 0.4483, 
1215       0.4502, 0.4521, 0.4539, 0.4558, 0.4576, 0.4593, 0.4611, 0.4629, 
1216       0.4646, 0.4663, 0.4680, 0.4697, 0.4714, 0.4730, 0.4747, 0.4759, 
1217       0.4769, 0.4780, 0.4790, 0.4800, 0.4811, 0.4827, 0.4843, 0.4859, 
1218       0.4874, 0.4889, 0.4905, 0.4920, 0.4935, 0.4950, 0.4965, 0.4979
1219     }
1220   }; 
1221
1222   if (fLUT) delete [] fLUT;
1223   fLUT = new Float_t[fLUTbin];
1224
1225   for (Int_t iplan = 0; iplan < kNplan; iplan++) {
1226     for (Int_t ilut  = 0; ilut  < kNlut; ilut++) {
1227       fLUT[iplan*kNlut+ilut] = lut[iplan][ilut];
1228     }
1229   }
1230
1231 }
1232
1233 //_____________________________________________________________________________
1234 void AliTRDparameter::SetTiltingAngle(Float_t v)
1235 {
1236   //
1237   // Set the tilting angle for the readout pads
1238   //
1239
1240   fTiltingAngle = TMath::Tan(TMath::Pi()/180.0 * v);
1241
1242 }
1243
1244 //_____________________________________________________________________________
1245 Float_t AliTRDparameter::GetTiltingAngle() const
1246 {
1247   //
1248   // Get the tilting angle for the readout pads
1249   //
1250
1251   return 180.0 / TMath::Pi() * TMath::ATan(fTiltingAngle);
1252
1253 }
1254
1255 //_____________________________________________________________________________
1256 Float_t AliTRDparameter::GetDiffusionL(Float_t vd, Float_t b)
1257 {
1258   //
1259   // Returns the longitudinal diffusion coefficient for a given drift 
1260   // velocity <vd> and a B-field <b> for Xe/CO2 (15%).
1261   // The values are according to a GARFIELD simulation.
1262   //
1263
1264   const Int_t kNb = 5;
1265   Float_t p0[kNb] = {  0.007440,  0.007493,  0.007513,  0.007672,  0.007831 };
1266   Float_t p1[kNb] = {  0.019252,  0.018912,  0.018636,  0.018012,  0.017343 };
1267   Float_t p2[kNb] = { -0.005042, -0.004926, -0.004867, -0.004650, -0.004424 };
1268   Float_t p3[kNb] = {  0.000195,  0.000189,  0.000195,  0.000182,  0.000169 };
1269
1270   Int_t ib = ((Int_t) (10 * (b - 0.15)));
1271   ib       = TMath::Max(  0,ib);
1272   ib       = TMath::Min(kNb,ib);
1273
1274   Float_t diff = p0[ib] 
1275                + p1[ib] * vd
1276                + p2[ib] * vd*vd
1277                + p3[ib] * vd*vd*vd;
1278
1279   return diff;
1280
1281 }
1282
1283 //_____________________________________________________________________________
1284 Float_t AliTRDparameter::GetDiffusionT(Float_t vd, Float_t b)
1285 {
1286   //
1287   // Returns the transverse diffusion coefficient for a given drift 
1288   // velocity <vd> and a B-field <b> for Xe/CO2 (15%).
1289   // The values are according to a GARFIELD simulation.
1290   //
1291
1292   const Int_t kNb = 5;
1293   Float_t p0[kNb] = {  0.009550,  0.009599,  0.009674,  0.009757,  0.009850 };
1294   Float_t p1[kNb] = {  0.006667,  0.006539,  0.006359,  0.006153,  0.005925 };
1295   Float_t p2[kNb] = { -0.000853, -0.000798, -0.000721, -0.000635, -0.000541 };
1296   Float_t p3[kNb] = {  0.000131,  0.000122,  0.000111,  0.000098,  0.000085 };
1297
1298   Int_t ib = ((Int_t) (10 * (b - 0.15)));
1299   ib       = TMath::Max(  0,ib);
1300   ib       = TMath::Min(kNb,ib);
1301
1302   Float_t diff = p0[ib] 
1303                + p1[ib] * vd
1304                + p2[ib] * vd*vd
1305                + p3[ib] * vd*vd*vd;
1306
1307   return diff;
1308
1309 }
1310
1311 //_____________________________________________________________________________
1312 Float_t AliTRDparameter::GetOmegaTau(Float_t vd, Float_t b)
1313 {
1314   //
1315   // Returns omega*tau (tan(Lorentz-angle)) for a given drift velocity <vd> 
1316   // and a B-field <b> for Xe/CO2 (15%).
1317   // The values are according to a GARFIELD simulation.
1318   //
1319
1320   const Int_t kNb = 5;
1321   Float_t p0[kNb] = {  0.004810,  0.007412,  0.010252,  0.013409,  0.016888 };
1322   Float_t p1[kNb] = {  0.054875,  0.081534,  0.107333,  0.131983,  0.155455 };
1323   Float_t p2[kNb] = { -0.008682, -0.012896, -0.016987, -0.020880, -0.024623 };
1324   Float_t p3[kNb] = {  0.000155,  0.000238,  0.000330,  0.000428,  0.000541 };
1325
1326   Int_t ib = ((Int_t) (10 * (b - 0.15)));
1327   ib       = TMath::Max(  0,ib);
1328   ib       = TMath::Min(kNb,ib);
1329
1330   Float_t alphaL = p0[ib] 
1331                  + p1[ib] * vd
1332                  + p2[ib] * vd*vd
1333                  + p3[ib] * vd*vd*vd;
1334
1335   return TMath::Tan(alphaL);
1336
1337 }
1338
1339 //_____________________________________________________________________________
1340 Double_t AliTRDparameter::LUTposition(Int_t iplane, Double_t ampL 
1341                                                   , Double_t ampC
1342                                                   , Double_t ampR) const
1343 {
1344   //
1345   // Calculates the cluster position using the lookup table.
1346   // Method provided by Bogdan Vulpescu.
1347   //
1348
1349   const Int_t kNplan = AliTRDgeometry::kNplan;
1350   const Int_t kNlut  = 128;
1351
1352   Double_t pos;
1353   Double_t x = 0.0;
1354   Double_t xmin;
1355   Double_t xmax;
1356   Double_t xwid;
1357
1358   Int_t    side = 0;
1359   Int_t    ix;
1360
1361   Double_t xMin[kNplan] = { 0.006492, 0.006377, 0.006258, 0.006144, 0.006030, 0.005980 };
1362   Double_t xMax[kNplan] = { 0.960351, 0.965870, 0.970445, 0.974352, 0.977667, 0.996101 };
1363
1364   if      (ampL > ampR) {
1365     x    = (ampL - ampR) / ampC;
1366     side = -1;
1367   } 
1368   else if (ampL < ampR) {
1369     x    = (ampR - ampL) / ampC;
1370     side = +1;
1371   }
1372
1373   if (ampL != ampR) {
1374
1375     xmin = xMin[iplane] + 0.000005;
1376     xmax = xMax[iplane] - 0.000005;
1377     xwid = (xmax - xmin) / 127.0;
1378
1379     if      (x < xmin) {
1380       pos = 0.0000;
1381     } 
1382     else if (x > xmax) {
1383       pos = side * 0.5000;
1384     } 
1385     else {
1386       ix  = (Int_t) ((x - xmin) / xwid);
1387       pos = side * fLUT[iplane*kNlut+ix];
1388     }
1389        
1390   } 
1391   else {
1392
1393     pos = 0.0;
1394
1395   }
1396
1397   return pos;
1398
1399 }