9 #include <svd/geometry/SensorInfo.h>
10 #include <framework/gearbox/Unit.h>
11 #include <framework/geometry/BFieldManager.h>
13 #include <Math/Vector3D.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 ROOT::Math::XYZVector SensorInfo::getEField(
const ROOT::Math::XYZVector& point)
const
50 ROOT::Math::XYZVector
E(0, 0,
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 ROOT::Math::XYZVector& SensorInfo::getBField(
const ROOT::Math::XYZVector& point)
const
64 static ROOT::Math::XYZVector oldPoint(0, 0, 1000 * Unit::cm);
65 static ROOT::Math::XYZVector oldField(0, 0, 0);
66 static double bRadius = 0.5 * Unit::cm;
67 if ((point - oldPoint).
R() > bRadius) {
68 ROOT::Math::XYZVector pointGlobal = pointToGlobal(point,
true);
69 ROOT::Math::XYZVector bGlobal = BFieldManager::getField(pointGlobal);
70 ROOT::Math::XYZVector bLocal = vectorToLocal(bGlobal,
true);
77 const ROOT::Math::XYZVector
78 SensorInfo::getVelocity(
CarrierType carrier,
const ROOT::Math::XYZVector& point)
const
80 ROOT::Math::XYZVector
E = getEField(point);
82 ROOT::Math::XYZVector B = getBField(point);
85 double hallFactor = getHallFactor(carrier);
87 if (carrier == electron) {
88 mobility = -getElectronMobility(
E.R());
90 mobility = getHoleMobility(
E.R());
93 double mobilityH = hallFactor * fabs(mobility);
96 ROOT::Math::XYZVector EcrossB =
E.Cross(B);
97 ROOT::Math::XYZVector BEdotB =
E.Dot(B) * B;
98 ROOT::Math::XYZVector velocity = mobility *
E + mobility * mobilityH * EcrossB
99 + mobility * mobilityH * mobilityH * BEdotB;
100 velocity *= 1.0 / (1.0 + mobilityH * mobilityH * B.Mag2());
104 const ROOT::Math::XYZVector& SensorInfo::getLorentzShift(
double uCoord,
double vCoord)
const
106 static ROOT::Math::XYZVector result;
107 double distanceToFrontPlane = 0.5 * m_thickness;
108 double distanceToBackPlane = 0.5 * m_thickness;
112 ROOT::Math::XYZVector v_e = getVelocity(electron, ROOT::Math::XYZVector(uCoord, vCoord, +0.5 * distanceToFrontPlane));
113 ROOT::Math::XYZVector v_h = getVelocity(hole, ROOT::Math::XYZVector(uCoord, vCoord, -0.5 * distanceToBackPlane));
116 ROOT::Math::XYZVector center_e = fabs(distanceToFrontPlane / v_e.Z()) * v_e;
117 ROOT::Math::XYZVector 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.