10 #include <tracking/trackFindingCDC/fitting/CDCSZFitter.h>
12 #include <tracking/trackFindingCDC/fitting/CDCRiemannFitter.h>
13 #include <tracking/trackFindingCDC/fitting/CDCKarimakiFitter.h>
14 #include <tracking/trackFindingCDC/fitting/CDCFitter2D.icc.h>
15 #include <tracking/trackFindingCDC/fitting/CDCObservations2D.h>
16 #include <tracking/trackFindingCDC/fitting/CDCSZObservations.h>
18 #include <tracking/trackFindingCDC/fitting/ExtendedRiemannsMethod.h>
19 #include <tracking/trackFindingCDC/fitting/RiemannsMethod.h>
21 #include <tracking/trackFindingCDC/eventdata/trajectories/CDCTrajectorySZ.h>
22 #include <tracking/trackFindingCDC/eventdata/trajectories/CDCTrajectory2D.h>
24 #include <tracking/trackFindingCDC/geometry/UncertainSZLine.h>
25 #include <tracking/trackFindingCDC/geometry/UncertainPerigeeCircle.h>
26 #include <tracking/trackFindingCDC/geometry/PerigeeParameters.h>
27 #include <tracking/trackFindingCDC/geometry/Circle2D.h>
28 #include <tracking/trackFindingCDC/geometry/Vector2D.h>
30 #include <framework/logging/Logger.h>
32 #include <gtest/gtest.h>
35 using namespace TrackFindingCDC;
38 const Vector2D generalCenter(6.0, 0);
39 const double generalRadius = 5.0;
41 const Circle2D generalCircle(generalCenter, generalRadius);
43 std::vector<Vector2D> createGeneralCircleObservationCenters()
45 std::vector<Vector2D> observationCenters;
47 for (
int iObservation = 11; iObservation > -12; --iObservation) {
48 double y = iObservation / 2.0;
50 observationCenters.emplace_back(x, y);
52 return observationCenters;
55 CDCObservations2D createGeneralCircleObservations(
bool withDriftLength =
true)
57 std::vector<Vector2D> observationCenters = createGeneralCircleObservationCenters();
59 CDCObservations2D observations2D;
60 if (withDriftLength) {
61 for (
const Vector2D& observationCenter : observationCenters) {
62 double distance = generalCircle.distance(observationCenter);
63 observations2D.fill(observationCenter, distance);
66 for (
const Vector2D& observationCenter : observationCenters) {
67 Vector2D onCircle = generalCircle.closest(observationCenter);
68 observations2D.fill(onCircle, 0.0);
71 return observations2D;
74 template<
class AFitter>
75 CDCTrajectory2D testGeneralCircleFitter(
const AFitter& fitter,
const bool withDriftLenght)
78 CDCObservations2D observations2D = createGeneralCircleObservations(withDriftLenght);
79 CDCTrajectory2D trajectory2D;
80 fitter.update(trajectory2D, observations2D);
82 trajectory2D.setLocalOrigin(Vector2D(0.0, 0.0));
83 const UncertainPerigeeCircle& fittedCircle = trajectory2D.getLocalCircle();
85 EXPECT_NEAR(generalCircle.perigee().x(), fittedCircle->perigee().x(), 10e-7) <<
86 "AFitter " <<
typeid(fitter).name() <<
" failed.";
87 EXPECT_NEAR(generalCircle.perigee().y(), fittedCircle->perigee().y(), 10e-7) <<
88 "AFitter " <<
typeid(fitter).name() <<
" failed.";
89 EXPECT_NEAR(generalCircle.radius(), fittedCircle->radius(), 10e-7) <<
90 "AFitter " <<
typeid(fitter).name() <<
" failed.";
91 EXPECT_NEAR(generalCircle.tangentialPhi(), fittedCircle->phi0(), 10e-7) <<
92 "AFitter " <<
typeid(fitter).name() <<
" failed.";
93 EXPECT_NEAR(0.0, fittedCircle.chi2(), 10e-7) <<
"AFitter " <<
typeid(fitter).name() <<
" failed.";
95 const double curv = fittedCircle->curvature();
96 const double I = fittedCircle->impact();
97 const double phi = fittedCircle->phi0();
99 const double chi2 = fittedCircle.chi2();
101 B2INFO(
"Curvature " << curv);
102 B2INFO(
"Tangential phi " << phi);
103 B2INFO(
"Impact " << I);
104 B2INFO(
"Chi2 " << chi2);
106 B2INFO(
"Covariance matrix:");
107 B2INFO(fittedCircle.perigeeCovariance());
113 Line2D line(-0.5, 0.0, -1.0);
115 template<
class AFitter>
116 CDCTrajectory2D testLineFitter(
const AFitter& fitter)
119 CDCObservations2D observations2D;
120 observations2D.fill(Vector2D(0, 0), 0.5);
121 observations2D.fill(Vector2D(1, -1), -0.5);
122 observations2D.fill(Vector2D(2, 0), 0.5);
124 CDCTrajectory2D trajectory2D;
126 fitter.update(trajectory2D, observations2D);
128 trajectory2D.setLocalOrigin(Vector2D(0.0, 0.0));
129 const UncertainPerigeeCircle& fittedCircle = trajectory2D.getLocalCircle();
131 EXPECT_EQ(0.0, fittedCircle->curvature()) <<
"AFitter " <<
typeid(fitter).name() <<
" failed.";
133 Vector2D perigee = trajectory2D.getGlobalPerigee();
134 EXPECT_NEAR(0.0, perigee.x(), 10e-7);
135 EXPECT_NEAR(-0.5, perigee.y(), 10e-7);
144 TEST(TrackFindingCDCTest, fitting_ExtendedRiemannsMethod_GeneralCircleFit_NoDriftLength)
146 const CDCFitter2D<ExtendedRiemannsMethod> fitter;
147 CDCTrajectory2D trajectory2D = testGeneralCircleFitter(fitter,
false);
149 trajectory2D.setLocalOrigin(Vector2D(0.0, 0.0));
150 const UncertainPerigeeCircle& perigeeCircle = trajectory2D.getLocalCircle();
151 PerigeeCovariance perigeeCovariance = perigeeCircle.perigeeCovariance();
153 EXPECT_NEAR(0.0003644, perigeeCovariance(0, 0), 10e-7);
154 EXPECT_NEAR(3.028e-20, perigeeCovariance(0, 1), 10e-7);
155 EXPECT_NEAR(-0.002235, perigeeCovariance(0, 2), 10e-7);
157 EXPECT_NEAR(3.028e-20, perigeeCovariance(1, 0), 10e-7);
158 EXPECT_NEAR(0.002525, perigeeCovariance(1, 1), 10e-7);
159 EXPECT_NEAR(-1.265e-19, perigeeCovariance(1, 2), 10e-7);
161 EXPECT_NEAR(-0.002235, perigeeCovariance(2, 0), 10e-7);
162 EXPECT_NEAR(-1.265e-19, perigeeCovariance(2, 1), 10e-7);
163 EXPECT_NEAR(0.09703616, perigeeCovariance(2, 2), 10e-7);
168 TEST(TrackFindingCDCTest, fitting_ExtendedRiemannsMethod_GeneralCircleFit_WithDriftLengths)
170 const CDCFitter2D<ExtendedRiemannsMethod> fitter;
171 testGeneralCircleFitter(fitter,
true);
175 TEST(TrackFindingCDCTest, fitting_RiemannsMethod_GeneralCircleFit_WithDriftLengths)
177 const CDCFitter2D<RiemannsMethod> fitter;
178 testGeneralCircleFitter(fitter,
true);
183 TEST(TrackFindingCDCTest, fitting_CDCRiemannFitter_CircleFit_NoDriftLength)
186 testGeneralCircleFitter(fitter,
false);
191 TEST(TrackFindingCDCTest, fitting_CDCKarimakiFitter_CircleFit_NoDriftLength)
194 fitter.useOnlyPosition();
195 testGeneralCircleFitter(fitter,
false);
200 TEST(TrackFindingCDCTest, fitting_CDCRiemannFitter_LineFit_WithDriftLength)
203 testLineFitter(fitter);
206 TEST(TrackFindingCDCTest, fitting_CDCSZFitter)
209 CDCSZObservations szObservations;
211 szObservations.fill(0, 0);
212 szObservations.fill(5, 3);
213 szObservations.fill(10, 0);
215 CDCTrajectorySZ trajectorySZ = fitter.fit(szObservations);
216 const UncertainSZLine& fittedSZLine = trajectorySZ.getSZLine();
218 EXPECT_NEAR(0.0, fittedSZLine->slope(), 10e-10);
219 EXPECT_NEAR(1.0, fittedSZLine->intercept(), 10e-10);