1#ifndef AMPGEN_DALITZINTEGRATOR_H
2#define AMPGEN_DALITZINTEGRATOR_H
33 typedef std::pair<real_v, real_v>
sqCo;
34 DalitzIntegrator(
const double& s0,
const double& s1,
const double& s2,
const double& s3);
36 template <
typename FCN>
double integrateDP( FCN&&
fcn,
const double& s)
const;
49 return select( x > 0. ,
sqrt(x) ,
real_v(0.) );
51 return x > 0 ? std::sqrt(x) : 0;
60 void set(
const double& s0,
const double& s1,
const double& s2,
const double& s3);
65 const std::string& name,
const size_t& nSamples = 1000000 );
68 const std::string& name,
const size_t& nSamples = 1000000 );
83 template <
typename FCN>
86 #if INSTRUCTION_SET != 0 && INSTRUCTION_SET != INSTRUCTION_SET_AVX2d
87 #pragma message("WARNING: DalitzIntegrator only supports scalar or AVX2(d) instruction sets")
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;
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.
Complex< real_t > sqrt(const Complex< real_t > &v)
real_t real(const Complex< real_t > &arg)
double integrate(const fcn &F, const std::array< double, dim > xmin, const std::array< double, dim > &xmax)