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{
22 class Event;
23 class Projection2D;
24 class Projection;
28
30 {
31 public:
32
33 typedef std::pair<real_v, real_v> sqCo;
34 DalitzIntegrator( const double& s0, const double& s1, const double& s2, const double& s3);
35
36 template <typename FCN> double integrateDP( FCN&& fcn, const double& s) const;
37 template <typename FCN> double integrateDP( FCN&& fcn ) const
38 {
39 return integrateDP( fcn, m_s0 );
40 }
41 real_v getMAB(const sqCo& coords) const;
42 real_v J(const sqCo& coords) const;
43 real_v getMAB(const sqCo& coords , const double& s) const;
44 real_v J(const sqCo& coords, const double& s) const;
45 double sqDp1(const Event& evt) const;
46 double sqDp2(const Event& evt) const;
47 real_v safe_sqrt(const real_v& x ) const {
48 #if ENABLE_AVX
49 return select( x > 0. , sqrt(x) , real_v(0.) );
50 #else
51 return x > 0 ? std::sqrt(x) : 0;
52 #endif
53 }
54 void setEvent(const sqCo& x, real_v* event, const double& s) const;
55
56 void debug() const;
57 void setEvent(const sqCo& x, real_v* event) const;
58
59
60 void set(const double& s0, const double& s1, const double& s2, const double& s3);
61 void setMin();
62 void setMother(const double& s);
63
64 TH1D* makePlot( const std::function<double(const double*)>& fcn, const Projection& projection,
65 const std::string& name, const size_t& nSamples = 1000000 );
66
67 TH2D* makePlot( const std::function<double(const double*)>& fcn, const Projection2D& projection,
68 const std::string& name, const size_t& nSamples = 1000000 );
69
70 sqCo getCoordinates( const Event& evt ) const;
71
72
73 TGraph* makeBoundaryGraph( const Projection2D& ) const;
74 private:
75 double m_min;
76 double m_max;
77 double m_s0;
78 double m_s1;
79 double m_s2;
80 double m_s3;
81
82 };
83 template <typename FCN>
84 double DalitzIntegrator::integrateDP( FCN&& fcn, const double& s) const
85 {
86 #if INSTRUCTION_SET != 0 && INSTRUCTION_SET != INSTRUCTION_SET_AVX2d
87 #pragma message("WARNING: DalitzIntegrator only supports scalar or AVX2(d) instruction sets")
88 #else
89 real_v event[12] = {0.};
90 ProfileClock pc1;
91 auto i1 = integrate<2>( [&]( const std::array<real_v,2>& x ) {
92 setEvent( *reinterpret_cast<const sqCo*>(&x) , event, s);
93 return J( *reinterpret_cast<const sqCo*>(&x) , s) * real( fcn(event) ); }, std::array<double,2>{0., 0.}, std::array<double, 2>{1.,1.} ) /s;
94 return i1;
95 #endif
96 return 0;
97 }
98
99
100} // namespace AmpGen
101
102#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:18
Complex< real_t > sqrt(const Complex< real_t > &v)
Definition Complex.h:72
AVX::real_v real_v
Definition utils.h:46
real_t real(const Complex< real_t > &arg)
Definition Complex.h:42
double integrate(const fcn &F, const std::array< double, dim > xmin, const std::array< double, dim > &xmax)