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;
34 if (denominator == 0) {
37 if (not std::isfinite(arcLength2D)) {
45 double arcLength2D =
circleXY().arcLengthTo(point.
xy());
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();
61 using boost::math::tools::brent_find_minima;
63 auto distance3D = [
this, &point](
const double & s) ->
double {
65 return pos.distance(point);
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;
93 PerigeeJacobian perigeeJacobian =
circleXY().passiveMoveByJacobian(by.
xy());
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 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.
double d0() const
Getter for the signed distance to the z axes at the perigee point.
const PerigeeCircle & circleXY() const
Getter for the projection into xy space.
Vector3D atArcLength2D(double s) const
Calculates the point, which lies at the give perpendicular travel distance (counted from the perigee)
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.
const SZLine & szLine() const
Getter for the projection into xy space.
A three dimensional vector.
const Vector2D & xy() const
Getter for the xy projected vector ( reference ! )
double z() const
Getter for the z coordinate.
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()