120 fKernel_integ =
new TF1(
"GaussIntegral",
GaussIntegral,fLowerEdge,fUpperEdge,4);
129 Log() << kFATAL <<
"<SetKernelType> KDE sigma has invalid value ( <=0 ) !" <<
Endl;
133 if (fIter == kAdaptiveKDE) {
139 fHiddenIteration=
true;
141 Float_t histoLowEdge=fHist->GetBinLowEdge(1);
142 Float_t histoUpperEdge=fHist->GetBinLowEdge(fHist->GetNbinsX()+1);
144 for (
Int_t i=1;i<fHist->GetNbinsX();i++) {
146 for (
Int_t j=1;j<fFirstIterHist->GetNbinsX();j++) {
148 fFirstIterHist->AddBinContent(j,fHist->GetBinContent(i)*
149 this->GetBinKernelIntegral(fFirstIterHist->GetBinLowEdge(j),
150 fFirstIterHist->GetBinLowEdge(j+1),
151 fHist->GetBinCenter(i),
155 if (fKDEborder == 3) {
159 if (i < fHist->GetNbinsX()/5 ) {
160 for (
Int_t j=1;j<fFirstIterHist->GetNbinsX();j++) {
162 fFirstIterHist->AddBinContent(j,fHist->GetBinContent(i)*
163 this->GetBinKernelIntegral(fFirstIterHist->GetBinLowEdge(j),
164 fFirstIterHist->GetBinLowEdge(j+1),
165 2*histoLowEdge-fHist->GetBinCenter(i),
170 if (i > 4*fHist->GetNbinsX()/5) {
171 for (
Int_t j=1;j<fFirstIterHist->GetNbinsX();j++) {
173 fFirstIterHist->AddBinContent(j,fHist->GetBinContent(i)*
174 this->GetBinKernelIntegral(fFirstIterHist->GetBinLowEdge(j),
175 fFirstIterHist->GetBinLowEdge(j+1),
176 2*histoUpperEdge-fHist->GetBinCenter(i),
184 fFirstIterHist->SetEntries(fHist->GetEntries());
188 for (
Int_t j=1;j<fFirstIterHist->GetNbinsX();j++)
189 integ+=fFirstIterHist->GetBinContent(j)*fFirstIterHist->GetBinWidth(j);
190 fFirstIterHist->Scale(1./integ);
192 fHiddenIteration=
false;
198 for (
Int_t j=1;j<fFirstIterHist->GetNbinsX();j++) {
200 if (fSigma*
TMath::Sqrt(1.0/fFirstIterHist->GetBinContent(j)) <= 0 ) {
201 Log() << kFATAL <<
"<SetKernelType> KDE sigma has invalid value ( <=0 ) !" <<
Endl;
204 fSigmaHist->SetBinContent(j,fFineFactor*fSigma/
TMath::Sqrt(fFirstIterHist->GetBinContent(j)));
208 if (fKernel_integ ==0 ) {
209 Log() << kFATAL <<
"KDE kernel not correctly initialized!" <<
Endl;
218 if ((fIter == kNonadaptiveKDE) || fHiddenIteration )
219 fKernel_integ->SetParameters(mean,fSigma);
220 else if ((fIter == kAdaptiveKDE) && !fHiddenIteration )
221 fKernel_integ->SetParameters(mean,fSigmaHist->GetBinContent(binnum));
223 if ( fKDEborder == 2 ) {
224 Float_t renormFactor=1.0/fKernel_integ->Eval(fLowerEdge,fUpperEdge);
225 return (renormFactor*fKernel_integ->Eval(lowr,highr));
230 return (fKernel_integ->Eval(lowr,highr));
KDEKernel(EKernelIter kiter=kNonadaptiveKDE, const TH1 *hist=nullptr, Float_t lower_edge=0., Float_t upper_edge=1., EKernelBorder kborder=kNoTreatment, Float_t FineFactor=1.)
constructor sanity check