ATLAS Offline Software
Loading...
Searching...
No Matches
IsolationBuilderConfig.py
Go to the documentation of this file.
1# Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
2
3""" Instantiate the electron or photon isolation """
4
5from AthenaCommon.Logging import logging
6from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
7from AthenaConfiguration.ComponentFactory import CompFactory
8
9def egIsolationCfg(flags, name='egIsolation', noCalo=False, **kwargs):
10
11 mlog = logging.getLogger(name)
12 mlog.info('Starting '+name+' configuration')
13
14 acc = ComponentAccumulator()
15
16 suff = ''
17 if name.find('photon') >= 0:
18 suff = 'photon'
19 pref = 'Ph'
20 elif name.find('electron') >= 0:
21 suff = 'electron'
22 pref = 'El'
23 else:
24 mlog.error('Name '+name+' should contain electron or photon')
25 return acc
26
27 from xAODPrimitives.xAODIso import xAODIso as isoPar
28 from IsolationAlgs.IsoToolsConfig import (
29 TrackIsolationToolCfg, ElectronTrackIsolationToolCfg,
30 EGammaCaloIsolationToolCfg)
31
32 isoType = []
33 isoCor = []
34 isoExCor = []
35
36 if flags.Detector.EnableID or flags.Detector.EnableITk:
37 isoType.append([ isoPar.ptcone30, isoPar.ptcone20 ])
38 isoCor.append([ isoPar.coreTrackPtr ])
39 isoExCor.append([])
40 if 'TrackIsolationTool' not in kwargs:
41 if pref == 'Ph':
42 kwargs['TrackIsolationTool'] = acc.popToolsAndMerge(
43 TrackIsolationToolCfg(flags))
44 else:
45 kwargs['TrackIsolationTool'] = acc.popToolsAndMerge(
46 ElectronTrackIsolationToolCfg(flags))
47
48 if flags.Detector.EnableCalo and not noCalo:
49 isoType.append(
50 [ isoPar.topoetcone20, isoPar.topoetcone30, isoPar.topoetcone40 ])
51 isoCor.append(
52 [ isoPar.core57cells, isoPar.ptCorrection, isoPar.pileupCorrection ])
53 # do not do pileup correction if HI with subtracted clusters
54 if flags.HeavyIon.Egamma.doSubtractedClusters:
55 isoCor[-1] = [ x for x in isoCor[-1] if x != isoPar.pileupCorrection ]
56 isoExCor.append([])
57 if 'CaloTopoIsolationTool' not in kwargs:
58 kwargs['CaloTopoIsolationTool'] = acc.popToolsAndMerge(
59 EGammaCaloIsolationToolCfg(flags))
60
61 kwargs[f'{pref}IsoTypes'] = isoType
62 kwargs[f'{pref}CorTypes'] = isoCor
63 kwargs[f'{pref}CorTypesExtra'] = isoExCor
64
65 kwargs['name'] = suff+'IsolationBuilder'
66
67 acc.addEventAlgo(CompFactory.IsolationBuilder(**kwargs))
68
69 mlog.info(suff+" isolation configured")
70
71 return acc
72
73def muIsolationCfg(flags, name='muIsolation', noCalo=False, **kwargs):
74
75 mlog = logging.getLogger(name)
76 mlog.info('Starting '+name+' configuration')
77
78 acc = ComponentAccumulator()
79
80 from xAODPrimitives.xAODIso import xAODIso as isoPar
81 from IsolationAlgs.IsoToolsConfig import (
82 TrackIsolationToolCfg, MuonCaloIsolationToolCfg)
83
84 isoType = []
85 isoCor = []
86 isoExCor = []
87
88 if flags.Detector.EnableID or flags.Detector.EnableITk:
89 isoType.append([ isoPar.ptcone40, isoPar.ptcone30, isoPar.ptcone20 ])
90 isoCor.append([ isoPar.coreTrackPtr ])
91 isoExCor.append([])
92 if 'TrackIsolationTool' not in kwargs:
93 kwargs['TrackIsolationTool'] = acc.popToolsAndMerge(
94 TrackIsolationToolCfg(flags))
95
96 if flags.Detector.EnableCalo and not noCalo:
97 isoType.append(
98 [ isoPar.topoetcone20, isoPar.topoetcone30, isoPar.topoetcone40 ])
99 isoCor.append([ isoPar.coreCone, isoPar.pileupCorrection ])
100 # do not do pileup correction if HI with subtracted clusters
101 if flags.HeavyIon.Egamma.doSubtractedClusters:
102 isoCor[-1] = [ x for x in isoCor[-1] if x != isoPar.pileupCorrection ]
103 isoExCor.append([])
104 if ('CaloTopoIsolationTool' not in kwargs) or (
105 'PFlowIsolationTool' not in kwargs):
106 cisoTool = acc.popToolsAndMerge(MuonCaloIsolationToolCfg(flags))
107 if 'CaloTopoIsolationTool' not in kwargs:
108 kwargs['CaloTopoIsolationTool'] = cisoTool
109 if flags.Reco.EnablePFlow and 'PFlowIsolationTool' not in kwargs:
110 isoType.append(
111 [ isoPar.neflowisol20, isoPar.neflowisol30, isoPar.neflowisol40 ])
112 isoCor.append([ isoPar.coreCone, isoPar.pileupCorrection ])
113 # do not do pileup correction for HI reco...
114 # and pflow iso is more than experimental in such reco anyway
115 if flags.HeavyIon.Egamma.doSubtractedClusters:
116 isoCor[-1] = [ x for x in isoCor[-1] if x != isoPar.pileupCorrection ]
117 isoExCor.append([])
118 kwargs['PFlowIsolationTool'] = cisoTool
119
120 kwargs['MuIsoTypes'] = isoType
121 kwargs['MuCorTypes'] = isoCor
122 kwargs['MuCorTypesExtra'] = isoExCor
123 kwargs['name'] = 'muonIsolationBuilder'
124
125 acc.addEventAlgo(CompFactory.IsolationBuilder(**kwargs))
126
127 mlog.info("muon isolation configured")
128
129 return acc
130
131
132if __name__ == "__main__":
133 from AthenaConfiguration.AllConfigFlags import initConfigFlags
134 from AthenaConfiguration.ComponentAccumulator import printProperties
135 from AthenaConfiguration.TestDefaults import defaultTestFiles
136 from AthenaConfiguration.MainServicesConfig import MainServicesCfg
137 flags = initConfigFlags()
138 flags.Input.Files = defaultTestFiles.RDO_RUN2
139 flags.Output.doWriteESD = True # To test the ESD parts
140 flags.Output.doWriteAOD = True # To test the AOD parts
141 flags.lock()
142
143 mlog = logging.getLogger("isolationConfigTest")
144 mlog.info("Configuring photon isolation: ")
145
146 acc = MainServicesCfg(flags)
147 acc.merge(egIsolationCfg(flags,name = 'photonIsolation'))
148 acc.merge(egIsolationCfg(flags,name = 'electronIsolation'))
149 acc.merge(muIsolationCfg(flags,name = 'muonIsolation'))
150 printProperties(mlog,
151 acc.getEventAlgo("photonIsolationBuilder"),
152 nestLevel=1,
153 printDefaults=True)
154 printProperties(mlog,
155 acc.getEventAlgo("electronIsolationBuilder"),
156 nestLevel=1,
157 printDefaults=True)
158 printProperties(mlog,
159 acc.getEventAlgo("muonIsolationBuilder"),
160 nestLevel=1,
161 printDefaults=True)
162
163 with open("isolationconfig.pkl", "wb") as f:
164 acc.store(f)
egIsolationCfg(flags, name='egIsolation', noCalo=False, **kwargs)
muIsolationCfg(flags, name='muIsolation', noCalo=False, **kwargs)