ATLAS Offline Software
Loading...
Searching...
No Matches
RecoSteering.py
Go to the documentation of this file.
1# Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
2
3from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
4from AthenaConfiguration.Enums import Format, MetadataCategory, HIMode
5
6def RecoSteering(flags):
7 """
8 Generates configuration of the reconstructions
9 """
10 from AthenaCommon.Logging import logging
11 log = logging.getLogger("RecoSteering")
12 from AthenaConfiguration.MainServicesConfig import MainServicesCfg
13 acc = MainServicesCfg(flags)
14
15 # setup input
16 acc.flagPerfmonDomain('IO')
17 if flags.Input.Format is Format.BS:
18 from ByteStreamCnvSvc.ByteStreamConfig import ByteStreamReadCfg
19 acc.merge(ByteStreamReadCfg(flags))
20 # Decorate EventInfo obj with Beam Spot information
21 if flags.Reco.EnableBeamSpotDecoration:
22 from xAODEventInfoCnv.xAODEventInfoCnvConfig import (
23 EventInfoBeamSpotDecoratorAlgCfg)
24 acc.merge(EventInfoBeamSpotDecoratorAlgCfg(flags))
25 if flags.Input.isMC:
26 from LumiBlockComps.LumiBlockMuWriterConfig import LumiBlockMuWriterCfg
27 acc.merge(LumiBlockMuWriterCfg(flags))
28 log.info("---------- Configured BS reading")
29 else:
30 from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
31 acc.merge(PoolReadCfg(flags))
32 # Check if running on legacy inputs
33 if "EventInfo" not in flags.Input.Collections:
34 from xAODEventInfoCnv.xAODEventInfoCnvConfig import (
35 EventInfoCnvAlgCfg)
36 acc.merge(EventInfoCnvAlgCfg(flags))
37 log.info("---------- Configured POOL reading")
38
39 acc.flagPerfmonDomain('Truth')
40 if (flags.Input.isMC or flags.Overlay.DataOverlay) and flags.Input.Format!=Format.BS:
41 # AOD2xAOD Truth conversion
42 if flags.Output.doGEN_AOD2xAOD:
43 from xAODTruthCnv.xAODTruthCnvConfig import GEN_AOD2xAODCfg
44 acc.merge(GEN_AOD2xAODCfg(flags))
45 log.info("---------- Configured AODtoxAOD Truth Conversion")
46 # copy background vertex collection to AOD
47 if flags.Overlay.DataOverlay:
48 from OutputStreamAthenaPool.OutputStreamConfig import addToAOD
49 acc.merge(addToAOD(flags, [f'xAOD::VertexContainer#{flags.Overlay.BkgPrefix}PrimaryVertices',
50 f'xAOD::VertexAuxContainer#{flags.Overlay.BkgPrefix}PrimaryVerticesAux.x.y.z']))
51
52 # We always want to write pileup truth jets to AOD,
53 # irrespective of whether we write jets to AOD in general
54 # This is because we cannot rebuild jets from pileup truth
55 # particles from the AOD
56 # but truth jets are not available for DataOverlay
57 if not flags.Overlay.DataOverlay:
58 from JetRecConfig.JetRecoSteering import addTruthPileupJetsToOutputCfg
59 acc.merge(addTruthPileupJetsToOutputCfg(flags))
60 log.info("---------- Configured Truth pileup jet writing")
61
62 # trigger
63 acc.flagPerfmonDomain('Trigger')
64 if flags.Reco.EnableTrigger:
65 from TriggerJobOpts.TriggerRecoConfig import TriggerRecoCfg
66 acc.merge(TriggerRecoCfg(flags))
67 log.info("---------- Configured trigger data decoding")
68
69 # calorimeter
70 acc.flagPerfmonDomain('Calo')
71 if flags.Detector.EnableCalo:
72 from CaloRec.CaloRecoConfig import CaloRecoCfg
73 acc.merge(CaloRecoCfg(flags))
74 log.info("---------- Configured calorimeter reconstruction")
75
76 # ID / ITk
77 acc.flagPerfmonDomain('ID')
78 if flags.Reco.EnableTracking:
79 if flags.Reco.EnableTrackOverlay:
80 from TrackOverlayRec.TrackOverlayRecoConfig import TrackOverlayRecoCfg
81 acc.merge(TrackOverlayRecoCfg(flags))
82 else:
83 from InDetConfig.TrackRecoConfig import InDetTrackRecoCfg
84 acc.merge(InDetTrackRecoCfg(flags))
85
86 log.info("---------- Configured tracking")
87
88 # HI
89 acc.flagPerfmonDomain('HI')
90 if flags.Reco.EnableHI:
91 from HIRecConfig.HIRecConfig import HIRecCfg
92 acc.merge(HIRecCfg(flags))
93 log.info("---------- Configured Heavy Ion reconstruction")
94
95 # HGTD
96 acc.flagPerfmonDomain('HGTD')
97 if flags.Reco.EnableHGTDExtension:
98 from HGTD_Config.HGTD_RecoConfig import HGTD_RecoCfg
99 acc.merge(HGTD_RecoCfg(flags))
100 log.info("---------- Configured HGTD track extension")
101
102 # Muon
103 acc.flagPerfmonDomain('Muon')
104 if flags.Detector.EnableMuon:
105 from MuonConfig.MuonReconstructionConfig import MuonReconstructionCfg
106 acc.merge(MuonReconstructionCfg(flags))
107 log.info("---------- Configured muon tracking")
108
109 # EGamma
110 acc.flagPerfmonDomain('EGamma')
111 if flags.Reco.EnableEgamma:
112 from egammaConfig.egammaSteeringConfig import EGammaSteeringCfg
113 acc.merge(EGammaSteeringCfg(flags))
114 log.info("---------- Configured e/gamma")
115
116 # Caching of CaloExtension for downstream
117 # Combined Performance algorithms.
118 acc.flagPerfmonDomain('CaloExtension')
119 if flags.Reco.EnableCaloExtension:
120 from TrackToCalo.CaloExtensionBuilderAlgCfg import (
121 CaloExtensionBuilderCfg)
122 acc.merge(CaloExtensionBuilderCfg(flags))
123 log.info("---------- Configured track calorimeter extension builder")
124
125 # Muon Combined
126 acc.flagPerfmonDomain('CombinedMuon')
127 if flags.Reco.EnableCombinedMuon:
128 from MuonCombinedConfig.MuonCombinedReconstructionConfig import (
129 MuonCombinedReconstructionCfg)
130 acc.merge(MuonCombinedReconstructionCfg(flags))
131 log.info("---------- Configured combined muon reconstruction")
132
133 # TrackParticleCellAssociation
134 # add cells crossed by high pt ID tracks
135 acc.flagPerfmonDomain('TrackCellAssociation')
136 if flags.Reco.EnableTrackCellAssociation:
137 from TrackParticleAssociationAlgs.TrackParticleAssociationAlgsConfig import (
138 TrackParticleCellAssociationCfg)
139 acc.merge(TrackParticleCellAssociationCfg(flags))
140 log.info("---------- Configured track particle-cell association")
141
142 # PFlow
143 acc.flagPerfmonDomain('PFlow')
144 if flags.Reco.EnablePFlow:
145 from eflowRec.PFRun3Config import PFCfg
146 acc.merge(PFCfg(flags))
147 log.info("---------- Configured particle flow")
148
149 # EGamma and CombinedMuon isolation
150 acc.flagPerfmonDomain('Isolation')
151 if flags.Reco.EnableIsolation:
152 from IsolationAlgs.IsolationSteeringConfig import IsolationSteeringCfg
153 acc.merge(IsolationSteeringCfg(flags))
154 log.info("---------- Configured isolation")
155
156 # jets
157 acc.flagPerfmonDomain('Jets')
158 if flags.Reco.EnableJet:
159 from JetRecConfig.JetRecoSteering import JetRecoSteeringCfg
160 acc.merge(JetRecoSteeringCfg(flags))
161 log.info("---------- Configured Jets")
162
163 # btagging
164 acc.flagPerfmonDomain('FTag')
165 if flags.Reco.EnableBTagging:
166 from BTagging.BTagConfig import BTagRecoSplitCfg
167 acc.merge(BTagRecoSplitCfg(flags))
168 log.info("---------- Configured btagging")
169
170 # Tau
171 acc.flagPerfmonDomain('Tau')
172 if flags.Reco.EnableTau:
173 from tauRec.TauConfig import TauReconstructionCfg
174 acc.merge(TauReconstructionCfg(flags))
175 log.info("---------- Configured tau reconstruction")
176 # PFlow tau links
177 if flags.Reco.EnablePFlow:
178 from eflowRec.PFRun3Config import PFTauFELinkCfg
179 acc.merge(PFTauFELinkCfg(flags))
180 log.info("---------- Configured particle flow tau FE linking")
181
182 acc.flagPerfmonDomain('Jets')
183 if flags.Reco.EnableGlobalFELinking:
184 # We also need to build links between the newly
185 # created jet constituents (GlobalFE)
186 # and electrons,photons,muons and taus
187 from eflowRec.PFCfg import PFGlobalFlowElementLinkingCfg
188 acc.merge(PFGlobalFlowElementLinkingCfg(flags))
189 log.info("---------- Configured particle flow global linking")
190
191 # MET
192 acc.flagPerfmonDomain('MET')
193 if flags.Reco.EnableMet:
194 from METReconstruction.METRecCfg import METCfg
195 acc.merge(METCfg(flags))
196 log.info("---------- Configured MET")
197
198 # Calo Rings
199 acc.flagPerfmonDomain('CaloRings')
200 if flags.Reco.EnableCaloRinger:
201 from CaloRingerAlgs.CaloRingerAlgsConfig import CaloRingerSteeringCfg
202 acc.merge(CaloRingerSteeringCfg(flags))
203 log.info("---------- Configured Calo Rings")
204
205 # AFP
206 acc.flagPerfmonDomain('AFP')
207 if flags.Detector.EnableAFP:
208 from ForwardRec.AFPRecConfig import AFPRecCfg
209 acc.merge(AFPRecCfg(flags))
210 log.info("---------- Configured AFP reconstruction")
211
212 # Lucid
213 acc.flagPerfmonDomain('Lucid')
214 if flags.Detector.EnableLucid:
215 from ForwardRec.LucidRecConfig import LucidRecCfg
216 acc.merge(LucidRecCfg(flags))
217 log.info("---------- Configured Lucid reconstruction")
218
219 # ZDC
220 acc.flagPerfmonDomain('ZDC')
221 if flags.Reco.EnableZDC:
222 from ZdcRec.ZdcRecConfig import ZdcRecCfg
223 acc.merge(ZdcRecCfg(flags))
224 log.info("---------- Configured ZDC reconstruction")
225
226 # Monitoring
227 acc.flagPerfmonDomain('DQM')
228 if flags.DQ.doMonitoring:
229 from AthenaMonitoring.AthenaMonitoringCfg import (
230 AthenaMonitoringCfg, AthenaMonitoringPostprocessingCfg)
231 acc.merge(AthenaMonitoringCfg(flags))
232 if flags.DQ.doPostProcessing:
233 acc.merge(AthenaMonitoringPostprocessingCfg(flags))
234 log.info("---------- Configured DQ monitoring")
235
236 # Setup the final post-processing
237 acc.flagPerfmonDomain('PostProcessing')
238 if flags.Reco.EnablePostProcessing:
239 acc.merge(RecoPostProcessingCfg(flags))
240 log.info("---------- Configured post-processing")
241
242 # Setup data overlay reconstruction
243 if flags.Overlay.DataOverlay:
244 # Override conditions for data overlay
245 if flags.Overlay.DataOverlayConditions:
246 from PyJobTransforms.TransformUtils import executeFromFragment
247 executeFromFragment(flags.Overlay.DataOverlayConditions, flags, acc)
248
249 # setup output
250 acc.flagPerfmonDomain('IO')
251 from xAODMetaDataCnv.InfileMetaDataConfig import SetupMetaDataForStreamCfg
252 from OutputStreamAthenaPool.OutputStreamConfig import outputStreamName
253
254 if flags.Output.doWriteESD:
255 # Needed for Trk::Tracks TPCnv
256 from TrkEventCnvTools.TrkEventCnvToolsConfig import (
257 TrkEventCnvSuperToolCfg)
258 acc.merge(TrkEventCnvSuperToolCfg(flags))
259 # Needed for MetaData
260 acc.merge(
261 SetupMetaDataForStreamCfg(
262 flags,
263 "ESD",
264 createMetadata=[
265 MetadataCategory.ByteStreamMetaData,
266 MetadataCategory.LumiBlockMetaData,
267 MetadataCategory.TruthMetaData,
268 MetadataCategory.IOVMetaData,
269 ],
270 )
271 )
272 log.info("ESD ItemList: %s", acc.getEventAlgo(
273 outputStreamName("ESD")).ItemList)
274 log.info("ESD MetadataItemList: %s", acc.getEventAlgo(
275 outputStreamName("ESD")).MetadataItemList)
276 log.info("---------- Configured ESD writing")
277
278 if flags.Output.doWriteAOD:
279 # Needed for MetaData
280 acc.merge(
281 SetupMetaDataForStreamCfg(
282 flags,
283 "AOD",
284 createMetadata=[
285 MetadataCategory.ByteStreamMetaData,
286 MetadataCategory.LumiBlockMetaData,
287 MetadataCategory.TruthMetaData,
288 MetadataCategory.IOVMetaData,
289 ],
290 )
291 )
292 log.info("AOD ItemList: %s", acc.getEventAlgo(
293 outputStreamName("AOD")).ItemList)
294 log.info("AOD MetadataItemList: %s", acc.getEventAlgo(
295 outputStreamName("AOD")).MetadataItemList)
296 log.info("---------- Configured AOD writing")
297
298 if flags.Output.doJiveXML:
299 from JiveXML.JiveXMLConfig import AlgoJiveXMLCfg
300 acc.merge(AlgoJiveXMLCfg(flags))
301 log.info("---------- Configured JiveXML writing")
302
303 return acc
304
305
307 acc = ComponentAccumulator()
308 if flags.Reco.PostProcessing.ThinNegativeClusters:
309 from ThinningUtils.ThinNegativeEnergyCaloClustersConfig import (
310 ThinNegativeEnergyCaloClustersCfg)
311 acc.merge(ThinNegativeEnergyCaloClustersCfg(flags))
312 if flags.Reco.PostProcessing.TRTAloneThinning:
313 from ThinningUtils.ThinTRTStandaloneConfig import (
314 ThinTRTStandaloneCfg)
315 acc.merge(ThinTRTStandaloneCfg(flags))
316 if flags.Reco.PostProcessing.InDetForwardTrackParticleThinning:
317 from ThinningUtils.ThinInDetForwardTrackParticlesConfig import (
318 ThinInDetForwardTrackParticlesCfg)
319 acc.merge(ThinInDetForwardTrackParticlesCfg(flags))
320 if flags.Reco.PostProcessing.GeantTruthThinning:
321 from ThinningUtils.ThinGeantTruthConfig import (
322 ThinGeantTruthCfg)
323 acc.merge(ThinGeantTruthCfg(flags))
324 pass
325
326 if flags.Tracking.thinInDetClustersOnTrack:
327 from ThinningUtils.ThinInDetClustersConfig import (
328 ThinInDetClustersCfg)
329 acc.merge(ThinInDetClustersCfg(flags))
330
331 if flags.Output.doWriteAOD and flags.Reco.HIMode in [HIMode.UPC, HIMode.HIP]:
332 from HIGlobal.RecordExtraInfoConfig import addMBTS, addSpacePoints
333 acc.merge(addMBTS(flags))
334 if flags.Reco.HIMode is HIMode.UPC:
335 acc.merge(addSpacePoints(flags))
336
337 return acc
Definition PFCfg.py:1