diff --git a/InnerDetector/InDetDigitization/SCT_Digitization/SCT_Digitization/ISCT_FrontEnd.h b/InnerDetector/InDetDigitization/SCT_Digitization/SCT_Digitization/ISCT_FrontEnd.h index a02c5ba2da8a46890a3f81d46b7ec20e00a159e6..4f48854950611ec2a331a734a88191a30a6a8840 100644 --- a/InnerDetector/InDetDigitization/SCT_Digitization/SCT_Digitization/ISCT_FrontEnd.h +++ b/InnerDetector/InDetDigitization/SCT_Digitization/SCT_Digitization/ISCT_FrontEnd.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 */ /** @@ -37,13 +37,6 @@ class ISCT_FrontEnd : virtual public ISiChargedDiodesProcessorTool { //** Destructor: */ virtual ~ISCT_FrontEnd() {} - /////////////////////////////////////////////////////////////////// - // Pure virtual methods: - /////////////////////////////////////////////////////////////////// - - //** process the collection of charged diodes */ - virtual void process(SiChargedDiodeCollection& collection) const =0; - virtual void setRandomEngine(CLHEP::HepRandomEngine* rndmEngine) =0; }; #endif // SCT_DIGITIZATION_ISCT_FRONTEND_H diff --git a/InnerDetector/InDetDigitization/SCT_Digitization/SCT_Digitization/ISCT_RandomDisabledCellGenerator.h b/InnerDetector/InDetDigitization/SCT_Digitization/SCT_Digitization/ISCT_RandomDisabledCellGenerator.h index b5cb45fce30dd7188e730a86d6c0a1cb5e465b9e..5ffa6f3b9390eceed633877cfeff48302a4cd43d 100644 --- a/InnerDetector/InDetDigitization/SCT_Digitization/SCT_Digitization/ISCT_RandomDisabledCellGenerator.h +++ b/InnerDetector/InDetDigitization/SCT_Digitization/SCT_Digitization/ISCT_RandomDisabledCellGenerator.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 */ /** @@ -35,13 +35,6 @@ class ISCT_RandomDisabledCellGenerator : virtual public ISiChargedDiodesProcesso // Destructor: virtual ~ISCT_RandomDisabledCellGenerator() {} - /////////////////////////////////////////////////////////////////// - // Pure virtual methods: - /////////////////////////////////////////////////////////////////// - - // process the collection of charged diodes - virtual void process(SiChargedDiodeCollection& collection) const =0; - virtual void setRandomEngine(CLHEP::HepRandomEngine* rndmEngine) =0; }; #endif // SCT_DIGITIZATION_ISCT_RANDOMDISABLEDCELLGENERATOR_H diff --git a/InnerDetector/InDetDigitization/SCT_Digitization/SCT_Digitization/ISCT_SurfaceChargesGenerator.h b/InnerDetector/InDetDigitization/SCT_Digitization/SCT_Digitization/ISCT_SurfaceChargesGenerator.h index 53acc0d8619983f85c7012c78d248ab7d54f4bb9..232dc5089692e10f335aa692cc56103a8dd2970d 100644 --- a/InnerDetector/InDetDigitization/SCT_Digitization/SCT_Digitization/ISCT_SurfaceChargesGenerator.h +++ b/InnerDetector/InDetDigitization/SCT_Digitization/SCT_Digitization/ISCT_SurfaceChargesGenerator.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 */ /** @@ -47,15 +47,14 @@ class ISCT_SurfaceChargesGenerator : virtual public IAlgTool { //Retrieve interface ID static const InterfaceID& interfaceID() { return IID_ISCT_SurfaceChargesGenerator; } - + // Destructor: virtual ~ISCT_SurfaceChargesGenerator() {} virtual void process(const InDetDD::SiDetectorElement* ele, const TimedHitPtr<SiHit>& phit, - const ISiSurfaceChargesInserter& inserter) const =0; - virtual void setFixedTime(float fixedTime) =0; - virtual void setRandomEngine(CLHEP::HepRandomEngine* rndmEngine) =0; + const ISiSurfaceChargesInserter& inserter, CLHEP::HepRandomEngine * rndmEngine) const =0; + virtual void setFixedTime(float fixedTime) =0; }; #endif // SIDIGITIZATION_ISCT_SURFACECHARGESGENERATOR_H diff --git a/InnerDetector/InDetDigitization/SCT_Digitization/SCT_Digitization/SCT_DigitizationTool.h b/InnerDetector/InDetDigitization/SCT_Digitization/SCT_Digitization/SCT_DigitizationTool.h index 2ceb2e7d4b9cc05e761bc214ff4e2e855299c544..82410b10024d325aac9fc46d7d21f421db06ce40 100644 --- a/InnerDetector/InDetDigitization/SCT_Digitization/SCT_Digitization/SCT_DigitizationTool.h +++ b/InnerDetector/InDetDigitization/SCT_Digitization/SCT_Digitization/SCT_DigitizationTool.h @@ -1,7 +1,7 @@ /* -*- C++ -*- */ /* - 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 SCT_DIGITZATION_SCT_DIGITZATIONTOOL_H @@ -16,7 +16,7 @@ #include "PileUpTools/PileUpToolBase.h" // Athena headers -#include "AthenaKernel/IAtRndmGenSvc.h" +#include "AthenaKernel/IAthRNGSvc.h" #include "HitManagement/TimedHitCollection.h" #include "InDetRawData/SCT_RDO_Container.h" #include "InDetReadoutGeometry/SiDetectorElementCollection.h" @@ -70,8 +70,8 @@ public: protected: - bool digitizeElement(SiChargedDiodeCollection* chargedDiodes, TimedHitCollection<SiHit>*& thpcsi) const ; //! - void applyProcessorTools(SiChargedDiodeCollection* chargedDiodes) const; //! + bool digitizeElement(SiChargedDiodeCollection* chargedDiodes, TimedHitCollection<SiHit>*& thpcsi, CLHEP::HepRandomEngine * rndmEngine) const ; //! + void applyProcessorTools(SiChargedDiodeCollection* chargedDiodes, CLHEP::HepRandomEngine * rndmEngine) const; //! void addSDO(SiChargedDiodeCollection* collection, SG::WriteHandle<InDetSimDataCollection>* simDataCollMap) const; void storeTool(ISiChargedDiodesProcessorTool* p_processor) {m_diodeCollectionTools.push_back(p_processor);} @@ -82,10 +82,6 @@ private: @brief initialize the required services */ StatusCode initServices(); - /** - @brief initialize the random number engine - */ - StatusCode initRandomEngine(); /** @brief Initialize the SCT_FrontEnd AlgTool */ @@ -112,8 +108,8 @@ private: SCT_RDO_Collection* createRDO(SiChargedDiodeCollection* collection) const; StatusCode getNextEvent(); - void digitizeAllHits(SG::WriteHandle<SCT_RDO_Container>* rdoContainer, SG::WriteHandle<InDetSimDataCollection>* simDataCollMap, std::vector<bool>* processedElements, TimedHitCollection<SiHit>* thpcsi) const; //!< digitize all hits - void digitizeNonHits(SG::WriteHandle<SCT_RDO_Container>* rdoContainer, SG::WriteHandle<InDetSimDataCollection>* simDataCollMap, const std::vector<bool>* processedElements) const; //!< digitize SCT without hits + void digitizeAllHits(SG::WriteHandle<SCT_RDO_Container>* rdoContainer, SG::WriteHandle<InDetSimDataCollection>* simDataCollMap, std::vector<bool>* processedElements, TimedHitCollection<SiHit>* thpcsi, CLHEP::HepRandomEngine * rndmEngine) const; //!< digitize all hits + void digitizeNonHits(SG::WriteHandle<SCT_RDO_Container>* rdoContainer, SG::WriteHandle<InDetSimDataCollection>* simDataCollMap, const std::vector<bool>* processedElements, CLHEP::HepRandomEngine * rndmEngine) const; //!< digitize SCT without hits float m_tfix; //!< Use fixed timing for cosmics @@ -149,10 +145,9 @@ private: SG::ReadCondHandleKey<InDetDD::SiDetectorElementCollection> m_SCTDetEleCollKey{this, "SCTDetEleCollKey", "SCT_DetectorElementCollection", "Key of SiDetectorElementCollection for SCT"}; std::string m_inputObjectName; //! name of the sub event hit collections. - ServiceHandle <IAtRndmGenSvc> m_rndmSvc; //!< Random number service + ServiceHandle<IAthRNGSvc> m_rndmSvc{this, "RndmSvc", "AthRNGSvc", ""}; //!< Random number service ServiceHandle <PileUpMergeSvc> m_mergeSvc; //! - CLHEP::HepRandomEngine* m_rndmEngine; //! Random number engine used - not init in SiDigitization std::list<ISiChargedDiodesProcessorTool*> m_diodeCollectionTools; TimedHitCollection<SiHit>* m_thpcsi; IntegerProperty m_vetoThisBarcode; diff --git a/InnerDetector/InDetDigitization/SCT_Digitization/python/SCT_DigitizationConfig.py b/InnerDetector/InDetDigitization/SCT_Digitization/python/SCT_DigitizationConfig.py index 71ac7a7aecc3ca86a6eb11f00d2fb00f0f720d0d..f0f684910a1d7b7958e93e7e4a2f32637f22316f 100644 --- a/InnerDetector/InDetDigitization/SCT_Digitization/python/SCT_DigitizationConfig.py +++ b/InnerDetector/InDetDigitization/SCT_Digitization/python/SCT_DigitizationConfig.py @@ -189,11 +189,6 @@ def commonSCT_DigitizationConfig(name,**kwargs): # write out SCT1_RawData #kwargs.setdefault("WriteSCT1_RawData", False) - kwargs.setdefault("RndmSvc", digitizationFlags.rndmSvc() ) - streamName = "SCT_Digitization" # FIXME ideally random stream name would be configurable - if not digitizationFlags.rndmSeedList.checkForExistingSeed(streamName): - digitizationFlags.rndmSeedList.addSeed(streamName, 49261510, 105132394 ) - if digitizationFlags.doXingByXingPileUp(): kwargs.setdefault("FirstXing", SCT_FirstXing()) kwargs.setdefault("LastXing", SCT_LastXing() ) diff --git a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_DetailedSurfaceChargesGenerator.cxx b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_DetailedSurfaceChargesGenerator.cxx index 327f29a26e4fd0945b278baae5677503d0443e61..3f8b8ba7b3654adf7b4a0d348a0ce3de4064d5db 100644 --- a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_DetailedSurfaceChargesGenerator.cxx +++ b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_DetailedSurfaceChargesGenerator.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 "SCT_DetailedSurfaceChargesGenerator.h" @@ -66,9 +66,7 @@ SCT_DetailedSurfaceChargesGenerator::SCT_DetailedSurfaceChargesGenerator(const s // Did this code *ever* work? Has it *ever* been used? m_stripCharge_iymax{285-1}, m_stripCharge_dx{1.}, - m_stripCharge_dy{1.}, - m_rndmEngine{nullptr}, - m_rndmEngineName{"SCT_Digitization"} + m_stripCharge_dy{1.} { declareProperty("FixedTime", m_tfix=-999.); //!< fixed timing declareProperty("SubtractTime", m_tsubtract=-999.); //!< substract drift time @@ -305,18 +303,18 @@ float SCT_DetailedSurfaceChargesGenerator::SurfaceDriftTime(float ysurf) const { //------------------------------------------------------------------------------------------- // create a list of surface charges from a hit - called from SCT_Digitization AthAlgorithm //------------------------------------------------------------------------------------------- -void SCT_DetailedSurfaceChargesGenerator::process(const SiDetectorElement* element, const TimedHitPtr<SiHit>& phit, const ISiSurfaceChargesInserter& inserter) const { +void SCT_DetailedSurfaceChargesGenerator::process(const SiDetectorElement* element, const TimedHitPtr<SiHit>& phit, const ISiSurfaceChargesInserter& inserter, CLHEP::HepRandomEngine * rndmEngine) const { ATH_MSG_VERBOSE("SCT_DetailedSurfaceChargesGenerator::process starts"); const float p_eventTime{phit.eventTime()}; const unsigned short p_eventId{phit.eventId()}; - processSiHit(element, *phit, inserter, p_eventTime, p_eventId); + processSiHit(element, *phit, inserter, p_eventTime, p_eventId, rndmEngine); return; } //------------------------------------------------------------------------------------------- // create a list of surface charges from a hit - called from both AthAlgorithm and PileUpTool //------------------------------------------------------------------------------------------- -void SCT_DetailedSurfaceChargesGenerator::processSiHit(const SiDetectorElement* element, const SiHit& phit, const ISiSurfaceChargesInserter& inserter, float p_eventTime, unsigned short p_eventId) const { +void SCT_DetailedSurfaceChargesGenerator::processSiHit(const SiDetectorElement* element, const SiHit& phit, const ISiSurfaceChargesInserter& inserter, float p_eventTime, unsigned short p_eventId, CLHEP::HepRandomEngine * rndmEngine) const { const SCT_ModuleSideDesign* p_design{dynamic_cast<const SCT_ModuleSideDesign*>(&(element->design()))}; if (p_design==nullptr) { ATH_MSG_ERROR("SCT_DetailedSurfaceChargesGenerator::process can not get " << p_design); @@ -426,9 +424,9 @@ void SCT_DetailedSurfaceChargesGenerator::processSiHit(const SiDetectorElement* y1 += tanLorentz*zReadout; //!< Taking into account the magnetic field float diffusionSigma{DiffusionSigma(zReadout, element)}; for (int i{0}; i<m_numberOfCharges; ++i) { - float rx{CLHEP::RandGaussZiggurat::shoot(m_rndmEngine)}; + float rx{CLHEP::RandGaussZiggurat::shoot(rndmEngine)}; double xd{x1+diffusionSigma*rx}; - float ry{CLHEP::RandGaussZiggurat::shoot(m_rndmEngine)}; + float ry{CLHEP::RandGaussZiggurat::shoot(rndmEngine)}; double yd{y1+diffusionSigma*ry}; SiLocalPosition position{element->hitLocalToLocal(xd, yd)}; @@ -489,8 +487,8 @@ void SCT_DetailedSurfaceChargesGenerator::processSiHit(const SiDetectorElement* } // Electron and hole transportation starting at x0 and y0 - holeTransport (x0, y0, Q_m2, Q_m1, Q_00, Q_p1, Q_p2); - electronTransport(x0, y0, Q_m2, Q_m1, Q_00, Q_p1, Q_p2); + holeTransport (x0, y0, Q_m2, Q_m1, Q_00, Q_p1, Q_p2, rndmEngine); + electronTransport(x0, y0, Q_m2, Q_m1, Q_00, Q_p1, Q_p2, rndmEngine); //Loop over the strips and add the surface charges from each step and strip for (int strip{-2}; strip<=2; strip++) { @@ -885,7 +883,7 @@ double SCT_DetailedSurfaceChargesGenerator::mud_h(double E) const { //--------------------------------------------------------------------- // holeTransport //--------------------------------------------------------------------- -void SCT_DetailedSurfaceChargesGenerator::holeTransport(double& x0, double& y0, double* Q_m2, double* Q_m1, double* Q_00, double* Q_p1, double* Q_p2) const { +void SCT_DetailedSurfaceChargesGenerator::holeTransport(double& x0, double& y0, double* Q_m2, double* Q_m1, double* Q_00, double* Q_p1, double* Q_p2, CLHEP::HepRandomEngine * rndmEngine) const { // transport holes in the bulk // T. Kondo, 2010.9.9 // External parameters to be specified @@ -934,8 +932,8 @@ void SCT_DetailedSurfaceChargesGenerator::holeTransport(double& x0, double& y0, x += vx*dt*1.E-9; double diffusion{sqrt(2.*D*dt*1.E-9)}; - y += diffusion * CLHEP::RandGaussZiggurat::shoot(m_rndmEngine); - x += diffusion * CLHEP::RandGaussZiggurat::shoot(m_rndmEngine); + y += diffusion * CLHEP::RandGaussZiggurat::shoot(rndmEngine); + x += diffusion * CLHEP::RandGaussZiggurat::shoot(rndmEngine); if (y > m_bulk_depth) { y = m_bulk_depth; isInBulk = false; @@ -978,7 +976,7 @@ void SCT_DetailedSurfaceChargesGenerator::holeTransport(double& x0, double& y0, //--------------------------------------------------------------------- // electronTransport //--------------------------------------------------------------------- -void SCT_DetailedSurfaceChargesGenerator::electronTransport(double& x0, double& y0, double* Q_m2, double* Q_m1, double* Q_00, double* Q_p1, double* Q_p2) const { +void SCT_DetailedSurfaceChargesGenerator::electronTransport(double& x0, double& y0, double* Q_m2, double* Q_m1, double* Q_00, double* Q_p1, double* Q_p2, CLHEP::HepRandomEngine * rndmEngine) const { // transport electrons in the bulk // T. Kondo, 2010.9.10 // External parameters to be specified @@ -1026,8 +1024,8 @@ void SCT_DetailedSurfaceChargesGenerator::electronTransport(double& x0, double& x += vx * dt *1.E-9; double diffusion{sqrt(2.* D * dt*1.E-9)}; - y += diffusion * CLHEP::RandGaussZiggurat::shoot(m_rndmEngine); - x += diffusion * CLHEP::RandGaussZiggurat::shoot(m_rndmEngine); + y += diffusion * CLHEP::RandGaussZiggurat::shoot(rndmEngine); + x += diffusion * CLHEP::RandGaussZiggurat::shoot(rndmEngine); if (y < m_y_origin_min) { y = m_y_origin_min; isInBulk = false; diff --git a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_DetailedSurfaceChargesGenerator.h b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_DetailedSurfaceChargesGenerator.h index a3136b759acaca376ba3e06067b4da7beb854d5c..7e46ea417a66c19f25404b6754143c47486ffd22 100644 --- a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_DetailedSurfaceChargesGenerator.h +++ b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_DetailedSurfaceChargesGenerator.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 */ /** @@ -81,11 +81,10 @@ class SCT_DetailedSurfaceChargesGenerator : public extends<AthAlgTool, ISCT_Surf // Non-const methods are used in initialization void setFixedTime(float fixedTime) { m_tfix = fixedTime; } - void setRandomEngine(CLHEP::HepRandomEngine *rndmEngine) { m_rndmEngine = rndmEngine; } /** create a list of surface charges from a hit */ - virtual void process(const InDetDD::SiDetectorElement* element, const TimedHitPtr<SiHit>& phit, const ISiSurfaceChargesInserter& inserter) const; - void processSiHit(const InDetDD::SiDetectorElement* element, const SiHit& phit, const ISiSurfaceChargesInserter& inserter, const float eventTime, const unsigned short eventID) const; + virtual void process(const InDetDD::SiDetectorElement* element, const TimedHitPtr<SiHit>& phit, const ISiSurfaceChargesInserter& inserter, CLHEP::HepRandomEngine * rndmEngine) const; + void processSiHit(const InDetDD::SiDetectorElement* element, const SiHit& phit, const ISiSurfaceChargesInserter& inserter, const float eventTime, const unsigned short eventID, CLHEP::HepRandomEngine * rndmEngine) const; // some diagnostics methods are needed here too float DriftTime(float zhit, const InDetDD::SiDetectorElement* element) const; //!< calculate drift time perpandicular to the surface for a charge at distance zhit from mid gap @@ -111,8 +110,8 @@ class SCT_DetailedSurfaceChargesGenerator : public extends<AthAlgTool, ISCT_Surf double ExValue150(int ix, int iy) const; double EyValue150(int ix, int iy) const; double GetPotentialValue(int ix, int iy) const; - void holeTransport(double& x0, double& y0, double* Q_m2, double* Q_m1, double* Q_00, double* Q_p1, double* Q_p2) const; - void electronTransport(double& x0, double& y0, double* Q_m2, double* Q_m1, double* Q_00, double* Q_p1, double* Q_p2) const; + void holeTransport(double& x0, double& y0, double* Q_m2, double* Q_m1, double* Q_00, double* Q_p1, double* Q_p2, CLHEP::HepRandomEngine * rndmEngine) const; + void electronTransport(double& x0, double& y0, double* Q_m2, double* Q_m1, double* Q_00, double* Q_p1, double* Q_p2, CLHEP::HepRandomEngine * rndmEngine) const; double inducedCharge(int& istrip, double& x, double& y, double& t) const; int m_numberOfCharges; //!< number of charges @@ -195,9 +194,6 @@ class SCT_DetailedSurfaceChargesGenerator : public extends<AthAlgTool, ISCT_Surf ToolHandle<ISiliconConditionsTool> m_siConditionsTool{this, "SiConditionsTool", "SCT_SiliconConditionsTool", "Tool to retrieve SCT silicon information"}; ToolHandle<ISiLorentzAngleTool> m_lorentzAngleTool{this, "LorentzAngleTool", "SiLorentzAngleTool/SCTLorentzAngleTool", "Tool to retreive Lorentz angle"}; - CLHEP::HepRandomEngine* m_rndmEngine; //!< Random Engine - std::string m_rndmEngineName; //!< name of random engine, actual pointer in SiDigitization - bool m_isOverlay; // flag for overlay }; diff --git a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_DigitizationTool.cxx b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_DigitizationTool.cxx index c97b07dc860a6152bbbc43fda4943c9a9f5260b4..cf6810a8ef3b06e01079d8ba712d96f220f7d974 100644 --- a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_DigitizationTool.cxx +++ b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_DigitizationTool.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 "SCT_Digitization/SCT_DigitizationTool.h" @@ -24,6 +24,10 @@ #include "StoreGate/ReadCondHandle.h" #include "StoreGate/ReadHandle.h" +// Random Number Generation +#include "AthenaKernel/RNGWrapper.h" +#include "CLHEP/Random/RandomEngine.h" + // C++ Standard Library #include <limits> #include <memory> @@ -40,9 +44,7 @@ SCT_DigitizationTool::SCT_DigitizationTool(const std::string& type, base_class(type, name, parent), m_HardScatterSplittingSkipper{false}, m_detID{nullptr}, - m_rndmSvc{"AtRndmGenSvc", name}, m_mergeSvc{"PileUpMergeSvc", name}, - m_rndmEngine{nullptr}, m_thpcsi{nullptr}, m_vetoThisBarcode{crazyParticleBarcode} { declareInterface<SCT_DigitizationTool>(this); @@ -56,7 +58,6 @@ SCT_DigitizationTool::SCT_DigitizationTool(const std::string& type, declareProperty("CreateNoiseSDO", m_createNoiseSDO = false, "Set create noise SDO flag"); declareProperty("WriteSCT1_RawData", m_WriteSCT1_RawData = false, "Write out SCT1_RawData rather than SCT3_RawData"); declareProperty("InputObjectName", m_inputObjectName = "", "Input Object name"); - declareProperty("RndmSvc", m_rndmSvc, "Random Number Service used in SCT & Pixel digitization"); declareProperty("MergeSvc", m_mergeSvc, "Merge service used in Pixel & SCT digitization"); declareProperty("HardScatterSplittingMode", m_HardScatterSplittingMode = 0, "Control pileup & signal splitting"); declareProperty("ParticleBarcodeVeto", m_vetoThisBarcode = crazyParticleBarcode, "Barcode of particle to ignore"); @@ -89,9 +90,6 @@ StatusCode SCT_DigitizationTool::initialize() { // +++ Init the services ATH_CHECK(initServices()); - // +++ Get the random generator engine - ATH_CHECK(initRandomEngine()); - // +++ Get the Surface Charges Generator tool ATH_CHECK(initSurfaceChargesGeneratorTool()); @@ -162,8 +160,6 @@ namespace { StatusCode SCT_DigitizationTool::initSurfaceChargesGeneratorTool() { ATH_CHECK(m_sct_SurfaceChargesGenerator.retrieve()); - m_sct_SurfaceChargesGenerator->setRandomEngine(m_rndmEngine); - if (m_cosmicsRun and m_tfix > -998) { m_sct_SurfaceChargesGenerator->setFixedTime(m_tfix); ATH_MSG_INFO("Use of FixedTime = " << m_tfix << " in cosmics"); @@ -180,28 +176,12 @@ StatusCode SCT_DigitizationTool::initSurfaceChargesGeneratorTool() { StatusCode SCT_DigitizationTool::initFrontEndTool() { ATH_CHECK(m_sct_FrontEnd.retrieve()); - m_sct_FrontEnd->setRandomEngine(m_rndmEngine); storeTool(&(*m_sct_FrontEnd)); ATH_MSG_DEBUG("Retrieved and initialised tool " << m_sct_FrontEnd); return StatusCode::SUCCESS; } -// ---------------------------------------------------------------------- -// Initialize the Random Engine -// ---------------------------------------------------------------------- -StatusCode SCT_DigitizationTool::initRandomEngine() { - std::string rndmEngineName{"SCT_Digitization"}; - - m_rndmEngine = m_rndmSvc->GetEngine(rndmEngineName); - if (m_rndmEngine == nullptr) { - ATH_MSG_FATAL("Could not find RndmEngine : " << rndmEngineName); - return StatusCode::FAILURE; - } - ATH_MSG_DEBUG("Get random number engine : <" << rndmEngineName << ">"); - return StatusCode::SUCCESS; -} - // ---------------------------------------------------------------------- // Initialize the different services // ---------------------------------------------------------------------- @@ -223,7 +203,6 @@ StatusCode SCT_DigitizationTool::initDisabledCells() { // +++ Retrieve the SCT_RandomDisabledCellGenerator ATH_CHECK(m_sct_RandomDisabledCellGenerator.retrieve()); - m_sct_RandomDisabledCellGenerator->setRandomEngine(m_rndmEngine); storeTool(&(*m_sct_RandomDisabledCellGenerator)); ATH_MSG_INFO("Retrieved the SCT_RandomDisabledCellGenerator tool:" << m_sct_RandomDisabledCellGenerator); @@ -234,9 +213,14 @@ StatusCode SCT_DigitizationTool::processAllSubEvents() { if (prepareEvent(0).isFailure()) { return StatusCode::FAILURE; } + // 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; + ATH_MSG_VERBOSE("Begin digitizeAllHits"); if (m_enableHits and (not getNextEvent().isFailure())) { - digitizeAllHits(&m_rdoContainer, &m_simDataCollMap, &m_processedElements, m_thpcsi); + digitizeAllHits(&m_rdoContainer, &m_simDataCollMap, &m_processedElements, m_thpcsi, rndmEngine); } else { ATH_MSG_DEBUG("no hits found in event!"); } @@ -244,7 +228,7 @@ StatusCode SCT_DigitizationTool::processAllSubEvents() { // loop over elements without hits if (not m_onlyHitElements) { - digitizeNonHits(&m_rdoContainer, &m_simDataCollMap, &m_processedElements); + digitizeNonHits(&m_rdoContainer, &m_simDataCollMap, &m_processedElements, rndmEngine); ATH_MSG_DEBUG("Digitized Elements without Hits"); } @@ -283,13 +267,17 @@ StatusCode SCT_DigitizationTool::prepareEvent(unsigned int /*index*/) { StatusCode SCT_DigitizationTool::mergeEvent() { ATH_MSG_VERBOSE("SCT_DigitizationTool::mergeEvent()"); + // 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; if (m_enableHits) { - digitizeAllHits(&m_rdoContainer, &m_simDataCollMap, &m_processedElements, m_thpcsi); + digitizeAllHits(&m_rdoContainer, &m_simDataCollMap, &m_processedElements, m_thpcsi, rndmEngine); } if (not m_onlyHitElements) { - digitizeNonHits(&m_rdoContainer, &m_simDataCollMap, &m_processedElements); + digitizeNonHits(&m_rdoContainer, &m_simDataCollMap, &m_processedElements, rndmEngine); } for (SiHitCollection* hit: m_hitCollPtrs) { @@ -305,7 +293,7 @@ StatusCode SCT_DigitizationTool::mergeEvent() { return StatusCode::SUCCESS; } -void SCT_DigitizationTool::digitizeAllHits(SG::WriteHandle<SCT_RDO_Container>* rdoContainer, SG::WriteHandle<InDetSimDataCollection>* simDataCollMap, std::vector<bool>* processedElements, TimedHitCollection<SiHit>* thpcsi) const { +void SCT_DigitizationTool::digitizeAllHits(SG::WriteHandle<SCT_RDO_Container>* rdoContainer, SG::WriteHandle<InDetSimDataCollection>* simDataCollMap, std::vector<bool>* processedElements, TimedHitCollection<SiHit>* thpcsi, CLHEP::HepRandomEngine * rndmEngine) const { ///////////////////////////////////////////////// // // In order to process all element rather than just those with hits we @@ -318,7 +306,7 @@ void SCT_DigitizationTool::digitizeAllHits(SG::WriteHandle<SCT_RDO_Container>* r SiChargedDiodeCollection chargedDiodes; - while (digitizeElement(&chargedDiodes, thpcsi)) { + while (digitizeElement(&chargedDiodes, thpcsi, rndmEngine)) { ATH_MSG_DEBUG("Hit collection ID=" << m_detID->show_to_string(chargedDiodes.identify())); hitcount++; // Hitcount will be a number in the hit collection minus @@ -356,7 +344,7 @@ void SCT_DigitizationTool::digitizeAllHits(SG::WriteHandle<SCT_RDO_Container>* r } // digitize elements without hits -void SCT_DigitizationTool::digitizeNonHits(SG::WriteHandle<SCT_RDO_Container>* rdoContainer, SG::WriteHandle<InDetSimDataCollection>* simDataCollMap, const std::vector<bool>* processedElements) const { +void SCT_DigitizationTool::digitizeNonHits(SG::WriteHandle<SCT_RDO_Container>* rdoContainer, SG::WriteHandle<InDetSimDataCollection>* simDataCollMap, const std::vector<bool>* processedElements, CLHEP::HepRandomEngine * rndmEngine) const { // Get SCT_DetectorElementCollection SG::ReadCondHandle<InDetDD::SiDetectorElementCollection> sctDetEle(m_SCTDetEleCollKey); const InDetDD::SiDetectorElementCollection* elements{sctDetEle.retrieve()}; @@ -385,7 +373,7 @@ void SCT_DigitizationTool::digitizeNonHits(SG::WriteHandle<SCT_RDO_Container>* r chargedDiodes.setDetectorElement(element); ATH_MSG_DEBUG("calling applyProcessorTools() for NON hits"); - applyProcessorTools(&chargedDiodes); + applyProcessorTools(&chargedDiodes, rndmEngine); // Create and store RDO and SDO // Don't create empty ones. @@ -405,7 +393,7 @@ void SCT_DigitizationTool::digitizeNonHits(SG::WriteHandle<SCT_RDO_Container>* r return; } -bool SCT_DigitizationTool::digitizeElement(SiChargedDiodeCollection* chargedDiodes, TimedHitCollection<SiHit>*& thpcsi) const { +bool SCT_DigitizationTool::digitizeElement(SiChargedDiodeCollection* chargedDiodes, TimedHitCollection<SiHit>*& thpcsi, CLHEP::HepRandomEngine * rndmEngine) const { if (nullptr == thpcsi) { ATH_MSG_ERROR("thpcsi should not be nullptr!"); @@ -461,11 +449,11 @@ bool SCT_DigitizationTool::digitizeElement(SiChargedDiodeCollection* chargedDiod phit->getEtaModule(), phit->getSide()))); ATH_MSG_DEBUG("calling process() for all methods"); - m_sct_SurfaceChargesGenerator->process(sielement, phit, SiDigitizationSurfaceChargeInserter(sielement, chargedDiodes)); + m_sct_SurfaceChargesGenerator->process(sielement, phit, SiDigitizationSurfaceChargeInserter(sielement, chargedDiodes), rndmEngine); ATH_MSG_DEBUG("charges filled!"); } } - applyProcessorTools(chargedDiodes); // !< Use of the new AlgTool surface + applyProcessorTools(chargedDiodes, rndmEngine); // !< Use of the new AlgTool surface // charges generator class return true; } @@ -473,12 +461,12 @@ bool SCT_DigitizationTool::digitizeElement(SiChargedDiodeCollection* chargedDiod // ----------------------------------------------------------------------------- // Applies processors to the current detector element for the current element: // ----------------------------------------------------------------------------- -void SCT_DigitizationTool::applyProcessorTools(SiChargedDiodeCollection* chargedDiodes) const { +void SCT_DigitizationTool::applyProcessorTools(SiChargedDiodeCollection* chargedDiodes, CLHEP::HepRandomEngine * rndmEngine) const { ATH_MSG_DEBUG("applyProcessorTools()"); int processorNumber{0}; for (ISiChargedDiodesProcessorTool* proc: m_diodeCollectionTools) { - proc->process(*chargedDiodes); + proc->process(*chargedDiodes, rndmEngine); processorNumber++; ATH_MSG_DEBUG("Applied processor # " << processorNumber); diff --git a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_FrontEnd.cxx b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_FrontEnd.cxx index 6873cdf64c10a3b483c9a17a52e2ac9f18155f1a..e5a7317ffe496978fee0e8864d6485448521ed39 100644 --- a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_FrontEnd.cxx +++ b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_FrontEnd.cxx @@ -5,10 +5,10 @@ #include "SCT_FrontEnd.h" // Random number -#include "AthenaKernel/IAtRndmGenSvc.h" #include "CLHEP/Random/RandFlat.h" #include "CLHEP/Random/RandGaussZiggurat.h" // for RandGaussZiggurat #include "CLHEP/Random/RandPoisson.h" +#include "CLHEP/Random/RandomEngine.h" #include "SiDigitization/SiHelper.h" #include "SCT_Digitization/ISCT_Amp.h" @@ -31,8 +31,7 @@ using namespace InDetDD; SCT_FrontEnd::SCT_FrontEnd(const std::string& type, const std::string& name, const IInterface* parent) : AthAlgTool(type, name, parent), m_SCTdetMgr(nullptr), - m_sct_id(nullptr), - m_rndmEngine(nullptr) { + m_sct_id(nullptr) { declareInterface<ISCT_FrontEnd>(this); declareProperty("NoiseBarrel", m_NoiseBarrel = 1500.0, "NoiseBarrel"); @@ -147,7 +146,7 @@ StatusCode SCT_FrontEnd::initVectors(int strips) const { // ---------------------------------------------------------------------- // prepare gain and offset for the strips for a given module // ---------------------------------------------------------------------- -StatusCode SCT_FrontEnd::prepareGainAndOffset(SiChargedDiodeCollection& collection, const Identifier& moduleId) const { +StatusCode SCT_FrontEnd::prepareGainAndOffset(SiChargedDiodeCollection& collection, const Identifier& moduleId, CLHEP::HepRandomEngine * rndmEngine) const { // now we need to generate gain and offset channel by channel: some algebra // for generation of partially correlated random numbers float W = m_OGcorr * m_GainRMS * m_Ospread / (m_GainRMS * m_GainRMS - m_Ospread * m_Ospread); @@ -219,8 +218,8 @@ StatusCode SCT_FrontEnd::prepareGainAndOffset(SiChargedDiodeCollection& collecti for (; i < i_end; i++) { // Need to check if strip is already setup if (m_Analogue[1][i] <= 0.0) { - float g = CLHEP::RandGaussZiggurat::shoot(m_rndmEngine, 0.0, S1); - float o = CLHEP::RandGaussZiggurat::shoot(m_rndmEngine, 0.0, S2); + float g = CLHEP::RandGaussZiggurat::shoot(rndmEngine, 0.0, S1); + float o = CLHEP::RandGaussZiggurat::shoot(rndmEngine, 0.0, S2); m_GainFactor[i] = 1.0 + (cosfi * g + sinfi * o); m_Offset[i] = (cosfi * o - sinfi * g); @@ -228,14 +227,14 @@ StatusCode SCT_FrontEnd::prepareGainAndOffset(SiChargedDiodeCollection& collecti // Fill the noise and offset values into the Analogue if (m_data_compression_mode == 1 and m_data_readout_mode == 0) { // level mode x1x - m_Analogue[1][i] = m_Offset[i] + m_NoiseFactor[i] * CLHEP::RandGaussZiggurat::shoot(m_rndmEngine); + m_Analogue[1][i] = m_Offset[i] + m_NoiseFactor[i] * CLHEP::RandGaussZiggurat::shoot(rndmEngine); } else if (m_data_compression_mode == 2 and m_data_readout_mode == 0) { // edge mode 01x - m_Analogue[0][i] = m_Offset[i] + m_NoiseFactor[i] * CLHEP::RandGaussZiggurat::shoot(m_rndmEngine); - m_Analogue[1][i] = m_Offset[i] + m_NoiseFactor[i] * CLHEP::RandGaussZiggurat::shoot(m_rndmEngine); + m_Analogue[0][i] = m_Offset[i] + m_NoiseFactor[i] * CLHEP::RandGaussZiggurat::shoot(rndmEngine); + m_Analogue[1][i] = m_Offset[i] + m_NoiseFactor[i] * CLHEP::RandGaussZiggurat::shoot(rndmEngine); } else if (m_data_compression_mode == 3 or m_data_readout_mode == 1) { // any hit mode xxx or expanded read out mode - m_Analogue[0][i] = m_Offset[i] + m_NoiseFactor[i] * CLHEP::RandGaussZiggurat::shoot(m_rndmEngine); - m_Analogue[1][i] = m_Offset[i] + m_NoiseFactor[i] * CLHEP::RandGaussZiggurat::shoot(m_rndmEngine); - m_Analogue[2][i] = m_Offset[i] + m_NoiseFactor[i] * CLHEP::RandGaussZiggurat::shoot(m_rndmEngine); + m_Analogue[0][i] = m_Offset[i] + m_NoiseFactor[i] * CLHEP::RandGaussZiggurat::shoot(rndmEngine); + m_Analogue[1][i] = m_Offset[i] + m_NoiseFactor[i] * CLHEP::RandGaussZiggurat::shoot(rndmEngine); + m_Analogue[2][i] = m_Offset[i] + m_NoiseFactor[i] * CLHEP::RandGaussZiggurat::shoot(rndmEngine); } } } @@ -250,7 +249,7 @@ StatusCode SCT_FrontEnd::prepareGainAndOffset(SiChargedDiodeCollection& collecti // prepare gain and offset for the strips for a given module using // Cond Db data to get the chip calibration data // ---------------------------------------------------------------------- -StatusCode SCT_FrontEnd::prepareGainAndOffset(SiChargedDiodeCollection& collection, int side, const Identifier& moduleId) const { +StatusCode SCT_FrontEnd::prepareGainAndOffset(SiChargedDiodeCollection& collection, int side, const Identifier& moduleId, CLHEP::HepRandomEngine * rndmEngine) const { // Get chip data from calib DB std::vector<float> gainByChipVect = m_ReadCalibChipDataTool->getNPtGainData(moduleId, side, "GainByChip"); std::vector<float> gainRMSByChipVect = m_ReadCalibChipDataTool->getNPtGainData(moduleId, side, "GainRMSByChip"); @@ -265,7 +264,7 @@ StatusCode SCT_FrontEnd::prepareGainAndOffset(SiChargedDiodeCollection& collecti // Need to check if empty, most should have data, but a few old DEAD modules don't if (gainByChipVect.empty() or noiseByChipVect.empty()) { ATH_MSG_DEBUG("No calibration data in cond DB for module " << moduleId << " using JO values"); - if (StatusCode::SUCCESS != prepareGainAndOffset(collection, moduleId)) { + if (StatusCode::SUCCESS != prepareGainAndOffset(collection, moduleId, rndmEngine)) { return StatusCode::FAILURE; } else { return StatusCode::SUCCESS; @@ -276,7 +275,7 @@ StatusCode SCT_FrontEnd::prepareGainAndOffset(SiChargedDiodeCollection& collecti float gainMeanValue = meanValue(gainByChipVect); if (gainMeanValue < 0.0) { ATH_MSG_DEBUG("All chip gain values are 0 for module " << moduleId << " using JO values"); - if (StatusCode::SUCCESS != prepareGainAndOffset(collection, moduleId)) { + if (StatusCode::SUCCESS != prepareGainAndOffset(collection, moduleId, rndmEngine)) { return StatusCode::FAILURE; } else { return StatusCode::SUCCESS; @@ -341,8 +340,8 @@ StatusCode SCT_FrontEnd::prepareGainAndOffset(SiChargedDiodeCollection& collecti if (m_Analogue[1][i] <= 0.0) { // Values depends on which chip the strip is on (complex when strip is on chip edge) int chip = i / 128; - float g = CLHEP::RandGaussZiggurat::shoot(m_rndmEngine, 0.0, S1[chip]); - float o = CLHEP::RandGaussZiggurat::shoot(m_rndmEngine, 0.0, S2[chip]); + float g = CLHEP::RandGaussZiggurat::shoot(rndmEngine, 0.0, S1[chip]); + float o = CLHEP::RandGaussZiggurat::shoot(rndmEngine, 0.0, S2[chip]); m_GainFactor[i] = gain[chip] + (cosfi[chip] * g + sinfi[chip] * o); m_Offset[i] = offset[chip] + (cosfi[chip] * o - sinfi[chip] * g); @@ -350,14 +349,14 @@ StatusCode SCT_FrontEnd::prepareGainAndOffset(SiChargedDiodeCollection& collecti // Fill the noise and offset values into the Analogue if (m_data_compression_mode == 1 and m_data_readout_mode == 0) { // level mode x1x - m_Analogue[1][i] = m_Offset[i] + m_NoiseFactor[i] * CLHEP::RandGaussZiggurat::shoot(m_rndmEngine); + m_Analogue[1][i] = m_Offset[i] + m_NoiseFactor[i] * CLHEP::RandGaussZiggurat::shoot(rndmEngine); } else if (m_data_compression_mode == 2 and m_data_readout_mode == 0) { // edge mode 01x - m_Analogue[0][i] = m_Offset[i] + m_NoiseFactor[i] * CLHEP::RandGaussZiggurat::shoot(m_rndmEngine); - m_Analogue[1][i] = m_Offset[i] + m_NoiseFactor[i] * CLHEP::RandGaussZiggurat::shoot(m_rndmEngine); + m_Analogue[0][i] = m_Offset[i] + m_NoiseFactor[i] * CLHEP::RandGaussZiggurat::shoot(rndmEngine); + m_Analogue[1][i] = m_Offset[i] + m_NoiseFactor[i] * CLHEP::RandGaussZiggurat::shoot(rndmEngine); } else if (m_data_compression_mode == 3 or m_data_readout_mode == 1) { // any hit mode xxx or expanded read out mode - m_Analogue[0][i] = m_Offset[i] + m_NoiseFactor[i] * CLHEP::RandGaussZiggurat::shoot(m_rndmEngine); - m_Analogue[1][i] = m_Offset[i] + m_NoiseFactor[i] * CLHEP::RandGaussZiggurat::shoot(m_rndmEngine); - m_Analogue[2][i] = m_Offset[i] + m_NoiseFactor[i] * CLHEP::RandGaussZiggurat::shoot(m_rndmEngine); + m_Analogue[0][i] = m_Offset[i] + m_NoiseFactor[i] * CLHEP::RandGaussZiggurat::shoot(rndmEngine); + m_Analogue[1][i] = m_Offset[i] + m_NoiseFactor[i] * CLHEP::RandGaussZiggurat::shoot(rndmEngine); + m_Analogue[2][i] = m_Offset[i] + m_NoiseFactor[i] * CLHEP::RandGaussZiggurat::shoot(rndmEngine); } } } @@ -371,7 +370,7 @@ StatusCode SCT_FrontEnd::prepareGainAndOffset(SiChargedDiodeCollection& collecti // ---------------------------------------------------------------------- // // ---------------------------------------------------------------------- -StatusCode SCT_FrontEnd::randomNoise(SiChargedDiodeCollection& collection, const Identifier& moduleId) const { +StatusCode SCT_FrontEnd::randomNoise(SiChargedDiodeCollection& collection, const Identifier& moduleId, CLHEP::HepRandomEngine * rndmEngine) const { // Add random noise double occupancy = 0.0; @@ -443,14 +442,14 @@ StatusCode SCT_FrontEnd::randomNoise(SiChargedDiodeCollection& collection, const if (nEmptyStrips != 0) { // Should randomize the fixed NO values, so we get some differences per // wafer - occupancy = CLHEP::RandGaussZiggurat::shoot(m_rndmEngine, NoiseOccupancy, NoiseOccupancy * 0.1); + occupancy = CLHEP::RandGaussZiggurat::shoot(rndmEngine, NoiseOccupancy, NoiseOccupancy * 0.1); // Modify the occupancy if threshold is not 1.0 fC if (m_Threshold > 6242.3 or m_Threshold < 6242.1) { const float fC = 6242.2; occupancy = occupancy * exp(-(0.5 / (Noise * Noise) * (m_Threshold * m_Threshold - fC * fC))); } - nNoisyStrips = CLHEP::RandPoisson::shoot(m_rndmEngine, m_strip_max * occupancy * mode); + nNoisyStrips = CLHEP::RandPoisson::shoot(rndmEngine, m_strip_max * occupancy * mode); // Check and adapt the number of noisy strips to the number of free strips if (nEmptyStrips < nNoisyStrips) { @@ -459,7 +458,7 @@ StatusCode SCT_FrontEnd::randomNoise(SiChargedDiodeCollection& collection, const // Find random strips to get noise hits for (int i = 0; i < nNoisyStrips; i++) { - int index = CLHEP::RandFlat::shootInt(m_rndmEngine, nEmptyStrips - i); // strip == 10, 12 free strips + int index = CLHEP::RandFlat::shootInt(rndmEngine, nEmptyStrips - i); // strip == 10, 12 free strips // have vector [10000100100200211001] 20 strips int strip = emptyStrips.at(index); emptyStrips.erase(emptyStrips.begin()+index); // Erase it not to use it again @@ -469,7 +468,7 @@ StatusCode SCT_FrontEnd::randomNoise(SiChargedDiodeCollection& collection, const m_StripHitsOnWafer[strip] = 3; // !< Random Noise hit // Add tbin info to noise diode if (noise_expanded_mode) { // !< if any hit mode, any time bin otherwise fixed tbin=2 - int noise_tbin = CLHEP::RandFlat::shootInt(m_rndmEngine, 3); + int noise_tbin = CLHEP::RandFlat::shootInt(rndmEngine, 3); // !< random number 0, 1 or 2 if (noise_tbin == 0) { noise_tbin = 4; // !< now 1,2 or 4 @@ -491,7 +490,7 @@ StatusCode SCT_FrontEnd::randomNoise(SiChargedDiodeCollection& collection, const // ---------------------------------------------------------------------- // // ---------------------------------------------------------------------- -StatusCode SCT_FrontEnd::randomNoise(SiChargedDiodeCollection& collection, const Identifier& moduleId, int side) const { +StatusCode SCT_FrontEnd::randomNoise(SiChargedDiodeCollection& collection, const Identifier& moduleId, int side, CLHEP::HepRandomEngine * rndmEngine) const { int n_chips = 6; int chipStripmax = m_strip_max / n_chips; std::vector<float> NOByChipVect(n_chips, 0.0); @@ -513,7 +512,7 @@ StatusCode SCT_FrontEnd::randomNoise(SiChargedDiodeCollection& collection, const // Need to check if empty, most should have data, but a few old DEAD modules don't, and 9C... if (NOByChipVect.empty()) { ATH_MSG_DEBUG("No calibration data in cond DB for module " << moduleId << " using JO values"); - if (StatusCode::SUCCESS != randomNoise(collection, moduleId)) { + if (StatusCode::SUCCESS != randomNoise(collection, moduleId, rndmEngine)) { return StatusCode::FAILURE; } else { return StatusCode::SUCCESS; @@ -529,7 +528,7 @@ StatusCode SCT_FrontEnd::randomNoise(SiChargedDiodeCollection& collection, const NOByChipVect[i] = NOByChipVect[i] * exp(-(0.5 / (ENCByChipVect[i]*ENCByChipVect[i]) * (m_Threshold*m_Threshold - fC*fC))); } - nNoisyStrips[i] = CLHEP::RandPoisson::shoot(m_rndmEngine, chipStripmax * NOByChipVect[i] * mode); + nNoisyStrips[i] = CLHEP::RandPoisson::shoot(rndmEngine, chipStripmax * NOByChipVect[i] * mode); } } @@ -557,7 +556,7 @@ StatusCode SCT_FrontEnd::randomNoise(SiChargedDiodeCollection& collection, const // Find random strips to get noise hits for (int i = 0; i < nNoisyStrips[chip_index]; i++) { - int index = CLHEP::RandFlat::shootInt(m_rndmEngine, nEmptyStripsOnChip - i); + int index = CLHEP::RandFlat::shootInt(rndmEngine, nEmptyStripsOnChip - i); int strip_on_chip = emptyStripsOnChip.at(index); emptyStripsOnChip.erase(emptyStripsOnChip.begin()+index); // Erase it not to use it again int strip = strip_on_chip + chip_strip_offset; @@ -568,7 +567,7 @@ StatusCode SCT_FrontEnd::randomNoise(SiChargedDiodeCollection& collection, const // Add tbin info to noise diode if (noise_expanded_mode) { // !< if any hit mode, any time bin // !< otherwise fixed tbin=2 - int noise_tbin = CLHEP::RandFlat::shootInt(m_rndmEngine, 3); + int noise_tbin = CLHEP::RandFlat::shootInt(rndmEngine, 3); // !< random number 0, 1 or 2 if (noise_tbin == 0) { noise_tbin = 4; // !< now 1, 2 or 4 @@ -593,7 +592,7 @@ StatusCode SCT_FrontEnd::randomNoise(SiChargedDiodeCollection& collection, const // all single-strip pre-digits calculate the amplifier response add noise // (this could be moved elsewhere later) apply threshold do clustering // ---------------------------------------------------------------------- -void SCT_FrontEnd::process(SiChargedDiodeCollection& collection) const { +void SCT_FrontEnd::process(SiChargedDiodeCollection& collection, CLHEP::HepRandomEngine * rndmEngine) const { // get SCT module side design and check it const SCT_ModuleSideDesign *p_design = dynamic_cast<const SCT_ModuleSideDesign*>(&(collection.design())); @@ -648,11 +647,11 @@ void SCT_FrontEnd::process(SiChargedDiodeCollection& collection) const { if (not collection.empty()) { // Setup gain/offset/noise to the hit and neighbouring strips if (m_useCalibData) { // Use calib cond DB data - if (StatusCode::SUCCESS != prepareGainAndOffset(collection, side, moduleId)) { + if (StatusCode::SUCCESS != prepareGainAndOffset(collection, side, moduleId, rndmEngine)) { ATH_MSG_ERROR("\tCan't prepare Gain and Offset"); } } else { // Use JO values - if (StatusCode::SUCCESS != prepareGainAndOffset(collection, moduleId)) { + if (StatusCode::SUCCESS != prepareGainAndOffset(collection, moduleId, rndmEngine)) { ATH_MSG_ERROR("\tCan't prepare Gain and Offset"); } } @@ -672,11 +671,11 @@ void SCT_FrontEnd::process(SiChargedDiodeCollection& collection) const { if (m_NoiseOn) { if (m_useCalibData) { // Check if using DB or not - if (StatusCode::SUCCESS != randomNoise(collection, moduleId, side)) { + if (StatusCode::SUCCESS != randomNoise(collection, moduleId, side, rndmEngine)) { ATH_MSG_ERROR("\tCan't do random noise on wafer?!"); } } else { // Use JO fixed values - if (StatusCode::SUCCESS != randomNoise(collection, moduleId)) { + if (StatusCode::SUCCESS != randomNoise(collection, moduleId, rndmEngine)) { ATH_MSG_ERROR("\tCan't do random noise on wafer?!"); } } diff --git a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_FrontEnd.h b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_FrontEnd.h index 6fc6a689f285d6bbcd4710872fceb9c68e4dab28..73e510cb778a3c1b8802a2e5a4f0370b05b7f4d3 100644 --- a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_FrontEnd.h +++ b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_FrontEnd.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 */ /** @@ -74,16 +74,15 @@ class SCT_FrontEnd : public AthAlgTool, virtual public ISCT_FrontEnd { * process the collection of pre digits: needed to go through all single-strip pre-digits to calculate * the amplifier response add noise (this could be moved elsewhere later) apply threshold do clustering */ - virtual void process(SiChargedDiodeCollection& collection) const; - void setRandomEngine(CLHEP::HepRandomEngine* rndmEngine) { m_rndmEngine = rndmEngine; }; + virtual void process(SiChargedDiodeCollection& collection, CLHEP::HepRandomEngine * rndmEngine) const; StatusCode doSignalChargeForHits(SiChargedDiodeCollection& collectione) const; StatusCode doThresholdCheckForRealHits(SiChargedDiodeCollection& collectione) const; StatusCode doThresholdCheckForCrosstalkHits(SiChargedDiodeCollection& collection) const; StatusCode doClustering(SiChargedDiodeCollection& collection) const; - StatusCode prepareGainAndOffset(SiChargedDiodeCollection& collection, const Identifier& moduleId) const; - StatusCode prepareGainAndOffset(SiChargedDiodeCollection& collection, int side, const Identifier& moduleId) const; - StatusCode randomNoise(SiChargedDiodeCollection& collection, const Identifier& moduleId) const; - StatusCode randomNoise(SiChargedDiodeCollection& collection, const Identifier& moduleId, int side) const; + StatusCode prepareGainAndOffset(SiChargedDiodeCollection& collection, const Identifier& moduleId, CLHEP::HepRandomEngine * rndmEngine) const; + StatusCode prepareGainAndOffset(SiChargedDiodeCollection& collection, int side, const Identifier& moduleId, CLHEP::HepRandomEngine * rndmEngine) const; + StatusCode randomNoise(SiChargedDiodeCollection& collection, const Identifier& moduleId, CLHEP::HepRandomEngine * rndmEngine) const; + StatusCode randomNoise(SiChargedDiodeCollection& collection, const Identifier& moduleId, int side, CLHEP::HepRandomEngine * rndmEngine) const; StatusCode addNoiseDiode(SiChargedDiodeCollection& collection, int strip, int tbin) const; float meanValue(std::vector<float>& calibDataVect) const; StatusCode initVectors(int strips) const; @@ -125,7 +124,6 @@ class SCT_FrontEnd : public AthAlgTool, virtual public ISCT_FrontEnd { ToolHandle<ISCT_Amp> m_sct_amplifier{this, "SCT_Amp", "SCT_Amp", "Handle the Amplifier tool"}; //!< Handle the Amplifier tool ToolHandle<ISCT_ReadCalibChipDataTool> m_ReadCalibChipDataTool{this, "SCT_ReadCalibChipDataTool", "SCT_ReadCalibChipDataTool", "Tool to retrieve chip calibration information"}; //!< Handle to the Calibration ConditionsTool - CLHEP::HepRandomEngine* m_rndmEngine; //!< Random number generation engine }; #endif //SCT_FRONTEND_H diff --git a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_RandomDisabledCellGenerator.cxx b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_RandomDisabledCellGenerator.cxx index e8286dcce72d4f89fb5b21db4194b97898b8e913..50f60499a64206197da71023a9c89a333c27783e 100644 --- a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_RandomDisabledCellGenerator.cxx +++ b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_RandomDisabledCellGenerator.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 "SCT_RandomDisabledCellGenerator.h" @@ -8,15 +8,12 @@ #include "SiDigitization/SiHelper.h" -// random number service includes -#include "AthenaKernel/IAtRndmGenSvc.h" - +#include "CLHEP/Random/RandomEngine.h" #include "CLHEP/Random/RandFlat.h" // constructor SCT_RandomDisabledCellGenerator::SCT_RandomDisabledCellGenerator(const std::string& type, const std::string& name, const IInterface* parent) - : base_class(type, name, parent), - m_rndmEngine{nullptr} + : base_class(type, name, parent) { declareProperty("TotalBadChannels", m_disableProbability=0.01); } @@ -33,11 +30,11 @@ StatusCode SCT_RandomDisabledCellGenerator::finalize() { } // process the collection -void SCT_RandomDisabledCellGenerator::process(SiChargedDiodeCollection& collection) const { +void SCT_RandomDisabledCellGenerator::process(SiChargedDiodeCollection& collection, CLHEP::HepRandomEngine * rndmEngine) const { // disabling is applied to all cells even unconnected or below threshold ones to be able to use these cells as well // loop on all charged diodes for (std::pair<const InDetDD::SiCellId, SiChargedDiode>& chargedDiode: collection) { - if (CLHEP::RandFlat::shoot(m_rndmEngine)<m_disableProbability) { + if (CLHEP::RandFlat::shoot(rndmEngine)<m_disableProbability) { SiHelper::disconnected(chargedDiode.second, true, false); } } diff --git a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_RandomDisabledCellGenerator.h b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_RandomDisabledCellGenerator.h index 246f590d542fcd628bbe1ca0ddc3420c86411f30..eb75e3c4cbb0aa90398cb04b10afdfdb3f6e1a4f 100644 --- a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_RandomDisabledCellGenerator.h +++ b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_RandomDisabledCellGenerator.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 */ /////////////////////////////////////////////////////////////////// @@ -49,8 +49,7 @@ class SCT_RandomDisabledCellGenerator : public extends<AthAlgTool, ISCT_RandomDi /** AlgTool finalize */ virtual StatusCode finalize(); - virtual void process(SiChargedDiodeCollection& collection) const; - void setRandomEngine(CLHEP::HepRandomEngine* rndmEngine) {m_rndmEngine = rndmEngine;} + virtual void process(SiChargedDiodeCollection& collection, CLHEP::HepRandomEngine * rndmEngine) const; private: @@ -60,7 +59,6 @@ class SCT_RandomDisabledCellGenerator : public extends<AthAlgTool, ISCT_RandomDi private: float m_disableProbability; // probability that a cell is disabled - CLHEP::HepRandomEngine *m_rndmEngine; // local rndm stream }; diff --git a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_SurfaceChargesGenerator.cxx b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_SurfaceChargesGenerator.cxx index bb271ce3992bd38579a40bf5f1f6f40b0cf15611..260ae32a319945e2ab4884de7693a9d6c26096f7 100644 --- a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_SurfaceChargesGenerator.cxx +++ b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_SurfaceChargesGenerator.cxx @@ -72,9 +72,7 @@ SCT_SurfaceChargesGenerator::SCT_SurfaceChargesGenerator(const std::string& type m_h_gen2{nullptr}, m_h_velocity_trap{nullptr}, m_h_mobility_trap{nullptr}, - m_h_trap_pos{nullptr}, - m_rndmEngine{nullptr}, - m_rndmEngineName{"SCT_Digitization"} { + m_h_trap_pos{nullptr} { declareInterface<ISCT_SurfaceChargesGenerator>(this); declareProperty("FixedTime", m_tfix = -999.); // !< fixed timing @@ -348,9 +346,9 @@ float SCT_SurfaceChargesGenerator::surfaceDriftTime(float ysurf) const { // ------------------------------------------------------------------------------------------- void SCT_SurfaceChargesGenerator::process(const SiDetectorElement* element, const TimedHitPtr<SiHit>& phit, - const ISiSurfaceChargesInserter& inserter) const { + const ISiSurfaceChargesInserter& inserter, CLHEP::HepRandomEngine * rndmEngine) const { ATH_MSG_VERBOSE("SCT_SurfaceChargesGenerator::process starts"); - processSiHit(element, *phit, inserter, phit.eventTime(), phit.eventId()); + processSiHit(element, *phit, inserter, phit.eventTime(), phit.eventId(), rndmEngine); return; } @@ -362,7 +360,7 @@ void SCT_SurfaceChargesGenerator::processSiHit(const SiDetectorElement* element, const SiHit& phit, const ISiSurfaceChargesInserter& inserter, float p_eventTime, - unsigned short p_eventId) const { + unsigned short p_eventId, CLHEP::HepRandomEngine * rndmEngine) const { const SCT_ModuleSideDesign* design{dynamic_cast<const SCT_ModuleSideDesign*>(&(element->design()))}; if (design==nullptr) { ATH_MSG_ERROR("SCT_SurfaceChargesGenerator::process can not get " << design); @@ -480,9 +478,9 @@ void SCT_SurfaceChargesGenerator::processSiHit(const SiDetectorElement* element, const float sigma{diffusionSigma(zReadout, element)}; for (int i{0}; i < m_numberOfCharges; ++i) { - const float rx{CLHEP::RandGaussZiggurat::shoot(m_rndmEngine)}; + const float rx{CLHEP::RandGaussZiggurat::shoot(rndmEngine)}; const float xd{x1 + sigma * rx}; - const float ry{CLHEP::RandGaussZiggurat::shoot(m_rndmEngine)}; + const float ry{CLHEP::RandGaussZiggurat::shoot(rndmEngine)}; const float yd{y1 + sigma * ry}; // For charge trapping with Ramo potential diff --git a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_SurfaceChargesGenerator.h b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_SurfaceChargesGenerator.h index 0fdde720870f4bbd2fc0db676ecefda311680d70..f0901e01d74e93f3881a4372d9ea633d4004d38e 100644 --- a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_SurfaceChargesGenerator.h +++ b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_SurfaceChargesGenerator.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 */ /** @@ -86,11 +86,10 @@ class SCT_SurfaceChargesGenerator : public AthAlgTool, virtual public ISCT_Surfa private: virtual void setFixedTime(float fixedTime) {m_tfix = fixedTime;} - virtual void setRandomEngine(CLHEP::HepRandomEngine* rndmEngine) {m_rndmEngine = rndmEngine;} /** create a list of surface charges from a hit */ - virtual void process(const InDetDD::SiDetectorElement* element, const TimedHitPtr<SiHit>& phit, const ISiSurfaceChargesInserter& inserter) const; - void processSiHit(const InDetDD::SiDetectorElement* element, const SiHit& phit, const ISiSurfaceChargesInserter& inserter, float eventTime, unsigned short eventID) const; + virtual void process(const InDetDD::SiDetectorElement* element, const TimedHitPtr<SiHit>& phit, const ISiSurfaceChargesInserter& inserter, CLHEP::HepRandomEngine * rndmEngine) const; + void processSiHit(const InDetDD::SiDetectorElement* element, const SiHit& phit, const ISiSurfaceChargesInserter& inserter, float eventTime, unsigned short eventID, CLHEP::HepRandomEngine * rndmEngine) const; // some diagnostics methods are needed here too float driftTime(float zhit, const InDetDD::SiDetectorElement* element) const; //!< calculate drift time perpandicular to the surface for a charge at distance zhit from mid gap @@ -156,9 +155,6 @@ class SCT_SurfaceChargesGenerator : public AthAlgTool, virtual public ISCT_Surfa ToolHandle<ISiliconConditionsTool> m_siConditionsTool{this, "SiConditionsTool", "SCT_SiliconConditionsTool", "Tool to retrieve SCT silicon information"}; ToolHandle<ISiLorentzAngleTool> m_lorentzAngleTool{this, "LorentzAngleTool", "SiLorentzAngleTool/SCTLorentzAngleTool", "Tool to retreive Lorentz angle"}; - CLHEP::HepRandomEngine* m_rndmEngine; //!< Random Engine - std::string m_rndmEngineName; //!< name of random engine, actual pointer in SiDigitization - bool m_isOverlay; // flag for overlay }; diff --git a/InnerDetector/InDetDigitization/SiDigitization/SiDigitization/ISiChargedDiodesProcessorTool.h b/InnerDetector/InDetDigitization/SiDigitization/SiDigitization/ISiChargedDiodesProcessorTool.h index f845599606c052e7f6e7a2a777be06fdc3e9d231..17387eb40c08688aeca835ded533a8166e2b9631 100755 --- a/InnerDetector/InDetDigitization/SiDigitization/SiDigitization/ISiChargedDiodesProcessorTool.h +++ b/InnerDetector/InDetDigitization/SiDigitization/SiDigitization/ISiChargedDiodesProcessorTool.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 */ /** @@ -17,6 +17,9 @@ class SiChargedDiodeCollection; class NPtGainSummaryData; +namespace CLHEP { + class HepRandomEngine; +} static const InterfaceID IID_ISiChargedDiodesProcessorTool("ISiChargedDiodesProcessorTool",1,0); @@ -38,7 +41,7 @@ public: /////////////////////////////////////////////////////////////////// // process the collection of charged diodes - virtual void process(SiChargedDiodeCollection &collection) const =0; + virtual void process(SiChargedDiodeCollection &collection, CLHEP::HepRandomEngine * rndmEngine) const =0; }; #endif // SIDIGITIZATION_ISICHARGEDDIODESPROCESSORTOOL_H