#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 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
   };
  
  
   BoostX();
   
   explicit BoostX(Scalar beta_x) { SetComponents(beta_x); }
   
   
   void Rectify();
   
   
   void
   SetComponents (Scalar beta_x);
   
   void
   GetComponents (Scalar& beta_x) const;
    
   Scalar Beta() const { return fBeta; }
    
   Scalar Gamma() const { return fGamma; }
    
   void  SetBeta(Scalar beta) { SetComponents(beta); }
   
   
   typedef  DisplacementVector3D<Cartesian3D<double>, DefaultCoordinateSystemTag > XYZVector; 
   XYZVector BetaVector() const;
   
   void 
   GetLorentzRotation (Scalar r[]) const; 
  
   
   
   LorentzVector< ROOT::Math::PxPyPzE4D<double> >
   operator() (const LorentzVector< ROOT::Math::PxPyPzE4D<double> > & v) const;
  
   
   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 );
   }
   
   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() );
   }
   
   template <class A4Vector>
   inline
   A4Vector operator* (const A4Vector & v) const
   {
      return operator()(v);
   }
   
   void Invert();
   
   BoostX Inverse() const;
   
   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;    
   Scalar fGamma;   
};  
std::ostream & operator<< (std::ostream & os, const BoostX & b);
} 
} 
#endif /* ROOT_Math_GenVector_BoostX  */
Last update: Thu Jan 17 08:41:19 2008
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.