cepgen is hosted by Hepforge, IPPP Durham
CepGen 1.2.5
Central exclusive processes event generator
Loading...
Searching...
No Matches
FioreBrasse.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 <complex>
20
27
28namespace cepgen {
29 namespace strfun {
32 public:
34 explicit FioreBrasse(const ParametersList& params)
35 : Parameterisation(params), s0_(steer<double>("s0")), norm_(steer<double>("norm")) {
36 for (const auto& res : steer<std::vector<ParametersList> >("resonances"))
37 resonances_.emplace_back(res);
38 }
39
42 desc.setDescription("Fiore-Brasse (low-mass resonances)");
43 desc.add<double>("s0", 1.14);
44 desc.add<double>("norm", 0.021).setDescription("absolute normalisation factor");
45 // add the list of resonances
46 desc.addParametersDescriptionVector("resonances",
48 {ParametersList() // N*(1520)
49 .set<double>("alpha0", -0.8377)
50 .set<double>("alpha1", 0.95)
51 .set<double>("alpha2", 0.1473)
52 .set<double>("a", 1.0)
53 .set<double>("q02", 2.4617)
54 .set<int>("spinTimesTwo", 3),
55 ParametersList() // N*(1680)
56 .set<double>("alpha0", -0.37)
57 .set<double>("alpha1", 0.95)
58 .set<double>("alpha2", 0.1471)
59 .set<double>("a", 0.5399)
60 .set<double>("q02", 2.4617)
61 .set<int>("spinTimesTwo", 5),
62 ParametersList() // Δ(1236)
63 .set<double>("alpha0", 0.0038)
64 .set<double>("alpha1", 0.85)
65 .set<double>("alpha2", 0.1969)
66 .set<double>("a", 4.2225)
67 .set<double>("q02", 1.5722)
68 .set<int>("spinTimesTwo", 3),
69 ParametersList() // exotic
70 .set<double>("alpha0", 0.5645)
71 .set<double>("alpha1", 0.1126)
72 .set<double>("alpha2", 1.3086)
73 .set<double>("a", 19.2694)
74 .set<double>("q02", 4.5259)
75 .set<int>("spinTimesTwo", 2)})
76 .setDescription("collection of resonances parameters");
77 return desc;
78 }
79
80 void eval() override;
81
82 protected:
84 struct Resonance : SteeredObject<Resonance> {
85 explicit Resonance(const ParametersList& params)
86 : SteeredObject(params),
87 alpha0(steer<double>("alpha0")),
88 alpha1(steer<double>("alpha1")),
89 alpha2(steer<double>("alpha2")),
90 a(steer<double>("a")),
91 q02(steer<double>("q02")),
92 spinTimesTwo(steer<int>("spinTimesTwo")) {}
93
95 auto desc = ParametersDescription();
96 desc.add<double>("alpha0", 0.);
97 desc.add<double>("alpha1", 0.);
98 desc.add<double>("alpha2", 0.);
99 desc.add<double>("a", 0.).setDescription("resonance weight in total amplitude");
100 desc.add<double>("q02", 0.);
101 desc.add<int>("spinTimesTwo", 0).setDescription("spin of the resonance (x1/2)");
102 return desc;
103 }
104
107 };
108
109 private:
111 std::vector<Resonance> resonances_;
112 double s0_{0.}, norm_{0.};
113 };
114
116 const double prefactor =
117 args_.q2 * (1. - args_.xbj) / (4. * M_PI * constants::ALPHA_EM * gamma2(args_.xbj, args_.q2));
118 const double s = utils::mX2(args_.xbj, args_.q2, mp2_);
119
120 double amplitude_res = 0.;
121 const double sqrts0 = sqrt(s0_);
122 for (unsigned short i = 0; i < 3; ++i) { //FIXME 4??
123 const auto& res = resonances_.at(i);
124
125 std::complex<double> alpha;
126 if (s > s0_)
127 alpha = std::complex<double>(res.alpha0 + res.alpha2 * sqrts0 + res.alpha1 * s, res.alpha2 * sqrt(s - s0_));
128 else
129 alpha = std::complex<double>(res.alpha0 + res.alpha1 * s + res.alpha2 * (sqrts0 - sqrt(s0_ - s)), 0.);
130
131 double formfactor = 1. / pow(1. + args_.q2 / res.q02, 2);
132 double denom = pow(res.spinTimesTwo * 0.5 - std::real(alpha), 2) + pow(std::imag(alpha), 2);
133 double ampli_imag = res.a * formfactor * formfactor * std::imag(alpha) / denom;
134 amplitude_res += ampli_imag;
135 }
136 double amplitude_bg = 0.;
137 {
138 const auto& res = resonances_.at(3);
139 double sE = res.alpha2, sqrtsE = sqrt(sE);
140 std::complex<double> alpha;
141 if (s > sE)
142 alpha = std::complex<double>(res.alpha0 + res.alpha1 * sqrtsE, res.alpha1 * sqrt(s - sE));
143 else
144 alpha = std::complex<double>(res.alpha0 + res.alpha1 * (sqrtsE - sqrt(sE - s)), 0.);
145 double formfactor = 1. / pow(1. + args_.q2 / res.q02, 2);
146 double denom = pow(res.spinTimesTwo * 0.75 - std::real(alpha), 2) + pow(std::imag(alpha), 2);
147 amplitude_bg = res.a * formfactor * formfactor * std::imag(alpha) / denom;
148 }
149 const double amplitude_tot = norm_ * (amplitude_res + amplitude_bg);
150
151 CG_DEBUG_LOOP("FioreBrasse:amplitudes") << "Amplitudes:\n\t"
152 << " resonance part: " << amplitude_res << ",\n\t"
153 << " background part: " << amplitude_bg << ",\n\t"
154 << " total (with norm.): " << amplitude_tot << ".";
155
156 setF2(prefactor * amplitude_tot);
157 }
158
159 class FioreBrasseAlt final : public FioreBrasse {
160 public:
161 explicit FioreBrasseAlt(const ParametersList& params) : FioreBrasse(params) {}
162
164 auto desc = FioreBrasse::description();
165 desc.add<double>("s0", 1.2871);
166 desc.add<double>("norm", 0.0207);
167 // add the list of resonances
168 desc.addParametersDescriptionVector("resonances",
169 Resonance::description(),
170 {ParametersList() // N*(1520)
171 .set<double>("alpha0", -0.8070)
172 .set<double>("alpha1", 0.9632)
173 .set<double>("alpha2", 0.1387)
174 .set<double>("a", 1.0)
175 .set<double>("q02", 2.6066)
176 .set<int>("spinTimesTwo", 3),
177 ParametersList() // N*(1680)
178 .set<double>("alpha0", -0.3640)
179 .set<double>("alpha1", 0.9531)
180 .set<double>("alpha2", 0.1239)
181 .set<double>("a", 0.6086)
182 .set<double>("q02", 2.6066)
183 .set<int>("spinTimesTwo", 5),
184 ParametersList() // Δ(1236)
185 .set<double>("alpha0", -0.0065)
186 .set<double>("alpha1", 0.8355)
187 .set<double>("alpha2", 0.2320)
188 .set<double>("a", 4.7279)
189 .set<double>("q02", 1.4828)
190 .set<int>("spinTimesTwo", 3),
191 ParametersList() // exotic
192 .set<double>("alpha0", 0.5484)
193 .set<double>("alpha1", 0.1373)
194 .set<double>("alpha2", 1.3139)
195 .set<double>("a", 14.7267)
196 .set<double>("q02", 4.6041)
197 .set<int>("spinTimesTwo", 2)});
198 return desc;
199 }
200 };
201 } // namespace strfun
202} // namespace cepgen
205REGISTER_STRFUN("FioreBrasse", 101, FioreBrasse);
206REGISTER_STRFUN("FioreBrasseAlt", 104, FioreBrasseAlt);
#define CG_DEBUG_LOOP(mod)
Definition Message.h:224
#define REGISTER_STRFUN(name, id, obj)
Add a structure functions definition to the list of handled parameterisation.
A description object for parameters collection.
ParametersList & set(const std::string &, const T &)
Set a parameter value Set a recast parameter value.
T steer(const std::string &key) const
Retrieve a parameters as previously steered.
Definition Steerable.h:39
Base user-steerable object.
FioreBrasseAlt(const ParametersList &params)
static ParametersDescription description()
structure functions parameterisation by Fiore et al and Brasse et al
FioreBrasse(const ParametersList &params)
Fiore and Brasse proton structure functions.
static ParametersDescription description()
void eval() override
Local structure functions evaluation method.
Base object for the parameterisation of nucleon structure functions.
double gamma2(double xbj, double q2) const
Dimensionless variable .
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.
constexpr double ALPHA_EM
Electromagnetic coupling constant .
Definition Constants.h:28
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.
Description of a single resonance in the modelling.
static ParametersDescription description()
Resonance(const ParametersList &params)