18 #ifndef ROOT_Math_GenVector_VectorUtil 19 #define ROOT_Math_GenVector_VectorUtil 1 45 namespace VectorUtil {
58 template <
class Vector1,
class Vector2>
63 }
else if ( dphi <= -
M_PI ) {
79 template <
class Vector1,
class Vector2>
83 return dphi*dphi + deta*deta;
94 template <
class Vector1,
class Vector2>
111 template <
class Vector1,
class Vector2>
112 double CosTheta(
const Vector1 & v1,
const Vector2 & v2) {
114 double v1_r2 = v1.X()*v1.X() + v1.Y()*v1.Y() + v1.Z()*v1.Z();
115 double v2_r2 = v2.X()*v2.X() + v2.Y()*v2.Y() + v2.Z()*v2.Z();
116 double ptot2 = v1_r2*v2_r2;
120 double pdot = v1.X()*v2.X() + v1.Y()*v2.Y() + v1.Z()*v2.Z();
122 if(arg > 1.0) arg = 1.0;
123 if(arg < -1.0) arg = -1.0;
137 template <
class Vector1,
class Vector2>
138 inline double Angle(
const Vector1 & v1,
const Vector2 & v2) {
150 template <
class Vector1,
class Vector2>
152 double magU2 = u.X()*u.X() + u.Y()*u.Y() + u.Z()*u.Z();
153 if (magU2 == 0)
return Vector1(0,0,0);
154 double d = v.Dot(u)/magU2;
155 return Vector1( u.X() * d, u.Y() * d, u.Z() * d);
166 template <
class Vector1,
class Vector2>
167 inline Vector1
PerpVector(
const Vector1 &
v,
const Vector2 & u) {
179 template <
class Vector1,
class Vector2>
180 inline double Perp2(
const Vector1 &
v,
const Vector2 & u) {
181 double magU2 = u.X()*u.X() + u.Y()*u.Y() + u.Z()*u.Z();
182 double prjvu = v.Dot(u);
183 double magV2 = v.Dot(v);
184 return magU2 > 0.0 ? magV2-prjvu*prjvu/magU2 : magV2;
195 template <
class Vector1,
class Vector2>
196 inline double Perp(
const Vector1 &
v,
const Vector2 & u) {
214 template <
class Vector1,
class Vector2>
217 Scalar ee = (v1.E() + v2.E() );
218 Scalar xx = (v1.X() + v2.X() );
219 Scalar yy = (v1.Y() + v2.Y() );
220 Scalar zz = (v1.Z() + v2.Z() );
221 Scalar mm2 = ee*ee - xx*xx - yy*yy - zz*zz;
228 template <
class Vector1,
class Vector2>
231 Scalar ee = (v1.E() + v2.E() );
232 Scalar xx = (v1.X() + v2.X() );
233 Scalar yy = (v1.Y() + v2.Y() );
234 Scalar zz = (v1.Z() + v2.Z() );
235 Scalar mm2 = ee*ee - xx*xx - yy*yy - zz*zz;
252 template <
class Vector>
254 double sina =
sin(alpha);
255 double cosa =
cos(alpha);
256 double y2 = v.Y() * cosa - v.Z()*sina;
257 double z2 = v.Z() * cosa + v.Y() * sina;
259 vrot.SetXYZ(v.X(), y2, z2);
269 template <
class Vector>
271 double sina =
sin(alpha);
272 double cosa =
cos(alpha);
273 double x2 = v.X() * cosa + v.Z() * sina;
274 double z2 = v.Z() * cosa - v.X() * sina;
276 vrot.SetXYZ(x2, v.Y(), z2);
286 template <
class Vector>
288 double sina =
sin(alpha);
289 double cosa =
cos(alpha);
290 double x2 = v.X() * cosa - v.Y() * sina;
291 double y2 = v.Y() * cosa + v.X() * sina;
293 vrot.SetXYZ(x2, y2, v.Z());
305 template<
class Vector,
class RotationMatrix>
306 Vector
Rotate(
const Vector &
v,
const RotationMatrix & rot) {
310 double x2 = rot(0,0)*xX + rot(0,1)*yY + rot(0,2)*zZ;
311 double y2 = rot(1,0)*xX + rot(1,1)*yY + rot(1,2)*zZ;
312 double z2 = rot(2,0)*xX + rot(2,1)*yY + rot(2,2)*zZ;
314 vrot.SetXYZ(x2,y2,z2);
326 template <
class LVector,
class BoostVector>
327 LVector
boost(
const LVector &
v,
const BoostVector &
b) {
331 double b2 = bx*bx + by*by + bz*bz;
333 GenVector::Throw (
"Beta Vector supplied to set Boost represents speed >= c");
337 double bp = bx*v.X() + by*v.Y() + bz*v.Z();
338 double gamma2 = b2 > 0 ? (gamma - 1.0)/b2 : 0.0;
339 double x2 = v.X() + gamma2*bp*bx + gamma*bx*v.T();
340 double y2 = v.Y() + gamma2*bp*by + gamma*by*v.T();
341 double z2 = v.Z() + gamma2*bp*bz + gamma*bz*v.T();
342 double t2 = gamma*(v.T() + bp);
344 lv.SetXYZT(x2,y2,z2,t2);
355 template <
class LVector,
class T>
358 GenVector::Throw (
"Beta Vector supplied to set Boost represents speed >= c");
366 lv.SetXYZT(x2,v.Y(),v.Z(),t2);
376 template <
class LVector>
379 GenVector::Throw (
"Beta Vector supplied to set Boost represents speed >= c");
383 double y2 = gamma * v.Y() + gamma * beta * v.T();
384 double t2 = gamma * beta * v.Y() + gamma * v.T();
386 lv.SetXYZT(v.X(),y2,v.Z(),t2);
396 template <
class LVector>
399 GenVector::Throw (
"Beta Vector supplied to set Boost represents speed >= c");
403 double z2 = gamma * v.Z() + gamma * beta * v.T();
404 double t2 = gamma * beta * v.Z() + gamma * v.T();
406 lv.SetXYZT(v.X(),v.Y(),z2,t2);
423 template<
class Matrix,
class CoordSystem,
class U>
427 vret.
SetXYZ(
m(0,0) * v.
x() +
m(0,1) * v.
y() +
m(0,2) * v.
z() ,
428 m(1,0) * v.
x() +
m(1,1) * v.
y() +
m(1,2) * v.
z() ,
429 m(2,0) * v.
x() +
m(2,1) * v.
y() +
m(2,2) * v.
z() );
438 template<
class Matrix,
class CoordSystem,
class U>
442 pret.
SetXYZ(
m(0,0) * p.
x() +
m(0,1) * p.
y() +
m(0,2) * p.
z() ,
443 m(1,0) * p.
x() +
m(1,1) * p.
y() +
m(1,2) * p.
z() ,
444 m(2,0) * p.
x() +
m(2,1) * p.
y() +
m(2,2) * p.
z() );
455 template<
class CoordSystem,
class Matrix>
459 vret.
SetXYZT(
m(0,0)*v.
x() +
m(0,1)*v.
y() +
m(0,2)*v.
z() +
m(0,3)* v.
t() ,
460 m(1,0)*v.
x() +
m(1,1)*v.
y() +
m(1,2)*v.
z() +
m(1,3)* v.
t() ,
461 m(2,0)*v.
x() +
m(2,1)*v.
y() +
m(2,2)*v.
z() +
m(2,3)* v.
t() ,
462 m(3,0)*v.
x() +
m(3,1)*v.
y() +
m(3,2)*v.
z() +
m(3,3)* v.
t() );
double Phi_0_2pi(double phi)
Return a phi angle in the interval (0,2*PI].
Class describing a generic LorentzVector in the 4D space-time, using the specified coordinate system ...
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...
Namespace for new ROOT classes and functions.
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...
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 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.
Class describing a generic position vector (point) in 3 dimensions.
Vector RotateX(const Vector &v, double alpha)
rotation along X axis for a generic vector by an Angle alpha returning a new vector.
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...
double beta(double x, double y)
Calculates the beta function.
static const double x2[5]
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...
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...
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...
Vector RotateZ(const Vector &v, double alpha)
rotation along Z axis for a generic vector by an Angle alpha returning a new vector.
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...
Class describing a generic displacement vector in 3 dimensions.
Vector1::Scalar DeltaPhi(const Vector1 &v1, const Vector2 &v2)
Find aximutal Angle difference between two generic vectors ( v2.Phi() - v1.Phi() ) The only requireme...
void Throw(const char *)
function throwing exception, by creating internally a GenVector_exception only when needed ...
double Angle(const Vector1 &v1, const Vector2 &v2)
Find Angle between two vectors.
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...
Vector RotateY(const Vector &v, double alpha)
rotation along Y axis for a generic vector by an Angle alpha returning a new vector.
double Phi_mpi_pi(double phi)
Returns phi angle in the interval (-PI,PI].
Vector Rotate(const Vector &v, const RotationMatrix &rot)
rotation on a generic vector using a generic rotation class.
DisplacementVector3D< CoordSystem, U > Mult(const Matrix &m, const DisplacementVector3D< CoordSystem, U > &v)
Multiplications of a generic matrices with a DisplacementVector3D of any coordinate system...
Namespace for new Math classes and functions.
Vector1 PerpVector(const Vector1 &v, const Vector2 &u)
Find the vector component of v perpendicular to the given direction of u.
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
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...
double Perp(const Vector1 &v, const Vector2 &u)
Find the magnitude of the vector component of v perpendicular to the given direction of u...
Rotation3D::Scalar Scalar
double CosTheta(const Vector1 &v1, const Vector2 &v2)
Find CosTheta Angle between two generic 3D vectors pre-requisite: vectors implement the X()...