8 #include <svd/geometry/SensorInfo.h>
9 #include <framework/gearbox/Unit.h>
10 #include <framework/geometry/BFieldManager.h>
20 double SensorInfo::getElectronMobility(
double E)
const
23 static double vmElec = 1.53 * pow(m_temperature, -0.87) * 1.E9 * Unit::cm
25 static double EcElec = 1.01 * pow(m_temperature, +1.55) * Unit::V
27 static double betaElec = 2.57 * pow(m_temperature, +0.66) * 1.E-2;
29 return (vmElec / EcElec * 1.
30 / (pow(1. + pow((fabs(E) / EcElec), betaElec), (1. / betaElec))));
33 double SensorInfo::getHoleMobility(
double E)
const
36 static double vmHole = 1.62 * pow(m_temperature, -0.52) * 1.E8 * Unit::cm
38 static double EcHole = 1.24 * pow(m_temperature, +1.68) * Unit::V
40 static double betaHole = 0.46 * pow(m_temperature, +0.17);
42 return (vmHole / EcHole * 1.
43 / (pow(1. + pow((fabs(E) / EcHole), betaHole), (1. / betaHole))));
46 const TVector3 SensorInfo::getEField(
const TVector3& point)
const
50 + 2.0 * m_depletionVoltage / m_thickness
51 * ((+point.Z() - 0.5 * m_thickness) / m_thickness)
52 - (m_biasVoltage - m_depletionVoltage) / m_thickness);
57 const TVector3& SensorInfo::getBField(
const TVector3& point)
const
63 static TVector3 oldPoint(0, 0, 1000 * Unit::cm);
64 static TVector3 oldField(0, 0, 0);
65 static double bRadius = 0.5 * Unit::cm;
66 if (TVector3(point - oldPoint).Mag() > bRadius) {
67 TVector3 pointGlobal = pointToGlobal(point,
true);
68 TVector3 bGlobal = BFieldManager::getField(pointGlobal);
69 TVector3 bLocal = vectorToLocal(bGlobal,
true);
77 const TVector3& point)
const
79 TVector3 E = getEField(point);
81 TVector3 B = getBField(point);
84 double hallFactor = getHallFactor(carrier);
86 if (carrier == electron) {
87 mobility = -getElectronMobility(E.Mag());
89 mobility = getHoleMobility(E.Mag());
92 double mobilityH = hallFactor * fabs(mobility);
95 TVector3 EcrossB = E.Cross(B);
96 TVector3 BEdotB = E.Dot(B) * B;
97 TVector3 velocity = mobility * E + mobility * mobilityH * EcrossB
98 + mobility * mobilityH * mobilityH * BEdotB;
99 velocity *= 1.0 / (1.0 + mobilityH * mobilityH * B.Mag2());
103 const TVector3& SensorInfo::getLorentzShift(
double uCoord,
double vCoord)
const
105 static TVector3 result;
106 double distanceToFrontPlane = 0.5 * m_thickness;
107 double distanceToBackPlane = 0.5 * m_thickness;
111 TVector3 v_e = getVelocity(electron, TVector3(uCoord, vCoord, +0.5 * distanceToFrontPlane));
112 TVector3 v_h = getVelocity(hole, TVector3(uCoord, vCoord, -0.5 * distanceToBackPlane));
115 TVector3 center_e = fabs(distanceToFrontPlane / v_e.Z()) * v_e;
116 TVector3 center_h = fabs(distanceToBackPlane / v_h.Z()) * v_h;
117 result.SetXYZ(center_h.X(), center_e.Y(), 0.0);
121 double SensorInfo::getLorentzShift(
bool isUCoordinate,
double position)
const
124 return getLorentzShift(position, 0.0).X();
126 return getLorentzShift(0.0, position).Y();