cepgen is hosted by Hepforge, IPPP Durham
CepGen 1.2.5
Central exclusive processes event generator
Loading...
Searching...
No Matches
ChristyBosted.cpp
Go to the documentation of this file.
1/*
2 * CepGen: a central exclusive processes event generator
3 * Copyright (C) 2013-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 <numeric>
20#include <utility>
21
26#include "CepGen/Physics/PDG.h"
30
31namespace cepgen {
32 namespace strfun {
34 class ChristyBosted final : public Parameterisation {
35 public:
36 explicit ChristyBosted(const ParametersList&);
37
39
40 void eval() override;
41
42 //--- already computed internally during F2 computation
43 ChristyBosted& computeFL(double, double) override { return *this; }
44 ChristyBosted& computeFL(double, double, double) override { return *this; }
45
46 private:
47 enum Polarisation { L, T };
48 static constexpr double prefactor_ = 0.25 * M_1_PI * M_1_PI / constants::ALPHA_EM;
49
50 double resmod507(const Polarisation& pol, double w2, double q2) const;
51
52 class Resonance : public ResonanceObject, public SteeredObject<Resonance> {
53 public:
54 explicit Resonance(const ParametersList& params)
55 : ResonanceObject(params),
56 SteeredObject<Resonance>(params),
57 a0t_(SteeredObject<Resonance>::steer<double>("A0T")),
58 a0l_(SteeredObject<Resonance>::steer<double>("A0L")),
59 fit_pars_(SteeredObject<Resonance>::steer<std::vector<double> >("fitParameters")) {
60 if (fit_pars_.size() != 5)
61 throw CG_FATAL("ChristyBosted:Resonance")
62 << "Invalid fit parameters multiplicity! " << fit_pars_.size() << " != 5.";
63 }
64
65 static ParametersDescription description() {
66 auto desc = ResonanceObject::description();
67 desc.add<double>("A0T", 0.);
68 desc.add<double>("A0L", 0.);
69 desc.add<std::vector<double> >("fitParameters", std::vector<double>(5, 0.));
70 return desc;
71 }
72
73 double sigma(const Polarisation& pol, const KinematicsBlock& kin) const {
74 const auto pwidth = partialWidth(kin), pwidth2 = pwidth * pwidth;
75 const auto mass2 = mass_ * mass_;
76 return height(pol, kin.q2) * kr() / kin.k * kcmr() / kin.kcm / width_ *
77 (pwidth * photonWidth(kin) / (pow(kin.w2 - mass2, 2) + mass2 * pwidth2));
78 }
79
80 private:
82 double height(const Polarisation& pol, double q2) const {
83 switch (pol) {
84 case Polarisation::T:
85 return std::pow(a0t_ * (1. + fit_pars_.at(0) * q2 / (1. + fit_pars_.at(1) * q2)) /
86 std::pow(1. + q2 / 0.91, fit_pars_.at(2)),
87 2);
88 case Polarisation::L:
89 return std::pow(a0l_ / (1. + fit_pars_.at(3) * q2) * q2 * exp(-q2 * fit_pars_.at(4)), 2);
90 default:
91 throw CG_FATAL("ChristyBosted:Resonance") << "Invalid polarisation state: " << (int)pol << "!";
92 }
93 }
94
95 const double a0t_;
96 const double a0l_;
97 const std::vector<double> fit_pars_;
98 };
100 struct ContinuumDirection : SteeredObject<ContinuumDirection> {
101 explicit ContinuumDirection(const ParametersList& params)
102 : SteeredObject(params),
103 sig0(steer<double>("sig0")),
104 fit_pars(steer<std::vector<double> >("fitParameters")) {
105 if (fit_pars.size() != 4)
106 throw CG_FATAL("ChristyBosted:ContinuumDirection")
107 << "The templated fit for a continuum direction should have 4 parameters! Found " << fit_pars.size()
108 << ".";
109 }
110
111 static ParametersDescription description() {
112 auto desc = ParametersDescription();
113 desc.setDescription("Set of parameters for one given direction");
114 desc.add<double>("sig0", 0.);
115 desc.add<std::vector<double> >("fitParameters", std::vector<double>(4, 0.));
116 return desc;
117 }
118 double sig0;
119 std::vector<double> fit_pars;
120 };
121 double m0_;
123 std::vector<Resonance> resonances_;
125 std::vector<ContinuumDirection> continuum_;
126 const double q20_;
127 const double q21_;
128 const double mpi_, mpi2_;
129 const double meta_, meta2_;
130 };
131
133 : Parameterisation(params),
134 m0_(steer<double>("m0")),
135 q20_(steer<double>("q20")),
136 q21_(steer<double>("q21")),
137 mpi_(PDG::get().mass(PDG::piZero)),
138 mpi2_(mpi_ * mpi_),
139 meta_(PDG::get().mass(PDG::eta)),
140 meta2_(meta_ * meta_) {
141 for (const auto& res : steer<std::vector<ParametersList> >("resonances"))
142 resonances_.emplace_back(res);
143 const auto& cont = steer<std::vector<ParametersList> >("continuum");
144 if (cont.size() != 3)
145 throw CG_FATAL("ChristyBosted") << "Continuum should have its three directions parameterisation defined! Found "
146 << cont.size() << ".";
147 for (const auto& cnt : cont)
148 continuum_.emplace_back(cnt);
149 }
150
151 double ChristyBosted::resmod507(const Polarisation& pol, double w2, double q2) const {
152 const double w = sqrt(w2);
153 const double q20 = pol == Polarisation::T ? 0.05 : 0.125;
154
155 //--- kinematics needed for threshold relativistic B-W
156 const auto kin = Resonance::KinematicsBlock(w2, q2, mp2_, mpi2_, meta2_);
157
158 //--- calculate Breit-Wigners for all resonances
159 const auto sig_res =
160 w * std::accumulate(resonances_.begin(), resonances_.end(), 0., [&pol, &kin](auto sig, const auto& res) {
161 return sig + res.sigma(pol, kin);
162 });
163
164 //--- non-resonant background calculation
165 const double xpr = 1. / (1. + (w2 - mx_min_ * mx_min_) / (q2 + q20));
166 if (xpr > 1.)
167 return 0.;
168
169 double sig_nr = 0.;
170 switch (pol) {
171 case Polarisation::T: { // transverse
172 const double wdif = w - mx_min_;
173 if (wdif >= 0.) {
174 for (unsigned short i = 0; i < 2; ++i) {
175 const auto& dir = continuum_.at(i); // direction for this continuum
176 const double expo = dir.fit_pars.at(1) + dir.fit_pars.at(2) * q2 + dir.fit_pars.at(3) * q2 * q2;
177 sig_nr += dir.sig0 / pow(q2 + dir.fit_pars.at(0), expo) * pow(wdif, i + 1.5);
178 }
179 }
180
181 sig_nr *= xpr;
182 } break;
183 case Polarisation::L: { // longitudinal
184 const auto& dir = continuum_.at(2);
185 const double expo = dir.fit_pars.at(0);
186 const double xb = utils::xBj(q2, mp2_, w2);
187 const double norm_q2 = 1. / 0.330 / 0.330;
188 const double t = log(log((q2 + m0_) * norm_q2) / log(m0_ * norm_q2));
189 sig_nr += dir.sig0 * pow(1. - xpr, expo) / (1. - xb) * pow(q2 / (q2 + q20), dir.fit_pars.at(1)) / (q2 + q20) *
190 pow(xpr, dir.fit_pars.at(2) + dir.fit_pars.at(3) * t);
191 }
192 }
193 return sig_res + sig_nr;
194 }
195
197 const double w2 = utils::mX2(args_.xbj, args_.q2, mp2_);
198 if (sqrt(w2) < mx_min_)
199 return;
200
201 //-----------------------------
202 // modification of Christy-Bosted at large q2 as described in the LUXqed paper
203 //-----------------------------
204 const double delq2 = args_.q2 - q20_;
205 //------------------------------
206
207 double q2_eff = args_.q2, w2_eff = w2;
208 if (args_.q2 > q20_) {
209 q2_eff = q20_ + delq2 / (1. + delq2 / (q21_ - q20_));
210 w2_eff = utils::mX2(args_.xbj, q2_eff, mp2_);
211 }
212 const double sigT = resmod507(Polarisation::T, w2_eff, q2_eff);
213 const double sigL = resmod507(Polarisation::L, w2_eff, q2_eff);
214
215 double f2 = prefactor_ * (1. - args_.xbj) * q2_eff / gamma2(args_.xbj, q2_eff) * (sigT + sigL) /
217 if (args_.q2 > q20_)
218 f2 *= q21_ / (q21_ + delq2);
219 setF2(f2);
220
221 if (sigT != 0.)
222 Parameterisation::computeFL(q2_eff, args_.xbj, sigL / sigT);
223 }
224
226 auto desc = Parameterisation::description();
227 desc.setDescription("Christy-Bosted (low-mass resonances)");
228 desc.add<double>("m0", 4.2802);
229 desc.add<double>("q20", 8.).setDescription("Q^2 scale for the modification of the parameterisation");
230 desc.add<double>("q21", 30.);
231 desc.addParametersDescriptionVector(
232 "continuum",
233 ContinuumDirection::description(),
234 {// transverse direction x
236 .set<double>("sig0", 246.06)
237 .set<std::vector<double> >("fitParameters", {0.067469, 1.3501, 0.12054, -0.0038495}),
238 // transverse direction y
240 .set<double>("sig0", -89.360)
241 .set<std::vector<double> >("fitParameters", {0.20977, 1.5715, 0.090736, 0.010362}),
242 // longitudinal direction z
244 .set<double>("sig0", 86.746)
245 .set<std::vector<double> >("fitParameters", {4.0294, 3.1285, 0.33403, 4.9623})});
246 desc.addParametersDescriptionVector(
247 "resonances",
248 Resonance::description(),
249 {//--- P33(1232)
252 "branchingRatios",
253 ParametersList().set<double>("singlePi", 1.).set<double>("doublePi", 0.).set<double>("eta", 0.))
254 .set<int>("angularMomentum", 1)
255 .set<double>("x0", 0.14462 /* 0.15 */)
256 .set<double>("mass", 1.2298)
257 .set<double>("width", 0.13573)
258 .set<std::vector<double> >("fitParameters", {4.2291, 1.2598, 2.1242, 19.910, 0.22587})
259 .set<double>("A0T", 7.7805)
260 .set<double>("A0L", 29.414),
261 //--- S11(1535)
263 .set<ParametersList>("branchingRatios",
265 .set<double>("singlePi", 0.45)
266 .set<double>("doublePi", 0.1)
267 .set<double>("eta", 0.45))
268 .set<int>("angularMomentum", 0)
269 .set<double>("x0", 0.215)
270 .set<double>("mass", 1.5304)
271 .set<double>("width", 0.220)
272 .set<std::vector<double> >("fitParameters", {6823.2, 33521., 2.5686, 0., 0.})
273 .set<double>("A0T", 6.3351)
274 .set<double>("A0L", 0.),
275 //--- D13(1520)
277 .set<ParametersList>("branchingRatios",
279 .set<double>("singlePi", 0.65)
280 .set<double>("doublePi", 0.35)
281 .set<double>("eta", 0.))
282 .set<int>("angularMomentum", 2)
283 .set<double>("x0", 0.215)
284 .set<double>("mass", 1.5057)
285 .set<double>("width", 0.082956)
286 .set<std::vector<double> >("fitParameters", {21.240, 0.055746, 2.4886, 97.046, 0.31042})
287 .set<double>("A0T", 0.60347)
288 .set<double>("A0L", 157.92),
289 //--- F15(1680)
291 .set<ParametersList>("branchingRatios",
293 .set<double>("singlePi", 0.65)
294 .set<double>("doublePi", 0.35)
295 .set<double>("eta", 0.))
296 .set<int>("angularMomentum", 3)
297 .set<double>("x0", 0.215)
298 .set<double>("mass", 1.6980)
299 .set<double>("width", 0.095782)
300 .set<std::vector<double> >("fitParameters", {-0.28789, 0.18607, 0.063534, 0.038200, 1.2182})
301 .set<double>("A0T", 2.3305)
302 .set<double>("A0L", 4.2160),
303 //--- S11(1650)
306 "branchingRatios",
307 ParametersList().set<double>("singlePi", 0.4).set<double>("doublePi", 0.5).set<double>("eta", 0.1))
308 .set<int>("angularMomentum", 0)
309 .set<double>("x0", 0.215)
310 .set<double>("mass", 1.6650)
311 .set<double>("width", 0.10936)
312 .set<std::vector<double> >("fitParameters", {-0.56175, 0.38964, 0.54883, 0.31393, 2.9997})
313 .set<double>("A0T", 1.9790)
314 .set<double>("A0L", 13.764),
315 //--- P11(1440) roper
317 .set<ParametersList>("branchingRatios",
319 .set<double>("singlePi", 0.65)
320 .set<double>("doublePi", 0.35)
321 .set<double>("eta", 0.))
322 .set<int>("angularMomentum", 1)
323 .set<double>("x0", 0.215)
324 .set<double>("mass", 1.4333)
325 .set<double>("width", 0.37944)
326 .set<std::vector<double> >("fitParameters", {46.213, 0.19221, 1.9141, 0.053743, 1.3091})
327 .set<double>("A0T", 0.022506)
328 .set<double>("A0L", 5.5124),
329 //--- F37(1950)
332 "branchingRatios",
333 ParametersList().set<double>("singlePi", 0.5).set<double>("doublePi", 0.5).set<double>("eta", 0.))
334 .set<int>("angularMomentum", 3)
335 .set<double>("x0", 0.215)
336 .set<double>("mass", 1.9341)
337 .set<double>("width", 0.380)
338 .set<std::vector<double> >("fitParameters", {0., 0., 1., 1.8951, 0.51376})
339 .set<double>("A0T", 3.4187)
340 .set<double>("A0L", 1.8951)})
341 .setDescription("collection of resonances modelled in this fit");
342
343 return desc;
344 }
345
346 } // namespace strfun
347} // namespace cepgen
349REGISTER_STRFUN("ChristyBosted", 102, ChristyBosted);
#define CG_FATAL(mod)
Definition Exception.h:61
#define REGISTER_STRFUN(name, id, obj)
Add a structure functions definition to the list of handled parameterisation.
A singleton holding all physics constants associated to particles.
Definition PDG.h:28
A description object for parameters collection.
ParametersList & set(const std::string &, const T &)
Set a parameter value Set a recast parameter value.
General definition for a resonance.
double partialWidth(const KinematicsBlock &) const
partial widths for all decays
const double width_
full width, in GeV
double photonWidth(const KinematicsBlock &) const
virtual photon width
static ParametersDescription description()
const double mass_
mass, in GeV/c2
T steer(const std::string &key) const
Retrieve a parameters as previously steered.
Definition Steerable.h:39
Base user-steerable object.
SteeredObject()
Build a module.
parameterisation by Christy and Bosted
ChristyBosted & computeFL(double, double, double) override
Compute the longitudinal structure function for a given point.
ChristyBosted(const ParametersList &)
static ParametersDescription description()
void eval() override
Local structure functions evaluation method.
ChristyBosted & computeFL(double, double) override
Compute the longitudinal structure function for a given point.
Base object for the parameterisation of nucleon structure functions.
double gamma2(double xbj, double q2) const
Dimensionless variable .
virtual Parameterisation & computeFL(double xbj, double q2)
Compute the longitudinal structure function for a given point.
Arguments args_
Last couple computed.
Parameterisation & setF2(double f2)
const double mx_min_
Minimum diffractive mass, in GeV/c^2.
const double mp2_
Squared proton mass, in GeV^2/c^4.
static ParametersDescription description()
Generic description for the structure functions.
constexpr double GEVM2_TO_PB
Conversion factor between GeV and barn i.e. in GeV .
Definition Constants.h:37
constexpr double ALPHA_EM
Electromagnetic coupling constant .
Definition Constants.h:28
double xBj(double q2, double mp2, double mx2)
Compute Bjorken x from virtuality/diffractive mass.
Definition Utils.cpp:41
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.