9 #include <svd/geometry/SensorInfo.h>
10 #include <framework/gearbox/Unit.h>
11 #include <framework/geometry/BFieldManager.h>
21 double SensorInfo::getElectronMobility(
double E)
const
24 static double vmElec = 1.53 * pow(m_temperature, -0.87) * 1.E9 * Unit::cm
26 static double EcElec = 1.01 * pow(m_temperature, +1.55) * Unit::V
28 static double betaElec = 2.57 * pow(m_temperature, +0.66) * 1.E-2;
30 return (vmElec / EcElec * 1.
31 / (pow(1. + pow((fabs(E) / EcElec), betaElec), (1. / betaElec))));
34 double SensorInfo::getHoleMobility(
double E)
const
37 static double vmHole = 1.62 * pow(m_temperature, -0.52) * 1.E8 * Unit::cm
39 static double EcHole = 1.24 * pow(m_temperature, +1.68) * Unit::V
41 static double betaHole = 0.46 * pow(m_temperature, +0.17);
43 return (vmHole / EcHole * 1.
44 / (pow(1. + pow((fabs(E) / EcHole), betaHole), (1. / betaHole))));
47 const TVector3 SensorInfo::getEField(
const TVector3& point)
const
51 + 2.0 * m_depletionVoltage / m_thickness
52 * ((+point.Z() - 0.5 * m_thickness) / m_thickness)
53 - (m_biasVoltage - m_depletionVoltage) / m_thickness);
58 const TVector3& SensorInfo::getBField(
const TVector3& point)
const
64 static TVector3 oldPoint(0, 0, 1000 * Unit::cm);
65 static TVector3 oldField(0, 0, 0);
66 static double bRadius = 0.5 * Unit::cm;
67 if (TVector3(point - oldPoint).Mag() > bRadius) {
68 TVector3 pointGlobal = pointToGlobal(point,
true);
69 TVector3 bGlobal = BFieldManager::getField(pointGlobal);
70 TVector3 bLocal = vectorToLocal(bGlobal,
true);
78 const TVector3& point)
const
80 TVector3 E = getEField(point);
82 TVector3 B = getBField(point);
85 double hallFactor = getHallFactor(carrier);
87 if (carrier == electron) {
88 mobility = -getElectronMobility(E.Mag());
90 mobility = getHoleMobility(E.Mag());
93 double mobilityH = hallFactor * fabs(mobility);
96 TVector3 EcrossB = E.Cross(B);
97 TVector3 BEdotB = E.Dot(B) * B;
98 TVector3 velocity = mobility * E + mobility * mobilityH * EcrossB
99 + mobility * mobilityH * mobilityH * BEdotB;
100 velocity *= 1.0 / (1.0 + mobilityH * mobilityH * B.Mag2());
104 const TVector3& SensorInfo::getLorentzShift(
double uCoord,
double vCoord)
const
106 static TVector3 result;
107 double distanceToFrontPlane = 0.5 * m_thickness;
108 double distanceToBackPlane = 0.5 * m_thickness;
112 TVector3 v_e = getVelocity(electron, TVector3(uCoord, vCoord, +0.5 * distanceToFrontPlane));
113 TVector3 v_h = getVelocity(hole, TVector3(uCoord, vCoord, -0.5 * distanceToBackPlane));
116 TVector3 center_e = fabs(distanceToFrontPlane / v_e.Z()) * v_e;
117 TVector3 center_h = fabs(distanceToBackPlane / v_h.Z()) * v_h;
118 result.SetXYZ(center_h.X(), center_e.Y(), 0.0);
122 double SensorInfo::getLorentzShift(
bool isUCoordinate,
double position)
const
125 return getLorentzShift(position, 0.0).X();
127 return getLorentzShift(0.0, position).Y();
CarrierType
Enum to flag charge carriers.
Namespace to encapsulate code needed for simulation and reconstrucion of the SVD.
Abstract base class for different kinds of events.