8#include <tracking/trackFindingCDC/geometry/Helix.h>
10#include <tracking/trackFindingCDC/geometry/HelixParameters.h>
11#include <tracking/trackFindingCDC/geometry/PerigeeCircle.h>
12#include <tracking/trackFindingCDC/geometry/PerigeeParameters.h>
13#include <tracking/trackFindingCDC/geometry/SZLine.h>
14#include <tracking/trackFindingCDC/geometry/SZParameters.h>
16#include <tracking/trackFindingCDC/geometry/Vector3D.h>
18#include <boost/math/tools/minima.hpp>
27using namespace TrackFindingCDC;
32 double d0 = circleXY().distance(point.
xy());
33 double denominator = 1 + curvatureXY() * d0;
34 if (denominator == 0) {
36 double arcLength2D = (point.
z() - z0()) / tanLambda();
37 if (not std::isfinite(arcLength2D)) {
45 double arcLength2D = circleXY().arcLengthTo(point.
xy());
47 if (tanLambda() == 0) {
51 double deltaZ = point.
z() - szLine().map(arcLength2D);
52 if (not firstPeriod) {
53 if (fabs(deltaZ) > zPeriod() / 2) {
54 double newDeltaZ = std::remainder(deltaZ, zPeriod());
55 double nPeriodShift = (deltaZ - newDeltaZ) / zPeriod();
56 arcLength2D += nPeriodShift * perimeterXY();
61 using boost::math::tools::brent_find_minima;
63 auto distance3D = [
this, &point](
const double & s) ->
double {
65 return pos.distance(point);
68 double searchWidth = std::fmin(perimeterXY(), 2 * deltaZ / tanLambda());
70 double lowerS = arcLength2D - searchWidth;
71 double upperS = arcLength2D + searchWidth;
73 int bits = std::numeric_limits<double>::digits;
74 boost::uintmax_t nMaxIter = 100;
76 std::pair<double, double> sBounds = brent_find_minima(distance3D, lowerS, upperS, bits, nMaxIter);
81 double firstDistance = distance3D(sBounds.first);
82 double secondDistance = distance3D(sBounds.second);
83 if (firstDistance < secondDistance) {
86 return sBounds.second;
97 double curv = curvatureXY();
98 double tanL = tanLambda();
99 double sArc = circleXY().arcLengthTo(by.
xy());
101 using namespace NHelixParameterIndices;
102 jacobian(c_Z0, c_Curv) = tanL * (jacobian(c_Phi0, c_Curv) - sArc) /
curv;
103 jacobian(c_Z0, c_Phi0) = tanL * (jacobian(c_Phi0, c_Phi0) - 1.) /
curv;
104 jacobian(c_Z0, c_I) = tanL * jacobian(c_Phi0, c_I) /
curv;
105 jacobian(c_Z0, c_TanL) = sArc;
110std::ostream& TrackFindingCDC::operator<<(std::ostream& output,
const Helix& helix)
112 return output <<
"Helix("
114 <<
"phi0=" << helix.
phi0() <<
","
115 <<
"impact=" << helix.
impactXY() <<
","
117 <<
"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 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 arcLength2DToClosest(const Vector3D &point, bool firstPeriod=true) const
Calculates the perpendicular travel distance at which the helix has the closest approach to the given...
HelixJacobian passiveMoveByJacobian(const Vector3D &by) const
Computes the Jacobi matrix for a move of the coordinate system by the given vector.
A matrix implementation to be used as an interface typ through out the track finder.
A three dimensional vector.
const Vector2D & xy() const
Getter for the xy projected vector ( reference ! )
double z() const
Getter for the z coordinate.
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.