50 return bins->GetBinDensity(bin1) < bins->GetBinDensity(bin2);
59 return bins->GetBinDensity(bin1) > bins->GetBinDensity(bin2);
75: fData(0), fBinMinEdges(std::vector<
Double_t>()), fBinMaxEdges(std::vector<
Double_t>()), fDataBins((
TKDTreeID*)0), fDim(dataDim),
76fDataSize(dataSize), fDataThresholds(std::vector<std::pair<
Double_t,
Double_t> >(fDim, std::make_pair(0., 0.))),
84 this->
Warning(
"TKDTreeBinning",
"Data is nil. Nothing is built.");
99: fData(0), fBinMinEdges(std::vector<
Double_t>()), fBinMaxEdges(std::vector<
Double_t>()), fDataBins((
TKDTreeID*)0), fNBins (nBins), fDim(dataDim),
100fDataSize(dataSize), fDataThresholds(std::vector<std::pair<
Double_t,
Double_t> >(fDim, std::make_pair(0., 0.))),
108 this->
Warning(
"TKDTreeBinning",
"Data is nil. Nothing is built.");
136 this->
Info(
"SetNBins",
"Number of bins is not enough to hold the data. Extra bin added.");
145 this->
Warning(
"SetNBins",
"Number of bins is bigger than data size. Nothing is built.");
150 this->
Warning(
"SetNBins",
"Data dimension is nil. Nothing is built.");
152 this->
Warning(
"SetNBins",
"Number of bins is nil. Nothing is built.");
154 this->
Warning(
"SetNBins",
"Data size is nil. Nothing is built.");
164 std::vector<UInt_t> indices(
fNBins);
168 std::sort(indices.begin(), indices.end(),
CompareAsc(
this));
171 std::sort(indices.begin(), indices.end(),
CompareDesc(
this));
174 std::vector<Double_t> binMinEdges(
fNBins *
fDim);
175 std::vector<Double_t> binMaxEdges(
fNBins *
fDim);
176 std::vector<UInt_t> binContent(
fNBins );
256 fCommonBinEdges = std::vector<std::map<Double_t, std::vector<UInt_t> > >(
fDim, std::map<Double_t, std::vector<UInt_t> >());
285 std::vector<UInt_t> commonBinEdges;
289 commonBinEdges.push_back(minBinEdgePos);
290 UInt_t maxBinEdgePos = ++minBinEdgePos;
292 commonBinEdges.push_back(maxBinEdgePos);
309 if (adjustedBinEdge != 0)
310 adjustedBinEdge *= (1. + eps);
312 adjustedBinEdge += eps;
316 Bool_t isMinBinEdge = binEdgePos % 2 == 0;
317 UInt_t bin = isMinBinEdge ? (binEdgePos / 2 - i) /
fDim : ((binEdgePos - 1) / 2 - i) /
fDim;
318 binEdges[binEdgePos] = adjustedBinEdge;
338 binEdge *= (1. + eps);
353 this->
Warning(
"GetBinsMinEdges",
"Binning kd-tree is nil. No bin edges retrieved.");
354 this->
Info(
"GetBinsMinEdges",
"Returning null pointer.");
364 this->
Warning(
"GetBinsMaxEdges",
"Binning kd-tree is nil. No bin edges retrieved.");
365 this->
Info(
"GetBinsMaxEdges",
"Returning null pointer.");
374 this->
Warning(
"GetBinsEdges",
"Binning kd-tree is nil. No bin edges retrieved.");
375 this->
Info(
"GetBinsEdges",
"Returning null pointer pair.");
385 this->
Warning(
"GetBinMinEdges",
"No such bin. 'bin' is between 0 and %d",
fNBins - 1);
387 this->
Warning(
"GetBinMinEdges",
"Binning kd-tree is nil. No bin edges retrieved.");
388 this->
Info(
"GetBinMinEdges",
"Returning null pointer.");
398 this->
Warning(
"GetBinMaxEdges",
"No such bin. 'bin' is between 0 and %d",
fNBins - 1);
400 this->
Warning(
"GetBinMaxEdges",
"Binning kd-tree is nil. No bin edges retrieved.");
401 this->
Info(
"GetBinMaxEdges",
"Returning null pointer.");
411 this->
Warning(
"GetBinEdges",
"No such bin. 'bin' is between 0 and %d",
fNBins - 1);
413 this->
Warning(
"GetBinEdges",
"Binning kd-tree is nil. No bin edges retrieved.");
414 this->
Info(
"GetBinEdges",
"Returning null pointer pair.");
432 this->
Warning(
"GetBinContent",
"No such bin. Returning 0.");
433 this->
Info(
"GetBinContent",
"'bin' is between 0 and %d.",
fNBins - 1);
442 this->
Warning(
"GetTree",
"Binning kd-tree is nil. No embedded kd-tree retrieved. Returning null pointer.");
450 this->
Warning(
"GetDimData",
"No such dimensional coordinate. No coordinate data retrieved. Returning null pointer.");
451 this->
Info(
"GetDimData",
"'dim' is between 0 and %d.",
fDim - 1);
459 this->
Warning(
"GetDataMin",
"No such dimensional coordinate. No coordinate data minimum retrieved. Returning +inf.");
460 this->
Info(
"GetDataMin",
"'dim' is between 0 and %d.",
fDim - 1);
461 return std::numeric_limits<Double_t>::infinity();
468 this->
Warning(
"GetDataMax",
"No such dimensional coordinate. No coordinate data maximum retrieved. Returning -inf.");
469 this->
Info(
"GetDataMax",
"'dim' is between 0 and %d.",
fDim - 1);
470 return -1 * std::numeric_limits<Double_t>::infinity();
479 this->
Warning(
"GetBinDensity",
"Volume is null. Returning -1.");
482 this->
Warning(
"GetBinDensity",
"No such bin. Returning -1.");
483 this->
Info(
"GetBinDensity",
"'bin' is between 0 and %d.",
fNBins - 1);
490 std::pair<const Double_t*, const Double_t*> binEdges =
GetBinEdges(bin);
493 volume *= (binEdges.second[i] - binEdges.first[i]);
497 this->
Warning(
"GetBinVolume",
"No such bin. Returning 0.");
498 this->
Info(
"GetBinVolume",
"'bin' is between 0 and %d.",
fNBins - 1);
510 this->
Warning(
"GetOneDimBinEdges",
"Data is multidimensional. No sorted bin edges retrieved. Returning null pointer.");
511 this->
Info(
"GetOneDimBinEdges",
"This method can only be invoked if the data is a one dimensional set");
518 this->
Warning(
"SortOneDimBinEdges",
"Data is multidimensional. Cannot sorted bin edges. Returning null pointer.");
519 this->
Info(
"SortOneDimBinEdges",
"This method can only be invoked if the data is a one dimensional set");
523 std::vector<UInt_t> indices(
fNBins);
526 std::vector<Double_t> binMinEdges(
fNBins );
527 std::vector<Double_t> binMaxEdges(
fNBins );
528 std::vector<UInt_t> binContent(
fNBins );
558 std::pair<const Double_t*, const Double_t*> binEdges =
GetBinEdges(bin);
560 result[i] = (binEdges.second[i] + binEdges.first[i]) / 2.;
564 this->
Warning(
"GetBinCenter",
"No such bin. Returning null pointer.");
565 this->
Info(
"GetBinCenter",
"'bin' is between 0 and %d.",
fNBins - 1);
574 std::pair<const Double_t*, const Double_t*> binEdges =
GetBinEdges(bin);
576 result[i] = (binEdges.second[i] - binEdges.first[i]);
580 this->
Warning(
"GetBinWidth",
"No such bin. Returning null pointer.");
581 this->
Info(
"GetBinWidth",
"'bin' is between 0 and %d.",
fNBins - 1);
619 for (
unsigned int i = 0; i <
fNBins; ++i) {
642 std::vector<Double_t> point(
fDim);
643 std::vector< std::vector<Double_t> > thePoints;
644 if (
fData.size() == 0) {
645 Error(
"GetPointsInBin",
"Internal data set is not valid");
649 Error(
"GetPointsInBin",
"Internal TKDTree is not valid");
653 Error(
"GetPointsInBin",
"Invalid bin number");
660 thePoints.resize(npoints);
661 for (
int ipoint = 0; ipoint < npoints; ++ipoint) {
662 for (
unsigned int idim = 0; idim <
fDim; ++idim) {
665 thePoints[ipoint] = point;
672void TKDTreeBinning::Streamer(
TBuffer &
b) {
673 if (
b.IsReading() ) {
TKDTree< Int_t, Double_t > TKDTreeID
TRObject operator()(const T1 &t1) const
Class describing the binned data sets : vectors of x coordinates, y values and optionally error on y ...
void AddBinUpEdge(const double *xup)
add the bin width data, a pointer to an array with the bin upper edge information.
void Add(double x, double y)
add one dim data with only coordinate and values
void Initialize(unsigned int newPoints, unsigned int dim=1, ErrorType err=kValueError)
Buffer base class used for serializing objects.
<- TKDTreeBinning - A class providing multidimensional binning ->
std::vector< UInt_t > fBinsContent
Flags if the bin edges are sorted densitywise (or by bin-edge for 1D) in ascending order.
friend struct CompareDesc
! Predicate for descending sort
void ReadjustMinBinEdges(Double_t *binEdges)
TKDTreeBinning()
Default constructor (for I/O)
std::pair< const Double_t *, const Double_t * > GetBinsEdges() const
Returns a pair of an array with all bins minimum and maximum edges.
const Double_t * GetBinMaxEdges(UInt_t bin) const
Returns the bin's maximum edges. 'bin' is between 0 and fNBins - 1.
const Double_t * GetBinWidth(UInt_t bin) const
Returns a pointer to the vector of the bin widths.
const Double_t * GetBinsMaxEdges() const
Returns an array with all bins' maximum edges The edges are arranges as xmax_1,ymax_1,...
void SetCommonBinEdges(Double_t *binEdges)
const Double_t * GetBinCenter(UInt_t bin) const
Returns the geometric center of of the bin.
UInt_t GetBinMaxDensity() const
Return the bin with maximum density.
~TKDTreeBinning()
Class's destructor.
std::pair< const Double_t *, const Double_t * > GetBinEdges(UInt_t bin) const
Returns a pir with the bin's edges. 'bin' is between 0 and fNBins - 1.
UInt_t GetNBins() const
Returns the number of bins.
friend struct CompareAsc
! Predicate for ascending sort
void SetData(Double_t *data)
Disallowed assign operator.
void SetNBins(UInt_t bins)
Sets binning inner structure.
UInt_t fDataSize
The data dimension.
Double_t GetDataMax(UInt_t dim) const
Returns the maximum of the data in the dim coordinate. 'dim' is between 0 and fDim - 1.
const Double_t * GetBinMinEdges(UInt_t bin) const
Returns the bin's minimum edges. 'bin' is between 0 and fNBins - 1.
Double_t GetDataMin(UInt_t dim) const
Returns the minimum of the data in the dim coordinate. 'dim' is between 0 and fDim - 1.
UInt_t GetBinContent(UInt_t bin) const
Returns the number of points in bin. 'bin' is between 0 and fNBins - 1.
void FillBinData(ROOT::Fit::BinData &data) const
Fill the bin data set (class ROOT::Fit::BinData) with the result of the TKDTree binning.
std::vector< Double_t > fData
Double_t GetBinVolume(UInt_t bin) const
Returns the (hyper)volume of bin. 'bin' is between 0 and fNBins - 1.
std::vector< std::pair< Double_t, Double_t > > fDataThresholds
The data size.
void SortBinsByDensity(Bool_t sortAsc=kTRUE)
Sorts bins by their density.
std::vector< UInt_t > fIndices
The maximum values for the bins' edges for each dimension.
std::vector< Double_t > fBinMinEdges
[fDataSize*fDim] The data from which a KDTree partition is computed for binning
std::vector< Double_t > fBinMaxEdges
The minimum values for the bins' edges for each dimension.
void ReadjustMaxBinEdges(Double_t *binEdges)
std::vector< std::vector< std::pair< Bool_t, Bool_t > > > fCheckedBinEdges
Minimum and maximum data values.
UInt_t fDim
The number of bins.
UInt_t FindBin(const Double_t *point) const
find the corresponding bin index given the coordinate of a point
Double_t GetBinDensity(UInt_t bin) const
Returns the density in bin.
TKDTreeID * fDataBins
Index of the bins in the kd-tree (needed when bins are sorted)
Bool_t fIsSortedAsc
Flags if the bin edges are sorted densitywise (or by bin endges in case of 1-dim )
std::vector< std::vector< Double_t > > GetPointsInBin(UInt_t bin) const
Return the corresponding point belonging to the bin i.
std::vector< std::map< Double_t, std::vector< UInt_t > > > fCommonBinEdges
! Auxiliary structure for readjusting the bin edges. Keeps the common bin boundaries
const Double_t * GetBinsMinEdges() const
Returns an array with all bins' minimum edges The edges are arranges as xmin_1,ymin_1,...
void SetBinMinMaxEdges(Double_t *binEdges)
UInt_t GetBinMinDensity() const
Return the bin with minimum density.
const Double_t * GetOneDimBinEdges() const
Returns a pointer to the vector of the bin edges for one dimensional binning only.
const Double_t * GetDimData(UInt_t dim) const
UInt_t GetDim() const
Returns the number of dimensions.
TKDTreeID * GetTree() const
Returns the kD-Tree structure of the binning.
const Double_t * SortOneDimBinEdges(Bool_t sortAsc=kTRUE)
Sort the one-dimensional bin edges and retuns a pointer to them.
Class implementing a kd-tree.
void SetData(Index npoints, Index ndim, UInt_t bsize, Value **data)
Set the data array. See the constructor function comments for details.
Index FindNode(const Value *point) const
returns the index of the terminal node to which point belongs (index in the fAxis,...
Index * GetPointsIndexes(Int_t node) const
return the indices of the points in that terminal node for all the nodes except last,...
void Build()
Build the kd-tree.
Index GetNPointsNode(Int_t node) const
Get number of points in this node for all the terminal nodes except last, the size is fBucketSize for...
Value * GetBoundary(const Int_t node)
Get a boundary.
R__ALWAYS_INLINE Bool_t TestBit(UInt_t f) const
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
virtual void Info(const char *method, const char *msgfmt,...) const
Issue info message.
VecExpr< UnaryOp< Fabs< T >, VecExpr< A, T, D >, T >, T, D > fabs(const VecExpr< A, T, D > &rhs)
static constexpr double second
void Sort(Index n, const Element *a, Index *index, Bool_t down=kTRUE)