ATLAS Offline Software
Loading...
Searching...
No Matches
InDetPhysValMonitoringConfig.py
Go to the documentation of this file.
2# Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3#
4
5'''@file InDetPhysValMonitoringConfig.py
6@author T. Strebler
7@date 2021-08-30
8@brief Main CA-based python configuration for InDetPhysValMonitoring
9'''
10
11from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
12from AthenaConfiguration.ComponentFactory import CompFactory
13
14
15def extractCollectionPrefix(track_collection_name):
16 suffixes = ['Tracks', 'TrackParticles']
17 for suffix in suffixes:
18 if track_collection_name.endswith(suffix):
19 return track_collection_name.removesuffix(suffix)
20 return track_collection_name
21
22
23def HistogramDefinitionSvcCfg(flags, **kwargs):
24 acc = ComponentAccumulator()
25 if flags.Detector.GeometryID:
26 if flags.PhysVal.IDPVM.doValidateLargeD0Tracks or flags.PhysVal.IDPVM.doValidateMergedLargeD0Tracks:
27 kwargs.setdefault("DefinitionSource", "InDetPVMPlotDefLRT.xml")
28 else:
29 kwargs.setdefault("DefinitionSource", "InDetPVMPlotDefRun2.xml")
30 elif flags.Detector.GeometryITk:
31 kwargs.setdefault("DefinitionSource", "InDetPVMPlotDefITK.xml")
32 kwargs.setdefault("DefinitionFormat", "text/xml")
33 histoSvc = CompFactory.HistogramDefinitionSvc(**kwargs)
34 acc.addService(histoSvc)
35 return acc
36
37
39 flags, name="InDetRttTruthSelectionTool", **kwargs):
40 acc = ComponentAccumulator()
41
42 kwargs.setdefault("requireStable", True)
43 kwargs.setdefault("requireCharged", True)
44 kwargs.setdefault("selectedCharge", flags.PhysVal.IDPVM.selectedCharge)
45 kwargs.setdefault("requireOnlyPrimary",
46 True if kwargs.pop("OnlyDressPrimaryTracks", True)
47 else False)
48 kwargs.setdefault("maxProdVertRadius",
49 flags.PhysVal.IDPVM.maxProdVertRadius)
50 kwargs.setdefault("minProdVertRadius",
51 flags.PhysVal.IDPVM.minProdVertRadius)
52 kwargs.setdefault("minAbsD0",
53 flags.PhysVal.IDPVM.minAbsD0)
54
55 if flags.Detector.GeometryID:
56 if flags.PhysVal.IDPVM.doValidateLargeD0Tracks or flags.PhysVal.IDPVM.doValidateMergedLargeD0Tracks:
57 kwargs.setdefault("maxEta", 3.0)
58 else:
59 kwargs.setdefault("maxEta", 2.5)
60 elif flags.Detector.GeometryITk:
61 kwargs.setdefault("maxEta", 4.0)
62
63 kwargs.setdefault("minPt", flags.PhysVal.IDPVM.truthMinPt)
64 kwargs.setdefault("ancestorList", flags.PhysVal.IDPVM.ancestorIDs)
65 kwargs.setdefault("requireSiHit", flags.PhysVal.IDPVM.requiredSiHits)
66 kwargs.setdefault("vetoPdgId", flags.PhysVal.IDPVM.vetoPdgId)
67 kwargs.setdefault("pdgId", flags.PhysVal.IDPVM.pdgId)
68
69 if "radiusCylinder" in kwargs or "zDisc" in kwargs:
70 from TrkConfig.AtlasExtrapolatorConfig import AtlasExtrapolatorCfg
71 extrapolator = acc.popToolsAndMerge(AtlasExtrapolatorCfg(flags))
72 acc.addPublicTool(extrapolator) # TODO: migrate to private?
73 kwargs.setdefault("Extrapolator", extrapolator)
74 else:
75 kwargs.setdefault("Extrapolator", None)
76
77 acc.setPrivateTools(CompFactory.AthTruthSelectionTool(name, **kwargs))
78 return acc
79
80
81def GoodRunsListSelectionToolCfg(flags, **kwargs):
82 acc = ComponentAccumulator()
83
84 from GoodRunsLists.GoodRunsListsDictionary import getGoodRunsLists
85 GRLDict = getGoodRunsLists()
86
87 cvmfs = '/cvmfs/atlas.cern.ch/repo/sw/database/GroupData/'
88 grldict = {
89 '2015': cvmfs + ''.join(GRLDict['GRL2015']),
90 '2016': cvmfs + ''.join(GRLDict['GRL2016']),
91 '2017': cvmfs + ''.join(GRLDict['GRL2017_Triggerno17e33prim']),
92 '2018': cvmfs + ''.join(GRLDict['GRL2018_Triggerno17e33prim']),
93 '2022': cvmfs + ''.join(GRLDict['GRL2022']),
94 '2023': cvmfs + ''.join(GRLDict['GRL2023']),
95 '2024': cvmfs + ''.join(GRLDict['GRL2024']),
96 '2025': cvmfs + ''.join(GRLDict['GRL2025'])
97 }
98
99 acc.setPrivateTools(CompFactory.GoodRunsListSelectionTool(
100 name="GoodRunsListSelectionTool",
101 GoodRunsListVec=[grldict[p] for p in flags.PhysVal.IDPVM.GRL],
102 **kwargs
103 ))
104 return acc
105
106
107def InDetVertexTruthMatchToolCfg(flags, **kwargs):
108 acc = ComponentAccumulator()
109 acc.setPrivateTools(CompFactory.InDetVertexTruthMatchTool(**kwargs))
110 return acc
111
112
113def InDetPhysValMonitoringToolCfg(flags, **kwargs):
114 from InDetPhysValMonitoring.InDetPhysValDecorationConfig import (
115 AddDecoratorIfNeededCfg)
116 acc = AddDecoratorIfNeededCfg(flags)
117 kwargs.setdefault("useTrackSelection", False)
118 kwargs.setdefault("EnableLumi", False)
119
120 acc.merge(HistogramDefinitionSvcCfg(flags))
121 kwargs.setdefault('VertexContainerName', flags.PhysVal.IDPVM.PrimaryVertexContainer)
122
123 # if we are running with sumpT(w) hard scatter selection, we need to schedule jet finding
124 if flags.PhysVal.IDPVM.hardScatterStrategy in [2, 3]:
125
126 from InDetPhysValMonitoring.addRecoJetsConfig import (
127 AddRecoJetsIfNotExistingCfg)
128 acc.merge(AddRecoJetsIfNotExistingCfg(
129 flags, flags.PhysVal.IDPVM.jetsNameForHardScatter))
130
131 # if we are running with the GNN hard scatter selection, we need to schedule the dependencies
132 if flags.PhysVal.IDPVM.hardScatterStrategy == 3:
133 from InDetConfig.InDetGNNHardScatterSelectionConfig import (
134 GNNSequenceCfg)
135 acc.merge(GNNSequenceCfg(flags))
136
137 # if we are running with the HGam hard scatter selection, we need to schedule the NN
138 if flags.PhysVal.IDPVM.hardScatterStrategy == 4:
139 from DerivationFrameworkHiggs.HIGG1D1CustomVertexConfig import DiPhotonVertexCfg
140 acc.merge(DiPhotonVertexCfg(flags))
141
142 if flags.PhysVal.IDPVM.GRL:
143 kwargs.setdefault("useGRL", True)
144 kwargs.setdefault('GoodRunsListSelectionTool', acc.popToolsAndMerge(
146
147 kwargs.setdefault("doIDTIDEPlots", flags.PhysVal.IDPVM.doIDTIDE)
148 kwargs.setdefault("setCSVName", flags.PhysVal.IDPVM.setCSVName)
149
150 if flags.PhysVal.IDPVM.doValidateTracksInJets:
151 kwargs.setdefault("JetContainerName", flags.PhysVal.IDPVM.jetCollection)
152 kwargs.setdefault("FillTrackInJetPlots", True)
153 kwargs.setdefault('JetAbsEtaMin', 0)
154 kwargs.setdefault('JetAbsEtaMax', flags.PhysVal.IDPVM.JetAbsEtaMax)
155 kwargs.setdefault('JetPtMin', flags.PhysVal.IDPVM.JetPtMin)
156 kwargs.setdefault('JetPtMax', flags.PhysVal.IDPVM.JetPtMax)
157 kwargs.setdefault('maxTrkJetDR', flags.PhysVal.IDPVM.maxTrkJetDR)
158 kwargs.setdefault("FillTrackInBJetPlots",
159 flags.PhysVal.IDPVM.doValidateTracksInBJets)
160 else:
161 kwargs.setdefault("JetContainerName", '')
162 kwargs.setdefault("FillTrackInJetPlots", False)
163
164 kwargs.setdefault("doPerAuthorPlots",
165 flags.PhysVal.IDPVM.doPerAuthorPlots)
166
167 if flags.Tracking.doTruth and not flags.PhysVal.IDPVM.doRecoOnly:
168 kwargs.setdefault("TruthParticleContainerName", "TruthParticles")
169 if 'TruthSelectionTool' not in kwargs:
170 kwargs.setdefault("TruthSelectionTool", acc.popToolsAndMerge(
172
173 doHyyHSSelection = flags.PhysVal.IDPVM.hardScatterStrategy == 4
174 if 'hardScatterSelectionTool' not in kwargs:
175 from InDetConfig.InDetHardScatterSelectionToolConfig import (
176 InDetHardScatterSelectionToolCfg)
177 kwargs.setdefault("hardScatterSelectionTool", acc.popToolsAndMerge(
178 InDetHardScatterSelectionToolCfg(
179 flags,
180 RedoHardScatter=not doHyyHSSelection,
181 SelectionMode=flags.PhysVal.IDPVM.hardScatterStrategy,
182 # make sure the HS selection tool picks up the correct jets
183 JetContainer=flags.PhysVal.IDPVM.jetsNameForHardScatter,
184 VertexContainer=flags.PhysVal.IDPVM.PrimaryVertexContainer
185 )))
186
187 if doHyyHSSelection:
188 assert flags.PhysVal.IDPVM.PrimaryVertexContainer == 'HggPrimaryVertices'
189
190 kwargs.setdefault("FillTruthToRecoNtuple",
191 flags.PhysVal.IDPVM.doValidateTruthToRecoNtuple)
192 kwargs.setdefault("doTruthOriginPlots",
193 flags.PhysVal.IDPVM.doTruthOriginPlots)
194 kwargs.setdefault("doDuplicatePlots",
195 flags.PhysVal.IDPVM.doDuplicatePlots)
196 kwargs.setdefault("doHitLevelPlots",
197 flags.PhysVal.IDPVM.doHitLevelPlots)
198
199 # adding the VertexTruthMatchingTool
200 if not flags.PhysVal.IDPVM.doIDTIDE:
201 kwargs.setdefault("useVertexTruthMatchTool", True)
202 kwargs.setdefault("VertexTruthMatchTool", acc.popToolsAndMerge(
204
205 if "trackTruthOriginTool" not in kwargs:
206 from InDetTrackSystematicsTools.InDetTrackSystematicsToolsConfig import InDetTrackTruthOriginToolCfg
207 kwargs.setdefault("trackTruthOriginTool", acc.popToolsAndMerge(
208 InDetTrackTruthOriginToolCfg(flags)))
209
210 # Options for Truth Strategy : Requires full pile-up truth containers for some
211 if flags.PhysVal.IDPVM.setTruthStrategy in ['All', 'PileUp']:
212 if "xAOD::TruthPileupEventContainer#TruthPileupEvents" not in flags.Input.TypedCollections:
213 print('WARNING Truth Strategy for InDetPhysValMonitoring set to %s but TruthPileupEvents are missing in the input' % (flags.PhysVal.IDPVM.setTruthStrategy))
214 kwargs.setdefault("PileupSwitch",
215 flags.PhysVal.IDPVM.setTruthStrategy)
216
217 elif flags.PhysVal.IDPVM.setTruthStrategy != 'HardScatter':
218 print('WARNING Truth Strategy for for InDetPhysValMonitoring set to invalid option %s; valid flags are ["HardScatter", "All", "PileUp"]' % (
219 flags.PhysVal.IDPVM.setTruthStrategy))
220
221 else:
222 # disable truth monitoring for data
223 kwargs.setdefault("TruthParticleContainerName", '')
224 kwargs.setdefault("TruthVertexContainerName", '')
225 kwargs.setdefault("TruthEvents", '')
226 kwargs.setdefault("TruthPileupEvents", '')
227 kwargs.setdefault("TruthSelectionTool", None)
228 kwargs.setdefault("FillTruthToRecoNtuple", False)
229
230 if flags.Detector.GeometryITk:
231 # Disable vertex container for now
232 kwargs.setdefault("doTRTExtensionPlots", False)
233 kwargs.setdefault("isITk", True)
234
235 if flags.Reco.EnableHGTDExtension:
236 kwargs.setdefault("hasHGTDReco", True)
237
238 if flags.PhysVal.IDPVM.doTechnicalEfficiency:
239 kwargs.setdefault("fillTechnicalEfficiency", True)
240 kwargs.setdefault("EtaBins", flags.Tracking.ITkMainPass.etaBins if flags.Detector.GeometryITk
241 else [-1, 9999.]) # Configurable eta bins for determining a "reconstructable" particle
242 kwargs.setdefault("MinNumberClusters", flags.Tracking.ITkMainPass.minClusters if flags.Detector.GeometryITk
243 else [flags.Tracking.MainPass.minClusters]) # Configurable hits per eta bins for determining a "reconstructable" particle
244
245 # Control the number of output histograms
246 kwargs.setdefault("DetailLevel", 200 if flags.PhysVal.IDPVM.doExpertOutput else 100)
247
248 # for IDTIDE derivation
249 if flags.PhysVal.IDPVM.doIDTIDE:
250 kwargs.setdefault("doIDTIDEPlots", True)
251 kwargs.setdefault("JetContainerName", 'AntiKt4EMPFlowJets')
252 kwargs.setdefault("FillTrackInJetPlots", True)
253
254 # Set Jet cuts used for CTIDE studies
255 kwargs.setdefault('JetAbsEtaMin', 0)
256 kwargs.setdefault('JetAbsEtaMax',
257 flags.PhysVal.IDPVM.JetAbsEtaMax)
258 kwargs.setdefault('maxTrkJetDR',
259 flags.PhysVal.IDPVM.maxTrkJetDR)
260 # Pt cuts are in GeV
261 kwargs.setdefault('JetPtMin', 100)
262 kwargs.setdefault('JetPtMax', 5000)
263
264 kwargs.setdefault("doPRW", flags.PhysVal.IDPVM.doPRW)
265
266 acc.setPrivateTools(CompFactory.InDetPhysValMonitoringTool(**kwargs))
267 return acc
268
269
271 acc = ComponentAccumulator()
272
273 if 'TrackSelectionTool' not in kwargs:
274 from InDetTrackSelectionTool.InDetTrackSelectionToolConfig import (
275 InDetTrackSelectionTool_Loose_Cfg)
276 kwargs.setdefault("TrackSelectionTool", acc.popToolsAndMerge(
277 InDetTrackSelectionTool_Loose_Cfg(flags)))
278
279 kwargs.setdefault("SubFolder", 'Loose/')
280 kwargs.setdefault("useTrackSelection", True)
281
282 acc.setPrivateTools(acc.popToolsAndMerge(InDetPhysValMonitoringToolCfg(
283 flags, name="InDetPhysValMonitoringToolLoose", **kwargs)))
284 return acc
285
286
288 acc = ComponentAccumulator()
289
290 if 'TrackSelectionTool' not in kwargs:
291 from InDetTrackSelectionTool.InDetTrackSelectionToolConfig import (
292 InDetTrackSelectionTool_TightPrimary_Cfg)
293 kwargs.setdefault("TrackSelectionTool", acc.popToolsAndMerge(
294 InDetTrackSelectionTool_TightPrimary_Cfg(flags)))
295
296 kwargs.setdefault("SubFolder", 'TightPrimary/')
297 kwargs.setdefault("useTrackSelection", True)
298
299 acc.setPrivateTools(acc.popToolsAndMerge(InDetPhysValMonitoringToolCfg(
300 flags, name="InDetPhysValMonitoringToolTightPrimary", **kwargs)))
301 return acc
302
303
305 acc = ComponentAccumulator()
306
307 if 'TrackSelectionTool' not in kwargs:
308 from InDetTrackSelectionTool.InDetTrackSelectionToolConfig import (
309 InDetTrackSelectionTool_HILoose_Cfg)
310 kwargs.setdefault("TrackSelectionTool", acc.popToolsAndMerge(
311 InDetTrackSelectionTool_HILoose_Cfg(flags)))
312
313 kwargs.setdefault("SubFolder", 'HILoose/')
314 kwargs.setdefault("useTrackSelection", True)
315
316 acc.setPrivateTools(acc.popToolsAndMerge(InDetPhysValMonitoringToolCfg(
317 flags, name="InDetPhysValMonitoringToolHILoose", **kwargs)))
318 return acc
319
320
322 kwargs.setdefault("SubFolder", 'GSF/')
323 kwargs.setdefault("TrackParticleContainerName", 'GSFTrackParticles')
324 kwargs.setdefault("useTrackSelection", True)
326 flags, name="InDetPhysValMonitoringToolGSF", **kwargs)
327
328
330 acc = ComponentAccumulator()
331
332 kwargs.setdefault("TruthSelectionTool", acc.popToolsAndMerge(
334 flags, name="AthTruthSelectionToolForIDPVM_Electrons",
335 pdgId=11,
336 minPt=5000.
337 )))
338 kwargs.setdefault("onlyFillTruthMatched", True)
339 kwargs.setdefault("SubFolder", 'Electrons/')
340
341 acc.setPrivateTools(acc.popToolsAndMerge(InDetPhysValMonitoringToolCfg(
342 flags, name='InDetPhysValMonitoringToolElectrons', **kwargs)))
343 return acc
344
345
347 acc = ComponentAccumulator()
348
349 kwargs.setdefault("TruthSelectionTool", acc.popToolsAndMerge(
351 flags, name="AthTruthSelectionToolForIDPVM_Muons",
352 pdgId=13,
353 minPt=5000.
354 )))
355 kwargs.setdefault("onlyFillTruthMatched", True)
356 kwargs.setdefault("SubFolder", 'Muons/')
357
358 acc.setPrivateTools(acc.popToolsAndMerge(InDetPhysValMonitoringToolCfg(
359 flags, name='InDetPhysValMonitoringToolMuons', **kwargs)))
360 return acc
361
362
364 acc = ComponentAccumulator()
365
366 kwargs.setdefault("SubFolder", 'LRT/')
367 kwargs.setdefault("TruthSelectionTool", acc.popToolsAndMerge(
369 kwargs.setdefault("TrackParticleContainerName",
370 flags.PhysVal.IDPVM.largeD0TrackCollection
371 if flags.Tracking.storeSeparateLargeD0Container else
372 'InDetTrackParticles')
373 kwargs.setdefault("useTrackSelection", True)
374
375 acc.setPrivateTools(acc.popToolsAndMerge(InDetPhysValMonitoringToolCfg(
376 flags, name='InDetPhysValMonitoringToolLargeD0', **kwargs)))
377 return acc
378
379
381 acc = ComponentAccumulator()
382
383 kwargs.setdefault("SubFolder", 'LRTMerged/')
384 kwargs.setdefault("TruthSelectionTool", acc.popToolsAndMerge(
386 kwargs.setdefault("TrackParticleContainerName",
387 'InDetWithLRTTrackParticles'
388 if flags.Tracking.storeSeparateLargeD0Container else
389 'InDetTrackParticles')
390 kwargs.setdefault("useTrackSelection", True)
391
392 acc.setPrivateTools(acc.popToolsAndMerge(InDetPhysValMonitoringToolCfg(
393 flags, name='InDetPhysValMonitoringToolMergedLargeD0', **kwargs)))
394 return acc
395
397 acc = ComponentAccumulator()
398 kwargs.setdefault("SubFolder", 'LowPtRoI/') #Subfolder
399 kwargs.setdefault("TruthSelectionTool", acc.popToolsAndMerge(
400 InDetRttTruthSelectionToolCfg(flags,minPt=100)))
401 kwargs.setdefault("TrackParticleContainerName",
402 'InDetLowPtRoITrackParticles')
403 acc.setPrivateTools(acc.popToolsAndMerge(InDetPhysValMonitoringToolCfg(
404 flags, name='InDetPhysValMonitoringToolLowPtRoI', **kwargs)))
405
406 return acc
407
408
410 acc = ComponentAccumulator()
411
412 if flags.PhysVal.IDPVM.doValidateMergedLargeD0Tracks:
413 from DerivationFrameworkInDet.InDetToolsConfig import InDetLRTMergeCfg
414 acc.merge(InDetLRTMergeCfg(
415 flags,
416 InputTrackParticleLocations=[
417 "InDetTrackParticles",
418 flags.PhysVal.IDPVM.largeD0TrackCollection,
419 ],
420 ))
421
422 from ActsConfig.ActsAnalysisConfig import PhysValActsCfg
423
424 mons = [(True,
425 InDetPhysValMonitoringToolCfg),
426 (flags.PhysVal.IDPVM.doValidateMuonMatchedTracks,
427 InDetPhysValMonitoringToolMuonsCfg),
428 (flags.PhysVal.IDPVM.doValidateElectronMatchedTracks,
429 InDetPhysValMonitoringToolElectronsCfg),
430 (flags.PhysVal.IDPVM.doValidateLargeD0Tracks,
431 InDetLargeD0PhysValMonitoringToolCfg),
432 (flags.PhysVal.IDPVM.doValidateMergedLargeD0Tracks,
433 InDetMergedLargeD0PhysValMonitoringToolCfg),
434 (flags.PhysVal.IDPVM.doValidateLowPtRoITracks,
435 InDetLowPtRoIPhysValMonitoringToolCfg),
436 (flags.PhysVal.IDPVM.doValidateLooseTracks,
437 InDetPhysValMonitoringToolLooseCfg),
438 (flags.PhysVal.IDPVM.doValidateTightPrimaryTracks,
439 InDetPhysValMonitoringToolTightPrimaryCfg),
440 (flags.PhysVal.IDPVM.doValidateHILoose,
441 InDetPhysValMonitoringToolHILooseCfg),
442 (flags.PhysVal.IDPVM.doValidateGSFTracks,
443 InDetPhysValMonitoringToolGSFCfg),
444 (flags.PhysVal.IDPVM.doActs,
445 PhysValActsCfg)
446 ]
447
448 tools = []
449 for enabled, creator in mons:
450 if enabled:
451 tools.append(acc.popToolsAndMerge(creator(flags)))
452
453 for col in flags.PhysVal.IDPVM.validateExtraTrackCollections:
454 prefix = extractCollectionPrefix(col)
455 tools.append(acc.popToolsAndMerge(InDetPhysValMonitoringToolCfg(
456 flags, name='InDetPhysValMonitoringTool'+prefix,
457 SubFolder=prefix+'Tracks/',
458 TrackParticleContainerName=prefix+'TrackParticles'
459 )))
460
461 from PhysValMonitoring.PhysValMonitoringConfig import PhysValMonitoringCfg
462 acc.merge(PhysValMonitoringCfg(flags, tools=tools))
463 return acc
void print(char *figname, TCanvas *c1)
InDetRttTruthSelectionToolCfg(flags, name="InDetRttTruthSelectionTool", **kwargs)