Replace AliTRDCalibra
[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   Float_t xtalk[kNpasa];
362
363   // With undershoot, positive peak corresponds to ~3% of the main signal:
364   for (Int_t ipasa = 3; ipasa < kNpasa; ipasa++) {
365     xtalk[ipasa] = 0.2 * (signal[ipasa-2] - signal[ipasa-3]);
366   }
367
368   xtalk[0]  = 0.0;   
369   xtalk[1]  = 0.0;  
370   xtalk[2]  = 0.0;  
371
372   signal[0] = 0.0;
373   signal[1] = 0.0;
374   signal[2] = 0.0;
375
376   if (fTRFsmp) {
377     delete [] fTRFsmp;
378   }
379   fTRFsmp = new Float_t[fTRFbin];
380
381   if (fCTsmp)  {
382     delete [] fCTsmp;
383   }
384   fCTsmp  = new Float_t[fTRFbin];
385
386   for (Int_t iBin = 0; iBin < fTRFbin; iBin++) {
387     fTRFsmp[iBin] = signal[iBin];
388     fCTsmp[iBin]  = xtalk[iBin];
389   }
390
391 }
392
393 //_____________________________________________________________________________
394 Double_t AliTRDSimParam::TimeResponse(Double_t time) const
395 {
396   //
397   // Applies the preamp shaper time response
398   // (We assume a signal rise time of 0.2us = fTRFlo/2.
399   //
400
401   Int_t iBin = ((Int_t) ((time - fTRFlo/2.0) / fTRFwid)); 
402   if ((iBin >=       0) && 
403       (iBin <  fTRFbin)) {
404     return fTRFsmp[iBin];
405   }
406   else {
407     return 0.0;
408   }    
409
410 }
411
412 //_____________________________________________________________________________
413 Double_t AliTRDSimParam::CrossTalk(Double_t time) const
414 {
415   //
416   // Applies the pad-pad capacitive cross talk
417   //
418
419   Int_t iBin = ((Int_t) ((time - fTRFlo) / fTRFwid)); 
420   if ((iBin >=       0) && 
421       (iBin <  fTRFbin)) {
422     return fCTsmp[iBin];
423   }
424   else {
425     return 0.0;
426   }    
427
428 }