Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
LorentzRotation.h
Go to the documentation of this file.
1// @(#)root/mathcore:$Id$
2// Authors: W. Brown, M. Fischler, L. Moneta 2005
3
4 /**********************************************************************
5 * *
6 * Copyright (c) 2005 ROOT MathLib Team *
7 * *
8 * *
9 **********************************************************************/
10
11// Header file for LorentzRotation
12//
13// Created by: Mark Fischler Mon Aug 8 2005
14//
15// Last update: $Id$
16//
17#ifndef ROOT_Math_GenVector_LorentzRotation
18#define ROOT_Math_GenVector_LorentzRotation 1
19
21
24
36
37#include <algorithm>
38
39namespace ROOT {
40
41 namespace Math {
42
43//__________________________________________________________________________________________
44 /**
45 Lorentz transformation class with the (4D) transformation represented by
46 a 4x4 orthosymplectic matrix.
47 See also Boost, BoostX, BoostY and BoostZ for classes representing
48 specialized Lorentz transformations.
49 Also, the 3-D rotation classes can be considered to be special Lorentz
50 transformations which do not mix space and time components.
51
52 @ingroup GenVector
53
54 @sa Overview of the @ref GenVector "physics vector library"
55 */
56
58
59public:
60
61 typedef double Scalar;
62
64 kXX = 0, kXY = 1, kXZ = 2, kXT = 3
65 , kYX = 4, kYY = 5, kYZ = 6, kYT = 7
66 , kZX = 8, kZY = 9, kZZ = 10, kZT = 11
67 , kTX = 12, kTY = 13, kTZ = 14, kTT = 15
68 };
69
70 // ========== Constructors and Assignment =====================
71
72 /**
73 Default constructor (identity transformation)
74 */
76
77 /**
78 Construct given a pair of pointers or iterators defining the
79 beginning and end of an array of sixteen Scalars
80 */
81 template<class IT>
82 LorentzRotation(IT begin, IT end) { SetComponents(begin,end); }
83
84 // The compiler-generated and dtor are OK but we have implementwd the copy-ctor and
85 // assignment operators since we have a template assignment
86
87 /**
88 Copy constructor
89 */
91 *this = r;
92 }
93
94 /**
95 Construct from a pure boost
96 */
97 explicit LorentzRotation( Boost const & b ) { b.GetLorentzRotation( fM+0 ); }
98 explicit LorentzRotation( BoostX const & bx ) { bx.GetLorentzRotation( fM+0 ); }
99 explicit LorentzRotation( BoostY const & by ) { by.GetLorentzRotation( fM+0 ); }
100 explicit LorentzRotation( BoostZ const & bz ) { bz.GetLorentzRotation( fM+0 ); }
101
102 /**
103 Construct from a 3-D rotation (no space-time mixing)
104 */
105 explicit LorentzRotation( Rotation3D const & r );
106 explicit LorentzRotation( AxisAngle const & a );
107 explicit LorentzRotation( EulerAngles const & e );
108 explicit LorentzRotation( Quaternion const & q );
109 explicit LorentzRotation( RotationX const & r );
110 explicit LorentzRotation( RotationY const & r );
111 explicit LorentzRotation( RotationZ const & r );
112
113 /**
114 Construct from a linear algebra matrix of size at least 4x4,
115 which must support operator()(i,j) to obtain elements (0,3) thru (3,3).
116 Precondition: The matrix is assumed to be orthosymplectic. NO checking
117 or re-adjusting is performed.
118 Note: (0,0) refers to the XX component; (3,3) refers to the TT component.
119 */
120 template<class ForeignMatrix>
121 explicit constexpr LorentzRotation(const ForeignMatrix & m) { SetComponents(m); }
122
123 /**
124 Construct from four orthosymplectic vectors (which must have methods
125 x(), y(), z() and t()) which will be used as the columns of the Lorentz
126 rotation matrix. The orthosymplectic conditions will be checked, and
127 values adjusted so that the result will always be a good Lorentz rotation
128 matrix.
129 */
130 template<class Foreign4Vector>
135
136
137 /**
138 Raw constructor from sixteen Scalar components (without any checking)
139 */
144 {
145 SetComponents (xx, xy, xz, xt,
146 yx, yy, yz, yt,
147 zx, zy, zz, zt,
148 tx, ty, tz, tt);
149 }
150
151 /**
152 Assign from another LorentzRotation
153 */
156 SetComponents( rhs.fM[0], rhs.fM[1], rhs.fM[2], rhs.fM[3],
157 rhs.fM[4], rhs.fM[5], rhs.fM[6], rhs.fM[7],
158 rhs.fM[8], rhs.fM[9], rhs.fM[10], rhs.fM[11],
159 rhs.fM[12], rhs.fM[13], rhs.fM[14], rhs.fM[15] );
160 return *this;
161 }
162
163 /**
164 Assign from a pure boost
165 */
167 operator=( Boost const & b ) { return operator=(LorentzRotation(b)); }
169 operator=( BoostX const & b ) { return operator=(LorentzRotation(b)); }
171 operator=( BoostY const & b ) { return operator=(LorentzRotation(b)); }
173 operator=( BoostZ const & b ) { return operator=(LorentzRotation(b)); }
174
175 /**
176 Assign from a 3-D rotation
177 */
192
193 /**
194 Assign from a linear algebra matrix of size at least 4x4,
195 which must support operator()(i,j) to obtain elements (0,3) thru (3,3).
196 Precondition: The matrix is assumed to be orthosymplectic. NO checking
197 or re-adjusting is performed.
198 */
199 template<class ForeignMatrix>
202 SetComponents( m(0,0), m(0,1), m(0,2), m(0,3),
203 m(1,0), m(1,1), m(1,2), m(1,3),
204 m(2,0), m(2,1), m(2,2), m(2,3),
205 m(3,0), m(3,1), m(3,2), m(3,3) );
206 return *this;
207 }
208
209 /**
210 Re-adjust components to eliminate small deviations from a perfect
211 orthosyplectic matrix.
212 */
213 void Rectify();
214
215 // ======== Components ==============
216
217 /**
218 Set components from four orthosymplectic vectors (which must have methods
219 x(), y(), z(), and t()) which will be used as the columns of the
220 Lorentz rotation matrix. The values will be adjusted
221 so that the result will always be a good Lorentz rotation matrix.
222 */
223 template<class Foreign4Vector>
224 void
226 const Foreign4Vector& v2,
227 const Foreign4Vector& v3,
228 const Foreign4Vector& v4 ) {
229 fM[kXX]=v1.x(); fM[kXY]=v2.x(); fM[kXZ]=v3.x(); fM[kXT]=v4.x();
230 fM[kYX]=v1.y(); fM[kYY]=v2.y(); fM[kYZ]=v3.y(); fM[kYT]=v4.y();
231 fM[kZX]=v1.z(); fM[kZY]=v2.z(); fM[kZZ]=v3.z(); fM[kZT]=v4.z();
232 fM[kTX]=v1.t(); fM[kTY]=v2.t(); fM[kTZ]=v3.t(); fM[kTT]=v4.t();
233 Rectify();
234 }
235
236 /**
237 Get components into four 4-vectors which will be the (orthosymplectic)
238 columns of the rotation matrix. (The 4-vector class must have a
239 constructor from 4 Scalars used as x, y, z, t)
240 */
241 template<class Foreign4Vector>
242 void
246 Foreign4Vector& v4 ) const {
247 v1 = Foreign4Vector ( fM[kXX], fM[kYX], fM[kZX], fM[kTX] );
248 v2 = Foreign4Vector ( fM[kXY], fM[kYY], fM[kZY], fM[kTY] );
249 v3 = Foreign4Vector ( fM[kXZ], fM[kYZ], fM[kZZ], fM[kTZ] );
250 v4 = Foreign4Vector ( fM[kXT], fM[kYT], fM[kZT], fM[kTT] );
251 }
252
253 /**
254 Set the 16 matrix components given an iterator to the start of
255 the desired data, and another to the end (16 past start).
256 */
257 template<class IT>
258 void SetComponents(IT begin, IT end) {
259 for (int i = 0; i <16; ++i) {
260 fM[i] = *begin;
261 ++begin;
262 }
263 (void)end;
264 assert (end==begin);
265 }
266
267 /**
268 Get the 16 matrix components into data specified by an iterator begin
269 and another to the end of the desired data (16 past start).
270 */
271 template<class IT>
272 void GetComponents(IT begin, IT end) const {
273 for (int i = 0; i <16; ++i) {
274 *begin = fM[i];
275 ++begin;
276 }
277 (void)end;
278 assert (end==begin);
279 }
280
281 /**
282 Get the 16 matrix components into data specified by an iterator begin
283 */
284 template<class IT>
285 void GetComponents(IT begin) const {
286 std::copy ( fM+0, fM+16, begin );
287 }
288
289 /**
290 Set components from a linear algebra matrix of size at least 4x4,
291 which must support operator()(i,j) to obtain elements (0,0) thru (3,3).
292 Precondition: The matrix is assumed to be orthosymplectic. NO checking
293 or re-adjusting is performed.
294 */
295 template<class ForeignMatrix>
296 void
298 fM[kXX]=m(0,0); fM[kXY]=m(0,1); fM[kXZ]=m(0,2); fM[kXT]=m(0,3);
299 fM[kYX]=m(1,0); fM[kYY]=m(1,1); fM[kYZ]=m(1,2); fM[kYT]=m(1,3);
300 fM[kZX]=m(2,0); fM[kZY]=m(2,1); fM[kZZ]=m(2,2); fM[kZT]=m(2,3);
301 fM[kTX]=m(3,0); fM[kTY]=m(3,1); fM[kTZ]=m(3,2); fM[kTT]=m(3,3);
302 }
303
304 /**
305 Get components into a linear algebra matrix of size at least 4x4,
306 which must support operator()(i,j) for write access to elements
307 (0,0) thru (3,3).
308 */
309 template<class ForeignMatrix>
310 void
312 m(0,0)=fM[kXX]; m(0,1)=fM[kXY]; m(0,2)=fM[kXZ]; m(0,3)=fM[kXT];
313 m(1,0)=fM[kYX]; m(1,1)=fM[kYY]; m(1,2)=fM[kYZ]; m(1,3)=fM[kYT];
314 m(2,0)=fM[kZX]; m(2,1)=fM[kZY]; m(2,2)=fM[kZZ]; m(2,3)=fM[kZT];
315 m(3,0)=fM[kTX]; m(3,1)=fM[kTY]; m(3,2)=fM[kTZ]; m(3,3)=fM[kTT];
316 }
317
318 /**
319 Set the components from sixteen scalars -- UNCHECKED for orthosymplectic
320 */
321 void
326 fM[kXX]=xx; fM[kXY]=xy; fM[kXZ]=xz; fM[kXT]=xt;
327 fM[kYX]=yx; fM[kYY]=yy; fM[kYZ]=yz; fM[kYT]=yt;
328 fM[kZX]=zx; fM[kZY]=zy; fM[kZZ]=zz; fM[kZT]=zt;
329 fM[kTX]=tx; fM[kTY]=ty; fM[kTZ]=tz; fM[kTT]=tt;
330 }
331
332 /**
333 Get the sixteen components into sixteen scalars
334 */
335 void
337 Scalar &yx, Scalar &yy, Scalar &yz, Scalar &yt,
339 Scalar &tx, Scalar &ty, Scalar &tz, Scalar &tt) const {
340 xx=fM[kXX]; xy=fM[kXY]; xz=fM[kXZ]; xt=fM[kXT];
341 yx=fM[kYX]; yy=fM[kYY]; yz=fM[kYZ]; yt=fM[kYT];
342 zx=fM[kZX]; zy=fM[kZY]; zz=fM[kZZ]; zt=fM[kZT];
343 tx=fM[kTX]; ty=fM[kTY]; tz=fM[kTZ]; tt=fM[kTT];
344 }
345
346 // =========== operations ==============
347
348 /**
349 Lorentz transformation operation on a Minkowski ('Cartesian')
350 LorentzVector
351 */
354 Scalar x = v.Px();
355 Scalar y = v.Py();
356 Scalar z = v.Pz();
357 Scalar t = v.E();
359 ( fM[kXX]*x + fM[kXY]*y + fM[kXZ]*z + fM[kXT]*t
360 , fM[kYX]*x + fM[kYY]*y + fM[kYZ]*z + fM[kYT]*t
361 , fM[kZX]*x + fM[kZY]*y + fM[kZZ]*z + fM[kZT]*t
362 , fM[kTX]*x + fM[kTY]*y + fM[kTZ]*z + fM[kTT]*t );
363 }
364
365 /**
366 Lorentz transformation operation on a LorentzVector in any
367 coordinate system
368 */
369 template <class CoordSystem>
376
377 /**
378 Lorentz transformation operation on an arbitrary 4-vector v.
379 Preconditions: v must implement methods x(), y(), z(), and t()
380 and the arbitrary vector type must have a constructor taking (x,y,z,t)
381 */
382 template <class Foreign4Vector>
389
390 /**
391 Overload operator * for rotation on a vector
392 */
393 template <class A4Vector>
394 inline
396 {
397 return operator()(v);
398 }
399
400 /**
401 Invert a Lorentz rotation in place
402 */
403 void Invert();
404
405 /**
406 Return inverse of a rotation
407 */
408 LorentzRotation Inverse() const;
409
410 // ========= Multi-Rotation Operations ===============
411
412 /**
413 Multiply (combine) this Lorentz rotation by another LorentzRotation
414 */
416
417 //#ifdef TODO_LATER
418 /**
419 Multiply (combine) this Lorentz rotation by a pure Lorentz boost
420 */
421 //TODO: implement directly in a more efficient way. Now are implemented
422 // going through another LorentzRotation
423 LorentzRotation operator * (const Boost & b) const { LorentzRotation tmp(b); return (*this)*tmp; }
424 LorentzRotation operator * (const BoostX & b) const { LorentzRotation tmp(b); return (*this)*tmp; }
425 LorentzRotation operator * (const BoostY & b) const { LorentzRotation tmp(b); return (*this)*tmp; }
426 LorentzRotation operator * (const BoostZ & b) const { LorentzRotation tmp(b); return (*this)*tmp; }
427
428 /**
429 Multiply (combine) this Lorentz rotation by a 3-D Rotation
430 */
431 LorentzRotation operator * (const Rotation3D & r) const { LorentzRotation tmp(r); return (*this)*tmp; }
432 LorentzRotation operator * (const AxisAngle & a) const { LorentzRotation tmp(a); return (*this)*tmp; }
433 LorentzRotation operator * (const EulerAngles & e) const { LorentzRotation tmp(e); return (*this)*tmp; }
434 LorentzRotation operator * (const Quaternion & q) const { LorentzRotation tmp(q); return (*this)*tmp; }
435 LorentzRotation operator * (const RotationX & rx) const { LorentzRotation tmp(rx); return (*this)*tmp; }
436 LorentzRotation operator * (const RotationY & ry) const { LorentzRotation tmp(ry); return (*this)*tmp; }
437 LorentzRotation operator * (const RotationZ & rz) const { LorentzRotation tmp(rz); return (*this)*tmp; }
438 //#endif
439
440 /**
441 Post-Multiply (on right) by another LorentzRotation, Boost, or
442 rotation : T = T*R
443 */
444 template <class R>
445 LorentzRotation & operator *= (const R & r) { return *this = (*this)*r; }
446
447 /**
448 Equality/inequality operators
449 */
450 bool operator == (const LorentzRotation & rhs) const {
451 for (unsigned int i=0; i < 16; ++i) {
452 if( fM[i] != rhs.fM[i] ) return false;
453 }
454 return true;
455 }
456 bool operator != (const LorentzRotation & rhs) const {
457 return ! operator==(rhs);
458 }
459
460private:
461
463
464}; // LorentzRotation
465
466// ============ Class LorentzRotation ends here ============
467
468
469/**
470 Stream Output and Input
471 */
472 // TODO - I/O should be put in the manipulator form
473
474std::ostream & operator<< (std::ostream & os, const LorentzRotation & r);
475
476// ============================================ vetted to here ============
477
478#ifdef NOTYET
479/**
480 Distance between two Lorentz rotations
481 */
482template <class R>
483inline
484typename Rotation3D::Scalar
485Distance ( const Rotation3D& r1, const R & r2) {return gv_detail::dist(r1,r2);}
486#endif
487
488} //namespace Math
489} //namespace ROOT
490
491
492
493
494
495
496
497#endif /* ROOT_Math_GenVector_LorentzRotation */
#define b(i)
Definition RSha256.hxx:100
#define a(i)
Definition RSha256.hxx:99
#define e(i)
Definition RSha256.hxx:103
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t r
Option_t Option_t TPoint xy
float * q
AxisAngle class describing rotation represented with direction axis (3D Vector) and an angle of rotat...
Definition AxisAngle.h:42
Class representing a Lorentz Boost along the X axis, by beta.
Definition BoostX.h:39
Class representing a Lorentz Boost along the Y axis, by beta.
Definition BoostY.h:39
Class representing a Lorentz Boost along the Z axis, by beta.
Definition BoostZ.h:39
Lorentz boost class with the (4D) transformation represented internally by a 4x4 orthosymplectic matr...
Definition Boost.h:47
EulerAngles class describing rotation as three angles (Euler Angles).
Definition EulerAngles.h:45
Lorentz transformation class with the (4D) transformation represented by a 4x4 orthosymplectic matrix...
A4Vector operator*(const A4Vector &v) const
Overload operator * for rotation on a vector.
LorentzRotation(IT begin, IT end)
Construct given a pair of pointers or iterators defining the beginning and end of an array of sixteen...
LorentzRotation & operator=(BoostY const &b)
void GetComponents(Scalar &xx, Scalar &xy, Scalar &xz, Scalar &xt, Scalar &yx, Scalar &yy, Scalar &yz, Scalar &yt, Scalar &zx, Scalar &zy, Scalar &zz, Scalar &zt, Scalar &tx, Scalar &ty, Scalar &tz, Scalar &tt) const
Get the sixteen components into sixteen scalars.
LorentzRotation(const Foreign4Vector &v1, const Foreign4Vector &v2, const Foreign4Vector &v3, const Foreign4Vector &v4)
Construct from four orthosymplectic vectors (which must have methods x(), y(), z() and t()) which wil...
LorentzVector< ROOT::Math::PxPyPzE4D< double > > operator()(const LorentzVector< ROOT::Math::PxPyPzE4D< double > > &v) const
Lorentz transformation operation on a Minkowski ('Cartesian') LorentzVector.
LorentzRotation & operator=(BoostX const &b)
LorentzRotation(BoostY const &by)
LorentzRotation Inverse() const
Return inverse of a rotation.
void GetRotationMatrix(ForeignMatrix &m) const
Get components into a linear algebra matrix of size at least 4x4, which must support operator()(i,...
void Rectify()
Re-adjust components to eliminate small deviations from a perfect orthosyplectic matrix.
LorentzRotation & operator=(RotationY const &r)
bool operator!=(const LorentzRotation &rhs) const
LorentzRotation & operator=(Boost const &b)
Assign from a pure boost.
bool operator==(const LorentzRotation &rhs) const
Equality/inequality operators.
constexpr LorentzRotation(const ForeignMatrix &m)
Construct from a linear algebra matrix of size at least 4x4, which must support operator()(i,...
LorentzRotation(BoostX const &bx)
LorentzRotation & operator=(Rotation3D const &r)
Assign from a 3-D rotation.
void GetComponents(Foreign4Vector &v1, Foreign4Vector &v2, Foreign4Vector &v3, Foreign4Vector &v4) const
Get components into four 4-vectors which will be the (orthosymplectic) columns of the rotation matrix...
LorentzRotation & operator=(AxisAngle const &a)
LorentzRotation(Boost const &b)
Construct from a pure boost.
LorentzRotation(BoostZ const &bz)
LorentzRotation & operator=(RotationZ const &r)
LorentzRotation(LorentzRotation const &r)
Copy constructor.
void GetComponents(IT begin) const
Get the 16 matrix components into data specified by an iterator begin.
void SetRotationMatrix(const ForeignMatrix &m)
Set components from a linear algebra matrix of size at least 4x4, which must support operator()(i,...
LorentzRotation(Scalar xx, Scalar xy, Scalar xz, Scalar xt, Scalar yx, Scalar yy, Scalar yz, Scalar yt, Scalar zx, Scalar zy, Scalar zz, Scalar zt, Scalar tx, Scalar ty, Scalar tz, Scalar tt)
Raw constructor from sixteen Scalar components (without any checking)
LorentzRotation & operator=(Quaternion const &q)
LorentzRotation & operator=(LorentzRotation const &rhs)
Assign from another LorentzRotation.
LorentzRotation & operator=(EulerAngles const &e)
LorentzRotation & operator=(BoostZ const &b)
void Invert()
Invert a Lorentz rotation in place.
LorentzRotation & operator=(const ForeignMatrix &m)
Assign from a linear algebra matrix of size at least 4x4, which must support operator()(i,...
LorentzRotation & operator*=(const R &r)
Post-Multiply (on right) by another LorentzRotation, Boost, or rotation : T = T*R.
void GetComponents(IT begin, IT end) const
Get the 16 matrix components into data specified by an iterator begin and another to the end of the d...
void SetComponents(IT begin, IT end)
Set the 16 matrix components given an iterator to the start of the desired data, and another to the e...
void SetComponents(Scalar xx, Scalar xy, Scalar xz, Scalar xt, Scalar yx, Scalar yy, Scalar yz, Scalar yt, Scalar zx, Scalar zy, Scalar zz, Scalar zt, Scalar tx, Scalar ty, Scalar tz, Scalar tt)
Set the components from sixteen scalars – UNCHECKED for orthosymplectic.
void SetComponents(const Foreign4Vector &v1, const Foreign4Vector &v2, const Foreign4Vector &v3, const Foreign4Vector &v4)
Set components from four orthosymplectic vectors (which must have methods x(), y(),...
LorentzRotation()
Default constructor (identity transformation)
LorentzRotation & operator=(RotationX const &r)
Class describing a generic LorentzVector in the 4D space-time, using the specified coordinate system ...
Class describing a 4D cartesian coordinate system (x, y, z, t coordinates) or momentum-energy vectors...
Definition PxPyPzE4D.h:44
Rotation class with the (3D) rotation represented by a unit quaternion (u, i, j, k).
Definition Quaternion.h:49
Rotation class with the (3D) rotation represented by a 3x3 orthogonal matrix.
Definition Rotation3D.h:67
Rotation class representing a 3D rotation about the X axis by the angle of rotation.
Definition RotationX.h:45
Rotation class representing a 3D rotation about the Y axis by the angle of rotation.
Definition RotationY.h:45
Rotation class representing a 3D rotation about the Z axis by the angle of rotation.
Definition RotationZ.h:45
Double_t y[n]
Definition legend1.C:17
Double_t x[n]
Definition legend1.C:17
Namespace for new Math classes and functions.
double dist(Rotation3D const &r1, Rotation3D const &r2)
std::ostream & operator<<(std::ostream &os, const AxisAngle &a)
Stream Output and Input.
Definition AxisAngle.cxx:91
AxisAngle::Scalar Distance(const AxisAngle &r1, const R &r2)
Distance between two rotations.
Definition AxisAngle.h:321
tbb::task_arena is an alias of tbb::interface7::task_arena, which doesn't allow to forward declare tb...
TMarker m
Definition textangle.C:8
auto * tt
Definition textangle.C:16