76 fInterpolMethod(
PDF::kSpline2 ),
83 fHistAvgEvtPerBin ( 0 ),
84 fHistDefinedNBins ( 0 ),
87 fBorderMethodString( 0 ),
88 fInterpolateString ( 0 ),
119 fInterpolMethod(
method ),
126 fHistAvgEvtPerBin ( 0 ),
127 fHistDefinedNBins ( 0 ),
128 fKDEtypeString ( 0 ),
129 fKDEiterString ( 0 ),
130 fBorderMethodString( 0 ),
131 fInterpolateString ( 0 ),
136 fReadingVersion( 0 ),
163 fInterpolMethod(
PDF::kKDE ),
170 fHistAvgEvtPerBin ( 0 ),
171 fHistDefinedNBins ( 0 ),
172 fKDEtypeString ( 0 ),
173 fKDEiterString ( 0 ),
174 fBorderMethodString( 0 ),
175 fInterpolateString ( 0 ),
180 fReadingVersion( 0 ),
204 fInterpolMethod(
PDF::kSpline0 ),
211 fHistAvgEvtPerBin ( 50 ),
212 fHistDefinedNBins ( 0 ),
213 fKDEtypeString (
"Gauss" ),
214 fKDEiterString (
"Nonadaptive" ),
215 fBorderMethodString(
"None" ),
216 fInterpolateString (
"Spline2" ),
221 fReadingVersion( 0 ),
248 if (fSpline !=
NULL)
delete fSpline;
249 if (fHist !=
NULL)
delete fHist;
250 if (fPDFHist !=
NULL)
delete fPDFHist;
251 if (fHistOriginal !=
NULL)
delete fHistOriginal;
252 if (fIGetVal !=
NULL)
delete fIGetVal;
253 if (fGraph !=
NULL)
delete fGraph;
261 GetThisPdfThreadLocal() =
this;
263 if (hist ==
NULL) Log() << kFATAL <<
"Called without valid histogram pointer!" <<
Endl;
267 Log() << kFATAL <<
"Number of entries <= 0 (" << hist->
GetEntries() <<
" in histogram: " << hist->
GetTitle() <<
")" <<
Endl;
270 Log()<< kDEBUG <<
"Create "
274 <<
"type KDE kernel for histogram: \"" << hist->
GetName() <<
"\""
280 Log() << kFATAL <<
"PDF construction called with minnsmooth<0" <<
Endl;
281 else if (fMaxNsmooth<=0)
282 fMaxNsmooth = fMinNsmooth;
283 else if (fMaxNsmooth<fMinNsmooth)
284 Log() << kFATAL <<
"PDF construction called with maxnsmooth<minnsmooth" <<
Endl;
289 fHistOriginal->SetTitle( fHistOriginal->GetName() );
290 fHist ->SetTitle( fHist->GetName() );
293 fHistOriginal->SetDirectory(
nullptr);
294 fHist ->SetDirectory(
nullptr);
297 if (fInterpolMethod ==
PDF::kKDE) BuildKDEPDF();
298 else BuildSplinePDF();
306 if (
evtNum == 0 && fHistDefinedNBins == 0)
307 Log() << kFATAL <<
"No number of bins set for PDF" <<
Endl;
308 else if (fHistDefinedNBins > 0)
310 else if (
evtNum > 0 && fHistAvgEvtPerBin > 0 )
313 Log() << kFATAL <<
"No number of bins or average event per bin set for PDF" << fHistAvgEvtPerBin <<
Endl;
323 if (fInterpolMethod !=
PDF::kSpline0 && fCheckHist) CheckHist();
326 if (fMaxNsmooth > 0 && fMinNsmooth >=0 ) SmoothHistogram();
332 switch (fInterpolMethod) {
337 fUseHistogram =
kTRUE;
349 fSpline =
new TSpline3(
"spline3", fGraph );
353 fSpline =
new TSpline5(
"spline5", fGraph );
357 Log() << kWARNING <<
"No valid interpolation method given! Use Spline2" <<
Endl;
359 Log() << kFATAL <<
" Well.. .thinking about it, I better quit so you notice you are forced to fix the mistake " <<
Endl;
365 if (!UseHistogram()) {
366 fSpline->SetTitle( (
TString)fHist->GetTitle() + fSpline->GetTitle() );
367 fSpline->SetName ( (
TString)fHist->GetName() + fSpline->GetName() );
373 if (integral < 0) Log() << kFATAL <<
"Integral: " << integral <<
" <= 0" <<
Endl;
377 if (integral>0) fPDFHist->Scale( 1.0/integral );
379 fPDFHist->SetDirectory(
nullptr);
388 fPDFHist =
new TH1F(
"",
"", fgNbin_PdfHist, GetXmin(), GetXmax() );
389 fPDFHist->SetTitle( (
TString)fHist->GetTitle() +
"_hist from_KDE" );
390 fPDFHist->SetName ( (
TString)fHist->GetName() +
"_hist_from_KDE" );
394 Float_t histoUpperEdge = fPDFHist->GetBinLowEdge(fPDFHist->GetNbinsX()) + fPDFHist->GetBinWidth(fPDFHist->GetNbinsX());
397 fKDEborder, fFineFactor );
398 kern->SetKernelType(fKDEtype);
400 for (
Int_t i=1;i<fHist->GetNbinsX();i++) {
402 for (
Int_t j=1;
j<fPDFHist->GetNbinsX();
j++) {
404 fPDFHist->AddBinContent(
j,fHist->GetBinContent(i)*
405 kern->GetBinKernelIntegral(fPDFHist->GetBinLowEdge(
j),
406 fPDFHist->GetBinLowEdge(
j+1),
407 fHist->GetBinCenter(i),
411 if (fKDEborder == 3) {
416 for (
Int_t j=1;
j<fPDFHist->GetNbinsX();
j++) {
418 fPDFHist->AddBinContent(
j,fHist->GetBinContent(i)*
419 kern->GetBinKernelIntegral(fPDFHist->GetBinLowEdge(
j),
420 fPDFHist->GetBinLowEdge(
j+1),
426 if (i > 4*fHist->GetNbinsX()/5) {
427 for (
Int_t j=1;
j<fPDFHist->GetNbinsX();
j++) {
429 fPDFHist->AddBinContent(
j,fHist->GetBinContent(i)*
430 kern->GetBinKernelIntegral(fPDFHist->GetBinLowEdge(
j),
431 fPDFHist->GetBinLowEdge(
j+1),
438 fPDFHist->SetEntries(fHist->GetEntries());
444 if (integral < 0) Log() << kFATAL <<
"Integral: " << integral <<
" <= 0" <<
Endl;
448 if (integral>0) fPDFHist->Scale( 1.0/integral );
449 fPDFHist->SetDirectory(
nullptr);
456 if(fHist->GetNbinsX()==1)
return;
457 if (fMaxNsmooth == fMinNsmooth) {
458 fHist->Smooth( fMinNsmooth );
465 for (
Int_t bin=0; bin<fHist->GetNbinsX(); bin++) {
466 if (fHist->GetBinContent(bin+1) <= fHist->GetBinError(bin+1))
continue;
467 Err = fHist->GetBinError(bin+1) / fHist->GetBinContent(bin+1);
475 fNSmoothHist =
new TH1I(
"",
"",fHist->GetNbinsX(),0,fHist->GetNbinsX());
476 fNSmoothHist->SetTitle( (
TString)fHist->GetTitle() +
"_Nsmooth" );
477 fNSmoothHist->SetName ( (
TString)fHist->GetName() +
"_Nsmooth" );
478 for (
Int_t bin=0; bin<fHist->GetNbinsX(); bin++) {
479 if (fHist->GetBinContent(bin+1) <= fHist->GetBinError(bin+1))
482 Err = fHist->GetBinError(bin+1) / fHist->GetBinContent(bin+1);
486 fNSmoothHist->SetBinContent(bin+1,
smooth);
491 for (
Int_t n=fMaxNsmooth;
n>=0;
n--) {
493 if (
n <= fMinNsmooth) { fHist->Smooth();
continue; }
495 for (
Int_t bin=0; bin < fHist->GetNbinsX(); bin++) {
496 if (fNSmoothHist->GetBinContent(bin+1) >=
n) {
501 fHist->Smooth(1,
"R");
524 if (UseHistogram()) {
526 fPDFHist = (
TH1*)fHist->Clone();
527 fPDFHist->SetTitle( (
TString)fHist->GetTitle() +
"_hist from_spline0" );
528 fPDFHist->SetName ( (
TString)fHist->GetName() +
"_hist_from_spline0" );
532 fPDFHist =
new TH1F(
"",
"", fgNbin_PdfHist, GetXmin(), GetXmax() );
533 fPDFHist->SetTitle( (
TString)fHist->GetTitle() +
"_hist from_" + fSpline->GetTitle() );
534 fPDFHist->SetName ( (
TString)fHist->GetName() +
"_hist_from_" + fSpline->GetTitle() );
536 for (
Int_t bin=1; bin <= fgNbin_PdfHist; bin++) {
537 Double_t x = fPDFHist->GetBinCenter( bin );
542 if (
y <= fgEpsilon)
y = fHist->GetBinContent( fHist->FindBin(
x ) );
543 fPDFHist->SetBinContent( bin,
TMath::Max(
y, fgEpsilon) );
546 fPDFHist->SetDirectory(
nullptr);
555 Log() << kFATAL <<
"<CheckHist> Called without valid histogram pointer!" <<
Endl;
558 Int_t nbins = fHist->GetNbinsX();
562 for (
Int_t bin=1; bin<=nbins; bin++)
563 if (fHist->GetBinContent(bin) == 0)
emptyBins++;
567 <<
"%) of the bins in hist '"
568 << fHist->GetName() <<
"' are empty!" <<
Endl;
569 Log() << kWARNING <<
"X_min=" << GetXmin()
570 <<
" mean=" << fHist->GetMean() <<
" X_max= " << GetXmax() <<
Endl;
595 for (
Int_t bin=1; bin<=nbins; bin++) {
613 if (
d > 1) {
nc1++;
if (
d > 2) {
nc2++;
if (
d > 3) {
nc3++;
if (
d > 6)
nc6++; } } }
617 Log() << kDEBUG <<
"Validation result for PDF \"" <<
originalHist->GetTitle() <<
"\"" <<
": " <<
Endl;
618 Log() << kDEBUG <<
TString::Format(
" chi2/ndof(!=0) = %.1f/%i = %.2f (Prob = %.2f)",
621 Log() << kDEBUG <<
"Comparison of the original histogram \"" <<
originalHist->GetTitle() <<
"\"" <<
Endl;
622 Log() << kDEBUG <<
"with the corresponding PDF gave a chi2/ndof of " <<
chi2/ndof <<
"," <<
Endl;
623 Log() << kDEBUG <<
"which corresponds to a deviation of more than 5 sigma! Please check!" <<
Endl;
625 Log() << kDEBUG <<
TString::Format(
" #bins-found(#expected-bins) deviating > [1,2,3,6] sigmas: " \
626 "[%i(%i),%i(%i),%i(%i),%i(%i)]",
636 Double_t integral = fPDFHist->GetSumOfWeights();
637 integral *= GetPdfHistBinWidth();
647 return ThisPDF()->GetVal(
x[0] );
657 if (fgManualIntegration) {
663 if (
imax > fPDFHist->GetNbinsX())
imax = fPDFHist->GetNbinsX();
673 <<
"dx = " <<
dx << std::endl
674 <<
"bini = " <<
bini << std::endl
675 <<
"xmin = " <<
xmin << std::endl
676 <<
"xmax = " <<
xmax << std::endl
677 <<
"imin = " <<
imin << std::endl
678 <<
"imax = " <<
imax << std::endl
679 <<
"low edge of imin" << fPDFHist->GetBinLowEdge(
imin) << std::endl
680 <<
"low edge of imin+1" << fPDFHist->GetBinLowEdge(
imin+1) <<
Endl;
681 Log() << kFATAL <<
"<GetIntegral> dx = " <<
dx <<
" < 0" <<
Endl;
683 integral += fPDFHist->GetBinContent(
bini)*
dx;
690 if (fIGetVal == 0) fIGetVal =
new TF1(
"IGetVal",
PDF::IGetVal, GetXmin(), GetXmax(), 0 );
691 integral = fIGetVal->Integral(
xmin,
xmax );
703 Int_t bin = fPDFHist->FindBin(
x);
709 if (UseHistogram()) {
711 retval = fPDFHist->GetBinContent( bin );
716 if ((
x > fPDFHist->GetBinCenter(bin) && bin != fPDFHist->GetNbinsX()) || bin == 1)
723 Double_t dy = fPDFHist->GetBinContent( bin ) - fPDFHist->GetBinContent(
nextbin );
724 retval = fPDFHist->GetBinContent( bin ) + (
x - fPDFHist->GetBinCenter( bin ))*
dy/
dx;
821 DeclareOptionRef( fNsmooth,
TString::Format(
"NSmooth%s",fSuffix.Data()),
822 "Number of smoothing iterations for the input histograms" );
823 DeclareOptionRef( fMinNsmooth,
TString::Format(
"MinNSmooth%s",fSuffix.Data()),
824 "Min number of smoothing iterations, for bins with most data" );
826 DeclareOptionRef( fMaxNsmooth,
TString::Format(
"MaxNSmooth%s",fSuffix.Data()),
827 "Max number of smoothing iterations, for bins with least data" );
829 DeclareOptionRef( fHistAvgEvtPerBin,
TString::Format(
"NAvEvtPerBin%s",fSuffix.Data()),
830 "Average number of events per PDF bin" );
832 DeclareOptionRef( fHistDefinedNBins,
TString::Format(
"Nbins%s",fSuffix.Data()),
833 "Defined number of bins for the histogram from which the PDF is created" );
835 DeclareOptionRef( fCheckHist,
TString::Format(
"CheckHist%s",fSuffix.Data()),
836 "Whether or not to check the source histogram of the PDF" );
838 DeclareOptionRef( fInterpolateString,
TString::Format(
"PDFInterpol%s",fSuffix.Data()),
839 "Interpolation method for reference histograms (e.g. Spline2 or KDE)" );
840 AddPreDefVal(
TString(
"Spline0"));
841 AddPreDefVal(
TString(
"Spline1"));
842 AddPreDefVal(
TString(
"Spline2"));
843 AddPreDefVal(
TString(
"Spline3"));
844 AddPreDefVal(
TString(
"Spline5"));
847 DeclareOptionRef( fKDEtypeString,
TString::Format(
"KDEtype%s",fSuffix.Data()),
"KDE kernel type (1=Gauss)" );
848 AddPreDefVal(
TString(
"Gauss"));
850 DeclareOptionRef( fKDEiterString,
TString::Format(
"KDEiter%s",fSuffix.Data()),
"Number of iterations (1=non-adaptive, 2=adaptive)" );
851 AddPreDefVal(
TString(
"Nonadaptive"));
852 AddPreDefVal(
TString(
"Adaptive"));
854 DeclareOptionRef( fFineFactor ,
TString::Format(
"KDEFineFactor%s",fSuffix.Data()),
855 "Fine tuning factor for Adaptive KDE: Factor to multiply the width of the kernel");
857 DeclareOptionRef( fBorderMethodString,
TString::Format(
"KDEborder%s",fSuffix.Data()),
858 "Border effects treatment (1=no treatment , 2=kernel renormalization, 3=sample mirroring)" );
860 AddPreDefVal(
TString(
"Renorm"));
861 AddPreDefVal(
TString(
"Mirror"));
863 SetConfigName( GetName() );
864 SetConfigDescription(
"Configuration options for the PDF class" );
871 if (fNsmooth < 0) fNsmooth = 0;
873 if (fMaxNsmooth < 0 || fMinNsmooth < 0) {
874 fMinNsmooth = fMaxNsmooth = fNsmooth;
878 Log() << kFATAL <<
"ERROR: MaxNsmooth = "
879 << fMaxNsmooth <<
" < MinNsmooth = " << fMinNsmooth <<
Endl;
882 if (fMaxNsmooth < 0 || fMinNsmooth < 0) {
883 Log() << kFATAL <<
"ERROR: MaxNsmooth = "
884 << fMaxNsmooth <<
" or MinNsmooth = " << fMinNsmooth <<
" smaller than zero" <<
Endl;
893 else if (fInterpolateString ==
"KDE" ) fInterpolMethod =
TMVA::PDF::kKDE;
894 else if (fInterpolateString !=
"" ) {
895 Log() << kFATAL <<
"unknown setting for option 'InterpolateMethod': " << fKDEtypeString << ((fSuffix==
"")?
"":
Form(
" for pdf with suffix %s",fSuffix.Data())) <<
Endl;
900 else if (fKDEtypeString !=
"" )
901 Log() << kFATAL <<
"unknown setting for option 'KDEtype': " << fKDEtypeString << ((fSuffix==
"")?
"":
Form(
" for pdf with suffix %s",fSuffix.Data())) <<
Endl;
904 else if (fKDEiterString !=
"" )
905 Log() << kFATAL <<
"unknown setting for option 'KDEiter': " << fKDEtypeString << ((fSuffix==
"")?
"":
Form(
" for pdf with suffix %s",fSuffix.Data())) <<
Endl;
910 else if ( fKDEiterString !=
"" ) {
911 Log() << kFATAL <<
"unknown setting for option 'KDEBorder': " << fKDEtypeString << ((fSuffix==
"")?
"":
Form(
" for pdf with suffix %s",fSuffix.Data())) <<
Endl;
988 newhist->SetDirectory(
nullptr);
992 for (
UInt_t i=0; i<nbins; i++) {
994 newhist->SetBinContent(i+1,val);
1006 Log() << kFATAL <<
"Number of bins in content and binning array differs"<<
Endl;
1012 newhist->SetDirectory(
nullptr);
1013 for (
UInt_t i=0; i<nbins; i++) {
1015 newhist->SetBinContent(i+1,val);
1020 hnameSmooth.ReplaceAll(
"_original",
"_smoothed" );
1022 if (fHistOriginal != 0)
delete fHistOriginal;
1026 fHist->SetDirectory(
nullptr);
1028 if (fInterpolMethod ==
PDF::kKDE) BuildKDEPDF();
1029 else BuildSplinePDF();
1038 os <<
"MinNSmooth " << pdf.
fMinNsmooth << std::endl;
1039 os <<
"MaxNSmooth " << pdf.
fMaxNsmooth << std::endl;
1041 os <<
"KDE_type " << pdf.
fKDEtype << std::endl;
1042 os <<
"KDE_iter " << pdf.
fKDEiter << std::endl;
1043 os <<
"KDE_border " << pdf.
fKDEborder << std::endl;
1044 os <<
"KDE_finefactor " << pdf.
fFineFactor << std::endl;
1054 <<
" " << std::setprecision(12) <<
histToWrite->GetXaxis()->GetXmin()
1055 <<
" " << std::setprecision(12) <<
histToWrite->GetXaxis()->GetXmax()
1059 os <<
"Weights " << std::endl;
1060 os << std::setprecision(8);
1061 for (
Int_t i=0; i<nBins; i++) {
1062 os << std::setw(15) << std::left <<
histToWrite->GetBinContent(i+1) << std::right <<
" ";
1063 if ((i+1)%5==0) os << std::endl;
1066 os << std::setprecision(
dp);
1084 {
istr >> pdf.fMinNsmooth; pdf.fMaxNsmooth=pdf.fMinNsmooth;}
1085 else if (
devnullS==
"MinNSmooth")
istr >> pdf.fMinNsmooth;
1086 else if (
devnullS==
"MaxNSmooth")
istr >> pdf.fMaxNsmooth;
1092 else if (
devnullS ==
"KDE_finefactor") {
1093 istr >> pdf.fFineFactor;
1094 if (pdf.GetReadingVersion() != 0 && pdf.GetReadingVersion() <
TMVA_VERSION(3,7,3)) {
1105 hnameSmooth.ReplaceAll(
"_original",
"_smoothed" );
1109 std::cout <<
"PDF, trying to create a histogram without defined binning"<< std::endl;
1113 newhist->SetDirectory(
nullptr);
1115 for (
Int_t i=0; i<nbins; i++) {
1117 newhist->SetBinContent(i+1,val);
1120 if (pdf.fHistOriginal != 0)
delete pdf.fHistOriginal;
1124 pdf.fHist->SetDirectory(
nullptr);
1126 if (pdf.fMinNsmooth>=0) pdf.BuildSplinePDF();
1138 return GetThisPdfThreadLocal();
bool Bool_t
Boolean (0=false, 1=true) (bool)
int Int_t
Signed integer 4 bytes (int)
float Float_t
Float 4 bytes (float)
double Double_t
Double 8 bytes.
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
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.
#define TMVA_VERSION(a, b, c)
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 Double_t GetEntries() const
Return the current number of entries.
TObject * Clone(const char *newname="") const override
Make a complete copy of the underlying object.
KDE Kernel for "smoothing" the PDFs.
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.
void ValidatePDF(TH1 *original=nullptr) const
comparison of original histogram with reference PDF
TMVA::PDF::EInterpolateMethod fInterpolMethod
interpolation method
Double_t GetValInverse(Double_t y, Bool_t isMonotonouslyIncreasingFunction=kFALSE) const
returns value
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
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
void AddXMLTo(void *parent)
XML file writing.
void BuildSplinePDF()
build the PDF from the original histograms
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
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)
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...
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
static std::ostream & Err()
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.