5from AthenaConfiguration.ComponentAccumulator
import ComponentAccumulator
6from AthenaConfiguration.ComponentFactory
import CompFactory
8from TrkConfig.VertexFindingFlags
import VertexSortingSetup
12 cfg = ComponentAccumulator()
13 kwargs.setdefault(
"maxEta", 2.5)
14 cfg.setPrivateTools(CompFactory.CP.AsgPtEtaSelectionTool(name, **kwargs))
18 kwargs.setdefault(
"etaGapLow", 1.37)
19 kwargs.setdefault(
"etaGapHigh", 1.52)
23 cfg = ComponentAccumulator()
24 kwargs.setdefault(
"selection",
"selectPtEta")
25 kwargs.setdefault(
"deepCopy",
False)
26 cfg.addEventAlgo(CompFactory.CP.AsgViewFromSelectionAlg(name, **kwargs))
30 cfg = ComponentAccumulator()
34 "AntiKt4EMTopoCustomVtxGNNJets"
35 if flags.Tracking.PriVertex.sortingSetup
is VertexSortingSetup.GNNSorting
36 else "AntiKt4EMTopoJets"
38 if input
in [
"Electrons",
"Photons", jetContainer]:
39 selectionTool = cfg.popToolsAndMerge(
41 elif input
in [
"Muons"]:
42 selectionTool = cfg.popToolsAndMerge(
46 (
"SG::AuxVectorBase", f
"StoreGateSvc+{input}.selectPtEta"),
47 (
"xAOD::IParticleContainer", f
"StoreGateSvc+{input}.selectPtEta"),
50 cfg.addEventAlgo(CompFactory.CP.AsgSelectionAlg(
51 name =
"GNNHS_"+input+
"_SelectionAlg",
52 selectionTool = selectionTool,
53 selectionDecoration =
"selectPtEta,as_char",
55 ExtraOutputs = selection_outputs))
61 cfg = ComponentAccumulator()
63 kwargs.setdefault(
"InputLabel",
"selectPtEta")
64 kwargs.setdefault(
"OutputLabel",
"passesOR")
65 kwargs.setdefault(
"OutputPassValue",
True)
68 for prop
in [
"InputLabel",
"OutputLabel",
"OutputPassValue"]:
69 subtool_kwargs[prop] = kwargs[prop]
71 kwargs.setdefault(
"EleEleORT", CompFactory.ORUtils.EleEleOverlapTool(**subtool_kwargs))
72 kwargs.setdefault(
"EleMuORT", CompFactory.ORUtils.EleMuSharedTrkOverlapTool(**subtool_kwargs))
73 kwargs.setdefault(
"EleJetORT", CompFactory.ORUtils.EleJetOverlapTool(**subtool_kwargs))
76 CompFactory.ORUtils.MuJetOverlapTool(
78 "PrimaryVertices_initial"
79 if flags.Tracking.PriVertex.sortingSetup
is VertexSortingSetup.GNNSorting
80 else "PrimaryVertices"
86 kwargs.setdefault(
"PhoEleORT", CompFactory.ORUtils.DeltaROverlapTool(**subtool_kwargs))
87 kwargs.setdefault(
"PhoMuORT", CompFactory.ORUtils.DeltaROverlapTool(**subtool_kwargs))
88 kwargs.setdefault(
"PhoJetORT", CompFactory.ORUtils.DeltaROverlapTool(**subtool_kwargs))
90 cfg.setPrivateTools(CompFactory.ORUtils.OverlapRemovalTool(name, **kwargs))
94 overlapInputNames = None, overlapOutputNames = None, **kwargs):
95 cfg = ComponentAccumulator()
97 kwargs.setdefault(
"OutputLabel",
"passesOR")
98 kwargs.setdefault(
"affectingSystematicsFilter",
".*")
100 for obj
in overlapInputNames:
101 kwargs.setdefault(obj, overlapInputNames[obj])
102 kwargs.setdefault(obj+
"Decoration", kwargs[
"OutputLabel"] +
",as_char")
104 extraInputs =
set(kwargs.get(
"ExtraInputs",
set()))
105 for inputContainer
in overlapInputNames.values():
106 extraInputs.add((
"xAOD::IParticleContainer", f
"StoreGateSvc+{inputContainer}.selectPtEta"))
107 kwargs[
"ExtraInputs"] = list(extraInputs)
110 (
"SG::AuxVectorBase", f
"StoreGateSvc+{overlapInputNames['jets']}.passesOR"),
111 (
"xAOD::IParticleContainer", f
"StoreGateSvc+{overlapInputNames['jets']}.passesOR"),
112 (
"SG::AuxVectorBase", f
"StoreGateSvc+{overlapInputNames['electrons']}.passesOR"),
113 (
"xAOD::IParticleContainer", f
"StoreGateSvc+{overlapInputNames['electrons']}.passesOR"),
114 (
"SG::AuxVectorBase", f
"StoreGateSvc+{overlapInputNames['muons']}.passesOR"),
115 (
"xAOD::IParticleContainer", f
"StoreGateSvc+{overlapInputNames['muons']}.passesOR"),
116 (
"SG::AuxVectorBase", f
"StoreGateSvc+{overlapInputNames['photons']}.passesOR"),
117 (
"xAOD::IParticleContainer", f
"StoreGateSvc+{overlapInputNames['photons']}.passesOR"),
122 cfg.addEventAlgo(CompFactory.CP.OverlapRemovalAlg(name, ExtraOutputs=overlap_outputs, **kwargs))
124 or_container_types = {
125 "jets": [
"xAOD::JetContainer",
"xAOD::IParticleContainer"],
126 "electrons": [
"xAOD::ElectronContainer",
"xAOD::IParticleContainer"],
127 "muons": [
"xAOD::MuonContainer",
"xAOD::IParticleContainer"],
128 "photons": [
"xAOD::PhotonContainer",
"xAOD::EgammaContainer",
"xAOD::IParticleContainer"],
131 for obj
in overlapInputNames:
132 output_name = overlapOutputNames[obj]
133 view_outputs = [(
"xAOD::AuxContainerBase", f
"StoreGateSvc+{output_name}Aux.")]
134 for out_type
in or_container_types[obj]:
135 view_outputs.append((out_type, f
"StoreGateSvc+{output_name}"))
136 view_outputs.extend([
137 (
"SG::AuxVectorBase", f
"StoreGateSvc+{output_name}.passesOR"),
138 (
"xAOD::IParticleContainer", f
"StoreGateSvc+{output_name}.passesOR"),
139 (
"SG::AuxVectorBase", f
"StoreGateSvc+{output_name}.selectPtEta"),
140 (
"xAOD::IParticleContainer", f
"StoreGateSvc+{output_name}.selectPtEta"),
143 cfg.addEventAlgo(CompFactory.CP.AsgViewFromSelectionAlg(
144 name =
"GNNHS_"+obj+
"_ORSelectionAlg",
145 input = overlapInputNames[obj],
146 output = output_name,
147 selection = [kwargs[
"OutputLabel"]+
",as_char"],
149 ExtraOutputs = view_outputs))
156def GNNToolCfg(flags, name="HardScatterSelectionGNNTool", **kwargs):
157 acc = ComponentAccumulator()
158 kwargs.setdefault(
"nnFile", flags.Tracking.PriVertex.HSGNN.nnFile)
159 acc.setPrivateTools(CompFactory.InDetGNNHardScatterSelection.GNNTool(name, **kwargs))
163 cfg = ComponentAccumulator()
165 kwargs.setdefault(
"photonsIn",
"Photons")
167 if "gnnTool" not in kwargs:
168 kwargs.setdefault(
"gnnTool", cfg.popToolsAndMerge(
GNNToolCfg(flags)))
170 if "TrackVertexAssociationTool" not in kwargs:
171 from TrackVertexAssociationTool.TrackVertexAssociationToolConfig
import GNNHS_TTVAToolCfg
172 kwargs.setdefault(
"TrackVertexAssociationTool", cfg.popToolsAndMerge(
173 GNNHS_TTVAToolCfg(flags)))
175 vertex_extra_inputs =
set(kwargs.get(
"ExtraInputs",
set()))
176 for cont
in [
"electronsIn",
"muonsIn",
"photonsIn",
"jetsIn"]:
178 vertex_extra_inputs.add((
"xAOD::IParticleContainer", f
"StoreGateSvc+{kwargs[cont]}"))
179 if "photonsIn" in kwargs:
180 photons_key = kwargs[
"photonsIn"]
181 vertex_extra_inputs.update({
182 (
"xAOD::IParticleContainer", f
"StoreGateSvc+{photons_key}.zCommon"),
183 (
"xAOD::IParticleContainer", f
"StoreGateSvc+{photons_key}.caloPointingZ"),
184 (
"xAOD::IParticleContainer", f
"StoreGateSvc+{photons_key}.zCommonError"),
186 kwargs[
"ExtraInputs"] = list(vertex_extra_inputs)
188 cfg.addEventAlgo(CompFactory.InDetGNNHardScatterSelection.VertexDecoratorAlg(name, **kwargs))
194 cfg = ComponentAccumulator()
196 selectionSvc = CompFactory.CP.SelectionNameSvc(
"SelectionNameSvc")
197 cfg.addService(selectionSvc)
201 "AntiKt4EMTopoCustomVtxGNNJets"
202 if flags.Tracking.PriVertex.sortingSetup
is VertexSortingSetup.GNNSorting
203 else "AntiKt4EMTopoJets"
205 "electrons":
"Electrons",
207 "photons":
"Photons",
217 for obj
in inputCollections:
219 minPt = ptThresholds[obj]))
224 cfg.addService(CompFactory.CP.SystematicsSvc(
"SystematicsSvc"))
225 overlapOutputNames = {
226 "muons": f
'{inputCollections["muons"]}_OR',
227 "electrons": f
'{inputCollections["electrons"]}_OR',
228 "photons": f
'{inputCollections["photons"]}_OR',
229 "jets": f
'{inputCollections["jets"]}_OR',
232 overlapOutputNames = overlapOutputNames))
235 overlapOutputNames = inputCollections
237 from PhotonVertexSelection.PhotonVertexSelectionConfig
import DecoratePhotonPointingAlgCfg
238 photon_key = overlapOutputNames[
"photons"]
240 DecoratePhotonPointingAlgCfg(
242 PhotonContainerKey=photon_key,
244 (
"xAOD::EgammaContainer", f
"StoreGateSvc+{photon_key}"),
247 (
"xAOD::IParticleContainer", f
"StoreGateSvc+{photon_key}.zCommon"),
248 (
"xAOD::IParticleContainer", f
"StoreGateSvc+{photon_key}.caloPointingZ"),
249 (
"xAOD::IParticleContainer", f
"StoreGateSvc+{photon_key}.zCommonError"),
258 "PrimaryVertices_initial"
259 if flags.Tracking.PriVertex.sortingSetup
is VertexSortingSetup.GNNSorting
260 else "PrimaryVertices"
262 electronsIn=overlapOutputNames[
"electrons"],
263 muonsIn=overlapOutputNames[
"muons"],
264 photonsIn=overlapOutputNames[
"photons"],
265 jetsIn=overlapOutputNames[
"jets"],
272if __name__ ==
"__main__":
273 from AthenaConfiguration.AllConfigFlags
import initConfigFlags
274 flags = initConfigFlags()
277 from AthenaConfiguration.TestDefaults
import defaultTestFiles
278 flags.Input.Files = defaultTestFiles.AOD_RUN3_MC
279 flags.Exec.MaxEvents = 100
282 from AthenaConfiguration.MainServicesConfig
import MainServicesCfg
283 top_acc = MainServicesCfg(flags)
285 from AthenaPoolCnvSvc.PoolReadConfig
import PoolReadCfg
286 top_acc.merge(PoolReadCfg(flags))
288 from InDetPhysValMonitoring.addRecoJetsConfig
import (
289 AddRecoJetsIfNotExistingCfg)
290 top_acc.merge(AddRecoJetsIfNotExistingCfg(
291 flags,
"AntiKt4EMTopoJets"))
295 top_acc.foreach_component(
"AthEventSeq/*").OutputLevel = DEBUG
296 top_acc.printConfig(withDetails=
True, summariseProps=
True)
297 top_acc.store(open(
"GNNSequenceConfig.pkl",
"wb"))
300 if "--norun" not in sys.argv:
GNNHSSelectionAlgCfg(flags, input, minPt)
GNNSequenceCfg(flags, doOverlapRemoval=True)
GNNHSVertexDecoratorAlgCfg(flags, name="GNNHS_VertexDecoratorAlg", **kwargs)
AsgPtEtaSelectionToolCfg(flags, name="AsgPtEtaSelectionTool", **kwargs)
GNNToolCfg(flags, name="HardScatterSelectionGNNTool", **kwargs)
GNNHSOverlapRemovalAlgCfg(flags, name="GNNHS_OverlapRemovalAlg", overlapInputNames=None, overlapOutputNames=None, **kwargs)
GNNHSOverlapRemovalToolCfg(flags, name="GNNHS_OverlapRemovalToolCfg", **kwargs)
AsgViewFromSelectionAlgCfg(flags, name="AsgViewFromSelectionAlg", **kwargs)
AsgPtEtaSelectionToolGapCfg(flags, name="AsgPtEtaSelectionTool", **kwargs)