ROOT logo
// @(#)root/mathcore:$Id: BoostX.h 22516 2008-03-07 15:14:26Z moneta $
// Authors: W. Brown, M. Fischler, L. Moneta    2005  

 /**********************************************************************
  *                                                                    *
  * Copyright (c) 2005 ROOT FNAL MathLib Team                          *
  *                                                                    *
  *                                                                    *
  **********************************************************************/

// Header file for BoostX
// 
// Created by: Mark Fischler  Mon Nov 1  2005
// 
// Last update: $Id: BoostX.h 22516 2008-03-07 15:14:26Z moneta $
// 
#ifndef ROOT_Math_GenVector_BoostX
#define ROOT_Math_GenVector_BoostX 1

#include "Math/GenVector/LorentzVector.h"
#include "Math/GenVector/PxPyPzE4D.h"
#include "Math/GenVector/DisplacementVector3D.h"
#include "Math/GenVector/Cartesian3D.h"

namespace ROOT {

namespace Math {

//__________________________________________________________________________________________
   /**
      Class representing a Lorentz Boost along the X axis, by beta. 
      For efficiency, gamma is held as well. 

      @ingroup GenVector      
   */

class BoostX {

public:

   typedef double Scalar;

   enum ELorentzRotationMatrixIndex {
      kLXX =  0, kLXY =  1, kLXZ =  2, kLXT =  3
    , kLYX =  4, kLYY =  5, kLYZ =  6, kLYT =  7
    , kLZX =  8, kLZY =  9, kLZZ = 10, kLZT = 11
    , kLTX = 12, kLTY = 13, kLTZ = 14, kLTT = 15
   };

   enum EBoostMatrixIndex {
      kXX =  0, kXY =  1, kXZ =  2, kXT =  3
    	      , kYY =  4, kYZ =  5, kYT =  6
    		        , kZZ =  7, kZT =  8
    			          , kTT =  9
   };

  // ========== Constructors and Assignment =====================

  /**
      Default constructor (identity transformation)
  */
   BoostX();

   /**
      Construct given a Scalar beta_x
   */
   explicit BoostX(Scalar beta_x) { SetComponents(beta_x); }


   // The compiler-generated copy ctor, copy assignment, and dtor are OK.

   /**
      Re-adjust components to eliminate small deviations from a perfect
      orthosyplectic matrix.
   */
   void Rectify();

   // ======== Components ==============

   /**
      Set components from a Scalar beta_x
   */
   void
   SetComponents (Scalar beta_x);

   /**
      Get components into a Scalar beta_x
   */
   void
   GetComponents (Scalar& beta_x) const;


   /** 
       Retrieve the beta of the Boost 
   */ 
   Scalar Beta() const { return fBeta; }

   /** 
       Retrieve the gamma of the Boost 
   */ 
   Scalar Gamma() const { return fGamma; }

   /** 
       Set the given beta of the Boost 
   */ 
   void  SetBeta(Scalar beta) { SetComponents(beta); }
   
   /**
      The beta vector for this boost
   */
   typedef  DisplacementVector3D<Cartesian3D<double>, DefaultCoordinateSystemTag > XYZVector; 
   XYZVector BetaVector() const;

   /**
      Get elements of internal 4x4 symmetric representation, into a data
      array suitable for direct use as the components of a LorentzRotation
      Note -- 16 Scalars will be written into the array; if the array is not
      that large, then this will lead to undefined behavior.
   */
   void 
   GetLorentzRotation (Scalar r[]) const; 
  
   // =========== operations ==============

   /**
      Lorentz transformation operation on a Minkowski ('Cartesian') 
      LorentzVector
   */
   LorentzVector< ROOT::Math::PxPyPzE4D<double> >
   operator() (const LorentzVector< ROOT::Math::PxPyPzE4D<double> > & v) const;
  
   /**
      Lorentz transformation operation on a LorentzVector in any 
      coordinate system
   */
   template <class CoordSystem>
   LorentzVector<CoordSystem>
   operator() (const LorentzVector<CoordSystem> & v) const {
      LorentzVector< PxPyPzE4D<double> > xyzt(v);
      LorentzVector< PxPyPzE4D<double> > r_xyzt = operator()(xyzt);
      return LorentzVector<CoordSystem> ( r_xyzt );
   }

   /**
      Lorentz transformation operation on an arbitrary 4-vector v.
      Preconditions:  v must implement methods x(), y(), z(), and t()
      and the arbitrary vector type must have a constructor taking (x,y,z,t)
   */
   template <class Foreign4Vector>
   Foreign4Vector
   operator() (const Foreign4Vector & v) const {
      LorentzVector< PxPyPzE4D<double> > xyzt(v);
      LorentzVector< PxPyPzE4D<double> > r_xyzt = operator()(xyzt);
      return Foreign4Vector ( r_xyzt.X(), r_xyzt.Y(), r_xyzt.Z(), r_xyzt.T() );
   }

   /**
      Overload operator * for operation on a vector
   */
   template <class A4Vector>
   inline
   A4Vector operator* (const A4Vector & v) const
   {
      return operator()(v);
   }

   /**
      Invert a BoostX in place
   */
   void Invert();

   /**
      Return inverse of  a boost
   */
   BoostX Inverse() const;

   /**
      Equality/inequality operators
   */
   bool operator == (const BoostX & rhs) const {
      if( fBeta  != rhs.fBeta  )  return false;
      if( fGamma != rhs.fGamma )  return false;
      return true;
   }

   bool operator != (const BoostX & rhs) const {
      return ! operator==(rhs);
   }

private:

   Scalar fBeta;    // boost beta X
   Scalar fGamma;   // boost gamma

};  // BoostX

// ============ Class BoostX ends here ============


/**
   Stream Output and Input
*/
// TODO - I/O should be put in the manipulator form 

std::ostream & operator<< (std::ostream & os, const BoostX & b);


} //namespace Math
} //namespace ROOT







#endif /* ROOT_Math_GenVector_BoostX  */
 BoostX.h:1
 BoostX.h:2
 BoostX.h:3
 BoostX.h:4
 BoostX.h:5
 BoostX.h:6
 BoostX.h:7
 BoostX.h:8
 BoostX.h:9
 BoostX.h:10
 BoostX.h:11
 BoostX.h:12
 BoostX.h:13
 BoostX.h:14
 BoostX.h:15
 BoostX.h:16
 BoostX.h:17
 BoostX.h:18
 BoostX.h:19
 BoostX.h:20
 BoostX.h:21
 BoostX.h:22
 BoostX.h:23
 BoostX.h:24
 BoostX.h:25
 BoostX.h:26
 BoostX.h:27
 BoostX.h:28
 BoostX.h:29
 BoostX.h:30
 BoostX.h:31
 BoostX.h:32
 BoostX.h:33
 BoostX.h:34
 BoostX.h:35
 BoostX.h:36
 BoostX.h:37
 BoostX.h:38
 BoostX.h:39
 BoostX.h:40
 BoostX.h:41
 BoostX.h:42
 BoostX.h:43
 BoostX.h:44
 BoostX.h:45
 BoostX.h:46
 BoostX.h:47
 BoostX.h:48
 BoostX.h:49
 BoostX.h:50
 BoostX.h:51
 BoostX.h:52
 BoostX.h:53
 BoostX.h:54
 BoostX.h:55
 BoostX.h:56
 BoostX.h:57
 BoostX.h:58
 BoostX.h:59
 BoostX.h:60
 BoostX.h:61
 BoostX.h:62
 BoostX.h:63
 BoostX.h:64
 BoostX.h:65
 BoostX.h:66
 BoostX.h:67
 BoostX.h:68
 BoostX.h:69
 BoostX.h:70
 BoostX.h:71
 BoostX.h:72
 BoostX.h:73
 BoostX.h:74
 BoostX.h:75
 BoostX.h:76
 BoostX.h:77
 BoostX.h:78
 BoostX.h:79
 BoostX.h:80
 BoostX.h:81
 BoostX.h:82
 BoostX.h:83
 BoostX.h:84
 BoostX.h:85
 BoostX.h:86
 BoostX.h:87
 BoostX.h:88
 BoostX.h:89
 BoostX.h:90
 BoostX.h:91
 BoostX.h:92
 BoostX.h:93
 BoostX.h:94
 BoostX.h:95
 BoostX.h:96
 BoostX.h:97
 BoostX.h:98
 BoostX.h:99
 BoostX.h:100
 BoostX.h:101
 BoostX.h:102
 BoostX.h:103
 BoostX.h:104
 BoostX.h:105
 BoostX.h:106
 BoostX.h:107
 BoostX.h:108
 BoostX.h:109
 BoostX.h:110
 BoostX.h:111
 BoostX.h:112
 BoostX.h:113
 BoostX.h:114
 BoostX.h:115
 BoostX.h:116
 BoostX.h:117
 BoostX.h:118
 BoostX.h:119
 BoostX.h:120
 BoostX.h:121
 BoostX.h:122
 BoostX.h:123
 BoostX.h:124
 BoostX.h:125
 BoostX.h:126
 BoostX.h:127
 BoostX.h:128
 BoostX.h:129
 BoostX.h:130
 BoostX.h:131
 BoostX.h:132
 BoostX.h:133
 BoostX.h:134
 BoostX.h:135
 BoostX.h:136
 BoostX.h:137
 BoostX.h:138
 BoostX.h:139
 BoostX.h:140
 BoostX.h:141
 BoostX.h:142
 BoostX.h:143
 BoostX.h:144
 BoostX.h:145
 BoostX.h:146
 BoostX.h:147
 BoostX.h:148
 BoostX.h:149
 BoostX.h:150
 BoostX.h:151
 BoostX.h:152
 BoostX.h:153
 BoostX.h:154
 BoostX.h:155
 BoostX.h:156
 BoostX.h:157
 BoostX.h:158
 BoostX.h:159
 BoostX.h:160
 BoostX.h:161
 BoostX.h:162
 BoostX.h:163
 BoostX.h:164
 BoostX.h:165
 BoostX.h:166
 BoostX.h:167
 BoostX.h:168
 BoostX.h:169
 BoostX.h:170
 BoostX.h:171
 BoostX.h:172
 BoostX.h:173
 BoostX.h:174
 BoostX.h:175
 BoostX.h:176
 BoostX.h:177
 BoostX.h:178
 BoostX.h:179
 BoostX.h:180
 BoostX.h:181
 BoostX.h:182
 BoostX.h:183
 BoostX.h:184
 BoostX.h:185
 BoostX.h:186
 BoostX.h:187
 BoostX.h:188
 BoostX.h:189
 BoostX.h:190
 BoostX.h:191
 BoostX.h:192
 BoostX.h:193
 BoostX.h:194
 BoostX.h:195
 BoostX.h:196
 BoostX.h:197
 BoostX.h:198
 BoostX.h:199
 BoostX.h:200
 BoostX.h:201
 BoostX.h:202
 BoostX.h:203
 BoostX.h:204
 BoostX.h:205
 BoostX.h:206
 BoostX.h:207
 BoostX.h:208
 BoostX.h:209
 BoostX.h:210
 BoostX.h:211
 BoostX.h:212
 BoostX.h:213
 BoostX.h:214
 BoostX.h:215
 BoostX.h:216
 BoostX.h:217