diff --git a/FixedOrderGen/t/CMakeLists.txt b/FixedOrderGen/t/CMakeLists.txt index 8307199..aea83cd 100644 --- a/FixedOrderGen/t/CMakeLists.txt +++ b/FixedOrderGen/t/CMakeLists.txt @@ -1,72 +1,93 @@ set(tst_dir "${CMAKE_CURRENT_SOURCE_DIR}") foreach(tst W_reconstruct_enu W_2j_classify W_nj_classify) add_executable(test_${tst} ${tst_dir}/${tst}.cc) target_link_libraries(test_${tst} hejfog_lib) add_test(NAME ${tst} COMMAND test_${tst} WORKING_DIRECTORY ${tst_dir}) endforeach() # this only tests if the runcard actually works, not if the result is correct add_test( NAME main_2j COMMAND HEJFOG ${tst_dir}/config_2j.yml ) add_test( NAME main_h2j COMMAND HEJFOG ${tst_dir}/config_h2j.yml ) add_test( NAME main_h2j_decay COMMAND HEJFOG ${tst_dir}/config_h2j_decay.yml ) add_test( NAME peakpt COMMAND HEJFOG ${tst_dir}/config_2j_peak.yml ) # check that uno emission doesn't change FKL xs add_executable(FKL_uno FKL_uno.cc) target_link_libraries(FKL_uno hejfog_lib) add_test( NAME FKL_uno # calculated with HEJ revision 9570e3809613272ac4b8bf3236279ba23cf64d20 COMMAND FKL_uno ${tst_dir}/config_h3j_uno.yml 0.0243548 0.000119862 ) # xs tests add_executable(xs_gen xs_gen.cc) target_link_libraries(xs_gen hejfog_lib) ## Higgs add_test( NAME xs_h2j # calculated with HEJ revision 9570e3809613272ac4b8bf3236279ba23cf64d20 COMMAND xs_gen ${tst_dir}/config_h2j.yml 2.04928 0.00956022 ) add_test( NAME xs_h3j # calculated with HEJ revision bd4388fe55cbc3f5a7b6139096456c551294aa31 COMMAND xs_gen ${tst_dir}/config_h3j.yml 1.07807 0.0132409 ) add_test( NAME xs_h5j # calculated with HEJ revision dbde2ffbb3b383ae6709b2424d8f0f9d5658270b COMMAND xs_gen ${tst_dir}/config_h5j.yml 0.0112504 0.000199633 ) add_test( NAME xs_h3j_uno # calculated with HEJ revision 9570e3809613272ac4b8bf3236279ba23cf64d20 COMMAND xs_gen ${tst_dir}/config_h3j_uno.yml 0.00347538 3.85875e-05 ) add_test( NAME xs_h2j_decay # calculated with HEJ revision 9570e3809613272ac4b8bf3236279ba23cf64d20 COMMAND xs_gen ${tst_dir}/config_h2j_decay.yml 0.00466994 2.20995e-05 ) ## pure jets add_test( NAME xs_2j # calculated with "combined" HEJ svn r3480 COMMAND xs_gen ${tst_dir}/config_2j.yml 86.42031848e06 590570 ) add_test( NAME xs_4j # calculated with HEJ revision 13207b5f67a5f40a2141aa7ee515b022bd4efb65 COMMAND xs_gen ${tst_dir}/config_4j.yml 915072 15402.4 ) +## W +add_test( + NAME xs_W2j + # calculated with HEJ revision 987bb30a7985a24a7961f98cfbbc74d3a7992970 + COMMAND xs_gen ${tst_dir}/config_Wm2j.yml 231.404 3.43798 +) +add_test( + NAME xs_W3j_uno + # calculated with HEJ revision 987bb30a7985a24a7961f98cfbbc74d3a7992970 + COMMAND xs_gen ${tst_dir}/config_Wp3j_uno.yml 0.139372 0.00248345 +) +add_test( + NAME xs_W3j_eqqx + # calculated with HEJ revision 987bb30a7985a24a7961f98cfbbc74d3a7992970 + COMMAND xs_gen ${tst_dir}/config_Wp3j_qqx.yml 8.45323 0.103449 +) +add_test( + NAME xs_W5j_qqx + # calculated with HEJ revision 987bb30a7985a24a7961f98cfbbc74d3a7992970 + COMMAND xs_gen ${tst_dir}/config_Wp4j_qqx.yml 0.0851908 0.00300447 +) diff --git a/FixedOrderGen/t/config_Wm2j.yml b/FixedOrderGen/t/config_Wm2j.yml new file mode 100644 index 0000000..b31fe82 --- /dev/null +++ b/FixedOrderGen/t/config_Wm2j.yml @@ -0,0 +1,40 @@ +events: 200000 + +jets: + min pt: 30 + R: 0.4 + algorithm: antikt + max rapidity: 5 + +beam: + energy: 10000 + particles: [p, p] + +pdf: 11000 + +process: p p => 2j e- electron_antineutrino + +subleading fraction: 0 +subleading channels: none + +scales: 91 + +random generator: + name: mixmax + +particle properties: + Higgs: + mass: 125 + width: 0 + W: + mass: 80.385 + width: 2.085 + Z: + mass: 91.187 + width: 2.495 + +vev: 246.2196508 + +unweight: + sample size: 100 + max deviation: -10 diff --git a/FixedOrderGen/t/config_Wp3j_qqx.yml b/FixedOrderGen/t/config_Wp3j_qqx.yml new file mode 100644 index 0000000..8b7dfe1 --- /dev/null +++ b/FixedOrderGen/t/config_Wp3j_qqx.yml @@ -0,0 +1,40 @@ +events: 1000000 + +jets: + min pt: 20 + R: 0.4 + algorithm: antikt + max rapidity: 5 + +beam: + energy: 5000 + particles: [p, p] + +pdf: 11000 + +process: u u => W+ 3j + +subleading fraction: 1. +subleading channels: + - qqx + +scales: 125 + +particle properties: + Higgs: + mass: 125 + width: 0 + W: + mass: 80.385 + width: 2.085 + Z: + mass: 91.187 + width: 2.495 + +decays: + Wp: {into: [e+, nu_e], branching ratio: 1} + +random generator: + name: mixmax + +vev: 246.2196508 diff --git a/FixedOrderGen/t/config_Wp3j_uno.yml b/FixedOrderGen/t/config_Wp3j_uno.yml new file mode 100644 index 0000000..9b39135 --- /dev/null +++ b/FixedOrderGen/t/config_Wp3j_uno.yml @@ -0,0 +1,40 @@ +events: 2000000 + +jets: + min pt: 100 + R: 0.5 + algorithm: antikt + max rapidity: 5 + +beam: + energy: 8000 + particles: [p, p] + +pdf: 11000 + +process: u u => W+ 3j + +subleading fraction: 1. +subleading channels: + - unordered + +scales: 125 + +particle properties: + Higgs: + mass: 125 + width: 0 + W: + mass: 80.385 + width: 2.085 + Z: + mass: 91.187 + width: 2.495 + +decays: + Wp: {into: [e+, nu_e], branching ratio: 1} + +random generator: + name: mixmax + +vev: 246.2196508 diff --git a/FixedOrderGen/t/config_Wp4j_qqx.yml b/FixedOrderGen/t/config_Wp4j_qqx.yml new file mode 100644 index 0000000..66a842d --- /dev/null +++ b/FixedOrderGen/t/config_Wp4j_qqx.yml @@ -0,0 +1,40 @@ +events: 1000000 + +jets: + min pt: 40 + R: 0.4 + algorithm: antikt + max rapidity: 6 + +beam: + energy: 6000 + particles: [p, p] + +pdf: 11000 + +process: u u => W+ 4j + +subleading fraction: 1. +subleading channels: + - qqx + +scales: 125 + +particle properties: + Higgs: + mass: 125 + width: 0 + W: + mass: 80.385 + width: 2.085 + Z: + mass: 91.187 + width: 2.495 + +decays: + Wp: {into: [e+, nu_e], branching ratio: 1} + +random generator: + name: mixmax + +vev: 246.2196508 diff --git a/FixedOrderGen/t/xs_gen.cc b/FixedOrderGen/t/xs_gen.cc index 9a04a0a..31f0661 100644 --- a/FixedOrderGen/t/xs_gen.cc +++ b/FixedOrderGen/t/xs_gen.cc @@ -1,107 +1,114 @@ /** * \authors The HEJ collaboration (see AUTHORS for details) * \date 2020 * \copyright GPLv2 or later */ #include <algorithm> #include <cmath> #include <cstdlib> #include <iostream> #include <memory> #include "HEJ/Event.hh" #include "HEJ/Mixmax.hh" #include "HEJ/PDG_codes.hh" #include "HEJ/ScaleFunction.hh" #include "HEJ/utility.hh" #include "config.hh" #include "EventGenerator.hh" #include "Status.hh" //! throw error if condition not fulfilled #define ASSERT(x) if(!(x)) { \ throw std::logic_error("Assertion '" #x "' failed."); \ } namespace { constexpr double invGeV2_to_pb = 389379292.; } int main(int argn, char const *argv[]){ using namespace HEJFOG; if(argn != 4){ std::cerr << "Usage: " << argv[0] << " config.yml xs xs_err"; return EXIT_FAILURE; } const double xs_ref = std::stod(argv[2]); const double err_ref = std::stod(argv[3]); const auto config = load_config(argv[1]); std::shared_ptr<HEJ::RNG> ran{std::make_shared<HEJ::Mixmax>()}; HEJFOG::EventGenerator generator{ config.process, config.beam, HEJ::ScaleGenerator{ config.scales.base, config.scales.factors, config.scales.max_ratio }, config.jets, config.pdf_id, config.subleading_fraction, config.subleading_channels, config.particle_decays, config.Higgs_coupling, config.ew_parameters, ran }; double xs = 0., xs_err = 0.; for (std::size_t trials = 0; trials < config.events; ++trials){ auto ev = generator.gen_event(); if(generator.status() != good) continue; ASSERT(ev); if(config.process.boson){ const auto boson = std::find_if( begin(ev->outgoing()), end(ev->outgoing()), [&](HEJ::Particle const & p){ return p.type == *config.process.boson; } ); ASSERT(boson != end(ev->outgoing())); if(!config.process.boson_decay.empty()){ ASSERT(ev->decays().size() == 1); const auto decay = ev->decays().begin(); ASSERT(ev->outgoing().size() > decay->first); ASSERT(decay->first == static_cast<std::size_t>( std::distance(ev->outgoing().begin(), boson))); ASSERT(decay->second.size() == 2); auto const & decay_part = decay->second; ASSERT(decay_part[0].type == config.process.boson_decay[0]); ASSERT(decay_part[1].type == config.process.boson_decay[1]); ASSERT(HEJ::nearby_ep(decay_part[0].p + decay_part[1].p, boson->p, 1e-6)); } } xs += ev->central().weight; xs_err += ev->central().weight*ev->central().weight; } xs_err = std::sqrt(xs_err); xs *= invGeV2_to_pb/config.events; xs_err *= invGeV2_to_pb/config.events; std::cout << xs_ref << " +- " << err_ref << " (" << err_ref/xs_ref*100. << "%)" << " ~ " << xs << " +- " << xs_err << " (" << xs_err/xs*100. << "%)" << std::endl; std::cout << "=> " << std::abs(xs - xs_ref)/sqrt(xs_err*xs_err+err_ref*err_ref) << " sigma" << std::endl; ASSERT(std::abs(xs - xs_ref) < 2.*sqrt(xs_err*xs_err+err_ref*err_ref)); ASSERT(std::abs(err_ref - xs_err) < 0.1*xs_err); - ASSERT(xs_err < 0.02*xs); + // TODO performance of W+jets is really bad, trying to get under 5% is too + // slow + if(config.process.boson + && std::abs(*config.process.boson) == HEJ::ParticleID::Wp){ + ASSERT(xs_err < 0.04*xs); + } else { + ASSERT(xs_err < 0.02*xs); + } return EXIT_SUCCESS; }