8#include <tracking/trackingUtilities/geometry/Helix.h>
10#include <tracking/trackingUtilities/geometry/HelixParameters.h>
11#include <tracking/trackingUtilities/geometry/PerigeeCircle.h>
12#include <tracking/trackingUtilities/geometry/PerigeeParameters.h>
13#include <tracking/trackingUtilities/geometry/SZLine.h>
14#include <tracking/trackingUtilities/geometry/SZParameters.h>
16#include <tracking/trackingUtilities/geometry/VectorUtil.h>
18#include <Math/Vector3D.h>
20#include <boost/math/tools/minima.hpp>
29using namespace TrackingUtilities;
34 double loc_d0 =
circleXY().distance(VectorUtil::getXYVector(point));
36 if (denominator == 0) {
38 double arcLength2D = (point.z() -
z0()) /
tanLambda();
39 if (not std::isfinite(arcLength2D)) {
47 double arcLength2D =
circleXY().arcLengthTo(VectorUtil::getXYVector(point));
53 double deltaZ = point.z() -
szLine().map(arcLength2D);
54 if (not firstPeriod) {
55 if (fabs(deltaZ) >
zPeriod() / 2) {
56 double newDeltaZ = std::remainder(deltaZ,
zPeriod());
57 double nPeriodShift = (deltaZ - newDeltaZ) /
zPeriod();
63 using boost::math::tools::brent_find_minima;
65 auto distance3D = [
this, &point](
const double & s) ->
double {
67 return VectorUtil::Distance(pos, point);
72 double lowerS = arcLength2D - searchWidth;
73 double upperS = arcLength2D + searchWidth;
75 int bits = std::numeric_limits<double>::digits;
76 size_t nMaxIter = 100;
78 std::pair<double, double> sBounds = brent_find_minima(distance3D, lowerS, upperS, bits, nMaxIter);
83 double firstDistance = distance3D(sBounds.first);
84 double secondDistance = distance3D(sBounds.second);
85 if (firstDistance < secondDistance) {
88 return sBounds.second;
95 PerigeeJacobian perigeeJacobian =
circleXY().passiveMoveByJacobian(VectorUtil::getXYVector(by));
101 double sArc =
circleXY().arcLengthTo(VectorUtil::getXYVector(by));
104 jacobian(c_Z0, c_Curv) = tanL * (jacobian(c_Phi0, c_Curv) - sArc) /
curv;
105 jacobian(c_Z0, c_Phi0) = tanL * (jacobian(c_Phi0, c_Phi0) - 1.) /
curv;
106 jacobian(c_Z0, c_I) = tanL * jacobian(c_Phi0, c_I) /
curv;
107 jacobian(c_Z0, c_TanL) = sArc;
112std::ostream& TrackingUtilities::operator<<(std::ostream& output,
const Helix& helix)
114 return output <<
"Helix("
116 <<
"phi0=" << helix.
phi0() <<
","
117 <<
"impact=" << helix.
impactXY() <<
","
119 <<
"z0=" << helix.
z0() <<
")";
double curv(void) const
Return curvature of helix.
Extension of the generalized circle also caching the perigee coordinates.
double z0() const
Getter for z coordinate at the perigee point of the helix.
double phi0() const
Getter for the azimuth angle of the direction of flight at the perigee.
double perimeterXY() const
Getter for the perimeter of the circle in the xy projection.
double impactXY() const
Getter for the signed distance to the z axes at the perigee point.
double tanLambda() const
Getter for the proportinality factor from arc length in xy space to z.
double curvatureXY() const
Getter for the signed curvature in the xy projection.
double zPeriod() const
Getter for the distance in z at which the two points on the helix coincide in the xy projection.
HelixJacobian passiveMoveByJacobian(const ROOT::Math::XYZVector &by) const
Computes the Jacobi matrix for a move of the coordinate system by the given vector.
double arcLength2DToClosest(const ROOT::Math::XYZVector &point, bool firstPeriod=true) const
Calculates the perpendicular travel distance at which the helix has the closest approach to the given...
const PerigeeCircle & circleXY() const
Getter for the projection into xy space.
ROOT::Math::XYZVector atArcLength2D(double s) const
Calculates the point, which lies at the give perpendicular travel distance (counted from the perigee)
const SZLine & szLine() const
Getter for the projection into xy space.
Namespace to hide the contained enum constants.
Abstract base class for different kinds of events.
static HelixUtil::CovarianceMatrix stackBlocks(const PerigeeUtil::CovarianceMatrix &perigeeCov, const SZUtil::CovarianceMatrix &szCov)
Combine covariance matrices from the xy space and the sz space in their respective blocks.
static CovarianceMatrix identity()