11 #include <gtest/gtest.h>
13 #include <tracking/spacePointCreation/SpacePoint.h>
14 #include <tracking/trackFindingVXD/filterMap/threeHitVariables/Angle3DSimple.h>
15 #include <tracking/trackFindingVXD/filterMap/threeHitVariables/Angle3DFull.h>
16 #include <tracking/trackFindingVXD/filterMap/threeHitVariables/CosAngleXY.h>
17 #include <tracking/trackFindingVXD/filterMap/threeHitVariables/AngleXYFull.h>
18 #include <tracking/trackFindingVXD/filterMap/threeHitVariables/AngleRZSimple.h>
19 #include <tracking/trackFindingVXD/filterMap/threeHitVariables/AngleRZFull.h>
20 #include <tracking/trackFindingVXD/filterMap/threeHitVariables/CircleDist2IP.h>
21 #include <tracking/trackFindingVXD/filterMap/threeHitVariables/SignCurvatureXY.h>
22 #include <tracking/trackFindingVXD/filterMap/threeHitVariables/SignCurvatureXYError.h>
23 #include <tracking/trackFindingVXD/filterMap/threeHitVariables/DeltaSlopeRZ.h>
24 #include <tracking/trackFindingVXD/filterMap/threeHitVariables/DeltaSlopeZoverS.h>
25 #include <tracking/trackFindingVXD/filterMap/threeHitVariables/DeltaSoverZ.h>
26 #include <tracking/trackFindingVXD/filterMap/threeHitVariables/HelixParameterFit.h>
27 #include <tracking/trackFindingVXD/filterMap/threeHitVariables/Pt.h>
28 #include <tracking/trackFindingVXD/filterMap/threeHitVariables/CircleRadius.h>
29 #include <tracking/trackFindingVXD/filterTools/SelectionVariableHelper.h>
31 #include <tracking/trackFindingVXD/filterMap/filterFramework/Shortcuts.h>
33 #include <vxd/geometry/SensorInfoBase.h>
41 namespace VXDTFthreeHitFilterTest {
54 VXD::SensorInfoBase sensorInfoBase(VXD::SensorInfoBase::PXD, aVxdID, 2.3, 4.2, 0.3, 2, 4, -1);
57 r1.SetAngles(45, 20, 30);
58 TGeoTranslation t1(globalX, globalY, globalZ);
59 TGeoCombiTrans c1(t1, r1);
60 TGeoHMatrix transform = c1;
61 sensorInfoBase.setTransformation(transform);
63 sensorInfoBase.setTransformation(transform,
true);
65 return sensorInfoBase;
71 SpacePoint provideSpacePointDummy(
double X,
double Y,
double Z)
76 PXDCluster aCluster =
PXDCluster(aVxdID, 0., 0., 0.1, 0.1, 0, 0, 1, 1, 1, 1, 1, 1);
83 SpacePoint provideSpacePointDummyError(
double X,
double Y,
double Z,
double eX,
double eY,
double eZ)
96 double lastResult = 0.;
104 template<
class Var,
typename ... otherTypes>
105 static void notify(
const Var& filterType,
106 typename Var::variableType fResult,
109 B2INFO(
"ResultsObserver: Filter " << filterType.name() <<
" got result of " << fResult);
110 lastResult = fResult;
117 TEST_F(ThreeHitFilterTest, SpacePointCreation)
119 SpacePoint testSP = provideSpacePointDummy(1.2, 2.3, 4.2);
127 TEST_F(ThreeHitFilterTest, SelectionVariableName)
129 auto angle3DS = Angle3DSimple<SpacePoint>();
130 EXPECT_EQ(
"Angle3DSimple" , angle3DS.name());
131 auto angle3DF = Angle3DFull<SpacePoint>();
132 EXPECT_EQ(
"Angle3DFull" , angle3DF.name());
133 auto angleXYF = AngleXYFull<SpacePoint>();
134 EXPECT_EQ(
"AngleXYFull" , angleXYF.name());
135 auto angleXYS = CosAngleXY<SpacePoint>();
136 EXPECT_EQ(
"CosAngleXY" , angleXYS.name());
137 auto angleRZF = AngleRZFull<SpacePoint>();
138 EXPECT_EQ(
"AngleRZFull" , angleRZF.name());
139 auto angleRZS = AngleRZSimple<SpacePoint>();
140 EXPECT_EQ(
"AngleRZSimple" , angleRZS.name());
141 auto dSlopeRZ = DeltaSlopeRZ<SpacePoint>();
142 EXPECT_EQ(
"DeltaSlopeRZ" , dSlopeRZ.name());
143 auto helixFit = HelixParameterFit<SpacePoint>();
144 EXPECT_EQ(
"HelixParameterFit" , helixFit.name());
145 auto dSlopeZS = DeltaSlopeZoverS<SpacePoint>();
146 EXPECT_EQ(
"DeltaSlopeZoverS" , dSlopeZS.name());
147 auto dSZ = DeltaSoverZ<SpacePoint>();
148 EXPECT_EQ(
"DeltaSoverZ" , dSZ.name());
149 auto pT = Pt<SpacePoint>();
150 EXPECT_EQ(
"Pt" , pT.name());
151 auto cDist2IP = CircleDist2IP<SpacePoint>();
152 EXPECT_EQ(
"CircleDist2IP" , cDist2IP.name());
157 TEST_F(ThreeHitFilterTest, BasicFilterTestAngle3DSimple)
162 SpacePoint x1 = provideSpacePointDummy(0. , 0., 0.);
163 SpacePoint x2 = provideSpacePointDummy(.5 , 0., 0.);
164 SpacePoint x3 = provideSpacePointDummy(2. , 0., 0.);
166 EXPECT_FALSE(
filter.accept(x1, x2, x3));
172 TEST_F(ThreeHitFilterTest, TestAngles)
174 SpacePoint outerSP = provideSpacePointDummy(6., 4., 1.);
175 SpacePoint centerSP = provideSpacePointDummy(3., 3., 0.);
176 SpacePoint innerSP = provideSpacePointDummy(1., 1., 0.);
181 EXPECT_TRUE(filterAngle3D.accept(outerSP, centerSP, innerSP));
182 EXPECT_FLOAT_EQ(0.090909090909090909091, lastResult);
186 EXPECT_TRUE(filterAngle3Dfull.accept(outerSP, centerSP, innerSP));
187 EXPECT_FLOAT_EQ(31.4821541052938556040832384555411729852856, lastResult);
192 EXPECT_TRUE(filterAngleXYfull.accept(outerSP, centerSP, innerSP));
193 EXPECT_FLOAT_EQ(26.5650511770779893515721937204532946712042, lastResult);
197 EXPECT_TRUE(filterAngleXY.accept(outerSP, centerSP, innerSP));
198 EXPECT_NEAR(0.89442718, lastResult, 0.0000001);
203 EXPECT_TRUE(filterAngleRZfull.accept(outerSP, centerSP, innerSP));
204 EXPECT_NEAR(17.548400613792298064, lastResult, 0.001);
208 EXPECT_TRUE(filterAngleRZ.accept(outerSP, centerSP, innerSP));
209 EXPECT_NEAR(cos(17.54840061379229806435203716652846677620 * M_PI / 180.), lastResult, 0.001);
215 TEST_F(ThreeHitFilterTest, TestSignAndOtherFilters)
217 SpacePoint outerSP = provideSpacePointDummy(6., 4., 1.);
218 SpacePoint centerSP = provideSpacePointDummy(3., 3., 0.);
219 SpacePoint innerSP = provideSpacePointDummy(1., 1., 0.);
220 SpacePoint outerHighSP = provideSpacePointDummy(4., 6., 1.);
221 B2Vector3D sigma(.01, .01, .01), unrealsigma(2, 2, 2);
223 SpacePoint outerSPsigma = provideSpacePointDummyError(6., 4., 1., 0.01, 0.01, 0.01);
224 SpacePoint centerSPsigma = provideSpacePointDummyError(3., 3., 0., 0.01, 0.01, 0.01);
225 SpacePoint innerSPsigma = provideSpacePointDummyError(1., 1., 0., 0.01, 0.01, 0.01);
226 SpacePoint outerHighSPsigma = provideSpacePointDummyError(4., 6., 1., 0.01, 0.01, 0.01);
228 SpacePoint outerSPunrealsigma = provideSpacePointDummyError(6., 4., 1., 2., 2., 2.);
229 SpacePoint centerSPunrealsigma = provideSpacePointDummyError(3., 3., 0., 2., 2., 2.);
230 SpacePoint innerSPunrealsigma = provideSpacePointDummyError(1., 1., 0., 2., 2., 2.);
234 EXPECT_TRUE(filterDeltaSlopeRZ.accept(outerSP, centerSP, innerSP));
235 EXPECT_FLOAT_EQ(0.30627736916966945608, lastResult);
239 EXPECT_TRUE(filterHelixFit.accept(outerSP, centerSP, innerSP));
240 EXPECT_FLOAT_EQ(0., lastResult);
242 EXPECT_DOUBLE_EQ(1., SignCurvatureXYError<SpacePoint>::value(outerSPsigma, centerSPsigma, innerSPsigma));
243 EXPECT_DOUBLE_EQ(-1., SignCurvatureXYError<SpacePoint>::value(outerHighSPsigma, centerSPsigma, innerSPsigma));
244 EXPECT_DOUBLE_EQ(-1., SignCurvatureXYError<SpacePoint>::value(innerSPsigma, centerSPsigma, outerSPsigma));
246 EXPECT_DOUBLE_EQ(0., SignCurvatureXYError<SpacePoint>::value(outerSPunrealsigma, centerSPunrealsigma, innerSPunrealsigma));
248 EXPECT_LT(0., SignCurvatureXY<SpacePoint>::value(outerSP, centerSP, innerSP));
249 EXPECT_GT(0., SignCurvatureXY<SpacePoint>::value(outerHighSP, centerSP, innerSP));
250 EXPECT_GT(0., SignCurvatureXY<SpacePoint>::value(innerSP, centerSP, outerSP));
251 EXPECT_LT(0., SignCurvatureXY<SpacePoint>::value(outerSP, centerSP, innerSP));
253 EXPECT_DOUBLE_EQ(1., SignCurvatureXY<SpacePoint>::value(outerSP, centerSP, innerSP));
254 EXPECT_DOUBLE_EQ(-1., SignCurvatureXY<SpacePoint>::value(outerHighSP, centerSP, innerSP));
255 EXPECT_DOUBLE_EQ(-1., SignCurvatureXY<SpacePoint>::value(innerSP, centerSP, outerSP));
261 TEST_F(ThreeHitFilterTest, TestDeltaSOverZ)
264 B2Vector3D iVec(1., 1., 0.), cVec(3., 3., 1.), oVec(6., 4., 3.);
265 SpacePoint outerSP = provideSpacePointDummy(oVec.X(), oVec.Y(), oVec.Z());
266 SpacePoint centerSP = provideSpacePointDummy(cVec.X(), cVec.Y(), cVec.Z());
267 SpacePoint innerSP = provideSpacePointDummy(iVec.X(), iVec.Y(), iVec.Z());
272 EXPECT_TRUE(filterDeltaSlopeZOverS.accept(outerSP, centerSP, innerSP));
273 EXPECT_NEAR(0.31823963, lastResult, 0.00001);
277 EXPECT_TRUE(filterDeltaSOverZ.accept(outerSP, centerSP, innerSP));
278 EXPECT_FLOAT_EQ(-0.38471845, lastResult);
285 SpacePoint outerSP2 = provideSpacePointDummy(oVec.X(), oVec.Y(), oVec.Z());
286 SpacePoint centerSP2 = provideSpacePointDummy(cVec.X(), cVec.Y(), cVec.Z());
287 SpacePoint innerSP2 = provideSpacePointDummy(iVec.X(), iVec.Y(), iVec.Z());
289 EXPECT_TRUE(filterDeltaSlopeZOverS.accept(outerSP2, centerSP2, innerSP2));
290 EXPECT_NEAR(0.31823963, lastResult, 0.00001);
292 EXPECT_TRUE(filterDeltaSOverZ.accept(outerSP2, centerSP2, innerSP2));
293 EXPECT_FLOAT_EQ(-0.38471845, lastResult);
299 TEST_F(ThreeHitFilterTest, TestCalcPt)
303 SpacePoint outerSP = provideSpacePointDummy(3., 4., 3.);
304 SpacePoint centerSP = provideSpacePointDummy(3., 2., 1.);
305 SpacePoint innerSP = provideSpacePointDummy(1., 2., 0.);
307 SpacePoint outerSPEvil = provideSpacePointDummy(6., 3., 0.);
308 SpacePoint centerSP2 = provideSpacePointDummy(3., 3., 0.);
309 SpacePoint innerSP2 = provideSpacePointDummy(1., 1., 0.);
312 rawRadius = 1.414213562373095048801688724209698078570;
313 ptTrue = Helper::calcPt(rawRadius);
315 EXPECT_TRUE(filterPt.accept(outerSP, centerSP, innerSP));
316 EXPECT_FLOAT_EQ(ptTrue, lastResult);
318 ptTrue = 0.017118925181688543;
319 EXPECT_TRUE(filterPt.accept(outerSPEvil, centerSP2, innerSP2));
320 EXPECT_FLOAT_EQ(ptTrue, lastResult);
323 EXPECT_ANY_THROW(filterPt.accept(outerSP, outerSP, innerSP));
325 Helper::resetMagneticField(0.976);
326 double ptTrue1p5 = ptTrue;
327 ptTrue = Helper::calcPt(rawRadius);
328 EXPECT_FALSE(filterPt.accept(outerSP, centerSP, innerSP));
329 EXPECT_FLOAT_EQ(ptTrue, lastResult);
330 EXPECT_LT(ptTrue, ptTrue1p5);
332 Helper::resetMagneticField(1.5);
337 TEST_F(ThreeHitFilterTest, TestCircleRadius)
339 SpacePoint outerSP = provideSpacePointDummy(3., 4., 3.);
340 SpacePoint centerSP = provideSpacePointDummy(3., 2., 1.);
341 SpacePoint innerSP = provideSpacePointDummy(1., 2., 0.);
343 double rawRadius = 1.414213562373095048801688724209698078570;
345 EXPECT_TRUE(filterCrad.accept(outerSP, centerSP, innerSP));
346 EXPECT_FLOAT_EQ(rawRadius, lastResult);
349 EXPECT_ANY_THROW(filterCrad.accept(outerSP, outerSP, innerSP));
352 EXPECT_FLOAT_EQ(rawRadius, lastResult);
356 TEST_F(ThreeHitFilterTest, TestCircleDist2IP)
358 SpacePoint outerSPEvil = provideSpacePointDummy(6., 3., 0.);
359 SpacePoint outerSPSimple = provideSpacePointDummy(6., 4., 0.);
360 SpacePoint centerSP = provideSpacePointDummy(3., 3., 0.);
361 SpacePoint innerSP = provideSpacePointDummy(1., 1., 0.);
365 EXPECT_TRUE(filteCircleDist2IP.accept(outerSPSimple, centerSP, innerSP));
366 EXPECT_NEAR(0.44499173338941, lastResult, 0.00001);
368 EXPECT_FALSE(filteCircleDist2IP.accept(outerSPEvil, centerSP, innerSP));
369 EXPECT_FLOAT_EQ(0.719806016136754, lastResult);
373 Helper::resetMagneticField(0.976);
375 EXPECT_TRUE(filteCircleDist2IP.accept(outerSPSimple, centerSP, innerSP));
376 EXPECT_NEAR(0.44499173338941, lastResult, 0.00001);
378 EXPECT_FALSE(filteCircleDist2IP.accept(outerSPEvil, centerSP, innerSP));
379 EXPECT_FLOAT_EQ(0.719806016136754, lastResult);
381 Helper::resetMagneticField(1.5);