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++) {
 
  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++) {
 
  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
 
winID h TVirtualViewer3D TVirtualGLPainter p
 
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 r
 
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void value
 
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 Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t type
 
char * Form(const char *fmt,...)
Formats a string in a circular formatting buffer.
 
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 Double_t GetBinCenter(Int_t bin) const
Return bin center for 1D histogram.
 
void SetTitle(const char *title) override
Change (i.e.
 
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 TH1 * Rebin(Int_t ngroup=2, const char *newname="", const Double_t *xbins=nullptr)
Rebin this histogram.
 
void SetName(const char *name) override
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.
 
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
 
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
 
Double_t GetMvaValue(Double_t *err=nullptr, Double_t *errUpper=nullptr)
returns the likelihood estimator for signal fill a new Likelihood branch into the testTree
 
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=nullptr, 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)
Returns the largest of a and b.
 
Double_t Log(Double_t x)
Returns the natural logarithm of x.
 
Short_t Min(Short_t a, Short_t b)
Returns the smallest of a and b.