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(TLorentzVector(), decay.m_pdg, isUnflavored ? (Particle::c_Unflavored) : (Particle::c_Flavored),
227 [[nodiscard]]
string getString()
const {
return "Particles(MCParticles,MCMatch,Flags):\n" + getStringInternal(); }
230 vector<Decay> m_daughterDecays;
238 [[nodiscard]]
string getStringInternal(
int depth = 0)
const
242 for (
int i = 0; i < depth; i++)
253 s << m_mcparticle->
getPDG();
260 s <<
", " << mcMatch->
getPDG() <<
", ";
261 if (m_particle->
hasExtraInfo(MCMatching::c_extraInfoMCErrors))
262 s << MCMatching::explainFlags(m_particle->
getExtraInfo(MCMatching::c_extraInfoMCErrors));
271 if (!m_daughterDecays.empty()) {
273 for (
const Decay& d : m_daughterDecays) {
274 s <<
"\n" << d.getStringInternal(depth + 1);
277 s <<
"\n" << spaces <<
"]";
285 class MCMatchingTest :
public ::testing::Test {
288 void SetUp()
override
294 particles.registerInDataStore();
296 particles.registerRelationTo(mcparticles);
300 void TearDown()
override
302 DataStore::Instance().reset();
310 Decay d(111, {22, 22});
314 EXPECT_EQ(mcparticles.getEntries(), 3);
315 EXPECT_EQ(mcparticles[0]->getPDG(), Const::pi0.getPDGCode());
316 EXPECT_EQ(mcparticles[1]->getPDG(), Const::photon.getPDGCode());
317 EXPECT_EQ(mcparticles[2]->getPDG(), Const::photon.getPDGCode());
318 EXPECT_EQ(mcparticles[0]->getMother(),
nullptr);
319 EXPECT_EQ(mcparticles[1]->getMother(), mcparticles[0]);
320 EXPECT_EQ(mcparticles[2]->getMother(), mcparticles[0]);
322 Decay e(111, {22, 22});
324 EXPECT_EQ(mcparticles.getEntries(), 6);
325 EXPECT_EQ(mcparticles[3]->getPDG(), Const::pi0.getPDGCode());
326 EXPECT_EQ(mcparticles[3]->getNDaughters(), 2);
327 EXPECT_EQ(mcparticles[4]->getPDG(), Const::photon.getPDGCode());
328 EXPECT_EQ(mcparticles[5]->getPDG(), Const::photon.getPDGCode());
329 EXPECT_EQ(mcparticles[4]->getNDaughters(), 0);
330 EXPECT_EQ(mcparticles[5]->getNDaughters(), 0);
331 EXPECT_EQ(mcparticles[3]->getMother(),
nullptr);
332 EXPECT_EQ(mcparticles[4]->getMother(), mcparticles[3]);
333 EXPECT_EQ(mcparticles[5]->getMother(), mcparticles[3]);
337 EXPECT_EQ(mcparticles.getEntries(), 7);
338 EXPECT_EQ(mcparticles[6]->getPDG(), Const::pion.getPDGCode());
340 Decay g(421, {321, -211, {111, {22, 22}}});
342 EXPECT_EQ(3, g.m_mcparticle->getNDaughters());
343 EXPECT_EQ(mcparticles.getEntries(), 13);
347 TEST_F(MCMatchingTest, CorrectReconstruction)
352 Decay d(421, {321, -211, {111, {22, 22}}});
353 d.reconstruct({421, {321, -211, {111, {22, 22}}}});
356 EXPECT_EQ(mcparticles[0]->getPDG(), 421);
357 EXPECT_EQ(mcparticles[5]->getPDG(), Const::photon.getPDGCode());
358 EXPECT_EQ(particles.getEntries(), 6);
360 ASSERT_NE(d.m_particle,
nullptr);
361 const auto& fspParticles = d.m_particle->getFinalStateDaughters();
362 EXPECT_EQ(fspParticles.size(), 4u);
364 for (
const Particle* p : fspParticles) {
368 EXPECT_TRUE(mcparticles[0] == d.m_mcparticle);
369 EXPECT_TRUE(mcparticles[0]->getRelated<Particle>() ==
nullptr);
370 EXPECT_TRUE(mcparticles[3]->getRelated<Particle>() ==
nullptr);
373 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
375 EXPECT_EQ(MCMatching::c_Correct, MCMatching::getMCErrors(d.m_particle)) << d.getString();
379 TEST_F(MCMatchingTest, SetMCTruthNeverRun)
381 Decay d(421, {321, -211, {111, {22, 22}}});
382 d.reconstruct({421, {211, -211, {111, {22, 22}}}});
384 EXPECT_EQ(
nullptr, d.m_particle->getRelated<
MCParticle>());
385 ASSERT_FALSE(d.m_particle->hasExtraInfo(MCMatching::c_extraInfoMCErrors));
386 EXPECT_EQ(MCMatching::c_InternalError, MCMatching::getMCErrors(d.m_particle)) << d.getString();
389 TEST_F(MCMatchingTest, SettingTruths)
391 Decay d(421, {321, -211, {111, {22, 22}}});
392 d.reconstruct({421, {211, -211, {111, {22, 22}}}});
395 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
396 EXPECT_EQ(d.m_mcparticle->getPDG(), d.m_particle->getRelated<
MCParticle>()->
getPDG());
399 ASSERT_FALSE(d.m_particle->hasExtraInfo(MCMatching::c_extraInfoMCErrors));
400 ASSERT_FALSE(d.getParticle(111)->hasExtraInfo(MCMatching::c_extraInfoMCErrors));
402 EXPECT_EQ(MCMatching::c_MisID, MCMatching::getMCErrors(d.m_particle)) << d.getString();
405 ASSERT_TRUE(d.m_particle->hasExtraInfo(MCMatching::c_extraInfoMCErrors));
406 ASSERT_TRUE(d.getParticle(111)->hasExtraInfo(MCMatching::c_extraInfoMCErrors));
410 TEST_F(MCMatchingTest, MisID)
413 Decay d(421, {321, -211, {111, {22, 22}}});
414 d.reconstruct({421, {211, -211, {111, {22, 22}}}});
415 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
416 EXPECT_EQ(d.m_mcparticle->getPDG(), d.m_particle->getRelated<
MCParticle>()->
getPDG());
417 EXPECT_EQ(MCMatching::c_MisID, MCMatching::getMCErrors(d.m_particle)) << d.getString();
421 Decay d(421, {321, -211, {111, {22, 22}}});
422 d.reconstruct({413, {321, -13, {111, {22, 22}}}});
423 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
424 EXPECT_EQ(MCMatching::c_MisID | MCMatching::c_AddedWrongParticle, MCMatching::getMCErrors(d.m_particle)) << d.getString();
427 Decay d(421, {321, -211, {111, {22, 22}}});
428 d.reconstruct({421, {321, 13, {111, {22, 22}}}});
429 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
430 EXPECT_EQ(MCMatching::c_MisID, MCMatching::getMCErrors(d.m_particle)) << d.getString();
433 Decay d(421, {321, -211, {111, {22, 22}}});
434 d.reconstruct({421, {211, 13, {111, {22, 22}}}});
435 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
436 EXPECT_EQ(MCMatching::c_MisID, MCMatching::getMCErrors(d.m_particle)) << d.getString();
440 Decay d(421, {321, -211, {111, {22, 22}}});
441 d.reconstruct({421, { -211, 321, {111, {22, 22}}}});
442 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
443 EXPECT_EQ(MCMatching::c_MisID, MCMatching::getMCErrors(d.m_particle)) << d.getString();
448 TEST_F(MCMatchingTest, MissingParticles)
452 Decay d(421, {321, -211, {111, {22, 22}}});
453 d.reconstruct({421, {321, -211, {0}}});
454 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
455 EXPECT_EQ(MCMatching::c_MissGamma | MCMatching::c_MissingResonance, MCMatching::getMCErrors(d.m_particle)) << d.getString();
458 Decay d(421, {321, -211, {111, {22, 22}}});
459 d.reconstruct({421, {321, 0, {111, {22, 22}}}});
460 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
461 EXPECT_EQ(MCMatching::getMCErrors(d.m_particle), MCMatching::c_MissMassiveParticle) << d.getString();
464 Decay d(421, {321, -211, {111, {22, 22}}});
465 d.reconstruct({421, {0, -211, {111, {22, 22}}}});
466 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
467 EXPECT_EQ(MCMatching::getMCErrors(d.m_particle), MCMatching::c_MissMassiveParticle) << d.getString();
470 Decay d(421, {321, -211, {111, {22, 22}}});
471 d.reconstruct({421, {0, -13, {111, {22, 22}}}});
472 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
473 EXPECT_EQ(MCMatching::getMCErrors(d.m_particle), MCMatching::c_MissMassiveParticle | MCMatching::c_MisID) << d.getString();
476 TEST_F(MCMatchingTest, KLongCorrect)
479 Decay d(431, { {323, {321, {111, {22, 22}} }}, { -311, {130}}});
485 d.reconstruct({431, { {323, {321, {111, {22, 22}} }}, {130, {}, Decay::c_ReconstructFrom, d.getDecay(130)}}});
486 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
487 EXPECT_EQ(MCMatching::c_MissingResonance, MCMatching::getMCErrors(d.m_particle)) << d.getString();
489 TEST_F(MCMatchingTest, KLongMissed)
492 Decay d(431, { {323, {321, {111, {22, 22}} }}, { -311, {130}}});
498 d.reconstruct({431, { {323, {321, {111, {22, 22}} }}, 0}});
499 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
500 EXPECT_EQ(MCMatching::c_MissKlong | MCMatching::c_MissMassiveParticle | MCMatching::c_MissingResonance,
501 MCMatching::getMCErrors(d.m_particle)) << d.getString();
503 TEST_F(MCMatchingTest, KShortCorrect)
506 Decay d(431, { {323, {321, {111, {22, 22}} }}, { -311, {{310, {211, -211}}}}});
516 d.reconstruct({431, { {323, {321, {111, {22, 22}} }}, {310, {{211, {}, Decay::c_ReconstructFrom, d.getDecay(211)}, { -211, {}, Decay::c_ReconstructFrom, d.getDecay(-211)}}}}});
517 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
518 EXPECT_EQ(MCMatching::c_MissingResonance, MCMatching::getMCErrors(d.m_particle)) << d.getString();
520 TEST_F(MCMatchingTest, KShortMissed)
523 Decay d(431, { {323, {321, {111, {22, 22}} }}, { -311, {{310, {211, -211}}}}});
533 d.reconstruct({431, { {323, {321, {111, {22, 22}} }}, 0}});
534 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
535 EXPECT_EQ(MCMatching::c_MissMassiveParticle | MCMatching::c_MissingResonance,
536 MCMatching::getMCErrors(d.m_particle)) << d.getString();
539 TEST_F(MCMatchingTest, PionWithOneGamma)
544 Decay d(421, {321, -211, {111, {22, 22}}});
545 d.reconstruct({421, {321, -211, {111, {0, 22}}}});
547 EXPECT_EQ(particles.getEntries(), 5);
548 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
549 EXPECT_EQ(MCMatching::c_MissGamma, MCMatching::getMCErrors(d.m_particle)) << d.getString();
552 Decay d(421, {321, -211, {111, {22, 22}}});
553 d.reconstruct({421, {321, 0, {111, {0, 22}}}});
554 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
555 EXPECT_EQ(MCMatching::c_MissMassiveParticle | MCMatching::c_MissGamma, MCMatching::getMCErrors(d.m_particle)) << d.getString();
558 TEST_F(MCMatchingTest, TauWithResonance)
562 Decay d(15, {16, { -213, { -211, {111, {22, 22}}}}});
563 d.reconstruct({15, {0, { -213, { -211, {111, {22, 22}}}}}});
564 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
565 EXPECT_EQ(MCMatching::c_MissNeutrino, MCMatching::getMCErrors(d.m_particle)) << d.getString();
569 Decay d(15, {16, { -213, { -211, {111, {22, 22}}}}});
570 d.reconstruct({15, {{ -211, {}, Decay::c_ReconstructFrom, &d[1][0]}, {111, {22, 22}, Decay::c_ReconstructFrom, &d[1][1]}}});
571 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
572 EXPECT_EQ(MCMatching::c_MissingResonance, MCMatching::getMCErrors(d.m_particle)) << d.getString();
576 Decay d(15, {16, { -213, { -211, {111, {22, 22}}}}});
577 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]}}});
578 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
579 EXPECT_EQ(MCMatching::c_MissGamma | MCMatching::c_MissingResonance, MCMatching::getMCErrors(d.m_particle)) << d.getString();
583 Decay g(-512, {211, -211, -16, {15, {16, { -213, { -211, {111, {22, 22}}}}}}});
585 d.reconstruct({15, {{ -211, {}, Decay::c_ReconstructFrom, &g[1]}, {111, {22, 22}, Decay::c_ReconstructFrom, &d[1][1]}}});
586 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
587 EXPECT_EQ(MCMatching::c_MissMassiveParticle | MCMatching::c_MissingResonance | MCMatching::c_MissNeutrino |
588 MCMatching::c_AddedWrongParticle,
589 MCMatching::getMCErrors(d.m_particle)) << d.getString();
594 TEST_F(MCMatchingTest, MissGamma)
598 Decay d(431, {{421, {321, -211, {111, {22, 22}}}}, {111, {22, 22}}});
599 d.reconstruct({431, {{421, {321, -211, {111, {22, 22}}}}, {111, {22, 22}}}});
600 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
601 EXPECT_EQ(MCMatching::c_Correct, MCMatching::getMCErrors(d.m_particle)) << d.getString();
605 Decay d(431, {{421, {321, -211, {111, {22, 22}}}}, {111, {22, 22}}});
606 Decay& gamma = d[1][0];
607 d.reconstruct({431, {{421, {321, -211, {111, {22, 22}}}}, {22, {}, Decay::c_ReconstructFrom, &gamma}}});
608 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
609 EXPECT_EQ(MCMatching::c_MissGamma | MCMatching::c_MissingResonance, MCMatching::getMCErrors(d.m_particle)) << d.getString();
614 Decay d(431, {{421, {321, -211, {111, {22, 22}}}}, 22});
615 d.reconstruct({431, {{421, {321, -211, {111, {22, 22}}}}, 22}});
616 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
617 EXPECT_EQ(MCMatching::c_Correct, MCMatching::getMCErrors(d.m_particle)) << d.getString();
621 Decay d(111, {11, -11, 22});
622 d.reconstruct({111, {11, -11, 22}});
623 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
624 EXPECT_EQ(MCMatching::c_Correct, MCMatching::getMCErrors(d.m_particle)) << d.getString();
628 Decay d(111, {11, -11, 22});
629 d.reconstruct({111, {11, -11, 0}});
630 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
631 EXPECT_EQ(MCMatching::c_MissGamma, MCMatching::getMCErrors(d.m_particle)) << d.getString();
635 Decay d(111, {22, 22});
637 d.reconstruct({111, {22, {22, {}, Decay::c_ReconstructFrom, &gamma}}});
638 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
640 EXPECT_EQ(MCMatching::c_AddedWrongParticle, MCMatching::getMCErrors(d.m_particle)) << d.getString();
644 Decay d(111, {22, 22, 22, 22});
645 d.reconstruct({111, {22, 22, 22, 22}});
646 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
647 EXPECT_EQ(MCMatching::c_Correct, MCMatching::getMCErrors(d.m_particle)) << d.getString();
651 Decay d(111, {22, 22, 22, 22});
652 d.reconstruct({111, {22, 22, 0, 0}});
653 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
654 EXPECT_EQ(MCMatching::c_MissGamma, MCMatching::getMCErrors(d.m_particle)) << d.getString();
658 Decay d(111, {22, 22, 22, 22});
660 d.reconstruct({111, {22, 22, 22, {22, {}, Decay::c_ReconstructFrom, &gamma}}});
661 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
662 EXPECT_EQ(MCMatching::c_MissGamma, MCMatching::getMCErrors(d.m_particle)) << d.getString();
666 TEST_F(MCMatchingTest, WrongPhotonForPi0)
669 Decay d(521, {211, Decay(421, {321, -211, Decay(111, {22, 22})}), 22});
671 d.reconstruct({521, {211, {421, {321, -211, {111, {{22}, {22, {}, Decay::c_RelateWith, d.getMCParticle(211)}}}}}}});
679 Decay* pi0decay = d.getDecay(111);
680 ASSERT_TRUE(MCMatching::setMCTruth(pi0)) << pi0decay->getString();
682 EXPECT_EQ(MCMatching::c_MisID | MCMatching::c_AddedWrongParticle | MCMatching::c_MissMassiveParticle | MCMatching::c_MissGamma |
683 MCMatching::c_MissingResonance,
684 MCMatching::getMCErrors(pi0)) << pi0decay->getString();
688 Decay* d0decay = d.getDecay(421);
689 ASSERT_TRUE(MCMatching::setMCTruth(p)) << d0decay->getString();
690 EXPECT_EQ(MCMatching::c_MisID | MCMatching::c_AddedWrongParticle | MCMatching::c_MissGamma | MCMatching::c_MissingResonance,
691 MCMatching::getMCErrors(p)) << d0decay->getString();
694 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
695 EXPECT_EQ(MCMatching::c_MisID | MCMatching::c_AddedWrongParticle | MCMatching::c_MissGamma | MCMatching::c_MissingResonance,
696 MCMatching::getMCErrors(d.m_particle)) << d.getString();
701 TEST_F(MCMatchingTest, DecayInFlightCorrect)
704 Decay d(421, {321, { -211, {13}}, {111, {22, 22}}});
707 muon->setStatus(muon->getStatus() & (~MCParticle::c_PrimaryParticle));
708 ASSERT_FALSE(muon->hasStatus(MCParticle::c_PrimaryParticle));
709 d.reconstruct({421, {321, -211, {111, {22, 22}}}});
711 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
712 EXPECT_EQ(d.m_mcparticle->getPDG(), d.m_particle->getRelated<
MCParticle>()->
getPDG());
713 EXPECT_EQ(MCMatching::c_Correct, MCMatching::getMCErrors(d.m_particle)) << d.getString();
716 Decay d(421, {{321, {11, -12, {111, {22, 22}}}}, -211, {111, {22, 22}}});
717 d.reconstruct({421, {321, -211, {111, {22, 22}}}});
719 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
720 EXPECT_EQ(d.m_mcparticle->getPDG(), d.m_particle->getRelated<
MCParticle>()->
getPDG());
721 EXPECT_EQ(MCMatching::c_Correct, MCMatching::getMCErrors(d.m_particle)) << d.getString();
725 TEST_F(MCMatchingTest, DecayInFlight)
731 muon->setStatus(muon->getStatus() & (~MCParticle::c_PrimaryParticle));
732 d.reconstruct({ -211, {}, Decay::c_RelateWith, muon});
734 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
735 EXPECT_EQ(d.m_mcparticle->getPDG(), d.m_particle->getRelated<
MCParticle>()->
getPDG());
736 EXPECT_EQ(MCMatching::c_DecayInFlight, MCMatching::getMCErrors(d.m_particle)) << d.getString();
739 Decay d(421, {321, { -211, {13}}, {111, {22, 22}}});
742 muon->setStatus(muon->getStatus() & (~MCParticle::c_PrimaryParticle));
743 d.reconstruct({421, {321, { -211, {}, Decay::c_RelateWith, muon}, {111, {22, 22}}}});
746 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
747 EXPECT_EQ(d.m_mcparticle->getPDG(), d.m_particle->getRelated<
MCParticle>()->
getPDG());
748 EXPECT_EQ(MCMatching::c_DecayInFlight, MCMatching::getMCErrors(d.m_particle)) << d.getString();
752 TEST_F(MCMatchingTest, CorrectFSPsWrongDecay)
755 Decay d(-413, {{ -411, {321, -211, -211}}, {111, {22, 22}}});
758 Decay& pi2 = d[0][2];
760 ASSERT_TRUE(d.getDecay(111) == &pi0);
762 d.reconstruct({ -413, {{ -421, {321, -211, {111, {22, 22}, Decay::c_ReconstructFrom, &pi0}}}, { -211, {}, Decay::c_ReconstructFrom, &pi2}}});
765 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
766 EXPECT_EQ(d.m_mcparticle->getPDG(), d.m_particle->getRelated<
MCParticle>()->
getPDG());
768 EXPECT_EQ(MCMatching::c_AddedWrongParticle | MCMatching::c_MissingResonance,
769 MCMatching::getMCErrors(d.m_particle)) << d.getString();
773 TEST_F(MCMatchingTest, WrongCombination)
777 Decay d(-413, {{ -421, {321, -211, {111, {22, 22}}}}, -211});
779 Decay* pi1 = &(d[0][1]);
780 Decay* pi2 = &(d[1]);
781 ASSERT_TRUE(pi1->m_pdg == pi2->m_pdg);
783 d.reconstruct({ -413, {{ -421, {321, { -211, {}, Decay::c_ReconstructFrom, pi2}, {111, {22, 22}}}}, { -211, {}, Decay::c_ReconstructFrom, pi1}}});
786 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
787 EXPECT_EQ(d.m_mcparticle->getPDG(), d.m_particle->getRelated<
MCParticle>()->
getPDG());
789 EXPECT_EQ(MCMatching::c_AddedWrongParticle | MCMatching::c_MissingResonance,
790 MCMatching::getMCErrors(d.m_particle)) << d.getString();
795 Decay d(511, {{333, {321, -321}}, {333, {321, -321}}});
797 Decay* k1 = &(d[0][1]);
798 Decay* k2 = &(d[1][1]);
799 ASSERT_TRUE(k1->m_pdg == k2->m_pdg);
801 d.reconstruct({511, {
802 {333, {321, { -321, {}, Decay::c_ReconstructFrom, k2}}},
803 {333, {321, { -321, {}, Decay::c_ReconstructFrom, k1}}}
808 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
809 EXPECT_EQ(d.m_mcparticle->getPDG(), d.m_particle->getRelated<
MCParticle>()->
getPDG());
811 EXPECT_EQ(MCMatching::c_AddedWrongParticle | MCMatching::c_MissingResonance,
812 MCMatching::getMCErrors(d.m_particle)) << d.getString();
816 TEST_F(MCMatchingTest, SelfCrossFeed)
819 Decay d(300533, {{511, {321, -211, {111, {22, 22}}}}, { -511, { -321, 211, {111, {22, 22}}}}});
821 Decay* pi1 = &(d[0][2]);
822 Decay* pi2 = &(d[1][2]);
823 ASSERT_TRUE(pi1->m_pdg == pi2->m_pdg);
825 d.reconstruct({300533, {
826 {511, {321, -211, {111, {22, 22}, Decay::c_ReconstructFrom, pi2}}},
827 { -511, { -321, 211, {111, {22, 22}, Decay::c_ReconstructFrom, pi1}}}
832 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
833 EXPECT_EQ(d.m_mcparticle->getPDG(), d.m_particle->getRelated<
MCParticle>()->
getPDG());
835 EXPECT_EQ(MCMatching::c_AddedWrongParticle | MCMatching::c_MissingResonance,
836 MCMatching::getMCErrors(d.m_particle)) << d.getString();
840 TEST_F(MCMatchingTest, FlavouredD0Decay)
844 Decay d(421, { -321, 211});
845 d.reconstruct({421, { -321, 211}});
846 ASSERT_EQ(Particle::c_Flavored, d.m_particle->getFlavorType());
848 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
849 EXPECT_EQ(d.m_particle->getPDGCode(), d.m_particle->getRelated<
MCParticle>()->
getPDG());
850 EXPECT_EQ(MCMatching::c_Correct, MCMatching::getMCErrors(d.m_particle)) << d.getString();
854 Decay d(-421, { -321, 211});
855 d.reconstruct({ -421, { -321, 211}});
856 ASSERT_EQ(Particle::c_Flavored, d.m_particle->getFlavorType());
858 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
859 EXPECT_EQ(d.m_particle->getPDGCode(), d.m_particle->getRelated<
MCParticle>()->
getPDG());
860 EXPECT_EQ(MCMatching::c_Correct, MCMatching::getMCErrors(d.m_particle)) << d.getString();
864 Decay d(421, { -321, 211});
865 d.reconstruct({ -421, { -321, 211}});
866 ASSERT_EQ(Particle::c_Flavored, d.m_particle->getFlavorType());
868 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
869 EXPECT_EQ(MCMatching::c_AddedWrongParticle, MCMatching::getMCErrors(d.m_particle)) << d.getString();
873 Decay d(-421, { -321, 211});
874 d.reconstruct({421, { -321, 211}});
875 ASSERT_EQ(Particle::c_Flavored, d.m_particle->getFlavorType());
877 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
878 EXPECT_EQ(MCMatching::c_AddedWrongParticle, MCMatching::getMCErrors(d.m_particle)) << d.getString();
882 TEST_F(MCMatchingTest, UnflavouredD0Decay)
886 Decay d(421, { -321, 321});
887 d.reconstruct({421, { -321, 321}});
888 ASSERT_EQ(Particle::c_Unflavored, d.m_particle->getFlavorType());
890 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
891 EXPECT_EQ(d.m_mcparticle->getPDG(), d.m_particle->getRelated<
MCParticle>()->
getPDG());
892 EXPECT_EQ(MCMatching::c_Correct, MCMatching::getMCErrors(d.m_particle)) << d.getString();
896 Decay d(-421, { -321, 321});
897 d.reconstruct({ -421, { -321, 321}});
898 ASSERT_EQ(Particle::c_Unflavored, d.m_particle->getFlavorType());
900 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
901 EXPECT_EQ(d.m_mcparticle->getPDG(), d.m_particle->getRelated<
MCParticle>()->
getPDG());
902 EXPECT_EQ(MCMatching::c_Correct, MCMatching::getMCErrors(d.m_particle)) << d.getString();
906 Decay d(421, { -321, 321});
907 d.reconstruct({ -421, { -321, 321}});
908 ASSERT_EQ(Particle::c_Unflavored, d.m_particle->getFlavorType());
910 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
911 EXPECT_EQ(MCMatching::c_Correct, MCMatching::getMCErrors(d.m_particle)) << d.getString();
915 Decay d(-421, { -321, 321});
916 d.reconstruct({421, { -321, 321}});
917 ASSERT_EQ(Particle::c_Unflavored, d.m_particle->getFlavorType());
919 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
920 EXPECT_EQ(MCMatching::c_Correct, MCMatching::getMCErrors(d.m_particle)) << d.getString();
925 TEST_F(MCMatchingTest, MissingResonance)
929 Decay d(511, {{ -411, { -321, 321, 211}}, {213, {211, {111, {22, 22}}}}});
930 d.reconstruct({511, {{ -411, { -321, 321, 211}}, {213, {211, {111, {22, 22}}}}}});
932 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
933 EXPECT_EQ(MCMatching::c_Correct, MCMatching::getMCErrors(d.m_particle)) << d.getString();
937 Decay d(511, {{ -411, { -321, 321, 211}}, {213, {211, {111, {22, 22}}}}});
939 Decay* piplus = &(d[1][0]);
940 Decay* pi0 = &(d[1][1]);
942 d.reconstruct({511, {{ -411, { -321, 321, 211}}, {211, {}, Decay::c_ReconstructFrom, piplus}, {111, {22, 22}, Decay::c_ReconstructFrom, pi0}}});
944 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
945 EXPECT_EQ(MCMatching::c_MissingResonance, MCMatching::getMCErrors(d.m_particle)) << d.getString();
949 TEST_F(MCMatchingTest, MissingFSPReplacedBySecondary)
951 Decay d(521, {{ -421, {321, { -211, {22, -211}}}}, 211, 211, -211});
952 Decay* pi = &(d[0][1][1]);
953 d.reconstruct({521, {{ -421, {321, -211}}, 211, 211, {
955 Decay::c_ReconstructFrom, pi
959 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
960 EXPECT_EQ(MCMatching::c_MissMassiveParticle, MCMatching::getMCErrors(d.m_particle)) << d.getString();
962 TEST_F(MCMatchingTest, BeamBackground)
964 Decay d(421, {321, -211, {111, {22, 22}}});
967 d.reconstruct({421, {321, { -211, {}, Decay::c_RelateWith, noParticle}, {111, {22, 22}}}});
970 ASSERT_FALSE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
971 EXPECT_EQ(MCMatching::c_InternalError, MCMatching::getMCErrors(d.m_particle)) << d.getString();
972 EXPECT_EQ(
nullptr, d.m_particle->getRelated<
MCParticle>()) << d.getString();
975 TEST_F(MCMatchingTest, DuplicateTrack)
978 Decay d(421, {321, -211, {111, {22, 22}}});
981 ASSERT_TRUE(kaon !=
nullptr);
983 d.reconstruct({421, {321, { -211, {}, Decay::c_RelateWith, kaon}, {111, {22, 22}}}});
985 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
986 EXPECT_EQ(d.m_mcparticle->getPDG(), d.m_particle->getRelated<
MCParticle>()->
getPDG());
987 EXPECT_EQ(MCMatching::c_MissMassiveParticle | MCMatching::c_MisID, MCMatching::getMCErrors(d.m_particle)) << d.getString();
992 TEST_F(MCMatchingTest, MissingFSRMissingPHOTOS)
995 Decay d(521, { -11, 12, 22});
998 EXPECT_FALSE(MCMatching::isFSR(photon));
1000 d.reconstruct({521, { -11}});
1001 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
1002 EXPECT_EQ(d.m_mcparticle->getPDG(), d.m_particle->getRelated<
MCParticle>()->
getPDG());
1003 EXPECT_EQ(MCMatching::c_MissGamma | MCMatching::c_MissNeutrino, MCMatching::getMCErrors(d.m_particle)) << d.getString();
1008 Decay d(521, { -11, 12, 22});
1011 photon->
setStatus(MCParticle::c_PrimaryParticle | MCParticle::c_IsISRPhoton);
1012 EXPECT_FALSE(MCMatching::isFSR(photon));
1014 d.reconstruct({521, { -11}});
1015 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
1016 EXPECT_EQ(d.m_mcparticle->getPDG(), d.m_particle->getRelated<
MCParticle>()->
getPDG());
1017 EXPECT_EQ(MCMatching::c_MissGamma | MCMatching::c_MissNeutrino, MCMatching::getMCErrors(d.m_particle)) << d.getString();
1022 Decay d(521, { -11, 12, 22});
1025 photon->
setStatus(MCParticle::c_PrimaryParticle | MCParticle::c_IsFSRPhoton);
1026 EXPECT_TRUE(MCMatching::isFSR(photon));
1028 d.reconstruct({521, { -11}});
1029 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
1030 EXPECT_EQ(d.m_mcparticle->getPDG(), d.m_particle->getRelated<
MCParticle>()->
getPDG());
1031 EXPECT_EQ(MCMatching::c_MissFSR | MCMatching::c_MissNeutrino, MCMatching::getMCErrors(d.m_particle)) << d.getString();
1036 Decay d(521, { -11, 12, 22});
1039 photon->
setStatus(MCParticle::c_PrimaryParticle | MCParticle::c_IsPHOTOSPhoton);
1040 EXPECT_FALSE(MCMatching::isFSR(photon));
1042 d.reconstruct({521, { -11}});
1043 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
1044 EXPECT_EQ(d.m_mcparticle->getPDG(), d.m_particle->getRelated<
MCParticle>()->
getPDG());
1045 EXPECT_EQ(MCMatching::c_MissPHOTOS | MCMatching::c_MissNeutrino, MCMatching::getMCErrors(d.m_particle)) << d.getString();
1050 TEST_F(MCMatchingTest, UnspecifiedParticleReconstruction)
1054 Decay d(511, {{30343, {321, -211}}, -13, 13});
1055 d.reconstruct({511, {{30343, {321, -211}}, -13, 13}});
1057 Particle* Xsd = d.m_particle->getDaughters()[0];
1058 ASSERT_TRUE(Xsd !=
nullptr);
1059 EXPECT_EQ(Variable::particleIsUnspecified(Xsd),
false);
1060 Xsd->
setProperty(Particle::PropertyFlags::c_IsUnspecified);
1061 EXPECT_EQ(Variable::particleIsUnspecified(Xsd),
true);
1063 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
1064 EXPECT_EQ(MCMatching::c_Correct, MCMatching::getMCErrors(d.m_particle)) << d.getString();
1068 Decay d(511, {{313, {321, -211}}, -13, 13});
1069 d.reconstruct({511, {{30343, {321, -211}}, -13, 13}});
1071 Particle* Xsd = d.m_particle->getDaughters()[0];
1072 ASSERT_TRUE(Xsd !=
nullptr);
1073 EXPECT_EQ(Variable::particleIsUnspecified(Xsd),
false);
1074 Xsd->
setProperty(Particle::PropertyFlags::c_IsUnspecified);
1075 EXPECT_EQ(Variable::particleIsUnspecified(Xsd),
true);
1077 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
1078 EXPECT_EQ(MCMatching::c_Correct, MCMatching::getMCErrors(d.m_particle)) << d.getString();
1082 Decay d(511, { {313, {321, -211}}, {443, { -13, 13}}});
1083 Decay* mup = &(d[1][0]);
1084 Decay* mum = &(d[1][1]);
1085 d.reconstruct({511, {{30343, {321, -211}}, { -13, {}, Decay::c_ReconstructFrom, mup}, {13, {}, Decay::c_ReconstructFrom, mum}}});
1087 Particle* Xsd = d.m_particle->getDaughters()[0];
1088 ASSERT_TRUE(Xsd !=
nullptr);
1089 EXPECT_EQ(Variable::particleIsUnspecified(Xsd),
false);
1090 Xsd->
setProperty(Particle::PropertyFlags::c_IsUnspecified);
1091 EXPECT_EQ(Variable::particleIsUnspecified(Xsd),
true);
1093 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
1094 EXPECT_EQ(MCMatching::c_MissingResonance, MCMatching::getMCErrors(d.m_particle)) << d.getString();
1099 TEST_F(MCMatchingTest, CountMissingParticle)
1103 Decay d(421, {321, -211, {111, {22, 22}}});
1104 d.reconstruct({421, {321, -211, {0}}});
1105 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
1106 EXPECT_EQ(MCMatching::c_MissGamma | MCMatching::c_MissingResonance, MCMatching::getMCErrors(d.m_particle)) << d.getString();
1107 ASSERT_NE(
nullptr, d.m_particle->getRelated<
MCParticle>()) << d.getString();
1108 vector<int> daughterPDG{Const::pi0.getPDGCode()};
1109 EXPECT_EQ(MCMatching::countMissingParticle(d.m_particle, d.m_particle->getRelated<
MCParticle>(), daughterPDG), 1);
1113 Decay d(421, {321, -211, {111, {22, 22}}});
1114 d.reconstruct({421, {321, 0, {111, {22, 22}}}});
1115 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
1116 EXPECT_EQ(MCMatching::getMCErrors(d.m_particle), MCMatching::c_MissMassiveParticle) << d.getString();
1117 ASSERT_NE(
nullptr, d.m_particle->getRelated<
MCParticle>()) << d.getString();
1118 vector<int> daughterPDG{Const::pion.getPDGCode()};
1119 EXPECT_EQ(MCMatching::countMissingParticle(d.m_particle, d.m_particle->getRelated<
MCParticle>(), daughterPDG), 1);
1123 Decay d(421, {321, -211, {111, {22, 22}}});
1124 d.reconstruct({421, {0, -211, {111, {22, 22}}}});
1125 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
1126 EXPECT_EQ(MCMatching::getMCErrors(d.m_particle), MCMatching::c_MissMassiveParticle) << d.getString();
1127 ASSERT_NE(
nullptr, d.m_particle->getRelated<
MCParticle>()) << d.getString();
1128 vector<int> daughterPDG{Const::kaon.getPDGCode()};
1129 EXPECT_EQ(MCMatching::countMissingParticle(d.m_particle, d.m_particle->getRelated<
MCParticle>(), daughterPDG), 1);
1133 Decay d(-521, { -321, {421, {321, -211, {111, {22, 22}}}}});
1134 d.reconstruct({ -521, {0, {421, {0, -211, {111, {22, 22}}}}}});
1135 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
1136 EXPECT_EQ(MCMatching::getMCErrors(d.m_particle), MCMatching::c_MissMassiveParticle) << d.getString();
1137 ASSERT_NE(
nullptr, d.m_particle->getRelated<
MCParticle>()) << d.getString();
1138 vector<int> daughterPDG{Const::kaon.getPDGCode()};
1139 EXPECT_EQ(MCMatching::countMissingParticle(d.m_particle, d.m_particle->getRelated<
MCParticle>(), daughterPDG), 2);
1143 Decay d(431, { {323, {321, {111, {22, 22}} }}, { -311, {{310, {211, -211}}}}});
1153 d.reconstruct({431, { {323, {321, {111, {22, 22}} }}, 0}});
1154 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
1155 EXPECT_EQ(MCMatching::c_MissMassiveParticle | MCMatching::c_MissingResonance,
1156 MCMatching::getMCErrors(d.m_particle)) << d.getString();
1157 ASSERT_NE(
nullptr, d.m_particle->getRelated<
MCParticle>()) << d.getString();
1158 vector<int> daughterPDG{Const::Kshort.getPDGCode()};
1159 EXPECT_EQ(MCMatching::countMissingParticle(d.m_particle, d.m_particle->getRelated<
MCParticle>(), daughterPDG), 1);
1163 Decay d(431, { {323, {321, {111, {22, 22}} }}, { -311, {130}}});
1169 d.reconstruct({431, { {323, {321, {111, {22, 22}} }}, 0}});
1170 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
1171 EXPECT_EQ(MCMatching::c_MissKlong | MCMatching::c_MissMassiveParticle | MCMatching::c_MissingResonance,
1172 MCMatching::getMCErrors(d.m_particle)) << d.getString();
1173 ASSERT_NE(
nullptr, d.m_particle->getRelated<
MCParticle>()) << d.getString();
1174 vector<int> daughterPDG{Const::Klong.getPDGCode()};
1175 EXPECT_EQ(MCMatching::countMissingParticle(d.m_particle, d.m_particle->getRelated<
MCParticle>(), daughterPDG), 1);
1179 Decay d(521, { -11, 12, 22});
1180 d.reconstruct({521, {0, 0, 22}});
1181 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
1182 EXPECT_EQ(MCMatching::c_MissNeutrino | MCMatching::c_MissMassiveParticle,
1183 MCMatching::getMCErrors(d.m_particle)) << d.getString();
1184 ASSERT_NE(
nullptr, d.m_particle->getRelated<
MCParticle>()) << d.getString();
1185 vector<int> daughterPDG_E{Const::electron.getPDGCode()};
1186 EXPECT_EQ(MCMatching::countMissingParticle(d.m_particle, d.m_particle->getRelated<
MCParticle>(), daughterPDG_E), 1);
1187 vector<int> daughterPDG_NuE{12};
1188 EXPECT_EQ(MCMatching::countMissingParticle(d.m_particle, d.m_particle->getRelated<
MCParticle>(), daughterPDG_NuE), 1);
1189 vector<int> daughterPDG_Nu{12, 14, 16};
1190 EXPECT_EQ(MCMatching::countMissingParticle(d.m_particle, d.m_particle->getRelated<
MCParticle>(), daughterPDG_Nu), 1);
1194 Decay d(521, { -13, 14, 22});
1195 d.reconstruct({521, {0, 0, 22}});
1196 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
1197 EXPECT_EQ(MCMatching::c_MissNeutrino | MCMatching::c_MissMassiveParticle,
1198 MCMatching::getMCErrors(d.m_particle)) << d.getString();
1199 ASSERT_NE(
nullptr, d.m_particle->getRelated<
MCParticle>()) << d.getString();
1200 vector<int> daughterPDG_Mu{Const::muon.getPDGCode()};
1201 EXPECT_EQ(MCMatching::countMissingParticle(d.m_particle, d.m_particle->getRelated<
MCParticle>(), daughterPDG_Mu), 1);
1202 vector<int> daughterPDG_NuMu{14};
1203 EXPECT_EQ(MCMatching::countMissingParticle(d.m_particle, d.m_particle->getRelated<
MCParticle>(), daughterPDG_NuMu), 1);
1204 vector<int> daughterPDG_Nu{12, 14, 16};
1205 EXPECT_EQ(MCMatching::countMissingParticle(d.m_particle, d.m_particle->getRelated<
MCParticle>(), daughterPDG_Nu), 1);
1211 TEST_F(MCMatchingTest, IsSignalBehavior)
1215 Decay d(511, { {313, {321, -211}}, {443, { -11, 11, 22}}});
1216 Decay* ep = &(d[1][0]);
1217 Decay* em = &(d[1][1]);
1220 d.reconstruct({511, {{313, {321, -211}}, { -11, {}, Decay::c_ReconstructFrom, ep}, {11, {}, Decay::c_ReconstructFrom, em}}});
1223 photon->
setStatus(MCParticle::c_PrimaryParticle | MCParticle::c_IsPHOTOSPhoton);
1228 B->setProperty(Particle::PropertyFlags::c_Ordinary);
1229 ASSERT_TRUE(MCMatching::setMCTruth(B)) << d.getString();
1230 EXPECT_EQ(MCMatching::c_MissingResonance | MCMatching::c_MissPHOTOS, MCMatching::getMCErrors(B)) << d.getString();
1231 EXPECT_EQ(Variable::isSignal(B), 0.0) << d.getString();
1233 B->removeExtraInfo();
1236 B->setProperty(Particle::PropertyFlags::c_IsIgnoreIntermediate);
1237 ASSERT_TRUE(MCMatching::setMCTruth(B)) << d.getString();
1238 EXPECT_EQ(MCMatching::c_MissPHOTOS, MCMatching::getMCErrors(B)) << d.getString();
1239 EXPECT_EQ(Variable::isSignal(B), 0.0) << d.getString();
1241 B->removeExtraInfo();
1244 B->setProperty(Particle::PropertyFlags::c_IsIgnoreRadiatedPhotons);
1245 ASSERT_TRUE(MCMatching::setMCTruth(B)) << d.getString();
1246 EXPECT_EQ(MCMatching::c_MissingResonance, MCMatching::getMCErrors(B)) << d.getString();
1247 EXPECT_EQ(Variable::isSignal(B), 0.0) << d.getString();
1249 B->removeExtraInfo();
1252 B->setProperty(Particle::PropertyFlags::c_IsIgnoreRadiatedPhotons | Particle::PropertyFlags::c_IsIgnoreIntermediate);
1253 ASSERT_TRUE(MCMatching::setMCTruth(B)) << d.getString();
1254 EXPECT_EQ(MCMatching::c_Correct, MCMatching::getMCErrors(B)) << d.getString();
1255 EXPECT_EQ(Variable::isSignal(B), 1.0) << d.getString();
1260 TEST_F(MCMatchingTest, MissingFlagsOfDaughters)
1264 Decay d(300553, { {511, { -13, 13, 321, -211, {111, {22, 22}}}}, {511, {{ -411, {321, -211, -211}}, 211}} });
1267 d.reconstruct({300553, { {511, { -13, 13, 0, 0, {0, {0, 0}}}}, {511, {{ -411, {321, -211, -211}}, 211}} } });
1270 Particle* B1 = d.m_particle->getDaughters()[0];
1271 Particle* B2 = d.m_particle->getDaughters()[1];
1274 ASSERT_TRUE(MCMatching::setMCTruth(B1)) << d.getString();
1275 EXPECT_EQ(MCMatching::c_MissingResonance | MCMatching::c_MissGamma | MCMatching::c_MissMassiveParticle,
1276 MCMatching::getMCErrors(B1)) << d.getString();
1277 EXPECT_EQ(Variable::isSignal(B1), 0.0) << d.getString();
1279 ASSERT_TRUE(MCMatching::setMCTruth(B2)) << d.getString();
1280 EXPECT_EQ(MCMatching::c_Correct, MCMatching::getMCErrors(B2)) << d.getString();
1281 EXPECT_EQ(Variable::isSignal(B2), 1.0) << d.getString();
1283 ASSERT_TRUE(MCMatching::setMCTruth(Y4S)) << d.getString();
1284 EXPECT_EQ(Y4S->
getProperty(), Particle::PropertyFlags::c_Ordinary) << d.getString();
1285 EXPECT_EQ(MCMatching::c_MissingResonance | MCMatching::c_MissGamma | MCMatching::c_MissMassiveParticle,
1286 MCMatching::getMCErrors(Y4S)) << d.getString();
1287 EXPECT_EQ(Variable::isSignal(Y4S), 0.0) << d.getString();
1292 Decay d(300553, { {511, { -13, 13, 321, -211, {111, {22, 22}}}}, {511, {{ -411, {321, -211, -211}}, 211}} });
1295 d.reconstruct({300553, { {511, { -13, 13, 0, 0, {0, {0, 0}}}}, {511, {{ -411, {321, -211, -211}}, 211}} } });
1298 Particle* B1 = d.m_particle->getDaughters()[0];
1299 Particle* B2 = d.m_particle->getDaughters()[1];
1301 int isIgnoreMissing = Particle::PropertyFlags::c_IsIgnoreRadiatedPhotons |
1302 Particle::PropertyFlags::c_IsIgnoreIntermediate |
1303 Particle::PropertyFlags::c_IsIgnoreMassive |
1304 Particle::PropertyFlags::c_IsIgnoreNeutrino |
1305 Particle::PropertyFlags::c_IsIgnoreGamma;
1309 ASSERT_TRUE(MCMatching::setMCTruth(B1)) << d.getString();
1310 EXPECT_EQ(MCMatching::c_Correct, MCMatching::getMCErrors(B1)) << d.getString();
1311 EXPECT_EQ(Variable::isSignal(B1), 1.0) << d.getString();
1314 ASSERT_TRUE(MCMatching::setMCTruth(B2)) << d.getString();
1315 EXPECT_EQ(MCMatching::c_Correct, MCMatching::getMCErrors(B2)) << d.getString();
1316 EXPECT_EQ(Variable::isSignal(B2), 1.0) << d.getString();
1318 ASSERT_TRUE(MCMatching::setMCTruth(Y4S)) << d.getString();
1319 EXPECT_EQ(Y4S->
getProperty(), Particle::PropertyFlags::c_Ordinary) << d.getString();
1320 EXPECT_EQ(MCMatching::c_Correct, MCMatching::getMCErrors(Y4S)) << d.getString();
1321 EXPECT_EQ(Variable::isSignal(Y4S), 1.0) << d.getString();
1327 Decay d(511, {{ -411, { -211, 211, -211, {111, {22, 22}}}}, 211, {113, {211, -211}}});
1330 d.reconstruct({511, {{ -411, { -211, 0, 0, {111, {22, 22}}}}, 211, {0, {0, 0}}}});
1333 Particle* D = d.m_particle->getDaughters()[0];
1338 ASSERT_TRUE(MCMatching::setMCTruth(D)) << d.getString();
1339 EXPECT_EQ(MCMatching::c_MissMassiveParticle,
1340 MCMatching::getMCErrors(D)) << d.getString();
1341 EXPECT_EQ(Variable::isSignal(D), 0.0) << d.getString();
1344 ASSERT_TRUE(MCMatching::setMCTruth(B)) << d.getString();
1345 EXPECT_EQ(MCMatching::c_MissingResonance | MCMatching::c_MissMassiveParticle,
1346 MCMatching::getMCErrors(B)) << d.getString();
1347 EXPECT_EQ(Variable::isSignal(B), 0.0) << d.getString();
1351 Decay d(511, {{ -411, { -211, 211, -211, {111, {22, 22}}}}, 211, {113, {211, -211}}});
1354 d.reconstruct({511, {{ -411, { -211, 0, 0, {111, {22, 22}}}}, 211, {0, {0, 0}}}});
1357 Particle* D = d.m_particle->getDaughters()[0];
1359 int isIgnoreMissing = Particle::PropertyFlags::c_IsIgnoreIntermediate |
1360 Particle::PropertyFlags::c_IsIgnoreMassive;
1362 B->setProperty(isIgnoreMissing);
1365 ASSERT_TRUE(MCMatching::setMCTruth(D)) << d.getString();
1366 EXPECT_EQ(MCMatching::c_MissMassiveParticle,
1367 MCMatching::getMCErrors(D)) << d.getString();
1368 EXPECT_EQ(Variable::isSignal(D), 0.0) << d.getString();
1373 ASSERT_TRUE(MCMatching::setMCTruth(B)) << d.getString();
1374 EXPECT_EQ(MCMatching::c_MissMassiveParticle,
1375 MCMatching::getMCErrors(B)) << d.getString();
1376 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.
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
float getExtraInfo(const std::string &name) const
Return given value if set.
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...
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.
int getEntries() const
Get the number of objects in the array.
Type-safe access to single objects in the data store.
TEST_F(GlobalLabelTest, LargeNumberOfTimeDependentParameters)
Test large number of time-dep params for registration and retrieval.
bool isFSP(int pdg)
defines what is a final state particle for this purpose.
TEST(TestgetDetectorRegion, TestgetDetectorRegion)
Test Constructors.
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.