1 #ifndef NPSTAT_DENSITYAVESCANND_HH_
2 #define NPSTAT_DENSITYAVESCANND_HH_
41 const std::vector<Axis>& axes,
42 const unsigned nIntegrationPoints,
43 double normfactor=1.0)
44 : fcn_(fcn), axes_(new std::vector<Axis>(axes)), norm_(normfactor),
45 nInteg_(nIntegrationPoints), dim_(fcn.dim())
47 if (!(dim_ && dim_ == axes_->size()))
throw std::invalid_argument(
48 "In npstat::DensityAveScanND constructor: incompatible arguments");
49 if (dim_ > CHAR_BIT*
sizeof(
unsigned long))
throw std::invalid_argument(
50 "In npstat::DensityAveScanND constructor: dimensionality is too high");
53 inline void geBinCenter(
const unsigned* index,
const unsigned indexLen,
56 if (dim_ != indexLen)
throw std::invalid_argument(
57 "In npstat::DensityAveScanND::getBinCenter: "
58 "incompatible index dimensionality");
61 const Axis* axes = &(*axes_)[0];
62 for (
unsigned i=0; i<dim_; ++i)
63 center[i] = axes[i].binCenter(index[i]);
66 inline double geBinSize(
const unsigned* index,
const unsigned indexLen,
69 if (dim_ != indexLen)
throw std::invalid_argument(
70 "In npstat::DensityAveScanND::getBinSize: "
71 "incompatible index dimensionality");
75 const Axis* axes = &(*axes_)[0];
76 for (
unsigned i=0; i<dim_; ++i)
78 const double width = axes[i].binWidth(index[i]);
85 inline double operator()(
const unsigned* index,
const unsigned indexLen)
const
87 if (dim_ != indexLen)
throw std::invalid_argument(
88 "In npstat::DensityAveScanND::operator(): "
89 "incompatible input point dimensionality");
92 double center[CHAR_BIT*
sizeof(
unsigned long)];
93 geBinCenter(index, indexLen, center);
96 double size[CHAR_BIT*
sizeof(
unsigned long)];
97 const double volume = geBinSize(index, indexLen, size);
99 fcn_, center, size, dim_, nInteg_);
100 return norm_*integ/volume;
103 return norm_*fcn_(center, dim_);
109 DensityFunctorND fcn_;
110 std::shared_ptr<std::vector<Axis> > axes_;
117 inline void mapIndex(
const unsigned* index,
unsigned indexLen,
118 double* coords,
unsigned lenCoords)
120 if (dim_ != lenCoords)
throw std::invalid_argument(
121 "In npstat::DensityAveScanND::mapIndex: "
122 "incompatible coordinate dimensionality");
123 this->geBinCenter(index, indexLen, coords);
126 inline double mapBinSize(
const unsigned* index,
unsigned indexLen,
127 double* coords,
unsigned lenCoords)
129 if (dim_ != lenCoords)
throw std::invalid_argument(
130 "In npstat::DensityAveScanND::mapBinSize: "
131 "incompatible coordinate dimensionality");
132 return this->geBinSize(index, indexLen, coords);
139 inline DensityAveScanND<Axis> makeDensityAveScanND(
140 const AbsDistributionND& fcn,
const std::vector<Axis>& axes,
141 const unsigned nIntegPoints,
double normfactor=1.0)
143 return DensityAveScanND<Axis>(fcn, axes, nIntegPoints, normfactor);
155 const double normfactor,
156 const double discreteValue)
157 : fcn_(fcn), norm_(normfactor), h_(discreteValue) {}
161 inline virtual double operator()(
const double* pt,
unsigned dim)
const
163 const double d = norm_*fcn_.density(pt, dim) - h_;
167 inline virtual unsigned minDim()
const {
return fcn_.dim();}
Interface definition for multivariate continuous statistical distributions.
Definition: AbsDistributionND.hh:26
Definition: DensityAveScanND.hh:30
DensityAveScanND(const AbsDistributionND &fcn, const std::vector< Axis > &axes, const unsigned nIntegrationPoints, double normfactor=1.0)
Definition: DensityAveScanND.hh:40
Definition: DensityAveScanND.hh:152
virtual double operator()(const double *pt, unsigned dim) const
Definition: DensityAveScanND.hh:161
virtual unsigned minDim() const
Definition: DensityAveScanND.hh:167
Definition: AbsArrayProjector.hh:14
double rectangleIntegralCenterAndSize(const AbsMultivariateFunctor &f, const double *rectangleCenter, const double *rectangleSize, unsigned dim, unsigned integrationPoints)
Gaussian quadratures on rectangles and hyperrectangles using tensor product integration.
Definition: AbsMultivariateFunctor.hh:19