9 #include <top/reconstruction_cpp/HelixSwimmer.h>
10 #include <framework/gearbox/Const.h>
11 #include <framework/gearbox/Unit.h>
12 #include <framework/logging/Logger.h>
17 using namespace ROOT::Math;
26 void HelixSwimmer::set(
const XYZPoint& position,
const XYZVector& momentum,
double charge,
double Bz)
28 double p = momentum.R();
29 double pT = momentum.Rho();
30 double b = -Bz * charge * Const::speedOfLight;
31 if (std::abs(b / Unit::T) > pT) {
32 m_R = pT / std::abs(b);
34 m_kz = momentum.Z() / p;
35 m_phi0 = momentum.Phi() - copysign(M_PI / 2, m_omega);
36 m_xc = position.X() - m_R * cos(m_phi0);
37 m_yc = position.Y() - m_R * sin(m_phi0);
39 m_T0 = 2 * M_PI / std::abs(m_omega);
45 kx = momentum.X() / p;
46 ky = momentum.Y() / p;
47 kz = momentum.Z() / p;
51 void HelixSwimmer::moveReferencePosition(
double length)
54 m_phi0 += m_omega * length;
55 m_z0 += m_kz * length;
66 double phi = m_phi0 + m_omega * length;
67 XYZPoint vec(m_xc + m_R * cos(phi), m_yc + m_R * sin(phi), m_z0 + m_kz * length);
68 return m_transformInv * vec;
70 XYZPoint vec(x0 + kx * length, y0 + ky * length, z0 + kz * length);
71 return m_transformInv * vec;
75 XYZVector HelixSwimmer::getDirection(
double length)
const
78 double phi = m_phi0 + m_omega * length;
79 double k_T = m_omega * m_R;
80 XYZVector vec(-k_T * sin(phi), k_T * cos(phi), m_kz);
81 return m_transformInv * vec;
83 XYZVector vec(kx, ky, kz);
84 return m_transformInv * vec;
88 double HelixSwimmer::getDistanceToPlane(
const XYZPoint& point,
const XYZVector& normal)
const
91 auto r = point - XYZPoint(m_xc, m_yc, m_z0);
92 double phi = normal.Phi();
93 double s = r.Dot(normal);
94 if (std::abs(s) > m_R)
return std::numeric_limits<double>::quiet_NaN();
96 double t = shortestDistance(s / m_R, phi);
97 double v = m_kz * normal.Z();
102 for (
int i = 0; i < 100; i++) {
103 double cosAlpha = (s - v * t) / m_R;
104 if (std::abs(cosAlpha) > 1) {
105 return std::numeric_limits<double>::quiet_NaN();
107 t = shortestDistance(cosAlpha, phi);
108 double dt = t - t_prev;
109 if (dt == 0 or (dt + dt_prev) == 0)
return t;
113 if (std::abs(dt_prev) < 1e-6) {
114 B2DEBUG(20,
"TOP::HelixSwimmer::getDistanceToPlane: not converged"
118 B2DEBUG(20,
"TOP::HelixSwimmer::getDistanceToPlane: not converged"
120 return std::numeric_limits<double>::quiet_NaN();
123 auto r = point - XYZPoint(x0, y0, z0);
124 auto v = XYZVector(kx, ky, kz);
125 return r.Dot(normal) / v.Dot(normal);
Class to store variables with their name which were sent to the logging service.
ExpRunEvt getPosition(const std::vector< Evt > &events, double tEdge)
Get the exp-run-evt number from the event time [hours].
Abstract base class for different kinds of events.