Belle II Software  release-05-02-19
ReferenceFrame.h
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 #pragma once
12 
13 #include <TLorentzRotation.h>
14 #include <TRotation.h>
15 #include <TLorentzVector.h>
16 #include <analysis/dataobjects/Particle.h>
17 #include <analysis/utility/PCmsLabTransform.h>
18 
19 #include <stack>
20 
21 namespace Belle2 {
30  class ReferenceFrame {
31  public:
37  virtual TVector3 getVertex(const TVector3& vector) const = 0;
38 
44  virtual TVector3 getVertex(const Particle* particle) const
45  {
46  return getVertex(particle->getVertex());
47  }
48 
54  virtual TLorentzVector getMomentum(const TLorentzVector& vector) const = 0;
55 
61  virtual TLorentzVector getMomentum(const Particle* particle) const
62  {
63  return getMomentum(particle->get4Vector());
64  }
65 
71  virtual TMatrixFSym getMomentumErrorMatrix(const TMatrixFSym& matrix) const = 0;
72 
78  virtual TMatrixFSym getMomentumErrorMatrix(const Particle* particle) const
79  {
80  return getMomentumErrorMatrix(particle->getMomentumErrorMatrix());
81  }
82 
88  virtual TMatrixFSym getVertexErrorMatrix(const TMatrixFSym& matrix) const = 0;
89 
95  virtual TMatrixFSym getVertexErrorMatrix(const Particle* particle) const
96  {
97  return getVertexErrorMatrix(particle->getVertexErrorMatrix());
98  }
99 
104  static const ReferenceFrame& GetCurrent();
105 
106  private:
111  static void Push(const ReferenceFrame* frame)
112  {
113  m_reference_frames.push(frame);
114  }
115 
119  static void Pop()
120  {
121  m_reference_frames.pop();
122  }
123 
124  static std::stack<const ReferenceFrame*> m_reference_frames;
126  template<class T>
127  friend class UseReferenceFrame;
128  };
129 
133  class RestFrame : public ReferenceFrame {
134 
135  public:
139  explicit RestFrame(const Particle* particle);
140 
146  virtual TVector3 getVertex(const TVector3& vector) const override;
147 
153  virtual TLorentzVector getMomentum(const TLorentzVector& vector) const override;
154 
160  virtual TMatrixFSym getMomentumErrorMatrix(const TMatrixFSym& matrix) const override;
161 
167  virtual TMatrixFSym getVertexErrorMatrix(const TMatrixFSym& matrix) const override;
168 
169  private:
170  TLorentzVector m_momentum;
171  TVector3 m_displacement;
172  TVector3 m_boost;
173  TLorentzRotation m_lab2restframe;
174  };
175 
179  class LabFrame : public ReferenceFrame {
180 
181  public:
182 
188  virtual TVector3 getVertex(const TVector3& vector) const override;
189 
195  virtual TLorentzVector getMomentum(const TLorentzVector& vector) const override;
196 
202  virtual TMatrixFSym getMomentumErrorMatrix(const TMatrixFSym& matrix) const override;
203 
209  virtual TMatrixFSym getVertexErrorMatrix(const TMatrixFSym& matrix) const override;
210 
211  };
212 
216  class CMSFrame : public ReferenceFrame {
217 
218  public:
224  virtual TVector3 getVertex(const TVector3& vector) const override;
225 
231  virtual TLorentzVector getMomentum(const TLorentzVector& vector) const override;
232 
238  virtual TMatrixFSym getMomentumErrorMatrix(const TMatrixFSym& matrix) const override;
239 
245  virtual TMatrixFSym getVertexErrorMatrix(const TMatrixFSym& matrix) const override;
246 
247  private:
249  };
250 
254  class RotationFrame : public ReferenceFrame {
255 
256  public:
260  explicit RotationFrame(const TVector3& newX, const TVector3& newY, const TVector3& newZ);
261 
267  virtual TVector3 getVertex(const TVector3& vector) const override;
268 
274  virtual TLorentzVector getMomentum(const TLorentzVector& vector) const override;
275 
281  virtual TMatrixFSym getMomentumErrorMatrix(const TMatrixFSym& matrix) const override;
282 
288  virtual TMatrixFSym getVertexErrorMatrix(const TMatrixFSym& matrix) const override;
289 
290  private:
291  TRotation m_rotation;
292  };
293 
297  class CMSRotationFrame : public ReferenceFrame {
298 
299  public:
303  explicit CMSRotationFrame(const TVector3& newX, const TVector3& newY, const TVector3& newZ);
304 
310  virtual TVector3 getVertex(const TVector3& vector) const override;
311 
317  virtual TLorentzVector getMomentum(const TLorentzVector& vector) const override;
318 
324  virtual TMatrixFSym getMomentumErrorMatrix(const TMatrixFSym& matrix) const override;
325 
331  virtual TMatrixFSym getVertexErrorMatrix(const TMatrixFSym& matrix) const override;
332 
333  private:
337  };
338 
340  template<class T>
341  class UseReferenceFrame {
342  public:
344  template<class ...Args>
345  explicit UseReferenceFrame(Args&& ... params) : m_frame(std::forward<Args>(params)...)
346  {
348  }
349 
352  {
354  }
355  private:
356  T m_frame;
357  };
358 
360 } // Belle2 namespace
361 
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::ReferenceFrame::getVertex
virtual TVector3 getVertex(const TVector3 &vector) const =0
Get vertex 3-vector in reference frame.
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::UseReferenceFrame::m_frame
T m_frame
the reference frame
Definition: ReferenceFrame.h:364
Belle2::CMSRotationFrame::CMSRotationFrame
CMSRotationFrame(const TVector3 &newX, const TVector3 &newY, const TVector3 &newZ)
Create new rotation frame.
Definition: ReferenceFrame.cc:208
Belle2::ReferenceFrame::getMomentum
virtual TLorentzVector getMomentum(const TLorentzVector &vector) const =0
Get momentum 4-vector in reference frame.
Belle2::CMSRotationFrame
Stack frame for cms and Rotation frame.
Definition: ReferenceFrame.h:305
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::RotationFrame
Rotation frame around vector.
Definition: ReferenceFrame.h:262
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::CMSFrame
CMS frame.
Definition: ReferenceFrame.h:224
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::RestFrame
Rest frame of a particle.
Definition: ReferenceFrame.h:141
Belle2::UseReferenceFrame
A template class to apply the reference frame.
Definition: ReferenceFrame.h:349
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::ReferenceFrame::Push
static void Push(const ReferenceFrame *frame)
Push rest frame of given particle.
Definition: ReferenceFrame.h:119
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::PCmsLabTransform
Class to hold Lorentz transformations from/to CMS and boost vector.
Definition: PCmsLabTransform.h:37
Belle2::RestFrame::getMomentum
virtual TLorentzVector getMomentum(const TLorentzVector &vector) const override
Get Lorentz vector in rest frame System.
Definition: ReferenceFrame.cc:49
Belle2::CMSRotationFrame::getMomentum
virtual TLorentzVector getMomentum(const TLorentzVector &vector) const override
Get Lorentz vector in rotation frame.
Definition: ReferenceFrame.cc:219
Belle2::ReferenceFrame::getMomentumErrorMatrix
virtual TMatrixFSym getMomentumErrorMatrix(const TMatrixFSym &matrix) const =0
Get Momentum error matrix in reference frame.
Belle2::RestFrame::m_momentum
TLorentzVector m_momentum
momentum of RF in the lab frame
Definition: ReferenceFrame.h:178
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::ReferenceFrame::getVertexErrorMatrix
virtual TMatrixFSym getVertexErrorMatrix(const TMatrixFSym &matrix) const =0
Get Vertex error matrix in reference frame.
Belle2::UseReferenceFrame::UseReferenceFrame
UseReferenceFrame(Args &&... params)
Constructor which applies the reference frame
Definition: ReferenceFrame.h:353
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
Belle2::ReferenceFrame::Pop
static void Pop()
Pop current rest frame.
Definition: ReferenceFrame.h:127