From 96833e8e80fd8fa88514d3e3b096e9cacbc25523 Mon Sep 17 00:00:00 2001
From: Soshi Tsuno <soshi.tsuno@cern.ch>
Date: Mon, 2 Nov 2020 18:16:08 +0000
Subject: [PATCH] Allowing radiation damage digitization (ATLPHYSVAL-654)

---
 .../python/PixelDigitizationConfig.py            | 16 ++++++++++++++--
 .../python/PixelDigitizationConfigNew.py         | 13 +++++++++++++
 .../PixelDigitization/src/SensorSim3DTool.cxx    | 16 ++++++++--------
 .../PixelDigitization/src/SensorSim3DTool.h      |  2 +-
 .../src/SensorSimPlanarTool.cxx                  | 14 +++++++-------
 .../PixelDigitization/src/SensorSimPlanarTool.h  |  8 ++++----
 Simulation/Digitization/python/DigiAlgConfig.py  |  2 --
 .../python/DigitizationConfigFlags.py            |  3 +++
 8 files changed, 50 insertions(+), 24 deletions(-)

diff --git a/InnerDetector/InDetDigitization/PixelDigitization/python/PixelDigitizationConfig.py b/InnerDetector/InDetDigitization/PixelDigitization/python/PixelDigitizationConfig.py
index a91384df66a..2b2b09cba25 100644
--- a/InnerDetector/InDetDigitization/PixelDigitization/python/PixelDigitizationConfig.py
+++ b/InnerDetector/InDetDigitization/PixelDigitization/python/PixelDigitizationConfig.py
@@ -4,7 +4,7 @@ from __future__ import print_function
 
 from AthenaCommon import CfgMgr
 from Digitization.DigitizationFlags import digitizationFlags
-
+        
 # The earliest bunch crossing time for which interactions will be sent
 # to the Pixel Digitization code.
 def Pixel_FirstXing():
@@ -55,12 +55,24 @@ def SensorSimPlanarTool(name="SensorSimPlanarTool", **kwargs):
     from AthenaCommon.AppMgr import ToolSvc
     kwargs.setdefault("SiPropertiesTool", ToolSvc.PixelSiPropertiesTool)
     kwargs.setdefault("LorentzAngleTool", ToolSvc.PixelLorentzAngleTool)
-#    kwargs.setdefault("LorentzAngleTool", pixelLorentzAngleToolSetup.PixelLorentzAngleTool)
+    kwargs.setdefault("doRadDamage", digitizationFlags.doRadiationDamage.get_Value())
+    # TODO This is 2018 fluence setting. These parameters should be controlled by the conditions data.
+    kwargs.setdefault("fluence", 6.4)
+    kwargs.setdefault("fluenceB", 4.6)
+    kwargs.setdefault("fluence1", 2.1)
+    kwargs.setdefault("fluence2", 1.3)
+    kwargs.setdefault("voltage", 400)
+    kwargs.setdefault("voltageB", 400)
+    kwargs.setdefault("voltage1", 250)
+    kwargs.setdefault("voltage2", 250)
     return CfgMgr.SensorSimPlanarTool(name, **kwargs)
 
 def SensorSim3DTool(name="SensorSim3DTool", **kwargs):
     from AthenaCommon.AppMgr import ToolSvc
     kwargs.setdefault("SiPropertiesTool", ToolSvc.PixelSiPropertiesTool)
+    kwargs.setdefault("doRadDamage", digitizationFlags.doRadiationDamage.get_Value())
+    # TODO This is 2018 fluence setting. These parameters should be controlled by the conditions data.
+    kwargs.setdefault("fluence", 6)
     return CfgMgr.SensorSim3DTool(name, **kwargs)
 
 def SensorSimTool(name="SensorSimTool", **kwargs):
diff --git a/InnerDetector/InDetDigitization/PixelDigitization/python/PixelDigitizationConfigNew.py b/InnerDetector/InDetDigitization/PixelDigitization/python/PixelDigitizationConfigNew.py
index d01cd5f28bc..bb9daa4ff5b 100644
--- a/InnerDetector/InDetDigitization/PixelDigitization/python/PixelDigitizationConfigNew.py
+++ b/InnerDetector/InDetDigitization/PixelDigitization/python/PixelDigitizationConfigNew.py
@@ -83,6 +83,16 @@ def SensorSimPlanarToolCfg(flags, name="SensorSimPlanarTool", **kwargs):
     kwargs.setdefault("SiPropertiesTool", SiTool)
     kwargs.setdefault("LorentzAngleTool", LorentzTool)
     SensorSimPlanarTool = CompFactory.SensorSimPlanarTool
+    kwargs.setdefault("doRadDamage", flags.Digitization.DoRadiationDamage)
+    # TODO This is 2018 fluence setting. These parameters should be controlled by the conditions data.
+    kwargs.setdefault("fluence", 6.4)
+    kwargs.setdefault("fluenceB", 4.6)
+    kwargs.setdefault("fluence1", 2.1)
+    kwargs.setdefault("fluence2", 1.3)
+    kwargs.setdefault("voltage", 400)
+    kwargs.setdefault("voltageB", 400)
+    kwargs.setdefault("voltage1", 250)
+    kwargs.setdefault("voltage2", 250)
     acc.setPrivateTools(SensorSimPlanarTool(name, **kwargs))
     return acc
 
@@ -94,6 +104,9 @@ def SensorSim3DToolCfg(flags, name="SensorSim3DTool", **kwargs):
     acc.popToolsAndMerge(PixelLorentzAngleCfg(flags))
     kwargs.setdefault("SiPropertiesTool", SiTool)
     SensorSim3DTool = CompFactory.SensorSim3DTool
+    kwargs.setdefault("doRadDamage", flags.Digitization.DoRadiationDamage)
+    # TODO This is 2018 fluence setting. These parameters should be controlled by the conditions data.
+    kwargs.setdefault("fluence", 6)
     acc.setPrivateTools(SensorSim3DTool(name, **kwargs))
     return acc
 
diff --git a/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSim3DTool.cxx b/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSim3DTool.cxx
index 7d783d4d505..0ac99797f98 100644
--- a/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSim3DTool.cxx
+++ b/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSim3DTool.cxx
@@ -51,35 +51,35 @@ StatusCode SensorSim3DTool::initialize() {
 
   if (!m_doRadDamage) { m_fluence=0; }
 
-  if (m_fluence==1) {
+  if (static_cast<int>(m_fluence)==1) {
     mapsPath_list.push_back(PathResolverFindCalibFile("PixelDigitization/TCAD_IBL_3Dsensors_efields/phi_0_20V.root")); 
     m_fluence_layers.push_back(1e-10);
   }
-  else if (m_fluence==2) {
+  else if (static_cast<int>(m_fluence)==2) {
     mapsPath_list.push_back(PathResolverFindCalibFile("PixelDigitization/TCAD_IBL_3Dsensors_efields/phi_1e14_20V.root"));
     m_fluence_layers.push_back(1e14);
   }
-  else if (m_fluence==3) {
+  else if (static_cast<int>(m_fluence)==3) {
     mapsPath_list.push_back(PathResolverFindCalibFile("PixelDigitization/TCAD_IBL_3Dsensors_efields/phi_2e14_30V.root"));
     m_fluence_layers.push_back(2e14);
   }
-  else if (m_fluence==4) {
+  else if (static_cast<int>(m_fluence)==4) {
     mapsPath_list.push_back(PathResolverFindCalibFile("PixelDigitization/TCAD_IBL_3Dsensors_efields/phi_5e14_40V.root")); 
     m_fluence_layers.push_back(5e14);
   } 
-  else if (m_fluence==5) {
+  else if (static_cast<int>(m_fluence)==5) {
     mapsPath_list.push_back(PathResolverFindCalibFile("PixelDigitization/TCAD_IBL_3Dsensors_efields/phi_1e15_50V.root"));
     m_fluence_layers.push_back(1e15); 
   }
-  else if (m_fluence==6) {
+  else if (static_cast<int>(m_fluence)==6) {
     mapsPath_list.push_back(PathResolverFindCalibFile("PixelDigitization/TCAD_IBL_3Dsensors_efields/phi_5e15_160V.root"));
     m_fluence_layers.push_back(5e15);
   }
-  else if (m_fluence==7) {
+  else if (static_cast<int>(m_fluence)==7) {
     mapsPath_list.push_back(PathResolverFindCalibFile("PixelDigitization/TCAD_IBL_3Dsensors_efields/phi_6e15_190V_new.root"));       
     m_fluence_layers.push_back(6e15);
   }
-  else if (m_fluence==8) {
+  else if (static_cast<int>(m_fluence)==8) {
     mapsPath_list.push_back(PathResolverFindCalibFile("PixelDigitization/TCAD_IBL_3Dsensors_efields/phi_1e16_260V_new.root"));
     m_fluence_layers.push_back(1e16);
   }
diff --git a/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSim3DTool.h b/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSim3DTool.h
index 34a3b8ab120..70b71af3106 100644
--- a/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSim3DTool.h
+++ b/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSim3DTool.h
@@ -80,7 +80,7 @@ class SensorSim3DTool : public SensorSimTool {
     Gaudi::Property<bool> m_doChunkCorrection
     {this, "doChunkCorrection", false, "doChunkCorrection bool: should be flag"};
 
-    Gaudi::Property<int> m_fluence
+    Gaudi::Property<double> m_fluence
     {this, "fluence", 0, "this is the fluence benchmark, 0-6.  0 is unirradiated, 1 is start of Run 2, 5 is end of 2018 and 6 is projected end of 2018"};
 
     Gaudi::Property<double> m_trappingTimeElectrons
diff --git a/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSimPlanarTool.cxx b/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSimPlanarTool.cxx
index 985ac58eebc..df14c3d5aec 100644
--- a/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSimPlanarTool.cxx
+++ b/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSimPlanarTool.cxx
@@ -68,7 +68,7 @@ StatusCode SensorSimPlanarTool::initialize() {
   // For each layer one configuration
   TCADpath_list = {iblFiles, sensorFiles, sensorFiles, sensorFiles};           //IBL - 200um sensor depth, B layer - 20um, layer 1, layer 2
 
-  if (m_fluence==1) {
+  if (static_cast<int>(m_fluence)==1) {
     ATH_MSG_INFO("Use benchmark point 1!");
     mapsPath_list.push_back( PathResolverFindCalibFile("PixelDigitization/maps_IBL_PL_80V_fl0em10.root") );  //IBL  PL - Barrel
     mapsPath_list.push_back( PathResolverFindCalibFile("PixelDigitization/maps_PIX_250V_fl7e13.root") );    //B-Layer - Barrel                                                                                                  
@@ -85,7 +85,7 @@ StatusCode SensorSimPlanarTool::initialize() {
     m_voltage_layers.push_back(150);
     m_voltage_layers.push_back(150);
   }
-  else if (m_fluence==2) {
+  else if (static_cast<int>(m_fluence)==2) {
     ATH_MSG_INFO("Use benchmark point 2!");
 
     mapsPath_list.push_back( PathResolverFindCalibFile("PixelDigitization/maps_IBL_PL_80V_fl1e14.root") );
@@ -103,7 +103,7 @@ StatusCode SensorSimPlanarTool::initialize() {
     m_voltage_layers.push_back(200);
     m_voltage_layers.push_back(150);
   }
-  else if (m_fluence==3) {
+  else if (static_cast<int>(m_fluence)==3) {
     ATH_MSG_INFO("Use benchmark point 3!");
     mapsPath_list.push_back( PathResolverFindCalibFile("PixelDigitization/maps_IBL_PL_80V_fl2e14.root") );
     mapsPath_list.push_back( PathResolverFindCalibFile("PixelDigitization/maps_PIX_350V_fl1_7e14.root") );                                                                                                            
@@ -120,7 +120,7 @@ StatusCode SensorSimPlanarTool::initialize() {
     m_voltage_layers.push_back(200);
     m_voltage_layers.push_back(150);
   }
-  else if (m_fluence==4) {
+  else if (static_cast<int>(m_fluence)==4) {
     ATH_MSG_INFO("Use benchmark point 4!");
 
     mapsPath_list.push_back(  PathResolverFindCalibFile("PixelDigitization/maps_IBL_PL_150V_fl2e14.root") );
@@ -138,7 +138,7 @@ StatusCode SensorSimPlanarTool::initialize() {
     m_voltage_layers.push_back(200);
     m_voltage_layers.push_back(150);
   }
-  else if (m_fluence==5) {
+  else if (static_cast<int>(m_fluence)==5) {
     ATH_MSG_INFO("Use benchmark point 5!");
 
     mapsPath_list.push_back( PathResolverFindCalibFile("PixelDigitization/maps_IBL_PL_350V_fl5e14.root") );
@@ -156,7 +156,7 @@ StatusCode SensorSimPlanarTool::initialize() {
     m_voltage_layers.push_back(200);
     m_voltage_layers.push_back(150);
   }
-  else if (m_fluence==6) {
+  else if (static_cast<int>(m_fluence)==6) {
     ATH_MSG_INFO("Use benchmark point 6!");
 
     mapsPath_list.push_back( PathResolverFindCalibFile("PixelDigitization/maps_IBL_400V_fl8_7e14.root") );
@@ -174,7 +174,7 @@ StatusCode SensorSimPlanarTool::initialize() {
     m_voltage_layers.push_back(250);
     m_voltage_layers.push_back(250);
   }
-  else if (m_fluence==7) {
+  else if (static_cast<int>(m_fluence)==7) {
     ATH_MSG_INFO("Use benchmark point 7!");
 
     mapsPath_list.push_back( PathResolverFindCalibFile("PixelDigitization/maps_IBL_endLHC.root") );
diff --git a/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSimPlanarTool.h b/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSimPlanarTool.h
index 2afbac5510d..3db9f5b5e22 100644
--- a/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSimPlanarTool.h
+++ b/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSimPlanarTool.h
@@ -62,16 +62,16 @@ class SensorSimPlanarTool : public SensorSimTool {
     Gaudi::Property<double> m_trappingTimeHoles
     {this, "trappingTimeHoles", 0.0, "Characteristic time till hole is trapped [ns]"};
 
-    Gaudi::Property<int> m_fluence
+    Gaudi::Property<double> m_fluence
     {this, "fluence", 0, "this is the fluence benchmark, 0-6. 0 is unirradiated, 1 is start of Run 2, 5 is end of 2018 and 6 is projected end of 2018"};
 
-    Gaudi::Property<int> m_fluenceB
+    Gaudi::Property<double> m_fluenceB
     {this, "fluenceB", -1, "fluence detector has recieved in neqcm2 at the B layer."};
 
-    Gaudi::Property<int> m_fluence1
+    Gaudi::Property<double> m_fluence1
     {this, "fluence1", -1, "fluence detector has recieved in neqcm2 at the layer 1."};
 
-    Gaudi::Property<int> m_fluence2
+    Gaudi::Property<double> m_fluence2
     {this, "fluence2", -1, "fluence detector has recieved in neqcm2 at the layer 2."};
 
     Gaudi::Property<double> m_voltage
diff --git a/Simulation/Digitization/python/DigiAlgConfig.py b/Simulation/Digitization/python/DigiAlgConfig.py
index f40254bc552..73cd7cb4c84 100644
--- a/Simulation/Digitization/python/DigiAlgConfig.py
+++ b/Simulation/Digitization/python/DigiAlgConfig.py
@@ -118,8 +118,6 @@ def getStandardInDetPileUpTools():
             PileUpToolsList += [ "PixelLightDigitizationTool" ]
         elif 'doSmearedPixelDigi' in digitizationFlags.experimentalDigi():
             PileUpToolsList += [ "PixelSmearedDigitizationTool" ]
-        elif digitizationFlags.doRadiationDamage():
-            PileUpToolsList += [ "PixelRadDamDigitizationTool" ]
         else:
             PileUpToolsList += [ "PixelDigitizationTool" ]
     if DetFlags.digitize.SCT_on():
diff --git a/Simulation/Digitization/python/DigitizationConfigFlags.py b/Simulation/Digitization/python/DigitizationConfigFlags.py
index feab44fe382..8c37d85be85 100644
--- a/Simulation/Digitization/python/DigitizationConfigFlags.py
+++ b/Simulation/Digitization/python/DigitizationConfigFlags.py
@@ -95,6 +95,9 @@ def createDigitizationCfgFlags():
     # Override the HIT file Run Number with one from a data run
     flags.addFlag("Digitization.DataRunNumber", -1)
     
+    # Run radiation damage simulation
+    flags.addFlag("Digitization.DoRadiationDamage", False)
+    
     # for PileUp digitization
     # Beam Halo input collections
     flags.addFlag("Digitization.PU.BeamHaloInputCols", [])
-- 
GitLab