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