18 #ifndef ROOT_Math_GenVector_PxPyPzE4D
19 #define ROOT_Math_GenVector_PxPyPzE4D 1
41 template <
class ScalarType =
double>
46 typedef ScalarType Scalar;
53 PxPyPzE4D() : fX(0.0), fY(0.0), fZ(0.0), fT(0.0) { }
59 PxPyPzE4D(Scalar px, Scalar py, Scalar pz, Scalar e) :
60 fX(px), fY(py), fZ(pz), fT(e) { }
67 template <
class CoordSystem>
68 explicit PxPyPzE4D(
const CoordSystem & v) :
69 fX( v.x() ), fY( v.y() ), fZ( v.z() ), fT( v.t() ) { }
76 PxPyPzE4D(
const PxPyPzE4D & v) :
77 fX(v.fX), fY(v.fY), fZ(v.fZ), fT(v.fT) { }
82 PxPyPzE4D & operator = (
const PxPyPzE4D & v) {
93 void SetCoordinates(
const Scalar src[] )
94 { fX=src[0]; fY=src[1]; fZ=src[2]; fT=src[3]; }
99 void GetCoordinates( Scalar dest[] )
const
100 { dest[0] = fX; dest[1] = fY; dest[2] = fZ; dest[3] = fT; }
105 void SetCoordinates(Scalar px, Scalar py, Scalar pz, Scalar e)
106 { fX=px; fY=py; fZ=pz; fT=e;}
111 void GetCoordinates(Scalar& px, Scalar& py, Scalar& pz, Scalar& e)
const
112 { px=fX; py=fY; pz=fZ; e=fT;}
118 Scalar Px()
const {
return fX;}
119 Scalar Py()
const {
return fY;}
120 Scalar Pz()
const {
return fZ;}
121 Scalar E()
const {
return fT;}
123 Scalar X()
const {
return fX;}
124 Scalar Y()
const {
return fY;}
125 Scalar Z()
const {
return fZ;}
126 Scalar T()
const {
return fT;}
133 Scalar P2()
const {
return fX*fX + fY*fY + fZ*fZ; }
138 Scalar P()
const {
return sqrt(P2()); }
139 Scalar R()
const {
return P(); }
144 Scalar M2()
const {
return fT*fT - fX*fX - fY*fY - fZ*fZ;}
145 Scalar Mag2()
const {
return M2(); }
152 const Scalar mm = M2();
156 GenVector::Throw (
"PxPyPzE4D::M() - Tachyonic:\n"
157 " P^2 > E^2 so the mass would be imaginary");
161 Scalar Mag()
const {
return M(); }
166 Scalar Pt2()
const {
return fX*fX + fY*fY;}
167 Scalar Perp2()
const {
return Pt2();}
172 Scalar Pt()
const {
return sqrt(Perp2()); }
173 Scalar Perp()
const {
return Pt();}
174 Scalar Rho()
const {
return Pt();}
179 Scalar Mt2()
const {
return fT*fT - fZ*fZ; }
185 const Scalar mm = Mt2();
189 GenVector::Throw (
"PxPyPzE4D::Mt() - Tachyonic:\n"
190 " Pz^2 > E^2 so the transverse mass would be imaginary");
201 return pt2 == 0 ? 0 : fT*fT * pt2/( pt2 + fZ*fZ );
208 const Scalar etet = Et2();
209 return fT < 0.0 ? -sqrt(etet) : sqrt(etet);
215 Scalar Phi()
const {
return (fX == 0.0 && fY == 0.0) ? 0 : atan2(fY, fX); }
220 Scalar Theta()
const {
return (fX == 0.0 && fY == 0.0 && fZ == 0.0) ? 0 : atan2(Pt(), fZ); }
226 return Impl::Eta_FromRhoZ ( Pt(), fZ);
235 void SetPx( Scalar px) {
241 void SetPy( Scalar py) {
247 void SetPz( Scalar pz) {
253 void SetE( Scalar e) {
260 void SetPxPyPzE(Scalar px, Scalar py, Scalar pz, Scalar e) {
274 void Negate( ) { fX = -fX; fY = -fY; fZ = -fZ; fT = -fT;}
279 void Scale(
const Scalar & a) {
290 template <
class AnyCoordSystem>
291 PxPyPzE4D & operator = (
const AnyCoordSystem & v) {
302 bool operator == (
const PxPyPzE4D & rhs)
const {
303 return fX == rhs.fX && fY == rhs.fY && fZ == rhs.fZ && fT == rhs.fT;
305 bool operator != (
const PxPyPzE4D & rhs)
const {
return !(operator==(rhs));}
312 Scalar x()
const {
return fX; }
313 Scalar y()
const {
return fY; }
314 Scalar z()
const {
return fZ; }
315 Scalar t()
const {
return fT; }
319 #if defined(__MAKECINT__) || defined(G__DICTIONARY)
323 void SetPt(Scalar pt);
325 void SetEta(Scalar eta);
327 void SetPhi(Scalar phi);
351 #if defined(__MAKECINT__) || defined(G__DICTIONARY)
365 template <
class ScalarType>
366 void PxPyPzE4D<ScalarType>::SetPt(Scalar pt) {
367 GenVector_exception e(
"PxPyPzE4D::SetPt() is not supposed to be called");
369 PtEtaPhiE4D<Scalar> v(*
this); v.SetPt(pt); *
this = PxPyPzE4D<Scalar>(v);
371 template <
class ScalarType>
372 void PxPyPzE4D<ScalarType>::SetEta(Scalar eta) {
373 GenVector_exception e(
"PxPyPzE4D::SetEta() is not supposed to be called");
375 PtEtaPhiE4D<Scalar> v(*
this); v.SetEta(eta); *
this = PxPyPzE4D<Scalar>(v);
377 template <
class ScalarType>
378 void PxPyPzE4D<ScalarType>::SetPhi(Scalar phi) {
379 GenVector_exception e(
"PxPyPzE4D::SetPhi() is not supposed to be called");
381 PtEtaPhiE4D<Scalar> v(*
this); v.SetPhi(phi); *
this = PxPyPzE4D<Scalar>(v);
384 template <
class ScalarType>
385 void PxPyPzE4D<ScalarType>::SetM(Scalar m) {
386 GenVector_exception e(
"PxPyPzE4D::SetM() is not supposed to be called");
388 PtEtaPhiM4D<Scalar> v(*
this); v.SetM(m);
389 *
this = PxPyPzE4D<Scalar>(v);
397 #endif // endif __MAKE__CINT || G__DICTIONARY
400 #endif // ROOT_Math_GenVector_PxPyPzE4D