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