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