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 inline double CosPhi(
const ROOT::Math::XYVector& v1,
const ROOT::Math::XYVector& v2)
113 const double v1_r2 = v1.Mag2();
114 const double v2_r2 = v2.Mag2();
115 const double ptot2 = v1_r2 * v2_r2;
119 const double pdot = v1.Dot(v2);
120 double arg = pdot / std::sqrt(ptot2);
129 inline double Cross(
const ROOT::Math::XYVector& lhs,
const ROOT::Math::XYVector& rhs)
131 return lhs.X() * rhs.Y() - lhs.Y() * rhs.X();
135 inline ROOT::Math::XYVector Orthogonal(
const ROOT::Math::XYVector& a)
137 return ROOT::Math::XYVector(-a.Y(), a.X());
152 inline ROOT::Math::XYVector orthogonalVector(
const ROOT::Math::XYVector& v1,
const ROOT::Math::XYVector& relativeTo)
154 const double cross = Cross(relativeTo, v1);
155 const ROOT::Math::XYVector tmp = relativeTo * (cross / relativeTo.Mag2());
156 return Orthogonal(tmp);
174 template<
class aVector>
175 inline aVector parallelVector(
const aVector& v1,
const aVector& v2)
177 const double v2Mag2 = v2.Mag2();
180 const double dotp = v1.Dot(v2);
181 const aVector tmp = v2 * (dotp / v2Mag2);
186 inline ROOT::Math::XYVector flippedOver(
const ROOT::Math::XYVector& inVec,
const ROOT::Math::XYVector& reflectionLine)
188 return inVec - orthogonalVector(inVec, reflectionLine) * 2;
static constexpr auto XYZToTVector
Helper function to convert XYZVector to TVector3.
Abstract base class for different kinds of events.