Belle II Software  release-05-01-25
twohitfilters.h
1 #include <tracking/vxdCaTracking/TwoHitFilters.h>
2 #include <gtest/gtest.h>
3 
4 namespace Belle2 {
11  class TwoHitFiltersTest : public ::testing::Test {
12  protected:
13  };
14 
16  TEST_F(TwoHitFiltersTest, TestEmptyFilter)
17  {
18  TwoHitFilters aFilter = TwoHitFilters();
19 
20  EXPECT_DOUBLE_EQ(0., aFilter.calcDist3D());
21 
22  EXPECT_DOUBLE_EQ(0., aFilter.fullDist3D());
23 
24  EXPECT_DOUBLE_EQ(0., aFilter.calcDistXY());
25 
26  EXPECT_DOUBLE_EQ(0., aFilter.fullDistXY());
27 
28  EXPECT_DOUBLE_EQ(0., aFilter.calcDistZ());
29 
30  EXPECT_DOUBLE_EQ(0., aFilter.calcSlopeRZ());
31 
32  EXPECT_DOUBLE_EQ(0., aFilter.calcNormedDist3D());
33 
34  EXPECT_DOUBLE_EQ(42., aFilter.filterNan(42.));
35 
36  EXPECT_DOUBLE_EQ(42, aFilter.filterNan(42));
37 
38  EXPECT_DOUBLE_EQ(42., aFilter.filterNan(42));
39 
40  EXPECT_DOUBLE_EQ(0., aFilter.filterNan(1. / 0.));
41 
42  }
43 
45  TEST_F(TwoHitFiltersTest, TestFilledFilter)
46  {
47  TVector3 innerHit(1, 2, 3);
48  TVector3 outerHit(2, 3, 4);
49 
50  TwoHitFilters aFilter = TwoHitFilters(outerHit, innerHit); // correct order
51 
52  EXPECT_DOUBLE_EQ(3., aFilter.calcDist3D()); // does calc dist (outer - innerHit)^2!
53 
54  EXPECT_DOUBLE_EQ(sqrt(3.), aFilter.fullDist3D()); // does calc dist (outer - innerHit)
55 
56  EXPECT_DOUBLE_EQ(2., aFilter.calcDistXY()); // does calc dist (outer - innerHit)^2!
57 
58  EXPECT_DOUBLE_EQ(sqrt(2.), aFilter.fullDistXY()); // does calc dist (outer - innerHit)calcDistXY
59 
60  EXPECT_DOUBLE_EQ(1., aFilter.calcDistZ());
61 
62  EXPECT_DOUBLE_EQ(atan(sqrt(2.)),
63  aFilter.calcSlopeRZ()); // normal slope is fullDistXY/calcDistZ = sqrt(2), here atan of slope is calculated
64 
65  EXPECT_DOUBLE_EQ(2. / 3., aFilter.calcNormedDist3D());
66 
67 
68  TwoHitFilters bFilter =
69  TwoHitFilters(); // initialising an empty filter first to check whether the resetting function is doing its job...
70 
71  bFilter.resetValues(innerHit, outerHit); // wrong order
72 
73  EXPECT_DOUBLE_EQ(aFilter.calcDist3D(), bFilter.calcDist3D()); // does calc dist (outer - innerHit)^2!
74 
75  EXPECT_DOUBLE_EQ(aFilter.fullDist3D(), bFilter.fullDist3D()); // does calc dist (outer - innerHit)
76 
77  EXPECT_DOUBLE_EQ(aFilter.calcDistXY(), bFilter.calcDistXY()); // does calc dist (outer - innerHit)^2!
78 
79  EXPECT_DOUBLE_EQ(aFilter.fullDistXY(), bFilter.fullDistXY()); // does calc dist (outer - innerHit)
80 
81  EXPECT_DOUBLE_EQ(-aFilter.calcDistZ(), bFilter.calcDistZ());
82 
83  EXPECT_DOUBLE_EQ(-aFilter.calcSlopeRZ(), bFilter.calcSlopeRZ());
84 
85  EXPECT_DOUBLE_EQ(aFilter.calcNormedDist3D(), bFilter.calcNormedDist3D());
86  }
87 
88 
89 
91  TEST_F(TwoHitFiltersTest, testLargeFilter)
92  {
93  TVector3 innerHit(1e150, 0, 0);
94  TVector3 outerHit(0, 0, 0);
95  TVector3 innerHit2(1, 2, 3);
96  TVector3 outerHit2(2, 3, 4);
97 
98  TwoHitFilters aFilter = TwoHitFilters(outerHit, innerHit); // correct order
99 
100  EXPECT_DOUBLE_EQ(1e300, aFilter.calcDist3D()); // does calc dist (outer - innerHit)^2!
101 
102  aFilter.resetValues(innerHit2, outerHit2);
103 
104  // does currently give an error at the clang-build:
105 // EXPECT_DOUBLE_EQ(-atan(sqrt(2.)), aFilter.calcSlopeRZ());
106  }
107 
108 
110  TEST_F(TwoHitFiltersTest, testOutOfRangeFilter) //approx 1.8e308 ... largest possible value of a double
111  {
112  TVector3 innerHit(1e300, 0, 0);
113  TVector3 outerHit(0, 0, 0);
114 
115  TwoHitFilters aFilter = TwoHitFilters(outerHit, innerHit); // correct order
116 
117 // EXPECT_DOUBLE_EQ(1e600, aFilter.calcDist3D()); // does calc dist (outer - innerHit)^2!
118  EXPECT_DOUBLE_EQ(innerHit * innerHit, aFilter.calcDist3D()); // does calc dist (outer - innerHit)^2!
119 
120  }
121 
124  TestOutOfRangeNormedDistFilter) //FAILS, because both calcDistXY() and calcDist3D() are too large to be stored in a double.
125  {
126  TVector3 innerHit(1e300, 0, 1e300);
127  TVector3 outerHit(0, 0, 0);
128  double correctResult = 1. / 2.; // this should be the result which is analytically correct
129  double wrongResult = 0.; // this is the result because of out of range of double precission
130 
131  TwoHitFilters aFilter = TwoHitFilters(outerHit, innerHit); // correct order
132 
133  // however, the values exceed the range of double, therefore the result is NOT EQUAL to the correct value:
134  EXPECT_NE(correctResult, aFilter.calcNormedDist3D());
135  EXPECT_DOUBLE_EQ(wrongResult, aFilter.calcNormedDist3D());
136  }
138 } // namespace
Belle2::TwoHitFilters::calcDist3D
double calcDist3D() const
calculates the distance between the hits (3D), returning unit: cm^2 for speed optimization
Definition: TwoHitFilters.h:65
Belle2::TwoHitFilters::fullDistXY
double fullDistXY() const
calculates the real distance between the hits (XY), returning unit: cm
Definition: TwoHitFilters.h:74
Belle2::TwoHitFilters::calcNormedDist3D
double calcNormedDist3D() const
calculates the normed distance between the hits (3D), return unit: none
Definition: TwoHitFilters.h:91
Belle2::TwoHitFilters
The class 'TwoHitFilters' bundles filter methods using 2 hits which are stored in TVector3s.
Definition: TwoHitFilters.h:32
Belle2::TwoHitFilters::calcSlopeRZ
double calcSlopeRZ() const
calculates the angle of the slope of the hits in RZ, returnValue = theta = atan(r/z)
Definition: TwoHitFilters.h:80
Belle2::TwoHitFilters::calcDistZ
double calcDistZ() const
calculates the distance between the hits (Z only), returning unit: cm
Definition: TwoHitFilters.h:77
Belle2::TwoHitFiltersTest
Set up a few arrays and objects in the datastore.
Definition: twohitfilters.h:11
Belle2::TwoHitFilters::fullDist3D
double fullDist3D() const
calculates the real distance between the hits (3D), returning unit: cm
Definition: TwoHitFilters.h:68
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::TEST_F
TEST_F(GlobalLabelTest, LargeNumberOfTimeDependentParameters)
Test large number of time-dep params for registration and retrieval.
Definition: globalLabel.cc:65
Belle2::TwoHitFilters::resetValues
void resetValues(TVector3 &outerHit, TVector3 &innerHit)
Overrides Constructor-Setup.
Definition: TwoHitFilters.h:56
Belle2::TwoHitFilters::calcDistXY
double calcDistXY() const
calculates the distance between the hits (XY), returning unit: cm^2 for speed optimization
Definition: TwoHitFilters.h:71
Belle2::TwoHitFilters::filterNan
double filterNan(double value) const
nice little nanChecker returns 0 if value was nan or inf, else returns value itself
Definition: TwoHitFilters.cc:17