cepgen is hosted by Hepforge, IPPP Durham
CepGen 1.2.5
Central exclusive processes event generator
Loading...
Searching...
No Matches
AnalyticalIntegrator.cpp
Go to the documentation of this file.
1/*
2 * CepGen: a central exclusive processes event generator
3 * Copyright (C) 2022-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 <Math/Integrator.h>
20
25
26namespace cepgen {
27 namespace root {
29 public:
30 explicit AnalyticalIntegrator(const ParametersList& params)
31 : cepgen::AnalyticIntegrator(params),
32 integr_(steerAs<int, ROOT::Math::IntegrationOneDim::Type>("type"),
33 steer<double>("epsabs"),
34 steer<double>("epsrel"),
35 steer<int>("limit"),
36 steer<int>("rule")) {
37 CG_DEBUG("root:AnalyticalIntegrator").log([this](auto& log) {
38 log << "ROOT analytical integrator built with options:\n";
39 integr_.Options().Print(log.stream());
40 });
41 }
42
45 desc.setDescription("ROOT integration algorithms wrapper");
46 desc.addAs<int>("type", ROOT::Math::IntegrationOneDim::Type::kDEFAULT).setDescription("type of integration");
47 desc.add<double>("epsabs", -1.).setDescription("desired absolute error limit");
48 desc.add<double>("epsrel", -1.).setDescription("desired relative error limit");
49 desc.add<int>("limit", 0).setDescription("maximum number of subintervals to build");
50 desc.add<int>("rule", 0).setDescription("Gauss-Kronrod integration rule (only for GSL kADAPTIVE type)");
51 return desc;
52 }
53
54 double integrate(const utils::Function1D& func, void* params = nullptr, const Limits& lim = {}) const override {
55 const auto func_local = utils::Function1D([&func, &params](double x) { return func(x, params); });
56 const double xmin = lim.hasMin() ? lim.min() : range_.min();
57 const double xmax = lim.hasMax() ? lim.max() : range_.max();
58 return integr_.Integral(func_local, xmin, xmax);
59 }
60
61 private:
62 mutable ROOT::Math::IntegratorOneDim integr_;
63 };
64 } // namespace root
65} // namespace cepgen
#define REGISTER_ANALYTIC_INTEGRATOR(name, obj)
Add a generic analytical integrator object builder definition.
#define CG_DEBUG(mod)
Definition Message.h:220
Analytic (functional) integration algorithm.
static ParametersDescription description()
Validity interval for a variable.
Definition Limits.h:28
double min() const
Lower limit to apply on the variable.
Definition Limits.h:52
double max() const
Upper limit to apply on the variable.
Definition Limits.h:54
A description object for parameters collection.
U steerAs(const std::string &key) const
Retrieve a recasted parameters as previously steered.
Definition Steerable.h:44
T steer(const std::string &key) const
Retrieve a parameters as previously steered.
Definition Steerable.h:39
double integrate(const utils::Function1D &func, void *params=nullptr, const Limits &lim={}) const override
Evaluate the integral of a function at a given value.
static ParametersDescription description()
AnalyticalIntegrator(const ParametersList &params)
Wrapper to a 1-dimensional function with optional parameters.
Common namespace for this Monte Carlo generator.