diff --git a/InnerDetector/InDetConditions/SiLorentzAngleTool/src/PixelSiLorentzAngleCondAlg.cxx b/InnerDetector/InDetConditions/SiLorentzAngleTool/src/PixelSiLorentzAngleCondAlg.cxx index e3fd0bba45b25ade8889a769fa240a45fee052a6..965aef781b7ef7d94ab0180c85918ffa4bc708b8 100644 --- a/InnerDetector/InDetConditions/SiLorentzAngleTool/src/PixelSiLorentzAngleCondAlg.cxx +++ b/InnerDetector/InDetConditions/SiLorentzAngleTool/src/PixelSiLorentzAngleCondAlg.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration */ #include "PixelSiLorentzAngleCondAlg.h" @@ -156,7 +156,7 @@ PixelSiLorentzAngleCondAlg::execute(const EventContext& ctx) const { forceLorentzToZero = 0.0; } - const InDet::SiliconProperties &siProperties = m_siPropertiesTool->getSiProperties(elementHash); + const InDet::SiliconProperties &siProperties = m_siPropertiesTool->getSiProperties(elementHash, ctx); double mobility = siProperties.signedHallMobility(element->carrierType()); // Get magnetic field. This first checks that field cache is valid. diff --git a/InnerDetector/InDetConditions/SiPropertiesTool/SiPropertiesTool/ISiPropertiesTool.h b/InnerDetector/InDetConditions/SiPropertiesTool/SiPropertiesTool/ISiPropertiesTool.h index a443861ef24a3093d32e9f5b5332ae7a633c265e..c8473c457765482d9ee1a115a367a37ad5c56a1a 100644 --- a/InnerDetector/InDetConditions/SiPropertiesTool/SiPropertiesTool/ISiPropertiesTool.h +++ b/InnerDetector/InDetConditions/SiPropertiesTool/SiPropertiesTool/ISiPropertiesTool.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration */ /** @@ -11,6 +11,7 @@ //Gaudi Includes #include "GaudiKernel/IAlgTool.h" +#include "GaudiKernel/EventContext.h" #include "SiPropertiesTool/SiliconProperties.h" #include "Identifier/IdentifierHash.h" @@ -29,7 +30,7 @@ class ISiPropertiesTool: virtual public IAlgTool DeclareInterfaceID(ISiPropertiesTool, 1, 0); /// Get Silicon properties for a given detector element. - virtual const InDet::SiliconProperties& getSiProperties(const IdentifierHash& elementHash) const = 0; + virtual const InDet::SiliconProperties& getSiProperties(const IdentifierHash& elementHash, const EventContext& ctx) const = 0; }; #endif // ISiPropertiesTool_h diff --git a/InnerDetector/InDetConditions/SiPropertiesTool/src/SCTSiPropertiesTestAlg.cxx b/InnerDetector/InDetConditions/SiPropertiesTool/src/SCTSiPropertiesTestAlg.cxx index f5d1b95b23bdaa39a5a58a7d1348e76227110578..f09fb8d236b80cc9fea0ccaba3734e6362169a77 100644 --- a/InnerDetector/InDetConditions/SiPropertiesTool/src/SCTSiPropertiesTestAlg.cxx +++ b/InnerDetector/InDetConditions/SiPropertiesTool/src/SCTSiPropertiesTestAlg.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration */ #include "SCTSiPropertiesTestAlg.h" @@ -22,11 +22,11 @@ StatusCode SCTSiPropertiesTestAlg::initialize() { return StatusCode::SUCCESS; } -StatusCode SCTSiPropertiesTestAlg::execute(const EventContext& /*ctx*/) const { +StatusCode SCTSiPropertiesTestAlg::execute(const EventContext& ctx) const { unsigned int maxHash{static_cast<unsigned int>(m_id->wafer_hash_max())}; for (unsigned int hash{0}; hash<maxHash; hash++) { const IdentifierHash elementHash{hash}; - const InDet::SiliconProperties& siProperties{m_tool->getSiProperties(elementHash)}; + const InDet::SiliconProperties& siProperties{m_tool->getSiProperties(elementHash, ctx)}; const double electronDriftMobility{siProperties.electronDriftMobility()}; const double holeDriftMobility{siProperties.holeDriftMobility()}; const double electronHallMobility{siProperties.electronHallMobility()}; diff --git a/InnerDetector/InDetConditions/SiPropertiesTool/src/SiPropertiesTool.cxx b/InnerDetector/InDetConditions/SiPropertiesTool/src/SiPropertiesTool.cxx index 8a502f818a1b9a7292813d6cc5d7094468be8120..5bbe45b90ef69e7880b9b89a4f341c2c4904312d 100644 --- a/InnerDetector/InDetConditions/SiPropertiesTool/src/SiPropertiesTool.cxx +++ b/InnerDetector/InDetConditions/SiPropertiesTool/src/SiPropertiesTool.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration */ #include "SiPropertiesTool.h" @@ -33,8 +33,8 @@ SiPropertiesTool::finalize() } const InDet::SiliconProperties& -SiPropertiesTool::getSiProperties(const IdentifierHash& elementHash) const { - SG::ReadCondHandle<InDet::SiliconPropertiesVector> handle{m_propertiesVector}; +SiPropertiesTool::getSiProperties(const IdentifierHash& elementHash, const EventContext& ctx) const { + SG::ReadCondHandle<InDet::SiliconPropertiesVector> handle{m_propertiesVector, ctx}; if (handle.isValid()) { const InDet::SiliconPropertiesVector* vector{*handle}; if (vector) { diff --git a/InnerDetector/InDetConditions/SiPropertiesTool/src/SiPropertiesTool.h b/InnerDetector/InDetConditions/SiPropertiesTool/src/SiPropertiesTool.h index 72c12ac0d3857d9e58b498c4bf4238dfaca1b686..48802fd25cc8df3dff2d6a9be5b824fe64dc46e4 100644 --- a/InnerDetector/InDetConditions/SiPropertiesTool/src/SiPropertiesTool.h +++ b/InnerDetector/InDetConditions/SiPropertiesTool/src/SiPropertiesTool.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration */ /** @@ -30,7 +30,7 @@ public: virtual StatusCode finalize() override; /// Get properties for the detector element. - virtual const InDet::SiliconProperties& getSiProperties(const IdentifierHash& elementHash) const override; + virtual const InDet::SiliconProperties& getSiProperties(const IdentifierHash& elementHash, const EventContext& ctx) const override; private: // Properties diff --git a/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSim3DTool.cxx b/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSim3DTool.cxx index 6e36ec275af73a69a9bb84c73302ce886dcc12aa..faf465ef2b0f5637e9580b6aa38ba6547ea8f725 100644 --- a/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSim3DTool.cxx +++ b/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSim3DTool.cxx @@ -217,7 +217,7 @@ StatusCode SensorSim3DTool::induceCharge(const TimedHitPtr<SiHit>& phit, ATH_MSG_VERBOSE("Applying 3D sensor simulation."); double sensorThickness = Module.design().thickness(); - const InDet::SiliconProperties& siProperties = m_siPropertiesTool->getSiProperties(Module.identifyHash()); + const InDet::SiliconProperties& siProperties = m_siPropertiesTool->getSiProperties(Module.identifyHash(), ctx); double eleholePairEnergy = siProperties.electronHolePairsPerEnergy(); // Charge Collection Probability Map bin size diff --git a/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSimPlanarTool.cxx b/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSimPlanarTool.cxx index 8622bf6ec9f0bec78d10776b965c10a98b6eebd7..4c9c4cfd68ce7785183f7768990f274f4293498a 100644 --- a/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSimPlanarTool.cxx +++ b/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSimPlanarTool.cxx @@ -201,7 +201,7 @@ StatusCode SensorSimPlanarTool::induceCharge(const TimedHitPtr<SiHit>& phit, //Set up physical detector properties, switch on detector material ATH_MSG_DEBUG("Applying planar sensor simulation"); double sensorThickness = Module.design().thickness(); - const InDet::SiliconProperties& siProperties = m_siPropertiesTool->getSiProperties(Module.identifyHash()); + const InDet::SiliconProperties& siProperties = m_siPropertiesTool->getSiProperties(Module.identifyHash(), ctx); int etaCells = p_design.columns(); int phiCells = p_design.rows(); diff --git a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_DetailedSurfaceChargesGenerator.cxx b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_DetailedSurfaceChargesGenerator.cxx index 0778195e07e31e9b09003f6791f58922a2b81dbc..9258948e3d0dcb4b75cb87116788d54dfd5217b7 100644 --- a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_DetailedSurfaceChargesGenerator.cxx +++ b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_DetailedSurfaceChargesGenerator.cxx @@ -181,7 +181,7 @@ float SCT_DetailedSurfaceChargesGenerator::DriftTime(float zhit, const SiDetecto } float driftTime{static_cast<float>(log((vdepl+vbias)/denominator))}; - driftTime *= sensorThickness*sensorThickness/(2.0*m_siPropertiesTool->getSiProperties(hashId).holeDriftMobility()*vdepl); + driftTime *= sensorThickness*sensorThickness/(2.0*m_siPropertiesTool->getSiProperties(hashId, ctx).holeDriftMobility()*vdepl); return driftTime; } @@ -192,7 +192,7 @@ float SCT_DetailedSurfaceChargesGenerator::DiffusionSigma(float zhit, const SiDe const IdentifierHash hashId{element->identifyHash()}; const float t{this->DriftTime(zhit, element, ctx)}; // in ns if (t>0.0) { - const float diffusionSigma{static_cast<float>(sqrt(2.*m_siPropertiesTool->getSiProperties(hashId).holeDiffusionConstant()*t))}; // in mm + const float diffusionSigma{static_cast<float>(sqrt(2.*m_siPropertiesTool->getSiProperties(hashId, ctx).holeDiffusionConstant()*t))}; // in mm return diffusionSigma; } return 0.0; @@ -304,7 +304,7 @@ void SCT_DetailedSurfaceChargesGenerator::processSiHit(const SiDetectorElement* int numberOfSteps{static_cast<int>(LargeStep/m_smallStepLength) + 1}; double steps{static_cast<double>(m_numberOfCharges*numberOfSteps)}; double e1{phit.energyLoss()/steps}; - double q1{e1*m_siPropertiesTool->getSiProperties(hashId).electronHolePairsPerEnergy()}; + double q1{e1*m_siPropertiesTool->getSiProperties(hashId, ctx).electronHolePairsPerEnergy()}; //in the following, to test the code, we will use the original coordinate system of the SCTtest3SurfaceChargesGenerator x is eta y is phi z is depth double xhit{xEta}; diff --git a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_InducedChargeModel.cxx b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_InducedChargeModel.cxx index 1c8801851217feb7d10510ec9ffc04c721b3abfb..ed268e75f63d0423c86ce99bc95bb64e096ff301 100644 --- a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_InducedChargeModel.cxx +++ b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_InducedChargeModel.cxx @@ -106,7 +106,8 @@ void SCT_InducedChargeModel::transport(const SCT_InducedChargeModelData& data, const double x0, const double y0, double* Q_m2, double* Q_m1, double* Q_00, double* Q_p1, double* Q_p2, const IdentifierHash hashId, - const ToolHandle<ISiPropertiesTool> siPropertiesTool) const { + const ToolHandle<ISiPropertiesTool> siPropertiesTool, + const EventContext& ctx) const { // transport electrons and holes in the bulk // T. Kondo, 2010.9.9, 2017.7.20 // External parameters to be specified @@ -128,7 +129,7 @@ void SCT_InducedChargeModel::transport(const SCT_InducedChargeModelData& data, } while (t_current < m_transportTimeMax) { if (!isInBulk) break; - if (!getVxVyD(data, isElectron, x, y, vx, vy, D, hashId, siPropertiesTool)) break; + if (!getVxVyD(data, isElectron, x, y, vx, vy, D, hashId, siPropertiesTool, ctx)) break; double delta_y = vy * m_transportTimeStep / Gaudi::Units::second; // ns -> s y += delta_y; double dt = m_transportTimeStep; // [nsec] @@ -191,7 +192,8 @@ void SCT_InducedChargeModel::holeTransport(const SCT_InducedChargeModelData& dat const double x0, const double y0, double* Q_m2, double* Q_m1, double* Q_00, double* Q_p1, double* Q_p2, const IdentifierHash hashId, - const ToolHandle<ISiPropertiesTool> siPropertiesTool) const { + const ToolHandle<ISiPropertiesTool> siPropertiesTool, + const EventContext& ctx) const { // Q_m2[100],Q_m1[100],Q_00[100],Q_p1[100],Q_p2[100] NTransportSteps=100 const bool isElectron = false; transport(data, @@ -199,7 +201,8 @@ void SCT_InducedChargeModel::holeTransport(const SCT_InducedChargeModelData& dat x0, y0, Q_m2, Q_m1, Q_00, Q_p1, Q_p2, hashId, - siPropertiesTool); + siPropertiesTool, + ctx); } //--------------------------------------------------------------------- @@ -209,7 +212,8 @@ void SCT_InducedChargeModel::electronTransport(const SCT_InducedChargeModelData& const double x0, const double y0, double* Q_m2, double* Q_m1, double* Q_00, double* Q_p1, double* Q_p2, const IdentifierHash hashId, - const ToolHandle<ISiPropertiesTool> siPropertiesTool) const { + const ToolHandle<ISiPropertiesTool> siPropertiesTool, + const EventContext& ctx) const { // Q_m2[100],Q_m1[100],Q_00[100],Q_p1[100],Q_p2[100] NTransportSteps=100 const bool isElectron = true; transport(data, @@ -217,7 +221,8 @@ void SCT_InducedChargeModel::electronTransport(const SCT_InducedChargeModelData& x0, y0, Q_m2, Q_m1, Q_00, Q_p1, Q_p2, hashId, - siPropertiesTool); + siPropertiesTool, + ctx); } //--------------------------------------------------------------- @@ -227,7 +232,8 @@ bool SCT_InducedChargeModel::getVxVyD(const SCT_InducedChargeModelData& data, const bool isElectron, const double x, const double y, double& vx, double& vy, double& D, const IdentifierHash hashId, - const ToolHandle<ISiPropertiesTool> siPropertiesTool) const { + const ToolHandle<ISiPropertiesTool> siPropertiesTool, + const EventContext& ctx) const { double Ex, Ey; getEField(data, x, y, Ex, Ey); // [V/cm] if (Ey > 0.) { @@ -238,13 +244,13 @@ bool SCT_InducedChargeModel::getVxVyD(const SCT_InducedChargeModelData& data, } const double E = std::sqrt(Ex*Ex+Ey*Ey); const double mu = (isElectron ? - siPropertiesTool->getSiProperties(hashId).calcElectronDriftMobility(data.m_T, E*CLHEP::volt/CLHEP::cm) : - siPropertiesTool->getSiProperties(hashId).calcHoleDriftMobility (data.m_T, E*CLHEP::volt/CLHEP::cm)) + siPropertiesTool->getSiProperties(hashId, ctx).calcElectronDriftMobility(data.m_T, E*CLHEP::volt/CLHEP::cm) : + siPropertiesTool->getSiProperties(hashId, ctx).calcHoleDriftMobility (data.m_T, E*CLHEP::volt/CLHEP::cm)) * (CLHEP::volt/CLHEP::cm)/(CLHEP::cm/CLHEP::s); const double v = mu * E; const double r = (isElectron ? - siPropertiesTool->getSiProperties(hashId).calcElectronHallFactor(data.m_T) : - siPropertiesTool->getSiProperties(hashId).calcHoleHallFactor(data.m_T)); + siPropertiesTool->getSiProperties(hashId, ctx).calcElectronHallFactor(data.m_T) : + siPropertiesTool->getSiProperties(hashId, ctx).calcHoleHallFactor(data.m_T)); const double tanLA = data.m_element->design().readoutSide() * r * mu * (isElectron ? -1. : +1.) // because e has negative charge. diff --git a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_InducedChargeModel.h b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_InducedChargeModel.h index 2c94090b53d061d3a02834cc0b49bebbd04e16df..77ea51be43f267db4abdcf86053c173d15c5f641 100644 --- a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_InducedChargeModel.h +++ b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_InducedChargeModel.h @@ -109,17 +109,20 @@ class SCT_InducedChargeModel { const double x0, const double y0, double* Q_m2, double* Q_m1, double* Q_00, double* Q_p1, double* Q_p2, const IdentifierHash hashId, - const ToolHandle<ISiPropertiesTool> siPropertiesTool) const; + const ToolHandle<ISiPropertiesTool> siPropertiesTool, + const EventContext& ctx) const; void holeTransport(const SCT_InducedChargeModelData& data, const double x0, const double y0, double* Q_m2, double* Q_m1, double* Q_00, double* Q_p1, double* Q_p2, const IdentifierHash hashId, - const ToolHandle<ISiPropertiesTool> siPropertiesTool) const; + const ToolHandle<ISiPropertiesTool> siPropertiesTool, + const EventContext& ctx) const; void electronTransport(const SCT_InducedChargeModelData& data, const double x0, const double y0, double* Q_m2, double* Q_m1, double* Q_00, double* Q_p1, double* Q_p2, const IdentifierHash hashId, - const ToolHandle<ISiPropertiesTool> siPropertiesTool) const; + const ToolHandle<ISiPropertiesTool> siPropertiesTool, + const EventContext& ctx) const; private: @@ -129,7 +132,8 @@ class SCT_InducedChargeModel { const bool isElectron, const double x, const double y, double& vx, double& vy, double& D, const IdentifierHash hashId, - const ToolHandle<ISiPropertiesTool> siPropertiesTool) const; + const ToolHandle<ISiPropertiesTool> siPropertiesTool, + const EventContext& ctx) const; double induced(const SCT_InducedChargeModelData& data, const int istrip, const double x, const double y) const; void getEField(const SCT_InducedChargeModelData& data, diff --git a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_SurfaceChargesGenerator.cxx b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_SurfaceChargesGenerator.cxx index 961b2f9ef5e920d8f7a867e68da79d6241db154e..e03726bade39b0aa61da362ee732bc5f2f3fe822 100644 --- a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_SurfaceChargesGenerator.cxx +++ b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_SurfaceChargesGenerator.cxx @@ -220,7 +220,7 @@ float SCT_SurfaceChargesGenerator::driftTime(float zhit, const SiDetectorElement } float t_drift{std::log((depletionVoltage + biasVoltage) / denominator)}; - t_drift *= thickness * thickness / (2.0 * m_siPropertiesTool->getSiProperties(hashId).holeDriftMobility() * depletionVoltage); + t_drift *= thickness * thickness / (2.0 * m_siPropertiesTool->getSiProperties(hashId, ctx).holeDriftMobility() * depletionVoltage); return t_drift; } @@ -236,7 +236,7 @@ float SCT_SurfaceChargesGenerator::diffusionSigma(float zhit, const SiDetectorEl const float t{driftTime(zhit, element, ctx)}; // in ns if (t > 0.0) { - const float sigma{static_cast<float>(std::sqrt(2. * m_siPropertiesTool->getSiProperties(hashId).holeDiffusionConstant() * t))}; // in mm + const float sigma{static_cast<float>(std::sqrt(2. * m_siPropertiesTool->getSiProperties(hashId, ctx).holeDiffusionConstant() * t))}; // in mm return sigma; } else { return 0.0; @@ -359,7 +359,7 @@ void SCT_SurfaceChargesGenerator::processSiHit(const SiDetectorElement* element, const int numberOfSteps{static_cast<int>(LargeStep / m_smallStepLength) + 1}; const float steps{static_cast<float>(m_numberOfCharges * numberOfSteps)}; const float e1{static_cast<float>(phit.energyLoss() / steps)}; - const float q1{static_cast<float>(e1 * m_siPropertiesTool->getSiProperties(hashId).electronHolePairsPerEnergy())}; + const float q1{static_cast<float>(e1 * m_siPropertiesTool->getSiProperties(hashId, ctx).electronHolePairsPerEnergy())}; // in the following, to test the code, we will use the original coordinate // system of the SCTtest3SurfaceChargesGenerator x is eta y is phi z is depth @@ -543,11 +543,13 @@ void SCT_SurfaceChargesGenerator::processSiHit(const SiDetectorElement* element, m_InducedChargeModel->holeTransport(*data, y0*mm2cm, z0*mm2cm, Q_m2, Q_m1, Q_00, Q_p1, Q_p2, - hashId, m_siPropertiesTool); + hashId, m_siPropertiesTool, + ctx); m_InducedChargeModel->electronTransport(*data, y0*mm2cm, z0*mm2cm, Q_m2, Q_m1, Q_00, Q_p1, Q_p2, - hashId, m_siPropertiesTool); + hashId, m_siPropertiesTool, + ctx); for (int it{0}; it<SCT_InducedChargeModel::NTransportSteps; it++) { if (Q_00[it] == 0.0) continue;