1 #ifndef NPSTAT_ABSFILTER1DBUILDER_HH_
2 #define NPSTAT_ABSFILTER1DBUILDER_HH_
17 #include "geners/ClassId.hh"
18 #include "geners/CPP11_auto_ptr.hh"
36 inline explicit PolyFilter1D(
const unsigned peak) : peak_(peak) {}
38 inline unsigned peakPosition()
const {
return peak_;}
41 {
return peak_ == r.peak_ &&
42 static_cast<const std::vector<long double>&
>(*this) ==
43 static_cast<const std::vector<long double>&
>(r);}
46 {
return !(*
this == r);}
49 inline gs::ClassId classId()
const {
return gs::ClassId(*
this);}
50 bool write(std::ostream& os)
const;
52 static inline const char* classname() {
return "npstat::PolyFilter1D";}
53 static inline unsigned version() {
return 1;}
54 static PolyFilter1D* read(
const gs::ClassId&
id, std::istream& in);
62 inline double valueAt(
const unsigned i)
const {
return this->at(i);}
96 unsigned datalen)
const = 0;
106 inline PolyFilter1D* makeFilter_2(
const std::vector<double>& taper,
107 const unsigned maxDegree,
108 const unsigned binnum,
109 const unsigned datalen)
const
111 const double* tap = 0;
114 if (taper.size() < maxDegree + 1U)
throw std::invalid_argument(
115 "In npstat::AbsFilter1DBuilder::makeFilter_2: "
116 "insufficient taper length");
119 return this->
makeFilter(tap, maxDegree, binnum, datalen);
136 unsigned datalen)
const;
145 unsigned* filterCenter)
const = 0;
168 double centralStepSize,
169 const unsigned char* exclusionMask = 0,
170 unsigned exclusionMaskLen = 0,
171 bool excludeCentralPoint =
false);
178 {
return !exclusionMask_.empty();}
183 unsigned* filterCenter)
const;
196 {
return lastBandwidthFactor_;}
201 int datalen,
int weightCenterPos,
202 double stepSize,
double* workbuf,
203 unsigned* firstWeightUsed=0,
unsigned* sizeNeeded=0)
const;
213 virtual double calculateCriterion(
215 int datalen,
int weightCenterPos,
216 double stepSize,
double* workbuf)
const = 0;
220 class Fnc :
public Functor1<double,double>
224 const unsigned datalen,
const unsigned binnum)
225 : ref_(ref), datalen_(datalen), binnum_(binnum) {}
226 inline virtual ~Fnc() {}
228 inline double operator()(
const double& h)
const
230 return ref_.calculateCriterion(ref_.distro_, h, datalen_,
231 binnum_, ref_.step_, &ref_.w_[0]);
235 const AbsBoundaryFilter1DBuilder& ref_;
240 const AbsDistribution1D* distro_;
242 mutable double lastBandwidthFactor_;
243 mutable double centralIntegral_;
245 mutable unsigned centralIntegralLen_;
246 mutable std::vector<double> w_;
247 std::vector<unsigned char> exclusionMask_;
248 bool excludeCentralPoint_;
287 const unsigned char* exclusionMask = 0,
unsigned exclusionMaskLen = 0,
288 bool excludeCentralPoint =
false);
295 const std::vector<int>* exclusionMask = 0,
296 bool excludeCentralPoint =
false)
298 typedef CPP11_auto_ptr<AbsBoundaryFilter1DBuilder> BPtr;
301 bool have_mask =
false;
303 if (!exclusionMask->empty())
307 const unsigned n = exclusionMask->size();
308 std::vector<unsigned char> mask(n, 0);
309 for (
unsigned i=0; i<n; ++i)
310 if ((*exclusionMask)[i])
313 boundaryMethod, distro, stepSize,
314 &mask[0], n, excludeCentralPoint);
319 boundaryMethod, distro, stepSize,
320 (
unsigned char*)0, 0U, excludeCentralPoint);
Interface definition for 1-d continuous statistical distributions.
API for LOrPE boundary handling methods.
Interface definitions and concrete simple functors for a variety of functor-based calculations.
Definition: AbsFilter1DBuilder.hh:156
virtual OrthoPoly1D * makeOrthoPoly(unsigned maxDegree, unsigned binnum, unsigned datalen, unsigned *filterCenter) const
virtual unsigned centralWeightLength() const
Definition: AbsFilter1DBuilder.hh:175
virtual double lastBandwidthFactor() const
Definition: AbsFilter1DBuilder.hh:195
virtual bool isFolding() const =0
AbsBoundaryFilter1DBuilder(const AbsDistribution1D *distro, double centralStepSize, const unsigned char *exclusionMask=0, unsigned exclusionMaskLen=0, bool excludeCentralPoint=false)
virtual bool keepAllFilters() const
Definition: AbsFilter1DBuilder.hh:177
Definition: BoundaryHandling.hh:21
Definition: OrthoPoly1D.hh:29
Definition: AbsFilter1DBuilder.hh:34
Definition: AbsArrayProjector.hh:14
CPP11_auto_ptr< AbsBoundaryFilter1DBuilder > getBoundaryFilter1DBuilder(const BoundaryHandling &boundaryHandling, const AbsDistribution1D *distro, double stepSize, const unsigned char *exclusionMask=0, unsigned exclusionMaskLen=0, bool excludeCentralPoint=false)
Definition: AbsDistribution1D.hh:31
Definition: AbsFilter1DBuilder.hh:71
virtual PolyFilter1D * makeFilter(const double *taper, unsigned maxDegree, unsigned binnum, unsigned datalen) const =0
virtual bool keepAllFilters() const =0
virtual unsigned centralWeightLength() const =0
virtual double lastBandwidthFactor() const
Definition: AbsFilter1DBuilder.hh:103
Definition: SimpleFunctors.hh:58
Definition: AbsFilter1DBuilder.hh:129
virtual PolyFilter1D * makeFilter(const double *taper, unsigned maxDegree, unsigned binnum, unsigned datalen) const
virtual OrthoPoly1D * makeOrthoPoly(unsigned maxDegree, unsigned binnum, unsigned datalen, unsigned *filterCenter) const =0