10 #include <tracking/trackFindingCDC/fitting/CDCRobustSZFitter.h>
12 #include <tracking/trackFindingCDC/fitting/CDCSZFitter.h>
14 #include <tracking/trackFindingCDC/fitting/CDCSZObservations.h>
16 #include <tracking/trackFindingCDC/eventdata/trajectories/CDCTrajectorySZ.h>
18 #include <tracking/trackFindingCDC/numerics/Median.h>
19 #include <tracking/trackFindingCDC/numerics/WithWeight.h>
22 using namespace TrackFindingCDC;
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));