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