#ifndef ROOT_Math_GenVector_BoostZ
#define ROOT_Math_GenVector_BoostZ 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 BoostZ {
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
};
BoostZ();
explicit BoostZ(Scalar beta_z) { SetComponents(beta_z); }
void Rectify();
void
SetComponents (Scalar beta_z);
void
GetComponents (Scalar& beta_z) 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();
BoostZ Inverse() const;
bool operator == (const BoostZ & rhs) const {
if( fBeta != rhs.fBeta ) return false;
if( fGamma != rhs.fGamma ) return false;
return true;
}
bool operator != (const BoostZ & rhs) const {
return ! operator==(rhs);
}
private:
Scalar fBeta;
Scalar fGamma;
};
std::ostream & operator<< (std::ostream & os, const BoostZ & b);
}
}
#endif /* ROOT_Math_GenVector_BoostZ */