1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
18 ///////////////////////////////////////////////////////////////////////////////
20 // Class containing constant simulation parameters //
22 // Request an instance with AliTRDSimParam::Instance() //
23 // Then request the needed values //
25 ///////////////////////////////////////////////////////////////////////////////
31 #include "AliTRDSimParam.h"
33 ClassImp(AliTRDSimParam)
35 AliTRDSimParam* AliTRDSimParam::fgInstance = 0;
36 Bool_t AliTRDSimParam::fgTerminated = kFALSE;
38 //_ singleton implementation __________________________________________________
39 AliTRDSimParam* AliTRDSimParam::Instance()
42 // Singleton implementation
43 // Returns an instance of this class, it is created if neccessary
46 if (fgTerminated != kFALSE)
50 fgInstance = new AliTRDSimParam();
55 void AliTRDSimParam::Terminate()
58 // Singleton implementation
59 // Deletes the instance of this class and sets the terminated flag, instances cannot be requested anymore
60 // This function can be called several times.
72 //_____________________________________________________________________________
73 AliTRDSimParam::AliTRDSimParam()
76 // default constructor
88 fDiffusionOn = kFALSE;
107 fAnodeWireOffset = 0.0;
110 fTimeStructOn = kFALSE;
117 //_____________________________________________________________________________
118 void AliTRDSimParam::Init()
121 // default initializiation
124 // The default parameter for the digitization
128 fADCoutRange = 1023.; // 10-bit ADC
129 fADCinRange = 2000.; // 2V input range
134 fDiffusionOn = kTRUE;
136 // Propability for electron attachment
137 fElAttachOn = kFALSE;
140 // The time response function
146 // The tail cancelation
149 // The number of exponentials
152 // The pad coupling factor
153 //fPadCoupling = 0.3;
154 // Use 0.46 instead which reproduces better the test beam
155 // data, even tough it is not understood why.
158 // The time coupling factor (same number as for the TPC)
161 // Distance of first Anode wire from first pad edge
162 fAnodeWireOffset = 0.25;
164 // Use drift time maps
165 fTimeStructOn = kTRUE;
167 // The pad response function
173 //_____________________________________________________________________________
174 AliTRDSimParam::~AliTRDSimParam()
191 //_____________________________________________________________________________
192 AliTRDSimParam::AliTRDSimParam(const AliTRDSimParam &p):TObject(p)
198 ((AliTRDSimParam &) p).Copy(*this);
202 //_____________________________________________________________________________
203 AliTRDSimParam &AliTRDSimParam::operator=(const AliTRDSimParam &p)
206 // Assignment operator
209 if (this != &p) ((AliTRDSimParam &) p).Copy(*this);
213 //_____________________________________________________________________________
214 void AliTRDSimParam::Copy(TObject &p) const
220 AliTRDSimParam* target = dynamic_cast<AliTRDSimParam*> (&p);
224 target->fGasGain = fGasGain;
225 //target->fField = fField;
226 target->fNoise = fNoise;
227 target->fChipGain = fChipGain;
229 target->fADCoutRange = fADCoutRange;
230 target->fADCinRange = fADCinRange;
231 target->fADCthreshold = fADCthreshold;
232 target->fADCbaseline = fADCbaseline;
234 target->fDiffusionOn = fDiffusionOn;
236 target->fElAttachOn = fElAttachOn;
237 target->fElAttachProp = fElAttachProp;
239 target->fTRFOn = fTRFOn;
241 delete[] target->fTRFsmp;
242 target->fTRFsmp = new Float_t[fTRFbin];
243 for (Int_t iBin = 0; iBin < fTRFbin; iBin++) {
244 target->fTRFsmp[iBin] = fTRFsmp[iBin];
246 target->fTRFbin = fTRFbin;
247 target->fTRFlo = fTRFlo;
248 target->fTRFhi = fTRFhi;
249 target->fTRFwid = fTRFwid;
251 target->fCTOn = fCTOn;
253 delete[] target->fCTsmp;
254 target->fCTsmp = new Float_t[fTRFbin];
255 for (Int_t iBin = 0; iBin < fTRFbin; iBin++) {
256 target->fCTsmp[iBin] = fCTsmp[iBin];
259 target->fTCOn = fTCOn;
260 target->fTCnexp = fTCnexp;
262 target->fAnodeWireOffset = fAnodeWireOffset;
263 target->fPadCoupling = fPadCoupling;
264 target->fTimeCoupling = fTimeCoupling;
266 target->fPRFOn = fPRFOn;
269 //_____________________________________________________________________________
270 void AliTRDSimParam::ReInit()
273 // Reinitializes the parameter class after a change
276 // The range and the binwidth for the sampled TRF
278 // Start 0.2 mus before the signal
280 // End the maximum drift time after the signal
283 fTRFwid = (fTRFhi - fTRFlo) / ((Float_t) fTRFbin);
285 // Create the sampled TRF
290 //_____________________________________________________________________________
291 void AliTRDSimParam::SampleTRF()
294 // Samples the new time response function.
295 // From Antons measurements with Fe55 source, adjusted by C. Lippmann.
296 // time bins are -0.4, -0.38, -0.36, ...., 3.54, 3.56, 3.58 microseconds
299 const Int_t kNpasa = 200; // kNpasa should be equal to fTRFbin!
301 Float_t signal[kNpasa]={0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,
302 0.0002, 0.0007, 0.0026, 0.0089, 0.0253, 0.0612, 0.1319,
303 0.2416, 0.3913, 0.5609, 0.7295, 0.8662, 0.9581, 1.0000,
304 0.9990, 0.9611, 0.8995, 0.8269, 0.7495, 0.6714, 0.5987,
305 0.5334, 0.4756, 0.4249, 0.3811, 0.3433, 0.3110, 0.2837,
306 0.2607, 0.2409, 0.2243, 0.2099, 0.1974, 0.1868, 0.1776,
307 0.1695, 0.1627, 0.1566, 0.1509, 0.1457, 0.1407, 0.1362,
308 0.1317, 0.1274, 0.1233, 0.1196, 0.1162, 0.1131, 0.1102,
309 0.1075, 0.1051, 0.1026, 0.1004, 0.0979, 0.0956, 0.0934,
310 0.0912, 0.0892, 0.0875, 0.0858, 0.0843, 0.0829, 0.0815,
311 0.0799, 0.0786, 0.0772, 0.0757, 0.0741, 0.0729, 0.0718,
312 0.0706, 0.0692, 0.0680, 0.0669, 0.0655, 0.0643, 0.0630,
313 0.0618, 0.0607, 0.0596, 0.0587, 0.0576, 0.0568, 0.0558,
314 0.0550, 0.0541, 0.0531, 0.0522, 0.0513, 0.0505, 0.0497,
315 0.0490, 0.0484, 0.0474, 0.0465, 0.0457, 0.0449, 0.0441,
316 0.0433, 0.0425, 0.0417, 0.0410, 0.0402, 0.0395, 0.0388,
317 0.0381, 0.0374, 0.0368, 0.0361, 0.0354, 0.0348, 0.0342,
318 0.0336, 0.0330, 0.0324, 0.0318, 0.0312, 0.0306, 0.0301,
319 0.0296, 0.0290, 0.0285, 0.0280, 0.0275, 0.0270, 0.0265,
320 0.0260, 0.0256, 0.0251, 0.0246, 0.0242, 0.0238, 0.0233,
321 0.0229, 0.0225, 0.0221, 0.0217, 0.0213, 0.0209, 0.0206,
322 0.0202, 0.0198, 0.0195, 0.0191, 0.0188, 0.0184, 0.0181,
323 0.0178, 0.0175, 0.0171, 0.0168, 0.0165, 0.0162, 0.0159,
324 0.0157, 0.0154, 0.0151, 0.0148, 0.0146, 0.0143, 0.0140,
325 0.0138, 0.0135, 0.0133, 0.0131, 0.0128, 0.0126, 0.0124,
326 0.0121, 0.0119, 0.0120, 0.0115, 0.0113, 0.0111, 0.0109,
327 0.0107, 0.0105, 0.0103, 0.0101, 0.0100, 0.0098, 0.0096,
328 0.0094, 0.0092, 0.0091, 0.0089, 0.0088, 0.0086, 0.0084,
329 0.0083, 0.0081, 0.0080, 0.0078};
331 Float_t xtalk[kNpasa];
333 for (Int_t ipasa = 3; ipasa < kNpasa; ipasa++) {
334 //signal[ipasa] /= 0.44; // normalise area to 1
335 // With undershoot, positive peak corresponds to ~3% of the main signal:
336 xtalk[ipasa] = 0.2*(signal[ipasa-2]-signal[ipasa-3]);
339 xtalk[0] = 0.0; signal[0] = 0.0;
340 xtalk[1] = 0.0; signal[1] = 0.0;
341 xtalk[2] = 0.0; signal[2] = 0.0;
343 if (fTRFsmp) delete [] fTRFsmp;
344 fTRFsmp = new Float_t[fTRFbin];
345 if (fCTsmp) delete [] fCTsmp;
346 fCTsmp = new Float_t[fTRFbin];
348 for (Int_t iBin = 0; iBin < fTRFbin; iBin++) {
349 fTRFsmp[iBin] = signal[iBin];
350 fCTsmp[iBin] = xtalk[iBin];
355 //_____________________________________________________________________________
356 Double_t AliTRDSimParam::TimeResponse(Double_t time) const
359 // Applies the preamp shaper time response
360 // (We assume a signal rise time of 0.2us = fTRFlo/2.
363 Int_t iBin = ((Int_t) ((time - fTRFlo/2.) / fTRFwid));
364 if ((iBin >= 0) && (iBin < fTRFbin)) {
365 return fTRFsmp[iBin];
373 //_____________________________________________________________________________
374 Double_t AliTRDSimParam::CrossTalk(Double_t time) const
377 // Applies the pad-pad capacitive cross talk
380 Int_t iBin = ((Int_t) ((time - fTRFlo) / fTRFwid));
381 if ((iBin >= 0) && (iBin < fTRFbin)) {