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
19
21 // exclude statistical combination
22 if (muon.author() == xAOD::Muon::Author::STACO) return 0.;
23 using enum xAOD::Muon::TrackParticleType;
24 // get combined track
25 const Trk::Track* theTrack =
26 muon.trackParticle(CombinedTrackParticle) ? muon.trackParticle(CombinedTrackParticle)->track() : nullptr;
27
28 if (theTrack == nullptr) {
29 ATH_MSG_DEBUG("No primary author original track for refitted muon, stop calculation...");
30 return 0.0;
31 } else
32 return momentumBalanceSignificance(*theTrack);
33 }
34
36 // find the TSOS carrying caloEnergy (TSOS type CaloDeposit)
37 // compare parameters with those from previous TSOS
38 double energyBalance = 0.;
39 const Trk::EnergyLoss* energyLoss = nullptr;
40 const Trk::TrackParameters* previousParameters = nullptr;
41 for (Trk::TrackStates::const_iterator s = track.trackStateOnSurfaces()->begin();
42 s != track.trackStateOnSurfaces()->end(); ++s) {
43 if (!(**s).trackParameters()) continue;
44 if ((**s).materialEffectsOnTrack()) {
45 const Trk::MaterialEffectsOnTrack* meot = dynamic_cast<const Trk::MaterialEffectsOnTrack*>((**s).materialEffectsOnTrack());
46 if (!meot) continue;
47 energyLoss = meot->energyLoss();
48 if ((**s).type(Trk::TrackStateOnSurface::CaloDeposit) && energyLoss && previousParameters) {
49 energyBalance = previousParameters->momentum().mag() - energyLoss->deltaE() - (**s).trackParameters()->momentum().mag();
50
51 if (fabs(energyBalance) < energyLoss->sigmaDeltaE() || energyLoss->sigmaMinusDeltaE() <= 0.0 ||
52 energyLoss->sigmaPlusDeltaE() <= 0.0)
53
54 {
55 ATH_MSG_VERBOSE(std::setiosflags(std::ios::fixed)
56 << " momentum balance " << std::setw(6) << std::setprecision(2) << energyBalance / GeV
57 << " significance " << std::setw(6) << std::setprecision(1)
58 << energyBalance / energyLoss->sigmaDeltaE() << " p before/after calo" << std::setw(7)
59 << std::setprecision(2) << previousParameters->momentum().mag() / GeV << " /" << std::setw(7)
60 << std::setprecision(2) << (**s).trackParameters()->momentum().mag() / GeV
61 << " energy deposit sigma " << energyLoss->sigmaDeltaE() / GeV << " GeV");
62 energyBalance /= energyLoss->sigmaDeltaE();
63 if (fabs(energyBalance) > 1.0)
64 ATH_MSG_DEBUG(" momentum balance using symmetric error "
65 << "as asymmetric error undefined ");
66 } else if (energyBalance < 0.) {
67 ATH_MSG_VERBOSE(std::setiosflags(std::ios::fixed)
68 << " momentum balance " << std::setw(6) << std::setprecision(2) << energyBalance / GeV
69 << " significance " << std::setw(6) << std::setprecision(1)
70 << energyBalance / energyLoss->sigmaDeltaE() << " p before/after calo" << std::setw(7)
71 << std::setprecision(2) << previousParameters->momentum().mag() / GeV << " /" << std::setw(7)
72 << std::setprecision(2) << (**s).trackParameters()->momentum().mag() / GeV
73 << " energy deposit sigma- " << energyLoss->sigmaMinusDeltaE() / GeV << " GeV");
74 energyBalance /= energyLoss->sigmaMinusDeltaE();
75 } else {
76 ATH_MSG_VERBOSE(std::setiosflags(std::ios::fixed)
77 << " momentum balance " << std::setw(6) << std::setprecision(2) << energyBalance / GeV
78 << " significance " << std::setw(6) << std::setprecision(1)
79 << energyBalance / energyLoss->sigmaDeltaE() << " p before/after calo" << std::setw(7)
80 << std::setprecision(2) << previousParameters->momentum().mag() / GeV << " /" << std::setw(7)
81 << std::setprecision(2) << (**s).trackParameters()->momentum().mag() / GeV
82 << " energy deposit sigma+ " << energyLoss->sigmaPlusDeltaE() / GeV << " GeV");
83 energyBalance /= energyLoss->sigmaPlusDeltaE();
84 }
85 break;
86 }
87 }
88
89 // update previous parameters
90 previousParameters = (**s).trackParameters();
91 }
92
93 return energyBalance;
94 }
95
96} // namespace Rec
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_DEBUG(x)
DataModel_detail::const_iterator< DataVector > const_iterator
Definition DataVector.h:838
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: