Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
TrigBphysMonitorAlgorithm.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 
7 #include "GaudiKernel/SystemOfUnits.h"
8 
10 #include "xAODBPhys/BPhysHelper.h"
12 
13 using namespace Gaudi::Units;
14 
15 TrigBphysMonitorAlgorithm::TrigBphysMonitorAlgorithm( const std::string& name, ISvcLocator* pSvcLocator )
16  : AthMonitorAlgorithm(name,pSvcLocator)
17 {}
18 
19 
21 
22 
24 
25  ATH_CHECK( m_TrigBphysContainerKeys.initialize() );
28  ATH_CHECK( m_offlinePvCollectionKey.initialize() );
29 
31 
32  return StatusCode::SUCCESS;
33 
34 }
35 
36 
37 StatusCode TrigBphysMonitorAlgorithm::fillHistograms( const EventContext& ctx ) const {
38 
39  // fill the container hists
40  ATH_MSG_DEBUG ("fill... Containers");
41  if (fillContainers(ctx).isFailure()) {ATH_MSG_ERROR("Problems filling Container histograms");}
42 
43  // fill the chain hists
44  ATH_MSG_DEBUG ("fill... Chains");
45  if (fillChains(ctx).isFailure()) {ATH_MSG_ERROR("Problems filling Chain histograms");}
46 
47  // build offline dimuons and fill offline histograms
48  std::vector<std::unique_ptr<xAOD::Vertex>> offlineDimuons;
49  if (buildDimuons(ctx, offlineDimuons).isFailure()) {
50  ATH_MSG_ERROR("Problems building offline dimuons, won't fill corresponding histograms");
51  }
52  else {
53  if (fillOfflineDimuons(ctx, offlineDimuons).isFailure()) {ATH_MSG_ERROR("Problems filling Offline dimuon histograms");}
54  }
55 
56  return StatusCode::SUCCESS;
57 }
58 
59 StatusCode TrigBphysMonitorAlgorithm::fillContainers(const EventContext& ctx) const {
60 
61  for(const SG::ReadHandleKey<xAOD::TrigBphysContainer>& monitoredContainerKey : m_TrigBphysContainerKeys) {
62  ATH_MSG_DEBUG("Process container " << monitoredContainerKey.key().c_str());
63  if(fillContainerHists(ctx, monitoredContainerKey).isFailure()) {
64  ATH_MSG_ERROR(Form("Problems filling %s container histograms", monitoredContainerKey.key().c_str()));
65  }
66  }
67 
68  return StatusCode::SUCCESS;
69 }
70 
72  SG::ReadHandle<xAOD::TrigBphysContainer> trigBphysContainer(trigBphysContainerKey, ctx);
73  if( !trigBphysContainer.isValid() ) {
74  ATH_MSG_WARNING("No valid TrigBphysContainer with tag: " << trigBphysContainerKey);
75  }
76  else {
77  // Fill container-wise histograms
78  std::string monGroupName = std::string("Container_")+trigBphysContainerKey.key();
79  auto monGroup = getGroup(monGroupName);
80 
81  auto ncandidates = Monitored::Scalar<int>("ncandidates",-999);
82  ncandidates = trigBphysContainer->size();
83 
84  auto bphys_mass = Monitored::Collection("bphys_mass", (*trigBphysContainer), [](const xAOD::TrigBphys* bphys){ return bphys->fitmass() / GeV;});
85 
86  fill(monGroup, ncandidates, bphys_mass);
87 
88  }
89  return StatusCode::SUCCESS;
90 }
91 
92 
93 StatusCode TrigBphysMonitorAlgorithm::fillChains(const EventContext& ctx) const {
94 
95  for(const auto& monitoredChain : m_ChainNames_MuMu) {
96  ATH_MSG_DEBUG("Process chain " << monitoredChain);
97  if( !isChainPassed(monitoredChain) ) {
98  ATH_MSG_DEBUG("Chain " << monitoredChain << " is not passed");
99  continue;
100  }
101  if(fillDimuonChainHists(ctx, monitoredChain).isFailure()) {
102  ATH_MSG_ERROR(Form("Problems filling %s chain histograms", monitoredChain.c_str()));
103  }
104  }
105 
106  for(const auto& monitoredChain : m_ChainNames_MuMuX) {
107  ATH_MSG_DEBUG("Process chain " << monitoredChain);
108  if( !isChainPassed(monitoredChain) ) {
109  ATH_MSG_DEBUG("Chain " << monitoredChain << " is not passed");
110  continue;
111  }
112  if(fillBmumuxChainHists(ctx, monitoredChain).isFailure()) {
113  ATH_MSG_ERROR(Form("Problems filling %s chain histograms", monitoredChain.c_str()));
114  }
115  }
116 
117  for(const auto& monitoredChain : m_ChainNames_ElEl) {
118  ATH_MSG_DEBUG("Process chain " << monitoredChain);
119  if( !isChainPassed(monitoredChain) ) {
120  ATH_MSG_DEBUG("Chain " << monitoredChain << " is not passed");
121  continue;
122  }
123  if(fillDielectronChainHists(ctx, monitoredChain).isFailure()) {
124  ATH_MSG_ERROR(Form("Problems filling %s chain histograms", monitoredChain.c_str()));
125  }
126  }
127 
128  return StatusCode::SUCCESS;
129 }
130 
131 StatusCode TrigBphysMonitorAlgorithm::fillDimuonChainHists(const EventContext& ctx, const std::string& chainName) const {
132  ATH_MSG_DEBUG("Filling " << chainName << " chain histograms");
133 
134  std::string monGroupName = std::string("Chain_")+chainName;
135  auto monGroup = getGroup(monGroupName);
136 
137  if (fillChainGenericHists(ctx, monGroup, chainName).isFailure()) {
138  ATH_MSG_ERROR(Form("Problems filling generic histograms for %s chain",chainName.c_str()));
139  }
140 
141  std::vector< TrigCompositeUtils::LinkInfo<xAOD::TrigBphysContainer> > chainFeatureContainer = getTrigDecisionTool()->features<xAOD::TrigBphysContainer>(chainName, TrigDefs::Physics);
142  for (const auto& featLinkInfo: chainFeatureContainer){
143  ATH_CHECK(featLinkInfo.isValid());
144  const auto featLink = featLinkInfo.link;
145  if (fillBphysObjectHists(monGroup, featLink, "dimu").isFailure()) {
146  ATH_MSG_ERROR(Form("Problems filling bphys object histograms for %s chain",chainName.c_str()));
147  }
148  if (fillTrigLeptonHists(monGroup, featLink, "mu").isFailure()) {
149  ATH_MSG_ERROR(Form("Problems filling muon histograms for %s chain",chainName.c_str()));
150  }
151  }
152  return StatusCode::SUCCESS;
153 }
154 
155 
156 StatusCode TrigBphysMonitorAlgorithm::fillBmumuxChainHists(const EventContext& ctx, const std::string& chainName) const {
157  ATH_MSG_DEBUG("Filling " << chainName << " chain histograms");
158 
159  std::string monGroupName = std::string("Chain_")+chainName;
160  auto monGroup = getGroup(monGroupName);
161 
162  if (fillChainGenericHists(ctx, monGroup, chainName).isFailure()) {
163  ATH_MSG_ERROR(Form("Problems filling generic histograms for %s chain",chainName.c_str()));
164  }
165 
166  std::vector< TrigCompositeUtils::LinkInfo<xAOD::TrigBphysContainer> > chainFeatureContainer = getTrigDecisionTool()->features<xAOD::TrigBphysContainer>(chainName, TrigDefs::Physics);
167  for (const auto& featLinkInfo: chainFeatureContainer){
168  ATH_CHECK(featLinkInfo.isValid());
169  const auto featLink = featLinkInfo.link;
170  if (fillBphysObjectHists(monGroup, featLink, "B").isFailure()) {
171  ATH_MSG_ERROR(Form("Problems filling bphys object histograms for %s chain",chainName.c_str()));
172  }
173  if (fillTrigBmumuxTrkHists(monGroup, featLink).isFailure()) {
174  ATH_MSG_ERROR(Form("Problems filling muon histograms for %s chain",chainName.c_str()));
175  }
176 
177  auto dimuonLink = (*featLink)->lowerChainLink();
178  ATH_CHECK(dimuonLink.isValid());
179  if (fillBphysObjectHists(monGroup, dimuonLink, "dimu").isFailure()) {
180  ATH_MSG_ERROR(Form("Problems filling dimuon object histograms for %s chain",chainName.c_str()));
181  }
182  if (fillTrigLeptonHists(monGroup, dimuonLink, "mu").isFailure()) {
183  ATH_MSG_ERROR(Form("Problems filling muon histograms for %s chain",chainName.c_str()));
184  }
185  }
186 
187  return StatusCode::SUCCESS;
188 }
189 
190 StatusCode TrigBphysMonitorAlgorithm::fillDielectronChainHists(const EventContext& ctx, const std::string& chainName) const {
191  ATH_MSG_DEBUG("Filling " << chainName << " chain histograms");
192 
193  std::string monGroupName = std::string("Chain_")+chainName;
194  auto monGroup = getGroup(monGroupName);
195 
196  if (fillChainGenericHists(ctx, monGroup, chainName).isFailure()) {
197  ATH_MSG_ERROR(Form("Problems filling generic histograms for %s chain",chainName.c_str()));
198  }
199 
200  std::vector< TrigCompositeUtils::LinkInfo<xAOD::TrigBphysContainer> > chainFeatureContainer = getTrigDecisionTool()->features<xAOD::TrigBphysContainer>(chainName, TrigDefs::Physics);
201  for (const auto& featLinkInfo: chainFeatureContainer){
202  ATH_CHECK(featLinkInfo.isValid());
203  const auto featLink = featLinkInfo.link;
204  if (fillBphysObjectHists(monGroup, featLink, "diel").isFailure()) {
205  ATH_MSG_ERROR(Form("Problems filling bphys object histograms for %s chain",chainName.c_str()));
206  }
207  if (fillTrigLeptonHists(monGroup, featLink, "el").isFailure()) {
208  ATH_MSG_ERROR(Form("Problems filling muon histograms for %s chain",chainName.c_str()));
209  }
210  }
211  return StatusCode::SUCCESS;
212 }
213 
214 
215 // Function to fill general per-chain hists, independent on the type of chains
216 StatusCode TrigBphysMonitorAlgorithm::fillChainGenericHists(const EventContext& /*ctx*/, const ToolHandle<GenericMonitoringTool>& currentMonGroup, const std::string& chainName) const {
217 
218  std::vector< TrigCompositeUtils::LinkInfo<xAOD::TrigBphysContainer> > chainFeatureContainer = getTrigDecisionTool()->features<xAOD::TrigBphysContainer>(chainName, TrigDefs::Physics);
219  auto ncandidates = Monitored::Scalar<int>("ncandidates",-999);
220  ncandidates = chainFeatureContainer.size();
221 
222  fill(currentMonGroup, ncandidates);
223 
224  return StatusCode::SUCCESS;
225 }
226 
227 
228 // Function to fill per-object hists (e.g. for dimuon, B from Bmumux, or X from Bmumux)
229 StatusCode TrigBphysMonitorAlgorithm::fillBphysObjectHists(const ToolHandle<GenericMonitoringTool>& currentMonGroup, const ElementLink<xAOD::TrigBphysContainer>& bphysLink, const std::string& objStr) const {
230 
231  auto dimu_mass = Monitored::Scalar<float>(objStr+"_mass",-999.);
232  auto dimu_fitmass = Monitored::Scalar<float>(objStr+"_fitmass",-999.);
233  auto dimu_pt = Monitored::Scalar<float>(objStr+"_pt",-999.);
234  auto dimu_y = Monitored::Scalar<float>(objStr+"_y",-999.);
235  auto dimu_chi2 = Monitored::Scalar<float>(objStr+"_chi2",-999.);
236 
237  dimu_mass = (*bphysLink)->mass() / GeV;
238  dimu_fitmass = (*bphysLink)->fitmass() / GeV;
239  dimu_pt = (*bphysLink)->pt() / GeV;
240  dimu_chi2 = (*bphysLink)->fitchi2();
241  dimu_y = (*bphysLink)->eta();
242 
243  fill(currentMonGroup, dimu_mass, dimu_fitmass, dimu_pt, dimu_y, dimu_chi2);
244 
245  return StatusCode::SUCCESS;
246 }
247 
248 
249 // Function to fill per-muon hists, assuming that the passed object is a dimuon
250 StatusCode TrigBphysMonitorAlgorithm::fillTrigLeptonHists(const ToolHandle<GenericMonitoringTool>& currentMonGroup, const ElementLink<xAOD::TrigBphysContainer>& bphysLink, const std::string& name_prefix) const {
251 
252  const std::vector<ElementLink<xAOD::TrackParticleContainer> > trackVector = (*bphysLink)->trackParticleLinks();
253  ATH_MSG_DEBUG("fillTrigLeptonHists: number of lepton tracks: " << trackVector.size());
254  if( fillTracksHists(currentMonGroup, trackVector, name_prefix, true).isFailure() ) {
255  ATH_MSG_ERROR(Form("Problems filling muon histograms for a chain"));
256  return StatusCode::FAILURE;
257  }
258  if( fillDiTracksHists(currentMonGroup, trackVector, std::string("di")+name_prefix).isFailure() ) {
259  ATH_MSG_ERROR(Form("Problems filling two-muon histograms for a chain"));
260  return StatusCode::FAILURE;
261  }
262 
263  return StatusCode::SUCCESS;
264 }
265 
266 // Function to fill per-track hists for Bmumux candidates
267 StatusCode TrigBphysMonitorAlgorithm::fillTrigBmumuxTrkHists(const ToolHandle<GenericMonitoringTool>& currentMonGroup, const ElementLink<xAOD::TrigBphysContainer>& bphysLink, UInt_t tracksStartFrom) const {
268 
269  const std::vector<ElementLink<xAOD::TrackParticleContainer> > trackVector = (*bphysLink)->trackParticleLinks();
270  if (trackVector.size() < tracksStartFrom) {
271  ATH_MSG_WARNING("Unexpected number of tracks: "<< trackVector.size() << " found, while expected at least " << tracksStartFrom);
272  return StatusCode::SUCCESS;
273  }
274 
275  if (fillTracksHists(currentMonGroup, trackVector, "trk", false, tracksStartFrom).isFailure()) {
276  ATH_MSG_ERROR(Form("Problems filling track histograms for a BMuMuX chain"));
277  return StatusCode::FAILURE;
278  }
279 
280  return StatusCode::SUCCESS;
281 }
282 
283 StatusCode TrigBphysMonitorAlgorithm::fillTracksHists(const ToolHandle<GenericMonitoringTool>& currentMonGroup,
284  const std::vector<ElementLink<xAOD::TrackParticleContainer> >& tpLinkVector,
285  const std::string& prefix,
286  bool separateHists,
287  UInt_t offsetIndex) const {
288  for(UInt_t i = offsetIndex; i < tpLinkVector.size(); ++i) {
289  ATH_CHECK(tpLinkVector.at(i).isValid());
290  std::string curPrefix = prefix;
291  if(separateHists)
292  curPrefix += std::to_string(i+1);
293  if (fillTrkHists(currentMonGroup, *tpLinkVector.at(i), curPrefix).isFailure()) {
294  ATH_MSG_ERROR(Form("Problems filling track histograms"));
295  return StatusCode::FAILURE;
296  }
297  }
298  return StatusCode::SUCCESS;
299 }
300 
301 StatusCode TrigBphysMonitorAlgorithm::fillDiTracksHists(const ToolHandle<GenericMonitoringTool>& currentMonGroup,
302  const std::vector<ElementLink<xAOD::TrackParticleContainer> >& tpLinkVector,
303  const std::string& name_prefix) const {
304  // Use first two tracks
305  if (tpLinkVector.size() <2) {
306  ATH_MSG_ERROR("Unexpected number of tracks in a dimuon: " << tpLinkVector.size());
307  return StatusCode::FAILURE;
308  }
309  ATH_CHECK(tpLinkVector.at(0).isValid());
310  ATH_CHECK(tpLinkVector.at(1).isValid());
311  const xAOD::TrackParticle* trk1 = *tpLinkVector.at(0);
312  const xAOD::TrackParticle* trk2 = *tpLinkVector.at(1);
313 
314  auto ditrk_dR = Monitored::Scalar<float>(name_prefix+"_dR",-999.);
315  auto ditrk_deta = Monitored::Scalar<float>(name_prefix+"_deta",-999.);
316  auto ditrk_dphi = Monitored::Scalar<float>(name_prefix+"_dphi",-999.);
317 
318  ditrk_dR = xAOD::P4Helpers::deltaR(*trk1, *trk2, false); // false for pseudo, not true rapidity
319  ditrk_deta = std::abs(trk1->eta()-trk2->eta());
320  ditrk_dphi = std::abs(xAOD::P4Helpers::deltaPhi(*trk1, *trk2));
321 
322  fill(currentMonGroup, ditrk_dR, ditrk_deta, ditrk_dphi);
323 
324  return StatusCode::SUCCESS;
325 }
326 
327 // Generic function to fill track hists
328 StatusCode TrigBphysMonitorAlgorithm::fillTrkHists(const ToolHandle<GenericMonitoringTool>& currentMonGroup, const xAOD::TrackParticle* trk, const std::string& name_prefix) const {
329  if (!trk) {
330  ATH_MSG_ERROR("Null pointer for a track");
331  return StatusCode::FAILURE;
332  }
333  auto trk_pt = Monitored::Scalar<float>(name_prefix+"_pt",-999.);
334  auto trk_eta = Monitored::Scalar<float>(name_prefix+"_eta",-999.);
335  auto trk_d0 = Monitored::Scalar<float>(name_prefix+"_d0",-999.);
336 
337  trk_pt = trk->pt() / GeV;
338  trk_eta = trk->eta();
339  trk_d0 = trk->d0();
340 
341  fill(currentMonGroup, trk_pt, trk_eta, trk_d0);
342 
343  return StatusCode::SUCCESS;
344 }
345 
346 StatusCode TrigBphysMonitorAlgorithm::fillOfflineDimuons(const EventContext& ctx, const std::vector<std::unique_ptr<xAOD::Vertex>>& dimuonContainer) const {
347 
348  std::vector<std::string> dimuonMonGroupNames = {"Any"};
349  dimuonMonGroupNames.insert( dimuonMonGroupNames.end(), m_ChainNames_MuMu.begin(), m_ChainNames_MuMu.end() );
350  dimuonMonGroupNames.insert( dimuonMonGroupNames.end(), m_ChainNames_MuMuX.begin(), m_ChainNames_MuMuX.end() );
351 
352  for(const auto& dimuonMonGroupName : dimuonMonGroupNames) {
353  ATH_MSG_DEBUG("Process dimuons for " << dimuonMonGroupName);
354  if(dimuonMonGroupName != "Any") {
355  auto& monitoredChain = dimuonMonGroupName;
356  if( !(dimuonMonGroupName == "Any") && !isChainPassed(monitoredChain) ) {
357  ATH_MSG_DEBUG("Chain " << monitoredChain << " is not passed");
358  continue;
359  }
360  }
361  if(fillOfflineDimuonHists(ctx, dimuonMonGroupName, dimuonContainer).isFailure()) {
362  ATH_MSG_ERROR(Form("Problems filling offline dimuon histograms for %s", dimuonMonGroupName.c_str()));
363  }
364  }
365 
366  return StatusCode::SUCCESS;
367 }
368 
369 StatusCode TrigBphysMonitorAlgorithm::fillOfflineDimuonHists(const EventContext& /*ctx*/, const std::string& dimuonMonGroupName, const std::vector<std::unique_ptr<xAOD::Vertex>>& dimuonContainer) const {
370  ATH_MSG_DEBUG("Filling " << dimuonMonGroupName << " offline dimuons histograms");
371 
372  // Do matching
373  std::vector<const xAOD::Vertex*> matchedDimuons;
374  for(auto& offlineDimuon : dimuonContainer) {
375  if( dimuonMonGroupName == "Any" || matchDimuon(offlineDimuon.get(), dimuonMonGroupName) )
376  matchedDimuons.push_back(offlineDimuon.get());
377  }
378 
379  std::string monGroupName = std::string("OfflineDimu_")+dimuonMonGroupName;
380  auto monGroup = getGroup(monGroupName);
381 
382  auto ncandidates = Monitored::Scalar<int>("ncandidates",-999);
383  ncandidates = matchedDimuons.size();
384 
385  fill(monGroup, ncandidates);
386 
387  for(auto matchedDimuon : matchedDimuons) {
388  if (fillVertexHists(monGroup, matchedDimuon, "dimu").isFailure()) {
389  ATH_MSG_ERROR(Form("Problems filling histogram for an offline dimuon vertex in %s", dimuonMonGroupName.c_str()));
390  }
391  if (fillTracksHists(monGroup, matchedDimuon->trackParticleLinks(), "mu", true).isFailure()) {
392  ATH_MSG_ERROR(Form("Problems filling histogram for offline dimuon muons in %s", dimuonMonGroupName.c_str()));
393  }
394  if (fillDiTracksHists(monGroup, matchedDimuon->trackParticleLinks(), "dimu").isFailure()) {
395  ATH_MSG_ERROR(Form("Problems filling histogram for offline dimuon muon pairs in %s", dimuonMonGroupName.c_str()));
396  }
397  }
398 
399  return StatusCode::SUCCESS;
400 
401 }
402 
403 StatusCode TrigBphysMonitorAlgorithm::fillVertexHists(const ToolHandle<GenericMonitoringTool>& currentMonGroup, const xAOD::Vertex* vertex, const std::string& objStr) const {
404 
405  xAOD::BPhysHelper dimuonVertexHelper(vertex);
406  if(dimuonVertexHelper.nRefTrks() != 2) {
407  ATH_MSG_WARNING("Unexpected number of refitted tracks at vertex is " << dimuonVertexHelper.nRefTrks());
408  return StatusCode::SUCCESS;
409  }
410 
411  using namespace TrigVtx;
412  TLorentzVector dimuonMom = dimuonVertexHelper.totalP(std::array<double,2>{TrigParticleMasses().mass[TrigParticleName::muon], TrigParticleMasses().mass[TrigParticleName::muon]});
413 
414  auto dimu_mass = Monitored::Scalar<float>(objStr+"_mass",-999.);
415  auto dimu_pt = Monitored::Scalar<float>(objStr+"_pt",-999.);
416  auto dimu_y = Monitored::Scalar<float>(objStr+"_y",-999.);
417  auto dimu_chi2 = Monitored::Scalar<float>(objStr+"_chi2",-999.);
418  auto dimu_Lxy = Monitored::Scalar<float>(objStr+"_Lxy",-999.);
419  auto dimu_LxySig = Monitored::Scalar<float>(objStr+"_LxySig",-999.);
420 
421  dimu_mass = dimuonMom.M() / GeV;
422  dimu_pt = dimuonMom.Pt() / GeV;
423  dimu_chi2 = vertex->chiSquared();
424  dimu_y = dimuonMom.Rapidity();
425  dimu_Lxy = dimuonVertexHelper.lxy(xAOD::BPhysHelper::PV_MIN_A0);
426  dimu_LxySig = dimuonVertexHelper.lxy(xAOD::BPhysHelper::PV_MIN_A0)/dimuonVertexHelper.lxyErr(xAOD::BPhysHelper::PV_MIN_A0);
427 
428  fill(currentMonGroup, dimu_mass, dimu_pt, dimu_y, dimu_chi2, dimu_Lxy, dimu_LxySig);
429 
430  return StatusCode::SUCCESS;
431 }
432 
433 bool TrigBphysMonitorAlgorithm::isChainPassed(const std::string& chain) const {
434  // Check if a chain is passed after prescale, accounting for Express Stream prescales if necessary
436  return getTrigDecisionTool()->isPassed(chain);
437  }
438  else {
439  const unsigned int passBits = getTrigDecisionTool()->isPassedBits(chain);
440  return passBits & TrigDefs::Express_passed;
441  }
442 }
443 
444 StatusCode TrigBphysMonitorAlgorithm::buildDimuons(const EventContext& ctx, std::vector<std::unique_ptr<xAOD::Vertex>>& vxContainer) const {
445  ATH_MSG_DEBUG( "TrigBphysMonitorAlgorithm::buildDimuons" );
446 
447  // Get the muons
449  ATH_CHECK(muonHandle.isValid());
450  const xAOD::MuonContainer* muonContainer = muonHandle.cptr();
451  ATH_MSG_DEBUG("Muon container size " << muonContainer->size());
452 
453  // Muon preselection
454  std::vector<const xAOD::Muon*> selectedMuons;
455  for (const auto mu : *muonContainer) {
456  if ( mu == nullptr ) continue;
457  if ( mu->muonType() != xAOD::Muon::Combined ) continue; // require combined muons
458  if (!mu->inDetTrackParticleLink()) continue; // No muons without ID tracks
459  if (!mu->inDetTrackParticleLink().isValid()) continue; // No muons without ID tracks
460  selectedMuons.push_back(mu);
461  }
462  if(selectedMuons.size() < 2) {
463  ATH_MSG_DEBUG("Only " << selectedMuons.size() << "muons pass preselection");
464  return StatusCode::SUCCESS;
465  }
466  std::sort(selectedMuons.begin(), selectedMuons.end(), [](const auto mu1, const auto mu2){ return mu1->pt() > mu2->pt(); });
467 
468  // Build dimuons
469  for(auto outerItr=selectedMuons.begin(); outerItr<selectedMuons.end(); ++outerItr){
470  for(auto innerItr=(outerItr+1); innerItr!=selectedMuons.end(); ++innerItr){
471  const auto muon1 = *outerItr;
472  const auto muon2 = *innerItr;
473  const auto trackParticle1 = muon1->trackParticle( xAOD::Muon::InnerDetectorTrackParticle );
474  const auto trackParticle2 = muon2->trackParticle( xAOD::Muon::InnerDetectorTrackParticle );
475  // Charge selection
476  if(trackParticle1->qOverP() * trackParticle2->qOverP() > 0.)
477  continue;
478  // Mass selection
479  double dimu_momentum_prefit = dimuonMass(trackParticle1, trackParticle2);
480  if( !(dimu_momentum_prefit > m_dimuMassLower_prefit && dimu_momentum_prefit < m_dimuMassUpper_prefit) )
481  continue;
482  // Fit
483  std::unique_ptr<xAOD::Vertex> dimuon = dimuonFit(trackParticle1, trackParticle2);
484  if(!dimuon) continue;
485  if(dimuon->chiSquared() > m_dimuChi2Cut) continue;
486  vxContainer.push_back(std::move(dimuon));
487  }
488  }
489  ATH_MSG_DEBUG("Found " << vxContainer.size() << " good dimuons");
490 
491  // Augment the dimuon vertices
492  if( !vxContainer.empty() ) {
494  ATH_CHECK(pvHandle.isValid());
495  const xAOD::VertexContainer* pvContainer = pvHandle.cptr();
496  std::vector<const xAOD::Vertex*> goodPVs = GetGoodPVs(pvContainer);
497  ATH_MSG_DEBUG("Found " << goodPVs.size() << " good PVs");
498  for(auto& dimuon : vxContainer) {
499  xAOD::BPhysHelper jpsiHelper(dimuon.get());
500  jpsiHelper.setRefTrks();
501  const xAOD::Vertex* lowestA0Pv = getPvForDimuon_lowestA0(dimuon.get(), goodPVs);
502  if(lowestA0Pv) {
503  jpsiHelper.setLxy ( m_v0Tools->lxy ( dimuon.get(),lowestA0Pv ), xAOD::BPhysHelper::PV_MIN_A0 );
504  jpsiHelper.setLxyErr( m_v0Tools->lxyError( dimuon.get(),lowestA0Pv ), xAOD::BPhysHelper::PV_MIN_A0 );
505  ATH_MSG_VERBOSE("Lxy = " << m_v0Tools->lxy ( dimuon.get(),lowestA0Pv ));
506  ATH_MSG_VERBOSE("LxyErr = " << m_v0Tools->lxyError( dimuon.get(),lowestA0Pv ));
507  }
508  }
509  }
510 
511  return StatusCode::SUCCESS;
512 }
513 
514 std::unique_ptr<xAOD::Vertex> TrigBphysMonitorAlgorithm::dimuonFit(const xAOD::TrackParticle* mu1, const xAOD::TrackParticle* mu2) const {
515 
516  const Trk::Perigee& mu1Perigee = mu1->perigeeParameters();
517  const Trk::Perigee& mu2Perigee = mu2->perigeeParameters();
518  int sflag = 0; int errorcode = 0;
519  Amg::Vector3D startingPoint = m_vertexPointEstimator->getCirclesIntersectionPoint(&mu1Perigee,&mu2Perigee,sflag,errorcode);
520  if (errorcode != 0) {startingPoint(0) = 0.0; startingPoint(1) = 0.0; startingPoint(2) = 0.0;}
521  const std::vector<const xAOD::TrackParticle*> trackPair = {mu1, mu2};
522  std::unique_ptr<xAOD::Vertex> myVxCandidate(m_vertexFitter->fit(trackPair, startingPoint));
523 
524  return myVxCandidate;
525 }
526 
527 bool TrigBphysMonitorAlgorithm::matchDimuon(const xAOD::Vertex* dimuonVertex, const std::string& chainName) const {
528  std::vector< TrigCompositeUtils::LinkInfo<xAOD::TrigBphysContainer> > chainFeatureContainer = getTrigDecisionTool()->features<xAOD::TrigBphysContainer>(chainName, TrigDefs::Physics);
529  for (const auto& featLinkInfo: chainFeatureContainer){
530  if(!featLinkInfo.isValid())
531  return false;
532  const auto featLink = featLinkInfo.link;
533  if( matchDimuon(dimuonVertex, featLink) )
534  return true;
535  }
536  return false;
537 }
538 
540  auto offlineTrk1 = dimuonVertex->trackParticle(0);
541  auto offlineTrk2 = dimuonVertex->trackParticle(1);
542  if(!offlineTrk1 || !offlineTrk2) {
543  ATH_MSG_DEBUG("TrackParticle from dimuon is null, won't match");
544  return false;
545  }
546 
547  const std::vector<ElementLink<xAOD::TrackParticleContainer> > trackVector = (*bphysLink)->trackParticleLinks();
548  if (trackVector.size() < 2) {
549  ATH_MSG_ERROR("Unexpected number of tracks in a dimuon: " << trackVector.size() << ", won't match");
550  return false;
551  }
552 
553  const xAOD::TrackParticle *hltTrk1(nullptr),*hltTrk2(nullptr);
554  // Assume the first two tracks are always muons'
555  if( !trackVector.at(0).isValid() || !trackVector.at(1).isValid() )
556  return false;
557  hltTrk1 = *trackVector.at(0);
558  hltTrk2 = *trackVector.at(1);
559  if (!hltTrk1 || !hltTrk2) {
560  ATH_MSG_ERROR("Null pointer for track in a dimuon!");
561  return false;
562  }
563  if( ( matchTrackParticles(offlineTrk1, hltTrk1) && matchTrackParticles(offlineTrk2, hltTrk2) ) ||
564  ( matchTrackParticles(offlineTrk1, hltTrk2) && matchTrackParticles(offlineTrk2, hltTrk1) ) )
565  return true;
566  else
567  return false;
568 }
569 
571  double deltaR = xAOD::P4Helpers::deltaR(*trk1, *trk2);
573  return true;
574  else
575  return false;
576 }
577 
579  using namespace TrigVtx;
584  xAOD::TrackParticle::GenVecFourMom_t dimu_mom = mom1 + mom2;
585  return dimu_mom.M();
586 }
587 
588 std::vector<const xAOD::Vertex*> TrigBphysMonitorAlgorithm::GetGoodPVs(const xAOD::VertexContainer* pvContainer) const {
589  std::vector<const xAOD::Vertex*> goodPrimaryVertices;
590  goodPrimaryVertices.reserve(pvContainer->size());
591  for (auto pv : *pvContainer) {
592  xAOD::VxType::VertexType pvType = pv->vertexType();
593  if ( pvType == xAOD::VxType::PriVtx || pvType == xAOD::VxType::PileUp ) {
594  goodPrimaryVertices.push_back(pv);
595  }
596  }
597  return goodPrimaryVertices;
598 }
599 
600 const xAOD::Vertex* TrigBphysMonitorAlgorithm::getPvForDimuon_lowestA0(const xAOD::Vertex* vtx, const std::vector<const xAOD::Vertex*>& PVs) const {
601  std::vector<const xAOD::Vertex*>::const_iterator pv = std::min_element(PVs.begin(), PVs.end(),
602  [&, vtx](const xAOD::Vertex* pv1, const xAOD::Vertex* pv2)
603  { return (std::abs(m_v0Tools->a0(vtx, pv1)) < std::abs(m_v0Tools->a0(vtx, pv2)));}
604  );
605  if(pv == PVs.end()) {
606  return nullptr;
607  }
608  ATH_MSG_VERBOSE("Min-a0 PV has index " << std::distance(PVs.begin(), pv) << ", a0 = " << m_v0Tools->a0(vtx, *pv));
609  return *pv;
610 }
muonContainer
xAOD::MuonContainer * muonContainer
Definition: TrigGlobEffCorrValidation.cxx:188
xAOD::TrackParticle_v1::pt
virtual double pt() const override final
The transverse momentum ( ) of the particle.
Definition: TrackParticle_v1.cxx:73
xAOD::TrackParticle_v1::GenVecFourMom_t
ROOT::Math::LorentzVector< ROOT::Math::PxPyPzM4D< double > > GenVecFourMom_t
Base 4 Momentum type for TrackParticle.
Definition: TrackParticle_v1.h:78
python.TIDAMonTool.monGroup
def monGroup(analysis_chain)
Definition: TIDAMonTool.py:297
xAOD::muon
@ muon
Definition: TrackingPrimitives.h:196
xAOD::BPhysHelper::totalP
TVector3 totalP()
: Returns total 3-momentum calculated from the refitted tracks
Definition: BPhysHelper.cxx:374
GeV
#define GeV
Definition: PhysicsAnalysis/TauID/TauAnalysisTools/Root/HelperFunctions.cxx:17
TrigBphysMonitorAlgorithm::m_dimuChi2Cut
Gaudi::Property< double > m_dimuChi2Cut
Definition: TrigBphysMonitorAlgorithm.h:43
TrigBphysMonitorAlgorithm::dimuonMass
double dimuonMass(const xAOD::TrackParticle *mu1, const xAOD::TrackParticle *mu2) const
Definition: TrigBphysMonitorAlgorithm.cxx:578
xAOD::BPhysHelper
Definition: BPhysHelper.h:71
runLayerRecalibration.chain
chain
Definition: runLayerRecalibration.py:175
xAOD::BPhysHelper::nRefTrks
int nRefTrks()
Returns number of stored refitted track momenta.
Definition: BPhysHelper.cxx:115
SG::ReadHandle::cptr
const_pointer_type cptr()
Dereference the pointer.
Base_Fragment.mass
mass
Definition: Sherpa_i/share/common/Base_Fragment.py:59
TrigBphysMonitorAlgorithm::matchDimuon
bool matchDimuon(const xAOD::Vertex *dimuonVertex, const std::string &chainName) const
Definition: TrigBphysMonitorAlgorithm.cxx:527
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:67
xAODP4Helpers.h
Trk::ParametersT
Dummy class used to allow special convertors to be called for surfaces owned by a detector element.
Definition: EMErrorDetail.h:25
xAOD::TrackParticle_v1::eta
virtual double eta() const override final
The pseudorapidity ( ) of the particle.
Definition: TrackParticle_v1.cxx:77
TrigBphysMonitorAlgorithm::fillDiTracksHists
StatusCode fillDiTracksHists(const ToolHandle< GenericMonitoringTool > &currentMonGroup, const std::vector< ElementLink< xAOD::TrackParticleContainer > > &tpLinkVector, const std::string &name_prefix) const
Definition: TrigBphysMonitorAlgorithm.cxx:301
TrigVtx
Definition: TrigParticleTable.h:18
AthMonitorAlgorithm::getTrigDecisionTool
const ToolHandle< Trig::TrigDecisionTool > & getTrigDecisionTool() const
Get the trigger decision tool member.
Definition: AthMonitorAlgorithm.cxx:194
xAOD::passBits
passBits
Definition: TrigPassBits_v1.cxx:115
xAOD::P4Helpers::deltaPhi
double deltaPhi(double phiA, double phiB)
delta Phi in range [-pi,pi[
Definition: xAODP4Helpers.h:69
TrigBphysMonitorAlgorithm::fillTrkHists
StatusCode fillTrkHists(const ToolHandle< GenericMonitoringTool > &currentMonGroup, const xAOD::TrackParticle *trk, const std::string &name_prefix) const
Definition: TrigBphysMonitorAlgorithm.cxx:328
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
xAOD::BPhysHelper::lxyErr
float lxyErr(const pv_type vertexType=BPhysHelper::PV_MIN_A0)
its error
Definition: BPhysHelper.cxx:877
SG::ReadHandleKey
Property holding a SG store/key/clid from which a ReadHandle is made.
Definition: StoreGate/StoreGate/ReadHandleKey.h:39
TrigBphysMonitorAlgorithm::getPvForDimuon_lowestA0
const xAOD::Vertex * getPvForDimuon_lowestA0(const xAOD::Vertex *vtx, const std::vector< const xAOD::Vertex * > &PVs) const
Definition: TrigBphysMonitorAlgorithm.cxx:600
xAOD::TrackParticle_v1::d0
float d0() const
Returns the parameter.
Monitored::Collection
ValuesCollection< T > Collection(std::string name, const T &collection)
Declare a monitored (double-convertible) collection.
Definition: MonitoredCollection.h:38
TrigBphysMonitorAlgorithm::initialize
virtual StatusCode initialize() override
initialize
Definition: TrigBphysMonitorAlgorithm.cxx:23
AthMonitorAlgorithm
Base class for Athena Monitoring Algorithms.
Definition: AthMonitorAlgorithm.h:36
xAOD::VxType::VertexType
VertexType
Vertex types.
Definition: TrackingPrimitives.h:570
xAOD::TrackParticle_v1::perigeeParameters
const Trk::Perigee & perigeeParameters() const
Returns the Trk::MeasuredPerigee track parameters.
Definition: TrackParticle_v1.cxx:485
TrigBphysMonitorAlgorithm::m_dimuMassUpper_prefit
Gaudi::Property< double > m_dimuMassUpper_prefit
Definition: TrigBphysMonitorAlgorithm.h:40
TrigBphysMonitorAlgorithm::m_vertexPointEstimator
ToolHandle< InDet::VertexPointEstimator > m_vertexPointEstimator
Definition: TrigBphysMonitorAlgorithm.h:47
TrigBphysMonitorAlgorithm::fillChainGenericHists
StatusCode fillChainGenericHists(const EventContext &, const ToolHandle< GenericMonitoringTool > &currentMonGroup, const std::string &chainName) const
Definition: TrigBphysMonitorAlgorithm.cxx:216
TrigBphysMonitorAlgorithm::fillDielectronChainHists
StatusCode fillDielectronChainHists(const EventContext &ctx, const std::string &chainName) const
Definition: TrigBphysMonitorAlgorithm.cxx:190
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
TrigBphysMonitorAlgorithm::m_offlineMuonCollectionKey
SG::ReadHandleKey< xAOD::MuonContainer > m_offlineMuonCollectionKey
Definition: TrigBphysMonitorAlgorithm.h:29
TrigBphysMonitorAlgorithm::matchTrackParticles
bool matchTrackParticles(const xAOD::TrackParticle *trk1, const xAOD::TrackParticle *trk2) const
Definition: TrigBphysMonitorAlgorithm.cxx:570
TrigBphysMonitorAlgorithm::m_ChainNames_MuMu
Gaudi::Property< std::vector< std::string > > m_ChainNames_MuMu
Definition: TrigBphysMonitorAlgorithm.h:33
lumiFormat.i
int i
Definition: lumiFormat.py:85
xAOD::P4Helpers::deltaR
double deltaR(double rapidity1, double phi1, double rapidity2, double phi2)
from bare bare rapidity,phi
Definition: xAODP4Helpers.h:150
TrigBphysMonitorAlgorithm::fillBmumuxChainHists
StatusCode fillBmumuxChainHists(const EventContext &ctx, const std::string &chainName) const
Definition: TrigBphysMonitorAlgorithm.cxx:156
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
xAOD::VxType::PriVtx
@ PriVtx
Primary vertex.
Definition: TrackingPrimitives.h:572
TrigBphysMonitorAlgorithm::fillContainerHists
StatusCode fillContainerHists(const EventContext &ctx, const SG::ReadHandleKey< xAOD::TrigBphysContainer > &trigBphysContainerKey) const
Definition: TrigBphysMonitorAlgorithm.cxx:71
checkCorrelInHIST.prefix
dictionary prefix
Definition: checkCorrelInHIST.py:391
xAOD::BPhysHelper::PV_MIN_A0
@ PV_MIN_A0
Definition: BPhysHelper.h:475
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
TrigParticleTable.h
xAOD::Vertex_v1::trackParticle
const TrackParticle * trackParticle(size_t i) const
Get the pointer to a given track that was used in vertex reco.
Definition: Vertex_v1.cxx:249
xAOD::TrackParticle_v1::genvecP4
GenVecFourMom_t genvecP4() const
The full 4-momentum of the particle : GenVector form.
Definition: TrackParticle_v1.cxx:116
AthMonitorAlgorithm::fill
void fill(const ToolHandle< GenericMonitoringTool > &groupHandle, std::vector< std::reference_wrapper< Monitored::IMonitoredVariable >> &&variables) const
Fills a vector of variables to a group by reference.
TrigBphysMonitorAlgorithm::TrigBphysMonitorAlgorithm
TrigBphysMonitorAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Definition: TrigBphysMonitorAlgorithm.cxx:15
SG::VarHandleKey::initialize
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:103
TrigBphysMonitorAlgorithm::fillOfflineDimuonHists
StatusCode fillOfflineDimuonHists(const EventContext &, const std::string &dimuonMonGroupName, const std::vector< std::unique_ptr< xAOD::Vertex >> &dimuonContainer) const
Definition: TrigBphysMonitorAlgorithm.cxx:369
TrigBphysMonitorAlgorithm::fillChains
StatusCode fillChains(const EventContext &ctx) const
Definition: TrigBphysMonitorAlgorithm.cxx:93
xAOD::TrigBphys_v1::fitmass
float fitmass() const
accessor method: mass from vertex fit
DataVector
Derived DataVector<T>.
Definition: DataVector.h:794
TrigBphysMonitorAlgorithm::fillTrigBmumuxTrkHists
StatusCode fillTrigBmumuxTrkHists(const ToolHandle< GenericMonitoringTool > &currentMonGroup, const ElementLink< xAOD::TrigBphysContainer > &bphysLink, UInt_t tracksStartFrom=2) const
Definition: TrigBphysMonitorAlgorithm.cxx:267
xAOD::BPhysHelper::setLxy
bool setLxy(const float val, const pv_type vertexType=BPhysHelper::PV_MIN_A0)
Set the transverse decay distance and its error measured between the refitted primary vertex of type ...
Definition: BPhysHelper.cxx:888
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
Trk::Combined
@ Combined
Definition: TrackSummaryTool.h:32
TrigBphysMonitorAlgorithm::buildDimuons
StatusCode buildDimuons(const EventContext &ctx, std::vector< std::unique_ptr< xAOD::Vertex >> &vxContainer) const
Definition: TrigBphysMonitorAlgorithm.cxx:444
TrigBphysMonitorAlgorithm::m_offlineIDTrackCollectionKey
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_offlineIDTrackCollectionKey
Definition: TrigBphysMonitorAlgorithm.h:30
TrigBphysMonitorAlgorithm::fillVertexHists
StatusCode fillVertexHists(const ToolHandle< GenericMonitoringTool > &currentMonGroup, const xAOD::Vertex *vertex, const std::string &objStr) const
Definition: TrigBphysMonitorAlgorithm.cxx:403
xAOD::VxType::PileUp
@ PileUp
Pile-up vertex.
Definition: TrackingPrimitives.h:574
TrigBphysMonitorAlgorithm::m_ChainNames_ElEl
Gaudi::Property< std::vector< std::string > > m_ChainNames_ElEl
Definition: TrigBphysMonitorAlgorithm.h:35
TrigBphysMonitorAlgorithm::dimuonFit
std::unique_ptr< xAOD::Vertex > dimuonFit(const xAOD::TrackParticle *mu1, const xAOD::TrackParticle *mu2) const
Definition: TrigBphysMonitorAlgorithm.cxx:514
TrigBphysMonitorAlgorithm::m_dimuMassLower_prefit
Gaudi::Property< double > m_dimuMassLower_prefit
Definition: TrigBphysMonitorAlgorithm.h:39
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
ActsTrk::to_string
std::string to_string(const DetectorType &type)
Definition: GeometryDefs.h:34
TrigBphysMonitorAlgorithm::GetGoodPVs
std::vector< const xAOD::Vertex * > GetGoodPVs(const xAOD::VertexContainer *pvContainer) const
Definition: TrigBphysMonitorAlgorithm.cxx:588
TrigBphysMonitorAlgorithm::m_TrigBphysContainerKeys
SG::ReadHandleKeyArray< xAOD::TrigBphysContainer > m_TrigBphysContainerKeys
Definition: TrigBphysMonitorAlgorithm.h:27
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
TrigVtx::TrigParticleMasses
Definition: TrigParticleTable.h:30
TrigBphysMonitorAlgorithm::m_v0Tools
ToolHandle< Trk::V0Tools > m_v0Tools
Definition: TrigBphysMonitorAlgorithm.h:49
xAOD::BPhysHelper::setLxyErr
bool setLxyErr(const float val, const pv_type vertexType=BPhysHelper::PV_MIN_A0)
its error
Definition: BPhysHelper.cxx:899
AthMonitorAlgorithm::initialize
virtual StatusCode initialize() override
initialize
Definition: AthMonitorAlgorithm.cxx:18
BPhysHelper.h
: B-physics xAOD helpers.
xAOD::BPhysHelper::setRefTrks
bool setRefTrks(std::vector< float > px, std::vector< float > py, std::vector< float > pz)
Sets refitted track momenta.
Definition: BPhysHelper.cxx:286
Trk::vertex
@ vertex
Definition: MeasurementType.h:21
xAOD::BPhysHelper::lxy
float lxy(const pv_type vertexType=BPhysHelper::PV_MIN_A0)
Get the transverse decay distance and its error measured between the refitted primary vertex of type ...
Definition: BPhysHelper.cxx:866
xAOD::Vertex_v1::chiSquared
float chiSquared() const
Returns the of the vertex fit as float.
TrigBphysMonitorAlgorithm::fillTracksHists
StatusCode fillTracksHists(const ToolHandle< GenericMonitoringTool > &currentMonGroup, const std::vector< ElementLink< xAOD::TrackParticleContainer > > &tpLinkVector, const std::string &prefix, bool separateHists=false, UInt_t offsetIndex=0) const
Definition: TrigBphysMonitorAlgorithm.cxx:283
xAOD::Vertex_v1
Class describing a Vertex.
Definition: Vertex_v1.h:42
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
python.TriggerAPI.TriggerAPISession.chainName
chainName
Definition: TriggerAPISession.py:426
python.changerun.pv
pv
Definition: changerun.py:81
TrigBphysMonitorAlgorithm::fillDimuonChainHists
StatusCode fillDimuonChainHists(const EventContext &ctx, const std::string &chainName) const
Definition: TrigBphysMonitorAlgorithm.cxx:131
TrigBphysMonitorAlgorithm::m_deltaRMatchingThreshold
Gaudi::Property< double > m_deltaRMatchingThreshold
Definition: TrigBphysMonitorAlgorithm.h:45
TrigBphysMonitorAlgorithm::fillTrigLeptonHists
StatusCode fillTrigLeptonHists(const ToolHandle< GenericMonitoringTool > &currentMonGroup, const ElementLink< xAOD::TrigBphysContainer > &bphysLink, const std::string &name_prefix) const
Definition: TrigBphysMonitorAlgorithm.cxx:250
TrigBphysMonitorAlgorithm::fillContainers
StatusCode fillContainers(const EventContext &ctx) const
For lxy etc.
Definition: TrigBphysMonitorAlgorithm.cxx:59
TrigBphysMonitorAlgorithm::fillBphysObjectHists
StatusCode fillBphysObjectHists(const ToolHandle< GenericMonitoringTool > &currentMonGroup, const ElementLink< xAOD::TrigBphysContainer > &bphysLink, const std::string &objStr) const
Definition: TrigBphysMonitorAlgorithm.cxx:229
TrigBphysMonitorAlgorithm::~TrigBphysMonitorAlgorithm
virtual ~TrigBphysMonitorAlgorithm()
Definition: TrigBphysMonitorAlgorithm.cxx:20
xAOD::TrackParticle_v1
Class describing a TrackParticle.
Definition: TrackParticle_v1.h:43
Monitored::Scalar
Declare a monitored scalar variable.
Definition: MonitoredScalar.h:34
TrigBphysMonitorAlgorithm::m_offlinePvCollectionKey
SG::ReadHandleKey< xAOD::VertexContainer > m_offlinePvCollectionKey
Definition: TrigBphysMonitorAlgorithm.h:31
TrigVtx::TrigParticleMasses::mass
std::array< double, 6 > mass
Definition: TrigParticleTable.h:32
TrigBphysMonitorAlgorithm::m_ChainNames_MuMuX
Gaudi::Property< std::vector< std::string > > m_ChainNames_MuMuX
Definition: TrigBphysMonitorAlgorithm.h:34
CaloNoise_fillDB.mu
mu
Definition: CaloNoise_fillDB.py:53
Amg::distance
float distance(const Amg::Vector3D &p1, const Amg::Vector3D &p2)
calculates the distance between two point in 3D space
Definition: GeoPrimitivesHelpers.h:54
TrigBphysMonitorAlgorithm::m_vertexFitter
ToolHandle< Trk::TrkVKalVrtFitter > m_vertexFitter
Definition: TrigBphysMonitorAlgorithm.h:48
makeComparison.deltaR
float deltaR
Definition: makeComparison.py:36
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
TrigBphysMonitorAlgorithm::fillOfflineDimuons
StatusCode fillOfflineDimuons(const EventContext &ctx, const std::vector< std::unique_ptr< xAOD::Vertex >> &dimuonContainer) const
Definition: TrigBphysMonitorAlgorithm.cxx:346
TrigBphysMonitorAlgorithm::m_requireExplicitESDecision
Gaudi::Property< bool > m_requireExplicitESDecision
Definition: TrigBphysMonitorAlgorithm.h:37
xAOD::TrigBphys_v1
Class describing a Bphysics online composite object.
Definition: TrigBphys_v1.h:44
AthMonitorAlgorithm::getGroup
const ToolHandle< GenericMonitoringTool > & getGroup(const std::string &name) const
Get a specific monitoring tool from the tool handle array.
Definition: AthMonitorAlgorithm.cxx:164
TrigBphysMonitorAlgorithm.h
TrigBphysMonitorAlgorithm::isChainPassed
bool isChainPassed(const std::string &chain) const
Definition: TrigBphysMonitorAlgorithm.cxx:433
TrigBphysMonitorAlgorithm::fillHistograms
virtual StatusCode fillHistograms(const EventContext &ctx) const override
adds event to the monitoring histograms
Definition: TrigBphysMonitorAlgorithm.cxx:37