Belle II Software  release-05-01-25
threehitfilters.h
1 #include <tracking/vxdCaTracking/ThreeHitFilters.h>
2 #include <gtest/gtest.h>
3 
4 namespace Belle2 {
11  class ThreeHitFiltersTest : public ::testing::Test {
12  protected:
13  };
14 
15 
18  {
19  // testing deltaPt-calculator:
20  TVector3 innerHit(1., 1., 0.), centerHit(3., 3., 0.), outerHitEvil(6., 3., 0.), outerHitSimple(6., 4., 0.);
21 
22  ThreeHitFilters aFilter = ThreeHitFilters(outerHitSimple, centerHit, innerHit);
23 
24 // B2INFO("now comparing values of calcCircleDist2IP using simple outerHit: \n calcPt: " << aFilter.calcCircleDist2IP())
25 // aFilter.resetValues(outerHitSimple,centerHit,innerHit);
26  EXPECT_FLOAT_EQ(0.44499173338941, aFilter.calcCircleDist2IP());
27 
28  aFilter.resetValues(outerHitEvil, centerHit, innerHit);
29 // B2INFO("now comparing values of calcCircleDist2IP using evil outerHit: \n calcPt: " << aFilter.calcPt())
30 // aFilter.resetValues(outerHitEvil,centerHit,innerHit);
31  EXPECT_FLOAT_EQ(0.719806016136754, aFilter.calcCircleDist2IP());
32 
33 // B2INFO("now tests with 0.976T (and reset between each step): \n")
34  aFilter.resetMagneticField(0.976);
35  aFilter.resetValues(outerHitSimple, centerHit, innerHit);
36 // B2INFO("now comparing values of calcCircleDist2IP using simple outerHit: \n calcPt: " << aFilter.calcCircleDist2IP() )
37 // aFilter.resetValues(outerHitSimple,centerHit,innerHit);
38  EXPECT_FLOAT_EQ(0.44499173338941, aFilter.calcCircleDist2IP());
39 
40  aFilter.resetValues(outerHitEvil, centerHit, innerHit);
41 // B2INFO("now comparing values of calcCircleDist2IP using evil outerHit: \n calcPt: " << aFilter.calcPt() )
42 // aFilter.resetValues(outerHitEvil,centerHit,innerHit);
43  EXPECT_FLOAT_EQ(0.719806016136754, aFilter.calcCircleDist2IP());
44  }
45 
46 
48  TEST_F(ThreeHitFiltersTest, TestMagneticField)
49  {
50  TVector3 innerHit(1., 1., 0.), centerHit(3., 3., 0.), outerHitEvil(6., 3., 0.), outerHitSimple(6., 4., 0.);
51 
52  ThreeHitFilters aFilter = ThreeHitFilters(outerHitSimple, centerHit, innerHit);
53 
54  EXPECT_DOUBLE_EQ(1.5, aFilter.getMagneticField()); // standard case
55 
56  aFilter.resetMagneticField(1);
57  EXPECT_DOUBLE_EQ(1., aFilter.getMagneticField());
58 
59  EXPECT_DOUBLE_EQ(26.5650511770779893515721937204532946712042, aFilter.fullAngle3D()); //angle in degrees
60  }
61 
62 
65  {
66 // TVector3 innerHit(1., 1., 0.), centerHit(3., 3., 0.), outerHitEvil(6., 3., 0.), outerHitSimple(6., 4., 0.);
67  TVector3 innerHit(1., 1., 0.), centerHit(3., 3., 0.), outerHit(6., 4., 1.);
68  TVector3 cent_inner = centerHit - innerHit, outer_center = outerHit - centerHit;
69 
70 // B2INFO("now tests with 1T \n")
71  ThreeHitFilters aFilter = ThreeHitFilters(outerHit, centerHit, innerHit);
72 
73  EXPECT_DOUBLE_EQ(31.4821541052938556040832384555411729852856, aFilter.fullAngle3D()); //angle in degrees
74  EXPECT_DOUBLE_EQ(0.090909090909090909091, aFilter.calcAngle3D());
75 
76  EXPECT_DOUBLE_EQ(26.5650511770779893515721937204532946712042, aFilter.fullAngleXY()); //angle in degrees
77  EXPECT_DOUBLE_EQ(.1, aFilter.calcAngleXY());
78 
79  EXPECT_FLOAT_EQ(17.54840061379229806435203716652846677620, aFilter.fullAngleRZ());
80  EXPECT_FLOAT_EQ(cos(17.54840061379229806435203716652846677620 * M_PI / 180.), aFilter.calcAngleRZ());
81 
82  EXPECT_DOUBLE_EQ(0.4636476090008061162142562314612144020285, aFilter.fullAngle2D(outer_center, cent_inner)); //angle in radians
83  EXPECT_DOUBLE_EQ(0.89442719099991586, aFilter.calcAngle2D(outer_center, cent_inner));
84  }
85 
86 
88  TEST_F(ThreeHitFiltersTest, TestSignAndOtherFilters)
89  {
90  TVector3 innerHit(1., 1., 0.), centerHit(3., 3., 0.), outerHit(6., 4., 1.), sigma(.01, .01, .01), unrealsigma(2, 2, 2),
91  outerhighHit(4., 6., 1.);
92 
93  ThreeHitFilters aFilter = ThreeHitFilters(outerHit, centerHit, innerHit);
94 
95  EXPECT_DOUBLE_EQ(0.30627736916966945608, aFilter.calcDeltaSlopeRZ());
96 
97  EXPECT_DOUBLE_EQ(0., aFilter.calcHelixFit());
98 
99  EXPECT_DOUBLE_EQ(1., aFilter.calcSign(outerHit, centerHit, innerHit, sigma, sigma, sigma));
100  EXPECT_DOUBLE_EQ(-1., aFilter.calcSign(outerhighHit, centerHit, innerHit, sigma, sigma, sigma));
101  EXPECT_DOUBLE_EQ(-1., aFilter.calcSign(innerHit, centerHit, outerHit, sigma, sigma, sigma));
102  EXPECT_DOUBLE_EQ(0., aFilter.calcSign(outerHit, centerHit, innerHit, unrealsigma, unrealsigma,
103  unrealsigma)); //for very large sigma, this track is approximately straight.
104 
105  EXPECT_LT(0., aFilter.calcSign(outerHit, centerHit, innerHit));
106  EXPECT_GT(0., aFilter.calcSign(outerhighHit, centerHit, innerHit));
107  EXPECT_GT(0., aFilter.calcSign(innerHit, centerHit, outerHit));
108  EXPECT_LT(0., aFilter.calcSign(outerHit, centerHit, innerHit));
109 
110  EXPECT_DOUBLE_EQ(1., aFilter.calcSign(outerHit, centerHit, innerHit));
111  EXPECT_DOUBLE_EQ(-1., aFilter.calcSign(outerhighHit, centerHit, innerHit));
112  EXPECT_DOUBLE_EQ(-1., aFilter.calcSign(innerHit, centerHit, outerHit));
113  }
114 
115 
117  TEST_F(ThreeHitFiltersTest, TestDeltaSOverZ)
118  {
119  TVector3 innerHit(1., 1., 0.), centerHit(3., 3., 1.), outerHit(6., 4., 3.);
120  TVector3 cent_inner = centerHit - innerHit, outer_center = outerHit - centerHit;
121  ThreeHitFilters aFilter = ThreeHitFilters(outerHit, centerHit, innerHit);
122 
123  EXPECT_FLOAT_EQ(0.31823963, aFilter.calcDeltaSlopeZOverS());
124 
125  outerHit.RotateZ(.4);
126  centerHit.RotateZ(.4);
127  innerHit.RotateZ(.4);
128  aFilter.resetValues(outerHit, centerHit, innerHit); //calcDeltaSOverZV2 is invariant under rotations in the r-z plane
129 
130  EXPECT_FLOAT_EQ(0.31823963, aFilter.calcDeltaSlopeZOverS());
131  }
132 
133 
136  {
137  // calcCircleCenterV2 had problems when x_1==x_2 or y_1==y_2
138  TVector3 innerHit(1., 2., 0.), centerHit(3., 2., 1.), outerHit(3., 4., 3.);
139  TVector3 cent_inner = centerHit - innerHit, outer_center = outerHit - centerHit;
140  ThreeHitFilters aFilter = ThreeHitFilters();
141  TVector3 innerHit2(1., 1., 0.), centerHit2(3., 3., 0.), outerHitEvil(6., 3., 0.);
142 
143  double pt = 0, ptTrue = 0;
144 
145  aFilter.resetValues(outerHit, centerHit, innerHit);
146  ptTrue = aFilter.calcPt(1.414213562373095048801688724209698078570);
147  aFilter.resetValues(outerHit, centerHit, innerHit);
148  pt = aFilter.calcPt();
149  EXPECT_DOUBLE_EQ(ptTrue, pt);
150 
151  ptTrue = 0.017118925181688543;
152  aFilter.resetValues(outerHitEvil, centerHit2, innerHit2);
153  pt = aFilter.calcPt();
154  EXPECT_DOUBLE_EQ(ptTrue, pt);
155 
156  aFilter.resetValues(outerHit, outerHit, innerHit);
157  //B2WARNING("MUST produce errors: 2 hits are the same: " << ptTrue << ", Pt: " << pt );
158  ptTrue = aFilter.calcPt(1.414213562373095048801688724209698078570);
159  aFilter.resetValues(outerHit, outerHit, innerHit);
160  EXPECT_ANY_THROW(aFilter.calcPt());
161  }
163 } // namespace
Belle2::ThreeHitFilters::resetValues
void resetValues(TVector3 &outerHit, TVector3 &centerHit, TVector3 &innerHit)
Overrides Constructor-Setup.
Definition: ThreeHitFilters.h:75
Belle2::ThreeHitFilters::calcAngleRZ
double calcAngleRZ()
calculates the angle between the hits/vectors (RZ), returning unit: none (calculation for degrees is ...
Definition: ThreeHitFilters.h:152
Belle2::ThreeHitFiltersTest
Set up a few arrays and objects in the datastore.
Definition: threehitfilters.h:11
Belle2::ThreeHitFilters::fullAngleRZ
double fullAngleRZ()
calculates the angle between the hits/vectors (RZ), returning unit: angle in degrees
Definition: ThreeHitFilters.h:162
Belle2::ThreeHitFilters::fullAngle2D
double fullAngle2D(TVector3 &vecA, TVector3 &vecB)
calculates the angle between the hits/vectors (2D), generalized, returning unit: angle in radians WAR...
Definition: ThreeHitFilters.h:282
Belle2::ThreeHitFilters::calcCircleDist2IP
double calcCircleDist2IP()
calculates the distance of the point of closest approach of circle to the IP, returning unit: cm
Definition: ThreeHitFilters.h:174
Belle2::ThreeHitFilters::calcHelixFit
double calcHelixFit()
reverse compatibility, calls calcHelixParameterFit
Definition: ThreeHitFilters.h:268
Belle2::ThreeHitFilters::fullAngleXY
double fullAngleXY()
calculates the angle between the hits/vectors (XY), returning unit: angle in degrees
Definition: ThreeHitFilters.h:142
Belle2::ThreeHitFilters::calcDeltaSlopeRZ
double calcDeltaSlopeRZ()
calculates deviations in the slope of the inner segment and the outer segment, returning unit: none
Definition: ThreeHitFilters.h:204
Belle2::ThreeHitFilters::calcSign
int calcSign(TVector3 &a, TVector3 &b, TVector3 &c)
calculates calculates the sign of the curvature of given 3-hit-tracklet.
Definition: ThreeHitFilters.cc:21
Belle2::ThreeHitFilters::calcAngleXY
double calcAngleXY()
calculates the angle between the hits/vectors (XY), returning unit: none (calculation for degrees is ...
Definition: ThreeHitFilters.h:133
Belle2::ThreeHitFilters::calcAngle2D
double calcAngle2D(TVector3 &vecA, TVector3 &vecB)
calculates the angle between the hits/vectors (2D), generalized, returning unit: none.
Definition: ThreeHitFilters.h:273
Belle2::ThreeHitFilters::calcAngle3D
double calcAngle3D()
calculates the angle between the hits/vectors (3D), returning unit: none (calculation for degrees is ...
Definition: ThreeHitFilters.h:113
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::ThreeHitFilters::fullAngle3D
double fullAngle3D()
calculates the angle between the hits/vectors (3D), returning unit: angle in degrees
Definition: ThreeHitFilters.h:123
Belle2::ThreeHitFilters::getMagneticField
double getMagneticField()
returns the set value of the magnetic field in Tesla
Definition: ThreeHitFilters.h:103
Belle2::ThreeHitFilters::calcDeltaSlopeZOverS
double calcDeltaSlopeZOverS()
compares the "slopes" z over arc length.
Definition: ThreeHitFilters.h:237
Belle2::ThreeHitFilters::resetMagneticField
void resetMagneticField(double magneticFieldStrength=1.5)
Overrides Constructor-Setup for magnetic field.
Definition: ThreeHitFilters.h:98
Belle2::ThreeHitFilters
The class 'ThreeHitFilters' bundles filter methods using 3 hits which are stored in TVector3s.
Definition: ThreeHitFilters.h:33
Belle2::ThreeHitFilters::calcPt
double calcPt()
calculates the estimation of the transverse momentum of the 3-hit-tracklet, returning unit: GeV/c
Definition: ThreeHitFilters.h:184