Belle II Software  release-05-02-19
ReferenceFrame.cc
1 /**************************************************************************
2  * BASF2 (Belle Analysis Framework 2) *
3  * Copyright(C) 2015 - Belle II Collaboration *
4  * *
5  * Author: The Belle II Collaboration *
6  * Contributors: Thomas Keck, Dennis Weyland *
7  * *
8  * This software is provided "as is" without any warranty. *
9  **************************************************************************/
10 
11 #include <analysis/utility/ReferenceFrame.h>
12 
13 #include <TMatrixD.h>
14 
15 using namespace Belle2;
16 
17 std::stack<const ReferenceFrame*> ReferenceFrame::m_reference_frames;
18 
19 
20 RestFrame::RestFrame(const Particle* particle) :
21  m_momentum(particle->get4Vector()),
22  m_displacement(particle->getVertex()),
23  m_boost(m_momentum.BoostVector()),
24  m_lab2restframe(TLorentzRotation(-m_boost))
25 {
26 }
27 
29 {
30  if (m_reference_frames.empty()) {
31  static LabFrame _default;
32  return _default;
33  } else {
34  return *m_reference_frames.top();
35  }
36 }
37 
38 TVector3 RestFrame::getVertex(const TVector3& vector) const
39 {
40  // Transform Vertex from lab into rest frame:
41  // 1. Subtract displacement of rest frame origin in the lab frame
42  // 2. Use Lorentz Transformation to Boost Vertex vector into rest frame
43  // 3. Subtract movement of vertex end due to the time difference between
44  // the former simultaneous measured vertex points (see derivation of Lorentz contraction)
45  TLorentzVector a = m_lab2restframe * TLorentzVector(vector - m_displacement, 0);
46  return a.Vect() - m_boost * a.T();
47 }
48 
49 TLorentzVector RestFrame::getMomentum(const TLorentzVector& vector) const
50 {
51  // 1. Boost momentum into rest frame
52  return m_lab2restframe * vector;
53 }
54 
55 TMatrixFSym RestFrame::getMomentumErrorMatrix(const TMatrixFSym& matrix) const
56 {
57  TMatrixD lorentzrot(4, 4);
58 
59  for (int i = 0; i < 4; ++i)
60  for (int j = 0; j < 4; ++j)
61  lorentzrot(i, j) = m_lab2restframe(i, j);
62 
63  TMatrixFSym tmp_matrix(matrix);
64 
65  return tmp_matrix.Similarity(lorentzrot);
66 }
67 
68 TMatrixFSym RestFrame::getVertexErrorMatrix(const TMatrixFSym& matrix) const
69 {
70  TMatrixD lorentzrot(4, 3);
71 
72  for (int i = 0; i < 4; ++i)
73  for (int j = 0; j < 3; ++j)
74  lorentzrot(i, j) = m_lab2restframe(i, j);
75 
76  TMatrixFSym tmp_matrix(matrix);
77  auto rotated_error_matrix = tmp_matrix.Similarity(lorentzrot);
78 
79  TMatrixD timeshift(3, 4);
80  timeshift.Zero();
81  timeshift(0, 0) = 1;
82  timeshift(1, 1) = 1;
83  timeshift(2, 2) = 1;
84  timeshift(0, 3) = m_boost(0);
85  timeshift(1, 3) = m_boost(1);
86  timeshift(2, 3) = m_boost(2);
87 
88  return rotated_error_matrix.Similarity(timeshift);
89 }
90 
91 TVector3 LabFrame::getVertex(const TVector3& vector) const
92 {
93  return vector;
94 }
95 
96 TLorentzVector LabFrame::getMomentum(const TLorentzVector& vector) const
97 {
98  return vector;
99 }
100 
101 TMatrixFSym LabFrame::getMomentumErrorMatrix(const TMatrixFSym& matrix) const
102 {
103  return matrix;
104 }
105 
106 TMatrixFSym LabFrame::getVertexErrorMatrix(const TMatrixFSym& matrix) const
107 {
108  return matrix;
109 }
110 
111 TVector3 CMSFrame::getVertex(const TVector3& vector) const
112 {
113  // Transform Vertex from lab into cms frame:
114  // TODO 0: Substract fitted IP similar to RestFrame
115  // 1. Use Lorentz Transformation to Boost Vertex vector into cms frame
116  // 2. Subtract movement of vertex end due to the time difference between
117  // the former simultaneous measured vertex points (see derivation of Lorentz contraction)
118  TLorentzVector a = m_transform.rotateLabToCms() * TLorentzVector(vector, 0);
119  return a.Vect() - m_transform.getBoostVector() * a.T();
120 }
121 
122 TLorentzVector CMSFrame::getMomentum(const TLorentzVector& vector) const
123 {
124  // 1. Boost momentum into cms frame
125  return m_transform.rotateLabToCms() * vector;
126 }
127 
128 TMatrixFSym CMSFrame::getMomentumErrorMatrix(const TMatrixFSym& matrix) const
129 {
130  TMatrixD lorentzrot(4, 4);
131 
132  auto labToCmsFrame = m_transform.rotateLabToCms();
133  for (int i = 0; i < 4; ++i)
134  for (int j = 0; j < 4; ++j)
135  lorentzrot(i, j) = labToCmsFrame(i, j);
136 
137  TMatrixFSym tmp_matrix(matrix);
138  return tmp_matrix.Similarity(lorentzrot);
139 }
140 
141 TMatrixFSym CMSFrame::getVertexErrorMatrix(const TMatrixFSym& matrix) const
142 {
143  TMatrixD lorentzrot(4, 3);
144 
145  auto labToCmsFrame = m_transform.rotateLabToCms();
146  for (int i = 0; i < 4; ++i)
147  for (int j = 0; j < 3; ++j)
148  lorentzrot(i, j) = labToCmsFrame(i, j);
149 
150  TMatrixFSym tmp_matrix(matrix);
151  auto rotated_error_matrix = tmp_matrix.Similarity(lorentzrot);
152 
153  TMatrixD timeshift(3, 4);
154  timeshift.Zero();
155  auto boost_vector = m_transform.getBoostVector();
156  timeshift(0, 0) = 1;
157  timeshift(1, 1) = 1;
158  timeshift(2, 2) = 1;
159  timeshift(0, 3) = boost_vector(0);
160  timeshift(1, 3) = boost_vector(1);
161  timeshift(2, 3) = boost_vector(2);
162 
163  return rotated_error_matrix.Similarity(timeshift);
164 }
165 
166 RotationFrame::RotationFrame(const TVector3& newX, const TVector3& newY, const TVector3& newZ)
167 {
168  m_rotation.RotateAxes(newX.Unit(), newY.Unit(), newZ.Unit());
169  m_rotation.Invert();
170 }
171 
172 TVector3 RotationFrame::getVertex(const TVector3& vector) const
173 {
174  return m_rotation * vector;
175 }
176 
177 TLorentzVector RotationFrame::getMomentum(const TLorentzVector& vector) const
178 {
179  TVector3 rotated_vector = m_rotation * vector.Vect();
180 
181  return TLorentzVector(rotated_vector, vector[3]);
182 }
183 
184 TMatrixFSym RotationFrame::getMomentumErrorMatrix(const TMatrixFSym& matrix) const
185 {
186  TMatrixD extendedrot(4, 4);
187  extendedrot.Zero();
188  for (int i = 0; i < 3; ++i)
189  for (int j = 0; j < 3; ++j)
190  extendedrot(i, j) = m_rotation(i, j);
191  extendedrot(3, 3) = 1;
192 
193  TMatrixFSym tmp_matrix(matrix);
194  return tmp_matrix.Similarity(extendedrot);
195 }
196 
197 TMatrixFSym RotationFrame::getVertexErrorMatrix(const TMatrixFSym& matrix) const
198 {
199  TMatrixD rotmatrix(3, 3);
200  for (int i = 0; i < 3; ++i)
201  for (int j = 0; j < 3; ++j)
202  rotmatrix(i, j) = m_rotation(i, j);
203 
204  TMatrixFSym tmp_matrix(matrix);
205  return tmp_matrix.Similarity(rotmatrix);
206 }
207 
208 CMSRotationFrame::CMSRotationFrame(const TVector3& newX, const TVector3& newY, const TVector3& newZ) :
209  rotationframe(newX, newY, newZ)
210 {
211 
212 }
213 
214 TVector3 CMSRotationFrame::getVertex(const TVector3& vector) const
215 {
216  return rotationframe.getVertex(cmsframe.getVertex(vector));
217 }
218 
219 TLorentzVector CMSRotationFrame::getMomentum(const TLorentzVector& vector) const
220 {
222 }
223 
224 TMatrixFSym CMSRotationFrame::getMomentumErrorMatrix(const TMatrixFSym& matrix) const
225 {
227 }
228 
229 TMatrixFSym CMSRotationFrame::getVertexErrorMatrix(const TMatrixFSym& matrix) const
230 {
232 }
Belle2::LabFrame
Lab frame.
Definition: ReferenceFrame.h:187
Belle2::CMSRotationFrame::getVertexErrorMatrix
virtual TMatrixFSym getVertexErrorMatrix(const TMatrixFSym &matrix) const override
Get Vertex error matrix in rotation frame.
Definition: ReferenceFrame.cc:229
Belle2::CMSRotationFrame::getVertex
virtual TVector3 getVertex(const TVector3 &vector) const override
Get vertex 3-vector in rotation frame.
Definition: ReferenceFrame.cc:214
Belle2::LabFrame::getVertexErrorMatrix
virtual TMatrixFSym getVertexErrorMatrix(const TMatrixFSym &matrix) const override
Get Vertex error matrix in lab frame.
Definition: ReferenceFrame.cc:106
Belle2::CMSRotationFrame::cmsframe
CMSFrame cmsframe
CMSFrame.
Definition: ReferenceFrame.h:342
Belle2::CMSRotationFrame::CMSRotationFrame
CMSRotationFrame(const TVector3 &newX, const TVector3 &newY, const TVector3 &newZ)
Create new rotation frame.
Definition: ReferenceFrame.cc:208
Belle2::CMSFrame::getMomentum
virtual TLorentzVector getMomentum(const TLorentzVector &vector) const override
Get Lorentz vector in cms frame.
Definition: ReferenceFrame.cc:122
Belle2::CMSFrame::getMomentumErrorMatrix
virtual TMatrixFSym getMomentumErrorMatrix(const TMatrixFSym &matrix) const override
Get Momentum error matrix in cms frame.
Definition: ReferenceFrame.cc:128
Belle2::CMSFrame::m_transform
PCmsLabTransform m_transform
Lab to CMS Transform.
Definition: ReferenceFrame.h:256
Belle2::ReferenceFrame::m_reference_frames
static std::stack< const ReferenceFrame * > m_reference_frames
Stack of current rest frames.
Definition: ReferenceFrame.h:132
Belle2::RotationFrame::m_rotation
TRotation m_rotation
Rotation.
Definition: ReferenceFrame.h:299
Belle2::CMSFrame::getVertexErrorMatrix
virtual TMatrixFSym getVertexErrorMatrix(const TMatrixFSym &matrix) const override
Get Vertex error matrix in cms frame.
Definition: ReferenceFrame.cc:141
Belle2::RestFrame::getVertexErrorMatrix
virtual TMatrixFSym getVertexErrorMatrix(const TMatrixFSym &matrix) const override
Get Vertex error matrix in rest frame.
Definition: ReferenceFrame.cc:68
Belle2::RestFrame::getVertex
virtual TVector3 getVertex(const TVector3 &vector) const override
Get vertex 3-vector in rest frame system.
Definition: ReferenceFrame.cc:38
Belle2::LabFrame::getMomentumErrorMatrix
virtual TMatrixFSym getMomentumErrorMatrix(const TMatrixFSym &matrix) const override
Get Momentum error matrix in lab frame.
Definition: ReferenceFrame.cc:101
Belle2::LabFrame::getVertex
virtual TVector3 getVertex(const TVector3 &vector) const override
Get vertex 3-vector in lab frame.
Definition: ReferenceFrame.cc:91
Belle2::RestFrame::getMomentumErrorMatrix
virtual TMatrixFSym getMomentumErrorMatrix(const TMatrixFSym &matrix) const override
Get Momentum error matrix in rest frame.
Definition: ReferenceFrame.cc:55
Belle2::RotationFrame::getVertexErrorMatrix
virtual TMatrixFSym getVertexErrorMatrix(const TMatrixFSym &matrix) const override
Get Vertex error matrix in rotation frame.
Definition: ReferenceFrame.cc:197
Belle2::RotationFrame::getMomentumErrorMatrix
virtual TMatrixFSym getMomentumErrorMatrix(const TMatrixFSym &matrix) const override
Get Momentum error matrix in rotation frame.
Definition: ReferenceFrame.cc:184
Belle2::RotationFrame::getMomentum
virtual TLorentzVector getMomentum(const TLorentzVector &vector) const override
Get Lorentz vector in rotation frame.
Definition: ReferenceFrame.cc:177
Belle2::RestFrame::RestFrame
RestFrame(const Particle *particle)
Create new rest frame.
Definition: ReferenceFrame.cc:20
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::RestFrame::m_displacement
TVector3 m_displacement
displacement of RF origin in th lab frame
Definition: ReferenceFrame.h:179
Belle2::PCmsLabTransform::getBoostVector
TVector3 getBoostVector() const
Returns boost vector (beta=p/E)
Definition: PCmsLabTransform.h:49
Belle2::LabFrame::getMomentum
virtual TLorentzVector getMomentum(const TLorentzVector &vector) const override
Get Lorentz vector in lab frame.
Definition: ReferenceFrame.cc:96
Belle2::CMSFrame::getVertex
virtual TVector3 getVertex(const TVector3 &vector) const override
Get vertex 3-vector in cms frame.
Definition: ReferenceFrame.cc:111
Belle2::ReferenceFrame
Abstract base class of all reference frames.
Definition: ReferenceFrame.h:38
Belle2::Particle
Class to store reconstructed particles.
Definition: Particle.h:77
Belle2::RotationFrame::RotationFrame
RotationFrame(const TVector3 &newX, const TVector3 &newY, const TVector3 &newZ)
Create new rotation frame.
Definition: ReferenceFrame.cc:166
Belle2::ReferenceFrame::GetCurrent
static const ReferenceFrame & GetCurrent()
Get current rest frame.
Definition: ReferenceFrame.cc:28
Belle2::RestFrame::getMomentum
virtual TLorentzVector getMomentum(const TLorentzVector &vector) const override
Get Lorentz vector in rest frame System.
Definition: ReferenceFrame.cc:49
Belle2::PCmsLabTransform::rotateLabToCms
const TLorentzRotation rotateLabToCms() const
Returns Lorentz transformation from Lab to CMS.
Definition: PCmsLabTransform.h:74
Belle2::CMSRotationFrame::getMomentum
virtual TLorentzVector getMomentum(const TLorentzVector &vector) const override
Get Lorentz vector in rotation frame.
Definition: ReferenceFrame.cc:219
Belle2::RestFrame::m_lab2restframe
TLorentzRotation m_lab2restframe
Lorentz transformation connecting lab and rest frame.
Definition: ReferenceFrame.h:181
Belle2::CMSRotationFrame::rotationframe
RotationFrame rotationframe
Rotationframe.
Definition: ReferenceFrame.h:343
Belle2::RestFrame::m_boost
TVector3 m_boost
boost of RF relative to the lab frame
Definition: ReferenceFrame.h:180
Belle2::CMSRotationFrame::getMomentumErrorMatrix
virtual TMatrixFSym getMomentumErrorMatrix(const TMatrixFSym &matrix) const override
Get Momentum error matrix in rotation frame.
Definition: ReferenceFrame.cc:224
Belle2::RotationFrame::getVertex
virtual TVector3 getVertex(const TVector3 &vector) const override
Get vertex 3-vector in rotation frame.
Definition: ReferenceFrame.cc:172