BmnRoot
Loading...
Searching...
No Matches
BmnSsdSensorConditions.cxx
Go to the documentation of this file.
1
7#include <iomanip>
8#include <sstream>
9#include "FairLogger.h"
11
12using namespace std;
13
14
15// ----- Default constructor -------------------------------------------
17 Double_t vBias,
18 Double_t temperature,
19 Double_t cCoupling,
20 Double_t cInterstrip,
21 Double_t bX,
22 Double_t bY,
23 Double_t bZ) :
24 TObject(),
25 fVfd(vFd),
26 fVbias(vBias),
27 fTemperature(temperature),
28 fCcoupling(cCoupling),
29 fCinterstrip(cInterstrip),
30 fCrossTalk(0.),
31 fBx(bX),
32 fBy(bY),
33 fBz(bZ)
34{
35 if ( fCinterstrip + fCcoupling != 0. )
36 fCrossTalk = cInterstrip / (cInterstrip + cCoupling);
37 CalculateHallMobilityParameters();
38}
39// -------------------------------------------------------------------------
40
41
42// ----- Destructor ----------------------------------------------------
44// -------------------------------------------------------------------------
45
46
47
48// ----- Set parameters for Hall mobility calculation ------------------
49void BmnSsdSensorConditions::CalculateHallMobilityParameters() {
50
51 // These are the parameters needed for the calculation of the Hall
52 // mobility, i.e. the mobility of charge carriers in the silicon
53 // in the presence of a magnetic field. They depend on the temperature.
54 // Values and formulae are taken from
55 // V. Bartsch et al., Nucl. Instrum. Methods A 497 (2003) 389
56
57 Double_t muLow[2], vSat[2], beta[2], rHall[2], muHall[2];
58
59 // electrons
60 muLow[0] = 1417. * pow (fTemperature / 300., -2.2);// cm^2 / (V s)
61 beta[0] = 1.109 * pow (fTemperature / 300., 0.66);
62 vSat[0] = 1.07e7 * pow (fTemperature / 300., 0.87);// cm / s
63 rHall[0] = 1.15;
64
65 fHallMobilityParametersE[0] = muLow[0];
66 fHallMobilityParametersE[1] = beta[0];
67 fHallMobilityParametersE[2] = vSat[0];
68 fHallMobilityParametersE[3] = rHall[0];
69
70 // holes
71 muLow[1] = 470.5 * pow (fTemperature / 300., -2.5);// cm^2 / (V s)
72 beta[1] = 1.213 * pow (fTemperature / 300., 0.17);
73 vSat[1] = 0.837e7 * pow (fTemperature / 300., 0.52);// cm / s
74 rHall[1] = 0.7;
75
76 fHallMobilityParametersH[0] = muLow[1];
77 fHallMobilityParametersH[1] = beta[1];
78 fHallMobilityParametersH[2] = vSat[1];
79 fHallMobilityParametersH[3] = rHall[1];
80
81 //calculate mean shift TODO use BmnSsdPhysics in e-field calculation
82 Double_t dZ = 0.03, E = (fVbias - fVfd) / dZ + 2 * fVfd / dZ;//dZ - sensor thickness, E - el field [V/cm]
83 Int_t nSteps = 1000;
84 Double_t deltaZ = dZ / nSteps;
85 Double_t dxMean[2];
86 dxMean[0] = dxMean[1] = 0.;
87
88 for (Int_t j = 0; j <= nSteps; j++){
89 E -= 2 * fVfd / dZ * deltaZ / dZ;//V / cm
90 for (Int_t i = 0; i < 2; i++){
91 muHall[i] = rHall[i] * muLow[i] / pow ((1 + pow (muLow[i] * E / vSat[i], beta[i])), 1 / beta[i]);
92 if (i == 1) dxMean[i] += muHall[i] * j * deltaZ;
93 if (i == 0) dxMean[i] += muHall[i] * (dZ - j * deltaZ);
94 }
95 }
96 for (Int_t i = 0; i < 2; i++) dxMean[i] /= nSteps;
97 fMeanLorentzShift[0] = dxMean[0] * fBy * 1.e-4;
98 fMeanLorentzShift[1] = dxMean[1] * fBy * 1.e-4;
99
100}
101// -------------------------------------------------------------------------
102
103
104
105// ----- Get one of the Hall mobility parameters -----------------------
107 Int_t chargeType) {
108 if ( index < 0 || index > 3 ) {
109 LOG(error) << "SensorConditions: Invalid hall parameter index "
110 << index;
111 return 0.;
112 }
113 if ( chargeType == 0 ) return fHallMobilityParametersE[index];
114 else if ( chargeType == 1 ) return fHallMobilityParametersH[index];
115 else {
116 LOG(error) << "SensorConditions: Invalid charge type "
117 << chargeType;
118 }
119
120 return 0.;
121}
122// -------------------------------------------------------------------------
123
124
125
126// ----- Get parameters for Hall mobility calculation into array --------
127void BmnSsdSensorConditions::GetHallMobilityParametersInto(Double_t * hallMobilityParameters, Int_t chargeType) const {
128
129 if (chargeType == 0) { // electrons
130 for (Int_t i = 0; i < 4; i++) hallMobilityParameters[i] = fHallMobilityParametersE[i];
131
132 } else if (chargeType == 1) { // holes
133 for (Int_t i = 0; i < 4; i++) hallMobilityParameters[i] = fHallMobilityParametersH[i];
134
135 } else LOG(error) << GetName() << "Cannot get parameter for Hall mobility. Unknown type of charge carriers. Must be 0 or 1!";
136
137}
138// -------------------------------------------------------------------------
139
140
141
142// ----- Hall mobility -------------------------------------------------
144 Int_t chargeType) const {
145
146 Double_t muLow = 0.; // mobility at low electric field
147 Double_t beta = 0.; // exponent
148 Double_t vSat = 0.; // saturation velocity
149 Double_t rHall = 0.; // Hall scattering factor
150
151 if ( chargeType == 0 ) { // electrons
152 muLow = fHallMobilityParametersE[0];
153 beta = fHallMobilityParametersE[1];
154 vSat = fHallMobilityParametersE[2];
155 rHall = fHallMobilityParametersE[3];
156 } //? electron
157 else if ( chargeType == 1 ) { // holes
158 muLow = fHallMobilityParametersH[0];
159 beta = fHallMobilityParametersH[1];
160 vSat = fHallMobilityParametersH[2];
161 rHall = fHallMobilityParametersH[3];
162 } //? holes
163 else {
164 LOG(error) << "SensorConditions: illegal charge type "
165 << chargeType;
166 return 0.;
167 }
168
169 Double_t factor = pow( muLow * eField / vSat, beta );
170 Double_t muHall = rHall * muLow / pow( 1 + factor, 1./beta );
171 return muHall;
172}
173// -------------------------------------------------------------------------
174
175
176
177
178
179// ----- String output -------------------------------------------------
181 stringstream ss;
182 ss << "VFD = " << fVfd << " V, V(bias) = " << fVbias << " V, T = "
183 << fTemperature << " K, C(coupl.) = " << fCcoupling
184 << " pF, C(int.) = " << fCinterstrip
185 << " pF, cross-talk coeff. = " << fCrossTalk << "B = ("
186 << setprecision(3) << fixed << fBx << ", " << fBy << ", " << fBz
187 << ") T";
188 return ss.str();
189}
190// -------------------------------------------------------------------------
int i
Definition P4_F32vec4.h:22
Double_t GetHallParameter(Int_t index, Int_t chargeType)
BmnSsdSensorConditions(Double_t vFD=0., Double_t vBias=0., Double_t temperature=273., Double_t cCoupling=0., Double_t cInterstrip=0., Double_t bX=0., Double_t bY=0., Double_t bZ=0.)
void GetHallMobilityParametersInto(Double_t *hallMobilityParameters, Int_t chargeType) const
Double_t HallMobility(Double_t eField, Int_t chargeType) const
STL namespace.