diff --git a/Tracker/TrackerDigitization/FaserSCT_Digitization/python/FaserSCT_DigitizationConfig.py b/Tracker/TrackerDigitization/FaserSCT_Digitization/python/FaserSCT_DigitizationConfig.py new file mode 100644 index 0000000000000000000000000000000000000000..42b92ef195088b1390cbae4fd21e455f02d1151b --- /dev/null +++ b/Tracker/TrackerDigitization/FaserSCT_Digitization/python/FaserSCT_DigitizationConfig.py @@ -0,0 +1,297 @@ +# Copyright (C) 2002-2019 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(): + return -50 +# The latest bunch crossing time for which interactions will be sent +# to the SCT Digitization code. +def SCT_LastXing(): + return 25 + + + +###################################################################################### +def getSCT_RandomDisabledCellGenerator(name="SCT_RandomDisabledCellGenerator", **kwargs): + kwargs.setdefault("TotalBadChannels", 0.01) + from FaserSCT_Digitization.FaserSCT_DigitizationConf import SCT_RandomDisabledCellGenerator + return SCT_RandomDisabledCellGenerator(name, **kwargs) + + +###################################################################################### +def getSCT_Amp(name="SCT_Amp", **kwargs): + kwargs.setdefault("CrossFactor2sides", 0.1) + kwargs.setdefault("CrossFactorBack", 0.07) + kwargs.setdefault("PeakTime", 21) + kwargs.setdefault("deltaT", 1.0) + kwargs.setdefault("Tmin", -25.0) + kwargs.setdefault("Tmax", 150.0) + from FaserSCT_Digitization.FaserSCT_DigitizationConf import SCT_Amp + return SCT_Amp(name, **kwargs) + + +###################################################################################### +def getSCT_SurfaceChargesGenerator(name="SCT_SurfaceChargesGenerator", **kwargs): + ## Set up services used by SCT_SurfaceChargesGenerator + # Set up SCT_DCSConditiosnTool + from SCT_ConditionsTools.SCT_DCSConditionsToolSetup import SCT_DCSConditionsToolSetup + sct_DCSConditionsToolSetup = SCT_DCSConditionsToolSetup() + sct_DCSConditionsToolSetup.setup() + # Set up SCT_SiliconConditionsTool + from SCT_ConditionsTools.SCT_SiliconConditionsToolSetup import SCT_SiliconConditionsToolSetup + sct_SiliconConditionsToolSetup = SCT_SiliconConditionsToolSetup() + sct_SiliconConditionsToolSetup.setDcsTool(sct_DCSConditionsToolSetup.getTool()) + sct_SiliconConditionsToolSetup.setup() + # Set up SCT_SiPropertiesTool + from SiPropertiesTool.SCT_SiPropertiesToolSetup import SCT_SiPropertiesToolSetup + sct_SiPropertiesToolSetup = SCT_SiPropertiesToolSetup() + sct_SiPropertiesToolSetup.setSiliconTool(sct_SiliconConditionsToolSetup.getTool()) + sct_SiPropertiesToolSetup.setup() + ## Charge trapping tool - used by SCT_SurfaceChargesGenerator + from AthenaCommon.AppMgr import ToolSvc + ## SiLorentzAngleTool for SCT_SurfaceChargesGenerator + from SiLorentzAngleTool.SCTLorentzAngleToolSetup import SCTLorentzAngleToolSetup + sctLorentzAngleToolSetup = SCTLorentzAngleToolSetup() + + kwargs.setdefault("FixedTime", -999) + kwargs.setdefault("SubtractTime", -999) + kwargs.setdefault("SurfaceDriftTime", 10) + kwargs.setdefault("NumberOfCharges", 1) + kwargs.setdefault("SmallStepLength", 5) + kwargs.setdefault("DepletionVoltage", 70) + kwargs.setdefault("BiasVoltage", 150) + kwargs.setdefault("SiPropertiesTool", sct_SiPropertiesToolSetup.getTool()) + kwargs.setdefault("LorentzAngleTool", sctLorentzAngleToolSetup.SCTLorentzAngleTool) + from AthenaCommon.GlobalFlags import globalflags + kwargs.setdefault("isOverlay", globalflags.isOverlay()) + + # kwargs.setdefault("doTrapping", True) # ATL-INDET-INT-2016-019 + + from Digitization.DigitizationFlags import digitizationFlags + if 'doDetailedSurfChargesGen' in digitizationFlags.experimentalDigi(): + kwargs.setdefault("ChargeDriftModel", 1) + kwargs.setdefault("EFieldModel", 2) + kwargs.setdefault("MagneticField", -2.0) + kwargs.setdefault("SensorTemperature", 273.15) + kwargs.setdefault("TransportTimeStep", 0.25) + kwargs.setdefault("TransportTimeMax", 25.0) + from FaserSCT_Digitization.FaserSCT_DigitizationConf import SCT_DetailedSurfaceChargesGenerator + return SCT_DetailedSurfaceChargesGenerator(name, **kwargs) + else: + from SCT_ConditionsTools.SCT_ConditionsToolsConf import SCT_RadDamageSummaryTool + kwargs.setdefault("RadDamageSummaryTool", SCT_RadDamageSummaryTool(name = "InDetSCT_RadDamageSummaryTool")) + from FaserSCT_Digitization.FaserSCT_DigitizationConf import SCT_SurfaceChargesGenerator + return SCT_SurfaceChargesGenerator(name, **kwargs) + +###################################################################################### +def getSCT_FrontEnd(name="SCT_FrontEnd", **kwargs): + from Digitization.DigitizationFlags import digitizationFlags + #Setup noise treament in SCT_FrontEnd + # To set the mean noise values for the different module types + # Default values set at 0 degrees, plus/minus ~5 enc per plus/minus degree + kwargs.setdefault("NoiseBarrel", 1500.0) + kwargs.setdefault("NoiseBarrel3", 1541.0) + kwargs.setdefault("NoiseInners", 1090.0) + kwargs.setdefault("NoiseMiddles", 1557.0) + kwargs.setdefault("NoiseShortMiddles", 940.0) + kwargs.setdefault("NoiseOuters", 1618.0) + kwargs.setdefault("NOBarrel", 1.5e-5) + kwargs.setdefault("NOBarrel3", 2.1e-5) + kwargs.setdefault("NOInners", 5.0e-9) + kwargs.setdefault("NOMiddles", 2.7e-5) + kwargs.setdefault("NOShortMiddles", 2.0e-9) + kwargs.setdefault("NOOuters", 3.5e-5) + # If noise is turned off: + if not digitizationFlags.doInDetNoise.get_Value(): + ###kwargs.setdefault("OnlyHitElements", True) + print('SCT_Digitization:::: Turned off Noise in SCT_FrontEnd') + kwargs.setdefault("NoiseOn", False) + kwargs.setdefault("AnalogueNoiseOn", False) + else: + kwargs.setdefault("NoiseOn", True) + kwargs.setdefault("AnalogueNoiseOn", True) + # In overlay MC, only analogue noise is on. Noise hits are not added. + from AthenaCommon.GlobalFlags import globalflags + if globalflags.isOverlay() and globalflags.DataSource == 'geant4': + kwargs["NoiseOn"] = False + kwargs["AnalogueNoiseOn"] = True + # Use Calibration data from Conditions DB, still for testing purposes only + kwargs.setdefault("UseCalibData", True) + + # Setup the ReadCalibChip folders and Svc + from SCT_ConditionsTools.SCT_ReadCalibChipDataToolSetup import SCT_ReadCalibChipDataToolSetup + sct_ReadCalibChipDataToolSetup = SCT_ReadCalibChipDataToolSetup() + sct_ReadCalibChipDataToolSetup.setup() + kwargs.setdefault("SCT_ReadCalibChipDataTool", sct_ReadCalibChipDataToolSetup.getTool()) + # DataCompressionMode: 1 is level mode x1x (default), 2 is edge mode 01x, 3 is expanded any hit xxx + from AthenaCommon.BeamFlags import jobproperties + if digitizationFlags.PileUpPremixing: + kwargs.setdefault("DataCompressionMode", 3) + elif globalflags.isOverlay() and globalflags.DataSource == 'geant4': + kwargs.setdefault("DataCompressionMode", 2) + elif (jobproperties.Beam.bunchSpacing() <= 50): + kwargs.setdefault("DataCompressionMode", 1) + else: + kwargs.setdefault("DataCompressionMode", 3) + # DataReadOutMode: 0 is condensed mode and 1 is expanded mode + if globalflags.isOverlay() and globalflags.DataSource == 'geant4': + kwargs.setdefault("DataReadOutMode", 0) + else: + kwargs.setdefault("DataReadOutMode", 1) + from FaserSCT_Digitization.FaserSCT_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) + +###################################################################################### + + +def commonSCT_DigitizationConfig(name,**kwargs): + + from Digitization.DigitizationFlags import digitizationFlags + # If noise is turned off: + if not digitizationFlags.doInDetNoise.get_Value(): + kwargs.setdefault("OnlyHitElements", True) + + kwargs.setdefault("InputObjectName", "SCT_Hits") + kwargs.setdefault("EnableHits", True) + kwargs.setdefault("BarrelOnly", False) + + # Use of random disabled cells + #kwargs.setdefault("RandomDisabledCells", True) + + # Set FixedTime for cosmics for use in SurfaceChargesGenerator + from AthenaCommon.BeamFlags import jobproperties + if jobproperties.Beam.beamType == "cosmics" : + kwargs.setdefault("CosmicsRun", True) + kwargs.setdefault("FixedTime", 10) + + # write out SCT1_RawData + #kwargs.setdefault("WriteSCT1_RawData", False) + + if digitizationFlags.doXingByXingPileUp(): + kwargs.setdefault("FirstXing", SCT_FirstXing()) + kwargs.setdefault("LastXing", SCT_LastXing() ) + + from AthenaCommon import CfgMgr + return CfgMgr.SCT_DigitizationTool(name,**kwargs) +# else: +# from AthenaCommon import CfgMgr +# return CfgMgr.SCT_Digitization(name, **kwargs) + +###################################################################################### + +def SCT_DigitizationTool(name="SCT_DigitizationTool", **kwargs): + from Digitization.DigitizationFlags import digitizationFlags + if digitizationFlags.PileUpPremixing and 'OverlayMT' in digitizationFlags.experimentalDigi(): + from OverlayCommonAlgs.OverlayFlags import overlayFlags + kwargs.setdefault("OutputObjectName", overlayFlags.bkgPrefix() + "SCT_RDOs") + kwargs.setdefault("OutputSDOName", overlayFlags.bkgPrefix() + "SCT_SDO_Map") + else: + kwargs.setdefault("OutputObjectName", "SCT_RDOs") + kwargs.setdefault("OutputSDOName", "SCT_SDO_Map") + + kwargs.setdefault("HardScatterSplittingMode", 0) + return commonSCT_DigitizationConfig(name,**kwargs) + +###################################################################################### + +def SCT_GeantinoTruthDigitizationTool(name="SCT_GeantinoTruthDigitizationTool", **kwargs): + kwargs.setdefault("ParticleBarcodeVeto", 0) + return SCT_DigitizationTool(name,**kwargs) + +###################################################################################### + +def SCT_DigitizationToolHS(name="SCT_DigitizationToolHS",**kwargs): + kwargs.setdefault("OutputObjectName", "SCT_RDOs") + kwargs.setdefault("OutputSDOName", "SCT_SDO_Map") + kwargs.setdefault("HardScatterSplittingMode", 1) + return commonSCT_DigitizationConfig(name,**kwargs) + +###################################################################################### + +def SCT_DigitizationToolPU(name="SCT_DigitizationToolPU",**kwargs): + kwargs.setdefault("OutputObjectName", "SCT_PU_RDOs") + kwargs.setdefault("OutputSDOName", "SCT_PU_SDO_Map") + kwargs.setdefault("HardScatterSplittingMode", 2) + return commonSCT_DigitizationConfig(name,**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): + from OverlayCommonAlgs.OverlayFlags import overlayFlags + if overlayFlags.isOverlayMT(): + kwargs.setdefault("OnlyUseContainerName", False) + kwargs.setdefault("OutputObjectName", overlayFlags.sigPrefix() + "SCT_RDOs") + kwargs.setdefault("OutputSDOName", overlayFlags.sigPrefix() + "SCT_SDO_Map") + else: + kwargs.setdefault("OutputObjectName", overlayFlags.evtStore() + "+SCT_RDOs") + kwargs.setdefault("OutputSDOName", overlayFlags.evtStore() + "+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"] ) + return CfgMgr.PileUpXingFolder(name, **kwargs) + +###################################################################################### + +def SCT_DigitizationHS(name="SCT_DigitizationHS",**kwargs): + kwargs.setdefault("DigitizationTool", "SCT_DigitizationToolHS") + from FaserSCT_Digitization.FaserSCT_DigitizationConf import SCT_Digitization + return SCT_Digitization(name,**kwargs) + +###################################################################################### + +def SCT_DigitizationPU(name="SCT_DigitizationPU",**kwargs): + kwargs.setdefault("DigitizationTool", "SCT_DigitizationToolPU") + return CfgMgr.SCT_Digitization(name,**kwargs) + +###################################################################################### + +def SCT_OverlayDigitization(name="SCT_OverlayDigitization",**kwargs): + kwargs.setdefault("DigitizationTool", "SCT_OverlayDigitizationTool") + # Multi-threading settinggs + from AthenaCommon.ConcurrencyFlags import jobproperties as concurrencyProps + is_hive = (concurrencyProps.ConcurrencyFlags.NumThreads() > 0) + if is_hive: + kwargs.setdefault('Cardinality', concurrencyProps.ConcurrencyFlags.NumThreads()) + + return CfgMgr.SCT_Digitization(name,**kwargs) diff --git a/Tracker/TrackerDigitization/FaserSCT_Digitization/python/FaserSCT_DigitizationConfigDb.py b/Tracker/TrackerDigitization/FaserSCT_Digitization/python/FaserSCT_DigitizationConfigDb.py new file mode 100644 index 0000000000000000000000000000000000000000..11d8480f3c69a0e2c8e0b93a1844e522b24443e1 --- /dev/null +++ b/Tracker/TrackerDigitization/FaserSCT_Digitization/python/FaserSCT_DigitizationConfigDb.py @@ -0,0 +1,18 @@ +# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + +from AthenaCommon.CfgGetter import addTool,addService,addAlgorithm +addTool("FaserSCT_Digitization.FaserSCT_DigitizationConfig.SCT_DigitizationTool" , "SCT_DigitizationTool") +addTool("FaserSCT_Digitization.FaserSCT_DigitizationConfig.SCT_GeantinoTruthDigitizationTool" , "SCT_GeantinoTruthDigitizationTool") +addTool("FaserSCT_Digitization.FaserSCT_DigitizationConfig.SCT_DigitizationToolHS" , "SCT_DigitizationToolHS") +addTool("FaserSCT_Digitization.FaserSCT_DigitizationConfig.SCT_DigitizationToolPU" , "SCT_DigitizationToolPU") +addTool("FaserSCT_Digitization.FaserSCT_DigitizationConfig.SCT_DigitizationToolSplitNoMergePU", "SCT_DigitizationToolSplitNoMergePU") +addAlgorithm("FaserSCT_Digitization.FaserSCT_DigitizationConfig.SCT_DigitizationHS" , "SCT_DigitizationHS") +addAlgorithm("FaserSCT_Digitization.FaserSCT_DigitizationConfig.SCT_DigitizationPU" , "SCT_DigitizationPU") +addTool("FaserSCT_Digitization.FaserSCT_DigitizationConfig.getSiliconRange" , "SiliconRange" ) +addTool("FaserSCT_Digitization.FaserSCT_DigitizationConfig.getSCT_RandomDisabledCellGenerator", "SCT_RandomDisabledCellGenerator") +addTool("FaserSCT_Digitization.FaserSCT_DigitizationConfig.getSCT_Amp", "SCT_Amp" ) +addTool("FaserSCT_Digitization.FaserSCT_DigitizationConfig.getSCT_FrontEnd" , "SCT_FrontEnd" ) +addTool("FaserSCT_Digitization.FaserSCT_DigitizationConfig.getPileupSCT_FrontEnd" , "PileupSCT_FrontEnd" ) +addTool("FaserSCT_Digitization.FaserSCT_DigitizationConfig.getSCT_SurfaceChargesGenerator", "SCT_SurfaceChargesGenerator" ) +addTool("FaserSCT_Digitization.FaserSCT_DigitizationConfig.SCT_OverlayDigitizationTool", "SCT_OverlayDigitizationTool") +addAlgorithm("FaserSCT_Digitization.FaserSCT_DigitizationConfig.SCT_OverlayDigitization", "SCT_OverlayDigitization") diff --git a/Tracker/TrackerDigitization/FaserSCT_Digitization/python/FaserSCT_DigitizationConfigNew.py b/Tracker/TrackerDigitization/FaserSCT_Digitization/python/FaserSCT_DigitizationConfigNew.py new file mode 100644 index 0000000000000000000000000000000000000000..4bb87778f35cf5c57b48fc7068d0b5807a4dc6b7 --- /dev/null +++ b/Tracker/TrackerDigitization/FaserSCT_Digitization/python/FaserSCT_DigitizationConfigNew.py @@ -0,0 +1,304 @@ +"""Define methods to construct configured SCT Digitization tools and algorithms + +Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +""" +from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator +from AthenaConfiguration.ComponentFactory import CompFactory +from AthenaCommon.Logging import logging +from FaserSCT_Digitization.FaserSCT_DigitizationConf import ( + SCT_RandomDisabledCellGenerator, + SCT_Amp, + SCT_SurfaceChargesGenerator, + SCT_FrontEnd, + SCT_DigitizationTool, + SCT_Digitization, +) +PileUpXingFolder=CompFactory.PileUpXingFolder +from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg +#SCT_RadDamageSummaryTool=CompFactory.SCT_RadDamageSummaryTool +from FaserSCT_GeoModel.FaserSCT_GeoModelConfig import FaserSCT_GeometryCfg +#from SCT_ConditionsTools.SCT_DCSConditionsConfig import SCT_DCSConditionsCfg +#from SCT_ConditionsTools.SCT_SiliconConditionsConfig import SCT_SiliconConditionsToolCfg, SCT_SiliconConditionsCfg +#from SCT_ConditionsTools.SCT_ReadCalibChipDataConfig import SCT_ReadCalibChipDataCfg +from SiPropertiesTool.SCT_SiPropertiesConfig import SCT_SiPropertiesCfg +from SiLorentzAngleTool.SCT_LorentzAngleConfig import SCT_LorentzAngleCfg +from Digitization.TruthDigitizationOutputConfig import TruthDigitizationOutputCfg +from Digitization.PileUpToolsConfig import PileUpToolsCfg + + +# The earliest and last bunch crossing times for which interactions will be sent +# to the SCT Digitization code +def SCT_FirstXing(): + return -50 + + +def SCT_LastXing(): + return 25 + + +def SCT_DigitizationCommonCfg(flags, name="SCT_DigitizationToolCommon", **kwargs): + """Return ComponentAccumulator with common SCT digitization tool config""" + acc = FaserSCT_GeometryCfg(flags) + if not flags.Digitization.DoInnerDetectorNoise: + kwargs.setdefault("OnlyHitElements", True) + kwargs.setdefault("InputObjectName", "SCT_Hits") + kwargs.setdefault("EnableHits", True) + #kwargs.setdefault("BarrelOnly", False) + # Set FixedTime for cosmics for use in SurfaceChargesGenerator + if flags.Beam.Type == "cosmics": + kwargs.setdefault("CosmicsRun", True) + kwargs.setdefault("FixedTime", 10) + if flags.Digitization.DoXingByXingPileUp: + kwargs.setdefault("FirstXing", SCT_FirstXing()) + kwargs.setdefault("LastXing", SCT_LastXing() ) + tool = SCT_DigitizationTool(name, **kwargs) + # attach ToolHandles + tool.FrontEnd = acc.popToolsAndMerge(SCT_FrontEndCfg(flags)) + tool.SurfaceChargesGenerator = acc.popToolsAndMerge(SCT_SurfaceChargesGeneratorCfg(flags)) + tool.RandomDisabledCellGenerator = SCT_RandomDisabledCellGeneratorCfg(flags) + acc.setPrivateTools(tool) + return acc + + +def SCT_DigitizationToolCfg(flags, name="SCT_DigitizationTool", **kwargs): + """Return ComponentAccumulator with configured SCT digitization tool""" + if flags.Digitization.PileUpPremixing: + kwargs.setdefault("OutputObjectName", flags.Overlay.BkgPrefix + "SCT_RDOs") + kwargs.setdefault("OutputSDOName", flags.Overlay.BkgPrefix + "SCT_SDO_Map") + else: + kwargs.setdefault("OutputObjectName", "SCT_RDOs") + kwargs.setdefault("OutputSDOName", "SCT_SDO_Map") + #kwargs.setdefault("HardScatterSplittingMode", 0) + return SCT_DigitizationCommonCfg(flags, name, **kwargs) + + +def SCT_DigitizationHSToolCfg(flags, name="SCT_DigitizationHSTool", **kwargs): + """Return ComponentAccumulator with hard scatter configured SCT digitization tool""" + kwargs.setdefault("OutputObjectName", "SCT_RDOs") + kwargs.setdefault("OutputSDOName", "SCT_SDO_Map") + #kwargs.setdefault("HardScatterSplittingMode", 1) + return SCT_DigitizationCommonCfg(flags, name, **kwargs) + + +def SCT_DigitizationPUToolCfg(flags, name="SCT_DigitizationPUTool",**kwargs): + """Return ComponentAccumulator with pileup configured SCT digitization tool""" + kwargs.setdefault("OutputObjectName", "SCT_PU_RDOs") + kwargs.setdefault("OutputSDOName", "SCT_PU_SDO_Map") + #kwargs.setdefault("HardScatterSplittingMode", 2) + return SCT_DigitizationCommonCfg(flags, name, **kwargs) + + +def SCT_OverlayDigitizationToolCfg(flags, name="SCT_OverlayDigitizationTool",**kwargs): + """Return ComponentAccumulator with overlay configured SCT digitization tool""" + acc = ComponentAccumulator() + kwargs.setdefault("OnlyUseContainerName", False) + kwargs.setdefault("OutputObjectName", "StoreGateSvc+" + flags.Overlay.SigPrefix + "SCT_RDOs") + kwargs.setdefault("OutputSDOName", "StoreGateSvc+" + flags.Overlay.SigPrefix + "SCT_SDO_Map") + #kwargs.setdefault("HardScatterSplittingMode", 0) + tool = acc.popToolsAndMerge(SCT_DigitizationCommonCfg(flags, name, **kwargs)) + acc.setPrivateTools(tool) + return acc + + +def SCT_DigitizationToolSplitNoMergePUCfg(flags, name="SCT_DigitizationToolSplitNoMergePU",**kwargs): + """Return ComponentAccumulator with merged pileup configured SCT digitization tool""" + 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 SCT_DigitizationCommonCfg(flags, name, **kwargs) + + +def SCT_DigitizationToolGeantinoTruthCfg(flags, name="SCT_GeantinoTruthDigitizationTool", **kwargs): + """Return Geantino truth configured digitization tool""" + kwargs.setdefault("ParticleBarcodeVeto", 0) + return SCT_DigitizationToolCfg(flags, name, **kwargs) + + +def SCT_RandomDisabledCellGeneratorCfg(flags, name="SCT_RandomDisabledCellGenerator", **kwargs): + """Return configured random cell disabling tool""" + kwargs.setdefault("TotalBadChannels", 0.01) + return SCT_RandomDisabledCellGenerator(name, **kwargs) + + +def SCT_AmpCfg(flags, name="SCT_Amp", **kwargs): + """Return configured amplifier and shaper tool""" + kwargs.setdefault("CrossFactor2sides", 0.1) + kwargs.setdefault("CrossFactorBack", 0.07) + kwargs.setdefault("PeakTime", 21) + kwargs.setdefault("deltaT", 1.0) + kwargs.setdefault("Tmin", -25.0) + kwargs.setdefault("Tmax", 150.0) + return SCT_Amp(name, **kwargs) + + +def SCT_SurfaceChargesGeneratorCfg(flags, name="SCT_SurfaceChargesGenerator", **kwargs): + """Return ComponentAccumulator with configured surface charges tool""" + acc = ComponentAccumulator() + kwargs.setdefault("FixedTime", -999) + kwargs.setdefault("SubtractTime", -999) + kwargs.setdefault("SurfaceDriftTime", 10) + kwargs.setdefault("NumberOfCharges", 1) + kwargs.setdefault("SmallStepLength", 5) + kwargs.setdefault("DepletionVoltage", 70) + kwargs.setdefault("BiasVoltage", 150) + kwargs.setdefault("isOverlay", flags.Detector.Overlay) + # kwargs.setdefault("doTrapping", True) # ATL-INDET-INT-2016-019 + # experimental SCT_DetailedSurfaceChargesGenerator config dropped here + tool = SCT_SurfaceChargesGenerator(name, **kwargs) + #tool.RadDamageSummaryTool = SCT_RadDamageSummaryTool() + #DCSCondTool = acc.popToolsAndMerge(SCT_DCSConditionsCfg(flags)) + SiliCondTool = SCT_SiliconConditionsToolCfg(flags) + #SiliCondAcc = SCT_SiliconConditionsCfg(flags, DCSConditionsTool=DCSCondTool) + SiliPropsAcc = SCT_SiPropertiesCfg(flags, SiConditionsTool=SiliCondTool) + #acc.merge(SiliCondAcc) + tool.SiConditionsTool = SiliCondTool + tool.SiPropertiesTool = acc.popToolsAndMerge(SiliPropsAcc) + tool.LorentzAngleTool = acc.popToolsAndMerge(SCT_LorentzAngleCfg(flags)) + acc.setPrivateTools(tool) + return acc + + +def SCT_FrontEndCfg(flags, name="SCT_FrontEnd", **kwargs): + """Return ComponentAccumulator with configured front-end electronics tool""" + # Setup noise treament in SCT_FrontEnd + # To set the mean noise values for the different module types + # Default values set at 0 degrees, plus/minus ~5 enc per plus/minus degree + kwargs.setdefault("NoiseBarrel", 1500.0) + kwargs.setdefault("NoiseBarrel3", 1541.0) + kwargs.setdefault("NoiseInners", 1090.0) + kwargs.setdefault("NoiseMiddles", 1557.0) + kwargs.setdefault("NoiseShortMiddles", 940.0) + kwargs.setdefault("NoiseOuters", 1618.0) + kwargs.setdefault("NOBarrel", 1.5e-5) + kwargs.setdefault("NOBarrel3", 2.1e-5) + kwargs.setdefault("NOInners", 5.0e-9) + kwargs.setdefault("NOMiddles", 2.7e-5) + kwargs.setdefault("NOShortMiddles", 2.0e-9) + kwargs.setdefault("NOOuters", 3.5e-5) + if not flags.Digitization.DoInnerDetectorNoise: + log = logging.getLogger("SCT_FrontEndCfg") + log.info("SCT_Digitization:::: Turned off Noise in SCT_FrontEnd") + kwargs.setdefault("NoiseOn", False) + kwargs.setdefault("AnalogueNoiseOn", False) + else: + kwargs.setdefault("NoiseOn", True) + kwargs.setdefault("AnalogueNoiseOn", True) + # In overlay MC, only analogue noise is on. Noise hits are not added. + if flags.Detector.Overlay and flags.Input.isMC: + kwargs["NoiseOn"] = False + kwargs["AnalogueNoiseOn"] = True + # Use Calibration data from Conditions DB, still for testing purposes only + kwargs.setdefault("UseCalibData", True) + # Setup the ReadCalibChip folders and Svc + acc = SCT_ReadCalibChipDataCfg(flags) + kwargs.setdefault("SCT_ReadCalibChipDataTool", acc.popPrivateTools()) + # DataCompressionMode: 1 is level mode x1x (default), 2 is edge mode 01x, 3 is expanded any hit xxx + if flags.Digitization.PileUpPremixing: + kwargs.setdefault("DataCompressionMode", 3) + elif flags.Detector.Overlay and flags.Input.isMC: + kwargs.setdefault("DataCompressionMode", 2) + elif flags.Beam.BunchSpacing <= 50: + kwargs.setdefault("DataCompressionMode", 1) + else: + kwargs.setdefault("DataCompressionMode", 3) + # DataReadOutMode: 0 is condensed mode and 1 is expanded mode + if flags.Detector.Overlay and flags.Input.isMC: + kwargs.setdefault("DataReadOutMode", 0) + else: + kwargs.setdefault("DataReadOutMode", 1) + acc.setPrivateTools(SCT_FrontEnd(name, **kwargs)) + return acc + + +def SCT_FrontEndPileupCfg(flags, name="PileupSCT_FrontEnd", **kwargs): + """Return ComponentAccumulator with pileup-configured front-end electronics tool""" + 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 SCT_FrontEndCfg(flags, name, **kwargs) + +def SCT_RangeCfg(flags, name="SiliconRange", **kwargs): + """Return an SCT configured PileUpXingFolder tool""" + kwargs.setdefault("FirstXing", SCT_FirstXing()) + kwargs.setdefault("LastXing", SCT_LastXing()) + kwargs.setdefault("CacheRefreshFrequency", 1.0) # default 0 no dataproxy reset + kwargs.setdefault("ItemList", ["FaserSiHitCollection#SCT_Hits"] ) + return PileUpXingFolder(name, **kwargs) + + +def SCT_OutputCfg(flags): + """Return ComponentAccumulator with Output for SCT. Not standalone.""" + acc = ComponentAccumulator() + ItemList = ["SCT_RDO_Container#*"] + if flags.Digitization.TruthOutput: + ItemList += ["InDetSimDataCollection#*"] + acc.merge(TruthDigitizationOutputCfg(flags)) + acc.merge(OutputStreamCfg(flags, "RDO", ItemList)) + return acc + + +def SCT_DigitizationBasicCfg(flags, **kwargs): + """Return ComponentAccumulator for SCT digitization""" + acc = ComponentAccumulator() + if "PileUpTools" not in kwargs: + PileUpTools = acc.popToolsAndMerge(SCT_DigitizationToolCfg(flags)) + kwargs["PileUpTools"] = PileUpTools + acc.merge(PileUpToolsCfg(flags, **kwargs)) + return acc + + +def SCT_OverlayDigitizationBasicCfg(flags, **kwargs): + """Return ComponentAccumulator with SCT Overlay digitization""" + acc = ComponentAccumulator() + if "DigitizationTool" not in kwargs: + tool = acc.popToolsAndMerge(SCT_OverlayDigitizationToolCfg(flags)) + kwargs["DigitizationTool"] = tool + acc.addEventAlgo(SCT_Digitization(**kwargs)) + return acc + + +# with output defaults +def SCT_DigitizationCfg(flags, **kwargs): + """Return ComponentAccumulator for SCT digitization and Output""" + acc = SCT_DigitizationBasicCfg(flags, **kwargs) + acc.merge(SCT_OutputCfg(flags)) + return acc + + +def SCT_OverlayDigitizationCfg(flags, **kwargs): + """Return ComponentAccumulator with SCT Overlay digitization and Output""" + acc = SCT_OverlayDigitizationBasicCfg(flags, **kwargs) + acc.merge(SCT_OutputCfg(flags)) + return acc + + +# additional specialisations +def SCT_DigitizationHSCfg(flags, name="SCT_DigitizationHS", **kwargs): + """Return ComponentAccumulator for Hard-Scatter-only SCT digitization and Output""" + acc = SCT_DigitizationHSToolCfg(flags) + kwargs["PileUpTools"] = acc.popPrivateTools() + acc = SCT_DigitizationBasicCfg(flags, name=name, **kwargs) + acc.merge(SCT_OutputCfg(flags)) + return acc + + +def SCT_DigitizationPUCfg(flags, name="SCT_DigitizationPU", **kwargs): + """Return ComponentAccumulator with Pile-up-only SCT digitization and Output""" + acc = SCT_DigitizationPUToolCfg(flags) + kwargs["PileUpTools"] = acc.popPrivateTools() + acc = SCT_DigitizationBasicCfg(flags, name=name, **kwargs) + acc.merge(SCT_OutputCfg(flags)) + return acc diff --git a/Tracker/TrackerDigitization/FaserSCT_Digitization/test/SCT_DigitizationConfigNew_test.py b/Tracker/TrackerDigitization/FaserSCT_Digitization/test/SCT_DigitizationConfigNew_test.py new file mode 100644 index 0000000000000000000000000000000000000000..4fbd20f575761bc28029c4139df6b5cbd4abd382 --- /dev/null +++ b/Tracker/TrackerDigitization/FaserSCT_Digitization/test/SCT_DigitizationConfigNew_test.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python +"""Run tests on SCT_DigitizationConfigNew.py + +Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +""" +from AthenaCommon.Logging import log +from AthenaCommon.Constants import DEBUG +from AthenaCommon.Configurable import Configurable +from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator +from AthenaConfiguration.AllConfigFlags import ConfigFlags +from AthenaConfiguration.MainServicesConfig import MainServicesSerialCfg +from AthenaConfiguration.TestDefaults import defaultTestFiles +from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg +from AtlasGeoModel.InDetGMConfig import InDetGeometryCfg +from FaserSCT_Digitization.FaserSCT_DigitizationConfigNew import SCT_DigitizationHSCfg + +# Set up logging and new style config +log.setLevel(DEBUG) +Configurable.configurableRun3Behavior = True +# Configure +ConfigFlags.Input.Files = defaultTestFiles.HITS +ConfigFlags.IOVDb.GlobalTag = "OFLCOND-MC16-SDR-16" +ConfigFlags.GeoModel.Align.Dynamic = False +ConfigFlags.Concurrency.NumThreads = 1 +ConfigFlags.lock() +# Construct our accumulator to run +acc = MainServicesSerialCfg() +acc.merge(PoolReadCfg(ConfigFlags)) +acc.merge(SCT_DigitizationHSCfg(ConfigFlags)) +# Dump config +acc.getService("StoreGateSvc").Dump = True +acc.getService("ConditionStore").Dump = True +acc.printConfig(withDetails=True) +ConfigFlags.dump() +# Execute and finish +acc.run(maxEvents=3) +