8#include <tracking/trackFindingCDC/fitting/CDCRobustSZFitter.h>
10#include <tracking/trackFindingCDC/fitting/CDCSZFitter.h>
12#include <tracking/trackFindingCDC/fitting/CDCSZObservations.h>
14#include <tracking/trackingUtilities/eventdata/trajectories/CDCTrajectorySZ.h>
16#include <tracking/trackingUtilities/numerics/Median.h>
17#include <tracking/trackingUtilities/numerics/WithWeight.h>
20using namespace TrackFindingCDC;
21using namespace TrackingUtilities;
32 if (observationsSZ.
size() > 4) {
35 double meanTanLambda = 0;
36 double meanStartZ = 0;
38 for (
unsigned int i = 0; i < observationsSZ.
size(); i++) {
39 for (
unsigned int j = 0; j < observationsSZ.
size(); j++) {
41 observationsSZFiltered.
fill(observationsSZ.
getS(j),
42 observationsSZ.
getZ(j),
47 szFitter.
update(trajectorySZ, observationsSZFiltered);
49 meanStartZ += trajectorySZ.
getZ0();
53 meanStartZ / observationsSZ.
size());
61 std::vector<double> tanLambdas;
62 tanLambdas.reserve(szObservations.
size() * (szObservations.
size() - 1) / 2);
63 for (
unsigned int i = 0; i < szObservations.
size(); i++) {
64 for (
unsigned int j = i + 1; j < szObservations.
size(); j++) {
65 double s1 = szObservations.
getS(i);
66 double s2 = szObservations.
getS(j);
67 if (s1 == s2)
continue;
68 double z1 = szObservations.
getZ(i);
69 double z2 = szObservations.
getZ(j);
70 tanLambdas.push_back((z2 - z1) / (s2 - s1));
74 const double tanLambda = median(std::move(tanLambdas));
75 const double z0 =
getMedianZ0(szObservations, tanLambda);
84 std::vector<WithWeight<double> > weightedTanLambdas;
85 Weight totalWeight = 0;
86 weightedTanLambdas.reserve(szObservations.
size() * (szObservations.
size() - 1) / 2);
87 for (
unsigned int i = 0; i < szObservations.
size(); i++) {
88 for (
unsigned int j = i + 1; j < szObservations.
size(); j++) {
89 double s1 = szObservations.
getS(i);
90 double s2 = szObservations.
getS(j);
91 if (s1 == s2)
continue;
92 double z1 = szObservations.
getZ(i);
93 double z2 = szObservations.
getZ(j);
99 Weight weight = std::abs(s2 - s1) * hypot2(w1, w2);
100 weightedTanLambdas.emplace_back((z2 - z1) / (s2 - s1), weight);
101 totalWeight += weight;
106 weightedTanLambda.weight() /= totalWeight;
109 const double tanLambda = weightedMedian(std::move(weightedTanLambdas));
110 const double z0 =
getMedianZ0(szObservations, tanLambda);
119 std::vector<double> z0s;
120 z0s.reserve(szObservations.
size());
121 for (
unsigned int i = 0; i < szObservations.
size(); i++) {
122 double s = szObservations.
getS(i);
123 double z = szObservations.
getZ(i);
124 z0s.push_back(z - s * tanLambda);
126 const double z0 = median(std::move(z0s));
static TrackingUtilities::CDCTrajectorySZ fitTheilSen(const CDCSZObservations &szObservations)
Implements the original Theil-Sen line fit algorithm.
static TrackingUtilities::CDCTrajectorySZ fitWeightedTheilSen(const CDCSZObservations &szObservations)
Implements the weighted Theil-Sen line fit algorithm.
static double getMedianZ0(const CDCSZObservations &szObservations, double tanLambda)
Compute the median z0 intercept from the given observations and an estimated slope.
static TrackingUtilities::CDCTrajectorySZ fitUsingSimplifiedTheilSen(const CDCSZObservations &szObservations)
Fit a linear sz trajectory to the reconstructed stereo segment.
Class implementing the z coordinate over travel distance line fit.
static void update(const TrackingUtilities::CDCSegmentPair &segmentPair)
Updates the trajectory of the axial stereo segment pair inplace.
Class serving as a storage of observed sz positions to present to the sz line fitters.
std::size_t fill(double s, double z, double weight=1.0)
Appends the observed position.
double getWeight(int iObservation) const
Getter for the weight / inverse variance of the observation at the given index.
double getZ(int iObservation) const
Getter for the z value of the observation at the given index.
std::size_t size() const
Returns the number of observations stored.
double getS(int iObservation) const
Getter for the arc length value of the observation at the given index.
Linear trajectory in sz space.
static CDCTrajectorySZ basicAssumption()
Constructs a basic assumption, what the z0 start position and the sz slope are, including some broad ...
double getTanLambda() const
Getter for the slope over the travel distance coordinate.
void setNDF(std::size_t ndf)
Setter for the number of degrees of freedom of the line fit.
double getZ0() const
Getter for the z coordinate at zero travel distance.
A mixin class to attach a weight to an object.
Abstract base class for different kinds of events.