74: fData(0), fBinMinEdges(std::vector<
Double_t>()), fBinMaxEdges(std::vector<
Double_t>()), fDataBins((
TKDTreeID*)0), fDim(dataDim),
75fDataSize(dataSize), fDataThresholds(std::vector<std::pair<
Double_t,
Double_t> >(fDim, std::make_pair(0., 0.))),
83 this->
Warning(
"TKDTreeBinning",
"Data is nil. Nothing is built.");
98: fData(0), fBinMinEdges(std::vector<
Double_t>()), fBinMaxEdges(std::vector<
Double_t>()), fDataBins((
TKDTreeID*)0), fNBins (nBins), fDim(dataDim),
99fDataSize(dataSize), fDataThresholds(std::vector<std::pair<
Double_t,
Double_t> >(fDim, std::make_pair(0., 0.))),
107 this->
Warning(
"TKDTreeBinning",
"Data is nil. Nothing is built.");
135 this->
Info(
"SetNBins",
"Number of bins is not enough to hold the data. Extra bin added.");
144 this->
Warning(
"SetNBins",
"Number of bins is bigger than data size. Nothing is built.");
149 this->
Warning(
"SetNBins",
"Data dimension is nil. Nothing is built.");
151 this->
Warning(
"SetNBins",
"Number of bins is nil. Nothing is built.");
153 this->
Warning(
"SetNBins",
"Data size is nil. Nothing is built.");
163 std::vector<UInt_t> indices(
fNBins);
167 std::sort(indices.begin(), indices.end(),
CompareAsc(
this));
170 std::sort(indices.begin(), indices.end(),
CompareDesc(
this));
173 std::vector<Double_t> binMinEdges(
fNBins *
fDim);
174 std::vector<Double_t> binMaxEdges(
fNBins *
fDim);
175 std::vector<UInt_t> binContent(
fNBins );
255 fCommonBinEdges = std::vector<std::map<Double_t, std::vector<UInt_t> > >(
fDim, std::map<Double_t, std::vector<UInt_t> >());
284 std::vector<UInt_t> commonBinEdges;
287 if (std::fabs(binEdge - binEdges[minBinEdgePos]) < std::numeric_limits<Double_t>::epsilon())
288 commonBinEdges.push_back(minBinEdgePos);
289 UInt_t maxBinEdgePos = ++minBinEdgePos;
290 if (std::fabs(binEdge - binEdges[maxBinEdgePos]) < std::numeric_limits<Double_t>::epsilon())
291 commonBinEdges.push_back(maxBinEdgePos);
307 double eps = -10*std::numeric_limits<Double_t>::epsilon();
308 if (adjustedBinEdge != 0)
309 adjustedBinEdge *= (1. + eps);
311 adjustedBinEdge += eps;
315 Bool_t isMinBinEdge = binEdgePos % 2 == 0;
316 UInt_t bin = isMinBinEdge ? (binEdgePos / 2 - i) /
fDim : ((binEdgePos - 1) / 2 - i) /
fDim;
317 binEdges[binEdgePos] = adjustedBinEdge;
335 double eps = 10*std::numeric_limits<Double_t>::epsilon();
337 binEdge *= (1. + eps);
352 this->
Warning(
"GetBinsMinEdges",
"Binning kd-tree is nil. No bin edges retrieved.");
353 this->
Info(
"GetBinsMinEdges",
"Returning null pointer.");
363 this->
Warning(
"GetBinsMaxEdges",
"Binning kd-tree is nil. No bin edges retrieved.");
364 this->
Info(
"GetBinsMaxEdges",
"Returning null pointer.");
373 this->
Warning(
"GetBinsEdges",
"Binning kd-tree is nil. No bin edges retrieved.");
374 this->
Info(
"GetBinsEdges",
"Returning null pointer pair.");
384 this->
Warning(
"GetBinMinEdges",
"No such bin. 'bin' is between 0 and %d",
fNBins - 1);
386 this->
Warning(
"GetBinMinEdges",
"Binning kd-tree is nil. No bin edges retrieved.");
387 this->
Info(
"GetBinMinEdges",
"Returning null pointer.");
397 this->
Warning(
"GetBinMaxEdges",
"No such bin. 'bin' is between 0 and %d",
fNBins - 1);
399 this->
Warning(
"GetBinMaxEdges",
"Binning kd-tree is nil. No bin edges retrieved.");
400 this->
Info(
"GetBinMaxEdges",
"Returning null pointer.");
410 this->
Warning(
"GetBinEdges",
"No such bin. 'bin' is between 0 and %d",
fNBins - 1);
412 this->
Warning(
"GetBinEdges",
"Binning kd-tree is nil. No bin edges retrieved.");
413 this->
Info(
"GetBinEdges",
"Returning null pointer pair.");
431 this->
Warning(
"GetBinContent",
"No such bin. Returning 0.");
432 this->
Info(
"GetBinContent",
"'bin' is between 0 and %d.",
fNBins - 1);
441 this->
Warning(
"GetTree",
"Binning kd-tree is nil. No embedded kd-tree retrieved. Returning null pointer.");
449 this->
Warning(
"GetDimData",
"No such dimensional coordinate. No coordinate data retrieved. Returning null pointer.");
450 this->
Info(
"GetDimData",
"'dim' is between 0 and %d.",
fDim - 1);
458 this->
Warning(
"GetDataMin",
"No such dimensional coordinate. No coordinate data minimum retrieved. Returning +inf.");
459 this->
Info(
"GetDataMin",
"'dim' is between 0 and %d.",
fDim - 1);
460 return std::numeric_limits<Double_t>::infinity();
467 this->
Warning(
"GetDataMax",
"No such dimensional coordinate. No coordinate data maximum retrieved. Returning -inf.");
468 this->
Info(
"GetDataMax",
"'dim' is between 0 and %d.",
fDim - 1);
469 return -1 * std::numeric_limits<Double_t>::infinity();
478 this->
Warning(
"GetBinDensity",
"Volume is null. Returning -1.");
481 this->
Warning(
"GetBinDensity",
"No such bin. Returning -1.");
482 this->
Info(
"GetBinDensity",
"'bin' is between 0 and %d.",
fNBins - 1);
489 std::pair<const Double_t*, const Double_t*> binEdges =
GetBinEdges(bin);
492 volume *= (binEdges.second[i] - binEdges.first[i]);
496 this->
Warning(
"GetBinVolume",
"No such bin. Returning 0.");
497 this->
Info(
"GetBinVolume",
"'bin' is between 0 and %d.",
fNBins - 1);
509 this->
Warning(
"GetOneDimBinEdges",
"Data is multidimensional. No sorted bin edges retrieved. Returning null pointer.");
510 this->
Info(
"GetOneDimBinEdges",
"This method can only be invoked if the data is a one dimensional set");
517 this->
Warning(
"SortOneDimBinEdges",
"Data is multidimensional. Cannot sorted bin edges. Returning null pointer.");
518 this->
Info(
"SortOneDimBinEdges",
"This method can only be invoked if the data is a one dimensional set");
522 std::vector<UInt_t> indices(
fNBins);
525 std::vector<Double_t> binMinEdges(
fNBins );
526 std::vector<Double_t> binMaxEdges(
fNBins );
527 std::vector<UInt_t> binContent(
fNBins );
557 std::pair<const Double_t*, const Double_t*> binEdges =
GetBinEdges(bin);
559 result[i] = (binEdges.second[i] + binEdges.first[i]) / 2.;
563 this->
Warning(
"GetBinCenter",
"No such bin. Returning null pointer.");
564 this->
Info(
"GetBinCenter",
"'bin' is between 0 and %d.",
fNBins - 1);
573 std::pair<const Double_t*, const Double_t*> binEdges =
GetBinEdges(bin);
575 result[i] = (binEdges.second[i] - binEdges.first[i]);
579 this->
Warning(
"GetBinWidth",
"No such bin. Returning null pointer.");
580 this->
Info(
"GetBinWidth",
"'bin' is between 0 and %d.",
fNBins - 1);
618 for (
unsigned int i = 0; i <
fNBins; ++i) {
641 std::vector<Double_t> point(
fDim);
642 std::vector< std::vector<Double_t> > thePoints;
643 if (
fData.size() == 0) {
644 Error(
"GetPointsInBin",
"Internal data set is not valid");
648 Error(
"GetPointsInBin",
"Internal TKDTree is not valid");
652 Error(
"GetPointsInBin",
"Invalid bin number");
659 thePoints.resize(npoints);
660 for (
int ipoint = 0; ipoint < npoints; ++ipoint) {
661 for (
unsigned int idim = 0; idim <
fDim; ++idim) {
664 thePoints[ipoint] = point;
671void TKDTreeBinning::Streamer(
TBuffer &
b) {
672 if (
b.IsReading() ) {
675 b.ReadClassBuffer(TKDTreeBinning::Class(),
this,
v, R__s, R__c);
682 b.WriteClassBuffer(TKDTreeBinning::Class(),
this);
TKDTree< Int_t, Double_t > TKDTreeID
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.
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.
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.
void Sort(Index n, const Element *a, Index *index, Bool_t down=kTRUE)
const TKDTreeBinning * bins
CompareAsc(const TKDTreeBinning *treebins)
Bool_t operator()(UInt_t bin1, UInt_t bin2)
const TKDTreeBinning * bins
Bool_t operator()(UInt_t bin1, UInt_t bin2)
CompareDesc(const TKDTreeBinning *treebins)