]> git.uio.no Git - u/mrichter/AliRoot.git/blame - TRD/AliTRDSimParam.cxx
Beautify editor; rename over/undershoot to over/underflow.
[u/mrichter/AliRoot.git] / TRD / AliTRDSimParam.cxx
CommitLineData
3551db50 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
4d18a639 18////////////////////////////////////////////////////////////////////////////
19// //
20// Class containing constant simulation parameters //
21// //
22// Request an instance with AliTRDSimParam::Instance() //
23// Then request the needed values //
24// //
25////////////////////////////////////////////////////////////////////////////
3551db50 26
27#include <TMath.h>
28
29#include "AliRun.h"
30
31#include "AliTRDSimParam.h"
32
33ClassImp(AliTRDSimParam)
34
4d18a639 35AliTRDSimParam *AliTRDSimParam::fgInstance = 0;
36Bool_t AliTRDSimParam::fgTerminated = kFALSE;
3551db50 37
38//_ singleton implementation __________________________________________________
39AliTRDSimParam* AliTRDSimParam::Instance()
40{
41 //
42 // Singleton implementation
43 // Returns an instance of this class, it is created if neccessary
44 //
45
4d18a639 46 if (fgTerminated != kFALSE) {
3551db50 47 return 0;
4d18a639 48 }
3551db50 49
4d18a639 50 if (fgInstance == 0) {
3551db50 51 fgInstance = new AliTRDSimParam();
4d18a639 52 }
53
3551db50 54 return fgInstance;
4d18a639 55
3551db50 56}
57
4d18a639 58//_ singleton implementation __________________________________________________
3551db50 59void AliTRDSimParam::Terminate()
60{
61 //
62 // Singleton implementation
4d18a639 63 // Deletes the instance of this class and sets the terminated flag,
64 // instances cannot be requested anymore
3551db50 65 // This function can be called several times.
66 //
67
68 fgTerminated = kTRUE;
69
4d18a639 70 if (fgInstance != 0) {
3551db50 71 delete fgInstance;
72 fgInstance = 0;
73 }
4d18a639 74
3551db50 75}
76
77//_____________________________________________________________________________
78AliTRDSimParam::AliTRDSimParam()
4d18a639 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)
3551db50 103{
104 //
4d18a639 105 // Default constructor
3551db50 106 //
107
3551db50 108 Init();
4d18a639 109
3551db50 110}
111
112//_____________________________________________________________________________
113void AliTRDSimParam::Init()
114{
115 //
4d18a639 116 // Default initializiation
3551db50 117 //
118
119 // The default parameter for the digitization
4d18a639 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 = 1;
126 fADCbaseline = 0;
3551db50 127
128 // Diffusion on
4d18a639 129 fDiffusionOn = kTRUE;
3551db50 130
131 // Propability for electron attachment
4d18a639 132 fElAttachOn = kFALSE;
133 fElAttachProp = 0.0;
3551db50 134
135 // The time response function
4d18a639 136 fTRFOn = kTRUE;
3551db50 137
138 // The cross talk
4d18a639 139 fCTOn = kTRUE;
3551db50 140
3551db50 141 // The pad coupling factor
4d18a639 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;
3551db50 145
146 // The time coupling factor (same number as for the TPC)
4d18a639 147 fTimeCoupling = 0.4;
3551db50 148
149 // Distance of first Anode wire from first pad edge
150 fAnodeWireOffset = 0.25;
151
152 // Use drift time maps
4d18a639 153 fTimeStructOn = kTRUE;
3551db50 154
cc7cef99 155 // The pad response function
4d18a639 156 fPRFOn = kTRUE;
cc7cef99 157
3551db50 158 ReInit();
4d18a639 159
ab0a4106 160}
3551db50 161
162//_____________________________________________________________________________
163AliTRDSimParam::~AliTRDSimParam()
164{
165 //
4d18a639 166 // Destructor
3551db50 167 //
168
169 if (fTRFsmp) {
170 delete [] fTRFsmp;
171 fTRFsmp = 0;
172 }
173
174 if (fCTsmp) {
175 delete [] fCTsmp;
176 fCTsmp = 0;
177 }
4d18a639 178
ab0a4106 179}
3551db50 180
181//_____________________________________________________________________________
4d18a639 182AliTRDSimParam::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)
3551db50 207{
208 //
4d18a639 209 // Copy constructor
3551db50 210 //
211
4d18a639 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 }
3551db50 229
4d18a639 230}
3551db50 231
232//_____________________________________________________________________________
233AliTRDSimParam &AliTRDSimParam::operator=(const AliTRDSimParam &p)
234{
235 //
236 // Assignment operator
237 //
238
239 if (this != &p) ((AliTRDSimParam &) p).Copy(*this);
4d18a639 240
3551db50 241 return *this;
4d18a639 242
3551db50 243}
244
245//_____________________________________________________________________________
246void AliTRDSimParam::Copy(TObject &p) const
247{
248 //
249 // Copy function
250 //
251
252 AliTRDSimParam* target = dynamic_cast<AliTRDSimParam*> (&p);
4d18a639 253 if (!target) {
3551db50 254 return;
4d18a639 255 }
3551db50 256
257 target->fGasGain = fGasGain;
3551db50 258 target->fNoise = fNoise;
4d18a639 259 target->fChipGain = fChipGain;
3551db50 260 target->fADCoutRange = fADCoutRange;
261 target->fADCinRange = fADCinRange;
262 target->fADCthreshold = fADCthreshold;
263 target->fADCbaseline = fADCbaseline;
3551db50 264 target->fDiffusionOn = fDiffusionOn;
3551db50 265 target->fElAttachOn = fElAttachOn;
266 target->fElAttachProp = fElAttachProp;
3551db50 267 target->fTRFOn = fTRFOn;
3551db50 268 target->fTRFbin = fTRFbin;
269 target->fTRFlo = fTRFlo;
270 target->fTRFhi = fTRFhi;
271 target->fTRFwid = fTRFwid;
3551db50 272 target->fCTOn = fCTOn;
4d18a639 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) {
3551db50 287 delete[] target->fCTsmp;
4d18a639 288 }
3551db50 289 target->fCTsmp = new Float_t[fTRFbin];
290 for (Int_t iBin = 0; iBin < fTRFbin; iBin++) {
291 target->fCTsmp[iBin] = fCTsmp[iBin];
292 }
293
3551db50 294}
295
296//_____________________________________________________________________________
297void AliTRDSimParam::ReInit()
298{
299 //
300 // Reinitializes the parameter class after a change
301 //
302
303 // The range and the binwidth for the sampled TRF
915f999b 304 fTRFbin = 200;
3551db50 305 // Start 0.2 mus before the signal
915f999b 306 fTRFlo = -0.4;
3551db50 307 // End the maximum drift time after the signal
4d18a639 308 fTRFhi = 3.58;
3551db50 309 fTRFwid = (fTRFhi - fTRFlo) / ((Float_t) fTRFbin);
310
311 // Create the sampled TRF
312 SampleTRF();
3551db50 313
4d18a639 314}
915f999b 315
3551db50 316//_____________________________________________________________________________
317void AliTRDSimParam::SampleTRF()
318{
319 //
915f999b 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
3551db50 323 //
324
915f999b 325 const Int_t kNpasa = 200; // kNpasa should be equal to fTRFbin!
326
4d18a639 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 };
915f999b 356
357 Float_t xtalk[kNpasa];
358
4d18a639 359 // With undershoot, positive peak corresponds to ~3% of the main signal:
915f999b 360 for (Int_t ipasa = 3; ipasa < kNpasa; ipasa++) {
4d18a639 361 xtalk[ipasa] = 0.2 * (signal[ipasa-2] - signal[ipasa-3]);
3551db50 362 }
363
4d18a639 364 xtalk[0] = 0.0;
365 xtalk[1] = 0.0;
366 xtalk[2] = 0.0;
915f999b 367
4d18a639 368 signal[0] = 0.0;
369 signal[1] = 0.0;
370 signal[2] = 0.0;
371
372 if (fTRFsmp) {
373 delete [] fTRFsmp;
374 }
3551db50 375 fTRFsmp = new Float_t[fTRFbin];
4d18a639 376
377 if (fCTsmp) {
378 delete [] fCTsmp;
379 }
3551db50 380 fCTsmp = new Float_t[fTRFbin];
381
3551db50 382 for (Int_t iBin = 0; iBin < fTRFbin; iBin++) {
915f999b 383 fTRFsmp[iBin] = signal[iBin];
384 fCTsmp[iBin] = xtalk[iBin];
3551db50 385 }
386
387}
388
389//_____________________________________________________________________________
390Double_t AliTRDSimParam::TimeResponse(Double_t time) const
391{
392 //
393 // Applies the preamp shaper time response
915f999b 394 // (We assume a signal rise time of 0.2us = fTRFlo/2.
3551db50 395 //
396
4d18a639 397 Int_t iBin = ((Int_t) ((time - fTRFlo/2.0) / fTRFwid));
398 if ((iBin >= 0) &&
399 (iBin < fTRFbin)) {
3551db50 400 return fTRFsmp[iBin];
401 }
402 else {
403 return 0.0;
404 }
405
406}
407
408//_____________________________________________________________________________
409Double_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));
4d18a639 416 if ((iBin >= 0) &&
417 (iBin < fTRFbin)) {
3551db50 418 return fCTsmp[iBin];
419 }
420 else {
421 return 0.0;
422 }
423
424}