From bb5b7bed75a5e9ec47cf4c2586b8b7d69c8c75b3 Mon Sep 17 00:00:00 2001 From: John Derek Chapman <chapman@hep.phy.cam.ac.uk> Date: Mon, 17 Aug 2015 14:08:57 +0200 Subject: [PATCH] SCT_DigitizationConfig.py - fix random number stream configuration, so that we can freely mix full and fast digi when digitizing the hard-scatter and pile-up Hits separately. Requires Digitization-01-16-00 or later. ATLASSIM-2158. Use HardScatterSplittingMode 0 for SCT_DigitizationToolSplitNoMergePU. ATLASSIM-2174. Tagged as SCT_Digitization-02-00-10 (SCT_Digitization-02-00-10) * SCT_DigitizationConfig.py - fix random number stream configuration, so that we can freely mix full and fast digi when digitizing the hard-scatter and pile-up Hits separately. Requires Digitization-01-16-00 or later. ATLASSIM-2158. Use HardScatterSplittingMode 0 for SCT_DigitizationToolSplitNoMergePU. ATLASSIM-2174 * tagged as SCT_Digitization-02-00-10 2015-06-19 Mahsana Haleem <Mahsana.Haleem@cern.ch>, John Chapman<John.Chapman@cern.ch> * Added two CfgGetter methods (SCT_DigitizationToolSplitNoMergePU, getPileupSCT_FrontEnd) requested by Robert Harrington to allow using different digitization tools for hard scatter and pileup in the event. (ATLASSIM-2066) * tagged as SCT_Digitization-02-00-09 2015-04-20 Malcolm Skinner <malcolm.bruce.skinner@cern.ch> * SCT_DigitizationConfig.py Migration of overlay configuration to be based on CfgGetter. ATLASSIM-1922. * SCT_Digitization-02-00-08. ... (Long ChangeLog diff - truncated) --- .../SCT_Digitization/SCT_DigitizationTool.h | 2 +- .../python/SCT_DigitizationConfig.py | 66 +++++++++++++++---- .../python/SCT_DigitizationConfigDb.py | 4 ++ .../src/SCT_DigitizationTool.cxx | 4 +- .../SCT_Digitization/src/SCT_FrontEnd.cxx | 4 +- .../SCT_Digitization/src/SCT_FrontEndDev.cxx | 4 +- .../src/SCT_SurfaceChargesGenerator.cxx | 11 +++- 7 files changed, 75 insertions(+), 20 deletions(-) diff --git a/InnerDetector/InDetDigitization/SCT_Digitization/SCT_Digitization/SCT_DigitizationTool.h b/InnerDetector/InDetDigitization/SCT_Digitization/SCT_Digitization/SCT_DigitizationTool.h index be6d08651ea..12eb313743b 100755 --- a/InnerDetector/InDetDigitization/SCT_Digitization/SCT_Digitization/SCT_DigitizationTool.h +++ b/InnerDetector/InDetDigitization/SCT_Digitization/SCT_Digitization/SCT_DigitizationTool.h @@ -151,7 +151,7 @@ private: bool m_useComTime; //!< Flag to set the use of cosmics time for timing bool m_barrelonly; //!< Only the barrel layers bool m_randomDisabledCells; //!< Use Random disabled cells, default no - bool m_onlyElementsWithHits; //!< Process only elements with hits + //bool m_onlyElementsWithHits; //!< Process only elements with hits bool m_createNoiseSDO; //!< Create SDOs for strips with only noise hits (huge increase in SDO collection size) int m_HardScatterSplittingMode; //!< Process all SiHit or just those from signal or background events bool m_HardScatterSplittingSkipper; diff --git a/InnerDetector/InDetDigitization/SCT_Digitization/python/SCT_DigitizationConfig.py b/InnerDetector/InDetDigitization/SCT_Digitization/python/SCT_DigitizationConfig.py index 6d922a5aefd..95006da3e3f 100644 --- a/InnerDetector/InDetDigitization/SCT_Digitization/python/SCT_DigitizationConfig.py +++ b/InnerDetector/InDetDigitization/SCT_Digitization/python/SCT_DigitizationConfig.py @@ -1,5 +1,6 @@ # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +from AthenaCommon import CfgMgr # The earliest bunch crossing time for which interactions will be sent # to the SCT Digitization code. def SCT_FirstXing(): @@ -93,7 +94,7 @@ def getSCT_SurfaceChargesGenerator(name="SCT_SurfaceChargesGenerator", **kwargs) kwargs.setdefault("SmallStepLength", 5) kwargs.setdefault("DepletionVoltage", 70) kwargs.setdefault("BiasVoltage", 150) - + from Digitization.DigitizationFlags import digitizationFlags if 'doDetailedSurfChargesGen' in digitizationFlags.experimentalDigi(): kwargs.setdefault("ChargeDriftModel", 1) @@ -178,6 +179,24 @@ def getSCT_FrontEnd(name="SCT_FrontEnd", **kwargs): from SCT_Digitization.SCT_DigitizationConf import SCT_FrontEnd return SCT_FrontEnd(name, **kwargs) +###################################################################################### +def getPileupSCT_FrontEnd(name="PileupSCT_FrontEnd", **kwargs): + + kwargs.setdefault("NoiseBarrel", 0.0) + kwargs.setdefault("NoiseBarrel3", 0.0) + kwargs.setdefault("NoiseInners", 0.0) + kwargs.setdefault("NoiseMiddles", 0.0) + kwargs.setdefault("NoiseShortMiddles", 0.0) + kwargs.setdefault("NoiseOuters", 0.0) + kwargs.setdefault("NOBarrel", 0.0) + kwargs.setdefault("NOBarrel3", 0.0) + kwargs.setdefault("NOInners", 0.0) + kwargs.setdefault("NOMiddles", 0.0) + kwargs.setdefault("NOShortMiddles", 0.0) + kwargs.setdefault("NOOuters", 0.0) + kwargs.setdefault("NoiseOn", False) + + return getSCT_FrontEnd(name, **kwargs) ###################################################################################### @@ -206,6 +225,9 @@ def commonSCT_DigitizationConfig(name,**kwargs): #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()) @@ -219,17 +241,11 @@ def commonSCT_DigitizationConfig(name,**kwargs): ###################################################################################### -def GenericSCT_DigitizationTool(name,**kwargs): - from Digitization.DigitizationFlags import digitizationFlags - digitizationFlags.rndmSeedList.addSeed("SCT_Digitization", 49261510, 105132394 ) - return commonSCT_DigitizationConfig(name,**kwargs) - -###################################################################################### def SCT_DigitizationTool(name="SCT_DigitizationTool", **kwargs): kwargs.setdefault("OutputObjectName", "SCT_RDOs") kwargs.setdefault("OutputSDOName", "SCT_SDO_Map") kwargs.setdefault("HardScatterSplittingMode", 0) - return GenericSCT_DigitizationTool(name,**kwargs) + return commonSCT_DigitizationConfig(name,**kwargs) ###################################################################################### @@ -237,7 +253,7 @@ def SCT_DigitizationToolHS(name="SCT_DigitizationToolHS",**kwargs): kwargs.setdefault("OutputObjectName", "SCT_RDOs") kwargs.setdefault("OutputSDOName", "SCT_SDO_Map") kwargs.setdefault("HardScatterSplittingMode", 1) - return GenericSCT_DigitizationTool(name,**kwargs) + return commonSCT_DigitizationConfig(name,**kwargs) ###################################################################################### @@ -249,13 +265,34 @@ def SCT_DigitizationToolPU(name="SCT_DigitizationToolPU",**kwargs): ###################################################################################### +def SCT_DigitizationToolSplitNoMergePU(name="SCT_DigitizationToolSplitNoMergePU",**kwargs): + + kwargs.setdefault("InputObjectName", "PileupSCT_Hits") + kwargs.setdefault("HardScatterSplittingMode", 0) + kwargs.setdefault("OutputObjectName", "SCT_PU_RDOs") + kwargs.setdefault("OutputSDOName", "SCT_PU_SDO_Map") + kwargs.setdefault("OnlyHitElements", True) + kwargs.setdefault("FrontEnd", "PileupSCT_FrontEnd") + + return commonSCT_DigitizationConfig(name,**kwargs) + +###################################################################################### + +def SCT_OverlayDigitizationTool(name="SCT_OverlayDigitizationTool",**kwargs): + kwargs.setdefault("EvtStore", "BkgEvent_0_SG") + kwargs.setdefault("OutputObjectName", "SCT_RDOs") + kwargs.setdefault("OutputSDOName", "SCT_SDO_Map") + kwargs.setdefault("HardScatterSplittingMode", 0) + return commonSCT_DigitizationConfig(name,**kwargs) + +###################################################################################### + def getSiliconRange(name="SiliconRange" , **kwargs): #this is the time of the xing in ns kwargs.setdefault('FirstXing', SCT_FirstXing() ) kwargs.setdefault('LastXing', SCT_LastXing() ) kwargs.setdefault('CacheRefreshFrequency', 1.0 ) #default 0 no dataproxy reset kwargs.setdefault('ItemList', ["SiHitCollection#SCT_Hits"] ) - from AthenaCommon import CfgMgr return CfgMgr.PileUpXingFolder(name, **kwargs) ###################################################################################### @@ -269,5 +306,10 @@ def SCT_DigitizationHS(name="SCT_DigitizationHS",**kwargs): def SCT_DigitizationPU(name="SCT_DigitizationPU",**kwargs): kwargs.setdefault("DigitizationTool", "SCT_DigitizationToolPU") - from SCT_Digitization.SCT_DigitizationConf import SCT_Digitization - return SCT_Digitization(name,**kwargs) + return CfgMgr.SCT_Digitization(name,**kwargs) + +###################################################################################### + +def SCT_OverlayDigitization(name="SCT_OverlayDigitization",**kwargs): + kwargs.setdefault("DigitizationTool", "SCT_OverlayDigitizationTool") + return CfgMgr.SCT_Digitization(name,**kwargs) diff --git a/InnerDetector/InDetDigitization/SCT_Digitization/python/SCT_DigitizationConfigDb.py b/InnerDetector/InDetDigitization/SCT_Digitization/python/SCT_DigitizationConfigDb.py index 7d0821e885b..5f12118948a 100644 --- a/InnerDetector/InDetDigitization/SCT_Digitization/python/SCT_DigitizationConfigDb.py +++ b/InnerDetector/InDetDigitization/SCT_Digitization/python/SCT_DigitizationConfigDb.py @@ -4,6 +4,7 @@ from AthenaCommon.CfgGetter import addTool,addService,addAlgorithm addTool("SCT_Digitization.SCT_DigitizationConfig.SCT_DigitizationTool" , "SCT_DigitizationTool") addTool("SCT_Digitization.SCT_DigitizationConfig.SCT_DigitizationToolHS" , "SCT_DigitizationToolHS") addTool("SCT_Digitization.SCT_DigitizationConfig.SCT_DigitizationToolPU" , "SCT_DigitizationToolPU") +addTool("SCT_Digitization.SCT_DigitizationConfig.SCT_DigitizationToolSplitNoMergePU", "SCT_DigitizationToolSplitNoMergePU") addAlgorithm("SCT_Digitization.SCT_DigitizationConfig.SCT_DigitizationHS" , "SCT_DigitizationHS") addAlgorithm("SCT_Digitization.SCT_DigitizationConfig.SCT_DigitizationPU" , "SCT_DigitizationPU") addTool("SCT_Digitization.SCT_DigitizationConfig.getSiliconRange" , "SiliconRange" ) @@ -12,4 +13,7 @@ addTool("SCT_Digitization.SCT_DigitizationConfig.getSCT_TimeWalkGenerator", "SCT addTool("SCT_Digitization.SCT_DigitizationConfig.getSCT_StripDiscriminator", "SCT_StripDiscriminator") addTool("SCT_Digitization.SCT_DigitizationConfig.getSCT_Amp", "SCT_Amp" ) addTool("SCT_Digitization.SCT_DigitizationConfig.getSCT_FrontEnd" , "SCT_FrontEnd" ) +addTool("SCT_Digitization.SCT_DigitizationConfig.getPileupSCT_FrontEnd" , "PileupSCT_FrontEnd" ) addTool("SCT_Digitization.SCT_DigitizationConfig.getSCT_SurfaceChargesGenerator", "SCT_SurfaceChargesGenerator" ) +addTool("SCT_Digitization.SCT_DigitizationConfig.SCT_OverlayDigitizationTool", "SCT_OverlayDigitizationTool") +addAlgorithm("SCT_Digitization.SCT_DigitizationConfig.SCT_OverlayDigitization", "SCT_OverlayDigitization") diff --git a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_DigitizationTool.cxx b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_DigitizationTool.cxx index ffa6dd94741..873b7c21f14 100755 --- a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_DigitizationTool.cxx +++ b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_DigitizationTool.cxx @@ -622,7 +622,7 @@ class DigitizeNonHitElementsDebugPrinter { public: DigitizeNonHitElementsDebugPrinter(const SCT_ID* detID): - m_detID(detID), m_detMgr(NULL), m_msgNo(-1) {} + m_detID(detID), m_msgNo(-1) {} std::string msg(const InDetDD::SiDetectorElement* element) { std::ostringstream ost; @@ -637,7 +637,7 @@ public: } private: const SCT_ID* m_detID; - const InDetDD::SiDetectorManager* m_detMgr; + //const InDetDD::SiDetectorManager* m_detMgr; int m_msgNo; }; diff --git a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_FrontEnd.cxx b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_FrontEnd.cxx index 5c9625aeab3..83d7dd53d84 100755 --- a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_FrontEnd.cxx +++ b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_FrontEnd.cxx @@ -267,7 +267,7 @@ StatusCode SCT_FrontEnd::prepareGainAndOffset(SiChargedDiodeCollection &collecti // loop over strips for (; i<i_end; i++){ // Need to check if strip is already setup - if(!m_Analogue[1][i]>0.0){ + 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); @@ -389,7 +389,7 @@ StatusCode SCT_FrontEnd::prepareGainAndOffset(SiChargedDiodeCollection &collecti // loop over strips for (; i<i_end; i++){ // Need to check if strip is already setup - if(!m_Analogue[1][i]>0.0){ + 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; diff --git a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_FrontEndDev.cxx b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_FrontEndDev.cxx index 66bcc8e3a03..cd9252956d6 100755 --- a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_FrontEndDev.cxx +++ b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_FrontEndDev.cxx @@ -269,7 +269,7 @@ StatusCode SCT_FrontEndDev::prepareGainAndOffset(SiChargedDiodeCollection &colle // loop over strips for (; i<i_end; i++){ // Need to check if strip is already setup - if(!m_Analogue[1][i]>0.0){ + 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); @@ -391,7 +391,7 @@ StatusCode SCT_FrontEndDev::prepareGainAndOffset(SiChargedDiodeCollection &colle // loop over strips for (; i<i_end; i++){ // Need to check if strip is already setup - if(!m_Analogue[1][i]>0.0){ + 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; diff --git a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_SurfaceChargesGenerator.cxx b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_SurfaceChargesGenerator.cxx index 4b0d936c2e3..4dc7127faae 100755 --- a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_SurfaceChargesGenerator.cxx +++ b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_SurfaceChargesGenerator.cxx @@ -12,6 +12,7 @@ // random number service includes #include "AthenaKernel/IAtRndmGenSvc.h" #include "CLHEP/Random/RandomEngine.h" +#include "CLHEP/Random/RandFlat.h" #include "AtlasCLHEP_RandomGenerators/RandGaussZiggurat.h" // CLHEP @@ -611,11 +612,19 @@ void SCT_SurfaceChargesGenerator::processSiHit(const SiHit& phit, const ISiSurfa float diffusionSigma = DiffusionSigma(zReadout); for(int i=0 ; i<m_numberOfCharges; ++i) { - float rx = CLHEP::RandGaussZiggurat::shoot(m_rndmEngine) ; + +/* + float rx = CLHEP::RandGaussZiggurat::shoot(m_rndmEngine) ; float xd = x1+diffusionSigma*rx; float ry = CLHEP::RandGaussZiggurat::shoot(m_rndmEngine) ; float yd = y1+diffusionSigma*ry; +*/ + float diffAmount = diffusionSigma*CLHEP::RandGaussZiggurat::shoot(m_rndmEngine); + float phi = CLHEP::RandFlat::shoot(m_rndmEngine, 2.0*CLHEP::pi); + float xd = x1 + cos(phi) * diffAmount; + float yd = y1 + sin(phi) * diffAmount; + //For charge trapping with Ramo potential double stripPitch = 0.080; //mm double dstrip= y1/stripPitch; //mm -- GitLab