Belle II Software  release-05-01-25
fitting.test.cc
1 /**************************************************************************
2  * BASF2 (Belle Analysis Framework 2) *
3  * Copyright(C) 2014 - Belle II Collaboration *
4  * *
5  * Author: The Belle II Collaboration *
6  * Contributors: Oliver Frost <oliver.frost@desy.de> *
7  * *
8  * This software is provided "as is" without any warranty. *
9  **************************************************************************/
10 #include <tracking/trackFindingCDC/fitting/CDCSZFitter.h>
11 
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>
17 
18 #include <tracking/trackFindingCDC/fitting/ExtendedRiemannsMethod.h>
19 #include <tracking/trackFindingCDC/fitting/RiemannsMethod.h>
20 
21 #include <tracking/trackFindingCDC/eventdata/trajectories/CDCTrajectorySZ.h>
22 #include <tracking/trackFindingCDC/eventdata/trajectories/CDCTrajectory2D.h>
23 
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>
29 
30 #include <framework/logging/Logger.h>
31 
32 #include <gtest/gtest.h>
33 
34 using namespace Belle2;
35 using namespace TrackFindingCDC;
36 
37 namespace {
38  const Vector2D generalCenter(6.0, 0);
39  const double generalRadius = 5.0;
40 
41  const Circle2D generalCircle(generalCenter, generalRadius);
42 
43  std::vector<Vector2D> createGeneralCircleObservationCenters()
44  {
45  std::vector<Vector2D> observationCenters;
46  // Setting up a trajectory traveling clockwise
47  for (int iObservation = 11; iObservation > -12; --iObservation) {
48  double y = iObservation / 2.0;
49  double x = fabs(y);
50  observationCenters.emplace_back(x, y);
51  }
52  return observationCenters;
53  }
54 
55  CDCObservations2D createGeneralCircleObservations(bool withDriftLength = true)
56  {
57  std::vector<Vector2D> observationCenters = createGeneralCircleObservationCenters();
58 
59  CDCObservations2D observations2D;
60  if (withDriftLength) {
61  for (const Vector2D& observationCenter : observationCenters) {
62  double distance = generalCircle.distance(observationCenter);
63  observations2D.fill(observationCenter, distance);
64  }
65  } else {
66  for (const Vector2D& observationCenter : observationCenters) {
67  Vector2D onCircle = generalCircle.closest(observationCenter);
68  observations2D.fill(onCircle, 0.0);
69  }
70  }
71  return observations2D;
72  }
73 
74  template<class AFitter>
75  CDCTrajectory2D testGeneralCircleFitter(const AFitter& fitter, const bool withDriftLenght)
76  {
77  // Setup a test circle
78  CDCObservations2D observations2D = createGeneralCircleObservations(withDriftLenght);
79  CDCTrajectory2D trajectory2D;
80  fitter.update(trajectory2D, observations2D);
81 
82  trajectory2D.setLocalOrigin(Vector2D(0.0, 0.0));
83  const UncertainPerigeeCircle& fittedCircle = trajectory2D.getLocalCircle();
84 
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.";
94 
95  const double curv = fittedCircle->curvature();
96  const double I = fittedCircle->impact();
97  const double phi = fittedCircle->phi0();
98 
99  const double chi2 = fittedCircle.chi2();
100 
101  B2INFO("Curvature " << curv);
102  B2INFO("Tangential phi " << phi);
103  B2INFO("Impact " << I);
104  B2INFO("Chi2 " << chi2);
105 
106  B2INFO("Covariance matrix:");
107  B2INFO(fittedCircle.perigeeCovariance());
108  return trajectory2D;
109  }
110 
111 
112 
113  Line2D line(-0.5, 0.0, -1.0);
114 
115  template<class AFitter>
116  CDCTrajectory2D testLineFitter(const AFitter& fitter)
117  {
118 
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);
123 
124  CDCTrajectory2D trajectory2D;
125 
126  fitter.update(trajectory2D, observations2D);
127 
128  trajectory2D.setLocalOrigin(Vector2D(0.0, 0.0));
129  const UncertainPerigeeCircle& fittedCircle = trajectory2D.getLocalCircle();
130 
131  EXPECT_EQ(0.0, fittedCircle->curvature()) << "AFitter " << typeid(fitter).name() << " failed.";
132 
133  Vector2D perigee = trajectory2D.getGlobalPerigee();
134  EXPECT_NEAR(0.0, perigee.x(), 10e-7);
135  EXPECT_NEAR(-0.5, perigee.y(), 10e-7);
136 
137  return trajectory2D;
138  }
139 
140 }
141 
142 
143 
144 TEST(TrackFindingCDCTest, fitting_ExtendedRiemannsMethod_GeneralCircleFit_NoDriftLength)
145 {
146  const CDCFitter2D<ExtendedRiemannsMethod> fitter;
147  CDCTrajectory2D trajectory2D = testGeneralCircleFitter(fitter, false);
148 
149  trajectory2D.setLocalOrigin(Vector2D(0.0, 0.0));
150  const UncertainPerigeeCircle& perigeeCircle = trajectory2D.getLocalCircle();
151  PerigeeCovariance perigeeCovariance = perigeeCircle.perigeeCovariance();
152 
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);
156 
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);
160 
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);
164 }
165 
166 
167 
168 TEST(TrackFindingCDCTest, fitting_ExtendedRiemannsMethod_GeneralCircleFit_WithDriftLengths)
169 {
170  const CDCFitter2D<ExtendedRiemannsMethod> fitter;
171  testGeneralCircleFitter(fitter, true);
172 }
173 
174 
175 TEST(TrackFindingCDCTest, fitting_RiemannsMethod_GeneralCircleFit_WithDriftLengths)
176 {
177  const CDCFitter2D<RiemannsMethod> fitter;
178  testGeneralCircleFitter(fitter, true);
179 }
180 
181 
182 
183 TEST(TrackFindingCDCTest, fitting_CDCRiemannFitter_CircleFit_NoDriftLength)
184 {
185  CDCRiemannFitter fitter = CDCRiemannFitter::getFitter();
186  testGeneralCircleFitter(fitter, false);
187 }
188 
189 
190 
191 TEST(TrackFindingCDCTest, fitting_CDCKarimakiFitter_CircleFit_NoDriftLength)
192 {
193  CDCKarimakiFitter fitter = CDCKarimakiFitter::getFitter();
194  fitter.useOnlyPosition();
195  testGeneralCircleFitter(fitter, false);
196 }
197 
198 
199 
200 TEST(TrackFindingCDCTest, fitting_CDCRiemannFitter_LineFit_WithDriftLength)
201 {
202  CDCRiemannFitter fitter = CDCRiemannFitter::getLineFitter();
203  testLineFitter(fitter);
204 }
205 
206 TEST(TrackFindingCDCTest, fitting_CDCSZFitter)
207 {
208  CDCSZFitter fitter;
209  CDCSZObservations szObservations;
210 
211  szObservations.fill(0, 0);
212  szObservations.fill(5, 3);
213  szObservations.fill(10, 0);
214 
215  CDCTrajectorySZ trajectorySZ = fitter.fit(szObservations);
216  const UncertainSZLine& fittedSZLine = trajectorySZ.getSZLine();
217 
218  EXPECT_NEAR(0.0, fittedSZLine->slope(), 10e-10);
219  EXPECT_NEAR(1.0, fittedSZLine->intercept(), 10e-10);
220 }
Belle2::TrackFindingCDC::CDCRiemannFitter::getLineFitter
static const CDCRiemannFitter & getLineFitter()
Static getter for a line fitter.
Definition: CDCRiemannFitter.cc:36
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::TEST
TEST(TestgetDetectorRegion, TestgetDetectorRegion)
Test Constructors.
Definition: utilityFunctions.cc:18
Belle2::TrackFindingCDC::CDCRiemannFitter::getFitter
static const CDCRiemannFitter & getFitter()
Static getter for a general Riemann fitter.
Definition: CDCRiemannFitter.cc:22
Belle2::TrackFindingCDC::CDCKarimakiFitter::getFitter
static const CDCKarimakiFitter & getFitter()
Static getter for a general fitter instance with Karimakis method.
Definition: CDCKarimakiFitter.cc:22