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, Campaign.MC23g]:
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 # 2025 recommendations (MC23g)
127 elif flags.Input.MCCampaign is Campaign.MC23g:
128 kwargs.setdefault("calibFileIP_CTIDE", "InDetTrackSystematicsTools/CalibData_25.2_2025-v00/2025_d0z0_smearing_factors.root")
129 # Run 2 recommendations (MC20)
130 elif flags.GeoModel.Run is LHCPeriod.Run2:
131 kwargs.setdefault("calibFileIP_CTIDE", "InDetTrackSystematicsTools/CalibData_22.0_2022-v00/d0z0_smearing_factors_Run2_v2.root")
132 elif "calibFileIP_CTIDE" not in kwargs:
133 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.")
134
135 acc.setPrivateTools(
136 CompFactory.InDet.InDetTrackSmearingTool(name, **kwargs))
137 return acc
138
140 """Return calibFiles/runNumberBounds kwargs for InDetTrackBiasingTool.
141
142 Selects campaign-specific calibration files and (for multi-period
143 campaigns) run-number boundaries. Raises ValueError for unknown
144 campaigns or geometries.
145 """
146 c2 = "InDetTrackSystematicsTools/CalibData_22.0_2022-v00"
147 c3 = "InDetTrackSystematicsTools/CalibData_25.2_2025-v00"
148 if flags.GeoModel.Run is LHCPeriod.Run2:
149 if flags.Input.MCCampaign is Campaign.MC20a:
150 # 2015 + 2016 recommendations (MC20a)
151 return {
152 "calibFiles": [
153 f"{c2}/REL22_REPRO_2015.root",
154 f"{c2}/REL22_REPRO_2016_1stPart.root",
155 f"{c2}/REL22_REPRO_2016_2ndPart.root",
156 ],
157 "runNumberBounds": [0, 296938, 301912, 999999],
158 }
159 elif flags.Input.MCCampaign is Campaign.MC20d:
160 # 2017 recommendations (MC20d)
161 return {
162 "calibFiles": [
163 f"{c2}/REL22_REPRO_2017_1stPart.root",
164 f"{c2}/REL22_REPRO_2017_2ndPart.root",
165 ],
166 "runNumberBounds": [0, 334842, 999999],
167 }
168 elif flags.Input.MCCampaign is Campaign.MC20e:
169 # 2018 recommendations (MC20e)
170 return {
171 "calibFiles": [
172 f"{c2}/REL22_REPRO_2018_1stPart.root",
173 f"{c2}/REL22_REPRO_2018_2ndPart.root",
174 ],
175 "runNumberBounds": [0, 353000, 999999],
176 }
177 else:
178 raise ValueError(
179 'No biasing recommendations found for campaign "'
180 + flags.Input.MCCampaign.value
181 + '" in Run 2. Please check the configuration.'
182 )
183 elif flags.GeoModel.Run is LHCPeriod.Run3:
184 if flags.Input.MCCampaign is Campaign.MC23a:
185 # 2022 recommendations (MC23a)
186 return {
187 "calibFiles": [
188 f"{c3}/2022_d0z0qoverp_biasing_factor.root",
189 ]
190 }
191 elif flags.Input.MCCampaign is Campaign.MC23d:
192 # 2023 recommendations (MC23d)
193 return {
194 "calibFiles": [
195 f"{c3}/2023_d0z0qoverp_biasing_factor.root",
196 ]
197 }
198 elif flags.Input.MCCampaign is Campaign.MC23e:
199 # 2024 recommendations (MC23e)
200 return {
201 "calibFiles": [
202 f"{c3}/2024_d0z0qoverp_biasing_factor.root",
203 ]
204 }
205 else:
206 raise ValueError(
207 'No biasing recommendations found for campaign "'
208 + flags.Input.MCCampaign.value
209 + '" in Run 3. Please check the configuration.'
210 )
211 else:
212 raise ValueError(
213 'No biasing recommendations found for geometry "'
214 + flags.GeoModel.Run.value
215 + '". Please check the configuration.'
216 )
217
218
219def InDetTrackBiasingToolCfg(flags, name="InDetTrackBiasingTool",
220 **kwargs):
221 acc = ComponentAccumulator()
222 kwargs.setdefault("isMC", flags.Input.isMC)
223 if "calibFiles" not in kwargs:
224 kwargs.update(InDetTrackBiasingCalibKwargs(flags))
225 acc.setPrivateTools(
226 CompFactory.InDet.InDetTrackBiasingTool(name, **kwargs))
227 return acc
228
229def TrackSystematicsAlgCfg(flags, name="InDetTrackSystematicsAlg", **kwargs):
230 acc = ComponentAccumulator()
231
232 if "TrackFilterToolLRT" not in kwargs:
233 kwargs.setdefault("TrackFilterToolLRT", acc.popToolsAndMerge(
235
236 if "TrackFilterToolSTD" not in kwargs:
237 kwargs.setdefault("TrackFilterToolSTD", acc.popToolsAndMerge(
239
240 acc.addEventAlgo(CompFactory.InDet.TrackSystematicsAlg(name, **kwargs))
241 return acc
242
243
244def TrackSmearingAlgCfg(flags, syst, input_tracks, output_tracks,
245 seed=4, bias_kwargs={}):
246 """Shallow-copy input_tracks and apply smearing/biasing for one syst.
247
248 syst is a single smearing variation string (TRK_RES_*, TRK_BIAS_*), or
249 empty for a nominal (un-smeared) copy. Produces output_tracks as a
250 shallow copy with modified d0/z0/qoverp values.
251
252 Any extra keyword arguments are forwarded to InDetTrackBiasingToolCfg
253 as calibration kwargs (calibFiles, runNumberBounds, ...). If none are
254 supplied, InDetTrackBiasingCalibKwargs(flags) is called to derive them;
255 exceptions from that call propagate to the caller.
256 """
257 ca = ComponentAccumulator()
258
259 smearingTool = ca.popToolsAndMerge(InDetTrackSmearingToolCfg(flags, seed=seed))
260 ca.addPublicTool(smearingTool)
261
262 # Only configure the biasing tool for TRK_BIAS_* systematics.
263 # The tool reads RandomRunNumber unconditionally (needs PRW), so
264 # configuring it for nominal or RES systematics would require PRW
265 # to be scheduled even when no biasing is needed.
266 biasingTool = None
267 if 'BIAS' in syst or bias_kwargs:
268 if not bias_kwargs:
269 bias_kwargs = InDetTrackBiasingCalibKwargs(flags)
270 if bias_kwargs:
271 biasingTool = ca.popToolsAndMerge(
272 InDetTrackBiasingToolCfg(flags, **bias_kwargs))
273 ca.addPublicTool(biasingTool)
274
275 alg = CompFactory.InDet.TrackSmearingAlg(
276 f'TrackSmearingAlg_{output_tracks}',
277 SmearingTool=smearingTool,
278 InputTrackContainer=input_tracks,
279 OutputTrackContainer=output_tracks,
280 SystematicVariation=syst,
281 )
282 if biasingTool is not None:
283 alg.BiasingTool = biasingTool
284
285 ca.addEventAlgo(alg)
286 return ca
287
288
290 flags, syst, jet_collection,
291 in_ghost_tracks, out_ghost_tracks,
292 seed=None):
293 """Filter ghost-track links on jets for one filter systematic.
294
295 syst is a single filter variation string (TRK_EFF_*, TRK_FAKE_RATE_*).
296 Reads in_ghost_tracks decoration from jet_collection, applies filter
297 tools per-track (dispatching LRT vs STD by patternRecoInfo bit 49),
298 and writes surviving links to out_ghost_tracks.
299
300 seed overrides the Seed property on all filter tools. If None (default),
301 each tool uses its own default seed (1 STD, 2 TIDE, 3 LRT).
302 """
303 assert syst, "JetTrackFilteringAlgCfg called with empty syst"
304
305 ca = ComponentAccumulator()
306
307 is_larged0 = 'LARGED0' in syst
308 is_tide = 'TIDE' in syst
309
310 alg = CompFactory.InDet.JetTrackFilteringAlg(
311 f'JetTrackFilteringAlg_{out_ghost_tracks}',
312 JetCollection=jet_collection,
313 InGhostTracks=in_ghost_tracks,
314 OutGhostTracks=out_ghost_tracks,
315 SystematicVariation=syst,
316 )
317 std_kwargs = {} if seed is None else {"seed": seed}
318 lrt_kwargs = {} if seed is None else {"seed": seed}
319 tide_kwargs = {} if seed is None else {"seed": seed}
320 if not is_larged0:
321 alg.STDFilterTool = ca.popToolsAndMerge(
322 InDetTrackTruthFilterToolCfg(flags, **std_kwargs)
323 )
324 ca.addPublicTool(alg.STDFilterTool)
325 if is_larged0:
326 alg.LRTFilterTool = ca.popToolsAndMerge(
327 InclusiveTrackFilterToolCfg(flags, **lrt_kwargs)
328 )
329 ca.addPublicTool(alg.LRTFilterTool)
330 if is_tide:
331 alg.JetFilterTool = ca.popToolsAndMerge(
332 JetTrackFilterToolCfg(flags, **tide_kwargs)
333 )
334 ca.addPublicTool(alg.JetFilterTool)
335
336 ca.addEventAlgo(alg)
337 return ca
JetTrackFilterToolCfg(flags, name="JetTrackFilterTool", seed=2, **kwargs)
InDetTrackTruthOriginToolCfg(flags, name="InDetTrackTruthOriginTool", **kwargs)
JetTrackFilteringAlgCfg(flags, syst, jet_collection, in_ghost_tracks, out_ghost_tracks, seed=None)
InDetTrackSmearingToolCfg(flags, name="InDetTrackSmearingTool", seed=4, **kwargs)
TrackSmearingAlgCfg(flags, syst, input_tracks, output_tracks, seed=4, bias_kwargs={})
InDetTrackTruthFilterToolCfg(flags, name="InDetTrackTruthFilterTool", seed=1, **kwargs)
InclusiveTrackFilterToolCfg(flags, name="InclusiveTrackFilterTool", seed=3, **kwargs)
InDetTrackBiasingToolCfg(flags, name="InDetTrackBiasingTool", **kwargs)
TrackSystematicsAlgCfg(flags, name="InDetTrackSystematicsAlg", **kwargs)