Belle II Software development
ExtHit.cc
1/**************************************************************************
2 * basf2 (Belle II Analysis Software Framework) *
3 * Author: The Belle II Collaboration *
4 * *
5 * See git log for contributors and copyright holders. *
6 * This file is licensed under LGPL-3.0, see LICENSE.md. *
7 **************************************************************************/
8
9#include <tracking/dataobjects/ExtHit.h>
10
11#include <TMatrixD.h>
12
13#include <cmath>
14
15using namespace Belle2;
16
17// empty constructor for ROOT - do not use this
20 m_TOF(0.0),
21 m_PdgCode(0),
22 m_DetectorID(Const::EDetector::invalidDetector),
23 m_CopyID(0),
24 m_Status(EXT_FIRST),
26{
27 m_Position[0] = 0.0;
28 m_Position[1] = 0.0;
29 m_Position[2] = 0.0;
30 m_Momentum[0] = 0.0;
31 m_Momentum[1] = 0.0;
32 m_Momentum[2] = 0.0;
33 for (int k = 0; k < 21; ++k) {
34 m_Covariance[k] = 0.0;
35 }
36}
37
38// Constructor with initial values
39ExtHit::ExtHit(double tof, int pdgCode, Const::EDetector detectorID, int copyID, ExtHitStatus status, bool backwardPropagation,
40 const ROOT::Math::XYZPoint& position, const ROOT::Math::XYZVector& momentum, const TMatrixDSym& covariance) :
42 m_TOF(tof),
43 m_PdgCode(pdgCode),
44 m_DetectorID(detectorID),
45 m_CopyID(copyID),
46 m_Status(status),
47 m_BackwardPropagation(backwardPropagation)
48{
49 m_Position[0] = position.X();
50 m_Position[1] = position.Y();
51 m_Position[2] = position.Z();
52 m_Momentum[0] = momentum.X();
53 m_Momentum[1] = momentum.Y();
54 m_Momentum[2] = momentum.Z();
55 int k = 0;
56 for (int i = 0; i < 6; ++i) {
57 for (int j = 0; j <= i; ++j) {
58 m_Covariance[k++] = covariance[i][j];
59 }
60 }
61}
62
63// Constructor with initial values
64ExtHit::ExtHit(double tof, int pdgCode, Const::EDetector detectorID, int copyID, ExtHitStatus status, bool backwardPropagation,
65 const G4ThreeVector& position, const G4ThreeVector& momentum, const G4ErrorSymMatrix& covariance) :
67 m_TOF(tof),
68 m_PdgCode(pdgCode),
69 m_DetectorID(detectorID),
70 m_CopyID(copyID),
71 m_Status(status),
72 m_BackwardPropagation(backwardPropagation)
73{
74 m_Position[0] = position.x();
75 m_Position[1] = position.y();
76 m_Position[2] = position.z();
77 m_Momentum[0] = momentum.x();
78 m_Momentum[1] = momentum.y();
79 m_Momentum[2] = momentum.z();
80 int k = 0;
81 for (int i = 0; i < 6; ++i) {
82 for (int j = 0; j <= i; ++j) {
83 m_Covariance[k++] = covariance[i][j];
84 }
85 }
86}
87
88// Copy constructor
91 m_TOF(h.m_TOF),
96{
97 m_Position[0] = h.m_Position[0];
98 m_Position[1] = h.m_Position[1];
99 m_Position[2] = h.m_Position[2];
100 m_Momentum[0] = h.m_Momentum[0];
101 m_Momentum[1] = h.m_Momentum[1];
102 m_Momentum[2] = h.m_Momentum[2];
103 for (int k = 0; k < 21; ++k) {
104 m_Covariance[k] = h.m_Covariance[k];
105 }
106}
107
108// Assignment operator
110{
111 m_PdgCode = h.m_PdgCode;
112 m_DetectorID = h.m_DetectorID;
113 m_CopyID = h.m_CopyID;
114 m_Status = h.m_Status;
115 m_TOF = h.m_TOF;
116 m_Position[0] = h.m_Position[0];
117 m_Position[1] = h.m_Position[1];
118 m_Position[2] = h.m_Position[2];
119 m_Momentum[0] = h.m_Momentum[0];
120 m_Momentum[1] = h.m_Momentum[1];
121 m_Momentum[2] = h.m_Momentum[2];
122 for (int k = 0; k < 21; ++k) {
123 m_Covariance[k] = h.m_Covariance[k];
124 }
125 return *this;
126}
127
128// Get phase-space covariance at this extrapolation hit
129TMatrixDSym ExtHit::getCovariance() const
130{
131 TMatrixDSym t(6);
132 int k = 0;
133 for (int i = 0; i < 6; ++i) {
134 for (int j = 0; j <= i; ++j) {
135 t[j][i] = t[i][j] = m_Covariance[k++];
136 }
137 }
138 return t;
139}
140
141// Update the information for this extrapolation hit
142void ExtHit::update(ExtHitStatus status, double tof, const G4ThreeVector& position,
143 const G4ThreeVector& momentum, const G4ErrorSymMatrix& covariance)
144{
145 m_Status = status;
146 m_TOF = tof;
147 m_Position[0] = position.x();
148 m_Position[1] = position.y();
149 m_Position[2] = position.z();
150 m_Momentum[0] = momentum.x();
151 m_Momentum[1] = momentum.y();
152 m_Momentum[2] = momentum.z();
153 int k = 0;
154 for (int i = 0; i < 6; ++i) {
155 for (int j = 0; j <= i; ++j) {
156 m_Covariance[k++] = covariance[i][j];
157 }
158 }
159}
160
161// Get the uncertainty in the polar angle theta
163{
164 return sqrt(getPolarCovariance(1));
165}
166
167// Get the uncertainty in the azimuthal angle phi
169{
170 return sqrt(getPolarCovariance(2));
171}
172
173double ExtHit::getPolarCovariance(int i) const
174{
175 TMatrixDSym covariance(3);
176 covariance[0][0] = m_Covariance[0];
177 covariance[0][1] = covariance[1][0] = m_Covariance[1];
178 covariance[1][1] = m_Covariance[2];
179 covariance[0][2] = covariance[2][0] = m_Covariance[3];
180 covariance[1][2] = covariance[2][1] = m_Covariance[4];
181 covariance[2][2] = m_Covariance[5];
182 double perpSq = m_Position[0] * m_Position[0] + m_Position[1] * m_Position[1];
183 double perp = sqrt(perpSq);
184 double rSq = perpSq + m_Position[2] * m_Position[2];
185 double r = sqrt(rSq);
186 TMatrixD jacobian(3, 3);
187 jacobian[0][0] = m_Position[0] / r;
188 jacobian[0][1] = m_Position[1] / r;
189 jacobian[0][2] = m_Position[2] / r;
190 jacobian[1][0] = m_Position[0] * m_Position[2] / (perp * rSq);
191 jacobian[1][1] = m_Position[1] * m_Position[2] / (perp * rSq);
192 jacobian[1][2] = -perp / rSq;
193 jacobian[2][0] = -m_Position[1] / perpSq;
194 jacobian[2][1] = m_Position[0] / perpSq;
195 jacobian[2][2] = 0.0;
196 return (covariance.Similarity(jacobian))[i][i];
197}
This class provides a set of constants for the framework.
Definition Const.h:34
EDetector
Enum for identifying the detector components (detector and subdetector).
Definition Const.h:42
ExtHit & operator=(const ExtHit &)
Assignment operator.
Definition ExtHit.cc:109
int m_CopyID
copy ID
Definition ExtHit.h:196
double getErrorPhi() const
Get the uncertainty in the azimuthal angle phi (radians)
Definition ExtHit.cc:168
double getErrorTheta() const
Get the uncertainty in the azimuthal angle phi (radians)
Definition ExtHit.cc:162
double getPolarCovariance(int i) const
Get diagonal elemment of the 3x3 position-covariance matrix in polar coordinates (r,...
Definition ExtHit.cc:173
float m_Momentum[3]
momentum (GeV/c)
Definition ExtHit.h:184
TMatrixDSym getCovariance() const
Get phase-space covariance at this extrapolation hit.
Definition ExtHit.cc:129
int m_PdgCode
PDG code.
Definition ExtHit.h:190
void update(ExtHitStatus status, double t, const G4ThreeVector &r, const G4ThreeVector &p, const G4ErrorSymMatrix &e)
Update the parameters of this extrapolation hit.
Definition ExtHit.cc:142
float m_Covariance[21]
phase-space covariance (symmetric 6x6 linearized to 6*(6+1)/2: position & momentum in cm & GeV/c)
Definition ExtHit.h:178
bool m_BackwardPropagation
Direction of track propagation.
Definition ExtHit.h:202
Const::EDetector m_DetectorID
detector ID
Definition ExtHit.h:193
float m_TOF
time of flight (ns)
Definition ExtHit.h:187
ExtHit()
Empty constructor for ROOT IO (needed to make the class storable)
Definition ExtHit.cc:18
float m_Position[3]
position (cm)
Definition ExtHit.h:181
ExtHitStatus m_Status
extrapolation state
Definition ExtHit.h:199
RelationsInterface< TObject > RelationsObject
Provides interface for getting/adding relations to objects in StoreArrays.
double sqrt(double a)
sqrt for double
Definition beamHelpers.h:28
ExtHitStatus
Define state of extrapolation for each recorded hit.
Definition ExtHit.h:26
Abstract base class for different kinds of events.