AmpGen 2.1
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"
14#include "AmpGen/ProfileClock.h"
15
16class TGraph;
17class TH1D;
18class TH2D;
19
20namespace AmpGen {
21 class Event;
22 class Projection2D;
23 class Projection;
27
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
void set(const double &s0, const double &s1, const double &s2, const double &s3)
double sqDp2(const Event &evt) const
DalitzIntegrator(const double &s0, const double &s1, const double &s2, const double &s3)
double integrateDP(FCN &&fcn, const double &s) const
std::pair< real_v, real_v > sqCo
double integrateDP(FCN &&fcn) const
real_v J(const sqCo &coords, const double &s) const
void setMother(const double &s)
real_v safe_sqrt(const real_v &x) const
TH1D * makePlot(const std::function< double(const double *)> &fcn, const Projection &projection, const std::string &name, const size_t &nSamples=1000000)
real_v getMAB(const sqCo &coords, const double &s) const
sqCo getCoordinates(const Event &evt) const
real_v getMAB(const sqCo &coords) const
real_v J(const sqCo &coords) const
TH2D * makePlot(const std::function< double(const double *)> &fcn, const Projection2D &projection, const std::string &name, const size_t &nSamples=1000000)
TGraph * makeBoundaryGraph(const Projection2D &) const
void setEvent(const sqCo &x, real_v *event) const
void setEvent(const sqCo &x, real_v *event, const double &s) const
double sqDp1(const Event &evt) const
Encapsulates the final state particles of a single event.
Definition Event.h:19
Complex< real_t > sqrt(const Complex< real_t > &v)
Definition Complex.h:100
AVX::real_v real_v
Definition utils.h:47
real_t real(const Complex< real_t > &arg)
Definition Complex.h:36
double integrate(const fcn &F, const std::array< double, dim > xmin, const std::array< double, dim > &xmax)