11 #include <analysis/DecayDescriptor/DecayDescriptor.h>
12 #include <analysis/dataobjects/Particle.h>
14 #include <framework/datastore/StoreArray.h>
15 #include <framework/utilities/TestHelpers.h>
17 #include <gtest/gtest.h>
24 TEST(DecayDescriptorTest, TrivialUse)
28 bool initok = dd.
init(
"K+");
29 EXPECT_EQ(initok,
true);
38 TEST(DecayDescriptorTest, NormalBehaviour)
41 bool initok = dd.
init(
"B0:cand -> K+:loose pi-:loose");
43 EXPECT_EQ(initok,
true);
71 TEST(DecayDescriptorTest, Granddaughters)
74 bool initok = dd.
init(
75 "B0:cand -> [D0:dau1 -> K+:grandau pi-:grandau] [pi0:dau2 -> gamma:grandau [gamma:converted -> e+:gtgrandau e-:gtgrandau]]"
77 EXPECT_EQ(initok,
true);
113 TEST(DecayDescriptorTest, ArrowsDecaysGrammar)
117 bool initok = dd1.
init(
"B0:candidates =direct=> K+:loose pi-:loose gamma:clean");
118 EXPECT_EQ(initok,
true);
124 initok = dd2.
init(
"B0:candidates =norad=> K+:loose pi-:loose gamma:clean");
125 EXPECT_EQ(initok,
true);
131 initok = dd3.
init(
"B0:candidates =exact=> K+:loose pi-:loose gamma:clean");
132 EXPECT_EQ(initok,
true);
138 TEST(DecayDescriptorTest, KeywordDecaysGrammar)
142 bool initok = dd1.
init(
"B0:candidates -> K+:loose gamma:clean ...");
143 EXPECT_EQ(initok,
true);
153 initok = dd2.
init(
"B0:candidates -> K+:loose pi-:loose ?nu");
154 EXPECT_EQ(initok,
true);
164 initok = dd3.
init(
"B0:candidates -> K+:loose pi-:loose !nu");
165 EXPECT_EQ(initok,
true);
175 initok = dd4.
init(
"B0:candidates -> K+:loose pi-:loose ?gamma");
176 EXPECT_EQ(initok,
true);
186 initok = dd5.
init(
"B0:candidates -> K+:loose pi-:loose !gamma");
187 EXPECT_EQ(initok,
true);
197 initok = dd6.
init(
"B0:candidates -> e-:loose ... ?nu ?gamma");
198 EXPECT_EQ(initok,
true);
208 initok = dd7.
init(
"B0:candidates -> K+:loose pi-:loose ?addbrems");
209 EXPECT_EQ(initok,
true);
219 TEST(DecayDescriptorTest, UnspecifiedParticleGrammar)
223 bool initok = dd1.
init(
"@Xsd:candidates -> K+:loose pi-:loose");
224 EXPECT_EQ(initok,
true);
232 initok = dd2.
init(
"^@Xsd:candidates -> K+:loose pi-:loose");
233 EXPECT_EQ(initok,
true);
239 initok = dd3.
init(
"@^Xsd:candidates -> K+:loose pi-:loose");
240 EXPECT_EQ(initok,
true);
248 initok = dd4.
init(
"B0:Xsdee -> @Xsd e+:loose e-:loose");
249 EXPECT_EQ(initok,
true);
261 initok = dd5.
init(
"B0:Xsdee -> ^@Xsd e+:loose e-:loose");
262 EXPECT_EQ(initok,
true);
268 initok = dd6.
init(
"B0:Xsdee -> @^Xsd e+:loose e-:loose");
269 EXPECT_EQ(initok,
true);
276 TEST(DecayDescriptorTest, GrammarWithNestedDecay)
280 bool initok = dd1.
init(
"B0:candidates =direct=> [D-:pi =norad=> pi-:loose ... ?gamma] e+:loose ?nu ?addbrems");
281 EXPECT_EQ(initok,
true);
302 TEST(DecayDescriptorTest, SelectionParticles)
305 bool initok = dd1.
init(
"B0:B2Dzpipi -> [D0 -> ^K+:loose pi-:loose] pi+:loose pi-:loose");
306 EXPECT_EQ(initok,
true);
308 ASSERT_EQ(names.size(), 1);
309 EXPECT_EQ(names[0],
"B0_D0_K");
313 initok = dd1.
init(
"B0:B2Dzpipi -> [D0 -> K+:loose ^pi-:loose] pi+:loose pi-:loose");
314 EXPECT_EQ(initok,
true);
316 ASSERT_EQ(names.size(), 2);
317 EXPECT_EQ(names[0],
"B0_D0_K");
318 EXPECT_EQ(names[1],
"B0_D0_pi");
322 initok = dd2.
init(
"vpho:complex -> [D0 -> ^K+:loose pi-:loose] ^e+:loose ^e-:loose ^gamma:loose");
323 EXPECT_EQ(initok,
true);
325 ASSERT_EQ(names.size(), 4);
326 EXPECT_EQ(names[0],
"vpho_D0_K");
327 EXPECT_EQ(names[1],
"vpho_e0");
328 EXPECT_EQ(names[2],
"vpho_e1");
329 EXPECT_EQ(names[3],
"vpho_gamma");
332 TEST(DecayDescriptorTest, MisIDandDecayInFlightGrammar)
336 bool initok = dd1.
init(
"B0:sig -> (misID)K+:loose pi-:loose");
337 EXPECT_EQ(initok,
true);
352 initok = dd2.
init(
"B0:sig -> K+:loose (misID)pi-:loose");
353 EXPECT_EQ(initok,
true);
364 initok = dd3.
init(
"B0:sig -> (misID)K+:loose (misID)pi-:loose");
365 EXPECT_EQ(initok,
true);
377 initok = dd4.
init(
"B0:sig -> (decay)K+:loose pi-:loose");
378 EXPECT_EQ(initok,
true);
389 initok = dd5.
init(
"B0:sig -> K+:loose (decay)pi-:loose");
390 EXPECT_EQ(initok,
true);
401 initok = dd6.
init(
"B0:sig -> (decay)K+:loose (decay)pi-:loose");
402 EXPECT_EQ(initok,
true);
414 initok = dd7.
init(
"B0:sig -> (misID)(decay)K+:loose (decay)(misID)pi-:loose");
415 EXPECT_EQ(initok,
true);
430 initok = dd8.
init(
"B0:sig -> ^(misID)K+:loose (decay)@pi-:loose");
431 EXPECT_EQ(initok,
true);
446 initok = dd9.
init(
"B0:sig -> ^@(misID)(decay)K+:loose (decay)@^(misID)pi-:loose");
447 EXPECT_EQ(initok,
true);
463 TEST(DecayDescriptorTest, BadLabelTest)
467 bool initok = dd1.
init(
"B0:lab[el -> K+:loose pi-:loose");
468 EXPECT_EQ(initok,
false);
473 initok = dd2.
init(
"B0:lab^el -> K+:loose pi-:loose");
474 EXPECT_EQ(initok,
false);
479 initok = dd3.
init(
"B0:lab]el -> K+:loose pi-:loose");
480 EXPECT_EQ(initok,
false);
485 initok = dd4.
init(
"B0:lab>el -> K+:loose pi-:loose");
486 EXPECT_EQ(initok,
false);
491 initok = dd5.
init(
"B0:lab:el -> K+:loose pi-:loose");
492 EXPECT_EQ(initok,
false);
497 TEST(DecayDescriptorTest, UnicodeTest)
502 const std::string weird =
"β¨Οβ°=πΌπ°";
504 bool initok = dd1.
init(
"B0:" + weird +
" -> K+:π©π pi-:π―ππ¦");
505 ASSERT_EQ(initok,
true);
515 TEST(DecayDescriptorTest, BadGrammarTest)
518 bool initok = dd1.
init(
"B0:label ---> K+:loose pi-:loose");
519 EXPECT_EQ(initok,
false);
522 initok = dd2.
init(
"B0:label > K+:loose pi-:loose");
523 EXPECT_EQ(initok,
false);
526 initok = dd3.
init(
"B0:label -> K+::loose pi-:loose");
527 EXPECT_EQ(initok,
false);
530 initok = dd4.
init(
"B0:label K+:loose pi-:loose");
531 EXPECT_EQ(initok,
false);
534 initok = dd5.
init(
"B0:label <- K+:loose pi-:loose");
535 EXPECT_EQ(initok,
false);
538 initok = dd6.
init(
"B0:label => K+:loose pi-:loose");
539 EXPECT_EQ(initok,
false);
542 initok = dd7.
init(
"B0:label --> K+:loose pi-:loose");
543 EXPECT_EQ(initok,
false);
546 initok = dd8.
init(
"B0:label ==> K+:loose pi-:loose");
547 EXPECT_EQ(initok,
false);
550 TEST(DecayDescriptorTest, B2ParticleInterface)
555 particles.registerInDataStore();
559 TLorentzVector zeroes(0, 0, 0, 0);
565 D0->appendDaughter(0);
566 D0->appendDaughter(1);
574 bool initok = dd.
init(
"B0:B2Dzpipi -> [D0 -> K+:loose ^pi-:loose] ^pi+:loose pi-:loose");
575 ASSERT_EQ(initok,
true);
578 EXPECT_EQ(selectionparticles.size(), 2);
579 EXPECT_EQ(selectionparticles[0], pim1);
580 EXPECT_EQ(selectionparticles[1], pip);
594 TEST(DecayDescriptorTest, HierarchyDefinitionTest)
597 bool initok = dd.
init(
"B+ -> [ D+ -> ^K+ pi0 ] ^pi0");
598 EXPECT_EQ(initok,
true);
602 std::vector<std::vector<std::pair<int, std::string>>> expected_hierarchies;
603 std::vector<std::pair<int, std::string>> K_path;
604 std::vector<std::pair<int, std::string>> pi0_path;
606 K_path.emplace_back(0, std::string(
"B"));
607 K_path.emplace_back(0, std::string(
"D"));
608 K_path.emplace_back(0, std::string(
"K"));
610 pi0_path.emplace_back(0, std::string(
"B"));
611 pi0_path.emplace_back(1, std::string(
"pi0"));
613 EXPECT_NE(expected_hierarchies, selected_hierarchies);
614 expected_hierarchies.push_back(K_path);
615 expected_hierarchies.push_back(pi0_path);
616 EXPECT_EQ(expected_hierarchies, selected_hierarchies);