ATLAS Offline Software
Loading...
Searching...
No Matches
MuonMomentumBalanceSignificanceTool.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3*/
4
6
7#include "GaudiKernel/SystemOfUnits.h"
12#include "TrkTrack/Track.h"
14
15using Gaudi::Units::GeV;
16
17namespace Rec {
18
20 const IInterface* parent) :
21 AthAlgTool(type, name, parent) {
22 declareInterface<IMuonMomentumBalanceSignificance>(this);
23 }
24
26 // exclude statistical combination
27 if (muon.author() == xAOD::Muon::STACO) return 0.;
28
29 // get combined track
30 const Trk::Track* theTrack =
31 muon.trackParticle(xAOD::Muon::CombinedTrackParticle) ? muon.trackParticle(xAOD::Muon::CombinedTrackParticle)->track() : nullptr;
32
33 if (theTrack == nullptr) {
34 ATH_MSG_DEBUG("No primary author original track for refitted muon, stop calculation...");
35 return 0.0;
36 } else
37 return momentumBalanceSignificance(*theTrack);
38 }
39
41 // find the TSOS carrying caloEnergy (TSOS type CaloDeposit)
42 // compare parameters with those from previous TSOS
43 double energyBalance = 0.;
44 const Trk::EnergyLoss* energyLoss = nullptr;
45 const Trk::TrackParameters* previousParameters = nullptr;
46 for (Trk::TrackStates::const_iterator s = track.trackStateOnSurfaces()->begin();
47 s != track.trackStateOnSurfaces()->end(); ++s) {
48 if (!(**s).trackParameters()) continue;
49 if ((**s).materialEffectsOnTrack()) {
50 const Trk::MaterialEffectsOnTrack* meot = dynamic_cast<const Trk::MaterialEffectsOnTrack*>((**s).materialEffectsOnTrack());
51 if (!meot) continue;
52 energyLoss = meot->energyLoss();
53 if ((**s).type(Trk::TrackStateOnSurface::CaloDeposit) && energyLoss && previousParameters) {
54 energyBalance = previousParameters->momentum().mag() - energyLoss->deltaE() - (**s).trackParameters()->momentum().mag();
55
56 if (fabs(energyBalance) < energyLoss->sigmaDeltaE() || energyLoss->sigmaMinusDeltaE() <= 0.0 ||
57 energyLoss->sigmaPlusDeltaE() <= 0.0)
58
59 {
60 ATH_MSG_VERBOSE(std::setiosflags(std::ios::fixed)
61 << " momentum balance " << std::setw(6) << std::setprecision(2) << energyBalance / GeV
62 << " significance " << std::setw(6) << std::setprecision(1)
63 << energyBalance / energyLoss->sigmaDeltaE() << " p before/after calo" << std::setw(7)
64 << std::setprecision(2) << previousParameters->momentum().mag() / GeV << " /" << std::setw(7)
65 << std::setprecision(2) << (**s).trackParameters()->momentum().mag() / GeV
66 << " energy deposit sigma " << energyLoss->sigmaDeltaE() / GeV << " GeV");
67 energyBalance /= energyLoss->sigmaDeltaE();
68 if (fabs(energyBalance) > 1.0)
69 ATH_MSG_DEBUG(" momentum balance using symmetric error "
70 << "as asymmetric error undefined ");
71 } else if (energyBalance < 0.) {
72 ATH_MSG_VERBOSE(std::setiosflags(std::ios::fixed)
73 << " momentum balance " << std::setw(6) << std::setprecision(2) << energyBalance / GeV
74 << " significance " << std::setw(6) << std::setprecision(1)
75 << energyBalance / energyLoss->sigmaDeltaE() << " p before/after calo" << std::setw(7)
76 << std::setprecision(2) << previousParameters->momentum().mag() / GeV << " /" << std::setw(7)
77 << std::setprecision(2) << (**s).trackParameters()->momentum().mag() / GeV
78 << " energy deposit sigma- " << energyLoss->sigmaMinusDeltaE() / GeV << " GeV");
79 energyBalance /= energyLoss->sigmaMinusDeltaE();
80 } else {
81 ATH_MSG_VERBOSE(std::setiosflags(std::ios::fixed)
82 << " momentum balance " << std::setw(6) << std::setprecision(2) << energyBalance / GeV
83 << " significance " << std::setw(6) << std::setprecision(1)
84 << energyBalance / energyLoss->sigmaDeltaE() << " p before/after calo" << std::setw(7)
85 << std::setprecision(2) << previousParameters->momentum().mag() / GeV << " /" << std::setw(7)
86 << std::setprecision(2) << (**s).trackParameters()->momentum().mag() / GeV
87 << " energy deposit sigma+ " << energyLoss->sigmaPlusDeltaE() / GeV << " GeV");
88 energyBalance /= energyLoss->sigmaPlusDeltaE();
89 }
90 break;
91 }
92 }
93
94 // update previous parameters
95 previousParameters = (**s).trackParameters();
96 }
97
98 return energyBalance;
99 }
100
101} // namespace Rec
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_DEBUG(x)
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
DataModel_detail::const_iterator< DataVector > const_iterator
Definition DataVector.h:838
MuonMomentumBalanceSignificanceTool(const std::string &type, const std::string &name, const IInterface *parent)
double momentumBalanceSignificance(const xAOD::Muon &muon) const
Calculate momentum (im)balance significance of a muon (method will simply step down to the relevant t...
This class describes energy loss material effects in the ATLAS tracking EDM.
Definition EnergyLoss.h:34
double sigmaPlusDeltaE() const
returns the positive side
double sigmaMinusDeltaE() const
returns the negative side
double sigmaDeltaE() const
returns the symmatric error
double deltaE() const
returns the
represents the full description of deflection and e-loss of a track in material.
const EnergyLoss * energyLoss() const
returns the energy loss object.
const Amg::Vector3D & momentum() const
Access method for the momentum.
@ CaloDeposit
This TSOS contains a CaloEnergy object.
Gaudi Tools.
ParametersBase< TrackParametersDim, Charged > TrackParameters
Muon_v1 Muon
Reference the current persistent version: