1 #include <analysis/utility/MCMatching.h>
2 #include <analysis/dataobjects/Particle.h>
3 #include <analysis/dataobjects/ParticleExtraInfoMap.h>
4 #include <analysis/variables/BasicParticleInformation.h>
5 #include <analysis/variables/MCTruthVariables.h>
7 #include <mdst/dataobjects/MCParticle.h>
8 #include <mdst/dataobjects/MCParticleGraph.h>
9 #include <framework/datastore/StoreArray.h>
10 #include <framework/datastore/StoreObjPtr.h>
12 #include <gtest/gtest.h>
18 #if defined(__INTEL_COMPILER) && ((__INTEL_COMPILER < 1400) || (__INTEL_COMPILER_BUILD_DATE < 20140422))
20 TEST(MCMatchingTest, TestsDisabled)
23 "MC matching test disabled on intel compiler (version < 14 sp1 update2), please see https://software.intel.com/en-us/forums/topic/475378";
54 c_CreateNewMCParticle,
60 Decay(
int pdg,
const std::vector<Decay>& daughters = std::vector<Decay>()):
61 m_pdg(pdg), m_daughterDecays(daughters), m_mcparticle(nullptr), m_particle(nullptr)
64 m_graphParticle->
setPDG(m_pdg);
65 m_graphParticle->setStatus(MCParticle::c_PrimaryParticle);
66 for (
const Decay& d : daughters) {
67 gParticleGraph.
addDecay(*m_graphParticle, *d.m_graphParticle);
74 gParticleGraph.
clear();
77 m_mcparticle = mcparticles[m_graphParticle->getIndex() - 1];
79 for (Decay& d : m_daughterDecays)
84 [[nodiscard]]
Particle* getParticle(
int pdg)
const
86 if (m_pdg == pdg and m_particle)
89 for (
auto& d : m_daughterDecays) {
97 [[nodiscard]]
MCParticle* getMCParticle(
int pdg)
const
99 if (m_pdg == pdg and m_mcparticle)
102 for (
auto& d : m_daughterDecays) {
110 Decay* getDecay(
int pdg)
115 for (
auto& d : m_daughterDecays) {
116 Decay* res = d.getDecay(pdg);
123 Decay& operator[](
int i) {
return m_daughterDecays[i]; }
126 struct ReconstructedDecay {
128 ReconstructedDecay(
int pdg,
const std::vector<ReconstructedDecay>& daughters = std::vector<ReconstructedDecay>(),
129 EBehavior behavior = c_Default):
130 m_pdg(pdg), m_daughterDecays(daughters), m_behavior(behavior), m_optMcPart(nullptr), m_optDecay(nullptr) { }
131 ReconstructedDecay(
int pdg,
const std::vector<ReconstructedDecay>& daughters, EBehavior behavior,
MCParticle* optMcPart):
132 m_pdg(pdg), m_daughterDecays(daughters), m_behavior(behavior), m_optMcPart(optMcPart), m_optDecay(nullptr) { }
133 ReconstructedDecay(
int pdg,
const std::vector<ReconstructedDecay>& daughters, EBehavior behavior, Decay* optDecay):
134 m_pdg(pdg), m_daughterDecays(daughters), m_behavior(behavior), m_optMcPart(nullptr), m_optDecay(optDecay) { }
136 vector<ReconstructedDecay> m_daughterDecays;
137 EBehavior m_behavior;
148 void reconstruct(ReconstructedDecay decay)
153 if (decay.m_behavior == c_CreateNewMCParticle) {
155 m_graphParticle->
setPDG(decay.m_pdg);
157 }
else if (decay.m_behavior == c_RelateWith) {
158 m_mcparticle = decay.m_optMcPart;
159 }
else if (decay.m_behavior == c_ReconstructFrom) {
160 ASSERT_TRUE(decay.m_optDecay !=
nullptr);
161 Decay* mcDecay = decay.m_optDecay;
162 decay.m_optDecay =
nullptr;
163 decay.m_behavior = Decay::c_Default;
164 mcDecay->reconstruct(decay);
169 if (
isFSP(decay.m_pdg)) {
171 m_particle = particles.appendNew(m_graphParticle->get4Vector(), decay.m_pdg);
172 m_particle->addRelationTo(m_mcparticle);
175 if (!decay.m_daughterDecays.empty()) {
176 Decay* mcDecay =
this;
177 if (decay.m_behavior == c_ReconstructFrom) {
179 mcDecay = decay.m_optDecay;
181 std::vector<int> daughterIndices;
182 for (
unsigned int i = 0; i < decay.m_daughterDecays.size(); i++) {
184 ReconstructedDecay rd = decay.m_daughterDecays[i];
186 if (rd.m_behavior == c_ReconstructFrom) {
187 ASSERT_NE(rd.m_optDecay,
nullptr);
189 rd.m_optDecay =
nullptr;
190 rd.m_behavior = Decay::c_Default;
192 ASSERT_TRUE(decay.m_daughterDecays.size() > i);
193 d = &(mcDecay->m_daughterDecays[i]);
195 d->reconstruct({rd});
197 daughterIndices.push_back(d->m_particle->getArrayIndex());
200 if (decay.m_pdg != 0) {
202 std::vector<int> decaylist, decaybarlist;
203 for (
int idx : daughterIndices) {
204 const Particle* daughterPart = particles[idx];
206 decaylist.push_back(daughterPDG);
207 decaybarlist.push_back((daughterPart->
getFlavorType() == Particle::c_Flavored) ? (-daughterPDG) : daughterPDG);
209 std::sort(decaylist.begin(), decaylist.end());
210 std::sort(decaybarlist.begin(), decaybarlist.end());
211 bool isUnflavored = (decaylist == decaybarlist);
213 m_particle = particles.appendNew(TLorentzVector(), decay.m_pdg, isUnflavored ? (Particle::c_Unflavored) : (Particle::c_Flavored),
219 [[nodiscard]]
string getString()
const {
return "Particles(MCParticles,MCMatch,Flags):\n" + getStringInternal(); }
222 vector<Decay> m_daughterDecays;
230 [[nodiscard]]
string getStringInternal(
int depth = 0)
const
234 for (
int i = 0; i < depth; i++)
245 s << m_mcparticle->
getPDG();
252 s <<
", " << mcMatch->
getPDG() <<
", ";
253 if (m_particle->
hasExtraInfo(MCMatching::c_extraInfoMCErrors))
254 s << MCMatching::explainFlags(m_particle->
getExtraInfo(MCMatching::c_extraInfoMCErrors));
263 if (!m_daughterDecays.empty()) {
265 for (
const Decay& d : m_daughterDecays) {
266 s <<
"\n" << d.getStringInternal(depth + 1);
269 s <<
"\n" << spaces <<
"]";
277 class MCMatchingTest :
public ::testing::Test {
280 void SetUp()
override
285 particleExtraInfo.registerInDataStore();
286 particles.registerInDataStore();
287 mcparticles.registerInDataStore();
288 particles.registerRelationTo(mcparticles);
292 void TearDown()
override
294 DataStore::Instance().reset();
302 Decay d(111, {22, 22});
306 EXPECT_EQ(mcparticles.getEntries(), 3);
307 EXPECT_EQ(mcparticles[0]->getPDG(), 111);
308 EXPECT_EQ(mcparticles[1]->getPDG(), 22);
309 EXPECT_EQ(mcparticles[2]->getPDG(), 22);
310 EXPECT_EQ(mcparticles[0]->getMother(),
nullptr);
311 EXPECT_EQ(mcparticles[1]->getMother(), mcparticles[0]);
312 EXPECT_EQ(mcparticles[2]->getMother(), mcparticles[0]);
314 Decay
e(111, {22, 22});
316 EXPECT_EQ(mcparticles.getEntries(), 6);
317 EXPECT_EQ(mcparticles[3]->getPDG(), 111);
318 EXPECT_EQ(mcparticles[3]->getNDaughters(), 2);
319 EXPECT_EQ(mcparticles[4]->getPDG(), 22);
320 EXPECT_EQ(mcparticles[5]->getPDG(), 22);
321 EXPECT_EQ(mcparticles[4]->getNDaughters(), 0);
322 EXPECT_EQ(mcparticles[5]->getNDaughters(), 0);
323 EXPECT_EQ(mcparticles[3]->getMother(),
nullptr);
324 EXPECT_EQ(mcparticles[4]->getMother(), mcparticles[3]);
325 EXPECT_EQ(mcparticles[5]->getMother(), mcparticles[3]);
329 EXPECT_EQ(mcparticles.getEntries(), 7);
330 EXPECT_EQ(mcparticles[6]->getPDG(), 211);
332 Decay g(421, {321, -211, {111, {22, 22}}});
334 EXPECT_EQ(3, g.m_mcparticle->getNDaughters());
335 EXPECT_EQ(mcparticles.getEntries(), 13);
339 TEST_F(MCMatchingTest, CorrectReconstruction)
344 Decay d(421, {321, -211, {111, {22, 22}}});
345 d.reconstruct({421, {321, -211, {111, {22, 22}}}});
348 EXPECT_EQ(mcparticles[0]->getPDG(), 421);
349 EXPECT_EQ(mcparticles[5]->getPDG(), 22);
350 EXPECT_EQ(particles.getEntries(), 6);
352 ASSERT_NE(d.m_particle,
nullptr);
353 const auto& fspParticles = d.m_particle->getFinalStateDaughters();
354 EXPECT_EQ(fspParticles.size(), 4u);
356 for (
const Particle* p : fspParticles) {
360 EXPECT_TRUE(mcparticles[0] == d.m_mcparticle);
361 EXPECT_TRUE(mcparticles[0]->getRelated<Particle>() ==
nullptr);
362 EXPECT_TRUE(mcparticles[3]->getRelated<Particle>() ==
nullptr);
365 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
367 EXPECT_EQ(MCMatching::c_Correct, MCMatching::getMCErrors(d.m_particle)) << d.getString();
371 TEST_F(MCMatchingTest, SetMCTruthNeverRun)
373 Decay d(421, {321, -211, {111, {22, 22}}});
374 d.reconstruct({421, {211, -211, {111, {22, 22}}}});
376 EXPECT_EQ(
nullptr, d.m_particle->getRelated<
MCParticle>());
377 ASSERT_FALSE(d.m_particle->hasExtraInfo(MCMatching::c_extraInfoMCErrors));
378 EXPECT_EQ(MCMatching::c_InternalError, MCMatching::getMCErrors(d.m_particle)) << d.getString();
381 TEST_F(MCMatchingTest, SettingTruths)
383 Decay d(421, {321, -211, {111, {22, 22}}});
384 d.reconstruct({421, {211, -211, {111, {22, 22}}}});
387 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
388 EXPECT_EQ(d.m_mcparticle->getPDG(), d.m_particle->getRelated<
MCParticle>()->
getPDG());
391 ASSERT_FALSE(d.m_particle->hasExtraInfo(MCMatching::c_extraInfoMCErrors));
392 ASSERT_FALSE(d.getParticle(111)->hasExtraInfo(MCMatching::c_extraInfoMCErrors));
394 EXPECT_EQ(MCMatching::c_MisID, MCMatching::getMCErrors(d.m_particle)) << d.getString();
397 ASSERT_TRUE(d.m_particle->hasExtraInfo(MCMatching::c_extraInfoMCErrors));
398 ASSERT_TRUE(d.getParticle(111)->hasExtraInfo(MCMatching::c_extraInfoMCErrors));
402 TEST_F(MCMatchingTest, MisID)
405 Decay d(421, {321, -211, {111, {22, 22}}});
406 d.reconstruct({421, {211, -211, {111, {22, 22}}}});
407 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
408 EXPECT_EQ(d.m_mcparticle->getPDG(), d.m_particle->getRelated<
MCParticle>()->
getPDG());
409 EXPECT_EQ(MCMatching::c_MisID, MCMatching::getMCErrors(d.m_particle)) << d.getString();
413 Decay d(421, {321, -211, {111, {22, 22}}});
414 d.reconstruct({413, {321, -13, {111, {22, 22}}}});
415 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
416 EXPECT_EQ(MCMatching::c_MisID | MCMatching::c_AddedWrongParticle, MCMatching::getMCErrors(d.m_particle)) << d.getString();
419 Decay d(421, {321, -211, {111, {22, 22}}});
420 d.reconstruct({421, {321, 13, {111, {22, 22}}}});
421 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
422 EXPECT_EQ(MCMatching::c_MisID, MCMatching::getMCErrors(d.m_particle)) << d.getString();
425 Decay d(421, {321, -211, {111, {22, 22}}});
426 d.reconstruct({421, {211, 13, {111, {22, 22}}}});
427 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
428 EXPECT_EQ(MCMatching::c_MisID, MCMatching::getMCErrors(d.m_particle)) << d.getString();
432 Decay d(421, {321, -211, {111, {22, 22}}});
433 d.reconstruct({421, { -211, 321, {111, {22, 22}}}});
434 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
435 EXPECT_EQ(MCMatching::c_MisID, MCMatching::getMCErrors(d.m_particle)) << d.getString();
440 TEST_F(MCMatchingTest, MissingParticles)
444 Decay d(421, {321, -211, {111, {22, 22}}});
445 d.reconstruct({421, {321, -211, {0}}});
446 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
447 EXPECT_EQ(MCMatching::c_MissGamma | MCMatching::c_MissingResonance, MCMatching::getMCErrors(d.m_particle)) << d.getString();
450 Decay d(421, {321, -211, {111, {22, 22}}});
451 d.reconstruct({421, {321, 0, {111, {22, 22}}}});
452 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
453 EXPECT_EQ(MCMatching::getMCErrors(d.m_particle), MCMatching::c_MissMassiveParticle) << d.getString();
456 Decay d(421, {321, -211, {111, {22, 22}}});
457 d.reconstruct({421, {0, -211, {111, {22, 22}}}});
458 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
459 EXPECT_EQ(MCMatching::getMCErrors(d.m_particle), MCMatching::c_MissMassiveParticle) << d.getString();
462 Decay d(421, {321, -211, {111, {22, 22}}});
463 d.reconstruct({421, {0, -13, {111, {22, 22}}}});
464 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
465 EXPECT_EQ(MCMatching::getMCErrors(d.m_particle), MCMatching::c_MissMassiveParticle | MCMatching::c_MisID) << d.getString();
468 TEST_F(MCMatchingTest, KLongCorrect)
471 Decay d(431, { {323, {321, {111, {22, 22}} }}, { -311, {130}}});
477 d.reconstruct({431, { {323, {321, {111, {22, 22}} }}, {130, {}, Decay::c_ReconstructFrom, d.getDecay(130)}}});
478 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
479 EXPECT_EQ(MCMatching::c_MissingResonance, MCMatching::getMCErrors(d.m_particle)) << d.getString();
481 TEST_F(MCMatchingTest, KLongMissed)
484 Decay d(431, { {323, {321, {111, {22, 22}} }}, { -311, {130}}});
490 d.reconstruct({431, { {323, {321, {111, {22, 22}} }}, 0}});
491 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
492 EXPECT_EQ(MCMatching::c_MissKlong | MCMatching::c_MissMassiveParticle | MCMatching::c_MissingResonance,
493 MCMatching::getMCErrors(d.m_particle)) << d.getString();
495 TEST_F(MCMatchingTest, KShortCorrect)
498 Decay d(431, { {323, {321, {111, {22, 22}} }}, { -311, {{310, {211, -211}}}}});
508 d.reconstruct({431, { {323, {321, {111, {22, 22}} }}, {310, {{211, {}, Decay::c_ReconstructFrom, d.getDecay(211)}, { -211, {}, Decay::c_ReconstructFrom, d.getDecay(-211)}}}}});
509 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
510 EXPECT_EQ(MCMatching::c_MissingResonance, MCMatching::getMCErrors(d.m_particle)) << d.getString();
512 TEST_F(MCMatchingTest, KShortMissed)
515 Decay d(431, { {323, {321, {111, {22, 22}} }}, { -311, {{310, {211, -211}}}}});
525 d.reconstruct({431, { {323, {321, {111, {22, 22}} }}, 0}});
526 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
527 EXPECT_EQ(MCMatching::c_MissMassiveParticle | MCMatching::c_MissingResonance,
528 MCMatching::getMCErrors(d.m_particle)) << d.getString();
531 TEST_F(MCMatchingTest, PionWithOneGamma)
536 Decay d(421, {321, -211, {111, {22, 22}}});
537 d.reconstruct({421, {321, -211, {111, {0, 22}}}});
539 EXPECT_EQ(particles.getEntries(), 5);
540 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
541 EXPECT_EQ(MCMatching::c_MissGamma, MCMatching::getMCErrors(d.m_particle)) << d.getString();
544 Decay d(421, {321, -211, {111, {22, 22}}});
545 d.reconstruct({421, {321, 0, {111, {0, 22}}}});
546 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
547 EXPECT_EQ(MCMatching::c_MissMassiveParticle | MCMatching::c_MissGamma, MCMatching::getMCErrors(d.m_particle)) << d.getString();
550 TEST_F(MCMatchingTest, TauWithResonance)
556 Decay d(15, {16, { -213, { -211, {111, {22, 22}}}}});
557 d.reconstruct({15, {0, { -213, { -211, {111, {22, 22}}}}}});
558 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
559 EXPECT_EQ(MCMatching::c_MissNeutrino, MCMatching::getMCErrors(d.m_particle)) << d.getString();
565 Decay d(15, {16, { -213, { -211, {111, {22, 22}}}}});
566 d.reconstruct({15, {{ -211, {}, Decay::c_ReconstructFrom, &d[1][0]}, {111, {22, 22}, Decay::c_ReconstructFrom, &d[1][1]}}});
567 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
568 EXPECT_EQ(MCMatching::c_MissingResonance, MCMatching::getMCErrors(d.m_particle)) << d.getString();
574 Decay d(15, {16, { -213, { -211, {111, {22, 22}}}}});
575 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]}}});
576 ASSERT_TRUE(MCMatching::setMCTruth(d.m_particle)) << d.getString();
577 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{111};
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{211};
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{321};
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{321};
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{310};
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{130};
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{11};
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{13};
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();