81{
83
85
87 ATH_MSG_WARNING(
"Conditions Summary Tool is not used. Will use temperature and voltages from job options. "
88 << "Effects of radiation damage may be wrong!");
89 }
90
91 SCT_ChargeTrappingCondData condData;
92
94
95 double temperature{0.};
96 double deplVoltage{0.};
97 double biasVoltage{0.};
102 } else {
103 temperature =
m_siConditionsTool->temperature(elementHash, ctx) + Gaudi::Units::STP_Temperature;
104 deplVoltage =
m_siConditionsTool->depletionVoltage(elementHash, ctx) * Gaudi::Units::volt;
106 }
107
108
109 double temperatureC{temperature - Gaudi::Units::STP_Temperature};
114 }
115
116
117
118
119 double depletionDepth{element->
thickness()};
120 if (std::abs(biasVoltage) < std::abs(deplVoltage)) {
121 depletionDepth *= std::sqrt(std::abs(biasVoltage / deplVoltage));
122
123 }
124
127 deplVoltage,
129 std::abs(biasVoltage))};
130
131
133
134 InDet::SiliconProperties siProperties;
136
137
138
139
140 double electronDriftMobility{0.};
141 double holeDriftMobility{0.};
142 double electronDriftVelocity{0.};
143 double holeDriftVelocity{0.};
145
146
147 } else {
149 holeDriftMobility = siProperties.
calcHoleDriftMobility(temperature,electricField*Gaudi::Units::volt)*Gaudi::Units::volt;
150
152 holeDriftVelocity = holeDriftMobility*electricField;
153 }
154 }
155
156
159
160 double trappingHoles{0.};
164 }
165
166
167 const double meanFreePathElectrons{electronDriftVelocity*trappingElectrons};
168 if (meanFreePathElectrons == 0.)[[
unlikely]]{
169 throw std::runtime_error("SCT_ChargeTrappingTool::calculate: meanFreePathElectrons is zero.");
170 }
172
173 double meanFreePathHoles{0.};
175 meanFreePathHoles = holeDriftVelocity*trappingHoles;
177 if (meanFreePathHoles == 0.)[[
unlikely]]{
178 throw std::runtime_error("SCT_ChargeTrappingTool::calculate: meanFreePathHoles is zero.");
179 }
180 }
181
182
183 double trappingProbability_electron{0.0};
184 double trappingProbability_hole{0.0};
185 double trappingProbability{0.0};
187 trappingProbability = 1.0 - std::exp(-std::abs(pos/meanFreePathElectrons));
188 trappingProbability_electron = trappingProbability;
189 } else {
191 trappingProbability = 1.0 - std::exp(-std::abs(pos/meanFreePathHoles));
192 trappingProbability_hole = trappingProbability;
193 } else {
194 trappingProbability = 0.0;
195 }
196 }
198
199
200 const double u{CLHEP::RandFlat::shoot(0., 1.)};
201 const double drift_time{-std::log(u)*trappingHoles};
203
204 if (holeDriftVelocity == 0.)[[
unlikely]]{
205 throw std::runtime_error("SCT_ChargeTrappingTool::calculate: holeDriftVelocity is zero.");
206 }
207
208 const double t_electrode_hole{
pos/holeDriftVelocity};
210
211
212 const double trappingPosition_hole{holeDriftVelocity*drift_time};
214
215
216
218 << temperature - Gaudi::Units::STP_Temperature << ", "
219 << biasVoltage/Gaudi::Units::volt << ", "
220 << deplVoltage/Gaudi::Units::volt);
221 ATH_MSG_VERBOSE(
"Depletion depth: " << depletionDepth/Gaudi::Units::mm);
222 ATH_MSG_VERBOSE(
"Electric Field: " << electricField/(Gaudi::Units::volt/Gaudi::Units::mm));
223 ATH_MSG_VERBOSE(
"Electron drift mobility (cm2/V/s): " << electronDriftMobility/(Gaudi::Units::cm2/Gaudi::Units::volt/Gaudi::Units::s));
224 ATH_MSG_VERBOSE(
"Electron drift velocity (cm/s): " << electronDriftVelocity);
226 ATH_MSG_VERBOSE(
"Electron trapping probability: " << trappingProbability_electron);
227
229 ATH_MSG_VERBOSE(
"Hole drift mobility (cm2/V/s): " << holeDriftMobility/(Gaudi::Units::cm2/Gaudi::Units::volt/Gaudi::Units::s));
232 ATH_MSG_VERBOSE(
"Hole trapping probability: " << trappingProbability_hole);
233 }
234
235 return condData;
236}
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
InDetDD::CarrierType carrierType() const
carrier type for readout.
void setConditions(double temperature, double electricField)
double calcHoleDriftMobility(double temperature, double electricField) const
void setTrappingTime(const double trappingTime)
void setHoleDriftMobility(const double holeDriftMobility)
void setTrappingHoles(const double trappingHoles)
void setTrappingProbability(const double trappingProbability)
void setTimeToElectrode(const double electrodeTime)
void setTrappingPositionZ(const double trappingPosition)
void setMeanFreePathHoles(const double meanFreePathHoles)
void setTrappingElectrons(const double trappingElectrons)
void setMeanFreePathElectrons(const double meanFreePathElectrons)
double getMeanFreePathElectrons() const
void setElectricField(const double electricField)
double getMeanFreePathHoles() const
@ u
Enums for curvilinear frames.