18 #ifndef ROOT_Math_GenVector_LorentzVector 19 #define ROOT_Math_GenVector_LorentzVector 1 21 #ifndef ROOT_Math_GenVector_PxPyPzE4D 25 #ifndef ROOT_Math_GenVector_DisplacementVector3D 29 #ifndef ROOT_Math_GenVector_GenVectorIO 53 template<
class CoordSystem >
87 template<
class Coords >
95 template<
class ForeignLorentzVector>
108 template<
class LAVector >
110 fCoordinates = CoordSystem ( v[index0], v[index0+1], v[index0+2], v[index0+3] );
120 template<
class OtherCoords >
130 template<
class ForeignLorentzVector>
132 SetXYZT( v.x(), v.y(), v.z(), v.t() );
145 template<
class LAVector >
146 LorentzVector & AssignFrom(
const LAVector & v,
size_t index0=0 ) {
147 fCoordinates.SetCoordinates( v[index0], v[index0+1], v[index0+2], v[index0+3] );
191 IT
a = begin; IT
b = ++begin; IT
c = ++begin; IT d = ++begin;
192 assert (++begin==end);
218 { IT
a = begin; IT
b = ++begin; IT
c = ++begin; IT d = ++begin;
219 assert (++begin==end);
305 Scalar
P2()
const {
return P() *
P(); }
362 return ::ROOT::Math::DisplacementVector3D<Cartesian3D<Scalar> >(
X(),
Y(),
Z() );
376 template<
class OtherLorentzVector >
377 Scalar
Dot(
const OtherLorentzVector &
q)
const {
378 return t()*q.t() -
x()*q.x() -
y()*q.y() -
z()*q.z();
387 template<
class OtherLorentzVector >
390 SetXYZT(
x() + q.x(),
y() + q.y(),
z() + q.z(),
t() + q.t() );
400 template<
class OtherLorentzVector >
402 SetXYZT(
x() - q.x(),
y() - q.y(),
z() - q.z(),
t() - q.t() );
413 template<
class OtherLorentzVector>
428 template<
class OtherLorentzVector>
499 return .5f*
std::log( (ee+ppz)/(ee-ppz) );
510 return .5f*
std::log( (ee+pp)/(ee-pp) );
517 Scalar ee =
E(); Scalar pp =
P();
return ee*ee > pp*pp;
525 Scalar ee =
E(); Scalar pp =
P(); Scalar delta = ee-pp;
526 if ( ee==0 )
return pp==0;
527 return delta*delta < tolerance * ee*ee;
534 Scalar ee =
E(); Scalar pp =
P();
return ee*ee < pp*pp;
564 template <
class Other4Vector>
566 Scalar eSum =
E() + v.E();
569 if (vecSum.
Mag2() == 0) {
593 GenVector::Throw (
"LorentzVector::Beta() - beta computed for LorentzVector with t = 0. Return an Infinite result");
598 GenVector::Throw (
"LorentzVector::Beta() - beta computed for non-timelike LorentzVector . Result is physically meaningless" );
612 GenVector::Throw (
"LorentzVector::Gamma() - gamma computed for LorentzVector with t = 0. Return a zero result");
617 GenVector::Throw (
"LorentzVector::Gamma() - gamma computed for a spacelike LorentzVector. Imaginary result");
620 else if ( t2 == v2 ) {
621 GenVector::Throw (
"LorentzVector::Gamma() - gamma computed for a lightlike LorentzVector. Infinite result");
687 template<
class CoordSystem >
698 template<
class char_t,
class traits_t,
class Coords >
700 std::basic_ostream<char_t,traits_t> &
701 operator << ( std::basic_ostream<char_t,traits_t> & os
708 v.GetCoordinates(a, b, c, d);
727 template<
class char_t,
class traits_t,
class Coords >
729 std::basic_istream<char_t,traits_t> &
Scalar E() const
return 4-th component (time, or energy for a 4-momentum vector)
Class describing a generic LorentzVector in the 4D space-time, using the specified coordinate system ...
Scalar M2() const
return magnitude (mass) squared M2 = T**2 - X**2 - Y**2 - Z**2 (we use -,-,-,+ metric) ...
LorentzVector operator-() const
Negative of a LorentzVector (q = - v )
LorentzVector< CoordSystem > & SetPz(Scalar a)
Scalar Dot(const OtherLorentzVector &q) const
scalar (Dot) product of two LorentzVector vectors (metric is -,-,-,+) Enable the product using any ot...
This namespace contains pre-defined functions to be used in conjuction with TExecutor::Map and TExecu...
CoordSystem CoordinateType
::ROOT::Math::DisplacementVector3D< Cartesian3D< Scalar > > Vect() const
get the spatial components of the Vector in a DisplacementVector based on Cartesian Coordinates ...
LorentzVector< CoordSystem > & SetPxPyPzE(Scalar xx, Scalar yy, Scalar zz, Scalar ee)
LorentzVector(const LorentzVector< Coords > &v)
constructor from a LorentzVector expressed in different coordinates, or using a different Scalar type...
LorentzVector & operator-=(const OtherLorentzVector &q)
Self subtraction of another Vector from this ( v-= q ) Enable the addition with any other LorentzVect...
Scalar Rapidity() const
Rapidity relative to the Z axis: .5 log [(E+Pz)/(E-Pz)].
std::basic_istream< char_t, traits_t > & operator>>(std::basic_istream< char_t, traits_t > &is, DisplacementVector2D< T, U > &v)
LorentzVector< CoordSystem > & SetCoordinates(const Scalar src[])
Set internal data based on an array of 4 Scalar numbers.
Scalar M() const
return magnitude (mass) using the (-,-,-,+) metric.
LorentzVector< CoordSystem > & SetCoordinates(Scalar a, Scalar b, Scalar c, Scalar d)
Set internal data based on 4 Scalar numbers.
void GetCoordinates(IT begin, IT end) const
get internal data into 4 Scalars at *begin to *end
LorentzVector operator+() const
LorentzVector< CoordSystem > & SetM(Scalar a)
LorentzVector< CoordSystem > & SetPy(Scalar a)
LorentzVector< CoordSystem > & SetXYZT(Scalar xx, Scalar yy, Scalar zz, Scalar tt)
set the values of the vector from the cartesian components (x,y,z,t) (if the vector is held in anothe...
DisplacementVector3D< Cartesian3D< Scalar > > BetaVector
CoordSystem::Scalar Scalar
Scalar ColinearRapidity() const
Rapidity in the direction of travel: atanh (|P|/E)=.5 log[(E+P)/(E-P)].
BetaVector BoostToCM() const
The beta vector for the boost that would bring this vector into its center of mass frame (zero moment...
LorentzVector(const Scalar &a, const Scalar &b, const Scalar &c, const Scalar &d)
generic constructors from four scalar values.
Class describing a 4D cartesian coordinate system (x, y, z, t coordinates) or momentum-energy vectors...
Scalar R() const
return the spatial (3D) magnitude ( sqrt(X**2 + Y**2 + Z**2) )
void GetCoordinates(Scalar &a, Scalar &b, Scalar &c, Scalar &d) const
get internal data into 4 Scalar numbers
BetaVector BoostToCM(const Other4Vector &v) const
The beta vector for the boost that would bring this vector into its center of mass frame (zero moment...
LorentzVector & operator+=(const OtherLorentzVector &q)
Self addition with another Vector ( v+= q ) Enable the addition with any other LorentzVector.
Scalar Gamma() const
Return Gamma scalar value.
LorentzVector()
default constructor of an empty vector (Px = Py = Pz = E = 0 )
LorentzVector< CoordSystem > & SetPhi(Scalar a)
Scalar Perp2() const
return the square of the transverse spatial component ( X**2 + Y**2 )
LorentzVector< CoordSystem > operator/(const Scalar &a) const
Divide a LorentzVector by a scalar quantity.
LorentzVector< CoordSystem > & SetCoordinates(IT begin, IT end)
Set internal data based on 4 Scalars at *begin to *end.
Scalar Mag2() const
Magnitute squared ( r^2 in spherical coordinate)
char_t get_manip(std::basic_ios< char_t, traits_t > &ios, manip_t m)
void GetCoordinates(IT begin) const
get internal data into 4 Scalars at *begin
Scalar Phi() const
azimuthal Angle
Scalar Eta() const
pseudorapidity
Scalar Mt() const
return the transverse mass
Class describing a generic displacement vector in 3 dimensions.
void Throw(const char *)
function throwing exception, by creating internally a GenVector_exception only when needed ...
LorentzVector< CoordSystem > & SetPt(Scalar a)
#define dest(otri, vertexptr)
bool isTimelike() const
Determine if momentum-energy can represent a physical massive particle.
LorentzVector & operator=(const LorentzVector< OtherCoords > &v)
Assignment operator from a lorentz vector of arbitrary type.
Scalar Pt() const
return the transverse spatial component sqrt ( X**2 + Y**2 )
Scalar Mt2() const
return the transverse mass squared
LorentzVector< CoordSystem > & SetE(Scalar a)
Methods setting a Single-component Work only if the component is one of which the vector is represent...
Scalar Beta() const
Return beta scalar value.
LorentzVector< CoordSystem > & SetEta(Scalar a)
bool isSpacelike() const
Determine if momentum-energy is spacelike, and represents a tachyon.
LorentzVector operator*(const Scalar &a) const
product of a LorentzVector by a scalar quantity
Scalar Pz() const
spatial Z component
Scalar Px() const
spatial X component
LorentzVector & operator*=(Scalar a)
multiplication by a scalar quantity v *= a
bool operator!=(const LorentzVector &rhs) const
void set_manip(std::basic_ios< char_t, traits_t > &ios, manip_t m, char_t ch)
Namespace for new Math classes and functions.
Scalar Py() const
spatial Y component
Scalar Et() const
return the transverse energy
std::basic_istream< char_t, traits_t > & require_delim(std::basic_istream< char_t, traits_t > &is, manip_t m)
bool operator==(const LorentzVector &rhs) const
Exact equality.
Scalar Theta() const
polar Angle
you should not use this method at all Int_t Int_t Double_t Double_t Double_t Int_t Double_t Double_t Double_t Double_t b
void GetCoordinates(Scalar dest[]) const
get internal data into an array of 4 Scalar numbers
const CoordSystem & Coordinates() const
Retrieve a const reference to the coordinates object.
Scalar P2() const
return the square of the spatial (3D) magnitude ( X**2 + Y**2 + Z**2 )
LorentzVector(const ForeignLorentzVector &v)
Construct from a foreign 4D vector type, for example, HepLorentzVector Precondition: v must implement...
LorentzVector< CoordSystem > & SetPx(Scalar a)
LorentzVector & operator/=(Scalar a)
division by a scalar quantity v /= a
bool isLightlike(Scalar tolerance=100 *std::numeric_limits< Scalar >::epsilon()) const
Determine if momentum-energy can represent a massless particle.
Scalar Et2() const
return the transverse energy squared