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