cepgen is hosted by Hepforge, IPPP Durham
CepGen 1.2.5
Central exclusive processes event generator
Loading...
Searching...
No Matches
SigmaRatio.cpp
Go to the documentation of this file.
1/*
2 * CepGen: a central exclusive processes event generator
3 * Copyright (C) 2017-2024 Laurent Forthomme
4 *
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 */
18
19#include <cmath>
20
23#include "CepGen/Physics/PDG.h"
26#include "CepGen/Utils/Math.h"
27
28namespace cepgen {
29 namespace sigrat {
31 : NamedModule(params), mp_(PDG::get().mass(PDG::proton)), mp2_(mp_ * mp_) {}
32
33 double Parameterisation::theta(double xbj, double q2) {
34 return 1. + 12. * (q2 / (q2 + 1.)) * (0.125 * 0.125 / (0.125 * 0.125 + xbj * xbj));
35 }
36
38 auto desc = ParametersDescription();
39 desc.setDescription("Unnamed sigma ratio parameterisation");
40 return desc;
41 }
42
43 //---------------------------------------------------------------------------------------------
44
46 class E143 final : public Parameterisation {
47 public:
48 explicit E143(const ParametersList& params)
49 : Parameterisation(params),
50 q2_b_(steer<double>("q2_b")),
51 lambda2_(steer<double>("lambda2")),
52 a_(steer<std::vector<double> >("a")),
53 b_(steer<std::vector<double> >("b")),
54 c_(steer<std::vector<double> >("c")) {
55 if (a_.size() != 6)
56 throw CG_FATAL("E143") << "Parameter 'a' should have 6 components! Parsed " << a_ << ".";
57 if (b_.size() != 6)
58 throw CG_FATAL("E143") << "Parameter 'b' should have 6 components! Parsed " << b_ << ".";
59 if (c_.size() != 6)
60 throw CG_FATAL("E143") << "Parameter 'c' should have 6 components! Parsed " << c_ << ".";
61 }
62
65 desc.setDescription("E143 (experimental)");
66 desc.add<double>("q2_b", 0.34);
67 desc.add<double>("lambda2", 0.2 * 0.2);
68 desc.add<std::vector<double> >("a", {0.0485, 0.5470, 2.0621, -0.3804, 0.5090, -0.0285});
69 desc.add<std::vector<double> >("b", {0.0481, 0.6114, -0.3509, -0.4611, 0.7172, -0.0317});
70 desc.add<std::vector<double> >("c", {0.0577, 0.4644, 1.8288, 12.3708, -43.1043, 41.7415});
71 return desc;
72 }
73
74 double operator()(double xbj, double q2, double& err) const override {
75 const double u = q2 / q2_b_;
76 const double inv_xl = 1. / std::log(q2 / lambda2_);
77 const double pa = (1. + a_.at(3) * xbj + a_.at(4) * xbj * xbj) * std::pow(xbj, a_.at(5));
78 const double pb = (1. + b_.at(3) * xbj + b_.at(4) * xbj * xbj) * std::pow(xbj, b_.at(5));
79 const double q2_thr = c_.at(3) * xbj + c_.at(4) * xbj * xbj + c_.at(5) * xbj * xbj * xbj;
80 const double th = theta(xbj, q2);
81 // here come the three fits
82 const double ra = a_.at(0) * inv_xl * th + a_.at(1) / std::pow(pow(q2, 4) + std::pow(a_.at(2), 4), 0.25) * pa,
83 rb = b_.at(0) * inv_xl * th + (b_.at(1) / q2 + b_.at(2) / (q2 * q2 + 0.3 * 0.3)) * pb,
84 rc = c_.at(0) * inv_xl * th + c_.at(1) / utils::fastHypot(q2 - q2_thr, c_.at(2));
85
86 const double r = (ra + rb + rc) / 3.; // R is set to be the average of the three fits
87 // numerical safety for low-Q²
88 err = 0.0078 - 0.013 * xbj + (0.070 - 0.39 * xbj + 0.70 * xbj * xbj) / (1.7 + q2);
89 if (q2 > q2_b_)
90 return r;
91 return r * 0.5 * (3. * u - u * u * u);
92 }
93
94 private:
95 double q2_b_, lambda2_;
96 std::vector<double> a_, b_, c_;
97 };
98
99 //---------------------------------------------------------------------------------------------
100
103 class R1990 final : public Parameterisation {
104 public:
105 explicit R1990(const ParametersList& params)
106 : Parameterisation(params), lambda2_(steer<double>("lambda2")), b_(steer<std::vector<double> >("b")) {
107 if (b_.size() != 3)
108 throw CG_FATAL("R1990") << "Parameter 'b' should have 3 components! Parsed " << b_ << ".";
109 }
110
112 auto desc = Parameterisation::description();
113 desc.setDescription("SLAC (experimental)");
114 desc.add<double>("lambda2", 0.04);
115 desc.add<std::vector<double> >("b", {0.0635, 0.5747, -0.3534});
116 return desc;
117 }
118
119 double operator()(double xbj, double q2, double& err) const override {
120 err = 0.;
121 return b_.at(0) + theta(xbj, q2) / std::log(q2 / lambda2_) + b_.at(1) / q2 + b_.at(2) / (q2 * q2 + 0.09);
122 }
123
124 private:
125 double lambda2_;
126 std::vector<double> b_;
127 };
128
129 //---------------------------------------------------------------------------------------------
130
132 class CLAS final : public Parameterisation {
133 public:
134 explicit CLAS(const ParametersList& params)
135 : Parameterisation(params),
136 p_(steer<std::vector<double> >("p")),
137 wth_(steer<double>("wth")),
138 q20_(steer<double>("q20")) {
139 if (p_.size() != 3)
140 throw CG_FATAL("CLAS") << "Parameter 'p' should have 3 components! Parsed " << p_ << ".";
141 }
142
144 auto desc = Parameterisation::description();
145 desc.setDescription("CLAS (experimental)");
146 desc.add<std::vector<double> >("p", {0.041, 0.592, 0.331});
147 desc.add<double>("wth", 2.5);
148 desc.add<double>("q20", 0.3);
149 return desc;
150 }
151
152 double operator()(double xbj, double q2, double& err) const override {
153 err = 0.;
154 //--- 2 kinematic regions: resonances ( w < wth ), and DIS ( w > wth )
155 const double w2 = utils::mX2(xbj, q2, mp2_), w = sqrt(w2);
156 const double xth = q2 / (q2 + wth_ * wth_ - mp2_); // xth = x( W = wth )
157 const double zeta = std::log(25. * q2);
158 const double xitmp = (w < wth_) ? theta(xth, q2) : theta(xbj, q2);
159 const double tmp = p_.at(0) * xitmp / zeta + p_.at(1) / q2 - p_.at(2) / (q20_ * q20_ + q2 * q2);
160 if (w >= wth_)
161 return tmp;
162 return tmp * std::pow((1. - xbj) / (1. - xth), 3);
163 }
164
165 private:
166 std::vector<double> p_;
167 double wth_, q20_;
168 };
169
170 //---------------------------------------------------------------------------------------------
171
173 class SibirtsevBlunden final : public Parameterisation {
174 public:
175 explicit SibirtsevBlunden(const ParametersList& params)
176 : Parameterisation(params),
177 a_(steer<double>("a")),
178 b1_(steer<double>("b1")),
179 b2_(steer<double>("b2")),
180 c_(steer<double>("c")) {}
181
183 auto desc = Parameterisation::description();
184 desc.setDescription("Sibirtsev-Blunden (theoretical)");
185 desc.add<double>("a", 0.014);
186 desc.add<double>("b1", -0.07);
187 desc.add<double>("b2", -0.8);
188 desc.add<double>("c", 41.);
189 return desc;
190 }
191
192 double operator()(double /* xbj */, double q2, double& err) const override {
193 err = 0.;
194 //--- equation (10) of reference paper
195 return a_ * q2 * (exp(b1_ * q2) + c_ * exp(b2_ * q2));
196 }
197
198 private:
199 double a_, b1_, b2_, c_;
200 };
201 } // namespace sigrat
202} // namespace cepgen
210REGISTER_SIGRAT("SibirtsevBlunden", 4, SibirtsevBlunden);
#define CG_FATAL(mod)
Definition Exception.h:61
#define REGISTER_SIGRAT(name, id, obj)
Add a sigma ratio definition to the list of handled parameterisation.
Base runtime module object.
Definition NamedModule.h:28
A singleton holding all physics constants associated to particles.
Definition PDG.h:28
A description object for parameters collection.
T steer(const std::string &key) const
Retrieve a parameters as previously steered.
Definition Steerable.h:39
CLAS experimental R measurement.
CLAS(const ParametersList &params)
static ParametersDescription description()
double operator()(double xbj, double q2, double &err) const override
Extract the longitudinal/transverse cross section ratio and associated error for a given couple.
E143 experimental R measurement .
E143(const ParametersList &params)
static ParametersDescription description()
double operator()(double xbj, double q2, double &err) const override
Extract the longitudinal/transverse cross section ratio and associated error for a given couple.
A generic modelling of the ratio.
Definition SigmaRatio.h:28
static double theta(double xbj, double q2)
dependence for QCD-matching of R at high-
const double mp2_
Squared proton mass, in GeV /c .
Definition SigmaRatio.h:41
Parameterisation(const ParametersList &params=ParametersList())
ratio computation algorithm constructor
static ParametersDescription description()
SLAC experimental R measurement .
R1990(const ParametersList &params)
static ParametersDescription description()
double operator()(double xbj, double q2, double &err) const override
Extract the longitudinal/transverse cross section ratio and associated error for a given couple.
Sibirtsev & Blunden parameterisation of the R ratio .
static ParametersDescription description()
double operator()(double, double q2, double &err) const override
Extract the longitudinal/transverse cross section ratio and associated error for a given couple.
SibirtsevBlunden(const ParametersList &params)
double fastHypot(double x, double y)
Definition Math.cpp:33
double mX2(double xbj, double q2, double mp2)
Compute the diffractive mass from virtuality/Bjorken x.
Definition Utils.cpp:29
Common namespace for this Monte Carlo generator.