Belle II Software  release-06-00-14
ReferenceFrame.h
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 #pragma once
10 
11 #include <TLorentzRotation.h>
12 #include <TRotation.h>
13 #include <TLorentzVector.h>
14 #include <analysis/dataobjects/Particle.h>
15 #include <analysis/utility/PCmsLabTransform.h>
16 
17 #include <stack>
18 
19 namespace Belle2 {
29  public:
35  virtual TVector3 getVertex(const TVector3& vector) const = 0;
36 
42  virtual TVector3 getVertex(const Particle* particle) const
43  {
44  return getVertex(particle->getVertex());
45  }
46 
52  virtual TLorentzVector getMomentum(const TLorentzVector& vector) const = 0;
53 
59  virtual TLorentzVector getMomentum(const Particle* particle) const
60  {
61  return getMomentum(particle->get4Vector());
62  }
63 
69  virtual TMatrixFSym getMomentumErrorMatrix(const TMatrixFSym& matrix) const = 0;
70 
76  virtual TMatrixFSym getMomentumErrorMatrix(const Particle* particle) const
77  {
78  return getMomentumErrorMatrix(particle->getMomentumErrorMatrix());
79  }
80 
86  virtual TMatrixFSym getVertexErrorMatrix(const TMatrixFSym& matrix) const = 0;
87 
93  virtual TMatrixFSym getVertexErrorMatrix(const Particle* particle) const
94  {
95  return getVertexErrorMatrix(particle->getVertexErrorMatrix());
96  }
97 
102  static const ReferenceFrame& GetCurrent();
103 
104  private:
109  static void Push(const ReferenceFrame* frame)
110  {
111  m_reference_frames.push(frame);
112  }
113 
117  static void Pop()
118  {
119  m_reference_frames.pop();
120  }
121 
122  static std::stack<const ReferenceFrame*> m_reference_frames;
124  template<class T>
125  friend class UseReferenceFrame;
126  };
127 
131  class RestFrame : public ReferenceFrame {
132 
133  public:
137  explicit RestFrame(const Particle* particle);
138 
144  virtual TVector3 getVertex(const TVector3& vector) const override;
145 
151  virtual TLorentzVector getMomentum(const TLorentzVector& vector) const override;
152 
158  virtual TMatrixFSym getMomentumErrorMatrix(const TMatrixFSym& matrix) const override;
159 
165  virtual TMatrixFSym getVertexErrorMatrix(const TMatrixFSym& matrix) const override;
166 
167  private:
168  TLorentzVector m_momentum;
169  TVector3 m_displacement;
170  TVector3 m_boost;
171  TLorentzRotation m_lab2restframe;
172  };
173 
177  class LabFrame : public ReferenceFrame {
178 
179  public:
180 
186  virtual TVector3 getVertex(const TVector3& vector) const override;
187 
193  virtual TLorentzVector getMomentum(const TLorentzVector& vector) const override;
194 
200  virtual TMatrixFSym getMomentumErrorMatrix(const TMatrixFSym& matrix) const override;
201 
207  virtual TMatrixFSym getVertexErrorMatrix(const TMatrixFSym& matrix) const override;
208 
209  };
210 
214  class CMSFrame : public ReferenceFrame {
215 
216  public:
222  virtual TVector3 getVertex(const TVector3& vector) const override;
223 
229  virtual TLorentzVector getMomentum(const TLorentzVector& vector) const override;
230 
236  virtual TMatrixFSym getMomentumErrorMatrix(const TMatrixFSym& matrix) const override;
237 
243  virtual TMatrixFSym getVertexErrorMatrix(const TMatrixFSym& matrix) const override;
244 
245  private:
247  };
248 
252  class RotationFrame : public ReferenceFrame {
253 
254  public:
258  explicit RotationFrame(const TVector3& newX, const TVector3& newY, const TVector3& newZ);
259 
265  virtual TVector3 getVertex(const TVector3& vector) const override;
266 
272  virtual TLorentzVector getMomentum(const TLorentzVector& vector) const override;
273 
279  virtual TMatrixFSym getMomentumErrorMatrix(const TMatrixFSym& matrix) const override;
280 
286  virtual TMatrixFSym getVertexErrorMatrix(const TMatrixFSym& matrix) const override;
287 
288  private:
289  TRotation m_rotation;
290  };
291 
296 
297  public:
301  explicit CMSRotationFrame(const TVector3& newX, const TVector3& newY, const TVector3& newZ);
302 
308  virtual TVector3 getVertex(const TVector3& vector) const override;
309 
315  virtual TLorentzVector getMomentum(const TLorentzVector& vector) const override;
316 
322  virtual TMatrixFSym getMomentumErrorMatrix(const TMatrixFSym& matrix) const override;
323 
329  virtual TMatrixFSym getVertexErrorMatrix(const TMatrixFSym& matrix) const override;
330 
331  private:
335  };
336 
338  template<class T>
340  public:
342  template<class ...Args>
343  explicit UseReferenceFrame(Args&& ... params) : m_frame(std::forward<Args>(params)...)
344  {
346  }
347 
350  {
352  }
353  private:
355  };
356 
358 } // Belle2 namespace
359 
virtual TMatrixFSym getVertexErrorMatrix(const TMatrixFSym &matrix) const override
Get Vertex error matrix in cms frame.
virtual TLorentzVector getMomentum(const TLorentzVector &vector) const override
Get Lorentz vector in cms frame.
virtual TMatrixFSym getMomentumErrorMatrix(const TMatrixFSym &matrix) const override
Get Momentum error matrix in cms frame.
virtual TVector3 getVertex(const TVector3 &vector) const override
Get vertex 3-vector in cms frame.
PCmsLabTransform m_transform
Lab to CMS Transform.
Stack frame for cms and Rotation frame.
virtual TMatrixFSym getVertexErrorMatrix(const TMatrixFSym &matrix) const override
Get Vertex error matrix in rotation frame.
virtual TLorentzVector getMomentum(const TLorentzVector &vector) const override
Get Lorentz vector in rotation frame.
virtual TMatrixFSym getMomentumErrorMatrix(const TMatrixFSym &matrix) const override
Get Momentum error matrix in rotation frame.
CMSRotationFrame(const TVector3 &newX, const TVector3 &newY, const TVector3 &newZ)
Create new rotation frame.
RotationFrame rotationframe
Rotationframe.
CMSFrame cmsframe
CMSFrame.
virtual TVector3 getVertex(const TVector3 &vector) const override
Get vertex 3-vector in rotation frame.
virtual TMatrixFSym getVertexErrorMatrix(const TMatrixFSym &matrix) const override
Get Vertex error matrix in lab frame.
virtual TLorentzVector getMomentum(const TLorentzVector &vector) const override
Get Lorentz vector in lab frame.
virtual TMatrixFSym getMomentumErrorMatrix(const TMatrixFSym &matrix) const override
Get Momentum error matrix in lab frame.
virtual TVector3 getVertex(const TVector3 &vector) const override
Get vertex 3-vector in lab frame.
Class to hold Lorentz transformations from/to CMS and boost vector.
Class to store reconstructed particles.
Definition: Particle.h:74
Abstract base class of all reference frames.
virtual TLorentzVector getMomentum(const TLorentzVector &vector) const =0
Get momentum 4-vector in reference frame.
virtual TMatrixFSym getVertexErrorMatrix(const Particle *particle) const
Wrapper for particles.
virtual TMatrixFSym getVertexErrorMatrix(const TMatrixFSym &matrix) const =0
Get Vertex error matrix in reference frame.
virtual TMatrixFSym getMomentumErrorMatrix(const TMatrixFSym &matrix) const =0
Get Momentum error matrix in reference frame.
virtual TVector3 getVertex(const Particle *particle) const
Wrapper for particles.
virtual TVector3 getVertex(const TVector3 &vector) const =0
Get vertex 3-vector in reference frame.
static std::stack< const ReferenceFrame * > m_reference_frames
Stack of current rest frames.
virtual TLorentzVector getMomentum(const Particle *particle) const
Wrapper for particles.
virtual TMatrixFSym getMomentumErrorMatrix(const Particle *particle) const
Wrapper for particles.
static void Pop()
Pop current rest frame.
static const ReferenceFrame & GetCurrent()
Get current rest frame.
static void Push(const ReferenceFrame *frame)
Push rest frame of given particle.
Rest frame of a particle.
virtual TMatrixFSym getVertexErrorMatrix(const TMatrixFSym &matrix) const override
Get Vertex error matrix in rest frame.
virtual TLorentzVector getMomentum(const TLorentzVector &vector) const override
Get Lorentz vector in rest frame System.
virtual TMatrixFSym getMomentumErrorMatrix(const TMatrixFSym &matrix) const override
Get Momentum error matrix in rest frame.
TVector3 m_boost
boost of RF relative to the lab frame
TLorentzRotation m_lab2restframe
Lorentz transformation connecting lab and rest frame.
RestFrame(const Particle *particle)
Create new rest frame.
virtual TVector3 getVertex(const TVector3 &vector) const override
Get vertex 3-vector in rest frame system.
TVector3 m_displacement
displacement of RF origin in th lab frame
TLorentzVector m_momentum
momentum of RF in the lab frame
Rotation frame around vector.
virtual TMatrixFSym getVertexErrorMatrix(const TMatrixFSym &matrix) const override
Get Vertex error matrix in rotation frame.
virtual TLorentzVector getMomentum(const TLorentzVector &vector) const override
Get Lorentz vector in rotation frame.
RotationFrame(const TVector3 &newX, const TVector3 &newY, const TVector3 &newZ)
Create new rotation frame.
TRotation m_rotation
Rotation.
virtual TMatrixFSym getMomentumErrorMatrix(const TMatrixFSym &matrix) const override
Get Momentum error matrix in rotation frame.
virtual TVector3 getVertex(const TVector3 &vector) const override
Get vertex 3-vector in rotation frame.
A template class to apply the reference frame.
UseReferenceFrame(Args &&... params)
Constructor which applies the reference frame
T m_frame
the reference frame
Abstract base class for different kinds of events.