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