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
48 return acc
49
50
52 # Construct main services
54
55 acc.merge(DigitizationMainContentCfg(flags))
56
57 return acc
58
60
61 acc = ComponentAccumulator()
62
63 acc.merge(writeDigitizationMetadata(flags))
64
65 if not flags.Digitization.PileUp:
66 # Old EventInfo conversion
67 if "EventInfo" not in flags.Input.Collections:
68 from xAODEventInfoCnv.xAODEventInfoCnvConfig import EventInfoCnvAlgCfg
69 acc.merge(EventInfoCnvAlgCfg(flags,
70 inputKey="McEventInfo",
71 outputKey="Input_EventInfo"))
72
73 from xAODEventInfoCnv.xAODEventInfoCnvConfig import EventInfoUpdateFromContextAlgCfg
74 acc.merge(EventInfoUpdateFromContextAlgCfg(flags))
75
76 # Decorate pile-up values
77 from DigitizationConfig.PileUpConfig import NoPileUpMuWriterCfg
78 acc.merge(NoPileUpMuWriterCfg(flags))
79
80 # Signal-only truth information
81 if flags.Digitization.PileUp:
82 if HepMCVersion() == 3:
83 from MCTruthSimAlgs.MCTruthSimAlgsConfig import SimpleMergeMcEventCollCfg as MergeMcEventCollCfg
84 from MCTruthSimAlgs.MCTruthSimAlgsConfig import InTimeOnlySimpleMergeMcEventCollCfg as InTimeOnlyMergeMcEventCollCfg
85 from MCTruthSimAlgs.MCTruthSimAlgsConfig import SignalOnlySimpleMergeMcEventCollCfg as SignalOnlyMergeMcEventCollCfg
86 else:
87 from MCTruthSimAlgs.MCTruthSimAlgsConfig import MergeMcEventCollCfg
88 from MCTruthSimAlgs.MCTruthSimAlgsConfig import InTimeOnlyMcEventCollCfg as InTimeOnlyMergeMcEventCollCfg
89 from MCTruthSimAlgs.MCTruthSimAlgsConfig import SignalOnlyMcEventCollCfg as SignalOnlyMergeMcEventCollCfg
90 from MCTruthSimAlgs.MCTruthSimAlgsConfig import (
91 MergeAntiKt4TruthJetsCfg,
92 MergeAntiKt6TruthJetsCfg,
93 MergeTruthParticlesCfg,
94 MergeMuonEntryLayerCfg,
95 MergeCalibHitsCfg,
96 MergeHijingParsCfg,
97 )
98 if flags.Common.ProductionStep is not ProductionStep.FastChain and getEnabledDetectors(flags):
99 if flags.Digitization.DigiSteeringConf=="StandardPileUpToolsAlg":
100 acc.merge(MergeMcEventCollCfg(flags))
101 elif flags.Digitization.DigiSteeringConf=="StandardInTimeOnlyTruthPileUpToolsAlg":
102 acc.merge(InTimeOnlyMergeMcEventCollCfg(flags))
103 else:
104 acc.merge(SignalOnlyMergeMcEventCollCfg(flags))
105 if flags.Digitization.EnableTruth:
106 puCollections = pileupInputCollections(flags.Digitization.PU.LowPtMinBiasInputCols)
107 if "AntiKt4TruthJets" in puCollections:
108 acc.merge(MergeAntiKt4TruthJetsCfg(flags))
109 if "AntiKt6TruthJets" in puCollections:
110 acc.merge(MergeAntiKt6TruthJetsCfg(flags))
111 if "TruthPileupParticles" in puCollections:
112 acc.merge(MergeTruthParticlesCfg(flags))
113 acc.merge(MergeMuonEntryLayerCfg(flags))
114 acc.merge(MergeCalibHitsCfg(flags))
115 if 'Hijing_event_params' in pileupInputCollections(flags.Digitization.PU.CavernInputCols):
116 acc.merge(MergeHijingParsCfg(flags))
117
118
119 from DigitizationConfig.TruthDigitizationOutputConfig import TruthDigitizationOutputCfg
120 acc.merge(TruthDigitizationOutputCfg(flags))
121
122 # Beam spot reweighting
123 if flags.Common.ProductionStep != ProductionStep.PileUpPresampling and flags.Digitization.InputBeamSigmaZ > 0:
124 from BeamEffects.BeamEffectsAlgConfig import BeamSpotReweightingAlgCfg
125 acc.merge(BeamSpotReweightingAlgCfg(flags))
126
127 # Inner Detector
128 if flags.Detector.EnableBCM:
129 from BCM_Digitization.BCM_DigitizationConfig import BCM_DigitizationCfg
130 acc.merge(BCM_DigitizationCfg(flags))
131 if flags.Detector.EnablePixel:
132 from PixelDigitization.PixelDigitizationConfig import PixelDigitizationCfg
133 acc.merge(PixelDigitizationCfg(flags))
134 if flags.Detector.EnableSCT:
135 from SCT_Digitization.SCT_DigitizationConfig import SCT_DigitizationCfg
136 acc.merge(SCT_DigitizationCfg(flags))
137 if flags.Detector.EnableTRT:
138 from TRT_Digitization.TRT_DigitizationConfig import TRT_DigitizationCfg
139 acc.merge(TRT_DigitizationCfg(flags))
140
141 # ITk
142 if flags.Detector.EnableITkPixel:
143 from PixelDigitization.ITkPixelDigitizationConfig import ITkPixelDigitizationCfg
144 acc.merge(ITkPixelDigitizationCfg(flags))
145 if flags.Detector.EnableITkStrip:
146 from StripDigitization.StripDigitizationConfig import ITkStripDigitizationCfg
147 acc.merge(ITkStripDigitizationCfg(flags))
148 if flags.Detector.EnablePLR:
149 from PixelDigitization.PLR_DigitizationConfig import PLR_DigitizationCfg
150 acc.merge(PLR_DigitizationCfg(flags))
151
152 # HGTD
153 if flags.Detector.EnableHGTD:
154 from HGTD_Digitization.HGTD_DigitizationConfig import HGTD_DigitizationCfg
155 acc.merge(HGTD_DigitizationCfg(flags))
156
157 # Calorimeter
158 if flags.Detector.EnableLAr:
159 from LArDigitization.LArDigitizationConfig import LArTriggerDigitizationCfg
160 acc.merge(LArTriggerDigitizationCfg(flags))
161 if flags.Detector.EnableTile:
162 from TileSimAlgs.TileDigitizationConfig import TileDigitizationCfg, TileTriggerDigitizationCfg
163 acc.merge(TileDigitizationCfg(flags))
164 acc.merge(TileTriggerDigitizationCfg(flags))
165
166 # Muon Spectrometer
167 if flags.Detector.EnableMDT:
168 from MuonConfig.MDT_DigitizationConfig import MDT_DigitizationDigitToRDOCfg
169 acc.merge(MDT_DigitizationDigitToRDOCfg(flags))
170 if flags.Detector.EnableTGC:
171 from MuonConfig.TGC_DigitizationConfig import TGC_DigitizationDigitToRDOCfg
172 acc.merge(TGC_DigitizationDigitToRDOCfg(flags))
173 if flags.Detector.EnableRPC:
174 from MuonConfig.RPC_DigitizationConfig import RPC_DigitizationDigitToRDOCfg
175 acc.merge(RPC_DigitizationDigitToRDOCfg(flags))
176 if flags.Detector.EnableCSC:
177 from MuonConfig.CSC_DigitizationConfig import CSC_DigitizationDigitToRDOCfg
178 acc.merge(CSC_DigitizationDigitToRDOCfg(flags))
179 if flags.Detector.EnablesTGC:
180 from MuonConfig.sTGC_DigitizationConfig import sTGC_DigitizationDigitToRDOCfg
181 acc.merge(sTGC_DigitizationDigitToRDOCfg(flags))
182 if flags.Detector.EnableMM:
183 from MuonConfig.MM_DigitizationConfig import MM_DigitizationDigitToRDOCfg
184 acc.merge(MM_DigitizationDigitToRDOCfg(flags))
185
186 # LUCID
187 if flags.Detector.EnableLucid:
188 from LUCID_Digitization.LUCID_DigitizationConfig import LUCID_DigitizationCfg
189 acc.merge(LUCID_DigitizationCfg(flags))
190
191 # AFP
192 if flags.Detector.EnableAFP:
193 from AFP_Digitization.AFP_DigitizationConfig import AFP_DigitizationCfg
194 acc.merge(AFP_DigitizationCfg(flags))
195
196 # ALFA
197 if flags.Detector.EnableALFA:
198 from ALFA_Digitization.ALFA_DigitizationConfig import ALFA_DigitizationCfg
199 acc.merge(ALFA_DigitizationCfg(flags))
200
201 # ZDC
202 if flags.Detector.EnableZDC:
203 from ZDC_SimuDigitization.ZDC_SimuDigitizationConfig import ZDC_DigitizationCfg
204 acc.merge(ZDC_DigitizationCfg(flags))
205
206 # Add in-file MetaData
207 from xAODMetaDataCnv.InfileMetaDataConfig import SetupMetaDataForStreamCfg
208 acc.merge(SetupMetaDataForStreamCfg(flags, "RDO"))
209
210 return acc
211
212
214 """MessageSvc for digitization and overlay"""
215 MessageSvc = CompFactory.MessageSvc
216 acc = ComponentAccumulator()
217 acc.addService(MessageSvc(setError=["HepMcParticleLink"]))
218 return acc
219
220
222 """Testing digitization post-include"""
223 # dump config
224 configName = "DigiPUConfigCA" if flags.Digitization.PileUp else "DigiConfigCA"
225 from AthenaConfiguration.MainServicesConfig import JobOptionsDumpCfg
226 acc.merge(JobOptionsDumpCfg(flags, fileName=f"{configName}.txt"))
227
228 # dump pickle
229 with open(f"{configName}.pkl", "wb") as f:
230 acc.store(f)