cepgen
is hosted by
Hepforge
,
IPPP Durham
CepGen
1.2.5
Central exclusive processes event generator
Loading...
Searching...
No Matches
Limits.cpp
Go to the documentation of this file.
1
/*
2
* CepGen: a central exclusive processes event generator
3
* Copyright (C) 2018-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
21
#include "
CepGen/Core/Exception.h
"
22
#include "
CepGen/Utils/Limits.h
"
23
#include "
CepGen/Utils/String.h
"
24
25
namespace
cepgen
{
26
Limits::Limits
(
double
min,
double
max) : std::pair<double, double>(min, max) {}
27
28
Limits::Limits
(
const
Limits
& rhs) : std::pair<double, double>(rhs.first, rhs.second) {}
29
30
Limits
Limits::constant
(
double
val) {
return
Limits
{val, val}; }
31
32
bool
Limits::operator<
(
const
Limits
& oth)
const
{
33
if
(first < oth.first)
34
return
true
;
35
return
second < oth.second;
36
}
37
38
Limits
Limits::operator-
()
const
{
return
Limits
(-second, -first); }
39
40
Limits
&
Limits::operator+=
(
double
c) {
41
first += c;
42
second += c;
43
return
*
this
;
44
}
45
46
Limits
&
Limits::operator-=
(
double
c) {
47
first -= c;
48
second -= c;
49
return
*
this
;
50
}
51
52
Limits
&
Limits::operator*=
(
double
c) {
53
first *= c;
54
second *= c;
55
if
(c < 0.)
56
std::swap(first, second);
57
return
*
this
;
58
}
59
60
void
Limits::in
(
double
low,
double
up) {
61
first = low;
62
second = up;
63
}
64
65
double
Limits::range
()
const
{
66
if
(!
hasMin
() &&
hasMax
())
// if no lower limit, assume 0
67
return
second;
68
if
(!
hasMin
() || !
hasMax
())
69
return
0.;
70
return
second - first;
71
}
72
73
bool
Limits::hasMin
()
const
{
return
first !=
INVALID
; }
74
75
bool
Limits::hasMax
()
const
{
return
second !=
INVALID
; }
76
77
bool
Limits::contains
(
double
val,
bool
exclude_boundaries)
const
{
78
if
(
hasMin
() && (val <
min
() || (exclude_boundaries && val ==
min
())))
79
return
false
;
80
if
(
hasMax
() && (val >
max
() || (exclude_boundaries && val ==
max
())))
81
return
false
;
82
return
true
;
83
}
84
85
bool
Limits::valid
()
const
{
86
if
(
min
() ==
max
())
87
return
false
;
88
return
hasMin
() ||
hasMax
();
89
}
90
91
Limits
&
Limits::validate
() {
92
if
(second < first)
93
second =
INVALID
;
94
return
*
this
;
95
}
96
97
double
Limits::x
(
double
v)
const
{
98
static
const
Limits
x_limits{0., 1.};
99
if
(!x_limits.contains(v))
100
throw
CG_ERROR
(
"Limits:shoot"
) <<
"x = "
<< v <<
" must be inside "
<< x_limits <<
"."
;
101
if
(!
hasMin
() &&
hasMax
()) {
// if no lower limit, assume 0
102
CG_WARNING
(
"Limits:shoot"
) <<
"Requested to give a value inside interval while no lower limit is set. "
103
<<
"Assuming this latter is equal to 0."
;
104
return
second * v;
105
}
106
if
(!
valid
()) {
107
CG_WARNING
(
"Limits:shoot"
) <<
"Requested to give a value inside interval although this latter is invalid."
;
108
return
INVALID
;
109
}
110
return
first + (second - first) * v;
111
}
112
113
std::vector<double>
Limits::generate
(
size_t
num_bins,
bool
log_scale)
const
{
114
std::vector<double> out;
115
const
auto
min_val = (!log_scale) ?
min
() : std::log10(
min
());
116
const
auto
rng = ((!log_scale) ?
max
() -
min
() : std::log10(
max
()) - std::log10(
min
())) / (num_bins - 1);
117
for
(
size_t
i = 0; i < num_bins; ++i)
118
out.emplace_back((!log_scale) ? min_val + i * rng : std::pow(10, min_val + i * rng));
119
return
out;
120
}
121
122
std::vector<Limits>
Limits::split
(
size_t
num_bins,
bool
log_scale)
const
{
123
const
auto
& gen =
generate
(num_bins, log_scale);
124
std::vector<Limits> out;
125
for
(
size_t
i = 0; i < gen.size() - 1; ++i)
126
out.emplace_back(gen.at(i), gen.at(i + 1));
127
return
out;
128
}
129
130
Limits
Limits::truncate
(
const
Limits
& ext)
const
{
131
auto
out = *
this
;
132
if
(ext.
hasMin
() && (!out.hasMin() || out.min() < ext.
min
()))
133
out.
min
() = ext.
min
();
134
if
(ext.
hasMax
() && (!out.hasMax() || out.max() > ext.
max
()))
135
out.max() = ext.
max
();
136
return
out;
137
}
138
139
double
Limits::trim
(
double
val)
const
{
140
if
(
hasMin
() && val <
min
())
141
return
min
();
142
if
(
hasMax
() && val >
max
())
143
return
max
();
144
return
val;
145
}
146
147
Limits
&
Limits::apply
(
double
(*op)(
double
)) {
148
(*this) =
compute
(op);
149
return
*
this
;
150
}
151
152
Limits
Limits::compute
(
double
(*op)(
double
))
const
{
153
return
compute
([&op](
double
ext) {
return
op(ext); });
154
}
155
156
std::ostream&
operator<<
(std::ostream& os,
const
Limits
& lim) {
157
if
(!lim.
hasMin
() && !lim.
hasMax
())
158
return
os <<
"no cuts"
;
159
if
(!lim.
hasMin
())
160
return
os <<
utils::format
(
"below %g"
, lim.
max
());
161
if
(!lim.
hasMax
())
162
return
os <<
utils::format
(
"above %g"
, lim.
min
());
163
return
os <<
utils::format
(
"%g to %g"
, lim.
min
(), lim.
max
());
164
}
165
166
Limits
operator+
(
Limits
lim,
double
c) {
167
lim += c;
168
return
lim;
169
}
170
171
Limits
operator-
(
Limits
lim,
double
c) {
172
lim -= c;
173
return
lim;
174
}
175
176
Limits
operator*
(
Limits
lim,
double
c) {
177
lim *= c;
178
return
lim;
179
}
180
}
// namespace cepgen
Exception.h
CG_ERROR
#define CG_ERROR(mod)
Definition
Exception.h:60
Limits.h
CG_WARNING
#define CG_WARNING(mod)
Definition
Message.h:228
String.h
cepgen::Limits
Validity interval for a variable.
Definition
Limits.h:28
cepgen::Limits::apply
Limits & apply(double(*)(double))
Apply an operator on limits boundaries.
Definition
Limits.cpp:147
cepgen::Limits::split
std::vector< Limits > split(size_t num_bins, bool log_scale=false) const
Split the limits into sub-limits objects.
Definition
Limits.cpp:122
cepgen::Limits::x
double x(double v) const
Find the [0,1] value scaled between minimum and maximum.
Definition
Limits.cpp:97
cepgen::Limits::operator+=
Limits & operator+=(double)
Add a constant to this limit.
Definition
Limits.cpp:40
cepgen::Limits::operator<
bool operator<(const Limits &) const
Comparison operator.
Definition
Limits.cpp:32
cepgen::Limits::valid
bool valid() const
Is there a lower and upper limit?
Definition
Limits.cpp:85
cepgen::Limits::INVALID
static constexpr double INVALID
Invalid value placeholder (single-edged or invalid limits)
Definition
Limits.h:86
cepgen::Limits::generate
std::vector< double > generate(size_t num_bins, bool log_scale=false) const
Generate a collection of values from a number of bins.
Definition
Limits.cpp:113
cepgen::Limits::operator-
Limits operator-() const
Invert this limit.
Definition
Limits.cpp:38
cepgen::Limits::range
double range() const
Full variable range allowed.
Definition
Limits.cpp:65
cepgen::Limits::hasMin
bool hasMin() const
Have a lower limit?
Definition
Limits.cpp:73
cepgen::Limits::hasMax
bool hasMax() const
Have an upper limit?
Definition
Limits.cpp:75
cepgen::Limits::operator*=
Limits & operator*=(double)
Multiply this limit by a constant.
Definition
Limits.cpp:52
cepgen::Limits::min
double min() const
Lower limit to apply on the variable.
Definition
Limits.h:52
cepgen::Limits::compute
Limits compute(double(*)(double)) const
Compute a copy of limits with an operator applied on boundaries Compute a copy of limits with an oper...
Definition
Limits.cpp:152
cepgen::Limits::trim
double trim(double) const
Limit a value to boundaries.
Definition
Limits.cpp:139
cepgen::Limits::operator-=
Limits & operator-=(double)
Subtract a constant to this limit.
Definition
Limits.cpp:46
cepgen::Limits::truncate
Limits truncate(const Limits &) const
Truncate limits to minimal/maximal values.
Definition
Limits.cpp:130
cepgen::Limits::validate
Limits & validate()
Ensure the limit object is valid by correcting it if necessary.
Definition
Limits.cpp:91
cepgen::Limits::contains
bool contains(double val, bool exclude_boundaries=false) const
Check if value is inside limits' boundaries.
Definition
Limits.cpp:77
cepgen::Limits::Limits
Limits(double min=INVALID, double max=INVALID)
Define lower and upper limits on a quantity.
Definition
Limits.cpp:26
cepgen::Limits::max
double max() const
Upper limit to apply on the variable.
Definition
Limits.h:54
cepgen::Limits::constant
static Limits constant(double)
Build dimension-0 limits (constant)
Definition
Limits.cpp:30
cepgen::Limits::in
void in(double low, double up)
Specify the lower and upper limits on the variable.
Definition
Limits.cpp:60
cepgen::utils::format
std::string format(const std::string &fmt, Args... args)
Format a string using a printf style format descriptor.
Definition
String.h:61
cepgen
Common namespace for this Monte Carlo generator.
Definition
CommandLineHandler.cpp:36
cepgen::operator+
Matrix operator+(const Matrix &lhs, const Matrix &rhs)
Definition
Algebra.cpp:237
cepgen::operator*
Momentum operator*(double c, const Momentum &mom)
Definition
Momentum.cpp:134
cepgen::operator<<
std::ostream & operator<<(std::ostream &os, const Exception::Type &type)
Definition
Exception.cpp:59
cepgen::operator-
Matrix operator-(const Matrix &lhs, const Matrix &rhs)
Definition
Algebra.cpp:243
CepGen
Utils
Limits.cpp
Generated on Mon Jul 29 2024 for CepGen by
1.9.7