diff --git a/FixedOrderGen/include/Utility.hh b/FixedOrderGen/include/Utility.hh new file mode 100644 index 0000000..9a4439e --- /dev/null +++ b/FixedOrderGen/include/Utility.hh @@ -0,0 +1,29 @@ +/** + * \authors The HEJ collaboration (see AUTHORS for details) + * \date 2022 + * \copyright GPLv2 or later + */ +#pragma once + +#include + +namespace HEJFOG { + class Process; + + bool vector_boson_can_couple_to( + HEJ::pid::ParticleID vector_boson, + HEJ::pid::ParticleID particle + ); + + bool parton_can_couple_to_W( + HEJ::Particle const & part, + HEJ::pid::ParticleID W_id + ); + + bool parton_can_couple_to_W( + HEJ::pid::ParticleID part, + HEJ::pid::ParticleID W_id + ); + + bool is_AWZ_process(Process const & proc); +} diff --git a/FixedOrderGen/src/Utility.cc b/FixedOrderGen/src/Utility.cc new file mode 100644 index 0000000..09a8975 --- /dev/null +++ b/FixedOrderGen/src/Utility.cc @@ -0,0 +1,71 @@ +#include "Utility.hh" + +#include +#include +#include +#include + +#include "Process.hh" + +namespace HEJFOG { + using HEJ::is_anyquark; + + namespace { + bool is_up_type(HEJ::pid::ParticleID const part) { + return HEJ::is_anyquark(part) && ((std::abs(part) % 2) == 0); + } + bool is_down_type(HEJ::pid::ParticleID const part){ + return HEJ::is_anyquark(part) && ((std::abs(part)%2) != 0); + } + } + + bool parton_can_couple_to_W( + HEJ::pid::ParticleID const part, HEJ::pid::ParticleID const W_id + ){ + const int W_charge = W_id>0?1:-1; + return std::abs(part) 0 && is_up_type(part)) + || (W_charge*part < 0 && is_down_type(part)) ); + } + + bool parton_can_couple_to_W( + HEJ::Particle const & part, HEJ::pid::ParticleID const W_id + ){ + return parton_can_couple_to_W(part.type, W_id); + } + + bool is_AWZ_process(Process const & proc){ + return proc.boson && HEJ::is_AWZ_boson(*proc.boson); + } + + bool vector_boson_can_couple_to( + HEJ::pid::ParticleID boson, + HEJ::pid::ParticleID particle + ) { + if(!HEJ::is_AWZ_boson(boson)) { + if(HEJ::is_AWZ_boson(particle)) { + std::swap(boson, particle); + } else { + throw std::invalid_argument{"One argument has to be a vector boson"}; + } + } + switch(particle){ + case HEJ::pid::proton: + case HEJ::pid::antiproton: + return true; + case HEJ::pid::gluon: + return false; + default: + if (!is_anyquark(particle)) { + throw HEJ::not_implemented{ + "Test if boson couples to " + name(particle) + }; + } + if(std::abs(boson) == HEJ::pid::ParticleID::Wp) { + return parton_can_couple_to_W(particle, boson); + } + assert(boson == HEJ::pid::Z_photon_mix); + return true; + } + } +} // namespace HEJFOG