ATLAS Offline Software
Loading...
Searching...
No Matches
TrigEgammaMonitoringConfig.py
Go to the documentation of this file.
1# Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
2
3'''@file TrigEgammaMonitoringConfigRun3.py
4@author D. Maximov (histograms), Joao victor Pinto (core)
5@date 2019-07-08
6@brief Run 3 configuration builder. Histograms definitions taken from TrigEgammaPlotTool
7'''
8
9from ElectronPhotonSelectorTools.TrigEGammaPIDdefs import SelectionDefPhoton
10from ROOT.ChainNameParser import HLTChainInfo
11
12import cppyy
13import functools
14
15from AthenaConfiguration.ComponentFactory import CompFactory
16from AthenaMonitoring.DQConfigFlags import DQDataType
17
18
19def treat_list_of_chains_by_name( list_of_chains, part_name=None):
20 if part_name:
21 final_list = []
22 for chain in list_of_chains:
23 if part_name in chain:
24 final_list.append(chain)
25 return final_list
26 else:
27 return list_of_chains
28
29
30
32
33 data_type = ''
34 pp_mode = False
35 pPb_mode = False
36 HI_mode = False
37 cosmic_mode = False
38 mc_mode = False
39 activate_electron = False
40 activate_photon = False
41 activate_zee = False
42 activate_zeeg = False
43 activate_jpsiee = False
44 activate_topo = False
45 activate_onlineMonHypos = False
46 tagItems = []
47 jpsitagItems = []
48 electronList = []
49 photonList = []
50 tpList = []
51 jpsiList = []
52
53
54 isemnames = ["tight", "medium", "loose"]
55 lhnames = ["lhtight", "lhmedium", "lhloose","lhvloose"]
56 dnnnames = ["dnntight", "dnnmedium", "dnnloose"]
57
58
59
60 def __init__(self, helper, runflag, moniAccess, emulator=None,
61 onlyHLT = False,
62 derivation=False,
63 detailedHistograms = False,
64 basePath = 'HLT/EgammaMon', ComputeEffLH = False, ComputeEffDNN = False):
65
66 from AthenaCommon.Logging import logging
67 self.__logger = logging.getLogger( 'TrigEgammaMonAlgBuilder' )
68 self.runFlag = runflag
69 self.helper = helper
70 self.derivation = derivation
71 self.emulator = emulator
72 self.basePath = basePath
73 self.detailedHistograms = detailedHistograms
74 self.moniAccess = moniAccess
75 self.onlyHLT = onlyHLT
76 self.computeEffLH = ComputeEffLH
77 self.computeEffDNN = ComputeEffDNN
78 self.configureMode()
79
80
81
82 def configureMode(self):
83
84 self.__logger.info("TrigEgammaMonAlgBuilder.configureMode()")
85 self.activate_onlineMonHypos = True
86
87 if not self.get_monitoring_mode():
88 self.__logger.warning("Error getting monitoring mode, default monitoring lists will be used.")
89 else:
90 self.__logger.info("TrigEgammaMonitoring: Configuring for %s", self.data_type)
91
92 # Since we load the tools by name below
93 # Need to ensure the correct tools are configured
94 # for each monitoring mode
95 if self.mc_mode or self.pp_mode:
96 if(self.derivation):
97 self.activate_zee = True
98 self.activate_zeeg = True
99 else:
100 self.activate_zee=True
101 self.activate_zeeg=True
102 self.activate_jpsiee=True
103 self.activate_electron=True
104 self.activate_photon=True
105 self.activate_topo= False
106 elif self.HI_mode or self.pPb_mode or self.cosmic_mode:
107 self.activate_zee=True
108 self.activate_electron=True
109 self.activate_photon=True
110 else:
111 self.activate_zee=True
112 self.activate_jpsiee=True
113 self.activate_electron=True
114 self.activate_photon=True
115
116 #
117 # Configure everything
118 #
119
120 def configure(self):
121 self.setProperties()
122 self.configureMonitor()
124
125
127
128 self.__logger.info("TrigEgammaMonAlgBuilder.get_monitoring_mode()")
129 self.data_type = self.helper.flags.DQ.DataType
130
131 if self.data_type is DQDataType.MC:
132 self.mc_mode = True
133 self.__logger.info('TrigEgammaMonitoring configured for mc_mode')
134 return True
135 elif self.data_type is DQDataType.Collisions:
136 self.pp_mode = True
137 self.__logger.info('TrigEgammaMonitoring configured for pp_mode')
138 return True
139 elif self.data_type is DQDataType.HeavyIon:
140 self.HI_mode = True
141 self.pPb_mode = True
142 self.__logger.info('TrigEgammaMonitoring configured for hi_mode')
143 return True
144 elif self.data_type is DQDataType.Cosmics:
145 self.cosmic_mode = True
146 self.__logger.info('TrigEgammaMonitoring configured for cosmic_mode')
147 return True
148 else:
149 return False
150
151
152 def setProperties(self):
153
154 self.__logger.info("TrigEgammaMonAlgBuilder.setProperties()")
155 self.basePath = 'HLT/EgammaMon'
156
157 if self.pp_mode:
159 elif self.cosmic_mode:
161 elif self.HI_mode or self.pPb_mode:
163 elif self.mc_mode:
165 else:
166 self.__logger.info('No monitoring mode configured, use default')
168
169
170 self.__logger.info('Configuring TP electron chains %s',self.tpList)
171 self.__logger.info('Configuring TP Zeeg tag trigger chains %s',self.tpZeegTagList)
172 self.__logger.info('Configuring TP Zeeg probe trigger chains %s',self.tpZeegProbeList)
173 self.__logger.info('Configuring electron chains %s',self.electronList)
174 self.__logger.info('Configuring photon chains %s',self.photonList)
175 self.__logger.info('Configuring minimal trigger matching to probe trigger', self.tpMatchingMap)
176
177
179
180 from TrigEgammaMonitoring.TrigEgammaMonitCategory import mongroupsCfg
181 mongroups = mongroupsCfg(self.moniAccess,self.data_type)
182 #monitoringTP_tag
183 if self.pp_mode:
184 self.electronList = mongroups['monitoring_electron']
185 self.photonList = mongroups['monitoring_photon']
186 self.bootstrapMap = mongroups['monitoring_bootstrap']
187 self.tpMatchingMap= mongroups['monitoringTP_Matching']
188 self.tpList = mongroups['monitoringTP_electron']
189 self.tpZeegProbeList = mongroups['monitoringTP_probe']
190 self.tpZeegTagList = mongroups['monitoringTP_tag']
191 self.tagItems = mongroups['monitoringTP_tag']
192 self.topoList = mongroups['monitoring_topo']
193 elif self.mc_mode:
194 self.electronList = mongroups['validation_electron']
195 self.photonList = mongroups['validation_photon']
196 self.bootstrapMap = mongroups['monitoring_bootstrap']
197 self.tpMatchingMap= mongroups['monitoringTP_Matching']
198 self.tpList = mongroups['monitoringTP_electron'] + mongroups['validationTP_electron_DNN']
199 self.tpZeegProbeList = mongroups['monitoringTP_probe']
200 self.tpZeegTagList = mongroups['monitoringTP_tag']
201 self.jpsiList = mongroups['validation_jpsi']
202 self.jpsitagItems = mongroups['validationTP_jpsiee']
203 self.tagItems = mongroups['monitoringTP_tag']
204 self.topoList = mongroups['monitoring_topo']
205 elif self.cosmic_mode:
206 self.electronList = mongroups['monitoring_electron_cosmic']
207 self.photonList = mongroups['monitoring_photon_cosmic']
208 self.bootstrapMap = mongroups['monitoring_bootstrap_cosmic']
209 self.tpMatchingMap= mongroups['monitoringTP_Matching']
210 self.tpZeegProbeList = mongroups['monitoringTP_probe']
211 self.tpZeegTagList = mongroups['monitoringTP_tag']
212 else:
213 self.electronList = mongroups['monitoring_electron']
214 self.photonList = mongroups['monitoring_photon']
215 self.bootstrapMap = mongroups['monitoring_bootstrap']
216 self.tpMatchingMap= mongroups['monitoringTP_Matching']
217 self.tpList = mongroups['monitoringTP_electron']
218 self.tagItems = mongroups['monitoringTP_tag']
219 self.topoList = mongroups['monitoring_topo']
220 self.tpZeegProbeList = mongroups['monitoringTP_probe']
221 self.tpZeegTagList = mongroups['monitoringTP_tag']
222
223
224 #
225 # Create all monitor algorithms
226 #
227
228 def configureMonitor( self ):
229
230 acc = self.helper.resobj
231 EgammaMatchTool = CompFactory.TrigEgammaMatchingToolMT()
232 EgammaMatchTool.DeltaR=0.4
233 acc.addPublicTool(EgammaMatchTool)
234 cppyy.load_library('libElectronPhotonSelectorToolsDict')
235 # Following loads the online selectors
236
237 # Offline selectors -- taken from latest conf
238 LooseElectronSelector = CompFactory.AsgElectronIsEMSelector("T0HLTLooseElectronSelector")
239 MediumElectronSelector = CompFactory.AsgElectronIsEMSelector("T0HLTMediumElectronSelector")
240 TightElectronSelector = CompFactory.AsgElectronIsEMSelector("T0HLTTightElectronSelector")
241 LooseLHSelector = CompFactory.AsgElectronLikelihoodTool("T0HLTLooseLHSelector")
242 MediumLHSelector = CompFactory.AsgElectronLikelihoodTool("T0HLTMediumLHSelector")
243 TightLHSelector = CompFactory.AsgElectronLikelihoodTool("T0HLTTightLHSelector")
244 VeryLooseLHSelector = CompFactory.AsgElectronLikelihoodTool("T0HLTVeryLooseLHSelector")
245
246 # DNN selectors
247 LooseDNNElectronSelector = CompFactory.AsgElectronSelectorTool("T0HLTLooseElectronDNNSelector")
248 MediumDNNElectronSelector = CompFactory.AsgElectronSelectorTool("T0HLTMediumElectronDNNSelector")
249 TightDNNElectronSelector = CompFactory.AsgElectronSelectorTool("T0HLTTightElectronDNNSelector")
250
251 LoosePhotonSelector = CompFactory.AsgPhotonIsEMSelector( "T0HLTLoosePhotonSelector" )
252 MediumPhotonSelector = CompFactory.AsgPhotonIsEMSelector( "T0HLTMediumPhotonSelector" )
253 TightPhotonSelector = CompFactory.AsgPhotonIsEMSelector( "T0HLTTightPhotonSelector" )
254
255 LoosePhotonSelector.ForceConvertedPhotonPID = True
256 LoosePhotonSelector.isEMMask = SelectionDefPhoton.PhotonLoose
257 MediumPhotonSelector.ForceConvertedPhotonPID = True
258 MediumPhotonSelector.isEMMask = SelectionDefPhoton.PhotonMedium
259 TightPhotonSelector.ForceConvertedPhotonPID = True
260 TightPhotonSelector.isEMMask = SelectionDefPhoton.PhotonTight
261
262
263 acc.addPublicTool(LooseElectronSelector)
264 acc.addPublicTool(MediumElectronSelector)
265 acc.addPublicTool(TightElectronSelector)
266 acc.addPublicTool(LooseLHSelector)
267 acc.addPublicTool(MediumLHSelector)
268 acc.addPublicTool(TightLHSelector)
269 acc.addPublicTool(VeryLooseLHSelector)
270 acc.addPublicTool(LooseDNNElectronSelector)
271 acc.addPublicTool(MediumDNNElectronSelector)
272 acc.addPublicTool(TightDNNElectronSelector)
273
274 if self.runFlag == '2022':
275 raise RuntimeError( '2022 (Run 3) configuration not available yet' )
276
277
278 elif self.runFlag == '2018':
279 # cut based
280 LooseElectronSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc15_20150712/ElectronIsEMLooseSelectorCutDefs.conf"
281 MediumElectronSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc15_20150712/ElectronIsEMMediumSelectorCutDefs.conf"
282 TightElectronSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc15_20150712/ElectronIsEMTightSelectorCutDefs.conf"
283 # 2018 (vtest)
284 LooseLHSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc20_20210514/ElectronLikelihoodLooseOfflineConfig2017_CutBL_Smooth.conf"
285 MediumLHSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc20_20210514/ElectronLikelihoodMediumOfflineConfig2017_Smooth.conf"
286 TightLHSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc20_20210514/ElectronLikelihoodTightOfflineConfig2017_Smooth.conf"
287 VeryLooseLHSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc20_20210514/ElectronLikelihoodVeryLooseOfflineConfig2017_Smooth.conf"
288 # DNN
289 LooseDNNElectronSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc20_20240628/ElectronDNNMulticlassLoose.conf"
290 MediumDNNElectronSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc20_20240628/ElectronDNNMulticlassMedium.conf"
291 TightDNNElectronSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc20_20240628/ElectronDNNMulticlassTight.conf"
292 # cutbased for photons
293 TightPhotonSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc15_20150712/PhotonIsEMTightSelectorCutDefs.conf"
294 MediumPhotonSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc15_20150712/PhotonIsEMMediumSelectorCutDefs.conf"
295 LoosePhotonSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc15_20150712/PhotonIsEMLooseSelectorCutDefs.conf"
296
297 elif self.runFlag == '2017':
298 # cut based
299 LooseElectronSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc15_20150712/ElectronIsEMLooseSelectorCutDefs.conf"
300 MediumElectronSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc15_20150712/ElectronIsEMMediumSelectorCutDefs.conf"
301 TightElectronSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc15_20150712/ElectronIsEMTightSelectorCutDefs.conf"
302 # 2017 (v11)
303 LooseLHSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc15_20160512/ElectronLikelihoodLooseOfflineConfig2016_CutBL_Smooth.conf"
304 MediumLHSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc15_20160512/ElectronLikelihoodMediumOfflineConfig2016_Smooth.conf"
305 TightLHSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc15_20160512/ElectronLikelihoodTightOfflineConfig2016_Smooth.conf"
306 VeryLooseLHSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc15_20160512/ElectronLikelihoodVeryLooseOfflineConfig2016_Smooth.conf"
307 # DNN
308 LooseDNNElectronSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc16_20210430/ElectronDNNMulticlassLoose.conf"
309 MediumDNNElectronSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc16_20210430/ElectronDNNMulticlassMedium.conf"
310 TightDNNElectronSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc16_20210430/ElectronDNNMulticlassTight.conf"
311 # cut based for photons
312 TightPhotonSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc15_20150712/PhotonIsEMTightSelectorCutDefs.conf"
313 MediumPhotonSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc15_20150712/PhotonIsEMMediumSelectorCutDefs.conf"
314 LoosePhotonSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc15_20150712/PhotonIsEMLooseSelectorCutDefs.conf"
315
316 else:
317 # raise since the configuration its not defined
318 raise RuntimeError( 'Wrong run flag configuration' )
319
320
321
322 if self.activate_zee:
323 tpList = treat_list_of_chains_by_name(self.tpList, 'lh') # Only LH chains
324 tagItems = treat_list_of_chains_by_name(self.tagItems, 'lh') # Only LH chains
325 self.__logger.info( "Creating the Zee monitor algorithm LH only...")
326 self.zeeMonAlg = self.helper.addAlgorithm( CompFactory.TrigEgammaMonitorTagAndProbeAlgorithm, "TrigEgammaMonitorTagAndProbeAlgorithm_Zee_LH" )
327 self.zeeMonAlg.Analysis='Zee'
328 self.zeeMonAlg.MatchTool = EgammaMatchTool
329 self.zeeMonAlg.TPTrigger=False
330 self.zeeMonAlg.ElectronKey = 'Electrons'
331 self.zeeMonAlg.isEMResultNames=self.isemnames
332 self.zeeMonAlg.LHResultNames=self.lhnames
333 self.zeeMonAlg.DNNResultNames=self.dnnnames
334 self.zeeMonAlg.ElectronIsEMSelector =[TightElectronSelector,MediumElectronSelector,LooseElectronSelector]
335 self.zeeMonAlg.ElectronLikelihoodTool =[TightLHSelector,MediumLHSelector,LooseLHSelector,VeryLooseLHSelector]
336 self.zeeMonAlg.ElectronDNNSelectorTool =[TightDNNElectronSelector,MediumDNNElectronSelector,LooseDNNElectronSelector]
337 self.zeeMonAlg.ZeeLowerMass=80
338 self.zeeMonAlg.ZeeUpperMass=100
339 self.zeeMonAlg.OfflineTagMinEt=25
340 self.zeeMonAlg.OfflineTagSelector='lhtight'
341 self.zeeMonAlg.OfflineProbeSelector='lhloose'
342 self.zeeMonAlg.OppositeCharge=True
343 self.zeeMonAlg.RemoveCrack=False
344 self.zeeMonAlg.TagTriggerList=tagItems
345 self.zeeMonAlg.TriggerList=tpList
346 self.zeeMonAlg.DetailedHistograms=self.detailedHistograms
347 self.zeeMonAlg.DoEmulation = False
348 self.zeeMonAlg.ApplyJetNearProbeSelection = False
349
350
351 # Separated TaP tool configuration
352 tpList = treat_list_of_chains_by_name(self.tpList, 'dnn') # get only dnn chains
353 tagItems = treat_list_of_chains_by_name(self.tagItems, 'dnn')
354 self.__logger.info( "Creating the Zee monitor algorithm DNN only...")
355 self.zeeMonAlg_dnn = self.helper.addAlgorithm( CompFactory.TrigEgammaMonitorTagAndProbeAlgorithm, "TrigEgammaMonitorTagAndProbeAlgorithm_Zee_DNN" )
356 self.zeeMonAlg_dnn.Analysis='Zee_DNN'
357 self.zeeMonAlg_dnn.MatchTool = EgammaMatchTool
358 self.zeeMonAlg_dnn.TPTrigger=False
359 self.zeeMonAlg_dnn.ElectronKey = 'Electrons'
360 self.zeeMonAlg_dnn.isEMResultNames=self.isemnames
361 self.zeeMonAlg_dnn.LHResultNames=self.lhnames
362 self.zeeMonAlg_dnn.DNNResultNames=self.dnnnames
363 self.zeeMonAlg_dnn.ElectronIsEMSelector =[TightElectronSelector,MediumElectronSelector,LooseElectronSelector]
364 self.zeeMonAlg_dnn.ElectronLikelihoodTool =[TightLHSelector,MediumLHSelector,LooseLHSelector,VeryLooseLHSelector]
365 self.zeeMonAlg_dnn.ElectronDNNSelectorTool =[TightDNNElectronSelector,MediumDNNElectronSelector,LooseDNNElectronSelector]
366 self.zeeMonAlg_dnn.ZeeLowerMass=80
367 self.zeeMonAlg_dnn.ZeeUpperMass=100
368 self.zeeMonAlg_dnn.OfflineTagMinEt=25
369 self.zeeMonAlg_dnn.OfflineTagSelector='dnntight'
370 self.zeeMonAlg_dnn.OfflineProbeSelector='dnnloose'
371 self.zeeMonAlg_dnn.OppositeCharge=True
372 self.zeeMonAlg_dnn.RemoveCrack=False
373 self.zeeMonAlg_dnn.TagTriggerList=tagItems
374 self.zeeMonAlg_dnn.TriggerList=tpList
375 self.zeeMonAlg_dnn.DetailedHistograms=self.detailedHistograms
376 self.zeeMonAlg_dnn.DoEmulation = False
377 self.zeeMonAlg_dnn.ApplyJetNearProbeSelection = False
378
379 if self.emulator: # turn on emulator
380 self.emulator.TriggerList += self.tpList
381 self.zeeMonAlg.DoEmulation = True
382 self.zeeMonAlg.EmulationTool = self.emulator.core()
383 self.zeeMonAlg_dnn.DoEmulation = True
384 self.zeeMonAlg_dnn.EmulationTool = self.emulator.core()
385
386 if self.activate_zeeg:
389 self.__logger.info( "Creating the Zeegamma monitor algorithm")
390 self.zeegMonAlg = self.helper.addAlgorithm( CompFactory.TrigEgammaMonitorTagAndProbeAlgorithmZeeg, "TrigEgammaMonitorTagAndProbeZeeg" )
391 self.zeegMonAlg.Analysis='Zeeg'
392 self.zeegMonAlg.MatchTool = EgammaMatchTool
393 self.zeegMonAlg.TPTrigger=False
394 self.zeegMonAlg.ElectronKey = 'Electrons'
395 self.zeegMonAlg.PhotonKey = 'Photons'
396 self.zeegMonAlg.PhotonIsolationKeys = ["Photons.topoetcone20", "Photons.topoetcone40"]
397
398 self.zeegMonAlg.isEMResultNames=self.isemnames
399 self.zeegMonAlg.LHResultNames=self.lhnames
400 self.zeegMonAlg.DNNResultNames=self.dnnnames
401 self.zeegMonAlg.PhotonIsEMSelector =[TightPhotonSelector,MediumPhotonSelector,LoosePhotonSelector]
402 self.zeegMonAlg.ElectronIsEMSelector =[TightElectronSelector,MediumElectronSelector,LooseElectronSelector]
403 self.zeegMonAlg.ElectronLikelihoodTool =[TightLHSelector,MediumLHSelector,LooseLHSelector,VeryLooseLHSelector]
404 self.zeegMonAlg.ElectronDNNSelectorTool =[TightDNNElectronSelector,MediumDNNElectronSelector,LooseDNNElectronSelector]
405 self.zeegMonAlg.ZeeLowerMass=80
406 self.zeegMonAlg.ZeeUpperMass=100
407 self.zeegMonAlg.OfflineTagMinEt=25
408 self.zeegMonAlg.OfflineTagSelector='lhvloose'
409 self.zeegMonAlg.OfflineProbeSelector='loose'
410 self.zeegMonAlg.OppositeCharge=True
411 self.zeegMonAlg.RemoveCrack=False
412 self.zeegMonAlg.TPMatchingMap = self.tpMatchingMap
413 self.zeegMonAlg.TagTriggerList=tagList # Tag triggers
414 self.zeegMonAlg.ProbeTriggerList=probeList #Probe Triggers
415 self.zeegMonAlg.DetailedHistograms=self.detailedHistograms
416 self.zeegMonAlg.DoEmulation = False
417 self.zeegMonAlg.ApplyJetNearProbeSelection = False
418
419 if self.emulator: # turn on emulator
420 self.emulator.TriggerList += tpList
421 self.zeegMonAlg.DoEmulation = True
422 self.zeegMonAlg.EmulationTool = self.emulator.core()
423 self.zeegMonAlg.DoEmulation = True
424 self.zeegMonAlg.EmulationTool = self.emulator.core()
425
426
427 if self.activate_jpsiee:
428
429 self.__logger.info( "Creating the Jpsiee monitor algorithm...")
430 self.jpsieeMonAlg = self.helper.addAlgorithm( CompFactory.TrigEgammaMonitorTagAndProbeAlgorithm, "TrigEgammaMonitorTagAndProbeAlgorithm_Jpsiee" )
431 self.jpsieeMonAlg.DoJpsiee=True
432 self.jpsieeMonAlg.Analysis='Jpsiee'
433 self.jpsieeMonAlg.MatchTool = EgammaMatchTool
434 self.jpsieeMonAlg.TPTrigger=False
435 self.jpsieeMonAlg.ElectronKey = 'Electrons'
436 self.jpsieeMonAlg.isEMResultNames=self.isemnames
437 self.jpsieeMonAlg.LHResultNames=self.lhnames
438 self.jpsieeMonAlg.DNNResultNames=self.dnnnames
439 self.jpsieeMonAlg.ElectronIsEMSelector =[TightElectronSelector,MediumElectronSelector,LooseElectronSelector]
440 self.jpsieeMonAlg.ElectronLikelihoodTool =[TightLHSelector,MediumLHSelector,LooseLHSelector,VeryLooseLHSelector]
441 self.jpsieeMonAlg.ElectronDNNSelectorTool =[TightDNNElectronSelector,MediumDNNElectronSelector,LooseDNNElectronSelector]
442 self.jpsieeMonAlg.ZeeLowerMass=2
443 self.jpsieeMonAlg.ZeeUpperMass=5
444 self.jpsieeMonAlg.OfflineTagMinEt=5
445 self.jpsieeMonAlg.OfflineTagSelector='lhtight'
446 self.jpsieeMonAlg.OfflineProbeSelector='lhloose'
447 self.jpsieeMonAlg.OppositeCharge=True
448 self.jpsieeMonAlg.RemoveCrack=False
449 self.jpsieeMonAlg.TagTriggerList=self.jpsitagItems
450 self.jpsieeMonAlg.TriggerList=self.jpsiList
451 self.jpsieeMonAlg.DetailedHistograms=self.detailedHistograms
452 self.jpsieeMonAlg.DoEmulation = False
453 self.jpsieeMonAlg.ApplyJetNearProbeSelection = False
454
455 if self.activate_electron:
456
457 self.__logger.info( "Creating the Electron monitor algorithm...")
458 self.elMonAlg = self.helper.addAlgorithm( CompFactory.TrigEgammaMonitorElectronAlgorithm, "TrigEgammaMonitorElectronAlgorithm" )
459 self.elMonAlg.MatchTool = EgammaMatchTool
460 self.elMonAlg.Analysis = "Electrons"
461 self.elMonAlg.ElectronKey = 'Electrons'
462 self.elMonAlg.isEMResultNames=self.isemnames
463 self.elMonAlg.LHResultNames=self.lhnames
464 self.elMonAlg.DNNResultNames=self.dnnnames
465 self.elMonAlg.ElectronIsEMSelector =[TightElectronSelector,MediumElectronSelector,LooseElectronSelector]
466 self.elMonAlg.ElectronLikelihoodTool =[TightLHSelector,MediumLHSelector,LooseLHSelector,VeryLooseLHSelector]
467 self.elMonAlg.ForcePidSelection=True
468 self.elMonAlg.ForceProbeIsolation=False
469 self.elMonAlg.ForceEtThreshold=True
470 self.elMonAlg.TriggerList=self.electronList
471 self.elMonAlg.DetailedHistograms=self.detailedHistograms
472 self.elMonAlg.DoEmulation = False
473 self.elMonAlg.ComputeEffLH = self.computeEffLH
474 self.elMonAlg.ComputeEffDNN = self.computeEffDNN
475
476 if self.emulator:
477 self.elMonAlg.DoEmulation = True
478 self.emulator.TriggerList += self.electronList
479 self.elMonAlg.EmulationTool = self.emulator.core()
480
481
482 if self.activate_photon:
483
484 self.__logger.info( "Creating the Photon monitor algorithm...")
485 self.phMonAlg = self.helper.addAlgorithm( CompFactory.TrigEgammaMonitorPhotonAlgorithm, "TrigEgammaMonitorPhotonAlgorithm" )
486 self.phMonAlg.Analysis = "Photons"
487 self.phMonAlg.MatchTool = EgammaMatchTool
488 self.phMonAlg.PhotonKey = 'Photons'
489 self.phMonAlg.PhotonIsolationKeys = ["Photons.topoetcone20", "Photons.topoetcone40"]
490 self.phMonAlg.isEMResultNames=self.isemnames
491 self.phMonAlg.LHResultNames=self.lhnames
492 self.phMonAlg.PhotonIsEMSelector =[TightPhotonSelector,MediumPhotonSelector,LoosePhotonSelector]
493 self.phMonAlg.TriggerList=self.photonList
494 self.phMonAlg.BootstrapTriggerMap = self.bootstrapMap
495 self.phMonAlg.DetailedHistograms=self.detailedHistograms
496 self.phMonAlg.ForcePidSelection=True
497 self.phMonAlg.DoUnconverted=False
498 self.phMonAlg.DoEmulation = False
499 self.phMonAlg.OnlyHLT = self.onlyHLT
500
501
502 if self.emulator:
503 self.phMonAlg.DoEmulation = True
504 self.emulator.TriggerList += self.photonList
505 self.phMonAlg.EmulationTool = self.emulator.core()
506
507
508 if self.activate_topo:
509
510 self.__logger.info( "Creating the combo monitor algorithm...")
511 self.topoMonAlg = self.helper.addAlgorithm( CompFactory.TrigEgammaMonitorTopoAlgorithm, "TrigEgammaMonitorTopoAlgorithm" )
512 self.topoMonAlg.MatchTool = EgammaMatchTool
513 self.topoMonAlg.ElectronKey = 'Electrons'
514 self.topoMonAlg.PhotonKey = 'Photons'
515 self.topoMonAlg.isEMResultNames=self.isemnames
516 self.topoMonAlg.LHResultNames=self.lhnames
517 self.topoMonAlg.DNNResultNames=self.dnnnames
518 self.topoMonAlg.ElectronIsEMSelector =[TightElectronSelector,MediumElectronSelector,LooseElectronSelector]
519 self.topoMonAlg.ElectronLikelihoodTool =[TightLHSelector,MediumLHSelector,LooseLHSelector]
520 self.topoMonAlg.DetailedHistograms=self.detailedHistograms
521 self.topoMonAlg.TriggerListConfig = self.topoList # this is a list of dicts
522
523
525 self.setBinning()
526
527 if self.activate_zee:
528
529 # LH plots
530 self.bookEvent( self.zeeMonAlg, self.zeeMonAlg.Analysis , True)
531 triggers = self.zeeMonAlg.TriggerList; triggers.extend( self.zeeMonAlg.TagTriggerList )
532 self.bookExpertHistograms( self.zeeMonAlg, triggers )
533
534 # dnn plots
535 self.bookEvent( self.zeeMonAlg_dnn, self.zeeMonAlg_dnn.Analysis , True)
536 triggers = self.zeeMonAlg_dnn.TriggerList; triggers.extend( self.zeeMonAlg_dnn.TagTriggerList )
537 self.bookExpertHistograms( self.zeeMonAlg_dnn, triggers )
538
539 if self.activate_jpsiee:
540 self.setBinning(True)
541 self.bookEvent( self.jpsieeMonAlg, self.jpsieeMonAlg.Analysis, True )
542 triggers = self.jpsieeMonAlg.TriggerList; triggers.extend( self.jpsieeMonAlg.TagTriggerList )
543 self.bookExpertHistograms( self.jpsieeMonAlg, triggers )
544
545 # back to default bin configuration
546 self.setBinning()
547
548 if self.activate_zeeg:
549 self.__logger.debug("ZEEG TriggerList = %s", self.zeegMonAlg.ProbeTriggerList)
550 self.__logger.debug("ZEEG TagTriggerList = %s", self.zeegMonAlg.TagTriggerList)
551 self.bookEvent( self.zeegMonAlg, self.zeegMonAlg.Analysis , True)
552
553 triggers = self.zeegMonAlg.ProbeTriggerList[:]
554 triggers.extend( self.zeegMonAlg.TagTriggerList )
555
556 self.bookExpertHistograms( self.zeegMonAlg, triggers )
557
558 if self.activate_electron:
559 self.bookExpertHistograms( self.elMonAlg, self.elMonAlg.TriggerList )
560 if self.activate_photon:
561 self.bookExpertHistograms( self.phMonAlg, self.phMonAlg.TriggerList )
562
563
564 # configure topo chains
565 if self.activate_topo:
566 self.bookTopoHistograms( self.topoMonAlg, self.topoMonAlg.TriggerListConfig )
567
568
569 # If we've already defined the group, return the object already defined
570 @functools.lru_cache(None)
571 def addGroup( self, monAlg, name, path ):
572 return self.helper.addGroup( monAlg, name, path )
573
574 def addHistogram(self, monGroup, hist):
575 if monGroup is None:
576 self.__logger.error("monGroup is None for hist %s", hist.name)
577 return
578 self.__logger.debug("BOOKING HIST %s in group %s",
579 hist.name, monGroup.name)
580 self.__logger.debug("kwargs = %s", hist.kwargs)
581 monGroup.defineHistogram(hist.name, **hist.kwargs)
582
583
584 #
585 # Booking all histograms
586 #
587 def bookExpertHistograms( self, monAlg, triggers ):
588
589 self.__logger.info( "Booking all histograms for alg: %s", monAlg.name )
590
591
592 for trigger in triggers:
593
594 info = self.getTrigInfo(trigger)
595 self.__logger.info( "Trigger info: %s", info )
596
597 #Booking histograms
598 #
599 # Distributions
600 #
601 self.bookL1CaloDistributions( monAlg, trigger )
602 self.bookL2CaloDistributions( monAlg, trigger )
603 self.bookEFCaloDistributions( monAlg, trigger )
604
605 self.bookL1CaloResolutions( monAlg, trigger )
606 self.bookL1CaloAbsResolutions( monAlg, trigger )
607 self.bookL2CaloResolutions( monAlg, trigger )
608
609 # Checking the trigger (tag)
610 if info.isTagAndProbeZeeg():
611 self.bookL2PhotonDistributions( monAlg, trigger )
612 self.bookShowerShapesDistributions( monAlg, trigger, "HLT", online=True )
613 self.bookShowerShapesDistributions( monAlg, trigger, "HLT", online=False)
614 self.bookHLTPhotonResolutions( monAlg, trigger, info.isIsolated() )
615
616 if info.isElectron():
617 self.bookL2ElectronDistributions( monAlg, trigger )
618 # Offline and HLT
619 self.bookShowerShapesDistributions( monAlg, trigger, "HLT" ,online=True)
620 self.bookShowerShapesDistributions( monAlg, trigger, "HLT" ,online=False)
621 self.bookTrackingDistributions( monAlg, trigger, online=True )
622 self.bookTrackingDistributions( monAlg, trigger, online=False )
623 self.bookHLTResolutions( monAlg, trigger,"HLT" )
624 self.bookHLTElectronResolutions( monAlg, trigger, info.isIsolated() )
625
626 elif info.isPhoton():
627 self.bookL2PhotonDistributions( monAlg, trigger )
628 self.bookShowerShapesDistributions( monAlg, trigger, "HLT", online=True )
629 self.bookShowerShapesDistributions( monAlg, trigger, "HLT", online=False)
630 self.bookHLTPhotonResolutions( monAlg, trigger, info.isIsolated() )
631
632
633 #
634 # Efficiencies
635 #
636
637 self.bookEfficiencies( monAlg, trigger, "L1Calo" )
638 self.bookEfficiencies( monAlg, trigger, "FastCalo" )
639 if info.isTagAndProbeZeeg():
640 self.bookEfficiencies( monAlg, trigger, "FastPhoton")
641 if info.isPhoton():
642 self.bookEfficiencies( monAlg, trigger, "FastPhoton")
643 if info.isElectron():
644 self.bookEfficiencies( monAlg, trigger, "FastElectron")
645
646 self.bookEfficiencies( monAlg, trigger, "PrecisionCalo" )
647 self.bookEfficiencies( monAlg, trigger, "HLT")
648 if self.detailedHistograms:
649 for pid in self.isemnames + self.lhnames:
650 self.bookEfficiencies( monAlg, trigger, "HLT", pid )
651 self.bookEfficiencies( monAlg, trigger, "HLT", pid+"Iso" )
652
653 #
654 # Emulation
655 #
656 if self.emulator:
657 self.bookEfficiencies( monAlg, trigger, "L1Calo" , doEmulation=True)
658 self.bookEfficiencies( monAlg, trigger, "FastCalo" , doEmulation=True)
659 self.bookEfficiencies( monAlg, trigger, "PrecisionCalo" , doEmulation=True)
660 if info.isTagAndProbeZeeg():
661 self.bookEfficiencies( monAlg, trigger, "FastPhoton")
662 if info.isPhoton():
663 self.bookEfficiencies( monAlg, trigger, "FastPhoton")
664 if info.isElectron():
665 self.bookEfficiencies( monAlg, trigger, "FastElectron")
666 self.bookEfficiencies( monAlg, trigger, "HLT" , doEmulation=True)
667
668 # Inefficiencies
669 self.bookInefficiencies(monAlg, trigger)
670
671
672 def bookEvent(self, monAlg, analysis, tap=False):
673
674 # Create mon group. The group name should be the path name for map
675 monGroup = self.addGroup( monAlg, analysis, self.basePath+'/Expert/Event/'+analysis )
676
677 if tap:
678 cutLabels = ["Events","LAr","RetrieveElectrons","TwoElectrons","PassMinimalTrigger", "PassFullTrigger"]
679 tagLabels=["Electrons","NotTag","OS","SS","ZMass","HasTrack","HasCluster","Eta","Et","IsGoodOQ","GoodPid","NearbyJet","Isolated","GoodProbe","PassTrigger","MatchTrigger"]
680 probeLabels=["Photons","HasCluster","EtCut","Eta","IsGoodOQ","NearbyJet","ZMass","GoodProbe","","PassTrigger","Et22","Et25","Et35","Et50"]
681 #We need to add in the photons for the probe
682 #We also need to add in the photon selection (Is it a good photon)
683
684 monGroup.defineHistogram("CutCounter", type='TH1I', path='', title="Event Selection; Cut ; Count",
685 xbins=len(cutLabels), xmin=0, xmax=len(cutLabels), xlabels=cutLabels)
686 monGroup.defineHistogram("TagCutCounter", type='TH1F', path='', title="Number of Tags; Cut ; Count",
687 xbins=len(tagLabels), xmin=0, xmax=len(tagLabels), xlabels=tagLabels)
688 monGroup.defineHistogram("ProbeCutCounter", type='TH1F', path='', title="Number of Probes; Cut ; Count",
689 xbins=len(probeLabels), xmin=0, xmax=len(probeLabels), xlabels=probeLabels)
690 monGroup.defineHistogram("Mee", type='TH1F', path='', title="Offline M(ee); m_ee [GeV] ; Count",xbins=50,
691 xmin=monAlg.ZeeLowerMass, xmax=monAlg.ZeeUpperMass)
692
693
694 #
695 # Book L1Calo distributions
696 #
697 def bookL1CaloDistributions( self , monAlg, trigger ):
698
699 from TrigEgammaMonitoring.TrigEgammaMonitorHelper import TH1F
700 monGroup = self.addGroup( monAlg, trigger+'_Distributions_L1Calo', self.basePath+'/Shifter/'+trigger+'/Distributions/L1Calo' )
701
702 #if 'L1eEM' in trigger:
703
704 self.addHistogram(monGroup, TH1F("et" , "Et; Et [GeV] ; Count", 100, 0., 800.))
705 self.addHistogram(monGroup, TH1F("eta" , "eta; eta ; Count" , 50, -2.5, 2.5))
706 self.addHistogram(monGroup, TH1F("phi" , "phi; phi ; Count" , 20, -3.2, 3.2))
707 self.addHistogram(monGroup, TH1F("Rhad" , "Rhad; Rhad ; Count" , 40, 0, 1))
708 self.addHistogram(monGroup, TH1F("Reta" , "Reta; Reta ; Count" , 40, 0, 1 ))
709 self.addHistogram(monGroup, TH1F("Wstot" , "Wstot; Wstot ; Count", 40, 0, 4 ))
710
711 #
712 # Book L2Calo distributions
713 #
714 def bookL2CaloDistributions( self , monAlg, trigger ):
715
716 from TrigEgammaMonitoring.TrigEgammaMonitorHelper import TH1F
717 monGroup = self.addGroup( monAlg, trigger+'_Distributions_L2Calo', self.basePath+'/Shifter/'+trigger+'/Distributions/FastCalo' )
718
719 self.addHistogram(monGroup, TH1F("et", "ET; ET [GeV] ; Count", 100, 0., 100.))
720 self.addHistogram(monGroup, TH1F("highet", "ET; ET [GeV] ; Count", 100, 0., 800.))
721 self.addHistogram(monGroup, TH1F("eta", "eta; eta ; Count", self._nEtabins, self._etabins))
722 self.addHistogram(monGroup, TH1F("phi", "phi; phi ; Count", 20, -3.2, 3.2))
723
724
725 #
726 # book Fast Electron distributions
727 #
728 def bookL2ElectronDistributions( self, monAlg, trigger ):
729
730 from TrigEgammaMonitoring.TrigEgammaMonitorHelper import TH1F
731 monGroup = self.addGroup( monAlg, trigger+'_Distributions_L2Electron', self.basePath+'/Shifter/'+trigger+'/Distributions/FastElectron' )
732
733 self.addHistogram(monGroup, TH1F("et", "ET; ET [GeV] ; Count", 100, 0., 100.))
734 self.addHistogram(monGroup, TH1F("highet", "ET; ET [GeV] ; Count", 100, 0., 800.))
735 self.addHistogram(monGroup, TH1F("eta", "eta; eta ; Count", self._nEtabins, self._etabins))
736 self.addHistogram(monGroup, TH1F("phi", "phi; phi ; Count", 20, -3.2, 3.2))
737
738 #
739 # book Fast Photon distributions
740 #
741
742 def bookL2PhotonDistributions( self, monAlg, trigger ):
743
744 from TrigEgammaMonitoring.TrigEgammaMonitorHelper import TH1F
745 monGroup = self.addGroup( monAlg, trigger+'_Distributions_L2Photon', self.basePath+'/Shifter/'+trigger+'/Distributions/FastPhoton' )
746
747 self.addHistogram(monGroup, TH1F("et", "ET; ET [GeV] ; Count", 100, 0., 100.))
748 self.addHistogram(monGroup, TH1F("highet", "ET; ET [GeV] ; Count", 100, 0., 800.))
749 self.addHistogram(monGroup, TH1F("eta", "eta; eta ; Count", self._nEtabins, self._etabins))
750 self.addHistogram(monGroup, TH1F("phi", "phi; phi ; Count", 20, -3.2, 3.2))
751 #
752 # Book EFCalo distributions
753 #
754 def bookEFCaloDistributions( self, monAlg, trigger ):
755
756 from TrigEgammaMonitoring.TrigEgammaMonitorHelper import TH1F
757 monGroup = self.addGroup( monAlg, trigger+'_Distributions_EFCalo', self.basePath+'/Shifter/'+trigger+'/Distributions/PrecisionCalo' )
758
759 self.addHistogram(monGroup, TH1F("et", "ET; ET [GeV] ; Count", 100, 0., 100.))
760 self.addHistogram(monGroup, TH1F("eta", "eta; eta ; Count", self._nEtabins, self._etabins))
761 self.addHistogram(monGroup, TH1F("phi", "phi; phi ; Count", 20, -3.2, 3.2))
762 self.addHistogram(monGroup, TH1F("energy", "Cluster Energy; E [GeV] ; Count", 50, 0., 100.))
763 self.addHistogram(monGroup, TH1F("highet", "Cluster Energy; E [GeV] ; Count", 100, 0., 800.))
764 self.addHistogram(monGroup, TH1F("eta_calo", "eta_calo; eta_calo ; Count", 50, -2.47, 2.47))
765 self.addHistogram(monGroup, TH1F("phi_calo", "phi_calo; phi_calo ; Count", 50, -3.14, 3.14))
766
767 if self.mc_mode:
768 self.addHistogram(monGroup, TH1F("energyBE0", "Cluster Energy BE0; E [GeV] ; Count", 50, 0., 100.))
769 self.addHistogram(monGroup, TH1F("energyBE1", "Cluster Energy BE1; E [GeV] ; Count", 50, 0., 100.))
770 self.addHistogram(monGroup, TH1F("energyBE2", "Cluster Energy BE2; E [GeV] ; Count", 50, 0., 100.))
771 self.addHistogram(monGroup, TH1F("energyBE3", "Cluster Energy BE3; E [GeV] ; Count", 50, 0., 100.))
772
773
774 #
775 # Book Shower shapes
776 #
777 def bookShowerShapesDistributions( self, monAlg, trigger, level, online=True):
778
779 from TrigEgammaMonitoring.TrigEgammaMonitorHelper import TH1F
780
781 monGroup = self.addGroup( monAlg, trigger+'_Distributions_' + ("HLT" if online else "Offline"),
782 self.basePath+'/Shifter/'+trigger+'/Distributions/' + (level if online else "Offline") )
783
784 info = self.getTrigInfo(trigger)
785
786 self.addHistogram(monGroup, TH1F("Rhad", "Rhad; Rhad ; Count", 35, -0.3, 0.3))
787 self.addHistogram(monGroup, TH1F("Reta", "Reta; Reta ; Count", 15, 0.4, 1.2))
788 self.addHistogram(monGroup, TH1F("Rphi", "Rphi; Rphi ; Count", 15, 0.4, 1.2))
789 self.addHistogram(monGroup, TH1F("weta2", "weta2; weta2 ; Count", 20, 0., 0.02))
790 self.addHistogram(monGroup, TH1F("f1", "f1; f1 ; Count", 11, 0, 1.))
791 self.addHistogram(monGroup, TH1F("f3", "f3; f3 ; Count", 21, -0.05, 0.1))
792 self.addHistogram(monGroup, TH1F("eratio","eratio; eratio; Count",20, 0, 2))
793 self.addHistogram(monGroup, TH1F("et", "ET; ET [GeV] ; Count", 100, 0., 100.))
794 self.addHistogram(monGroup, TH1F("highet", "Offline E_{T}; E_{T} [GeV] ; Count", 100, 0., 800.))
795 self.addHistogram(monGroup, TH1F("eta", "eta; eta ; Count", self._nEtabins, self._etabins))
796 self.addHistogram(monGroup, TH1F("phi", "phi; phi ; Count", 20, -3.2, 3.2))
797
798 if not info.isElectron():
799 self.addHistogram(monGroup, TH1F("topoetcone20", "topoetcone20; topoetcone20 [GeV] ; Count", 100, -10.0, 10.0))
800 self.addHistogram(monGroup, TH1F("topoetcone20_rel", "topoetcone20/pt; topoetcone20/pt ; Count", 100, -0.5, 0.5))
801 self.addHistogram(monGroup, TH1F("topoetcone40_shift", "topoetcone40-2.45 GeV; topoetcone40-2.45 GeV [GeV] ; Count", 100, -10.0, 10.0))
802 self.addHistogram(monGroup, TH1F("topoetcone40_shift_rel", "(topoetcone40-2.45 GeV)/pt; (topoetcone40-2.45 GeV)/pt ; Count", 100, -0.5, 0.5))
803
804 if self.mc_mode:
805 self.addHistogram(monGroup, TH1F("Rhad1", "Rhad1; Rhad1 ; Count", 30, -0.3, 0.3))
806 self.addHistogram(monGroup, TH1F("weta1", "weta1; weta1 ; Count", 12, 0.4, 1.))
807 #
808 # Book Tracking
809 #
810 def bookTrackingDistributions( self, monAlg, trigger,online=True ):
811
812
813 from TrigEgammaMonitoring.TrigEgammaMonitorHelper import TH1F, TH2F
814
815 monGroup = self.addGroup( monAlg, trigger+'_Distributions_' + ("HLT" if online else "Offline"),
816 self.basePath+'/Shifter/'+trigger+'/Distributions/' + ("HLT" if online else "Offline") )
817
818 # Tracking quantities
819 self.addHistogram(monGroup, TH1F("deta2", "deta2; deta2 ; Count", 40, -0.01, 0.01))
820 self.addHistogram(monGroup, TH1F("dphi2", "dphi2; dphi2 ; Count", 40, -0.1, 0.1))
821 self.addHistogram(monGroup, TH1F("eprobht","eProbHT; eProbHT; Count",20, 0, 1.))
822 self.addHistogram(monGroup, TH1F("npixhits","nPixHit; nPixHits; Count",10, 0, 10))
823 self.addHistogram(monGroup, TH1F("nscthits","nSCTHit; nSCTHits; Count",20, 0, 20))
824 self.addHistogram(monGroup, TH1F("pt", "p_{T}; p_{T} [GeV] ; Count", 50,0.,200.))
825 self.addHistogram(monGroup, TH1F("pt_track", "p_{T} tracks; p_{T} [GeV] ; Count", 100,0.,200.))
826 self.addHistogram(monGroup, TH1F("ptcone20", "ptcone20; ptcone20; Count", 50, 0.0, 5.0))
827 self.addHistogram(monGroup, TH1F("ptvarcone20", "ptvarcone20; ptvarcone20; Count", 50, 0.0, 5.0))
828 self.addHistogram(monGroup, TH1F("ptcone20_rel", "ptcone20/pt; ptcone20/pt; Count", 50, 0.0, 1.0))
829 self.addHistogram(monGroup, TH1F("ptcone30_rel", "ptcone30/pt; ptcone30/pt; Count", 50, 0.0, 1.0))
830 self.addHistogram(monGroup, TH1F("ptvarcone20_rel", "ptvarcone20/pt; ptvarcone20/pt; Count", 50, 0.0, 0.2))
831 self.addHistogram(monGroup, TH1F("ptvarcone30_rel", "ptvarcone30/pt; ptvarcone30/pt; Count", 50, 0.0, 0.2))
832 self.addHistogram(monGroup, TH1F("z0", "z0; z0 ; Count", 50, -200, 200))
833 self.addHistogram(monGroup, TH1F("d0", "d0; d0 ; Count", 40, -1, 1))
834 self.addHistogram(monGroup, TH1F("d0sig", "d0sig; d0sig ; Count", 40, -10, 10))
835
836 self.addHistogram(monGroup, TH2F("mu,ptvarcone20_rel", "HLT ptvarcone20/pt as function of avg #mu; #mu; ptvarcone20/pt; Count",50, 0, 80,50, 0, 0.12))
837 self.addHistogram(monGroup, TH2F("eta,ptvarcone20_rel", "HLT ptvarcone20/pt as function of #eta; #eta; ptvarcone20/pt; Count",50, -3, 3,50, 0, 0.12))
838
839 self.addHistogram(monGroup, TH2F("pt,ptvarcone20_rel", "HLT ptvarcone20/pt as function of pt; pt [GeV]; ptvarcone20/pt; Count",50, 0, 200,50, 0, 0.12))
840 self.addHistogram(monGroup, TH2F("pt_track,ptvarcone20_rel", "HLT ptvarcone20/pt as function of pt_track; pt [GeV]; ptvarcone20/pt; Count",50, 0, 200,50, 0, 0.12))
841
842 if self.mc_mode:
843 self.addHistogram(monGroup, TH1F("deta1_EMECA", "deta1 EMEC-A; deta1 ; Count", 40, -0.01, 0.01))
844 self.addHistogram(monGroup, TH1F("deta1_EMECC", "deta1 EMEC-C; deta1 ; Count", 40, -0.01, 0.01))
845 self.addHistogram(monGroup, TH1F("deta1_EMEBA", "deta1 EMEB-A; deta1 ; Count", 40, -0.01, 0.01))
846 self.addHistogram(monGroup, TH1F("deta1_EMEBC", "deta1 EMEB-A; deta1 ; Count", 40, -0.01, 0.01))
847 self.addHistogram(monGroup, TH1F("deta1", "deta1; deta1 ; Count", 40, -0.01, 0.01))
848 self.addHistogram(monGroup, TH1F("charge","charge; charge; Count", 4,-2,2))
849 self.addHistogram(monGroup, TH1F("dphiresc", "dphiresc; dphiresc ; Count", 40, -0.1, 0.1))
850 self.addHistogram(monGroup, TH2F("z0,ptvarcone20_rel", "HLT ptvarcone20/pt as function of z0; z0; ptvarcone20/pt; Count",50, -200, 200,50, 0, 0.12))
851
852
853 #
854 # Book efficiencies
855 #
856 def bookEfficiencies(self, monAlg, trigger, level, subgroup=None, doEmulation=False ):
857 self.__logger.debug("booking trigger named = %s", trigger)
858 self.__logger.debug("booking in dir named = %s", self.basePath)
859 from TrigEgammaMonitoring.TrigEgammaMonitorHelper import TH1F, TH2F, TProfile
860
861 dirname = 'Emulation' if doEmulation else 'Efficiency'
862 self.__logger.debug("Histogram path = %s", self.basePath+'/Shifter/'+trigger+'/'+dirname+'/'+level)
863 if subgroup:
864 monGroup = self.addGroup( monAlg, trigger+'_'+dirname+'_'+level+'_'+subgroup, self.basePath+'/Shifter/'+trigger+'/'+dirname+'/'+level+'/'+subgroup )
865 else:
866 monGroup = self.addGroup( monAlg, trigger+'_'+dirname+'_'+level, self.basePath+'/Shifter/'+trigger+'/'+dirname+'/'+level )
867
868 self.__logger.debug("Created monGroup = %s", monGroup)
869 # Numerator
870 self.addHistogram(monGroup, TH1F("match_pt", "Trigger Matched Offline p_{T}; p_{T} [GeV] ; Count", self._nEtbins, self._etbins))
871 self.addHistogram(monGroup, TH1F("match_et", "Trigger Matched Offline E_{T}; E_{T} [GeV]; Count", self._nEtbins, self._etbins))
872 self.addHistogram(monGroup, TH1F("match_highet", "Trigger Matched Offline E_{T}; E_{T} [GeV]; Count", 40, 0., 500.))
873 self.addHistogram(monGroup, TH1F("match_eta", "Trigger Matched Offline #eta; #eta ; Count", self._nEtabins, self._etabins))
874 self.addHistogram(monGroup, TH1F("match_phi", "Trigger Matched #phi; #phi ; Count", 20, -3.2, 3.2))
875 self.addHistogram(monGroup, TH1F("match_avgmu", "Trigger Matched <#mu>; <#mu> ; Count", 16, 0, 80))
876 self.addHistogram(monGroup, TH1F("match_ptvarcone20rel", "Trigger Matched ptvarcone20rel; ptvarcone20rel ; Count", 50, 0, 0.2))
877 self.addHistogram(monGroup, TH1F("match_ptvarcone30rel", "Trigger Matched ptvarcone30rel; ptvarcone30rel ; Count", 50, 0, 0.2))
878 self.addHistogram(monGroup, TH1F("match_z0", "Trigger Matched z0; z0 ; Count", 50, -200,200))
879 self.addHistogram(monGroup, TH1F("match_d0", "Trigger Matched d0; d0 ; Count", 50, -0.8,0.8))
880
881 # Denominator
882 self.addHistogram(monGroup, TH1F("pt", "Offline p_{T}; p_{T} [GeV] ; Count", self._nEtbins, self._etbins))
883 self.addHistogram(monGroup, TH1F("et", "Offline E_{T}; E_{T} [GeV] ; Count", self._nEtbins, self._etbins))
884 self.addHistogram(monGroup, TH1F("highet", "Offline E_{T}; E_{T} [GeV] ; Count", 50, 0., 800.))
885 self.addHistogram(monGroup, TH1F("eta", "Offline #eta; #eta ; Count", self._nEtabins, self._etabins))
886 self.addHistogram(monGroup, TH1F("phi", "Offline #phi; #phi ; Count", 20, -3.2, 3.2))
887 self.addHistogram(monGroup, TH1F("avgmu", "<#mu>; <#mu> ; Count", 16, 0, 80))
888 self.addHistogram(monGroup, TH1F("ptvarcone20rel", "ptvarcone20rel; ptvarcone20rel ; Count", 50, 0, 0.2))
889 self.addHistogram(monGroup, TH1F("ptvarcone30rel", "ptvarcone30rel; ptvarcone30rel ; Count", 50, 0, 0.2))
890 self.addHistogram(monGroup, TH1F("z0", "z0; z0 ; Count", 50, -200, 200))
891 self.addHistogram(monGroup, TH1F("d0", "d0; d0 ; Count", 50, -0.8, 0.8))
892
893
894 # Efficiency
895 self.addHistogram(monGroup, TProfile("pt,pt_passed", "#epsilon(p_T); p_{T} ; Efficiency", self._nEtbins, self._etbins))
896 self.addHistogram(monGroup, TProfile("et,et_passed", "#epsilon(E_T); E_{T} [GeV] ; Efficiency", self._nEtbins, self._etbins))
897 self.addHistogram(monGroup, TProfile("highet,highet_passed", "#epsilon(E_T); E_{T} [GeV] ; Efficiency", 50, 0., 800.))
898 self.addHistogram(monGroup, TProfile("eta,eta_passed", "#epsilon(#eta); #eta ; Efficiency", self._nEtabins, self._etabins))
899 self.addHistogram(monGroup, TProfile("phi,phi_passed", "#epsilon(#phi); #phi ; Efficiency", 20, -3.2, 3.2))
900 self.addHistogram(monGroup, TProfile("avgmu,avgmu_passed", "#epsilon(<#mu>); <#mu> ; Efficiency", 16, 0, 80))
901 self.addHistogram(monGroup, TProfile("ptvarcone20rel,ptvarcone20rel_passed", "#epsilon(ptvarcone20rel); ptvarcone20rel ; Efficiency", 50, 0, 0.2))
902 self.addHistogram(monGroup, TProfile("ptvarcone30rel,ptvarcone30rel_passed", "#epsilon(ptvarcone30rel); ptvarcone30rel ; Efficiency", 50, 0, 0.2))
903 self.addHistogram(monGroup, TProfile("z0,z0_passed", "#epsilon(z0); z0 ; Efficiency", 50, -200, 200))
904 self.addHistogram(monGroup, TProfile("d0,d0_passed", "#epsilon(d0); d0 ; Efficiency", 50, -0.8, 0.8))
905
906 #2D plots
907 self.addHistogram(monGroup, TH2F("match_avgmu,match_ptvarcone20rel", "Matched ptvarcone20/pt as function of avg #mu; #mu; ptvarcone20/pt; Count",50, 0, 80,50, 0, 0.2))
908 self.addHistogram(monGroup, TH2F("match_avgmu,match_ptvarcone30rel", "Matched ptvarcone30/pt as function of avg #mu; #mu; ptvarcone30/pt; Count",50, 0, 80,50, 0, 0.2))
909
910
911
912 if self.mc_mode:
913 self.addHistogram(monGroup, TH1F("match_npvtx", "Trigger Matched npvtx; npvtx ; Count", 16, 0, 80))
914 self.addHistogram(monGroup, TH1F("npvtx", "npvtx; npvtx ; Count", 16, 0, 80))
915 self.addHistogram(monGroup, TProfile("npvtx,npvtx_passed", "#epsilon(npvtx); npvtx ; Efficiency", 16, 0, 80))
916 self.addHistogram(monGroup, TH2F("match_z0,match_ptvarcone20rel", "Matched ptvarcone20/pt as function of z0; z0; ptvarcone20/pt; Count",50, -200, 200,50, 0, 0.12))
917 self.addHistogram(monGroup, TH2F("match_d0,match_ptvarcone20rel", "Matched ptvarcone20/pt as function of d0; d0; ptvarcone20/pt; Count",50, -0.5, 0.5,50, 0, 0.12))
918
919 # Inefficiency
920 self.addHistogram(monGroup, TProfile("et,et_failed", "#epsilon(E_T); E_{T} [GeV] ; Inefficiency", self._nEtbins, self._etbins))
921 self.addHistogram(monGroup, TProfile("highet,highet_failed", "#epsilon(E_T); E_{T} [GeV] ; Inefficiency", 50, 0., 800.))
922 self.addHistogram(monGroup, TProfile("eta,eta_failed", "#epsilon(#eta); #eta ; Inefficiency", self._nEtabins, self._etabins))
923
924 # Efficiency ET in eta slices
925
926 self.addHistogram(monGroup, TProfile("et_slice0,et_slice0_passed", "#epsilon(E_T) in [|#eta| <= 0.8]; E_{T} [GeV] ; Efficiency", self._nEtbins, self._etbins))
927 self.addHistogram(monGroup, TProfile("et_slice1,et_slice1_passed", "#epsilon(E_T) in [0.8 < |#eta| <= 1.37]; E_{T} [GeV] ; Efficiency", self._nEtbins, self._etbins))
928 self.addHistogram(monGroup, TProfile("et_slice2,et_slice2_passed", "#epsilon(E_T) in [1.37 < |#eta| <= 1.54]; E_{T} [GeV] ; Efficiency", self._nEtbins, self._etbins))
929 self.addHistogram(monGroup, TProfile("et_slice3,et_slice3_passed", "#epsilon(E_T) in [1.54 < |#eta| <= 2.50]; E_{T} [GeV] ; Efficiency", self._nEtbins, self._etbins))
930
931
932 def bookInefficiencies(self, monAlg, trigger):
933
934 monGroup = self.addGroup( monAlg, trigger+'_Inefficiency', self.basePath+'/Expert/Inefficiency/'+trigger)
935 levelLabels = ["L1Calo","L2Calo","L2","EFCalo","HLT"]
936 monGroup.defineHistogram("InefficiencyCounts", type='TH1F', path='', title="Inefficiency; Steps ; Count",xbins=len(levelLabels), xmin=0, xmax=len(levelLabels), xlabels=levelLabels)
937
938
939 def bookL1CaloResolutions(self, monAlg, trigger):
940
941 from TrigEgammaMonitoring.TrigEgammaMonitorHelper import TH1F, TH2F
942 monGroup = self.addGroup( monAlg, trigger+'_Resolutions_L1Calo', self.basePath+'/Shifter/'+trigger+'/Resolutions/L1Calo' )
943 self.addHistogram(monGroup, TH1F("res_et", "E_{T} resolution; (E_{T}(on)-E_{T}(off))/E_{T}(off) ; Count", 100, -0.1, 0.1))
944
945 if self.mc_mode:
946 self.addHistogram(monGroup, TH2F("eta,res_et", "E_{T} resolution as function of #eta; #eta; (E_{T}(on)-E_{T}(off))/E_{T}(off); Count",50, -2.47, 2.47,50, -0.1, 0.1))
947 self.addHistogram(monGroup, TH1F("eta", "eta; eta ; Count", 50, -2.47, 2.47))
948
949
950 def bookL1CaloAbsResolutions(self, monAlg, trigger):
951
952 from TrigEgammaMonitoring.TrigEgammaMonitorHelper import TH1F, TH2F
953 monGroup = self.addGroup( monAlg, trigger+'_AbsResolutions_L1Calo', self.basePath+'/Shifter/'+trigger+'/AbsResolutions/L1Calo' )
954 self.addHistogram(monGroup, TH1F("res_et", "E_{T} resolution; (E_{T}(on)-E_{T}(off))/E_{T}(off) ; Count", 100, -0.1, 0.1))
955 self.addHistogram(monGroup, TH1F("eta", "#eta; #eta ; Count", 50, -2.47, 2.47))
956
957 if self.mc_mode:
958 self.addHistogram(monGroup, TH2F("eta,res_et", "E_{T} resolution as function of #eta; #eta; (E_{T}(on)-E_{T}(off))/E_{T}(off); Count",50, -2.47, 2.47,50, -0.1, 0.1))
959
960
961 def bookL2CaloResolutions(self, monAlg, trigger):
962
963 from TrigEgammaMonitoring.TrigEgammaMonitorHelper import TH1F, TH2F
964 monGroup = self.addGroup( monAlg, trigger+'_Resolutions_L2Calo', self.basePath+'/Shifter/'+trigger+'/Resolutions/FastCalo' )
965
966 # online values used to fill all 2d histograms
967
968 self.addHistogram(monGroup, TH1F("res_Rhad", "Rhad resolution; (Rhad(on)-Rhad(off))/Rhad(off) ; Count", 20, -10., 10.))
969 self.addHistogram(monGroup, TH1F("res_et", "E_{T} resolution; (E_{T}(on)-E_{T}(off))/E_{T}(off) ; Count", 100, -0.1, 0.1))
970 self.addHistogram(monGroup, TH1F("res_eta", "#eta resolution; (#eta(on)-#eta(off))/#eta(off) ; Count", 40, -0.001, 0.001))
971 self.addHistogram(monGroup, TH1F("res_phi", "#phi resolution; (#phi(on)-#phi(off))/#phi(off) ; Count", 40, -0.001, 0.001))
972 self.addHistogram(monGroup, TH1F("res_ethad", "ethad resolution; (ethad(on)-ethad(off))/ethad(off) ; Count", 20, -5, 5))
973 self.addHistogram(monGroup, TH1F("res_weta2", "weta2 resolution; (weta2(on)-weta2(off))/weta2(off) ; Count", 20, -0.05, 0.05))
974 self.addHistogram(monGroup, TH1F("res_Reta", "Reta resolution; (Reta(on)-Reta(off))/Reta(off) ; Count", 20, -0.01, 0.01))
975 self.addHistogram(monGroup, TH1F("res_Rphi", "Rphi resolution; (Rphi(on)-Rphi(off))/Rphi(off) ; Count", 20, -0.01, 0.01))
976 self.addHistogram(monGroup, TH1F("res_eratio", "eratio resolution; (eratio(on)-eratio(off))/eratio(off) ; Count", 20, -0.001, 0.001))
977
978 if self.mc_mode:
979 self.addHistogram(monGroup, TH1F("res_ethad1", "ethad1 resolution; (ethad1(on)-ethad1(off))/ethad1(off) ; Count", 20, -5, 5))
980 self.addHistogram(monGroup, TH1F("res_Rhad1", "Rhad1; Rhad1 resolution; (Rhad1(on)-Rhad1(off))/Rhad1(off)", 20, -10., 10.))
981 self.addHistogram(monGroup, TH1F("res_f1", "f1 resolution; (f1(on)-f1(off))/f1(off) ; Count", 20, -0.05, 0.05))
982 self.addHistogram(monGroup, TH1F("res_f3", "f3 resolution; (f3(on)-f3(off))/f3(off) ; Count", 20, -0.05, 0.05))
983
984 # Book all 2D histograms
985 self.addHistogram(monGroup, TH2F("et,res_etVsEt", "E_{T} resolution as function of E_{T}; E_{T} [GeV]; (E_{T}(on)-E_{T}(off))/E_{T}(off); Count",
986 50, 0., 100.,
987 100, -0.1, 0.1))
988 self.addHistogram(monGroup, TH2F("eta,res_et", "E_{T} resolution as function of #eta; #eta; (E_{T}(on)-E_{T}(off))/E_{T}(off); Count",
989 50, -2.47, 2.47,
990 100, -0.1, 0.1))
991 self.addHistogram(monGroup, TH2F("eta,res_f3", "L2Calo f3 resolution as function of #eta; #eta; (f3(on)-f3(off))/f3(off); Count",
992 50, -2.47, 2.47,
993 20, -0.05, 0.05))
994 self.addHistogram(monGroup, TH2F("et,res_f3", "L2Calo f3 resolution as function of E_{T}; E_{T} [GeV]; (f3(on)-f3(off))/f3(off); Count",
995 50, 0., 100.,
996 20, -0.05, 0.05))
997 self.addHistogram(monGroup, TH2F("eta,res_f1", "L2Calo f1 resolution as function of #eta; #eta; (f1(on)-f1(off))/f1(off); Count",
998 50, -2.47, 2.47,
999 20, -0.05, 0.05))
1000 self.addHistogram(monGroup, TH2F("et,res_f1", "L2Calo f1 resolution as function of E_{T}; E_{T} [GeV]; (f1(on)-f1(off))/f1(off); Count",
1001 50, 0., 100.,
1002 20, -0.05, 0.05))
1003 self.addHistogram(monGroup, TH2F("eta,res_weta2", "L2Calo weta2 resolution as function of #eta; #eta; (weta2(on)-weta2(off))/weta2(off); Count",
1004 50, -2.47, 2.47,
1005 20, -0.05, 0.05))
1006 self.addHistogram(monGroup, TH2F("et,res_weta2", "L2Calo weta2 resolution as function of E_{T}; E_{T} [GeV]; (weta2(on)-weta2(off))/weta2(off); Count",
1007 50, 0., 100.,
1008 20, -0.05, 0.05))
1009 self.addHistogram(monGroup, TH2F("eta,res_Reta", "L2Calo Reta resolution as function of #eta; #eta; (Reta(on)-Reta(off))/Reta(off); Count",
1010 50, -2.47, 2.47,
1011 20, -0.05, 0.05))
1012 self.addHistogram(monGroup, TH2F("et,res_Reta", "L2Calo Reta resolution as function of E_{T}; E_{T} [GeV]; (Reta(on)-Reta(off))/Reta(off); Count",
1013 50, 0., 100.,
1014 20, -0.05, 0.05))
1015 self.addHistogram(monGroup, TH2F("eta,res_Rhad1", "L2Calo E_{T} Rhad1 resolution as function of #eta; #eta; (Rhad1(on)-Rhad1(off))/Rhad1(off); Count",
1016 50, -2.47, 2.47,
1017 20, -10, 10))
1018 self.addHistogram(monGroup, TH2F("et,res_Rhad1", "L2Calo E_{T} RHad1 resolution as function of E_{T}; E_{T} [GeV]; (Rhad1(on)-Rhad1(off))/Rhad1(off); Count",
1019 50, 0., 100.,
1020 20, -10, 10))
1021 self.addHistogram(monGroup, TH2F("eta,res_Rhad", "L2Calo E_{T} Rhad resolution as function of #eta; #eta; (Rhad(on)-Rhad(off))/Rhad(off); Count",
1022 50, -2.47, 2.47,
1023 20, -10, 10))
1024 self.addHistogram(monGroup, TH2F("et,res_Rhad", "L2Calo E_{T} RHad resolution as function of E_{T}; E_{T} [GeV]; (Rhad(on)-Rhad(off))/Rhad(off); Count",
1025 50, 0., 100.,
1026 20, -10, 10))
1027 self.addHistogram(monGroup, TH2F("eta,res_ethad1", "L2Calo E_{T} Had1 resolution as function of #eta; #eta; (ethad1(on)-ethad1(off))/ethad1(off); Count",
1028 50, -2.47, 2.47,
1029 20, -0.5, 0.5))
1030 self.addHistogram(monGroup, TH2F("et,res_ethad1", "L2Calo E_{T} Had1 resolution as function of E_{T}; E_{T} [GeV]; (ethad1(on)-ethad1(off))/ethad1(off); Count",
1031 50, 0., 100.,
1032 20, -0.5, 0.5))
1033 self.addHistogram(monGroup, TH2F("eta,res_ethad", "L2Calo E_{T} Had resolution as function of #eta; #eta; (ethad(on)-ethad(off))/ethad(off); Count",
1034 50, -2.47, 2.47,
1035 20, -0.5, 0.5))
1036 self.addHistogram(monGroup, TH2F("et,res_ethad", "L2Calo E_{T} Had resolution as function of E_{T}; E_{T} [GeV]; (ethad(on)-ethad(off))/ethad(off); Count",
1037 50, 0., 100.,
1038 20, -0.5, 0.5))
1039 self.addHistogram(monGroup, TH2F("eta,res_eratio", "L2Calo eratio resolution as function of #eta; #eta; (eratio(on)-eratio(off))/eratio(off); Count",
1040 50, -2.47, 2.47,
1041 20, -0.001, 0.001))
1042 self.addHistogram(monGroup, TH2F("et,res_eratio", "L2Calo eratio resolution as function of E_{T}; E_{T} [GeV]; (eratio(on)-eratio(off))/eratio(off); Count",
1043 50, 0., 100.,
1044 50, -0.001, 0.001))
1045
1046
1047 def bookHLTResolutions(self, monAlg, trigger,level):
1048
1049 from TrigEgammaMonitoring.TrigEgammaMonitorHelper import TH1F, TH2F
1050 monGroup = self.addGroup( monAlg, trigger+'_Resolutions_HLT', self.basePath+'/Shifter/'+trigger+'/Resolutions/'+level )
1051 self.__logger.debug("inside the bookHLTResolutions def = %s", monGroup)
1052
1053 # online values used to fill all 2d histograms
1054 self.addHistogram(monGroup, TH1F("et", "E_{T}; E_{T}[GeV] ; Count", 50, 0.0, 100.))
1055 self.addHistogram(monGroup, TH1F("eta", "#eta; #eta ; Count", 50, -2.47, 2.47))
1056 self.addHistogram(monGroup, TH1F("mu", "#mu; #mu ; Count", 50, 0, 100))
1057
1058 self.addHistogram(monGroup, TH1F("res_et", "E_{T} resolution; (E_{T}(on)-E_{T}(off))/E_{T}(off) ; Count", 100, -0.1, 0.1))
1059 self.addHistogram(monGroup, TH1F("res_eta", "#eta resolution; (#eta(on)-#eta(off))/#eta(off) ; Count", 40, -0.001, 0.001))
1060 self.addHistogram(monGroup, TH1F("res_phi", "#phi resolution; (#phi(on)-#phi(off))/#phi(off) ; Count", 40, -0.001, 0.001))
1061 self.addHistogram(monGroup, TH1F("res_ethad", "ethad resolution; (ethad(on)-ethad(off))/ethad(off) ; Count", 20, -5, 5))
1062 self.addHistogram(monGroup, TH1F("res_Rhad", "Rhad resolution; (Rhad(on)-Rhad(off))/Rhad(off) ; Count", 20, -10., 10.))
1063 self.addHistogram(monGroup, TH1F("res_Reta", "Reta resolution; (Reta(on)-Reta(off))/Reta(off) ; Count", 20, -0.01, 0.01))
1064 self.addHistogram(monGroup, TH1F("res_Rphi", "Rphi resolution; (Rphi(on)-Rphi(off))/Rphi(off) ; Count", 20, -0.01, 0.01))
1065 self.addHistogram(monGroup, TH1F("res_weta2", "weta2 resolution; (weta2(on)-weta2(off))/weta2(off) ; Count", 20, -0.05, 0.05))
1066 self.addHistogram(monGroup, TH1F("res_eratio", "eratio resolution; (eratio(on)-eratio(off))/eratio(off) ; Count", 20, -0.001, 0.001))
1067
1068
1069 if self.mc_mode:
1070 self.addHistogram(monGroup, TH1F("res_weta1", "weta1 resolution; (weta1(on)-weta1(off))/weta1(off) ; Count", 20, -0.05, 0.05))
1071 self.addHistogram(monGroup, TH1F("res_ethad1", "ethad1 resolution; (ethad1(on)-ethad1(off))/ethad1(off) ; Count", 20, -5, 5))
1072 self.addHistogram(monGroup, TH1F("res_Rhad1", "Rhad1; Rhad1 resolution; (Rhad1(on)-Rhad1(off))/Rhad1(off)", 20, -10., 10.))
1073 self.addHistogram(monGroup, TH2F("eta,res_et", "E_{T} resolution as function of #eta; #eta; (E_{T}(on)-E_{T}(off))/E_{T}(off); Count",50, -2.47, 2.47,100, -0.1, 0.1))
1074 self.addHistogram(monGroup, TH2F("et,res_et", "E_{T} resolution as function of E_{T}; E_{T} [GeV]; (E_{T}(on)-E_{T}(off))/E_{T}(off); Count",50, 0., 100.,100, -0.1, 0.1))
1075 self.addHistogram(monGroup, TH1F("res_etInEta0", "HLT E_{T} resolution in #eta = [0#div1.37]; (E_{T}(on)-E_{T}(off))/E_{T}(off) ; Count", 200, -0.1, 0.1))
1076 self.addHistogram(monGroup, TH1F("res_etInEta1", "HLT E_{T} resolution in #eta = [1.37#div1.52]; (E_{T}(on)-E_{T}(off))/E_{T}(off) ; Count", 200, -0.1, 0.1))
1077 self.addHistogram(monGroup, TH1F("res_etInEta2", "HLT E_{T} resolution in #eta = [1.55#div1.8]; (E_{T}(on)-E_{T}(off))/E_{T}(off) ; Count", 200, -0.1, 0.1))
1078 self.addHistogram(monGroup, TH1F("res_etInEta3", "HLT E_{T} resolution in #eta = [1.8#div2.45]; (E_{T}(on)-E_{T}(off))/E_{T}(off) ; Count", 200, -0.1, 0.1))
1079 self.addHistogram(monGroup, TH1F("res_f1", "f1 resolution; (f1(on)-f1(off))/f1(off) ; Count", 20, -0.05, 0.05))
1080 self.addHistogram(monGroup, TH1F("res_f3", "f3 resolution; (f3(on)-f3(off))/f3(off) ; Count", 20, -0.05, 0.05))
1081
1082
1083
1084 def bookHLTElectronResolutions(self, monAlg, trigger, isolated=False):
1085
1086 from TrigEgammaMonitoring.TrigEgammaMonitorHelper import TH1F, TH2F
1087 monGroup = self.addGroup( monAlg, trigger+'_Resolutions_HLT', self.basePath+'/Shifter/'+trigger+'/Resolutions/HLT')
1088
1089 self.addHistogram(monGroup, TH1F("res_pt", "p_{T} resolution; (p_{T}(on)-p_{T}(off))/p_{T}(off) ; Count", 120, -1.5, 1.5))
1090 self.addHistogram(monGroup, TH1F("res_deta1", "deta1; deta1 ; (deta1(on)-deta1(off))/deta1(off)", 100, -1., 1.))
1091 self.addHistogram(monGroup, TH1F("res_deta2", "deta2; deta2 ; (deta2(on)-deta2(off))/deta2(off)", 100, -1., 1.))
1092 self.addHistogram(monGroup, TH1F("res_dphi2", "dphi2; dphi2 ; (dphi2(on)-dphi2(off))/dphi2(off)", 100, -1., 1.))
1093 self.addHistogram(monGroup, TH1F("res_z0", "resolution z0; (z0(on)-z0(off)) ; Count", 100, -0.5, 0.5))
1094 self.addHistogram(monGroup, TH1F("res_d0", "resolution d0; (d0(on)-d0(off)) ; Count", 100, -0.5, 0.5))
1095 self.addHistogram(monGroup, TH1F("res_d0sig", "resolution d0sig; (d0sig(on)-d0sig(off)) ; Count", 50, -10, 10))
1096
1097 if self.mc_mode:
1098 self.addHistogram(monGroup, TH1F("pt", "online p_{T}; p_{T}; Count", 50, 0., 100.))
1099 self.addHistogram(monGroup, TH1F("res_nscthits","resolution nSCTHit; (nSCTHits(on)-nSCTHits(off); Count",20, -10, 10))
1100 self.addHistogram(monGroup, TH1F("res_npixhits","resolution nPixHit; (nPixHits(on)-nPixHits(off)); Count",10, -5, 5))
1101 self.addHistogram(monGroup, TH2F("pt,res_eprobht", "eProbHT resolution as function of p_{T}; p_{T} [GeV]; (eprobHT(on)-eprobHT(off)); Count",50, 0., 100.,50, -1., 1.))
1102 self.addHistogram(monGroup, TH1F("res_dphiresc", "dphiresc; (dphires(on)-dphires(off))/dphires(off) ; Count", 100, -1., 1.))
1103 self.addHistogram(monGroup, TH1F("res_eprobht","resolution eProbHT; (eProbHT(on)-eProbHT(off)); Count",50, -1, 1))
1104
1105 if isolated:
1106 self.addHistogram(monGroup, TH1F("res_ptcone20", "resolution ptcone20; ptcone20 (on-off)/off; Count", 200, -0.1, 0.1))
1107 self.addHistogram(monGroup, TH1F("res_ptcone20_rel", "resolution ptcone20/pt; ptcone20/pt (on-off)/off; Count", 100, -0.1, 0.1))
1108 self.addHistogram(monGroup, TH2F("eta,res_ptcone20_rel", "HLT ptcone20/pt resolution as function of #eta; #eta; (on-off)/off; Count",
1109 50, -2.47, 2.47,
1110 100, -0.1, 0.1))
1111 self.addHistogram(monGroup, TH2F("et,res_ptcone20_rel", "HLT ptcone20/pt resolution as function of E_{T}; E_{T} [GeV]; (on-off)/off; Count",
1112 50, 0., 100.,
1113 100, -0.1, 0.1))
1114 self.addHistogram(monGroup, TH2F("mu,res_ptcone20", "HLT ptcone20 resolution as function of avg #mu; #mu; (on-off)/off; Count",
1115 50, 0, 100,
1116 100, -0.1, 0.1))
1117 self.addHistogram(monGroup, TH2F("mu,res_ptcone20_rel", "HLT ptcone20/pt resolution as function of avg #mu; #mu; (on-off)/off; Count",
1118 50, 0, 100,
1119 100, -0.1, 0.1))
1120
1121 self.addHistogram(monGroup, TH1F("res_ptvarcone20", "resolution ptvarcone20; ptvarcone20 (on-off)/off; Count", 200, -0.1, 0.1))
1122 self.addHistogram(monGroup, TH1F("res_ptvarcone20_rel", "resolution ptvarcone20/pt; ptvarcone20/pt (on-off)/off; Count", 100, -0.1, 0.1))
1123 self.addHistogram(monGroup, TH2F("eta,res_ptvarcone20_rel", "HLT ptvarcone20/pt resolution as function of #eta; #eta; (on-off)/off; Count",
1124 50, -2.47, 2.47,
1125 100, -0.1, 0.1))
1126 self.addHistogram(monGroup, TH2F("et,res_ptvarcone20_rel", "HLT ptvarcone20/pt resolution as function of E_{T}; E_{T} [GeV]; (on-off)/off; Count",
1127 50, 0., 100.,
1128 100, -0.1, 0.1))
1129 self.addHistogram(monGroup, TH2F("mu,res_ptvarcone20", "HLT ptvarcone20 resolution as function of avg #mu; #mu; (on-off)/off; Count",
1130 50, 0, 100,
1131 100, -0.1, 0.1))
1132 self.addHistogram(monGroup, TH2F("mu,res_ptvarcone20_rel", "HLT ptvarcone20/pt resolution as function of avg #mu; #mu; (on-off)/off; Count",
1133 50, 0, 100,
1134 100, -0.1, 0.1))
1135
1136
1137 def bookHLTPhotonResolutions(self, monAlg, trigger, isolated=False):
1138
1139
1140 from TrigEgammaMonitoring.TrigEgammaMonitorHelper import TH1F, TH2F
1141 monGroup = self.addGroup( monAlg, trigger+'_Resolutions_HLT', self.basePath+'/Shifter/'+trigger+'/Resolutions/HLT' )
1142
1143 self.addHistogram(monGroup, TH1F("res_et_cnv", "HLT E_{T} resolution for converted Photons; (E_{T}(on)-E_{T}(off))/E_{T}(off) ; Count", 200, -0.1, 0.1))
1144 self.addHistogram(monGroup, TH1F("res_et_uncnv", "HLT E_{T} resolution for unconverted Photons; (E_{T}(on)-E_{T}(off))/E_{T}(off) ; Count", 200, -0.1, 0.1))
1145
1146 if self.data_type is DQDataType.MC:
1147 self.addHistogram(monGroup, TH2F("eta,res_cnv_et",
1148 "HLT E_{T} resolution as function of #eta for converted Photons; #eta; (E_{T}(on)-E_{T}(off))/E_{T}(off); Count",
1149 50, -2.47, 2.47,
1150 200, -0.1, 0.1))
1151 self.addHistogram(monGroup, TH2F("et,res_cnv_et",
1152 "HLT E_{T} resolution as function of E_{T} for converted Photons; E_{T} [GeV]; (E_{T}(on)-E_{T}(off))/E_{T}(off); Count",
1153 50, 0., 100.,
1154 200, -0.1, 0.1))
1155 self.addHistogram(monGroup, TH2F("eta,res_uncnv_et",
1156 "HLT E_{T} resolution as function of #eta for unconverted Photons; #eta; (E_{T}(on)-E_{T}(off))/E_{T}(off); Count",
1157 50, -2.47, 2.47,
1158 200, -0.1, 0.1))
1159 self.addHistogram(monGroup, TH2F("et,res_uncnv_et",
1160 "HLT E_{T} resolution as function of E_{T} for unconverted Photons; E_{T} [GeV]; (E_{T}(on)-E_{T}(off))/E_{T}(off); Count",
1161 50, 0., 100.,
1162 200, -0.1, 0.1))
1163 self.addHistogram(monGroup, TH1F("res_cnv_etInEta0", "HLT E_{T} resolution in #eta = [0#div1.37]; (E_{T}(on)-E_{T}(off))/E_{T}(off) ; Count", 200, -0.1, 0.1))
1164 self.addHistogram(monGroup, TH1F("res_cnv_etInEta1", "HLT E_{T} resolution in #eta = [1.37#div1.52]; (E_{T}(on)-E_{T}(off))/E_{T}(off) ; Count", 200, -0.1, 0.1))
1165 self.addHistogram(monGroup, TH1F("res_cnv_etInEta2", "HLT E_{T} resolution in #eta = [1.55#div1.8]; (E_{T}(on)-E_{T}(off))/E_{T}(off) ; Count", 200, -0.1, 0.1))
1166 self.addHistogram(monGroup, TH1F("res_cnv_etInEta3", "HLT E_{T} resolution in #eta = [1.8#div2.45]; (E_{T}(on)-E_{T}(off))/E_{T}(off) ; Count", 200, -0.1, 0.1))
1167 self.addHistogram(monGroup, TH1F("res_uncnv_etInEta0", "HLT E_{T} resolution in #eta = [0#div1.37]; (E_{T}(on)-E_{T}(off))/E_{T}(off) ; Count", 200, -0.1, 0.1))
1168 self.addHistogram(monGroup, TH1F("res_uncnv_etInEta1", "HLT E_{T} resolution in #eta = [1.37#div1.52]; (E_{T}(on)-E_{T}(off))/E_{T}(off) ; Count", 200, -0.1, 0.1))
1169 self.addHistogram(monGroup, TH1F("res_uncnv_etInEta2", "HLT E_{T} resolution in #eta = [1.55#div1.8]; (E_{T}(on)-E_{T}(off))/E_{T}(off) ; Count", 200, -0.1, 0.1))
1170 self.addHistogram(monGroup, TH1F("res_uncnv_etInEta3", "HLT E_{T} resolution in #eta = [1.8#div2.45]; (E_{T}(on)-E_{T}(off))/E_{T}(off) ; Count", 200, -0.1, 0.1))
1171
1172
1173 if isolated:
1174
1175 self.addHistogram(monGroup, TH1F("res_topoetcone20", "resolution topoetcone20; ptcone20 (on-off)/off; Count", 200, -0.1, 0.1))
1176 self.addHistogram(monGroup, TH1F("res_topoetcone20_rel", "resolution topoetcone20/pt; ptcone20/pt (on-off)/off; Count", 100, -0.1, 0.1))
1177
1178 if self.detailedHistograms:
1179 self.addHistogram(monGroup, TH2F("eta,res_topoetcone20_rel", "HLT topoetcone20/pt resolution as function of #eta; #eta; (on-off)/off; Count",
1180 50, -2.47, 2.47,
1181 100, -0.1, 0.1))
1182 self.addHistogram(monGroup, TH2F("et,res_topoetcone20_rel", "HLT topoetcone20/pt resolution as function of E_{T}; E_{T} [GeV]; (on-off)/off; Count",
1183 50, 0., 100.,
1184 100, -0.1, 0.1))
1185 self.addHistogram(monGroup, TH2F("mu,res_topoetcone20", "HLT topoetcone20 resolution as function of avg #mu; #mu; (on-off)/off; Count",
1186 50, 0, 100,
1187 100, -0.1, 0.1))
1188 self.addHistogram(monGroup, TH2F("mu,res_topoetcone20_rel", "HLT topoetcone20/pt resolution as function of avg #mu; #mu; (on-off)/off; Count",
1189 50, 0, 100,
1190 100, -0.1, 0.1))
1191
1192
1193
1194 def bookTopoHistograms(self, monAlg, trigger_configs ):
1195
1196 from TrigEgammaMonitoring.TrigEgammaMonitorHelper import TH1F, TProfile
1197 from TrigEgammaMonitoring.TrigEgammaMonitCategory import topo_config
1198
1199
1200 for d in trigger_configs:
1201
1202 trigger = d['trigger_num']
1203
1204 if not d['topo'] in topo_config.keys():
1205 self.__logger.fatal("Mon combo tool only support Zee, Jpsiee, Heg trigger. Current chain is %s", trigger)
1206
1207 monGroup_on = self.addGroup( monAlg, trigger+'_Efficiency_HLT', self.basePath+'/Expert/'+trigger+'/Efficiency/HLT' )
1208 monGroup_off = self.addGroup( monAlg, trigger+'_Efficiency_Offline', self.basePath+'/Expert/'+trigger+'/Efficiency/Offline' )
1209
1210 xmin = topo_config[d['topo']]['mass'][0]
1211 xmax = topo_config[d['topo']]['mass'][1]
1212 self.addHistogram(monGroup_on, TH1F("mass", "Online M(ee); m_ee [GeV] ; Count", 50, xmin, xmax))
1213 self.addHistogram(monGroup_on, TH1F("match_mass", "Online M(ee); m_ee [GeV] ; Count", 50, xmin, xmax))
1214 self.addHistogram(monGroup_on, TProfile("mass,match_mass", "Online #epsilon(M(ee)); m_ee; #epsilon(M(ee))", 50, xmin, xmax))
1215 self.addHistogram(monGroup_off, TH1F("mass", "Offline M(ee); m_ee [GeV] ; Count", 50, xmin, xmax))
1216 self.addHistogram(monGroup_off, TH1F("match_mass", "Offline M(ee); m_ee [GeV] ; Count", 50, xmin, xmax))
1217 self.addHistogram(monGroup_off, TProfile("mass,match_mass", "Offline #epsilon(M(ee)); p_{T} ; #epsilon(M(ee))", 50, xmin, xmax))
1218
1219 xmin = topo_config[d['topo']]['dphi'][0]
1220 xmax = topo_config[d['topo']]['dphi'][1]
1221 self.addHistogram(monGroup_on, TH1F("dphi", "Online #Delta#phi; #Delte#phi; Count", 50, xmin, xmax))
1222 self.addHistogram(monGroup_on, TH1F("match_dphi", "Online #Delta#phi; #Delte#phi; Count", 50, xmin, xmax))
1223 self.addHistogram(monGroup_on, TProfile("dphi,match_dphi", "Online #epsilon(#Delta#phi); #Delta#phi; #epsilon(#Delta#phi)", 50, xmin, xmax))
1224 self.addHistogram(monGroup_off, TH1F("dphi", "Offline #Delta#phi; #Delte#phi; Count", 50, xmin, xmax))
1225 self.addHistogram(monGroup_off, TH1F("match_dphi", "Offline #Delta#phi; #Delte#phi; Count", 50, xmin, xmax))
1226 self.addHistogram(monGroup_off, TProfile("dphi,match_dphi", "Offline #epsilon(#Delta#phi); #Delta#phi; #epsilon(#Delta#phi)", 50, xmin, xmax))
1227
1228
1229 #
1230 # Set binning
1231 #
1232 def setBinning(self, doJpsiee=False):
1233
1234 """ Method to define all binning required that is variable"""
1235
1236 # Binning as defined in TP framework
1237 coarse_eta_bins = [-2.47,-1.52,-1.37,-0.60,0.00,0.60,1.37,1.52,2.47] # 9 items
1238
1239 coarse_et_bins = [4.,20.,30.,40.,50.,60.,150.] # 7 items
1240
1241 default_eta_bins = [-2.47,-2.37,-2.01,-1.81,-1.52,-1.37,-1.15,-0.80,-0.60,-0.10,0.00,
1242 0.10, 0.60, 0.80, 1.15, 1.37, 1.52, 1.81, 2.01, 2.37, 2.47] # 21 items
1243
1244 default_et_bins = [4.,7.,10.,15.,20.,25.,30.,35.,40.,45.,50.,60.,80.,150.] # 14 items
1245
1246 etabins = [-2.47,-2.37,-2.01,-1.81,-1.52,-1.37,-1.15,-0.8,-0.6,-0.1,
1247 0.0,0.1,0.6,0.8,1.15,1.37,1.52,1.81,2.01,2.37,2.47] # 21 items
1248
1249 # TH2 with variable bin x-Axis, but constant bin y-Axis takes only Double_t arrays
1250 etbins_Zee = [0.,2.,4.,6.,8.,10.,
1251 12.,14.,16.,18.,20.,22.,24.,26.,28.,
1252 30.,32.,34.,36.,38.,40.,42.,44.,46.,48.,50.,55.,60.,65.,80.,100.,120.,140., 170., 200.,250.] # 36 items
1253
1254 etbins_Jpsiee = [ 0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5,
1255 5, 5.5, 6, 6.5, 7, 7.5, 8, 8.5, 9, 9.5,
1256 10,10.5,11,11.5,12,12.5,13,13.5,14,14.5,
1257 15,15.5,16,16.5,17,17.5,18,18.5,19,19.5,
1258 20,20.5,21,21.5,22,22.5,23,23.5,24,24.5,
1259 25,25.5] # 52 items
1260
1261
1262 if doJpsiee:
1263 self._nEtbins=51
1264 self._etbins = etbins_Jpsiee[0:self._nEtbins+1]
1265 else:
1266 self._nEtbins=35
1267 self._etbins = etbins_Zee[0:self._nEtbins+1]
1268
1269 # Define the binning
1270 self._nEtabins=20
1275
1276 #Fill the arrays
1277 self._etabins = etabins[0:self._nEtabins+1]
1278 self._defaultEtbins = default_et_bins[0:self._ndefaultEtbins+1]
1279 self._defaultEtabins = default_eta_bins[0:self._ndefaultEtabins+1]
1280 self._coarseEtbins = coarse_et_bins[0:self._ncoarseEtbins+1]
1281 self._coarseEtabins = coarse_eta_bins[0:self._ncoarseEtabins+1]
1282
1283 def getTrigInfo( self, trigger ):
1284 class TrigEgammaInfo(object):
1285
1286 EM = {"e", "electron"}
1287 GAMMA = {"g", "photon"}
1288
1289
1290 def __init__(self, trigger):
1291 self.__chain = trigger
1292 self.__legs = HLTChainInfo(trigger)
1293 self.__sigs = {leg.signature for leg in self.__legs}
1294
1295 for legInfo in HLTChainInfo(trigger):
1296 print(legInfo.multiplicity)
1297 print(legInfo.signature)
1298 print(legInfo.threshold)
1299 print(legInfo.legParts)
1300
1301 def chain(self):
1302 return self.__chain
1303
1304 def legs(self):
1305 return self.__legs
1306
1307 def signatures(self):
1308 return self.__sigs
1309
1310 def isElectron(self):
1311 for leg in HLTChainInfo(trigger):
1312 if leg.signature == "e" and "probe" not in self.__chain:
1313 return True
1314 return False
1315
1316 def isPhoton(self):
1317 for leg in HLTChainInfo(trigger):
1318 if leg.signature == "g" and "probe" not in self.__chain:
1319 return True
1320 return False
1321
1322 def isTagAndProbeZeeg(self):
1323 if "probe" in self.__chain:
1324 return True
1325 return False
1326
1327 def threshold(self):
1328 #if self.isElectron() or self.isPhoton():
1329 # for leg in HLTChainInfo(trigger):
1330 # thresholdValue = leg.threshold
1331 # thresholdString = str(thresholdValue)
1332 # return thresholdString
1333
1334 if self.isTagAndProbeZeeg():
1335 for leg in HLTChainInfo(trigger):
1336 if leg.signature != "g":
1337 continue
1338
1339 thresholdValue = leg.threshold
1340 thresholdString = str(thresholdValue)
1341 return thresholdString
1342 return "Invalid Threshold"
1343
1344 def pidname(self):
1345 #if self.isElectron() or self.isPhoton():
1346 # for leg in HLTChainInfo(trigger):
1347 # pidValue = leg.legParts[0]
1348 # return pidValue
1349
1350 if self.isTagAndProbeZeeg():
1351 for leg in HLTChainInfo(trigger):
1352 if leg.signature != "g":
1353 continue
1354
1355 pidValue = leg.legParts[0]
1356 return pidValue
1357 return "Invalid Threshold"
1358
1359 def isIsolated(self):
1360 for part_name in ['iloose', 'ivarloose', 'icaloloose', 'icalovloose', 'icalotight']:
1361 if part_name in self.chain():
1362 return True
1363 return False
1364
1365
1366 return TrigEgammaInfo(trigger)
1367
bool isElectron(const T &p)
Definition AtlasPID.h:202
bool isPhoton(const T &p)
Definition AtlasPID.h:376
const bool debug
if(pathvar)
void print(char *figname, TCanvas *c1)
bookEfficiencies(self, monAlg, trigger, level, subgroup=None, doEmulation=False)
__init__(self, helper, runflag, moniAccess, emulator=None, onlyHLT=False, derivation=False, detailedHistograms=False, basePath='HLT/EgammaMon', ComputeEffLH=False, ComputeEffDNN=False)
bookShowerShapesDistributions(self, monAlg, trigger, level, online=True)
treat_list_of_chains_by_name(list_of_chains, part_name=None)