8 #include <analysis/ParticleCombiner/ParticleCombiner.h>
10 #include <mdst/dataobjects/ECLCluster.h>
12 #include <analysis/dataobjects/Particle.h>
13 #include <analysis/dataobjects/ParticleList.h>
15 #include <analysis/DecayDescriptor/DecayDescriptor.h>
16 #include <analysis/utility/EvtPDLUtil.h>
18 #include <framework/datastore/StoreArray.h>
19 #include <framework/datastore/StoreObjPtr.h>
20 #include <framework/gearbox/Const.h>
25 #include <gtest/gtest.h>
33 class ParticleCombinerTest :
public ::testing::Test {
40 particles.registerInDataStore();
47 void TearDown()
override
53 TEST_F(ParticleCombinerTest, ListIndexGeneratorTest)
57 listIndexGenerator.
init(0);
58 EXPECT_FALSE(listIndexGenerator.
loadNext());
63 listIndexGenerator.
init(1);
64 EXPECT_TRUE(listIndexGenerator.
loadNext());
65 EXPECT_EQ(std::vector<ParticleList::EParticleType>({ ParticleList::c_FlavorSpecificParticle}),
67 EXPECT_FALSE(listIndexGenerator.
loadNext());
72 listIndexGenerator.
init(2);
73 EXPECT_TRUE(listIndexGenerator.
loadNext());
74 EXPECT_EQ(std::vector<ParticleList::EParticleType>({ ParticleList::c_FlavorSpecificParticle, ParticleList::c_FlavorSpecificParticle }),
76 EXPECT_TRUE(listIndexGenerator.
loadNext());
77 EXPECT_EQ(std::vector<ParticleList::EParticleType>({ ParticleList::c_SelfConjugatedParticle, ParticleList::c_FlavorSpecificParticle }),
79 EXPECT_TRUE(listIndexGenerator.
loadNext());
80 EXPECT_EQ(std::vector<ParticleList::EParticleType>({ ParticleList::c_FlavorSpecificParticle, ParticleList::c_SelfConjugatedParticle }),
82 EXPECT_FALSE(listIndexGenerator.
loadNext());
87 listIndexGenerator.
init(3);
88 EXPECT_TRUE(listIndexGenerator.
loadNext());
89 EXPECT_EQ(std::vector<ParticleList::EParticleType>({ ParticleList::c_FlavorSpecificParticle, ParticleList::c_FlavorSpecificParticle, ParticleList::c_FlavorSpecificParticle }),
91 EXPECT_TRUE(listIndexGenerator.
loadNext());
92 EXPECT_EQ(std::vector<ParticleList::EParticleType>({ ParticleList::c_SelfConjugatedParticle, ParticleList::c_FlavorSpecificParticle, ParticleList::c_FlavorSpecificParticle }),
94 EXPECT_TRUE(listIndexGenerator.
loadNext());
95 EXPECT_EQ(std::vector<ParticleList::EParticleType>({ ParticleList::c_FlavorSpecificParticle, ParticleList::c_SelfConjugatedParticle, ParticleList::c_FlavorSpecificParticle }),
97 EXPECT_TRUE(listIndexGenerator.
loadNext());
98 EXPECT_EQ(std::vector<ParticleList::EParticleType>({ ParticleList::c_SelfConjugatedParticle, ParticleList::c_SelfConjugatedParticle, ParticleList::c_FlavorSpecificParticle }),
100 EXPECT_TRUE(listIndexGenerator.
loadNext());
101 EXPECT_EQ(std::vector<ParticleList::EParticleType>({ ParticleList::c_FlavorSpecificParticle, ParticleList::c_FlavorSpecificParticle, ParticleList::c_SelfConjugatedParticle }),
103 EXPECT_TRUE(listIndexGenerator.
loadNext());
104 EXPECT_EQ(std::vector<ParticleList::EParticleType>({ ParticleList::c_SelfConjugatedParticle, ParticleList::c_FlavorSpecificParticle, ParticleList::c_SelfConjugatedParticle }),
106 EXPECT_TRUE(listIndexGenerator.
loadNext());
107 EXPECT_EQ(std::vector<ParticleList::EParticleType>({ ParticleList::c_FlavorSpecificParticle, ParticleList::c_SelfConjugatedParticle, ParticleList::c_SelfConjugatedParticle}),
109 EXPECT_FALSE(listIndexGenerator.
loadNext());
114 TEST_F(ParticleCombinerTest, particleIndexGeneratorTest)
118 particleIndexGenerator.
init(std::vector<unsigned int>({}));
119 EXPECT_FALSE(particleIndexGenerator.
loadNext());
124 particleIndexGenerator.
init(std::vector<unsigned int>({0}));
125 EXPECT_FALSE(particleIndexGenerator.
loadNext());
126 particleIndexGenerator.
init(std::vector<unsigned int>({3}));
127 EXPECT_TRUE(particleIndexGenerator.
loadNext());
128 EXPECT_EQ(std::vector<unsigned int>({0}), particleIndexGenerator.
getCurrentIndices());
129 EXPECT_TRUE(particleIndexGenerator.
loadNext());
130 EXPECT_EQ(std::vector<unsigned int>({1}), particleIndexGenerator.
getCurrentIndices());
131 EXPECT_TRUE(particleIndexGenerator.
loadNext());
132 EXPECT_EQ(std::vector<unsigned int>({2}), particleIndexGenerator.
getCurrentIndices());
133 EXPECT_FALSE(particleIndexGenerator.
loadNext());
138 particleIndexGenerator.
init(std::vector<unsigned int>({2, 0}));
139 EXPECT_FALSE(particleIndexGenerator.
loadNext());
141 particleIndexGenerator.
init(std::vector<unsigned int>({1, 3}));
142 EXPECT_TRUE(particleIndexGenerator.
loadNext());
143 EXPECT_EQ(std::vector<unsigned int>({0, 0}), particleIndexGenerator.
getCurrentIndices());
144 EXPECT_TRUE(particleIndexGenerator.
loadNext());
145 EXPECT_EQ(std::vector<unsigned int>({0, 1}), particleIndexGenerator.
getCurrentIndices());
146 EXPECT_TRUE(particleIndexGenerator.
loadNext());
147 EXPECT_EQ(std::vector<unsigned int>({0, 2}), particleIndexGenerator.
getCurrentIndices());
148 EXPECT_FALSE(particleIndexGenerator.
loadNext());
150 particleIndexGenerator.
init(std::vector<unsigned int>({2, 3}));
151 EXPECT_TRUE(particleIndexGenerator.
loadNext());
152 EXPECT_EQ(std::vector<unsigned int>({0, 0}), particleIndexGenerator.
getCurrentIndices());
153 EXPECT_TRUE(particleIndexGenerator.
loadNext());
154 EXPECT_EQ(std::vector<unsigned int>({1, 0}), particleIndexGenerator.
getCurrentIndices());
155 EXPECT_TRUE(particleIndexGenerator.
loadNext());
156 EXPECT_EQ(std::vector<unsigned int>({0, 1}), particleIndexGenerator.
getCurrentIndices());
157 EXPECT_TRUE(particleIndexGenerator.
loadNext());
158 EXPECT_EQ(std::vector<unsigned int>({1, 1}), particleIndexGenerator.
getCurrentIndices());
159 EXPECT_TRUE(particleIndexGenerator.
loadNext());
160 EXPECT_EQ(std::vector<unsigned int>({0, 2}), particleIndexGenerator.
getCurrentIndices());
161 EXPECT_TRUE(particleIndexGenerator.
loadNext());
162 EXPECT_EQ(std::vector<unsigned int>({1, 2}), particleIndexGenerator.
getCurrentIndices());
163 EXPECT_FALSE(particleIndexGenerator.
loadNext());
168 particleIndexGenerator.
init(std::vector<unsigned int>({2, 4, 3}));
169 EXPECT_TRUE(particleIndexGenerator.
loadNext());
170 EXPECT_EQ(std::vector<unsigned int>({0, 0, 0}), particleIndexGenerator.
getCurrentIndices());
171 EXPECT_TRUE(particleIndexGenerator.
loadNext());
172 EXPECT_EQ(std::vector<unsigned int>({1, 0, 0}), particleIndexGenerator.
getCurrentIndices());
173 EXPECT_TRUE(particleIndexGenerator.
loadNext());
174 EXPECT_EQ(std::vector<unsigned int>({0, 1, 0}), particleIndexGenerator.
getCurrentIndices());
175 EXPECT_TRUE(particleIndexGenerator.
loadNext());
176 EXPECT_EQ(std::vector<unsigned int>({1, 1, 0}), particleIndexGenerator.
getCurrentIndices());
177 EXPECT_TRUE(particleIndexGenerator.
loadNext());
178 EXPECT_EQ(std::vector<unsigned int>({0, 2, 0}), particleIndexGenerator.
getCurrentIndices());
179 EXPECT_TRUE(particleIndexGenerator.
loadNext());
180 EXPECT_EQ(std::vector<unsigned int>({1, 2, 0}), particleIndexGenerator.
getCurrentIndices());
181 EXPECT_TRUE(particleIndexGenerator.
loadNext());
182 EXPECT_EQ(std::vector<unsigned int>({0, 3, 0}), particleIndexGenerator.
getCurrentIndices());
183 EXPECT_TRUE(particleIndexGenerator.
loadNext());
184 EXPECT_EQ(std::vector<unsigned int>({1, 3, 0}), particleIndexGenerator.
getCurrentIndices());
185 EXPECT_TRUE(particleIndexGenerator.
loadNext());
186 EXPECT_EQ(std::vector<unsigned int>({0, 0, 1}), particleIndexGenerator.
getCurrentIndices());
187 EXPECT_TRUE(particleIndexGenerator.
loadNext());
188 EXPECT_EQ(std::vector<unsigned int>({1, 0, 1}), particleIndexGenerator.
getCurrentIndices());
189 EXPECT_TRUE(particleIndexGenerator.
loadNext());
190 EXPECT_EQ(std::vector<unsigned int>({0, 1, 1}), particleIndexGenerator.
getCurrentIndices());
191 EXPECT_TRUE(particleIndexGenerator.
loadNext());
192 EXPECT_EQ(std::vector<unsigned int>({1, 1, 1}), particleIndexGenerator.
getCurrentIndices());
193 EXPECT_TRUE(particleIndexGenerator.
loadNext());
194 EXPECT_EQ(std::vector<unsigned int>({0, 2, 1}), particleIndexGenerator.
getCurrentIndices());
195 EXPECT_TRUE(particleIndexGenerator.
loadNext());
196 EXPECT_EQ(std::vector<unsigned int>({1, 2, 1}), particleIndexGenerator.
getCurrentIndices());
197 EXPECT_TRUE(particleIndexGenerator.
loadNext());
198 EXPECT_EQ(std::vector<unsigned int>({0, 3, 1}), particleIndexGenerator.
getCurrentIndices());
199 EXPECT_TRUE(particleIndexGenerator.
loadNext());
200 EXPECT_EQ(std::vector<unsigned int>({1, 3, 1}), particleIndexGenerator.
getCurrentIndices());
201 EXPECT_TRUE(particleIndexGenerator.
loadNext());
202 EXPECT_EQ(std::vector<unsigned int>({0, 0, 2}), particleIndexGenerator.
getCurrentIndices());
203 EXPECT_TRUE(particleIndexGenerator.
loadNext());
204 EXPECT_EQ(std::vector<unsigned int>({1, 0, 2}), particleIndexGenerator.
getCurrentIndices());
205 EXPECT_TRUE(particleIndexGenerator.
loadNext());
206 EXPECT_EQ(std::vector<unsigned int>({0, 1, 2}), particleIndexGenerator.
getCurrentIndices());
207 EXPECT_TRUE(particleIndexGenerator.
loadNext());
208 EXPECT_EQ(std::vector<unsigned int>({1, 1, 2}), particleIndexGenerator.
getCurrentIndices());
209 EXPECT_TRUE(particleIndexGenerator.
loadNext());
210 EXPECT_EQ(std::vector<unsigned int>({0, 2, 2}), particleIndexGenerator.
getCurrentIndices());
211 EXPECT_TRUE(particleIndexGenerator.
loadNext());
212 EXPECT_EQ(std::vector<unsigned int>({1, 2, 2}), particleIndexGenerator.
getCurrentIndices());
213 EXPECT_TRUE(particleIndexGenerator.
loadNext());
214 EXPECT_EQ(std::vector<unsigned int>({0, 3, 2}), particleIndexGenerator.
getCurrentIndices());
215 EXPECT_TRUE(particleIndexGenerator.
loadNext());
216 EXPECT_EQ(std::vector<unsigned int>({1, 3, 2}), particleIndexGenerator.
getCurrentIndices());
217 EXPECT_FALSE(particleIndexGenerator.
loadNext());
224 class TestParticleList {
226 typedef std::tuple<Particle::EFlavorType, int, std::set<int>> MockParticle;
229 static std::string printable(
const MockParticle& m)
231 std::string s =
"MockParticle with PDG " + std::to_string(std::get<1>(m));
232 s +=
", type " + std::to_string(std::get<0>(m)) +
", daughter indices: ";
233 for (
int idx : std::get<2>(m))
234 s += std::to_string(idx) +
" ";
238 explicit TestParticleList(
const std::string& _decayString) : decayString(_decayString)
242 decaydescriptor.
init(decayString);
245 pdgCode = mother->getPDGCode();
246 listName = mother->getFullName();
252 list.registerInDataStore();
255 if (not list.isValid())
257 list->initialize(pdgCode, listName);
259 if (not isSelfConjugatedParticle) {
263 antiList.registerInDataStore();
265 if (not antiList.isValid())
267 antiList->initialize(-pdgCode, antiListName);
268 list->bindAntiParticleList(*(antiList));
272 void addParticle(
unsigned int mdstSource)
276 Particle* part = particles.appendNew(TLorentzVector(), pdgCode,
278 list->addParticle(part);
281 void addAntiParticle(
unsigned int mdstSource)
285 Particle* part = particles.appendNew(TLorentzVector(), -pdgCode,
287 list->addParticle(part);
290 void addExpectedParticle(
Particle::EFlavorType flavourType,
int pdg_code, std::vector<int> daughter_indices)
292 expected_particles.emplace_back(flavourType, pdg_code, std::set<int>(daughter_indices.begin(),
293 daughter_indices.end()));
296 void addAndCheckParticlesFromGenerator()
305 std::vector<MockParticle> received_particles;
306 std::vector<Particle*> added_particles;
307 for (
unsigned int i = 0; i < expected_particles.size(); ++i) {
308 bool next = generator.loadNext();
311 const Particle& particle = generator.getCurrentParticle();
312 Particle* part = particles.appendNew(particle);
313 added_particles.push_back(part);
314 auto daughter_indices = part->getDaughterIndices();
315 received_particles.emplace_back(part->getFlavorType(), part->getPDGCode(), std::set<int>(daughter_indices.begin(),
316 daughter_indices.end()));
319 EXPECT_FALSE(generator.loadNext());
321 for (
const auto& p : received_particles) {
322 EXPECT_EQ(std::count(expected_particles.begin(), expected_particles.end(), p), 1) <<
"check failed for " << printable(p);
325 for (
const auto& p : expected_particles) {
326 EXPECT_EQ(std::count(received_particles.begin(), received_particles.end(), p), 1) <<
"check failed for " << printable(p);
327 auto it = std::find(received_particles.begin(), received_particles.end(), p);
328 if (it != received_particles.end()) {
329 auto index = std::distance(received_particles.begin(), it);
330 list->addParticle(added_particles[index]);
341 EXPECT_LT(index, list->getListSize());
342 return list->getList(ParticleList::c_SelfConjugatedParticle)[index];
350 EXPECT_LT(index, list->getListSize());
351 return list->getList(ParticleList::c_FlavorSpecificParticle)[index];
359 EXPECT_LT(index, list->getListSize());
360 return list->getList(ParticleList::c_FlavorSpecificParticle)[index];
365 std::string decayString;
366 std::string listName;
367 std::string antiListName;
368 bool isSelfConjugatedParticle;
369 std::vector<MockParticle> expected_particles;
373 TEST_F(ParticleCombinerTest, DStar)
375 TestParticleList K(
"K+");
377 K.addAntiParticle(2);
378 K.addAntiParticle(3);
380 TestParticleList pi(
"pi+");
383 pi.addAntiParticle(6);
386 TestParticleList D0(
"D0 -> K- pi+");
392 D0.addAndCheckParticlesFromGenerator();
396 TestParticleList D0(
"D0 -> K- K+");
399 D0.addAndCheckParticlesFromGenerator();
402 TestParticleList D0(
"D0");
404 TestParticleList DS(
"D*+ -> D0 pi+");
417 DS.addAndCheckParticlesFromGenerator();
421 TEST_F(ParticleCombinerTest, RareBDecay)
423 TestParticleList e(
"e+");
425 e.addAntiParticle(2);
427 e.addAntiParticle(4);
429 TestParticleList gamma(
"gamma");
430 gamma.addParticle(5);
431 gamma.addParticle(6);
432 gamma.addParticle(7);
434 TestParticleList mu(
"mu+");
435 for (
int i = 0; i < 100; ++i) {
436 mu.addParticle(7 + 2 * i + 1);
437 mu.addAntiParticle(7 + 2 * i + 2);
441 TestParticleList BP(
"B+ -> e+");
446 BP.addAndCheckParticlesFromGenerator();
448 TestParticleList BP2(
"B+:eg -> e+ gamma");
449 for (
int j = 0; j < 3; ++j) {
455 BP2.addAndCheckParticlesFromGenerator();
458 TestParticleList Y(
"Upsilon(4S) -> B+ B-");
463 Y.addAndCheckParticlesFromGenerator();
466 TestParticleList Y2(
"Upsilon(4S):eg -> B+:eg B-");
467 for (
int j = 0; j < 3; ++j) {
478 Y2.addAndCheckParticlesFromGenerator();
483 TestParticleList BP(
"B+:mu -> mu+");
484 for (
int i = 0; i < 100; ++i) {
488 BP.addAndCheckParticlesFromGenerator();
491 TestParticleList BP(
"B+:mg -> mu+ gamma");
492 for (
int j = 0; j < 3; ++j) {
493 for (
int i = 0; i < 100; ++i) {
498 BP.addAndCheckParticlesFromGenerator();
503 TEST_F(ParticleCombinerTest, PsiTo2D0_to2MuPlus2MuMinus)
505 TestParticleList mu(
"mu+");
508 mu.addAntiParticle(3);
509 mu.addAntiParticle(4);
511 TestParticleList D0(
"D0 -> mu+ mu-");
516 D0.addAndCheckParticlesFromGenerator();
518 TestParticleList Psi(
"psi(3770) -> D0 anti-D0");
521 Psi.addAndCheckParticlesFromGenerator();
523 TestParticleList PsiMixed(
"psi(3770):mixeed -> D0 D0");
526 PsiMixed.addAndCheckParticlesFromGenerator();
530 TEST_F(ParticleCombinerTest, PsiToD0D0sig)
532 TestParticleList mu(
"mu+");
535 mu.addAntiParticle(3);
536 mu.addAntiParticle(4);
538 TestParticleList K(
"K+");
540 K.addAntiParticle(6);
541 TestParticleList pi(
"pi+");
543 pi.addAntiParticle(8);
545 TestParticleList D0(
"D0 -> mu+ mu-");
550 D0.addAndCheckParticlesFromGenerator();
552 TestParticleList D0sig(
"D0:sig -> K+ pi-");
555 D0sig.addAndCheckParticlesFromGenerator();
557 TestParticleList Psi(
"psi(3770) -> D0:sig anti-D0");
567 Psi.addAndCheckParticlesFromGenerator();
570 TEST_F(ParticleCombinerTest, InputListCollisions)
577 pipAll.registerInDataStore();
578 pimAll.registerInDataStore();
583 pipAll->initialize(211,
"pi+:all");
584 pimAll->initialize(-211,
"pi-:all");
585 pipAll->bindAntiParticleList(*(pimAll));
592 pipGood.registerInDataStore();
593 pimGood.registerInDataStore();
598 pipGood->initialize(211,
"pi+:good");
599 pimGood->initialize(-211,
"pi-:good");
600 pipGood->bindAntiParticleList(*(pimGood));
606 kpAll.registerInDataStore();
607 kmAll.registerInDataStore();
612 kpAll->initialize(321,
"K+:all");
613 kmAll->initialize(-321,
"K-:all");
614 kpAll->bindAntiParticleList(*(kmAll));
621 kpGood.registerInDataStore();
622 kmGood.registerInDataStore();
627 kpGood->initialize(321,
"K+:good");
628 kmGood->initialize(-321,
"K-:good");
629 kpGood->bindAntiParticleList(*(kmGood));
635 kpGood2.registerInDataStore();
636 kmGood2.registerInDataStore();
641 kpGood2->initialize(321,
"K+:good2");
642 kmGood2->initialize(-321,
"K-:good2");
643 kpGood2->bindAntiParticleList(*(kmGood2));
650 gamma_1.registerInDataStore();
651 gamma_2.registerInDataStore();
656 gamma_1->initialize(22,
"gamma:1");
657 gamma_2->initialize(22,
"gamma:2");
661 EXPECT_FALSE(comb1.inputListsCollide());
662 EXPECT_FALSE(comb1.inputListsCollide(std::make_pair(0, 1)));
665 EXPECT_TRUE(comb2.inputListsCollide());
666 EXPECT_TRUE(comb2.inputListsCollide(std::make_pair(0, 1)));
669 EXPECT_FALSE(comb3.inputListsCollide());
670 EXPECT_FALSE(comb3.inputListsCollide(std::make_pair(0, 1)));
671 EXPECT_FALSE(comb3.inputListsCollide(std::make_pair(0, 2)));
672 EXPECT_FALSE(comb3.inputListsCollide(std::make_pair(0, 3)));
673 EXPECT_FALSE(comb3.inputListsCollide(std::make_pair(1, 2)));
674 EXPECT_FALSE(comb3.inputListsCollide(std::make_pair(1, 3)));
675 EXPECT_FALSE(comb3.inputListsCollide(std::make_pair(2, 3)));
678 EXPECT_TRUE(comb4.inputListsCollide());
679 EXPECT_TRUE(comb4.inputListsCollide(std::make_pair(0, 1)));
680 EXPECT_FALSE(comb4.inputListsCollide(std::make_pair(0, 2)));
681 EXPECT_FALSE(comb4.inputListsCollide(std::make_pair(0, 3)));
682 EXPECT_FALSE(comb4.inputListsCollide(std::make_pair(1, 2)));
683 EXPECT_FALSE(comb4.inputListsCollide(std::make_pair(1, 3)));
684 EXPECT_TRUE(comb4.inputListsCollide(std::make_pair(2, 3)));
687 EXPECT_FALSE(comb5.inputListsCollide());
688 EXPECT_FALSE(comb5.inputListsCollide(std::make_pair(0, 1)));
689 EXPECT_FALSE(comb5.inputListsCollide(std::make_pair(0, 2)));
690 EXPECT_FALSE(comb5.inputListsCollide(std::make_pair(1, 2)));
693 EXPECT_TRUE(comb6.inputListsCollide());
694 EXPECT_FALSE(comb6.inputListsCollide(std::make_pair(0, 1)));
695 EXPECT_FALSE(comb6.inputListsCollide(std::make_pair(0, 2)));
696 EXPECT_TRUE(comb6.inputListsCollide(std::make_pair(1, 2)));
699 EXPECT_TRUE(comb7.inputListsCollide());
700 EXPECT_TRUE(comb7.inputListsCollide(std::make_pair(0, 1)));
701 EXPECT_TRUE(comb7.inputListsCollide(std::make_pair(0, 2)));
702 EXPECT_FALSE(comb7.inputListsCollide(std::make_pair(0, 3)));
703 EXPECT_FALSE(comb7.inputListsCollide(std::make_pair(0, 4)));
704 EXPECT_TRUE(comb7.inputListsCollide(std::make_pair(1, 2)));
705 EXPECT_FALSE(comb7.inputListsCollide(std::make_pair(1, 3)));
706 EXPECT_FALSE(comb7.inputListsCollide(std::make_pair(1, 4)));
707 EXPECT_FALSE(comb7.inputListsCollide(std::make_pair(2, 3)));
708 EXPECT_FALSE(comb7.inputListsCollide(std::make_pair(2, 4)));
709 EXPECT_TRUE(comb7.inputListsCollide(std::make_pair(3, 4)));
712 TEST_F(ParticleCombinerTest, ECLCombinationsTest)
767 gamma.registerInDataStore();
768 klong.registerInDataStore();
769 vpho.registerInDataStore();
776 klong->initialize(
Const::Klong.getPDGCode(),
"K_L0:test");
778 vpho->initialize(10022,
"vpho:test");
780 gamma->addParticle(g_1);
781 gamma->addParticle(g_2);
782 gamma->addParticle(g_3);
783 gamma->addParticle(g_4);
785 klong->addParticle(KL);
789 auto isForbidden = [](std::vector<int> v) ->
bool {
790 if (std::find(v.begin(), v.end(), 3) != v.end())
791 if (std::find(v.begin(), v.end(), 4) != v.end())
797 EXPECT_EQ(4, gamma->getListSize());
798 EXPECT_EQ(1, klong->getListSize());
799 EXPECT_EQ(0, vpho->getListSize());
804 while (combiner3.loadNext()) {
805 const Particle& particle = combiner3.getCurrentParticle();
807 const std::vector<int>& indices = particle.getDaughterIndices();
808 EXPECT_FALSE(isForbidden(indices));
810 particles.appendNew(particle);
811 int iparticle = particles.getEntries() - 1;
813 vpho->addParticle(iparticle, particle.getPDGCode(), particle.getFlavorType());
816 EXPECT_EQ(3, vpho->getListSize());
821 while (combiner2.loadNext()) {
822 const Particle& particle = combiner2.getCurrentParticle();
824 const std::vector<int>& indices = particle.getDaughterIndices();
825 EXPECT_FALSE(isForbidden(indices));
827 particles.appendNew(particle);
828 int iparticle = particles.getEntries() - 1;
830 vpho->addParticle(iparticle, particle.getPDGCode(), particle.getFlavorType());
833 EXPECT_EQ(6, vpho->getListSize());
836 TEST_F(ParticleCombinerTest, FSPCopies)
891 Particle::c_ECLCluster, 4));
906 pipAll.registerInDataStore();
907 pimAll.registerInDataStore();
912 pipAll->initialize(211,
"pi+:all");
913 pimAll->initialize(-211,
"pi-:all");
914 pipAll->bindAntiParticleList(*(pimAll));
921 pipGood.registerInDataStore();
922 pimGood.registerInDataStore();
927 pipGood->initialize(211,
"pi+:good");
928 pimGood->initialize(-211,
"pi-:good");
929 pipGood->bindAntiParticleList(*(pimGood));
935 kpAll.registerInDataStore();
936 kmAll.registerInDataStore();
941 kpAll->initialize(321,
"K+:all");
942 kmAll->initialize(-321,
"K-:all");
943 kpAll->bindAntiParticleList(*(kmAll));
950 kpGood.registerInDataStore();
951 kmGood.registerInDataStore();
956 kpGood->initialize(321,
"K+:good");
957 kmGood->initialize(-321,
"K-:good");
958 kpGood->bindAntiParticleList(*(kmGood));
964 kpGood2.registerInDataStore();
965 kmGood2.registerInDataStore();
970 kpGood2->initialize(321,
"K+:good2");
971 kmGood2->initialize(-321,
"K-:good2");
972 kpGood2->bindAntiParticleList(*(kmGood2));
979 gamma_1.registerInDataStore();
980 gamma_2.registerInDataStore();
985 gamma_1->initialize(22,
"gamma:1");
986 gamma_2->initialize(22,
"gamma:2");
991 klong_1.registerInDataStore();
995 klong_1->initialize(
Const::Klong.getPDGCode(),
"K_L0:1");
998 pipAll->addParticle(pip_1);
999 pipAll->addParticle(pip_2);
1000 pipAll->addParticle(pip_3);
1002 pipAll->addParticle(pim_1);
1003 pipAll->addParticle(pim_2);
1004 pipAll->addParticle(pim_3);
1006 kpAll->addParticle(kp_1);
1007 kpAll->addParticle(kp_2);
1008 kpAll->addParticle(kp_3);
1010 kpAll->addParticle(km_1);
1011 kpAll->addParticle(km_2);
1012 kpAll->addParticle(km_3);
1014 pipGood->addParticle(pip_1_copy);
1015 pipGood->addParticle(pim_1_copy);
1017 kpGood->addParticle(kp_1_copy);
1018 kpGood->addParticle(km_1_copy);
1020 kpGood2->addParticle(kp_1);
1021 kpGood2->addParticle(km_1);
1022 kpGood2->addParticle(kp_2);
1023 kpGood2->addParticle(km_2);
1024 kpGood2->addParticle(kp_3);
1025 kpGood2->addParticle(km_3);
1027 gamma_1->addParticle(g_1);
1028 gamma_1->addParticle(g_2);
1029 gamma_1->addParticle(g_3);
1031 gamma_2->addParticle(g_1_copy);
1032 gamma_2->addParticle(g_2_copy);
1033 gamma_2->addParticle(g_3_copy);
1034 gamma_2->addParticle(g_4);
1036 klong_1->addParticle(KL);
1039 EXPECT_EQ(6, pipAll->getListSize());
1040 EXPECT_EQ(6, pimAll->getListSize());
1041 EXPECT_EQ(6, kpAll->getListSize());
1042 EXPECT_EQ(6, kmAll->getListSize());
1043 EXPECT_EQ(2, pipGood->getListSize());
1044 EXPECT_EQ(2, kpGood->getListSize());
1045 EXPECT_EQ(3, gamma_1->getListSize());
1046 EXPECT_EQ(4, gamma_2->getListSize());
1047 EXPECT_EQ(1, klong_1->getListSize());
1050 ParticleGenerator comb7(
"D+:3 -> K-:all K+:good K-:good2 pi+:good pi+:all gamma:1 gamma:2");
1052 std::vector<StoreObjPtr<ParticleList>> comb7PLists;
1053 comb7PLists.push_back(kmAll);
1054 comb7PLists.push_back(kpGood);
1055 comb7PLists.push_back(kmGood2);
1056 comb7PLists.push_back(pipGood);
1057 comb7PLists.push_back(pipAll);
1058 comb7PLists.push_back(gamma_1);
1059 comb7PLists.push_back(gamma_2);
1062 for (
unsigned i = 0; i < comb7PLists.size(); i++) {
1064 std::vector<int> iAll;
1065 iAll.insert(iAll.begin(), (list_i->getList(ParticleList::c_FlavorSpecificParticle,
false)).begin(),
1066 (list_i->getList(ParticleList::c_FlavorSpecificParticle,
false)).end());
1067 iAll.insert(iAll.begin(), (list_i->getList(ParticleList::c_FlavorSpecificParticle,
true)).begin(),
1068 (list_i->getList(ParticleList::c_FlavorSpecificParticle,
true)).end());
1069 iAll.insert(iAll.begin(), (list_i->getList(ParticleList::c_SelfConjugatedParticle)).begin(),
1070 (list_i->getList(ParticleList::c_SelfConjugatedParticle)).end());
1072 for (
unsigned int j = i + 1; j < comb7PLists.size(); j++) {
1076 std::vector<int> jAll;
1077 jAll.insert(jAll.begin(), (list_j->getList(ParticleList::c_FlavorSpecificParticle,
false)).begin(),
1078 (list_j->getList(ParticleList::c_FlavorSpecificParticle,
false)).end());
1079 jAll.insert(jAll.begin(), (list_j->getList(ParticleList::c_FlavorSpecificParticle,
true)).begin(),
1080 (list_j->getList(ParticleList::c_FlavorSpecificParticle,
true)).end());
1081 jAll.insert(jAll.begin(), (list_j->getList(ParticleList::c_SelfConjugatedParticle)).begin(),
1082 (list_j->getList(ParticleList::c_SelfConjugatedParticle)).end());
1087 for (
int k : iAll) {
1088 for (
int m : jAll) {
1094 int iID = comb7.getUniqueID(k);
1095 int jID = comb7.getUniqueID(m);
1097 EXPECT_TRUE(iID > 0);
1098 EXPECT_TRUE(jID > 0);
1103 EXPECT_TRUE(iID == jID);
1105 EXPECT_FALSE(iID == jID);
1127 D02Kpi_1.registerInDataStore();
1128 anti_D02Kpi_1.registerInDataStore();
1129 D02Kpi_2.registerInDataStore();
1130 anti_D02Kpi_2.registerInDataStore();
1131 D02KK_1.registerInDataStore();
1132 anti_D02KK_1.registerInDataStore();
1133 D02KK_2.registerInDataStore();
1134 anti_D02KK_2.registerInDataStore();
1135 D02KK_3.registerInDataStore();
1136 anti_D02KK_3.registerInDataStore();
1137 D0KLg_1.registerInDataStore();
1138 D0KLg_2.registerInDataStore();
1139 anti_D0KLg_1.registerInDataStore();
1140 anti_D0KLg_2.registerInDataStore();
1144 anti_D02Kpi_1.create();
1145 D02Kpi_1->initialize(421,
"D0:kpi1");
1146 anti_D02Kpi_1->initialize(-421,
"anti-D0:kpi1");
1147 D02Kpi_1->bindAntiParticleList(*(anti_D02Kpi_1));
1150 anti_D02Kpi_2.create();
1151 D02Kpi_2->initialize(421,
"D0:kpi2");
1152 anti_D02Kpi_2->initialize(-421,
"anti-D0:kpi2");
1153 D02Kpi_2->bindAntiParticleList(*(anti_D02Kpi_2));
1156 anti_D02KK_1.create();
1157 D02KK_1->initialize(421,
"D0:kk1");
1158 anti_D02KK_1->initialize(-421,
"anti-D0:kk1");
1159 D02KK_1->bindAntiParticleList(*(anti_D02KK_1));
1162 anti_D02KK_2.create();
1163 D02KK_2->initialize(421,
"D0:kk2");
1164 anti_D02KK_2->initialize(-421,
"anti-D0:kk2");
1165 D02KK_2->bindAntiParticleList(*(anti_D02KK_2));
1168 anti_D02KK_3.create();
1169 D02KK_3->initialize(421,
"D0:kk3");
1170 anti_D02KK_3->initialize(-421,
"anti-D0:kk3");
1171 D02KK_3->bindAntiParticleList(*(anti_D02KK_3));
1175 anti_D0KLg_1.create();
1176 anti_D0KLg_2.create();
1177 D0KLg_1->initialize(421,
"D0:klg1");
1178 D0KLg_2->initialize(421,
"D0:klg2");
1179 anti_D0KLg_1->initialize(-421,
"anti-D0:klg1");
1180 anti_D0KLg_2->initialize(-421,
"anti-D0:klg2");
1181 D0KLg_1->bindAntiParticleList(*(anti_D0KLg_1));
1182 D0KLg_2->bindAntiParticleList(*(anti_D0KLg_2));
1185 combiner_D02Kpi_1.init();
1186 while (combiner_D02Kpi_1.loadNext()) {
1187 const Particle& particle = combiner_D02Kpi_1.getCurrentParticle();
1189 particles.appendNew(particle);
1190 int iparticle = particles.getEntries() - 1;
1192 D02Kpi_1->addParticle(iparticle, particle.getPDGCode(), particle.getFlavorType());
1194 EXPECT_EQ(18, D02Kpi_1->getListSize());
1195 EXPECT_EQ(9 , D02Kpi_1->getNParticlesOfType(ParticleList::c_FlavorSpecificParticle));
1196 EXPECT_EQ(9 , D02Kpi_1->getNParticlesOfType(ParticleList::c_FlavorSpecificParticle,
true));
1197 EXPECT_EQ(0 , D02Kpi_1->getNParticlesOfType(ParticleList::c_SelfConjugatedParticle));
1200 combiner_D02Kpi_2.init();
1201 while (combiner_D02Kpi_2.loadNext()) {
1202 const Particle& particle = combiner_D02Kpi_2.getCurrentParticle();
1204 particles.appendNew(particle);
1205 int iparticle = particles.getEntries() - 1;
1207 D02Kpi_2->addParticle(iparticle, particle.getPDGCode(), particle.getFlavorType());
1209 EXPECT_EQ(6, D02Kpi_2->getListSize());
1210 EXPECT_EQ(3 , D02Kpi_2->getNParticlesOfType(ParticleList::c_FlavorSpecificParticle));
1211 EXPECT_EQ(3 , D02Kpi_2->getNParticlesOfType(ParticleList::c_FlavorSpecificParticle,
true));
1212 EXPECT_EQ(0 , D02Kpi_2->getNParticlesOfType(ParticleList::c_SelfConjugatedParticle));
1215 combiner_D02KK_1.init();
1216 while (combiner_D02KK_1.loadNext()) {
1217 const Particle& particle = combiner_D02KK_1.getCurrentParticle();
1219 particles.appendNew(particle);
1220 int iparticle = particles.getEntries() - 1;
1222 D02KK_1->addParticle(iparticle, particle.getPDGCode(), particle.getFlavorType());
1224 EXPECT_EQ(9, D02KK_1->getListSize());
1225 EXPECT_EQ(0 , D02KK_1->getNParticlesOfType(ParticleList::c_FlavorSpecificParticle));
1226 EXPECT_EQ(0 , D02KK_1->getNParticlesOfType(ParticleList::c_FlavorSpecificParticle,
true));
1227 EXPECT_EQ(9 , D02KK_1->getNParticlesOfType(ParticleList::c_SelfConjugatedParticle));
1228 EXPECT_EQ(9 , D02KK_1->getNParticlesOfType(ParticleList::c_SelfConjugatedParticle,
true));
1231 combiner_D02KK_2.init();
1232 while (combiner_D02KK_2.loadNext()) {
1233 const Particle& particle = combiner_D02KK_2.getCurrentParticle();
1235 particles.appendNew(particle);
1236 int iparticle = particles.getEntries() - 1;
1238 D02KK_2->addParticle(iparticle, particle.getPDGCode(), particle.getFlavorType());
1240 EXPECT_EQ(5, D02KK_2->getListSize());
1241 EXPECT_EQ(0 , D02KK_2->getNParticlesOfType(ParticleList::c_FlavorSpecificParticle));
1242 EXPECT_EQ(0 , D02KK_2->getNParticlesOfType(ParticleList::c_FlavorSpecificParticle,
true));
1243 EXPECT_EQ(5 , D02KK_2->getNParticlesOfType(ParticleList::c_SelfConjugatedParticle));
1244 EXPECT_EQ(5 , D02KK_2->getNParticlesOfType(ParticleList::c_SelfConjugatedParticle,
true));
1247 combiner_D02KK_3.init();
1248 while (combiner_D02KK_3.loadNext()) {
1249 const Particle& particle = combiner_D02KK_3.getCurrentParticle();
1251 particles.appendNew(particle);
1252 int iparticle = particles.getEntries() - 1;
1254 D02KK_3->addParticle(iparticle, particle.getPDGCode(), particle.getFlavorType());
1256 EXPECT_EQ(9, D02KK_3->getListSize());
1257 EXPECT_EQ(0 , D02KK_3->getNParticlesOfType(ParticleList::c_FlavorSpecificParticle));
1258 EXPECT_EQ(0 , D02KK_3->getNParticlesOfType(ParticleList::c_FlavorSpecificParticle,
true));
1259 EXPECT_EQ(9 , D02KK_3->getNParticlesOfType(ParticleList::c_SelfConjugatedParticle));
1260 EXPECT_EQ(9 , D02KK_3->getNParticlesOfType(ParticleList::c_SelfConjugatedParticle,
true));
1265 combiner_D02KLg1.init();
1266 while (combiner_D02KLg1.loadNext()) {
1267 const Particle& particle = combiner_D02KLg1.getCurrentParticle();
1269 particles.appendNew(particle);
1270 int iparticle = particles.getEntries() - 1;
1272 D0KLg_1->addParticle(iparticle, particle.getPDGCode(), particle.getFlavorType());
1274 EXPECT_EQ(3, D0KLg_1->getListSize());
1275 EXPECT_EQ(0 , D0KLg_1->getNParticlesOfType(ParticleList::c_FlavorSpecificParticle));
1276 EXPECT_EQ(0 , D0KLg_1->getNParticlesOfType(ParticleList::c_FlavorSpecificParticle,
true));
1277 EXPECT_EQ(3 , D0KLg_1->getNParticlesOfType(ParticleList::c_SelfConjugatedParticle));
1279 combiner_D02KLg2.init();
1280 while (combiner_D02KLg2.loadNext()) {
1281 const Particle& particle = combiner_D02KLg2.getCurrentParticle();
1283 particles.appendNew(particle);
1284 int iparticle = particles.getEntries() - 1;
1286 D0KLg_2->addParticle(iparticle, particle.getPDGCode(), particle.getFlavorType());
1288 EXPECT_EQ(3, D0KLg_2->getListSize());
1289 EXPECT_EQ(0 , D0KLg_2->getNParticlesOfType(ParticleList::c_FlavorSpecificParticle));
1290 EXPECT_EQ(0 , D0KLg_2->getNParticlesOfType(ParticleList::c_FlavorSpecificParticle,
true));
1291 EXPECT_EQ(3 , D0KLg_2->getNParticlesOfType(ParticleList::c_SelfConjugatedParticle));
1300 DpKpipi_1.registerInDataStore();
1301 DmKpipi_1.registerInDataStore();
1302 DpKpipi_2.registerInDataStore();
1303 DmKpipi_2.registerInDataStore();
1311 DpKpipi_1->initialize(411,
"D+:kpipi1");
1312 DmKpipi_1->initialize(-411,
"D-:kpipi1");
1313 DpKpipi_1->bindAntiParticleList(*(DmKpipi_1));
1315 DpKpipi_2->initialize(411,
"D+:kpipi2");
1316 DmKpipi_2->initialize(-411,
"D-:kpipi2");
1317 DpKpipi_2->bindAntiParticleList(*(DmKpipi_2));
1321 combiner_DpKpipi_1.init();
1322 while (combiner_DpKpipi_1.loadNext()) {
1323 const Particle& particle = combiner_DpKpipi_1.getCurrentParticle();
1325 particles.appendNew(particle);
1326 int iparticle = particles.getEntries() - 1;
1328 DpKpipi_1->addParticle(iparticle, particle.getPDGCode(), particle.getFlavorType());
1330 EXPECT_EQ(18, DpKpipi_1->getListSize());
1331 EXPECT_EQ(9 , DpKpipi_1->getNParticlesOfType(ParticleList::c_FlavorSpecificParticle));
1332 EXPECT_EQ(9 , DpKpipi_1->getNParticlesOfType(ParticleList::c_FlavorSpecificParticle,
true));
1333 EXPECT_EQ(0 , DpKpipi_1->getNParticlesOfType(ParticleList::c_SelfConjugatedParticle));
1336 combiner_DpKpipi_2.init();
1337 while (combiner_DpKpipi_2.loadNext()) {
1338 const Particle& particle = combiner_DpKpipi_2.getCurrentParticle();
1340 particles.appendNew(particle);
1341 int iparticle = particles.getEntries() - 1;
1343 DpKpipi_2->addParticle(iparticle, particle.getPDGCode(), particle.getFlavorType());
1345 EXPECT_EQ(12, DpKpipi_2->getListSize());
1346 EXPECT_EQ(6 , DpKpipi_2->getNParticlesOfType(ParticleList::c_FlavorSpecificParticle));
1347 EXPECT_EQ(6 , DpKpipi_2->getNParticlesOfType(ParticleList::c_FlavorSpecificParticle,
true));
1348 EXPECT_EQ(0 , DpKpipi_2->getNParticlesOfType(ParticleList::c_SelfConjugatedParticle));
1356 DSTp_1.registerInDataStore();
1357 DSTm_1.registerInDataStore();
1358 DSTp_2.registerInDataStore();
1359 DSTm_2.registerInDataStore();
1367 DSTp_1->initialize(413,
"D*+:D0kpi1pi");
1368 DSTm_1->initialize(-413,
"D*-:D0kpi1pi");
1369 DSTp_1->bindAntiParticleList(*(DSTm_1));
1371 DSTp_2->initialize(413,
"D*+:D0kk2pi");
1372 DSTm_2->initialize(-413,
"D*-:D0kk2pi");
1373 DSTp_2->bindAntiParticleList(*(DSTm_2));
1377 combiner_DSTp_1.init();
1378 while (combiner_DSTp_1.loadNext()) {
1379 const Particle& particle = combiner_DSTp_1.getCurrentParticle();
1381 particles.appendNew(particle);
1382 int iparticle = particles.getEntries() - 1;
1384 DSTp_1->addParticle(iparticle, particle.getPDGCode(), particle.getFlavorType());
1386 EXPECT_EQ(12, DSTp_1->getListSize());
1387 EXPECT_EQ(6 , DSTp_1->getNParticlesOfType(ParticleList::c_FlavorSpecificParticle));
1388 EXPECT_EQ(6 , DSTp_1->getNParticlesOfType(ParticleList::c_FlavorSpecificParticle,
true));
1389 EXPECT_EQ(0 , DSTp_1->getNParticlesOfType(ParticleList::c_SelfConjugatedParticle));
1392 combiner_DSTp_2.init();
1393 while (combiner_DSTp_2.loadNext()) {
1394 const Particle& particle = combiner_DSTp_2.getCurrentParticle();
1396 particles.appendNew(particle);
1397 int iparticle = particles.getEntries() - 1;
1399 DSTp_2->addParticle(iparticle, particle.getPDGCode(), particle.getFlavorType());
1401 EXPECT_EQ(4, DSTp_2->getListSize());
1402 EXPECT_EQ(2 , DSTp_2->getNParticlesOfType(ParticleList::c_FlavorSpecificParticle));
1403 EXPECT_EQ(2 , DSTp_2->getNParticlesOfType(ParticleList::c_FlavorSpecificParticle,
true));
1404 EXPECT_EQ(0 , DSTp_2->getNParticlesOfType(ParticleList::c_SelfConjugatedParticle));
1409 pi0_1.registerInDataStore();
1414 pi0_1->initialize(111,
"pi0:1");
1418 combiner_pi0_1.init();
1419 while (combiner_pi0_1.loadNext()) {
1420 const Particle& particle = combiner_pi0_1.getCurrentParticle();
1422 particles.appendNew(particle);
1423 int iparticle = particles.getEntries() - 1;
1425 pi0_1->addParticle(iparticle, particle.getPDGCode(), particle.getFlavorType());
1427 EXPECT_EQ(3, pi0_1->getListSize());
1428 EXPECT_EQ(0 , pi0_1->getNParticlesOfType(ParticleList::c_FlavorSpecificParticle));
1429 EXPECT_EQ(0 , pi0_1->getNParticlesOfType(ParticleList::c_FlavorSpecificParticle,
true));
1430 EXPECT_EQ(3 , pi0_1->getNParticlesOfType(ParticleList::c_SelfConjugatedParticle));
1435 pi0_1copy.registerInDataStore();
1440 pi0_1copy->initialize(111,
"pi0:1");
1444 combiner_pi0_1copy.init();
1445 while (combiner_pi0_1copy.loadNext()) {
1446 const Particle& particle = combiner_pi0_1copy.getCurrentParticle();
1448 particles.appendNew(particle);
1449 int iparticle = particles.getEntries() - 1;
1451 pi0_1copy->addParticle(iparticle, particle.getPDGCode(), particle.getFlavorType());
1457 pi0_2.registerInDataStore();
1462 pi0_2->initialize(111,
"pi0:2");
1466 combiner_pi0_2.init();
1467 while (combiner_pi0_2.loadNext()) {
1468 const Particle& particle = combiner_pi0_2.getCurrentParticle();
1470 particles.appendNew(particle);
1471 int iparticle = particles.getEntries() - 1;
1473 pi0_2->addParticle(iparticle, particle.getPDGCode(), particle.getFlavorType());
1475 EXPECT_EQ(6, pi0_2->getListSize());
1476 EXPECT_EQ(0 , pi0_2->getNParticlesOfType(ParticleList::c_FlavorSpecificParticle));
1477 EXPECT_EQ(0 , pi0_2->getNParticlesOfType(ParticleList::c_FlavorSpecificParticle,
true));
1478 EXPECT_EQ(6 , pi0_2->getNParticlesOfType(ParticleList::c_SelfConjugatedParticle));
1483 eta_1.registerInDataStore();
1488 eta_1->initialize(221,
"eta:1");
1492 combiner_eta_1.init();
1493 while (combiner_eta_1.loadNext()) {
1494 const Particle& particle = combiner_eta_1.getCurrentParticle();
1496 particles.appendNew(particle);
1497 int iparticle = particles.getEntries() - 1;
1499 eta_1->addParticle(iparticle, particle.getPDGCode(), particle.getFlavorType());
1501 EXPECT_EQ(6, eta_1->getListSize());
1502 EXPECT_EQ(0 , eta_1->getNParticlesOfType(ParticleList::c_FlavorSpecificParticle));
1503 EXPECT_EQ(0 , eta_1->getNParticlesOfType(ParticleList::c_FlavorSpecificParticle,
true));
1504 EXPECT_EQ(6 , eta_1->getNParticlesOfType(ParticleList::c_SelfConjugatedParticle));
1509 eta_1copy.registerInDataStore();
1514 eta_1copy->initialize(221,
"eta:1copy");
1518 combiner_eta_1copy.init();
1519 while (combiner_eta_1copy.loadNext()) {
1520 const Particle& particle = combiner_eta_1copy.getCurrentParticle();
1522 particles.appendNew(particle);
1523 int iparticle = particles.getEntries() - 1;
1525 eta_1copy->addParticle(iparticle, particle.getPDGCode(), particle.getFlavorType());
1532 B0_1.registerInDataStore();
1533 aB0_1.registerInDataStore();
1539 B0_1->initialize(511,
"B0:1");
1540 aB0_1->initialize(-511,
"anti-B0:1");
1541 B0_1->bindAntiParticleList(*(aB0_1));
1544 combiner_B0_1.init();
1545 while (combiner_B0_1.loadNext()) {
1546 const Particle& particle = combiner_B0_1.getCurrentParticle();
1548 particles.appendNew(particle);
1549 int iparticle = particles.getEntries() - 1;
1551 B0_1->addParticle(iparticle, particle.getPDGCode(), particle.getFlavorType());
1553 EXPECT_EQ(3, B0_1->getListSize());
1554 EXPECT_EQ(0 , B0_1->getNParticlesOfType(ParticleList::c_FlavorSpecificParticle));
1555 EXPECT_EQ(0 , B0_1->getNParticlesOfType(ParticleList::c_FlavorSpecificParticle,
true));
1556 EXPECT_EQ(3 , B0_1->getNParticlesOfType(ParticleList::c_SelfConjugatedParticle));
1557 EXPECT_EQ(3 , aB0_1->getNParticlesOfType(ParticleList::c_SelfConjugatedParticle));
1563 B0_2.registerInDataStore();
1564 aB0_2.registerInDataStore();
1570 B0_2->initialize(511,
"B0:2");
1571 aB0_2->initialize(-511,
"anti-B0:2");
1572 B0_2->bindAntiParticleList(*(aB0_2));
1575 combiner_B0_2.init();
1576 while (combiner_B0_2.loadNext()) {
1577 const Particle& particle = combiner_B0_2.getCurrentParticle();
1579 particles.appendNew(particle);
1580 int iparticle = particles.getEntries() - 1;
1582 B0_2->addParticle(iparticle, particle.getPDGCode(), particle.getFlavorType());
1584 EXPECT_EQ(0, B0_2->getListSize());
1585 EXPECT_EQ(0 , B0_2->getNParticlesOfType(ParticleList::c_FlavorSpecificParticle));
1586 EXPECT_EQ(0 , B0_2->getNParticlesOfType(ParticleList::c_FlavorSpecificParticle,
true));
1587 EXPECT_EQ(0 , B0_2->getNParticlesOfType(ParticleList::c_SelfConjugatedParticle));
1588 EXPECT_EQ(0 , aB0_2->getNParticlesOfType(ParticleList::c_SelfConjugatedParticle));
1594 B0_3.registerInDataStore();
1595 aB0_3.registerInDataStore();
1601 B0_3->initialize(511,
"B0:3");
1602 aB0_3->initialize(-511,
"anti-B0:3");
1603 B0_3->bindAntiParticleList(*(aB0_3));
1606 combiner_B0_3.init();
1607 while (combiner_B0_3.loadNext()) {
1608 const Particle& particle = combiner_B0_3.getCurrentParticle();
1610 particles.appendNew(particle);
1611 int iparticle = particles.getEntries() - 1;
1613 B0_3->addParticle(iparticle, particle.getPDGCode(), particle.getFlavorType());
1615 EXPECT_EQ(3, B0_3->getListSize());
1616 EXPECT_EQ(0 , B0_3->getNParticlesOfType(ParticleList::c_FlavorSpecificParticle));
1617 EXPECT_EQ(0 , B0_3->getNParticlesOfType(ParticleList::c_FlavorSpecificParticle,
true));
1618 EXPECT_EQ(3 , B0_3->getNParticlesOfType(ParticleList::c_SelfConjugatedParticle));
1619 EXPECT_EQ(3 , aB0_3->getNParticlesOfType(ParticleList::c_SelfConjugatedParticle));
1625 B0_4.registerInDataStore();
1626 aB0_4.registerInDataStore();
1632 B0_4->initialize(511,
"B0:4");
1633 aB0_4->initialize(-511,
"anti-B0:4");
1634 B0_4->bindAntiParticleList(*(aB0_4));
1637 combiner_B0_4.init();
1638 while (combiner_B0_4.loadNext()) {
1639 const Particle& particle = combiner_B0_4.getCurrentParticle();
1641 particles.appendNew(particle);
1642 int iparticle = particles.getEntries() - 1;
1644 B0_4->addParticle(iparticle, particle.getPDGCode(), particle.getFlavorType());
1646 EXPECT_EQ(6, B0_4->getListSize());
1647 EXPECT_EQ(0 , B0_4->getNParticlesOfType(ParticleList::c_FlavorSpecificParticle));
1648 EXPECT_EQ(0 , B0_4->getNParticlesOfType(ParticleList::c_FlavorSpecificParticle,
true));
1649 EXPECT_EQ(6 , B0_4->getNParticlesOfType(ParticleList::c_SelfConjugatedParticle));
1650 EXPECT_EQ(6 , aB0_4->getNParticlesOfType(ParticleList::c_SelfConjugatedParticle));
static const ParticleType Klong
K^0_L particle.
static const ParticleType photon
photon particle
static DataStore & Instance()
Instance of singleton Store.
void setInitializeActive(bool active)
Setter for m_initializeActive.
void reset(EDurability durability)
Frees memory occupied by data store items and removes all objects from the map.
Represents a particle in the DecayDescriptor.
The DecayDescriptor stores information about a decay tree or parts of a decay tree.
bool init(const std::string &str)
Initialise the DecayDescriptor from given string.
const DecayDescriptorParticle * getMother() const
return mother.
void setConnectedRegionId(int crid)
Set connected region id.
void setClusterId(int clusterid)
Set cluster id.
void setHypothesis(EHypothesisBit hypothesis)
Set hypotheses.
@ c_nPhotons
CR is split into n photons (N1)
@ c_neutralHadron
CR is reconstructed as a neutral hadron (N2)
ListIndexGenerator is a generator for all the combinations of the sublists (FlavorSpecificParticle = ...
ParticleGenerator is a generator for all the particles combined from the given ParticleLists.
ParticleIndexGenerator is a generator for all the combinations of the particle indices stored in the ...
Class to store reconstructed particles.
bool isCopyOf(const Particle *oParticle, bool doDetailedComparison=false) const
Returns true if this Particle and oParticle are copies of each other.
EFlavorType
describes flavor type, see getFlavorType().
@ c_Unflavored
Is its own antiparticle or we don't know whether it is a particle/antiparticle.
@ c_Flavored
Is either particle or antiparticle.
bool registerInDataStore(DataStore::EStoreFlags storeFlags=DataStore::c_WriteOut)
Register the object/array in the DataStore.
Accessor to arrays stored in the data store.
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.
void init(const std::vector< unsigned int > &_sizes)
Initialises the generator to produce combinations with the given sizes of each particle list.
const std::vector< unsigned int > & getCurrentIndices() const
Returns theindices of the current loaded combination.
const std::vector< ParticleList::EParticleType > & getCurrentIndices() const
Returns the type of the sublist of the current loaded combination.
void init(unsigned int _numberOfLists)
Initialises the generator to produce the given type of sublist.
bool loadNext()
Loads the next combination.
B2Vector3< DataType > operator*(DataType a, const B2Vector3< DataType > &p)
non-memberfunction Scaling of 3-vectors with a real number
B2Vector3< DataType > operator-(const TVector3 &a, const B2Vector3< DataType > &b)
non-memberfunction for substracting a TVector3 from a B2Vector3
B2Vector3< DataType > operator+(const TVector3 &a, const B2Vector3< DataType > &b)
non-memberfunction for adding a TVector3 to a B2Vector3
std::string antiParticleListName(int pdgCode, const std::string &label)
Returns the name of the anti-particle ParticleList for particles with given pdg code and with given l...
bool hasAntiParticle(int pdgCode)
Checks if the particle with given pdg code has an anti-particle or not.
Abstract base class for different kinds of events.