27 fTemperature(temperature),
28 fCcoupling(cCoupling),
29 fCinterstrip(cInterstrip),
35 if ( fCinterstrip + fCcoupling != 0. )
36 fCrossTalk = cInterstrip / (cInterstrip + cCoupling);
37 CalculateHallMobilityParameters();
49void BmnSsdSensorConditions::CalculateHallMobilityParameters() {
57 Double_t muLow[2], vSat[2], beta[2], rHall[2], muHall[2];
60 muLow[0] = 1417. * pow (fTemperature / 300., -2.2);
61 beta[0] = 1.109 * pow (fTemperature / 300., 0.66);
62 vSat[0] = 1.07e7 * pow (fTemperature / 300., 0.87);
65 fHallMobilityParametersE[0] = muLow[0];
66 fHallMobilityParametersE[1] = beta[0];
67 fHallMobilityParametersE[2] = vSat[0];
68 fHallMobilityParametersE[3] = rHall[0];
71 muLow[1] = 470.5 * pow (fTemperature / 300., -2.5);
72 beta[1] = 1.213 * pow (fTemperature / 300., 0.17);
73 vSat[1] = 0.837e7 * pow (fTemperature / 300., 0.52);
76 fHallMobilityParametersH[0] = muLow[1];
77 fHallMobilityParametersH[1] = beta[1];
78 fHallMobilityParametersH[2] = vSat[1];
79 fHallMobilityParametersH[3] = rHall[1];
82 Double_t dZ = 0.03, E = (fVbias - fVfd) / dZ + 2 * fVfd / dZ;
84 Double_t deltaZ = dZ / nSteps;
86 dxMean[0] = dxMean[1] = 0.;
88 for (Int_t j = 0; j <= nSteps; j++){
89 E -= 2 * fVfd / dZ * deltaZ / dZ;
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);
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;
108 if ( index < 0 || index > 3 ) {
109 LOG(error) <<
"SensorConditions: Invalid hall parameter index "
113 if ( chargeType == 0 )
return fHallMobilityParametersE[index];
114 else if ( chargeType == 1 )
return fHallMobilityParametersH[index];
116 LOG(error) <<
"SensorConditions: Invalid charge type "
129 if (chargeType == 0) {
130 for (Int_t
i = 0;
i < 4;
i++) hallMobilityParameters[
i] = fHallMobilityParametersE[
i];
132 }
else if (chargeType == 1) {
133 for (Int_t
i = 0;
i < 4;
i++) hallMobilityParameters[
i] = fHallMobilityParametersH[
i];
135 }
else LOG(error) << GetName() <<
"Cannot get parameter for Hall mobility. Unknown type of charge carriers. Must be 0 or 1!";
144 Int_t chargeType)
const {
151 if ( chargeType == 0 ) {
152 muLow = fHallMobilityParametersE[0];
153 beta = fHallMobilityParametersE[1];
154 vSat = fHallMobilityParametersE[2];
155 rHall = fHallMobilityParametersE[3];
157 else if ( chargeType == 1 ) {
158 muLow = fHallMobilityParametersH[0];
159 beta = fHallMobilityParametersH[1];
160 vSat = fHallMobilityParametersH[2];
161 rHall = fHallMobilityParametersH[3];
164 LOG(error) <<
"SensorConditions: illegal charge type "
169 Double_t factor = pow( muLow * eField / vSat, beta );
170 Double_t muHall = rHall * muLow / pow( 1 + factor, 1./beta );
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
virtual ~BmnSsdSensorConditions()
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.)
std::string ToString() const
void GetHallMobilityParametersInto(Double_t *hallMobilityParameters, Int_t chargeType) const
Double_t HallMobility(Double_t eField, Int_t chargeType) const