ATLAS Offline Software
EnergyLoss.icc
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 namespace Trk {
6 inline EnergyLoss::EnergyLoss(double deltaE,
7  double sigmaDeltaE,
8  double sMinusDeltaE,
9  double sPlusDeltaE)
10  : m_deltaE(deltaE)
11  , m_sigmaDeltaE(sigmaDeltaE)
12  , m_sigmaMinusDeltaE(sMinusDeltaE > 0.0 ? sMinusDeltaE : sigmaDeltaE)
13  , m_sigmaPlusDeltaE(sPlusDeltaE > 0.0 ? sPlusDeltaE : sigmaDeltaE)
14  , m_mean_ioni(0.)
15  , m_sig_ioni(0.)
16  , m_mean_rad(0.)
17  , m_sig_rad(0.)
18  , m_length(-std::numeric_limits<double>::min())
19 {
20 }
21 
22 inline EnergyLoss::EnergyLoss(double deltaE,
23  double sigmaDeltaE,
24  double sMinusDeltaE,
25  double sPlusDeltaE,
26  double mean_ioni,
27  double sig_ioni,
28  double mean_rad,
29  double sig_rad,
30  double length)
31  : m_deltaE(deltaE)
32  , m_sigmaDeltaE(sigmaDeltaE)
33  , m_sigmaMinusDeltaE(sMinusDeltaE)
34  , m_sigmaPlusDeltaE(sPlusDeltaE)
35  , m_mean_ioni(mean_ioni)
36  , m_sig_ioni(sig_ioni)
37  , m_mean_rad(mean_rad)
38  , m_sig_rad(sig_rad)
39  , m_length(length)
40 {
41 }
42 
43 inline EnergyLoss::EnergyLoss(double deltaE,
44  double sigmaDeltaE,
45  double mean_ioni,
46  double sig_ioni,
47  double mean_rad,
48  double sig_rad)
49  : m_deltaE(deltaE)
50  , m_sigmaDeltaE(sigmaDeltaE)
51  , m_sigmaMinusDeltaE(0.)
52  , m_sigmaPlusDeltaE(0.)
53  , m_mean_ioni(mean_ioni)
54  , m_sig_ioni(sig_ioni)
55  , m_mean_rad(mean_rad)
56  , m_sig_rad(sig_rad)
57  , m_length(-std::numeric_limits<double>::min())
58 {
59 }
60 
61 inline EnergyLoss*
62 EnergyLoss::clone() const
63 {
64  return new EnergyLoss(*this);
65 }
66 
67 inline double
68 EnergyLoss::deltaE() const
69 {
70  return m_deltaE;
71 }
72 
73 inline double
74 EnergyLoss::sigmaDeltaE() const
75 {
76  return m_sigmaDeltaE;
77 }
78 
79 inline double
80 EnergyLoss::sigmaMinusDeltaE() const
81 {
82  return m_sigmaMinusDeltaE;
83 }
84 
85 inline double
86 EnergyLoss::sigmaPlusDeltaE() const
87 {
88  return m_sigmaPlusDeltaE;
89 }
90 
91 inline double
92 EnergyLoss::meanIoni() const
93 {
94  return m_mean_ioni;
95 }
96 
97 inline double
98 EnergyLoss::sigmaIoni() const
99 {
100  return m_sig_ioni;
101 }
102 
103 inline double
104 EnergyLoss::meanRad() const
105 {
106  return m_mean_rad;
107 }
108 
109 inline double
110 EnergyLoss::sigmaRad() const
111 {
112  return m_sig_rad;
113 }
114 
115 inline double
116 EnergyLoss::length() const
117 {
118  return m_length;
119 } // length can be positive and negative like Eloss depending on (back)tracking
120 
121 inline void
122 EnergyLoss::update(double ioni, double sigi, double rad, double sigr, bool mpv)
123 {
124  m_mean_ioni += ioni;
125  m_mean_rad += rad;
126  m_sig_ioni += sigi;
127  m_sig_rad += sigr;
128  m_deltaE += mpv ? 0.9 * ioni + 0.15 * rad : ioni + rad;
129  m_sigmaDeltaE = std::sqrt(m_sig_ioni * m_sig_ioni + m_sig_rad * m_sig_rad);
130 }
131 
132 inline void
133 EnergyLoss::update(const EnergyLoss& eloss, bool mpv)
134 {
135  m_mean_ioni += eloss.meanIoni();
136  m_mean_rad += eloss.meanRad();
137  m_sig_ioni += eloss.sigmaIoni();
138  m_sig_rad += eloss.sigmaRad();
139  m_deltaE += mpv ? 0.9 * eloss.meanIoni() + 0.15 * eloss.meanRad()
140  : eloss.meanIoni() + eloss.meanRad();
141  m_sigmaDeltaE = std::sqrt(m_sig_ioni * m_sig_ioni + m_sig_rad * m_sig_rad);
142 }
143 
144 inline void
145 EnergyLoss::set(double eloss,
146  double sigde,
147  double ioni,
148  double sigi,
149  double rad,
150  double sigr)
151 {
152  m_mean_ioni = ioni;
153  m_mean_rad = rad;
154  m_sig_ioni = sigi;
155  m_sig_rad = sigr;
156  m_deltaE = ioni + rad + 0 * eloss;
157  m_sigmaDeltaE = std::sqrt(m_sig_ioni * m_sig_ioni + m_sig_rad * m_sig_rad +
158  0 * sigde * sigde);
159 }
160 
161 }