ATLAS Offline Software
PLR_DigitizationConfig.py
Go to the documentation of this file.
1 """Define methods to construct configured PLR Digitization tools and algorithms
2 
3 Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
4 """
5 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
6 from AthenaConfiguration.ComponentFactory import CompFactory
7 from AthenaConfiguration.Enums import ProductionStep
8 from DigitizationConfig.PileUpMergeSvcConfig import PileUpMergeSvcCfg, PileUpXingFolderCfg
9 from DigitizationConfig.PileUpToolsConfig import PileUpToolsCfg
10 from DigitizationConfig.TruthDigitizationOutputConfig import TruthDigitizationOutputCfg
11 from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
12 
13 from PixelConditionsAlgorithms.PLR_ConditionsConfig import (
14  PLR_ConfigCondAlgCfg, PLR_ChargeCalibCondAlgCfg,
15  PLR_DistortionAlgCfg
16 )
17 from PixelConditionsTools.PLR_ConditionsSummaryConfig import PLR_ConditionsSummaryCfg
18 from PLRGeoModelXml.PLR_GeoModelConfig import PLR_ReadoutGeometryCfg
19 from PixelReadoutGeometry.PixelReadoutGeometryConfig import PLR_ReadoutManagerCfg
20 from SiLorentzAngleTool.PLR_LorentzAngleConfig import PLR_LorentzAngleToolCfg
21 from SiPropertiesTool.PLR_SiPropertiesConfig import PLR_SiPropertiesToolCfg
22 from SimulationConfig.SimEnums import PixelRadiationDamageSimulationType
23 
24 
25 # The earliest and last bunch crossing times for which interactions will be sent
26 # to the PLR Digitization code
27 def PLR_FirstXing(flags):
28  return -25
29 
30 
31 def PLR_LastXing(flags):
32  if flags.Beam.BunchSpacing > 50:
33  return 75
34  else:
35  return 25
36 
37 
38 def PLR_EnergyDepositionToolCfg(flags, name="PLR_EnergyDepositionTool", **kwargs):
39  """Return a configured EnergyDepositionTool"""
40  acc = PLR_DistortionAlgCfg(flags)
41  kwargs.setdefault("DeltaRayCut", 117.)
42  kwargs.setdefault("nCols", 5)
43  kwargs.setdefault("LoopLimit", 100000)
44  kwargs.setdefault("doBichsel", True)
45  kwargs.setdefault("doBichselBetaGammaCut", 0.7) # dEdx not quite consistent below this
46  kwargs.setdefault("doDeltaRay", False) # needs validation
47  kwargs.setdefault("doPU", True)
48  kwargs.setdefault("PixelDistortionData", "PLR_DistortionData")
49  acc.setPrivateTools(CompFactory.EnergyDepositionTool(name, **kwargs))
50  return acc
51 
52 
53 def PLR_RD53SimToolCfg(flags, name="PLR_RD53SimTool", **kwargs):
54  """Return a RD53SimTool configured for PLR"""
55  acc = PLR_ReadoutManagerCfg(flags)
56  acc.merge(PLR_ConfigCondAlgCfg(flags))
57  acc.merge(PLR_ChargeCalibCondAlgCfg(flags))
58  kwargs.setdefault("BarrelEC", 4)
59  kwargs.setdefault("DoNoise", flags.Digitization.DoInnerDetectorNoise)
60  kwargs.setdefault("PixelReadoutManager", acc.getPrimary())
61  kwargs.setdefault("PixelModuleData", "PLR_ModuleData")
62  kwargs.setdefault("PixelChargeCalibCondData", "PLR_ChargeCalibCondData")
63  kwargs.setdefault("PixelConditionsSummaryTool", acc.popToolsAndMerge(PLR_ConditionsSummaryCfg(flags)))
64  kwargs.setdefault("DoTimeWalk", False)
65  acc.setPrivateTools(CompFactory.RD53SimTool(name, **kwargs))
66  return acc
67 
68 
69 def PLR_SensorSimPlanarToolCfg(flags, name="PLR_SensorSimPlanarTool", **kwargs):
70  """Return ComponentAccumulator with configured SensorSimPlanarTool for PLR"""
71  acc = PLR_ConfigCondAlgCfg(flags)
72  kwargs.setdefault("SiPropertiesTool", acc.popToolsAndMerge(PLR_SiPropertiesToolCfg(flags)))
73  kwargs.setdefault("LorentzAngleTool", acc.popToolsAndMerge(PLR_LorentzAngleToolCfg(flags)))
74  kwargs.setdefault("PixelModuleData", "PLR_ModuleData")
75  kwargs.setdefault("RadiationDamageSimulationType", flags.Digitization.PixelPlanarRadiationDamageSimulationType.value)
76  kwargs.setdefault("DigitizeITk3Das3D", False)
77  if flags.Digitization.PixelPlanarRadiationDamageSimulationType is not PixelRadiationDamageSimulationType.NoRadiationDamage:
78  # acc.merge(PLR_RadSimFluenceMapAlgCfg(flags)) # TODO: not supported yet
79  pass
80  acc.setPrivateTools(CompFactory.SensorSimPlanarTool(name, **kwargs))
81  return acc
82 
83 
84 def PLR_SensorSim3DToolCfg(flags, name="PLR_SensorSim3DTool", **kwargs):
85  """Return ComponentAccumulator with configured SensorSim3DTool for PLR"""
86  acc = PLR_ConfigCondAlgCfg(flags)
87  kwargs.setdefault("SiPropertiesTool", acc.popToolsAndMerge(PLR_SiPropertiesToolCfg(flags)))
88  kwargs.setdefault("PixelModuleData", "PLR_ModuleData")
89  kwargs.setdefault("RadiationDamageSimulationType", flags.Digitization.Pixel3DRadiationDamageSimulationType.value)
90  kwargs.setdefault("DigitizeITk3Das3D", False)
91  if flags.Digitization.Pixel3DRadiationDamageSimulationType is not PixelRadiationDamageSimulationType.NoRadiationDamage:
92  # acc.merge(PLR_RadSimFluenceMapAlgCfg(flags)) # TODO: not supported yet
93  pass
94  acc.setPrivateTools(CompFactory.SensorSim3DTool(name, **kwargs))
95  return acc
96 
97 
98 def PLR_DigitizationBasicToolCfg(flags, name="PLR_DigitizationBasicTool", **kwargs):
99  """Return ComponentAccumulator with configured PixelDigitizationTool for PLR"""
100  acc = PLR_ReadoutGeometryCfg(flags)
101  # set up tool handle lists
102  chargeTools = []
103  feSimTools = []
104  chargeTools.append(acc.popToolsAndMerge(PLR_SensorSimPlanarToolCfg(flags)))
105  # chargeTools.append(acc.popToolsAndMerge(PLR_SensorSim3DToolCfg(flags)))
106  feSimTools.append(acc.popToolsAndMerge(PLR_RD53SimToolCfg(flags)))
107  kwargs.setdefault("PixelIDName", "PLR_ID")
108  kwargs.setdefault("ChargeTools", chargeTools)
109  kwargs.setdefault("EnergyDepositionTool", acc.popToolsAndMerge(PLR_EnergyDepositionToolCfg(flags)))
110  kwargs.setdefault("FrontEndSimTools", feSimTools)
111  kwargs.setdefault("InputObjectName", "PLR_Hits")
112  kwargs.setdefault("PixelDetEleCollKey", "PLR_DetectorElementCollection")
113  if flags.Digitization.DoXingByXingPileUp:
114  kwargs.setdefault("FirstXing", PLR_FirstXing(flags))
115  kwargs.setdefault("LastXing", PLR_LastXing(flags))
116  from RngComps.RngCompsConfig import AthRNGSvcCfg
117  kwargs.setdefault("RndmSvc", acc.getPrimaryAndMerge(AthRNGSvcCfg(flags)).name)
118 
119  acc.setPrivateTools(CompFactory.PixelDigitizationTool(name, **kwargs, ))
120  return acc
121 
122 
123 def PLR_DigitizationToolCfg(flags, name="PLR_DigitizationTool", **kwargs):
124  """Return ComponentAccumulator with configured PLR_DigitizationBasicTool"""
125  acc = ComponentAccumulator()
126  if flags.Digitization.PileUp:
127  intervals = []
128  if not flags.Digitization.DoXingByXingPileUp:
129  intervals += [acc.popToolsAndMerge(PLR_RangeCfg(flags))]
130  kwargs.setdefault("PileUpMergeSvc", acc.getPrimaryAndMerge(PileUpMergeSvcCfg(flags, Intervals=intervals)).name)
131  else:
132  kwargs.setdefault("PileUpMergeSvc", "")
133  kwargs.setdefault("OnlyUseContainerName", flags.Digitization.PileUp)
134  kwargs.setdefault("HardScatterSplittingMode", 0)
135  if flags.Common.ProductionStep == ProductionStep.PileUpPresampling:
136  kwargs.setdefault("RDOCollName", flags.Overlay.BkgPrefix + "PLR_RDOs")
137  kwargs.setdefault("SDOCollName", flags.Overlay.BkgPrefix + "PLR_SDO_Map")
138  else:
139  kwargs.setdefault("RDOCollName", "PLR_RDOs")
140  kwargs.setdefault("SDOCollName", "PLR_SDO_Map")
141  tool = acc.popToolsAndMerge(PLR_DigitizationBasicToolCfg(flags, name, **kwargs))
142  acc.setPrivateTools(tool)
143  return acc
144 
145 
146 def PLR_DigitizationHSToolCfg(flags, name="PLR_DigitizationHSTool", **kwargs):
147  """Return ComponentAccumulator with PixelDigitizationTool configured for Hard Scatter"""
148  acc = ComponentAccumulator()
149  rangetool = acc.popToolsAndMerge(PLR_RangeCfg(flags))
150  acc.merge(PileUpMergeSvcCfg(flags, Intervals=rangetool))
151  kwargs.setdefault("HardScatterSplittingMode", 1)
152  tool = acc.popToolsAndMerge(PLR_DigitizationBasicToolCfg(flags, name, **kwargs))
153  acc.setPrivateTools(tool)
154  return acc
155 
156 
157 def PLR_DigitizationPUToolCfg(flags, name="PLR_DigitizationPUTool", **kwargs):
158  """Return ComponentAccumulator with PixelDigitizationTool configured for PileUp"""
159  acc = ComponentAccumulator()
160  rangetool = acc.popToolsAndMerge(PLR_RangeCfg(flags))
161  acc.merge(PileUpMergeSvcCfg(flags, Intervals=rangetool))
162  kwargs.setdefault("HardScatterSplittingMode", 2)
163  kwargs.setdefault("RDOCollName", "PLR_PU_RDOs")
164  kwargs.setdefault("SDOCollName", "PLR_PU_SDO_Map")
165  tool = acc.popToolsAndMerge(PLR_DigitizationBasicToolCfg(flags, name, **kwargs))
166  acc.setPrivateTools(tool)
167  return acc
168 
169 
170 def PLR_DigitizationSplitNoMergePUToolCfg(flags, name="PLR_DigitizationSplitNoMergePUTool", **kwargs):
171  """Return ComponentAccumulator with PixelDigitizationTool configured for PileUpPLR_Hits"""
172  acc = ComponentAccumulator()
173  rangetool = acc.popToolsAndMerge(PLR_RangeCfg(flags))
174  acc.merge(PileUpMergeSvcCfg(flags, Intervals=rangetool))
175  kwargs.setdefault("HardScatterSplittingMode", 0)
176  kwargs.setdefault("InputObjectName", "PileupPLR_Hits")
177  kwargs.setdefault("RDOCollName", "PLR_PU_RDOs")
178  kwargs.setdefault("SDOCollName", "PLR_PU_SDO_Map")
179  tool = acc.popToolsAndMerge(PLR_DigitizationBasicToolCfg(flags, name, **kwargs))
180  acc.setPrivateTools(tool)
181  return acc
182 
183 
184 def PLR_OverlayDigitizationToolCfg(flags, name="PLR_OverlayDigitizationTool", **kwargs):
185  """Return ComponentAccumulator with PixelDigitizationTool configured for overlay"""
186  kwargs.setdefault("OnlyUseContainerName", False)
187  kwargs.setdefault("RDOCollName", flags.Overlay.SigPrefix + "PLR_RDOs")
188  kwargs.setdefault("SDOCollName", flags.Overlay.SigPrefix + "PLR_SDO_Map")
189  kwargs.setdefault("HardScatterSplittingMode", 0)
190  return PLR_DigitizationBasicToolCfg(flags, name, **kwargs)
191 
192 
193 def PLR_RangeCfg(flags, name="PLR_Range", **kwargs):
194  """Return a configured PileUpXingFolder tool"""
195  kwargs.setdefault("FirstXing", PLR_FirstXing(flags))
196  kwargs.setdefault("LastXing", PLR_LastXing(flags))
197  kwargs.setdefault("CacheRefreshFrequency", 1.0) # default 0 no dataproxy reset
198  kwargs.setdefault("ItemList", ["SiHitCollection#PLR_Hits"])
199  return PileUpXingFolderCfg(flags, name, **kwargs)
200 
201 
202 def PLR_OutputCfg(flags):
203  """Return ComponentAccumulator with Output for PLR. Not standalone."""
204  acc = ComponentAccumulator()
205  if flags.Output.doWriteRDO:
206  ItemList = ["PixelRDO_Container#*"]
207  if flags.Digitization.EnableTruth:
208  ItemList += ["InDetSimDataCollection#*"]
209  acc.merge(TruthDigitizationOutputCfg(flags))
210  acc.merge(OutputStreamCfg(flags, "RDO", ItemList))
211  return acc
212 
213 
214 def PLR_DigitizationBasicCfg(flags, **kwargs):
215  """Return ComponentAccumulator for PLR digitization"""
216  acc = ComponentAccumulator()
217  if "PileUpTools" not in kwargs:
218  PileUpTools = acc.popToolsAndMerge(PLR_DigitizationToolCfg(flags))
219  kwargs["PileUpTools"] = PileUpTools
220  acc.merge(PileUpToolsCfg(flags, **kwargs))
221  return acc
222 
223 
224 def PLR_OverlayDigitizationBasicCfg(flags, **kwargs):
225  """Return ComponentAccumulator with PLR Overlay digitization"""
226  acc = ComponentAccumulator()
227  if flags.Common.ProductionStep != ProductionStep.FastChain:
228  from SGComps.SGInputLoaderConfig import SGInputLoaderCfg
229  acc.merge(SGInputLoaderCfg(flags, ["SiHitCollection#PLR_Hits"]))
230 
231  if "DigitizationTool" not in kwargs:
232  tool = acc.popToolsAndMerge(PLR_OverlayDigitizationToolCfg(flags))
233  kwargs["DigitizationTool"] = tool
234 
235  if flags.Concurrency.NumThreads > 0:
236  kwargs.setdefault("Cardinality", flags.Concurrency.NumThreads)
237 
238  # Set common overlay extra inputs
239  kwargs.setdefault("ExtraInputs", flags.Overlay.ExtraInputs)
240  acc.addEventAlgo(CompFactory.PixelDigitization(name="PLR_OverlayDigitization", **kwargs))
241  return acc
242 
243 
244 # with output defaults
245 def PLR_DigitizationCfg(flags, **kwargs):
246  """Return ComponentAccumulator for PLR digitization and Output"""
247  acc = PLR_DigitizationBasicCfg(flags, **kwargs)
248  acc.merge(PLR_OutputCfg(flags))
249  return acc
250 
251 
252 # additional specialisations
253 def PLR_DigitizationHSCfg(flags, **kwargs):
254  """Return ComponentAccumulator for Hard-Scatter-only PLR digitization and Output"""
255  acc = ComponentAccumulator()
256  tool = acc.popToolsAndMerge(PLR_DigitizationHSToolCfg(flags))
257  kwargs["PileUpTools"] = tool
258  acc.merge(PileUpToolsCfg(flags, **kwargs))
259  acc.merge(PLR_OutputCfg(flags))
260  return acc
261 
262 
263 def PLR_DigitizationPUCfg(flags, **kwargs):
264  """Return ComponentAccumulator with Pile-up-only PLR digitization and Output"""
265  acc = ComponentAccumulator()
266  tool = acc.popToolsAndMerge(PLR_DigitizationPUToolCfg(flags))
267  kwargs["PileUpTools"] = tool
268  acc.merge(PileUpToolsCfg(flags, **kwargs))
269  acc.merge(PLR_OutputCfg(flags))
270  return acc
python.PLR_LorentzAngleConfig.PLR_LorentzAngleToolCfg
def PLR_LorentzAngleToolCfg(flags, name="PLR_LorentzAngleTool", **kwargs)
Definition: PLR_LorentzAngleConfig.py:28
PLR_DigitizationConfig.PLR_EnergyDepositionToolCfg
def PLR_EnergyDepositionToolCfg(flags, name="PLR_EnergyDepositionTool", **kwargs)
Definition: PLR_DigitizationConfig.py:38
python.JetAnalysisCommon.ComponentAccumulator
ComponentAccumulator
Definition: JetAnalysisCommon.py:302
PLR_DigitizationConfig.PLR_DigitizationPUToolCfg
def PLR_DigitizationPUToolCfg(flags, name="PLR_DigitizationPUTool", **kwargs)
Definition: PLR_DigitizationConfig.py:157
PLR_DigitizationConfig.PLR_DigitizationPUCfg
def PLR_DigitizationPUCfg(flags, **kwargs)
Definition: PLR_DigitizationConfig.py:263
PLR_DigitizationConfig.PLR_DigitizationSplitNoMergePUToolCfg
def PLR_DigitizationSplitNoMergePUToolCfg(flags, name="PLR_DigitizationSplitNoMergePUTool", **kwargs)
Definition: PLR_DigitizationConfig.py:170
PLR_DigitizationConfig.PLR_RangeCfg
def PLR_RangeCfg(flags, name="PLR_Range", **kwargs)
Definition: PLR_DigitizationConfig.py:193
python.OutputStreamConfig.OutputStreamCfg
def OutputStreamCfg(flags, streamName, ItemList=[], MetadataItemList=[], disableEventTag=False, trigNavThinningSvc=None, takeItemsFromInput=False, extendProvenanceRecord=True, AcceptAlgs=[], HelperTools=[])
Definition: OutputStreamConfig.py:12
PLR_DigitizationConfig.PLR_DigitizationCfg
def PLR_DigitizationCfg(flags, **kwargs)
Definition: PLR_DigitizationConfig.py:245
python.PLR_SiPropertiesConfig.PLR_SiPropertiesToolCfg
def PLR_SiPropertiesToolCfg(flags, name="PLR_SiPropertiesTool", **kwargs)
Definition: PLR_SiPropertiesConfig.py:30
python.TruthDigitizationOutputConfig.TruthDigitizationOutputCfg
def TruthDigitizationOutputCfg(flags)
Definition: TruthDigitizationOutputConfig.py:9
PLR_DigitizationConfig.PLR_RD53SimToolCfg
def PLR_RD53SimToolCfg(flags, name="PLR_RD53SimTool", **kwargs)
Definition: PLR_DigitizationConfig.py:53
PLR_DigitizationConfig.PLR_DigitizationHSToolCfg
def PLR_DigitizationHSToolCfg(flags, name="PLR_DigitizationHSTool", **kwargs)
Definition: PLR_DigitizationConfig.py:146
PLR_DigitizationConfig.PLR_OutputCfg
def PLR_OutputCfg(flags)
Definition: PLR_DigitizationConfig.py:202
PLR_DigitizationConfig.PLR_DigitizationBasicToolCfg
def PLR_DigitizationBasicToolCfg(flags, name="PLR_DigitizationBasicTool", **kwargs)
Definition: PLR_DigitizationConfig.py:98
PLR_ConditionsSummaryConfig.PLR_ConditionsSummaryCfg
def PLR_ConditionsSummaryCfg(flags, name="PLR_ConditionsSummary", **kwargs)
Definition: PLR_ConditionsSummaryConfig.py:12
PLR_DigitizationConfig.PLR_FirstXing
def PLR_FirstXing(flags)
Definition: PLR_DigitizationConfig.py:27
PLR_ConditionsConfig.PLR_DistortionAlgCfg
def PLR_DistortionAlgCfg(flags, name="PLR_DistortionAlg", **kwargs)
Definition: PLR_ConditionsConfig.py:91
SGInputLoaderConfig.SGInputLoaderCfg
def SGInputLoaderCfg(flags, Load=None, **kwargs)
Definition: SGInputLoaderConfig.py:7
PLR_DigitizationConfig.PLR_OverlayDigitizationBasicCfg
def PLR_OverlayDigitizationBasicCfg(flags, **kwargs)
Definition: PLR_DigitizationConfig.py:224
PLR_DigitizationConfig.PLR_LastXing
def PLR_LastXing(flags)
Definition: PLR_DigitizationConfig.py:31
python.PileUpToolsConfig.PileUpToolsCfg
def PileUpToolsCfg(flags, **kwargs)
Definition: PileUpToolsConfig.py:14
PLR_DigitizationConfig.PLR_DigitizationBasicCfg
def PLR_DigitizationBasicCfg(flags, **kwargs)
Definition: PLR_DigitizationConfig.py:214
python.PixelReadoutGeometryConfig.PLR_ReadoutManagerCfg
def PLR_ReadoutManagerCfg(flags, name="PLR_ReadoutManager", **kwargs)
Definition: PixelReadoutGeometryConfig.py:19
PLR_DigitizationConfig.PLR_SensorSim3DToolCfg
def PLR_SensorSim3DToolCfg(flags, name="PLR_SensorSim3DTool", **kwargs)
Definition: PLR_DigitizationConfig.py:84
PLR_ConditionsConfig.PLR_ConfigCondAlgCfg
def PLR_ConfigCondAlgCfg(flags, name="PLR_ConfigCondAlg", **kwargs)
Definition: PLR_ConditionsConfig.py:10
PLR_ConditionsConfig.PLR_ChargeCalibCondAlgCfg
def PLR_ChargeCalibCondAlgCfg(flags, name="PLR_ChargeCalibCondAlg", **kwargs)
Definition: PLR_ConditionsConfig.py:40
PLR_DigitizationConfig.PLR_SensorSimPlanarToolCfg
def PLR_SensorSimPlanarToolCfg(flags, name="PLR_SensorSimPlanarTool", **kwargs)
Definition: PLR_DigitizationConfig.py:69
python.PileUpMergeSvcConfig.PileUpXingFolderCfg
def PileUpXingFolderCfg(flags, name="PileUpXingFolder", **kwargs)
Definition: PileUpMergeSvcConfig.py:35
PLR_DigitizationConfig.PLR_DigitizationToolCfg
def PLR_DigitizationToolCfg(flags, name="PLR_DigitizationTool", **kwargs)
Definition: PLR_DigitizationConfig.py:123
python.PileUpMergeSvcConfig.PileUpMergeSvcCfg
def PileUpMergeSvcCfg(flags, name="PileUpMergeSvc", Intervals=[], **kwargs)
Definition: PileUpMergeSvcConfig.py:10
PLR_GeoModelConfig.PLR_ReadoutGeometryCfg
def PLR_ReadoutGeometryCfg(flags, **kwargs)
Definition: PLR_GeoModelConfig.py:42
PLR_DigitizationConfig.PLR_OverlayDigitizationToolCfg
def PLR_OverlayDigitizationToolCfg(flags, name="PLR_OverlayDigitizationTool", **kwargs)
Definition: PLR_DigitizationConfig.py:184
PLR_DigitizationConfig.PLR_DigitizationHSCfg
def PLR_DigitizationHSCfg(flags, **kwargs)
Definition: PLR_DigitizationConfig.py:253
RngCompsConfig.AthRNGSvcCfg
def AthRNGSvcCfg(flags, name="AthRNGSvc")
Definition: RngCompsConfig.py:51