cepgen is hosted by Hepforge, IPPP Durham
CepGen 1.2.5
Central exclusive processes event generator
Loading...
Searching...
No Matches
PPtoWW.cpp
Go to the documentation of this file.
1/*
2 * CepGen: a central exclusive processes event generator
3 * Copyright (C) 2019-2024 Laurent Forthomme
4 * 2017-2019 Wolfgang Schaefer
5 * 2019 Marta Luszczak
6 *
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 */
20
21#include <cassert>
22
24#include "CepGen/Event/Event.h"
28#include "CepGen/Physics/PDG.h"
31
32using namespace cepgen;
33using namespace std::complex_literals;
34
38public:
39 explicit PPtoWW(const ParametersList& params)
40 : FactorisedProcess(params, {+(spdgid_t)PDG::W, -(spdgid_t)PDG::W}),
41 mW_(PDG::get().mass(PDG::W)),
42 mW2_(mW_ * mW_),
43 method_(steer<int>("method")),
44 ampl_(params_),
45 pol_(steer<ParametersList>("polarisationStates")) {
46 CG_DEBUG("PPtoWW") << "matrix element computation method: " << method_ << ", "
47 << "polarisation states: "
48 << "W1=" << pol_.polarisations().first << ", "
49 << "W2=" << pol_.polarisations().second << ".";
50
51 if (method_ == 1) {
52 CG_INFO("PPtoWW") << "Nachtmann amplitudes (model: " << ampl_.mode() << ") initialised.";
53 if (ampl_.mode() != NachtmannAmplitudes::Mode::SM) {
54 if (ampl_.mode() != NachtmannAmplitudes::Mode::W && ampl_.mode() != NachtmannAmplitudes::Mode::Wbar)
55 throw CG_FATAL("PPtoWW") << "Invalid EFT extension enabled for γγ → W⁺W¯! "
56 << "Only supported extensions are W and Wbar. Specified model: " << ampl_.mode()
57 << ".";
58 CG_INFO("PPtoWW") << "EFT extension enabled. Parameters: " << steer<ParametersList>("eftParameters") << ".";
59 }
60 }
61 }
62
63 proc::ProcessPtr clone() const override { return proc::ProcessPtr(new PPtoWW(*this)); }
64
66 auto desc = FactorisedProcess::description();
67 desc.setDescription("γγ → W⁺W¯");
68 desc.add<bool>("ktFactorised", true);
69 desc.add<int>("method", 1)
70 .setDescription("Matrix element computation method")
71 .allow(0, "on-shell")
72 .allow(1, "off-shell by Nachtmann et al.");
73 desc.add<ParametersDescription>("polarisationStates", PolarisationState::description());
75 return desc;
76 }
77
78private:
79 void prepareFactorisedPhaseSpace() override {
80 cuts::Central single_w_cuts(ParametersList{});
81 if (kinematics().cuts().central_particles.count(PDG::W) > 0)
82 single_w_cuts = kinematics().cuts().central_particles.at(PDG::W);
83 psgen_->setCentralCuts(single_w_cuts);
84 }
85 double computeFactorisedMatrixElement() override {
86 CG_DEBUG_LOOP("PPtoWW:ME") << "matrix element mode: " << method_ << ".";
87 switch (method_) {
88 case 0:
89 return onShellME();
90 case 1:
91 return offShellME();
92 default:
93 throw CG_FATAL("PPtoWW:ME") << "Invalid ME calculation method (" << method_ << ")!";
94 }
95 }
96 enum class Polarisation { full = 0, LL = 1, LT = 2, TL = 3, TT = 4 };
97
98 double onShellME() const {
99 // On-shell matrix element
100 // references:
101 // Phys.Rev.D 51 (1995) 4738
102 // JHEP 02 (2015) 098
103 const double s_hat = shat(), t_hat = that(), u_hat = uhat();
104
105 const double term1 = 2. * s_hat * (2. * s_hat + 3. * mW2_) / (3. * (mW2_ - t_hat) * (mW2_ - u_hat));
106 const double term2 = 2. * s_hat * s_hat * (s_hat * s_hat + 3. * mW2_ * mW2_) /
107 (3. * std::pow(mW2_ - t_hat, 2) * std::pow(mW2_ - u_hat, 2));
108
109 return 6. * constants::G_EM_SQ * constants::G_EM_SQ * (1. - term1 + term2) / s_hat / s_hat;
110 }
111 double offShellME() const {
112 const auto kin = NachtmannAmplitudes::Kinematics(mW2_, shat(), that(), uhat());
113 const double p1 = q1().px() * q2().px() + q1().py() * q2().py(), p2 = q1().px() * q2().py() - q1().py() * q2().px(),
114 p3 = q1().px() * q2().px() - q1().py() * q2().py(), p4 = q1().px() * q2().py() + q1().py() * q2().px();
115
116 double hel_mat_elem{0.};
117 // compute ME for each W helicity
118 for (const auto& lam3 : pol_.polarisations().first)
119 for (const auto& lam4 : pol_.polarisations().second) {
120 // compute all photon helicity amplitudes
121 const auto pp = ampl_(kin, +1, +1, lam3, lam4), mm = ampl_(kin, -1, -1, lam3, lam4),
122 pm = ampl_(kin, +1, -1, lam3, lam4), mp = ampl_(kin, -1, +1, lam3, lam4);
123 // add ME for this W helicity to total ME
124 hel_mat_elem += std::norm(p1 * (pp + mm) - 1i * p2 * (pp - mm) - p3 * (pm + mp) - 1i * p4 * (pm - mp));
125 }
126 return hel_mat_elem * std::pow(0.5 / q1().pt() / q2().pt() / shat(), 2);
127 }
128
129 const double mW_, mW2_;
130 const int method_;
131 const NachtmannAmplitudes ampl_;
132 const PolarisationState pol_;
133};
134// register process
#define CG_FATAL(mod)
Definition Exception.h:61
#define CG_DEBUG_LOOP(mod)
Definition Message.h:224
#define CG_DEBUG(mod)
Definition Message.h:220
#define CG_INFO(mod)
Definition Message.h:216
#define REGISTER_PROCESS(name, obj)
Add a generic process definition to the list of handled processes.
Compute the matrix element for a CE process using -factorization approach.
Definition PPtoWW.cpp:37
proc::ProcessPtr clone() const override
Copy all process attributes into a new object.
Definition PPtoWW.cpp:63
static ParametersDescription description()
Definition PPtoWW.cpp:65
PPtoWW(const ParametersList &params)
Definition PPtoWW.cpp:39
CutsList & cuts()
Phase space cuts.
Definition Kinematics.h:41
double px() const
Momentum along the -axis (in GeV)
Definition Momentum.h:112
double py() const
Momentum along the -axis (in GeV)
Definition Momentum.h:116
Helper container to handle all kinematics variables computation once.
Amplitudes computational tool, as developed by Nachtmann et al. .
static ParametersDescription description()
A description object for parameters collection.
const Polarisations & polarisations() const
static ParametersDescription description()
ParametersList params_
Module parameters.
Definition Steerable.h:50
Generic parton emission-factorised process.
FactorisedProcess(const ParametersList &params, const spdgids_t &output)
Class constructor.
const std::unique_ptr< PhaseSpaceGenerator > psgen_
Kinematic variables generator for the phase space coverage.
const Kinematics & kinematics() const
Constant reference to the process kinematics.
Definition Process.h:50
const Momentum & q2() const
Negative-z incoming parton's 4-momentum.
Definition Process.cpp:111
double shat() const
Definition Process.cpp:127
const Momentum & q1() const
Positive-z incoming parton's 4-momentum.
Definition Process.cpp:107
constexpr double G_EM_SQ
Electromagnetic charge (~0.303 in natural units)
Definition Constants.h:31
std::unique_ptr< Process > ProcessPtr
Helper typedef for a Process unique pointer.
Definition Process.h:199
Common namespace for this Monte Carlo generator.
long long spdgid_t
PerIdCuts central_particles
Cuts on the central individual particles.
Definition Cuts.h:96
Centrally produced particles phase space cuts.
Definition Cuts.h:31