18#include "GaudiKernel/PhysicalConstants.h"
19#include "GaudiKernel/SystemOfUnits.h"
21#include "CLHEP/Random/RandFlat.h"
27 base_class(
type, name, parent)
36 return StatusCode::FAILURE;
55 for (
int ix{0}; ix<81; ix++) {
56 for (
int iy{0}; iy<115; iy++) {
61 return StatusCode::SUCCESS;
66 return StatusCode::SUCCESS;
76 holeTransport(x0, y0, xfin, yfin, Q_m2, Q_m1, Q_00, Q_p1, Q_p2);
86 ATH_MSG_WARNING(
"Conditions Summary Tool is not used. Will use temperature and voltages from job options. "
87 <<
"Effects of radiation damage may be wrong!");
94 double temperature{0.};
95 double deplVoltage{0.};
96 double biasVoltage{0.};
102 temperature =
m_siConditionsTool->temperature(elementHash, ctx) + Gaudi::Units::STP_Temperature;
103 deplVoltage =
m_siConditionsTool->depletionVoltage(elementHash, ctx) * Gaudi::Units::volt;
108 double temperatureC{temperature - Gaudi::Units::STP_Temperature};
118 double depletionDepth{element->
thickness()};
119 if (std::abs(biasVoltage) < std::abs(deplVoltage)) {
120 depletionDepth *= std::sqrt(std::abs(biasVoltage / deplVoltage));
128 std::abs(biasVoltage))};
139 double electronDriftMobility{0.};
140 double holeDriftMobility{0.};
141 double electronDriftVelocity{0.};
142 double holeDriftVelocity{0.};
148 holeDriftMobility = siProperties.
calcHoleDriftMobility(temperature,electricField*Gaudi::Units::volt)*Gaudi::Units::volt;
151 holeDriftVelocity = holeDriftMobility*electricField;
159 double trappingHoles{0.};
166 const double meanFreePathElectrons{electronDriftVelocity*trappingElectrons};
169 double meanFreePathHoles{0.};
171 meanFreePathHoles = holeDriftVelocity*trappingHoles;
176 double trappingProbability_electron{0.0};
177 double trappingProbability_hole{0.0};
178 double trappingProbability{0.0};
180 trappingProbability = 1.0 - std::exp(-std::abs(pos/meanFreePathElectrons));
181 trappingProbability_electron = trappingProbability;
184 trappingProbability = 1.0 - std::exp(-std::abs(pos/meanFreePathHoles));
185 trappingProbability_hole = trappingProbability;
187 trappingProbability = 0.0;
193 const double u{CLHEP::RandFlat::shoot(0., 1.)};
194 const double drift_time{-std::log(u)*trappingHoles};
198 const double t_electrode_hole{pos/holeDriftVelocity};
202 const double trappingPosition_hole{holeDriftVelocity*drift_time};
208 << temperature - Gaudi::Units::STP_Temperature <<
", "
209 << biasVoltage/Gaudi::Units::volt <<
", "
210 << deplVoltage/Gaudi::Units::volt);
211 ATH_MSG_VERBOSE(
"Depletion depth: " << depletionDepth/Gaudi::Units::mm);
212 ATH_MSG_VERBOSE(
"Electric Field: " << electricField/(Gaudi::Units::volt/Gaudi::Units::mm));
213 ATH_MSG_VERBOSE(
"Electron drift mobility (cm2/V/s): " << electronDriftMobility/(Gaudi::Units::cm2/Gaudi::Units::volt/Gaudi::Units::s));
214 ATH_MSG_VERBOSE(
"Electron drift velocity (cm/s): " << electronDriftVelocity);
216 ATH_MSG_VERBOSE(
"Electron trapping probability: " << trappingProbability_electron);
219 ATH_MSG_VERBOSE(
"Hole drift mobility (cm2/V/s): " << holeDriftMobility/(Gaudi::Units::cm2/Gaudi::Units::volt/Gaudi::Units::s));
222 ATH_MSG_VERBOSE(
"Hole trapping probability: " << trappingProbability_hole);
241 static const double deltax{0.0005};
242 static const double deltay{0.00025};
244 static const double bulk_depth{0.0285};
245 static const double strip_pitch{0.0080};
248 if ((
y < 0.) or (
y > bulk_depth))
return 0.;
249 const double xc{strip_pitch * (istrip + 0.5)};
250 const double dx{std::abs(
x-xc)};
251 const int ix{
static_cast<int>(dx/deltax)};
252 if (ix > 79)
return 0.;
253 const int iy{
static_cast<int>(
y/deltay)};
254 const double fx{(dx - ix*deltax) / deltax};
255 const double fy{(
y - iy*deltay) / deltay};
256 const int ix1{ix + 1};
257 const int iy1{iy + 1};
262 ATH_MSG_DEBUG(
"induced: x,y,iy="<<
x<<
" "<<
y<<
" "<<iy<<
" istrip,xc,dx,ix="
263 <<istrip<<
" "<<xc<<
" " <<dx<<
" "<<ix<<
" fx,fy="<<fx <<
" " <<fy<<
", P="<<
P);
290 for (
int istrip{-2}; istrip < 3 ; istrip++) {
291 qstrip[istrip+2] =
induced(istrip,
x,
y);
293 ATH_MSG_DEBUG(
"h:qstrip=" << qstrip[0] <<
" " << qstrip[1] <<
" " << qstrip[2] <<
" " << qstrip[3] <<
" " << qstrip[4]);
296 for (
int istrip{-2}; istrip < 3 ; istrip++) {
299 const double qnew{
induced(istrip,
x,
y)};
301 const double dq{qnew - qstrip[jj]};
305 case -2: Q_m2 += dq ;
break;
306 case -1: Q_m1 += dq ;
break;
307 case 0: Q_00 += dq ;
break;
308 case +1: Q_p1 += dq ;
break;
309 case +2: Q_p2 += dq ;
break;
313 ATH_MSG_DEBUG(
"h:qstrip=" << qstrip[0] <<
" " << qstrip[1] <<
" " << qstrip[2] <<
" " << qstrip[3] <<
" " << qstrip[4]);
318 return ::getPotentialValue(ix, iy);
323 if (not condData.
isValid())
return nullptr;
324 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