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