12 #include <gtest/gtest.h>
14 #include <tracking/spacePointCreation/SpacePoint.h>
15 #include <tracking/trackFindingVXD/filterMap/twoHitVariables/Distance3DSquared.h>
16 #include <tracking/trackFindingVXD/filterMap/twoHitVariables/Distance2DXYSquared.h>
17 #include <tracking/trackFindingVXD/filterMap/twoHitVariables/Distance1DZ.h>
18 #include <tracking/trackFindingVXD/filterMap/twoHitVariables/SlopeRZ.h>
19 #include <tracking/trackFindingVXD/filterMap/twoHitVariables/CosDirectionXY.h>
20 #include <tracking/trackFindingVXD/filterMap/twoHitVariables/Distance3DNormed.h>
22 #include <tracking/trackFindingVXD/filterMap/filterFramework/Shortcuts.h>
24 #include <vxd/geometry/SensorInfoBase.h>
34 namespace VXDTFtwoHitFilterTest {
46 VXD::SensorInfoBase sensorInfoBase(VXD::SensorInfoBase::PXD, aVxdID, 2.3, 4.2, 0.3, 2, 4, -1);
49 r1.SetAngles(45, 20, 30);
50 TGeoTranslation t1(globalX, globalY, globalZ);
51 TGeoCombiTrans c1(t1, r1);
52 TGeoHMatrix transform = c1;
53 sensorInfoBase.setTransformation(transform);
55 sensorInfoBase.setTransformation(transform,
true);
57 return sensorInfoBase;
62 SpacePoint provideSpacePointDummy(
double X,
double Y,
double Z)
67 PXDCluster aCluster =
PXDCluster(aVxdID, 0., 0., 0.1, 0.1, 0, 0, 1, 1, 1, 1, 1, 1);
84 static void resetCounter()
98 unsigned int counter<T>::used(0);
100 unsigned int counter<T>::accepted(0);
102 unsigned int counter<T>::rejected(0);
104 unsigned int counter<T>::wasInf(0);
106 unsigned int counter<T>::wasNan(0);
114 template<
class Var,
typename ... otherTypes>
130 template<
class Var,
class Range,
typename ... otherTypes>
132 static void notify(
const Var& filterType,
133 typename Var::variableType fResult,
135 const typename Var::argumentType& outerHit,
136 const typename Var::argumentType& innerHit,
139 B2ERROR(
" Filter " << filterType.name() <<
" got result of " << fResult);
152 template<
class Var,
class Range,
typename ... otherTypes>
153 static void notify(
const Var& filterType,
154 typename Var::variableType fResult,
156 const typename Var::argumentType& outerHit,
157 const typename Var::argumentType& innerHit,
160 B2WARNING(
" Filter " << filterType.name() <<
" with outerhit/innerhit: " << outerHit.getPosition().PrintStringXYZ() <<
"/" <<
161 innerHit.getPosition().PrintStringXYZ() <<
" got result of " << fResult);
174 typedef std::function< void (
const typename FilterType::argumentType&,
const typename FilterType::argumentType&,
const FilterType&,
typename FilterType::variableType)>
178 using CStyleFunctionPointer = void(*)(
const typename FilterType::argumentType&,
const typename FilterType::argumentType&,
179 const FilterType&,
typename FilterType::variableType) ;
182 template<
typename ... otherTypes>
183 static void notify(
const FilterType& filterType,
184 typename FilterType::variableType fResult,
185 const typename FilterType::argumentType& outerHit,
186 const typename FilterType::argumentType& innerHit,
189 B2INFO(
" Filter " << filterType.name() <<
" with Mag of outer-/innerHit " << outerHit.getPosition().Mag() <<
"/" <<
190 innerHit.getPosition().Mag() <<
" got result of " << fResult <<
" and Observer-Vector sm_collectedObservers got " <<
192 B2INFO(
" Filter " << filterType.name() <<
" with Mag of outer-/innerHit " << outerHit.getPosition().Mag() <<
"/" <<
193 innerHit.getPosition().Mag() <<
" got result of " << fResult <<
" and Observer-Vector sm_collectedObserversCSTYLE got " <<
205 template <
typename ObserverType>
209 FilterType(), std::placeholders::_3));
223 template<
typename FilterType> std::vector< typename VectorOfObservers<FilterType>::observerFunction >
226 template<
typename FilterType> std::vector< typename VectorOfObservers<FilterType>::CStyleFunctionPointer >
227 VectorOfObservers<FilterType>::sm_collectedObserversCSTYLE = {};
234 TEST_F(TwoHitFilterTest, TestObserverFlexibility)
242 SpacePoint x1 = provideSpacePointDummy(0.0f , 0.0f, 0.0f);
243 SpacePoint x2 = provideSpacePointDummy(0.5f , 0.0f, 0.0f);
244 SpacePoint x3 = provideSpacePointDummy(2.0f , 0.0f, 0.0f);
245 auto myCounter = counter<Distance3DSquared<SpacePoint>>();
246 myCounter.resetCounter();
253 auto storeFuncVariantB = std::bind(((VectorOfObservers<Distance3DSquared<SpacePoint>>::CStyleFunctionPointer)
254 &CountingObserver::notify), std::placeholders::_1, std::placeholders::_2, Distance3DSquared<SpacePoint>(),
255 std::placeholders::_3);
257 char* realname(NULL);
259 realname = abi::__cxa_demangle(
typeid(storeFuncVariantB).name(), 0, 0, &status);
260 std::string name(realname);
262 B2INFO(
"storeFuncVariantB is of type: " << name);
277 EXPECT_EQ(0 , myCounter.used);
284 TEST_F(TwoHitFilterTest, SpacePointCreation)
286 SpacePoint testSP = provideSpacePointDummy(1.2, 2.3, 4.2);
295 TEST_F(TwoHitFilterTest, SelectionVariableName)
297 auto dist3D = Distance3DSquared<SpacePoint>();
298 EXPECT_EQ(
"Distance3DSquared" , dist3D.name());
299 auto dist2DXY = Distance2DXYSquared<SpacePoint>();
300 EXPECT_EQ(
"Distance2DXYSquared" , dist2DXY.name());
301 auto dist1DZ = Distance1DZ<SpacePoint>();
302 EXPECT_EQ(
"Distance1DZ" , dist1DZ.name());
303 auto slopeRZ = SlopeRZ<SpacePoint>();
304 EXPECT_EQ(
"SlopeRZ" , slopeRZ.name());
310 TEST_F(TwoHitFilterTest, BasicFilterTestDistance3DSquared)
315 SpacePoint x1 = provideSpacePointDummy(0. , 0., 0.);
316 SpacePoint x2 = provideSpacePointDummy(.5 , 0., 0.);
317 SpacePoint x3 = provideSpacePointDummy(2. , 0., 0.);
319 EXPECT_TRUE(
filter.accept(x1, x2));
320 EXPECT_FALSE(
filter.accept(x1, x3));
326 TEST_F(TwoHitFilterTest, BasicFilterTestDistance2DXYSquared)
331 SpacePoint x1 = provideSpacePointDummy(0. , 0., 0.);
332 SpacePoint x2 = provideSpacePointDummy(.5 , 0., 0.);
333 SpacePoint x3 = provideSpacePointDummy(2. , 0., 0.);
334 SpacePoint x4 = provideSpacePointDummy(0. , 0., 2.);
336 EXPECT_TRUE(
filter.accept(x1, x2));
337 EXPECT_FALSE(
filter.accept(x1, x3));
338 EXPECT_TRUE(
filter.accept(x2, x4));
344 TEST_F(TwoHitFilterTest, BasicFilterTestDistance1DZ)
349 SpacePoint x1 = provideSpacePointDummy(0. , 0., 0.);
350 SpacePoint x2 = provideSpacePointDummy(0. , 0., .5);
351 SpacePoint x3 = provideSpacePointDummy(.25 , .25, 0.);
352 SpacePoint x4 = provideSpacePointDummy(0. , 0., 1.);
354 EXPECT_TRUE(
filter.accept(x2, x1));
355 EXPECT_FALSE(
filter.accept(x1, x2));
356 EXPECT_FALSE(
filter.accept(x1, x3));
357 EXPECT_FALSE(
filter.accept(x1, x4));
363 TEST_F(TwoHitFilterTest, TemplateFilterTestDistance1DZ)
368 SpacePoint x1 = provideSpacePointDummy(0. , 0., 0.);
369 SpacePoint x2 = provideSpacePointDummy(0. , 0., .5);
370 SpacePoint x3 = provideSpacePointDummy(.25 , .25, 0.);
371 SpacePoint x4 = provideSpacePointDummy(0. , 0., 1.);
373 EXPECT_TRUE(
filter.accept(x2, x1));
374 EXPECT_FALSE(
filter.accept(x1, x2));
375 EXPECT_FALSE(
filter.accept(x1, x3));
376 EXPECT_FALSE(
filter.accept(x1, x4));
382 TEST_F(TwoHitFilterTest, BasicFilterTestSlopeRZ)
387 SpacePoint innerSP = provideSpacePointDummy(1 , 2, 3);
388 SpacePoint outerSP1 = provideSpacePointDummy(1 , 4, 4);
389 SpacePoint outerSP2 = provideSpacePointDummy(1 , 4, 3.95);
390 SpacePoint outerSP3 = provideSpacePointDummy(1 , 4, 4.05);
391 SpacePoint outerSP4 = provideSpacePointDummy(1 , 3, 3.45);
392 SpacePoint outerSP5 = provideSpacePointDummy(1 , 3, 3.55);
393 SpacePoint outerSP6 = provideSpacePointDummy(1 , 4, 3);
394 SpacePoint outerSP7 = provideSpacePointDummy(1 , 0, 4);
396 EXPECT_FALSE(
filter.accept(outerSP3, innerSP));
397 EXPECT_FALSE(
filter.accept(outerSP1, innerSP));
398 EXPECT_TRUE(
filter.accept(outerSP2, innerSP));
399 EXPECT_FALSE(
filter.accept(innerSP, outerSP2));
400 EXPECT_TRUE(
filter.accept(outerSP4, innerSP));
401 EXPECT_FALSE(
filter.accept(outerSP5, innerSP));
402 EXPECT_EQ(
filter.accept(outerSP1, innerSP),
filter.accept(outerSP7,
406 auto sRZ = SlopeRZ<SpacePoint>();
407 EXPECT_FLOAT_EQ(0., sRZ.value(innerSP, innerSP));
408 EXPECT_FLOAT_EQ(atan(2.), sRZ.value(outerSP1, innerSP));
409 EXPECT_FLOAT_EQ(atan(2. / 0.95), sRZ.value(outerSP2, innerSP));
410 EXPECT_FLOAT_EQ(M_PI - sRZ.value(outerSP2, innerSP),
411 sRZ.value(innerSP, outerSP2));
412 EXPECT_FLOAT_EQ(atan(2. / 1.05), sRZ.value(outerSP3, innerSP));
413 EXPECT_FLOAT_EQ(atan(1. / 0.45), sRZ.value(outerSP4, innerSP));
414 EXPECT_FLOAT_EQ(atan(1. / 0.55), sRZ.value(outerSP5, innerSP));
415 EXPECT_FLOAT_EQ(M_PI * 0.5, sRZ.value(outerSP6, innerSP));
416 EXPECT_FLOAT_EQ(atan(2. / 1.05), sRZ.value(outerSP3, innerSP));
417 EXPECT_FLOAT_EQ(sRZ.value(outerSP1, innerSP), sRZ.value(outerSP7,
424 TEST_F(TwoHitFilterTest, BasicFilterTestDistance3DNormed)
430 SpacePoint innerSP = provideSpacePointDummy(1 , 2, 3);
431 SpacePoint outerSP1 = provideSpacePointDummy(2 , 3, 4);
432 SpacePoint outerSP2 = provideSpacePointDummy(1 , 2, 4);
433 SpacePoint outerSP3 = provideSpacePointDummy(2 , 3, 3);
435 auto d3Dn = Distance3DNormed<SpacePoint>();
436 EXPECT_FLOAT_EQ(2. / 3., d3Dn.value(outerSP1, innerSP));
437 EXPECT_FLOAT_EQ(0., d3Dn.value(outerSP2, innerSP));
438 EXPECT_FLOAT_EQ(1., d3Dn.value(outerSP3, innerSP));
439 EXPECT_FLOAT_EQ(0., d3Dn.value(innerSP, innerSP));
445 TEST_F(TwoHitFilterTest, ObservedFilter)
452 SpacePoint x1 = provideSpacePointDummy(0.0f , 0.0f, 0.0f);
453 SpacePoint x2 = provideSpacePointDummy(0.5f , 0.0f, 0.0f);
454 SpacePoint x3 = provideSpacePointDummy(2.0f , 0.0f, 0.0f);
455 auto myCounter = counter<Distance3DSquared<SpacePoint>>();
456 myCounter.resetCounter();
458 EXPECT_TRUE(
filter.accept(x1, x2));
459 EXPECT_FALSE(
filter.accept(x1, x3));
460 EXPECT_EQ(2 , myCounter.used);
465 TEST_F(TwoHitFilterTest, BypassableFilter)
467 bool bypassControl(
false);
471 auto filter = nonBypassableFilter.bypass(bypassControl);
472 SpacePoint x1 = provideSpacePointDummy(0.0f , 0.0f, 0.0f);
473 SpacePoint x2 = provideSpacePointDummy(2.0f , 0.0f, 0.0f);
474 auto myCounter = counter<Distance3DSquared<SpacePoint>>();
475 myCounter.resetCounter();
477 EXPECT_FALSE(
filter.accept(x1, x2));
478 EXPECT_EQ(1 , myCounter.used);
480 bypassControl =
true;
481 EXPECT_TRUE(
filter.accept(x1, x2));
482 EXPECT_EQ(2 , myCounter.used);
488 TEST_F(TwoHitFilterTest, Shortcuts)
491 SpacePoint x1 = provideSpacePointDummy(0.0f , 0.0f, 0.0f);
492 SpacePoint x2 = provideSpacePointDummy(0.5f , 0.0f, 0.0f);
493 SpacePoint x3 = provideSpacePointDummy(2.0f , 0.0f, 0.0f);
495 auto filterSup = (Distance3DSquared<SpacePoint>() < 1.) ;
496 EXPECT_TRUE(filterSup.accept(x1, x2));
497 EXPECT_FALSE(filterSup.accept(x1, x3));
499 auto filterSup2 = (1 > Distance3DSquared<SpacePoint>()) ;
500 EXPECT_TRUE(filterSup2.accept(x1, x2));
501 EXPECT_FALSE(filterSup2.accept(x1, x3));
503 auto filterInf = (Distance3DSquared<SpacePoint>() > 1.) ;
504 EXPECT_TRUE(filterInf.accept(x1, x3));
505 EXPECT_FALSE(filterInf.accept(x1, x2));
507 auto filterInf2 = (1 < Distance3DSquared<SpacePoint>()) ;
508 EXPECT_TRUE(filterInf2.accept(x1, x3));
509 EXPECT_FALSE(filterInf2.accept(x1, x2));
511 auto filterRange = (0.1 < Distance3DSquared<SpacePoint>() < 1);
512 EXPECT_FALSE(filterRange.accept(x1, x1));
513 EXPECT_TRUE(filterRange.accept(x1, x2));
514 EXPECT_FALSE(filterRange.accept(x1, x3));
520 TEST_F(TwoHitFilterTest, BooleanOperations)
523 SpacePoint x1 = provideSpacePointDummy(0.0f , 0.0f, 0.0f);
524 SpacePoint x2 = provideSpacePointDummy(1.0f , 0.0f, 0.0f);
525 SpacePoint x3 = provideSpacePointDummy(2.0f , 0.0f, 0.0f);
527 auto filter = !(Distance3DSquared<SpacePoint>() > 1.);
528 EXPECT_TRUE(
filter.accept(x1, x2));
529 EXPECT_TRUE(
filter.accept(x1, x1));
530 EXPECT_FALSE(
filter.accept(x1, x3));
533 !(Distance3DSquared<SpacePoint>() > 1.) &&
534 !(Distance3DSquared<SpacePoint>() < 1);
536 EXPECT_TRUE(filter2.accept(x1, x2));
537 EXPECT_FALSE(filter2.accept(x1, x1));
538 EXPECT_FALSE(filter2.accept(x1, x3));
542 (Distance3DSquared<SpacePoint>() > 1.) ||
543 (Distance3DSquared<SpacePoint>() < 1);
545 EXPECT_FALSE(filter3.accept(x1, x2));
546 EXPECT_TRUE(filter3.accept(x1, x1));
547 EXPECT_TRUE(filter3.accept(x1, x3));
553 TEST_F(TwoHitFilterTest, ShortCircuitsEvaluation)
556 ((Distance2DXYSquared<SpacePoint>() < 1) &&
557 (Distance3DSquared<SpacePoint>() < 1)).observe(CountingObserver())
560 SpacePoint x1 = provideSpacePointDummy(0.0f , 0.0f, 0.0f);
561 SpacePoint x3 = provideSpacePointDummy(2.0f , 0.0f, 0.0f);
563 auto counter3D = counter<Distance3DSquared<SpacePoint>>();
564 auto counter2D = counter<Distance2DXYSquared<SpacePoint>>();
568 EXPECT_FALSE(
filter.accept(x1, x3));
569 EXPECT_EQ(1 , counter2D.used);
570 EXPECT_EQ(0 , counter3D.used);
572 EXPECT_TRUE(
filter.accept(x1, x1));
573 EXPECT_EQ(2 , counter2D.used);
574 EXPECT_EQ(1 , counter3D.used);
579 TEST_F(TwoHitFilterTest, TestCosDirectionXY)
581 SpacePoint x1 = provideSpacePointDummy(2.0f , 1.0f, 0.0f);
582 SpacePoint x2 = provideSpacePointDummy(1.0f , -2.0f, 0.0f);
583 SpacePoint x3 = provideSpacePointDummy(1.0f , 0.0f, 0.0f);
584 SpacePoint x4 = provideSpacePointDummy(0.5f , 0.86602540378443f, 0.0f);
586 EXPECT_FLOAT_EQ(0., CosDirectionXY<SpacePoint>::value(x1, x2));
587 EXPECT_NEAR(0.5, CosDirectionXY<SpacePoint>::value(x3, x4), 0.0000001);