3from AnaAlgorithm.DualUseConfig
import 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
12 acc = ComponentAccumulator()
14 log = logging.getLogger(
"InDetTrackTruthOriginTool")
17 kwargs.setdefault(
"isFullPileUpTruth", flags.Digitization.PileUp
18 and flags.Digitization.DigiSteeringConf
in [
'StandardPileUpToolsAlg',
19 'StandardInTimeOnlyTruthPileUpToolsAlg',
20 'StandardInTimeOnlyGeantinoTruthPileUpToolsAlg'])
21 except AttributeError:
23 kwargs.setdefault(
"isFullPileUpTruth",
False)
24 log.warning(
"Unable to load digi flags, assuming isFullPileUpTruth=False. Normal if you're in AthAnalysis.")
27 CompFactory.InDet.InDetTrackTruthOriginTool(name, **kwargs))
32 acc = ComponentAccumulator()
33 kwargs.setdefault(
"Seed", seed)
35 if "trackOriginTool" not in kwargs:
36 kwargs.setdefault(
"trackOriginTool", acc.popToolsAndMerge(
40 if flags.GeoModel.Run
is LHCPeriod.Run3:
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)
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)
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.")
53 CompFactory.InDet.InDetTrackTruthFilterTool(name, **kwargs))
57 acc = ComponentAccumulator()
58 kwargs.setdefault(
"Seed", seed)
60 if "trackOriginTool" not in kwargs:
61 kwargs.setdefault(
"trackOriginTool", acc.popToolsAndMerge(
66 if flags.GeoModel.Run >= LHCPeriod.Run3:
67 kwargs.setdefault(
"FakeUncertainty", 0.25)
70 kwargs.setdefault(
"FakeUncertainty", 0.35)
74 if flags.GeoModel.Run >= LHCPeriod.Run3:
76 if flags.Input.MCCampaign
in [Campaign.MC23a, Campaign.MC23d]:
77 kwargs.setdefault(
"FLostUncertainty", 0.24)
79 elif flags.Input.MCCampaign
is Campaign.MC23e:
80 kwargs.setdefault(
"FLostUncertainty", 0.32)
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.")
85 kwargs.setdefault(
"FLostUncertainty", 0.24)
87 acc.setPrivateTools(CompFactory.InDet.JetTrackFilterTool(name, **kwargs))
91 truthSeed=1, jetSeed=2, **kwargs):
92 acc = ComponentAccumulator()
94 kwargs.setdefault(
"TruthSeed", truthSeed)
95 kwargs.setdefault(
"JetSeed", jetSeed)
97 if "trackOriginTool" not in kwargs:
98 kwargs[
"trackOriginTool"] = acc.popToolsAndMerge(
102 if flags.GeoModel.Run
is LHCPeriod.Run3:
103 kwargs.setdefault(
"fFakeLoose", 0.40)
104 kwargs.setdefault(
"fFakeTight", 1.00)
105 kwargs.setdefault(
"fFakeUncertTIDE", 0.25)
107 elif flags.GeoModel.Run
is LHCPeriod.Run2:
108 kwargs.setdefault(
"fFakeLoose", 0.10)
109 kwargs.setdefault(
"fFakeTight", 1.00)
110 kwargs.setdefault(
"fFakeUncertTIDE", 0.35)
114 f
"Unsupported campaign/run for {name}"
118 CompFactory.InDet.TrackFilterTool(name, **kwargs)
125 acc = ComponentAccumulator()
126 kwargs.setdefault(
"Seed", seed)
129 if flags.Input.MCCampaign
is Campaign.MC23a:
130 kwargs.setdefault(
"calibFileLRTEff",
"InDetTrackSystematicsTools/CalibData_25.2_2025-v00/LargeD0TrackingRecommendations_mc23a.root")
131 elif flags.Input.MCCampaign
is Campaign.MC23d:
132 kwargs.setdefault(
"calibFileLRTEff",
"InDetTrackSystematicsTools/CalibData_25.2_2025-v00/LargeD0TrackingRecommendations_mc23d.root")
133 elif flags.Input.MCCampaign
is Campaign.MC23e:
134 kwargs.setdefault(
"calibFileLRTEff",
"InDetTrackSystematicsTools/CalibData_25.2_2025-v00/LargeD0TrackingRecommendations_mc23e.root")
137 elif flags.GeoModel.Run
is LHCPeriod.Run2:
138 kwargs.setdefault(
"calibFileLRTEff",
"InDetTrackSystematicsTools/CalibData_24.0_2023-v00/LargeD0TrackingRecommendations_20230824.root")
140 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.")
143 CompFactory.InDet.InclusiveTrackFilterTool(name, **kwargs))
148 acc = ComponentAccumulator()
149 kwargs.setdefault(
"Seed", seed)
152 if flags.Input.MCCampaign
is Campaign.MC23a:
153 kwargs.setdefault(
"calibFileIP_CTIDE",
"InDetTrackSystematicsTools/CalibData_25.2_2025-v00/2022_d0z0_smearing_factors_v2.root")
155 elif flags.Input.MCCampaign
is Campaign.MC23d:
156 kwargs.setdefault(
"calibFileIP_CTIDE",
"InDetTrackSystematicsTools/CalibData_25.2_2025-v00/2023_d0z0_smearing_factors_v2.root")
158 elif flags.Input.MCCampaign
is Campaign.MC23e:
159 kwargs.setdefault(
"calibFileIP_CTIDE",
"InDetTrackSystematicsTools/CalibData_25.2_2025-v00/2024_d0z0_smearing_factors.root")
161 elif flags.Input.MCCampaign
is Campaign.MC23g:
162 kwargs.setdefault(
"calibFileIP_CTIDE",
"InDetTrackSystematicsTools/CalibData_25.2_2025-v00/2025_d0z0_smearing_factors.root")
164 elif flags.GeoModel.Run
is LHCPeriod.Run2:
165 kwargs.setdefault(
"calibFileIP_CTIDE",
"InDetTrackSystematicsTools/CalibData_22.0_2022-v00/d0z0_smearing_factors_Run2_v2.root")
166 elif "calibFileIP_CTIDE" not in kwargs:
167 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.")
170 CompFactory.InDet.InDetTrackSmearingTool(name, **kwargs))
174 """Return calibFiles/runNumberBounds kwargs for InDetTrackBiasingTool.
176 Selects campaign-specific calibration files and (for multi-period
177 campaigns) run-number boundaries. Raises ValueError for unknown
178 campaigns or geometries.
180 c2 =
"InDetTrackSystematicsTools/CalibData_22.0_2022-v00"
181 c3 =
"InDetTrackSystematicsTools/CalibData_25.2_2025-v00"
182 if flags.GeoModel.Run
is LHCPeriod.Run2:
183 if flags.Input.MCCampaign
is Campaign.MC20a:
187 f
"{c2}/REL22_REPRO_2015.root",
188 f
"{c2}/REL22_REPRO_2016_1stPart.root",
189 f
"{c2}/REL22_REPRO_2016_2ndPart.root",
191 "runNumberBounds": [0, 296938, 301912, 999999],
193 elif flags.Input.MCCampaign
is Campaign.MC20d:
197 f
"{c2}/REL22_REPRO_2017_1stPart.root",
198 f
"{c2}/REL22_REPRO_2017_2ndPart.root",
200 "runNumberBounds": [0, 334842, 999999],
202 elif flags.Input.MCCampaign
is Campaign.MC20e:
206 f
"{c2}/REL22_REPRO_2018_1stPart.root",
207 f
"{c2}/REL22_REPRO_2018_2ndPart.root",
209 "runNumberBounds": [0, 353000, 999999],
213 'No biasing recommendations found for campaign "'
214 + flags.Input.MCCampaign.value
215 +
'" in Run 2. Please check the configuration.'
217 elif flags.GeoModel.Run
is LHCPeriod.Run3:
218 if flags.Input.MCCampaign
is Campaign.MC23a:
222 f
"{c3}/2022_d0z0qoverp_biasing_factor.root",
225 elif flags.Input.MCCampaign
is Campaign.MC23d:
229 f
"{c3}/2023_d0z0qoverp_biasing_factor.root",
232 elif flags.Input.MCCampaign
is Campaign.MC23e:
236 f
"{c3}/2024_d0z0qoverp_biasing_factor.root",
241 'No biasing recommendations found for campaign "'
242 + flags.Input.MCCampaign.value
243 +
'" in Run 3. Please check the configuration.'
247 'No biasing recommendations found for geometry "'
248 + flags.GeoModel.Run.value
249 +
'". Please check the configuration.'
255 acc = ComponentAccumulator()
256 kwargs.setdefault(
"isMC", flags.Input.isMC)
257 if "calibFiles" not in kwargs:
260 CompFactory.InDet.InDetTrackBiasingTool(name, **kwargs))
264 """View container of the input tracks surviving the track filter
265 systematics (TRK_EFF_*, TRK_FAKE_RATE_*): SystematicVariationSTD for
266 standard tracks, SystematicVariationLRT for LRT tracks.
268 acc = ComponentAccumulator()
270 if "TrackFilterToolLRT" not in kwargs:
271 kwargs.setdefault(
"TrackFilterToolLRT", acc.popToolsAndMerge(
274 if "TrackFilterToolSTD" not in kwargs:
275 kwargs.setdefault(
"TrackFilterToolSTD", acc.popToolsAndMerge(
278 acc.addEventAlgo(CompFactory.InDet.TrackSystematicsAlg(name, **kwargs))
283 seed=4, bias_kwargs={}, strict_mode=False):
284 """Shallow-copy input_tracks and apply smearing/biasing for one syst.
286 syst is a single smearing variation string (TRK_RES_*, TRK_BIAS_*), or
287 empty for a nominal (un-smeared) copy. Produces output_tracks as a
288 shallow copy with modified d0/z0/qoverp values.
290 Any extra keyword arguments are forwarded to InDetTrackBiasingToolCfg
291 as calibration kwargs (calibFiles, runNumberBounds, ...). If none are
292 supplied, InDetTrackBiasingCalibKwargs(flags) is called to derive them;
293 exceptions from that call propagate to the caller.
295 If strict_mode is True, the algorithm fails in initialize when syst
296 is not known to the smearing or biasing tool.
298 ca = ComponentAccumulator()
301 ca.addPublicTool(smearingTool)
308 if 'BIAS' in syst
or bias_kwargs:
312 biasingTool = ca.popToolsAndMerge(
314 ca.addPublicTool(biasingTool)
316 alg = CompFactory.InDet.TrackSmearingAlg(
317 f
'TrackSmearingAlg_{output_tracks}',
318 SmearingTool=smearingTool,
319 InputTrackContainer=input_tracks,
320 OutputTrackContainer=output_tracks,
321 SystematicVariation=syst,
322 StrictMode=strict_mode,
324 if biasingTool
is not None:
325 alg.BiasingTool = biasingTool
332 flags, syst, jet_collection,
333 in_ghost_tracks, out_ghost_tracks,
335 """Filter ghost-track links on jets for one filter systematic.
337 syst is a single filter variation string (TRK_EFF_*, TRK_FAKE_RATE_*).
338 Reads in_ghost_tracks decoration from jet_collection, applies filter
339 tools per-track (dispatching LRT vs STD by patternRecoInfo bit 49),
340 and writes surviving links to out_ghost_tracks.
342 seed overrides the Seed property on all filter tools. If None (default),
343 each tool uses its own default seed (1 STD, 2 TIDE, 3 LRT).
345 assert syst,
"JetTrackFilteringAlgCfg called with empty syst"
347 ca = ComponentAccumulator()
349 is_larged0 =
'LARGED0' in syst
350 is_tide =
'TIDE' in syst
352 alg = CompFactory.InDet.JetTrackFilteringAlg(
353 f
'JetTrackFilteringAlg_{out_ghost_tracks}',
354 JetCollection=jet_collection,
355 InGhostTracks=in_ghost_tracks,
356 OutGhostTracks=out_ghost_tracks,
357 SystematicVariation=syst,
359 std_kwargs = {}
if seed
is None else {
"seed": seed}
360 lrt_kwargs = {}
if seed
is None else {
"seed": seed}
361 tide_kwargs = {}
if seed
is None else {
"seed": seed}
363 alg.STDFilterTool = ca.popToolsAndMerge(
366 ca.addPublicTool(alg.STDFilterTool)
368 alg.LRTFilterTool = ca.popToolsAndMerge(
371 ca.addPublicTool(alg.LRTFilterTool)
373 alg.JetFilterTool = ca.popToolsAndMerge(
376 ca.addPublicTool(alg.JetFilterTool)
383 """Configure a FakeRateFilterAlg for one systematic.
385 mode is one of "inclusive", "tide", or "tft" (track-filter-tool).
386 OutputTrackContainer is optional; if not provided, it defaults to
387 "InDetTrackParticles_Filtered". The output container name is modified
388 for multiple systematics to avoid collisions.
390 ca = ComponentAccumulator()
392 kwargs.setdefault(
"InputTrackContainer",
"InDetTrackParticles")
393 kwargs.setdefault(
"JetContainer",
"AntiKt4EMPFlowJets")
394 output_tracks = kwargs.pop(
"OutputTrackContainer",
None)
396 if output_tracks
is None:
397 output_tracks =
"InDetTrackParticles_Filtered"
399 for syst
in systematics:
400 alg_kwargs = kwargs.copy()
401 alg_kwargs[
"SystematicVariation"] = syst
403 if len(systematics) == 1:
404 alg_kwargs[
"OutputTrackContainer"] = output_tracks
406 alg_kwargs[
"OutputTrackContainer"] = f
"{output_tracks}_{syst}"
408 if mode ==
"inclusive":
409 alg_kwargs.setdefault(
"InclusiveFilterTool", ca.popToolsAndMerge(
412 name=f
"InDetTrackTruthFilterTool_{syst}",
416 alg_kwargs.setdefault(
"JetFilterTool", ca.popToolsAndMerge(
419 name=f
"JetTrackFilterTool_{syst}",
423 alg_kwargs.setdefault(
"TrackFilterTool", ca.popToolsAndMerge(
426 name=f
"TrackFilterTool_{syst}",
430 raise ValueError(f
"Unknown FakeRateFilterAlg mode: {mode}")
433 CompFactory.InDet.FakeRateFilterAlg(f
"{name}_{syst}", **alg_kwargs)