]> git.uio.no Git - u/mrichter/AliRoot.git/blame - ITS/UPGRADE/AliITSUSimuParam.cxx
Integrating the Cooked Matrix tracker into the commom reconstruction framework
[u/mrichter/AliRoot.git] / ITS / UPGRADE / AliITSUSimuParam.cxx
CommitLineData
451f5018 1/**************************************************************************
2 * Copyright(c) 2007-2009, 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: AliITSUSimuParam.cxx 48165 2011-03-07 17:48:57Z masera $ */
17
18///////////////////////////////////////////////////////////////////
19// //
20// Implementation of the class to store the parameters used in //
9912c845 21// the simulation of ITS upgrade detectors //
22// //
29ad4146 23// On the fRespFunParam array content: it holds the //
24// AliITSUParamList type objects with data for response //
25// simulation of type of //
9912c845 26// detector (e.g. Class/Segmentation) used in the Config.C //
27// The convention is: //
29ad4146 28// 1) AliITSUParamList::GetUniqueID() defines detectorID //
29// (see header of the AliITSUGeomTGeo.h) for which these //
30// response data is defined //
9912c845 31// //
29ad4146 32// 2) AliITSUParamList::GetID() defines the charge spread //
33// function served by these data, for instance in case of //
34// Pixels these are the functions aliased to enums //
35// kSpreadFunGauss2D... in AliITSUSimulationPix.h //
9912c845 36// //
37// 3) Each detector class is free to interpred the content of //
29ad4146 38// AliITSUParamList. AliITSUSimulationPix, for instance requests //
39// that first AliITSUSimulationPix::kParamStart are reserved for //
40// some standard properties (like number of neighbours around the//
9912c845 41// pixel with the charge is injected to consider for the charge //
42// spread (the values may be different for different finctions) //
43// //
44// //
45// //
46// //
47// //
48// //
49// //
50// //
451f5018 51// //
52///////////////////////////////////////////////////////////////////
53#include "AliITSUSimuParam.h"
54#include "AliLog.h"
29ad4146 55#include "AliITSUParamList.h"
c92b1537 56
a11ef2e4 57using namespace TMath;
451f5018 58
59
344d4ff3 60const Float_t AliITSUSimuParam::fgkPixBiasVoltageDefault = 18.182;
61const Float_t AliITSUSimuParam::fgkPixThreshDefault = 20.;
62const Float_t AliITSUSimuParam::fgkPixThrSigmaDefault = 5.;
63const Float_t AliITSUSimuParam::fgkPixMinElToAddDefault = 1.;
120e5202 64const UInt_t AliITSUSimuParam::fgkPixCouplingOptDefault = AliITSUSimuParam::kNoCouplingPix;
344d4ff3 65const Float_t AliITSUSimuParam::fgkPixCouplColDefault = 0.;
66const Float_t AliITSUSimuParam::fgkPixCouplRowDefault = 0.055;
67const Float_t AliITSUSimuParam::fgkPixEccDiffDefault = 0.85;
68const Float_t AliITSUSimuParam::fgkPixLorentzHoleWeightDefault = 1.0;
69const Float_t AliITSUSimuParam::fgkGeVtoChargeDefault = 3.6e-9;
70const Float_t AliITSUSimuParam::fgkDOverVDefault = 0.000375;
71const Float_t AliITSUSimuParam::fgkTDefault = 300;
72const Float_t AliITSUSimuParam::fgkPixFakeRateDefault = 1e-4;
29ad4146 73const Bool_t AliITSUSimuParam::fgkPixNoiseInAllMod = kFALSE;
451f5018 74
344d4ff3 75const Float_t AliITSUSimuParam::fgkNsigmasDefault = 3.;
451f5018 76const Int_t AliITSUSimuParam::fgkNcompsDefault = 121;
77
78ClassImp(AliITSUSimuParam)
79
80//______________________________________________________________________
81AliITSUSimuParam::AliITSUSimuParam()
82: fGeVcharge(fgkGeVtoChargeDefault)
83 ,fDOverV(fgkDOverVDefault)
84 ,fT(fgkTDefault)
85 //
344d4ff3 86 ,fNLayers(0)
4fa9d550 87 ,fNPix(0)
120e5202 88 ,fPixCouplOpt(kNoCouplingPix)
4fa9d550 89 ,fPixCouplCol(fgkPixCouplColDefault)
90 ,fPixCouplRow(fgkPixCouplRowDefault)
f32affe3 91 ,fPixLorentzDrift(kFALSE)
4fa9d550 92 ,fPixLorentzHoleWeight(fgkPixLorentzHoleWeightDefault)
93 ,fPixAddNoisyFlag(kFALSE)
94 ,fPixRemoveDeadFlag(kFALSE)
451f5018 95 //
4fa9d550 96 ,fPixThreshDef(fgkPixThreshDefault)
97 ,fPixThrSigmaDef(fgkPixThrSigmaDefault)
98 ,fPixBiasVoltageDef(fgkPixBiasVoltageDefault)
99 ,fPixNoiseDef(0)
100 ,fPixBaselineDef(0)
101 ,fPixMinElToAddDef(fgkPixMinElToAddDefault)
29ad4146 102 ,fPixFakeRateDef(fgkPixFakeRateDefault)
103 ,fPixNoiseInAllMod(fgkPixNoiseInAllMod)
451f5018 104 //
344d4ff3 105 ,fLrROCycleShift(0)
106 //
4fa9d550 107 ,fPixThresh(0)
108 ,fPixThrSigma(0)
109 ,fPixBiasVoltage(0)
110 ,fPixSigma(0)
111 ,fPixNoise(0)
112 ,fPixBaseline(0)
c92b1537 113 ,fRespFunParam(0)
451f5018 114{
115 // default constructor
344d4ff3 116 SetNPix(0);
117 SetNLayers(0);
c92b1537 118 fRespFunParam.SetOwner(kTRUE);
451f5018 119}
120
121//______________________________________________________________________
344d4ff3 122AliITSUSimuParam::AliITSUSimuParam(UInt_t nLayer,UInt_t nPix)
451f5018 123 :fGeVcharge(fgkGeVtoChargeDefault)
124 ,fDOverV(fgkDOverVDefault)
125 ,fT(fgkTDefault)
126 //
344d4ff3 127 ,fNLayers(0)
128 ,fNPix(0)
120e5202 129 ,fPixCouplOpt(kNoCouplingPix)
4fa9d550 130 ,fPixCouplCol(fgkPixCouplColDefault)
131 ,fPixCouplRow(fgkPixCouplRowDefault)
f32affe3 132 ,fPixLorentzDrift(kFALSE)
4fa9d550 133 ,fPixLorentzHoleWeight(fgkPixLorentzHoleWeightDefault)
134 ,fPixAddNoisyFlag(kFALSE)
135 ,fPixRemoveDeadFlag(kFALSE)
451f5018 136 //
4fa9d550 137 ,fPixThreshDef(fgkPixThreshDefault)
138 ,fPixThrSigmaDef(fgkPixThrSigmaDefault)
139 ,fPixBiasVoltageDef(fgkPixBiasVoltageDefault)
140 ,fPixNoiseDef(0)
141 ,fPixBaselineDef(0)
142 ,fPixMinElToAddDef(fgkPixMinElToAddDefault)
29ad4146 143 ,fPixFakeRateDef(fgkPixFakeRateDefault)
144 ,fPixNoiseInAllMod(fgkPixNoiseInAllMod)
451f5018 145 //
344d4ff3 146 ,fLrROCycleShift(0)
147 //
4fa9d550 148 ,fPixThresh(0)
149 ,fPixThrSigma(0)
150 ,fPixBiasVoltage(0)
151 ,fPixSigma(0)
152 ,fPixNoise(0)
153 ,fPixBaseline(0)
c92b1537 154 ,fRespFunParam(0)
451f5018 155{
156 // regular constructor
344d4ff3 157 SetNPix(nPix);
158 SetNLayers(nLayer);
c92b1537 159 fRespFunParam.SetOwner(kTRUE);
451f5018 160 //
161}
162
163//______________________________________________________________________
164AliITSUSimuParam::AliITSUSimuParam(const AliITSUSimuParam &simpar)
165 :TObject(simpar)
166 ,fGeVcharge(simpar.fGeVcharge)
167 ,fDOverV(simpar.fDOverV)
168 ,fT(simpar.fT)
169 //
344d4ff3 170 ,fNLayers(simpar.fNLayers)
4fa9d550 171 ,fNPix(simpar.fNPix)
172 ,fPixCouplOpt(simpar.fPixCouplOpt)
173 ,fPixCouplCol(simpar.fPixCouplCol)
174 ,fPixCouplRow(simpar.fPixCouplRow)
4fa9d550 175 ,fPixLorentzDrift(simpar.fPixLorentzDrift)
176 ,fPixLorentzHoleWeight(simpar.fPixLorentzHoleWeight)
177 ,fPixAddNoisyFlag(simpar.fPixAddNoisyFlag)
178 ,fPixRemoveDeadFlag(simpar.fPixRemoveDeadFlag)
451f5018 179 //
4fa9d550 180 ,fPixThreshDef(simpar.fPixThreshDef)
181 ,fPixThrSigmaDef(simpar.fPixThrSigmaDef)
182 ,fPixBiasVoltageDef(simpar.fPixBiasVoltageDef)
183 ,fPixNoiseDef(simpar.fPixNoiseDef)
184 ,fPixBaselineDef(simpar.fPixBaselineDef)
185 ,fPixMinElToAddDef(simpar.fPixMinElToAddDef)
29ad4146 186 ,fPixFakeRateDef(simpar.fPixFakeRateDef)
187 ,fPixNoiseInAllMod(simpar.fPixNoiseInAllMod)
188 //
344d4ff3 189 ,fLrROCycleShift(0)
4fa9d550 190 ,fPixThresh(0)
191 ,fPixThrSigma(0)
192 ,fPixBiasVoltage(0)
193 ,fPixSigma(0)
194 ,fPixNoise(0)
195 ,fPixBaseline(0)
c92b1537 196 ,fRespFunParam(0)
451f5018 197 //
198{
199 // copy constructor
344d4ff3 200 //
201 if (fNLayers>0) {
202 fLrROCycleShift = new Float_t[fNLayers];
203 for (int i=fNLayers;i--;) fLrROCycleShift[i] = simpar.fLrROCycleShift[i];
204 }
205 //
4fa9d550 206 if (fNPix) {
344d4ff3 207 fPixBiasVoltage = new Float_t[fNPix];
208 fPixThresh = new Float_t[fNPix];
209 fPixThrSigma = new Float_t[fNPix];
210 fPixNoise = new Float_t[fNPix];
211 fPixBaseline = new Float_t[fNPix];
451f5018 212 }
4fa9d550 213 for (Int_t i=fNPix;i--;) {
214 fPixBiasVoltage[i] = simpar.fPixBiasVoltage[i];
215 fPixThresh[i] = simpar.fPixThresh[i];
216 fPixThrSigma[i] = simpar.fPixThrSigma[i];
217 fPixNoise[i] = simpar.fPixNoise[i];
218 fPixBaseline[i] = simpar.fPixBaseline[i];
451f5018 219 }
220 //
c92b1537 221 for (int i=0;i<simpar.fRespFunParam.GetEntriesFast();i++) {
29ad4146 222 AliITSUParamList* pr = (AliITSUParamList*)simpar.fRespFunParam[0];
223 if (pr) fRespFunParam.AddLast(new AliITSUParamList(*pr));
c92b1537 224 }
225 fRespFunParam.SetOwner(kTRUE);
451f5018 226}
227
344d4ff3 228//______________________________________________________________________
229void AliITSUSimuParam::SetNPix(Int_t np)
230{
231 if (fNPix>0) AliFatal(Form("Number of pixels is already set to %d",fNPix));
232 if (np>0) {
233 fNPix = np;
234 fPixBiasVoltage = new Float_t[fNPix];
235 fPixThresh = new Float_t[fNPix];
236 fPixThrSigma = new Float_t[fNPix];
237 fPixNoise = new Float_t[fNPix];
238 fPixBaseline = new Float_t[fNPix];
239 }
240 SetPixThreshold(fgkPixThreshDefault,fgkPixThrSigmaDefault);
241 SetPixNoise(0.,0.);
242 SetPixBiasVoltage(fgkPixBiasVoltageDefault);
243 //
244}
245
246//______________________________________________________________________
247void AliITSUSimuParam::SetNLayers(Int_t nl)
248{
249 if (fNLayers>0) AliFatal(Form("Number of layers is already set to %d",fNLayers));
250 if (nl>0) {
251 fNLayers = nl;
252 fLrROCycleShift = new Float_t[fNLayers];
253 }
254 SetLrROCycleShift(0);
255 //
256}
257
451f5018 258//______________________________________________________________________
259AliITSUSimuParam& AliITSUSimuParam::operator=(const AliITSUSimuParam& source)
260{
261 // Assignment operator.
262 if (this==&source) return *this;
263 this->~AliITSUSimuParam();
264 new(this) AliITSUSimuParam(source);
265 return *this;
266 //
267}
268
269//______________________________________________________________________
270AliITSUSimuParam::~AliITSUSimuParam()
271{
272 // destructor
4fa9d550 273 delete[] fPixBiasVoltage;
274 delete[] fPixThresh;
275 delete[] fPixThrSigma;
276 delete[] fPixNoise;
277 delete[] fPixBaseline;
344d4ff3 278 delete[] fLrROCycleShift;
451f5018 279}
280
281//________________________________________________________________________
282void AliITSUSimuParam::Print(Option_t *) const
283{
284 // Dump all parameters
285 Dump();
29ad4146 286 //
287 int nresp = fRespFunParam.GetEntriesFast();
288 if (nresp) {
289 printf("Individual sensor responses\n");
290 for (int i=0;i<nresp;i++) {
291 AliITSUParamList* lst = (AliITSUParamList*)fRespFunParam[i];
292 if (!lst) continue;
293 lst->Print();
294 }
295 }
451f5018 296}
297
298//_______________________________________________________________________
4fa9d550 299Double_t AliITSUSimuParam::ApplyPixBaselineAndNoise(UInt_t mod) const
451f5018 300{
301 // generate random noise
302 double base,noise;
4fa9d550 303 if (mod>=fNPix) {
852af72e 304 if (fNPix>0) {AliFatal(Form("Wrong chip %d, NPidUpg=%d",mod,fNPix));}
4fa9d550 305 base = fPixBaselineDef;
306 noise = fPixNoiseDef;
451f5018 307 }
308 else {
4fa9d550 309 base = fPixBaseline[mod];
310 noise = fPixNoise[mod];
451f5018 311 }
312 return base+noise*gRandom->Gaus();
313}
314
315//_______________________________________________________________________
316Double_t AliITSUSimuParam::CalcProbNoiseOverThreshold(UInt_t mod) const
317{
318 // calculate probability of noise exceeding the threshold
319 double base,noise,thresh;
4fa9d550 320 if (mod>=fNPix) {
852af72e 321 if (fNPix>0) {AliFatal(Form("Wrong chip %d, NPidUpg=%d",mod,fNPix));}
4fa9d550 322 base = fPixBaselineDef;
323 noise = fPixNoiseDef;
324 thresh = fPixThreshDef;
451f5018 325 }
326 else {
4fa9d550 327 base = fPixBaseline[mod];
328 noise = fPixNoise[mod];
329 thresh = fPixThresh[mod];
451f5018 330 }
331 if (noise<1e-12) {
332 if (base>thresh) return 1;
333 else return 0;
334 }
335 return CalcProbNoiseOverThreshold(base, noise, thresh);
336}
337
338//_______________________________________________________________________
344d4ff3 339void AliITSUSimuParam::SetLrROCycleShift(Double_t v,Int_t lr)
340{
341 // set fractional offset of layer RO cycle
342 if (lr<0) for (int i=fNLayers;i--;) fLrROCycleShift[i]=v;
343 else fLrROCycleShift[lr]=v;
344}
345
346//_______________________________________________________________________
4fa9d550 347void AliITSUSimuParam::SetPixThreshold(Double_t thresh, Double_t sigma, int mod)
451f5018 348{
349 // set threshold params
350 if (mod<0) {
4fa9d550 351 fPixThreshDef = thresh;
352 fPixThrSigmaDef = sigma;
353 for (int i=fNPix;i--;) {
354 fPixThresh[i] = thresh;
355 fPixThrSigma[i] = sigma;
451f5018 356 }
357 }
4fa9d550 358 else if (mod>=(int)fNPix) {
852af72e 359 if (fNPix>0) {AliFatal(Form("Wrong chip %d, NPidUpg=%d",mod,fNPix));}
4fa9d550 360 fPixThreshDef = thresh;
361 fPixThrSigmaDef = sigma;
451f5018 362 }
363 else {
4fa9d550 364 fPixThresh[mod] = thresh;
365 fPixThrSigma[mod] = sigma;
451f5018 366 }
367 //
368}
369
370//_______________________________________________________________________
4fa9d550 371Double_t AliITSUSimuParam::GetPixThreshold(UInt_t mod) const
451f5018 372{
373 // obtain threshold
4fa9d550 374 if (mod>=fNPix) {
852af72e 375 if (fNPix>0) {AliFatal(Form("Wrong chip %d, NPidUpg=%d",mod,fNPix));}
4fa9d550 376 return fPixThreshDef;
451f5018 377 }
4fa9d550 378 else return fPixThresh[mod];
451f5018 379}
380
381//_______________________________________________________________________
4fa9d550 382void AliITSUSimuParam::GetPixThreshold(UInt_t mod, Double_t &thresh, Double_t &sigma) const
451f5018 383{
384 // obtain thresholds
4fa9d550 385 if (mod>=fNPix) {
852af72e 386 if (fNPix>0) {AliFatal(Form("Wrong chip %d, NPidUpg=%d",mod,fNPix));}
4fa9d550 387 thresh = fPixThreshDef;
388 sigma = fPixThrSigmaDef;
451f5018 389 }
390 else {
4fa9d550 391 thresh = fPixThresh[mod];
392 sigma = fPixThrSigma[mod];
451f5018 393 }
394}
395
396//_______________________________________________________________________
4fa9d550 397void AliITSUSimuParam::SetPixBiasVoltage(Double_t val, int mod)
451f5018 398{
399 // set threshold params
400 if (mod<0) {
4fa9d550 401 fPixBiasVoltageDef = val;
402 for (int i=fNPix;i--;) fPixBiasVoltage[i] = val;
451f5018 403 }
4fa9d550 404 else if (mod>=(int)fNPix) {
852af72e 405 if (fNPix>0) {AliFatal(Form("Wrong chip %d, NPidUpg=%d",mod,fNPix));}
4fa9d550 406 fPixBiasVoltageDef = val;
451f5018 407 }
4fa9d550 408 else fPixBiasVoltage[mod] = val;
451f5018 409 //
410}
411
412//_______________________________________________________________________
4fa9d550 413Double_t AliITSUSimuParam::GetPixBiasVoltage(UInt_t mod) const
451f5018 414{
415 // obtain threshold
4fa9d550 416 if (mod>=fNPix) {
852af72e 417 if (fNPix>0) {AliFatal(Form("Wrong chip %d, NPidUpg=%d",mod,fNPix));}
4fa9d550 418 return fPixBiasVoltageDef;
451f5018 419 }
4fa9d550 420 else return fPixBiasVoltage[mod];
451f5018 421}
422
423//_______________________________________________________________________
4fa9d550 424void AliITSUSimuParam::SetPixNoise(Double_t noise, Double_t baseline, int mod)
451f5018 425{
426 // set noise params
427 if (mod<0) {
4fa9d550 428 fPixNoiseDef = noise;
429 fPixBaselineDef = baseline;
430 for (int i=fNPix;i--;) {
431 fPixNoise[i] = noise;
432 fPixBaseline[i] = baseline;
451f5018 433 }
434 }
4fa9d550 435 else if (mod>=(int)fNPix) {
852af72e 436 if (fNPix>0) {AliFatal(Form("Wrong chip %d, NPidUpg=%d",mod,fNPix));}
4fa9d550 437 fPixNoiseDef = noise;
438 fPixBaselineDef = baseline;
451f5018 439 }
440 else {
4fa9d550 441 fPixNoise[mod] = noise;
442 fPixBaseline[mod] = baseline;
451f5018 443 }
444 //
445}
446
447//_______________________________________________________________________
4fa9d550 448void AliITSUSimuParam::GetPixNoise(UInt_t mod, Double_t &noise, Double_t &baseline) const
451f5018 449{
450 // obtain noise
4fa9d550 451 if (mod>=fNPix) {
852af72e 452 if (fNPix>0) {AliFatal(Form("Wrong chip %d, NPidUpg=%d",mod,fNPix));}
4fa9d550 453 noise = fPixNoiseDef;
454 baseline = fPixBaselineDef;
451f5018 455 }
456 else {
4fa9d550 457 noise = fPixNoise[mod];
458 baseline = fPixBaseline[mod];
451f5018 459 }
460}
461
462//_______________________________________________________________________
4fa9d550 463void AliITSUSimuParam::SetPixCouplingOption(UInt_t opt)
451f5018 464{
465 // set coupling option
4fa9d550 466 if (opt>=kMaxCouplingOptPix) AliFatal(Form("Coupling option %d should be less than %d",opt,kMaxCouplingOptPix));
467 fPixCouplOpt = opt;
451f5018 468}
469
470
471//______________________________________________________________________
472Double_t AliITSUSimuParam::LorentzAngleHole(Double_t B) const
473{
474 // Computes the Lorentz angle for electrons in Si
475 // Input: magnetic Field in KGauss
476 // Output: Lorentz angle in radians (positive if Bz is positive)
477 // Main Reference: NIM A 497 (2003) 389–396.
478 // "An algorithm for calculating the Lorentz angle in silicon detectors", V. Bartsch et al.
479 //
480 const Double_t krH=0.70; // Hall scattering factor for Hole
481 const Double_t kT0 = 300.; // reference Temperature (degree K).
482 const Double_t kmulow0 = 470.5; // cm^2/Volt-sec
483 const Double_t keT0 = -2.5; // Power of Temp.
484 const Double_t beta0 = 1.213; // beta coeff. at T0=300K
485 const Double_t keT1 = 0.17; // Power of Temp. for beta
486 const Double_t kvsat0 = 8.37E+06; // saturated velocity at T0=300K (cm/sec)
487 const Double_t keT2 = 0.52; // Power of Temp. for vsat
488 Double_t tT = fT;
489 Double_t eE= 1./fDOverV;
a11ef2e4 490 Double_t muLow=kmulow0*Power(tT/kT0,keT0);
491 Double_t beta=beta0*Power(tT/kT0,keT1);
492 Double_t vsat=kvsat0*Power(tT/kT0,keT2);
493 Double_t mu=muLow/Power(1+Power(muLow*eE/vsat,beta),1/beta);
494 Double_t angle=ATan(krH*mu*B*1.E-05); // Conversion Factor
451f5018 495 return angle;
496}
497
498//______________________________________________________________________
499Double_t AliITSUSimuParam::LorentzAngleElectron(Double_t B) const
500{
501 // Computes the Lorentz angle for electrons in Si
502 // Input: magnetic Field in KGauss
503 // Output: Lorentz angle in radians (positive if Bz is positive)
504 // Main Reference: NIM A 497 (2003) 389–396.
505 // "An algorithm for calculating the Lorentz angle in silicon detectors", V. Bartsch et al.
506 //
507 const Double_t krH=1.15; // Hall scattering factor for Electron
508 const Double_t kT0 = 300.; // reference Temperature (degree K).
509 const Double_t kmulow0 = 1417.0; // cm^2/Volt-sec
510 const Double_t keT0 = -2.2; // Power of Temp.
511 const Double_t beta0 = 1.109; // beta coeff. at T0=300K
512 const Double_t keT1 = 0.66; // Power of Temp. for beta
513 const Double_t kvsat0 = 1.07E+07; // saturated velocity at T0=300K (cm/sec)
514 const Double_t keT2 = 0.87; // Power of Temp. for vsat
515 Double_t tT = fT;
516 Double_t eE= 1./fDOverV;
a11ef2e4 517 Double_t muLow=kmulow0*Power(tT/kT0,keT0);
518 Double_t beta=beta0*Power(tT/kT0,keT1);
519 Double_t vsat=kvsat0*Power(tT/kT0,keT2);
520 Double_t mu=muLow/Power(1+Power(muLow*eE/vsat,beta),1/beta);
521 Double_t angle=ATan(krH*mu*B*1.E-05);
451f5018 522 return angle;
523}
524
c92b1537 525//___________________________________________________________
29ad4146 526const AliITSUParamList* AliITSUSimuParam::FindRespFunParams(Int_t detId) const
451f5018 527{
c92b1537 528 // find parameters list for detID
529 for (int i=fRespFunParam.GetEntriesFast();i--;) {
29ad4146 530 const AliITSUParamList* pr = GetRespFunParams(i);
c92b1537 531 if (int(pr->GetUniqueID())==detId) return pr;
532 }
533 return 0;
451f5018 534}
535
c92b1537 536//___________________________________________________________
29ad4146 537void AliITSUSimuParam::AddRespFunParam(AliITSUParamList* pr)
451f5018 538{
c92b1537 539 // add spread parameterization data
540 fRespFunParam.AddLast(pr);
451f5018 541}
29ad4146 542//______________________________________________________________________________________
543Double_t AliITSUSimuParam::CalcProbNoiseOverThreshold(double mean, double sigma, double thresh)
544{
545 // calculate probability of noise exceeding the threshold
546 //if (mean+6*sigma<thresh) return 0;
547 //if (mean-6*sigma>thresh) return 1.;
548 //const double ksqrt2 = 1.41421356237309515e+00;
549 //return 0.5*AliMathBase::ErfcFast( (thresh-mean)/(sigma*ksqrt2));
550
551 // The MIMOSA sensors show Landau noise... RTF
552 // Calculate probability of Landau noise exceeding the threshold
553
554
555 //Double_t prob = this->LandauCdf(thresh,sigma,mean);// myLcdf->Eval(thresh);
556 //
557 //printf("====> After LandauCdf(thresh,sigma,mean)");
558
559 //return prob;
560 // (double x, double xi, double x0) {
561
562 // Implementation is taken from ROOT
563// Printf("AliITSUSimuParam::LandauCdf");
564 //arguments threshold, sigma, mean
565
566 double x = thresh;
567 double xi = sigma;
568 double x0 = mean;
569
570
571 static double p1[5] = {0.2514091491e+0,-0.6250580444e-1, 0.1458381230e-1, -0.2108817737e-2, 0.7411247290e-3};
572 static double q1[5] = {1.0 ,-0.5571175625e-2, 0.6225310236e-1, -0.3137378427e-2, 0.1931496439e-2};
573
574 static double p2[4] = {0.2868328584e+0, 0.3564363231e+0, 0.1523518695e+0, 0.2251304883e-1};
575 static double q2[4] = {1.0 , 0.6191136137e+0, 0.1720721448e+0, 0.2278594771e-1};
576
577 static double p3[4] = {0.2868329066e+0, 0.3003828436e+0, 0.9950951941e-1, 0.8733827185e-2};
578 static double q3[4] = {1.0 , 0.4237190502e+0, 0.1095631512e+0, 0.8693851567e-2};
579
580 static double p4[4] = {0.1000351630e+1, 0.4503592498e+1, 0.1085883880e+2, 0.7536052269e+1};
581 static double q4[4] = {1.0 , 0.5539969678e+1, 0.1933581111e+2, 0.2721321508e+2};
582
583 static double p5[4] = {0.1000006517e+1, 0.4909414111e+2, 0.8505544753e+2, 0.1532153455e+3};
584 static double q5[4] = {1.0 , 0.5009928881e+2, 0.1399819104e+3, 0.4200002909e+3};
585
586 static double p6[4] = {0.1000000983e+1, 0.1329868456e+3, 0.9162149244e+3, -0.9605054274e+3};
587 static double q6[4] = {1.0 , 0.1339887843e+3, 0.1055990413e+4, 0.5532224619e+3};
588
589 static double a1[4] = {0, -0.4583333333e+0, 0.6675347222e+0,-0.1641741416e+1};
590
591 static double a2[4] = {0, 1.0 ,-0.4227843351e+0,-0.2043403138e+1};
592
593 double v = (x - x0)/xi;
594 double u;
595 double lan;
596
597
598
599 if (v < -5.5) {
600 u = std::exp(v+1);
601 lan = 0.3989422803*std::exp(-1./u)*std::sqrt(u)*(1+(a1[1]+(a1[2]+a1[3]*u)*u)*u);
602 }
603 else if (v < -1 ) {
604 u = std::exp(-v-1);
605 lan = (std::exp(-u)/std::sqrt(u))*(p1[0]+(p1[1]+(p1[2]+(p1[3]+p1[4]*v)*v)*v)*v)/
606 (q1[0]+(q1[1]+(q1[2]+(q1[3]+q1[4]*v)*v)*v)*v);
607 }
608 else if (v < 1)
609 lan = (p2[0]+(p2[1]+(p2[2]+p2[3]*v)*v)*v)/(q2[0]+(q2[1]+(q2[2]+q2[3]*v)*v)*v);
610 else if (v < 4)
611 lan = (p3[0]+(p3[1]+(p3[2]+p3[3]*v)*v)*v)/(q3[0]+(q3[1]+(q3[2]+q3[3]*v)*v)*v);
612 else if (v < 12) {
613 u = 1./v;
614 lan = (p4[0]+(p4[1]+(p4[2]+p4[3]*u)*u)*u)/(q4[0]+(q4[1]+(q4[2]+q4[3]*u)*u)*u);
615 }
616 else if (v < 50) {
617 u = 1./v;
618 lan = (p5[0]+(p5[1]+(p5[2]+p5[3]*u)*u)*u)/(q5[0]+(q5[1]+(q5[2]+q5[3]*u)*u)*u);
619 }
620 else if (v < 300) {
621 u = 1./v;
622 lan = (p6[0]+(p6[1]+(p6[2]+p6[3]*u)*u)*u)/(q6[0]+(q6[1]+(q6[2]+q6[3]*u)*u)*u);
623 }
624 else {
625 u = 1./(v-v*std::log(v)/(v+1));
626 lan = 1-(a2[1]+(a2[2]+a2[3]*u)*u)*u;
627 }
628
629
630 return lan;
631
632
633
634
635}
636
637//_______________________________________________________________________
638Double_t AliITSUSimuParam::GenerateNoiseQFunction(double prob, double mean, double sigma)
639{
640 // generate random noise exceeding threshold probability prob, i.e. find a random point in the right
641 // tail of the gaussian(base,noise), provided that the tail integral = prob
642 //const double ksqrt2 = 1.41421356237309515e+00;
643 //return mean+sigma*ksqrt2*TMath::ErfcInverse(2*prob*(1.-gRandom->Rndm()));
644
645 double z = gRandom->Uniform(prob,(1.0-1e-9));
646 double xi = sigma;
647
648 static double f[982] = {
649 0 , 0 , 0 ,0 ,0 ,-2.244733,
650 -2.204365,-2.168163,-2.135219,-2.104898,-2.076740,-2.050397,
651 -2.025605,-2.002150,-1.979866,-1.958612,-1.938275,-1.918760,
652 -1.899984,-1.881879,-1.864385,-1.847451,-1.831030,-1.815083,
653 -1.799574,-1.784473,-1.769751,-1.755383,-1.741346,-1.727620,
654 -1.714187,-1.701029,-1.688130,-1.675477,-1.663057,-1.650858,
655 -1.638868,-1.627078,-1.615477,-1.604058,-1.592811,-1.581729,
656 -1.570806,-1.560034,-1.549407,-1.538919,-1.528565,-1.518339,
657 -1.508237,-1.498254,-1.488386,-1.478628,-1.468976,-1.459428,
658 -1.449979,-1.440626,-1.431365,-1.422195,-1.413111,-1.404112,
659 -1.395194,-1.386356,-1.377594,-1.368906,-1.360291,-1.351746,
660 -1.343269,-1.334859,-1.326512,-1.318229,-1.310006,-1.301843,
661 -1.293737,-1.285688,-1.277693,-1.269752,-1.261863,-1.254024,
662 -1.246235,-1.238494,-1.230800,-1.223153,-1.215550,-1.207990,
663 -1.200474,-1.192999,-1.185566,-1.178172,-1.170817,-1.163500,
664 -1.156220,-1.148977,-1.141770,-1.134598,-1.127459,-1.120354,
665 -1.113282,-1.106242,-1.099233,-1.092255,
666 -1.085306,-1.078388,-1.071498,-1.064636,-1.057802,-1.050996,
667 -1.044215,-1.037461,-1.030733,-1.024029,-1.017350,-1.010695,
668 -1.004064, -.997456, -.990871, -.984308, -.977767, -.971247,
669 -.964749, -.958271, -.951813, -.945375, -.938957, -.932558,
670 -.926178, -.919816, -.913472, -.907146, -.900838, -.894547,
671 -.888272, -.882014, -.875773, -.869547, -.863337, -.857142,
672 -.850963, -.844798, -.838648, -.832512, -.826390, -.820282,
673 -.814187, -.808106, -.802038, -.795982, -.789940, -.783909,
674 -.777891, -.771884, -.765889, -.759906, -.753934, -.747973,
675 -.742023, -.736084, -.730155, -.724237, -.718328, -.712429,
676 -.706541, -.700661, -.694791, -.688931, -.683079, -.677236,
677 -.671402, -.665576, -.659759, -.653950, -.648149, -.642356,
678 -.636570, -.630793, -.625022, -.619259, -.613503, -.607754,
679 -.602012, -.596276, -.590548, -.584825, -.579109, -.573399,
680 -.567695, -.561997, -.556305, -.550618, -.544937, -.539262,
681 -.533592, -.527926, -.522266, -.516611, -.510961, -.505315,
682 -.499674, -.494037, -.488405, -.482777,
683 -.477153, -.471533, -.465917, -.460305, -.454697, -.449092,
684 -.443491, -.437893, -.432299, -.426707, -.421119, -.415534,
685 -.409951, -.404372, -.398795, -.393221, -.387649, -.382080,
686 -.376513, -.370949, -.365387, -.359826, -.354268, -.348712,
687 -.343157, -.337604, -.332053, -.326503, -.320955, -.315408,
688 -.309863, -.304318, -.298775, -.293233, -.287692, -.282152,
689 -.276613, -.271074, -.265536, -.259999, -.254462, -.248926,
690 -.243389, -.237854, -.232318, -.226783, -.221247, -.215712,
691 -.210176, -.204641, -.199105, -.193568, -.188032, -.182495,
692 -.176957, -.171419, -.165880, -.160341, -.154800, -.149259,
693 -.143717, -.138173, -.132629, -.127083, -.121537, -.115989,
694 -.110439, -.104889, -.099336, -.093782, -.088227, -.082670,
695 -.077111, -.071550, -.065987, -.060423, -.054856, -.049288,
696 -.043717, -.038144, -.032569, -.026991, -.021411, -.015828,
697 -.010243, -.004656, .000934, .006527, .012123, .017722,
698 .023323, .028928, .034535, .040146, .045759, .051376,
699 .056997, .062620, .068247, .073877,
700 .079511, .085149, .090790, .096435, .102083, .107736,
701 .113392, .119052, .124716, .130385, .136057, .141734,
702 .147414, .153100, .158789, .164483, .170181, .175884,
703 .181592, .187304, .193021, .198743, .204469, .210201,
704 .215937, .221678, .227425, .233177, .238933, .244696,
705 .250463, .256236, .262014, .267798, .273587, .279382,
706 .285183, .290989, .296801, .302619, .308443, .314273,
707 .320109, .325951, .331799, .337654, .343515, .349382,
708 .355255, .361135, .367022, .372915, .378815, .384721,
709 .390634, .396554, .402481, .408415, .414356, .420304,
710 .426260, .432222, .438192, .444169, .450153, .456145,
711 .462144, .468151, .474166, .480188, .486218, .492256,
712 .498302, .504356, .510418, .516488, .522566, .528653,
713 .534747, .540850, .546962, .553082, .559210, .565347,
714 .571493, .577648, .583811, .589983, .596164, .602355,
715 .608554, .614762, .620980, .627207, .633444, .639689,
716 .645945, .652210, .658484, .664768,
717 .671062, .677366, .683680, .690004, .696338, .702682,
718 .709036, .715400, .721775, .728160, .734556, .740963,
719 .747379, .753807, .760246, .766695, .773155, .779627,
720 .786109, .792603, .799107, .805624, .812151, .818690,
721 .825241, .831803, .838377, .844962, .851560, .858170,
722 .864791, .871425, .878071, .884729, .891399, .898082,
723 .904778, .911486, .918206, .924940, .931686, .938446,
724 .945218, .952003, .958802, .965614, .972439, .979278,
725 .986130, .992996, .999875, 1.006769, 1.013676, 1.020597,
726 1.027533, 1.034482, 1.041446, 1.048424, 1.055417, 1.062424,
727 1.069446, 1.076482, 1.083534, 1.090600, 1.097681, 1.104778,
728 1.111889, 1.119016, 1.126159, 1.133316, 1.140490, 1.147679,
729 1.154884, 1.162105, 1.169342, 1.176595, 1.183864, 1.191149,
730 1.198451, 1.205770, 1.213105, 1.220457, 1.227826, 1.235211,
731 1.242614, 1.250034, 1.257471, 1.264926, 1.272398, 1.279888,
732 1.287395, 1.294921, 1.302464, 1.310026, 1.317605, 1.325203,
733 1.332819, 1.340454, 1.348108, 1.355780,
734 1.363472, 1.371182, 1.378912, 1.386660, 1.394429, 1.402216,
735 1.410024, 1.417851, 1.425698, 1.433565, 1.441453, 1.449360,
736 1.457288, 1.465237, 1.473206, 1.481196, 1.489208, 1.497240,
737 1.505293, 1.513368, 1.521465, 1.529583, 1.537723, 1.545885,
738 1.554068, 1.562275, 1.570503, 1.578754, 1.587028, 1.595325,
739 1.603644, 1.611987, 1.620353, 1.628743, 1.637156, 1.645593,
740 1.654053, 1.662538, 1.671047, 1.679581, 1.688139, 1.696721,
741 1.705329, 1.713961, 1.722619, 1.731303, 1.740011, 1.748746,
742 1.757506, 1.766293, 1.775106, 1.783945, 1.792810, 1.801703,
743 1.810623, 1.819569, 1.828543, 1.837545, 1.846574, 1.855631,
744 1.864717, 1.873830, 1.882972, 1.892143, 1.901343, 1.910572,
745 1.919830, 1.929117, 1.938434, 1.947781, 1.957158, 1.966566,
746 1.976004, 1.985473, 1.994972, 2.004503, 2.014065, 2.023659,
747 2.033285, 2.042943, 2.052633, 2.062355, 2.072110, 2.081899,
748 2.091720, 2.101575, 2.111464, 2.121386, 2.131343, 2.141334,
749 2.151360, 2.161421, 2.171517, 2.181648, 2.191815, 2.202018,
750 2.212257, 2.222533, 2.232845, 2.243195,
751 2.253582, 2.264006, 2.274468, 2.284968, 2.295507, 2.306084,
752 2.316701, 2.327356, 2.338051, 2.348786, 2.359562, 2.370377,
753 2.381234, 2.392131, 2.403070, 2.414051, 2.425073, 2.436138,
754 2.447246, 2.458397, 2.469591, 2.480828, 2.492110, 2.503436,
755 2.514807, 2.526222, 2.537684, 2.549190, 2.560743, 2.572343,
756 2.583989, 2.595682, 2.607423, 2.619212, 2.631050, 2.642936,
757 2.654871, 2.666855, 2.678890, 2.690975, 2.703110, 2.715297,
758 2.727535, 2.739825, 2.752168, 2.764563, 2.777012, 2.789514,
759 2.802070, 2.814681, 2.827347, 2.840069, 2.852846, 2.865680,
760 2.878570, 2.891518, 2.904524, 2.917588, 2.930712, 2.943894,
761 2.957136, 2.970439, 2.983802, 2.997227, 3.010714, 3.024263,
762 3.037875, 3.051551, 3.065290, 3.079095, 3.092965, 3.106900,
763 3.120902, 3.134971, 3.149107, 3.163312, 3.177585, 3.191928,
764 3.206340, 3.220824, 3.235378, 3.250005, 3.264704, 3.279477,
765 3.294323, 3.309244, 3.324240, 3.339312, 3.354461, 3.369687,
766 3.384992, 3.400375, 3.415838, 3.431381, 3.447005, 3.462711,
767 3.478500, 3.494372, 3.510328, 3.526370,
768 3.542497, 3.558711, 3.575012, 3.591402, 3.607881, 3.624450,
769 3.641111, 3.657863, 3.674708, 3.691646, 3.708680, 3.725809,
770 3.743034, 3.760357, 3.777779, 3.795300, 3.812921, 3.830645,
771 3.848470, 3.866400, 3.884434, 3.902574, 3.920821, 3.939176,
772 3.957640, 3.976215, 3.994901, 4.013699, 4.032612, 4.051639,
773 4.070783, 4.090045, 4.109425, 4.128925, 4.148547, 4.168292,
774 4.188160, 4.208154, 4.228275, 4.248524, 4.268903, 4.289413,
775 4.310056, 4.330832, 4.351745, 4.372794, 4.393982, 4.415310,
776 4.436781, 4.458395, 4.480154, 4.502060, 4.524114, 4.546319,
777 4.568676, 4.591187, 4.613854, 4.636678, 4.659662, 4.682807,
778 4.706116, 4.729590, 4.753231, 4.777041, 4.801024, 4.825179,
779 4.849511, 4.874020, 4.898710, 4.923582, 4.948639, 4.973883,
780 4.999316, 5.024942, 5.050761, 5.076778, 5.102993, 5.129411,
781 5.156034, 5.182864, 5.209903, 5.237156, 5.264625, 5.292312,
782 5.320220, 5.348354, 5.376714, 5.405306, 5.434131, 5.463193,
783 5.492496, 5.522042, 5.551836, 5.581880, 5.612178, 5.642734,
784 5.673552, 5.704634, 5.735986, 5.767610,
785 5.799512, 5.831694, 5.864161, 5.896918, 5.929968, 5.963316,
786 5.996967, 6.030925, 6.065194, 6.099780, 6.134687, 6.169921,
787 6.205486, 6.241387, 6.277630, 6.314220, 6.351163, 6.388465,
788 6.426130, 6.464166, 6.502578, 6.541371, 6.580553, 6.620130,
789 6.660109, 6.700495, 6.741297, 6.782520, 6.824173, 6.866262,
790 6.908795, 6.951780, 6.995225, 7.039137, 7.083525, 7.128398,
791 7.173764, 7.219632, 7.266011, 7.312910, 7.360339, 7.408308,
792 7.456827, 7.505905, 7.555554, 7.605785, 7.656608, 7.708035,
793 7.760077, 7.812747, 7.866057, 7.920019, 7.974647, 8.029953,
794 8.085952, 8.142657, 8.200083, 8.258245, 8.317158, 8.376837,
795 8.437300, 8.498562, 8.560641, 8.623554, 8.687319, 8.751955,
796 8.817481, 8.883916, 8.951282, 9.019600, 9.088889, 9.159174,
797 9.230477, 9.302822, 9.376233, 9.450735, 9.526355, 9.603118,
798 9.681054, 9.760191, 9.840558, 9.922186,10.005107,10.089353,
799 10.174959,10.261958,10.350389,10.440287,10.531693,10.624646,
800 10.719188,10.815362,10.913214,11.012789,11.114137,11.217307,
801 11.322352,11.429325,11.538283,11.649285,
802 11.762390,11.877664,11.995170,12.114979,12.237161,12.361791,
803 12.488946,12.618708,12.751161,12.886394,13.024498,13.165570,
804 13.309711,13.457026,13.607625,13.761625,13.919145,14.080314,
805 14.245263,14.414134,14.587072,14.764233,14.945778,15.131877,
806 15.322712,15.518470,15.719353,15.925570,16.137345,16.354912,
807 16.578520,16.808433,17.044929,17.288305,17.538873,17.796967,
808 18.062943,18.337176,18.620068,18.912049,19.213574,19.525133,
809 19.847249,20.180480,20.525429,20.882738,21.253102,21.637266,
810 22.036036,22.450278,22.880933,23.329017,23.795634,24.281981,
811 24.789364,25.319207,25.873062,26.452634,27.059789,27.696581,
812 28.365274,29.068370,29.808638,30.589157,31.413354,32.285060,
813 33.208568,34.188705,35.230920,36.341388,37.527131,38.796172,
814 40.157721,41.622399,43.202525,44.912465,46.769077,48.792279,
815 51.005773,53.437996,56.123356,59.103894 };
816
817 if (xi <= 0) return 0;
818 // if (z <= 0) return -std::numeric_limits<double>::infinity();
819 //if (z >= 1) return std::numeric_limits<double>::infinity();
820
821 double ranlan, u, v;
822 u = 1000*z;
823 int i = int(u);
824 u -= i;
825 if (i >= 70 && i < 800) {
826 ranlan = f[i-1] + u*(f[i] - f[i-1]);
827 } else if (i >= 7 && i <= 980) {
828 ranlan = f[i-1] + u*(f[i]-f[i-1]-0.25*(1-u)*(f[i+1]-f[i]-f[i-1]+f[i-2]));
829 } else if (i < 7) {
830 v = std::log(z);
831 u = 1/v;
832 ranlan = ((0.99858950+(3.45213058E1+1.70854528E1*u)*u)/
833 (1 +(3.41760202E1+4.01244582 *u)*u))*
834 (-std::log(-0.91893853-v)-1);
835 } else {
836 u = 1-z;
837 v = u*u;
838 if (z <= 0.999) {
839 ranlan = (1.00060006+2.63991156E2*u+4.37320068E3*v)/
840 ((1 +2.57368075E2*u+3.41448018E3*v)*u);
841 } else {
842 ranlan = (1.00001538+6.07514119E3*u+7.34266409E5*v)/
843 ((1 +6.06511919E3*u+6.94021044E5*v)*u);
844 }
845 }
846
847
848
849 Double_t lq = xi*ranlan;
850
851
852 Double_t qOverThresh = lq + mean;
853
854 return qOverThresh;
855
856
857}
858//_______________________________________________________________________
859
860
861
862