150 fEpsilon ( 1.e3 * DBL_MIN ),
151 fTransformLikelihoodOutput(
kFALSE ),
155 fHistSig_smooth( 0 ),
156 fHistBgd_smooth( 0 ),
157 fDefaultPDFLik ( 0 ),
163 fAverageEvtPerBin( 0 ),
164 fAverageEvtPerBinVarS (0),
165 fAverageEvtPerBinVarB (0),
166 fKDEfineFactor ( 0 ),
167 fInterpolateString(0)
175 const TString& theWeightFile) :
177 fEpsilon ( 1.e3 * DBL_MIN ),
178 fTransformLikelihoodOutput(
kFALSE ),
182 fHistSig_smooth( 0 ),
183 fHistBgd_smooth( 0 ),
184 fDefaultPDFLik ( 0 ),
190 fAverageEvtPerBin( 0 ),
191 fAverageEvtPerBinVarS (0),
192 fAverageEvtPerBinVarB (0),
193 fKDEfineFactor ( 0 ),
194 fInterpolateString(0)
203 if (NULL != fDefaultPDFLik)
delete fDefaultPDFLik;
204 if (NULL != fHistSig)
delete fHistSig;
205 if (NULL != fHistBgd)
delete fHistBgd;
206 if (NULL != fHistSig_smooth)
delete fHistSig_smooth;
207 if (NULL != fHistBgd_smooth)
delete fHistBgd_smooth;
208 for (
UInt_t ivar=0; ivar<GetNvar(); ivar++) {
209 if ((*fPDFSig)[ivar] !=0)
delete (*fPDFSig)[ivar];
210 if ((*fPDFBgd)[ivar] !=0)
delete (*fPDFBgd)[ivar];
212 if (NULL != fPDFSig)
delete fPDFSig;
213 if (NULL != fPDFBgd)
delete fPDFBgd;
233 fHistSig =
new std::vector<TH1*> ( GetNvar(), (
TH1*)0 );
234 fHistBgd =
new std::vector<TH1*> ( GetNvar(), (
TH1*)0 );
235 fHistSig_smooth =
new std::vector<TH1*> ( GetNvar(), (
TH1*)0 );
236 fHistBgd_smooth =
new std::vector<TH1*> ( GetNvar(), (
TH1*)0 );
237 fPDFSig =
new std::vector<TMVA::PDF*>( GetNvar(), (
TMVA::PDF*)0 );
238 fPDFBgd =
new std::vector<TMVA::PDF*>( GetNvar(), (
TMVA::PDF*)0 );
248 DeclareOptionRef( fTransformLikelihoodOutput =
kFALSE,
"TransformOutput",
249 "Transform likelihood output by inverse sigmoid function" );
254 TString updatedOptions = GetOptions();
255 fDefaultPDFLik =
new PDF(
TString(GetName()) +
" PDF", updatedOptions );
256 fDefaultPDFLik->DeclareOptions();
257 fDefaultPDFLik->ParseOptions();
258 updatedOptions = fDefaultPDFLik->GetOptions();
259 for (
UInt_t ivar = 0; ivar< DataInfo().GetNVariables(); ivar++) {
260 (*fPDFSig)[ivar] =
new PDF(
Form(
"%s PDF Sig[%d]", GetName(), ivar), updatedOptions,
261 Form(
"Sig[%d]",ivar), fDefaultPDFLik );
262 (*fPDFSig)[ivar]->DeclareOptions();
263 (*fPDFSig)[ivar]->ParseOptions();
264 updatedOptions = (*fPDFSig)[ivar]->GetOptions();
265 (*fPDFBgd)[ivar] =
new PDF(
Form(
"%s PDF Bkg[%d]", GetName(), ivar), updatedOptions,
266 Form(
"Bkg[%d]",ivar), fDefaultPDFLik );
267 (*fPDFBgd)[ivar]->DeclareOptions();
268 (*fPDFBgd)[ivar]->ParseOptions();
269 updatedOptions = (*fPDFBgd)[ivar]->GetOptions();
273 SetOptions( updatedOptions );
282 DeclareOptionRef( fNsmooth = 1,
"NSmooth",
283 "Number of smoothing iterations for the input histograms");
284 DeclareOptionRef( fAverageEvtPerBin = 50,
"NAvEvtPerBin",
285 "Average number of events per PDF bin");
286 DeclareOptionRef( fKDEfineFactor =1. ,
"KDEFineFactor",
287 "Fine tuning factor for Adaptive KDE: Factor to multiply the width of the kernel");
288 DeclareOptionRef( fBorderMethodString =
"None",
"KDEborder",
289 "Border effects treatment (1=no treatment , 2=kernel renormalization, 3=sample mirroring)" );
290 DeclareOptionRef( fKDEiterString =
"Nonadaptive",
"KDEiter",
291 "Number of iterations (1=non-adaptive, 2=adaptive)" );
292 DeclareOptionRef( fKDEtypeString =
"Gauss",
"KDEtype",
293 "KDE kernel type (1=Gauss)" );
294 fAverageEvtPerBinVarS =
new Int_t[GetNvar()];
295 fAverageEvtPerBinVarB =
new Int_t[GetNvar()];
296 fNsmoothVarS =
new Int_t[GetNvar()];
297 fNsmoothVarB =
new Int_t[GetNvar()];
298 fInterpolateString =
new TString[GetNvar()];
299 for(
UInt_t i=0; i<GetNvar(); ++i) {
300 fAverageEvtPerBinVarS[i] = fAverageEvtPerBinVarB[i] = 0;
301 fNsmoothVarS[i] = fNsmoothVarB[i] = 0;
302 fInterpolateString[i] =
"";
304 DeclareOptionRef( fAverageEvtPerBinVarS, GetNvar(),
"NAvEvtPerBinSig",
305 "Average num of events per PDF bin and variable (signal)");
306 DeclareOptionRef( fAverageEvtPerBinVarB, GetNvar(),
"NAvEvtPerBinBkg",
307 "Average num of events per PDF bin and variable (background)");
308 DeclareOptionRef(fNsmoothVarS, GetNvar(),
"NSmoothSig",
309 "Number of smoothing iterations for the input histograms");
310 DeclareOptionRef(fNsmoothVarB, GetNvar(),
"NSmoothBkg",
311 "Number of smoothing iterations for the input histograms");
312 DeclareOptionRef(fInterpolateString, GetNvar(),
"PDFInterpol",
"Method of interpolating reference histograms (e.g. Spline2 or KDE)");
321 SetSignalReferenceCut( TransformLikelihoodOutput( 0.5, 0.5 ) );
323 fDefaultPDFLik->ProcessOptions();
324 for (
UInt_t ivar = 0; ivar< DataInfo().GetNVariables(); ivar++) {
325 (*fPDFBgd)[ivar]->ProcessOptions();
326 (*fPDFSig)[ivar]->ProcessOptions();
341 std::vector<Double_t>
xmin(nvar),
xmax(nvar);
342 for (
UInt_t ivar=0; ivar<nvar; ivar++) {
xmin[ivar]=1e30;
xmax[ivar]=-1e30;}
344 UInt_t nevents=Data()->GetNEvents();
345 for (
UInt_t ievt=0; ievt<nevents; ievt++) {
348 const Event* origEv = Data()->GetEvent(ievt);
349 if (IgnoreEventsWithNegWeightsInTraining() && origEv->
GetWeight()<=0)
continue;
351 for (
int cls=0;cls<2;cls++){
352 GetTransformationHandler().SetTransformationReferenceClass(cls);
353 const Event* ev = GetTransformationHandler().Transform( origEv );
354 for (
UInt_t ivar=0; ivar<nvar; ivar++) {
356 if (value <
xmin[ivar])
xmin[ivar] = value;
357 if (value >
xmax[ivar])
xmax[ivar] = value;
364 for (
UInt_t ivar=0; ivar<GetNvar(); ivar++) {
365 TString var = (*fInputVars)[ivar];
372 if (DataInfo().GetVariableInfo(ivar).GetVarType() ==
'I') {
377 Int_t nbins = ixmax - ixmin;
378 (*fHistSig)[ivar] =
new TH1F(
GetMethodName()+
"_"+var +
"_sig", var +
" signal training", nbins, ixmin, ixmax );
379 (*fHistBgd)[ivar] =
new TH1F(
GetMethodName()+
"_"+var +
"_bgd", var +
" background training", nbins, ixmin, ixmax );
382 UInt_t minNEvt =
TMath::Min(Data()->GetNEvtSigTrain(),Data()->GetNEvtBkgdTrain());
383 Int_t nbinsS = (*fPDFSig)[ivar]->GetHistNBins( minNEvt );
384 Int_t nbinsB = (*fPDFBgd)[ivar]->GetHistNBins( minNEvt );
394 Log() << kINFO <<
"Filling reference histograms" <<
Endl;
397 for (
Int_t ievt=0; ievt<Data()->GetNEvents(); ievt++) {
401 const Event* origEv = Data()->GetEvent(ievt);
402 if (IgnoreEventsWithNegWeightsInTraining() && origEv->
GetWeight()<=0)
continue;
403 GetTransformationHandler().SetTransformationReferenceClass( origEv->
GetClass() );
404 const Event* ev = GetTransformationHandler().Transform( origEv );
410 for (
UInt_t ivar=0; ivar<GetNvar(); ivar++) {
413 if (value >=
xmax[ivar]) value =
xmax[ivar] - 1.0e-10;
414 else if (value <
xmin[ivar]) value =
xmin[ivar] + 1.0e-10;
416 if (value >=(*fHistSig)[ivar]->GetXaxis()->GetXmax() ||
417 value <(*fHistSig)[ivar]->GetXaxis()->GetXmin()){
419 <<
"error in filling likelihood reference histograms var="
420 <<(*fInputVars)[ivar]
421 <<
", xmin="<<(*fHistSig)[ivar]->GetXaxis()->GetXmin()
423 <<
", xmax="<<(*fHistSig)[ivar]->GetXaxis()->GetXmax()
426 if (DataInfo().IsSignal(ev)) (*fHistSig)[ivar]->Fill( value, weight );
427 else (*fHistBgd)[ivar]->Fill( value, weight );
432 Log() << kINFO <<
"Building PDF out of reference histograms" <<
Endl;
433 for (
UInt_t ivar=0; ivar<GetNvar(); ivar++) {
437 (*fPDFSig)[ivar]->BuildPDF( (*fHistSig)[ivar] );
438 (*fPDFBgd)[ivar]->BuildPDF( (*fHistBgd)[ivar] );
440 (*fPDFSig)[ivar]->ValidatePDF( (*fHistSig)[ivar] );
441 (*fPDFBgd)[ivar]->ValidatePDF( (*fHistBgd)[ivar] );
444 if ((*fPDFSig)[ivar]->GetSmoothedHist() != 0) (*fHistSig_smooth)[ivar] = (*fPDFSig)[ivar]->GetSmoothedHist();
445 if ((*fPDFBgd)[ivar]->GetSmoothedHist() != 0) (*fHistBgd_smooth)[ivar] = (*fPDFBgd)[ivar]->GetSmoothedHist();
459 NoErrorCalc(err, errUpper);
468 GetTransformationHandler().SetTransformationReferenceClass( fSignalClass );
471 const Event* ev = GetEvent();
472 for (ivar=0; ivar<GetNvar(); ivar++) vs(ivar) = ev->
GetValue(ivar);
474 GetTransformationHandler().SetTransformationReferenceClass( fBackgroundClass );
478 for (ivar=0; ivar<GetNvar(); ivar++) vb(ivar) = ev->
GetValue(ivar);
482 for (ivar=0; ivar<GetNvar(); ivar++) {
485 if ((
Int_t)ivar == fDropVariable)
continue;
489 for (
UInt_t itype=0; itype < 2; itype++) {
492 if (
x[itype] >= (*fPDFSig)[ivar]->GetXmax())
x[itype] = (*fPDFSig)[ivar]->GetXmax() - 1.0e-10;
493 else if (
x[itype] < (*fPDFSig)[ivar]->GetXmin())
x[itype] = (*fPDFSig)[ivar]->GetXmin();
496 PDF* pdf = (itype == 0) ? (*fPDFSig)[ivar] : (*fPDFBgd)[ivar];
497 if (pdf == 0)
Log() << kFATAL <<
"<GetMvaValue> Reference histograms don't exist" <<
Endl;
507 DataInfo().GetVariableInfo(ivar).GetVarType() ==
'N') {
524 if (itype == 0)
ps *= p;
530 return TransformLikelihoodOutput(
ps, pb );
538 if (
ps < fEpsilon)
ps = fEpsilon;
539 if (pb < fEpsilon) pb = fEpsilon;
541 if (
r >= 1.0)
r = 1. - 1.e-15;
543 if (fTransformLikelihoodOutput) {
547 if (
r <= 0.0)
r = fEpsilon;
548 else if (
r >= 1.0)
r = 1. - 1.e-15;
565 if (fDefaultPDFLik != 0) {
566 o << prefix << std::endl << prefix <<
"#Default Likelihood PDF Options:" << std::endl << prefix << std::endl;
567 fDefaultPDFLik->WriteOptionsToStream( o, prefix );
569 for (
UInt_t ivar = 0; ivar < fPDFSig->size(); ivar++) {
570 if ((*fPDFSig)[ivar] != 0) {
571 o << prefix << std::endl << prefix <<
Form(
"#Signal[%d] Likelihood PDF Options:",ivar) << std::endl << prefix << std::endl;
572 (*fPDFSig)[ivar]->WriteOptionsToStream( o, prefix );
574 if ((*fPDFBgd)[ivar] != 0) {
575 o << prefix << std::endl << prefix <<
"#Background[%d] Likelihood PDF Options:" << std::endl << prefix << std::endl;
576 (*fPDFBgd)[ivar]->WriteOptionsToStream( o, prefix );
590 for (
UInt_t ivar=0; ivar<GetNvar(); ivar++) {
591 if ( (*fPDFSig)[ivar]==0 || (*fPDFBgd)[ivar]==0 )
592 Log() << kFATAL <<
"Reference histograms for variable " << ivar
593 <<
" don't exist, can't write it to weight file" <<
Endl;
597 (*fPDFSig)[ivar]->AddXMLTo(pdfwrap);
601 (*fPDFBgd)[ivar]->AddXMLTo(pdfwrap);
611 if (fRanking)
delete fRanking;
612 fRanking =
new Ranking( GetName(),
"Delta Separation" );
615 for (
Int_t ivar=-1; ivar<(
Int_t)GetNvar(); ivar++) {
618 fDropVariable = ivar;
622 TH1* rS =
new TH1F( nameS, nameS, 80, 0, 1 );
623 TH1* rB =
new TH1F( nameB, nameB, 80, 0, 1 );
626 for (
Int_t ievt=0; ievt<Data()->GetNTrainingEvents(); ievt++) {
628 const Event* origEv = Data()->GetEvent(ievt);
629 GetTransformationHandler().SetTransformationReferenceClass( origEv->
GetClass() );
630 const Event* ev = GetTransformationHandler().Transform(Data()->GetEvent(ievt));
634 if (DataInfo().IsSignal(ev)) rS->
Fill( lk, w );
635 else rB->
Fill( lk, w );
640 if (ivar == -1) sepRef =
sep;
647 if (ivar >= 0) fRanking->AddRank(
Rank( DataInfo().GetVariableInfo(ivar).GetInternalName(),
sep ) );
661 for (
UInt_t ivar=0; ivar<GetNvar(); ivar++){
662 (*fPDFSig)[ivar]->Write( pname + GetInputVar( ivar ) +
"_S" );
663 (*fPDFBgd)[ivar]->Write( pname + GetInputVar( ivar ) +
"_B" );
678 for (
UInt_t ivar=0; ivar<nvars; ivar++){
680 Log() << kDEBUG <<
"Reading signal and background PDF for variable: " << GetInputVar( ivar ) <<
Endl;
681 if ((*fPDFSig)[ivar] !=0)
delete (*fPDFSig)[ivar];
682 if ((*fPDFBgd)[ivar] !=0)
delete (*fPDFBgd)[ivar];
683 (*fPDFSig)[ivar] =
new PDF( GetInputVar( ivar ) +
" PDF Sig" );
684 (*fPDFBgd)[ivar] =
new PDF( GetInputVar( ivar ) +
" PDF Bkg" );
685 (*fPDFSig)[ivar]->SetReadingVersion( GetTrainingTMVAVersionCode() );
686 (*fPDFBgd)[ivar]->SetReadingVersion( GetTrainingTMVAVersionCode() );
687 (*(*fPDFSig)[ivar]).ReadXML(pdfnode);
690 (*(*fPDFBgd)[ivar]).ReadXML(pdfnode);
705 for (
UInt_t ivar=0; ivar<GetNvar(); ivar++){
706 Log() << kDEBUG <<
"Reading signal and background PDF for variable: " << GetInputVar( ivar ) <<
Endl;
707 if ((*fPDFSig)[ivar] !=0)
delete (*fPDFSig)[ivar];
708 if ((*fPDFBgd)[ivar] !=0)
delete (*fPDFBgd)[ivar];
709 (*fPDFSig)[ivar] =
new PDF(GetInputVar( ivar ) +
" PDF Sig" );
710 (*fPDFBgd)[ivar] =
new PDF(GetInputVar( ivar ) +
" PDF Bkg");
711 (*fPDFSig)[ivar]->SetReadingVersion( GetTrainingTMVAVersionCode() );
712 (*fPDFBgd)[ivar]->SetReadingVersion( GetTrainingTMVAVersionCode() );
713 istr >> *(*fPDFSig)[ivar];
714 istr >> *(*fPDFBgd)[ivar];
727 for (
UInt_t ivar=0; ivar<GetNvar(); ivar++){
728 (*fPDFSig)[ivar] = (
TMVA::PDF*)rf.
Get(
Form(
"PDF_%s_S", GetInputVar( ivar ).Data() ) );
729 (*fPDFBgd)[ivar] = (
TMVA::PDF*)rf.
Get(
Form(
"PDF_%s_B", GetInputVar( ivar ).Data() ) );
739 Log() << kINFO <<
"Write monitoring histograms to file: " << BaseDir()->GetPath() <<
Endl;
742 for (
UInt_t ivar=0; ivar<GetNvar(); ivar++) {
743 (*fHistSig)[ivar]->
Write();
744 (*fHistBgd)[ivar]->Write();
745 if ((*fHistSig_smooth)[ivar] != 0) (*fHistSig_smooth)[ivar]->Write();
746 if ((*fHistBgd_smooth)[ivar] != 0) (*fHistBgd_smooth)[ivar]->Write();
747 (*fPDFSig)[ivar]->GetPDFHist()->Write();
748 (*fPDFBgd)[ivar]->GetPDFHist()->Write();
750 if ((*fPDFSig)[ivar]->GetNSmoothHist() != 0) (*fPDFSig)[ivar]->GetNSmoothHist()->Write();
751 if ((*fPDFBgd)[ivar]->GetNSmoothHist() != 0) (*fPDFBgd)[ivar]->GetNSmoothHist()->Write();
754 Float_t xmin=((*fPDFSig)[ivar]->GetPDFHist()->GetXaxis())->GetXmin();
755 Float_t xmax=((*fPDFSig)[ivar]->GetPDFHist()->GetXaxis())->GetXmax();
756 TH1F*
mm =
new TH1F( (*fInputVars)[ivar]+
"_additional_check",
757 (*fInputVars)[ivar]+
"_additional_check", 15000,
xmin,
xmax );
759 for (
Int_t bin=0; bin < 15000; bin++) {
761 mm->SetBinContent(bin+1 ,(*fPDFSig)[ivar]->GetVal(
x));
766 TH1*
h[2] = { (*fHistSig)[ivar], (*fHistBgd)[ivar] };
767 for (
UInt_t i=0; i<2; i++) {
773 hclone->
Rebin( resFactor );
774 hclone->
Scale( 1.0/resFactor );
787 fout <<
"#include <math.h>" << std::endl;
788 fout <<
"#include <cstdlib>" << std::endl;
796 Int_t dp = fout.precision();
797 fout <<
" double fEpsilon;" << std::endl;
802 for (
UInt_t ivar=0; ivar<GetNvar(); ivar++) {
803 nbin[ivar]=(*fPDFSig)[ivar]->GetPDFHist()->GetNbinsX();
804 if (nbin[ivar] > nbinMax) nbinMax=nbin[ivar];
807 fout <<
" static float fRefS[][" << nbinMax <<
"]; "
808 <<
"// signal reference vector [nvars][max_nbins]" << std::endl;
809 fout <<
" static float fRefB[][" << nbinMax <<
"]; "
810 <<
"// backgr reference vector [nvars][max_nbins]" << std::endl << std::endl;
811 fout <<
"// if a variable has its PDF encoded as a spline0 --> treat it like an Integer valued one" <<std::endl;
812 fout <<
" bool fHasDiscretPDF[" << GetNvar() <<
"]; "<< std::endl;
813 fout <<
" int fNbin[" << GetNvar() <<
"]; "
814 <<
"// number of bins (discrete variables may have less bins)" << std::endl;
815 fout <<
" double fHistMin[" << GetNvar() <<
"]; " << std::endl;
816 fout <<
" double fHistMax[" << GetNvar() <<
"]; " << std::endl;
818 fout <<
" double TransformLikelihoodOutput( double, double ) const;" << std::endl;
819 fout <<
"};" << std::endl;
820 fout <<
"" << std::endl;
821 fout <<
"inline void " << className <<
"::Initialize() " << std::endl;
822 fout <<
"{" << std::endl;
823 fout <<
" fEpsilon = " << fEpsilon <<
";" << std::endl;
824 for (
UInt_t ivar=0; ivar<GetNvar(); ivar++) {
825 fout <<
" fNbin[" << ivar <<
"] = " << (*fPDFSig)[ivar]->GetPDFHist()->GetNbinsX() <<
";" << std::endl;
826 fout <<
" fHistMin[" << ivar <<
"] = " << (*fPDFSig)[ivar]->GetPDFHist()->GetXaxis()->GetXmin() <<
";" << std::endl;
827 fout <<
" fHistMax[" << ivar <<
"] = " << (*fPDFSig)[ivar]->GetPDFHist()->GetXaxis()->GetXmax() <<
";" << std::endl;
829 if ((((*fPDFSig)[ivar]->GetPDFHist()->GetNbinsX() != nbin[ivar] ||
830 (*fPDFBgd)[ivar]->GetPDFHist()->GetNbinsX() != nbin[ivar])
832 (*fPDFSig)[ivar]->GetPDFHist()->GetNbinsX() != (*fPDFBgd)[ivar]->GetPDFHist()->GetNbinsX()) {
833 Log() << kFATAL <<
"<MakeClassSpecific> Mismatch in binning of variable "
834 <<
"\"" << GetOriginalVarName(ivar) <<
"\" of type: \'" << DataInfo().GetVariableInfo(ivar).GetVarType()
836 <<
"nxS = " << (*fPDFSig)[ivar]->GetPDFHist()->GetNbinsX() <<
", "
837 <<
"nxB = " << (*fPDFBgd)[ivar]->GetPDFHist()->GetNbinsX()
838 <<
" while we expect " << nbin[ivar]
842 for (
UInt_t ivar=0; ivar<GetNvar(); ivar++){
844 fout <<
" fHasDiscretPDF[" << ivar <<
"] = true; " << std::endl;
846 fout <<
" fHasDiscretPDF[" << ivar <<
"] = false; " << std::endl;
849 fout <<
"}" << std::endl << std::endl;
851 fout <<
"inline double " << className
852 <<
"::GetMvaValue__( const std::vector<double>& inputValues ) const" << std::endl;
853 fout <<
"{" << std::endl;
854 fout <<
" double ps(1), pb(1);" << std::endl;
855 fout <<
" std::vector<double> inputValuesSig = inputValues;" << std::endl;
856 fout <<
" std::vector<double> inputValuesBgd = inputValues;" << std::endl;
857 if (GetTransformationHandler().GetTransformationList().GetSize() != 0) {
858 fout <<
" Transform(inputValuesSig,0);" << std::endl;
859 fout <<
" Transform(inputValuesBgd,1);" << std::endl;
861 fout <<
" for (size_t ivar = 0; ivar < GetNvar(); ivar++) {" << std::endl;
863 fout <<
" // dummy at present... will be used for variable transforms" << std::endl;
864 fout <<
" double x[2] = { inputValuesSig[ivar], inputValuesBgd[ivar] };" << std::endl;
866 fout <<
" for (int itype=0; itype < 2; itype++) {" << std::endl;
868 fout <<
" // interpolate linearly between adjacent bins" << std::endl;
869 fout <<
" // this is not useful for discrete variables (or forced Spline0)" << std::endl;
870 fout <<
" int bin = int((x[itype] - fHistMin[ivar])/(fHistMax[ivar] - fHistMin[ivar])*fNbin[ivar]) + 0;" << std::endl;
872 fout <<
" // since the test data sample is in general different from the training sample" << std::endl;
873 fout <<
" // it can happen that the min/max of the training sample are trespassed --> correct this" << std::endl;
874 fout <<
" if (bin < 0) {" << std::endl;
875 fout <<
" bin = 0;" << std::endl;
876 fout <<
" x[itype] = fHistMin[ivar];" << std::endl;
877 fout <<
" }" << std::endl;
878 fout <<
" else if (bin >= fNbin[ivar]) {" << std::endl;
879 fout <<
" bin = fNbin[ivar]-1;" << std::endl;
880 fout <<
" x[itype] = fHistMax[ivar];" << std::endl;
881 fout <<
" }" << std::endl;
883 fout <<
" // find corresponding histogram from cached indices" << std::endl;
884 fout <<
" float ref = (itype == 0) ? fRefS[ivar][bin] : fRefB[ivar][bin];" << std::endl;
886 fout <<
" // sanity check" << std::endl;
887 fout <<
" if (ref < 0) {" << std::endl;
888 fout <<
" std::cout << \"Fatal error in " << className
889 <<
": bin entry < 0 ==> abort\" << std::endl;" << std::endl;
890 fout <<
" std::exit(1);" << std::endl;
891 fout <<
" }" << std::endl;
893 fout <<
" double p = ref;" << std::endl;
895 fout <<
" if (GetType(ivar) != 'I' && !fHasDiscretPDF[ivar]) {" << std::endl;
896 fout <<
" float bincenter = (bin + 0.5)/fNbin[ivar]*(fHistMax[ivar] - fHistMin[ivar]) + fHistMin[ivar];" << std::endl;
897 fout <<
" int nextbin = bin;" << std::endl;
898 fout <<
" if ((x[itype] > bincenter && bin != fNbin[ivar]-1) || bin == 0) " << std::endl;
899 fout <<
" nextbin++;" << std::endl;
900 fout <<
" else" << std::endl;
901 fout <<
" nextbin--; " << std::endl;
903 fout <<
" double refnext = (itype == 0) ? fRefS[ivar][nextbin] : fRefB[ivar][nextbin];" << std::endl;
904 fout <<
" float nextbincenter = (nextbin + 0.5)/fNbin[ivar]*(fHistMax[ivar] - fHistMin[ivar]) + fHistMin[ivar];" << std::endl;
906 fout <<
" double dx = bincenter - nextbincenter;" << std::endl;
907 fout <<
" double dy = ref - refnext;" << std::endl;
908 fout <<
" p += (x[itype] - bincenter) * dy/dx;" << std::endl;
909 fout <<
" }" << std::endl;
911 fout <<
" if (p < fEpsilon) p = fEpsilon; // avoid zero response" << std::endl;
913 fout <<
" if (itype == 0) ps *= p;" << std::endl;
914 fout <<
" else pb *= p;" << std::endl;
915 fout <<
" } " << std::endl;
916 fout <<
" } " << std::endl;
918 fout <<
" // the likelihood ratio (transform it ?)" << std::endl;
919 fout <<
" return TransformLikelihoodOutput( ps, pb ); " << std::endl;
920 fout <<
"}" << std::endl << std::endl;
922 fout <<
"inline double " << className <<
"::TransformLikelihoodOutput( double ps, double pb ) const" << std::endl;
923 fout <<
"{" << std::endl;
924 fout <<
" // returns transformed or non-transformed output" << std::endl;
925 fout <<
" if (ps < fEpsilon) ps = fEpsilon;" << std::endl;
926 fout <<
" if (pb < fEpsilon) pb = fEpsilon;" << std::endl;
927 fout <<
" double r = ps/(ps + pb);" << std::endl;
928 fout <<
" if (r >= 1.0) r = 1. - 1.e-15;" << std::endl;
930 fout <<
" if (" << (fTransformLikelihoodOutput ?
"true" :
"false") <<
") {" << std::endl;
931 fout <<
" // inverse Fermi function" << std::endl;
933 fout <<
" // sanity check" << std::endl;
934 fout <<
" if (r <= 0.0) r = fEpsilon;" << std::endl;
935 fout <<
" else if (r >= 1.0) r = 1. - 1.e-15;" << std::endl;
937 fout <<
" double tau = 15.0;" << std::endl;
938 fout <<
" r = - log(1.0/r - 1.0)/tau;" << std::endl;
939 fout <<
" }" << std::endl;
941 fout <<
" return r;" << std::endl;
942 fout <<
"}" << std::endl;
945 fout <<
"// Clean up" << std::endl;
946 fout <<
"inline void " << className <<
"::Clear() " << std::endl;
947 fout <<
"{" << std::endl;
948 fout <<
" // nothing to clear" << std::endl;
949 fout <<
"}" << std::endl << std::endl;
951 fout <<
"// signal map" << std::endl;
952 fout <<
"float " << className <<
"::fRefS[][" << nbinMax <<
"] = " << std::endl;
953 fout <<
"{ " << std::endl;
954 for (
UInt_t ivar=0; ivar<GetNvar(); ivar++) {
956 for (
Int_t ibin=1; ibin<=nbinMax; ibin++) {
957 if (ibin-1 < nbin[ivar])
958 fout << (*fPDFSig)[ivar]->GetPDFHist()->GetBinContent(ibin);
962 if (ibin < nbinMax) fout <<
", ";
964 fout <<
" }, " << std::endl;
966 fout <<
"}; " << std::endl;
969 fout <<
"// background map" << std::endl;
970 fout <<
"float " << className <<
"::fRefB[][" << nbinMax <<
"] = " << std::endl;
971 fout <<
"{ " << std::endl;
972 for (
UInt_t ivar=0; ivar<GetNvar(); ivar++) {
974 fout << std::setprecision(8);
975 for (
Int_t ibin=1; ibin<=nbinMax; ibin++) {
976 if (ibin-1 < nbin[ivar])
977 fout << (*fPDFBgd)[ivar]->GetPDFHist()->GetBinContent(ibin);
981 if (ibin < nbinMax) fout <<
", ";
983 fout <<
" }, " << std::endl;
985 fout <<
"}; " << std::endl;
987 fout << std::setprecision(dp);
1003 Log() <<
"The maximum-likelihood classifier models the data with probability " <<
Endl;
1004 Log() <<
"density functions (PDF) reproducing the signal and background" <<
Endl;
1005 Log() <<
"distributions of the input variables. Correlations among the " <<
Endl;
1006 Log() <<
"variables are ignored." <<
Endl;
1010 Log() <<
"Required for good performance are decorrelated input variables" <<
Endl;
1011 Log() <<
"(PCA transformation via the option \"VarTransform=Decorrelate\"" <<
Endl;
1012 Log() <<
"may be tried). Irreducible non-linear correlations may be reduced" <<
Endl;
1013 Log() <<
"by precombining strongly correlated input variables, or by simply" <<
Endl;
1014 Log() <<
"removing one of the variables." <<
Endl;
1018 Log() <<
"High fidelity PDF estimates are mandatory, i.e., sufficient training " <<
Endl;
1019 Log() <<
"statistics is required to populate the tails of the distributions" <<
Endl;
1020 Log() <<
"It would be a surprise if the default Spline or KDE kernel parameters" <<
Endl;
1021 Log() <<
"provide a satisfying fit to the data. The user is advised to properly" <<
Endl;
1022 Log() <<
"tune the events per bin and smooth options in the spline cases" <<
Endl;
1023 Log() <<
"individually per variable. If the KDE kernel is used, the adaptive" <<
Endl;
1024 Log() <<
"Gaussian kernel may lead to artefacts, so please always also try" <<
Endl;
1025 Log() <<
"the non-adaptive one." <<
Endl;
1027 Log() <<
"All tuning parameters must be adjusted individually for each input" <<
Endl;
#define REGISTER_METHOD(CLASS)
for example
char * Form(const char *fmt,...)
TObject * Get(const char *namecycle) override
Return pointer to object identified by namecycle.
A ROOT file is a suite of consecutive data records (TKey instances) with a well defined format.
1-D histogram with a float per channel (see TH1 documentation)}
virtual void SetTitle(const char *title)
See GetStatOverflows for more information.
virtual Double_t GetBinCenter(Int_t bin) const
Return bin center for 1D histogram.
static void AddDirectory(Bool_t add=kTRUE)
Sets the flag controlling the automatic add of histograms in memory.
virtual Int_t GetNbinsX() const
virtual Int_t Fill(Double_t x)
Increment bin with abscissa X by 1.
virtual void SetName(const char *name)
Change the name of this histogram.
virtual Double_t GetBinContent(Int_t bin) const
Return content of bin number bin.
virtual void Scale(Double_t c1=1, Option_t *option="")
Multiply this histogram by a constant c1.
virtual Int_t FindBin(Double_t x, Double_t y=0, Double_t z=0)
Return Global bin number corresponding to x,y,z.
static Bool_t AddDirectoryStatus()
Static function: cannot be inlined on Windows/NT.
virtual TH1 * Rebin(Int_t ngroup=2, const char *newname="", const Double_t *xbins=0)
Rebin this histogram.
void WriteOptionsToStream(std::ostream &o, const TString &prefix) const
write options to output stream (e.g. in writing the MVA weight files
Class that contains all the data information.
Float_t GetValue(UInt_t ivar) const
return value of i'th variable
Double_t GetWeight() const
return the event weight - depending on whether the flag IgnoreNegWeightsInTraining is or not.
Virtual base Class for all MVA method.
virtual void DeclareCompatibilityOptions()
options that are used ONLY for the READER to ensure backward compatibility they are hence without any...
Likelihood analysis ("non-parametric approach")
const Ranking * CreateRanking()
computes ranking of input variables
void Train()
create reference distributions (PDFs) from signal and background events: fill histograms and smooth t...
virtual Bool_t HasAnalysisType(Types::EAnalysisType type, UInt_t numberClasses, UInt_t numberTargets)
FDA can handle classification with 2 classes.
virtual void WriteOptionsToStream(std::ostream &o, const TString &prefix) const
write options to stream
void WriteMonitoringHistosToFile() const
write histograms and PDFs to file for monitoring purposes
void DeclareCompatibilityOptions()
options that are used ONLY for the READER to ensure backward compatibility they are hence without any...
void MakeClassSpecific(std::ostream &, const TString &) const
write specific classifier response
virtual ~MethodLikelihood()
destructor
void Init()
default initialisation called by all constructors
void ReadWeightsFromStream(std::istream &istr)
read weight info from file nothing to do for this method
MethodLikelihood(const TString &jobName, const TString &methodTitle, DataSetInfo &theData, const TString &theOption="")
standard constructor
void GetHelpMessage() const
get help message text
Double_t GetMvaValue(Double_t *err=0, Double_t *errUpper=0)
returns the likelihood estimator for signal fill a new Likelihood branch into the testTree
void ReadWeightsFromXML(void *wghtnode)
read weights from XML
void MakeClassSpecificHeader(std::ostream &, const TString &="") const
write specific header of the classifier (mostly include files)
Double_t TransformLikelihoodOutput(Double_t ps, Double_t pb) const
returns transformed or non-transformed output
void ProcessOptions()
process user options reference cut value to distinguish signal-like from background-like events
void WriteWeightsToStream(TFile &rf) const
write reference PDFs to ROOT file
void AddWeightsXMLTo(void *parent) const
write weights to XML
void DeclareOptions()
define the options (their key words) that can be set in the option string
PDF wrapper for histograms; uses user-defined spline interpolation.
Ranking for variables in method (implementation)
Singleton class for Global types used by TMVA.
virtual Int_t Write(const char *name=0, Int_t option=0, Int_t bufsize=0)
Write this object to the current directory.
const char * Data() const
static constexpr double mm
static constexpr double ps
void GetMethodName(TString &name, TKey *mkey)
create variable transformations
MsgLogger & Endl(MsgLogger &ml)
Int_t Nint(T x)
Round to nearest integer. Rounds half integers to the nearest even integer.
Short_t Max(Short_t a, Short_t b)
Short_t Min(Short_t a, Short_t b)