15 #include "GaudiKernel/SystemOfUnits.h"
16 #include "Math/Polynomial.h"
19 const std::string &
name,
24 const double depositedCharge,
const double radius,
32 double timeResVariance{0.0};
39 return std::sqrt(timeResVariance);
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) {
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.82428
e+08, -5.22843
e+10, 3.62182
e+12,
93 -1.4085
e+14, 4.08821
e+15);
96 ROOT::Math::Polynomial
charged(1.03139
e+09, -2.06558
e+11, 1.53897
e+13,
97 -5.18627
e+14, 7.17046
e+15);
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)};
127 const double fluence)
const {
133 if (fluence > 3.313e15 || depositedCharge == 0.0) {
142 ROOT::Math::Polynomial referenceCollectedChargeVsFluence(-0.01598, -0.0752,
145 const double collectedCharge{
146 referenceCollectedChargeVsFluence(fluence / 1.0e14) * chargeInfC / 0.56};