new SDD preprocessor + removal of eff C++ warning (base) - E. Crescio
[u/mrichter/AliRoot.git] / ITS / AliITSCalibration.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
17 //////////////////////////////////////////////////////
18 //  Calibration class for set:ITS                   //
19 //  Specific subdetector implementation is done in  //
20 //  AliITSCalibrationSPD                            //
21 //  AliITSCalibrationSDD                            //
22 //  AliITSCalibrationSSD                            //
23 //////////////////////////////////////////////////////
24
25 #include "Riostream.h"
26 #include "AliITSCalibration.h"
27 #include "AliLog.h"
28
29 ClassImp(AliITSCalibration)
30
31 //______________________________________________________________________
32 AliITSCalibration::AliITSCalibration():
33 TObject(),
34 fDataType(),
35 fdv(0.000375),
36 fN(0.),
37 fT(300.),
38 fGeVcharge(0.),
39 fResponse(){
40     // Default Constructor (300 microns and 80 volts)
41
42     SetGeVToCharge();
43     fResponse = 0;
44 }
45 //______________________________________________________________________
46 AliITSCalibration::AliITSCalibration(Double_t thickness):
47 TObject(),
48 fDataType(),
49 fdv(0.),
50 fN(0.),
51 fT(300.),
52 fGeVcharge(0.),
53 fResponse(){
54     // Default Constructor
55
56     fdv = thickness/80.0;   // 80 volts.
57     SetGeVToCharge();
58     fResponse = 0;
59 }
60
61 //______________________________________________________________________
62 AliITSCalibration::AliITSCalibration(const AliITSCalibration &ob):
63 TObject(ob),
64 fDataType(ob.fDataType),
65 fdv(ob.fdv),
66 fN(ob.fN),
67 fT(ob.fT),
68 fGeVcharge(ob.fGeVcharge),
69 fResponse(ob.fResponse)
70 {
71   // Copy constructor
72
73 }
74 /*
75 //______________________________________________________________________________
76 AliITSCalibration& AliITSCalibration::operator= (const AliITSCalibration& source)
77 {
78   // Asignment operator
79
80   this->~AliITSCalibration();
81   new(this) AliITSCalibration(source);
82   return *this;
83
84
85 }
86 */
87 //______________________________________________________________________
88 Double_t AliITSCalibration::MobilityElectronSiEmp() const {
89     // Computes the electron mobility in cm^2/volt-sec. Taken from SILVACO
90     // International ATLAS II, 2D Device Simulation Framework, User Manual 
91     // Chapter 5 Equation 5-6. An empirical function for low-field mobiliity 
92     // in silicon at different tempeatures.
93     // Inputs:
94     //    none.
95     // Output:
96     //    none.
97     // Return:
98     //    The Mobility of electrons in Si at a give temprature and impurity
99     //    concentration. [cm^2/Volt-sec]
100     const Double_t km0  = 55.24; // cm^2/Volt-sec
101     const Double_t km1  = 7.12E+08; // cm^2 (degree K)^2.3 / Volt-sec
102     const Double_t kN0  = 1.072E17; // #/cm^3
103     const Double_t kT0  = 300.; // degree K.
104     const Double_t keT0 = -2.3; // Power of Temp.
105     const Double_t keT1 = -3.8; // Power of Temp.
106     const Double_t keN  = 0.73; // Power of Dopent Consentrations
107     Double_t m;
108     Double_t tT = fT,nN = fN;
109
110     if(nN<=0.0){ // Simple case.
111         if(tT==300.) return 1350.0; // From Table 5-1 at consentration 1.0E14.
112         m = km1*TMath::Power(tT,keT0);
113         return m;
114     } // if nN<=0.0
115     m = km1*TMath::Power(tT,keT0) - km0;
116     m /= 1.0 + TMath::Power(tT/kT0,keT1)*TMath::Power(nN/kN0,keN);
117     m += km0;
118     return m;
119 }
120 //______________________________________________________________________
121 Double_t AliITSCalibration::MobilityHoleSiEmp() const {
122     // Computes the Hole mobility in cm^2/volt-sec. Taken from SILVACO
123     // International ATLAS II, 2D Device Simulation Framework, User Manual 
124     // Chapter 5 Equation 5-7 An empirical function for low-field mobiliity 
125     // in silicon at different tempeatures.
126     // Inputs:
127     //    none.
128     // Output:
129     //    none.
130     // Return:
131     //    The Mobility of Hole in Si at a give temprature and impurity
132     //    concentration. [cm^2/Volt-sec]
133     const Double_t km0a = 49.74; // cm^2/Volt-sec
134     const Double_t km0b = 49.70; // cm^2/Volt-sec
135     const Double_t km1  = 1.35E+08; // cm^2 (degree K)^2.3 / Volt-sec
136     const Double_t kN0  = 1.606E17; // #/cm^3
137     const Double_t kT0  = 300.; // degree K.
138     const Double_t keT0 = -2.2; // Power of Temp.
139     const Double_t keT1 = -3.7; // Power of Temp.
140     const Double_t keN  = 0.70; // Power of Dopent Consentrations
141     Double_t m;
142     Double_t tT = fT,nN = fN;
143
144     if(nN<=0.0){ // Simple case.
145         if(tT==300.) return 495.0; // From Table 5-1 at consentration 1.0E14.
146         m = km1*TMath::Power(tT,keT0) + km0a-km0b;
147         return m;
148     } // if nN<=0.0
149     m = km1*TMath::Power(tT,keT0) - km0b;
150     m /= 1.0 + TMath::Power(tT/kT0,keT1)*TMath::Power(nN/kN0,keN);
151     m += km0a;
152     return m;
153 }
154 //______________________________________________________________________
155 Double_t AliITSCalibration::DiffusionCoefficientElectron() const {
156     // Computes the Diffusion coefficient for electrons in cm^2/sec. Taken 
157     // from SILVACO International ATLAS II, 2D Device Simulation Framework, 
158     // User Manual Chapter 5 Equation 5-53. Einstein relations for diffusion 
159     // coefficient. Note: 1 cm^2/sec = 10 microns^2/nanosec.
160     // Inputs:
161     //    none.
162     // Output:
163     //    none.
164     // Return:
165     //    The Diffusion Coefficient of electrons in Si at a give temprature
166     //    and impurity concentration. [cm^2/sec]
167     // const Double_t kb = 1.3806503E-23; // Joules/degree K
168     // const Double_t qe = 1.60217646E-19; // Coulumbs.
169     const Double_t kbqe = 8.617342312E-5; // Volt/degree K
170     Double_t m = MobilityElectronSiEmp();
171     Double_t tT = fT;
172
173     return m*kbqe*tT;  // [cm^2/sec]
174 }
175 //______________________________________________________________________
176 Double_t AliITSCalibration::DiffusionCoefficientHole() const {
177     // Computes the Diffusion coefficient for Holes in cm^2/sec. Taken 
178     // from SILVACO International ATLAS II, 2D Device Simulation Framework, 
179     // User Manual Chapter 5 Equation 5-53. Einstein relations for diffusion 
180     // coefficient. Note: 1 cm^2/sec = 10 microns^2/nanosec.
181     // Inputs:
182     //    none.
183     // Output:
184     //    none.
185     // Return:
186     //    The Defusion Coefficient of Hole in Si at a give temprature and 
187     //    impurity concentration. [cm^2/sec]
188     //    and impurity concentration. [cm^2/sec]
189     // const Double_t kb = 1.3806503E-23; // Joules/degree K
190     // const Double_t qe = 1.60217646E-19; // Coulumbs.
191     const Double_t kbqe = 8.617342312E-5; // Volt/degree K
192     Double_t m = MobilityHoleSiEmp();
193     Double_t tT = fT;
194
195     return m*kbqe*tT;  // [cm^2/sec]
196 }
197 //______________________________________________________________________
198 Double_t AliITSCalibration::SpeedElectron() const {
199     // Computes the average speed for electrons in Si under the low-field 
200     // approximation. [cm/sec].
201     // Inputs:
202     //    none.
203     // Output:
204     //    none.
205     // Return:
206     //    The speed the holes are traveling at due to the low field applied. 
207     //    [cm/sec]
208     Double_t m = MobilityElectronSiEmp();
209
210     return m/fdv;  // [cm/sec]
211 }
212 //______________________________________________________________________
213 Double_t AliITSCalibration::SpeedHole() const {
214     // Computes the average speed for Holes in Si under the low-field 
215     // approximation.[cm/sec].
216     // Inputs:
217     //    none.
218     // Output:
219     //    none.
220     // Return:
221     //    The speed the holes are traveling at due to the low field applied. 
222     //    [cm/sec]
223     Double_t m = MobilityHoleSiEmp();
224
225     return m/fdv;  // [cm/sec]
226 }
227 //______________________________________________________________________
228 Double_t AliITSCalibration::SigmaDiffusion3D(Double_t l) const {
229     // Returns the Gaussian sigma^2 == <x^2+y^2+z^2> [cm^2] due to the
230     // defusion of electrons or holes through a distance l [cm] caused 
231     // by an applied voltage v [volt] through a distance d [cm] in any
232     //  material at a temperature T [degree K]. The sigma diffusion when
233     //  expressed in terms of the distance over which the diffusion 
234     // occures, l=time/speed, is independent of the mobility and therefore
235     //  the properties of the material. The charge distributions is given by 
236     // n = exp(-r^2/4Dt)/(4piDt)^1.5. From this <r^2> = 6Dt where D=mkT/e
237     // (m==mobility, k==Boltzman's constant, T==temparature, e==electric 
238     // charge. and vel=m*v/d. consiquently sigma^2=6kTdl/ev.
239     // Inputs:
240     //    Double_t l   Distance the charge has to travel.
241     // Output:
242     //    none.
243     // Return:
244     //    The Sigma due to the diffution of electrons. [cm]
245     const Double_t kcon = 5.17040258E-04; // == 6k/e [J/col or volts]
246
247     return TMath::Sqrt(kcon*fT*fdv*l);  // [cm]
248 }
249 //______________________________________________________________________
250 Double_t AliITSCalibration::SigmaDiffusion2D(Double_t l) const {
251     // Returns the Gaussian sigma^2 == <x^2+z^2> [cm^2] due to the defusion 
252     // of electrons or holes through a distance l [cm] caused by an applied
253     // voltage v [volt] through a distance d [cm] in any material at a
254     // temperature T [degree K]. The sigma diffusion when expressed in terms
255     // of the distance over which the diffusion occures, l=time/speed, is 
256     // independent of the mobility and therefore the properties of the
257     // material. The charge distributions is given by 
258     // n = exp(-r^2/4Dt)/(4piDt)^1.5. From this <x^2+z^2> = 4Dt where D=mkT/e
259     // (m==mobility, k==Boltzman's constant, T==temparature, e==electric 
260     // charge. and vel=m*v/d. consiquently sigma^2=4kTdl/ev.
261     // Inputs:
262     //    Double_t l   Distance the charge has to travel.
263     // Output:
264     //    none.
265     // Return:
266     //    The Sigma due to the diffution of electrons. [cm]
267     const Double_t kcon = 3.446935053E-04; // == 4k/e [J/col or volts]
268
269     return TMath::Sqrt(kcon*fT*fdv*l);  // [cm]
270 }
271 //______________________________________________________________________
272 Double_t AliITSCalibration::SigmaDiffusion1D(Double_t l) const {
273     // Returns the Gaussian sigma^2 == <x^2> [cm^2] due to the defusion 
274     // of electrons or holes through a distance l [cm] caused by an applied
275     // voltage v [volt] through a distance d [cm] in any material at a
276     // temperature T [degree K]. The sigma diffusion when expressed in terms
277     // of the distance over which the diffusion occures, l=time/speed, is 
278     // independent of the mobility and therefore the properties of the
279     // material. The charge distributions is given by 
280     // n = exp(-r^2/4Dt)/(4piDt)^1.5. From this <r^2> = 2Dt where D=mkT/e
281     // (m==mobility, k==Boltzman's constant, T==temparature, e==electric 
282     // charge. and vel=m*v/d. consiquently sigma^2=2kTdl/ev.
283     // Inputs:
284     //    Double_t l   Distance the charge has to travel.
285     // Output:
286     //    none.
287     // Return:
288     //    The Sigma due to the diffution of electrons. [cm]
289     const Double_t kcon = 1.723467527E-04; // == 2k/e [J/col or volts]
290
291     return TMath::Sqrt(kcon*fT*fdv*l);  // [cm]
292 }
293 //----------------------------------------------------------------------
294 Double_t AliITSCalibration::DepletedRegionThicknessA(Double_t dopCons,
295                                                  Double_t voltage,
296                                                  Double_t elecCharge,
297                                                  Double_t voltBuiltIn)const{
298     // Computes the thickness of the depleted region in Si due to the 
299     // application of an external bias voltage. From the Particle Data
300     // Book, 28.8 Silicon semiconductor detectors equation 28.19 (2004)
301     // Physics Letters B "Review of Particle Physics" Volume 592, Issue 1-4
302     // July 15 2004, ISSN 0370-2693 page 263. First equation.
303     // Inputs:
304     //    Double_t dopCons           "N" doping concentration
305     //    Double_t voltage           "V" external bias voltage
306     //    Double_t elecCharge        "e" electronic charge
307     //    Double_t voltBuiltIn=0.5   "V_bi" "built-in" Voltage (~0.5V for
308     //                               resistivities typically used in detectors)
309     // Output:
310     //    none.
311     // Return:
312     //    The thickness of the depleted region
313
314     return TMath::Sqrt(2.0*(voltage+voltBuiltIn)/(dopCons*elecCharge));
315 }
316 //----------------------------------------------------------------------
317 Double_t AliITSCalibration::DepletedRegionThicknessB(Double_t resist,
318                                                  Double_t voltage,
319                                                  Double_t mobility,
320                                                  Double_t voltBuiltIn,
321                                                  Double_t dielConst)const{
322     // Computes the thickness of the depleted region in Si due to the 
323     // application of an external bias voltage. From the Particle Data
324     // Book, 28.8 Silicon semiconductor detectors equation 28.19 (2004)
325     // Physics Letters B "Review of Particle Physics" Volume 592, Issue 1-4
326     // July 15 2004, ISSN 0370-2693 page 263. Second Equation.
327     // Inputs:
328     //    Double_t resist            "rho" resistivity (typically 1-10 kOhm cm)
329     //    Double_t voltage           "V" external bias voltage
330     //    Double_t mobility          "mu" charge carrier mobility
331     //                                  (electons 1350, holes 450 cm^2/V/s)
332     //    Double_t voltBuiltIn=0.5   "V_bi" "built-in" Voltage (~0.5V for
333     //                               resistivities typically used in detectors)
334     //    Double_t dielConst=1.E-12  "epsilon" dielectric constant = 11.9 *
335     //                                (permittivity of free space) or ~ 1 pF/cm
336     // Output:
337     //    none.
338     // Return:
339     //    The thickness of the depleted region
340
341     return TMath::Sqrt(2.8*resist*mobility*dielConst*(voltage+voltBuiltIn));
342 }
343 //----------------------------------------------------------------------
344 Double_t AliITSCalibration::ReverseBiasCurrent(Double_t temp,
345                                             Double_t revBiasCurT1,
346                                             Double_t tempT1,
347                                             Double_t energy)const{
348     // Computes the temperature dependance of the reverse bias current
349     // of Si detectors. From the Particle Data
350     // Book, 28.8 Silicon semiconductor detectors equation 28.21 (2004)
351     // Physics Letters B "Review of Particle Physics" Volume 592, Issue 1-4
352     // July 15 2004, ISSN 0370-2693 page 263.
353     // Inputs:
354     //    Double_t temp         The temperature at which the current is wanted
355     //    Double_t revBiasCurT1 The reference bias current at temp T1
356     //    Double_t tempT1       The temperature correstponding to revBiasCurT1 
357     //    Double_t energy=1.2   Some energy [eV]
358     // Output:
359     //    none.
360     // Return:
361     //    The reverse bias current at the tempeature temp.
362     const Double_t kBoltz = 8.617343E-5; //[eV/K]
363
364     return revBiasCurT1*(temp*temp/(tempT1*tempT1))*
365         TMath::Exp(-0.5*energy*(tempT1-temp)/(kBoltz*tempT1*temp));
366 }
367 //----------------------------------------------------------------------
368 void AliITSCalibration::Print(ostream *os) const {
369   // Standard output format for this class.
370   // Inputs:
371     *os << fdv << " " << fN << " " << fT << " ";
372     *os << fGeVcharge;    
373   //    printf("%-10.6e  %-10.6e %-10.6e %-10.6e \n",fdv,fN,fT,fGeVcharge);
374     return;
375 }
376 //----------------------------------------------------------------------
377 void AliITSCalibration::Read(istream *is) {
378   // Standard input format for this class.
379   // Inputs:
380   //    ostream *is  Pointer to the output stream
381   // Outputs:
382   //    none:
383   // Return:
384   //    none.
385
386     *is >> fdv >> fN >> fT >> fGeVcharge;
387     return;
388 }
389 //----------------------------------------------------------------------
390
391 ostream &operator<<(ostream &os,AliITSCalibration &p){
392   // Standard output streaming function.
393   // Inputs:
394   //    ostream *os  Pointer to the output stream
395   // Outputs:
396   //    none:
397   // Return:
398   //    none.
399
400     p.Print(&os);
401     return os;
402 }
403
404 //----------------------------------------------------------------------
405 istream &operator>>(istream &is,AliITSCalibration &r){
406   // Standard input streaming function.
407   // Inputs:
408   //    ostream *os  Pointer to the output stream
409   // Outputs:
410   //    none:
411   // Return:
412   //    none.
413
414     r.Read(&is);
415     return is;
416 }
417 //----------------------------------------------------------------------