ATLAS Offline Software
Loading...
Searching...
No Matches
DigitizationConfigFlags.py
Go to the documentation of this file.
1"""Construct ConfigFlags for Digitization
2
3Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
4"""
5from AthenaConfiguration.AutoConfigFlags import GetFileMD
6from AthenaConfiguration.AthConfigFlags import AthConfigFlags
7from AthenaConfiguration.Enums import ProductionStep
8from SimulationConfig.SimEnums import PixelRadiationDamageSimulationType
9
10
11def constBunchSpacingPattern(constBunchSpacing):
12 """Return a valid value for Digitization.BeamIntensity, which
13 matches the specified constBunchSpacing
14 """
15 if type(constBunchSpacing) is not int:
16 raise TypeError("constBunchSpacing must be int, "
17 "not %s" % type(constBunchSpacing).__name__)
18 if constBunchSpacing % 25 != 0:
19 raise ValueError("constBunchSpacing must be a multiple of 25, "
20 "not %s" % constBunchSpacing)
21
22 # special case
23 if constBunchSpacing == 25:
24 return [1.0]
25
26 # general case
27 pattern = [0.0, 1.0]
28 nBunches = (constBunchSpacing//25) - 2
29 pattern += nBunches*[0.0]
30 return pattern
31
32
34 """Return an AthConfigFlags object with required flags"""
35 flags = AthConfigFlags()
36 # Digitization Steering - needed for easy comparison with the
37 # old-style configuration, but can potentially drop
38 def _checkDigiSteeringConf(prevFlags):
39 digiSteeringConf = "StandardPileUpToolsAlg"
40 if prevFlags.Input.Files:
41 digiSteeringConf = GetFileMD(prevFlags.Input.Files).get("digiSteeringConf", "StandardPileUpToolsAlg")
42 return digiSteeringConf
43
44 flags.addFlag("Digitization.DigiSteeringConf", _checkDigiSteeringConf)
45 # Run Inner Detector noise simulation
46 flags.addFlag("Digitization.DoInnerDetectorNoise", lambda prevFlags: not prevFlags.Common.isOverlay)
47 # Run Pixel Detector noise simulation
48 flags.addFlag("Digitization.DoITkPixelDetectorNoise", lambda prevFlags: prevFlags.Digitization.DoInnerDetectorNoise)
49 # Run Strip Detector noise simulation
50 flags.addFlag("Digitization.DoITkStripDetectorNoise", lambda prevFlags: prevFlags.Digitization.DoInnerDetectorNoise)
51 # Run pile-up digitization on one bunch crossing at a time?
52 flags.addFlag("Digitization.DoXingByXingPileUp", False)
53 # Run Calorimeter noise simulation
54 flags.addFlag("Digitization.DoCaloNoise", lambda prevFlags: not prevFlags.Common.isOverlay)
55 # Produce inputs for Calorimeter hard scatter truth reconstruction
56 flags.addFlag("Digitization.EnableCaloHSTruthRecoInputs", False)
57 # Use high-gain Forward Calorimeters
58 flags.addFlag("Digitization.HighGainFCal", False)
59 # Use high-gain ElectroMagnetic EndCap Inner Wheel
60 flags.addFlag("Digitization.HighGainEMECIW", True)
61 # Do global pileup digitization
62 flags.addFlag("Digitization.PileUp",
63 lambda prevFlags: GetFileMD(prevFlags.Input.Files).get("pileUp", "False") != "False")
64 # Temporary TGC flag
65 flags.addFlag("Digitization.UseUpdatedTGCConditions", False)
66 # Write out truth information
67 flags.addFlag("Digitization.EnableTruth", True)
68 # Write out calorimeter digits
69 flags.addFlag("Digitization.AddCaloDigi", False)
70 # Write out thinned calorimeter digits
71 flags.addFlag("Digitization.AddCaloDigiThinned", False)
72 # Integer offset to random seed initialisation
73 flags.addFlag("Digitization.RandomSeedOffset", 0)
74 # Digitization extra input dependencies
75 flags.addFlag("Digitization.ExtraInputs", [("xAOD::EventInfo", "EventInfo")])
76 # Beam spot reweighting (-1 disables it)
77 flags.addFlag("Digitization.InputBeamSigmaZ", -1)
78
79 # Set the type of the radiation damage simulation type for pixel planar sensors
80 flags.addFlag("Digitization.PixelPlanarRadiationDamageSimulationType",
81 PixelRadiationDamageSimulationType.NoRadiationDamage, type=PixelRadiationDamageSimulationType)
82 # Set the type of the radiation damage simulation type for 3D planar sensors
83 flags.addFlag("Digitization.Pixel3DRadiationDamageSimulationType",
84 PixelRadiationDamageSimulationType.NoRadiationDamage, type=PixelRadiationDamageSimulationType)
85 # Set the flag to tell the code to treat 3D sensors in in Pixel ITk as 3D sensors (instead of planar)
86 # Current default is False as this is what has been used so far for the ITk simulation (treating 3D as Planar)
87 # This is a temporary flag that will be eventually removed FIXME
88 flags.addFlag("Digitization.DigitizeITk3Das3D", False)
89
90 # for PileUp digitization
91 # Bunch structure configuration
92 flags.addFlag("Digitization.PU.BunchStructureConfig", "")
93 # Pile-up profile configuration
94 flags.addFlag("Digitization.PU.ProfileConfig", "")
95 # Custom pile-up profile configuration - fully custom or for mu range
96 flags.addFlag("Digitization.PU.CustomProfile", "")
97 # Force sequential event numbers
98 flags.addFlag("Digitization.PU.ForceSequentialEventNumbers",
99 lambda prevFlags: prevFlags.Common.ProductionStep == ProductionStep.PileUpPresampling)
100 # Beam Halo input collections
101 flags.addFlag("Digitization.PU.BeamHaloInputCols", [])
102 # LHC Bunch Structure (list of non-negative floats)
103 flags.addFlag("Digitization.PU.BeamIntensityPattern",
104 lambda prevFlags: constBunchSpacingPattern(prevFlags.Beam.BunchSpacing))
105 # Beam Gas input collections
106 flags.addFlag("Digitization.PU.BeamGasInputCols", [])
107 # LHC bunch spacing, in ns, to use in pileup digitization. Only multiples of 25 allowed.
108 # Not necessarily equal to Beam.BunchSpacing
109 flags.addFlag("Digitization.PU.BunchSpacing",
110 lambda prevFlags: prevFlags.Beam.BunchSpacing)
111 # PileUp branch crossing parameters
112 flags.addFlag("Digitization.PU.InitialBunchCrossing", -32)
113 flags.addFlag("Digitization.PU.FinalBunchCrossing", 6)
114 # Add the cavern background every bunch, independent of any bunch structure?
115 flags.addFlag("Digitization.PU.CavernIgnoresBeamInt", False)
116 # Cavern input collections
117 flags.addFlag("Digitization.PU.CavernInputCols", [])
118 # Central bunch crossing location in the BeamIntensityPattern
119 flags.addFlag("Digitization.PU.FixedT0BunchCrossing", 0)
120 # Superimpose mixed high pt minimum bias events (pile-up) on signal events?
121 # If so, set this to a list of: High Pt Mixed ND, SD, DD minimum bias input collections
122 flags.addFlag("Digitization.PU.HighPtMinBiasInputCols", [])
123 # Offset into the input collections of high pt min-bias events
124 flags.addFlag("Digitization.PU.HighPtMinBiasInputColOffset", 0)
125 # Superimpose mixed low pt minimum bias events (pile-up) on signal events?
126 # If so, set this to a list of: Low Pt Mixed ND, SD, DD minimum bias input collections
127 flags.addFlag("Digitization.PU.LowPtMinBiasInputCols", [])
128 # Number of low pt min-bias events to superimpose per signal event per beam crossing
129 flags.addFlag("Digitization.PU.NumberOfLowPtMinBias", 0.0)
130 # Number of high pt min-bias events to superimpose per signal event per beam crossing
131 flags.addFlag("Digitization.PU.NumberOfHighPtMinBias", 0.0)
132 # Number of beam gas events to superimpose per signal event per beam crossing
133 flags.addFlag("Digitization.PU.NumberOfBeamGas", 0.0)
134 # Number of beam halo events to superimpose per signal event per beam crossing
135 flags.addFlag("Digitization.PU.NumberOfBeamHalo", 0.0)
136 # Number of mixed ND, SD, DD min-bias events to superimpose per signal event per beam crossing
137 flags.addFlag("Digitization.PU.NumberOfCollisions", 0.0)
138 # Number of cavern events to superimpose per signal event per beam crossing
139 flags.addFlag("Digitization.PU.NumberOfCavern", 0.0)
140 # Repeating pattern to determine which events to simulate when using Stepping Cache
141 flags.addFlag("Digitization.PU.SignalPatternForSteppingCache", [])
142 # Which sub-systems should use Fast Digitization
143 flags.addFlag("Digitization.DoFastDigi", [])
144 # Set the flag to True if the Common.ProductionStep is not one of the steps in the list
145 flags.addFlag("Digitization.ReadParametersFromDB", lambda prevFlags : prevFlags.Common.ProductionStep in [ProductionStep.Digitization, ProductionStep.PileUpPresampling, ProductionStep.Overlay, ProductionStep.FastChain])
146 # Do TRT high threshold overrides for heay ion runs
147 flags.addFlag("Digitization.TRT.HeavyIonHT", False)
148 return flags
149
150
151def digitizationRunArgsToFlags(runArgs, flags):
152 """Fill digitization configuration flags from run arguments."""
153 # from SimDigi
154 if hasattr(runArgs, "DataRunNumber"):
155 flags.Input.ConditionsRunNumber = runArgs.DataRunNumber
156
157 # from SimDigi
158 if hasattr(runArgs, "jobNumber"):
159 flags.Input.JobNumber = runArgs.jobNumber
160
161 if hasattr(runArgs, "PileUpPresampling"):
162 flags.Common.ProductionStep = ProductionStep.PileUpPresampling
163 elif flags.Common.ProductionStep == ProductionStep.Default: # Do not override previous settings
164 flags.Common.ProductionStep = ProductionStep.Digitization
165
166 if hasattr(runArgs, "doAllNoise"):
167 flags.Digitization.DoInnerDetectorNoise = runArgs.doAllNoise
168 flags.Digitization.DoCaloNoise = runArgs.doAllNoise
169
170 if hasattr(runArgs, "AddCaloDigi"):
171 flags.Digitization.AddCaloDigi = runArgs.AddCaloDigi
172
173 if hasattr(runArgs, "digiSeedOffset1") or hasattr(runArgs, "digiSeedOffset2"):
174 flags.Digitization.RandomSeedOffset = 0
175 if hasattr(runArgs, "digiSeedOffset1"):
176 flags.Digitization.RandomSeedOffset += int(runArgs.digiSeedOffset1)
177 if hasattr(runArgs, "digiSeedOffset2"):
178 flags.Digitization.RandomSeedOffset += int(runArgs.digiSeedOffset2)
179 else:
180 flags.Digitization.RandomSeedOffset = 3 # for legacy compatibility
181
182 if hasattr(runArgs, "digiSteeringConf"):
183 flags.Digitization.DigiSteeringConf = runArgs.digiSteeringConf + "PileUpToolsAlg"
184
185 # TODO: Not covered yet as no flag equivalents exist yet
186 # '--digiRndmSvc'
187 # '--samplingFractionDbTag'
188
189
190def pileupRunArgsToFlags(runArgs, flags):
191 """Fill pile-up digitization configuration flags from run arguments."""
192 if hasattr(runArgs, "numberOfLowPtMinBias"):
193 flags.Digitization.PU.NumberOfLowPtMinBias = runArgs.numberOfLowPtMinBias
194
195 if hasattr(runArgs, "numberOfHighPtMinBias"):
196 flags.Digitization.PU.NumberOfHighPtMinBias = runArgs.numberOfHighPtMinBias
197
198 if hasattr(runArgs, "numberOfBeamHalo"):
199 flags.Digitization.PU.NumberOfBeamHalo = runArgs.numberOfBeamHalo
200
201 if hasattr(runArgs, "numberOfBeamGas"):
202 flags.Digitization.PU.NumberOfBeamGas = runArgs.numberOfBeamGas
203
204 if hasattr(runArgs, "numberOfCavernBkg"):
205 flags.Digitization.PU.NumberOfCavern = runArgs.numberOfCavernBkg
206
207 if hasattr(runArgs, "bunchSpacing"):
208 flags.Digitization.PU.BunchSpacing = runArgs.bunchSpacing
209
210 if hasattr(runArgs, "pileupInitialBunch"):
211 flags.Digitization.PU.InitialBunchCrossing = runArgs.pileupInitialBunch
212
213 if hasattr(runArgs, "pileupFinalBunch"):
214 flags.Digitization.PU.FinalBunchCrossing = runArgs.pileupFinalBunch
215
216 # sanity check
217 if flags.Digitization.PU.InitialBunchCrossing > flags.Digitization.PU.FinalBunchCrossing:
218 raise ValueError("Initial bunch crossing should not be larger than the final one")
219
220 if hasattr(runArgs, "inputLowPtMinbiasHitsFile"):
221 from RunDependentSimComps.PileUpUtils import generateBackgroundInputCollections
222 flags.Digitization.PU.LowPtMinBiasInputCols = \
223 generateBackgroundInputCollections(flags, runArgs.inputLowPtMinbiasHitsFile,
224 flags.Digitization.PU.NumberOfLowPtMinBias, True)
225
226 if hasattr(runArgs, "inputHighPtMinbiasHitsFile"):
227 from RunDependentSimComps.PileUpUtils import getInputCollectionOffset, generateBackgroundInputCollections
228 if flags.Digitization.PU.HighPtMinBiasInputColOffset < 0:
229 # Calculate a pseudo random offset into the collection from the jobNumber
230 flags.Digitization.PU.HighPtMinBiasInputColOffset = getInputCollectionOffset(flags, runArgs.inputHighPtMinbiasHitsFile)
231
232 flags.Digitization.PU.HighPtMinBiasInputCols = \
233 generateBackgroundInputCollections(flags, runArgs.inputHighPtMinbiasHitsFile,
234 flags.Digitization.PU.NumberOfHighPtMinBias, True)
235
236 if hasattr(runArgs, "inputCavernHitsFile"):
237 from RunDependentSimComps.PileUpUtils import generateBackgroundInputCollections
238 flags.Digitization.PU.CavernInputCols = \
239 generateBackgroundInputCollections(flags, runArgs.inputCavernHitsFile,
240 flags.Digitization.PU.NumberOfCavern, True) # TODO: ignore?
241
242 if hasattr(runArgs, "inputBeamHaloHitsFile"):
243 from RunDependentSimComps.PileUpUtils import generateBackgroundInputCollections
244 flags.Digitization.PU.BeamHaloInputCols = \
245 generateBackgroundInputCollections(flags, runArgs.inputBeamHaloHitsFile,
246 flags.Digitization.PU.NumberOfBeamHalo, True)
247
248 if hasattr(runArgs, "inputBeamGasHitsFile"):
249 from RunDependentSimComps.PileUpUtils import generateBackgroundInputCollections
250 flags.Digitization.PU.BeamGasInputCols = \
251 generateBackgroundInputCollections(flags, runArgs.inputBeamGasHitsFile,
252 flags.Digitization.PU.NumberOfBeamGas, True)
253
254 # TODO: Not covered yet as no flag equivalents exist yet
255 # '--testPileUpConfig'
256
257
258def setupDigitizationFlags(runArgs, flags):
259 """Setup common digitization flags."""
260 # autoconfigure pile-up if inputs are present
261 if (hasattr(runArgs, "inputLowPtMinbiasHitsFile")
262 or hasattr(runArgs, "inputHighPtMinbiasHitsFile")
263 or hasattr(runArgs, "inputCavernHitsFile")
264 or hasattr(runArgs, "inputBeamHaloHitsFile")
265 or hasattr(runArgs, "inputBeamGasHitsFile")):
266 flags.Digitization.PileUp = True
267
268 if flags.Digitization.PileUp:
269 flags.Input.OverrideRunNumber = True
270 # Needs to be False for MT pileup
271 if flags.Concurrency.NumThreads > 0:
272 flags.Digitization.DoXingByXingPileUp = False
273 else:
274 flags.Digitization.DoXingByXingPileUp = True
275 else:
276 flags.Input.OverrideRunNumber = flags.Input.ConditionsRunNumber > 0
T * get(TKey *tobj)
get a TObject* from a TKey* (why can't a TObject be a TKey?)
Definition hcg.cxx:130