8 #include <analysis/utility/MCMatching.h>
9 #include <analysis/dataobjects/Particle.h>
10 #include <analysis/dataobjects/ParticleExtraInfoMap.h>
11 #include <analysis/variables/BasicParticleInformation.h>
12 #include <analysis/variables/MCTruthVariables.h>
14 #include <mdst/dataobjects/MCParticle.h>
15 #include <mdst/dataobjects/MCParticleGraph.h>
16 #include <framework/datastore/StoreArray.h>
17 #include <framework/datastore/StoreObjPtr.h>
18 #include <framework/gearbox/Const.h>
20 #include <gtest/gtest.h>
26 #if defined(__INTEL_COMPILER) && ((__INTEL_COMPILER < 1400) || (__INTEL_COMPILER_BUILD_DATE < 20140422))
28 TEST(MCMatchingTest, TestsDisabled)
31 "MC matching test disabled on intel compiler (version < 14 sp1 update2), please see https://software.intel.com/en-us/forums/topic/475378";
62 c_CreateNewMCParticle,
68 Decay(
int pdg,
const std::vector<Decay>& daughters = std::vector<Decay>()):
69 m_pdg(pdg), m_daughterDecays(daughters), m_mcparticle(nullptr), m_particle(nullptr)
72 m_graphParticle->
setPDG(m_pdg);
73 m_graphParticle->setStatus(MCParticle::c_PrimaryParticle);
74 for (
const Decay& d : daughters) {
75 gParticleGraph.
addDecay(*m_graphParticle, *d.m_graphParticle);
82 gParticleGraph.
clear();
85 m_mcparticle = mcparticles[m_graphParticle->getIndex() - 1];
87 for (Decay& d : m_daughterDecays)
92 [[nodiscard]]
Particle* getParticle(
int pdg)
const
94 if (m_pdg == pdg and m_particle)
97 for (
auto& d : m_daughterDecays) {
105 [[nodiscard]]
MCParticle* getMCParticle(
int pdg)
const
107 if (m_pdg == pdg and m_mcparticle)
110 for (
auto& d : m_daughterDecays) {
118 Decay* getDecay(
int pdg)
123 for (
auto& d : m_daughterDecays) {
124 Decay* res = d.getDecay(pdg);
131 Decay& operator[](
int i) {
return m_daughterDecays[i]; }
134 struct ReconstructedDecay {
136 ReconstructedDecay(
int pdg,
const std::vector<ReconstructedDecay>& daughters = std::vector<ReconstructedDecay>(),
137 EBehavior behavior = c_Default):
138 m_pdg(pdg), m_daughterDecays(daughters), m_behavior(behavior), m_optMcPart(nullptr), m_optDecay(nullptr) { }
139 ReconstructedDecay(
int pdg,
const std::vector<ReconstructedDecay>& daughters, EBehavior behavior,
MCParticle* optMcPart):
140 m_pdg(pdg), m_daughterDecays(daughters), m_behavior(behavior), m_optMcPart(optMcPart), m_optDecay(nullptr) { }
141 ReconstructedDecay(
int pdg,
const std::vector<ReconstructedDecay>& daughters, EBehavior behavior, Decay* optDecay):
142 m_pdg(pdg), m_daughterDecays(daughters), m_behavior(behavior), m_optMcPart(nullptr), m_optDecay(optDecay) { }
144 vector<ReconstructedDecay> m_daughterDecays;
145 EBehavior m_behavior;
156 void reconstruct(ReconstructedDecay decay)
161 if (decay.m_behavior == c_CreateNewMCParticle) {
163 m_graphParticle->
setPDG(decay.m_pdg);
165 }
else if (decay.m_behavior == c_RelateWith) {
166 m_mcparticle = decay.m_optMcPart;
167 }
else if (decay.m_behavior == c_ReconstructFrom) {
168 ASSERT_TRUE(decay.m_optDecay !=
nullptr);
169 Decay* mcDecay = decay.m_optDecay;
170 decay.m_optDecay =
nullptr;
171 decay.m_behavior = Decay::c_Default;
172 mcDecay->reconstruct(decay);
177 if (isFSP(decay.m_pdg)) {
179 m_particle = particles.appendNew(m_graphParticle->get4Vector(), decay.m_pdg);
180 m_particle->addRelationTo(m_mcparticle);
183 if (!decay.m_daughterDecays.empty()) {
184 Decay* mcDecay =
this;
185 if (decay.m_behavior == c_ReconstructFrom) {
187 mcDecay = decay.m_optDecay;
189 std::vector<int> daughterIndices;
190 for (
unsigned int i = 0; i < decay.m_daughterDecays.size(); i++) {
192 ReconstructedDecay rd = decay.m_daughterDecays[i];
194 if (rd.m_behavior == c_ReconstructFrom) {
195 ASSERT_NE(rd.m_optDecay,
nullptr);
197 rd.m_optDecay =
nullptr;
198 rd.m_behavior = Decay::c_Default;
200 ASSERT_TRUE(decay.m_daughterDecays.size() > i);
201 d = &(mcDecay->m_daughterDecays[i]);
203 d->reconstruct({rd});
205 daughterIndices.push_back(d->m_particle->getArrayIndex());
208 if (decay.m_pdg != 0) {
210 std::vector<int> decaylist, decaybarlist;
211 for (
int idx : daughterIndices) {
212 const Particle* daughterPart = particles[idx];
214 decaylist.push_back(daughterPDG);
215 decaybarlist.push_back((daughterPart->
getFlavorType() == Particle::c_Flavored) ? (-daughterPDG) : daughterPDG);
217 std::sort(decaylist.begin(), decaylist.end());
218 std::sort(decaybarlist.begin(), decaybarlist.end());
219 bool isUnflavored = (decaylist == decaybarlist);
221 m_particle = particles.appendNew(ROOT::Math::PxPyPzEVector(), decay.m_pdg,
222 isUnflavored ? (Particle::c_Unflavored) : (Particle::c_Flavored),
228 [[nodiscard]]
string getString()
const {
return "Particles(MCParticles,MCMatch,Flags):\n" + getStringInternal(); }
231 vector<Decay> m_daughterDecays;
239 [[nodiscard]]
string getStringInternal(
int depth = 0)
const
243 for (
int i = 0; i < depth; i++)
254 s << m_mcparticle->
getPDG();
261 s <<
", " << mcMatch->
getPDG() <<
", ";
262 if (m_particle->
hasExtraInfo(MCMatching::c_extraInfoMCErrors))
263 s << MCMatching::explainFlags(m_particle->
getExtraInfo(MCMatching::c_extraInfoMCErrors));
272 if (!m_daughterDecays.empty()) {
274 for (
const Decay& d : m_daughterDecays) {
275 s <<
"\n" << d.getStringInternal(depth + 1);
278 s <<
"\n" << spaces <<
"]";
286 class MCMatchingTest :
public ::testing::Test {
289 void SetUp()
override
295 particles.registerInDataStore();
297 particles.registerRelationTo(mcparticles);
301 void TearDown()
override
303 DataStore::Instance().reset();
311 Decay d(111, {22, 22});
315 EXPECT_EQ(mcparticles.getEntries(), 3);
316 EXPECT_EQ(mcparticles[0]->getPDG(), Const::pi0.getPDGCode());
317 EXPECT_EQ(mcparticles[1]->getPDG(), Const::photon.getPDGCode());
318 EXPECT_EQ(mcparticles[2]->getPDG(), Const::photon.getPDGCode());
319 EXPECT_EQ(mcparticles[0]->getMother(),
nullptr);
320 EXPECT_EQ(mcparticles[1]->getMother(), mcparticles[0]);
321 EXPECT_EQ(mcparticles[2]->getMother(), mcparticles[0]);
323 Decay e(111, {22, 22});
325 EXPECT_EQ(mcparticles.getEntries(), 6);
326 EXPECT_EQ(mcparticles[3]->getPDG(), Const::pi0.getPDGCode());
327 EXPECT_EQ(mcparticles[3]->getNDaughters(), 2);
328 EXPECT_EQ(mcparticles[4]->getPDG(), Const::photon.getPDGCode());
329 EXPECT_EQ(mcparticles[5]->getPDG(), Const::photon.getPDGCode());
330 EXPECT_EQ(mcparticles[4]->getNDaughters(), 0);
331 EXPECT_EQ(mcparticles[5]->getNDaughters(), 0);
332 EXPECT_EQ(mcparticles[3]->getMother(),
nullptr);
333 EXPECT_EQ(mcparticles[4]->getMother(), mcparticles[3]);
334 EXPECT_EQ(mcparticles[5]->getMother(), mcparticles[3]);
338 EXPECT_EQ(mcparticles.getEntries(), 7);
339 EXPECT_EQ(mcparticles[6]->getPDG(), Const::pion.getPDGCode());
341 Decay g(421, {321, -211, {111, {22, 22}}});
343 EXPECT_EQ(3, g.m_mcparticle->getNDaughters());
344 EXPECT_EQ(mcparticles.getEntries(), 13);
348 TEST_F(MCMatchingTest, CorrectReconstruction)
353 Decay d(421, {321, -211, {111, {22, 22}}});
354 d.reconstruct({421, {321, -211, {111, {22, 22}}}});
357 EXPECT_EQ(mcparticles[0]->getPDG(), 421);
358 EXPECT_EQ(mcparticles[5]->getPDG(), Const::photon.getPDGCode());
359 EXPECT_EQ(particles.getEntries(), 6);
361 ASSERT_NE(d.m_particle,
nullptr);
362 const auto& fspParticles = d.m_particle->getFinalStateDaughters();
363 EXPECT_EQ(fspParticles.size(), 4u);
365 for (
const Particle* p : fspParticles) {
369 EXPECT_TRUE(mcparticles[0] == d.m_mcparticle);
370 EXPECT_TRUE(mcparticles[0]->getRelated<Particle>() ==
nullptr);
371 EXPECT_TRUE(mcparticles[3]->getRelated<Particle>() ==
nullptr);
374 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
376 EXPECT_EQ(MCMatching::c_Correct, MCMatching::getMCErrors(d.m_particle)) << d.getString();
380 TEST_F(MCMatchingTest, SetMCTruthNeverRun)
382 Decay d(421, {321, -211, {111, {22, 22}}});
383 d.reconstruct({421, {211, -211, {111, {22, 22}}}});
385 EXPECT_EQ(
nullptr, d.m_particle->getRelated<
MCParticle>());
386 ASSERT_FALSE(d.m_particle->hasExtraInfo(MCMatching::c_extraInfoMCErrors));
387 EXPECT_EQ(MCMatching::c_InternalError, MCMatching::getMCErrors(d.m_particle)) << d.getString();
390 TEST_F(MCMatchingTest, SettingTruths)
392 Decay d(421, {321, -211, {111, {22, 22}}});
393 d.reconstruct({421, {211, -211, {111, {22, 22}}}});
396 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
397 EXPECT_EQ(d.m_mcparticle->getPDG(), d.m_particle->getRelated<
MCParticle>()->
getPDG());
400 ASSERT_FALSE(d.m_particle->hasExtraInfo(MCMatching::c_extraInfoMCErrors));
401 ASSERT_FALSE(d.getParticle(111)->hasExtraInfo(MCMatching::c_extraInfoMCErrors));
403 EXPECT_EQ(MCMatching::c_MisID, MCMatching::getMCErrors(d.m_particle)) << d.getString();
406 ASSERT_TRUE(d.m_particle->hasExtraInfo(MCMatching::c_extraInfoMCErrors));
407 ASSERT_TRUE(d.getParticle(111)->hasExtraInfo(MCMatching::c_extraInfoMCErrors));
411 TEST_F(MCMatchingTest, MisID)
414 Decay d(421, {321, -211, {111, {22, 22}}});
415 d.reconstruct({421, {211, -211, {111, {22, 22}}}});
416 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
417 EXPECT_EQ(d.m_mcparticle->getPDG(), d.m_particle->getRelated<
MCParticle>()->
getPDG());
418 EXPECT_EQ(MCMatching::c_MisID, MCMatching::getMCErrors(d.m_particle)) << d.getString();
422 Decay d(421, {321, -211, {111, {22, 22}}});
423 d.reconstruct({413, {321, -13, {111, {22, 22}}}});
424 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
425 EXPECT_EQ(MCMatching::c_MisID | MCMatching::c_AddedWrongParticle, MCMatching::getMCErrors(d.m_particle)) << d.getString();
428 Decay d(421, {321, -211, {111, {22, 22}}});
429 d.reconstruct({421, {321, 13, {111, {22, 22}}}});
430 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
431 EXPECT_EQ(MCMatching::c_MisID, MCMatching::getMCErrors(d.m_particle)) << d.getString();
434 Decay d(421, {321, -211, {111, {22, 22}}});
435 d.reconstruct({421, {211, 13, {111, {22, 22}}}});
436 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
437 EXPECT_EQ(MCMatching::c_MisID, MCMatching::getMCErrors(d.m_particle)) << d.getString();
441 Decay d(421, {321, -211, {111, {22, 22}}});
442 d.reconstruct({421, { -211, 321, {111, {22, 22}}}});
443 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
444 EXPECT_EQ(MCMatching::c_MisID, MCMatching::getMCErrors(d.m_particle)) << d.getString();
449 TEST_F(MCMatchingTest, MissingParticles)
453 Decay d(421, {321, -211, {111, {22, 22}}});
454 d.reconstruct({421, {321, -211, {0}}});
455 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
456 EXPECT_EQ(MCMatching::c_MissGamma | MCMatching::c_MissingResonance, MCMatching::getMCErrors(d.m_particle)) << d.getString();
459 Decay d(421, {321, -211, {111, {22, 22}}});
460 d.reconstruct({421, {321, 0, {111, {22, 22}}}});
461 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
462 EXPECT_EQ(MCMatching::getMCErrors(d.m_particle), MCMatching::c_MissMassiveParticle) << d.getString();
465 Decay d(421, {321, -211, {111, {22, 22}}});
466 d.reconstruct({421, {0, -211, {111, {22, 22}}}});
467 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
468 EXPECT_EQ(MCMatching::getMCErrors(d.m_particle), MCMatching::c_MissMassiveParticle) << d.getString();
471 Decay d(421, {321, -211, {111, {22, 22}}});
472 d.reconstruct({421, {0, -13, {111, {22, 22}}}});
473 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
474 EXPECT_EQ(MCMatching::getMCErrors(d.m_particle), MCMatching::c_MissMassiveParticle | MCMatching::c_MisID) << d.getString();
477 TEST_F(MCMatchingTest, KLongCorrect)
480 Decay d(431, { {323, {321, {111, {22, 22}} }}, { -311, {130}}});
486 d.reconstruct({431, { {323, {321, {111, {22, 22}} }}, {130, {}, Decay::c_ReconstructFrom, d.getDecay(130)}}});
487 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
488 EXPECT_EQ(MCMatching::c_MissingResonance, MCMatching::getMCErrors(d.m_particle)) << d.getString();
490 TEST_F(MCMatchingTest, KLongMissed)
493 Decay d(431, { {323, {321, {111, {22, 22}} }}, { -311, {130}}});
499 d.reconstruct({431, { {323, {321, {111, {22, 22}} }}, 0}});
500 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
501 EXPECT_EQ(MCMatching::c_MissKlong | MCMatching::c_MissMassiveParticle | MCMatching::c_MissingResonance,
502 MCMatching::getMCErrors(d.m_particle)) << d.getString();
504 TEST_F(MCMatchingTest, KShortCorrect)
507 Decay d(431, { {323, {321, {111, {22, 22}} }}, { -311, {{310, {211, -211}}}}});
517 d.reconstruct({431, { {323, {321, {111, {22, 22}} }}, {310, {{211, {}, Decay::c_ReconstructFrom, d.getDecay(211)}, { -211, {}, Decay::c_ReconstructFrom, d.getDecay(-211)}}}}});
518 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
519 EXPECT_EQ(MCMatching::c_MissingResonance, MCMatching::getMCErrors(d.m_particle)) << d.getString();
521 TEST_F(MCMatchingTest, KShortMissed)
524 Decay d(431, { {323, {321, {111, {22, 22}} }}, { -311, {{310, {211, -211}}}}});
534 d.reconstruct({431, { {323, {321, {111, {22, 22}} }}, 0}});
535 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
536 EXPECT_EQ(MCMatching::c_MissMassiveParticle | MCMatching::c_MissingResonance,
537 MCMatching::getMCErrors(d.m_particle)) << d.getString();
540 TEST_F(MCMatchingTest, PionWithOneGamma)
545 Decay d(421, {321, -211, {111, {22, 22}}});
546 d.reconstruct({421, {321, -211, {111, {0, 22}}}});
548 EXPECT_EQ(particles.getEntries(), 5);
549 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
550 EXPECT_EQ(MCMatching::c_MissGamma, MCMatching::getMCErrors(d.m_particle)) << d.getString();
553 Decay d(421, {321, -211, {111, {22, 22}}});
554 d.reconstruct({421, {321, 0, {111, {0, 22}}}});
555 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
556 EXPECT_EQ(MCMatching::c_MissMassiveParticle | MCMatching::c_MissGamma, MCMatching::getMCErrors(d.m_particle)) << d.getString();
559 TEST_F(MCMatchingTest, TauWithResonance)
563 Decay d(15, {16, { -213, { -211, {111, {22, 22}}}}});
564 d.reconstruct({15, {0, { -213, { -211, {111, {22, 22}}}}}});
565 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
566 EXPECT_EQ(MCMatching::c_MissNeutrino, MCMatching::getMCErrors(d.m_particle)) << d.getString();
570 Decay d(15, {16, { -213, { -211, {111, {22, 22}}}}});
571 d.reconstruct({15, {{ -211, {}, Decay::c_ReconstructFrom, &d[1][0]}, {111, {22, 22}, Decay::c_ReconstructFrom, &d[1][1]}}});
572 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
573 EXPECT_EQ(MCMatching::c_MissingResonance, MCMatching::getMCErrors(d.m_particle)) << d.getString();
577 Decay d(15, {16, { -213, { -211, {111, {22, 22}}}}});
578 d.reconstruct({15, {{ -211, {}, Decay::c_ReconstructFrom, &d[1][0]}, {111, {0, {22, {}, Decay::c_ReconstructFrom, &d[1][1][1]}}, Decay::c_ReconstructFrom, &d[1][1]}}});
579 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
580 EXPECT_EQ(MCMatching::c_MissGamma | MCMatching::c_MissingResonance, MCMatching::getMCErrors(d.m_particle)) << d.getString();
584 Decay g(-512, {211, -211, -16, {15, {16, { -213, { -211, {111, {22, 22}}}}}}});
586 d.reconstruct({15, {{ -211, {}, Decay::c_ReconstructFrom, &g[1]}, {111, {22, 22}, Decay::c_ReconstructFrom, &d[1][1]}}});
587 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
588 EXPECT_EQ(MCMatching::c_MissMassiveParticle | MCMatching::c_MissingResonance | MCMatching::c_MissNeutrino |
589 MCMatching::c_AddedWrongParticle,
590 MCMatching::getMCErrors(d.m_particle)) << d.getString();
595 TEST_F(MCMatchingTest, MissGamma)
599 Decay d(431, {{421, {321, -211, {111, {22, 22}}}}, {111, {22, 22}}});
600 d.reconstruct({431, {{421, {321, -211, {111, {22, 22}}}}, {111, {22, 22}}}});
601 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
602 EXPECT_EQ(MCMatching::c_Correct, MCMatching::getMCErrors(d.m_particle)) << d.getString();
606 Decay d(431, {{421, {321, -211, {111, {22, 22}}}}, {111, {22, 22}}});
607 Decay& gamma = d[1][0];
608 d.reconstruct({431, {{421, {321, -211, {111, {22, 22}}}}, {22, {}, Decay::c_ReconstructFrom, &gamma}}});
609 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
610 EXPECT_EQ(MCMatching::c_MissGamma | MCMatching::c_MissingResonance, MCMatching::getMCErrors(d.m_particle)) << d.getString();
615 Decay d(431, {{421, {321, -211, {111, {22, 22}}}}, 22});
616 d.reconstruct({431, {{421, {321, -211, {111, {22, 22}}}}, 22}});
617 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
618 EXPECT_EQ(MCMatching::c_Correct, MCMatching::getMCErrors(d.m_particle)) << d.getString();
622 Decay d(111, {11, -11, 22});
623 d.reconstruct({111, {11, -11, 22}});
624 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
625 EXPECT_EQ(MCMatching::c_Correct, MCMatching::getMCErrors(d.m_particle)) << d.getString();
629 Decay d(111, {11, -11, 22});
630 d.reconstruct({111, {11, -11, 0}});
631 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
632 EXPECT_EQ(MCMatching::c_MissGamma, MCMatching::getMCErrors(d.m_particle)) << d.getString();
636 Decay d(111, {22, 22});
638 d.reconstruct({111, {22, {22, {}, Decay::c_ReconstructFrom, &gamma}}});
639 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
641 EXPECT_EQ(MCMatching::c_AddedWrongParticle, MCMatching::getMCErrors(d.m_particle)) << d.getString();
645 Decay d(111, {22, 22, 22, 22});
646 d.reconstruct({111, {22, 22, 22, 22}});
647 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
648 EXPECT_EQ(MCMatching::c_Correct, MCMatching::getMCErrors(d.m_particle)) << d.getString();
652 Decay d(111, {22, 22, 22, 22});
653 d.reconstruct({111, {22, 22, 0, 0}});
654 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
655 EXPECT_EQ(MCMatching::c_MissGamma, MCMatching::getMCErrors(d.m_particle)) << d.getString();
659 Decay d(111, {22, 22, 22, 22});
661 d.reconstruct({111, {22, 22, 22, {22, {}, Decay::c_ReconstructFrom, &gamma}}});
662 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
663 EXPECT_EQ(MCMatching::c_MissGamma, MCMatching::getMCErrors(d.m_particle)) << d.getString();
667 TEST_F(MCMatchingTest, WrongPhotonForPi0)
670 Decay d(521, {211, Decay(421, {321, -211, Decay(111, {22, 22})}), 22});
672 d.reconstruct({521, {211, {421, {321, -211, {111, {{22}, {22, {}, Decay::c_RelateWith, d.getMCParticle(211)}}}}}}});
680 Decay* pi0decay = d.getDecay(111);
681 ASSERT_TRUE(MCMatching::setMCTruth(pi0)) << pi0decay->getString();
683 EXPECT_EQ(MCMatching::c_MisID | MCMatching::c_AddedWrongParticle | MCMatching::c_MissMassiveParticle | MCMatching::c_MissGamma |
684 MCMatching::c_MissingResonance,
685 MCMatching::getMCErrors(pi0)) << pi0decay->getString();
689 Decay* d0decay = d.getDecay(421);
690 ASSERT_TRUE(MCMatching::setMCTruth(p)) << d0decay->getString();
691 EXPECT_EQ(MCMatching::c_MisID | MCMatching::c_AddedWrongParticle | MCMatching::c_MissGamma | MCMatching::c_MissingResonance,
692 MCMatching::getMCErrors(p)) << d0decay->getString();
695 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
696 EXPECT_EQ(MCMatching::c_MisID | MCMatching::c_AddedWrongParticle | MCMatching::c_MissGamma | MCMatching::c_MissingResonance,
697 MCMatching::getMCErrors(d.m_particle)) << d.getString();
702 TEST_F(MCMatchingTest, DecayInFlightCorrect)
705 Decay d(421, {321, { -211, {13}}, {111, {22, 22}}});
709 ASSERT_FALSE(muon->
hasStatus(MCParticle::c_PrimaryParticle));
710 d.reconstruct({421, {321, -211, {111, {22, 22}}}});
712 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
713 EXPECT_EQ(d.m_mcparticle->getPDG(), d.m_particle->getRelated<
MCParticle>()->
getPDG());
714 EXPECT_EQ(MCMatching::c_Correct, MCMatching::getMCErrors(d.m_particle)) << d.getString();
717 Decay d(421, {{321, {11, -12, {111, {22, 22}}}}, -211, {111, {22, 22}}});
718 d.reconstruct({421, {321, -211, {111, {22, 22}}}});
720 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
721 EXPECT_EQ(d.m_mcparticle->getPDG(), d.m_particle->getRelated<
MCParticle>()->
getPDG());
722 EXPECT_EQ(MCMatching::c_Correct, MCMatching::getMCErrors(d.m_particle)) << d.getString();
726 TEST_F(MCMatchingTest, DecayInFlight)
733 d.reconstruct({ -211, {}, Decay::c_RelateWith, muon});
735 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
736 EXPECT_EQ(d.m_mcparticle->getPDG(), d.m_particle->getRelated<
MCParticle>()->
getPDG());
737 EXPECT_EQ(MCMatching::c_DecayInFlight, MCMatching::getMCErrors(d.m_particle)) << d.getString();
740 Decay d(421, {321, { -211, {13}}, {111, {22, 22}}});
744 d.reconstruct({421, {321, { -211, {}, Decay::c_RelateWith, muon}, {111, {22, 22}}}});
747 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
748 EXPECT_EQ(d.m_mcparticle->getPDG(), d.m_particle->getRelated<
MCParticle>()->
getPDG());
749 EXPECT_EQ(MCMatching::c_DecayInFlight, MCMatching::getMCErrors(d.m_particle)) << d.getString();
753 TEST_F(MCMatchingTest, CorrectFSPsWrongDecay)
756 Decay d(-413, {{ -411, {321, -211, -211}}, {111, {22, 22}}});
759 Decay& pi2 = d[0][2];
761 ASSERT_TRUE(d.getDecay(111) == &pi0);
763 d.reconstruct({ -413, {{ -421, {321, -211, {111, {22, 22}, Decay::c_ReconstructFrom, &pi0}}}, { -211, {}, Decay::c_ReconstructFrom, &pi2}}});
766 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
767 EXPECT_EQ(d.m_mcparticle->getPDG(), d.m_particle->getRelated<
MCParticle>()->
getPDG());
769 EXPECT_EQ(MCMatching::c_AddedWrongParticle | MCMatching::c_MissingResonance,
770 MCMatching::getMCErrors(d.m_particle)) << d.getString();
774 TEST_F(MCMatchingTest, WrongCombination)
778 Decay d(-413, {{ -421, {321, -211, {111, {22, 22}}}}, -211});
780 Decay* pi1 = &(d[0][1]);
781 Decay* pi2 = &(d[1]);
782 ASSERT_TRUE(pi1->m_pdg == pi2->m_pdg);
784 d.reconstruct({ -413, {{ -421, {321, { -211, {}, Decay::c_ReconstructFrom, pi2}, {111, {22, 22}}}}, { -211, {}, Decay::c_ReconstructFrom, pi1}}});
787 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
788 EXPECT_EQ(d.m_mcparticle->getPDG(), d.m_particle->getRelated<
MCParticle>()->
getPDG());
790 EXPECT_EQ(MCMatching::c_AddedWrongParticle | MCMatching::c_MissingResonance,
791 MCMatching::getMCErrors(d.m_particle)) << d.getString();
796 Decay d(511, {{333, {321, -321}}, {333, {321, -321}}});
798 Decay* k1 = &(d[0][1]);
799 Decay* k2 = &(d[1][1]);
800 ASSERT_TRUE(k1->m_pdg == k2->m_pdg);
802 d.reconstruct({511, {
803 {333, {321, { -321, {}, Decay::c_ReconstructFrom, k2}}},
804 {333, {321, { -321, {}, Decay::c_ReconstructFrom, k1}}}
809 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
810 EXPECT_EQ(d.m_mcparticle->getPDG(), d.m_particle->getRelated<
MCParticle>()->
getPDG());
812 EXPECT_EQ(MCMatching::c_AddedWrongParticle | MCMatching::c_MissingResonance,
813 MCMatching::getMCErrors(d.m_particle)) << d.getString();
817 TEST_F(MCMatchingTest, SelfCrossFeed)
820 Decay d(300533, {{511, {321, -211, {111, {22, 22}}}}, { -511, { -321, 211, {111, {22, 22}}}}});
822 Decay* pi1 = &(d[0][2]);
823 Decay* pi2 = &(d[1][2]);
824 ASSERT_TRUE(pi1->m_pdg == pi2->m_pdg);
826 d.reconstruct({300533, {
827 {511, {321, -211, {111, {22, 22}, Decay::c_ReconstructFrom, pi2}}},
828 { -511, { -321, 211, {111, {22, 22}, Decay::c_ReconstructFrom, pi1}}}
833 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
834 EXPECT_EQ(d.m_mcparticle->getPDG(), d.m_particle->getRelated<
MCParticle>()->
getPDG());
836 EXPECT_EQ(MCMatching::c_AddedWrongParticle | MCMatching::c_MissingResonance,
837 MCMatching::getMCErrors(d.m_particle)) << d.getString();
841 TEST_F(MCMatchingTest, FlavouredD0Decay)
845 Decay d(421, { -321, 211});
846 d.reconstruct({421, { -321, 211}});
847 ASSERT_EQ(Particle::c_Flavored, d.m_particle->getFlavorType());
849 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
850 EXPECT_EQ(d.m_particle->getPDGCode(), d.m_particle->getRelated<
MCParticle>()->
getPDG());
851 EXPECT_EQ(MCMatching::c_Correct, MCMatching::getMCErrors(d.m_particle)) << d.getString();
855 Decay d(-421, { -321, 211});
856 d.reconstruct({ -421, { -321, 211}});
857 ASSERT_EQ(Particle::c_Flavored, d.m_particle->getFlavorType());
859 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
860 EXPECT_EQ(d.m_particle->getPDGCode(), d.m_particle->getRelated<
MCParticle>()->
getPDG());
861 EXPECT_EQ(MCMatching::c_Correct, MCMatching::getMCErrors(d.m_particle)) << d.getString();
865 Decay d(421, { -321, 211});
866 d.reconstruct({ -421, { -321, 211}});
867 ASSERT_EQ(Particle::c_Flavored, d.m_particle->getFlavorType());
869 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
870 EXPECT_EQ(MCMatching::c_AddedWrongParticle, MCMatching::getMCErrors(d.m_particle)) << d.getString();
874 Decay d(-421, { -321, 211});
875 d.reconstruct({421, { -321, 211}});
876 ASSERT_EQ(Particle::c_Flavored, d.m_particle->getFlavorType());
878 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
879 EXPECT_EQ(MCMatching::c_AddedWrongParticle, MCMatching::getMCErrors(d.m_particle)) << d.getString();
883 TEST_F(MCMatchingTest, UnflavouredD0Decay)
887 Decay d(421, { -321, 321});
888 d.reconstruct({421, { -321, 321}});
889 ASSERT_EQ(Particle::c_Unflavored, d.m_particle->getFlavorType());
891 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
892 EXPECT_EQ(d.m_mcparticle->getPDG(), d.m_particle->getRelated<
MCParticle>()->
getPDG());
893 EXPECT_EQ(MCMatching::c_Correct, MCMatching::getMCErrors(d.m_particle)) << d.getString();
897 Decay d(-421, { -321, 321});
898 d.reconstruct({ -421, { -321, 321}});
899 ASSERT_EQ(Particle::c_Unflavored, d.m_particle->getFlavorType());
901 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
902 EXPECT_EQ(d.m_mcparticle->getPDG(), d.m_particle->getRelated<
MCParticle>()->
getPDG());
903 EXPECT_EQ(MCMatching::c_Correct, MCMatching::getMCErrors(d.m_particle)) << d.getString();
907 Decay d(421, { -321, 321});
908 d.reconstruct({ -421, { -321, 321}});
909 ASSERT_EQ(Particle::c_Unflavored, d.m_particle->getFlavorType());
911 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
912 EXPECT_EQ(MCMatching::c_Correct, MCMatching::getMCErrors(d.m_particle)) << d.getString();
916 Decay d(-421, { -321, 321});
917 d.reconstruct({421, { -321, 321}});
918 ASSERT_EQ(Particle::c_Unflavored, d.m_particle->getFlavorType());
920 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
921 EXPECT_EQ(MCMatching::c_Correct, MCMatching::getMCErrors(d.m_particle)) << d.getString();
926 TEST_F(MCMatchingTest, MissingResonance)
930 Decay d(511, {{ -411, { -321, 321, 211}}, {213, {211, {111, {22, 22}}}}});
931 d.reconstruct({511, {{ -411, { -321, 321, 211}}, {213, {211, {111, {22, 22}}}}}});
933 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
934 EXPECT_EQ(MCMatching::c_Correct, MCMatching::getMCErrors(d.m_particle)) << d.getString();
938 Decay d(511, {{ -411, { -321, 321, 211}}, {213, {211, {111, {22, 22}}}}});
940 Decay* piplus = &(d[1][0]);
941 Decay* pi0 = &(d[1][1]);
943 d.reconstruct({511, {{ -411, { -321, 321, 211}}, {211, {}, Decay::c_ReconstructFrom, piplus}, {111, {22, 22}, Decay::c_ReconstructFrom, pi0}}});
945 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
946 EXPECT_EQ(MCMatching::c_MissingResonance, MCMatching::getMCErrors(d.m_particle)) << d.getString();
950 TEST_F(MCMatchingTest, MissingFSPReplacedBySecondary)
952 Decay d(521, {{ -421, {321, { -211, {22, -211}}}}, 211, 211, -211});
953 Decay* pi = &(d[0][1][1]);
954 d.reconstruct({521, {{ -421, {321, -211}}, 211, 211, {
956 Decay::c_ReconstructFrom, pi
960 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
961 EXPECT_EQ(MCMatching::c_MissMassiveParticle, MCMatching::getMCErrors(d.m_particle)) << d.getString();
963 TEST_F(MCMatchingTest, BeamBackground)
965 Decay d(421, {321, -211, {111, {22, 22}}});
968 d.reconstruct({421, {321, { -211, {}, Decay::c_RelateWith, noParticle}, {111, {22, 22}}}});
971 ASSERT_FALSE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
972 EXPECT_EQ(MCMatching::c_InternalError, MCMatching::getMCErrors(d.m_particle)) << d.getString();
973 EXPECT_EQ(
nullptr, d.m_particle->getRelated<
MCParticle>()) << d.getString();
976 TEST_F(MCMatchingTest, DuplicateTrack)
979 Decay d(421, {321, -211, {111, {22, 22}}});
982 ASSERT_TRUE(kaon !=
nullptr);
984 d.reconstruct({421, {321, { -211, {}, Decay::c_RelateWith, kaon}, {111, {22, 22}}}});
986 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
987 EXPECT_EQ(d.m_mcparticle->getPDG(), d.m_particle->getRelated<
MCParticle>()->
getPDG());
988 EXPECT_EQ(MCMatching::c_MissMassiveParticle | MCMatching::c_MisID, MCMatching::getMCErrors(d.m_particle)) << d.getString();
993 TEST_F(MCMatchingTest, MissingFSRMissingPHOTOS)
996 Decay d(521, { -11, 12, 22});
999 EXPECT_FALSE(MCMatching::isFSR(photon));
1001 d.reconstruct({521, { -11}});
1002 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
1003 EXPECT_EQ(d.m_mcparticle->getPDG(), d.m_particle->getRelated<
MCParticle>()->
getPDG());
1004 EXPECT_EQ(MCMatching::c_MissGamma | MCMatching::c_MissNeutrino, MCMatching::getMCErrors(d.m_particle)) << d.getString();
1009 Decay d(521, { -11, 12, 22});
1012 photon->
setStatus(MCParticle::c_PrimaryParticle | MCParticle::c_IsISRPhoton);
1013 EXPECT_FALSE(MCMatching::isFSR(photon));
1015 d.reconstruct({521, { -11}});
1016 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
1017 EXPECT_EQ(d.m_mcparticle->getPDG(), d.m_particle->getRelated<
MCParticle>()->
getPDG());
1018 EXPECT_EQ(MCMatching::c_MissGamma | MCMatching::c_MissNeutrino, MCMatching::getMCErrors(d.m_particle)) << d.getString();
1023 Decay d(521, { -11, 12, 22});
1026 photon->
setStatus(MCParticle::c_PrimaryParticle | MCParticle::c_IsFSRPhoton);
1027 EXPECT_TRUE(MCMatching::isFSR(photon));
1029 d.reconstruct({521, { -11}});
1030 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
1031 EXPECT_EQ(d.m_mcparticle->getPDG(), d.m_particle->getRelated<
MCParticle>()->
getPDG());
1032 EXPECT_EQ(MCMatching::c_MissFSR | MCMatching::c_MissNeutrino, MCMatching::getMCErrors(d.m_particle)) << d.getString();
1037 Decay d(521, { -11, 12, 22});
1040 photon->
setStatus(MCParticle::c_PrimaryParticle | MCParticle::c_IsPHOTOSPhoton);
1041 EXPECT_FALSE(MCMatching::isFSR(photon));
1043 d.reconstruct({521, { -11}});
1044 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
1045 EXPECT_EQ(d.m_mcparticle->getPDG(), d.m_particle->getRelated<
MCParticle>()->
getPDG());
1046 EXPECT_EQ(MCMatching::c_MissPHOTOS | MCMatching::c_MissNeutrino, MCMatching::getMCErrors(d.m_particle)) << d.getString();
1051 TEST_F(MCMatchingTest, UnspecifiedParticleReconstruction)
1055 Decay d(511, {{30343, {321, -211}}, -13, 13});
1056 d.reconstruct({511, {{30343, {321, -211}}, -13, 13}});
1059 ASSERT_TRUE(Xsd !=
nullptr);
1060 EXPECT_EQ(Variable::particleIsUnspecified(Xsd),
false);
1061 Xsd->
setProperty(Particle::PropertyFlags::c_IsUnspecified);
1062 EXPECT_EQ(Variable::particleIsUnspecified(Xsd),
true);
1064 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
1065 EXPECT_EQ(MCMatching::c_Correct, MCMatching::getMCErrors(d.m_particle)) << d.getString();
1069 Decay d(511, {{313, {321, -211}}, -13, 13});
1070 d.reconstruct({511, {{30343, {321, -211}}, -13, 13}});
1073 ASSERT_TRUE(Xsd !=
nullptr);
1074 EXPECT_EQ(Variable::particleIsUnspecified(Xsd),
false);
1075 Xsd->
setProperty(Particle::PropertyFlags::c_IsUnspecified);
1076 EXPECT_EQ(Variable::particleIsUnspecified(Xsd),
true);
1078 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
1079 EXPECT_EQ(MCMatching::c_Correct, MCMatching::getMCErrors(d.m_particle)) << d.getString();
1083 Decay d(511, { {313, {321, -211}}, {443, { -13, 13}}});
1084 Decay* mup = &(d[1][0]);
1085 Decay* mum = &(d[1][1]);
1086 d.reconstruct({511, {{30343, {321, -211}}, { -13, {}, Decay::c_ReconstructFrom, mup}, {13, {}, Decay::c_ReconstructFrom, mum}}});
1089 ASSERT_TRUE(Xsd !=
nullptr);
1090 EXPECT_EQ(Variable::particleIsUnspecified(Xsd),
false);
1091 Xsd->
setProperty(Particle::PropertyFlags::c_IsUnspecified);
1092 EXPECT_EQ(Variable::particleIsUnspecified(Xsd),
true);
1094 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
1095 EXPECT_EQ(MCMatching::c_MissingResonance, MCMatching::getMCErrors(d.m_particle)) << d.getString();
1100 TEST_F(MCMatchingTest, CountMissingParticle)
1104 Decay d(421, {321, -211, {111, {22, 22}}});
1105 d.reconstruct({421, {321, -211, {0}}});
1106 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
1107 EXPECT_EQ(MCMatching::c_MissGamma | MCMatching::c_MissingResonance, MCMatching::getMCErrors(d.m_particle)) << d.getString();
1108 ASSERT_NE(
nullptr, d.m_particle->getRelated<
MCParticle>()) << d.getString();
1109 vector<int> daughterPDG{Const::pi0.getPDGCode()};
1110 EXPECT_EQ(MCMatching::countMissingParticle(d.m_particle, d.m_particle->getRelated<
MCParticle>(), daughterPDG), 1);
1114 Decay d(421, {321, -211, {111, {22, 22}}});
1115 d.reconstruct({421, {321, 0, {111, {22, 22}}}});
1116 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
1117 EXPECT_EQ(MCMatching::getMCErrors(d.m_particle), MCMatching::c_MissMassiveParticle) << d.getString();
1118 ASSERT_NE(
nullptr, d.m_particle->getRelated<
MCParticle>()) << d.getString();
1119 vector<int> daughterPDG{Const::pion.getPDGCode()};
1120 EXPECT_EQ(MCMatching::countMissingParticle(d.m_particle, d.m_particle->getRelated<
MCParticle>(), daughterPDG), 1);
1124 Decay d(421, {321, -211, {111, {22, 22}}});
1125 d.reconstruct({421, {0, -211, {111, {22, 22}}}});
1126 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
1127 EXPECT_EQ(MCMatching::getMCErrors(d.m_particle), MCMatching::c_MissMassiveParticle) << d.getString();
1128 ASSERT_NE(
nullptr, d.m_particle->getRelated<
MCParticle>()) << d.getString();
1129 vector<int> daughterPDG{Const::kaon.getPDGCode()};
1130 EXPECT_EQ(MCMatching::countMissingParticle(d.m_particle, d.m_particle->getRelated<
MCParticle>(), daughterPDG), 1);
1134 Decay d(-521, { -321, {421, {321, -211, {111, {22, 22}}}}});
1135 d.reconstruct({ -521, {0, {421, {0, -211, {111, {22, 22}}}}}});
1136 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
1137 EXPECT_EQ(MCMatching::getMCErrors(d.m_particle), MCMatching::c_MissMassiveParticle) << d.getString();
1138 ASSERT_NE(
nullptr, d.m_particle->getRelated<
MCParticle>()) << d.getString();
1139 vector<int> daughterPDG{Const::kaon.getPDGCode()};
1140 EXPECT_EQ(MCMatching::countMissingParticle(d.m_particle, d.m_particle->getRelated<
MCParticle>(), daughterPDG), 2);
1144 Decay d(431, { {323, {321, {111, {22, 22}} }}, { -311, {{310, {211, -211}}}}});
1154 d.reconstruct({431, { {323, {321, {111, {22, 22}} }}, 0}});
1155 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
1156 EXPECT_EQ(MCMatching::c_MissMassiveParticle | MCMatching::c_MissingResonance,
1157 MCMatching::getMCErrors(d.m_particle)) << d.getString();
1158 ASSERT_NE(
nullptr, d.m_particle->getRelated<
MCParticle>()) << d.getString();
1159 vector<int> daughterPDG{Const::Kshort.getPDGCode()};
1160 EXPECT_EQ(MCMatching::countMissingParticle(d.m_particle, d.m_particle->getRelated<
MCParticle>(), daughterPDG), 1);
1164 Decay d(431, { {323, {321, {111, {22, 22}} }}, { -311, {130}}});
1170 d.reconstruct({431, { {323, {321, {111, {22, 22}} }}, 0}});
1171 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
1172 EXPECT_EQ(MCMatching::c_MissKlong | MCMatching::c_MissMassiveParticle | MCMatching::c_MissingResonance,
1173 MCMatching::getMCErrors(d.m_particle)) << d.getString();
1174 ASSERT_NE(
nullptr, d.m_particle->getRelated<
MCParticle>()) << d.getString();
1175 vector<int> daughterPDG{Const::Klong.getPDGCode()};
1176 EXPECT_EQ(MCMatching::countMissingParticle(d.m_particle, d.m_particle->getRelated<
MCParticle>(), daughterPDG), 1);
1180 Decay d(521, { -11, 12, 22});
1181 d.reconstruct({521, {0, 0, 22}});
1182 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
1183 EXPECT_EQ(MCMatching::c_MissNeutrino | MCMatching::c_MissMassiveParticle,
1184 MCMatching::getMCErrors(d.m_particle)) << d.getString();
1185 ASSERT_NE(
nullptr, d.m_particle->getRelated<
MCParticle>()) << d.getString();
1186 vector<int> daughterPDG_E{Const::electron.getPDGCode()};
1187 EXPECT_EQ(MCMatching::countMissingParticle(d.m_particle, d.m_particle->getRelated<
MCParticle>(), daughterPDG_E), 1);
1188 vector<int> daughterPDG_NuE{12};
1189 EXPECT_EQ(MCMatching::countMissingParticle(d.m_particle, d.m_particle->getRelated<
MCParticle>(), daughterPDG_NuE), 1);
1190 vector<int> daughterPDG_Nu{12, 14, 16};
1191 EXPECT_EQ(MCMatching::countMissingParticle(d.m_particle, d.m_particle->getRelated<
MCParticle>(), daughterPDG_Nu), 1);
1195 Decay d(521, { -13, 14, 22});
1196 d.reconstruct({521, {0, 0, 22}});
1197 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
1198 EXPECT_EQ(MCMatching::c_MissNeutrino | MCMatching::c_MissMassiveParticle,
1199 MCMatching::getMCErrors(d.m_particle)) << d.getString();
1200 ASSERT_NE(
nullptr, d.m_particle->getRelated<
MCParticle>()) << d.getString();
1201 vector<int> daughterPDG_Mu{Const::muon.getPDGCode()};
1202 EXPECT_EQ(MCMatching::countMissingParticle(d.m_particle, d.m_particle->getRelated<
MCParticle>(), daughterPDG_Mu), 1);
1203 vector<int> daughterPDG_NuMu{14};
1204 EXPECT_EQ(MCMatching::countMissingParticle(d.m_particle, d.m_particle->getRelated<
MCParticle>(), daughterPDG_NuMu), 1);
1205 vector<int> daughterPDG_Nu{12, 14, 16};
1206 EXPECT_EQ(MCMatching::countMissingParticle(d.m_particle, d.m_particle->getRelated<
MCParticle>(), daughterPDG_Nu), 1);
1212 TEST_F(MCMatchingTest, IsSignalBehavior)
1216 Decay d(511, { {313, {321, -211}}, {443, { -11, 11, 22}}});
1217 Decay* ep = &(d[1][0]);
1218 Decay* em = &(d[1][1]);
1221 d.reconstruct({511, {{313, {321, -211}}, { -11, {}, Decay::c_ReconstructFrom, ep}, {11, {}, Decay::c_ReconstructFrom, em}}});
1224 photon->
setStatus(MCParticle::c_PrimaryParticle | MCParticle::c_IsPHOTOSPhoton);
1229 B->
setProperty(Particle::PropertyFlags::c_Ordinary);
1230 ASSERT_TRUE(MCMatching::setMCTruth(B)) << d.getString();
1231 EXPECT_EQ(MCMatching::c_MissingResonance | MCMatching::c_MissPHOTOS, MCMatching::getMCErrors(B)) << d.getString();
1232 EXPECT_EQ(Variable::isSignal(B), 0.0) << d.getString();
1237 B->
setProperty(Particle::PropertyFlags::c_IsIgnoreIntermediate);
1238 ASSERT_TRUE(MCMatching::setMCTruth(B)) << d.getString();
1239 EXPECT_EQ(MCMatching::c_MissPHOTOS, MCMatching::getMCErrors(B)) << d.getString();
1240 EXPECT_EQ(Variable::isSignal(B), 0.0) << d.getString();
1245 B->
setProperty(Particle::PropertyFlags::c_IsIgnoreRadiatedPhotons);
1246 ASSERT_TRUE(MCMatching::setMCTruth(B)) << d.getString();
1247 EXPECT_EQ(MCMatching::c_MissingResonance, MCMatching::getMCErrors(B)) << d.getString();
1248 EXPECT_EQ(Variable::isSignal(B), 0.0) << d.getString();
1253 B->
setProperty(Particle::PropertyFlags::c_IsIgnoreRadiatedPhotons | Particle::PropertyFlags::c_IsIgnoreIntermediate);
1254 ASSERT_TRUE(MCMatching::setMCTruth(B)) << d.getString();
1255 EXPECT_EQ(MCMatching::c_Correct, MCMatching::getMCErrors(B)) << d.getString();
1256 EXPECT_EQ(Variable::isSignal(B), 1.0) << d.getString();
1261 TEST_F(MCMatchingTest, MissingFlagsOfDaughters)
1265 Decay d(300553, { {511, { -13, 13, 321, -211, {111, {22, 22}}}}, {511, {{ -411, {321, -211, -211}}, 211}} });
1268 d.reconstruct({300553, { {511, { -13, 13, 0, 0, {0, {0, 0}}}}, {511, {{ -411, {321, -211, -211}}, 211}} } });
1275 ASSERT_TRUE(MCMatching::setMCTruth(B1)) << d.getString();
1276 EXPECT_EQ(MCMatching::c_MissingResonance | MCMatching::c_MissGamma | MCMatching::c_MissMassiveParticle,
1277 MCMatching::getMCErrors(B1)) << d.getString();
1278 EXPECT_EQ(Variable::isSignal(B1), 0.0) << d.getString();
1280 ASSERT_TRUE(MCMatching::setMCTruth(B2)) << d.getString();
1281 EXPECT_EQ(MCMatching::c_Correct, MCMatching::getMCErrors(B2)) << d.getString();
1282 EXPECT_EQ(Variable::isSignal(B2), 1.0) << d.getString();
1284 ASSERT_TRUE(MCMatching::setMCTruth(Y4S)) << d.getString();
1285 EXPECT_EQ(Y4S->
getProperty(), Particle::PropertyFlags::c_Ordinary) << d.getString();
1286 EXPECT_EQ(MCMatching::c_MissingResonance | MCMatching::c_MissGamma | MCMatching::c_MissMassiveParticle,
1287 MCMatching::getMCErrors(Y4S)) << d.getString();
1288 EXPECT_EQ(Variable::isSignal(Y4S), 0.0) << d.getString();
1293 Decay d(300553, { {511, { -13, 13, 321, -211, {111, {22, 22}}}}, {511, {{ -411, {321, -211, -211}}, 211}} });
1296 d.reconstruct({300553, { {511, { -13, 13, 0, 0, {0, {0, 0}}}}, {511, {{ -411, {321, -211, -211}}, 211}} } });
1302 int isIgnoreMissing = Particle::PropertyFlags::c_IsIgnoreRadiatedPhotons |
1303 Particle::PropertyFlags::c_IsIgnoreIntermediate |
1304 Particle::PropertyFlags::c_IsIgnoreMassive |
1305 Particle::PropertyFlags::c_IsIgnoreNeutrino |
1306 Particle::PropertyFlags::c_IsIgnoreGamma;
1310 ASSERT_TRUE(MCMatching::setMCTruth(B1)) << d.getString();
1311 EXPECT_EQ(MCMatching::c_Correct, MCMatching::getMCErrors(B1)) << d.getString();
1312 EXPECT_EQ(Variable::isSignal(B1), 1.0) << d.getString();
1315 ASSERT_TRUE(MCMatching::setMCTruth(B2)) << d.getString();
1316 EXPECT_EQ(MCMatching::c_Correct, MCMatching::getMCErrors(B2)) << d.getString();
1317 EXPECT_EQ(Variable::isSignal(B2), 1.0) << d.getString();
1319 ASSERT_TRUE(MCMatching::setMCTruth(Y4S)) << d.getString();
1320 EXPECT_EQ(Y4S->
getProperty(), Particle::PropertyFlags::c_Ordinary) << d.getString();
1321 EXPECT_EQ(MCMatching::c_Correct, MCMatching::getMCErrors(Y4S)) << d.getString();
1322 EXPECT_EQ(Variable::isSignal(Y4S), 1.0) << d.getString();
1328 Decay d(511, {{ -411, { -211, 211, -211, {111, {22, 22}}}}, 211, {113, {211, -211}}});
1331 d.reconstruct({511, {{ -411, { -211, 0, 0, {111, {22, 22}}}}, 211, {0, {0, 0}}}});
1339 ASSERT_TRUE(MCMatching::setMCTruth(D)) << d.getString();
1340 EXPECT_EQ(MCMatching::c_MissMassiveParticle,
1341 MCMatching::getMCErrors(D)) << d.getString();
1342 EXPECT_EQ(Variable::isSignal(D), 0.0) << d.getString();
1345 ASSERT_TRUE(MCMatching::setMCTruth(B)) << d.getString();
1346 EXPECT_EQ(MCMatching::c_MissingResonance | MCMatching::c_MissMassiveParticle,
1347 MCMatching::getMCErrors(B)) << d.getString();
1348 EXPECT_EQ(Variable::isSignal(B), 0.0) << d.getString();
1352 Decay d(511, {{ -411, { -211, 211, -211, {111, {22, 22}}}}, 211, {113, {211, -211}}});
1355 d.reconstruct({511, {{ -411, { -211, 0, 0, {111, {22, 22}}}}, 211, {0, {0, 0}}}});
1360 int isIgnoreMissing = Particle::PropertyFlags::c_IsIgnoreIntermediate |
1361 Particle::PropertyFlags::c_IsIgnoreMassive;
1366 ASSERT_TRUE(MCMatching::setMCTruth(D)) << d.getString();
1367 EXPECT_EQ(MCMatching::c_MissMassiveParticle,
1368 MCMatching::getMCErrors(D)) << d.getString();
1369 EXPECT_EQ(Variable::isSignal(D), 0.0) << d.getString();
1374 ASSERT_TRUE(MCMatching::setMCTruth(B)) << d.getString();
1375 EXPECT_EQ(MCMatching::c_MissMassiveParticle,
1376 MCMatching::getMCErrors(B)) << d.getString();
1377 EXPECT_EQ(Variable::isSignal(B), 0.0) << d.getString();
Class to represent Particle data in graph.
Class to build, validate and sort a particle decay chain.
void generateList(const std::string &name="", int options=c_setNothing)
Generates the MCParticle list and stores it in the StoreArray with the given name.
A Class to store the Monte Carlo particle information.
std::vector< Belle2::MCParticle * > getDaughters() const
Get vector of all daughter particles, empty vector if none.
bool hasStatus(unsigned short int bitmask) const
Return if specific status bit is set.
unsigned int getStatus(unsigned short int bitmask=USHRT_MAX) const
Return status code of particle.
void setPDG(int pdg)
Set PDG code of the particle.
int getPDG() const
Return PDG code of particle.
void setStatus(unsigned short int status)
Set Status code for the particle.
Class to store reconstructed particles.
void setProperty(const int properties)
sets m_properties
void removeExtraInfo()
Remove all stored extra info fields.
bool hasExtraInfo(const std::string &name) const
Return whether the extra info with the given name is set.
EFlavorType getFlavorType() const
Returns flavor type of the decay (for FS particles: flavor type of particle)
int getPDGCode(void) const
Returns PDG code.
int getProperty() const
Returns particle property as a bit pattern The values are defined in the PropertyFlags enum and descr...
std::vector< Belle2::Particle * > getDaughters() const
Returns a vector of pointers to daughter particles.
double getExtraInfo(const std::string &name) const
Return given value if set.
T * getRelated(const std::string &name="", const std::string &namedRelation="") const
Get the object to or from which this object has a relation.
bool registerInDataStore(DataStore::EStoreFlags storeFlags=DataStore::c_WriteOut)
Register the object/array in the DataStore.
Accessor to arrays stored in the data store.
int getEntries() const
Get the number of objects in the array.
Type-safe access to single objects in the data store.
TEST_F(ChargedParticleIdentificatorTest, TestDBRep)
Test correct storage of weightfiles in the database representation inner structure.
void addDecay(GraphParticle &mother, GraphParticle &daughter)
Add decay information between two particles.
void clear()
Reset particles and decay information to make the class reusable.
GraphParticle & addParticle()
Add new particle to the graph.
std::string getString(const TMatrixFBase &matrix, int precision=2, bool color=true)
get HTML table representing a matrix.
Abstract base class for different kinds of events.