ATLAS Offline Software
Loading...
Searching...
No Matches
TrigBphysMonitoringConfig.py
Go to the documentation of this file.
2# Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3#
4
5from AthenaConfiguration.ComponentFactory import CompFactory
6from AthenaMonitoring.DQConfigFlags import DQDataType
7
8
10
11 _configured = False
12 _get_monitoring_mode_success = False
13
14 data_type = ''
15 pp_mode = False
16 hi_mode = False
17 cosmic_mode = False
18 mc_mode = False
19 monitored_mumu_list = []
20 monitored_mumux_list = []
21 monitored_elel_list = []
22 monitored_bhh_list = []
23
24 __acceptable_keys_list=['useMonGroups']
25 useMonGroups = True
26
27 basePath = 'HLT/BphysMon'
28
29
30 def __init__(self, helper, **kwargs):
31
32 from AthenaCommon.Logging import logging
33 self.__logger = logging.getLogger( 'TrigBphysMonAlgBuilder' )
34 self.helper = helper
35 if not self._configured:
36 for key,value in kwargs.items():
37 if key in self.__acceptable_keys_list:
38 setattr(self,key,value)
39 self.configureMode()
40
41 def configureMode(self):
42
43 self.__logger.info("TrigBphysMonToolBuilder.configureMode()")
46 self.__logger.warning("Error getting monitoring mode, default monitoring lists will be used.")
47 else:
48 self.__logger.info(" Configuring for %s", self.data_type)
49
50
51 def configure(self):
52 self.setProperties()
53 self.configureMonitor()
55
56
57 def getTrigInfo( self, trigger ):
58
59 class TrigBphysInfo(object):
60 # TODO: rewrite using chainParts dictionaries
61
62 def __init__(self, trigger):
63 self.__chain = trigger
64
65 def chain(self):
66 return self.__chain
67
68 def isL1Item(self):
69 return True if self.chain().startswith('L1') else False
70
71 def getTopo(self):
72 if "_bBmumu_" in self.chain() or "_bDimu_" in self.chain() or "_bJpsimumu_" in self.chain() or "_bUpsimumu_" in self.chain() :
73 return "MuMu"
74 elif "_bBmumux_" in self.chain() :
75 return "MuMuX"
76 elif "_bBee" in self.chain() :
77 return "ElEl"
78 elif "_bBhh" in self.chain() :
79 return "Bhh"
80 else :
81 return "Unknown"
82
83 def getTopoVariant(self):
84 splits = self.chain().split("_")
85 for i in range(len(splits)) :
86 if splits[i] == "bBmumux" :
87 return splits[i+1]
88 return ""
89
90 return TrigBphysInfo(trigger)
91
92
94
95 self.__logger.info("TrigBphysMonToolBuilder.get_monitoring_mode()")
96 self.data_type = self.helper.flags.DQ.DataType
97
98 if self.data_type is DQDataType.MC:
99 self.mc_mode = True
100 return True
101 elif self.data_type is DQDataType.Collisions:
102 self.pp_mode = True
103 return True
104 elif self.data_type is DQDataType.HeavyIon:
105 self.hi_mode = True
106 return True
107 elif self.data_type is DQDataType.Cosmics:
108 self.cosmic_mode = True
109 return True
110 else:
111 return False
112
113
114 def setProperties(self):
115
116 self.__logger.info("TrigBphysMonToolBuilder.setProperties()")
117 self.basePath = 'HLT/BphysMon'
118
120
121 if not self.mc_mode :
122 self.setStreamChecks()
123 else :
124 self.__logger.info(" We run on MC, don't care about streams")
125
126
127
129
130
131 from TrigConfigSvc.TriggerConfigAccess import getHLTMonitoringAccess
132 moniAccess=getHLTMonitoringAccess(self.helper.flags)
133 monitoring_bphys=moniAccess.monitoredChains(signatures="bphysMon",monLevels=["shifter","t0","val"]) # other are ["shifter","t0","val"]
134
135 # if mon groups not found fall back to hard-coded trigger monitoring list
136 if self.useMonGroups and len(monitoring_bphys) == 0 :
137 self.__logger.warning(' No chains found in bphysMon groups')
138 if (not self.useMonGroups) or (len(monitoring_bphys) == 0) :
139 monitoring_bphys = [
140 # MuMu
141 'HLT_2mu4_bDimu_L12MU3V',
142 'HLT_2mu4_bJpsimumu_L12MU3V',
143 # MuMuX
144 'HLT_2mu4_bBmumux_BpmumuKp_L12MU3V',
145 'HLT_2mu4_bBmumux_BsmumuPhi_L12MU3V',
146 'HLT_2mu4_bBmumux_BdmumuKst_L12MU3V',
147 # ElEl
148 'HLT_2e5_lhvloose_bBeeM6000_L1BKeePrimary',
149 'HLT_e5_lhvloose_bBeeM6000_L1BKeePrimary',
150 # Bhh
151 'HLT_mu10_bBhh_L1MU8F',
152 ]
153
154 for chain in monitoring_bphys :
155 info = self.getTrigInfo(chain)
156 if info.getTopo() == "MuMu" :
157 self.monitored_mumu_list.append(chain)
158 elif info.getTopo() == "MuMuX" :
159 self.monitored_mumux_list.append(chain)
160 elif info.getTopo() == "ElEl" :
161 self.monitored_elel_list.append(chain)
162 elif info.getTopo() == "Bhh" :
163 self.monitored_bhh_list.append(chain)
164
165 self.__logger.info(' Configured bphys MuMu chains: %s',self.monitored_mumu_list)
166 self.__logger.info(' Configured bphys MuMuX chains: %s',self.monitored_mumux_list)
167 self.__logger.info(' Configured bphys ElEl chains: %s',self.monitored_elel_list)
168 self.__logger.info(' Configured bphys Bhh chains: %s',self.monitored_bhh_list)
169
170 self.monitored_containers = ['HLT_DimuEF',
171 'HLT_Bmumux',
172 'HLT_Bmutrk',
173 'HLT_DiElecPrecisionGSF',
174 'HLT_NoMuonDiElecPrecisionGSF',
175 'HLT_Bhh',
176 ]
177
179
180 self.__logger.info(' Configured bphys containers: %s',self.monitored_containers)
181
182
184 if self.helper.flags.Common.doExpressProcessing :
185 #enable checking that the event triggered by certain chain was explicitly sent to express stream
186 self.__logger.info(" Processing Express stream, will enable requireExplicitESDecision")
188 else :
189 self.__logger.info(" Processing a normal stream, won't check ES decision")
190
191
192 #
193 # Create all monitor algorithms
194 #
195 def configureMonitor( self ):
196 self.__logger.info("TrigBphysMonToolBuilder.configureMonitor()")
197 self.bphysMonAlg = self.helper.addAlgorithm( CompFactory.TrigBphysMonitorAlgorithm, "TrigBphysMonAlg" )
198
199 # Uncomment for debugging purposes
200 #from AthenaCommon.Constants import VERBOSE,DEBUG,INFO
201 #self.bphysMonAlg.OutputLevel = VERBOSE
202
203
204 acc = self.helper.resobj
205
206 from TrkConfig.AtlasExtrapolatorConfig import AtlasExtrapolatorCfg
207 AtlasExtrapolator = acc.popToolsAndMerge( AtlasExtrapolatorCfg(self.helper.flags) )
208 acc.addPublicTool(AtlasExtrapolator)
209
210 from InDetConfig.InDetConversionFinderToolsConfig import BPHY_VertexPointEstimatorCfg
211 self.bphysMonAlg.VertexPointEstimator = acc.popToolsAndMerge(
212 BPHY_VertexPointEstimatorCfg(self.helper.flags, 'BphysMonVertexPointEstimator'))
213
214 from TrkConfig.TrkVKalVrtFitterConfig import BPHY_TrkVKalVrtFitterCfg
215 self.bphysMonAlg.VertexFitter = acc.popToolsAndMerge(
216 BPHY_TrkVKalVrtFitterCfg(self.helper.flags, 'BphysMonTrkVKalVrtFitter'))
217
218 from TrkConfig.TrkVertexAnalysisUtilsConfig import V0ToolsCfg
219 self.bphysMonAlg.V0Tools = acc.popToolsAndMerge(
220 V0ToolsCfg(self.helper.flags, 'BphysMonV0Tools'))
221
222 self.bphysMonAlg.ContainerNames = self.monitored_containers
223 self.bphysMonAlg.ChainNames_MuMu = self.monitored_mumu_list
224 self.bphysMonAlg.ChainNames_MuMuX = self.monitored_mumux_list
225 self.bphysMonAlg.ChainNames_ElEl = self.monitored_elel_list
226 self.bphysMonAlg.ChainNames_Bhh = self.monitored_bhh_list
227
228 self.bphysMonAlg.requireExplicitESDecision = self.require_explicit_ES_decision
229
230
232 self.__logger.info("TrigBphysMonToolBuilder.configureHistograms()")
233 self.__logger.info("Booking histograms for alg: %s", self.bphysMonAlg.name)
234 self.bookContainers()
235 self.bookChains()
236 self.bookOfflineDimuons()
237
238
239 def bookContainers(self):
240 for container in self.monitored_containers :
241 self.bookContainerHists(container)
242
243
244 def bookContainerHists(self, container):
245 monGroupName = 'Container_'+container
246 monGroupPath = 'Containers/'+container
247
248 monGroup = self.helper.addGroup( self.bphysMonAlg, monGroupName,
249 self.basePath+'/'+monGroupPath )
250
251 # number of events histograms will be shown in root Containers/ folder
252 monGroup.defineHistogram('ncandidates',title='Number of Bphys candidates;number of candidates;Entries',
253 xbins=10,xmin=-0.5,xmax=9.5)
254 # the others in per-container hists
255 monGroup.defineHistogram('bphys_mass',title='Bphys object mass;m [GeV];Events / (0.1 GeV)',
256 xbins=150,xmin=0.0,xmax=15.0)
257
258
259 def bookChains(self):
261 for chain in fullChainList :
262 monGroupName = 'Chain_'+chain
263 monGroupPath = 'Chains/'+chain
264
265 monGroup = self.helper.addGroup( self.bphysMonAlg, monGroupName,
266 self.basePath+'/'+monGroupPath )
267
268 self.bookChainGenericHists(chain, monGroup)
269 if chain in self.monitored_mumu_list :
270 self.bookBphysObjectHists(chain, monGroup, "dimu")
271 self.bookLeptonHists(chain, monGroup, "mu")
272 elif chain in self.monitored_mumux_list :
273 self.bookBphysObjectHists(chain, monGroup, "B")
274 self.bookBphysObjectHists(chain, monGroup, "dimu")
275 self.bookLeptonHists(chain, monGroup, "mu")
276 self.bookTrkHists(chain, monGroup)
277 elif chain in self.monitored_elel_list :
278 self.bookBphysObjectHists(chain, monGroup, "diel")
279 self.bookLeptonHists(chain, monGroup, "el")
280 elif chain in self.monitored_bhh_list :
281 self.bookBphysObjectHists(chain, monGroup, "B")
282 self.bookTrkHists(chain, monGroup)
283
285 fullOfflDimuList = self.monitored_mumu_list + self.monitored_mumux_list + ["Any"]
286 for chain in fullOfflDimuList :
287 monGroupName = 'OfflineDimu_'+chain
288 monGroupPath = 'OfflineDimu/'+chain
289
290 monGroup = self.helper.addGroup( self.bphysMonAlg, monGroupName,
291 self.basePath+'/'+monGroupPath )
292
293 self.bookChainGenericHists(chain, monGroup)
294 self.bookBphysObjectHists(chain, monGroup, "dimu", offline=True)
295 self.bookLeptonHists(chain, monGroup, "mu")
296
297
298 def bookChainGenericHists(self, chain, currentMonGroup) :
299 currentMonGroup.defineHistogram('ncandidates',title='Number of Bphys candidates;number of candidates;Entries',
300 xbins=10,xmin=-0.5,xmax=9.5)
301
302 def bookBphysObjectHists(self, chain, currentMonGroup, objStr, offline=False):
303 objTitle = ''
304 objSign = ''
305 if objStr == 'dimu' :
306 objTitle = 'Dimuon'
307 objSign = '#mu^{+}#mu^{-}'
308 elif objStr == 'B' :
309 objTitle = 'B'
310 objSign = 'B'
311 elif objStr == 'diel' :
312 objTitle = 'Dielectron'
313 objSign = 'e^{+}e^{-}'
314 currentMonGroup.defineHistogram(objStr+'_mass',title=f'{objTitle} mass;m({objSign}) [GeV];Events / (0.1 GeV)',
315 xbins=150,xmin=0.0,xmax=15.0)
316 currentMonGroup.defineHistogram(objStr+'_fitmass',title=f'{objTitle} fitted mass;m({objSign}) [GeV];Events / (0.1 GeV)',
317 xbins=150,xmin=0.0,xmax=15.0)
318 currentMonGroup.defineHistogram(objStr+'_pt',title=f'{objTitle} transverse momentum;p_{{T}}({objSign}) [GeV];Events / (1 GeV)',
319 xbins=80,xmin=0.0,xmax=80.0)
320 currentMonGroup.defineHistogram(objStr+'_y',title=f'{objTitle} rapidity;y({objSign}) [GeV];Events / (0.1)',
321 xbins=50,xmin=-2.5,xmax=2.5)
322 currentMonGroup.defineHistogram(objStr+'_chi2',title=f'{objTitle} #chi^{{2}};#chi^{{2}}({objSign});Events / (0.5)',
323 xbins=80,xmin=0.0,xmax=40.0)
324 if objStr == 'dimu' or objStr == 'diel' :
325 currentMonGroup.defineHistogram(objStr+'_dR',title=f'{objTitle} dR;dR({objSign});Events / (0.01)',
326 xbins=100,xmin=0.0,xmax=1.0)
327 currentMonGroup.defineHistogram(objStr+'_deta',title=f'{objTitle} d#eta;d#eta({objSign});Events / (0.01)',
328 xbins=100,xmin=0.0,xmax=1.0)
329 currentMonGroup.defineHistogram(objStr+'_dphi',title=f'{objTitle} dEphi;d#phi({objSign});Events / (0.04)',
330 xbins=80,xmin=0.0,xmax=3.2)
331 if offline :
332 currentMonGroup.defineHistogram(objStr+'_Lxy',title=f'{objTitle} Lxy;L_{{xy}}({objSign}) [mm];Events / (0.2 mm)',
333 xbins=125,xmin=-5.,xmax=20.0)
334 currentMonGroup.defineHistogram(objStr+'_LxySig',title=f'{objTitle} Lxy significance;L_{{xy}}/#sigma(L_{{xy}})({objSign});Events / (0.5)',
335 xbins=90,xmin=-5,xmax=40.)
336
337 def bookLeptonHists(self, chain, currentMonGroup, lepStr):
338 lepTitle = ''
339 lepSign = ''
340 if lepStr == 'mu' :
341 lepTitle = 'Mu'
342 lepSign = '#mu'
343 elif lepStr == 'el' :
344 lepTitle = 'El'
345 lepSign = 'e'
346 else :
347 self.__logger.warning("TrigBphysMonToolBuilder.bookLeptonHists(): wrong lepStr passed: %s, while el or mu expected; won't book anything", lepStr)
348 return
349 currentMonGroup.defineHistogram(lepStr+'1_pt',title=f'{lepTitle}1 transverse momentum;p_{{T}}({lepSign}) [GeV];Events / (1 GeV)',
350 xbins=40,xmin=0.0,xmax=40.0)
351 currentMonGroup.defineHistogram(lepStr+'1_eta',title=f'{lepTitle}1 pseudorapidity;#eta({lepSign});Events / (0.1)',
352 xbins=54,xmin=-2.7,xmax=2.7)
353 currentMonGroup.defineHistogram(lepStr+'1_d0',title=f'{lepTitle}1 d0;d_{{0}}({lepSign});Events / (0.2 mm)',
354 xbins=100,xmin=-10.,xmax=10.)
355 currentMonGroup.defineHistogram(lepStr+'2_pt',title=f'{lepTitle}2 transverse momentum;p_{{T}}({lepSign}) [GeV];Events / (1 GeV)',
356 xbins=40,xmin=0.0,xmax=40.0)
357 currentMonGroup.defineHistogram(lepStr+'2_eta',title=f'{lepTitle}2 pseudorapidity;#eta({lepSign});Events / (0.1)',
358 xbins=54,xmin=-2.7,xmax=2.7)
359 currentMonGroup.defineHistogram(lepStr+'2_d0',title=f'{lepTitle}2 d0;d_{{0}}({lepSign});Events / (0.2 mm)',
360 xbins=100,xmin=-10.,xmax=10.)
361
362 def bookTrkHists(self, chain, currentMonGroup):
363 currentMonGroup.defineHistogram('trk_pt',title='Track transverse momentum;p_{T}(trk) [GeV];Events / (0.5 GeV)',
364 xbins=40,xmin=0.0,xmax=20.0)
365 currentMonGroup.defineHistogram('trk_eta',title='Track pseudorapidity;#eta(trk);Events / (0.1)',
366 xbins=54,xmin=-2.7,xmax=2.7)
367 currentMonGroup.defineHistogram('trk_d0',title='Track d0;d_{0}(trk);Events / (0.2 mm)',
368 xbins=100,xmin=-10.,xmax=10.)
369
bookBphysObjectHists(self, chain, currentMonGroup, objStr, offline=False)
bookLeptonHists(self, chain, currentMonGroup, lepStr)
std::vector< std::string > split(const std::string &s, const std::string &t=":")
Definition hcg.cxx:177