18#ifndef ROOT_Math_GenVector_VectorUtil
19#define ROOT_Math_GenVector_VectorUtil 1
45 namespace VectorUtil {
58 template <
class Vector1,
class Vector2>
59 inline typename Vector1::Scalar
DeltaPhi(
const Vector1 &
v1,
const Vector2 &
v2) {
60 typename Vector1::Scalar dphi =
v2.Phi() -
v1.Phi();
63 }
else if ( dphi <= -
M_PI ) {
79 template <
class Vector1,
class Vector2>
80 inline typename Vector1::Scalar
DeltaR2(
const Vector1 &
v1,
const Vector2 &
v2) {
82 typename Vector1::Scalar deta =
v2.Eta() -
v1.Eta();
83 return dphi*dphi + deta*deta;
94 template <
class Vector1,
class Vector2>
97 typename Vector1::Scalar drap =
v2.Rapidity() -
v1.Rapidity();
98 return dphi*dphi + drap*drap;
109 template <
class Vector1,
class Vector2>
110 inline typename Vector1::Scalar
DeltaR(
const Vector1 &
v1,
const Vector2 &
v2) {
123 template <
class Vector1,
class Vector2>
139 template <
class Vector1,
class Vector2>
142 double v1_r2 =
v1.X()*
v1.X() +
v1.Y()*
v1.Y() +
v1.Z()*
v1.Z();
143 double v2_r2 =
v2.X()*
v2.X() +
v2.Y()*
v2.Y() +
v2.Z()*
v2.Z();
144 double ptot2 = v1_r2*v2_r2;
148 double pdot =
v1.X()*
v2.X() +
v1.Y()*
v2.Y() +
v1.Z()*
v2.Z();
150 arg = pdot/
sqrt(ptot2);
151 if(arg > 1.0) arg = 1.0;
152 if(arg < -1.0) arg = -1.0;
166 template <
class Vector1,
class Vector2>
167 inline double Angle(
const Vector1 &
v1,
const Vector2 &
v2) {
180 template <
class Vector1,
class Vector2>
182 double magU2 = u.X()*u.X() + u.Y()*u.Y() + u.Z()*u.Z();
183 if (magU2 == 0)
return Vector1(0,0,0);
184 double d =
v.Dot(u)/magU2;
185 return Vector1( u.X() *
d, u.Y() *
d, u.Z() *
d);
196 template <
class Vector1,
class Vector2>
197 inline Vector1
PerpVector(
const Vector1 &
v,
const Vector2 & u) {
209 template <
class Vector1,
class Vector2>
210 inline double Perp2(
const Vector1 &
v,
const Vector2 & u) {
211 double magU2 = u.X()*u.X() + u.Y()*u.Y() + u.Z()*u.Z();
212 double prjvu =
v.Dot(u);
213 double magV2 =
v.Dot(
v);
214 return magU2 > 0.0 ? magV2-prjvu*prjvu/magU2 : magV2;
225 template <
class Vector1,
class Vector2>
226 inline double Perp(
const Vector1 &
v,
const Vector2 & u) {
245 template <
class Vector1,
class Vector2>
247 typedef typename Vector1::Scalar
Scalar;
252 Scalar mm2 = ee*ee - xx*xx - yy*yy - zz*zz;
254 return mm2 < 0.0 ? -
sqrt(-mm2) :
sqrt(mm2);
260 template <
class Vector1,
class Vector2>
262 typedef typename Vector1::Scalar
Scalar;
267 Scalar mm2 = ee*ee - xx*xx - yy*yy - zz*zz;
284 template <
class Vector>
287 double sina = sin(alpha);
289 double cosa = cos(alpha);
290 double y2 =
v.Y() * cosa -
v.Z()*sina;
291 double z2 =
v.Z() * cosa +
v.Y() * sina;
293 vrot.SetXYZ(
v.X(), y2, z2);
303 template <
class Vector>
306 double sina = sin(alpha);
308 double cosa = cos(alpha);
309 double x2 =
v.X() * cosa +
v.Z() * sina;
310 double z2 =
v.Z() * cosa -
v.X() * sina;
312 vrot.SetXYZ(
x2,
v.Y(), z2);
322 template <
class Vector>
325 double sina = sin(alpha);
327 double cosa = cos(alpha);
328 double x2 =
v.X() * cosa -
v.Y() * sina;
329 double y2 =
v.Y() * cosa +
v.X() * sina;
331 vrot.SetXYZ(
x2, y2,
v.Z());
343 template<
class Vector,
class RotationMatrix>
344 Vector
Rotate(
const Vector &
v,
const RotationMatrix & rot) {
348 double x2 = rot(0,0)*xX + rot(0,1)*yY + rot(0,2)*zZ;
349 double y2 = rot(1,0)*xX + rot(1,1)*yY + rot(1,2)*zZ;
350 double z2 = rot(2,0)*xX + rot(2,1)*yY + rot(2,2)*zZ;
352 vrot.SetXYZ(
x2,y2,z2);
364 template <
class LVector,
class BoostVector>
365 LVector
boost(
const LVector &
v,
const BoostVector &
b) {
369 double b2 = bx*bx + by*by + bz*bz;
371 GenVector::Throw (
"Beta Vector supplied to set Boost represents speed >= c");
375 double gamma = 1.0 /
sqrt(1.0 - b2);
376 double bp = bx*
v.X() + by*
v.Y() + bz*
v.Z();
377 double gamma2 = b2 > 0 ? (gamma - 1.0)/b2 : 0.0;
378 double x2 =
v.X() + gamma2*bp*bx + gamma*bx*
v.T();
379 double y2 =
v.Y() + gamma2*bp*by + gamma*by*
v.T();
380 double z2 =
v.Z() + gamma2*bp*bz + gamma*bz*
v.T();
381 double t2 = gamma*(
v.T() + bp);
383 lv.SetXYZT(
x2,y2,z2,t2);
394 template <
class LVector,
class T>
397 GenVector::Throw (
"Beta Vector supplied to set Boost represents speed >= c");
402 typename LVector::Scalar
x2 = gamma *
v.X() + gamma *
beta *
v.T();
403 typename LVector::Scalar t2 = gamma *
beta *
v.X() + gamma *
v.T();
406 lv.SetXYZT(
x2,
v.Y(),
v.Z(),t2);
416 template <
class LVector>
419 GenVector::Throw (
"Beta Vector supplied to set Boost represents speed >= c");
424 double y2 = gamma *
v.Y() + gamma *
beta *
v.T();
425 double t2 = gamma *
beta *
v.Y() + gamma *
v.T();
427 lv.SetXYZT(
v.X(),y2,
v.Z(),t2);
437 template <
class LVector>
440 GenVector::Throw (
"Beta Vector supplied to set Boost represents speed >= c");
445 double z2 = gamma *
v.Z() + gamma *
beta *
v.T();
446 double t2 = gamma *
beta *
v.Z() + gamma *
v.T();
448 lv.SetXYZT(
v.X(),
v.Y(),z2,t2);
465 template<
class Matrix,
class CoordSystem,
class U>
469 vret.
SetXYZ(
m(0,0) *
v.x() +
m(0,1) *
v.y() +
m(0,2) *
v.z() ,
470 m(1,0) *
v.x() +
m(1,1) *
v.y() +
m(1,2) *
v.z() ,
471 m(2,0) *
v.x() +
m(2,1) *
v.y() +
m(2,2) *
v.z() );
480 template<
class Matrix,
class CoordSystem,
class U>
484 pret.
SetXYZ(
m(0,0) * p.
x() +
m(0,1) * p.
y() +
m(0,2) * p.
z() ,
485 m(1,0) * p.
x() +
m(1,1) * p.
y() +
m(1,2) * p.
z() ,
486 m(2,0) * p.
x() +
m(2,1) * p.
y() +
m(2,2) * p.
z() );
497 template<
class CoordSystem,
class Matrix>
501 vret.
SetXYZT(
m(0,0)*
v.x() +
m(0,1)*
v.y() +
m(0,2)*
v.z() +
m(0,3)*
v.t() ,
502 m(1,0)*
v.x() +
m(1,1)*
v.y() +
m(1,2)*
v.z() +
m(1,3)*
v.t() ,
503 m(2,0)*
v.x() +
m(2,1)*
v.y() +
m(2,2)*
v.z() +
m(2,3)*
v.t() ,
504 m(3,0)*
v.x() +
m(3,1)*
v.y() +
m(3,2)*
v.z() +
m(3,3)*
v.t() );
static const double x2[5]
Class describing a generic displacement vector in 3 dimensions.
DisplacementVector3D< CoordSystem, Tag > & SetXYZ(Scalar a, Scalar b, Scalar c)
set the values of the vector from the cartesian components (x,y,z) (if the vector is held in polar or...
Class describing a generic LorentzVector in the 4D space-time, using the specified coordinate system ...
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...
Class describing a generic position vector (point) in 3 dimensions.
double beta(double x, double y)
Calculates the beta function.
Namespace for new Math classes and functions.
void Throw(const char *)
function throwing exception, by creating internally a GenVector_exception only when needed
DisplacementVector3D< CoordSystem, U > Mult(const Matrix &m, const DisplacementVector3D< CoordSystem, U > &v)
Multiplications of a generic matrices with a DisplacementVector3D of any coordinate system.
Vector1::Scalar DeltaR2(const Vector1 &v1, const Vector2 &v2)
Find square of the difference in pseudorapidity (Eta) and Phi betwen two generic vectors The only req...
double Perp(const Vector1 &v, const Vector2 &u)
Find the magnitude of the vector component of v perpendicular to the given direction of u.
LVector boostY(const LVector &v, double beta)
Boost a generic Lorentz Vector class along the Y direction with a factor beta The only requirement on...
Vector1::Scalar DeltaRapidityPhi(const Vector1 &v1, const Vector2 &v2)
Find difference in Rapidity (y) and Phi betwen two generic vectors The only requirements on the Vecto...
Vector1::Scalar DeltaR(const Vector1 &v1, const Vector2 &v2)
Find difference in pseudorapidity (Eta) and Phi betwen two generic vectors The only requirements on t...
Vector1::Scalar DeltaPhi(const Vector1 &v1, const Vector2 &v2)
Find aximutal Angle difference between two generic vectors ( v2.Phi() - v1.Phi() ) The only requireme...
LVector boost(const LVector &v, const BoostVector &b)
Boost a generic Lorentz Vector class using a generic 3D Vector class describing the boost The only re...
double Angle(const Vector1 &v1, const Vector2 &v2)
Find Angle between two vectors.
Vector RotateZ(const Vector &v, double alpha)
rotation along Z axis for a generic vector by an Angle alpha returning a new vector.
Vector1::Scalar DeltaR2RapidityPhi(const Vector1 &v1, const Vector2 &v2)
Find square of the difference in true rapidity (y) and Phi betwen two generic vectors The only requir...
Vector RotateY(const Vector &v, double alpha)
rotation along Y axis for a generic vector by an Angle alpha returning a new vector.
Vector RotateX(const Vector &v, double alpha)
rotation along X axis for a generic vector by an Angle alpha returning a new vector.
double CosTheta(const Vector1 &v1, const Vector2 &v2)
Find CosTheta Angle between two generic 3D vectors pre-requisite: vectors implement the X(),...
Vector1 PerpVector(const Vector1 &v, const Vector2 &u)
Find the vector component of v perpendicular to the given direction of u.
double Perp2(const Vector1 &v, const Vector2 &u)
Find the magnitude square of the vector component of v perpendicular to the given direction of u.
double Phi_0_2pi(double phi)
Return a phi angle in the interval (0,2*PI].
Vector Rotate(const Vector &v, const RotationMatrix &rot)
rotation on a generic vector using a generic rotation class.
double Phi_mpi_pi(double phi)
Returns phi angle in the interval (-PI,PI].
Vector1::Scalar InvariantMass2(const Vector1 &v1, const Vector2 &v2)
Vector1 ProjVector(const Vector1 &v, const Vector2 &u)
Find the projection of v along the given direction u.
LVector boostZ(const LVector &v, double beta)
Boost a generic Lorentz Vector class along the Z direction with a factor beta The only requirement on...
LVector boostX(const LVector &v, T beta)
Boost a generic Lorentz Vector class along the X direction with a factor beta The only requirement on...
Vector1::Scalar InvariantMass(const Vector1 &v1, const Vector2 &v2)
return the invariant mass of two LorentzVector The only requirement on the LorentzVector is that they...
VecExpr< UnaryOp< Sqrt< T >, VecExpr< A, T, D >, T >, T, D > sqrt(const VecExpr< A, T, D > &rhs)
Rotation3D::Scalar Scalar
tbb::task_arena is an alias of tbb::interface7::task_arena, which doesn't allow to forward declare tb...