229 if (defaultPDF != 0) {
264 if (hist == NULL)
Log() << kFATAL <<
"Called without valid histogram pointer!" <<
Endl;
268 Log() << kFATAL <<
"Number of entries <= 0 (" << hist->
GetEntries() <<
" in histogram: " << hist->
GetTitle() <<
")" <<
Endl;
271 Log()<< kDEBUG <<
"Create "
275 <<
"type KDE kernel for histogram: \"" << hist->
GetName() <<
"\""
281 Log() << kFATAL <<
"PDF construction called with minnsmooth<0" <<
Endl;
285 Log() << kFATAL <<
"PDF construction called with maxnsmooth<minnsmooth" <<
Endl;
295 fHist ->SetDirectory(
nullptr);
308 Log() << kFATAL <<
"No number of bins set for PDF" <<
Endl;
358 Log() << kWARNING <<
"No valid interpolation method given! Use Spline2" <<
Endl;
360 Log() << kFATAL <<
" Well.. .thinking about it, I better quit so you notice you are forced to fix the mistake " <<
Endl;
374 if (integral < 0)
Log() << kFATAL <<
"Integral: " << integral <<
" <= 0" <<
Endl;
378 if (integral>0)
fPDFHist->Scale( 1.0/integral );
397 fHist, histoLowEdge, histoUpperEdge,
422 2*histoLowEdge-
fHist->GetBinCenter(
i),
427 if (
i > 4*
fHist->GetNbinsX()/5) {
433 2*histoUpperEdge-
fHist->GetBinCenter(
i),
i) );
445 if (integral < 0)
Log() << kFATAL <<
"Integral: " << integral <<
" <= 0" <<
Endl;
449 if (integral>0)
fPDFHist->Scale( 1.0/integral );
457 if(
fHist->GetNbinsX()==1)
return;
465 Float_t Err=0, ErrAvg=0, ErrRMS=0 ;
Int_t num=0, smooth;
466 for (
Int_t bin=0; bin<
fHist->GetNbinsX(); bin++) {
467 if (
fHist->GetBinContent(bin+1) <=
fHist->GetBinError(bin+1))
continue;
468 Err =
fHist->GetBinError(bin+1) /
fHist->GetBinContent(bin+1);
469 ErrAvg += Err; ErrRMS += Err*Err; num++;
475 Float_t MaxErr=ErrAvg+ErrRMS, MinErr=ErrAvg-ErrRMS;
479 for (
Int_t bin=0; bin<
fHist->GetNbinsX(); bin++) {
480 if (
fHist->GetBinContent(bin+1) <=
fHist->GetBinError(bin+1))
483 Err =
fHist->GetBinError(bin+1) /
fHist->GetBinContent(bin+1);
495 Int_t MinBin=-1,MaxBin =-1;
496 for (
Int_t bin=0; bin <
fHist->GetNbinsX(); bin++) {
498 if (MinBin==-1) MinBin = bin;
501 else if (MaxBin >= 0) {
502 fHist->Smooth(1,
"R");
556 Log() << kFATAL <<
"<CheckHist> Called without valid histogram pointer!" <<
Endl;
563 for (
Int_t bin=1; bin<=nbins; bin++)
564 if (
fHist->GetBinContent(bin) == 0) emptyBins++;
567 Log() << kWARNING <<
"More than 50% (" << (((
Float_t)emptyBins/(
Float_t)nbins)*100)
568 <<
"%) of the bins in hist '"
569 <<
fHist->GetName() <<
"' are empty!" <<
Endl;
596 for (
Int_t bin=1; bin<=nbins; bin++) {
602 if (binPdfHist<0)
continue;
614 if (
d > 1) { nc1++;
if (
d > 2) { nc2++;
if (
d > 3) { nc3++;
if (
d > 6) nc6++; } } }
618 Log() << kDEBUG <<
"Validation result for PDF \"" << originalHist->
GetTitle() <<
"\"" <<
": " <<
Endl;
621 if ((1.0 -
TMath::Prob( chi2, ndof )) > 0.9999994) {
622 Log() << kDEBUG <<
"Comparison of the original histogram \"" << originalHist->
GetTitle() <<
"\"" <<
Endl;
623 Log() << kDEBUG <<
"with the corresponding PDF gave a chi2/ndof of " << chi2/ndof <<
"," <<
Endl;
624 Log() << kDEBUG <<
"which corresponds to a deviation of more than 5 sigma! Please check!" <<
Endl;
626 Log() << kDEBUG <<
TString::Format(
" #bins-found(#expected-bins) deviating > [1,2,3,6] sigmas: " \
627 "[%i(%i),%i(%i),%i(%i),%i(%i)]",
663 if (imin < 1) imin = 1;
666 for (
Int_t bini = imin; bini <= imax; bini++) {
669 if (bini == imin) dx =
fPDFHist->GetBinLowEdge(bini+1) -
xmin;
670 else if (bini == imax) dx =
xmax -
fPDFHist->GetBinLowEdge(bini);
671 if (dx < 0 && dx > -1.0e-8) dx = 0;
674 <<
"dx = " << dx << std::endl
675 <<
"bini = " << bini << std::endl
676 <<
"xmin = " <<
xmin << std::endl
677 <<
"xmax = " <<
xmax << std::endl
678 <<
"imin = " << imin << std::endl
679 <<
"imax = " << imax << std::endl
680 <<
"low edge of imin" <<
fPDFHist->GetBinLowEdge(imin) << std::endl
681 <<
"low edge of imin+1" <<
fPDFHist->GetBinLowEdge(imin+1) <<
Endl;
682 Log() << kFATAL <<
"<GetIntegral> dx = " << dx <<
" < 0" <<
Endl;
684 integral +=
fPDFHist->GetBinContent(bini)*dx;
712 retval =
fPDFHist->GetBinContent( bin );
717 if ((
x >
fPDFHist->GetBinCenter(bin) && bin !=
fPDFHist->GetNbinsX()) || bin == 1)
725 retval =
fPDFHist->GetBinContent( bin ) + (
x -
fPDFHist->GetBinCenter( bin ))*dy/dx;
736 Int_t lowerBin=0, higherBin=0;
737 Double_t lowerBinValue=0, higherBinValue=0;
746 fraction=(
y-lowerBinValue)/
length;
748 Double_t lengthX =xValueHigherBin-xValueLowerBin;
749 Double_t x =xValueLowerBin+lengthX*fraction;
764 if (isMonotonouslyIncreasingFunction) {
768 Int_t bin=higherBin/2;
770 while (bin>lowerBin && bin<higherBin) {
775 higherBinValue=binContent;
777 else if (
y>=binContent){
779 lowerBinValue =binContent;
781 bin=lowerBin+(higherBin-lowerBin)/2;
786 for (
Int_t bin=0, binEnd=histogram->
GetNbinsX(); bin<binEnd; ++bin) {
791 lowerBinValue =binContent;
792 higherBinValue=binContent;
796 higherBinValue=binContent;
823 "Number of smoothing iterations for the input histograms" );
825 "Min number of smoothing iterations, for bins with most data" );
828 "Max number of smoothing iterations, for bins with least data" );
831 "Average number of events per PDF bin" );
834 "Defined number of bins for the histogram from which the PDF is created" );
837 "Whether or not to check the source histogram of the PDF" );
840 "Interpolation method for reference histograms (e.g. Spline2 or KDE)" );
856 "Fine tuning factor for Adaptive KDE: Factor to multiply the width of the kernel");
859 "Border effects treatment (1=no treatment , 2=kernel renormalization, 3=sample mirroring)" );
878 if (fMaxNsmooth < fMinNsmooth && fMinNsmooth >= 0) {
879 Log() << kFATAL <<
"ERROR: MaxNsmooth = "
884 Log() << kFATAL <<
"ERROR: MaxNsmooth = "
937 gTools().
AddAttr(pdfhist,
"HasEquidistantBins", hasEquidistantBinning );
946 if (!hasEquidistantBinning) {
947 void* pdfhistbins =
gTools().
AddChild(pdfxml,
"HistogramBinning" );
976 Bool_t hasEquidistantBinning;
983 gTools().
ReadAttr( histch,
"HasEquidistantBins", hasEquidistantBinning );
987 if (hasEquidistantBinning) {
991 std::stringstream s(content);
1000 std::stringstream s(content);
1006 if (nbinning != nbins) {
1007 Log() << kFATAL <<
"Number of bins in content and binning array differs"<<
Endl;
1010 std::stringstream sb(binString);
1021 hnameSmooth.
ReplaceAll(
"_original",
"_smoothed" );
1026 fHist->SetTitle( hnameSmooth );
1027 fHist->SetDirectory(
nullptr);
1038 Int_t dp = os.precision();
1039 os <<
"MinNSmooth " << pdf.
fMinNsmooth << std::endl;
1040 os <<
"MaxNSmooth " << pdf.
fMaxNsmooth << std::endl;
1042 os <<
"KDE_type " << pdf.
fKDEtype << std::endl;
1043 os <<
"KDE_iter " << pdf.
fKDEiter << std::endl;
1044 os <<
"KDE_border " << pdf.
fKDEborder << std::endl;
1045 os <<
"KDE_finefactor " << pdf.
fFineFactor << std::endl;
1060 os <<
"Weights " << std::endl;
1061 os << std::setprecision(8);
1063 os << std::setw(15) << std::left << histToWrite->
GetBinContent(
i+1) << std::right <<
" ";
1064 if ((
i+1)%5==0) os << std::endl;
1067 os << std::setprecision(dp);
1080 TString hname=
"_original";
1082 while (!doneReading) {
1084 if (devnullS==
"NSmooth")
1085 {istr >> pdf.fMinNsmooth; pdf.fMaxNsmooth=pdf.fMinNsmooth;}
1086 else if (devnullS==
"MinNSmooth") istr >> pdf.fMinNsmooth;
1087 else if (devnullS==
"MaxNSmooth") istr >> pdf.fMaxNsmooth;
1093 else if (devnullS ==
"KDE_finefactor") {
1094 istr >> pdf.fFineFactor;
1095 if (pdf.GetReadingVersion() != 0 && pdf.GetReadingVersion() <
TMVA_VERSION(3,7,3)) {
1098 doneReading =
kTRUE;
1101 else if (devnullS ==
"Histogram") { istr >> hname >> nbins >>
xmin >>
xmax; }
1102 else if (devnullS ==
"Weights") { doneReading =
kTRUE; }
1105 TString hnameSmooth = hname;
1106 hnameSmooth.
ReplaceAll(
"_original",
"_smoothed" );
1110 std::cout <<
"PDF, trying to create a histogram without defined binning"<< std::endl;
1113 TH1* newhist =
new TH1F( hname,hname, nbins,
xmin,
xmax );
1121 if (pdf.fHistOriginal != 0)
delete pdf.fHistOriginal;
1122 pdf.fHistOriginal = newhist;
1123 pdf.fHist = (TH1F*)pdf.fHistOriginal->
Clone( hnameSmooth );
1124 pdf.fHist->SetTitle( hnameSmooth );
1125 pdf.fHist->SetDirectory(
nullptr);
1127 if (pdf.fMinNsmooth>=0) pdf.BuildSplinePDF();
if(isa< VarDecl >(D)||isa< FieldDecl >(D)||isa< EnumConstantDecl >(D))
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h length
char * Form(const char *fmt,...)
Formats a string in a circular formatting buffer.
TVectorT< Double_t > TVectorD
#define TMVA_VERSION(a, b, c)
virtual Double_t GetBinLowEdge(Int_t bin) const
Return low edge of bin.
A TGraph is an object made of two arrays X and Y with npoints each.
1-D histogram with a float per channel (see TH1 documentation)
1-D histogram with an int per channel (see TH1 documentation)
TH1 is the base class of all histogram classes in ROOT.
virtual void SetDirectory(TDirectory *dir)
By default, when a histogram is created, it is added to the list of histogram objects in the current ...
virtual Double_t GetBinCenter(Int_t bin) const
Return bin center for 1D histogram.
virtual Double_t GetBinError(Int_t bin) const
Return value of error associated to bin number bin.
virtual Int_t GetNbinsX() const
virtual void SetBinContent(Int_t bin, Double_t content)
Set bin content see convention for numbering bins in TH1::GetBin In case the bin number is greater th...
virtual Double_t GetEntries() const
Return the current number of entries.
virtual Double_t GetBinContent(Int_t bin) const
Return content of bin number bin.
virtual TArrayD * GetSumw2()
virtual Double_t GetBinWidth(Int_t bin) const
Return bin width for 1D histogram.
TObject * Clone(const char *newname="") const override
Make a complete copy of the underlying object.
virtual Double_t GetSumOfWeights() const
Return the sum of weights excluding under/overflows.
virtual void Sumw2(Bool_t flag=kTRUE)
Create structure to store sum of squares of weights.
void SetConfigDescription(const char *d)
OptionBase * DeclareOptionRef(T &ref, const TString &name, const TString &desc="")
void AddPreDefVal(const T &)
void SetConfigName(const char *n)
Configurable(const TString &theOption="")
constructor
KDE Kernel for "smoothing" the PDFs.
void SetKernelType(EKernelType ktype=kGauss)
fIter == 1 ---> nonadaptive KDE fIter == 2 ---> adaptive KDE
Float_t GetBinKernelIntegral(Float_t lowr, Float_t highr, Float_t mean, Int_t binnum)
calculates the integral of the Kernel
ostringstream derivative to redirect and format output
PDF wrapper for histograms; uses user-defined spline interpolation.
static const Bool_t fgManualIntegration
manual integration (sum over bins) or DGAUSS
KDEKernel::EKernelType fKDEtype
Kernel type to use for KDE.
void FillHistToGraph()
Simple conversion.
void BuildPDF(const TH1 *theHist)
KDEKernel::EKernelBorder fKDEborder
The method to take care about "border" effects (string)
static Double_t IGetVal(Double_t *, Double_t *)
static external auxiliary function (integrand)
TString fBorderMethodString
Int_t fMaxNsmooth
Max number of smoothing iterations.
TH1 * fPDFHist
the high-binned histogram corresponding to the PDF
Bool_t UseHistogram() const
void ValidatePDF(TH1 *original=nullptr) const
comparison of original histogram with reference PDF
TMVA::PDF::EInterpolateMethod fInterpolMethod
interpolation method
TSpline * fSpline
! the used spline type
UInt_t fReadingVersion
the TMVA version of the weight file
TGraph * fGraph
! needed to create PDF from histogram
Double_t GetValInverse(Double_t y, Bool_t isMonotonouslyIncreasingFunction=kFALSE) const
returns value
Double_t GetPdfHistBinWidth() const
void CheckHist() const
sanity check: compare PDF with original histogram
void FindBinInverse(const TH1 *histogram, Int_t &lowerBin, Int_t &higherBin, Double_t &lowerBinValue, Double_t &higherBinValue, Double_t y, Bool_t isMonotonouslyIncreasingFunction=kFALSE) const
find bin from value on ordinate
Int_t fHistDefinedNBins
source hist bin num set by user
TString fPDFName
for output
void ReadXML(void *pdfnode)
XML file reading.
TString fInterpolateString
Int_t fNsmooth
Min number of smoothing iterations.
void DeclareOptions()
define the options (their key words) that can be set in the option string
TF1 * fIGetVal
integration interface
void AddXMLTo(void *parent)
XML file writing.
void BuildSplinePDF()
build the PDF from the original histograms
TH1 * fNSmoothHist
number of smooth for each bin
void FillSplineToHist()
creates high-binned reference histogram to be used instead of the PDF for speed reasons
void BuildKDEPDF()
creates high-binned reference histogram to be used instead of the PDF for speed reasons
Int_t fMinNsmooth
Min number of smoothing iterations.
Int_t GetHistNBins(Int_t evtNum=0)
static const Double_t fgEpsilon
minimum PDF return
TH1 * GetOriginalHist() const
Float_t fFineFactor
fine tuning factor for Adaptive KDE
static PDF *& GetThisPdfThreadLocal()
Double_t GetVal(Double_t x) const
returns value PDF(x)
Int_t fHistAvgEvtPerBin
avg event per source hist bin
Double_t GetIntegral() const
computes normalisation
Bool_t fCheckHist
check of source histogram
MsgLogger * fLogger
! message logger
TString fKDEtypeString
strings used to read definitions
Bool_t fNormalize
normalize histogram (false for cumulative distribution used in GaussTranform)
TString fSuffix
! the suffix for options
Double_t GetIntegral(Double_t xmin, Double_t xmax)
computes PDF integral within given ranges
TH1 * fHistOriginal
the input histogram
static const Int_t fgNbin_PdfHist
number of bins in high-binned reference histogram
PDF(const TString &name, Bool_t norm=kTRUE)
default constructor needed for ROOT I/O
KDEKernel::EKernelIter fKDEiter
Number of iterations (adaptive or not)
const char * GetName() const
Returns name of object.
TH1 * fHist
copy of input histogram
static PDF * ThisPDF(void)
Linear interpolation of TGraph.
Quadratic interpolation of TGraph.
const char * GetName() const override
Returns name of object.
const char * GetTitle() const override
Returns title of object.
Class to create third splines to interpolate knots Arbitrary conditions can be introduced for first a...
Class to create quintic natural splines to interpolate knots Arbitrary conditions can be introduced f...
TString & ReplaceAll(const TString &s1, const TString &s2)
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
Element * GetMatrixArray()
std::istream & operator>>(std::istream &istr, BinaryTree &tree)
std::ostream & operator<<(std::ostream &os, const BinaryTree &tree)
MsgLogger & Endl(MsgLogger &ml)
Short_t Max(Short_t a, Short_t b)
Returns the largest of a and b.
Double_t Prob(Double_t chi2, Int_t ndf)
Computation of the probability for a certain Chi-squared (chi2) and number of degrees of freedom (ndf...
Double_t Sqrt(Double_t x)
Returns the square root of x.
Short_t Min(Short_t a, Short_t b)
Returns the smallest of a and b.
Short_t Abs(Short_t d)
Returns the absolute value of parameter Short_t d.