18#include "GaudiKernel/PhysicalConstants.h"
19#include "GaudiKernel/SystemOfUnits.h"
21#include "CLHEP/Random/RandFlat.h"
28 base_class(
type, name, parent)
37 return StatusCode::FAILURE;
56 for (
int ix{0}; ix<81; ix++) {
57 for (
int iy{0}; iy<115; iy++) {
62 return StatusCode::SUCCESS;
67 return StatusCode::SUCCESS;
77 holeTransport(x0, y0, xfin, yfin, Q_m2, Q_m1, Q_00, Q_p1, Q_p2);
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!");
95 double temperature{0.};
96 double deplVoltage{0.};
97 double biasVoltage{0.};
103 temperature =
m_siConditionsTool->temperature(elementHash, ctx) + Gaudi::Units::STP_Temperature;
104 deplVoltage =
m_siConditionsTool->depletionVoltage(elementHash, ctx) * Gaudi::Units::volt;
109 double temperatureC{temperature - Gaudi::Units::STP_Temperature};
119 double depletionDepth{element->
thickness()};
120 if (std::abs(biasVoltage) < std::abs(deplVoltage)) {
121 depletionDepth *= std::sqrt(std::abs(biasVoltage / deplVoltage));
129 std::abs(biasVoltage))};
140 double electronDriftMobility{0.};
141 double holeDriftMobility{0.};
142 double electronDriftVelocity{0.};
143 double holeDriftVelocity{0.};
149 holeDriftMobility = siProperties.
calcHoleDriftMobility(temperature,electricField*Gaudi::Units::volt)*Gaudi::Units::volt;
152 holeDriftVelocity = holeDriftMobility*electricField;
160 double trappingHoles{0.};
167 const double meanFreePathElectrons{electronDriftVelocity*trappingElectrons};
168 if (meanFreePathElectrons == 0.)[[
unlikely]]{
169 throw std::runtime_error(
"SCT_ChargeTrappingTool::calculate: meanFreePathElectrons is zero.");
173 double meanFreePathHoles{0.};
175 meanFreePathHoles = holeDriftVelocity*trappingHoles;
177 if (meanFreePathHoles == 0.)[[
unlikely]]{
178 throw std::runtime_error(
"SCT_ChargeTrappingTool::calculate: meanFreePathHoles is zero.");
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;
191 trappingProbability = 1.0 - std::exp(-std::abs(pos/meanFreePathHoles));
192 trappingProbability_hole = trappingProbability;
194 trappingProbability = 0.0;
200 const double u{CLHEP::RandFlat::shoot(0., 1.)};
201 const double drift_time{-std::log(u)*trappingHoles};
204 if (holeDriftVelocity == 0.)[[
unlikely]]{
205 throw std::runtime_error(
"SCT_ChargeTrappingTool::calculate: holeDriftVelocity is zero.");
208 const double t_electrode_hole{pos/holeDriftVelocity};
212 const double trappingPosition_hole{holeDriftVelocity*drift_time};
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);
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);
251 static const double deltax{0.0005};
252 static const double deltay{0.00025};
254 static const double bulk_depth{0.0285};
255 static const double strip_pitch{0.0080};
258 if ((
y < 0.) or (
y > bulk_depth))
return 0.;
259 const double xc{strip_pitch * (istrip + 0.5)};
260 const double dx{std::abs(
x-xc)};
261 const int ix{
static_cast<int>(dx/deltax)};
262 if (ix > 79)
return 0.;
263 const int iy{
static_cast<int>(
y/deltay)};
264 const double fx{(dx - ix*deltax) / deltax};
265 const double fy{(
y - iy*deltay) / deltay};
266 const int ix1{ix + 1};
267 const int iy1{iy + 1};
272 ATH_MSG_DEBUG(
"induced: x,y,iy="<<
x<<
" "<<
y<<
" "<<iy<<
" istrip,xc,dx,ix="
273 <<istrip<<
" "<<xc<<
" " <<dx<<
" "<<ix<<
" fx,fy="<<fx <<
" " <<fy<<
", P="<<
P);
300 for (
int istrip{-2}; istrip < 3 ; istrip++) {
301 qstrip[istrip+2] =
induced(istrip,
x,
y);
303 ATH_MSG_DEBUG(
"h:qstrip=" << qstrip[0] <<
" " << qstrip[1] <<
" " << qstrip[2] <<
" " << qstrip[3] <<
" " << qstrip[4]);
306 for (
int istrip{-2}; istrip < 3 ; istrip++) {
309 const double qnew{
induced(istrip,
x,
y)};
311 const double dq{qnew - qstrip[jj]};
315 case -2: Q_m2 += dq ;
break;
316 case -1: Q_m1 += dq ;
break;
317 case 0: Q_00 += dq ;
break;
318 case +1: Q_p1 += dq ;
break;
319 case +2: Q_p2 += dq ;
break;
323 ATH_MSG_DEBUG(
"h:qstrip=" << qstrip[0] <<
" " << qstrip[1] <<
" " << qstrip[2] <<
" " << qstrip[3] <<
" " << qstrip[4]);
328 return ::getPotentialValue(ix, iy);
333 if (not condData.
isValid())
return nullptr;
334 return condData->getDetectorElement(waferHash);
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
This is a "hash" representation of an Identifier.
Class to hold geometrical description of a silicon detector element.
InDetDD::CarrierType carrierType() const
carrier type for readout.
void setConditions(double temperature, double electricField)
double calcHoleDriftMobility(double temperature, double electricField) const
Data object for SCT_ChargeTrappingTool, SCT_RadDamageSummaryTool, SCT_SurfaceChargesGenerator.
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