43 ClassImp(TMVA::KDEKernel);
49 TMVA::KDEKernel::KDEKernel( EKernelIter kiter,
const TH1 *hist, Float_t lower_edge, Float_t upper_edge,
50 EKernelBorder kborder, Float_t FineFactor )
53 fLowerEdge (lower_edge ),
54 fUpperEdge (upper_edge),
55 fFineFactor ( FineFactor ),
57 fKDEborder ( kborder ),
58 fLogger( new MsgLogger(
"KDEKernel") )
61 Log() << kFATAL <<
"Called without valid histogram pointer (hist)!" << Endl;
64 fHist = (TH1F*)hist->Clone();
65 fFirstIterHist = (TH1F*)hist->Clone();
66 fFirstIterHist->Reset();
67 fSigmaHist = (TH1F*)hist->Clone();
70 fHiddenIteration=
false;
76 TMVA::KDEKernel::~KDEKernel()
78 if (fHist != NULL)
delete fHist;
79 if (fFirstIterHist != NULL)
delete fFirstIterHist;
80 if (fSigmaHist != NULL)
delete fSigmaHist;
81 if (fKernel_integ != NULL)
delete fKernel_integ;
88 Double_t GaussIntegral(Double_t *x, Double_t *par)
90 if ( (par[1]<=0) || (x[0]>x[1]))
return -1.;
92 Float_t xs1=(x[0]-par[0])/par[1];
93 Float_t xs2=(x[1]-par[0])/par[1];
96 if (xs2==0)
return 0.;
97 if (xs2>0 )
return 0.5*TMath::Erf(xs2);
99 if (xs2==0)
return 0.5*TMath::Erf(TMath::Abs(xs1));
100 if (xs1>0)
return 0.5*(TMath::Erf(xs2)-TMath::Erf(xs1));
102 if (xs2>0 )
return 0.5*(TMath::Erf(xs2)+TMath::Erf(TMath::Abs(xs1)));
103 else return 0.5*(TMath::Erf(TMath::Abs(xs1))-TMath::Erf(TMath::Abs(xs2)));
112 void TMVA::KDEKernel::SetKernelType( EKernelType ktype )
114 if (ktype == kGauss) {
121 fKernel_integ =
new TF1(
"GaussIntegral",GaussIntegral,fLowerEdge,fUpperEdge,4);
122 fSigma = ( TMath::Sqrt(2.0)
123 *TMath::Power(4./3., 0.2)
125 *TMath::Power(fHist->Integral(), -0.2) );
130 Log() << kFATAL <<
"<SetKernelType> KDE sigma has invalid value ( <=0 ) !" << Endl;
134 if (fIter == kAdaptiveKDE) {
140 fHiddenIteration=
true;
142 Float_t histoLowEdge=fHist->GetBinLowEdge(1);
143 Float_t histoUpperEdge=fHist->GetBinLowEdge(fHist->GetNbinsX()+1);
145 for (Int_t i=1;i<fHist->GetNbinsX();i++) {
147 for (Int_t j=1;j<fFirstIterHist->GetNbinsX();j++) {
149 fFirstIterHist->AddBinContent(j,fHist->GetBinContent(i)*
150 this->GetBinKernelIntegral(fFirstIterHist->GetBinLowEdge(j),
151 fFirstIterHist->GetBinLowEdge(j+1),
152 fHist->GetBinCenter(i),
156 if (fKDEborder == 3) {
160 if (i < fHist->GetNbinsX()/5 ) {
161 for (Int_t j=1;j<fFirstIterHist->GetNbinsX();j++) {
163 fFirstIterHist->AddBinContent(j,fHist->GetBinContent(i)*
164 this->GetBinKernelIntegral(fFirstIterHist->GetBinLowEdge(j),
165 fFirstIterHist->GetBinLowEdge(j+1),
166 2*histoLowEdge-fHist->GetBinCenter(i),
171 if (i > 4*fHist->GetNbinsX()/5) {
172 for (Int_t j=1;j<fFirstIterHist->GetNbinsX();j++) {
174 fFirstIterHist->AddBinContent(j,fHist->GetBinContent(i)*
175 this->GetBinKernelIntegral(fFirstIterHist->GetBinLowEdge(j),
176 fFirstIterHist->GetBinLowEdge(j+1),
177 2*histoUpperEdge-fHist->GetBinCenter(i),
185 fFirstIterHist->SetEntries(fHist->GetEntries());
189 for (Int_t j=1;j<fFirstIterHist->GetNbinsX();j++)
190 integ+=fFirstIterHist->GetBinContent(j)*fFirstIterHist->GetBinWidth(j);
191 fFirstIterHist->Scale(1./integ);
193 fHiddenIteration=
false;
199 for (Int_t j=1;j<fFirstIterHist->GetNbinsX();j++) {
201 if (fSigma*TMath::Sqrt(1.0/fFirstIterHist->GetBinContent(j)) <= 0 ) {
202 Log() << kFATAL <<
"<SetKernelType> KDE sigma has invalid value ( <=0 ) !" << Endl;
205 fSigmaHist->SetBinContent(j,fFineFactor*fSigma/TMath::Sqrt(fFirstIterHist->GetBinContent(j)));
209 if (fKernel_integ ==0 ) {
210 Log() << kFATAL <<
"KDE kernel not correctly initialized!" << Endl;
217 Float_t TMVA::KDEKernel::GetBinKernelIntegral( Float_t lowr, Float_t highr, Float_t mean, Int_t binnum )
219 if ((fIter == kNonadaptiveKDE) || fHiddenIteration )
220 fKernel_integ->SetParameters(mean,fSigma);
221 else if ((fIter == kAdaptiveKDE) && !fHiddenIteration )
222 fKernel_integ->SetParameters(mean,fSigmaHist->GetBinContent(binnum));
224 if ( fKDEborder == 2 ) {
225 Float_t renormFactor=1.0/fKernel_integ->Eval(fLowerEdge,fUpperEdge);
226 return (renormFactor*fKernel_integ->Eval(lowr,highr));
231 return (fKernel_integ->Eval(lowr,highr));