71 fInterpolMethod(
PDF::kSpline2 ),
78 fHistAvgEvtPerBin ( 0 ),
79 fHistDefinedNBins ( 0 ),
82 fBorderMethodString( 0 ),
83 fInterpolateString ( 0 ),
89 fCheckHist ( kFALSE ),
95 GetThisPdfThreadLocal() =
this;
111 fMinNsmooth ( minnsmooth ),
112 fMaxNsmooth ( maxnsmooth ),
114 fInterpolMethod( method ),
121 fHistAvgEvtPerBin ( 0 ),
122 fHistDefinedNBins ( 0 ),
123 fKDEtypeString ( 0 ),
124 fKDEiterString ( 0 ),
125 fBorderMethodString( 0 ),
126 fInterpolateString ( 0 ),
131 fReadingVersion( 0 ),
132 fCheckHist ( checkHist ),
223 if (defaultPDF != 0) {
258 if (hist ==
NULL)
Log() <<
kFATAL <<
"Called without valid histogram pointer!" <<
Endl;
269 <<
"type KDE kernel for histogram: \"" << hist->
GetName() <<
"\"" 275 Log() <<
kFATAL <<
"PDF construction called with minnsmooth<0" <<
Endl;
279 Log() <<
kFATAL <<
"PDF construction called with maxnsmooth<minnsmooth" <<
Endl;
352 Log() <<
kWARNING <<
"No valid interpolation method given! Use Spline2" <<
Endl;
354 Log() <<
kFATAL <<
" Well.. .thinking about it, I better quit so you notice you are forced to fix the mistake " <<
Endl;
368 if (integral < 0)
Log() <<
kFATAL <<
"Integral: " << integral <<
" <= 0" <<
Endl;
391 fHist, histoLowEdge, histoUpperEdge,
410 if (i < fHist->GetNbinsX()/5 ) {
439 if (integral < 0)
Log() <<
kFATAL <<
"Integral: " << integral <<
" <= 0" <<
Endl;
463 ErrAvg +=
Err; ErrRMS += Err*
Err; num++;
469 Float_t MaxErr=ErrAvg+ErrRMS, MinErr=ErrAvg-ErrRMS;
489 Int_t MinBin=-1,MaxBin =-1;
492 if (MinBin==-1) MinBin = bin;
495 else if (MaxBin >= 0) {
496 #if ROOT_VERSION_CODE > ROOT_VERSION(5,19,2) 554 Log() <<
kFATAL <<
"<CheckHist> Called without valid histogram pointer!" <<
Endl;
566 <<
"%) of the bins in hist '" 600 if (binPdfHist<0)
continue;
612 if (d > 1) { nc1++;
if (d > 2) { nc2++;
if (d > 3) { nc3++;
if (d > 6) nc6++; } } }
616 Log() <<
kDEBUG <<
"Validation result for PDF \"" << originalHist->
GetTitle() <<
"\"" <<
": " <<
Endl;
617 Log() <<
kDEBUG <<
Form(
" chi2/ndof(!=0) = %.1f/%i = %.2f (Prob = %.2f)",
619 if ((1.0 -
TMath::Prob( chi2, ndof )) > 0.9999994) {
620 Log() <<
kDEBUG <<
"Comparison of the original histogram \"" << originalHist->
GetTitle() <<
"\"" <<
Endl;
621 Log() <<
kDEBUG <<
"with the corresponding PDF gave a chi2/ndof of " << chi2/ndof <<
"," <<
Endl;
622 Log() <<
kDEBUG <<
"which corresponds to a deviation of more than 5 sigma! Please check!" <<
Endl;
624 Log() <<
kDEBUG <<
Form(
" #bins-found(#expected-bins) deviating > [1,2,3,6] sigmas: " \
625 "[%i(%i),%i(%i),%i(%i),%i(%i)]",
661 if (imin < 1) imin = 1;
664 for (
Int_t bini = imin; bini <= imax; bini++) {
669 if (dx < 0 && dx > -1.0
e-8) dx = 0;
672 <<
"dx = " << dx << std::endl
673 <<
"bini = " << bini << std::endl
674 <<
"xmin = " << xmin << std::endl
675 <<
"xmax = " << xmax << std::endl
676 <<
"imin = " << imin << std::endl
677 <<
"imax = " << imax << std::endl
680 Log() <<
kFATAL <<
"<GetIntegral> dx = " << dx <<
" < 0" <<
Endl;
734 Int_t lowerBin=0, higherBin=0;
735 Double_t lowerBinValue=0, higherBinValue=0;
736 FindBinInverse(
fPDFHist,lowerBin,higherBin,lowerBinValue,higherBinValue,y,isMonotonouslyIncreasingFunction);
741 Double_t length =(higherBinValue-lowerBinValue);
744 fraction=(y-lowerBinValue)/length;
746 Double_t lengthX =xValueHigherBin-xValueLowerBin;
747 Double_t x =xValueLowerBin+lengthX*fraction;
762 if (isMonotonouslyIncreasingFunction) {
766 Int_t bin=higherBin/2;
768 while (bin>lowerBin && bin<higherBin) {
773 higherBinValue=binContent;
775 else if (y>=binContent){
777 lowerBinValue =binContent;
779 bin=lowerBin+(higherBin-lowerBin)/2;
784 for (
Int_t bin=0, binEnd=histogram->
GetNbinsX(); bin<binEnd; ++bin) {
789 lowerBinValue =binContent;
790 higherBinValue=binContent;
794 higherBinValue=binContent;
819 "Number of smoothing iterations for the input histograms" );
821 "Min number of smoothing iterations, for bins with most data" );
824 "Max number of smoothing iterations, for bins with least data" );
827 "Average number of events per PDF bin" );
830 "Defined number of bins for the histogram from which the PDF is created" );
833 "Whether or not to check the source histogram of the PDF" );
836 "Interpolation method for reference histograms (e.g. Spline2 or KDE)" );
852 "Fine tuning factor for Adaptive KDE: Factor to multyply the width of the kernel");
855 "Border effects treatment (1=no treatment , 2=kernel renormalization, 3=sample mirroring)" );
874 if (fMaxNsmooth < fMinNsmooth && fMinNsmooth >= 0) {
875 Log() <<
kFATAL <<
"ERROR: MaxNsmooth = " 880 Log() <<
kFATAL <<
"ERROR: MaxNsmooth = " 902 Log() <<
kFATAL <<
"unknown setting for option 'KDEiter': " <<
fKDEtypeString << ((fSuffix==
"")?
"":
Form(
" for pdf with suffix %s",fSuffix.Data())) <<
Endl;
908 Log() <<
kFATAL <<
"unknown setting for option 'KDEBorder': " <<
fKDEtypeString << ((fSuffix==
"")?
"":
Form(
" for pdf with suffix %s",fSuffix.Data())) <<
Endl;
933 gTools().
AddAttr(pdfhist,
"HasEquidistantBins", hasEquidistantBinning );
942 if (!hasEquidistantBinning) {
943 void* pdfhistbins =
gTools().
AddChild(pdfxml,
"HistogramBinning" );
972 Bool_t hasEquidistantBinning;
979 gTools().
ReadAttr( histch,
"HasEquidistantBins", hasEquidistantBinning );
983 if (hasEquidistantBinning) {
984 newhist =
new TH1F( hname, hname, nbins, xmin, xmax );
987 std::stringstream s(content);
996 std::stringstream s(content);
1002 if (nbinning != nbins) {
1003 Log() <<
kFATAL <<
"Number of bins in content and binning array differs"<<
Endl;
1006 std::stringstream sb(binString);
1007 for (
UInt_t i=0; i<=nbins; i++) sb >> binns[i];
1008 newhist =
new TH1F( hname, hname, nbins, binns.GetMatrixArray() );
1017 hnameSmooth.
ReplaceAll(
"_original",
"_smoothed" );
1034 Int_t dp = os.precision();
1035 os <<
"MinNSmooth " << pdf.
fMinNsmooth << std::endl;
1036 os <<
"MaxNSmooth " << pdf.
fMaxNsmooth << std::endl;
1038 os <<
"KDE_type " << pdf.
fKDEtype << std::endl;
1039 os <<
"KDE_iter " << pdf.
fKDEiter << std::endl;
1040 os <<
"KDE_border " << pdf.
fKDEborder << std::endl;
1041 os <<
"KDE_finefactor " << pdf.
fFineFactor << std::endl;
1056 os <<
"Weights " << std::endl;
1057 os << std::setprecision(8);
1058 for (
Int_t i=0; i<nBins; i++) {
1059 os << std::setw(15) << std::left << histToWrite->
GetBinContent(i+1) << std::right <<
" ";
1060 if ((i+1)%5==0) os << std::endl;
1063 os << std::setprecision(dp);
1078 while (!doneReading) {
1080 if (devnullS==
"NSmooth")
1082 else if (devnullS==
"MinNSmooth") istr >> pdf.
fMinNsmooth;
1083 else if (devnullS==
"MaxNSmooth") istr >> pdf.
fMaxNsmooth;
1089 else if (devnullS ==
"KDE_finefactor") {
1093 istr >> nbins >> xmin >>
xmax;
1094 doneReading =
kTRUE;
1097 else if (devnullS ==
"Histogram") { istr >> hname >> nbins >> xmin >>
xmax; }
1098 else if (devnullS ==
"Weights") { doneReading =
kTRUE; }
1102 hnameSmooth.
ReplaceAll(
"_original",
"_smoothed" );
1106 std::cout <<
"PDF, trying to create a histogram without defined binning"<< std::endl;
1109 TH1* newhist =
new TH1F( hname,hname, nbins, xmin,
xmax );
virtual const char * GetName() const
Returns name of object.
virtual Int_t FindBin(Double_t x, Double_t y=0, Double_t z=0)
Return Global bin number corresponding to x,y,z.
virtual void Scale(Double_t c1=1, Option_t *option="")
Multiply this histogram by a constant c1.
Double_t GetValInverse(Double_t y, Bool_t isMonotonouslyIncreasingFunction=kFALSE) const
returns value PDF^{-1}(y)
TString fBorderMethodString
virtual Double_t GetBinCenter(Int_t bin) const
Return bin center for 1D histogram.
THist< 1, int, THistStatContent > TH1I
MsgLogger & Endl(MsgLogger &ml)
void ReadXML(void *pdfnode)
XML file reading.
Double_t GetIntegral() const
computes normalisation
static const Double_t fgEpsilon
virtual void SetDirectory(TDirectory *dir)
By default when an histogram is created, it is added to the list of histogram objects in the current ...
MsgLogger & Log() const
message logger
virtual Double_t GetBinLowEdge(Int_t bin) const
Return low edge of bin.
TString & ReplaceAll(const TString &s1, const TString &s2)
void BuildPDF(const TH1 *theHist)
Double_t GetPdfHistBinWidth() const
virtual void SetName(const char *name)
Set the name of the TNamed.
THist< 1, float, THistStatContent, THistStatUncertainty > TH1F
OptionBase * DeclareOptionRef(T &ref, const TString &name, const TString &desc="")
virtual Double_t GetSumOfWeights() const
Return the sum of weights excluding under/overflows.
virtual Double_t GetBinContent(Int_t bin) const
Return content of bin number bin.
static const Int_t fgNbin_PdfHist
virtual Double_t GetMean(Int_t axis=1) const
For axis = 1,2 or 3 returns the mean value of the histogram along X,Y or Z axis.
tomato 1-D histogram with a float per channel (see TH1 documentation)}
Short_t Min(Short_t a, Short_t b)
virtual void Smooth(Int_t ntimes=1, Option_t *option="")
Smooth bin contents of this histogram.
PDF(const TString &name, Bool_t norm=kTRUE)
default constructor needed for ROOT I/O
virtual Double_t GetBinLowEdge(Int_t bin) const
Return bin lower edge for 1D histogram.
virtual Double_t Integral(Double_t a, Double_t b, Double_t epsrel=1.e-12)
IntegralOneDim or analytical integral.
void CheckHist() const
sanity check: compare PDF with original histogram
UInt_t GetReadingVersion() const
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...
TF1 * fIGetVal
needed to create PDF from histogram
TMVA::PDF::EInterpolateMethod fInterpolMethod
static PDF * ThisPDF(void)
virtual TArrayD * GetSumw2()
virtual void AddBinContent(Int_t bin)
Increment bin content by 1.
const char * GetName() const
Returns name of object.
static const Bool_t fgManualIntegration
void BuildSplinePDF()
build the PDF from the original histograms
Bool_t UseHistogram() const
Int_t GetHistNBins(Int_t evtNum=0)
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...
char * Form(const char *fmt,...)
virtual Double_t Eval(Double_t x) const =0
std::ostream & operator<<(std::ostream &os, const BinaryTree &tree)
print the tree recursinvely using the << operator
std::istream & operator>>(std::istream &istr, BinaryTree &tree)
read the tree from an std::istream
MsgLogger * fLogger
the suffix for options
virtual void SetName(const char *name)
Change the name of this histogram.
void DeclareOptions()
define the options (their key words) that can be set in the option string know options: PDFInterpol[i...
#define TMVA_VERSION(a, b, c)
virtual Double_t GetBinWidth(Int_t bin) const
Return bin width for 1D histogram.
void BuildKDEPDF()
creates high-binned reference histogram to be used instead of the PDF for speed reasons ...
static PDF *& GetThisPdfThreadLocal()
Float_t GetBinKernelIntegral(Float_t lowr, Float_t highr, Float_t mean, Int_t binnum)
calculates the integral of the Kernel
you should not use this method at all Int_t Int_t Double_t Double_t Double_t e
virtual Double_t GetEntries() const
Return the current number of entries.
void AddPreDefVal(const T &)
void AddXMLTo(void *parent)
XML file writing.
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
TH1 * fPDFHist
the used spline type
void SetConfigName(const char *n)
void ValidatePDF(TH1 *original=0) const
comparison of original histogram with reference PDF
Abstract ClassifierFactory template that handles arbitrary types.
void Err(int level, const char *msg, int size)
Short_t Max(Short_t a, Short_t b)
virtual void Sumw2(Bool_t flag=kTRUE)
Create structure to store sum of squares of weights.
A Graph is a graphics object made of two arrays X and Y with npoints each.
TH1 * GetOriginalHist() const
TObject * Clone(const char *newname=0) const
Make a complete copy of the underlying object.
static Double_t IGetVal(Double_t *, Double_t *)
static external auxiliary function (integrand)
KDEKernel::EKernelIter fKDEiter
TString()
TString default ctor.
virtual void SetEntries(Double_t n)
void SetKernelType(EKernelType ktype=kGauss)
fIter == 1 —> nonadaptive KDE fIter == 2 —> adaptive KDE
virtual void SetTitle(const char *title)
Change (i.e.
TString fInterpolateString
virtual Int_t GetNbinsX() const
Double_t Sqrt(Double_t x)
virtual void SetTitle(const char *title="")
Set the title of the TNamed.
void FillSplineToHist()
creates high-binned reference histogram to be used instead of the PDF for speed reasons ...
double norm(double *x, double *p)
KDEKernel::EKernelBorder fKDEborder
KDEKernel::EKernelType fKDEtype
void FillHistToGraph()
Simple conversion.
virtual const char * GetTitle() const
Returns title of object.
Double_t GetVal(Double_t x) const
returns value PDF(x)
void SetConfigDescription(const char *d)
virtual Double_t GetBinError(Int_t bin) const
Return value of error associated to bin number bin.
const char * Data() const