ATLAS Offline Software
Loading...
Searching...
No Matches
TrigEgammaPrecisionPhotonCaloIsoHypoTool.py
Go to the documentation of this file.
1# Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
2
3from AthenaCommon.SystemOfUnits import GeV
4from AthenaMonitoringKernel.GenericMonitoringTool import GenericMonitoringTool
5from AthenaConfiguration.ComponentFactory import CompFactory
6#
7# photon hypo alg
8#
9def createTrigEgammaPrecisionPhotonCaloIsoHypoAlg(name, sequenceOut, sequenceIn):
10
11 thePrecisionPhotonCaloIsoHypo = CompFactory.TrigEgammaPrecisionPhotonCaloIsoHypoAlg(name)
12 thePrecisionPhotonCaloIsoHypo.Photons = sequenceIn # Key of the input photon container
13 thePrecisionPhotonCaloIsoHypo.IsoPhotons = sequenceOut # key of the output isolated photon container
14 return thePrecisionPhotonCaloIsoHypo
15
16
17#
18# For photons
19#
21
22
23 #Below are the configuration of the calorimeter isolation selections
24 # The dictionary key is the working point (icaloloose, icalo medium and icalotight
25 # the value is an array of three components where first component refers to a cut related to topoetcone20/pt, the second to topoetcone30/pt and third to topoetcone40/pt
26 # __caloIsolationCut is the cut on the variable topoetcone[x]/pt
27 # __caloEtconeCut is the cut on etcone[x]/pt Not used. But kept for backward compatibility
28 # __caloIsolationOffset is the offset applied to that cut
29 # so the selection is:
30 #
31
32 __caloIsolationCut = {
33 None : [None, None, None],
34 'icaloloose' : [0.1 , 999., 999. ],
35 'icalomedium' : [0.075, 999., 999. ],
36 'icalotight' : [999. , 999., 0.03 ]
37 }
38
39 __caloEtconeCut = {
40 None : [None, None, None],
41 'icaloloose' : [999., 999., 999.],
42 'icalomedium' : [999., 999., 999.],
43 'icalotight' : [999., 999., 999.]
44 }
45
46 __caloIsolationOffset = {
47 None : [None, None, None],
48 'icaloloose' : [0.,0.,0.],
49 'icalomedium': [0.,0.,0],
50 'icalotight' : [0.,0.,2.45*GeV]
51 }
52
53
54 def __init__(self, name, monGroups, cpart, tool=None):
55
56 from AthenaCommon.Logging import logging
57 self.__log = logging.getLogger('TrigEgammaPrecisionPhotonCaloIsoHypoTool')
58 self.__name = name
59 self.__isoinfo = cpart['isoInfo']
60 self.__monGroups = monGroups
61
62 if not tool:
63 tool = CompFactory.TrigEgammaPrecisionPhotonCaloIsoHypoTool( name )
64
65 tool.EtaBins = [0.0, 0.6, 0.8, 1.15, 1.37, 1.52, 1.81, 2.01, 2.37, 2.47]
66
67 self.__tool = tool
68 self.__log.debug( 'Chain :%s', self.__name )
69 self.__log.debug( 'isoinfo :%s', self.__isoinfo )
70
71
72 def isoInfo(self):
73 return self.__isoinfo
74
75 def tool(self):
76 return self.__tool
77
78 #
79 # Isolation and nominal cut
80 #
81 def isoCut(self):
82
83 if self.isoInfo() == 'noiso':
84 self.tool().AcceptAll = True
85 return
86 self.tool().RelTopoEtConeCut = self.__caloIsolationCut[self.isoInfo()]
87 self.tool().RelEtConeCut = self.__caloEtconeCut[self.isoInfo()]
88 self.tool().Offset = self.__caloIsolationOffset[self.isoInfo()]
89
90
91
92
93 #
94 # Compile the chain
95 #
96 def compile(self, flags):
97
98 if self.isoInfo() != 'noiso':
99 if self.isoInfo() not in self.__caloIsolationCut.keys():
100 self.__log.error('Isolation cut %s not defined!', self.isoInfo())
101
102 self.__log.debug('Configuring Isolation cut %s for [topoetcone20/et, topoetcone30/et, topoetcone40/et]', self.isoInfo())
103 self.__log.debug(' with values = %s and offsets = %s',
104 str(self.__caloIsolationCut[self.isoInfo()]),
105 str(self.__caloIsolationOffset[self.isoInfo()]))
106 else:
107 self.__log.debug('Configuring Isolation to AcceptAll (not applying any cut)')
108 self.isoCut()
109
110
111 if hasattr(self.tool(), "MonTool"):
112
113 doValidationMonitoring = flags.Trigger.doValidationMonitoring # True to monitor all chains for validation purposes
114 monGroups = self.__monGroups
115
116 if (any('egammaMon:online' in group for group in monGroups) or doValidationMonitoring):
117 self.addMonitoring(flags)
118
119
120 #
121 # Monitoring code
122 #
123 def addMonitoring(self, flags):
124
125 monTool = GenericMonitoringTool(flags, "MonTool_"+self.__name,
126 HistPath = 'PrecisionPhotonCaloIsoHypo/'+self.__name)
127 monTool.defineHistogram('Et_em', type='TH1F', path='EXPERT', title="PrecisionPhotonCaloIso Hypo cluster E_{T}^{EM};E_{T}^{EM} [MeV]", xbins=50, xmin=-2000, xmax=100000)
128 monTool.defineHistogram('Eta', type='TH1F', path='EXPERT', title="PrecisionPhotonCaloIso Hypo entries per Eta;Eta", xbins=100, xmin=-2.5, xmax=2.5)
129 monTool.defineHistogram('Phi', type='TH1F', path='EXPERT', title="PrecisionPhotonCaloIso Hypo entries per Phi;Phi", xbins=128, xmin=-3.2, xmax=3.2)
130 monTool.defineHistogram('EtaBin', type='TH1I', path='EXPERT', title="PrecisionPhotonCaloIso Hypo entries per Eta bin;Eta bin no.", xbins=11, xmin=-0.5, xmax=10.5)
131
132 cuts=['Input','eta','Calo Iso']
133
134 monTool.defineHistogram('CutCounter', type='TH1I', path='EXPERT', title="PrecisionPhotonCaloIso Hypo Passed Cuts;Cut",
135 xbins=13, xmin=-1.5, xmax=12.5, opt="kCumulative", xlabels=cuts)
136
137 if flags.Trigger.doValidationMonitoring:
138 monTool.defineHistogram('etcone20',type='TH1F',path='EXPERT',title= "PrecisionPhotonCaloIso Hypo etcone20; etcone20;", xbins=50, xmin=0, xmax=5.0)
139 monTool.defineHistogram('topoetcone20',type='TH1F',path='EXPERT',title= "PrecisionPhotonCaloIso Hypo; topoetcone20;", xbins=50, xmin=-10, xmax=10)
140 monTool.defineHistogram('reletcone20',type='TH1F',path='EXPERT',title= "PrecisionPhotonCaloIso Hypo etcone20/et; etcone20/et;", xbins=50, xmin=-0.5, xmax=0.5)
141 monTool.defineHistogram('reltopoetcone20',type='TH1F',path='EXPERT',title= "PrecisionPhotonCaloIso Hypo; topoetcone20/pt;", xbins=50, xmin=-0.5, xmax=0.5)
142
143 self.tool().MonTool = monTool
144
145
146
147def _IncTool( flags, name, monGroups, cpart, tool=None ):
148 config = TrigEgammaPrecisionPhotonCaloIsoHypoToolConfig(name, monGroups, cpart, tool=tool)
149 config.compile(flags)
150 return config.tool()
151
152
153
155 """ Use menu decoded chain dictionary to configure the tool """
156 cparts = [i for i in d['chainParts'] if ((i['signature']=='Electron') or (i['signature']=='Photon'))]
157 return _IncTool( flags, d['chainName'], d['monGroups'], cparts[0], tool=tool )
const bool debug