Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
InDetGNNHardScatterSelectionConfig.py
Go to the documentation of this file.
1 # Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
2 # A GNN based algorithm for selecting the Hard Scatter vertex (truth primary vertex
3 # that is simulated for the hard process, i.e. the PV in the TruthEvent)
4 
5 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
6 from AthenaConfiguration.ComponentFactory import CompFactory
7 
8 from TrkConfig.VertexFindingFlags import VertexSortingSetup
9 # Overlap removal configurations
10 
11 def AsgPtEtaSelectionToolCfg(flags, name="AsgPtEtaSelectionTool", **kwargs):
12  cfg = ComponentAccumulator()
13  kwargs.setdefault("maxEta", 2.5)
14  cfg.setPrivateTools(CompFactory.CP.AsgPtEtaSelectionTool(name, **kwargs))
15  return cfg
16 
17 def AsgPtEtaSelectionToolGapCfg(flags, name="AsgPtEtaSelectionTool", **kwargs):
18  kwargs.setdefault("etaGapLow", 1.37)
19  kwargs.setdefault("etaGapHigh", 1.52)
20  return AsgPtEtaSelectionToolCfg(flags, name, **kwargs)
21 
22 def AsgViewFromSelectionAlgCfg(flags, name="AsgViewFromSelectionAlg", **kwargs):
23  cfg = ComponentAccumulator()
24  kwargs.setdefault("selection", "selectPtEta")
25  kwargs.setdefault("deepCopy", False)
26  cfg.addEventAlgo(CompFactory.CP.AsgViewFromSelectionAlg(name, **kwargs))
27  return cfg
28 
29 def GNNHSSelectionAlgCfg(flags, input, minPt):
30  cfg = ComponentAccumulator()
31 
32  selectionTool = None
33  if input in ["Electrons", "Photons", "AntiKt4EMTopoJets"]:
34  selectionTool = cfg.popToolsAndMerge(
35  AsgPtEtaSelectionToolGapCfg(flags, minPt = minPt))
36  elif input in ["Muons"]:
37  selectionTool = cfg.popToolsAndMerge(
38  AsgPtEtaSelectionToolCfg(flags, minPt = minPt))
39 
40  cfg.addEventAlgo(CompFactory.CP.AsgSelectionAlg(
41  name = "GNNHS_"+input+"_SelectionAlg",
42  selectionTool = selectionTool,
43  selectionDecoration = "selectPtEta,as_char",
44  particles = input))
45 
46  return cfg
47 
48 
49 def GNNHSOverlapRemovalToolCfg(flags, name="GNNHS_OverlapRemovalToolCfg", **kwargs):
50  cfg = ComponentAccumulator()
51 
52  kwargs.setdefault("InputLabel", "selectPtEta")
53  kwargs.setdefault("OutputLabel", "passesOR")
54  kwargs.setdefault("OutputPassValue", True)
55 
56  subtool_kwargs={}
57  for prop in ["InputLabel", "OutputLabel", "OutputPassValue"]:
58  subtool_kwargs[prop] = kwargs[prop]
59 
60  kwargs.setdefault("EleEleORT", CompFactory.ORUtils.EleEleOverlapTool(**subtool_kwargs))
61  kwargs.setdefault("EleMuORT", CompFactory.ORUtils.EleMuSharedTrkOverlapTool(**subtool_kwargs))
62  kwargs.setdefault("EleJetORT", CompFactory.ORUtils.EleJetOverlapTool(**subtool_kwargs))
63  kwargs.setdefault(
64  "MuJetORT",
65  CompFactory.ORUtils.MuJetOverlapTool(
66  PVContainerName=(
67  "PrimaryVertices_initial"
68  if flags.Tracking.PriVertex.sortingSetup is VertexSortingSetup.GNNSorting
69  else "PrimaryVertices"
70  ),
71  **subtool_kwargs
72  )
73  )
74  kwargs.setdefault("PhoEleORT", CompFactory.ORUtils.DeltaROverlapTool(**subtool_kwargs))
75  kwargs.setdefault("PhoMuORT", CompFactory.ORUtils.DeltaROverlapTool(**subtool_kwargs))
76  kwargs.setdefault("PhoJetORT", CompFactory.ORUtils.DeltaROverlapTool(**subtool_kwargs))
77 
78  cfg.setPrivateTools(CompFactory.ORUtils.OverlapRemovalTool(name, **kwargs))
79  return cfg
80 
81 def GNNHSOverlapRemovalAlgCfg(flags, name="GNNHS_OverlapRemovalAlg",
82  overlapInputNames = None, overlapOutputNames = None, **kwargs):
83  cfg = ComponentAccumulator()
84 
85  kwargs.setdefault("OutputLabel", "passesOR")
86  kwargs.setdefault("affectingSystematicsFilter", ".*")
87 
88  for obj in overlapInputNames:
89  kwargs.setdefault(obj, overlapInputNames[obj])
90  kwargs.setdefault(obj+"Decoration", kwargs["OutputLabel"] + ",as_char")
91 
92  kwargs.setdefault("overlapTool", cfg.popToolsAndMerge(GNNHSOverlapRemovalToolCfg(flags)))
93 
94  cfg.addEventAlgo(CompFactory.CP.OverlapRemovalAlg(name, **kwargs))
95 
96  for obj in overlapInputNames:
97  cfg.addEventAlgo(CompFactory.CP.AsgViewFromSelectionAlg(
98  name = "GNNHS_"+obj+"_ORSelectionAlg",
99  input = overlapInputNames[obj],
100  output = overlapOutputNames[obj],
101  selection = [kwargs["OutputLabel"]+",as_char"],
102  deepCopy = False))
103 
104  return cfg
105 
106 
107 # GNNTool + VertexDecoratorAlg configs
108 
109 def GNNToolCfg(flags, name="HardScatterSelectionGNNTool", **kwargs):
110  acc = ComponentAccumulator()
111  acc.setPrivateTools(CompFactory.InDetGNNHardScatterSelection.GNNTool(name, **kwargs))
112  return acc
113 
114 def GNNHSVertexDecoratorAlgCfg(flags, name="GNNHS_VertexDecoratorAlg", **kwargs):
115  cfg = ComponentAccumulator()
116 
117  kwargs.setdefault("photonsIn", "Photons")
118 
119  if "gnnTool" not in kwargs:
120  kwargs.setdefault("gnnTool", cfg.popToolsAndMerge(
121  GNNToolCfg(flags,
122  nnFile="InDetGNNHardScatterSelection/v0/HSGN2_export_090824.onnx")))
123 
124  if "TrackVertexAssociationTool" not in kwargs:
125  from TrackVertexAssociationTool.TrackVertexAssociationToolConfig import TTVAToolCfg
126  kwargs.setdefault(
127  "TrackVertexAssociationTool",
128  cfg.popToolsAndMerge(
129  TTVAToolCfg(
130  flags,
131  "TrackVertexAssociationTool_GNNHS",
132  VertexContName=(
133  "PrimaryVertices_initial"
134  if flags.Tracking.PriVertex.sortingSetup is VertexSortingSetup.GNNSorting
135  else "PrimaryVertices"
136  ),
137  )
138  ),
139  )
140 
141 
142  cfg.addEventAlgo(
143  CompFactory.InDetGNNHardScatterSelection.VertexDecoratorAlg(name, **kwargs))
144  return cfg
145 
146 
147 # Global Sequence
148 def GNNSequenceCfg(flags, **kwargs):
149  cfg = ComponentAccumulator()
150 
151  sysSvc = CompFactory.CP.SystematicsSvc("SystematicsSvc")
152  selectionSvc = CompFactory.CP.SelectionNameSvc("SelectionNameSvc")
153  cfg.addService(sysSvc)
154  cfg.addService(selectionSvc)
155 
156  inputCollections = {
157  "jets": (
158  "AntiKt4EMTopoCustomVtxGNNJets"
159  if flags.Tracking.PriVertex.sortingSetup is VertexSortingSetup.GNNSorting
160  else "AntiKt4EMTopoJets"
161  ),
162  "electrons": "Electrons",
163  "muons": "Muons",
164  "photons": "Photons",
165  }
166 
167  from PhotonVertexSelection.PhotonVertexSelectionConfig import (
168  DecoratePhotonPointingAlgCfg)
169  cfg.merge(DecoratePhotonPointingAlgCfg(flags, PhotonContainerKey=inputCollections["photons"]))
170 
171  ptThresholds = {
172  "jets": 15000,
173  "electrons": 4500,
174  "muons": 3000,
175  "photons": 10000,
176  }
177 
178  for obj in inputCollections:
179  cfg.merge(GNNHSSelectionAlgCfg(flags, input = inputCollections[obj],
180  minPt = ptThresholds[obj]))
181 
182  overlapOutputNames = {
183  "muons": f'{inputCollections["muons"]}_OR',
184  "electrons": f'{inputCollections["electrons"]}_OR',
185  "photons": f'{inputCollections["photons"]}_OR',
186  "jets": f'{inputCollections["jets"]}_OR',
187  }
188 
189  cfg.merge(GNNHSOverlapRemovalAlgCfg(flags, overlapInputNames = inputCollections,
190  overlapOutputNames = overlapOutputNames))
191 
192  cfg.merge(
194  flags,
195  vertexIn=(
196  "PrimaryVertices_initial"
197  if flags.Tracking.PriVertex.sortingSetup is VertexSortingSetup.GNNSorting
198  else "PrimaryVertices"
199  ),
200  electronsIn=overlapOutputNames["electrons"],
201  muonsIn=overlapOutputNames["muons"],
202  photonsIn=overlapOutputNames["photons"],
203  jetsIn=overlapOutputNames["jets"],
204  )
205  )
206 
207  return cfg
208 
209 
210 if __name__ == "__main__":
211  from AthenaConfiguration.AllConfigFlags import initConfigFlags
212  flags = initConfigFlags()
213 
214  # AOD input
215  from AthenaConfiguration.TestDefaults import defaultTestFiles
216  flags.Input.Files = defaultTestFiles.AOD_RUN3_MC
217  flags.Exec.MaxEvents = 100
218  flags.lock()
219 
220  from AthenaConfiguration.MainServicesConfig import MainServicesCfg
221  top_acc = MainServicesCfg(flags)
222 
223  from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
224  top_acc.merge(PoolReadCfg(flags))
225 
226  from InDetPhysValMonitoring.addRecoJetsConfig import (
227  AddRecoJetsIfNotExistingCfg)
228  top_acc.merge(AddRecoJetsIfNotExistingCfg(
229  flags, "AntiKt4EMTopoJets"))
230 
231  top_acc.merge(GNNSequenceCfg(flags))
232  from AthenaCommon.Constants import DEBUG
233  top_acc.foreach_component("AthEventSeq/*").OutputLevel = DEBUG
234  top_acc.printConfig(withDetails=True, summariseProps=True)
235  top_acc.store(open("GNNSequenceConfig.pkl", "wb"))
236 
237  import sys
238  if "--norun" not in sys.argv:
239  sc = top_acc.run(1)
240  if sc.isFailure():
241  sys.exit(-1)
python.JetAnalysisCommon.ComponentAccumulator
ComponentAccumulator
Definition: JetAnalysisCommon.py:302
python.InDetGNNHardScatterSelectionConfig.GNNHSOverlapRemovalToolCfg
def GNNHSOverlapRemovalToolCfg(flags, name="GNNHS_OverlapRemovalToolCfg", **kwargs)
Definition: InDetGNNHardScatterSelectionConfig.py:49
python.InDetGNNHardScatterSelectionConfig.AsgPtEtaSelectionToolCfg
def AsgPtEtaSelectionToolCfg(flags, name="AsgPtEtaSelectionTool", **kwargs)
Definition: InDetGNNHardScatterSelectionConfig.py:11
PhotonVertexSelectionConfig.DecoratePhotonPointingAlgCfg
def DecoratePhotonPointingAlgCfg(flags, name="DecoratePhotonPointingAlg", **kwargs)
Definition: PhotonVertexSelectionConfig.py:21
TrackVertexAssociationToolConfig.TTVAToolCfg
def TTVAToolCfg(flags, name, addDecoAlg=True, VertexContName="PrimaryVertices", **kwargs)
Definition: TrackVertexAssociationToolConfig.py:15
python.InDetGNNHardScatterSelectionConfig.GNNSequenceCfg
def GNNSequenceCfg(flags, **kwargs)
Definition: InDetGNNHardScatterSelectionConfig.py:148
python.MainServicesConfig.MainServicesCfg
def MainServicesCfg(flags, LoopMgr='AthenaEventLoopMgr')
Definition: MainServicesConfig.py:260
addRecoJetsConfig.AddRecoJetsIfNotExistingCfg
def AddRecoJetsIfNotExistingCfg(flags, jetCollection)
Definition: addRecoJetsConfig.py:3
Constants
some useful constants -------------------------------------------------—
python.InDetGNNHardScatterSelectionConfig.GNNHSSelectionAlgCfg
def GNNHSSelectionAlgCfg(flags, input, minPt)
Definition: InDetGNNHardScatterSelectionConfig.py:29
Trk::open
@ open
Definition: BinningType.h:40
python.AllConfigFlags.initConfigFlags
def initConfigFlags()
Definition: AllConfigFlags.py:19
python.InDetGNNHardScatterSelectionConfig.GNNHSVertexDecoratorAlgCfg
def GNNHSVertexDecoratorAlgCfg(flags, name="GNNHS_VertexDecoratorAlg", **kwargs)
Definition: InDetGNNHardScatterSelectionConfig.py:114
python.InDetGNNHardScatterSelectionConfig.AsgViewFromSelectionAlgCfg
def AsgViewFromSelectionAlgCfg(flags, name="AsgViewFromSelectionAlg", **kwargs)
Definition: InDetGNNHardScatterSelectionConfig.py:22
python.InDetGNNHardScatterSelectionConfig.AsgPtEtaSelectionToolGapCfg
def AsgPtEtaSelectionToolGapCfg(flags, name="AsgPtEtaSelectionTool", **kwargs)
Definition: InDetGNNHardScatterSelectionConfig.py:17
python.PoolReadConfig.PoolReadCfg
def PoolReadCfg(flags)
Definition: PoolReadConfig.py:69
python.InDetGNNHardScatterSelectionConfig.GNNHSOverlapRemovalAlgCfg
def GNNHSOverlapRemovalAlgCfg(flags, name="GNNHS_OverlapRemovalAlg", overlapInputNames=None, overlapOutputNames=None, **kwargs)
Definition: InDetGNNHardScatterSelectionConfig.py:81
python.InDetGNNHardScatterSelectionConfig.GNNToolCfg
def GNNToolCfg(flags, name="HardScatterSelectionGNNTool", **kwargs)
Definition: InDetGNNHardScatterSelectionConfig.py:109