12#include <Math/Vector3D.h>
13#include <Math/Vector2D.h>
14#include <Math/VectorUtil.h>
26 static constexpr auto XYZToTVector = [](
const ROOT::Math::XYZVector& a)
28 return TVector3(a.X(), a.Y(), a.Z());
31 namespace VectorUtil {
40 inline void setMagThetaPhi(ROOT::Math::XYZVector&
vector,
41 double mag,
double theta,
double phi)
43 const double amag = std::abs(mag);
44 const double sinTheta = std::sin(theta);
45 const double x = amag * sinTheta * std::cos(phi);
46 const double y = amag * sinTheta * std::sin(phi);
47 const double z = amag * std::cos(theta);
56 inline void setMag(ROOT::Math::XYZVector& vector,
double mag)
58 setMagThetaPhi(vector, mag, vector.Theta(), vector.Phi());
66 inline void setTheta(ROOT::Math::XYZVector& vector,
double theta)
68 setMagThetaPhi(vector, vector.R(), theta, vector.Phi());
76 inline void setPhi(ROOT::Math::XYZVector& vector,
double phi)
78 setMagThetaPhi(vector, vector.R(), vector.Theta(), phi);
88 inline void setPtThetaPhi(ROOT::Math::XYZVector& vector,
89 double pt,
double theta,
double phi)
91 const double aPt = std::abs(pt);
92 const double x = aPt * std::cos(phi);
93 const double y = aPt * std::sin(phi);
94 const double tanTheta = std::tan(theta);
95 const double z = tanTheta ? aPt / tanTheta : 0;
96 vector.SetXYZ(x, y, z);
111 template <
class Vector>
112 double CosTheta(
const Vector& v1,
const Vector& v2)
114 const double v1_r2 = v1.Mag2();
115 const double v2_r2 = v2.Mag2();
116 const double ptot2 = v1_r2 * v2_r2;
120 const double pdot = v1.Dot(v2);
121 double arg = pdot / std::sqrt(ptot2);
140 template <
class Vector>
141 double Angle(
const Vector& v1,
const Vector& v2)
143 return std::acos(CosTheta(v1, v2));
160 inline ROOT::Math::XYVector orthogonalVector(
const ROOT::Math::XYVector& v1,
const ROOT::Math::XYVector& v2)
162 const double cross = v1.X() * v2.Y() - v1.Y() - v2.X();
163 const ROOT::Math::XYVector tmp = v2 * (cross / v2.Mag2());
164 return ROOT::Math::XYVector(-tmp.Y(), tmp.X());
182 template<
class aVector>
183 inline aVector parallelVector(
const aVector& v1,
const aVector& v2)
185 const double v2Mag2 = v2.Mag2();
188 const double dotp = v1.Dot(v2);
189 const aVector tmp = v2 * (dotp / v2Mag2);
static constexpr auto XYZToTVector
Helper function to convert XYZVector to TVector3.
Abstract base class for different kinds of events.