Page Menu
Home
HEPForge
Search
Configure Global Search
Log In
Files
F10881704
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
32 KB
Subscribers
None
View Options
diff --git a/t/test_classify_new.cc b/t/test_classify_new.cc
index 7a2e37d..47c8331 100644
--- a/t/test_classify_new.cc
+++ b/t/test_classify_new.cc
@@ -1,597 +1,600 @@
/**
* \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.};
// @TODO maybe it is a bit excessive to test _all_ (anti-) quarks
const std::array<std::string, 8> all_quarks{"-4","-3","-2","-1","1","2","3","4"};
const std::array<std::string, 9> all_partons{"g","-4","-3","-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) {
std::shuffle(begin(ev.incoming), end(ev.incoming), ran);
std::shuffle(begin(ev.outgoing), end(ev.outgoing), ran);
}
// if pos_boson = -1 (or not implemented) -> no boson
HEJ::Event::EventData get_process(int const njet, int const pos_boson){
HEJ::Event::EventData ev;
if(njet == 2){
switch(pos_boson){
case 0:
ev.outgoing.push_back({HEJ::ParticleID::higgs, { 198, 33, -170, 291}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, {-154, 68, 44, 174}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, { -44, -101, 88, 141}, {}});
ev.incoming[0] = {HEJ::ParticleID::gluon, { 0, 0, -322, 322}, {}};
ev.incoming[1] = {HEJ::ParticleID::gluon, { 0, 0, 284, 284}, {}};
return ev;
case 1:
ev.outgoing.push_back({HEJ::ParticleID::gluon, { -6, 82, -159, 179}, {}});
ev.outgoing.push_back({HEJ::ParticleID::higgs, { 195, -106, 74, 265}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, {-189, 24, 108, 219}, {}});
ev.incoming[0] = {HEJ::ParticleID::gluon, { 0, 0, -320, 320}, {}};
ev.incoming[1] = {HEJ::ParticleID::gluon, { 0, 0, 343, 343}, {}};
return ev;
case 2:
ev.outgoing.push_back({HEJ::ParticleID::gluon, { -80, -80, -140, 180}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, { -60, -32, 0, 68}, {}});
ev.outgoing.push_back({HEJ::ParticleID::higgs, { 140, 112, 177, 281}, {}});
ev.incoming[0] = {HEJ::ParticleID::gluon, { 0, 0, -246, 246}, {}};
ev.incoming[1] = {HEJ::ParticleID::gluon, { 0, 0, 283, 283}, {}};
return ev;
default:
ev.outgoing.push_back({HEJ::ParticleID::gluon, { -72, 24, 18, 78}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, { 72, -24, 74, 106}, {}});
ev.incoming[0] = {HEJ::ParticleID::gluon, { 0, 0, -46, 46}, {}};
ev.incoming[1] = {HEJ::ParticleID::gluon, { 0, 0, 138, 138}, {}};
return ev;
}
}
if(njet == 3){
switch(pos_boson){
case 0:
ev.outgoing.push_back({HEJ::ParticleID::higgs, { 152, -117, -88, 245}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, {-146, 62, -11, 159}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, { 126, -72, 96, 174}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, {-132, 127, 144, 233}, {}});
ev.incoming[0] = {HEJ::ParticleID::gluon, { 0, 0, -335, 335}, {}};
ev.incoming[1] = {HEJ::ParticleID::gluon, { 0, 0, 476, 476}, {}};
return ev;
case 1:
ev.outgoing.push_back({HEJ::ParticleID::gluon, {-191, 188, -128, 297}, {}});
ev.outgoing.push_back({HEJ::ParticleID::higgs, { 199, 72, -76, 257}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, { 184, -172, -8, 252}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, {-192, -88, 54, 218}, {}});
ev.incoming[0] = {HEJ::ParticleID::gluon, { 0, 0, -591, 591}, {}};
ev.incoming[1] = {HEJ::ParticleID::gluon, { 0, 0, 433, 433}, {}};
return ev;
case 2:
ev.outgoing.push_back({HEJ::ParticleID::gluon, { -42, 18, -49, 67}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, { -12, -54, -28, 62}, {}});
ev.outgoing.push_back({HEJ::ParticleID::higgs, { 99, 32, -16, 163}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, { -45, 4, 72, 85}, {}});
ev.incoming[0] = {HEJ::ParticleID::gluon, { 0, 0, -199, 199}, {}};
ev.incoming[1] = {HEJ::ParticleID::gluon, { 0, 0, 178, 178}, {}};
return ev;
case 3:
ev.outgoing.push_back({HEJ::ParticleID::gluon, { -65, -32, -76, 105}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, { -22, 31, -34, 51}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, { -12, -67, -36, 77}, {}});
ev.outgoing.push_back({HEJ::ParticleID::higgs, { 99, 68, -4, 173}, {}});
ev.incoming[0] = {HEJ::ParticleID::gluon, { 0, 0, -278, 278}, {}};
ev.incoming[1] = {HEJ::ParticleID::gluon, { 0, 0, 128, 128}, {}};
return ev;
default:
ev.outgoing.push_back({HEJ::ParticleID::gluon, { -90, -135, 30, 165}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, {-108, 198, 76, 238}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, { 198, -63, 126, 243}, {}});
ev.incoming[0] = {HEJ::ParticleID::gluon, { 0, 0, -207, 207}, {}};
ev.incoming[1] = {HEJ::ParticleID::gluon, { 0, 0, 439, 439}, {}};
return ev;
}
}
if(njet == 4){
switch(pos_boson){
case 0:
ev.outgoing.push_back({HEJ::ParticleID::higgs, { 199, 72, -76, 257}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, {-200, -155, -64, 261}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, { 198, 194, 57, 283}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, { 1, 32, 8, 33}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, {-198, -143, 186, 307}, {}});
ev.incoming[0] = {HEJ::ParticleID::gluon, { 0, 0, -515, 515}, {}};
ev.incoming[1] = {HEJ::ParticleID::gluon, { 0, 0, 626, 626}, {}};
return ev;
case 1:
ev.outgoing.push_back({HEJ::ParticleID::gluon, { 198, 61, -162, 263}, {}});
ev.outgoing.push_back({HEJ::ParticleID::higgs, { 199, 72, -76, 257}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, {-200, 135, 144, 281}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, {-198, -186, 171, 321}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, { 1, -82, 122, 147}, {}});
ev.incoming[0] = {HEJ::ParticleID::gluon, { 0, 0, -535, 535}, {}};
ev.incoming[1] = {HEJ::ParticleID::gluon, { 0, 0, 734, 734}, {}};
return ev;
case 2:
ev.outgoing.push_back({HEJ::ParticleID::gluon, {-180, -27, -164, 245}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, {-108, 78, -36, 138}, {}});
ev.outgoing.push_back({HEJ::ParticleID::higgs, { 196, -189, 68, 307}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, {-107, 136, 76, 189}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, { 199, 2, 178, 267}, {}});
ev.incoming[0] = {HEJ::ParticleID::gluon, { 0, 0, -512, 512}, {}};
ev.incoming[1] = {HEJ::ParticleID::gluon, { 0, 0, 634, 634}, {}};
return ev;
case 3:
ev.outgoing.push_back({HEJ::ParticleID::gluon, { -12, -30, -84, 90}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, { -72, 22, -96, 122}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, { 68, 0, -51, 85}, {}});
ev.outgoing.push_back({HEJ::ParticleID::higgs, { 64, 72, -81, 177}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, { -48, -64, 84, 116}, {}});
ev.incoming[0] = {HEJ::ParticleID::gluon, { 0, 0, -409, 409}, {}};
ev.incoming[1] = {HEJ::ParticleID::gluon, { 0, 0, 181, 181}, {}};
return ev;
case 4:
ev.outgoing.push_back({HEJ::ParticleID::gluon, { -72, -49, -72, 113}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, { -48, 0, -36, 60}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, { -12, 54, -36, 66}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, { 68, -77, -56, 117}, {}});
ev.outgoing.push_back({HEJ::ParticleID::higgs, { 64, 72, -81, 177}, {}});
ev.incoming[0] = {HEJ::ParticleID::gluon, { 0, 0, -407, 407}, {}};
ev.incoming[1] = {HEJ::ParticleID::gluon, { 0, 0, 126, 126}, {}};
return ev;
default:
ev.outgoing.push_back({HEJ::ParticleID::gluon, { 248, -56, -122, 282}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, { 249, 30, -10, 251}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, {-249, -18, 26, 251}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, {-248, 44, 199, 321}, {}});
ev.incoming[0] = {HEJ::ParticleID::gluon, { 0, 0, -506, 506}, {}};
ev.incoming[1] = {HEJ::ParticleID::gluon, { 0, 0, 599, 599}, {}};
return ev;
}
}
if(njet == 6){
switch(pos_boson){
case 0:
ev.outgoing.push_back({HEJ::ParticleID::higgs, { 349, 330, -94, 505}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, {-315, -300, 0, 435}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, { 347, 306, 18, 463}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, {-249, -342, 162, 453}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, { 345, 312, 284, 545}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, {-324, -126, 292, 454}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, {-153, -180, 304, 385}, {}});
ev.incoming[0] = {HEJ::ParticleID::gluon, { 0, 0, -1137, 1137}, {}};
ev.incoming[1] = {HEJ::ParticleID::gluon, { 0, 0, 2103, 2103}, {}};
return ev;
case 1:
ev.outgoing.push_back({HEJ::ParticleID::gluon, { 242, 241, -182, 387}, {}});
ev.outgoing.push_back({HEJ::ParticleID::higgs, { 243, 238, -190, 409}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, {-218, -215, -74, 315}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, {-224, -224, 112, 336}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, { 241, 182, 154, 339}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, { -53, -234, 126, 271}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, {-231, 12, 156, 279}, {}});
ev.incoming[0] = {HEJ::ParticleID::gluon, { 0, 0, -1117, 1117}, {}};
ev.incoming[1] = {HEJ::ParticleID::gluon, { 0, 0, 1219, 1219}, {}};
return ev;
case 2:
ev.outgoing.push_back({HEJ::ParticleID::gluon, { 151, 102, -42, 187}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, { -86, -46, -17, 99}, {}});
ev.outgoing.push_back({HEJ::ParticleID::higgs, { 152, 153, 0, 249}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, { -60, -135, 64, 161}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, { 150, 123, 110, 223}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, {-154, -49, 98, 189}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, {-153, -148, 144, 257}, {}});
ev.incoming[0] = {HEJ::ParticleID::gluon, { 0, 0, -504, 504}, {}};
ev.incoming[1] = {HEJ::ParticleID::gluon, { 0, 0, 861, 861}, {}};
return ev;
case 3:
ev.outgoing.push_back({HEJ::ParticleID::gluon, { 198, 197, -66, 287}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, {-198, -189, -54, 279}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, {-200, -64, 2, 210}, {}});
ev.outgoing.push_back({HEJ::ParticleID::higgs, { 199, 158, 6, 283}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, {-199, -184, 172, 321}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, { 196, 168, 177, 313}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, { 4, -86, 92, 126}, {}});
ev.incoming[0] = {HEJ::ParticleID::gluon, { 0, 0, -745, 745}, {}};
ev.incoming[1] = {HEJ::ParticleID::gluon, { 0, 0, 1074, 1074}, {}};
return ev;
case 4:
ev.outgoing.push_back({HEJ::ParticleID::gluon, { 151, 102, -42, 187}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, { -86, -133, -14, 159}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, {-154, -104, -8, 186}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, { -60, 11, 0, 61}, {}});
ev.outgoing.push_back({HEJ::ParticleID::higgs, { 152, 153, 0, 249}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, { 150, 125, 90, 215}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, {-153, -154, 126, 251}, {}});
ev.incoming[0] = {HEJ::ParticleID::gluon, { 0, 0, -578, 578}, {}};
ev.incoming[1] = {HEJ::ParticleID::gluon, { 0, 0, 730, 730}, {}};
return ev;
case 5:
ev.outgoing.push_back({HEJ::ParticleID::gluon, { -15, -90, -94, 131}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, { -11, 82, -74, 111}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, { 23, -80, -64, 105}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, { -48, -25, -36, 65}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, { -12, 99, -16, 101}, {}});
ev.outgoing.push_back({HEJ::ParticleID::higgs, { 68, 92, -18, 170}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, { -5, -78, 54, 95}, {}});
ev.incoming[0] = {HEJ::ParticleID::gluon, { 0, 0, -513, 513}, {}};
ev.incoming[1] = {HEJ::ParticleID::gluon, { 0, 0, 265, 265}, {}};
return ev;
case 6:
ev.outgoing.push_back({HEJ::ParticleID::gluon, { 198, 197, -66, 287}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, { 4, -84, -18, 86}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, {-198, -60, -36, 210}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, { 196, -78, -36, 214}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, {-200, 45, 0, 205}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, {-199, -178, 2, 267}, {}});
ev.outgoing.push_back({HEJ::ParticleID::higgs, { 199, 158, 6, 283}, {}});
ev.incoming[0] = {HEJ::ParticleID::gluon, { 0, 0, -850, 850}, {}};
ev.incoming[1] = {HEJ::ParticleID::gluon, { 0, 0, 702, 702}, {}};
return ev;
default:
ev.outgoing.push_back({HEJ::ParticleID::gluon, {-350, -112, -280, 462}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, { 347, 266, -322, 543}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, {-349, -314, -38, 471}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, { 349, 348, 12, 493}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, {-342, -54, 23, 347}, {}});
ev.outgoing.push_back({HEJ::ParticleID::gluon, { 345, -134, 138, 395}, {}});
ev.incoming[0] = {HEJ::ParticleID::gluon, { 0, 0, -1589, 1589}, {}};
ev.incoming[1] = {HEJ::ParticleID::gluon, { 0, 0, 1122, 1122}, {}};
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
HEJ::Event parse_configuration(
std::array<std::string,2> const & in, std::vector<std::string> const & out
){
auto boson = std::find_if(out.cbegin(), out.cend(),
[](std::string id){ return !HEJ::is_parton(HEJ::to_ParticleID(id)); });
int const pos_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==-1) || (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
){
HEJ::Event ev{parse_configuration(in,out)};
if(ev.type() != expected){
std::cerr << "Expected type " << HEJ::event_type::names[expected]
<< " but found " << HEJ::event_type::names[ev.type()] << "\n" << ev;
return false;
}
return true;
}
bool check_fkl(){
using namespace HEJ;
for(int njet=2; njet<=6; ++njet){ // all multiplicities
if(njet==5) continue;
for(std::string const & first: all_partons) // all quark flavours
for(std::string const & last: all_partons){
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
int 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;
}
}
}
return true;
}
bool check_uno(){
using namespace HEJ;
for(int njet=3; njet<=6; ++njet){ // all multiplicities >2
if(njet==5) continue;
for(std::string const & uno: all_quarks) // all quark flavours
for(std::string const & fkl: all_partons){
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;
HEJ::event_type::EventType expectation{ i?event_type::unob:event_type::unof };
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;
- // TODO uncomment "if" condition when AWZ allowed in uno
+ // @FIXME uncomment "if" condition when AWZ allowed in uno
// 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
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;
}
}
}
}
}
return true;
}
bool check_extremal_qqx(){
using namespace HEJ;
for(int njet=3; njet<=6; ++njet){ // all multiplicities >2
if(njet==5) continue;
for(std::string const & qqx: all_quarks) // all quark flavours
for(std::string const & fkl: all_partons){
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] = std::to_string(HEJ::to_ParticleID(qqx)*-1);
HEJ::event_type::EventType expectation{ i?event_type::qqxexb:event_type::qqxexf };
if( !match_expectation(expectation, base_in, base_out) )
return false;
for(auto const & boson: {"Wp","Wm"}) // only W
//! @FIXME the classification should also work for higgs!
for(int pos=0; pos<=njet; ++pos){ // at any position
auto in{base_in};
auto out{base_out};
// change quark flavours for W
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;
}
}
}
}
return true;
}
bool check_central_qqx(){
using namespace HEJ;
for(int njet=4; njet<=6; ++njet){ // all multiplicities >3
if(njet==5) continue;
for(std::string const & qqx: all_quarks) // all quark flavours
for(std::string const & fkl1: all_partons)
for(std::string const & fkl2: all_partons){
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] = std::to_string(HEJ::to_ParticleID(qqx)*-1);
if( !match_expectation(event_type::qqxmid, base_in, base_out) )
return false;
for(auto const & boson: {"Wp","Wm"}) // only W
//! @FIXME the classification should also work for higgs!
for(int pos=0; pos<=njet; ++pos){ // at any position
auto in{base_in};
auto out{base_out};
// change quark flavours for W
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(event_type::qqxmid, in, out))
return false;
}
}
}
}
return true;
}
// this checks a (non excessive) list of Non-HEJ states
bool check_non_HEJ(){
auto type{ HEJ::event_type::nonHEJ};
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"})
// 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"}) // @FIXME I'm not qqx
+ && 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"}) // @FIXME I'm not qqx
+ && 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"}) // @FIXME I'm not qqx
+ && 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
;
}
}
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-HEJ gives non-HEJ
if(!check_non_HEJ()) return EXIT_FAILURE;
//! @TODO missing:
//! bad final states
//! checks for partons sharing a jet
//! @TODO fix @FIXME
return EXIT_SUCCESS;
}
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Sat, May 3, 6:43 AM (1 d, 8 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
4971654
Default Alt Text
(32 KB)
Attached To
rHEJ HEJ
Event Timeline
Log In to Comment