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 const EventContext& ctx{Gaudi::Hive::currentContext()};
82 holeTransport(x0, y0, xfin, yfin, Q_m2, Q_m1, Q_00, Q_p1, Q_p2);
87 const EventContext& ctx{Gaudi::Hive::currentContext()};
99 ATH_MSG_WARNING(
"Conditions Summary Tool is not used. Will use temperature and voltages from job options. "
100 <<
"Effects of radiation damage may be wrong!");
107 double temperature{0.};
108 double deplVoltage{0.};
109 double biasVoltage{0.};
115 temperature =
m_siConditionsTool->temperature(elementHash, ctx) + Gaudi::Units::STP_Temperature;
116 deplVoltage =
m_siConditionsTool->depletionVoltage(elementHash, ctx) * Gaudi::Units::volt;
121 double temperatureC{temperature - Gaudi::Units::STP_Temperature};
131 double depletionDepth{element->
thickness()};
132 if (std::abs(biasVoltage) < std::abs(deplVoltage)) {
133 depletionDepth *= std::sqrt(std::abs(biasVoltage / deplVoltage));
141 std::abs(biasVoltage))};
152 double electronDriftMobility{0.};
153 double holeDriftMobility{0.};
154 double electronDriftVelocity{0.};
155 double holeDriftVelocity{0.};
161 holeDriftMobility = siProperties.
calcHoleDriftMobility(temperature,electricField*Gaudi::Units::volt)*Gaudi::Units::volt;
164 holeDriftVelocity = holeDriftMobility*electricField;
172 double trappingHoles{0.};
179 const double meanFreePathElectrons{electronDriftVelocity*trappingElectrons};
182 double meanFreePathHoles{0.};
184 meanFreePathHoles = holeDriftVelocity*trappingHoles;
189 double trappingProbability_electron{0.0};
190 double trappingProbability_hole{0.0};
191 double trappingProbability{0.0};
193 trappingProbability = 1.0 - std::exp(-std::abs(pos/meanFreePathElectrons));
194 trappingProbability_electron = trappingProbability;
197 trappingProbability = 1.0 - std::exp(-std::abs(pos/meanFreePathHoles));
198 trappingProbability_hole = trappingProbability;
200 trappingProbability = 0.0;
206 const double u{CLHEP::RandFlat::shoot(0., 1.)};
207 const double drift_time{-std::log(u)*trappingHoles};
211 const double t_electrode_hole{pos/holeDriftVelocity};
215 const double trappingPosition_hole{holeDriftVelocity*drift_time};
221 << temperature - Gaudi::Units::STP_Temperature <<
", "
222 << biasVoltage/Gaudi::Units::volt <<
", "
223 << deplVoltage/Gaudi::Units::volt);
224 ATH_MSG_VERBOSE(
"Depletion depth: " << depletionDepth/Gaudi::Units::mm);
225 ATH_MSG_VERBOSE(
"Electric Field: " << electricField/(Gaudi::Units::volt/Gaudi::Units::mm));
226 ATH_MSG_VERBOSE(
"Electron drift mobility (cm2/V/s): " << electronDriftMobility/(Gaudi::Units::cm2/Gaudi::Units::volt/Gaudi::Units::s));
227 ATH_MSG_VERBOSE(
"Electron drift velocity (cm/s): " << electronDriftVelocity);
229 ATH_MSG_VERBOSE(
"Electron trapping probability: " << trappingProbability_electron);
232 ATH_MSG_VERBOSE(
"Hole drift mobility (cm2/V/s): " << holeDriftMobility/(Gaudi::Units::cm2/Gaudi::Units::volt/Gaudi::Units::s));
235 ATH_MSG_VERBOSE(
"Hole trapping probability: " << trappingProbability_hole);
254 static const double deltax{0.0005};
255 static const double deltay{0.00025};
257 static const double bulk_depth{0.0285};
258 static const double strip_pitch{0.0080};
261 if ((
y < 0.) or (
y > bulk_depth))
return 0.;
262 const double xc{strip_pitch * (istrip + 0.5)};
263 const double dx{std::abs(
x-xc)};
264 const int ix{
static_cast<int>(dx/deltax)};
265 if (ix > 79)
return 0.;
266 const int iy{
static_cast<int>(
y/deltay)};
267 const double fx{(dx - ix*deltax) / deltax};
268 const double fy{(
y - iy*deltay) / deltay};
269 const int ix1{ix + 1};
270 const int iy1{iy + 1};
275 ATH_MSG_DEBUG(
"induced: x,y,iy="<<
x<<
" "<<
y<<
" "<<iy<<
" istrip,xc,dx,ix="
276 <<istrip<<
" "<<xc<<
" " <<dx<<
" "<<ix<<
" fx,fy="<<fx <<
" " <<fy<<
", P="<<
P);
303 for (
int istrip{-2}; istrip < 3 ; istrip++) {
304 qstrip[istrip+2] =
induced(istrip,
x,
y);
306 ATH_MSG_DEBUG(
"h:qstrip=" << qstrip[0] <<
" " << qstrip[1] <<
" " << qstrip[2] <<
" " << qstrip[3] <<
" " << qstrip[4]);
309 for (
int istrip{-2}; istrip < 3 ; istrip++) {
312 const double qnew{
induced(istrip,
x,
y)};
314 const double dq{qnew - qstrip[jj]};
318 case -2: Q_m2 += dq ;
break;
319 case -1: Q_m1 += dq ;
break;
320 case 0: Q_00 += dq ;
break;
321 case +1: Q_p1 += dq ;
break;
322 case +2: Q_p2 += dq ;
break;
326 ATH_MSG_DEBUG(
"h:qstrip=" << qstrip[0] <<
" " << qstrip[1] <<
" " << qstrip[2] <<
" " << qstrip[3] <<
" " << qstrip[4]);
331 return ::getPotentialValue(ix, iy);
336 if (not condData.
isValid())
return nullptr;
337 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