AmpGen
2.1
Toggle main menu visibility
Loading...
Searching...
No Matches
DalitzIntegrator.h
Go to the documentation of this file.
1
#ifndef AMPGEN_DALITZINTEGRATOR_H
2
#define AMPGEN_DALITZINTEGRATOR_H
3
4
#include <stddef.h>
5
#include <chrono>
6
#include <cmath>
7
#include <complex>
8
#include <functional>
9
#include <string>
10
#include <utility>
11
12
#include "
AmpGen/simd/utils.h
"
13
#include "
AmpGen/NumericalIntegration.h
"
14
#include "
AmpGen/ProfileClock.h
"
15
16
class
TGraph;
17
class
TH1D;
18
class
TH2D;
19
20
namespace
AmpGen
{
21
class
Event
;
22
class
Projection2D
;
23
class
Projection
;
27
28
class
DalitzIntegrator
{
29
public
:
30
typedef
std::pair<real_v, real_v>
sqCo
;
31
DalitzIntegrator
(
const
double
&s0,
const
double
&s1,
const
double
&s2,
const
double
&s3);
32
33
template
<
typename
FCN>
double
integrateDP
(FCN &&
fcn
,
const
double
&s)
const
;
34
template
<
typename
FCN>
double
integrateDP
(FCN &&
fcn
)
const
{
return
integrateDP
(
fcn
, m_s0); }
35
real_v
getMAB
(
const
sqCo
&coords)
const
;
36
real_v
J
(
const
sqCo
&coords)
const
;
37
real_v
getMAB
(
const
sqCo
&coords,
const
double
&s)
const
;
38
real_v
J
(
const
sqCo
&coords,
const
double
&s)
const
;
39
double
sqDp1
(
const
Event
&evt)
const
;
40
double
sqDp2
(
const
Event
&evt)
const
;
41
real_v
safe_sqrt
(
const
real_v
&x)
const
{
42
#if ENABLE_AVX
43
return
select(x > 0.,
sqrt
(x),
real_v
(0.));
44
#else
45
return
x > 0 ? std::sqrt(x) : 0;
46
#endif
47
}
48
void
setEvent
(
const
sqCo
&x,
real_v
*event,
const
double
&s)
const
;
49
50
void
debug
()
const
;
51
void
setEvent
(
const
sqCo
&x,
real_v
*event)
const
;
52
53
void
set
(
const
double
&s0,
const
double
&s1,
const
double
&s2,
const
double
&s3);
54
void
setMin
();
55
void
setMother
(
const
double
&s);
56
57
TH1D *
makePlot
(
const
std::function<
double
(
const
double
*)> &
fcn
,
const
Projection
&projection,
const
std::string &name,
const
size_t
&nSamples = 1000000);
58
59
TH2D *
makePlot
(
const
std::function<
double
(
const
double
*)> &
fcn
,
const
Projection2D
&projection,
const
std::string &name,
const
size_t
&nSamples = 1000000);
60
61
sqCo
getCoordinates
(
const
Event
&evt)
const
;
62
63
TGraph *
makeBoundaryGraph
(
const
Projection2D
&)
const
;
64
65
private
:
66
double
m_min;
67
double
m_max;
68
double
m_s0;
69
double
m_s1;
70
double
m_s2;
71
double
m_s3;
72
};
73
template
<
typename
FCN>
double
DalitzIntegrator::integrateDP
(FCN &&
fcn
,
const
double
&s)
const
{
74
#if INSTRUCTION_SET != 0 && INSTRUCTION_SET != INSTRUCTION_SET_AVX2d
75
#pragma message("WARNING: DalitzIntegrator only supports scalar or AVX2(d) instruction sets")
76
#else
77
real_v
event
[12] = {0.};
78
ProfileClock
pc1;
79
auto
i1 =
integrate<2>
(
80
[&](
const
std::array<real_v, 2> &x) {
81
setEvent
(*
reinterpret_cast<
const
sqCo
*
>
(&x), event, s);
82
return
J
(*
reinterpret_cast<
const
sqCo
*
>
(&x), s) *
real
(
fcn
(event));
83
},
84
std::array<double, 2>{0., 0.}, std::array<double, 2>{1., 1.})
85
/ s;
86
return
i1;
87
#endif
88
return
0;
89
}
90
91
}
// namespace AmpGen
92
93
#endif
NumericalIntegration.h
ProfileClock.h
AmpGen::DalitzIntegrator::set
void set(const double &s0, const double &s1, const double &s2, const double &s3)
AmpGen::DalitzIntegrator::sqDp2
double sqDp2(const Event &evt) const
AmpGen::DalitzIntegrator::DalitzIntegrator
DalitzIntegrator(const double &s0, const double &s1, const double &s2, const double &s3)
AmpGen::DalitzIntegrator::integrateDP
double integrateDP(FCN &&fcn, const double &s) const
Definition
DalitzIntegrator.h:73
AmpGen::DalitzIntegrator::sqCo
std::pair< real_v, real_v > sqCo
Definition
DalitzIntegrator.h:30
AmpGen::DalitzIntegrator::setMin
void setMin()
AmpGen::DalitzIntegrator::integrateDP
double integrateDP(FCN &&fcn) const
Definition
DalitzIntegrator.h:34
AmpGen::DalitzIntegrator::J
real_v J(const sqCo &coords, const double &s) const
AmpGen::DalitzIntegrator::setMother
void setMother(const double &s)
AmpGen::DalitzIntegrator::safe_sqrt
real_v safe_sqrt(const real_v &x) const
Definition
DalitzIntegrator.h:41
AmpGen::DalitzIntegrator::makePlot
TH1D * makePlot(const std::function< double(const double *)> &fcn, const Projection &projection, const std::string &name, const size_t &nSamples=1000000)
AmpGen::DalitzIntegrator::getMAB
real_v getMAB(const sqCo &coords, const double &s) const
AmpGen::DalitzIntegrator::getCoordinates
sqCo getCoordinates(const Event &evt) const
AmpGen::DalitzIntegrator::getMAB
real_v getMAB(const sqCo &coords) const
AmpGen::DalitzIntegrator::debug
void debug() const
AmpGen::DalitzIntegrator::J
real_v J(const sqCo &coords) const
AmpGen::DalitzIntegrator::makePlot
TH2D * makePlot(const std::function< double(const double *)> &fcn, const Projection2D &projection, const std::string &name, const size_t &nSamples=1000000)
AmpGen::DalitzIntegrator::makeBoundaryGraph
TGraph * makeBoundaryGraph(const Projection2D &) const
AmpGen::DalitzIntegrator::setEvent
void setEvent(const sqCo &x, real_v *event) const
AmpGen::DalitzIntegrator::setEvent
void setEvent(const sqCo &x, real_v *event, const double &s) const
AmpGen::DalitzIntegrator::sqDp1
double sqDp1(const Event &evt) const
AmpGen::Event
Encapsulates the final state particles of a single event.
Definition
Event.h:19
AmpGen::Projection2D
Definition
Projection.h:68
AmpGen::Projection
Definition
Projection.h:22
AmpGen::fcn
Definition
Expression.h:464
AmpGen
Definition
AddCPConjugate.h:2
AmpGen::sqrt
Complex< real_t > sqrt(const Complex< real_t > &v)
Definition
Complex.h:100
AmpGen::real_v
AVX::real_v real_v
Definition
utils.h:47
AmpGen::real
real_t real(const Complex< real_t > &arg)
Definition
Complex.h:36
AmpGen::integrate
double integrate(const fcn &F, const std::array< double, dim > xmin, const std::array< double, dim > &xmax)
Definition
NumericalIntegration.h:75
AmpGen::ProfileClock
Definition
ProfileClock.h:9
utils.h
AmpGen
DalitzIntegrator.h
Generated on
for AmpGen by
1.17.0