diff --git a/t/test_classify.cc b/t/test_classify.cc index a482fa7..63abe64 100644 --- a/t/test_classify.cc +++ b/t/test_classify.cc @@ -1,933 +1,957 @@ /** * \authors The HEJ collaboration (see AUTHORS for details) * \date 2019 * \copyright GPLv2 or later */ #include <iostream> #include <random> #include "HEJ/Event.hh" #include "HEJ/exceptions.hh" #define ASSERT(x) if(!(x)) { \ throw std::logic_error("Assertion '" #x "' failed."); \ } namespace { const fastjet::JetDefinition jet_def{fastjet::JetAlgorithm::antikt_algorithm, 0.4}; const double min_jet_pt{30.}; const std::array<std::string, 6> all_quarks{"-4","-1","1","2","3","4"}; const std::array<std::string, 7> all_partons{"g","-2","-1","1","2","3","4"}; const std::array<std::string, 3> all_bosons{"h", "Wp", "Wm"}; static std::mt19937_64 ran{0}; void shuffle_particles(HEJ::Event::EventData & ev) { // incoming std::shuffle(begin(ev.incoming), end(ev.incoming), ran); // outgoing (through index) auto old_outgoing = std::move(ev.outgoing); std::vector<size_t> idx(old_outgoing.size()); std::iota(idx.begin(), idx.end(), 0); std::shuffle(begin(idx), end(idx), ran); ev.outgoing.clear(); ev.outgoing.reserve(old_outgoing.size()); for(size_t i: idx) { ev.outgoing.emplace_back(std::move(old_outgoing[i])); } // find decays again if(!ev.decays.empty()){ auto old_decays = std::move(ev.decays); ev.decays.clear(); for(size_t i=0; i<idx.size(); ++i) { auto decay = old_decays.find(idx[i]); if(decay != old_decays.end()) ev.decays.emplace(i, std::move(decay->second)); } } } // if pos_boson = -1 (or not implemented) -> no boson // njet==7 is special: has less jets, i.e. multiple parton in one jet, // pos_boson < 0 to select process (see list for details) HEJ::Event::EventData get_process(int const njet, int const pos_boson){ using namespace HEJ::pid; HEJ::Event::EventData ev; if(njet == 2){ switch(pos_boson){ case 0: ev.outgoing.push_back({higgs, { 198, 33, -170, 291}, {}}); ev.outgoing.push_back({gluon, {-154, 68, 44, 174}, {}}); ev.outgoing.push_back({gluon, { -44, -101, 88, 141}, {}}); ev.incoming[0] = {gluon, { 0, 0, -322, 322}, {}}; ev.incoming[1] = {gluon, { 0, 0, 284, 284}, {}}; return ev; case 1: ev.outgoing.push_back({gluon, { -6, 82, -159, 179}, {}}); ev.outgoing.push_back({higgs, { 195, -106, 74, 265}, {}}); ev.outgoing.push_back({gluon, {-189, 24, 108, 219}, {}}); ev.incoming[0] = {gluon, { 0, 0, -320, 320}, {}}; ev.incoming[1] = {gluon, { 0, 0, 343, 343}, {}}; return ev; case 2: ev.outgoing.push_back({gluon, { -80, -80, -140, 180}, {}}); ev.outgoing.push_back({gluon, { -60, -32, 0, 68}, {}}); ev.outgoing.push_back({higgs, { 140, 112, 177, 281}, {}}); ev.incoming[0] = {gluon, { 0, 0, -246, 246}, {}}; ev.incoming[1] = {gluon, { 0, 0, 283, 283}, {}}; return ev; default: ev.outgoing.push_back({gluon, { -72, 24, 18, 78}, {}}); ev.outgoing.push_back({gluon, { 72, -24, 74, 106}, {}}); ev.incoming[0] = {gluon, { 0, 0, -46, 46}, {}}; ev.incoming[1] = {gluon, { 0, 0, 138, 138}, {}}; return ev; } } if(njet == 3){ switch(pos_boson){ case 0: ev.outgoing.push_back({higgs, { 152, -117, -88, 245}, {}}); ev.outgoing.push_back({gluon, {-146, 62, -11, 159}, {}}); ev.outgoing.push_back({gluon, { 126, -72, 96, 174}, {}}); ev.outgoing.push_back({gluon, {-132, 127, 144, 233}, {}}); ev.incoming[0] = {gluon, { 0, 0, -335, 335}, {}}; ev.incoming[1] = {gluon, { 0, 0, 476, 476}, {}}; return ev; case 1: ev.outgoing.push_back({gluon, {-191, 188, -128, 297}, {}}); ev.outgoing.push_back({higgs, { 199, 72, -76, 257}, {}}); ev.outgoing.push_back({gluon, { 184, -172, -8, 252}, {}}); ev.outgoing.push_back({gluon, {-192, -88, 54, 218}, {}}); ev.incoming[0] = {gluon, { 0, 0, -591, 591}, {}}; ev.incoming[1] = {gluon, { 0, 0, 433, 433}, {}}; return ev; case 2: ev.outgoing.push_back({gluon, { -42, 18, -49, 67}, {}}); ev.outgoing.push_back({gluon, { -12, -54, -28, 62}, {}}); ev.outgoing.push_back({higgs, { 99, 32, -16, 163}, {}}); ev.outgoing.push_back({gluon, { -45, 4, 72, 85}, {}}); ev.incoming[0] = {gluon, { 0, 0, -199, 199}, {}}; ev.incoming[1] = {gluon, { 0, 0, 178, 178}, {}}; return ev; case 3: ev.outgoing.push_back({gluon, { -65, -32, -76, 105}, {}}); ev.outgoing.push_back({gluon, { -22, 31, -34, 51}, {}}); ev.outgoing.push_back({gluon, { -12, -67, -36, 77}, {}}); ev.outgoing.push_back({higgs, { 99, 68, -4, 173}, {}}); ev.incoming[0] = {gluon, { 0, 0, -278, 278}, {}}; ev.incoming[1] = {gluon, { 0, 0, 128, 128}, {}}; return ev; default: ev.outgoing.push_back({gluon, { -90, -135, 30, 165}, {}}); ev.outgoing.push_back({gluon, {-108, 198, 76, 238}, {}}); ev.outgoing.push_back({gluon, { 198, -63, 126, 243}, {}}); ev.incoming[0] = {gluon, { 0, 0, -207, 207}, {}}; ev.incoming[1] = {gluon, { 0, 0, 439, 439}, {}}; return ev; } } if(njet == 4){ switch(pos_boson){ case 0: ev.outgoing.push_back({higgs, { 199, 72, -76, 257}, {}}); ev.outgoing.push_back({gluon, {-200, -155, -64, 261}, {}}); ev.outgoing.push_back({gluon, { 198, 194, 57, 283}, {}}); ev.outgoing.push_back({gluon, { 1, 32, 8, 33}, {}}); ev.outgoing.push_back({gluon, {-198, -143, 186, 307}, {}}); ev.incoming[0] = {gluon, { 0, 0, -515, 515}, {}}; ev.incoming[1] = {gluon, { 0, 0, 626, 626}, {}}; return ev; case 1: ev.outgoing.push_back({gluon, { 198, 61, -162, 263}, {}}); ev.outgoing.push_back({higgs, { 199, 72, -76, 257}, {}}); ev.outgoing.push_back({gluon, {-200, 135, 144, 281}, {}}); ev.outgoing.push_back({gluon, {-198, -186, 171, 321}, {}}); ev.outgoing.push_back({gluon, { 1, -82, 122, 147}, {}}); ev.incoming[0] = {gluon, { 0, 0, -535, 535}, {}}; ev.incoming[1] = {gluon, { 0, 0, 734, 734}, {}}; return ev; case 2: ev.outgoing.push_back({gluon, {-180, -27, -164, 245}, {}}); ev.outgoing.push_back({gluon, {-108, 78, -36, 138}, {}}); ev.outgoing.push_back({higgs, { 196, -189, 68, 307}, {}}); ev.outgoing.push_back({gluon, {-107, 136, 76, 189}, {}}); ev.outgoing.push_back({gluon, { 199, 2, 178, 267}, {}}); ev.incoming[0] = {gluon, { 0, 0, -512, 512}, {}}; ev.incoming[1] = {gluon, { 0, 0, 634, 634}, {}}; return ev; case 3: ev.outgoing.push_back({gluon, { -12, -30, -84, 90}, {}}); ev.outgoing.push_back({gluon, { -72, 22, -96, 122}, {}}); ev.outgoing.push_back({gluon, { 68, 0, -51, 85}, {}}); ev.outgoing.push_back({higgs, { 64, 72, -81, 177}, {}}); ev.outgoing.push_back({gluon, { -48, -64, 84, 116}, {}}); ev.incoming[0] = {gluon, { 0, 0, -409, 409}, {}}; ev.incoming[1] = {gluon, { 0, 0, 181, 181}, {}}; return ev; case 4: ev.outgoing.push_back({gluon, { -72, -49, -72, 113}, {}}); ev.outgoing.push_back({gluon, { -48, 0, -36, 60}, {}}); ev.outgoing.push_back({gluon, { -12, 54, -36, 66}, {}}); ev.outgoing.push_back({gluon, { 68, -77, -56, 117}, {}}); ev.outgoing.push_back({higgs, { 64, 72, -81, 177}, {}}); ev.incoming[0] = {gluon, { 0, 0, -407, 407}, {}}; ev.incoming[1] = {gluon, { 0, 0, 126, 126}, {}}; return ev; default: ev.outgoing.push_back({gluon, { 248, -56, -122, 282}, {}}); ev.outgoing.push_back({gluon, { 249, 30, -10, 251}, {}}); ev.outgoing.push_back({gluon, {-249, -18, 26, 251}, {}}); ev.outgoing.push_back({gluon, {-248, 44, 199, 321}, {}}); ev.incoming[0] = {gluon, { 0, 0, -506, 506}, {}}; ev.incoming[1] = {gluon, { 0, 0, 599, 599}, {}}; return ev; } } if(njet == 6){ switch(pos_boson){ case 0: ev.outgoing.push_back({higgs, { 349, 330, -94, 505}, {}}); ev.outgoing.push_back({gluon, {-315, -300, 0, 435}, {}}); ev.outgoing.push_back({gluon, { 347, 306, 18, 463}, {}}); ev.outgoing.push_back({gluon, {-249, -342, 162, 453}, {}}); ev.outgoing.push_back({gluon, { 345, 312, 284, 545}, {}}); ev.outgoing.push_back({gluon, {-324, -126, 292, 454}, {}}); ev.outgoing.push_back({gluon, {-153, -180, 304, 385}, {}}); ev.incoming[0] = {gluon, { 0, 0, -1137, 1137}, {}}; ev.incoming[1] = {gluon, { 0, 0, 2103, 2103}, {}}; return ev; case 1: ev.outgoing.push_back({gluon, { 242, 241, -182, 387}, {}}); ev.outgoing.push_back({higgs, { 243, 238, -190, 409}, {}}); ev.outgoing.push_back({gluon, {-218, -215, -74, 315}, {}}); ev.outgoing.push_back({gluon, {-224, -224, 112, 336}, {}}); ev.outgoing.push_back({gluon, { 241, 182, 154, 339}, {}}); ev.outgoing.push_back({gluon, { -53, -234, 126, 271}, {}}); ev.outgoing.push_back({gluon, {-231, 12, 156, 279}, {}}); ev.incoming[0] = {gluon, { 0, 0, -1117, 1117}, {}}; ev.incoming[1] = {gluon, { 0, 0, 1219, 1219}, {}}; return ev; case 2: ev.outgoing.push_back({gluon, { 151, 102, -42, 187}, {}}); ev.outgoing.push_back({gluon, { -86, -46, -17, 99}, {}}); ev.outgoing.push_back({higgs, { 152, 153, 0, 249}, {}}); ev.outgoing.push_back({gluon, { -60, -135, 64, 161}, {}}); ev.outgoing.push_back({gluon, { 150, 123, 110, 223}, {}}); ev.outgoing.push_back({gluon, {-154, -49, 98, 189}, {}}); ev.outgoing.push_back({gluon, {-153, -148, 144, 257}, {}}); ev.incoming[0] = {gluon, { 0, 0, -504, 504}, {}}; ev.incoming[1] = {gluon, { 0, 0, 861, 861}, {}}; return ev; case 3: ev.outgoing.push_back({gluon, { 198, 197, -66, 287}, {}}); ev.outgoing.push_back({gluon, {-198, -189, -54, 279}, {}}); ev.outgoing.push_back({gluon, {-200, -64, 2, 210}, {}}); ev.outgoing.push_back({higgs, { 199, 158, 6, 283}, {}}); ev.outgoing.push_back({gluon, {-199, -184, 172, 321}, {}}); ev.outgoing.push_back({gluon, { 196, 168, 177, 313}, {}}); ev.outgoing.push_back({gluon, { 4, -86, 92, 126}, {}}); ev.incoming[0] = {gluon, { 0, 0, -745, 745}, {}}; ev.incoming[1] = {gluon, { 0, 0, 1074, 1074}, {}}; return ev; case 4: ev.outgoing.push_back({gluon, { 151, 102, -42, 187}, {}}); ev.outgoing.push_back({gluon, { -86, -133, -14, 159}, {}}); ev.outgoing.push_back({gluon, {-154, -104, -8, 186}, {}}); ev.outgoing.push_back({gluon, { -60, 11, 0, 61}, {}}); ev.outgoing.push_back({higgs, { 152, 153, 0, 249}, {}}); ev.outgoing.push_back({gluon, { 150, 125, 90, 215}, {}}); ev.outgoing.push_back({gluon, {-153, -154, 126, 251}, {}}); ev.incoming[0] = {gluon, { 0, 0, -578, 578}, {}}; ev.incoming[1] = {gluon, { 0, 0, 730, 730}, {}}; return ev; case 5: ev.outgoing.push_back({gluon, { -15, -90, -94, 131}, {}}); ev.outgoing.push_back({gluon, { -11, 82, -74, 111}, {}}); ev.outgoing.push_back({gluon, { 23, -80, -64, 105}, {}}); ev.outgoing.push_back({gluon, { -48, -25, -36, 65}, {}}); ev.outgoing.push_back({gluon, { -12, 99, -16, 101}, {}}); ev.outgoing.push_back({higgs, { 68, 92, -18, 170}, {}}); ev.outgoing.push_back({gluon, { -5, -78, 54, 95}, {}}); ev.incoming[0] = {gluon, { 0, 0, -513, 513}, {}}; ev.incoming[1] = {gluon, { 0, 0, 265, 265}, {}}; return ev; case 6: ev.outgoing.push_back({gluon, { 198, 197, -66, 287}, {}}); ev.outgoing.push_back({gluon, { 4, -84, -18, 86}, {}}); ev.outgoing.push_back({gluon, {-198, -60, -36, 210}, {}}); ev.outgoing.push_back({gluon, { 196, -78, -36, 214}, {}}); ev.outgoing.push_back({gluon, {-200, 45, 0, 205}, {}}); ev.outgoing.push_back({gluon, {-199, -178, 2, 267}, {}}); ev.outgoing.push_back({higgs, { 199, 158, 6, 283}, {}}); ev.incoming[0] = {gluon, { 0, 0, -850, 850}, {}}; ev.incoming[1] = {gluon, { 0, 0, 702, 702}, {}}; return ev; default: ev.outgoing.push_back({gluon, {-350, -112, -280, 462}, {}}); ev.outgoing.push_back({gluon, { 347, 266, -322, 543}, {}}); ev.outgoing.push_back({gluon, {-349, -314, -38, 471}, {}}); ev.outgoing.push_back({gluon, { 349, 348, 12, 493}, {}}); ev.outgoing.push_back({gluon, {-342, -54, 23, 347}, {}}); ev.outgoing.push_back({gluon, { 345, -134, 138, 395}, {}}); ev.incoming[0] = {gluon, { 0, 0, -1589, 1589}, {}}; ev.incoming[1] = {gluon, { 0, 0, 1122, 1122}, {}}; return ev; } } if(njet == 7){ switch(pos_boson){ case -1: // jet idx: -1 0 1 2 3 4 5 ev.outgoing.push_back({gluon, { -11, -18, -42, 47}, {}}); ev.outgoing.push_back({gluon, { -15, 26, -18, 35}, {}}); ev.outgoing.push_back({gluon, { 68, 87, -24, 113}, {}}); ev.outgoing.push_back({gluon, { 23, -54, -6, 59}, {}}); ev.outgoing.push_back({gluon, { -5, -44, 8, 45}, {}}); ev.outgoing.push_back({gluon, { -48, -96, 44, 116}, {}}); ev.outgoing.push_back({gluon, { -12, 99, 88, 133}, {}}); ev.incoming[0] = {gluon, { 0, 0, -249, 249}, {}}; ev.incoming[1] = {gluon, { 0, 0, 299, 299}, {}}; return ev; case -2: // jet idx: 0 1 2 3 4 -1 -1 ev.outgoing.push_back({gluon, { 23, -80, -64, 105}, {}}); ev.outgoing.push_back({gluon, { -5, -84, -12, 85}, {}}); ev.outgoing.push_back({gluon, { 68, 87, 24, 113}, {}}); ev.outgoing.push_back({gluon, { -12, 99, 88, 133}, {}}); ev.outgoing.push_back({gluon, { -48, -24, 62, 82}, {}}); ev.outgoing.push_back({gluon, { -11, -18, 42, 47}, {}}); ev.outgoing.push_back({gluon, { -15, 20, 60, 65}, {}}); ev.incoming[0] = {gluon, { 0, 0, -215, 215}, {}}; ev.incoming[1] = {gluon, { 0, 0, 415, 415}, {}}; return ev; case -3: // jet idx: 0 0 1 2 3 4 5 ev.outgoing.push_back({gluon, { -5, -86, -70, 111}, {}}); ev.outgoing.push_back({gluon, { -15, -52, -36, 65}, {}}); ev.outgoing.push_back({gluon, { -12, 99, -44, 109}, {}}); ev.outgoing.push_back({gluon, { -48, -60, 5, 77}, {}}); ev.outgoing.push_back({gluon, { -11, 92, 8, 93}, {}}); ev.outgoing.push_back({gluon, { 68, 87, 24, 113}, {}}); ev.outgoing.push_back({gluon, { 23, -80, 64, 105}, {}}); ev.incoming[0] = {gluon, { 0, 0, -361, 361}, {}}; ev.incoming[1] = {gluon, { 0, 0, 312, 312}, {}}; return ev; case -4: // jet idx: 0 1 2 3 4 5 5 ev.outgoing.push_back({gluon, { -5, -40, -56, 69}, {}}); ev.outgoing.push_back({gluon, { -12, 99, -88, 133}, {}}); ev.outgoing.push_back({gluon, { 23, -84, -72, 113}, {}}); ev.outgoing.push_back({gluon, { -11, 92, 8, 93}, {}}); ev.outgoing.push_back({gluon, { 68, 87, 24, 113}, {}}); ev.outgoing.push_back({gluon, { -15, -58, 30, 67}, {}}); ev.outgoing.push_back({gluon, { -48, -96, 96, 144}, {}}); ev.incoming[0] = {gluon, { 0, 0, -395, 395}, {}}; ev.incoming[1] = {gluon, { 0, 0, 337, 337}, {}}; return ev; case -5: // jet idx: 0 1 -1 -1 2 3 4 ev.outgoing.push_back({gluon, { 23, -64, -80, 105}, {}}); ev.outgoing.push_back({gluon, { -12, 99, -16, 101}, {}}); ev.outgoing.push_back({gluon, { -15, 20, 0, 25}, {}}); ev.outgoing.push_back({gluon, { -11, -10, 2, 15}, {}}); ev.outgoing.push_back({gluon, { 68, 87, 24, 113}, {}}); ev.outgoing.push_back({gluon, { -48, -72, 54, 102}, {}}); ev.outgoing.push_back({gluon, { -5, -60, 48, 77}, {}}); ev.incoming[0] = {gluon, { 0, 0, -253, 253}, {}}; ev.incoming[1] = {gluon, { 0, 0, 285, 285}, {}}; return ev; case -6: // jet idx: 0 0 0 1 2 2 3 ev.outgoing.push_back({gluon, { -5, -60, -48, 77}, {}}); ev.outgoing.push_back({gluon, { -15, -52, -36, 65}, {}}); ev.outgoing.push_back({gluon, { -48, -96, -58, 122}, {}}); ev.outgoing.push_back({gluon, { 68, 87, -24, 113}, {}}); ev.outgoing.push_back({gluon, { -12, 99, -16, 101}, {}}); ev.outgoing.push_back({gluon, { -11, 92, 8, 93}, {}}); ev.outgoing.push_back({gluon, { 23, -70, 14, 75}, {}}); ev.incoming[0] = {gluon, { 0, 0, -403, 403}, {}}; ev.incoming[1] = {gluon, { 0, 0, 243, 243}, {}}; return ev; case -7: // jet idx: 0 1 1 2 2 3 4 ev.outgoing.push_back({gluon, { 23, -46, -46, 69}, {}}); ev.outgoing.push_back({gluon, { -15, -90, -70, 115}, {}}); ev.outgoing.push_back({gluon, { -5, -78, -54, 95}, {}}); ev.outgoing.push_back({gluon, { -11, 88, -28, 93}, {}}); ev.outgoing.push_back({gluon, { -12, 99, -16, 101}, {}}); ev.outgoing.push_back({gluon, { -48, -60, 5, 77}, {}}); ev.outgoing.push_back({gluon, { 68, 87, 24, 113}, {}}); ev.incoming[0] = {gluon, { 0, 0, -424, 424}, {}}; ev.incoming[1] = {gluon, { 0, 0, 239, 239}, {}}; return ev; case -8: // jet idx: 0 1 2 2 2 3 4 ev.outgoing.push_back({gluon, { 23, -84, -84, 121}, {}}); ev.outgoing.push_back({gluon, { -11, 92, -8, 93}, {}}); ev.outgoing.push_back({gluon, { -15, -36, 0, 39}, {}}); ev.outgoing.push_back({gluon, { -5, -62, 10, 63}, {}}); ev.outgoing.push_back({gluon, { -48, -96, 19, 109}, {}}); ev.outgoing.push_back({gluon, { 68, 87, 24, 113}, {}}); ev.outgoing.push_back({gluon, { -12, 99, 88, 133}, {}}); ev.incoming[0] = {gluon, { 0, 0, -311, 311}, {}}; ev.incoming[1] = {gluon, { 0, 0, 360, 360}, {}}; return ev; case -9: // jet idx: 0 1 2 1 3 0 4 ev.outgoing.push_back({gluon, { -12, 99, -44, 109}, {}}); ev.outgoing.push_back({gluon, { -48, -80, -30, 98}, {}}); ev.outgoing.push_back({gluon, { 68, 87, -24, 113}, {}}); ev.outgoing.push_back({gluon, { -15, -90, -18, 93}, {}}); ev.outgoing.push_back({gluon, { 23, -70, -14, 75}, {}}); ev.outgoing.push_back({gluon, { -11, 92, -8, 93}, {}}); ev.outgoing.push_back({gluon, { -5, -38, 50, 63}, {}}); ev.incoming[0] = {gluon, { 0, 0, -366, 366}, {}}; ev.incoming[1] = {gluon, { 0, 0, 278, 278}, {}}; return ev; case -10: // jet idx: 0 1 3 2 4 3 1 ev.outgoing.push_back({gluon, { 23, -80, -64, 105}, {}}); ev.outgoing.push_back({gluon, { -12, 99, -44, 109}, {}}); ev.outgoing.push_back({gluon, { -15, -60, -20, 65}, {}}); ev.outgoing.push_back({gluon, { -48, -54, -16, 74}, {}}); ev.outgoing.push_back({gluon, { 68, 87, -24, 113}, {}}); ev.outgoing.push_back({gluon, { -5, -84, -12, 85}, {}}); ev.outgoing.push_back({gluon, { -11, 92, -8, 93}, {}}); ev.incoming[0] = {gluon, { 0, 0, -416, 416}, {}}; ev.incoming[1] = {gluon, { 0, 0, 228, 228}, {}}; return ev; case -11: // jet idx: 0 1 2 3 3 4 2 ev.outgoing.push_back({gluon, { -48, -56, -48, 88}, {}}); ev.outgoing.push_back({gluon, { 68, 87, -24, 113}, {}}); ev.outgoing.push_back({gluon, { -5, -62, -10, 63}, {}}); ev.outgoing.push_back({gluon, { -11, 92, 8, 93}, {}}); ev.outgoing.push_back({gluon, { -12, 99, 16, 101}, {}}); ev.outgoing.push_back({gluon, { 23, -70, 14, 75}, {}}); ev.outgoing.push_back({gluon, { -15, -90, 18, 93}, {}}); ev.incoming[0] = {gluon, { 0, 0, -326, 326}, {}}; ev.incoming[1] = {gluon, { 0, 0, 300, 300}, {}}; return ev; case -12: // jet idx: 0 1 0 2 3 4 5 ev.outgoing.push_back({gluon, { -15, -58, -30, 67}, {}}); ev.outgoing.push_back({gluon, { 68, 87, -24, 113}, {}}); ev.outgoing.push_back({gluon, { -48, -96, -19, 109}, {}}); ev.outgoing.push_back({gluon, { 23, -54, -6, 59}, {}}); ev.outgoing.push_back({gluon, { -11, 92, -8, 93}, {}}); ev.outgoing.push_back({gluon, { -12, 99, 88, 133}, {}}); ev.outgoing.push_back({gluon, { -5, -70, 86, 111}, {}}); ev.incoming[0] = {gluon, { 0, 0, -299, 299}, {}}; ev.incoming[1] = {gluon, { 0, 0, 386, 386}, {}}; return ev; case -13: // jet idx: 0 1 2 2 2 3 0 ev.outgoing.push_back({gluon, { -11, 88, -28, 93}, {}}); ev.outgoing.push_back({gluon, { 68, 87, -24, 113}, {}}); ev.outgoing.push_back({gluon, { -48, -84, -21, 99}, {}}); ev.outgoing.push_back({gluon, { -15, -90, -18, 93}, {}}); ev.outgoing.push_back({gluon, { -5, -30, -6, 31}, {}}); ev.outgoing.push_back({gluon, { 23, -70, -14, 75}, {}}); ev.outgoing.push_back({gluon, { -12, 99, -16, 101}, {}}); ev.incoming[0] = {gluon, { 0, 0, -366, 366}, {}}; ev.incoming[1] = {gluon, { 0, 0, 239, 239}, {}}; return ev; } } throw HEJ::unknown_option{"unkown process"}; } bool couple_quark(std::string const & boson, std::string & quark){ if(abs(HEJ::to_ParticleID(boson)) == HEJ::ParticleID::Wp){ auto qflav{ HEJ::to_ParticleID(quark) }; if(!HEJ::is_anyquark(qflav)) return false; const int W_charge = HEJ::to_ParticleID(boson)>0?1:-1; if(W_charge*qflav < 0 && !(abs(qflav)%2)) return false; // not anti-down if(W_charge*qflav > 0 && (abs(qflav)%2)) return false; // not up quark=std::to_string(qflav-W_charge); } return true; } // create event corresponding from given Configuration // overwrite_boson to force a specific boson position, indepentent from input // (useful for njet == 7) HEJ::Event parse_configuration( std::array<std::string,2> const & in, std::vector<std::string> const & out, int const overwrite_boson = 0 ){ auto boson = std::find_if(out.cbegin(), out.cend(), [](std::string id){ return !HEJ::is_parton(HEJ::to_ParticleID(id)); }); int const pos_boson = (overwrite_boson!=0)?overwrite_boson: ((boson == out.cend())?-1:std::distance(out.cbegin(), boson)); size_t njets = out.size(); if(boson != out.cend()) --njets; HEJ::Event::EventData ev{get_process(njets, pos_boson)}; ASSERT((pos_boson<0) || (ev.outgoing[pos_boson].type == HEJ::ParticleID::higgs)); for(size_t i=0; i<out.size(); ++i){ ev.outgoing[i].type = HEJ::to_ParticleID(out[i]); } for(size_t i=0; i<in.size(); ++i){ ev.incoming[i].type = HEJ::to_ParticleID(in[i]); } shuffle_particles(ev); return ev.cluster(jet_def, min_jet_pt); } bool match_expectation( HEJ::event_type::EventType expected, std::array<std::string,2> const & in, std::vector<std::string> const & out, int const overwrite_boson = 0 ){ HEJ::Event ev{parse_configuration(in,out,overwrite_boson)}; if(ev.type() != expected){ std::cerr << "Expected type " << HEJ::event_type::name(expected) << " but found " << HEJ::event_type::name(ev.type()) << "\n" << ev; auto jet_idx{ ev.particle_jet_indices(ev.jets()) }; std::cout << "Particle Jet indices: "; for(int const i: jet_idx) std::cout << i << " "; std::cout << std::endl; return false; } return true; } bool check_fkl(){ using namespace HEJ; for(std::string const & first: all_partons) // all quark flavours for(std::string const & last: all_partons){ for(int njet=2; njet<=6; ++njet){ // all multiplicities if(njet==5) continue; std::array<std::string,2> base_in{first,last}; std::vector<std::string> base_out(njet, "g"); base_out.front() = first; base_out.back() = last; if(!match_expectation(event_type::FKL, base_in, base_out)) return false; for(auto const & boson: all_bosons) // any boson for(int pos=0; pos<=njet; ++pos){ // at any position auto in{base_in}; auto out{base_out}; // change quark flavours for W const bool couple_idx = std::uniform_int_distribution<int>{0,1}(ran); if(!couple_quark(boson, couple_idx?out.back():out.front())) continue; out.insert(out.begin()+pos, boson); if(!match_expectation(event_type::FKL, in, out)) return false; } } for(int i=-3; i>-13;--i){ // extremal parton inside jet std::array<std::string,2> base_in{first,last}; std::vector<std::string> base_out(7, "g"); base_out.front() = first; base_out.back() = last; if(!match_expectation(event_type::FKL, base_in, base_out, i)) return false; } } return true; } bool check_uno(){ using namespace HEJ; auto const b{ event_type::unob }; auto const f{ event_type::unof }; for(std::string const & uno: all_quarks) // all quark flavours for(std::string const & fkl: all_partons){ for(int njet=3; njet<=6; ++njet){ // all multiplicities >2 if(njet==5) continue; for(int i=0; i<2; ++i){ // forward & backwards std::array<std::string,2> base_in; std::vector<std::string> base_out(njet, "g"); const int uno_pos = i?1:(njet-2); const int fkl_pos = i?(njet-1):0; base_in[i?0:1] = uno; base_in[i?1:0] = fkl; base_out[uno_pos] = uno; base_out[fkl_pos] = fkl; auto expectation{ i?b:f }; if( !match_expectation(expectation, base_in, base_out) ) return false; for(auto const & boson: all_bosons){ // any boson // at any position (higgs only inside FKL chain) int start = 0; int end = njet; if(to_ParticleID(boson) == pid::higgs){ start = i?(uno_pos+1):fkl_pos; end = i?(fkl_pos+1):uno_pos; } for(int pos=start; pos<=end; ++pos){ auto in{base_in}; auto out{base_out}; // change quark flavours for W const bool couple_idx = std::uniform_int_distribution<int>{0,1}(ran); if(!couple_quark(boson, couple_idx?out[fkl_pos]:out[uno_pos])) continue; out.insert(out.begin()+pos, boson); if(!match_expectation(expectation, in, out)) return false; } } } } // test allowed jet configurations if(!(match_expectation(f,{fkl,uno},{fkl,"g","g","g","g",uno,"g"}, -3) && match_expectation(b,{uno,fkl},{"g",uno,"g","g","g","g",fkl}, -4) && match_expectation(f,{fkl,uno},{fkl,"g","g","g","g",uno,"g"}, -5) && match_expectation(b,{uno,fkl},{"g",uno,"g","g","g","g",fkl}, -5) && match_expectation(f,{fkl,uno},{fkl,"g","g","g","g",uno,"g"}, -6) && match_expectation(f,{fkl,uno},{fkl,"g","g","g","g",uno,"g"}, -7) && match_expectation(b,{uno,fkl},{"g",uno,"g","g","g","g",fkl}, -7) && match_expectation(f,{fkl,uno},{fkl,"g","g","g","g",uno,"g"}, -8) && match_expectation(b,{uno,fkl},{"g",uno,"g","g","g","g",fkl}, -8) && match_expectation(b,{uno,fkl},{"g",uno,"g","g","g","g",fkl}, -9) && match_expectation(f,{fkl,uno},{fkl,"g","g","g","g",uno,"g"}, -10) && match_expectation(f,{fkl,uno},{fkl,"g","g","g","g",uno,"g"}, -11) && match_expectation(b,{uno,fkl},{"g",uno,"g","g","g","g",fkl}, -11) && match_expectation(f,{fkl,uno},{fkl,"g","g","g","g",uno,"g"}, -12) && match_expectation(b,{uno,fkl},{"g",uno,"g","g","g","g",fkl}, -12) )) return false; } return true; } bool check_extremal_qqx(){ using namespace HEJ; auto const b{ event_type::qqxexb }; auto const f{ event_type::qqxexf }; for(std::string const & qqx: all_quarks) // all quark flavours for(std::string const & fkl: all_partons){ std::string const qqx2{ std::to_string(HEJ::to_ParticleID(qqx)*-1) }; for(int njet=3; njet<=6; ++njet){ // all multiplicities >2 if(njet==5) continue; for(int i=0; i<2; ++i){ // forward & backwards std::array<std::string,2> base_in; std::vector<std::string> base_out(njet, "g"); const int qqx_pos = i?0:(njet-2); const int fkl_pos = i?(njet-1):0; base_in[i?0:1] = "g"; base_in[i?1:0] = fkl; base_out[fkl_pos] = fkl; base_out[qqx_pos] = qqx; base_out[qqx_pos+1] = qqx2; auto expectation{ i?b:f }; if( !match_expectation(expectation, base_in, base_out) ) return false; for(auto const & boson: all_bosons){ // any boson // at any position (higgs only inside FKL chain) int start = 0; int end = njet; if(to_ParticleID(boson) == pid::higgs){ start = i?(qqx_pos+2):fkl_pos; end = i?(fkl_pos+1):qqx_pos; } for(int pos=start; pos<=end; ++pos){ auto in{base_in}; auto out{base_out}; // change quark flavours for W const bool couple_idx = std::uniform_int_distribution<int>{0,1}(ran); if(couple_idx || !couple_quark(boson, out[fkl_pos]) ){ // (randomly) try couple to FKL, else fall-back to qqx if(!couple_quark(boson, out[qqx_pos])) couple_quark(boson, out[qqx_pos+1]); } out.insert(out.begin()+pos, boson); if(!match_expectation(expectation, in, out)) return false; } } } } // test allowed jet configurations if(!(match_expectation(f,{fkl,"g"},{fkl,"g","g","g","g",qqx,qqx2}, -3) && match_expectation(b,{"g",fkl},{qqx,qqx2,"g","g","g","g",fkl}, -4) && match_expectation(f,{fkl,"g"},{fkl,"g","g","g","g",qqx,qqx2}, -5) && match_expectation(b,{"g",fkl},{qqx,qqx2,"g","g","g","g",fkl}, -5) && match_expectation(f,{fkl,"g"},{fkl,"g","g","g","g",qqx,qqx2}, -6) && match_expectation(f,{fkl,"g"},{fkl,"g","g","g","g",qqx,qqx2}, -7) && match_expectation(b,{"g",fkl},{qqx,qqx2,"g","g","g","g",fkl}, -7) && match_expectation(f,{fkl,"g"},{fkl,"g","g","g","g",qqx,qqx2}, -8) && match_expectation(b,{"g",fkl},{qqx,qqx2,"g","g","g","g",fkl}, -8) && match_expectation(b,{"g",fkl},{qqx,qqx2,"g","g","g","g",fkl}, -9) && match_expectation(f,{fkl,"g"},{fkl,"g","g","g","g",qqx,qqx2}, -10) && match_expectation(f,{fkl,"g"},{fkl,"g","g","g","g",qqx,qqx2}, -11) && match_expectation(b,{"g",fkl},{qqx,qqx2,"g","g","g","g",fkl}, -11) && match_expectation(f,{fkl,"g"},{fkl,"g","g","g","g",qqx,qqx2}, -12) && match_expectation(b,{"g",fkl},{qqx,qqx2,"g","g","g","g",fkl}, -12) )) return false; } return true; } bool check_central_qqx(){ using namespace HEJ; auto const t{ event_type::qqxmid }; for(std::string const & qqx: all_quarks) // all quark flavours for(std::string const & fkl1: all_partons) for(std::string const & fkl2: all_partons){ std::string const qqx2{ std::to_string(HEJ::to_ParticleID(qqx)*-1) }; for(int njet=4; njet<=6; ++njet){ // all multiplicities >3 if(njet==5) continue; for(int qqx_pos=1; qqx_pos<njet-2; ++qqx_pos){ // any qqx position std::array<std::string,2> base_in; std::vector<std::string> base_out(njet, "g"); base_in[0] = fkl1; base_in[1] = fkl2; base_out.front() = fkl1; base_out.back() = fkl2; base_out[qqx_pos] = qqx; base_out[qqx_pos+1] = qqx2; if( !match_expectation(t, base_in, base_out) ) return false; for(auto const & boson: all_bosons) // any boson for(int pos=0; pos<=njet; ++pos){ // at any position if( to_ParticleID(boson) == pid::higgs && (pos==qqx_pos || pos==qqx_pos+1) ) continue; auto in{base_in}; auto out{base_out}; // change quark flavours for W const int couple_idx{ std::uniform_int_distribution<int>{0,2}(ran) }; // (randomly) try couple to FKL, else fall-back to qqx if( couple_idx == 0 && couple_quark(boson, out.front()) ){} else if( couple_idx == 1 && couple_quark(boson, out.back()) ){} else { if(!couple_quark(boson, out[qqx_pos])) couple_quark(boson, out[qqx_pos+1]); } out.insert(out.begin()+pos, boson); if(!match_expectation(t, in, out)) return false; } } } // test allowed jet configurations (non exhaustive collection) if(!(match_expectation(t,{fkl1,fkl2},{fkl1,"g",qqx,qqx2,"g","g",fkl2}, -3) && match_expectation(t,{fkl1,fkl2},{fkl1,"g","g",qqx,qqx2,"g",fkl2}, -3) && match_expectation(t,{fkl1,fkl2},{fkl1,"g","g",qqx,qqx2,"g",fkl2}, -4) && match_expectation(t,{fkl1,fkl2},{fkl1,qqx,qqx2,"g","g","g",fkl2}, -4) && match_expectation(t,{fkl1,fkl2},{fkl1,"g","g","g",qqx,qqx2,fkl2}, -5) && match_expectation(t,{fkl1,fkl2},{fkl1,"g","g",qqx,qqx2,"g",fkl2}, -6) && match_expectation(t,{fkl1,fkl2},{fkl1,"g",qqx,qqx2,"g","g",fkl2}, -7) && match_expectation(t,{fkl1,fkl2},{fkl1,"g","g","g",qqx,qqx2,fkl2}, -7) && match_expectation(t,{fkl1,fkl2},{fkl1,qqx,qqx2,"g","g","g",fkl2}, -8) && match_expectation(t,{fkl1,fkl2},{fkl1,"g","g","g",qqx,qqx2,fkl2}, -8) && match_expectation(t,{fkl1,fkl2},{fkl1,qqx,qqx2,"g","g","g",fkl2}, -9) && match_expectation(t,{fkl1,fkl2},{fkl1,"g",qqx,qqx2,"g","g",fkl2}, -9) && match_expectation(t,{fkl1,fkl2},{fkl1,"g","g",qqx,qqx2,"g",fkl2}, -10) && match_expectation(t,{fkl1,fkl2},{fkl1,"g","g","g",qqx,qqx2,fkl2}, -10) && match_expectation(t,{fkl1,fkl2},{fkl1,"g","g","g",qqx,qqx2,fkl2}, -11) && match_expectation(t,{fkl1,fkl2},{fkl1,"g","g",qqx,qqx2,"g",fkl2}, -12) && match_expectation(t,{fkl1,fkl2},{fkl1,"g","g","g",qqx,qqx2,fkl2}, -12) )) return false; } return true; } // this checks a (non excessive) list of non-resummable states bool check_non_resummable(){ auto type{ HEJ::event_type::non_resummable}; return // 2j - crossing lines match_expectation(type, {"g","2"}, {"2","g"}) && match_expectation(type, {"-1","g"}, {"g","-1"}) && match_expectation(type, {"1","-1"}, {"-1","1"}) && match_expectation(type, {"g","2"}, {"2","g","h"}) && match_expectation(type, {"1","2"}, {"2","h","1"}) && match_expectation(type, {"1","-1"}, {"h","-1","1"}) && match_expectation(type, {"g","2"}, {"Wp","1","g"}) && match_expectation(type, {"1","-1"}, {"-2","Wp","1"}) && match_expectation(type, {"4","g"}, {"g","3","Wp"}) && match_expectation(type, {"1","-2"}, {"-1","Wm","1"}) && match_expectation(type, {"g","3"}, {"4","g","Wm"}) && match_expectation(type, {"1","3"}, {"Wm","4","1"}) // 2j - qqx && match_expectation(type, {"g","g"}, {"1","-1"}) && match_expectation(type, {"g","g"}, {"-2","2","h"}) && match_expectation(type, {"g","g"}, {"-4","Wp","3"}) && match_expectation(type, {"g","g"}, {"Wm","-1","2"}) // 3j - crossing lines && match_expectation(type, {"g","4"}, {"4","g","g"}) && match_expectation(type, {"-1","g"}, {"g","g","-1"}) && match_expectation(type, {"1","3"}, {"3","g","1"}) && match_expectation(type, {"-2","2"}, {"2","g","-2","h"}) && match_expectation(type, {"-3","g"}, {"g","g","Wp","-4"}) && match_expectation(type, {"1","-2"}, {"Wm","-1","g","1"}) && match_expectation(type, {"-1","g"}, {"1","-1","-1"}) // higgs inside uno && match_expectation(type, {"-1","g"}, {"g","h","-1","g"}) && match_expectation(type, {"-1","1"}, {"g","h","-1","1"}) && match_expectation(type, {"g","2"}, {"g","2","h","g"}) && match_expectation(type, {"-1","1"}, {"-1","1","h","g"}) // higgs outside uno && match_expectation(type, {"-1","g"}, {"h","g","-1","g"}) && match_expectation(type, {"-1","1"}, {"-1","1","g","h"}) // higgs inside qqx && match_expectation(type, {"g","g"}, {"-1","h","1","g","g"}) && match_expectation(type, {"g","g"}, {"g","-1","h","1","g"}) && match_expectation(type, {"g","g"}, {"g","g","2","h","-2"}) // higgs outside qqx && match_expectation(type, {"g","g"}, {"h","-1","1","g","g"}) && match_expectation(type, {"g","g"}, {"g","g","2","-2","h"}) // 4j - two uno && match_expectation(type, {"-2","2"}, {"g","-2","2","g"}) && match_expectation(type, {"1","3"}, {"g","1","h","3","g"}) && match_expectation(type, {"1","2"}, {"g","1","3","Wp","g"}) && match_expectation(type, {"1","-2"}, {"g","Wm","1","-1","g"}) // 4j - two gluon outside && match_expectation(type, {"g","4"}, {"g","4","g","g"}) && match_expectation(type, {"1","3"}, {"1","3","h","g","g"}) && match_expectation(type, {"1","2"}, {"1","3","g","Wp","g"}) && match_expectation(type, {"1","-2"}, {"1","Wm","-1","g","g"}) && match_expectation(type, {"-1","g"}, {"g","g","-1","g"}) && match_expectation(type, {"1","3"}, {"g","g","1","3","h"}) && match_expectation(type, {"1","2"}, {"g","g","1","Wp","3"}) && match_expectation(type, {"1","-2"}, {"Wm","g","g","1","-1"}) // 4j - ggx+uno && match_expectation(type, {"g","4"}, {"1","-1","4","g"}) && match_expectation(type, {"2","g"}, {"g","2","-3","3"}) && match_expectation(type, {"g","4"}, {"1","-1","h","4","g"}) && match_expectation(type, {"2","g"}, {"g","2","-3","3","h"}) && match_expectation(type, {"g","4"}, {"Wp","1","-1","3","g"}) && match_expectation(type, {"2","g"}, {"g","2","-4","Wp","3"}) && match_expectation(type, {"g","4"}, {"2","Wm","-1","4","g"}) && match_expectation(type, {"2","g"}, {"g","2","Wp","-3","4"}) // 3j - crossing+uno && match_expectation(type, {"1","4"}, {"g","4","1"}) && match_expectation(type, {"1","4"}, {"4","1","g"}) && match_expectation(type, {"1","4"}, {"g","h","4","1"}) && match_expectation(type, {"-1","-3"},{"Wm","g","-4","-1"}) && match_expectation(type, {"1","4"}, {"3","1","Wp","g"}) && match_expectation(type, {"1","4"}, {"3","1","g","h"}) // 3j - crossing+qqx && match_expectation(type, {"1","g"}, {"-1","1","g","1"}) && match_expectation(type, {"1","g"}, {"-1","1","1","g"}) && match_expectation(type, {"g","1"}, {"1","g","1","-1"}) && match_expectation(type, {"g","1"}, {"g","1","1","-1"}) && match_expectation(type, {"1","g"}, {"2","-2","g","1"}) && match_expectation(type, {"1","g"}, {"2","-2","1","g"}) && match_expectation(type, {"g","1"}, {"1","g","-2","2"}) && match_expectation(type, {"g","1"}, {"g","1","-2","2"}) && match_expectation(type, {"1","g"}, {"-1","1","h","g","1"}) && match_expectation(type, {"1","g"}, {"-1","h","1","1","g"}) && match_expectation(type, {"g","1"}, {"1","g","1","h","-1"}) && match_expectation(type, {"g","1"}, {"h","g","1","1","-1"}) && match_expectation(type, {"1","g"}, {"2","-2","1","g","h"}) && match_expectation(type, {"g","1"}, {"g","h","1","-2","2"}) && match_expectation(type, {"1","g"}, {"Wp","3","-4","g","1"}) && match_expectation(type, {"3","g"}, {"-2","Wm","1","3","g"}) && match_expectation(type, {"g","1"}, {"1","g","Wm","-3","4"}) && match_expectation(type, {"g","-3"}, {"g","-3","-1","Wp","2"}) // 4j- gluon in qqx && match_expectation(type, {"g","1"}, {"1","g","-1","1"}) && match_expectation(type, {"1","g"}, {"1","-1","g","1"}) && match_expectation(type, {"g","1"}, {"1","g","Wm","-2","1"}) && match_expectation(type, {"2","g"}, {"2","-2","g","Wp","1"}) && match_expectation(type, {"g","g"}, {"Wp","3","g","-4","g"}) && match_expectation(type, {"1","g"}, {"1","h","-1","g","1"}) // 6j - two qqx && match_expectation(type, {"g","g"}, {"1","-1","g","g","1","-1"}) && match_expectation(type, {"g","g"}, {"1","-1","g","1","-1","g"}) && match_expectation(type, {"g","g"}, {"g","1","-1","g","1","-1"}) && match_expectation(type, {"g","g"}, {"g","1","-1","1","-1","g"}) && match_expectation(type, {"g","g"}, {"g","1","1","-1","-1","g"}) && match_expectation(type, {"g","g"}, {"h","1","-1","g","g","1","-1"}) && match_expectation(type, {"g","g"}, {"1","Wp","-2","g","1","-1","g"}) && match_expectation(type, {"g","g"}, {"g","1","Wp","-1","g","1","-2"}) && match_expectation(type, {"g","g"}, {"g","1","-1","Wm","2","-1","g"}) && match_expectation(type, {"g","g"}, {"g","1","2","-1","Wm","-1","g"}) // random stuff (can be non-physical) && match_expectation(type, {"g","g"}, {"1","-2","2","-1"}) // != 2 qqx && match_expectation(type, {"g","g"}, {"1","-2","2","g"}) // could be qqx && match_expectation(type, {"e+","e-"},{"1","-1"}) // bad initial state && match_expectation(type, {"1","e-"}, {"g","1","Wm"}) // bad initial state && match_expectation(type, {"h","g"}, {"g","g"}) // bad initial state && match_expectation(type, {"-1","g"}, {"-1","1","1"}) // bad qqx && match_expectation(type, {"-1","g"}, {"1","1","-1"}) // crossing in bad qqx && match_expectation(type, {"-1","g"}, {"-2","1","1","Wp"}) // bad qqx && match_expectation(type, {"1","2"}, {"1","-1","g","g","g","2"}) // bad qqx && match_expectation(type, {"1","2"}, {"1","-1","-2","g","g","2"}) // gluon in bad qqx && match_expectation(type, {"g","g"}, {"-1","2","g","g"}) // wrong back qqx && match_expectation(type, {"g","g"}, {"g","g","2","1"}) // wrong forward qqx && match_expectation(type, {"g","g"}, {"g","-2","1","g"}) // wrong central qqx ; } // Events failing the jet requirements, e.g. qqx inside one jet //! @FIXME they are currently allowed //! TODO qqx currently not allow for pure jet -> need W for qqx bool check_illegal_jets(){ auto type{ HEJ::event_type::non_resummable}; return true // uno backward not in jet && match_expectation(type, {"1","g"}, {"g","1","g","g","g","g","g"}, -1) // & also legal uno on other side && match_expectation(type, {"1","1"}, {"g","1","g","g","g","1","g"}, -1) // qqx backward not in jet && match_expectation(type, {"g","2"}, {"-1","1","g","g","g","g","2"}, -1) // uno forward not in jet && match_expectation(type, {"3","3"}, {"3","g","g","g","g","3","g"}, -2) // qqx backward not in jet && match_expectation(type, {"g","g"}, {"g","g","g","g","g","-2","2"}, -2) // uno backward in same jet && match_expectation(type, {"1","g"}, {"g","1","g","g","g","g","g"}, -3) // & also legal uno on other side && match_expectation(type, {"1","1"}, {"g","1","g","g","g","1","g"}, -3) // qqx backward in same jet && match_expectation(type, {"g","2"}, {"-4","4","g","g","g","g","2"}, -3) // uno forward in same jet && match_expectation(type, {"3","2"}, {"3","g","g","g","g","2","g"}, -4) // qqx backward in same jet && match_expectation(type, {"g","g"}, {"g","g","g","g","g","-2","2"}, -4) // central qqx not in jet && match_expectation(type, {"1","2"}, {"1","g","-1","1","g","g","2"}, -5) // central qqx in same jet && match_expectation(type, {"1","2"}, {"1","-1","1","g","g","g","2"}, -6) // central qqx in same jet && match_expectation(type, {"1","2"}, {"1","g","g","g","2","-2","2"}, -6) // central qqx in same jet && match_expectation(type, {"1","2"}, {"1","-1","1","g","g","g","2"}, -7) // central qqx in same jet && match_expectation(type, {"1","2"}, {"1","g","g","3","-3","g","2"}, -7) // central qqx in same jet && match_expectation(type, {"g","3"}, {"g","g","-2","2","g","g","3"}, -8) // central qqx in same jet && match_expectation(type, {"g","-2"}, {"g","g","g","2","-2","g","-2"}, -8) // FKL not in own jet && match_expectation(type, {"1","1"}, {"1","g","g","g","g","g","1"}, -1) && match_expectation(type, {"g","g"}, {"g","g","g","g","g","g","g"}, -2) && match_expectation(type, {"1","-3"}, {"1","g","g","g","g","-3","g"}, -1) && match_expectation(type, {"2","g"}, {"g","2","g","g","g","g","g"}, -2) && match_expectation(type, {"2","g"}, {"2","g","g","g","g","2","-2"}, -1) && match_expectation(type, {"g","-2"}, {"4","-4","g","g","g","g","-2"}, -2) && match_expectation(type, {"-1","g"}, {"-1","1","-1","g","g","g","g"}, -1) && match_expectation(type, {"4","-3"}, {"4","g","g","1","-1","g","-3"}, -2) + // FKL in same jet + && match_expectation(type, {"1","1"}, {"1","g","g","g","g","g","1"}, -13) + // uno in same jet as FKL + && match_expectation(type, {"-1","1"}, {"-1","g","g","g","g","1","g"}, -9) + && match_expectation(type, {"-1","1"}, {"g","-1","g","g","g","g","1"}, -10) + && match_expectation(type, {"-1","1"}, {"-1","g","g","g","g","1","g"}, -13) + && match_expectation(type, {"-1","1"}, {"g","-1","g","g","g","g","1"}, -13) + // extremal qqx in same jet as FKL + && match_expectation(type, {"-1","g"}, {"-1","g","g","g","g","1","-1"}, -9) + && match_expectation(type, {"g","1"}, {"1","-1","g","g","g","g","1"}, -10) + && match_expectation(type, {"-1","g"}, {"-1","g","g","g","g","-1","1"}, -13) + && match_expectation(type, {"g","g"}, {"g","g","g","g","g","-1","1"}, -13) + // central qqx in same jet as FKL + && match_expectation(type,{"2","2"}, {"2","-2","2","g","g","g","2"}, -3) + && match_expectation(type,{"-1","g"}, {"-1","g","g","g","2","-2","g"}, -4) + && match_expectation(type,{"g","4"}, {"g","g","-4","4","g","g","4"}, -6) + && match_expectation(type,{"g","g"}, {"g","3","-3","g","g","g","g"}, -6) + && match_expectation(type,{"g","1"}, {"g","g","g","g","-2","2","1"}, -9) + && match_expectation(type,{"g","g"}, {"g","1","-1","g","g","g","g"}, -10) + && match_expectation(type,{"g","1"}, {"g","g","-2","2","g","g","1"}, -11) + && match_expectation(type,{"g","1"}, {"g","-2","2","g","g","g","1"}, -11) + && match_expectation(type,{"3","2"}, {"3","g","-1","1","g","g","2"}, -12) + && match_expectation(type,{"3","-2"}, {"3","-1","1","g","g","g","-2"}, -12) + && match_expectation(type,{"3","-2"}, {"3","-1","1","g","g","g","-2"}, -13) ; } // Two boson states, that are currently not implemented bool check_bad_FS(){ auto type{ HEJ::event_type::bad_final_state}; return match_expectation(type, {"g","g"}, {"g","h","h","g"}) && match_expectation(type, {"g","g"}, {"h","g","h","g"}) && match_expectation(type, {"g","-1"}, {"g","h","Wp","-2"}) && match_expectation(type, {"-3","-1"},{"-4","g","Wp","Wp","-2"}) && match_expectation(type, {"-4","-1"},{"-3","Wp","g","Wm","-2"}) && match_expectation(type, {"-4","-1"},{"g","-3","Wp","Wm","-2"}) ; } } int main() { // tests for "no false negatives" // i.e. all HEJ-configurations get classified correctly if(!check_fkl()) return EXIT_FAILURE; if(!check_uno()) return EXIT_FAILURE; if(!check_extremal_qqx()) return EXIT_FAILURE; if(!check_central_qqx()) return EXIT_FAILURE; // test for "no false positive" // i.e. non-resummable gives non-resummable if(!check_non_resummable()) return EXIT_FAILURE; if(!check_illegal_jets()) return EXIT_FAILURE; if(!check_bad_FS()) return EXIT_FAILURE; //! @TODO missing: //! checks for partons sharing a jet return EXIT_SUCCESS; }