ATLAS Offline Software
Loading...
Searching...
No Matches
InDetTrackSystematicsToolsConfig.py
Go to the documentation of this file.
1# Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
2# Configuration of InDetTrackSystematicsTools package
3from AnaAlgorithm.DualUseConfig import isAthena
4if isAthena:
5 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
6 from AthenaConfiguration.ComponentFactory import CompFactory
7from AthenaConfiguration.Enums import LHCPeriod
8from Campaigns.Utils import Campaign
9from AthenaCommon.Logging import logging
10
11def InDetTrackTruthOriginToolCfg(flags, name="InDetTrackTruthOriginTool", **kwargs):
12 acc = ComponentAccumulator()
13
14 log = logging.getLogger("InDetTrackTruthOriginTool")
15 # this might fail if we're in AthAnalysis
16 try:
17 kwargs.setdefault("isFullPileUpTruth", flags.Digitization.PileUp
18 and flags.Digitization.DigiSteeringConf in ['StandardPileUpToolsAlg',
19 'StandardInTimeOnlyTruthPileUpToolsAlg',
20 'StandardInTimeOnlyGeantinoTruthPileUpToolsAlg'])
21 except AttributeError:
22 # assume this should be false if we're unable to load flags (temporary solution)
23 kwargs.setdefault("isFullPileUpTruth", False)
24 log.warning("Unable to load digi flags, assuming isFullPileUpTruth=False. Normal if you're in AthAnalysis.")
25
26 acc.setPrivateTools(
27 CompFactory.InDet.InDetTrackTruthOriginTool(name, **kwargs))
28 return acc
29
30def InDetTrackTruthFilterToolCfg(flags, name="InDetTrackTruthFilterTool",
31 seed=1, **kwargs):
32 acc = ComponentAccumulator()
33 kwargs.setdefault("Seed", seed)
34
35 if "trackOriginTool" not in kwargs:
36 kwargs.setdefault("trackOriginTool", acc.popToolsAndMerge(
38
39 # 2022 recommendations (MC23a)
40 if flags.Input.MCCampaign in [Campaign.MC23a, Campaign.MC23d, Campaign.MC23e]:
41 kwargs.setdefault("calibFileNomEff", "InDetTrackSystematicsTools/CalibData_22.0_2022-v00/TrackingRecommendations_prelim_rel22.root")
42 kwargs.setdefault("fFakeLoose", 0.40)
43 kwargs.setdefault("fFakeTight", 1.00)
44 # Run 2 recommendations (MC20)
45 elif flags.GeoModel.Run is LHCPeriod.Run2:
46 kwargs.setdefault("calibFileNomEff", "InDetTrackSystematicsTools/CalibData_22.0_2022-v00/TrackingRecommendations_prelim_rel22.root")
47 kwargs.setdefault("fFakeLoose", 0.10)
48 kwargs.setdefault("fFakeTight", 1.00)
49 else:
50 raise ValueError(f"InDetTrackTruthFilterTool: Recommendations not yet available for campaign {flags.Input.MCCampaign}! Please check the configuration and contact Tracking CP if you believe this message is in error.")
51
52 acc.setPrivateTools(
53 CompFactory.InDet.InDetTrackTruthFilterTool(name, **kwargs))
54 return acc
55
56def JetTrackFilterToolCfg(flags, name="JetTrackFilterTool", seed=2, **kwargs):
57 acc = ComponentAccumulator()
58 kwargs.setdefault("Seed", seed)
59
60 if "trackOriginTool" not in kwargs:
61 kwargs.setdefault("trackOriginTool", acc.popToolsAndMerge(
63
64 # TIDE fake rate recommendations:
65 # Run 3 (MC23): https://indico.cern.ch/event/1587937/#40-fake-tracks-in-the-jet-core
66 if flags.GeoModel.Run >= LHCPeriod.Run3:
67 kwargs.setdefault("FakeUncertainty", 0.25)
68 # Run 2 (MC20): https://cds.cern.ch/record/2859907
69 else:
70 kwargs.setdefault("FakeUncertainty", 0.35)
71
72 # TIDE FLost recommendations:
73 # Run 3 (MC23)
74 if flags.GeoModel.Run >= LHCPeriod.Run3:
75 # 2022/23 (MC23a/d): https://indico.cern.ch/event/1531052/#38-flost-update
76 if flags.Input.MCCampaign in [Campaign.MC23a, Campaign.MC23d]:
77 kwargs.setdefault("FLostUncertainty", 0.24)
78 # 2024 (MC23e): https://indico.cern.ch/event/1662051/#46-update-on-2024-flost-measur
79 elif flags.Input.MCCampaign is Campaign.MC23e:
80 kwargs.setdefault("FLostUncertainty", 0.32)
81 else:
82 raise ValueError(f"JetTrackFilterTool: Recommendations not yet available for campaign {flags.Input.MCCampaign}! Please check the configuration and contact Tracking CP if you believe this message is in error.")
83 # Run 2 (MC20)
84 else:
85 kwargs.setdefault("FLostUncertainty", 0.24)
86
87 acc.setPrivateTools(CompFactory.InDet.JetTrackFilterTool(name, **kwargs))
88 return acc
89
90def InclusiveTrackFilterToolCfg(flags, name="InclusiveTrackFilterTool",
91 seed=3, **kwargs):
92 acc = ComponentAccumulator()
93 kwargs.setdefault("Seed", seed)
94
95 # 2022 recommendations (MC23a)
96 if flags.Input.MCCampaign is Campaign.MC23a:
97 kwargs.setdefault("calibFileLRTEff", "InDetTrackSystematicsTools/CalibData_25.2_2025-v00/LargeD0TrackingRecommendations_mc23a.root")
98 elif flags.Input.MCCampaign is Campaign.MC23d:
99 kwargs.setdefault("calibFileLRTEff", "InDetTrackSystematicsTools/CalibData_25.2_2025-v00/LargeD0TrackingRecommendations_mc23d.root")
100 elif flags.Input.MCCampaign is Campaign.MC23e:
101 kwargs.setdefault("calibFileLRTEff", "InDetTrackSystematicsTools/CalibData_25.2_2025-v00/LargeD0TrackingRecommendations_mc23e.root")
102 # Run 2 recommendations (MC20)
103 elif flags.GeoModel.Run is LHCPeriod.Run2:
104 kwargs.setdefault("calibFileLRTEff", "InDetTrackSystematicsTools/CalibData_24.0_2023-v00/LargeD0TrackingRecommendations_20230824.root")
105 else:
106 raise ValueError(f"InclusiveTrackFilterTool: Recommendations not yet available for campaign {flags.Input.MCCampaign}! Please check the configuration and contact Tracking CP if you believe this message is in error.")
107
108 acc.setPrivateTools(
109 CompFactory.InDet.InclusiveTrackFilterTool(name, **kwargs))
110 return acc
111
112def InDetTrackSmearingToolCfg(flags, name="InDetTrackSmearingTool",
113 seed=4, **kwargs):
114 acc = ComponentAccumulator()
115 kwargs.setdefault("Seed", seed)
116
117 # 2022 recommendations (MC23a)
118 if flags.Input.MCCampaign is Campaign.MC23a:
119 kwargs.setdefault("calibFileIP_CTIDE", "InDetTrackSystematicsTools/CalibData_25.2_2025-v00/2022_d0z0_smearing_factors_v2.root")
120 # 2023 recommendations (MC23d)
121 elif flags.Input.MCCampaign is Campaign.MC23d:
122 kwargs.setdefault("calibFileIP_CTIDE", "InDetTrackSystematicsTools/CalibData_25.2_2025-v00/2023_d0z0_smearing_factors_v2.root")
123 # 2024 recommendations (MC23e)
124 elif flags.Input.MCCampaign is Campaign.MC23e:
125 kwargs.setdefault("calibFileIP_CTIDE", "InDetTrackSystematicsTools/CalibData_25.2_2025-v00/2024_d0z0_smearing_factors.root")
126 # Run 2 recommendations (MC20)
127 elif flags.GeoModel.Run is LHCPeriod.Run2:
128 kwargs.setdefault("calibFileIP_CTIDE", "InDetTrackSystematicsTools/CalibData_22.0_2022-v00/d0z0_smearing_factors_Run2_v2.root")
129 elif "calibFileIP_CTIDE" not in kwargs:
130 raise ValueError(f"InDetTrackSmearingTool: Recommendations not yet available for campaign {flags.Input.MCCampaign}! Please check the configuration and contact Tracking CP if you believe this message is in error.")
131
132 acc.setPrivateTools(
133 CompFactory.InDet.InDetTrackSmearingTool(name, **kwargs))
134 return acc
135
137 """Return calibFiles/runNumberBounds kwargs for InDetTrackBiasingTool.
138
139 Selects campaign-specific calibration files and (for multi-period
140 campaigns) run-number boundaries. Raises ValueError for unknown
141 campaigns or geometries.
142 """
143 c2 = "InDetTrackSystematicsTools/CalibData_22.0_2022-v00"
144 c3 = "InDetTrackSystematicsTools/CalibData_25.2_2025-v00"
145 if flags.GeoModel.Run is LHCPeriod.Run2:
146 if flags.Input.MCCampaign is Campaign.MC20a:
147 # 2015 + 2016 recommendations (MC20a)
148 return {
149 "calibFiles": [
150 f"{c2}/REL22_REPRO_2015.root",
151 f"{c2}/REL22_REPRO_2016_1stPart.root",
152 f"{c2}/REL22_REPRO_2016_2ndPart.root",
153 ],
154 "runNumberBounds": [0, 296938, 301912, 999999],
155 }
156 elif flags.Input.MCCampaign is Campaign.MC20d:
157 # 2017 recommendations (MC20d)
158 return {
159 "calibFiles": [
160 f"{c2}/REL22_REPRO_2017_1stPart.root",
161 f"{c2}/REL22_REPRO_2017_2ndPart.root",
162 ],
163 "runNumberBounds": [0, 334842, 999999],
164 }
165 elif flags.Input.MCCampaign is Campaign.MC20e:
166 # 2018 recommendations (MC20e)
167 return {
168 "calibFiles": [
169 f"{c2}/REL22_REPRO_2018_1stPart.root",
170 f"{c2}/REL22_REPRO_2018_2ndPart.root",
171 ],
172 "runNumberBounds": [0, 353000, 999999],
173 }
174 else:
175 raise ValueError(
176 'No biasing recommendations found for campaign "'
177 + flags.Input.MCCampaign.value
178 + '" in Run 2. Please check the configuration.'
179 )
180 elif flags.GeoModel.Run is LHCPeriod.Run3:
181 if flags.Input.MCCampaign is Campaign.MC23a:
182 # 2022 recommendations (MC23a)
183 return {
184 "calibFiles": [
185 f"{c3}/2022_d0z0qoverp_biasing_factor.root",
186 ]
187 }
188 elif flags.Input.MCCampaign is Campaign.MC23d:
189 # 2023 recommendations (MC23d)
190 return {
191 "calibFiles": [
192 f"{c3}/2023_d0z0qoverp_biasing_factor.root",
193 ]
194 }
195 elif flags.Input.MCCampaign is Campaign.MC23e:
196 # 2024 recommendations (MC23e)
197 return {
198 "calibFiles": [
199 f"{c3}/2024_d0z0qoverp_biasing_factor.root",
200 ]
201 }
202 else:
203 raise ValueError(
204 'No biasing recommendations found for campaign "'
205 + flags.Input.MCCampaign.value
206 + '" in Run 3. Please check the configuration.'
207 )
208 else:
209 raise ValueError(
210 'No biasing recommendations found for geometry "'
211 + flags.GeoModel.Run.value
212 + '". Please check the configuration.'
213 )
214
215
216def InDetTrackBiasingToolCfg(flags, name="InDetTrackBiasingTool",
217 **kwargs):
218 acc = ComponentAccumulator()
219 kwargs.setdefault("isMC", flags.Input.isMC)
220 if "calibFiles" not in kwargs:
221 kwargs.update(InDetTrackBiasingCalibKwargs(flags))
222 acc.setPrivateTools(
223 CompFactory.InDet.InDetTrackBiasingTool(name, **kwargs))
224 return acc
225
226def TrackSystematicsAlgCfg(flags, name="InDetTrackSystematicsAlg", **kwargs):
227 acc = ComponentAccumulator()
228
229 if "TrackFilterToolLRT" not in kwargs:
230 kwargs.setdefault("TrackFilterToolLRT", acc.popToolsAndMerge(
232
233 if "TrackFilterToolSTD" not in kwargs:
234 kwargs.setdefault("TrackFilterToolSTD", acc.popToolsAndMerge(
236
237 acc.addEventAlgo(CompFactory.InDet.TrackSystematicsAlg(name, **kwargs))
238 return acc
239
240
241def TrackSmearingAlgCfg(flags, syst, input_tracks, output_tracks,
242 seed=4, bias_kwargs={}):
243 """Shallow-copy input_tracks and apply smearing/biasing for one syst.
244
245 syst is a single smearing variation string (TRK_RES_*, TRK_BIAS_*), or
246 empty for a nominal (un-smeared) copy. Produces output_tracks as a
247 shallow copy with modified d0/z0/qoverp values.
248
249 Any extra keyword arguments are forwarded to InDetTrackBiasingToolCfg
250 as calibration kwargs (calibFiles, runNumberBounds, ...). If none are
251 supplied, InDetTrackBiasingCalibKwargs(flags) is called to derive them;
252 exceptions from that call propagate to the caller.
253 """
254 ca = ComponentAccumulator()
255
256 smearingTool = ca.popToolsAndMerge(InDetTrackSmearingToolCfg(flags, seed=seed))
257 ca.addPublicTool(smearingTool)
258
259 # Only configure the biasing tool for TRK_BIAS_* systematics.
260 # The tool reads RandomRunNumber unconditionally (needs PRW), so
261 # configuring it for nominal or RES systematics would require PRW
262 # to be scheduled even when no biasing is needed.
263 biasingTool = None
264 if 'BIAS' in syst or bias_kwargs:
265 if not bias_kwargs:
266 bias_kwargs = InDetTrackBiasingCalibKwargs(flags)
267 if bias_kwargs:
268 biasingTool = ca.popToolsAndMerge(
269 InDetTrackBiasingToolCfg(flags, **bias_kwargs))
270 ca.addPublicTool(biasingTool)
271
272 alg = CompFactory.InDet.TrackSmearingAlg(
273 f'TrackSmearingAlg_{output_tracks}',
274 SmearingTool=smearingTool,
275 InputTrackContainer=input_tracks,
276 OutputTrackContainer=output_tracks,
277 SystematicVariation=syst,
278 )
279 if biasingTool is not None:
280 alg.BiasingTool = biasingTool
281
282 ca.addEventAlgo(alg)
283 return ca
284
285
287 flags, syst, jet_collection,
288 in_ghost_tracks, out_ghost_tracks,
289 seed=None):
290 """Filter ghost-track links on jets for one filter systematic.
291
292 syst is a single filter variation string (TRK_EFF_*, TRK_FAKE_RATE_*).
293 Reads in_ghost_tracks decoration from jet_collection, applies filter
294 tools per-track (dispatching LRT vs STD by patternRecoInfo bit 49),
295 and writes surviving links to out_ghost_tracks.
296
297 seed overrides the Seed property on all filter tools. If None (default),
298 each tool uses its own default seed (1 STD, 2 TIDE, 3 LRT).
299 """
300 assert syst, "JetTrackFilteringAlgCfg called with empty syst"
301
302 ca = ComponentAccumulator()
303
304 is_larged0 = 'LARGED0' in syst
305 is_tide = 'TIDE' in syst
306
307 alg = CompFactory.InDet.JetTrackFilteringAlg(
308 f'JetTrackFilteringAlg_{out_ghost_tracks}',
309 JetCollection=jet_collection,
310 InGhostTracks=in_ghost_tracks,
311 OutGhostTracks=out_ghost_tracks,
312 SystematicVariation=syst,
313 )
314 std_kwargs = {} if seed is None else {"seed": seed}
315 lrt_kwargs = {} if seed is None else {"seed": seed}
316 tide_kwargs = {} if seed is None else {"seed": seed}
317 if not is_larged0:
318 alg.STDFilterTool = ca.popToolsAndMerge(
319 InDetTrackTruthFilterToolCfg(flags, **std_kwargs)
320 )
321 ca.addPublicTool(alg.STDFilterTool)
322 if is_larged0:
323 alg.LRTFilterTool = ca.popToolsAndMerge(
324 InclusiveTrackFilterToolCfg(flags, **lrt_kwargs)
325 )
326 ca.addPublicTool(alg.LRTFilterTool)
327 if is_tide:
328 alg.JetFilterTool = ca.popToolsAndMerge(
329 JetTrackFilterToolCfg(flags, **tide_kwargs)
330 )
331 ca.addPublicTool(alg.JetFilterTool)
332
333 ca.addEventAlgo(alg)
334 return ca
InDetTrackSmearingToolCfg(flags, name="InDetTrackSmearingTool", seed=4, **kwargs)
InDetTrackTruthOriginToolCfg(flags, name="InDetTrackTruthOriginTool", **kwargs)
InclusiveTrackFilterToolCfg(flags, name="InclusiveTrackFilterTool", seed=3, **kwargs)
JetTrackFilteringAlgCfg(flags, syst, jet_collection, in_ghost_tracks, out_ghost_tracks, seed=None)
JetTrackFilterToolCfg(flags, name="JetTrackFilterTool", seed=2, **kwargs)
InDetTrackBiasingToolCfg(flags, name="InDetTrackBiasingTool", **kwargs)
TrackSmearingAlgCfg(flags, syst, input_tracks, output_tracks, seed=4, bias_kwargs={})
TrackSystematicsAlgCfg(flags, name="InDetTrackSystematicsAlg", **kwargs)
InDetTrackTruthFilterToolCfg(flags, name="InDetTrackTruthFilterTool", seed=1, **kwargs)