]> git.uio.no Git - u/mrichter/AliRoot.git/blob - TRD/AliTRDSimParam.cxx
New TRF parametrization as a workaround solution
[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   ,fADCthreshold(0)
86   ,fADCbaseline(0)
87   ,fDiffusionOn(kFALSE)
88   ,fElAttachOn(kFALSE)
89   ,fElAttachProp(0.0)
90   ,fTRFOn(kFALSE)
91   ,fTRFsmp(0)
92   ,fTRFbin(0)
93   ,fTRFlo(0.0)
94   ,fTRFhi(0.0)
95   ,fTRFwid(0.0)
96   ,fCTOn(kFALSE)
97   ,fCTsmp(0)
98   ,fAnodeWireOffset(0.0)
99   ,fPadCoupling(0.0)
100   ,fTimeCoupling(0.0)
101   ,fTimeStructOn(kFALSE)
102   ,fPRFOn(kFALSE)
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   fADCthreshold      =    3;
126   // Go back to 0 again, just to be consistent with reconstruction
127   fADCbaseline       =    0;
128   //fADCbaseline       =   10;
129
130   // Diffusion on
131   fDiffusionOn       = kTRUE;
132   
133   // Propability for electron attachment
134   fElAttachOn        = kFALSE;
135   fElAttachProp      = 0.0;
136
137   // The time response function
138   fTRFOn             = kTRUE;
139
140   // The cross talk
141   fCTOn              = kTRUE;
142
143   // The pad coupling factor
144   // Use 0.46, instead of the theroetical value 0.3, since it reproduces better 
145   // the test beam data, even tough it is not understood why.
146   fPadCoupling       = 0.46;
147
148   // The time coupling factor (same number as for the TPC)
149   fTimeCoupling      = 0.4;
150
151   // Distance of first Anode wire from first pad edge
152   fAnodeWireOffset   = 0.25;
153
154   // Use drift time maps
155   fTimeStructOn      = kTRUE;
156   
157   // The pad response function
158   fPRFOn             = kTRUE;
159
160   ReInit();
161
162 }
163
164 //_____________________________________________________________________________
165 AliTRDSimParam::~AliTRDSimParam() 
166 {
167   //
168   // Destructor
169   //
170   
171   if (fTRFsmp) {
172     delete [] fTRFsmp;
173     fTRFsmp = 0;
174   }
175
176   if (fCTsmp) {
177     delete [] fCTsmp;
178     fCTsmp  = 0;
179   }
180
181 }
182
183 //_____________________________________________________________________________
184 AliTRDSimParam::AliTRDSimParam(const AliTRDSimParam &p)
185   :TObject(p)
186   ,fGasGain(p.fGasGain)
187   ,fNoise(p.fNoise)
188   ,fChipGain(p.fChipGain)
189   ,fADCoutRange(p.fADCoutRange)
190   ,fADCinRange(p.fADCinRange)
191   ,fADCthreshold(p.fADCthreshold)
192   ,fADCbaseline(p.fADCbaseline)
193   ,fDiffusionOn(p.fDiffusionOn)
194   ,fElAttachOn(p.fElAttachOn)
195   ,fElAttachProp(p.fElAttachProp)
196   ,fTRFOn(p.fTRFOn)
197   ,fTRFsmp(0)
198   ,fTRFbin(p.fTRFbin)
199   ,fTRFlo(p.fTRFlo)
200   ,fTRFhi(p.fTRFhi)
201   ,fTRFwid(p.fTRFwid)
202   ,fCTOn(p.fCTOn)
203   ,fCTsmp(0)
204   ,fAnodeWireOffset(p.fAnodeWireOffset)
205   ,fPadCoupling(p.fPadCoupling)
206   ,fTimeCoupling(p.fTimeCoupling)
207   ,fTimeStructOn(p.fTimeStructOn)
208   ,fPRFOn(p.fPRFOn)
209 {
210   //
211   // Copy constructor
212   //
213
214   Int_t iBin = 0;
215
216   if (((AliTRDSimParam &) p).fTRFsmp) {
217     delete [] ((AliTRDSimParam &) p).fTRFsmp;
218   }
219   ((AliTRDSimParam &) p).fTRFsmp = new Float_t[fTRFbin];
220   for (iBin = 0; iBin < fTRFbin; iBin++) {
221     ((AliTRDSimParam &) p).fTRFsmp[iBin] = fTRFsmp[iBin];
222   }                                                                             
223
224   if (((AliTRDSimParam &) p).fCTsmp) {
225     delete [] ((AliTRDSimParam &) p).fCTsmp;
226   }
227   ((AliTRDSimParam &) p).fCTsmp  = new Float_t[fTRFbin];
228   for (iBin = 0; iBin < fTRFbin; iBin++) {
229     ((AliTRDSimParam &) p).fCTsmp[iBin] = fCTsmp[iBin];
230   }                                                                             
231
232 }
233
234 //_____________________________________________________________________________
235 AliTRDSimParam &AliTRDSimParam::operator=(const AliTRDSimParam &p)
236 {
237   //
238   // Assignment operator
239   //
240
241   if (this != &p) {
242     ((AliTRDSimParam &) p).Copy(*this);
243   }
244
245   return *this;
246
247 }
248
249 //_____________________________________________________________________________
250 void AliTRDSimParam::Copy(TObject &p) const
251 {
252   //
253   // Copy function
254   //
255   
256   AliTRDSimParam *target = dynamic_cast<AliTRDSimParam *> (&p);
257   if (!target) {
258     return;
259   }
260
261   target->fGasGain            = fGasGain;
262   target->fNoise              = fNoise;
263   target->fChipGain           = fChipGain;  
264   target->fADCoutRange        = fADCoutRange;
265   target->fADCinRange         = fADCinRange;
266   target->fADCthreshold       = fADCthreshold;
267   target->fADCbaseline        = fADCbaseline; 
268   target->fDiffusionOn        = fDiffusionOn; 
269   target->fElAttachOn         = fElAttachOn;
270   target->fElAttachProp       = fElAttachProp;
271   target->fTRFOn              = fTRFOn;
272   target->fTRFbin             = fTRFbin;
273   target->fTRFlo              = fTRFlo;
274   target->fTRFhi              = fTRFhi;
275   target->fTRFwid             = fTRFwid;
276   target->fCTOn               = fCTOn;
277   target->fAnodeWireOffset    = fAnodeWireOffset;
278   target->fPadCoupling        = fPadCoupling;
279   target->fTimeCoupling       = fTimeCoupling;
280   target->fPRFOn              = fPRFOn;
281
282   if (target->fTRFsmp) {
283     delete[] target->fTRFsmp;
284   }
285   target->fTRFsmp = new Float_t[fTRFbin];
286   for (Int_t iBin = 0; iBin < fTRFbin; iBin++) {
287     target->fTRFsmp[iBin] = fTRFsmp[iBin];
288   }
289
290   if (target->fCTsmp) {
291     delete[] target->fCTsmp;
292   }
293   target->fCTsmp  = new Float_t[fTRFbin];
294   for (Int_t iBin = 0; iBin < fTRFbin; iBin++) {
295     target->fCTsmp[iBin]  = fCTsmp[iBin];
296   }
297   
298 }
299
300 //_____________________________________________________________________________
301 void AliTRDSimParam::ReInit()
302 {
303   //
304   // Reinitializes the parameter class after a change
305   //
306
307   // The range and the binwidth for the sampled TRF 
308   fTRFbin = 200;
309   // Start 0.2 mus before the signal
310   fTRFlo  = -0.4;
311   // End the maximum drift time after the signal 
312   fTRFhi  =  3.58;
313   fTRFwid = (fTRFhi - fTRFlo) / ((Float_t) fTRFbin);
314
315   // Create the sampled TRF
316   SampleTRF();
317
318 }
319
320 //_____________________________________________________________________________
321 void AliTRDSimParam::SampleTRF()
322 {
323   //
324   // Samples the new time response function.
325   // From Antons measurements with Fe55 source, adjusted by C. Lippmann.
326   // time bins are -0.4, -0.38, -0.36, ...., 3.54, 3.56, 3.58 microseconds
327   //
328
329   const Int_t kNpasa     = 200;  // kNpasa should be equal to fTRFbin!
330
331   Float_t signal[kNpasa]={ 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000
332                          , 0.0002, 0.0007, 0.0026, 0.0089, 0.0253, 0.0612, 0.1319
333                          , 0.2416, 0.3913, 0.5609, 0.7295, 0.8662, 0.9581, 1.0000
334                          , 0.9990, 0.9611, 0.8995, 0.8269, 0.7495, 0.6714, 0.5987
335                          , 0.5334, 0.4756, 0.4249, 0.3811, 0.3433, 0.3110, 0.2837
336                          , 0.2607, 0.2409, 0.2243, 0.2099, 0.1974, 0.1868, 0.1776
337                          , 0.1695, 0.1627, 0.1566, 0.1509, 0.1457, 0.1407, 0.1362
338                          , 0.1317, 0.1274, 0.1233, 0.1196, 0.1162, 0.1131, 0.1102
339                          , 0.1075, 0.1051, 0.1026, 0.1004, 0.0979, 0.0956, 0.0934
340                          , 0.0912, 0.0892, 0.0875, 0.0858, 0.0843, 0.0829, 0.0815
341                          , 0.0799, 0.0786, 0.0772, 0.0757, 0.0741, 0.0729, 0.0718
342                          , 0.0706, 0.0692, 0.0680, 0.0669, 0.0655, 0.0643, 0.0630
343                          , 0.0618, 0.0607, 0.0596, 0.0587, 0.0576, 0.0568, 0.0558
344                          , 0.0550, 0.0541, 0.0531, 0.0522, 0.0513, 0.0505, 0.0497
345                          , 0.0490, 0.0484, 0.0474, 0.0465, 0.0457, 0.0449, 0.0441
346                          , 0.0433, 0.0425, 0.0417, 0.0410, 0.0402, 0.0395, 0.0388
347                          , 0.0381, 0.0374, 0.0368, 0.0361, 0.0354, 0.0348, 0.0342
348                          , 0.0336, 0.0330, 0.0324, 0.0318, 0.0312, 0.0306, 0.0301
349                          , 0.0296, 0.0290, 0.0285, 0.0280, 0.0275, 0.0270, 0.0265
350                          , 0.0260, 0.0256, 0.0251, 0.0246, 0.0242, 0.0238, 0.0233
351                          , 0.0229, 0.0225, 0.0221, 0.0217, 0.0213, 0.0209, 0.0206
352                          , 0.0202, 0.0198, 0.0195, 0.0191, 0.0188, 0.0184, 0.0181
353                          , 0.0178, 0.0175, 0.0171, 0.0168, 0.0165, 0.0162, 0.0159
354                          , 0.0157, 0.0154, 0.0151, 0.0148, 0.0146, 0.0143, 0.0140
355                          , 0.0138, 0.0135, 0.0133, 0.0131, 0.0128, 0.0126, 0.0124
356                          , 0.0121, 0.0119, 0.0120, 0.0115, 0.0113, 0.0111, 0.0109
357                          , 0.0107, 0.0105, 0.0103, 0.0101, 0.0100, 0.0098, 0.0096
358                          , 0.0094, 0.0092, 0.0091, 0.0089, 0.0088, 0.0086, 0.0084
359                          , 0.0083, 0.0081, 0.0080, 0.0078 };
360
361         // Andronic & Bercuci parametrization
362         // define new TRF parametrization
363                 // normalizing constant to Fe signal
364         const Float_t k1=1.055;
365         // time constants
366         const Float_t t1=0.04;
367         const Float_t t2=.9;
368         // the relative fraction of the long component
369         const Float_t k2=.15;
370         // time offset for Fe
371         const Float_t t0=-.29;
372         Float_t x = t0; Int_t index;
373         for(int i=0; i<kNpasa; i++) signal[i] = 0.;
374   for(int i=0; i<kNpasa; i++){
375                 index = i+6;
376                 if(index >= kNpasa) break;
377                 x += .02;
378                 signal[index]=k1*(pow((x-t0)/t1, 2.5)*(exp(-(x-t0)/t1))+k2*exp(-(x-t0)/t2));
379         }
380
381         Float_t xtalk[kNpasa];
382
383   // With undershoot, positive peak corresponds to ~3% of the main signal:
384   for (Int_t ipasa = 3; ipasa < kNpasa; ipasa++) {
385     xtalk[ipasa] = 0.2 * (signal[ipasa-2] - signal[ipasa-3]);
386   }
387
388   xtalk[0]  = 0.0;   
389   xtalk[1]  = 0.0;  
390   xtalk[2]  = 0.0;  
391
392   signal[0] = 0.0;
393   signal[1] = 0.0;
394   signal[2] = 0.0;
395
396   if (fTRFsmp) {
397     delete [] fTRFsmp;
398   }
399   fTRFsmp = new Float_t[fTRFbin];
400
401   if (fCTsmp)  {
402     delete [] fCTsmp;
403   }
404   fCTsmp  = new Float_t[fTRFbin];
405
406   for (Int_t iBin = 0; iBin < fTRFbin; iBin++) {
407     fTRFsmp[iBin] = signal[iBin];
408     fCTsmp[iBin]  = xtalk[iBin];
409   }
410
411 }
412
413 //_____________________________________________________________________________
414 Double_t AliTRDSimParam::TimeResponse(Double_t time) const
415 {
416   //
417   // Applies the preamp shaper time response
418   // (We assume a signal rise time of 0.2us = fTRFlo/2.
419   //
420
421   Int_t iBin = ((Int_t) ((time - fTRFlo/2.0) / fTRFwid)); 
422   if ((iBin >=       0) && 
423       (iBin <  fTRFbin)) {
424     return fTRFsmp[iBin];
425   }
426   else {
427     return 0.0;
428   }    
429
430 }
431
432 //_____________________________________________________________________________
433 Double_t AliTRDSimParam::CrossTalk(Double_t time) const
434 {
435   //
436   // Applies the pad-pad capacitive cross talk
437   //
438
439   Int_t iBin = ((Int_t) ((time - fTRFlo) / fTRFwid)); 
440   if ((iBin >=       0) && 
441       (iBin <  fTRFbin)) {
442     return fCTsmp[iBin];
443   }
444   else {
445     return 0.0;
446   }    
447
448 }