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