ATLAS Offline Software
Loading...
Searching...
No Matches
RecoConfigFlags.py
Go to the documentation of this file.
1# Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
2from AthenaConfiguration.AthConfigFlags import AthConfigFlags
3from AthenaConfiguration.Enums import HIMode
4from AthenaConfiguration.Enums import ProductionStep
5_all_domains = [
6 "Trigger",
7 "BeamSpotDecoration",
8 "Calo", "Tracking",
9 "HGTDExtension",
10 "Muon", "CombinedMuon",
11 "Egamma",
12 "Isolation",
13 "CaloExtension",
14 "TrackCellAssociation",
15 "PFlow", "Jet", "BTagging",
16 "Tau",
17 "GlobalFELinking",
18 "Met",
19 "CaloRinger",
20 "AFP",
21 "HI",
22 "PostProcessing",
23 "TrackOverlay",
24]
25
26
28 """Return an AthConfigFlags object with required flags"""
29 flags = AthConfigFlags()
30
31 # The various reconstruction domains/steps.
32 # Note that Calo and Muon System Reconstruction
33 # depend just on the Detector.EnableCalo and
34 # Detector.EnableMuon flags.
35
36 # Enable Tracking Reconstruction
37 flags.addFlag("Reco.EnableTracking",
38 lambda prevFlags: prevFlags.Detector.EnableID or
39 prevFlags.Detector.EnableITk)
40 # Enable HGTD Reconstruction
41 flags.addFlag("Reco.EnableHGTDExtension",
42 lambda prevFlags: prevFlags.Reco.EnableTracking and
43 prevFlags.Detector.EnableHGTD)
44 # Enable Electron/Photon (EGamma) Reconstruction
45 flags.addFlag("Reco.EnableEgamma",
46 lambda prevFlags: prevFlags.Detector.EnableCalo)
47 # Enable Caching of InDet TrackParticles extension to
48 # Calorimeter. Used by (Muon,PFlow,Tau)
49 flags.addFlag("Reco.EnableCaloExtension", lambda prevFlags: (
50 (
51 prevFlags.Reco.EnablePFlow
52 or prevFlags.Reco.EnableTau
53 or prevFlags.Reco.EnableCombinedMuon
54 )
55 and prevFlags.Detector.EnableCalo
56 and prevFlags.Reco.EnableTracking))
57 # Enable Combined (InDet+MS) Muon Reconstruction
58 flags.addFlag("Reco.EnableCombinedMuon",
59 lambda prevFlags: prevFlags.Detector.EnableMuon and
60 prevFlags.Reco.EnableTracking)
61 # Enable TrackOverlay Reconstruction
62 flags.addFlag("Reco.EnableTrackOverlay", lambda prevFlags: False)
63 # Enable PFlow Reconstruction
64 flags.addFlag("Reco.EnablePFlow", lambda prevFlags: (
65 prevFlags.Reco.EnableTracking
66 and prevFlags.Detector.EnableCalo
67 and prevFlags.Tracking.doVertexFinding))
68 # Enable Isolation Reconstruction
69 flags.addFlag("Reco.EnableIsolation", lambda prevFlags: (
70 prevFlags.Tracking.doVertexFinding
71 and (prevFlags.Reco.EnableCombinedMuon
72 or prevFlags.Reco.EnableEgamma)))
73 # Enable Jet Reconstruction
74 flags.addFlag("Reco.EnableJet", lambda prevFlags: (
75 prevFlags.Detector.EnableCalo
76 and prevFlags.Reco.EnableTracking
77 and prevFlags.Reco.EnableEgamma
78 and prevFlags.Reco.EnableCombinedMuon
79 and prevFlags.Reco.EnablePFlow
80 and prevFlags.Reco.HIMode is not HIMode.HI) or
81 prevFlags.Common.ProductionStep is ProductionStep.Derivation)
82
83 # Enable Tau Reconstruction
84 flags.addFlag("Reco.EnableTau", lambda prevFlags: prevFlags.Reco.EnableJet)
85 # Enable BTagging Reconstruction
86 flags.addFlag("Reco.EnableBTagging",
87 lambda prevFlags: prevFlags.Reco.EnableJet or
88 (prevFlags.Reco.EnableHI and prevFlags.HeavyIon.doJet))
89 # Enable MET Reconstruction
90 flags.addFlag("Reco.EnableMet", lambda prevFlags: (
91 prevFlags.Reco.EnableJet
92 and prevFlags.Reco.EnableTau))
93 # Enable the building of links between the newly
94 # created jet constituents (GlobalFE)
95 # and electrons,photons,muons and taus
96 flags.addFlag("Reco.EnableGlobalFELinking",
97 lambda prevFlags: prevFlags.Reco.EnableJet and
98 prevFlags.Reco.EnableTau and prevFlags.Reco.EnablePFlow and
99 prevFlags.Reco.EnableEgamma and
100 prevFlags.Reco.EnableCombinedMuon)
101 # Enable association of calorimeter cells to Tracks
102 flags.addFlag("Reco.EnableTrackCellAssociation",
103 lambda prevFlags: prevFlags.Detector.EnableCalo and
104 prevFlags.Reco.EnableTracking)
105 # Enable creation of "Rings" of calorimeter cells
106 flags.addFlag("Reco.EnableCaloRinger",
107 lambda prevFlags: prevFlags.Reco.EnableEgamma and
108 not prevFlags.Reco.EnableHI)
109
110 # This flags enables trigger data decoding (not trigger simulation)
111 # EDMVersion > 0 check prevents this flag being true in jobs before
112 # the trigger has executed, or where it was not executed.
113 flags.addFlag("Reco.EnableTrigger",
114 lambda prevFlags: prevFlags.Trigger.EDMVersion > 0)
115
116 # enable automatically for HI data
117 flags.addFlag("Reco.EnableHI",
118 lambda prevFlags: prevFlags.Reco.HIMode is not HIMode.pp)
119
120 flags.addFlag("Reco.HIMode", _hiModeChoice, type=HIMode)
121
122 # Enable alg for decorating EventInfo with BeamSpot info
123 # (maybe not always available for calibration runs, etc)
124 flags.addFlag("Reco.EnableBeamSpotDecoration",
125 lambda prevFlags: not prevFlags.Common.isOnline)
126
127 # Enable ZDC reconstruction if ZDC data is in Bytestream or simulated
128 flags.addFlag("Reco.EnableZDC",_recoZDC)
129
130 # Enable common thinning and other post-processing
131 flags.addFlag("Reco.EnablePostProcessing", True)
132 flags.addFlag("Reco.PostProcessing.ThinNegativeClusters",
133 lambda prevFlags: prevFlags.Reco.EnablePostProcessing and
134 prevFlags.Detector.EnableCalo and
135 prevFlags.Output.doWriteAOD and
136 prevFlags.Calo.Thin.NegativeEnergyCaloClusters and
137 not prevFlags.Reco.EnableHI)
138
139 flags.addFlag("Reco.PostProcessing.TRTAloneThinning",
140 lambda prevFlags: prevFlags.Reco.EnablePostProcessing and
141 prevFlags.Reco.EnableTracking and
142 prevFlags.Output.doWriteAOD)
143 flags.addFlag("Reco.PostProcessing.GeantTruthThinning",
144 lambda prevFlags: prevFlags.Reco.EnablePostProcessing and
145 prevFlags.Input.isMC and
146 prevFlags.Output.doWriteAOD)
147 flags.addFlag("Reco.PostProcessing.InDetForwardTrackParticleThinning",
148 lambda prevFlags: prevFlags.Reco.EnablePostProcessing and
149 prevFlags.Reco.EnableTracking and
150 prevFlags.Reco.EnableCombinedMuon and
151 prevFlags.Output.doWriteAOD)
152 return flags
153
154
155def printRecoFlags(flags):
156 # setup logging
157 from AthenaCommon.Logging import logging
158 log = logging.getLogger('RecoSteering')
159
160 # load flags
161 flags._loadDynaFlags('Detector')
162 flags._loadDynaFlags('Reco')
163
164 # generate common formatting string
165 item_len = 7
166 format_common = f'%-{item_len}s'
167
168 domain_len = 7
169 for d in _all_domains:
170 domain_len = max(domain_len, len(d) + 2)
171
172 enabled = []
173 for d in _all_domains:
174 if flags.hasFlag(f'Detector.Enable{d}'):
175 name = f'Detector.Enable{d}'
176 elif flags.hasFlag(f'Reco.Enable{d}'):
177 name = f'Reco.Enable{d}'
178 else:
179 raise RuntimeError(f'Unknown reconstruction domain {d}')
180
181 if flags[name] is not False:
182 enabled.append('ON')
183 else:
184 enabled.append('--')
185
186 format_header = f'%{domain_len}s ' + format_common
187 format = f'%{domain_len}s : ' + format_common
188 data = [_all_domains, enabled]
189 data = list(map(list, zip(*data)))
190
191 # print header rows
192 log.info(format_header, *(['', 'Enbl.']))
193 # print data
194 for row in data:
195 log.info(format, *row)
196
197
198def recoRunArgsToFlags(runArgs, flags):
199 if hasattr(runArgs, "runNumber") and not flags.Input.isMC and not flags.Overlay.DataOverlay and runArgs.runNumber not in flags.Input.RunNumbers:
200 flags.Input.RunNumbers = [runArgs.runNumber]
201 flags.Input.OverrideRunNumber = True
202
203 if hasattr(runArgs, "projectName"):
204 flags.Input.projectName = runArgs.projectName
205
206 # TODO: not handled yet
207 # --autoConfiguration
208 # --trigStream
209 # --topOptions
210 # --valid
211
212 # --AMITag
213 # --userExec
214 # --triggerConfig
215 # --trigFilterList
216
217
218def _recoZDC(prevFlags):
219 if prevFlags.Input.isMC:
220 return prevFlags.Detector.EnableZDC
221 else:
222 from AthenaConfiguration.AutoConfigFlags import GetFileMD
223 from libpyeformat_helper import SubDetector, DetectorMask
224 maskbits=GetFileMD(prevFlags.Input.Files).get("detectorMask",[0x0])
225 maskbits=maskbits[0] #Check the first input file
226 detMask=DetectorMask(maskbits & 0xFFFFFFFFFFFFFFFF, maskbits >> 64) #DetectorMask constructor swallows two 64bit ints
227 return detMask.is_set(SubDetector.FORWARD_ZDC)
228
229
230
231def _hiModeChoice(prevFlags):
232 if ("_hip" in prevFlags.Input.ProjectName):
233 return HIMode.HIP
234 elif ("_hi" in prevFlags.Input.ProjectName):
235 if (prevFlags.Input.TriggerStream == "physics_UPC"):
236 return HIMode.UPC
237 else:
238 return HIMode.HI
239 elif prevFlags.Input.isMC or prevFlags.Overlay.DataOverlay:
240 # it misses the run numbers for 2025, 2026
241 if prevFlags.Input.RunNumbers[0] in [460000, 488600]:
242 return HIMode.HI
243 # this is pO, OO, NeNe 2025
244 elif prevFlags.Input.RunNumbers[0] == 500700:
245 return HIMode.HIP
246 return HIMode.pp
#define max(a, b)
Definition cfImp.cxx:41
STL class.
T * get(TKey *tobj)
get a TObject* from a TKey* (why can't a TObject be a TKey?)
Definition hcg.cxx:130
recoRunArgsToFlags(runArgs, flags)