141#pragma warning ( disable : 4355 )
163 fMultiGraph =
nullptr;
177 std::cerr << kERROR <<
"IPythonInteractive::Init: already initialized..." << std::endl;
181 for(
auto& title : graphTitles){
182 fGraphs.push_back(
new TGraph() );
183 fGraphs.back()->SetTitle(title);
184 fGraphs.back()->SetName(title);
185 fGraphs.back()->SetFillColor(color);
186 fGraphs.back()->SetLineColor(color);
187 fGraphs.back()->SetMarkerColor(color);
188 fMultiGraph->Add(fGraphs.back());
200 for(
Int_t i=0; i<fNumGraphs; i++){
214 fGraphs[0]->Set(fIndex+1);
215 fGraphs[1]->Set(fIndex+1);
216 fGraphs[0]->SetPoint(fIndex,
x, y1);
217 fGraphs[1]->SetPoint(fIndex,
x, y2);
230 for(
Int_t i=0; i<fNumGraphs;i++){
231 fGraphs[i]->Set(fIndex+1);
232 fGraphs[i]->SetPoint(fIndex, dat[0], dat[i+1]);
252 fAnalysisType (
Types::kNoAnalysisType ),
253 fRegressionReturnVal ( 0 ),
254 fMulticlassReturnVal ( 0 ),
255 fDataSetInfo ( dsi ),
256 fSignalReferenceCut ( 0.5 ),
257 fSignalReferenceCutOrientation( 1. ),
258 fVariableTransformType (
Types::kSignal ),
259 fJobName ( jobName ),
260 fMethodName ( methodTitle ),
261 fMethodType ( methodType ),
265 fConstructedFromWeightFile (
kFALSE ),
267 fMethodBaseDir ( 0 ),
270 fModelPersistence (
kTRUE),
281 fSplTrainEffBvsS ( 0 ),
282 fVarTransformString (
"None" ),
283 fTransformationPointer ( 0 ),
284 fTransformation ( dsi, methodTitle ),
286 fVerbosityLevelString (
"Default" ),
289 fIgnoreNegWeightsInTraining(
kFALSE ),
291 fBackgroundClass ( 0 ),
316 fAnalysisType (
Types::kNoAnalysisType ),
317 fRegressionReturnVal ( 0 ),
318 fMulticlassReturnVal ( 0 ),
319 fDataSetInfo ( dsi ),
320 fSignalReferenceCut ( 0.5 ),
321 fVariableTransformType (
Types::kSignal ),
323 fMethodName (
"MethodBase" ),
324 fMethodType ( methodType ),
326 fTMVATrainingVersion ( 0 ),
327 fROOTTrainingVersion ( 0 ),
328 fConstructedFromWeightFile (
kTRUE ),
330 fMethodBaseDir ( 0 ),
333 fModelPersistence (
kTRUE),
334 fWeightFile ( weightFile ),
344 fSplTrainEffBvsS ( 0 ),
345 fVarTransformString (
"None" ),
346 fTransformationPointer ( 0 ),
347 fTransformation ( dsi,
"" ),
349 fVerbosityLevelString (
"Default" ),
352 fIgnoreNegWeightsInTraining(
kFALSE ),
354 fBackgroundClass ( 0 ),
372 if (!fSetupCompleted)
Log() << kFATAL <<
Form(
"Dataset[%s] : ",DataInfo().
GetName())<<
"Calling destructor of method which got never setup" <<
Endl;
375 if (fInputVars != 0) { fInputVars->clear();
delete fInputVars; }
376 if (fRanking != 0)
delete fRanking;
379 if (fDefaultPDF!= 0) {
delete fDefaultPDF; fDefaultPDF = 0; }
380 if (fMVAPdfS != 0) {
delete fMVAPdfS; fMVAPdfS = 0; }
381 if (fMVAPdfB != 0) {
delete fMVAPdfB; fMVAPdfB = 0; }
384 if (fSplS) {
delete fSplS; fSplS = 0; }
385 if (fSplB) {
delete fSplB; fSplB = 0; }
386 if (fSpleffBvsS) {
delete fSpleffBvsS; fSpleffBvsS = 0; }
387 if (fSplRefS) {
delete fSplRefS; fSplRefS = 0; }
388 if (fSplRefB) {
delete fSplRefB; fSplRefB = 0; }
389 if (fSplTrainRefS) {
delete fSplTrainRefS; fSplTrainRefS = 0; }
390 if (fSplTrainRefB) {
delete fSplTrainRefB; fSplTrainRefB = 0; }
391 if (fSplTrainEffBvsS) {
delete fSplTrainEffBvsS; fSplTrainEffBvsS = 0; }
393 for (
Int_t i = 0; i < 2; i++ ) {
394 if (fEventCollections.at(i)) {
395 for (std::vector<Event*>::const_iterator it = fEventCollections.at(i)->begin();
396 it != fEventCollections.at(i)->end(); ++it) {
399 delete fEventCollections.at(i);
400 fEventCollections.at(i) = 0;
404 if (fRegressionReturnVal)
delete fRegressionReturnVal;
405 if (fMulticlassReturnVal)
delete fMulticlassReturnVal;
415 if (fSetupCompleted)
Log() << kFATAL <<
Form(
"Dataset[%s] : ",DataInfo().
GetName())<<
"Calling SetupMethod for the second time" <<
Endl;
417 DeclareBaseOptions();
420 fSetupCompleted =
kTRUE;
430 ProcessBaseOptions();
440 CheckForUnusedOptions();
448 SetConfigDescription(
"Configuration options for classifier architecture and tuning" );
456 fSplTrainEffBvsS = 0;
463 fTxtWeightsOnly =
kTRUE;
473 fInputVars =
new std::vector<TString>;
474 for (
UInt_t ivar=0; ivar<GetNvar(); ivar++) {
475 fInputVars->push_back(DataInfo().GetVariableInfo(ivar).GetLabel());
477 fRegressionReturnVal = 0;
478 fMulticlassReturnVal = 0;
480 fEventCollections.resize( 2 );
481 fEventCollections.at(0) = 0;
482 fEventCollections.at(1) = 0;
485 if (DataInfo().GetClassInfo(
"Signal") != 0) {
486 fSignalClass = DataInfo().GetClassInfo(
"Signal")->GetNumber();
488 if (DataInfo().GetClassInfo(
"Background") != 0) {
489 fBackgroundClass = DataInfo().GetClassInfo(
"Background")->GetNumber();
492 SetConfigDescription(
"Configuration options for MVA method" );
493 SetConfigName(
TString(
"Method") + GetMethodTypeName() );
516 DeclareOptionRef( fVerbose,
"V",
"Verbose output (short form of \"VerbosityLevel\" below - overrides the latter one)" );
518 DeclareOptionRef( fVerbosityLevelString=
"Default",
"VerbosityLevel",
"Verbosity level" );
519 AddPreDefVal(
TString(
"Default") );
520 AddPreDefVal(
TString(
"Debug") );
521 AddPreDefVal(
TString(
"Verbose") );
522 AddPreDefVal(
TString(
"Info") );
523 AddPreDefVal(
TString(
"Warning") );
524 AddPreDefVal(
TString(
"Error") );
525 AddPreDefVal(
TString(
"Fatal") );
529 fTxtWeightsOnly =
kTRUE;
532 DeclareOptionRef( fVarTransformString,
"VarTransform",
"List of variable transformations performed before training, e.g., \"D_Background,P_Signal,G,N_AllClasses\" for: \"Decorrelation, PCA-transformation, Gaussianisation, Normalisation, each for the given class of events ('AllClasses' denotes all events of all classes, if no class indication is given, 'All' is assumed)\"" );
534 DeclareOptionRef( fHelp,
"H",
"Print method-specific help message" );
536 DeclareOptionRef( fHasMVAPdfs,
"CreateMVAPdfs",
"Create PDFs for classifier outputs (signal and background)" );
538 DeclareOptionRef( fIgnoreNegWeightsInTraining,
"IgnoreNegWeightsInTraining",
539 "Events with negative weights are ignored in the training (but are included for testing and performance evaluation)" );
552 fDefaultPDF->DeclareOptions();
553 fDefaultPDF->ParseOptions();
554 fDefaultPDF->ProcessOptions();
555 fMVAPdfB =
new PDF(
TString(
GetName())+
"_PDFBkg", fDefaultPDF->GetOptions(),
"MVAPdfBkg", fDefaultPDF );
556 fMVAPdfB->DeclareOptions();
557 fMVAPdfB->ParseOptions();
558 fMVAPdfB->ProcessOptions();
559 fMVAPdfS =
new PDF(
TString(
GetName())+
"_PDFSig", fMVAPdfB->GetOptions(),
"MVAPdfSig", fDefaultPDF );
560 fMVAPdfS->DeclareOptions();
561 fMVAPdfS->ParseOptions();
562 fMVAPdfS->ProcessOptions();
565 SetOptions( fMVAPdfS->GetOptions() );
570 GetTransformationHandler(),
574 if (fDefaultPDF!= 0) {
delete fDefaultPDF; fDefaultPDF = 0; }
575 if (fMVAPdfS != 0) {
delete fMVAPdfS; fMVAPdfS = 0; }
576 if (fMVAPdfB != 0) {
delete fMVAPdfB; fMVAPdfB = 0; }
580 fVerbosityLevelString =
TString(
"Verbose");
581 Log().SetMinType( kVERBOSE );
583 else if (fVerbosityLevelString ==
"Debug" )
Log().SetMinType( kDEBUG );
584 else if (fVerbosityLevelString ==
"Verbose" )
Log().SetMinType( kVERBOSE );
585 else if (fVerbosityLevelString ==
"Info" )
Log().SetMinType( kINFO );
586 else if (fVerbosityLevelString ==
"Warning" )
Log().SetMinType( kWARNING );
587 else if (fVerbosityLevelString ==
"Error" )
Log().SetMinType( kERROR );
588 else if (fVerbosityLevelString ==
"Fatal" )
Log().SetMinType( kFATAL );
589 else if (fVerbosityLevelString !=
"Default" ) {
590 Log() << kFATAL <<
"<ProcessOptions> Verbosity level type '"
591 << fVerbosityLevelString <<
"' unknown." <<
Endl;
603 DeclareOptionRef( fNormalise=
kFALSE,
"Normalise",
"Normalise input variables" );
604 DeclareOptionRef( fUseDecorr=
kFALSE,
"D",
"Use-decorrelated-variables flag" );
605 DeclareOptionRef( fVariableTransformTypeString=
"Signal",
"VarTransformType",
606 "Use signal or background events to derive for variable transformation (the transformation is applied on both types of, course)" );
607 AddPreDefVal(
TString(
"Signal") );
608 AddPreDefVal(
TString(
"Background") );
609 DeclareOptionRef( fTxtWeightsOnly=
kTRUE,
"TxtWeightFilesOnly",
"If True: write all training results (weights) as text files (False: some are written in ROOT format)" );
619 DeclareOptionRef( fNbinsMVAPdf = 60,
"NbinsMVAPdf",
"Number of bins used for the PDFs of classifier outputs" );
620 DeclareOptionRef( fNsmoothMVAPdf = 2,
"NsmoothMVAPdf",
"Number of smoothing iterations for classifier PDFs" );
634 Log() << kWARNING <<
Form(
"Dataset[%s] : ",DataInfo().
GetName())<<
"Parameter optimization is not yet implemented for method "
636 Log() << kWARNING <<
Form(
"Dataset[%s] : ",DataInfo().
GetName())<<
"Currently we need to set hardcoded which parameter is tuned in which ranges"<<
Endl;
638 std::map<TString,Double_t> tunedParameters;
639 tunedParameters.size();
640 return tunedParameters;
661 if (Help()) PrintHelpMessage();
664 if(!IsSilentFile()) BaseDir()->cd();
668 GetTransformationHandler().CalcTransformations(Data()->GetEventCollection());
672 <<
"Begin training" <<
Endl;
673 Long64_t nEvents = Data()->GetNEvents();
677 <<
"\tEnd of training " <<
Endl;
680 <<
"Elapsed time for training with " << nEvents <<
" events: "
684 <<
"\tCreate MVA output for ";
687 if (DoMulticlass()) {
688 Log() <<
Form(
"[%s] : ",DataInfo().
GetName())<<
"Multiclass classification on training sample" <<
Endl;
691 else if (!DoRegression()) {
693 Log() <<
Form(
"[%s] : ",DataInfo().
GetName())<<
"classification on training sample" <<
Endl;
702 Log() <<
Form(
"Dataset[%s] : ",DataInfo().
GetName())<<
"regression on training sample" <<
Endl;
713 if (fModelPersistence ) WriteStateToFile();
716 if ((!DoRegression()) && (fModelPersistence)) MakeClass();
723 WriteMonitoringHistosToFile();
731 if (!DoRegression())
Log() << kFATAL <<
Form(
"Dataset[%s] : ",DataInfo().
GetName())<<
"Trying to use GetRegressionDeviation() with a classification job" <<
Endl;
734 bool truncate =
false;
735 TH1F*
h1 = regRes->QuadraticDeviation( tgtNum , truncate, 1.);
740 TH1F* h2 = regRes->QuadraticDeviation( tgtNum , truncate, yq[0]);
751 Data()->SetCurrentType(
type);
757 Long64_t nEvents = Data()->GetNEvents();
764 regRes->Resize( nEvents );
769 Int_t totalProgressDraws = 100;
770 Int_t drawProgressEvery = 1;
771 if(nEvents >= totalProgressDraws) drawProgressEvery = nEvents/totalProgressDraws;
773 for (
Int_t ievt=0; ievt<nEvents; ievt++) {
775 Data()->SetCurrentEvent(ievt);
776 std::vector< Float_t > vals = GetRegressionValues();
777 regRes->SetValue( vals, ievt );
780 if(ievt % drawProgressEvery == 0 || ievt==nEvents-1) timer.
DrawProgressBar( ievt );
784 <<
"Elapsed time for evaluation of " << nEvents <<
" events: "
791 TString histNamePrefix(GetTestvarName());
793 regRes->CreateDeviationHistograms( histNamePrefix );
801 Data()->SetCurrentType(
type);
806 if (!resMulticlass)
Log() << kFATAL<<
Form(
"Dataset[%s] : ",DataInfo().
GetName())<<
"unable to create pointer in AddMulticlassOutput, exiting."<<
Endl;
808 Long64_t nEvents = Data()->GetNEvents();
816 resMulticlass->Resize( nEvents );
817 for (
Int_t ievt=0; ievt<nEvents; ievt++) {
818 Data()->SetCurrentEvent(ievt);
819 std::vector< Float_t > vals = GetMulticlassValues();
820 resMulticlass->SetValue( vals, ievt );
825 <<
"Elapsed time for evaluation of " << nEvents <<
" events: "
832 TString histNamePrefix(GetTestvarName());
835 resMulticlass->CreateMulticlassHistos( histNamePrefix, fNbinsMVAoutput, fNbinsH );
836 resMulticlass->CreateMulticlassPerformanceHistos(histNamePrefix);
843 if (errUpper) *errUpper=-1;
850 Double_t val = GetMvaValue(err, errUpper);
860 return GetMvaValue()*GetSignalReferenceCutOrientation() > GetSignalReferenceCut()*GetSignalReferenceCutOrientation() ?
kTRUE :
kFALSE;
867 return mvaVal*GetSignalReferenceCutOrientation() > GetSignalReferenceCut()*GetSignalReferenceCutOrientation() ?
kTRUE :
kFALSE;
875 Data()->SetCurrentType(
type);
880 Long64_t nEvents = Data()->GetNEvents();
885 std::vector<Double_t> mvaValues = GetMvaValues(0, nEvents,
true);
892 for (
Int_t ievt=0; ievt<nEvents; ievt++) {
893 clRes->
SetValue( mvaValues[ievt], ievt );
902 Long64_t nEvents = Data()->GetNEvents();
903 if (firstEvt > lastEvt || lastEvt > nEvents) lastEvt = nEvents;
904 if (firstEvt < 0) firstEvt = 0;
905 std::vector<Double_t> values(lastEvt-firstEvt);
907 nEvents = values.size();
916 <<
" sample (" << nEvents <<
" events)" <<
Endl;
918 for (
Int_t ievt=firstEvt; ievt<lastEvt; ievt++) {
919 Data()->SetCurrentEvent(ievt);
920 values[ievt] = GetMvaValue();
925 if (modulo <= 0 ) modulo = 1;
931 <<
"Elapsed time for evaluation of " << nEvents <<
" events: "
943 Data()->SetCurrentType(
type);
948 Long64_t nEvents = Data()->GetNEvents();
956 mvaProb->
Resize( nEvents );
957 for (
Int_t ievt=0; ievt<nEvents; ievt++) {
959 Data()->SetCurrentEvent(ievt);
961 if (proba < 0)
break;
966 if (modulo <= 0 ) modulo = 1;
971 <<
"Elapsed time for evaluation of " << nEvents <<
" events: "
990 Data()->SetCurrentType(
type);
992 bias = 0; biasT = 0; dev = 0; devT = 0; rms = 0; rmsT = 0;
995 const Int_t nevt = GetNEvents();
1000 Log() << kINFO <<
"Calculate regression for all events" <<
Endl;
1002 for (
Long64_t ievt=0; ievt<nevt; ievt++) {
1004 const Event* ev = Data()->GetEvent(ievt);
1007 Float_t r = GetRegressionValues()[0];
1026 m1 += t*w;
s1 += t*t*w;
1027 m2 +=
r*w; s2 +=
r*
r*w;
1032 Log() << kINFO <<
"Elapsed time for evaluation of " << nevt <<
" events: "
1044 corr = s12/sumw - m1*
m2;
1056 for (
Long64_t ievt=0; ievt<nevt; ievt++) {
1058 hist->
Fill( rV[ievt], tV[ievt], wV[ievt] );
1059 if (
d >= devMin &&
d <= devMax) {
1061 biasT += wV[ievt] *
d;
1063 rmsT += wV[ievt] *
d *
d;
1064 histT->
Fill( rV[ievt], tV[ievt], wV[ievt] );
1082 Data()->SetCurrentType(savedType);
1092 if (!resMulticlass)
Log() << kFATAL<<
Form(
"Dataset[%s] : ",DataInfo().
GetName())<<
"unable to create pointer in TestMulticlass, exiting."<<
Endl;
1101 TString histNamePrefix(GetTestvarName());
1102 TString histNamePrefixTest{histNamePrefix +
"_Test"};
1103 TString histNamePrefixTrain{histNamePrefix +
"_Train"};
1124 if (0==mvaRes && !(GetMethodTypeName().Contains(
"Cuts"))) {
1125 Log()<<
Form(
"Dataset[%s] : ",DataInfo().
GetName()) <<
"mvaRes " << mvaRes <<
" GetMethodTypeName " << GetMethodTypeName()
1126 <<
" contains " << !(GetMethodTypeName().Contains(
"Cuts")) <<
Endl;
1127 Log() << kFATAL<<
Form(
"Dataset[%s] : ",DataInfo().
GetName()) <<
"<TestInit> Test variable " << GetTestvarName()
1128 <<
" not found in tree" <<
Endl;
1133 fMeanS, fMeanB, fRmsS, fRmsB, fXmin, fXmax, fSignalClass );
1141 fCutOrientation = (fMeanS > fMeanB) ? kPositive : kNegative;
1153 TestvarName=
Form(
"[%s]%s",DataInfo().
GetName(),GetTestvarName().Data());
1156 TestvarName=GetTestvarName();
1158 TH1* mva_s =
new TH1D( TestvarName +
"_S",TestvarName +
"_S", fNbinsMVAoutput, fXmin, sxmax );
1159 TH1* mva_b =
new TH1D( TestvarName +
"_B",TestvarName +
"_B", fNbinsMVAoutput, fXmin, sxmax );
1160 mvaRes->
Store(mva_s,
"MVA_S");
1161 mvaRes->
Store(mva_b,
"MVA_B");
1171 proba_s =
new TH1D( TestvarName +
"_Proba_S", TestvarName +
"_Proba_S", fNbinsMVAoutput, 0.0, 1.0 );
1172 proba_b =
new TH1D( TestvarName +
"_Proba_B", TestvarName +
"_Proba_B", fNbinsMVAoutput, 0.0, 1.0 );
1173 mvaRes->
Store(proba_s,
"Prob_S");
1174 mvaRes->
Store(proba_b,
"Prob_B");
1179 rarity_s =
new TH1D( TestvarName +
"_Rarity_S", TestvarName +
"_Rarity_S", fNbinsMVAoutput, 0.0, 1.0 );
1180 rarity_b =
new TH1D( TestvarName +
"_Rarity_B", TestvarName +
"_Rarity_B", fNbinsMVAoutput, 0.0, 1.0 );
1181 mvaRes->
Store(rarity_s,
"Rar_S");
1182 mvaRes->
Store(rarity_b,
"Rar_B");
1188 TH1* mva_eff_s =
new TH1D( TestvarName +
"_S_high", TestvarName +
"_S_high", fNbinsH, fXmin, sxmax );
1189 TH1* mva_eff_b =
new TH1D( TestvarName +
"_B_high", TestvarName +
"_B_high", fNbinsH, fXmin, sxmax );
1190 mvaRes->
Store(mva_eff_s,
"MVA_HIGHBIN_S");
1191 mvaRes->
Store(mva_eff_b,
"MVA_HIGHBIN_B");
1200 Log() << kHEADER <<
Form(
"[%s] : ",DataInfo().
GetName())<<
"Loop over test events and fill histograms with classifier response..." <<
Endl <<
Endl;
1201 if (mvaProb)
Log() << kINFO <<
"Also filling probability and rarity histograms (on request)..." <<
Endl;
1205 if ( mvaRes->
GetSize() != GetNEvents() ) {
1207 assert(mvaRes->
GetSize() == GetNEvents());
1210 for (
Long64_t ievt=0; ievt<GetNEvents(); ievt++) {
1212 const Event* ev = GetEvent(ievt);
1216 if (DataInfo().IsSignal(ev)) {
1217 mvaResTypes->push_back(
kTRUE);
1218 mva_s ->
Fill(
v, w );
1220 proba_s->
Fill( (*mvaProb)[ievt][0], w );
1221 rarity_s->
Fill( GetRarity(
v ), w );
1224 mva_eff_s ->
Fill(
v, w );
1227 mvaResTypes->push_back(
kFALSE);
1228 mva_b ->
Fill(
v, w );
1230 proba_b->
Fill( (*mvaProb)[ievt][0], w );
1231 rarity_b->
Fill( GetRarity(
v ), w );
1233 mva_eff_b ->
Fill(
v, w );
1248 if (fSplS) {
delete fSplS; fSplS = 0; }
1249 if (fSplB) {
delete fSplB; fSplB = 0; }
1263 tf << prefix <<
"#GEN -*-*-*-*-*-*-*-*-*-*-*- general info -*-*-*-*-*-*-*-*-*-*-*-" << std::endl << prefix << std::endl;
1264 tf << prefix <<
"Method : " << GetMethodTypeName() <<
"::" <<
GetMethodName() << std::endl;
1265 tf.setf(std::ios::left);
1266 tf << prefix <<
"TMVA Release : " << std::setw(10) << GetTrainingTMVAVersionString() <<
" ["
1267 << GetTrainingTMVAVersionCode() <<
"]" << std::endl;
1268 tf << prefix <<
"ROOT Release : " << std::setw(10) << GetTrainingROOTVersionString() <<
" ["
1269 << GetTrainingROOTVersionCode() <<
"]" << std::endl;
1270 tf << prefix <<
"Creator : " << userInfo->
fUser << std::endl;
1271 tf << prefix <<
"Date : ";
TDatime *
d =
new TDatime; tf <<
d->AsString() << std::endl;
delete d;
1274 tf << prefix <<
"Training events: " << Data()->GetNTrainingEvents() << std::endl;
1278 tf << prefix <<
"Analysis type : " <<
"[" << ((GetAnalysisType()==
Types::kRegression) ?
"Regression" :
"Classification") <<
"]" << std::endl;
1279 tf << prefix << std::endl;
1284 tf << prefix << std::endl << prefix <<
"#OPT -*-*-*-*-*-*-*-*-*-*-*-*- options -*-*-*-*-*-*-*-*-*-*-*-*-" << std::endl << prefix << std::endl;
1285 WriteOptionsToStream( tf, prefix );
1286 tf << prefix << std::endl;
1289 tf << prefix << std::endl << prefix <<
"#VAR -*-*-*-*-*-*-*-*-*-*-*-* variables *-*-*-*-*-*-*-*-*-*-*-*-" << std::endl << prefix << std::endl;
1290 WriteVarsToStream( tf, prefix );
1291 tf << prefix << std::endl;
1308 AddRegressionOutput(
type );
1310 AddMulticlassOutput(
type );
1312 AddClassifierOutput(
type );
1314 AddClassifierOutputProb(
type );
1324 if (!parent)
return;
1329 AddInfoItem( gi,
"TMVA Release", GetTrainingTMVAVersionString() +
" [" +
gTools().StringFromInt(GetTrainingTMVAVersionCode()) +
"]" );
1330 AddInfoItem( gi,
"ROOT Release", GetTrainingROOTVersionString() +
" [" +
gTools().StringFromInt(GetTrainingROOTVersionCode()) +
"]");
1331 AddInfoItem( gi,
"Creator", userInfo->
fUser);
1335 AddInfoItem( gi,
"Training events",
gTools().StringFromInt(Data()->GetNTrainingEvents()));
1336 AddInfoItem( gi,
"TrainingTime",
gTools().StringFromDouble(
const_cast<TMVA::MethodBase*
>(
this)->GetTrainTime()));
1341 AddInfoItem( gi,
"AnalysisType", analysisType );
1345 AddOptionsXMLTo( parent );
1348 AddVarsXMLTo( parent );
1351 if (fModelPersistence)
1352 AddSpectatorsXMLTo( parent );
1355 AddClassesXMLTo(parent);
1358 if (DoRegression()) AddTargetsXMLTo(parent);
1361 GetTransformationHandler(
false).AddXMLTo( parent );
1365 if (fMVAPdfS) fMVAPdfS->AddXMLTo(pdfs);
1366 if (fMVAPdfB) fMVAPdfB->AddXMLTo(pdfs);
1369 AddWeightsXMLTo( parent );
1385 ReadWeightsFromStream( rf );
1398 TString tfname( GetWeightFileName() );
1403 <<
"Creating xml weight file: "
1409 WriteStateToXML(rootnode);
1421 TString tfname(GetWeightFileName());
1424 <<
"Reading weight file: "
1430 Log() << kFATAL <<
"Error parsing XML file " << tfname <<
Endl;
1433 ReadStateFromXML(rootnode);
1438 fb.open(tfname.
Data(),std::ios::in);
1439 if (!fb.is_open()) {
1440 Log() << kFATAL <<
Form(
"Dataset[%s] : ",DataInfo().
GetName())<<
"<ReadStateFromFile> "
1441 <<
"Unable to open input weight file: " << tfname <<
Endl;
1443 std::istream fin(&fb);
1444 ReadStateFromStream(fin);
1447 if (!fTxtWeightsOnly) {
1450 Log() << kINFO <<
Form(
"Dataset[%s] : ",DataInfo().
GetName())<<
"Reading root weight file: "
1453 ReadStateFromStream( *rfile );
1463 ReadStateFromXML(rootnode);
1477 fMethodName = fullMethodName(fullMethodName.
Index(
"::")+2,fullMethodName.
Length());
1482 <<
"Read method \"" <<
GetMethodName() <<
"\" of type \"" << GetMethodTypeName() <<
"\"" <<
Endl;
1492 if (nodeName==
"GeneralInfo") {
1497 while (antypeNode) {
1500 if (
name ==
"TrainingTime")
1503 if (
name ==
"AnalysisType") {
1509 else Log() << kFATAL <<
Form(
"Dataset[%s] : ",DataInfo().
GetName())<<
"Analysis type " << val <<
" is not known." <<
Endl;
1512 if (
name ==
"TMVA Release" ||
name ==
"TMVA") {
1515 fTMVATrainingVersion =
TString(
s(
s.Index(
"[")+1,
s.Index(
"]")-
s.Index(
"[")-1)).
Atoi();
1516 Log() << kDEBUG <<
Form(
"[%s] : ",DataInfo().
GetName()) <<
"MVA method was trained with TMVA Version: " << GetTrainingTMVAVersionString() <<
Endl;
1519 if (
name ==
"ROOT Release" ||
name ==
"ROOT") {
1522 fROOTTrainingVersion =
TString(
s(
s.Index(
"[")+1,
s.Index(
"]")-
s.Index(
"[")-1)).
Atoi();
1524 <<
"MVA method was trained with ROOT Version: " << GetTrainingROOTVersionString() <<
Endl;
1529 else if (nodeName==
"Options") {
1530 ReadOptionsFromXML(ch);
1534 else if (nodeName==
"Variables") {
1535 ReadVariablesFromXML(ch);
1537 else if (nodeName==
"Spectators") {
1538 ReadSpectatorsFromXML(ch);
1540 else if (nodeName==
"Classes") {
1541 if (DataInfo().GetNClasses()==0) ReadClassesFromXML(ch);
1543 else if (nodeName==
"Targets") {
1544 if (DataInfo().GetNTargets()==0 && DoRegression()) ReadTargetsFromXML(ch);
1546 else if (nodeName==
"Transformations") {
1547 GetTransformationHandler().ReadFromXML(ch);
1549 else if (nodeName==
"MVAPdfs") {
1551 if (fMVAPdfS) {
delete fMVAPdfS; fMVAPdfS=0; }
1552 if (fMVAPdfB) {
delete fMVAPdfB; fMVAPdfB=0; }
1556 fMVAPdfS =
new PDF(pdfname);
1557 fMVAPdfS->ReadXML(pdfnode);
1560 fMVAPdfB =
new PDF(pdfname);
1561 fMVAPdfB->ReadXML(pdfnode);
1564 else if (nodeName==
"Weights") {
1565 ReadWeightsFromXML(ch);
1568 Log() << kWARNING <<
Form(
"Dataset[%s] : ",DataInfo().
GetName())<<
"Unparsed XML node: '" << nodeName <<
"'" <<
Endl;
1575 if (GetTransformationHandler().GetCallerName() ==
"") GetTransformationHandler().SetCallerName(
GetName() );
1591 while (!
TString(buf).BeginsWith(
"Method")) GetLine(fin,buf);
1595 methodType = methodType(methodType.
Last(
' '),methodType.
Length());
1600 if (methodName ==
"") methodName = methodType;
1601 fMethodName = methodName;
1603 Log() << kINFO <<
Form(
"Dataset[%s] : ",DataInfo().
GetName())<<
"Read method \"" <<
GetMethodName() <<
"\" of type \"" << GetMethodTypeName() <<
"\"" <<
Endl;
1620 while (!
TString(buf).BeginsWith(
"#OPT")) GetLine(fin,buf);
1621 ReadOptionsFromStream(fin);
1625 fin.getline(buf,512);
1626 while (!
TString(buf).BeginsWith(
"#VAR")) fin.getline(buf,512);
1627 ReadVarsFromStream(fin);
1632 if (IsNormalised()) {
1638 if ( fVarTransformString ==
"None") {
1641 }
else if ( fVarTransformString ==
"Decorrelate" ) {
1643 }
else if ( fVarTransformString ==
"PCA" ) {
1644 varTrafo = GetTransformationHandler().AddTransformation(
new VariablePCATransform(DataInfo()), -1 );
1645 }
else if ( fVarTransformString ==
"Uniform" ) {
1646 varTrafo = GetTransformationHandler().AddTransformation(
new VariableGaussTransform(DataInfo(),
"Uniform"), -1 );
1647 }
else if ( fVarTransformString ==
"Gauss" ) {
1649 }
else if ( fVarTransformString ==
"GaussDecorr" ) {
1653 Log() << kFATAL <<
Form(
"Dataset[%s] : ",DataInfo().
GetName())<<
"<ProcessOptions> Variable transform '"
1654 << fVarTransformString <<
"' unknown." <<
Endl;
1657 if (GetTransformationHandler().GetTransformationList().GetSize() > 0) {
1658 fin.getline(buf,512);
1659 while (!
TString(buf).BeginsWith(
"#MAT")) fin.getline(buf,512);
1662 varTrafo->ReadTransformationFromStream(fin, trafo );
1673 fin.getline(buf,512);
1674 while (!
TString(buf).BeginsWith(
"#MVAPDFS")) fin.getline(buf,512);
1675 if (fMVAPdfS != 0) {
delete fMVAPdfS; fMVAPdfS = 0; }
1676 if (fMVAPdfB != 0) {
delete fMVAPdfB; fMVAPdfB = 0; }
1679 fMVAPdfS->SetReadingVersion( GetTrainingTMVAVersionCode() );
1680 fMVAPdfB->SetReadingVersion( GetTrainingTMVAVersionCode() );
1687 fin.getline(buf,512);
1688 while (!
TString(buf).BeginsWith(
"#WGT")) fin.getline(buf,512);
1689 fin.getline(buf,512);
1690 ReadWeightsFromStream( fin );;
1693 if (GetTransformationHandler().GetCallerName() ==
"") GetTransformationHandler().SetCallerName(
GetName() );
1703 o << prefix <<
"NVar " << DataInfo().GetNVariables() << std::endl;
1704 std::vector<VariableInfo>::const_iterator varIt = DataInfo().GetVariableInfos().begin();
1705 for (; varIt!=DataInfo().GetVariableInfos().end(); ++varIt) { o << prefix; varIt->WriteToStream(o); }
1706 o << prefix <<
"NSpec " << DataInfo().GetNSpectators() << std::endl;
1707 varIt = DataInfo().GetSpectatorInfos().begin();
1708 for (; varIt!=DataInfo().GetSpectatorInfos().end(); ++varIt) { o << prefix; varIt->WriteToStream(o); }
1720 istr >>
dummy >> readNVar;
1722 if (readNVar!=DataInfo().GetNVariables()) {
1723 Log() << kFATAL <<
Form(
"Dataset[%s] : ",DataInfo().
GetName())<<
"You declared "<< DataInfo().GetNVariables() <<
" variables in the Reader"
1724 <<
" while there are " << readNVar <<
" variables declared in the file"
1730 std::vector<VariableInfo>::iterator varIt = DataInfo().GetVariableInfos().begin();
1732 for (; varIt!=DataInfo().GetVariableInfos().end(); ++varIt, ++varIdx) {
1739 Log() << kINFO <<
Form(
"Dataset[%s] : ",DataInfo().
GetName())<<
"ERROR in <ReadVarsFromStream>" <<
Endl;
1740 Log() << kINFO <<
"The definition (or the order) of the variables found in the input file is" <<
Endl;
1741 Log() << kINFO <<
"is not the same as the one declared in the Reader (which is necessary for" <<
Endl;
1742 Log() << kINFO <<
"the correct working of the method):" <<
Endl;
1743 Log() << kINFO <<
" var #" << varIdx <<
" declared in Reader: " << varIt->GetExpression() <<
Endl;
1744 Log() << kINFO <<
" var #" << varIdx <<
" declared in file : " << varInfo.
GetExpression() <<
Endl;
1745 Log() << kFATAL <<
"The expression declared to the Reader needs to be checked (name or order are wrong)" <<
Endl;
1758 for (
UInt_t idx=0; idx<DataInfo().GetVariableInfos().size(); idx++) {
1774 for (
UInt_t idx=0; idx<DataInfo().GetSpectatorInfos().size(); idx++) {
1776 VariableInfo& vi = DataInfo().GetSpectatorInfos()[idx];
1794 UInt_t nClasses=DataInfo().GetNClasses();
1799 for (
UInt_t iCls=0; iCls<nClasses; ++iCls) {
1800 ClassInfo *classInfo=DataInfo().GetClassInfo (iCls);
1817 for (
UInt_t idx=0; idx<DataInfo().GetTargetInfos().size(); idx++) {
1833 if (readNVar!=DataInfo().GetNVariables()) {
1834 Log() << kFATAL <<
Form(
"Dataset[%s] : ",DataInfo().
GetName())<<
"You declared "<< DataInfo().GetNVariables() <<
" variables in the Reader"
1835 <<
" while there are " << readNVar <<
" variables declared in the file"
1845 existingVarInfo = DataInfo().GetVariableInfos()[varIdx];
1850 existingVarInfo = readVarInfo;
1853 Log() << kINFO <<
Form(
"Dataset[%s] : ",DataInfo().
GetName())<<
"ERROR in <ReadVariablesFromXML>" <<
Endl;
1854 Log() << kINFO <<
"The definition (or the order) of the variables found in the input file is" <<
Endl;
1855 Log() << kINFO <<
"not the same as the one declared in the Reader (which is necessary for the" <<
Endl;
1856 Log() << kINFO <<
"correct working of the method):" <<
Endl;
1857 Log() << kINFO <<
" var #" << varIdx <<
" declared in Reader: " << existingVarInfo.
GetExpression() <<
Endl;
1858 Log() << kINFO <<
" var #" << varIdx <<
" declared in file : " << readVarInfo.
GetExpression() <<
Endl;
1859 Log() << kFATAL <<
"The expression declared to the Reader needs to be checked (name or order are wrong)" <<
Endl;
1873 if (readNSpec!=DataInfo().GetNSpectators(
kFALSE)) {
1874 Log() << kFATAL<<
Form(
"Dataset[%s] : ",DataInfo().
GetName()) <<
"You declared "<< DataInfo().GetNSpectators(
kFALSE) <<
" spectators in the Reader"
1875 <<
" while there are " << readNSpec <<
" spectators declared in the file"
1885 existingSpecInfo = DataInfo().GetSpectatorInfos()[specIdx];
1890 existingSpecInfo = readSpecInfo;
1893 Log() << kINFO <<
Form(
"Dataset[%s] : ",DataInfo().
GetName())<<
"ERROR in <ReadSpectatorsFromXML>" <<
Endl;
1894 Log() << kINFO <<
"The definition (or the order) of the spectators found in the input file is" <<
Endl;
1895 Log() << kINFO <<
"not the same as the one declared in the Reader (which is necessary for the" <<
Endl;
1896 Log() << kINFO <<
"correct working of the method):" <<
Endl;
1897 Log() << kINFO <<
" spec #" << specIdx <<
" declared in Reader: " << existingSpecInfo.
GetExpression() <<
Endl;
1898 Log() << kINFO <<
" spec #" << specIdx <<
" declared in file : " << readSpecInfo.
GetExpression() <<
Endl;
1899 Log() << kFATAL <<
"The expression declared to the Reader needs to be checked (name or order are wrong)" <<
Endl;
1918 for (
UInt_t icls = 0; icls<readNCls;++icls) {
1920 DataInfo().AddClass(classname);
1928 DataInfo().AddClass(className);
1935 if (DataInfo().GetClassInfo(
"Signal") != 0) {
1936 fSignalClass = DataInfo().GetClassInfo(
"Signal")->GetNumber();
1940 if (DataInfo().GetClassInfo(
"Background") != 0) {
1941 fBackgroundClass = DataInfo().GetClassInfo(
"Background")->GetNumber();
1961 DataInfo().AddTarget(expression,
"",
"",0,0);
1973 if (fBaseDir != 0)
return fBaseDir;
1974 Log()<<kDEBUG<<
Form(
"Dataset[%s] : ",DataInfo().
GetName())<<
" Base Directory for " <<
GetMethodName() <<
" not set yet --> check if already there.." <<
Endl;
1976 if (IsSilentFile()) {
1978 <<
"MethodBase::BaseDir() - No directory exists when running a Method without output file. Enable the "
1979 "output when creating the factory"
1985 Log() << kFATAL <<
Form(
"Dataset[%s] : ",DataInfo().
GetName())<<
"MethodBase::BaseDir() - MethodBaseDir() return a NULL pointer!" <<
Endl;
1991 Log()<<kDEBUG<<
Form(
"Dataset[%s] : ",DataInfo().
GetName())<<
" Base Directory for " << GetMethodTypeName() <<
" does not exist yet--> created it" <<
Endl;
1992 sdir = methodDir->
mkdir(defaultDir);
1995 if (fModelPersistence) {
1998 wfilePath.
Write(
"TrainingPath" );
1999 wfileName.
Write(
"WeightFileName" );
2003 Log()<<kDEBUG<<
Form(
"Dataset[%s] : ",DataInfo().
GetName())<<
" Base Directory for " << GetMethodTypeName() <<
" existed, return it.." <<
Endl;
2013 if (fMethodBaseDir != 0) {
2014 return fMethodBaseDir;
2017 const char *datasetName = DataInfo().
GetName();
2019 Log() << kDEBUG <<
Form(
"Dataset[%s] : ", datasetName) <<
" Base Directory for " << GetMethodTypeName()
2020 <<
" not set yet --> check if already there.." <<
Endl;
2023 if (!factoryBaseDir)
return nullptr;
2024 fMethodBaseDir = factoryBaseDir->
GetDirectory(datasetName);
2025 if (!fMethodBaseDir) {
2026 fMethodBaseDir = factoryBaseDir->
mkdir(datasetName,
Form(
"Base directory for dataset %s", datasetName));
2027 if (!fMethodBaseDir) {
2028 Log() << kFATAL <<
"Can not create dir " << datasetName;
2031 TString methodTypeDir =
Form(
"Method_%s", GetMethodTypeName().Data());
2032 fMethodBaseDir = fMethodBaseDir->GetDirectory(methodTypeDir.
Data());
2034 if (!fMethodBaseDir) {
2036 TString methodTypeDirHelpStr =
Form(
"Directory for all %s methods", GetMethodTypeName().Data());
2037 fMethodBaseDir = datasetDir->
mkdir(methodTypeDir.
Data(), methodTypeDirHelpStr);
2038 Log() << kDEBUG <<
Form(
"Dataset[%s] : ", datasetName) <<
" Base Directory for " <<
GetMethodName()
2039 <<
" does not exist yet--> created it" <<
Endl;
2042 Log() << kDEBUG <<
Form(
"Dataset[%s] : ", datasetName)
2043 <<
"Return from MethodBaseDir() after creating base directory " <<
Endl;
2044 return fMethodBaseDir;
2061 fWeightFile = theWeightFile;
2069 if (fWeightFile!=
"")
return fWeightFile;
2074 TString wFileDir(GetWeightFileDir());
2077 if (wFileDir.
IsNull() )
return wFileName;
2079 return ( wFileDir + (wFileDir[wFileDir.
Length()-1]==
'/' ?
"" :
"/")
2091 if (0 != fMVAPdfS) {
2092 fMVAPdfS->GetOriginalHist()->Write();
2093 fMVAPdfS->GetSmoothedHist()->Write();
2094 fMVAPdfS->GetPDFHist()->Write();
2096 if (0 != fMVAPdfB) {
2097 fMVAPdfB->GetOriginalHist()->Write();
2098 fMVAPdfB->GetSmoothedHist()->Write();
2099 fMVAPdfB->GetPDFHist()->Write();
2105 Log() << kFATAL <<
Form(
"Dataset[%s] : ",DataInfo().
GetName())<<
"<WriteEvaluationHistosToFile> Unknown result: "
2107 <<
"/kMaxAnalysisType" <<
Endl;
2112 GetTransformationHandler().PlotVariables (GetEventCollection(
Types::kTesting ), BaseDir() );
2115 <<
" variable plots are not produces ! The number of variables is " << DataInfo().GetNVariables()
2135 fin.getline(buf,512);
2137 if (
line.BeginsWith(
"TMVA Release")) {
2141 std::stringstream
s(code.
Data());
2142 s >> fTMVATrainingVersion;
2143 Log() << kINFO <<
Form(
"Dataset[%s] : ",DataInfo().
GetName())<<
"MVA method was trained with TMVA Version: " << GetTrainingTMVAVersionString() <<
Endl;
2145 if (
line.BeginsWith(
"ROOT Release")) {
2149 std::stringstream
s(code.
Data());
2150 s >> fROOTTrainingVersion;
2151 Log() << kINFO <<
Form(
"Dataset[%s] : ",DataInfo().
GetName())<<
"MVA method was trained with ROOT Version: " << GetTrainingROOTVersionString() <<
Endl;
2153 if (
line.BeginsWith(
"Analysis type")) {
2157 std::stringstream
s(code.
Data());
2158 std::string analysisType;
2160 if (analysisType ==
"regression" || analysisType ==
"Regression") SetAnalysisType(
Types::kRegression );
2161 else if (analysisType ==
"classification" || analysisType ==
"Classification") SetAnalysisType(
Types::kClassification );
2162 else if (analysisType ==
"multiclass" || analysisType ==
"Multiclass") SetAnalysisType(
Types::kMulticlass );
2163 else Log() << kFATAL <<
"Analysis type " << analysisType <<
" from weight-file not known!" << std::endl;
2165 Log() << kINFO <<
Form(
"Dataset[%s] : ",DataInfo().
GetName())<<
"Method was trained for "
2185 if (mvaRes==0 || mvaRes->
GetSize()==0) {
2186 Log() << kERROR<<
Form(
"Dataset[%s] : ",DataInfo().
GetName())<<
"<CreateMVAPdfs> No result of classifier testing available" <<
Endl;
2193 TH1* histMVAPdfS =
new TH1D( GetMethodTypeName() +
"_tr_S", GetMethodTypeName() +
"_tr_S",
2194 fMVAPdfS->GetHistNBins( mvaRes->
GetSize() ), minVal, maxVal );
2195 TH1* histMVAPdfB =
new TH1D( GetMethodTypeName() +
"_tr_B", GetMethodTypeName() +
"_tr_B",
2196 fMVAPdfB->GetHistNBins( mvaRes->
GetSize() ), minVal, maxVal );
2200 histMVAPdfS->
Sumw2();
2201 histMVAPdfB->
Sumw2();
2206 Double_t theWeight = Data()->GetEvent(ievt)->GetWeight();
2208 if (DataInfo().IsSignal(Data()->GetEvent(ievt))) histMVAPdfS->
Fill( theVal, theWeight );
2209 else histMVAPdfB->
Fill( theVal, theWeight );
2218 histMVAPdfS->
Write();
2219 histMVAPdfB->
Write();
2222 fMVAPdfS->BuildPDF ( histMVAPdfS );
2223 fMVAPdfB->BuildPDF ( histMVAPdfB );
2224 fMVAPdfS->ValidatePDF( histMVAPdfS );
2225 fMVAPdfB->ValidatePDF( histMVAPdfB );
2227 if (DataInfo().GetNClasses() == 2) {
2229 <<
Form(
"<CreateMVAPdfs> Separation from histogram (PDF): %1.3f (%1.3f)",
2230 GetSeparation( histMVAPdfS, histMVAPdfB ), GetSeparation( fMVAPdfS, fMVAPdfB ) )
2242 if (!fMVAPdfS || !fMVAPdfB) {
2243 Log() << kINFO<<
Form(
"Dataset[%s] : ",DataInfo().
GetName()) <<
"<GetProba> MVA PDFs for Signal and Background don't exist yet, we'll create them on demand" <<
Endl;
2246 Double_t sigFraction = DataInfo().GetTrainingSumSignalWeights() / (DataInfo().GetTrainingSumSignalWeights() + DataInfo().GetTrainingSumBackgrWeights() );
2249 return GetProba(mvaVal,sigFraction);
2257 if (!fMVAPdfS || !fMVAPdfB) {
2258 Log() << kWARNING <<
Form(
"Dataset[%s] : ",DataInfo().
GetName())<<
"<GetProba> MVA PDFs for Signal and Background don't exist" <<
Endl;
2261 Double_t p_s = fMVAPdfS->GetVal( mvaVal );
2262 Double_t p_b = fMVAPdfB->GetVal( mvaVal );
2264 Double_t denom = p_s*ap_sig + p_b*(1 - ap_sig);
2266 return (denom > 0) ? (p_s*ap_sig) / denom : -1;
2279 Log() << kWARNING <<
Form(
"Dataset[%s] : ",DataInfo().
GetName())<<
"<GetRarity> Required MVA PDF for Signal or Background does not exist: "
2280 <<
"select option \"CreateMVAPdfs\"" <<
Endl;
2295 Data()->SetCurrentType(
type);
2305 else if (list->
GetSize() > 2) {
2306 Log() << kFATAL <<
Form(
"Dataset[%s] : ",DataInfo().
GetName())<<
"<GetEfficiency> Wrong number of arguments"
2307 <<
" in string: " << theString
2308 <<
" | required format, e.g., Efficiency:0.05, or empty string" <<
Endl;
2316 Log() << kFATAL <<
Form(
"Dataset[%s] : ",DataInfo().
GetName())<<
"<GetEfficiency> Binning mismatch between signal and background histos" <<
Endl;
2324 TH1 * effhist = results->
GetHist(
"MVA_HIGHBIN_S");
2331 if (results->
DoesExist(
"MVA_EFF_S")==0) {
2334 TH1* eff_s =
new TH1D( GetTestvarName() +
"_effS", GetTestvarName() +
" (signal)", fNbinsH,
xmin,
xmax );
2335 TH1* eff_b =
new TH1D( GetTestvarName() +
"_effB", GetTestvarName() +
" (background)", fNbinsH,
xmin,
xmax );
2336 results->
Store(eff_s,
"MVA_EFF_S");
2337 results->
Store(eff_b,
"MVA_EFF_B");
2340 Int_t sign = (fCutOrientation == kPositive) ? +1 : -1;
2344 for (
UInt_t ievt=0; ievt<Data()->GetNEvents(); ievt++) {
2347 Bool_t isSignal = DataInfo().IsSignal(GetEvent(ievt));
2348 Float_t theWeight = GetEvent(ievt)->GetWeight();
2349 Float_t theVal = (*mvaRes)[ievt];
2352 TH1* theHist = isSignal ? eff_s : eff_b;
2355 if (isSignal) nevtS+=theWeight;
2359 if (sign > 0 && maxbin > fNbinsH)
continue;
2360 if (sign < 0 && maxbin < 1 )
continue;
2361 if (sign > 0 && maxbin < 1 ) maxbin = 1;
2362 if (sign < 0 && maxbin > fNbinsH) maxbin = fNbinsH;
2367 for (
Int_t ibin=maxbin+1; ibin<=fNbinsH; ibin++) theHist->
AddBinContent( ibin , theWeight );
2369 Log() << kFATAL <<
Form(
"Dataset[%s] : ",DataInfo().
GetName())<<
"<GetEfficiency> Mismatch in sign" <<
Endl;
2380 TH1* eff_BvsS =
new TH1D( GetTestvarName() +
"_effBvsS", GetTestvarName() +
"", fNbins, 0, 1 );
2381 results->
Store(eff_BvsS,
"MVA_EFF_BvsS");
2386 TH1* rej_BvsS =
new TH1D( GetTestvarName() +
"_rejBvsS", GetTestvarName() +
"", fNbins, 0, 1 );
2387 results->
Store(rej_BvsS);
2389 rej_BvsS->
SetYTitle(
"Backgr rejection (1-eff)" );
2392 TH1* inveff_BvsS =
new TH1D( GetTestvarName() +
"_invBeffvsSeff",
2393 GetTestvarName(), fNbins, 0, 1 );
2394 results->
Store(inveff_BvsS);
2396 inveff_BvsS->
SetYTitle(
"Inverse backgr. eff (1/eff)" );
2402 fSplRefS =
new TSpline1(
"spline2_signal",
new TGraph( eff_s ) );
2403 fSplRefB =
new TSpline1(
"spline2_background",
new TGraph( eff_b ) );
2417 for (
Int_t bini=1; bini<=fNbins; bini++) {
2439 Double_t effS = 0., rejB, effS_ = 0., rejB_ = 0.;
2440 Int_t nbins_ = 5000;
2441 for (
Int_t bini=1; bini<=nbins_; bini++) {
2444 effS = (bini - 0.5)/
Float_t(nbins_);
2445 rejB = 1.0 - fSpleffBvsS->Eval( effS );
2448 if ((effS - rejB)*(effS_ - rejB_) < 0)
break;
2455 SetSignalReferenceCut( cut );
2460 if (0 == fSpleffBvsS) {
2466 Double_t effS = 0, effB = 0, effS_ = 0, effB_ = 0;
2467 Int_t nbins_ = 1000;
2473 for (
Int_t bini=1; bini<=nbins_; bini++) {
2476 effS = (bini - 0.5)/
Float_t(nbins_);
2477 effB = fSpleffBvsS->Eval( effS );
2478 integral += (1.0 - effB);
2492 for (
Int_t bini=1; bini<=nbins_; bini++) {
2495 effS = (bini - 0.5)/
Float_t(nbins_);
2496 effB = fSpleffBvsS->Eval( effS );
2499 if ((effB - effBref)*(effB_ - effBref) <= 0)
break;
2505 effS = 0.5*(effS + effS_);
2508 if (nevtS > 0) effSerr =
TMath::Sqrt( effS*(1.0 - effS)/nevtS );
2533 Log() << kFATAL <<
Form(
"Dataset[%s] : ",DataInfo().
GetName())<<
"<GetTrainingEfficiency> Wrong number of arguments"
2534 <<
" in string: " << theString
2535 <<
" | required format, e.g., Efficiency:0.05" <<
Endl;
2548 Log() << kFATAL <<
Form(
"Dataset[%s] : ",DataInfo().
GetName())<<
"<GetTrainingEfficiency> Binning mismatch between signal and background histos"
2556 TH1 * effhist = results->
GetHist(
"MVA_HIGHBIN_S");
2561 if (results->
DoesExist(
"MVA_TRAIN_S")==0) {
2567 TH1* mva_s_tr =
new TH1D( GetTestvarName() +
"_Train_S",GetTestvarName() +
"_Train_S", fNbinsMVAoutput, fXmin, sxmax );
2568 TH1* mva_b_tr =
new TH1D( GetTestvarName() +
"_Train_B",GetTestvarName() +
"_Train_B", fNbinsMVAoutput, fXmin, sxmax );
2569 results->
Store(mva_s_tr,
"MVA_TRAIN_S");
2570 results->
Store(mva_b_tr,
"MVA_TRAIN_B");
2575 TH1* mva_eff_tr_s =
new TH1D( GetTestvarName() +
"_trainingEffS", GetTestvarName() +
" (signal)",
2577 TH1* mva_eff_tr_b =
new TH1D( GetTestvarName() +
"_trainingEffB", GetTestvarName() +
" (background)",
2579 results->
Store(mva_eff_tr_s,
"MVA_TRAINEFF_S");
2580 results->
Store(mva_eff_tr_b,
"MVA_TRAINEFF_B");
2583 Int_t sign = (fCutOrientation == kPositive) ? +1 : -1;
2585 std::vector<Double_t> mvaValues = GetMvaValues(0,Data()->GetNEvents());
2586 assert( (
Long64_t) mvaValues.size() == Data()->GetNEvents());
2589 for (
Int_t ievt=0; ievt<Data()->GetNEvents(); ievt++) {
2591 Data()->SetCurrentEvent(ievt);
2592 const Event* ev = GetEvent();
2597 TH1* theEffHist = DataInfo().IsSignal(ev) ? mva_eff_tr_s : mva_eff_tr_b;
2598 TH1* theClsHist = DataInfo().IsSignal(ev) ? mva_s_tr : mva_b_tr;
2600 theClsHist->
Fill( theVal, theWeight );
2604 if (sign > 0 && maxbin > fNbinsH)
continue;
2605 if (sign < 0 && maxbin < 1 )
continue;
2606 if (sign > 0 && maxbin < 1 ) maxbin = 1;
2607 if (sign < 0 && maxbin > fNbinsH) maxbin = fNbinsH;
2609 if (sign > 0)
for (
Int_t ibin=1; ibin<=maxbin; ibin++) theEffHist->
AddBinContent( ibin , theWeight );
2610 else for (
Int_t ibin=maxbin+1; ibin<=fNbinsH; ibin++) theEffHist->
AddBinContent( ibin , theWeight );
2623 TH1* eff_bvss =
new TH1D( GetTestvarName() +
"_trainingEffBvsS", GetTestvarName() +
"", fNbins, 0, 1 );
2625 TH1* rej_bvss =
new TH1D( GetTestvarName() +
"_trainingRejBvsS", GetTestvarName() +
"", fNbins, 0, 1 );
2626 results->
Store(eff_bvss,
"EFF_BVSS_TR");
2627 results->
Store(rej_bvss,
"REJ_BVSS_TR");
2633 if (fSplTrainRefS)
delete fSplTrainRefS;
2634 if (fSplTrainRefB)
delete fSplTrainRefB;
2635 fSplTrainRefS =
new TSpline1(
"spline2_signal",
new TGraph( mva_eff_tr_s ) );
2636 fSplTrainRefB =
new TSpline1(
"spline2_background",
new TGraph( mva_eff_tr_b ) );
2649 fEffS = results->
GetHist(
"MVA_TRAINEFF_S");
2650 for (
Int_t bini=1; bini<=fNbins; bini++) {
2668 fSplTrainEffBvsS =
new TSpline1(
"effBvsS",
new TGraph( eff_bvss ) );
2672 if (0 == fSplTrainEffBvsS)
return 0.0;
2675 Double_t effS = 0., effB, effS_ = 0., effB_ = 0.;
2676 Int_t nbins_ = 1000;
2677 for (
Int_t bini=1; bini<=nbins_; bini++) {
2680 effS = (bini - 0.5)/
Float_t(nbins_);
2681 effB = fSplTrainEffBvsS->Eval( effS );
2684 if ((effB - effBref)*(effB_ - effBref) <= 0)
break;
2689 return 0.5*(effS + effS_);
2698 if (!resMulticlass)
Log() << kFATAL<<
Form(
"Dataset[%s] : ",DataInfo().
GetName())<<
"unable to create pointer in GetMulticlassEfficiency, exiting."<<
Endl;
2710 if (!resMulticlass)
Log() << kFATAL<<
"unable to create pointer in GetMulticlassTrainingEfficiency, exiting."<<
Endl;
2712 Log() << kINFO <<
Form(
"Dataset[%s] : ",DataInfo().
GetName())<<
"Determine optimal multiclass cuts for training data..." <<
Endl;
2713 for (
UInt_t icls = 0; icls<DataInfo().GetNClasses(); ++icls) {
2744 Log() << kFATAL <<
"Cannot get confusion matrix for non-multiclass analysis." << std::endl;
2748 Data()->SetCurrentType(
type);
2752 if (resMulticlass ==
nullptr) {
2754 <<
"unable to create pointer in GetMulticlassEfficiency, exiting." <<
Endl;
2771 return (rms > 0) ?
TMath::Abs(fMeanS - fMeanB)/rms : 0;
2795 if ((!pdfS && pdfB) || (pdfS && !pdfB))
2796 Log() << kFATAL <<
Form(
"Dataset[%s] : ",DataInfo().
GetName())<<
"<GetSeparation> Mismatch in pdfs" <<
Endl;
2797 if (!pdfS) pdfS = fSplS;
2798 if (!pdfB) pdfB = fSplB;
2800 if (!fSplS || !fSplB) {
2801 Log()<<kDEBUG<<
Form(
"[%s] : ",DataInfo().
GetName())<<
"could not calculate the separation, distributions"
2802 <<
" fSplS or fSplB are not yet filled" <<
Endl;
2817 if ((!histS && histB) || (histS && !histB))
2818 Log() << kFATAL <<
Form(
"Dataset[%s] : ",DataInfo().
GetName())<<
"<GetROCIntegral(TH1D*, TH1D*)> Mismatch in hists" <<
Endl;
2820 if (histS==0 || histB==0)
return 0.;
2833 for (
UInt_t i=0; i<nsteps; i++) {
2839 return integral*step;
2851 if ((!pdfS && pdfB) || (pdfS && !pdfB))
2852 Log() << kFATAL <<
Form(
"Dataset[%s] : ",DataInfo().
GetName())<<
"<GetSeparation> Mismatch in pdfs" <<
Endl;
2853 if (!pdfS) pdfS = fSplS;
2854 if (!pdfB) pdfB = fSplB;
2856 if (pdfS==0 || pdfB==0)
return 0.;
2865 for (
UInt_t i=0; i<nsteps; i++) {
2869 return integral*step;
2879 Double_t& max_significance_value )
const
2884 Double_t effS(0),effB(0),significance(0);
2885 TH1D *temp_histogram =
new TH1D(
"temp",
"temp", fNbinsH, fXmin, fXmax );
2887 if (SignalEvents <= 0 || BackgroundEvents <= 0) {
2888 Log() << kFATAL <<
Form(
"Dataset[%s] : ",DataInfo().
GetName())<<
"<GetMaximumSignificance> "
2889 <<
"Number of signal or background events is <= 0 ==> abort"
2893 Log() << kINFO <<
Form(
"Dataset[%s] : ",DataInfo().
GetName())<<
"Using ratio SignalEvents/BackgroundEvents = "
2894 << SignalEvents/BackgroundEvents <<
Endl;
2899 if ( (eff_s==0) || (eff_b==0) ) {
2900 Log() << kWARNING <<
Form(
"Dataset[%s] : ",DataInfo().
GetName())<<
"Efficiency histograms empty !" <<
Endl;
2901 Log() << kWARNING <<
Form(
"Dataset[%s] : ",DataInfo().
GetName())<<
"no maximum cut found, return 0" <<
Endl;
2905 for (
Int_t bin=1; bin<=fNbinsH; bin++) {
2910 significance =
sqrt(SignalEvents)*( effS )/
sqrt( effS + ( BackgroundEvents / SignalEvents) * effB );
2920 delete temp_histogram;
2922 Log() << kINFO <<
Form(
"Dataset[%s] : ",DataInfo().
GetName())<<
"Optimal cut at : " << max_significance <<
Endl;
2923 Log() << kINFO<<
Form(
"Dataset[%s] : ",DataInfo().
GetName()) <<
"Maximum significance: " << max_significance_value <<
Endl;
2925 return max_significance;
2939 Data()->SetCurrentType(treeType);
2941 Long64_t entries = Data()->GetNEvents();
2945 Log() << kFATAL <<
Form(
"Dataset[%s] : ",DataInfo().
GetName())<<
"<CalculateEstimator> Wrong tree type: " << treeType <<
Endl;
2948 UInt_t varIndex = DataInfo().FindVarIndex( theVarName );
2964 for (
Int_t ievt = 0; ievt < entries; ievt++) {
2966 const Event* ev = GetEvent(ievt);
2971 if (DataInfo().IsSignal(ev)) {
2973 meanS += weight*theVar;
2974 rmsS += weight*theVar*theVar;
2978 meanB += weight*theVar;
2979 rmsB += weight*theVar*theVar;
2987 meanS = meanS/sumwS;
2988 meanB = meanB/sumwB;
2992 Data()->SetCurrentType(previousTreeType);
3002 if (theClassFileName ==
"")
3003 classFileName = GetWeightFileDir() +
"/" + GetJobName() +
"_" +
GetMethodName() +
".class.C";
3005 classFileName = theClassFileName;
3009 TString tfname( classFileName );
3011 <<
"Creating standalone class: "
3014 std::ofstream fout( classFileName );
3016 Log() << kFATAL <<
"<MakeClass> Unable to open file: " << classFileName <<
Endl;
3021 fout <<
"// Class: " << className << std::endl;
3022 fout <<
"// Automatically generated by MethodBase::MakeClass" << std::endl <<
"//" << std::endl;
3026 fout <<
"/* configuration options =====================================================" << std::endl << std::endl;
3027 WriteStateToStream( fout );
3029 fout <<
"============================================================================ */" << std::endl;
3032 fout <<
"" << std::endl;
3033 fout <<
"#include <array>" << std::endl;
3034 fout <<
"#include <vector>" << std::endl;
3035 fout <<
"#include <cmath>" << std::endl;
3036 fout <<
"#include <string>" << std::endl;
3037 fout <<
"#include <iostream>" << std::endl;
3038 fout <<
"" << std::endl;
3041 this->MakeClassSpecificHeader( fout, className );
3043 fout <<
"#ifndef IClassifierReader__def" << std::endl;
3044 fout <<
"#define IClassifierReader__def" << std::endl;
3046 fout <<
"class IClassifierReader {" << std::endl;
3048 fout <<
" public:" << std::endl;
3050 fout <<
" // constructor" << std::endl;
3051 fout <<
" IClassifierReader() : fStatusIsClean( true ) {}" << std::endl;
3052 fout <<
" virtual ~IClassifierReader() {}" << std::endl;
3054 fout <<
" // return classifier response" << std::endl;
3056 fout <<
" virtual std::vector<double> GetMulticlassValues( const std::vector<double>& inputValues ) const = 0;" << std::endl;
3058 fout <<
" virtual double GetMvaValue( const std::vector<double>& inputValues ) const = 0;" << std::endl;
3061 fout <<
" // returns classifier status" << std::endl;
3062 fout <<
" bool IsStatusClean() const { return fStatusIsClean; }" << std::endl;
3064 fout <<
" protected:" << std::endl;
3066 fout <<
" bool fStatusIsClean;" << std::endl;
3067 fout <<
"};" << std::endl;
3069 fout <<
"#endif" << std::endl;
3071 fout <<
"class " << className <<
" : public IClassifierReader {" << std::endl;
3073 fout <<
" public:" << std::endl;
3075 fout <<
" // constructor" << std::endl;
3076 fout <<
" " << className <<
"( std::vector<std::string>& theInputVars )" << std::endl;
3077 fout <<
" : IClassifierReader()," << std::endl;
3078 fout <<
" fClassName( \"" << className <<
"\" )," << std::endl;
3079 fout <<
" fNvars( " << GetNvar() <<
" )" << std::endl;
3080 fout <<
" {" << std::endl;
3081 fout <<
" // the training input variables" << std::endl;
3082 fout <<
" const char* inputVars[] = { ";
3083 for (
UInt_t ivar=0; ivar<GetNvar(); ivar++) {
3084 fout <<
"\"" << GetOriginalVarName(ivar) <<
"\"";
3085 if (ivar<GetNvar()-1) fout <<
", ";
3087 fout <<
" };" << std::endl;
3089 fout <<
" // sanity checks" << std::endl;
3090 fout <<
" if (theInputVars.size() <= 0) {" << std::endl;
3091 fout <<
" std::cout << \"Problem in class \\\"\" << fClassName << \"\\\": empty input vector\" << std::endl;" << std::endl;
3092 fout <<
" fStatusIsClean = false;" << std::endl;
3093 fout <<
" }" << std::endl;
3095 fout <<
" if (theInputVars.size() != fNvars) {" << std::endl;
3096 fout <<
" std::cout << \"Problem in class \\\"\" << fClassName << \"\\\": mismatch in number of input values: \"" << std::endl;
3097 fout <<
" << theInputVars.size() << \" != \" << fNvars << std::endl;" << std::endl;
3098 fout <<
" fStatusIsClean = false;" << std::endl;
3099 fout <<
" }" << std::endl;
3101 fout <<
" // validate input variables" << std::endl;
3102 fout <<
" for (size_t ivar = 0; ivar < theInputVars.size(); ivar++) {" << std::endl;
3103 fout <<
" if (theInputVars[ivar] != inputVars[ivar]) {" << std::endl;
3104 fout <<
" std::cout << \"Problem in class \\\"\" << fClassName << \"\\\": mismatch in input variable names\" << std::endl" << std::endl;
3105 fout <<
" << \" for variable [\" << ivar << \"]: \" << theInputVars[ivar].c_str() << \" != \" << inputVars[ivar] << std::endl;" << std::endl;
3106 fout <<
" fStatusIsClean = false;" << std::endl;
3107 fout <<
" }" << std::endl;
3108 fout <<
" }" << std::endl;
3110 fout <<
" // initialize min and max vectors (for normalisation)" << std::endl;
3111 for (
UInt_t ivar = 0; ivar < GetNvar(); ivar++) {
3112 fout <<
" fVmin[" << ivar <<
"] = " << std::setprecision(15) << GetXmin( ivar ) <<
";" << std::endl;
3113 fout <<
" fVmax[" << ivar <<
"] = " << std::setprecision(15) << GetXmax( ivar ) <<
";" << std::endl;
3116 fout <<
" // initialize input variable types" << std::endl;
3117 for (
UInt_t ivar=0; ivar<GetNvar(); ivar++) {
3118 fout <<
" fType[" << ivar <<
"] = \'" << DataInfo().GetVariableInfo(ivar).GetVarType() <<
"\';" << std::endl;
3121 fout <<
" // initialize constants" << std::endl;
3122 fout <<
" Initialize();" << std::endl;
3124 if (GetTransformationHandler().GetTransformationList().GetSize() != 0) {
3125 fout <<
" // initialize transformation" << std::endl;
3126 fout <<
" InitTransform();" << std::endl;
3128 fout <<
" }" << std::endl;
3130 fout <<
" // destructor" << std::endl;
3131 fout <<
" virtual ~" << className <<
"() {" << std::endl;
3132 fout <<
" Clear(); // method-specific" << std::endl;
3133 fout <<
" }" << std::endl;
3135 fout <<
" // the classifier response" << std::endl;
3136 fout <<
" // \"inputValues\" is a vector of input values in the same order as the" << std::endl;
3137 fout <<
" // variables given to the constructor" << std::endl;
3139 fout <<
" std::vector<double> GetMulticlassValues( const std::vector<double>& inputValues ) const override;" << std::endl;
3141 fout <<
" double GetMvaValue( const std::vector<double>& inputValues ) const override;" << std::endl;
3144 fout <<
" private:" << std::endl;
3146 fout <<
" // method-specific destructor" << std::endl;
3147 fout <<
" void Clear();" << std::endl;
3149 if (GetTransformationHandler().GetTransformationList().GetSize()!=0) {
3150 fout <<
" // input variable transformation" << std::endl;
3151 GetTransformationHandler().MakeFunction(fout, className,1);
3152 fout <<
" void InitTransform();" << std::endl;
3153 fout <<
" void Transform( std::vector<double> & iv, int sigOrBgd ) const;" << std::endl;
3156 fout <<
" // common member variables" << std::endl;
3157 fout <<
" const char* fClassName;" << std::endl;
3159 fout <<
" const size_t fNvars;" << std::endl;
3160 fout <<
" size_t GetNvar() const { return fNvars; }" << std::endl;
3161 fout <<
" char GetType( int ivar ) const { return fType[ivar]; }" << std::endl;
3163 fout <<
" // normalisation of input variables" << std::endl;
3164 fout <<
" double fVmin[" << GetNvar() <<
"];" << std::endl;
3165 fout <<
" double fVmax[" << GetNvar() <<
"];" << std::endl;
3166 fout <<
" double NormVariable( double x, double xmin, double xmax ) const {" << std::endl;
3167 fout <<
" // normalise to output range: [-1, 1]" << std::endl;
3168 fout <<
" return 2*(x - xmin)/(xmax - xmin) - 1.0;" << std::endl;
3169 fout <<
" }" << std::endl;
3171 fout <<
" // type of input variable: 'F' or 'I'" << std::endl;
3172 fout <<
" char fType[" << GetNvar() <<
"];" << std::endl;
3174 fout <<
" // initialize internal variables" << std::endl;
3175 fout <<
" void Initialize();" << std::endl;
3177 fout <<
" std::vector<double> GetMulticlassValues__( const std::vector<double>& inputValues ) const;" << std::endl;
3179 fout <<
" double GetMvaValue__( const std::vector<double>& inputValues ) const;" << std::endl;
3181 fout <<
"" << std::endl;
3182 fout <<
" // private members (method specific)" << std::endl;
3185 MakeClassSpecific( fout, className );
3188 fout <<
"inline std::vector<double> " << className <<
"::GetMulticlassValues( const std::vector<double>& inputValues ) const" << std::endl;
3190 fout <<
"inline double " << className <<
"::GetMvaValue( const std::vector<double>& inputValues ) const" << std::endl;
3192 fout <<
"{" << std::endl;
3193 fout <<
" // classifier response value" << std::endl;
3195 fout <<
" std::vector<double> retval;" << std::endl;
3197 fout <<
" double retval = 0;" << std::endl;
3200 fout <<
" // classifier response, sanity check first" << std::endl;
3201 fout <<
" if (!IsStatusClean()) {" << std::endl;
3202 fout <<
" std::cout << \"Problem in class \\\"\" << fClassName << \"\\\": cannot return classifier response\"" << std::endl;
3203 fout <<
" << \" because status is dirty\" << std::endl;" << std::endl;
3204 fout <<
" }" << std::endl;
3205 fout <<
" else {" << std::endl;
3206 if (IsNormalised()) {
3207 fout <<
" // normalise variables" << std::endl;
3208 fout <<
" std::vector<double> iV;" << std::endl;
3209 fout <<
" iV.reserve(inputValues.size());" << std::endl;
3210 fout <<
" int ivar = 0;" << std::endl;
3211 fout <<
" for (std::vector<double>::const_iterator varIt = inputValues.begin();" << std::endl;
3212 fout <<
" varIt != inputValues.end(); varIt++, ivar++) {" << std::endl;
3213 fout <<
" iV.push_back(NormVariable( *varIt, fVmin[ivar], fVmax[ivar] ));" << std::endl;
3214 fout <<
" }" << std::endl;
3215 if (GetTransformationHandler().GetTransformationList().GetSize() != 0 && GetMethodType() !=
Types::kLikelihood &&
3217 fout <<
" Transform( iV, -1 );" << std::endl;
3221 fout <<
" retval = GetMulticlassValues__( iV );" << std::endl;
3223 fout <<
" retval = GetMvaValue__( iV );" << std::endl;
3226 if (GetTransformationHandler().GetTransformationList().GetSize() != 0 && GetMethodType() !=
Types::kLikelihood &&
3228 fout <<
" std::vector<double> iV(inputValues);" << std::endl;
3229 fout <<
" Transform( iV, -1 );" << std::endl;
3231 fout <<
" retval = GetMulticlassValues__( iV );" << std::endl;
3233 fout <<
" retval = GetMvaValue__( iV );" << std::endl;
3237 fout <<
" retval = GetMulticlassValues__( inputValues );" << std::endl;
3239 fout <<
" retval = GetMvaValue__( inputValues );" << std::endl;
3243 fout <<
" }" << std::endl;
3245 fout <<
" return retval;" << std::endl;
3246 fout <<
"}" << std::endl;
3249 if (GetTransformationHandler().GetTransformationList().GetSize()!=0)
3250 GetTransformationHandler().MakeFunction(fout, className,2);
3262 std::streambuf* cout_sbuf = std::cout.rdbuf();
3263 std::ofstream* o = 0;
3264 if (
gConfig().WriteOptionsReference()) {
3265 Log() << kINFO <<
"Print Help message for class " <<
GetName() <<
" into file: " << GetReferenceFile() <<
Endl;
3266 o =
new std::ofstream( GetReferenceFile(), std::ios::app );
3268 Log() << kFATAL <<
"<PrintHelpMessage> Unable to append to output file: " << GetReferenceFile() <<
Endl;
3270 std::cout.rdbuf( o->rdbuf() );
3277 <<
"================================================================"
3281 <<
"H e l p f o r M V A m e t h o d [ " <<
GetName() <<
" ] :"
3286 Log() <<
"Help for MVA method [ " <<
GetName() <<
" ] :" <<
Endl;
3294 Log() <<
"<Suppress this message by specifying \"!H\" in the booking option>" <<
Endl;
3296 <<
"================================================================"
3303 Log() <<
"# End of Message___" <<
Endl;
3306 std::cout.rdbuf( cout_sbuf );
3321 retval = fSplRefS->Eval( theCut );
3323 else retval = fEffS->GetBinContent( fEffS->FindBin( theCut ) );
3332 if (theCut-fXmin < eps) retval = (GetCutOrientation() == kPositive) ? 1.0 : 0.0;
3333 else if (fXmax-theCut < eps) retval = (GetCutOrientation() == kPositive) ? 0.0 : 1.0;
3346 if (GetTransformationHandler().GetTransformationList().GetEntries() <= 0) {
3347 return (Data()->GetEventCollection(
type));
3354 if (fEventCollections.at(idx) == 0) {
3355 fEventCollections.at(idx) = &(Data()->GetEventCollection(
type));
3356 fEventCollections.at(idx) = GetTransformationHandler().CalcTransformations(*(fEventCollections.at(idx)),
kTRUE);
3358 return *(fEventCollections.at(idx));
3366 UInt_t a = GetTrainingTMVAVersionCode() & 0xff0000;
a>>=16;
3367 UInt_t b = GetTrainingTMVAVersionCode() & 0x00ff00;
b>>=8;
3368 UInt_t c = GetTrainingTMVAVersionCode() & 0x0000ff;
3378 UInt_t a = GetTrainingROOTVersionCode() & 0xff0000;
a>>=16;
3379 UInt_t b = GetTrainingROOTVersionCode() & 0x00ff00;
b>>=8;
3380 UInt_t c = GetTrainingROOTVersionCode() & 0x0000ff;
3391 if (mvaRes != NULL) {
3394 TH1D *mva_s_tr =
dynamic_cast<TH1D*
> (mvaRes->
GetHist(
"MVA_TRAIN_S"));
3395 TH1D *mva_b_tr =
dynamic_cast<TH1D*
> (mvaRes->
GetHist(
"MVA_TRAIN_B"));
3397 if ( !mva_s || !mva_b || !mva_s_tr || !mva_b_tr)
return -1;
3399 if (SorB ==
's' || SorB ==
'S')
const Bool_t Use_Splines_for_Eff_
const Int_t NBIN_HIST_HIGH
#define ROOT_VERSION_CODE
static RooMathCoreReg dummy
TMatrixT< Double_t > TMatrixD
char * Form(const char *fmt,...)
R__EXTERN TSystem * gSystem
#define TMVA_VERSION_CODE
Class to manage histogram axis.
virtual Int_t GetSize() const
Return the capacity of the collection, i.e.
virtual Int_t Write(const char *name=0, Int_t option=0, Int_t bufsize=0)
Write all objects in this collection.
This class stores the date and time with a precision of one second in an unsigned 32 bit word (950130...
const char * AsString() const
Return the date & time as a string (ctime() format).
TObject * Get(const char *namecycle) override
Return pointer to object identified by namecycle.
Describe directory structure in memory.
virtual TDirectory * GetDirectory(const char *namecycle, Bool_t printError=false, const char *funcname="GetDirectory")
Find a directory using apath.
virtual TDirectory * mkdir(const char *name, const char *title="", Bool_t returnExistingDirectory=kFALSE)
Create a sub-directory "a" or a hierarchy of sub-directories "a/b/c/...".
virtual Bool_t cd(const char *path=nullptr)
Change current directory to "this" directory.
A ROOT file is a suite of consecutive data records (TKey instances) with a well defined format.
static TFile * Open(const char *name, Option_t *option="", const char *ftitle="", Int_t compress=ROOT::RCompressionSetting::EDefaults::kUseCompiledDefault, Int_t netopt=0)
Create / open a file.
void Close(Option_t *option="") override
Close a file.
A Graph is a graphics object made of two arrays X and Y with npoints each.
1-D histogram with a double per channel (see TH1 documentation)}
1-D histogram with a float per channel (see TH1 documentation)}
virtual Double_t GetBinCenter(Int_t bin) const
Return bin center for 1D histogram.
virtual Int_t GetQuantiles(Int_t nprobSum, Double_t *q, const Double_t *probSum=0)
Compute Quantiles for this histogram Quantile x_q of a probability distribution Function F is defined...
virtual void AddBinContent(Int_t bin)
Increment bin content by 1.
virtual Double_t GetMean(Int_t axis=1) const
For axis = 1,2 or 3 returns the mean value of the histogram along X,Y or Z axis.
virtual void SetXTitle(const char *title)
static void AddDirectory(Bool_t add=kTRUE)
Sets the flag controlling the automatic add of histograms in memory.
TAxis * GetXaxis()
Get the behaviour adopted by the object about the statoverflows. See EStatOverflows for more informat...
virtual Double_t GetMaximum(Double_t maxval=FLT_MAX) const
Return maximum value smaller than maxval of bins in the range, unless the value has been overridden b...
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 Int_t GetMaximumBin() const
Return location of bin with maximum value in the range.
virtual Double_t GetBinContent(Int_t bin) const
Return content of bin number bin.
virtual void SetYTitle(const char *title)
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.
virtual Double_t KolmogorovTest(const TH1 *h2, Option_t *option="") const
Statistical test of compatibility in shape between this histogram and h2, using Kolmogorov test.
virtual void Sumw2(Bool_t flag=kTRUE)
Create structure to store sum of squares of weights.
static Bool_t AddDirectoryStatus()
Static function: cannot be inlined on Windows/NT.
2-D histogram with a float per channel (see TH1 documentation)}
Int_t Fill(Double_t)
Invalid Fill method.
virtual TObject * At(Int_t idx) const
Returns the object at position idx. Returns 0 if idx is out of range.
Class that contains all the information of a class.
TString fWeightFileExtension
Int_t fMaxNumOfAllowedVariables
VariablePlotting & GetVariablePlotting()
class TMVA::Config::VariablePlotting fVariablePlotting
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.
static void SetIsTraining(Bool_t)
when this static function is called, it sets the flag whether events with negative event weight shoul...
Float_t GetTarget(UInt_t itgt) const
static void SetIgnoreNegWeightsInTraining(Bool_t)
when this static function is called, it sets the flag whether events with negative event weight shoul...
Interface for all concrete MVA method implementations.
void Init(std::vector< TString > &graphTitles)
This function gets some title and it creates a TGraph for every title.
IPythonInteractive()
standard constructor
~IPythonInteractive()
standard destructor
void ClearGraphs()
This function sets the point number to 0 for all graphs.
void AddPoint(Double_t x, Double_t y1, Double_t y2)
This function is used only in 2 TGraph case, and it will add new data points to graphs.
Virtual base Class for all MVA method.
TDirectory * MethodBaseDir() const
returns the ROOT directory where all instances of the corresponding MVA method are stored
virtual Double_t GetKSTrainingVsTest(Char_t SorB, TString opt="X")
MethodBase(const TString &jobName, Types::EMVA methodType, const TString &methodTitle, DataSetInfo &dsi, const TString &theOption="")
standard constructor
virtual Double_t GetSeparation(TH1 *, TH1 *) const
compute "separation" defined as
void ReadClassesFromXML(void *clsnode)
read number of classes from XML
void SetWeightFileDir(TString fileDir)
set directory of weight file
void WriteStateToXML(void *parent) const
general method used in writing the header of the weight files where the used variables,...
void DeclareBaseOptions()
define the options (their key words) that can be set in the option string here the options valid for ...
virtual void TestRegression(Double_t &bias, Double_t &biasT, Double_t &dev, Double_t &devT, Double_t &rms, Double_t &rmsT, Double_t &mInf, Double_t &mInfT, Double_t &corr, Types::ETreeType type)
calculate <sum-of-deviation-squared> of regression output versus "true" value from test sample
virtual void DeclareCompatibilityOptions()
options that are used ONLY for the READER to ensure backward compatibility they are hence without any...
virtual Double_t GetSignificance() const
compute significance of mean difference
virtual Double_t GetProba(const Event *ev)
const char * GetName() const
virtual TMatrixD GetMulticlassConfusionMatrix(Double_t effB, Types::ETreeType type)
Construct a confusion matrix for a multiclass classifier.
void PrintHelpMessage() const
prints out method-specific help method
virtual void WriteEvaluationHistosToFile(Types::ETreeType treetype)
writes all MVA evaluation histograms to file
virtual void TestMulticlass()
test multiclass classification
const std::vector< TMVA::Event * > & GetEventCollection(Types::ETreeType type)
returns the event collection (i.e.
void SetupMethod()
setup of methods
TDirectory * BaseDir() const
returns the ROOT directory where info/histograms etc of the corresponding MVA method instance are sto...
virtual std::vector< Float_t > GetMulticlassEfficiency(std::vector< std::vector< Float_t > > &purity)
void AddInfoItem(void *gi, const TString &name, const TString &value) const
xml writing
virtual void AddClassifierOutputProb(Types::ETreeType type)
prepare tree branch with the method's discriminating variable
virtual Double_t GetEfficiency(const TString &, Types::ETreeType, Double_t &err)
fill background efficiency (resp.
TString GetTrainingTMVAVersionString() const
calculates the TMVA version string from the training version code on the fly
void Statistics(Types::ETreeType treeType, const TString &theVarName, Double_t &, Double_t &, Double_t &, Double_t &, Double_t &, Double_t &)
calculates rms,mean, xmin, xmax of the event variable this can be either done for the variables as th...
Bool_t GetLine(std::istream &fin, char *buf)
reads one line from the input stream checks for certain keywords and interprets the line if keywords ...
void ProcessSetup()
process all options the "CheckForUnusedOptions" is done in an independent call, since it may be overr...
virtual std::vector< Double_t > GetMvaValues(Long64_t firstEvt=0, Long64_t lastEvt=-1, Bool_t logProgress=false)
get all the MVA values for the events of the current Data type
virtual Bool_t IsSignalLike()
uses a pre-set cut on the MVA output (SetSignalReferenceCut and SetSignalReferenceCutOrientation) for...
virtual ~MethodBase()
destructor
virtual Double_t GetMaximumSignificance(Double_t SignalEvents, Double_t BackgroundEvents, Double_t &optimal_significance_value) const
plot significance, , curve for given number of signal and background events; returns cut for maximum ...
virtual Double_t GetTrainingEfficiency(const TString &)
void SetWeightFileName(TString)
set the weight file name (depreciated)
virtual void MakeClass(const TString &classFileName=TString("")) const
create reader class for method (classification only at present)
TString GetWeightFileName() const
retrieve weight file name
virtual void TestClassification()
initialization
void AddOutput(Types::ETreeType type, Types::EAnalysisType analysisType)
virtual void WriteMonitoringHistosToFile() const
write special monitoring histograms to file dummy implementation here --------------—
virtual void AddRegressionOutput(Types::ETreeType type)
prepare tree branch with the method's discriminating variable
void InitBase()
default initialization called by all constructors
virtual void GetRegressionDeviation(UInt_t tgtNum, Types::ETreeType type, Double_t &stddev, Double_t &stddev90Percent) const
void ReadStateFromXMLString(const char *xmlstr)
for reading from memory
void CreateMVAPdfs()
Create PDFs of the MVA output variables.
TString GetTrainingROOTVersionString() const
calculates the ROOT version string from the training version code on the fly
virtual Double_t GetValueForRoot(Double_t)
returns efficiency as function of cut
void ReadStateFromFile()
Function to write options and weights to file.
void WriteVarsToStream(std::ostream &tf, const TString &prefix="") const
write the list of variables (name, min, max) for a given data transformation method to the stream
void ReadVarsFromStream(std::istream &istr)
Read the variables (name, min, max) for a given data transformation method from the stream.
void ReadSpectatorsFromXML(void *specnode)
read spectator info from XML
virtual Double_t GetMvaValue(Double_t *errLower=0, Double_t *errUpper=0)=0
void SetTestvarName(const TString &v="")
void ReadVariablesFromXML(void *varnode)
read variable info from XML
virtual std::map< TString, Double_t > OptimizeTuningParameters(TString fomType="ROCIntegral", TString fitType="FitGA")
call the Optimizer with the set of parameters and ranges that are meant to be tuned.
virtual std::vector< Float_t > GetMulticlassTrainingEfficiency(std::vector< std::vector< Float_t > > &purity)
void WriteStateToStream(std::ostream &tf) const
general method used in writing the header of the weight files where the used variables,...
virtual Double_t GetRarity(Double_t mvaVal, Types::ESBType reftype=Types::kBackground) const
compute rarity:
virtual void SetTuneParameters(std::map< TString, Double_t > tuneParameters)
set the tuning parameters according to the argument This is just a dummy .
void ReadStateFromStream(std::istream &tf)
read the header from the weight files of the different MVA methods
void AddVarsXMLTo(void *parent) const
write variable info to XML
void AddTargetsXMLTo(void *parent) const
write target info to XML
void ReadTargetsFromXML(void *tarnode)
read target info from XML
void ProcessBaseOptions()
the option string is decoded, for available options see "DeclareOptions"
void ReadStateFromXML(void *parent)
void NoErrorCalc(Double_t *const err, Double_t *const errUpper)
void WriteStateToFile() const
write options and weights to file note that each one text file for the main configuration information...
void AddClassesXMLTo(void *parent) const
write class info to XML
virtual void AddClassifierOutput(Types::ETreeType type)
prepare tree branch with the method's discriminating variable
void AddSpectatorsXMLTo(void *parent) const
write spectator info to XML
virtual Double_t GetROCIntegral(TH1D *histS, TH1D *histB) const
calculate the area (integral) under the ROC curve as a overall quality measure of the classification
virtual void AddMulticlassOutput(Types::ETreeType type)
prepare tree branch with the method's discriminating variable
virtual void CheckSetup()
check may be overridden by derived class (sometimes, eg, fitters are used which can only be implement...
void SetSource(const std::string &source)
PDF wrapper for histograms; uses user-defined spline interpolation.
Double_t GetVal(Double_t x) const
returns value PDF(x)
Double_t GetIntegral(Double_t xmin, Double_t xmax)
computes PDF integral within given ranges
Class that is the base-class for a vector of result.
void Resize(Int_t entries)
std::vector< Bool_t > * GetValueVectorTypes()
void SetValue(Float_t value, Int_t ievt)
set MVA response
std::vector< Float_t > * GetValueVector()
Class which takes the results of a multiclass classification.
TMatrixD GetConfusionMatrix(Double_t effB)
Returns a confusion matrix where each class is pitted against each other.
Float_t GetAchievablePur(UInt_t cls)
std::vector< Double_t > GetBestMultiClassCuts(UInt_t targetClass)
calculate the best working point (optimal cut values) for the multiclass classifier
void CreateMulticlassHistos(TString prefix, Int_t nbins, Int_t nbins_high)
this function fills the mva response histos for multiclass classification
Float_t GetAchievableEff(UInt_t cls)
void CreateMulticlassPerformanceHistos(TString prefix)
Create performance graphs for this classifier a multiclass setting.
Class that is the base-class for a vector of result.
Class that is the base-class for a vector of result.
Bool_t DoesExist(const TString &alias) const
Returns true if there is an object stored in the result for a given alias, false otherwise.
TH1 * GetHist(const TString &alias) const
TList * GetStorage() const
void Store(TObject *obj, const char *alias=0)
Root finding using Brents algorithm (translated from CERNLIB function RZERO)
Double_t Root(Double_t refValue)
Root finding using Brents algorithm; taken from CERNLIB function RZERO.
Linear interpolation of TGraph.
Timing information for training and evaluation of MVA methods.
Double_t ElapsedSeconds(void)
computes elapsed tim in seconds
TString GetElapsedTime(Bool_t Scientific=kTRUE)
returns pretty string with elapsed time
void DrawProgressBar(Int_t, const TString &comment="")
draws progress bar in color or B&W caution:
Singleton class for Global types used by TMVA.
Class for type info of MVA input variable.
void ReadFromXML(void *varnode)
read VariableInfo from stream
const TString & GetExpression() const
void ReadFromStream(std::istream &istr)
read VariableInfo from stream
void AddToXML(void *varnode)
write class to XML
void SetExternalLink(void *p)
void * GetExternalLink() const
A TMultiGraph is a collection of TGraph (or derived) objects.
virtual const char * GetName() const
Returns name of object.
Collectable string class.
virtual Int_t Write(const char *name=0, Int_t option=0, Int_t bufsize=0)
Write this object to the current directory.
void ToLower()
Change string to lower-case.
Int_t Atoi() const
Return integer value of string.
Bool_t EndsWith(const char *pat, ECaseCompare cmp=kExact) const
Return true if string ends with the specified string.
TSubString Strip(EStripType s=kTrailing, char c=' ') const
Return a substring of self stripped at beginning and/or end.
const char * Data() const
TString & ReplaceAll(const TString &s1, const TString &s2)
Ssiz_t Last(char c) const
Find last occurrence of a character c.
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
virtual const char * GetBuildNode() const
Return the build node name.
virtual int mkdir(const char *name, Bool_t recursive=kFALSE)
Make a file system directory.
virtual const char * WorkingDirectory()
Return working directory.
virtual UserGroup_t * GetUserInfo(Int_t uid)
Returns all user info in the UserGroup_t structure.
void SaveDoc(XMLDocPointer_t xmldoc, const char *filename, Int_t layout=1)
store document content to file if layout<=0, no any spaces or newlines will be placed between xmlnode...
void FreeDoc(XMLDocPointer_t xmldoc)
frees allocated document data and deletes document itself
XMLNodePointer_t DocGetRootElement(XMLDocPointer_t xmldoc)
returns root node of document
XMLDocPointer_t NewDoc(const char *version="1.0")
creates new xml document with provided version
XMLDocPointer_t ParseFile(const char *filename, Int_t maxbuf=100000)
Parses content of file and tries to produce xml structures.
XMLDocPointer_t ParseString(const char *xmlstring)
parses content of string and tries to produce xml structures
void DocSetRootElement(XMLDocPointer_t xmldoc, XMLNodePointer_t xmlnode)
set main (root) node for document
std::string GetMethodName(TCppMethod_t)
std::string GetName(const std::string &scope_name)
void Init(TClassEdit::TInterpreterLookupHelper *helper)
static constexpr double s
static constexpr double m2
void CreateVariableTransforms(const TString &trafoDefinition, TMVA::DataSetInfo &dataInfo, TMVA::TransformationHandler &transformationHandler, TMVA::MsgLogger &log)
MsgLogger & Endl(MsgLogger &ml)
Short_t Max(Short_t a, Short_t b)
Double_t Sqrt(Double_t x)
Short_t Min(Short_t a, Short_t b)