11 #include <gtest/gtest.h>
13 #include <tracking/spacePointCreation/PurityCalculatorTools.h>
17 #include <framework/logging/Logger.h>
18 #include <vxd/geometry/SensorInfoBase.h>
19 #include <framework/datastore/StoreArray.h>
20 #include <framework/datastore/RelationVector.h>
21 #include <mdst/dataobjects/MCParticle.h>
22 #include <pxd/dataobjects/PXDTrueHit.h>
23 #include <pxd/dataobjects/PXDCluster.h>
24 #include <svd/dataobjects/SVDTrueHit.h>
25 #include <svd/dataobjects/SVDCluster.h>
26 #include <tracking/spacePointCreation/SpacePoint.h>
29 #include <tracking/spacePointCreation/SpacePointTrackCand.h>
34 namespace PurityCalcTests {
40 template<
typename TrueHitType>
41 TrueHitType createTrueHit(
VxdID sensorId,
float u = 0.1,
float v = 0.2)
43 float position[3] = {
u, v, 0. };
44 float momentum[3] = { 0.1, 0.1, 0.1 };
46 return TrueHitType(sensorId, position, position, position, momentum, momentum, momentum, 0.2, 0.1);
66 r1.SetAngles(45, 20, 30);
67 TGeoTranslation t1(0., 0., -0.);
68 TGeoCombiTrans c1(t1, r1);
69 TGeoHMatrix transform = c1;
70 sensorInfoBase.setTransformation(transform);
72 return sensorInfoBase;
80 SpacePoint createSpacePoint(
VxdID sensorId,
bool pxd,
short nClusters = 0,
double u = 0.1,
double v = 0.2)
84 PXDCluster pxdCluster(sensorId, u, v, 0.1, 0.1, 0, 0, 1, 1, 1, 1, 1, 1);
88 vector<const SVDCluster*> clusters;
91 clusters.push_back(
new SVDCluster(sensorId,
true, u, 1.0, 0.1, 0.001, 1, 1, 1, 1.0));
92 clusters.push_back(
new SVDCluster(sensorId,
false, v, 1.0, 0.1, 0.001, 1, 1, 1, 1.0));
94 bool setU = (nClusters > 0);
95 clusters.push_back(
new SVDCluster(sensorId, setU, u, 1.0, 0.1, 0.001, 1, 1, 1, 1.0));
108 bool operator()(
const pair<int, short>& p)
123 return info.getParticleID() == i;
141 DataStore::Instance().setInitializeActive(
true);
144 m_pxdTrueHits.registerInDataStore(
"PXDTHs");
145 m_svdTrueHits.registerInDataStore(
"SVDTHs");
146 m_spacePoints.registerInDataStore(
"SPs");
147 m_mcParticles.registerInDataStore(
"MCPs");
150 m_spacePoints.registerRelationTo(m_svdTrueHits);
151 m_spacePoints.registerRelationTo(m_pxdTrueHits);
152 m_mcParticles.registerRelationTo(m_svdTrueHits);
153 m_mcParticles.registerRelationTo(m_pxdTrueHits);
155 DataStore::Instance().setInitializeActive(
false);
158 MCParticle* mcPart1 = m_mcParticles.appendNew(createMCParticle());
159 MCParticle* mcPart2 = m_mcParticles.appendNew(createMCParticle());
162 VxdID pxdId(1, 1, 1);
163 PXDTrueHit* pTrueHit = m_pxdTrueHits.appendNew(createTrueHit<PXDTrueHit>(pxdId));
165 SpacePoint* spacePoint = m_spacePoints.appendNew(createSpacePoint(pxdId,
true));
167 m_assignedClusters.push_back(1);
170 m_spacePoints.appendNew(createSpacePoint(pxdId,
true));
171 m_assignedClusters.push_back(1);
174 PXDTrueHit* pTrueHit2 = m_pxdTrueHits.appendNew(createTrueHit<PXDTrueHit>(pxdId));
176 spacePoint = m_spacePoints.appendNew(createSpacePoint(pxdId,
true));
179 m_assignedClusters.push_back(1);
183 PXDTrueHit* pTrueHit3 = m_pxdTrueHits.appendNew(createTrueHit<PXDTrueHit>(pxdId));
185 spacePoint = m_spacePoints.appendNew(createSpacePoint(pxdId,
true));
188 m_assignedClusters.push_back(1);
192 VxdID svdId(3, 1, 1);
193 SVDTrueHit* sTH2MC1 = m_svdTrueHits.appendNew(createTrueHit<SVDTrueHit>(svdId));
195 SVDTrueHit* sTH2MC2 = m_svdTrueHits.appendNew(createTrueHit<SVDTrueHit>(svdId));
197 SVDTrueHit* sTH2None = m_svdTrueHits.appendNew(createTrueHit<SVDTrueHit>(svdId));
200 spacePoint = m_spacePoints.appendNew(createSpacePoint(svdId,
false, 0));
202 m_assignedClusters.push_back(2);
205 spacePoint = m_spacePoints.appendNew(createSpacePoint(svdId,
false, 0));
206 m_assignedClusters.push_back(2);
211 m_spacePoints.appendNew(createSpacePoint(svdId,
false, 0));
212 m_assignedClusters.push_back(2);
216 spacePoint = m_spacePoints.appendNew(createSpacePoint(svdId,
false, 0));
217 m_assignedClusters.push_back(2);
222 spacePoint = m_spacePoints.appendNew(createSpacePoint(svdId,
false, 0));
223 m_assignedClusters.push_back(2);
227 spacePoint = m_spacePoints.appendNew(createSpacePoint(svdId,
false, 0));
228 m_assignedClusters.push_back(2);
232 spacePoint = m_spacePoints.appendNew(createSpacePoint(svdId,
false, 0));
233 m_assignedClusters.push_back(2);
238 spacePoint = m_spacePoints.appendNew(createSpacePoint(svdId,
false, 0));
239 m_assignedClusters.push_back(2);
245 m_spacePoints.appendNew(createSpacePoint(svdId,
false, -1));
246 m_assignedClusters.push_back(1);
247 m_spacePoints.appendNew(createSpacePoint(svdId,
false, 1));
248 m_assignedClusters.push_back(1);
252 virtual void TearDown() { DataStore::Instance().reset(); }
268 B2INFO(
"Contents of DataStore after SetUp: pxdTrueHits: " << m_pxdTrueHits.getEntries() <<
269 " svdTrueHits: " << m_svdTrueHits.getEntries() <<
" mcParticles: " << m_mcParticles.getEntries() <<
270 " spacePoints: " << m_spacePoints.getEntries());
273 EXPECT_EQ(m_pxdTrueHits.getEntries(), 3);
274 EXPECT_EQ(m_svdTrueHits.getEntries(), 3);
275 EXPECT_EQ(m_spacePoints.getEntries(), 14);
276 EXPECT_EQ(m_mcParticles.getEntries(), 2);
279 for (
int i = 0; i < m_spacePoints.getEntries(); ++i) {
280 EXPECT_EQ(m_spacePoints[i]->getNClustersAssigned(), m_assignedClusters[i]);
286 ASSERT_EQ(pxdTrueHits.
size(), 1);
287 EXPECT_EQ(pxdTrueHits[0]->getArrayIndex(), 0);
288 EXPECT_EQ(pxdTrueHits.
weight(0), 1);
290 pxdTrueHits = m_spacePoints[2]->getRelationsTo<
PXDTrueHit>(
"ALL");
291 ASSERT_EQ(pxdTrueHits.
size(), 2);
292 EXPECT_EQ(pxdTrueHits[0]->getArrayIndex(), 0);
293 EXPECT_EQ(pxdTrueHits[0]->getRelatedFrom<MCParticle>(
"ALL")->getArrayIndex(), 0);
294 EXPECT_EQ(pxdTrueHits.
weight(0), 1);
295 EXPECT_EQ(pxdTrueHits[1]->getArrayIndex(), 1);
296 EXPECT_EQ(pxdTrueHits[1]->getRelatedFrom<MCParticle>(
"ALL")->getArrayIndex(), 1);
297 EXPECT_EQ(pxdTrueHits.
weight(1), 1);
300 ASSERT_EQ(svdTrueHits.
size(), 1);
301 EXPECT_EQ(svdTrueHits[0]->getArrayIndex(), 0);
302 EXPECT_EQ(svdTrueHits[0]->getRelatedFrom<MCParticle>(
"ALL")->getArrayIndex(), 0);
303 EXPECT_EQ(svdTrueHits.
weight(0), 2);
305 svdTrueHits = m_spacePoints[5]->getRelationsTo<
SVDTrueHit>(
"ALL");
306 ASSERT_EQ(svdTrueHits.
size(), 2);
307 EXPECT_EQ(svdTrueHits[0]->getArrayIndex(), 0);
308 EXPECT_EQ(svdTrueHits.
weight(0), 11);
309 EXPECT_EQ(svdTrueHits[1]->getArrayIndex(), 1);
310 EXPECT_EQ(svdTrueHits.
weight(1), 21);
311 EXPECT_EQ(svdTrueHits[1]->getRelatedFrom<MCParticle>(
"ALL")->getArrayIndex(), 1);
313 svdTrueHits = m_spacePoints[6]->getRelationsTo<
SVDTrueHit>(
"ALL");
314 ASSERT_EQ(svdTrueHits.
size(), 0);
316 svdTrueHits = m_spacePoints[7]->getRelationsTo<
SVDTrueHit>(
"ALL");
317 ASSERT_EQ(svdTrueHits.
size(), 2);
318 EXPECT_EQ(svdTrueHits[0]->getArrayIndex(), 0);
319 EXPECT_EQ(svdTrueHits.
weight(0), 2);
320 EXPECT_EQ(svdTrueHits.
weight(1), 11);
321 EXPECT_EQ(svdTrueHits[1]->getArrayIndex(), 1);
327 TEST_F(PurityCalculatorToolsTest, testFindWeightInVector)
329 std::vector<std::pair<int, double> > vec;
330 vec.push_back(std::make_pair(1, 0));
331 vec.push_back(std::make_pair(1, 1.1));
332 vec.push_back(std::make_pair(1, 2));
333 vec.push_back(std::make_pair(1, 11));
334 vec.push_back(std::make_pair(1, 21));
335 vec.push_back(std::make_pair(1, 11));
336 vec.push_back(std::make_pair(1, 2.5));
347 TEST_F(PurityCalculatorToolsTest, testGetAccessorsFromWeight)
351 EXPECT_TRUE(accs.empty());
353 EXPECT_TRUE(accs.empty());
357 EXPECT_EQ(accs[0], 0);
358 EXPECT_EQ(accs.size(), 1);
360 EXPECT_EQ(accs.size(), 2);
361 EXPECT_EQ(accs[0], 1);
362 EXPECT_EQ(accs[1], 2);
364 EXPECT_EQ(accs[0], 1);
365 EXPECT_EQ(accs.size(), 1);
367 EXPECT_EQ(accs[0], 2);
368 EXPECT_EQ(accs.size(), 1);
374 TEST_F(PurityCalculatorToolsTest, testIncreaseClusterCounters)
377 std::array<unsigned, 3> ctrArray = { {0, 0, 0} };
378 for (
size_t i = 0; i < 3; ++i) { EXPECT_EQ(ctrArray[i], 0); }
381 EXPECT_EQ(ctrArray[0], 1);
383 EXPECT_EQ(ctrArray[0], 2);
386 EXPECT_EQ(ctrArray[1], 1);
387 EXPECT_EQ(ctrArray[2], 1);
390 EXPECT_EQ(ctrArray[2], 2);
391 EXPECT_EQ(ctrArray[1], 1);
393 EXPECT_EQ(ctrArray[1], 2);
394 EXPECT_EQ(ctrArray[2], 2);
405 TEST_F(PurityCalculatorToolsTest, testGetMCParticlesPXD)
407 std::vector<std::pair<int, double> > mcParts = getMCParticles<PXDTrueHit>(m_spacePoints[0]);
408 ASSERT_EQ(mcParts.size(), 1);
409 EXPECT_EQ(mcParts[0].first, 0);
410 EXPECT_DOUBLE_EQ(mcParts[0].second, 1);
412 mcParts = getMCParticles<PXDTrueHit>(m_spacePoints[1]);
413 ASSERT_EQ(mcParts.size(), 1);
414 EXPECT_EQ(mcParts[0].first, -2);
415 EXPECT_EQ(mcParts[0].second, 1);
417 mcParts = getMCParticles<PXDTrueHit>(m_spacePoints[2]);
418 ASSERT_EQ(mcParts.size(), 2);
419 auto findIt = std::find_if(mcParts.begin(), mcParts.end(), compFirst(0));
420 ASSERT_FALSE(findIt == mcParts.end());
421 EXPECT_DOUBLE_EQ(findIt->second, 1);
422 findIt = std::find_if(mcParts.begin(), mcParts.end(), compFirst(1));
423 ASSERT_FALSE(findIt == mcParts.end());
424 EXPECT_DOUBLE_EQ(findIt->second, 1);
426 B2INFO(
"The occuring error message is expected! It is used to discover some corner cases in real usage!");
427 mcParts = getMCParticles<PXDTrueHit>(m_spacePoints[3]);
428 ASSERT_EQ(mcParts.size(), 1);
429 EXPECT_EQ(mcParts[0].first, 1);
430 EXPECT_DOUBLE_EQ(mcParts[0].second, 1);
441 TEST_F(PurityCalculatorToolsTest, testGetMCParticlesSVD)
443 std::vector<std::pair<int, double> > mcParts = getMCParticles<SVDTrueHit>(m_spacePoints[4]);
444 ASSERT_EQ(mcParts.size(), 1);
445 EXPECT_EQ(mcParts[0].first, 0);
446 EXPECT_DOUBLE_EQ(mcParts[0].second, 2);
448 mcParts = getMCParticles<SVDTrueHit>(m_spacePoints[5]);
449 ASSERT_EQ(mcParts.size(), 2);
450 auto findIt = std::find_if(mcParts.begin(), mcParts.end(), compFirst(0));
451 ASSERT_FALSE(findIt == mcParts.end());
452 EXPECT_DOUBLE_EQ(findIt->second, 11);
453 findIt = std::find_if(mcParts.begin(), mcParts.end(), compFirst(1));
454 ASSERT_FALSE(findIt == mcParts.end());
455 EXPECT_DOUBLE_EQ(findIt->second, 21);
457 mcParts = getMCParticles<SVDTrueHit>(m_spacePoints[6]);
458 ASSERT_EQ(mcParts.size(), 1);
459 EXPECT_EQ(mcParts[0].first, -2);
460 EXPECT_DOUBLE_EQ(mcParts[0].second, 2);
462 mcParts = getMCParticles<SVDTrueHit>(m_spacePoints[7]);
463 ASSERT_EQ(mcParts.size(), 2);
464 findIt = std::find_if(mcParts.begin(), mcParts.end(), compFirst(1));
465 ASSERT_FALSE(findIt == mcParts.end());
466 EXPECT_DOUBLE_EQ(findIt->second, 11);
467 findIt = std::find_if(mcParts.begin(), mcParts.end(), compFirst(0));
468 ASSERT_FALSE(findIt == mcParts.end());
469 EXPECT_DOUBLE_EQ(findIt->second, 2);
471 mcParts = getMCParticles<SVDTrueHit>(m_spacePoints[8]);
472 ASSERT_EQ(mcParts.size(), 2);
473 findIt = std::find_if(mcParts.begin(), mcParts.end(), compFirst(-2));
474 ASSERT_FALSE(findIt == mcParts.end());
475 EXPECT_DOUBLE_EQ(findIt->second, 11);
476 findIt = std::find_if(mcParts.begin(), mcParts.end(), compFirst(0));
477 ASSERT_FALSE(findIt == mcParts.end());
478 EXPECT_DOUBLE_EQ(findIt->second, 21);
480 mcParts = getMCParticles<SVDTrueHit>(m_spacePoints[9]);
481 ASSERT_EQ(mcParts.size(), 2);
482 findIt = std::find_if(mcParts.begin(), mcParts.end(), compFirst(-2));
483 ASSERT_FALSE(findIt == mcParts.end());
484 EXPECT_DOUBLE_EQ(findIt->second, 21);
485 findIt = std::find_if(mcParts.begin(), mcParts.end(), compFirst(1));
486 ASSERT_FALSE(findIt == mcParts.end());
487 EXPECT_DOUBLE_EQ(findIt->second, 11);
489 mcParts = getMCParticles<SVDTrueHit>(m_spacePoints[11]);
490 ASSERT_EQ(mcParts.size(), 3);
491 findIt = std::find_if(mcParts.begin(), mcParts.end(), compFirst(0));
492 ASSERT_FALSE(findIt == mcParts.end());
493 EXPECT_DOUBLE_EQ(findIt->second, 11);
494 findIt = std::find_if(mcParts.begin(), mcParts.end(), compFirst(1));
495 ASSERT_FALSE(findIt == mcParts.end());
496 EXPECT_DOUBLE_EQ(findIt->second, 11);
497 findIt = std::find_if(mcParts.begin(), mcParts.end(), compFirst(-2));
498 ASSERT_FALSE(findIt == mcParts.end());
499 EXPECT_DOUBLE_EQ(findIt->second, 21);
508 TEST_F(PurityCalculatorToolsTest, testCreatePurityInfos)
511 std::vector<const SpacePoint*> spacePoints;
512 for (
size_t i = 0; i < 12; ++i) { spacePoints.push_back(m_spacePoints[i]); }
514 EXPECT_EQ(sptc.getNHits(), 12);
515 unsigned totCls = 20;
516 float ndf = 4 * 2 + 8 * 2;
518 B2INFO(
"There will be WARNING and ERROR messages! Those are expected!");
521 EXPECT_EQ(purities.size(), 4);
524 for (
size_t i = 0; i < purities.size() - 1; ++i) {
525 EXPECT_TRUE(purities[i].getPurity().second >= purities[i + 1].getPurity().second);
528 auto findIt = find_if(purities.begin(), purities.end(), compMCId(1));
529 ASSERT_FALSE(findIt == purities.end());
530 EXPECT_EQ(findIt->getNClustersTotal(), totCls);
531 EXPECT_EQ(findIt->getNPXDClustersTotal(), 4);
532 EXPECT_EQ(findIt->getNClustersFound(), 6);
533 EXPECT_EQ(findIt->getNPXDClusters(), 2);
534 EXPECT_EQ(findIt->getNSVDUClusters(), 3);
535 EXPECT_EQ(findIt->getNSVDVClusters(), 1);
536 EXPECT_FLOAT_EQ(findIt->getPurity().second, 8. / ndf);
538 findIt = find_if(purities.begin(), purities.end(), compMCId(0));
539 ASSERT_FALSE(findIt == purities.end());
540 EXPECT_EQ(findIt->getNClustersTotal(), totCls);
541 EXPECT_EQ(findIt->getNSVDUClustersTotal(), 8);
542 EXPECT_EQ(findIt->getNClustersFound(), 10);
543 EXPECT_EQ(findIt->getNPXDClusters(), 2);
544 EXPECT_EQ(findIt->getNSVDUClusters(), 5);
545 EXPECT_EQ(findIt->getNSVDVClusters(), 3);
546 EXPECT_FLOAT_EQ(findIt->getPurity().second, 12. / ndf);
548 findIt = find_if(purities.begin(), purities.end(), compMCId(-1));
549 ASSERT_FALSE(findIt == purities.end());
550 EXPECT_EQ(findIt->getNClustersTotal(), totCls);
551 EXPECT_EQ(findIt->getNSVDVClustersTotal(), 8);
552 EXPECT_EQ(findIt->getNClustersFound(), 1);
553 EXPECT_EQ(findIt->getNPXDClusters(), 0);
554 EXPECT_EQ(findIt->getNSVDUClusters(), 0);
555 EXPECT_EQ(findIt->getNSVDVClusters(), 1);
556 EXPECT_FLOAT_EQ(findIt->getPurity().second, 1. / ndf);
558 findIt = find_if(purities.begin(), purities.end(), compMCId(-2));
559 ASSERT_FALSE(findIt == purities.end());
560 EXPECT_EQ(findIt->getNClustersTotal(), totCls);
561 EXPECT_EQ(findIt->getNClustersFound(), 6);
562 EXPECT_EQ(findIt->getNPXDClusters(), 1);
563 EXPECT_EQ(findIt->getNSVDUClusters(), 2);
564 EXPECT_EQ(findIt->getNSVDVClusters(), 3);
565 EXPECT_FLOAT_EQ(findIt->getPurity().second, 7. / ndf);