]> git.uio.no Git - u/mrichter/AliRoot.git/blob - TRD/AliTRDSimParam.cxx
Preliminary files for CMake
[u/mrichter/AliRoot.git] / TRD / AliTRDSimParam.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 /* $Id$ */
17
18 ////////////////////////////////////////////////////////////////////////////
19 //                                                                        //
20 // Class containing constant simulation parameters                        //
21 //                                                                        //
22 // Request an instance with AliTRDSimParam::Instance()                    //
23 // Then request the needed values                                         //
24 //                                                                        //
25 ////////////////////////////////////////////////////////////////////////////
26
27 #include <TMath.h>
28
29 #include "AliRun.h"
30
31 #include "AliTRDSimParam.h"
32
33 ClassImp(AliTRDSimParam)
34
35 AliTRDSimParam *AliTRDSimParam::fgInstance   = 0;
36 Bool_t          AliTRDSimParam::fgTerminated = kFALSE;
37
38 //_ singleton implementation __________________________________________________
39 AliTRDSimParam* AliTRDSimParam::Instance()
40 {
41   //
42   // Singleton implementation
43   // Returns an instance of this class, it is created if neccessary
44   // 
45   
46   if (fgTerminated != kFALSE) {
47     return 0;
48   }
49
50   if (fgInstance == 0) {
51     fgInstance = new AliTRDSimParam();
52   }  
53
54   return fgInstance;
55
56 }
57
58 //_ singleton implementation __________________________________________________
59 void AliTRDSimParam::Terminate()
60 {
61   //
62   // Singleton implementation
63   // Deletes the instance of this class and sets the terminated flag,
64   // instances cannot be requested anymore
65   // This function can be called several times.
66   //
67   
68   fgTerminated = kTRUE;
69   
70   if (fgInstance != 0) {
71     delete fgInstance;
72     fgInstance = 0;
73   }
74
75 }
76
77 //_____________________________________________________________________________
78 AliTRDSimParam::AliTRDSimParam()
79   :TObject()
80   ,fGasGain(0.0)
81   ,fNoise(0.0)
82   ,fChipGain(0.0)
83   ,fADCoutRange(0.0)
84   ,fADCinRange(0.0)
85   ,fADCbaseline(0)
86   ,fDiffusionOn(kFALSE)
87   ,fElAttachOn(kFALSE)
88   ,fElAttachProp(0.0)
89   ,fTRFOn(kFALSE)
90   ,fTRFsmp(0)
91   ,fTRFbin(0)
92   ,fTRFlo(0.0)
93   ,fTRFhi(0.0)
94   ,fTRFwid(0.0)
95   ,fCTOn(kFALSE)
96   ,fCTsmp(0)
97   ,fAnodeWireOffset(0.0)
98   ,fPadCoupling(0.0)
99   ,fTimeCoupling(0.0)
100   ,fTimeStructOn(kFALSE)
101   ,fPRFOn(kFALSE)
102   ,fGasMixture(0)
103 {
104   //
105   // Default constructor
106   //
107   
108   Init();
109
110 }
111
112 //_____________________________________________________________________________
113 void AliTRDSimParam::Init()
114 {
115   // 
116   // Default initializiation
117   //
118   
119   // The default parameter for the digitization
120   fGasGain           = 4000.0;
121   fChipGain          =   12.4;
122   fNoise             = 1250.0;
123   fADCoutRange       = 1023.0;          // 10-bit ADC
124   fADCinRange        = 2000.0;          // 2V input range
125   // Go back to 0 again, just to be consistent with reconstruction
126   fADCbaseline       =      0;
127   //fADCbaseline       =   10;
128
129   // Diffusion on
130   fDiffusionOn       = kTRUE;
131   
132   // Propability for electron attachment
133   fElAttachOn        = kFALSE;
134   fElAttachProp      = 0.0;
135
136   // The time response function
137   fTRFOn             = kTRUE;
138
139   // The cross talk
140   fCTOn              = kTRUE;
141
142   // The pad coupling factor
143   // Use 0.46, instead of the theroetical value 0.3, since it reproduces better 
144   // the test beam data, even tough it is not understood why.
145   fPadCoupling       = 0.46;
146
147   // The time coupling factor (same number as for the TPC)
148   fTimeCoupling      = 0.4;
149
150   // Distance of first Anode wire from first pad edge
151   fAnodeWireOffset   = 0.25;
152
153   // Use drift time maps
154   fTimeStructOn      = kTRUE;
155   
156   // The pad response function
157   fPRFOn             = kTRUE;
158
159   // The gas mixture, default Xenon
160   fGasMixture        = kXenon;
161
162   ReInit();
163
164 }
165
166 //_____________________________________________________________________________
167 AliTRDSimParam::~AliTRDSimParam() 
168 {
169   //
170   // Destructor
171   //
172   
173   if (fTRFsmp) {
174     delete [] fTRFsmp;
175     fTRFsmp = 0;
176   }
177
178   if (fCTsmp) {
179     delete [] fCTsmp;
180     fCTsmp  = 0;
181   }
182
183 }
184
185 //_____________________________________________________________________________
186 AliTRDSimParam::AliTRDSimParam(const AliTRDSimParam &p)
187   :TObject(p)
188   ,fGasGain(p.fGasGain)
189   ,fNoise(p.fNoise)
190   ,fChipGain(p.fChipGain)
191   ,fADCoutRange(p.fADCoutRange)
192   ,fADCinRange(p.fADCinRange)
193   ,fADCbaseline(p.fADCbaseline)
194   ,fDiffusionOn(p.fDiffusionOn)
195   ,fElAttachOn(p.fElAttachOn)
196   ,fElAttachProp(p.fElAttachProp)
197   ,fTRFOn(p.fTRFOn)
198   ,fTRFsmp(0)
199   ,fTRFbin(p.fTRFbin)
200   ,fTRFlo(p.fTRFlo)
201   ,fTRFhi(p.fTRFhi)
202   ,fTRFwid(p.fTRFwid)
203   ,fCTOn(p.fCTOn)
204   ,fCTsmp(0)
205   ,fAnodeWireOffset(p.fAnodeWireOffset)
206   ,fPadCoupling(p.fPadCoupling)
207   ,fTimeCoupling(p.fTimeCoupling)
208   ,fTimeStructOn(p.fTimeStructOn)
209   ,fPRFOn(p.fPRFOn)
210   ,fGasMixture(p.fGasMixture)
211 {
212   //
213   // Copy constructor
214   //
215
216   Int_t iBin = 0;
217
218   if (((AliTRDSimParam &) p).fTRFsmp) {
219     delete [] ((AliTRDSimParam &) p).fTRFsmp;
220   }
221   ((AliTRDSimParam &) p).fTRFsmp = new Float_t[fTRFbin];
222   for (iBin = 0; iBin < fTRFbin; iBin++) {
223     ((AliTRDSimParam &) p).fTRFsmp[iBin] = fTRFsmp[iBin];
224   }                                                                             
225
226   if (((AliTRDSimParam &) p).fCTsmp) {
227     delete [] ((AliTRDSimParam &) p).fCTsmp;
228   }
229   ((AliTRDSimParam &) p).fCTsmp  = new Float_t[fTRFbin];
230   for (iBin = 0; iBin < fTRFbin; iBin++) {
231     ((AliTRDSimParam &) p).fCTsmp[iBin] = fCTsmp[iBin];
232   }                                                                             
233
234 }
235
236 //_____________________________________________________________________________
237 AliTRDSimParam &AliTRDSimParam::operator=(const AliTRDSimParam &p)
238 {
239   //
240   // Assignment operator
241   //
242
243   if (this != &p) {
244     ((AliTRDSimParam &) p).Copy(*this);
245   }
246
247   return *this;
248
249 }
250
251 //_____________________________________________________________________________
252 void AliTRDSimParam::Copy(TObject &p) const
253 {
254   //
255   // Copy function
256   //
257   
258   AliTRDSimParam *target = dynamic_cast<AliTRDSimParam *> (&p);
259   if (!target) {
260     return;
261   }
262
263   target->fGasGain            = fGasGain;
264   target->fNoise              = fNoise;
265   target->fChipGain           = fChipGain;  
266   target->fADCoutRange        = fADCoutRange;
267   target->fADCinRange         = fADCinRange;
268   target->fADCbaseline        = fADCbaseline; 
269   target->fDiffusionOn        = fDiffusionOn; 
270   target->fElAttachOn         = fElAttachOn;
271   target->fElAttachProp       = fElAttachProp;
272   target->fTRFOn              = fTRFOn;
273   target->fTRFbin             = fTRFbin;
274   target->fTRFlo              = fTRFlo;
275   target->fTRFhi              = fTRFhi;
276   target->fTRFwid             = fTRFwid;
277   target->fCTOn               = fCTOn;
278   target->fAnodeWireOffset    = fAnodeWireOffset;
279   target->fPadCoupling        = fPadCoupling;
280   target->fTimeCoupling       = fTimeCoupling;
281   target->fPRFOn              = fPRFOn;
282   target->fGasMixture         = fGasMixture;
283
284   if (target->fTRFsmp) {
285     delete[] target->fTRFsmp;
286   }
287   target->fTRFsmp = new Float_t[fTRFbin];
288   for (Int_t iBin = 0; iBin < fTRFbin; iBin++) {
289     target->fTRFsmp[iBin] = fTRFsmp[iBin];
290   }
291
292   if (target->fCTsmp) {
293     delete[] target->fCTsmp;
294   }
295   target->fCTsmp  = new Float_t[fTRFbin];
296   for (Int_t iBin = 0; iBin < fTRFbin; iBin++) {
297     target->fCTsmp[iBin]  = fCTsmp[iBin];
298   }
299   
300 }
301
302 //_____________________________________________________________________________
303 void AliTRDSimParam::ReInit()
304 {
305   //
306   // Reinitializes the parameter class after a change
307   //
308
309   if      (fGasMixture == kXenon) {
310     // The range and the binwidth for the sampled TRF 
311     fTRFbin = 200;
312     // Start 0.2 mus before the signal
313     fTRFlo  = -0.4;
314     // End the maximum drift time after the signal 
315     fTRFhi  =  3.58;
316     // Standard gas gain
317     fGasGain = 4000.0;
318   }
319   else if (fGasMixture == kArgon) {
320     // The range and the binwidth for the sampled TRF 
321     fTRFbin  =  50;
322     // Start 0.2 mus before the signal
323     fTRFlo   =  0.02;
324     // End the maximum drift time after the signal 
325     fTRFhi   =  1.98;
326     // Higher gas gain
327     fGasGain = 8000.0;
328   }
329   else {
330     AliFatal("Not a valid gas mixture!");
331     exit(1);
332   }
333   fTRFwid = (fTRFhi - fTRFlo) / ((Float_t) fTRFbin);
334
335   // Create the sampled TRF
336   SampleTRF();
337
338 }
339
340 //_____________________________________________________________________________
341 void AliTRDSimParam::SampleTRF()
342 {
343   //
344   // Samples the new time response function.
345   //
346
347   Int_t ipasa = 0;
348
349   // Xenon
350   // From Antons measurements with Fe55 source, adjusted by C. Lippmann.
351   // time bins are -0.4, -0.38, -0.36, ...., 3.54, 3.56, 3.58 microseconds
352   const Int_t kNpasa     = 200;  // kNpasa should be equal to fTRFbin!
353   Float_t xtalk[kNpasa];
354   Float_t signal[kNpasa]     = { 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000
355                                , 0.0002, 0.0007, 0.0026, 0.0089, 0.0253, 0.0612, 0.1319
356                                , 0.2416, 0.3913, 0.5609, 0.7295, 0.8662, 0.9581, 1.0000
357                                , 0.9990, 0.9611, 0.8995, 0.8269, 0.7495, 0.6714, 0.5987
358                                , 0.5334, 0.4756, 0.4249, 0.3811, 0.3433, 0.3110, 0.2837
359                                , 0.2607, 0.2409, 0.2243, 0.2099, 0.1974, 0.1868, 0.1776
360                                , 0.1695, 0.1627, 0.1566, 0.1509, 0.1457, 0.1407, 0.1362
361                                , 0.1317, 0.1274, 0.1233, 0.1196, 0.1162, 0.1131, 0.1102
362                                , 0.1075, 0.1051, 0.1026, 0.1004, 0.0979, 0.0956, 0.0934
363                                , 0.0912, 0.0892, 0.0875, 0.0858, 0.0843, 0.0829, 0.0815
364                                , 0.0799, 0.0786, 0.0772, 0.0757, 0.0741, 0.0729, 0.0718
365                                , 0.0706, 0.0692, 0.0680, 0.0669, 0.0655, 0.0643, 0.0630
366                                , 0.0618, 0.0607, 0.0596, 0.0587, 0.0576, 0.0568, 0.0558
367                                , 0.0550, 0.0541, 0.0531, 0.0522, 0.0513, 0.0505, 0.0497
368                                , 0.0490, 0.0484, 0.0474, 0.0465, 0.0457, 0.0449, 0.0441
369                                , 0.0433, 0.0425, 0.0417, 0.0410, 0.0402, 0.0395, 0.0388
370                                , 0.0381, 0.0374, 0.0368, 0.0361, 0.0354, 0.0348, 0.0342
371                                , 0.0336, 0.0330, 0.0324, 0.0318, 0.0312, 0.0306, 0.0301
372                                , 0.0296, 0.0290, 0.0285, 0.0280, 0.0275, 0.0270, 0.0265
373                                , 0.0260, 0.0256, 0.0251, 0.0246, 0.0242, 0.0238, 0.0233
374                                , 0.0229, 0.0225, 0.0221, 0.0217, 0.0213, 0.0209, 0.0206
375                                , 0.0202, 0.0198, 0.0195, 0.0191, 0.0188, 0.0184, 0.0181
376                                , 0.0178, 0.0175, 0.0171, 0.0168, 0.0165, 0.0162, 0.0159
377                                , 0.0157, 0.0154, 0.0151, 0.0148, 0.0146, 0.0143, 0.0140
378                                , 0.0138, 0.0135, 0.0133, 0.0131, 0.0128, 0.0126, 0.0124
379                                , 0.0121, 0.0119, 0.0120, 0.0115, 0.0113, 0.0111, 0.0109
380                                , 0.0107, 0.0105, 0.0103, 0.0101, 0.0100, 0.0098, 0.0096
381                                , 0.0094, 0.0092, 0.0091, 0.0089, 0.0088, 0.0086, 0.0084
382                                , 0.0083, 0.0081, 0.0080, 0.0078 };
383   signal[0] = 0.0;
384   signal[1] = 0.0;
385   signal[2] = 0.0;
386   // With undershoot, positive peak corresponds to ~3% of the main signal:
387   for (ipasa = 3; ipasa < kNpasa; ipasa++) {
388     xtalk[ipasa] = 0.2 * (signal[ipasa-2] - signal[ipasa-3]);
389   }
390   xtalk[0]  = 0.0;   
391   xtalk[1]  = 0.0;  
392   xtalk[2]  = 0.0;  
393
394   // Argon
395   // Ar measurement with Fe55 source by Anton
396   // time bins are 0.02, 0.06, 0.10, ...., 1.90, 1.94, 1.98 microseconds
397   const Int_t kNpasaAr = 50;
398   Float_t xtalkAr[kNpasaAr];
399   Float_t signalAr[kNpasaAr] = { -0.01,  0.01,  0.00,  0.00,  0.01
400                                , -0.01,  0.01,  2.15, 22.28, 55.53
401                                , 68.52, 58.21, 40.92, 27.12, 18.49
402                                , 13.42, 10.48,  8.67,  7.49,  6.55
403                                ,  5.71,  5.12,  4.63,  4.22,  3.81
404                                ,  3.48,  3.20,  2.94,  2.77,  2.63
405                                ,  2.50,  2.37,  2.23,  2.13,  2.03
406                                ,  1.91,  1.83,  1.75,  1.68,  1.63
407                                ,  1.56,  1.49,  1.50,  1.49,  1.29
408                                ,  1.19,  1.21,  1.21,  1.20,  1.10 };
409   // Normalization to maximum
410   for (ipasa = 0; ipasa < kNpasaAr; ipasa++) {
411     signalAr[ipasa] /= 68.52;
412   }
413   signalAr[0] = 0.0;
414   signalAr[1] = 0.0;
415   signalAr[2] = 0.0;
416   // With undershoot, positive peak corresponds to ~3% of the main signal:
417   for (ipasa = 3; ipasa < kNpasaAr; ipasa++) {
418     xtalkAr[ipasa] = 0.2 * (signalAr[ipasa-2] - signalAr[ipasa-3]);
419   }
420   xtalkAr[0]  = 0.0;   
421   xtalkAr[1]  = 0.0;  
422   xtalkAr[2]  = 0.0;  
423
424   if (fTRFsmp) {
425     delete [] fTRFsmp;
426   }
427   fTRFsmp = new Float_t[fTRFbin];
428
429   if (fCTsmp)  {
430     delete [] fCTsmp;
431   }
432   fCTsmp  = new Float_t[fTRFbin];
433
434   if      (fGasMixture == kXenon) {
435     if (fTRFbin != kNpasa) {
436       AliError("Array mismatch (xenon)\n\n");
437     }
438   }
439   else if (fGasMixture == kArgon) {
440     if (fTRFbin != kNpasaAr) {
441       AliError("Array mismatch (argon)\n\n");
442     }
443   }
444
445   for (Int_t iBin = 0; iBin < fTRFbin; iBin++) {
446     if      (fGasMixture == kXenon) {
447       fTRFsmp[iBin] = signal[iBin];
448       fCTsmp[iBin]  = xtalk[iBin];
449     }
450     else if (fGasMixture == kArgon) {
451       fTRFsmp[iBin] = signalAr[iBin];
452       fCTsmp[iBin]  = xtalkAr[iBin];
453     }
454   }
455
456 }
457
458 //_____________________________________________________________________________
459 Double_t AliTRDSimParam::TimeResponse(Double_t time) const
460 {
461   //
462   // Applies the preamp shaper time response
463   // (We assume a signal rise time of 0.2us = fTRFlo/2.
464   //
465
466   Int_t iBin = ((Int_t) ((time - fTRFlo/2.0) / fTRFwid)); 
467   if ((iBin >=       0) && 
468       (iBin <  fTRFbin)) {
469     return fTRFsmp[iBin];
470   }
471   else {
472     return 0.0;
473   }    
474
475 }
476
477 //_____________________________________________________________________________
478 Double_t AliTRDSimParam::CrossTalk(Double_t time) const
479 {
480   //
481   // Applies the pad-pad capacitive cross talk
482   //
483
484   Int_t iBin = ((Int_t) ((time - fTRFlo) / fTRFwid)); 
485   if ((iBin >=       0) && 
486       (iBin <  fTRFbin)) {
487     return fCTsmp[iBin];
488   }
489   else {
490     return 0.0;
491   }    
492
493 }