diff --git a/InnerDetector/InDetDigitization/PixelDigitization/python/PixelDigitizationConfig.py b/InnerDetector/InDetDigitization/PixelDigitization/python/PixelDigitizationConfig.py index 90cd8473c1d7cfca9fdf9f8864d12bcca385cb4a..76f996b721c1581818cf64997b219b897b562537 100644 --- a/InnerDetector/InDetDigitization/PixelDigitization/python/PixelDigitizationConfig.py +++ b/InnerDetector/InDetDigitization/PixelDigitization/python/PixelDigitizationConfig.py @@ -34,8 +34,6 @@ def EnergyDepositionTool(name="EnergyDepositionTool", **kwargs): kwargs.setdefault("DeltaRayCut", 117.) kwargs.setdefault("nCols", 5) kwargs.setdefault("LoopLimit", 100000) - kwargs.setdefault("RndmSvc", digitizationFlags.rndmSvc()) - kwargs.setdefault("RndmEngine", "PixelDigitization") kwargs.setdefault("doBichsel", hasattr(digitizationFlags, "doBichselSimulation") and digitizationFlags.doBichselSimulation()) kwargs.setdefault("doBichselBetaGammaCut", 0.7) # dEdx not quite consistent below this kwargs.setdefault("doDeltaRay", False) # needs validation @@ -53,8 +51,6 @@ def SensorSimPlanarTool(name="SensorSimPlanarTool", **kwargs): pixelLorentzAngleToolSetup = PixelLorentzAngleToolSetup() kwargs.setdefault("SiPropertiesTool", ToolSvc.PixelSiPropertiesTool) kwargs.setdefault("LorentzAngleTool", ToolSvc.PixelLorentzAngleTool) - kwargs.setdefault("RndmSvc", digitizationFlags.rndmSvc()) - kwargs.setdefault("RndmEngine", "PixelDigitization") return CfgMgr.SensorSimPlanarTool(name, **kwargs) def SensorSim3DTool(name="SensorSim3DTool", **kwargs): @@ -67,19 +63,13 @@ def SensorSim3DTool(name="SensorSim3DTool", **kwargs): from SiLorentzAngleSvc.PixelLorentzAngleToolSetup import PixelLorentzAngleToolSetup pixelLorentzAngleToolSetup = PixelLorentzAngleToolSetup() kwargs.setdefault("SiPropertiesTool", ToolSvc.PixelSiPropertiesTool) - kwargs.setdefault("RndmSvc", digitizationFlags.rndmSvc()) - kwargs.setdefault("RndmEngine", "PixelDigitization") return CfgMgr.SensorSim3DTool(name, **kwargs) def SensorSimTool(name="SensorSimTool", **kwargs): - kwargs.setdefault("RndmSvc", digitizationFlags.rndmSvc()) - kwargs.setdefault("RndmEngine", "PixelDigitization") return CfgMgr.SensorSimTool(name, **kwargs) def FrontEndSimTool(name="FrontEndSimTool", **kwargs): from AthenaCommon.AppMgr import ToolSvc - kwargs.setdefault("RndmSvc", digitizationFlags.rndmSvc()) - kwargs.setdefault("RndmEngine", "PixelDigitization") kwargs.setdefault("PixelConditionsSummaryTool", ToolSvc.PixelConditionsSummaryTool) from AthenaCommon.BeamFlags import jobproperties if jobproperties.Beam.beamType == "cosmics" : @@ -95,8 +85,6 @@ def FrontEndSimTool(name="FrontEndSimTool", **kwargs): def BarrelRD53SimTool(name="BarrelRD53SimTool", **kwargs): kwargs.setdefault("BarrelEC", 0) - kwargs.setdefault("RndmSvc", digitizationFlags.rndmSvc()) - kwargs.setdefault("RndmEngine", "PixelDigitization") kwargs.setdefault("Analogthreshold", [-1, -1, -1, -1, -1]) kwargs.setdefault("ToTthreshold", [-1, -1, -1, -1, -1]) kwargs.setdefault("ThermalNoise", [160.0,160.0,160.0,160.0,160.0]) @@ -107,8 +95,6 @@ def BarrelRD53SimTool(name="BarrelRD53SimTool", **kwargs): def EndcapRD53SimTool(name="EndcapRD53SimTool", **kwargs): kwargs.setdefault("BarrelEC", 2) - kwargs.setdefault("RndmSvc", digitizationFlags.rndmSvc()) - kwargs.setdefault("RndmEngine", "PixelDigitization") kwargs.setdefault("Analogthreshold", [-1, -1, -1, -1, -1]) kwargs.setdefault("ToTthreshold", [-1, -1, -1, -1, -1]) kwargs.setdefault("ThermalNoise", [160.0,160.0,160.0,160.0,160.0]) @@ -119,8 +105,6 @@ def EndcapRD53SimTool(name="EndcapRD53SimTool", **kwargs): def BarrelFEI4SimTool(name="BarrelFEI4SimTool", **kwargs): kwargs.setdefault("BarrelEC", 0) - kwargs.setdefault("RndmSvc", digitizationFlags.rndmSvc()) - kwargs.setdefault("RndmEngine", "PixelDigitization") from PixelConditionsAlgorithms.PixelConditionsAlgorithmsConf import PixelConfigCondAlg PixelConfigCondAlg.BarrelAnalogThreshold=[-1] @@ -136,8 +120,6 @@ def BarrelFEI4SimTool(name="BarrelFEI4SimTool", **kwargs): def DBMFEI4SimTool(name="DBMFEI4SimTool", **kwargs): kwargs.setdefault("BarrelEC", 4) - kwargs.setdefault("RndmSvc", digitizationFlags.rndmSvc()) - kwargs.setdefault("RndmEngine", "PixelDigitization") from PixelConditionsAlgorithms.PixelConditionsAlgorithmsConf import PixelConfigCondAlg PixelConfigCondAlg.DBMAnalogThreshold=[-1,-1,-1] @@ -153,8 +135,6 @@ def DBMFEI4SimTool(name="DBMFEI4SimTool", **kwargs): def BarrelFEI3SimTool(name="BarrelFEI3SimTool", **kwargs): kwargs.setdefault("BarrelEC", 0) - kwargs.setdefault("RndmSvc", digitizationFlags.rndmSvc()) - kwargs.setdefault("RndmEngine", "PixelDigitization") from PixelConditionsAlgorithms.PixelConditionsAlgorithmsConf import PixelConfigCondAlg PixelConfigCondAlg.BarrelAnalogThreshold=[-1,-1,-1,-1] @@ -173,8 +153,6 @@ def BarrelFEI3SimTool(name="BarrelFEI3SimTool", **kwargs): def EndcapFEI3SimTool(name="EndcapFEI3SimTool", **kwargs): kwargs.setdefault("BarrelEC", 2) - kwargs.setdefault("RndmSvc", digitizationFlags.rndmSvc()) - kwargs.setdefault("RndmEngine", "PixelDigitization") from PixelConditionsAlgorithms.PixelConditionsAlgorithmsConf import PixelConfigCondAlg PixelConfigCondAlg.EndcapAnalogThreshold=[-1,-1,-1,] @@ -193,10 +171,6 @@ def EndcapFEI3SimTool(name="EndcapFEI3SimTool", **kwargs): def BasicPixelDigitizationTool(name="PixelDigitizationTool", **kwargs): from AthenaCommon import CfgGetter - kwargs.setdefault("RndmSvc", digitizationFlags.rndmSvc()) - streamName = kwargs.setdefault("RndmEngine", "PixelDigitization") - if not digitizationFlags.rndmSeedList.checkForExistingSeed(streamName): - digitizationFlags.rndmSeedList.addSeed(streamName, 10513239, 492615104 ) from AthenaCommon.Resilience import protectedInclude from AthenaCommon.Include import include from AthenaCommon.AppMgr import ServiceMgr diff --git a/InnerDetector/InDetDigitization/PixelDigitization/src/EnergyDepositionTool.cxx b/InnerDetector/InDetDigitization/PixelDigitization/src/EnergyDepositionTool.cxx index 35d81ed24b9433a5097afc2d95dd24446e99ce74..6ecdcb7e24f7c3db01c087d736b38ee3bfc007ad 100644 --- a/InnerDetector/InDetDigitization/PixelDigitization/src/EnergyDepositionTool.cxx +++ b/InnerDetector/InDetDigitization/PixelDigitization/src/EnergyDepositionTool.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ /////////////////////////////////////////////////////////////////// @@ -46,10 +46,7 @@ EnergyDepositionTool::EnergyDepositionTool(const std::string& type, const std::s m_doBichsel(false), m_doBichselBetaGammaCut(0.1), // replace momentum cut m_doDeltaRay(false), // need validation - m_doPU(true), - m_rndmSvc("AtDSFMTGenSvc",name), - m_rndmEngineName("PixelDigitization"), - m_rndmEngine(0) + m_doPU(true) { declareProperty("DeltaRayCut", m_DeltaRayCut = 117.); @@ -62,8 +59,6 @@ EnergyDepositionTool::EnergyDepositionTool(const std::string& type, const std::s declareProperty("doBichselBetaGammaCut", m_doBichselBetaGammaCut, "minimum beta-gamma for particle to be re-simulated through Bichsel Model"); declareProperty("doDeltaRay", m_doDeltaRay, "whether we simulate delta-ray using Bichsel model"); declareProperty("doPU", m_doPU, "Whether we apply Bichsel model on PU"); - declareProperty("RndmSvc", m_rndmSvc, "Random Number Service used in EnergyDepositionTool"); - declareProperty("RndmEngine", m_rndmEngineName, "Random engine name"); } // Destructor: @@ -74,8 +69,6 @@ EnergyDepositionTool::~EnergyDepositionTool(){} //======================================= StatusCode EnergyDepositionTool::initialize() { - CHECK(AthAlgTool::initialize()); - CHECK(m_rndmSvc.retrieve()); ATH_MSG_INFO("You are using EnergyDepositionTool for solid-state silicon detectors."); //Setup distortions tool @@ -90,17 +83,6 @@ StatusCode EnergyDepositionTool::initialize() { } } - // get the random stream - ATH_MSG_DEBUG ( "Getting random number engine : <" << m_rndmEngineName << ">" ); - m_rndmEngine = m_rndmSvc->GetEngine(m_rndmEngineName); - if (!m_rndmEngine) { - ATH_MSG_ERROR("Could not find RndmEngine : " << m_rndmEngineName); - return StatusCode::FAILURE; - } - else { - ATH_MSG_DEBUG("Found RndmEngine : " << m_rndmEngineName); - } - if(m_doBichsel){ // Load Bichsel data m_BichselData.clear(); @@ -185,7 +167,7 @@ StatusCode EnergyDepositionTool::finalize() { //======================================= // D E P O S I T E N E R G Y //======================================= -StatusCode EnergyDepositionTool::depositEnergy(const TimedHitPtr<SiHit> &phit, const InDetDD::SiDetectorElement &Module, std::vector<std::pair<double,double> > &trfHitRecord, std::vector<double> &initialConditions){ +StatusCode EnergyDepositionTool::depositEnergy(const TimedHitPtr<SiHit> &phit, const InDetDD::SiDetectorElement &Module, std::vector<std::pair<double,double> > &trfHitRecord, std::vector<double> &initialConditions, CLHEP::HepRandomEngine *rndmEngine){ ATH_MSG_DEBUG("Deposit energy in sensor volume."); @@ -293,7 +275,7 @@ StatusCode EnergyDepositionTool::depositEnergy(const TimedHitPtr<SiHit> &phit, c //double iTotalLength = pathLength*1000.; // mm -> micrometer // begin simulation - std::vector<std::pair<double,double> > rawHitRecord = BichselSim(iBetaGamma, iParticleType, iTotalLength, genPart ? (genPart->momentum().e()/CLHEP::MeV) : (phit->energyLoss()/CLHEP::MeV)); + std::vector<std::pair<double,double> > rawHitRecord = BichselSim(iBetaGamma, iParticleType, iTotalLength, genPart ? (genPart->momentum().e()/CLHEP::MeV) : (phit->energyLoss()/CLHEP::MeV), rndmEngine); // check if returned simulation result makes sense if(rawHitRecord.size() == 0){ // deal with rawHitRecord==0 specifically -- no energy deposition @@ -360,7 +342,7 @@ void EnergyDepositionTool::simulateBow(const InDetDD::SiDetectorElement * elemen // InciEnergy should be in MeV // In case there is any abnormal in runtime, (-1,-1) will be returned indicating old deposition model should be used instead //----------------------------------------------------------- -std::vector<std::pair<double,double> > EnergyDepositionTool::BichselSim(double BetaGamma, int ParticleType, double TotalLength, double InciEnergy) const{ +std::vector<std::pair<double,double> > EnergyDepositionTool::BichselSim(double BetaGamma, int ParticleType, double TotalLength, double InciEnergy, CLHEP::HepRandomEngine *rndmEngine) const{ ATH_MSG_DEBUG("Begin EnergyDepositionTool::BichselSim"); // prepare hit record (output) @@ -410,7 +392,7 @@ std::vector<std::pair<double,double> > EnergyDepositionTool::BichselSim(double B // sample hit position -- exponential distribution double HitPosition = 0.; for(int iHit = 0; iHit < m_nCols; iHit++){ - HitPosition += CLHEP::RandExpZiggurat::shoot(m_rndmEngine, lambda); + HitPosition += CLHEP::RandExpZiggurat::shoot(rndmEngine, lambda); } // termination by hit position // yes, in case m_nCols > 1, we will loose the last m_nCols collisions. So m_nCols cannot be too big @@ -420,7 +402,7 @@ std::vector<std::pair<double,double> > EnergyDepositionTool::BichselSim(double B // sample single collision double TossEnergyLoss = -1.; while(TossEnergyLoss <= 0.){ // we have to do this because sometimes TossEnergyLoss will be negative due to too small TossIntX - double TossIntX = CLHEP::RandFlat::shoot(m_rndmEngine, 0., IntXUpperBound); + double TossIntX = CLHEP::RandFlat::shoot(rndmEngine, 0., IntXUpperBound); TossEnergyLoss = GetColE(indices_BetaGammaLog10, TMath::Log10(TossIntX), iData); } diff --git a/InnerDetector/InDetDigitization/PixelDigitization/src/EnergyDepositionTool.h b/InnerDetector/InDetDigitization/PixelDigitization/src/EnergyDepositionTool.h index 0c03088d6facb47e1989650708931fb32b52a0b4..3a283c7bab475f10812147dd41f7a3fdc576dff0 100644 --- a/InnerDetector/InDetDigitization/PixelDigitization/src/EnergyDepositionTool.h +++ b/InnerDetector/InDetDigitization/PixelDigitization/src/EnergyDepositionTool.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ /////////////////////////////////////////////////////////////////// @@ -23,7 +23,6 @@ #include "GaudiKernel/ServiceHandle.h" #include "AthenaBaseComps/AthAlgTool.h" #include "CLHEP/Random/RandomEngine.h" -#include "AthenaKernel/IAtRndmGenSvc.h" #include "GaudiKernel/ToolHandle.h" #include "GaudiKernel/Property.h" #include "GaudiKernel/Service.h" @@ -60,12 +59,12 @@ public: virtual ~EnergyDepositionTool(); StatusCode initTools(); - std::vector<std::pair<double,double> > BichselSim(double BetaGamma, int ParticleType, double TotalLength, double InciEnergy) const; // output hit record in the format (hit position, energy loss) + std::vector<std::pair<double,double> > BichselSim(double BetaGamma, int ParticleType, double TotalLength, double InciEnergy, CLHEP::HepRandomEngine *rndmEngine) const; // output hit record in the format (hit position, energy loss) std::vector<std::pair<double,double> > ClusterHits(std::vector<std::pair<double,double> >& rawHitRecord, int n_pieces) const; // cluster hits into n steps (there could be thousands of hit) int trfPDG(int pdgId) const; // convert pdgId to ParticleType. If it is unsupported particle, -1 is returned. - virtual StatusCode depositEnergy(const TimedHitPtr<SiHit> &phit, const InDetDD::SiDetectorElement &Module, std::vector<std::pair<double,double> > &trfHitRecord, std::vector<double> &initialConditions); + virtual StatusCode depositEnergy(const TimedHitPtr<SiHit> &phit, const InDetDD::SiDetectorElement &Module, std::vector<std::pair<double,double> > &trfHitRecord, std::vector<double> &initialConditions, CLHEP::HepRandomEngine *rndmEngine); // Variables @@ -89,11 +88,6 @@ private: PublicToolHandle<IModuleDistortionsTool> m_pixDistoTool {this,"PixelDistortionsTool","PixelDistortionsTool",""}; -protected: - ServiceHandle<IAtRndmGenSvc> m_rndmSvc; - std::string m_rndmEngineName; - CLHEP::HepRandomEngine* m_rndmEngine; - // Functions private: void simulateBow(const InDetDD::SiDetectorElement * element,double& xi, double& yi, const double zi, double& xf, double& yf, const double zf) const; diff --git a/InnerDetector/InDetDigitization/PixelDigitization/src/FEI3SimTool.cxx b/InnerDetector/InDetDigitization/PixelDigitization/src/FEI3SimTool.cxx index 5a9b27cc03129b4b9affcbdd26749de40278f521..538b73db2b12e88e0c8896135ebd7f7b62a8097b 100644 --- a/InnerDetector/InDetDigitization/PixelDigitization/src/FEI3SimTool.cxx +++ b/InnerDetector/InDetDigitization/PixelDigitization/src/FEI3SimTool.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #include "FEI3SimTool.h" @@ -24,7 +24,7 @@ StatusCode FEI3SimTool::finalize() { return StatusCode::SUCCESS; } -void FEI3SimTool::process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Collection &rdoCollection) { +void FEI3SimTool::process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Collection &rdoCollection, CLHEP::HepRandomEngine *rndmEngine) { const InDetDD::PixelModuleDesign *p_design = static_cast<const InDetDD::PixelModuleDesign*>(&(chargedDiodes.element())->design()); if (p_design->getReadoutTechnology()!=InDetDD::PixelModuleDesign::FEI3) { return; } @@ -44,13 +44,13 @@ void FEI3SimTool::process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Colle CrossTalk(module_data->getCrossTalk(barrel_ec,layerIndex),chargedDiodes); // Add thermal noise - ThermalNoise(module_data->getThermalNoise(barrel_ec,layerIndex),chargedDiodes); + ThermalNoise(module_data->getThermalNoise(barrel_ec,layerIndex),chargedDiodes, rndmEngine); // Add random noise - RandomNoise(chargedDiodes); + RandomNoise(chargedDiodes, rndmEngine); // Add random diabled pixels - RandomDisable(chargedDiodes); + RandomDisable(chargedDiodes, rndmEngine); for (SiChargedDiodeIterator i_chargedDiode=chargedDiodes.begin(); i_chargedDiode!=chargedDiodes.end(); ++i_chargedDiode) { // Merge ganged pixel @@ -92,17 +92,17 @@ void FEI3SimTool::process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Colle double th0 = m_pixelCalibSvc->getThreshold(diodeID); double ith0 = m_pixelCalibSvc->getTimeWalk(diodeID); - double threshold = th0+m_pixelCalibSvc->getThresholdSigma(diodeID)*CLHEP::RandGaussZiggurat::shoot(m_rndmEngine)+m_pixelCalibSvc->getNoise(diodeID)*CLHEP::RandGaussZiggurat::shoot(m_rndmEngine); + double threshold = th0+m_pixelCalibSvc->getThresholdSigma(diodeID)*CLHEP::RandGaussZiggurat::shoot(rndmEngine)+m_pixelCalibSvc->getNoise(diodeID)*CLHEP::RandGaussZiggurat::shoot(rndmEngine); double intimethreshold = (ith0/th0)*threshold; if (charge>threshold) { int bunchSim; if ((*i_chargedDiode).second.totalCharge().fromTrack()) { - if (m_timingTune==2015) { bunchSim = relativeBunch2015((*i_chargedDiode).second.totalCharge(),barrel_ec,layerIndex,moduleIndex); } - else { bunchSim = relativeBunch2009(threshold,intimethreshold,(*i_chargedDiode).second.totalCharge()); } + if (m_timingTune==2015) { bunchSim = relativeBunch2015((*i_chargedDiode).second.totalCharge(),barrel_ec,layerIndex,moduleIndex, rndmEngine); } + else { bunchSim = relativeBunch2009(threshold,intimethreshold,(*i_chargedDiode).second.totalCharge(), rndmEngine); } } else { - bunchSim = CLHEP::RandFlat::shootInt(m_rndmEngine,m_timeBCN); + bunchSim = CLHEP::RandFlat::shootInt(rndmEngine,m_timeBCN); } if (bunchSim<0 || bunchSim>m_timeBCN) { SiHelper::belowThreshold((*i_chargedDiode).second,true,true); } @@ -117,7 +117,7 @@ void FEI3SimTool::process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Colle // charge to ToT conversion double tot = m_pixelCalibSvc->getTotMean(diodeID,charge); double totsig = m_pixelCalibSvc->getTotRes(diodeID,tot); - int nToT = static_cast<int>(CLHEP::RandGaussZiggurat::shoot(m_rndmEngine,tot,totsig)); + int nToT = static_cast<int>(CLHEP::RandGaussZiggurat::shoot(rndmEngine,tot,totsig)); if (nToT<1) { nToT=1; } @@ -163,7 +163,7 @@ void FEI3SimTool::process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Colle return; } -int FEI3SimTool::relativeBunch2009(const double threshold, const double intimethreshold, const SiTotalCharge &totalCharge) const { +int FEI3SimTool::relativeBunch2009(const double threshold, const double intimethreshold, const SiTotalCharge &totalCharge, CLHEP::HepRandomEngine *rndmEngine) const { int BCID=0; double myTimeWalkEff = 0.; @@ -180,9 +180,9 @@ int FEI3SimTool::relativeBunch2009(const double threshold, const double intimeth double myTimeWalk = -p0 -p1 * log(1. - threshold/totalCharge.charge()); - myTimeWalkEff = myTimeWalk+myTimeWalk*0.2*CLHEP::RandGaussZiggurat::shoot(m_rndmEngine); + myTimeWalkEff = myTimeWalk+myTimeWalk*0.2*CLHEP::RandGaussZiggurat::shoot(rndmEngine); - double randomjitter = CLHEP::RandFlat::shoot(m_rndmEngine,(-m_timeJitter/2.0),(m_timeJitter/2.0)); + double randomjitter = CLHEP::RandFlat::shoot(rndmEngine,(-m_timeJitter/2.0),(m_timeJitter/2.0)); //double G4Time = totalCharge.time(); @@ -195,7 +195,7 @@ int FEI3SimTool::relativeBunch2009(const double threshold, const double intimeth } // This is the new parameterization based on the 2015 collision data. -int FEI3SimTool::relativeBunch2015(const SiTotalCharge &totalCharge, int barrel_ec, int layer_disk, int moduleID) const { +int FEI3SimTool::relativeBunch2015(const SiTotalCharge &totalCharge, int barrel_ec, int layer_disk, int moduleID, CLHEP::HepRandomEngine *rndmEngine) const { /** * 2016.03.29 Soshi.Tsuno@cern.ch @@ -394,7 +394,7 @@ int FEI3SimTool::relativeBunch2015(const SiTotalCharge &totalCharge, int barrel_ } double G4Time = getG4Time(totalCharge); - double rnd = CLHEP::RandFlat::shoot(m_rndmEngine,0.0,1.0); + double rnd = CLHEP::RandFlat::shoot(rndmEngine,0.0,1.0); double timeWalk = 0.0; if (rnd<prob) { timeWalk = 25.0; } diff --git a/InnerDetector/InDetDigitization/PixelDigitization/src/FEI3SimTool.h b/InnerDetector/InDetDigitization/PixelDigitization/src/FEI3SimTool.h index bb9ee5f15fbc7fa4177620873cffd5d869edca09..f0a243bbf21f429193113ac6f6ac464212a41671 100644 --- a/InnerDetector/InDetDigitization/PixelDigitization/src/FEI3SimTool.h +++ b/InnerDetector/InDetDigitization/PixelDigitization/src/FEI3SimTool.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef PIXELDIGITIZATION_FEI3SimTool_H @@ -16,16 +16,16 @@ class FEI3SimTool:public FrontEndSimTool { virtual StatusCode initialize(); virtual StatusCode finalize(); virtual ~FEI3SimTool(); - virtual void process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Collection &rdoCollection); + virtual void process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Collection &rdoCollection, CLHEP::HepRandomEngine *rndmEngine); private: FEI3SimTool(); int m_timingTune; - int relativeBunch2009(const double threshold, const double intimethreshold, const SiTotalCharge &totalCharge) const; + int relativeBunch2009(const double threshold, const double intimethreshold, const SiTotalCharge &totalCharge, CLHEP::HepRandomEngine *rndmEngine) const; - int relativeBunch2015(const SiTotalCharge &totalCharge, int barrel_ec, int layer_disk, int moduleID) const; + int relativeBunch2015(const SiTotalCharge &totalCharge, int barrel_ec, int layer_disk, int moduleID, CLHEP::HepRandomEngine *rndmEngine) const; }; diff --git a/InnerDetector/InDetDigitization/PixelDigitization/src/FEI4SimTool.cxx b/InnerDetector/InDetDigitization/PixelDigitization/src/FEI4SimTool.cxx index 5c60ef49c0b36c26e55028719d9e864ae5ba35c9..31bffcc877bdb83fd696e2f420bdca590df884d8 100644 --- a/InnerDetector/InDetDigitization/PixelDigitization/src/FEI4SimTool.cxx +++ b/InnerDetector/InDetDigitization/PixelDigitization/src/FEI4SimTool.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #include "FEI4SimTool.h" @@ -23,7 +23,7 @@ StatusCode FEI4SimTool::finalize() { return StatusCode::SUCCESS; } -void FEI4SimTool::process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Collection &rdoCollection) { +void FEI4SimTool::process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Collection &rdoCollection, CLHEP::HepRandomEngine *rndmEngine) { const InDetDD::PixelModuleDesign *p_design = static_cast<const InDetDD::PixelModuleDesign*>(&(chargedDiodes.element())->design()); if (p_design->getReadoutTechnology()!=InDetDD::PixelModuleDesign::FEI4) { return; } @@ -52,13 +52,13 @@ void FEI4SimTool::process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Colle CrossTalk(module_data->getCrossTalk(barrel_ec,layerIndex),chargedDiodes); // Add thermal noise - ThermalNoise(module_data->getThermalNoise(barrel_ec,layerIndex),chargedDiodes); + ThermalNoise(module_data->getThermalNoise(barrel_ec,layerIndex),chargedDiodes,rndmEngine); // Add random noise - RandomNoise(chargedDiodes); + RandomNoise(chargedDiodes,rndmEngine); // Add random diabled pixels - RandomDisable(chargedDiodes); + RandomDisable(chargedDiodes,rndmEngine); for (SiChargedDiodeIterator i_chargedDiode=chargedDiodes.begin(); i_chargedDiode!=chargedDiodes.end(); ++i_chargedDiode) { @@ -68,7 +68,7 @@ void FEI4SimTool::process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Colle // Apply analogu threshold, timing simulation double th0 = m_pixelCalibSvc->getThreshold(diodeID); - double threshold = th0+m_pixelCalibSvc->getThresholdSigma(diodeID)*CLHEP::RandGaussZiggurat::shoot(m_rndmEngine)+m_pixelCalibSvc->getNoise(diodeID)*CLHEP::RandGaussZiggurat::shoot(m_rndmEngine); + double threshold = th0+m_pixelCalibSvc->getThresholdSigma(diodeID)*CLHEP::RandGaussZiggurat::shoot(rndmEngine)+m_pixelCalibSvc->getNoise(diodeID)*CLHEP::RandGaussZiggurat::shoot(rndmEngine); if (charge>threshold) { int bunchSim; @@ -76,7 +76,7 @@ void FEI4SimTool::process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Colle bunchSim = static_cast<int>(floor((getG4Time((*i_chargedDiode).second.totalCharge())+m_timeZero)/m_timePerBCO)); } else { - bunchSim = CLHEP::RandFlat::shootInt(m_rndmEngine,m_timeBCN); + bunchSim = CLHEP::RandFlat::shootInt(rndmEngine,m_timeBCN); } if (bunchSim<0 || bunchSim>m_timeBCN) { SiHelper::belowThreshold((*i_chargedDiode).second,true,true); } @@ -91,7 +91,7 @@ void FEI4SimTool::process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Colle // charge to ToT conversion double tot = m_pixelCalibSvc->getTotMean(diodeID,charge); double totsig = m_pixelCalibSvc->getTotRes(diodeID,tot); - int nToT = static_cast<int>(CLHEP::RandGaussZiggurat::shoot(m_rndmEngine,tot,totsig)); + int nToT = static_cast<int>(CLHEP::RandGaussZiggurat::shoot(rndmEngine,tot,totsig)); const PixelID* pixelId = static_cast<const PixelID*>(chargedDiodes.element()->getIdHelper()); if (pixelId->is_dbm(chargedDiodes.element()->identify())) { diff --git a/InnerDetector/InDetDigitization/PixelDigitization/src/FEI4SimTool.h b/InnerDetector/InDetDigitization/PixelDigitization/src/FEI4SimTool.h index 0fb43666b816dcb898dcf7b24f3e1954e98ac603..a4a4498f8f6d3bbc8792893d9da8e6412bbfd86d 100644 --- a/InnerDetector/InDetDigitization/PixelDigitization/src/FEI4SimTool.h +++ b/InnerDetector/InDetDigitization/PixelDigitization/src/FEI4SimTool.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef PIXELDIGITIZATION_FEI4SimTool_H @@ -16,7 +16,7 @@ class FEI4SimTool:public FrontEndSimTool { virtual StatusCode initialize(); virtual StatusCode finalize(); virtual ~FEI4SimTool(); - virtual void process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Collection &rdoCollection); + virtual void process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Collection &rdoCollection, CLHEP::HepRandomEngine *rndmEngine); private: FEI4SimTool(); diff --git a/InnerDetector/InDetDigitization/PixelDigitization/src/FrontEndSimTool.h b/InnerDetector/InDetDigitization/PixelDigitization/src/FrontEndSimTool.h index febdeab91d8df71ede548a9c79a45cb0282097a6..8061165bb9a915518efe0b41f6f6e33fa389167e 100644 --- a/InnerDetector/InDetDigitization/PixelDigitization/src/FrontEndSimTool.h +++ b/InnerDetector/InDetDigitization/PixelDigitization/src/FrontEndSimTool.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef PIXELDIGITIZATION_FrontEndSimTool_H @@ -39,9 +39,6 @@ class FrontEndSimTool:public AthAlgTool,virtual public IAlgTool { public: FrontEndSimTool( const std::string& type, const std::string& name,const IInterface* parent): AthAlgTool(type,name,parent), - m_rndmSvc("AtRndmGenSvc",name), - m_rndmEngineName("PixelDigitization"), - m_rndmEngine(nullptr), m_pixelCalibSvc("PixelCalibSvc",name), m_timeBCN(1), m_timeZero(5.0), @@ -57,8 +54,6 @@ class FrontEndSimTool:public AthAlgTool,virtual public IAlgTool { m_disableProbability(9e-3) { declareInterface<FrontEndSimTool>(this); - declareProperty("RndmSvc", m_rndmSvc, "Random number service used in FE simulation"); - declareProperty("RndmEngine", m_rndmEngineName, "Random engine name"); declareProperty("PixelCalibSvc", m_pixelCalibSvc); declareProperty("TimeBCN", m_timeBCN, "Number of BCID"); declareProperty("TimeZero", m_timeZero, "Time zero...?"); @@ -74,25 +69,12 @@ class FrontEndSimTool:public AthAlgTool,virtual public IAlgTool { static const InterfaceID& interfaceID() { return IID_IFrontEndSimTool; } virtual StatusCode initialize() { - ATH_CHECK(AthAlgTool::initialize()); - - ATH_CHECK(m_rndmSvc.retrieve()); - ATH_CHECK(m_pixelConditionsTool.retrieve()); ATH_CHECK(m_pixelCalibSvc.retrieve()); ATH_CHECK(m_moduleDataKey.initialize()); - m_rndmEngine = m_rndmSvc->GetEngine(m_rndmEngineName); - if (!m_rndmEngine) { - ATH_MSG_ERROR("Could not find RndmEngine : " << m_rndmEngineName); - return StatusCode::FAILURE; - } - else { - ATH_MSG_DEBUG("Found RndmEngine : " << m_rndmEngineName); - } - ATH_CHECK(m_ComTimeKey.initialize(m_useComTime)); if (m_useComTime) { SG::ReadHandle<ComTime> comTime(m_ComTimeKey); @@ -109,7 +91,7 @@ class FrontEndSimTool:public AthAlgTool,virtual public IAlgTool { virtual StatusCode finalize() { return StatusCode::FAILURE; } virtual ~FrontEndSimTool() {} - virtual void process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Collection &rdoCollection) = 0; + virtual void process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Collection &rdoCollection, CLHEP::HepRandomEngine *rndmEngine) = 0; void CrossTalk(double crossTalk, SiChargedDiodeCollection &chargedDiodes) const { const InDetDD::PixelModuleDesign *p_design = static_cast<const InDetDD::PixelModuleDesign*>(&(chargedDiodes.element())->design()); @@ -141,21 +123,21 @@ class FrontEndSimTool:public AthAlgTool,virtual public IAlgTool { return; } - void ThermalNoise(double thermalNoise, SiChargedDiodeCollection &chargedDiodes) const { + void ThermalNoise(double thermalNoise, SiChargedDiodeCollection &chargedDiodes, CLHEP::HepRandomEngine *rndmEngine) const { for (SiChargedDiodeIterator i_chargedDiode=chargedDiodes.begin(); i_chargedDiode!=chargedDiodes.end(); ++i_chargedDiode) { - SiCharge charge(thermalNoise*CLHEP::RandGaussZiggurat::shoot(m_rndmEngine),0,SiCharge::noise); + SiCharge charge(thermalNoise*CLHEP::RandGaussZiggurat::shoot(rndmEngine),0,SiCharge::noise); (*i_chargedDiode).second.add(charge); } return; } - void RandomNoise(SiChargedDiodeCollection &chargedDiodes) const { + void RandomNoise(SiChargedDiodeCollection &chargedDiodes, CLHEP::HepRandomEngine *rndmEngine) const { const InDetDD::PixelModuleDesign *p_design = static_cast<const InDetDD::PixelModuleDesign*>(&(chargedDiodes.element())->design()); - int nNoise = CLHEP::RandPoisson::shoot(m_rndmEngine, p_design->numberOfCircuits()*p_design->columnsPerCircuit()*p_design->rowsPerCircuit()*m_noiseOccupancy*static_cast<double>(m_timeBCN)); + int nNoise = CLHEP::RandPoisson::shoot(rndmEngine, p_design->numberOfCircuits()*p_design->columnsPerCircuit()*p_design->rowsPerCircuit()*m_noiseOccupancy*static_cast<double>(m_timeBCN)); for (int i=0; i<nNoise; i++) { - int circuit = CLHEP::RandFlat::shootInt(m_rndmEngine,p_design->numberOfCircuits()); - int column = CLHEP::RandFlat::shootInt(m_rndmEngine,p_design->columnsPerCircuit()); - int row = CLHEP::RandFlat::shootInt(m_rndmEngine,p_design->rowsPerCircuit()); + int circuit = CLHEP::RandFlat::shootInt(rndmEngine,p_design->numberOfCircuits()); + int column = CLHEP::RandFlat::shootInt(rndmEngine,p_design->columnsPerCircuit()); + int row = CLHEP::RandFlat::shootInt(rndmEngine,p_design->rowsPerCircuit()); if (row>159 && p_design->getReadoutTechnology()==InDetDD::PixelModuleDesign::FEI3) { row += 8; } // jump over ganged pixels - rowsPerCircuit == 320 above InDetDD::SiReadoutCellId roCell(row, p_design->columnsPerCircuit()*circuit+column); @@ -164,13 +146,13 @@ class FrontEndSimTool:public AthAlgTool,virtual public IAlgTool { if (roCell.isValid()) { InDetDD::SiCellId diodeNoise = roCell; - double x = CLHEP::RandFlat::shoot(m_rndmEngine,0.,1.); + double x = CLHEP::RandFlat::shoot(rndmEngine,0.,1.); int bin=0; for (size_t j=1; j<m_noiseShape.size(); j++) { if (x>m_noiseShape[j-1] && x<=m_noiseShape[j]) { bin=j-1; continue; } } double noiseToTm = bin+1.5; - double noiseToT = CLHEP::RandGaussZiggurat::shoot(m_rndmEngine,noiseToTm,1.); + double noiseToT = CLHEP::RandGaussZiggurat::shoot(rndmEngine,noiseToTm,1.); double chargeShape = m_pixelCalibSvc->getCharge(noisyID,noiseToT); chargedDiodes.add(diodeNoise,SiCharge(chargeShape,0,SiCharge::noise)); @@ -179,9 +161,9 @@ class FrontEndSimTool:public AthAlgTool,virtual public IAlgTool { return; } - void RandomDisable(SiChargedDiodeCollection &chargedDiodes) const { + void RandomDisable(SiChargedDiodeCollection &chargedDiodes, CLHEP::HepRandomEngine *rndmEngine) const { for (SiChargedDiodeIterator i_chargedDiode=chargedDiodes.begin(); i_chargedDiode!=chargedDiodes.end(); ++i_chargedDiode) { - if (CLHEP::RandFlat::shoot(m_rndmEngine)<m_disableProbability) { + if (CLHEP::RandFlat::shoot(rndmEngine)<m_disableProbability) { SiHelper::disabled((*i_chargedDiode).second,true,false); } } @@ -193,10 +175,6 @@ class FrontEndSimTool:public AthAlgTool,virtual public IAlgTool { FrontEndSimTool(); protected: - ServiceHandle<IAtRndmGenSvc> m_rndmSvc; - std::string m_rndmEngineName; - CLHEP::HepRandomEngine *m_rndmEngine; - ToolHandle<IInDetConditionsTool> m_pixelConditionsTool{this, "PixelConditionsSummaryTool", "PixelConditionsSummaryTool", "Tool to retrieve Pixel Conditions summary"}; ServiceHandle<IPixelCalibSvc> m_pixelCalibSvc; diff --git a/InnerDetector/InDetDigitization/PixelDigitization/src/PixelDigitizationTool.cxx b/InnerDetector/InDetDigitization/PixelDigitization/src/PixelDigitizationTool.cxx index 18bc72721de1c1d24d05f5eb6f84338356e1ed98..19ccde868875605bdafa2d6b4732675f754943c2 100644 --- a/InnerDetector/InDetDigitization/PixelDigitization/src/PixelDigitizationTool.cxx +++ b/InnerDetector/InDetDigitization/PixelDigitization/src/PixelDigitizationTool.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ //////////////////////////////////////////////////////////////////////////// @@ -16,6 +16,10 @@ #include "Identifier/Identifier.h" #include "InDetIdentifier/PixelID.h" +// Random Number Generation +#include "AthenaKernel/RNGWrapper.h" +#include "CLHEP/Random/RandomEngine.h" + #include <limits> #include <cstdint> static constexpr unsigned int crazyParticleBarcode(std::numeric_limits<int32_t>::max()); @@ -29,7 +33,6 @@ PixelDigitizationTool::PixelDigitizationTool(const std::string &type, m_simDataCollKey("PixelSDO_Map"), m_HardScatterSplittingMode(0), m_HardScatterSplittingSkipper(false), - m_rndmEngineName("PixelDigitization"), m_onlyHitElements(false), m_chargeTool(nullptr), m_fesimTool(nullptr), @@ -37,9 +40,7 @@ PixelDigitizationTool::PixelDigitizationTool(const std::string &type, m_detID(nullptr), m_vetoThisBarcode(crazyParticleBarcode), m_timedHits(nullptr), - m_rndmSvc("AtRndmGenSvc",name), m_mergeSvc("PileUpMergeSvc",name), - m_rndmEngine(nullptr), m_detManager(nullptr), m_inputObjectName(""), m_createNoiseSDO(false) @@ -47,13 +48,11 @@ PixelDigitizationTool::PixelDigitizationTool(const std::string &type, declareProperty("ChargeTools", m_chargeTool, "List of charge tools"); declareProperty("FrontEndSimTools", m_fesimTool, "List of Front-End simulation tools"); declareProperty("EnergyDepositionTool", m_energyDepositionTool, "Energy deposition tool"); - declareProperty("RndmSvc", m_rndmSvc, "Random number service used in Pixel Digitization"); declareProperty("MergeSvc", m_mergeSvc, "Merge service used in Pixel digitization"); declareProperty("InputObjectName", m_inputObjectName, "Input Object name" ); declareProperty("CreateNoiseSDO", m_createNoiseSDO, "Set create noise SDO flag"); declareProperty("RDOCollName", m_rdoContainerKey, "RDO collection name"); declareProperty("SDOCollName", m_simDataCollKey, "SDO collection name"); - declareProperty("RndmEngine", m_rndmEngineName, "Random engine name"); declareProperty("OnlyHitElements", m_onlyHitElements, "Process only elements with hits"); declareProperty("HardScatterSplittingMode", m_HardScatterSplittingMode, "Control pileup & signal splitting" ); declareProperty("ParticleBarcodeVeto",m_vetoThisBarcode=crazyParticleBarcode, "Barcode of particle to ignore"); @@ -78,15 +77,7 @@ StatusCode PixelDigitizationTool::initialize() { CHECK(m_mergeSvc.retrieve()); // Initialize random number generator - CHECK(m_rndmSvc.retrieve()); - m_rndmEngine = m_rndmSvc->GetEngine(m_rndmEngineName); - if (!m_rndmEngine) { - ATH_MSG_ERROR("Could not find RndmEngine : " << m_rndmEngineName); - return StatusCode::FAILURE; - } - else { - ATH_MSG_DEBUG("Found RndmEngine : " << m_rndmEngineName); - } + ATH_CHECK(m_rndmSvc.retrieve()); // Initialize detector manager CHECK(detStore()->retrieve(m_detManager,"Pixel")); @@ -161,6 +152,11 @@ StatusCode PixelDigitizationTool::digitizeEvent() { std::vector<bool> processedElements; processedElements.resize(m_detID->wafer_hash_max(),false); + // Set the RNG to use for this event. + ATHRNG::RNGWrapper* rngWrapper = m_rndmSvc->getEngine(this); + rngWrapper->setSeed( name(), Gaudi::Hive::currentContext() ); + CLHEP::HepRandomEngine *rndmEngine = *rngWrapper; + TimedHitCollection<SiHit>::const_iterator firstHit, lastHit; //////////////////////////////////////////////// @@ -198,12 +194,12 @@ StatusCode PixelDigitizationTool::digitizeEvent() { ATH_MSG_DEBUG("Running sensor simulation."); //Deposit energy in sensor - CHECK(m_energyDepositionTool->depositEnergy( *phit, *sielement, trfHitRecord, initialConditions)); + CHECK(m_energyDepositionTool->depositEnergy( *phit, *sielement, trfHitRecord, initialConditions, rndmEngine)); //Create signal in sensor, loop over collection of loaded sensorTools for (unsigned int itool=0; itool<m_chargeTool.size(); itool++) { ATH_MSG_DEBUG("Executing tool " << m_chargeTool[itool]->name()); - if (m_chargeTool[itool]->induceCharge( *phit, *chargedDiodes, *sielement, *p_design, trfHitRecord, initialConditions)==StatusCode::FAILURE) { break; } + if (m_chargeTool[itool]->induceCharge( *phit, *chargedDiodes, *sielement, *p_design, trfHitRecord, initialConditions, rndmEngine)==StatusCode::FAILURE) { break; } } initialConditions.clear(); trfHitRecord.clear(); @@ -226,7 +222,7 @@ StatusCode PixelDigitizationTool::digitizeEvent() { RDOColl->setIdentifier(chargedDiodes->identify()); for (unsigned int itool=0; itool<m_fesimTool.size(); itool++) { ATH_MSG_DEBUG("Executing tool " << m_fesimTool[itool]->name()); - m_fesimTool[itool]->process(*chargedDiodes,*RDOColl); + m_fesimTool[itool]->process(*chargedDiodes,*RDOColl, rndmEngine); } CHECK(m_rdoContainer->addCollection(RDOColl,RDOColl->identifyHash())); @@ -260,7 +256,7 @@ StatusCode PixelDigitizationTool::digitizeEvent() { RDOColl->setIdentifier(chargedDiodes->identify()); for (unsigned int itool=0; itool<m_fesimTool.size(); itool++) { ATH_MSG_DEBUG("Executing tool " << m_fesimTool[itool]->name()); - m_fesimTool[itool]->process(*chargedDiodes,*RDOColl); + m_fesimTool[itool]->process(*chargedDiodes,*RDOColl, rndmEngine); } CHECK(m_rdoContainer->addCollection(RDOColl,RDOColl->identifyHash())); diff --git a/InnerDetector/InDetDigitization/PixelDigitization/src/PixelDigitizationTool.h b/InnerDetector/InDetDigitization/PixelDigitization/src/PixelDigitizationTool.h index 45a617528360988e0c04e5288d8e19186abe7eab..894b5fdaaba14b01b9bd2303101a9fb4b9b0b645 100644 --- a/InnerDetector/InDetDigitization/PixelDigitization/src/PixelDigitizationTool.h +++ b/InnerDetector/InDetDigitization/PixelDigitization/src/PixelDigitizationTool.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ /////////////////////////////////////////////////////////////////// @@ -13,6 +13,7 @@ #include "AthenaBaseComps/AthAlgTool.h" #include "PileUpTools/PileUpToolBase.h" +#include "AthenaKernel/IAthRNGSvc.h" #include "HitManagement/TimedHitCollection.h" #include "InDetSimEvent/SiHitCollection.h" @@ -63,7 +64,6 @@ class PixelDigitizationTool : public PileUpToolBase { int m_HardScatterSplittingMode; bool m_HardScatterSplittingSkipper; - std::string m_rndmEngineName; bool m_onlyHitElements; @@ -79,10 +79,9 @@ class PixelDigitizationTool : public PileUpToolBase { protected: - ServiceHandle <IAtRndmGenSvc> m_rndmSvc; + ServiceHandle<IAthRNGSvc> m_rndmSvc{this, "RndmSvc", "AthRNGSvc", ""}; //!< Random number service ServiceHandle <PileUpMergeSvc> m_mergeSvc; - CLHEP::HepRandomEngine *m_rndmEngine; const InDetDD::PixelDetectorManager *m_detManager; std::string m_inputObjectName; diff --git a/InnerDetector/InDetDigitization/PixelDigitization/src/RD53SimTool.cxx b/InnerDetector/InDetDigitization/PixelDigitization/src/RD53SimTool.cxx index ce1db9c65c177679ab66315d2c3c058b48e97345..477833db1d248479028b050219409ffe99c1e76b 100644 --- a/InnerDetector/InDetDigitization/PixelDigitization/src/RD53SimTool.cxx +++ b/InnerDetector/InDetDigitization/PixelDigitization/src/RD53SimTool.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #include "RD53SimTool.h" @@ -30,7 +30,7 @@ StatusCode RD53SimTool::finalize() { return StatusCode::SUCCESS; } -void RD53SimTool::process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Collection &rdoCollection) { +void RD53SimTool::process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Collection &rdoCollection, CLHEP::HepRandomEngine *rndmEngine) { const InDetDD::PixelModuleDesign *p_design = static_cast<const InDetDD::PixelModuleDesign*>(&(chargedDiodes.element())->design()); if (p_design->getReadoutTechnology()!=InDetDD::PixelModuleDesign::RD53) { return; } @@ -59,13 +59,13 @@ void RD53SimTool::process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Colle CrossTalk(module_data->getCrossTalk(barrel_ec,layerIndex),chargedDiodes); // Add thermal noise - ThermalNoise(module_data->getThermalNoise(barrel_ec,layerIndex),chargedDiodes); + ThermalNoise(module_data->getThermalNoise(barrel_ec,layerIndex),chargedDiodes,rndmEngine); // Add random noise - RandomNoise(chargedDiodes); + RandomNoise(chargedDiodes,rndmEngine); // Add random diabled pixels - RandomDisable(chargedDiodes); + RandomDisable(chargedDiodes,rndmEngine); for (SiChargedDiodeIterator i_chargedDiode=chargedDiodes.begin(); i_chargedDiode!=chargedDiodes.end(); ++i_chargedDiode) { @@ -75,7 +75,7 @@ void RD53SimTool::process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Colle // Apply analogu threshold, timing simulation double th0 = m_pixelCalibSvc->getThreshold(diodeID); - double threshold = th0+m_pixelCalibSvc->getThresholdSigma(diodeID)*CLHEP::RandGaussZiggurat::shoot(m_rndmEngine)+m_pixelCalibSvc->getNoise(diodeID)*CLHEP::RandGaussZiggurat::shoot(m_rndmEngine); + double threshold = th0+m_pixelCalibSvc->getThresholdSigma(diodeID)*CLHEP::RandGaussZiggurat::shoot(rndmEngine)+m_pixelCalibSvc->getNoise(diodeID)*CLHEP::RandGaussZiggurat::shoot(rndmEngine); if (charge>threshold) { @@ -84,7 +84,7 @@ void RD53SimTool::process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Colle bunchSim = static_cast<int>(floor((getG4Time((*i_chargedDiode).second.totalCharge())+m_timeZero)/m_timePerBCO)); } else { - bunchSim = CLHEP::RandFlat::shootInt(m_rndmEngine,m_timeBCN); + bunchSim = CLHEP::RandFlat::shootInt(rndmEngine,m_timeBCN); } if (bunchSim<0 || bunchSim>m_timeBCN) { SiHelper::belowThreshold((*i_chargedDiode).second,true,true); } @@ -99,7 +99,7 @@ void RD53SimTool::process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Colle // charge to ToT conversion double tot = m_pixelCalibSvc->getTotMean(diodeID,charge); double totsig = m_pixelCalibSvc->getTotRes(diodeID,tot); - int nToT = static_cast<int>(CLHEP::RandGaussZiggurat::shoot(m_rndmEngine,tot,totsig)); + int nToT = static_cast<int>(CLHEP::RandGaussZiggurat::shoot(rndmEngine,tot,totsig)); if (nToT<1) { nToT=1; } diff --git a/InnerDetector/InDetDigitization/PixelDigitization/src/RD53SimTool.h b/InnerDetector/InDetDigitization/PixelDigitization/src/RD53SimTool.h index 9ee97d417b4a65599c2d407775e7481f751e8e76..e31d8ee227400f87f93ac4f896a0685cc2376d55 100644 --- a/InnerDetector/InDetDigitization/PixelDigitization/src/RD53SimTool.h +++ b/InnerDetector/InDetDigitization/PixelDigitization/src/RD53SimTool.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef PIXELDIGITIZATION_RD53SimTool_H @@ -16,7 +16,7 @@ class RD53SimTool:public FrontEndSimTool { virtual StatusCode initialize(); virtual StatusCode finalize(); virtual ~RD53SimTool(); - virtual void process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Collection &rdoCollection); + virtual void process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Collection &rdoCollection, CLHEP::HepRandomEngine *rndmEngine); private: RD53SimTool(); diff --git a/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSim3DTool.cxx b/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSim3DTool.cxx index e27462ee0eafbbf7498e2e6027c299a17c666550..59ca1fe472bfbc344b91b942c69dbff9377bb8af 100644 --- a/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSim3DTool.cxx +++ b/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSim3DTool.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ /////////////////////////////////////////////////////////////////// @@ -69,7 +69,7 @@ StatusCode SensorSim3DTool::finalize() { //=============================================== // I N D U C E C H A R G E //=============================================== -StatusCode SensorSim3DTool::induceCharge(const TimedHitPtr<SiHit> &phit, SiChargedDiodeCollection &chargedDiodes, const InDetDD::SiDetectorElement &Module, const InDetDD::PixelModuleDesign &p_design, std::vector< std::pair<double,double> > &trfHitRecord, std::vector<double> &initialConditions) { +StatusCode SensorSim3DTool::induceCharge(const TimedHitPtr<SiHit> &phit, SiChargedDiodeCollection &chargedDiodes, const InDetDD::SiDetectorElement &Module, const InDetDD::PixelModuleDesign &p_design, std::vector< std::pair<double,double> > &trfHitRecord, std::vector<double> &initialConditions, CLHEP::HepRandomEngine * /*rndmEngine*/) { if (!Module.isBarrel()) { return StatusCode::SUCCESS; } diff --git a/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSim3DTool.h b/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSim3DTool.h index fb0e798d89e4c50566363cbfb82139317d62c3f0..d32b8e8c7ab9f123d25bed6c9e8ef57e46ef7984 100644 --- a/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSim3DTool.h +++ b/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSim3DTool.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef PIXELDIGITIZATION_SensorSim3DTool_H @@ -18,7 +18,7 @@ class SensorSim3DTool : public SensorSimTool { virtual StatusCode finalize(); virtual ~SensorSim3DTool(); - virtual StatusCode induceCharge(const TimedHitPtr<SiHit> &phit, SiChargedDiodeCollection& chargedDiodes, const InDetDD::SiDetectorElement &Module, const InDetDD::PixelModuleDesign &p_design, std::vector< std::pair<double,double> > &trfHitRecord, std::vector<double> &initialConditions); + virtual StatusCode induceCharge(const TimedHitPtr<SiHit> &phit, SiChargedDiodeCollection& chargedDiodes, const InDetDD::SiDetectorElement &Module, const InDetDD::PixelModuleDesign &p_design, std::vector< std::pair<double,double> > &trfHitRecord, std::vector<double> &initialConditions, CLHEP::HepRandomEngine *rndmEngine); private: diff --git a/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSimPlanarTool.cxx b/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSimPlanarTool.cxx index e30d2d63f120f06d8acdb2eb3f0aea6fe7ed4f08..b41b58cf6cfdc5f1a759b63eacafa05ef2a8e85e 100644 --- a/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSimPlanarTool.cxx +++ b/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSimPlanarTool.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ /////////////////////////////////////////////////////////////////// @@ -66,7 +66,7 @@ StatusCode SensorSimPlanarTool::finalize() { //=============================================== // I N D U C E C H A R G E //=============================================== -StatusCode SensorSimPlanarTool::induceCharge(const TimedHitPtr<SiHit> &phit, SiChargedDiodeCollection &chargedDiodes, const InDetDD::SiDetectorElement &Module, const InDetDD::PixelModuleDesign &p_design, std::vector< std::pair<double,double> > &trfHitRecord, std::vector<double> &initialConditions) { +StatusCode SensorSimPlanarTool::induceCharge(const TimedHitPtr<SiHit> &phit, SiChargedDiodeCollection &chargedDiodes, const InDetDD::SiDetectorElement &Module, const InDetDD::PixelModuleDesign &p_design, std::vector< std::pair<double,double> > &trfHitRecord, std::vector<double> &initialConditions, CLHEP::HepRandomEngine *rndmEngine) { // So far, this is only discriminating variable from 3D sensor. if (p_design.numberOfCircuits()<2){ @@ -96,7 +96,7 @@ StatusCode SensorSimPlanarTool::induceCharge(const TimedHitPtr<SiHit> &phit, SiC if (Module.isDBM()){ eleholePairEnergy = 1. / (13. * CLHEP::eV); // was 3.62 eV. m_diffusionConstant = .00265; - smearRand = CLHEP::RandGaussZiggurat::shoot(m_rndmEngine); + smearRand = CLHEP::RandGaussZiggurat::shoot(rndmEngine); } else{ eleholePairEnergy = siProperties.electronHolePairsPerEnergy(); @@ -140,9 +140,9 @@ StatusCode SensorSimPlanarTool::induceCharge(const TimedHitPtr<SiHit> &phit, SiC double rdif=this->m_diffusionConstant*sqrt(dist_electrode*coLorentz/0.3); // position at the surface - double phiRand = CLHEP::RandGaussZiggurat::shoot(m_rndmEngine); + double phiRand = CLHEP::RandGaussZiggurat::shoot(rndmEngine); double phi_drifted=phi_i+dist_electrode*tanLorentz+rdif*phiRand; - double etaRand = CLHEP::RandGaussZiggurat::shoot(m_rndmEngine); + double etaRand = CLHEP::RandGaussZiggurat::shoot(rndmEngine); double eta_drifted=eta_i+rdif*etaRand; // amount of energy to be converted into charges at current step diff --git a/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSimPlanarTool.h b/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSimPlanarTool.h index 24071ddc529784fe953d71741d6e2eea512b1985..082c08b611f7b33783553af68e6f260ee4d8f718 100644 --- a/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSimPlanarTool.h +++ b/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSimPlanarTool.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ /////////////////////////////////////////////////////////////////// @@ -32,7 +32,7 @@ class SensorSimPlanarTool : public SensorSimTool { virtual ~SensorSimPlanarTool(); //TODO: change name to induceCharge - virtual StatusCode induceCharge(const TimedHitPtr<SiHit> &phit, SiChargedDiodeCollection& chargedDiodes, const InDetDD::SiDetectorElement &Module, const InDetDD::PixelModuleDesign &p_design, std::vector< std::pair<double,double> > &trfHitRecord, std::vector<double> &initialConditions); + virtual StatusCode induceCharge(const TimedHitPtr<SiHit> &phit, SiChargedDiodeCollection& chargedDiodes, const InDetDD::SiDetectorElement &Module, const InDetDD::PixelModuleDesign &p_design, std::vector< std::pair<double,double> > &trfHitRecord, std::vector<double> &initialConditions, CLHEP::HepRandomEngine *rndmEngine); private: SensorSimPlanarTool(); diff --git a/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSimTool.h b/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSimTool.h index 4c3e9154d40d0378f39d783c3ebe3bfec2d523a7..f2ffb940f1f7dfc313320ba8a300770a19b7eebf 100644 --- a/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSimTool.h +++ b/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSimTool.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ /////////////////////////////////////////////////////////////////// @@ -12,11 +12,9 @@ #define PIXELDIGITIZATION_SensorSimTool_H #include "AthenaBaseComps/AthAlgTool.h" -#include "GaudiKernel/ServiceHandle.h" #include "GaudiKernel/ToolHandle.h" #include "CLHEP/Random/RandomEngine.h" #include "CLHEP/Random/RandGaussZiggurat.h" -#include "AthenaKernel/IAtRndmGenSvc.h" #include "HitManagement/TimedHitPtr.h" #include "SiDigitization/SiChargedDiodeCollection.h" @@ -31,14 +29,9 @@ class SensorSimTool:public AthAlgTool,virtual public IAlgTool { public: SensorSimTool( const std::string& type, const std::string& name,const IInterface* parent) : - AthAlgTool(type,name,parent), - m_rndmSvc("AtDSFMTGenSvc",name), - m_rndmEngineName("PixelDigitization"), - m_rndmEngine(nullptr) + AthAlgTool(type,name,parent) { declareInterface<SensorSimTool>(this); - declareProperty("RndmSvc", m_rndmSvc, "Random Number Service used in SCT & Pixel digitization"); - declareProperty("RndmEngine", m_rndmEngineName, "Random engine name"); } static const InterfaceID& interfaceID() { return IID_ISensorSimTool; } @@ -48,32 +41,18 @@ class SensorSimTool:public AthAlgTool,virtual public IAlgTool { ATH_CHECK(m_siPropertiesTool.retrieve()); - ATH_CHECK(m_rndmSvc.retrieve()); - - m_rndmEngine = m_rndmSvc->GetEngine(m_rndmEngineName); - if (!m_rndmEngine) { - ATH_MSG_ERROR("Could not find RndmEngine : " << m_rndmEngineName); - return StatusCode::FAILURE; - } - else { - ATH_MSG_DEBUG("Found RndmEngine : " << m_rndmEngineName); - } - return StatusCode::SUCCESS; } virtual StatusCode finalize() {return StatusCode::FAILURE;} virtual ~SensorSimTool() {} - virtual StatusCode induceCharge(const TimedHitPtr<SiHit> &phit, SiChargedDiodeCollection& chargedDiodes, const InDetDD::SiDetectorElement &Module, const InDetDD::PixelModuleDesign &p_design, std::vector< std::pair<double,double> > &trfHitRecord, std::vector<double> &initialConditions) = 0; + virtual StatusCode induceCharge(const TimedHitPtr<SiHit> &phit, SiChargedDiodeCollection& chargedDiodes, const InDetDD::SiDetectorElement &Module, const InDetDD::PixelModuleDesign &p_design, std::vector< std::pair<double,double> > &trfHitRecord, std::vector<double> &initialConditions, CLHEP::HepRandomEngine *rndmEngine) = 0; private: SensorSimTool(); protected: ToolHandle<ISiPropertiesTool> m_siPropertiesTool{this, "SiPropertiesTool", "SiPropertiesTool", "Tool to retrieve SiProperties"}; - ServiceHandle<IAtRndmGenSvc> m_rndmSvc; - std::string m_rndmEngineName; - CLHEP::HepRandomEngine *m_rndmEngine; };