147 fEpsilon ( 1.e3 * DBL_MIN ),
148 fTransformLikelihoodOutput(
kFALSE ),
152 fHistSig_smooth( 0 ),
153 fHistBgd_smooth( 0 ),
154 fDefaultPDFLik ( 0 ),
160 fAverageEvtPerBin( 0 ),
161 fAverageEvtPerBinVarS (0),
162 fAverageEvtPerBinVarB (0),
163 fKDEfineFactor ( 0 ),
164 fInterpolateString(0)
172 const TString& theWeightFile) :
174 fEpsilon ( 1.e3 * DBL_MIN ),
175 fTransformLikelihoodOutput(
kFALSE ),
179 fHistSig_smooth( 0 ),
180 fHistBgd_smooth( 0 ),
181 fDefaultPDFLik ( 0 ),
187 fAverageEvtPerBin( 0 ),
188 fAverageEvtPerBinVarS (0),
189 fAverageEvtPerBinVarB (0),
190 fKDEfineFactor ( 0 ),
191 fInterpolateString(0)
200 if (NULL != fDefaultPDFLik)
delete fDefaultPDFLik;
201 if (NULL != fHistSig)
delete fHistSig;
202 if (NULL != fHistBgd)
delete fHistBgd;
203 if (NULL != fHistSig_smooth)
delete fHistSig_smooth;
204 if (NULL != fHistBgd_smooth)
delete fHistBgd_smooth;
205 for (
UInt_t ivar=0; ivar<GetNvar(); ivar++) {
206 if ((*fPDFSig)[ivar] !=0)
delete (*fPDFSig)[ivar];
207 if ((*fPDFBgd)[ivar] !=0)
delete (*fPDFBgd)[ivar];
209 if (NULL != fPDFSig)
delete fPDFSig;
210 if (NULL != fPDFBgd)
delete fPDFBgd;
230 fHistSig =
new std::vector<TH1*> ( GetNvar(), (
TH1*)0 );
231 fHistBgd =
new std::vector<TH1*> ( GetNvar(), (
TH1*)0 );
232 fHistSig_smooth =
new std::vector<TH1*> ( GetNvar(), (
TH1*)0 );
233 fHistBgd_smooth =
new std::vector<TH1*> ( GetNvar(), (
TH1*)0 );
234 fPDFSig =
new std::vector<TMVA::PDF*>( GetNvar(), (
TMVA::PDF*)0 );
235 fPDFBgd =
new std::vector<TMVA::PDF*>( GetNvar(), (
TMVA::PDF*)0 );
245 DeclareOptionRef( fTransformLikelihoodOutput =
kFALSE,
"TransformOutput",
246 "Transform likelihood output by inverse sigmoid function" );
251 TString updatedOptions = GetOptions();
252 fDefaultPDFLik =
new PDF(
TString(GetName()) +
" PDF", updatedOptions );
253 fDefaultPDFLik->DeclareOptions();
254 fDefaultPDFLik->ParseOptions();
255 updatedOptions = fDefaultPDFLik->GetOptions();
256 for (
UInt_t ivar = 0; ivar< DataInfo().GetNVariables(); ivar++) {
257 (*fPDFSig)[ivar] =
new PDF(
Form(
"%s PDF Sig[%d]", GetName(), ivar), updatedOptions,
258 Form(
"Sig[%d]",ivar), fDefaultPDFLik );
259 (*fPDFSig)[ivar]->DeclareOptions();
260 (*fPDFSig)[ivar]->ParseOptions();
261 updatedOptions = (*fPDFSig)[ivar]->GetOptions();
262 (*fPDFBgd)[ivar] =
new PDF(
Form(
"%s PDF Bkg[%d]", GetName(), ivar), updatedOptions,
263 Form(
"Bkg[%d]",ivar), fDefaultPDFLik );
264 (*fPDFBgd)[ivar]->DeclareOptions();
265 (*fPDFBgd)[ivar]->ParseOptions();
266 updatedOptions = (*fPDFBgd)[ivar]->GetOptions();
270 SetOptions( updatedOptions );
279 DeclareOptionRef( fNsmooth = 1,
"NSmooth",
280 "Number of smoothing iterations for the input histograms");
281 DeclareOptionRef( fAverageEvtPerBin = 50,
"NAvEvtPerBin",
282 "Average number of events per PDF bin");
283 DeclareOptionRef( fKDEfineFactor =1. ,
"KDEFineFactor",
284 "Fine tuning factor for Adaptive KDE: Factor to multiply the width of the kernel");
285 DeclareOptionRef( fBorderMethodString =
"None",
"KDEborder",
286 "Border effects treatment (1=no treatment , 2=kernel renormalization, 3=sample mirroring)" );
287 DeclareOptionRef( fKDEiterString =
"Nonadaptive",
"KDEiter",
288 "Number of iterations (1=non-adaptive, 2=adaptive)" );
289 DeclareOptionRef( fKDEtypeString =
"Gauss",
"KDEtype",
290 "KDE kernel type (1=Gauss)" );
291 fAverageEvtPerBinVarS =
new Int_t[GetNvar()];
292 fAverageEvtPerBinVarB =
new Int_t[GetNvar()];
293 fNsmoothVarS =
new Int_t[GetNvar()];
294 fNsmoothVarB =
new Int_t[GetNvar()];
295 fInterpolateString =
new TString[GetNvar()];
296 for(
UInt_t i=0; i<GetNvar(); ++i) {
297 fAverageEvtPerBinVarS[i] = fAverageEvtPerBinVarB[i] = 0;
298 fNsmoothVarS[i] = fNsmoothVarB[i] = 0;
299 fInterpolateString[i] =
"";
301 DeclareOptionRef( fAverageEvtPerBinVarS, GetNvar(),
"NAvEvtPerBinSig",
302 "Average num of events per PDF bin and variable (signal)");
303 DeclareOptionRef( fAverageEvtPerBinVarB, GetNvar(),
"NAvEvtPerBinBkg",
304 "Average num of events per PDF bin and variable (background)");
305 DeclareOptionRef(fNsmoothVarS, GetNvar(),
"NSmoothSig",
306 "Number of smoothing iterations for the input histograms");
307 DeclareOptionRef(fNsmoothVarB, GetNvar(),
"NSmoothBkg",
308 "Number of smoothing iterations for the input histograms");
309 DeclareOptionRef(fInterpolateString, GetNvar(),
"PDFInterpol",
"Method of interpolating reference histograms (e.g. Spline2 or KDE)");
318 SetSignalReferenceCut( TransformLikelihoodOutput( 0.5, 0.5 ) );
320 fDefaultPDFLik->ProcessOptions();
321 for (
UInt_t ivar = 0; ivar< DataInfo().GetNVariables(); ivar++) {
322 (*fPDFBgd)[ivar]->ProcessOptions();
323 (*fPDFSig)[ivar]->ProcessOptions();
338 std::vector<Double_t>
xmin(nvar),
xmax(nvar);
339 for (
UInt_t ivar=0; ivar<nvar; ivar++) {
xmin[ivar]=1e30;
xmax[ivar]=-1e30;}
341 UInt_t nevents=Data()->GetNEvents();
342 for (
UInt_t ievt=0; ievt<nevents; ievt++) {
345 const Event* origEv = Data()->GetEvent(ievt);
346 if (IgnoreEventsWithNegWeightsInTraining() && origEv->
GetWeight()<=0)
continue;
348 for (
int cls=0;cls<2;cls++){
349 GetTransformationHandler().SetTransformationReferenceClass(cls);
350 const Event* ev = GetTransformationHandler().Transform( origEv );
351 for (
UInt_t ivar=0; ivar<nvar; ivar++) {
353 if (value <
xmin[ivar])
xmin[ivar] = value;
354 if (value >
xmax[ivar])
xmax[ivar] = value;
361 for (
UInt_t ivar=0; ivar<GetNvar(); ivar++) {
362 TString var = (*fInputVars)[ivar];
369 if (DataInfo().GetVariableInfo(ivar).GetVarType() ==
'I') {
374 Int_t nbins = ixmax - ixmin;
375 (*fHistSig)[ivar] =
new TH1F(GetMethodName()+
"_"+var +
"_sig", var +
" signal training", nbins, ixmin, ixmax );
376 (*fHistBgd)[ivar] =
new TH1F(GetMethodName()+
"_"+var +
"_bgd", var +
" background training", nbins, ixmin, ixmax );
379 UInt_t minNEvt =
TMath::Min(Data()->GetNEvtSigTrain(),Data()->GetNEvtBkgdTrain());
380 Int_t nbinsS = (*fPDFSig)[ivar]->GetHistNBins( minNEvt );
381 Int_t nbinsB = (*fPDFBgd)[ivar]->GetHistNBins( minNEvt );
383 (*fHistSig)[ivar] =
new TH1F(
Form(
"%s_%s_%s_sig",DataInfo().GetName(),GetMethodName().Data(),var.
Data()),
384 Form(
"%s_%s_%s signal training",DataInfo().GetName(),GetMethodName().Data(),var.
Data()), nbinsS,
xmin[ivar],
xmax[ivar] );
385 (*fHistBgd)[ivar] =
new TH1F(
Form(
"%s_%s_%s_bgd",DataInfo().GetName(),GetMethodName().Data(),var.
Data()),
386 Form(
"%s_%s_%s background training",DataInfo().GetName(),GetMethodName().Data(),var.
Data()), nbinsB,
xmin[ivar],
xmax[ivar] );
391 Log() << kINFO <<
"Filling reference histograms" <<
Endl;
394 for (
Int_t ievt=0; ievt<Data()->GetNEvents(); ievt++) {
398 const Event* origEv = Data()->GetEvent(ievt);
399 if (IgnoreEventsWithNegWeightsInTraining() && origEv->
GetWeight()<=0)
continue;
400 GetTransformationHandler().SetTransformationReferenceClass( origEv->
GetClass() );
401 const Event* ev = GetTransformationHandler().Transform( origEv );
407 for (
UInt_t ivar=0; ivar<GetNvar(); ivar++) {
410 if (value >=
xmax[ivar]) value =
xmax[ivar] - 1.0e-10;
411 else if (value <
xmin[ivar]) value =
xmin[ivar] + 1.0e-10;
413 if (value >=(*fHistSig)[ivar]->GetXaxis()->GetXmax() ||
414 value <(*fHistSig)[ivar]->GetXaxis()->GetXmin()){
416 <<
"error in filling likelihood reference histograms var="
417 <<(*fInputVars)[ivar]
418 <<
", xmin="<<(*fHistSig)[ivar]->GetXaxis()->GetXmin()
420 <<
", xmax="<<(*fHistSig)[ivar]->GetXaxis()->GetXmax()
423 if (DataInfo().IsSignal(ev)) (*fHistSig)[ivar]->Fill( value, weight );
424 else (*fHistBgd)[ivar]->Fill( value, weight );
429 Log() << kINFO <<
"Building PDF out of reference histograms" <<
Endl;
430 for (
UInt_t ivar=0; ivar<GetNvar(); ivar++) {
434 (*fPDFSig)[ivar]->BuildPDF( (*fHistSig)[ivar] );
435 (*fPDFBgd)[ivar]->BuildPDF( (*fHistBgd)[ivar] );
437 (*fPDFSig)[ivar]->ValidatePDF( (*fHistSig)[ivar] );
438 (*fPDFBgd)[ivar]->ValidatePDF( (*fHistBgd)[ivar] );
441 if ((*fPDFSig)[ivar]->GetSmoothedHist() != 0) (*fHistSig_smooth)[ivar] = (*fPDFSig)[ivar]->GetSmoothedHist();
442 if ((*fPDFBgd)[ivar]->GetSmoothedHist() != 0) (*fHistBgd_smooth)[ivar] = (*fPDFBgd)[ivar]->GetSmoothedHist();
456 NoErrorCalc(err, errUpper);
465 GetTransformationHandler().SetTransformationReferenceClass( fSignalClass );
468 const Event* ev = GetEvent();
469 for (ivar=0; ivar<GetNvar(); ivar++) vs(ivar) = ev->
GetValue(ivar);
471 GetTransformationHandler().SetTransformationReferenceClass( fBackgroundClass );
475 for (ivar=0; ivar<GetNvar(); ivar++) vb(ivar) = ev->
GetValue(ivar);
479 for (ivar=0; ivar<GetNvar(); ivar++) {
482 if ((
Int_t)ivar == fDropVariable)
continue;
486 for (
UInt_t itype=0; itype < 2; itype++) {
489 if (
x[itype] >= (*fPDFSig)[ivar]->GetXmax())
x[itype] = (*fPDFSig)[ivar]->GetXmax() - 1.0e-10;
490 else if (
x[itype] < (*fPDFSig)[ivar]->GetXmin())
x[itype] = (*fPDFSig)[ivar]->GetXmin();
493 PDF* pdf = (itype == 0) ? (*fPDFSig)[ivar] : (*fPDFBgd)[ivar];
494 if (pdf == 0) Log() << kFATAL <<
"<GetMvaValue> Reference histograms don't exist" <<
Endl;
504 DataInfo().GetVariableInfo(ivar).GetVarType() ==
'N') {
521 if (itype == 0) ps *= p;
527 return TransformLikelihoodOutput( ps, pb );
535 if (ps < fEpsilon) ps = fEpsilon;
536 if (pb < fEpsilon) pb = fEpsilon;
538 if (
r >= 1.0)
r = 1. - 1.e-15;
540 if (fTransformLikelihoodOutput) {
544 if (
r <= 0.0)
r = fEpsilon;
545 else if (
r >= 1.0)
r = 1. - 1.e-15;
562 if (fDefaultPDFLik != 0) {
563 o << prefix << std::endl << prefix <<
"#Default Likelihood PDF Options:" << std::endl << prefix << std::endl;
564 fDefaultPDFLik->WriteOptionsToStream( o, prefix );
566 for (
UInt_t ivar = 0; ivar < fPDFSig->size(); ivar++) {
567 if ((*fPDFSig)[ivar] != 0) {
568 o << prefix << std::endl << prefix <<
Form(
"#Signal[%d] Likelihood PDF Options:",ivar) << std::endl << prefix << std::endl;
569 (*fPDFSig)[ivar]->WriteOptionsToStream( o, prefix );
571 if ((*fPDFBgd)[ivar] != 0) {
572 o << prefix << std::endl << prefix <<
"#Background[%d] Likelihood PDF Options:" << std::endl << prefix << std::endl;
573 (*fPDFBgd)[ivar]->WriteOptionsToStream( o, prefix );
587 for (
UInt_t ivar=0; ivar<GetNvar(); ivar++) {
588 if ( (*fPDFSig)[ivar]==0 || (*fPDFBgd)[ivar]==0 )
589 Log() << kFATAL <<
"Reference histograms for variable " << ivar
590 <<
" don't exist, can't write it to weight file" <<
Endl;
594 (*fPDFSig)[ivar]->AddXMLTo(pdfwrap);
598 (*fPDFBgd)[ivar]->AddXMLTo(pdfwrap);
608 if (fRanking)
delete fRanking;
609 fRanking =
new Ranking( GetName(),
"Delta Separation" );
612 for (
Int_t ivar=-1; ivar<(
Int_t)GetNvar(); ivar++) {
615 fDropVariable = ivar;
619 TH1* rS =
new TH1F( nameS, nameS, 80, 0, 1 );
620 TH1* rB =
new TH1F( nameB, nameB, 80, 0, 1 );
623 for (
Int_t ievt=0; ievt<Data()->GetNTrainingEvents(); ievt++) {
625 const Event* origEv = Data()->GetEvent(ievt);
626 GetTransformationHandler().SetTransformationReferenceClass( origEv->
GetClass() );
627 const Event* ev = GetTransformationHandler().Transform(Data()->GetEvent(ievt));
631 if (DataInfo().IsSignal(ev)) rS->
Fill( lk, w );
632 else rB->
Fill( lk, w );
637 if (ivar == -1) sepRef = sep;
644 if (ivar >= 0) fRanking->AddRank(
Rank( DataInfo().GetVariableInfo(ivar).GetInternalName(), sep ) );
658 for (
UInt_t ivar=0; ivar<GetNvar(); ivar++){
659 (*fPDFSig)[ivar]->Write( pname + GetInputVar( ivar ) +
"_S" );
660 (*fPDFBgd)[ivar]->Write( pname + GetInputVar( ivar ) +
"_B" );
675 for (
UInt_t ivar=0; ivar<nvars; ivar++){
677 Log() << kDEBUG <<
"Reading signal and background PDF for variable: " << GetInputVar( ivar ) <<
Endl;
678 if ((*fPDFSig)[ivar] !=0)
delete (*fPDFSig)[ivar];
679 if ((*fPDFBgd)[ivar] !=0)
delete (*fPDFBgd)[ivar];
680 (*fPDFSig)[ivar] =
new PDF( GetInputVar( ivar ) +
" PDF Sig" );
681 (*fPDFBgd)[ivar] =
new PDF( GetInputVar( ivar ) +
" PDF Bkg" );
682 (*fPDFSig)[ivar]->SetReadingVersion( GetTrainingTMVAVersionCode() );
683 (*fPDFBgd)[ivar]->SetReadingVersion( GetTrainingTMVAVersionCode() );
684 (*(*fPDFSig)[ivar]).ReadXML(pdfnode);
687 (*(*fPDFBgd)[ivar]).ReadXML(pdfnode);
702 for (
UInt_t ivar=0; ivar<GetNvar(); ivar++){
703 Log() << kDEBUG <<
"Reading signal and background PDF for variable: " << GetInputVar( ivar ) <<
Endl;
704 if ((*fPDFSig)[ivar] !=0)
delete (*fPDFSig)[ivar];
705 if ((*fPDFBgd)[ivar] !=0)
delete (*fPDFBgd)[ivar];
706 (*fPDFSig)[ivar] =
new PDF(GetInputVar( ivar ) +
" PDF Sig" );
707 (*fPDFBgd)[ivar] =
new PDF(GetInputVar( ivar ) +
" PDF Bkg");
708 (*fPDFSig)[ivar]->SetReadingVersion( GetTrainingTMVAVersionCode() );
709 (*fPDFBgd)[ivar]->SetReadingVersion( GetTrainingTMVAVersionCode() );
710 istr >> *(*fPDFSig)[ivar];
711 istr >> *(*fPDFBgd)[ivar];
724 for (
UInt_t ivar=0; ivar<GetNvar(); ivar++){
725 (*fPDFSig)[ivar] = (
TMVA::PDF*)rf.
Get(
Form(
"PDF_%s_S", GetInputVar( ivar ).Data() ) );
726 (*fPDFBgd)[ivar] = (
TMVA::PDF*)rf.
Get(
Form(
"PDF_%s_B", GetInputVar( ivar ).Data() ) );
736 Log() << kINFO <<
"Write monitoring histograms to file: " << BaseDir()->GetPath() <<
Endl;
739 for (
UInt_t ivar=0; ivar<GetNvar(); ivar++) {
740 (*fHistSig)[ivar]->
Write();
741 (*fHistBgd)[ivar]->Write();
742 if ((*fHistSig_smooth)[ivar] != 0) (*fHistSig_smooth)[ivar]->Write();
743 if ((*fHistBgd_smooth)[ivar] != 0) (*fHistBgd_smooth)[ivar]->Write();
744 (*fPDFSig)[ivar]->GetPDFHist()->Write();
745 (*fPDFBgd)[ivar]->GetPDFHist()->Write();
747 if ((*fPDFSig)[ivar]->GetNSmoothHist() != 0) (*fPDFSig)[ivar]->GetNSmoothHist()->Write();
748 if ((*fPDFBgd)[ivar]->GetNSmoothHist() != 0) (*fPDFBgd)[ivar]->GetNSmoothHist()->Write();
751 Float_t xmin=((*fPDFSig)[ivar]->GetPDFHist()->GetXaxis())->GetXmin();
752 Float_t xmax=((*fPDFSig)[ivar]->GetPDFHist()->GetXaxis())->GetXmax();
753 TH1F* mm =
new TH1F( (*fInputVars)[ivar]+
"_additional_check",
754 (*fInputVars)[ivar]+
"_additional_check", 15000,
xmin,
xmax );
756 for (
Int_t bin=0; bin < 15000; bin++) {
763 TH1*
h[2] = { (*fHistSig)[ivar], (*fHistBgd)[ivar] };
764 for (
UInt_t i=0; i<2; i++) {
770 hclone->
Rebin( resFactor );
771 hclone->
Scale( 1.0/resFactor );
784 fout <<
"#include <math.h>" << std::endl;
785 fout <<
"#include <cstdlib>" << std::endl;
793 Int_t dp = fout.precision();
794 fout <<
" double fEpsilon;" << std::endl;
799 for (
UInt_t ivar=0; ivar<GetNvar(); ivar++) {
800 nbin[ivar]=(*fPDFSig)[ivar]->GetPDFHist()->GetNbinsX();
801 if (nbin[ivar] > nbinMax) nbinMax=nbin[ivar];
804 fout <<
" static float fRefS[][" << nbinMax <<
"]; "
805 <<
"// signal reference vector [nvars][max_nbins]" << std::endl;
806 fout <<
" static float fRefB[][" << nbinMax <<
"]; "
807 <<
"// backgr reference vector [nvars][max_nbins]" << std::endl << std::endl;
808 fout <<
"// if a variable has its PDF encoded as a spline0 --> treat it like an Integer valued one" <<std::endl;
809 fout <<
" bool fHasDiscretPDF[" << GetNvar() <<
"]; "<< std::endl;
810 fout <<
" int fNbin[" << GetNvar() <<
"]; "
811 <<
"// number of bins (discrete variables may have less bins)" << std::endl;
812 fout <<
" double fHistMin[" << GetNvar() <<
"]; " << std::endl;
813 fout <<
" double fHistMax[" << GetNvar() <<
"]; " << std::endl;
815 fout <<
" double TransformLikelihoodOutput( double, double ) const;" << std::endl;
816 fout <<
"};" << std::endl;
817 fout <<
"" << std::endl;
818 fout <<
"inline void " << className <<
"::Initialize() " << std::endl;
819 fout <<
"{" << std::endl;
820 fout <<
" fEpsilon = " << fEpsilon <<
";" << std::endl;
821 for (
UInt_t ivar=0; ivar<GetNvar(); ivar++) {
822 fout <<
" fNbin[" << ivar <<
"] = " << (*fPDFSig)[ivar]->GetPDFHist()->GetNbinsX() <<
";" << std::endl;
823 fout <<
" fHistMin[" << ivar <<
"] = " << (*fPDFSig)[ivar]->GetPDFHist()->GetXaxis()->GetXmin() <<
";" << std::endl;
824 fout <<
" fHistMax[" << ivar <<
"] = " << (*fPDFSig)[ivar]->GetPDFHist()->GetXaxis()->GetXmax() <<
";" << std::endl;
826 if ((((*fPDFSig)[ivar]->GetPDFHist()->GetNbinsX() != nbin[ivar] ||
827 (*fPDFBgd)[ivar]->GetPDFHist()->GetNbinsX() != nbin[ivar])
829 (*fPDFSig)[ivar]->GetPDFHist()->GetNbinsX() != (*fPDFBgd)[ivar]->GetPDFHist()->GetNbinsX()) {
830 Log() << kFATAL <<
"<MakeClassSpecific> Mismatch in binning of variable "
831 <<
"\"" << GetOriginalVarName(ivar) <<
"\" of type: \'" << DataInfo().GetVariableInfo(ivar).GetVarType()
833 <<
"nxS = " << (*fPDFSig)[ivar]->GetPDFHist()->GetNbinsX() <<
", "
834 <<
"nxB = " << (*fPDFBgd)[ivar]->GetPDFHist()->GetNbinsX()
835 <<
" while we expect " << nbin[ivar]
839 for (
UInt_t ivar=0; ivar<GetNvar(); ivar++){
841 fout <<
" fHasDiscretPDF[" << ivar <<
"] = true; " << std::endl;
843 fout <<
" fHasDiscretPDF[" << ivar <<
"] = false; " << std::endl;
846 fout <<
"}" << std::endl << std::endl;
848 fout <<
"inline double " << className
849 <<
"::GetMvaValue__( const std::vector<double>& inputValues ) const" << std::endl;
850 fout <<
"{" << std::endl;
851 fout <<
" double ps(1), pb(1);" << std::endl;
852 fout <<
" std::vector<double> inputValuesSig = inputValues;" << std::endl;
853 fout <<
" std::vector<double> inputValuesBgd = inputValues;" << std::endl;
854 if (GetTransformationHandler().GetTransformationList().GetSize() != 0) {
855 fout <<
" Transform(inputValuesSig,0);" << std::endl;
856 fout <<
" Transform(inputValuesBgd,1);" << std::endl;
858 fout <<
" for (size_t ivar = 0; ivar < GetNvar(); ivar++) {" << std::endl;
860 fout <<
" // dummy at present... will be used for variable transforms" << std::endl;
861 fout <<
" double x[2] = { inputValuesSig[ivar], inputValuesBgd[ivar] };" << std::endl;
863 fout <<
" for (int itype=0; itype < 2; itype++) {" << std::endl;
865 fout <<
" // interpolate linearly between adjacent bins" << std::endl;
866 fout <<
" // this is not useful for discrete variables (or forced Spline0)" << std::endl;
867 fout <<
" int bin = int((x[itype] - fHistMin[ivar])/(fHistMax[ivar] - fHistMin[ivar])*fNbin[ivar]) + 0;" << std::endl;
869 fout <<
" // since the test data sample is in general different from the training sample" << std::endl;
870 fout <<
" // it can happen that the min/max of the training sample are trespassed --> correct this" << std::endl;
871 fout <<
" if (bin < 0) {" << std::endl;
872 fout <<
" bin = 0;" << std::endl;
873 fout <<
" x[itype] = fHistMin[ivar];" << std::endl;
874 fout <<
" }" << std::endl;
875 fout <<
" else if (bin >= fNbin[ivar]) {" << std::endl;
876 fout <<
" bin = fNbin[ivar]-1;" << std::endl;
877 fout <<
" x[itype] = fHistMax[ivar];" << std::endl;
878 fout <<
" }" << std::endl;
880 fout <<
" // find corresponding histogram from cached indices" << std::endl;
881 fout <<
" float ref = (itype == 0) ? fRefS[ivar][bin] : fRefB[ivar][bin];" << std::endl;
883 fout <<
" // sanity check" << std::endl;
884 fout <<
" if (ref < 0) {" << std::endl;
885 fout <<
" std::cout << \"Fatal error in " << className
886 <<
": bin entry < 0 ==> abort\" << std::endl;" << std::endl;
887 fout <<
" std::exit(1);" << std::endl;
888 fout <<
" }" << std::endl;
890 fout <<
" double p = ref;" << std::endl;
892 fout <<
" if (GetType(ivar) != 'I' && !fHasDiscretPDF[ivar]) {" << std::endl;
893 fout <<
" float bincenter = (bin + 0.5)/fNbin[ivar]*(fHistMax[ivar] - fHistMin[ivar]) + fHistMin[ivar];" << std::endl;
894 fout <<
" int nextbin = bin;" << std::endl;
895 fout <<
" if ((x[itype] > bincenter && bin != fNbin[ivar]-1) || bin == 0) " << std::endl;
896 fout <<
" nextbin++;" << std::endl;
897 fout <<
" else" << std::endl;
898 fout <<
" nextbin--; " << std::endl;
900 fout <<
" double refnext = (itype == 0) ? fRefS[ivar][nextbin] : fRefB[ivar][nextbin];" << std::endl;
901 fout <<
" float nextbincenter = (nextbin + 0.5)/fNbin[ivar]*(fHistMax[ivar] - fHistMin[ivar]) + fHistMin[ivar];" << std::endl;
903 fout <<
" double dx = bincenter - nextbincenter;" << std::endl;
904 fout <<
" double dy = ref - refnext;" << std::endl;
905 fout <<
" p += (x[itype] - bincenter) * dy/dx;" << std::endl;
906 fout <<
" }" << std::endl;
908 fout <<
" if (p < fEpsilon) p = fEpsilon; // avoid zero response" << std::endl;
910 fout <<
" if (itype == 0) ps *= p;" << std::endl;
911 fout <<
" else pb *= p;" << std::endl;
912 fout <<
" } " << std::endl;
913 fout <<
" } " << std::endl;
915 fout <<
" // the likelihood ratio (transform it ?)" << std::endl;
916 fout <<
" return TransformLikelihoodOutput( ps, pb ); " << std::endl;
917 fout <<
"}" << std::endl << std::endl;
919 fout <<
"inline double " << className <<
"::TransformLikelihoodOutput( double ps, double pb ) const" << std::endl;
920 fout <<
"{" << std::endl;
921 fout <<
" // returns transformed or non-transformed output" << std::endl;
922 fout <<
" if (ps < fEpsilon) ps = fEpsilon;" << std::endl;
923 fout <<
" if (pb < fEpsilon) pb = fEpsilon;" << std::endl;
924 fout <<
" double r = ps/(ps + pb);" << std::endl;
925 fout <<
" if (r >= 1.0) r = 1. - 1.e-15;" << std::endl;
927 fout <<
" if (" << (fTransformLikelihoodOutput ?
"true" :
"false") <<
") {" << std::endl;
928 fout <<
" // inverse Fermi function" << std::endl;
930 fout <<
" // sanity check" << std::endl;
931 fout <<
" if (r <= 0.0) r = fEpsilon;" << std::endl;
932 fout <<
" else if (r >= 1.0) r = 1. - 1.e-15;" << std::endl;
934 fout <<
" double tau = 15.0;" << std::endl;
935 fout <<
" r = - log(1.0/r - 1.0)/tau;" << std::endl;
936 fout <<
" }" << std::endl;
938 fout <<
" return r;" << std::endl;
939 fout <<
"}" << std::endl;
942 fout <<
"// Clean up" << std::endl;
943 fout <<
"inline void " << className <<
"::Clear() " << std::endl;
944 fout <<
"{" << std::endl;
945 fout <<
" // nothing to clear" << std::endl;
946 fout <<
"}" << std::endl << std::endl;
948 fout <<
"// signal map" << std::endl;
949 fout <<
"float " << className <<
"::fRefS[][" << nbinMax <<
"] = " << std::endl;
950 fout <<
"{ " << std::endl;
951 for (
UInt_t ivar=0; ivar<GetNvar(); ivar++) {
953 for (
Int_t ibin=1; ibin<=nbinMax; ibin++) {
954 if (ibin-1 < nbin[ivar])
955 fout << (*fPDFSig)[ivar]->GetPDFHist()->GetBinContent(ibin);
959 if (ibin < nbinMax) fout <<
", ";
961 fout <<
" }, " << std::endl;
963 fout <<
"}; " << std::endl;
966 fout <<
"// background map" << std::endl;
967 fout <<
"float " << className <<
"::fRefB[][" << nbinMax <<
"] = " << std::endl;
968 fout <<
"{ " << std::endl;
969 for (
UInt_t ivar=0; ivar<GetNvar(); ivar++) {
971 fout << std::setprecision(8);
972 for (
Int_t ibin=1; ibin<=nbinMax; ibin++) {
973 if (ibin-1 < nbin[ivar])
974 fout << (*fPDFBgd)[ivar]->GetPDFHist()->GetBinContent(ibin);
978 if (ibin < nbinMax) fout <<
", ";
980 fout <<
" }, " << std::endl;
982 fout <<
"}; " << std::endl;
984 fout << std::setprecision(dp);
1000 Log() <<
"The maximum-likelihood classifier models the data with probability " <<
Endl;
1001 Log() <<
"density functions (PDF) reproducing the signal and background" <<
Endl;
1002 Log() <<
"distributions of the input variables. Correlations among the " <<
Endl;
1003 Log() <<
"variables are ignored." <<
Endl;
1007 Log() <<
"Required for good performance are decorrelated input variables" <<
Endl;
1008 Log() <<
"(PCA transformation via the option \"VarTransform=Decorrelate\"" <<
Endl;
1009 Log() <<
"may be tried). Irreducible non-linear correlations may be reduced" <<
Endl;
1010 Log() <<
"by precombining strongly correlated input variables, or by simply" <<
Endl;
1011 Log() <<
"removing one of the variables." <<
Endl;
1015 Log() <<
"High fidelity PDF estimates are mandatory, i.e., sufficient training " <<
Endl;
1016 Log() <<
"statistics is required to populate the tails of the distributions" <<
Endl;
1017 Log() <<
"It would be a surprise if the default Spline or KDE kernel parameters" <<
Endl;
1018 Log() <<
"provide a satisfying fit to the data. The user is advised to properly" <<
Endl;
1019 Log() <<
"tune the events per bin and smooth options in the spline cases" <<
Endl;
1020 Log() <<
"individually per variable. If the KDE kernel is used, the adaptive" <<
Endl;
1021 Log() <<
"Gaussian kernel may lead to artefacts, so please always also try" <<
Endl;
1022 Log() <<
"the non-adaptive one." <<
Endl;
1023 Log() <<
"" <<
Endl;
1024 Log() <<
"All tuning parameters must be adjusted individually for each input" <<
Endl;
1025 Log() <<
"variable!" <<
Endl;
#define REGISTER_METHOD(CLASS)
for example
char * Form(const char *fmt,...)
TVectorT< Float_t > TVector
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)}
TH1 is the base class of all histogram classes in ROOT.
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 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...
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
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)