cepgen is hosted by Hepforge, IPPP Durham
CepGen 1.2.5
Central exclusive processes event generator
Loading...
Searching...
No Matches
Schaefer.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 * 2017 Wolfgang Schaefer
5 *
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 */
19
24
25namespace cepgen {
26 namespace strfun {
28 class Schaefer final : public Parameterisation {
29 public:
31 explicit Schaefer(const ParametersList& params)
32 : Parameterisation(params),
33 q2_cut_(steer<double>("Q2cut")),
34 w2_lim_(steer<std::vector<double> >("W2limits")),
35 higher_twist_(steer<double>("higherTwist")),
36 res_params_(steer<ParametersList>("resonancesSF")),
37 pert_params_(steer<ParametersList>("perturbativeSF")),
38 cont_params_(steer<ParametersList>("continuumSF")),
39 resonances_model_(StructureFunctionsFactory::get().build(res_params_)),
40 perturbative_model_(StructureFunctionsFactory::get().build(pert_params_)),
41 continuum_model_(StructureFunctionsFactory::get().build(cont_params_)) {
42 CG_DEBUG("LUXlike") << "LUXlike structure functions evaluator built with:\n"
43 << " * Q² cut: " << q2_cut_ << " GeV²\n"
44 << " * W² ranges: " << w2_lim_.at(0) << " GeV² / " << w2_lim_.at(1) << " GeV²\n"
45 << " * resonances model: " << *resonances_model_ << "\n"
46 << " * perturbative model: " << *perturbative_model_ << "\n"
47 << " * continuum model: " << *continuum_model_ << "\n"
48 << " * higher-twist corr: " << higher_twist_ << ".";
49 if (w2_lim_.size() < 2)
50 throw CG_FATAL("LUXlike") << "Invalid number of transition regions for W^2. Should have two, got " << w2_lim_
51 << ".";
52 inv_omega_range_ = 1. / (w2_lim_.at(1) - w2_lim_.at(0));
53 if (inv_omega_range_ <= 0.)
54 throw CG_FATAL("LUXlike") << "Invalid W^2 transition regions definitions: " << w2_lim_.at(0) << " / "
55 << w2_lim_.at(1) << " GeV^2!";
56 }
57
60 desc.setDescription("LUXlike (hybrid)");
61 desc.add<double>("Q2cut", 9.);
62 desc.add<std::vector<double> >("W2limits", {3., 4.});
63 desc.add<double>("higherTwist", 5.5);
64 desc.add("resonancesSF", StructureFunctionsFactory::get().describeParameters("ChristyBosted"));
65 desc.add("perturbativeSF", StructureFunctionsFactory::get().describeParameters("MSTWGrid"));
66 desc.add("continuumSF", StructureFunctionsFactory::get().describeParameters("GD11p"));
67 return desc;
68 }
69
70 void eval() override {
71 const double w2 = utils::mX2(args_.xbj, args_.q2, mp2_);
72
73 if (args_.q2 < q2_cut_) {
74 if (w2 < w2_lim_.at(0)) {
75 setF2(resonances_model_->F2(args_.xbj, args_.q2));
76 setFL(resonances_model_->FL(args_.xbj, args_.q2));
77 } else if (w2 < w2_lim_.at(1)) {
78 const double r = rho(w2);
79 setF2(r * continuum_model_->F2(args_.xbj, args_.q2) +
80 (1. - r) * resonances_model_->F2(args_.xbj, args_.q2));
81 setFL(r * continuum_model_->FL(args_.xbj, args_.q2) +
82 (1. - r) * resonances_model_->FL(args_.xbj, args_.q2));
83 } else {
84 setF2(continuum_model_->F2(args_.xbj, args_.q2));
85 setFL(continuum_model_->FL(args_.xbj, args_.q2));
86 }
87 } else {
88 if (w2 < w2_lim_.at(1)) {
89 setF2(continuum_model_->F2(args_.xbj, args_.q2));
90 setFL(continuum_model_->FL(args_.xbj, args_.q2));
91 } else {
92 setF2(perturbative_model_->F2(args_.xbj, args_.q2));
93 setFL(perturbative_model_->FL(args_.xbj, args_.q2) * (1. + higher_twist_ / args_.q2));
94 }
95 }
96 }
97
98 private:
99 double rho(double w2) const {
100 const double omega = (w2 - w2_lim_.at(0)) * inv_omega_range_;
101 const double omega2 = omega * omega;
102 return 2. * omega2 - omega2 * omega2;
103 }
104
106 const double q2_cut_;
111 const std::vector<double> w2_lim_;
113 const double higher_twist_;
114 const ParametersList res_params_, pert_params_, cont_params_;
115
117 const std::unique_ptr<Parameterisation> resonances_model_;
119 const std::unique_ptr<Parameterisation> perturbative_model_;
121 const std::unique_ptr<Parameterisation> continuum_model_;
122 double inv_omega_range_{-1.};
123 };
124 } // namespace strfun
125} // namespace cepgen
127REGISTER_STRFUN("LUXLike", 301, Schaefer);
#define CG_FATAL(mod)
Definition Exception.h:61
#define CG_DEBUG(mod)
Definition Message.h:220
#define REGISTER_STRFUN(name, id, obj)
Add a structure functions definition to the list of handled parameterisation.
A description object for parameters collection.
T steer(const std::string &key) const
Retrieve a parameters as previously steered.
Definition Steerable.h:39
Base object for the parameterisation of nucleon structure functions.
Arguments args_
Last couple computed.
Parameterisation & setF2(double f2)
const double mp2_
Squared proton mass, in GeV^2/c^4.
static ParametersDescription description()
Generic description for the structure functions.
Parameterisation & setFL(double fl)
LUX-like hybrid modelling of structure functions.
Definition Schaefer.cpp:28
static ParametersDescription description()
Definition Schaefer.cpp:58
Schaefer(const ParametersList &params)
User-steered Schäfer hybrid structure functions calculator.
Definition Schaefer.cpp:31
void eval() override
Local structure functions evaluation method.
Definition Schaefer.cpp:70
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.