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
23
#include "
CepGen/Core/Exception.h
"
24
#include "
CepGen/Event/Event.h
"
25
#include "
CepGen/Modules/ProcessFactory.h
"
26
#include "
CepGen/Physics/Constants.h
"
27
#include "
CepGen/Physics/NachtmannAmplitudes.h
"
28
#include "
CepGen/Physics/PDG.h
"
29
#include "
CepGen/Physics/PolarisationState.h
"
30
#include "
CepGen/Process/FactorisedProcess.h
"
31
32
using namespace
cepgen
;
33
using namespace
std::complex_literals;
34
37
class
PPtoWW
final :
public
cepgen::proc::FactorisedProcess
{
38
public
:
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
65
static
ParametersDescription
description
() {
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
());
74
desc +=
NachtmannAmplitudes::description
();
75
return
desc;
76
}
77
78
private
:
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
135
REGISTER_PROCESS
(
"pptoww"
,
PPtoWW
);
Constants.h
Event.h
Exception.h
CG_FATAL
#define CG_FATAL(mod)
Definition
Exception.h:61
FactorisedProcess.h
CG_DEBUG_LOOP
#define CG_DEBUG_LOOP(mod)
Definition
Message.h:224
CG_DEBUG
#define CG_DEBUG(mod)
Definition
Message.h:220
CG_INFO
#define CG_INFO(mod)
Definition
Message.h:216
NachtmannAmplitudes.h
PDG.h
PolarisationState.h
ProcessFactory.h
REGISTER_PROCESS
#define REGISTER_PROCESS(name, obj)
Add a generic process definition to the list of handled processes.
Definition
ProcessFactory.h:25
PPtoWW
Compute the matrix element for a CE process using -factorization approach.
Definition
PPtoWW.cpp:37
PPtoWW::clone
proc::ProcessPtr clone() const override
Copy all process attributes into a new object.
Definition
PPtoWW.cpp:63
PPtoWW::description
static ParametersDescription description()
Definition
PPtoWW.cpp:65
PPtoWW::PPtoWW
PPtoWW(const ParametersList ¶ms)
Definition
PPtoWW.cpp:39
cepgen::Kinematics::cuts
CutsList & cuts()
Phase space cuts.
Definition
Kinematics.h:41
cepgen::Momentum::px
double px() const
Momentum along the -axis (in GeV)
Definition
Momentum.h:112
cepgen::Momentum::py
double py() const
Momentum along the -axis (in GeV)
Definition
Momentum.h:116
cepgen::NachtmannAmplitudes::Kinematics
Helper container to handle all kinematics variables computation once.
Definition
NachtmannAmplitudes.h:42
cepgen::NachtmannAmplitudes
Amplitudes computational tool, as developed by Nachtmann et al. .
Definition
NachtmannAmplitudes.h:32
cepgen::NachtmannAmplitudes::mode
const Mode & mode() const
Definition
NachtmannAmplitudes.h:39
cepgen::NachtmannAmplitudes::description
static ParametersDescription description()
Definition
NachtmannAmplitudes.cpp:249
cepgen::ParametersDescription
A description object for parameters collection.
Definition
ParametersDescription.h:26
cepgen::ParametersList
Definition
ParametersList.h:52
cepgen::PolarisationState
Definition
PolarisationState.h:25
cepgen::PolarisationState::polarisations
const Polarisations & polarisations() const
Definition
PolarisationState.h:37
cepgen::PolarisationState::description
static ParametersDescription description()
Definition
PolarisationState.cpp:47
cepgen::Steerable::params_
ParametersList params_
Module parameters.
Definition
Steerable.h:50
cepgen::proc::FactorisedProcess
Generic parton emission-factorised process.
Definition
FactorisedProcess.h:33
cepgen::proc::FactorisedProcess::FactorisedProcess
FactorisedProcess(const ParametersList ¶ms, const spdgids_t &output)
Class constructor.
Definition
FactorisedProcess.cpp:31
cepgen::proc::FactorisedProcess::that
double that() const
Definition
FactorisedProcess.cpp:124
cepgen::proc::FactorisedProcess::psgen_
const std::unique_ptr< PhaseSpaceGenerator > psgen_
Kinematic variables generator for the phase space coverage.
Definition
FactorisedProcess.h:58
cepgen::proc::FactorisedProcess::uhat
double uhat() const
Definition
FactorisedProcess.cpp:126
cepgen::proc::Process::kinematics
const Kinematics & kinematics() const
Constant reference to the process kinematics.
Definition
Process.h:50
cepgen::proc::Process::q2
const Momentum & q2() const
Negative-z incoming parton's 4-momentum.
Definition
Process.cpp:111
cepgen::proc::Process::shat
double shat() const
Definition
Process.cpp:127
cepgen::proc::Process::q1
const Momentum & q1() const
Positive-z incoming parton's 4-momentum.
Definition
Process.cpp:107
cepgen::constants::G_EM_SQ
constexpr double G_EM_SQ
Electromagnetic charge (~0.303 in natural units)
Definition
Constants.h:31
cepgen::proc::ProcessPtr
std::unique_ptr< Process > ProcessPtr
Helper typedef for a Process unique pointer.
Definition
Process.h:199
cepgen
Common namespace for this Monte Carlo generator.
Definition
CommandLineHandler.cpp:36
cepgen::spdgid_t
long long spdgid_t
Definition
ParticleProperties.h:28
cepgen::CutsList::central_particles
PerIdCuts central_particles
Cuts on the central individual particles.
Definition
Cuts.h:96
cepgen::cuts::Central
Centrally produced particles phase space cuts.
Definition
Cuts.h:31
CepGenProcesses
PPtoWW.cpp
Generated on Mon Jul 29 2024 for CepGen by
1.9.7