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