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>
27 using namespace TrackFindingCDC;
34 if (denominator == 0) {
37 if (not std::isfinite(arcLength2D)) {
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;
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;
112 return output <<
"Helix("
114 <<
"phi0=" << helix.
phi0() <<
","
115 <<
"impact=" << helix.
impactXY() <<
","
117 <<
"z0=" << helix.
z0() <<
")";
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.
const SZLine & szLine() const
Getter for the projection into xy space.
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.
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 PerigeeCircle & circleXY() const
Getter for the projection into xy space.
double distance(const Vector2D &point) const
Getter for the proper signed distance of the point to the circle.
PerigeeJacobian passiveMoveByJacobian(const Vector2D &by) const
Computes the Jacobi matrix for a move of the coordinate system by the given vector.
double arcLengthTo(const Vector2D &point) const
Calculates the arc length between the perigee and the given point.
A matrix implementation to be used as an interface typ through out the track finder.
double map(double s) const
Maps the two dimensional arc length s to z.
A three dimensional vector.
const Vector2D & xy() const
Getter for the xy projected vector ( reference ! )
double z() const
Getter for the z coordinate.
std::ostream & operator<<(std::ostream &output, const Helix &helix)
Output operator for debugging and the generation of unittest error messages.
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()
Returns an identity matrix.