ATLAS Offline Software
Loading...
Searching...
No Matches
DigitizationSteering.py
Go to the documentation of this file.
1#!/usr/bin/env python
2"""Main steering for the digitization jobs
3
4Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
5"""
6
7from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
8from AthenaConfiguration.ComponentFactory import CompFactory
9from AthenaConfiguration.Enums import ProductionStep
10from AthenaConfiguration.DetectorConfigFlags import getEnabledDetectors
11from AthenaConfiguration.MainServicesConfig import MainServicesCfg
12from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
13from DigitizationConfig.DigitizationParametersConfig import writeDigitizationMetadata
14from RunDependentSimComps.PileUpUtils import pileupInputCollections
15
16from AthenaCommon.Logging import logging
17logDigiSteering = logging.getLogger('DigitizationSteering')
18
20 try:
21 from AthenaPython.PyAthena import HepMC3 # noqa: F401
22 HepMCVersion=3
23 except ImportError:
24 HepMCVersion=2
25 return HepMCVersion
26
27
29 """Configure main digitization services"""
30 if flags.Digitization.PileUp:
31 if flags.Concurrency.NumThreads > 0:
32 logDigiSteering.info("DigitizationMainServicesCfg: Attempting to run pile-up digitization AthenaMT using %s threads!", str(flags.Concurrency.NumThreads))
33 logDigiSteering.info("DigitizationMainServicesCfg: Using new PileUpMT code.")
34 # raise RuntimeError("DigitizationSteering.DigitizationMainServicesCfg: Running pile-up digitization with AthenaMT is not supported. Please update your configuration.")
35 from DigitizationConfig.PileUpMTConfig import PileUpMTAlgCfg
36 acc = MainServicesCfg(flags)
37 acc.merge(PileUpMTAlgCfg(flags))
38 else:
39 from DigitizationConfig.PileUpConfig import PileUpEventLoopMgrCfg
40 # For MP, we let MainServicesCfg create the MpEventLoopMgr
41 acc = MainServicesCfg(flags, createEventLoopMgr=(flags.Concurrency.NumProcs > 0))
42 acc.merge(PileUpEventLoopMgrCfg(flags))
43 else:
44 acc = MainServicesCfg(flags)
45
46 acc.merge(PoolReadCfg(flags))
47 evSel = acc.getService("EventSelector")
48 evSel.CollectionType = "RootCollection"
49
50 return acc
51
52
54 # Construct main services
56
57 acc.merge(DigitizationMainContentCfg(flags))
58
59 return acc
60
62
63 acc = ComponentAccumulator()
64
65 acc.merge(writeDigitizationMetadata(flags))
66
67 if not flags.Digitization.PileUp:
68 # Old EventInfo conversion
69 if "EventInfo" not in flags.Input.Collections:
70 from xAODEventInfoCnv.xAODEventInfoCnvConfig import EventInfoCnvAlgCfg
71 acc.merge(EventInfoCnvAlgCfg(flags,
72 inputKey="McEventInfo",
73 outputKey="Input_EventInfo"))
74
75 from xAODEventInfoCnv.xAODEventInfoCnvConfig import EventInfoUpdateFromContextAlgCfg
76 acc.merge(EventInfoUpdateFromContextAlgCfg(flags))
77
78 # Decorate pile-up values
79 from DigitizationConfig.PileUpConfig import NoPileUpMuWriterCfg
80 acc.merge(NoPileUpMuWriterCfg(flags))
81
82 # Signal-only truth information
83 if flags.Digitization.PileUp:
84 if HepMCVersion() == 3:
85 from MCTruthSimAlgs.MCTruthSimAlgsConfig import SimpleMergeMcEventCollCfg as MergeMcEventCollCfg
86 from MCTruthSimAlgs.MCTruthSimAlgsConfig import InTimeOnlySimpleMergeMcEventCollCfg as InTimeOnlyMergeMcEventCollCfg
87 from MCTruthSimAlgs.MCTruthSimAlgsConfig import SignalOnlySimpleMergeMcEventCollCfg as SignalOnlyMergeMcEventCollCfg
88 else:
89 from MCTruthSimAlgs.MCTruthSimAlgsConfig import MergeMcEventCollCfg
90 from MCTruthSimAlgs.MCTruthSimAlgsConfig import InTimeOnlyMcEventCollCfg as InTimeOnlyMergeMcEventCollCfg
91 from MCTruthSimAlgs.MCTruthSimAlgsConfig import SignalOnlyMcEventCollCfg as SignalOnlyMergeMcEventCollCfg
92 from MCTruthSimAlgs.MCTruthSimAlgsConfig import (
93 MergeAntiKt4TruthJetsCfg,
94 MergeAntiKt6TruthJetsCfg,
95 MergeTruthParticlesCfg,
96 MergeMuonEntryLayerCfg,
97 MergeCalibHitsCfg,
98 MergeHijingParsCfg,
99 )
100 if flags.Common.ProductionStep is not ProductionStep.FastChain and getEnabledDetectors(flags):
101 if flags.Digitization.DigiSteeringConf=="StandardPileUpToolsAlg":
102 acc.merge(MergeMcEventCollCfg(flags))
103 elif flags.Digitization.DigiSteeringConf=="StandardInTimeOnlyTruthPileUpToolsAlg":
104 acc.merge(InTimeOnlyMergeMcEventCollCfg(flags))
105 else:
106 acc.merge(SignalOnlyMergeMcEventCollCfg(flags))
107 if flags.Digitization.EnableTruth:
108 puCollections = pileupInputCollections(flags.Digitization.PU.LowPtMinBiasInputCols)
109 if "AntiKt4TruthJets" in puCollections:
110 acc.merge(MergeAntiKt4TruthJetsCfg(flags))
111 if "AntiKt6TruthJets" in puCollections:
112 acc.merge(MergeAntiKt6TruthJetsCfg(flags))
113 if "TruthPileupParticles" in puCollections:
114 acc.merge(MergeTruthParticlesCfg(flags))
115 acc.merge(MergeMuonEntryLayerCfg(flags))
116 acc.merge(MergeCalibHitsCfg(flags))
117 if 'Hijing_event_params' in pileupInputCollections(flags.Digitization.PU.CavernInputCols):
118 acc.merge(MergeHijingParsCfg(flags))
119
120
121 from DigitizationConfig.TruthDigitizationOutputConfig import TruthDigitizationOutputCfg
122 acc.merge(TruthDigitizationOutputCfg(flags))
123
124 # Beam spot reweighting
125 if flags.Common.ProductionStep != ProductionStep.PileUpPresampling and flags.Digitization.InputBeamSigmaZ > 0:
126 from BeamEffects.BeamEffectsAlgConfig import BeamSpotReweightingAlgCfg
127 acc.merge(BeamSpotReweightingAlgCfg(flags))
128
129 # Inner Detector
130 if flags.Detector.EnableBCM:
131 from BCM_Digitization.BCM_DigitizationConfig import BCM_DigitizationCfg
132 acc.merge(BCM_DigitizationCfg(flags))
133 if flags.Detector.EnablePixel:
134 from PixelDigitization.PixelDigitizationConfig import PixelDigitizationCfg
135 acc.merge(PixelDigitizationCfg(flags))
136 if flags.Detector.EnableSCT:
137 from SCT_Digitization.SCT_DigitizationConfig import SCT_DigitizationCfg
138 acc.merge(SCT_DigitizationCfg(flags))
139 if flags.Detector.EnableTRT:
140 from TRT_Digitization.TRT_DigitizationConfig import TRT_DigitizationCfg
141 acc.merge(TRT_DigitizationCfg(flags))
142
143 # ITk
144 if flags.Detector.EnableITkPixel:
145 from PixelDigitization.ITkPixelDigitizationConfig import ITkPixelDigitizationCfg
146 acc.merge(ITkPixelDigitizationCfg(flags))
147 if flags.Detector.EnableITkStrip:
148 from StripDigitization.StripDigitizationConfig import ITkStripDigitizationCfg
149 acc.merge(ITkStripDigitizationCfg(flags))
150 if flags.Detector.EnablePLR:
151 from PixelDigitization.PLR_DigitizationConfig import PLR_DigitizationCfg
152 acc.merge(PLR_DigitizationCfg(flags))
153
154 # HGTD
155 if flags.Detector.EnableHGTD:
156 from HGTD_Digitization.HGTD_DigitizationConfig import HGTD_DigitizationCfg
157 acc.merge(HGTD_DigitizationCfg(flags))
158
159 # Calorimeter
160 if flags.Detector.EnableLAr:
161 from LArDigitization.LArDigitizationConfig import LArTriggerDigitizationCfg
162 acc.merge(LArTriggerDigitizationCfg(flags))
163 if flags.Detector.EnableTile:
164 from TileSimAlgs.TileDigitizationConfig import TileDigitizationCfg, TileTriggerDigitizationCfg
165 acc.merge(TileDigitizationCfg(flags))
166 acc.merge(TileTriggerDigitizationCfg(flags))
167
168 # Muon Spectrometer
169 if flags.Detector.EnableMDT:
170 from MuonConfig.MDT_DigitizationConfig import MDT_DigitizationDigitToRDOCfg
171 acc.merge(MDT_DigitizationDigitToRDOCfg(flags))
172 if flags.Detector.EnableTGC:
173 from MuonConfig.TGC_DigitizationConfig import TGC_DigitizationDigitToRDOCfg
174 acc.merge(TGC_DigitizationDigitToRDOCfg(flags))
175 if flags.Detector.EnableRPC:
176 from MuonConfig.RPC_DigitizationConfig import RPC_DigitizationDigitToRDOCfg
177 acc.merge(RPC_DigitizationDigitToRDOCfg(flags))
178 if flags.Detector.EnableCSC:
179 from MuonConfig.CSC_DigitizationConfig import CSC_DigitizationDigitToRDOCfg
180 acc.merge(CSC_DigitizationDigitToRDOCfg(flags))
181 if flags.Detector.EnablesTGC:
182 from MuonConfig.sTGC_DigitizationConfig import sTGC_DigitizationDigitToRDOCfg
183 acc.merge(sTGC_DigitizationDigitToRDOCfg(flags))
184 if flags.Detector.EnableMM:
185 from MuonConfig.MM_DigitizationConfig import MM_DigitizationDigitToRDOCfg
186 acc.merge(MM_DigitizationDigitToRDOCfg(flags))
187
188 # LUCID
189 if flags.Detector.EnableLucid:
190 from LUCID_Digitization.LUCID_DigitizationConfig import LUCID_DigitizationCfg
191 acc.merge(LUCID_DigitizationCfg(flags))
192
193 # AFP
194 if flags.Detector.EnableAFP:
195 from AFP_Digitization.AFP_DigitizationConfig import AFP_DigitizationCfg
196 acc.merge(AFP_DigitizationCfg(flags))
197
198 # ALFA
199 if flags.Detector.EnableALFA:
200 from ALFA_Digitization.ALFA_DigitizationConfig import ALFA_DigitizationCfg
201 acc.merge(ALFA_DigitizationCfg(flags))
202
203 # ZDC
204 if flags.Detector.EnableZDC:
205 from ZDC_SimuDigitization.ZDC_SimuDigitizationConfig import ZDC_DigitizationCfg
206 acc.merge(ZDC_DigitizationCfg(flags))
207
208 # Add in-file MetaData
209 from xAODMetaDataCnv.InfileMetaDataConfig import SetupMetaDataForStreamCfg
210 acc.merge(SetupMetaDataForStreamCfg(flags, "RDO"))
211
212 return acc
213
214
216 """MessageSvc for digitization and overlay"""
217 MessageSvc = CompFactory.MessageSvc
218 acc = ComponentAccumulator()
219 acc.addService(MessageSvc(setError=["HepMcParticleLink"]))
220 return acc
221
222
224 """Testing digitization post-include"""
225 # dump config
226 configName = "DigiPUConfigCA" if flags.Digitization.PileUp else "DigiConfigCA"
227 from AthenaConfiguration.MainServicesConfig import JobOptionsDumpCfg
228 acc.merge(JobOptionsDumpCfg(flags, fileName=f"{configName}.txt"))
229
230 # dump pickle
231 with open(f"{configName}.pkl", "wb") as f:
232 acc.store(f)