15#include "GaudiKernel/SystemOfUnits.h"
16#include "Math/Polynomial.h"
19 const std::string &name,
20 const IInterface *parent)
24 const double depositedCharge,
const double radius,
25 const double integratedLumi)
const {
32 double timeResVariance{0.0};
33 timeResVariance += std::pow(
sigmaLandau(receivedFluence), 2.0);
36 timeResVariance += std::pow(
sigmaTDC(), 2.0);
37 timeResVariance += std::pow(
sigmaClock(), 2.0);
39 return std::sqrt(timeResVariance);
43 const double integratedLumi,
const double radius)
const {
45 constexpr double innerRingRadius{230.0 * Athena::Units::mm};
46 constexpr double middleRingRadius{470.0 * Athena::Units::mm};
48 const std::vector<double> innerRingReplacementLumis{
55 const std::vector<double> middleRingReplacementLumis{
60 double replacementLumi{0.0};
62 if (radius < innerRingRadius) {
65 }
else if (radius < middleRingRadius) {
71 return integratedLumi - replacementLumi;
75 const double integratedLumi,
76 const std::vector<double> &replacementLumis)
const {
78 auto it = std::lower_bound(replacementLumis.begin(), replacementLumis.end(),
81 return it == replacementLumis.begin() ? 0.0 : *(--it);
85 const double sensorAccumulatedLumi,
const double radius)
const {
88 constexpr double maxSensorLuminosity{4000.0};
92 ROOT::Math::Polynomial neutral(2.82428e+08, -5.22843e+10, 3.62182e+12,
93 -1.4085e+14, 4.08821e+15);
96 ROOT::Math::Polynomial charged(1.03139e+09, -2.06558e+11, 1.53897e+13,
97 -5.18627e+14, 7.17046e+15);
99 return (neutral(radius / Athena::Units::cm) +
101 sensorAccumulatedLumi / maxSensorLuminosity;
108 ROOT::Math::Polynomial biasVoltageVsFluence(20.59, 96.26);
111 const double operatingBiasVoltage{
112 std::min(biasVoltageVsFluence(fluence / 1.0e14), 550.0)};
114 constexpr double sensorActiveThickness{50.0 * Athena::Units::um};
115 constexpr double gainLayerVoltage{25.0};
117 const double averageElectricField{
118 (operatingBiasVoltage - gainLayerVoltage) /
119 (sensorActiveThickness / Athena::Units::um)};
123 return (24.441 + 20.2311 / averageElectricField) * Athena::Units::picosecond;
127 const double fluence)
const {
129 constexpr double maxJitter{999.9 * Athena::Units::ns};
133 if (fluence > 3.313e15 || depositedCharge == 0.0) {
138 const double chargeInfC{depositedCharge / (1.0e-15 * Gaudi::Units::coulomb)};
142 ROOT::Math::Polynomial referenceCollectedChargeVsFluence(-0.01598, -0.0752,
145 const double collectedCharge{
146 referenceCollectedChargeVsFluence(fluence / 1.0e14) * chargeInfC / 0.56};
148 return std::min((11.5201 + 36576.2 * std::pow(collectedCharge, -3.87335)) *
149 Athena::Units::picosecond,
155 return 20.0 / std::sqrt(12.0) * Athena::Units::picosecond;
160 return 14.0 * Athena::Units::picosecond;
Wrapper to avoid constant divisions when using units.