115     fROC(
kTRUE), fSilentFile(theTargetFile == nullptr), fJobName(jobName), fAnalysisType(
Types::kClassification),
 
  116     fModelPersistence(
kTRUE)
 
  148   DeclareOptionRef(color, 
"Color", 
"Flag for coloured screen output (default: True, if in batch mode: False)");
 
  151      "List of transformations to test; formatting example: \"Transformations=I;D;P;U;G,D\", for identity, " 
  152      "decorrelation, PCA, Uniform and Gaussianisation followed by decorrelation transformations");
 
  156                    "Batch mode: boolean silent flag inhibiting any output from TMVA after the creation of the factory " 
  157                    "class object (default: False)");
 
  159                    "Draw progress bar to display training, testing and evaluation schedule (default: True)");
 
  161                    "Option to save the trained model in xml file or using serialization");
 
  165                    "Set the analysis type (Classification, Regression, Multiclass, Auto) (default: Auto)");
 
  189   if (analysisType == 
"classification")
 
  191   else if (analysisType == 
"regression")
 
  193   else if (analysisType == 
"multiclass")
 
  195   else if (analysisType == 
"auto")
 
  206     fSilentFile(
kTRUE), fJobName(jobName), fAnalysisType(
Types::kClassification), fModelPersistence(
kTRUE)
 
  238   DeclareOptionRef(color, 
"Color", 
"Flag for coloured screen output (default: True, if in batch mode: False)");
 
  241      "List of transformations to test; formatting example: \"Transformations=I;D;P;U;G,D\", for identity, " 
  242      "decorrelation, PCA, Uniform and Gaussianisation followed by decorrelation transformations");
 
  246                    "Batch mode: boolean silent flag inhibiting any output from TMVA after the creation of the factory " 
  247                    "class object (default: False)");
 
  249                    "Draw progress bar to display training, testing and evaluation schedule (default: True)");
 
  251                    "Option to save the trained model in xml file or using serialization");
 
  255                    "Set the analysis type (Classification, Regression, Multiclass, Auto) (default: Auto)");
 
  279   if (analysisType == 
"classification")
 
  281   else if (analysisType == 
"regression")
 
  283   else if (analysisType == 
"multiclass")
 
  285   else if (analysisType == 
"auto")
 
  308   std::vector<TMVA::VariableTransformBase *>::iterator trfIt = fDefaultTrfs.begin();
 
  309   for (; trfIt != fDefaultTrfs.end(); ++trfIt)
 
  312   this->DeleteAllMethods();
 
  326   std::map<TString, MVector *>::iterator itrMap;
 
  328   for (itrMap = fMethodsMap.begin(); itrMap != fMethodsMap.end(); ++itrMap) {
 
  329      MVector *methods = itrMap->second;
 
  331      MVector::iterator itrMethod = methods->begin();
 
  332      for (; itrMethod != methods->end(); ++itrMethod) {
 
  333         Log() << kDEBUG << 
"Delete method: " << (*itrMethod)->GetName() << 
Endl;
 
  354   if (fModelPersistence)
 
  373   if (fMethodsMap.find(datasetname) != fMethodsMap.end()) {
 
  374      if (GetMethod(datasetname, methodTitle) != 0) {
 
  375         Log() << kFATAL << 
"Booking failed since method with title <" << methodTitle << 
"> already exists " 
  376               << 
"in with DataSet Name <" << loader->
GetName() << 
">  " << 
Endl;
 
  380   Log() << kHEADER << 
"Booking method: " << 
gTools().
Color(
"bold")
 
  388   conf->
DeclareOptionRef(boostNum = 0, 
"Boost_num", 
"Number of times the classifier will be boosted");
 
  393   if (fModelPersistence) {
 
  398         if (fileDir[fileDir.
Length() - 1] != 
'/')
 
  410      Log() << kDEBUG << 
"Boost Number is " << boostNum << 
" > 0: train boosted classifier" << 
Endl;
 
  414         Log() << kFATAL << 
"Method with type kBoost cannot be casted to MethodCategory. /Factory" << 
Endl; 
 
  417      if (fModelPersistence)
 
  422      methBoost->
SetFile(fgTargetFile);
 
  434         Log() << kFATAL << 
"Method with type kCategory cannot be casted to MethodCategory. /Factory" 
  438      if (fModelPersistence)
 
  442      methCat->
SetFile(fgTargetFile);
 
  448      Log() << kWARNING << 
"Method " << method->
GetMethodTypeName() << 
" is not capable of handling ";
 
  459   if (fModelPersistence)
 
  472   if (fMethodsMap.find(datasetname) == fMethodsMap.end()) {
 
  474      fMethodsMap[datasetname] = mvector;
 
  476   fMethodsMap[datasetname]->push_back(method);
 
  489   return BookMethod(loader, 
Types::Instance().GetMethodName(theMethod), methodTitle, theOption);
 
  504   std::string methodTypeName = std::string(
Types::Instance().GetMethodName(methodType).Data());
 
  510   if (method == 
nullptr)
 
  514      Log() << kERROR << 
"Cannot handle category methods for now." << 
Endl;
 
  518   if (fModelPersistence) {
 
  523         if (fileDir[fileDir.
Length() - 1] != 
'/')
 
  529   if (fModelPersistence)
 
  545   if (HasMethod(datasetname, methodTitle) != 0) {
 
  546      Log() << kFATAL << 
"Booking failed since method with title <" << methodTitle << 
"> already exists " 
  547            << 
"in with DataSet Name <" << loader->
GetName() << 
">  " << 
Endl;
 
  550   Log() << kINFO << 
"Booked classifier \"" << method->
GetMethodName() << 
"\" of type: \"" 
  553   if (fMethodsMap.count(datasetname) == 0) {
 
  555      fMethodsMap[datasetname] = mvector;
 
  558   fMethodsMap[datasetname]->push_back(method);
 
  568   if (fMethodsMap.find(datasetname) == fMethodsMap.end())
 
  571   MVector *methods = fMethodsMap.find(datasetname)->second;
 
  573   MVector::const_iterator itrMethod;
 
  575   for (itrMethod = methods->begin(); itrMethod != methods->end(); ++itrMethod) {
 
  588   if (fMethodsMap.find(datasetname) == fMethodsMap.end())
 
  591   std::string methodName = methodTitle.
Data();
 
  592   auto isEqualToMethodName = [&methodName](
TMVA::IMethod *
m) { 
return (0 == methodName.compare(
m->GetName())); };
 
  595   Bool_t isMethodNameExisting = std::any_of(methods->begin(), methods->end(), isEqualToMethodName);
 
  597   return isMethodNameExisting;
 
  606   if (!RootBaseDir()->GetDirectory(fDataSetInfo.
GetName()))
 
  607      RootBaseDir()->mkdir(fDataSetInfo.
GetName());
 
  611   RootBaseDir()->cd(fDataSetInfo.
GetName());
 
  657   processTrfs = fTransformations;
 
  660   std::vector<TMVA::TransformationHandler *> trfs;
 
  664   std::vector<TString>::iterator trfsDefIt = trfsDef.begin();
 
  665   for (; trfsDefIt != trfsDef.end(); ++trfsDefIt) {
 
  670      Log() << kDEBUG << 
"current transformation string: '" << trfS.
Data() << 
"'" << 
Endl;
 
  674         identityTrHandler = trfs.back();
 
  680   std::vector<TMVA::TransformationHandler *>::iterator trfIt = trfs.begin();
 
  682   for (; trfIt != trfs.end(); ++trfIt) {
 
  684      (*trfIt)->SetRootDir(RootBaseDir()->GetDirectory(fDataSetInfo.
GetName())); 
 
  685      (*trfIt)->CalcTransformations(inputEvents);
 
  687   if (identityTrHandler)
 
  691   for (trfIt = trfs.begin(); trfIt != trfs.end(); ++trfIt)
 
  704   std::map<TString, MVector *>::iterator itrMap;
 
  705   std::map<TString, Double_t> TunedParameters;
 
  706   for (itrMap = fMethodsMap.begin(); itrMap != fMethodsMap.end(); ++itrMap) {
 
  707      MVector *methods = itrMap->second;
 
  709      MVector::iterator itrMethod;
 
  712      for (itrMethod = methods->begin(); itrMethod != methods->end(); ++itrMethod) {
 
  716            Log() << kFATAL << 
"Dynamic cast to MethodBase failed" << 
Endl;
 
  717            return TunedParameters;
 
  721            Log() << kWARNING << 
"Method " << mva->
GetMethodName() << 
" not trained (training tree has less entries [" 
  726         Log() << kINFO << 
"Optimize method: " << mva->
GetMethodName() << 
" for " 
  729                      : (fAnalysisType == 
Types::kMulticlass ? 
"Multiclass classification" : 
"Classification"))
 
  733         Log() << kINFO << 
"Optimization of tuning parameters finished for Method:" << mva->
GetName() << 
Endl;
 
  737   return TunedParameters;
 
  764   if (fMethodsMap.find(datasetname) == fMethodsMap.end()) {
 
  765      Log() << kERROR << 
Form(
"DataSet = %s not found in methods map.", datasetname.
Data()) << 
Endl;
 
  769   if (!this->HasMethod(datasetname, theMethodName)) {
 
  770      Log() << kERROR << 
Form(
"Method = %s not found with Dataset = %s ", theMethodName.
Data(), datasetname.
Data())
 
  776   if (allowedAnalysisTypes.count(this->fAnalysisType) == 0) {
 
  777      Log() << kERROR << 
Form(
"Can only generate ROC curves for analysis type kClassification and kMulticlass.")
 
  790            << 
Form(
"Given class number (iClass = %i) does not exist. There are %i classes in dataset.", iClass,
 
  800      std::vector<Bool_t> *mvaResTypes = 
dynamic_cast<ResultsClassification *
>(results)->GetValueVectorTypes();
 
  801      std::vector<Float_t> mvaResWeights;
 
  804      mvaResWeights.reserve(eventCollection.size());
 
  805      for (
auto ev : eventCollection) {
 
  806         mvaResWeights.push_back(ev->GetWeight());
 
  809      rocCurve = 
new TMVA::ROCCurve(*mvaRes, *mvaResTypes, mvaResWeights);
 
  812      std::vector<Float_t> mvaRes;
 
  813      std::vector<Bool_t> mvaResTypes;
 
  814      std::vector<Float_t> mvaResWeights;
 
  816      std::vector<std::vector<Float_t>> *rawMvaRes = 
dynamic_cast<ResultsMulticlass *
>(results)->GetValueVector();
 
  821      mvaRes.reserve(rawMvaRes->size());
 
  822      for (
auto item : *rawMvaRes) {
 
  823         mvaRes.push_back(item[iClass]);
 
  827      mvaResTypes.reserve(eventCollection.size());
 
  828      mvaResWeights.reserve(eventCollection.size());
 
  829      for (
auto ev : eventCollection) {
 
  830         mvaResTypes.push_back(ev->GetClass() == iClass);
 
  831         mvaResWeights.push_back(ev->GetWeight());
 
  834      rocCurve = 
new TMVA::ROCCurve(mvaRes, mvaResTypes, mvaResWeights);
 
  864   if (fMethodsMap.find(datasetname) == fMethodsMap.end()) {
 
  865      Log() << kERROR << 
Form(
"DataSet = %s not found in methods map.", datasetname.
Data()) << 
Endl;
 
  869   if (!this->HasMethod(datasetname, theMethodName)) {
 
  870      Log() << kERROR << 
Form(
"Method = %s not found with Dataset = %s ", theMethodName.
Data(), datasetname.
Data())
 
  876   if (allowedAnalysisTypes.count(this->fAnalysisType) == 0) {
 
  877      Log() << kERROR << 
Form(
"Can only generate ROC integral for analysis type kClassification. and kMulticlass.")
 
  885            << 
Form(
"ROCCurve object was not created in Method = %s not found with Dataset = %s ", theMethodName.
Data(),
 
  915   return GetROCCurve((
TString)loader->
GetName(), theMethodName, setTitles, iClass, 
type);
 
  935   if (fMethodsMap.find(datasetname) == fMethodsMap.end()) {
 
  936      Log() << kERROR << 
Form(
"DataSet = %s not found in methods map.", datasetname.
Data()) << 
Endl;
 
  940   if (!this->HasMethod(datasetname, theMethodName)) {
 
  941      Log() << kERROR << 
Form(
"Method = %s not found with Dataset = %s ", theMethodName.
Data(), datasetname.
Data())
 
  947   if (allowedAnalysisTypes.count(this->fAnalysisType) == 0) {
 
  948      Log() << kERROR << 
Form(
"Can only generate ROC curves for analysis type kClassification and kMulticlass.")
 
  958            << 
Form(
"ROCCurve object was not created in Method = %s not found with Dataset = %s ", theMethodName.
Data(),
 
  968      graph->GetYaxis()->SetTitle(
"Background rejection (Specificity)");
 
  969      graph->GetXaxis()->SetTitle(
"Signal efficiency (Sensitivity)");
 
  970      graph->SetTitle(
Form(
"Signal efficiency vs. Background rejection (%s)", theMethodName.
Data()));
 
 1011   MVector *methods = fMethodsMap[datasetname.
Data()];
 
 1012   for (
auto *method_raw : *methods) {
 
 1014      if (method == 
nullptr) {
 
 1023               << 
Form(
"Given class number (iClass = %i) does not exist. There are %i classes in dataset.", iClass,
 
 1031      TGraph *
graph = this->GetROCCurve(datasetname, methodName, 
false, iClass, 
type);
 
 1032      graph->SetTitle(methodName);
 
 1034      graph->SetLineWidth(2);
 
 1035      graph->SetLineColor(line_color++);
 
 1036      graph->SetFillColor(10);
 
 1042      Log() << kERROR << 
Form(
"No metohds have class %i defined.", iClass) << 
Endl;
 
 1079   if (fMethodsMap.find(datasetname) == fMethodsMap.end()) {
 
 1080      Log() << kERROR << 
Form(
"DataSet = %s not found in methods map.", datasetname.
Data()) << 
Endl;
 
 1088   TMultiGraph *multigraph = this->GetROCCurveAsMultiGraph(datasetname, iClass, 
type);
 
 1091      multigraph->
Draw(
"AL");
 
 1096      TString titleString = 
Form(
"Signal efficiency vs. Background rejection");
 
 1098         titleString = 
Form(
"%s (Class=%i)", titleString.
Data(), iClass);
 
 1105      canvas->
BuildLegend(0.15, 0.15, 0.35, 0.3, 
"MVA Method");
 
 1120   if (fMethodsMap.empty()) {
 
 1121      Log() << kINFO << 
"...nothing found to train" << 
Endl;
 
 1127   Log() << kDEBUG << 
"Train all methods for " 
 1133   std::map<TString, MVector *>::iterator itrMap;
 
 1135   for (itrMap = fMethodsMap.begin(); itrMap != fMethodsMap.end(); ++itrMap) {
 
 1136      MVector *methods = itrMap->second;
 
 1137      MVector::iterator itrMethod;
 
 1140      for (itrMethod = methods->begin(); itrMethod != methods->end(); ++itrMethod) {
 
 1149            Log() << kFATAL << 
"No input data for the training provided!" << 
Endl;
 
 1153            Log() << kFATAL << 
"You want to do regression training without specifying a target." << 
Endl;
 
 1156            Log() << kFATAL << 
"You want to do classification training, but specified less than two classes." << 
Endl;
 
 1159         if (!IsSilentFile())
 
 1163            Log() << kWARNING << 
"Method " << mva->
GetMethodName() << 
" not trained (training tree has less entries [" 
 1168         Log() << kHEADER << 
"Train method: " << mva->
GetMethodName() << 
" for " 
 1171                      : (fAnalysisType == 
Types::kMulticlass ? 
"Multiclass classification" : 
"Classification"))
 
 1174         Log() << kHEADER << 
"Training finished" << 
Endl << 
Endl;
 
 1181         Log() << kINFO << 
"Ranking input variables (method specific)..." << 
Endl;
 
 1182         for (itrMethod = methods->begin(); itrMethod != methods->end(); ++itrMethod) {
 
 1187               const Ranking *ranking = (*itrMethod)->CreateRanking();
 
 1191                  Log() << kINFO << 
"No variable ranking supplied by classifier: " 
 1198      if (!IsSilentFile()) {
 
 1199         for (
UInt_t i = 0; i < methods->size(); i++) {
 
 1204            m->fTrainHistory.SaveHistory(
m->GetMethodName());
 
 1212      if (fModelPersistence) {
 
 1214         Log() << kHEADER << 
"=== Destroy and recreate all methods via weight files for testing ===" << 
Endl << 
Endl;
 
 1216         if (!IsSilentFile())
 
 1217            RootBaseDir()->cd();
 
 1220         for (
UInt_t i = 0; i < methods->size(); i++) {
 
 1227            TString weightfile = 
m->GetWeightFileName();
 
 1234            TString testvarName = 
m->GetTestvarName();
 
 1239               Types::Instance().GetMethodName(methodType).Data(), dataSetInfo, weightfile));
 
 1243                  Log() << kFATAL << 
"Method with type kCategory cannot be casted to MethodCategory. /Factory" << 
Endl;
 
 1249            TString wfileDir = 
m->DataInfo().GetName();
 
 1251            m->SetWeightFileDir(wfileDir);
 
 1252            m->SetModelPersistence(fModelPersistence);
 
 1253            m->SetSilentFile(IsSilentFile());
 
 1254            m->SetAnalysisType(fAnalysisType);
 
 1256            m->ReadStateFromFile();
 
 1257            m->SetTestvarName(testvarName);
 
 1276   if (fMethodsMap.empty()) {
 
 1277      Log() << kINFO << 
"...nothing found to test" << 
Endl;
 
 1280   std::map<TString, MVector *>::iterator itrMap;
 
 1282   for (itrMap = fMethodsMap.begin(); itrMap != fMethodsMap.end(); ++itrMap) {
 
 1283      MVector *methods = itrMap->second;
 
 1284      MVector::iterator itrMethod;
 
 1287      for (itrMethod = methods->begin(); itrMethod != methods->end(); ++itrMethod) {
 
 1293         Log() << kHEADER << 
"Test method: " << mva->
GetMethodName() << 
" for " 
 1296                      : (analysisType == 
Types::kMulticlass ? 
"Multiclass classification" : 
"Classification"))
 
 1307   if (methodTitle != 
"") {
 
 1308      IMethod *method = GetMethod(datasetname, methodTitle);
 
 1312         Log() << kWARNING << 
"<MakeClass> Could not find classifier \"" << methodTitle << 
"\" in list" << 
Endl;
 
 1317      MVector *methods = fMethodsMap.find(datasetname)->second;
 
 1318      MVector::const_iterator itrMethod;
 
 1319      for (itrMethod = methods->begin(); itrMethod != methods->end(); ++itrMethod) {
 
 1323         Log() << kINFO << 
"Make response class for classifier: " << method->
GetMethodName() << 
Endl;
 
 1335   if (methodTitle != 
"") {
 
 1336      IMethod *method = GetMethod(datasetname, methodTitle);
 
 1340         Log() << kWARNING << 
"<PrintHelpMessage> Could not find classifier \"" << methodTitle << 
"\" in list" << 
Endl;
 
 1345      MVector *methods = fMethodsMap.find(datasetname)->second;
 
 1346      MVector::const_iterator itrMethod;
 
 1347      for (itrMethod = methods->begin(); itrMethod != methods->end(); ++itrMethod) {
 
 1351         Log() << kINFO << 
"Print help message for classifier: " << method->
GetMethodName() << 
Endl;
 
 1362   Log() << kINFO << 
"Evaluating all variables..." << 
Endl;
 
 1369      this->BookMethod(loader, 
"Variable", s);
 
 1381   if (fMethodsMap.empty()) {
 
 1382      Log() << kINFO << 
"...nothing found to evaluate" << 
Endl;
 
 1385   std::map<TString, MVector *>::iterator itrMap;
 
 1387   for (itrMap = fMethodsMap.begin(); itrMap != fMethodsMap.end(); ++itrMap) {
 
 1388      MVector *methods = itrMap->second;
 
 1398      Int_t nmeth_used[2] = {0, 0}; 
 
 1400      std::vector<std::vector<TString>> mname(2);
 
 1401      std::vector<std::vector<Double_t>> sig(2), sep(2), roc(2);
 
 1402      std::vector<std::vector<Double_t>> eff01(2), eff10(2), eff30(2), effArea(2);
 
 1403      std::vector<std::vector<Double_t>> eff01err(2), eff10err(2), eff30err(2);
 
 1404      std::vector<std::vector<Double_t>> trainEff01(2), trainEff10(2), trainEff30(2);
 
 1406      std::vector<std::vector<Float_t>> multiclass_testEff;
 
 1407      std::vector<std::vector<Float_t>> multiclass_trainEff;
 
 1408      std::vector<std::vector<Float_t>> multiclass_testPur;
 
 1409      std::vector<std::vector<Float_t>> multiclass_trainPur;
 
 1411      std::vector<std::vector<Float_t>> train_history;
 
 1414      std::vector<TMatrixD> multiclass_trainConfusionEffB01;
 
 1415      std::vector<TMatrixD> multiclass_trainConfusionEffB10;
 
 1416      std::vector<TMatrixD> multiclass_trainConfusionEffB30;
 
 1417      std::vector<TMatrixD> multiclass_testConfusionEffB01;
 
 1418      std::vector<TMatrixD> multiclass_testConfusionEffB10;
 
 1419      std::vector<TMatrixD> multiclass_testConfusionEffB30;
 
 1421      std::vector<std::vector<Double_t>> biastrain(1); 
 
 1422      std::vector<std::vector<Double_t>> biastest(1);  
 
 1423      std::vector<std::vector<Double_t>> devtrain(1);  
 
 1424      std::vector<std::vector<Double_t>> devtest(1);   
 
 1425      std::vector<std::vector<Double_t>> rmstrain(1);  
 
 1426      std::vector<std::vector<Double_t>> rmstest(1);   
 
 1427      std::vector<std::vector<Double_t>> minftrain(1); 
 
 1428      std::vector<std::vector<Double_t>> minftest(1);  
 
 1429      std::vector<std::vector<Double_t>> rhotrain(1);  
 
 1430      std::vector<std::vector<Double_t>> rhotest(1);   
 
 1433      std::vector<std::vector<Double_t>> biastrainT(1);
 
 1434      std::vector<std::vector<Double_t>> biastestT(1);
 
 1435      std::vector<std::vector<Double_t>> devtrainT(1);
 
 1436      std::vector<std::vector<Double_t>> devtestT(1);
 
 1437      std::vector<std::vector<Double_t>> rmstrainT(1);
 
 1438      std::vector<std::vector<Double_t>> rmstestT(1);
 
 1439      std::vector<std::vector<Double_t>> minftrainT(1);
 
 1440      std::vector<std::vector<Double_t>> minftestT(1);
 
 1449      for (MVector::iterator itrMethod = methods->begin(); itrMethod != methods->end(); ++itrMethod) {
 
 1454         theMethod->
SetFile(fgTargetFile);
 
 1457            methodsNoCuts.push_back(*itrMethod);
 
 1460            doRegression = 
kTRUE;
 
 1462            Log() << kINFO << 
"Evaluate regression method: " << theMethod->
GetMethodName() << 
Endl;
 
 1467            Log() << kINFO << 
"TestRegression (testing)" << 
Endl;
 
 1469            biastest[0].push_back(bias);
 
 1470            devtest[0].push_back(dev);
 
 1471            rmstest[0].push_back(rms);
 
 1472            minftest[0].push_back(mInf);
 
 1473            rhotest[0].push_back(rho);
 
 1474            biastestT[0].push_back(biasT);
 
 1475            devtestT[0].push_back(devT);
 
 1476            rmstestT[0].push_back(rmsT);
 
 1477            minftestT[0].push_back(mInfT);
 
 1479            Log() << kINFO << 
"TestRegression (training)" << 
Endl;
 
 1481            biastrain[0].push_back(bias);
 
 1482            devtrain[0].push_back(dev);
 
 1483            rmstrain[0].push_back(rms);
 
 1484            minftrain[0].push_back(mInf);
 
 1485            rhotrain[0].push_back(rho);
 
 1486            biastrainT[0].push_back(biasT);
 
 1487            devtrainT[0].push_back(devT);
 
 1488            rmstrainT[0].push_back(rmsT);
 
 1489            minftrainT[0].push_back(mInfT);
 
 1493            if (!IsSilentFile()) {
 
 1494               Log() << kDEBUG << 
"\tWrite evaluation histograms to file" << 
Endl;
 
 1502            doMulticlass = 
kTRUE;
 
 1503            Log() << kINFO << 
"Evaluate multiclass classification method: " << theMethod->
GetMethodName() << 
Endl;
 
 1522            if (!IsSilentFile()) {
 
 1523               Log() << kDEBUG << 
"\tWrite evaluation histograms to file" << 
Endl;
 
 1546            eff01err[isel].push_back(err);
 
 1548            eff10err[isel].push_back(err);
 
 1550            eff30err[isel].push_back(err);
 
 1553            trainEff01[isel].push_back(
 
 1560            if (!IsSilentFile()) {
 
 1561               Log() << kDEBUG << 
"\tWrite evaluation histograms to file" << 
Endl;
 
 1569         std::vector<TString> vtemps = mname[0];
 
 1570         std::vector<std::vector<Double_t>> vtmp;
 
 1571         vtmp.push_back(devtest[0]); 
 
 1572         vtmp.push_back(devtrain[0]);
 
 1573         vtmp.push_back(biastest[0]);
 
 1574         vtmp.push_back(biastrain[0]);
 
 1575         vtmp.push_back(rmstest[0]);
 
 1576         vtmp.push_back(rmstrain[0]);
 
 1577         vtmp.push_back(minftest[0]);
 
 1578         vtmp.push_back(minftrain[0]);
 
 1579         vtmp.push_back(rhotest[0]);
 
 1580         vtmp.push_back(rhotrain[0]);
 
 1581         vtmp.push_back(devtestT[0]); 
 
 1582         vtmp.push_back(devtrainT[0]);
 
 1583         vtmp.push_back(biastestT[0]);
 
 1584         vtmp.push_back(biastrainT[0]);
 
 1585         vtmp.push_back(rmstestT[0]);
 
 1586         vtmp.push_back(rmstrainT[0]);
 
 1587         vtmp.push_back(minftestT[0]);
 
 1588         vtmp.push_back(minftrainT[0]);
 
 1591         devtest[0] = vtmp[0];
 
 1592         devtrain[0] = vtmp[1];
 
 1593         biastest[0] = vtmp[2];
 
 1594         biastrain[0] = vtmp[3];
 
 1595         rmstest[0] = vtmp[4];
 
 1596         rmstrain[0] = vtmp[5];
 
 1597         minftest[0] = vtmp[6];
 
 1598         minftrain[0] = vtmp[7];
 
 1599         rhotest[0] = vtmp[8];
 
 1600         rhotrain[0] = vtmp[9];
 
 1601         devtestT[0] = vtmp[10];
 
 1602         devtrainT[0] = vtmp[11];
 
 1603         biastestT[0] = vtmp[12];
 
 1604         biastrainT[0] = vtmp[13];
 
 1605         rmstestT[0] = vtmp[14];
 
 1606         rmstrainT[0] = vtmp[15];
 
 1607         minftestT[0] = vtmp[16];
 
 1608         minftrainT[0] = vtmp[17];
 
 1609      } 
else if (doMulticlass) {
 
 1616         for (
Int_t k = 0; k < 2; k++) {
 
 1617            std::vector<std::vector<Double_t>> vtemp;
 
 1618            vtemp.push_back(effArea[k]); 
 
 1619            vtemp.push_back(eff10[k]);
 
 1620            vtemp.push_back(eff01[k]);
 
 1621            vtemp.push_back(eff30[k]);
 
 1622            vtemp.push_back(eff10err[k]);
 
 1623            vtemp.push_back(eff01err[k]);
 
 1624            vtemp.push_back(eff30err[k]);
 
 1625            vtemp.push_back(trainEff10[k]);
 
 1626            vtemp.push_back(trainEff01[k]);
 
 1627            vtemp.push_back(trainEff30[k]);
 
 1628            vtemp.push_back(sig[k]);
 
 1629            vtemp.push_back(sep[k]);
 
 1630            vtemp.push_back(roc[k]);
 
 1631            std::vector<TString> vtemps = mname[k];
 
 1633            effArea[k] = vtemp[0];
 
 1634            eff10[k] = vtemp[1];
 
 1635            eff01[k] = vtemp[2];
 
 1636            eff30[k] = vtemp[3];
 
 1637            eff10err[k] = vtemp[4];
 
 1638            eff01err[k] = vtemp[5];
 
 1639            eff30err[k] = vtemp[6];
 
 1640            trainEff10[k] = vtemp[7];
 
 1641            trainEff01[k] = vtemp[8];
 
 1642            trainEff30[k] = vtemp[9];
 
 1656      if (fCorrelations) {
 
 1657         const Int_t nmeth = methodsNoCuts.size();
 
 1660         if (!doRegression && !doMulticlass) {
 
 1666               std::vector<Double_t> rvec;
 
 1674               std::vector<TString> *theVars = 
new std::vector<TString>;
 
 1675               std::vector<ResultsClassification *> mvaRes;
 
 1676               for (MVector::iterator itrMethod = methodsNoCuts.begin(); itrMethod != methodsNoCuts.end();
 
 1677                    ++itrMethod, ++ivar) {
 
 1681                  theVars->push_back(
m->GetTestvarName());
 
 1682                  rvec.push_back(
m->GetSignalReferenceCut());
 
 1683                  theVars->back().ReplaceAll(
"MVA_", 
"");
 
 1702                  for (
Int_t im = 0; im < nmeth; im++) {
 
 1706                        Log() << kWARNING << 
"Found NaN return value in event: " << ievt << 
" for method \"" 
 1707                              << methodsNoCuts[im]->GetName() << 
"\"" << 
Endl;
 
 1712                  for (
Int_t iv = 0; iv < nvar; iv++)
 
 1723                  for (
Int_t im = 0; im < nmeth; im++) {
 
 1724                     for (
Int_t jm = im; jm < nmeth; jm++) {
 
 1725                        if ((dvec[im] - rvec[im]) * (dvec[jm] - rvec[jm]) > 0) {
 
 1726                           (*theMat)(im, jm)++;
 
 1728                              (*theMat)(jm, im)++;
 
 1748               if (corrMatS != 0 && corrMatB != 0) {
 
 1753                  for (
Int_t im = 0; im < nmeth; im++) {
 
 1754                     for (
Int_t jm = 0; jm < nmeth; jm++) {
 
 1755                        mvaMatS(im, jm) = (*corrMatS)(im, jm);
 
 1756                        mvaMatB(im, jm) = (*corrMatB)(im, jm);
 
 1761                  std::vector<TString> theInputVars;
 
 1764                  for (
Int_t iv = 0; iv < nvar; iv++) {
 
 1766                     for (
Int_t jm = 0; jm < nmeth; jm++) {
 
 1767                        varmvaMatS(iv, jm) = (*corrMatS)(nmeth + iv, jm);
 
 1768                        varmvaMatB(iv, jm) = (*corrMatB)(nmeth + iv, jm);
 
 1773                     Log() << kINFO << 
Endl;
 
 1775                           << 
"Inter-MVA correlation matrix (signal):" << 
Endl;
 
 1777                     Log() << kINFO << 
Endl;
 
 1780                           << 
"Inter-MVA correlation matrix (background):" << 
Endl;
 
 1782                     Log() << kINFO << 
Endl;
 
 1786                        << 
"Correlations between input variables and MVA response (signal):" << 
Endl;
 
 1788                  Log() << kINFO << 
Endl;
 
 1791                        << 
"Correlations between input variables and MVA response (background):" << 
Endl;
 
 1793                  Log() << kINFO << 
Endl;
 
 1796                        << 
"<TestAllMethods> cannot compute correlation matrices" << 
Endl;
 
 1800                     << 
"The following \"overlap\" matrices contain the fraction of events for which " << 
Endl;
 
 1802                     << 
"the MVAs 'i' and 'j' have returned conform answers about \"signal-likeness\"" << 
Endl;
 
 1804                     << 
"An event is signal-like, if its MVA output exceeds the following value:" << 
Endl;
 
 1807                     << 
"which correspond to the working point: eff(signal) = 1 - eff(background)" << 
Endl;
 
 1810               if (nmeth != (
Int_t)methods->size())
 
 1812                        << 
"Note: no correlations and overlap with cut method are provided at present" << 
Endl;
 
 1815                  Log() << kINFO << 
Endl;
 
 1817                        << 
"Inter-MVA overlap matrix (signal):" << 
Endl;
 
 1819                  Log() << kINFO << 
Endl;
 
 1822                        << 
"Inter-MVA overlap matrix (background):" << 
Endl;
 
 1845         Log() << kINFO << 
Endl;
 
 1847            "--------------------------------------------------------------------------------------------------";
 
 1848         Log() << kINFO << 
"Evaluation results ranked by smallest RMS on test sample:" << 
Endl;
 
 1849         Log() << kINFO << 
"(\"Bias\" quotes the mean deviation of the regression from true target." << 
Endl;
 
 1850         Log() << kINFO << 
" \"MutInf\" is the \"Mutual Information\" between regression and target." << 
Endl;
 
 1851         Log() << kINFO << 
" Indicated by \"_T\" are the corresponding \"truncated\" quantities ob-" << 
Endl;
 
 1852         Log() << kINFO << 
" tained when removing events deviating more than 2sigma from average.)" << 
Endl;
 
 1853         Log() << kINFO << hLine << 
Endl;
 
 1856         Log() << kINFO << hLine << 
Endl;
 
 1858         for (
Int_t i = 0; i < nmeth_used[0]; i++) {
 
 1865                          (
const char *)mname[0][i], biastest[0][i], biastestT[0][i], rmstest[0][i], rmstestT[0][i],
 
 1866                          minftest[0][i], minftestT[0][i])
 
 1869         Log() << kINFO << hLine << 
Endl;
 
 1870         Log() << kINFO << 
Endl;
 
 1871         Log() << kINFO << 
"Evaluation results ranked by smallest RMS on training sample:" << 
Endl;
 
 1872         Log() << kINFO << 
"(overtraining check)" << 
Endl;
 
 1873         Log() << kINFO << hLine << 
Endl;
 
 1875               << 
"DataSet Name:         MVA Method:        <Bias>   <Bias_T>    RMS    RMS_T  |  MutInf MutInf_T" 
 1877         Log() << kINFO << hLine << 
Endl;
 
 1879         for (
Int_t i = 0; i < nmeth_used[0]; i++) {
 
 1885                          (
const char *)mname[0][i], biastrain[0][i], biastrainT[0][i], rmstrain[0][i], rmstrainT[0][i],
 
 1886                          minftrain[0][i], minftrainT[0][i])
 
 1889         Log() << kINFO << hLine << 
Endl;
 
 1890         Log() << kINFO << 
Endl;
 
 1891      } 
else if (doMulticlass) {
 
 1897            "-------------------------------------------------------------------------------------------------------";
 
 1936         TString header1 = 
Form(
"%-15s%-15s%-15s%-15s%-15s%-15s", 
"Dataset", 
"MVA Method", 
"ROC AUC", 
"Sig eff@B=0.01",
 
 1937                                "Sig eff@B=0.10", 
"Sig eff@B=0.30");
 
 1938         TString header2 = 
Form(
"%-15s%-15s%-15s%-15s%-15s%-15s", 
"Name:", 
"/ Class:", 
"test  (train)", 
"test  (train)",
 
 1939                                "test  (train)", 
"test  (train)");
 
 1940         Log() << kINFO << 
Endl;
 
 1941         Log() << kINFO << 
"1-vs-rest performance metrics per class" << 
Endl;
 
 1942         Log() << kINFO << hLine << 
Endl;
 
 1943         Log() << kINFO << 
Endl;
 
 1944         Log() << kINFO << 
"Considers the listed class as signal and the other classes" << 
Endl;
 
 1945         Log() << kINFO << 
"as background, reporting the resulting binary performance." << 
Endl;
 
 1946         Log() << kINFO << 
"A score of 0.820 (0.850) means 0.820 was acheived on the" << 
Endl;
 
 1947         Log() << kINFO << 
"test set and 0.850 on the training set." << 
Endl;
 
 1949         Log() << kINFO << 
Endl;
 
 1950         Log() << kINFO << header1 << 
Endl;
 
 1951         Log() << kINFO << header2 << 
Endl;
 
 1952         for (
Int_t k = 0; k < 2; k++) {
 
 1953            for (
Int_t i = 0; i < nmeth_used[k]; i++) {
 
 1955                  mname[k][i].ReplaceAll(
"Variable_", 
"");
 
 1958               const TString datasetName = itrMap->first;
 
 1959               const TString mvaName = mname[k][i];
 
 1962               if (theMethod == 0) {
 
 1966               Log() << kINFO << 
Endl;
 
 1968               Log() << kINFO << row << 
Endl;
 
 1969               Log() << kINFO << 
"------------------------------" << 
Endl;
 
 1972               for (
UInt_t iClass = 0; iClass < numClasses; ++iClass) {
 
 1986                  const TString rocaucCmp = 
Form(
"%5.3f (%5.3f)", rocaucTest, rocaucTrain);
 
 1987                  const TString effB01Cmp = 
Form(
"%5.3f (%5.3f)", effB01Test, effB01Train);
 
 1988                  const TString effB10Cmp = 
Form(
"%5.3f (%5.3f)", effB10Test, effB10Train);
 
 1989                  const TString effB30Cmp = 
Form(
"%5.3f (%5.3f)", effB30Test, effB30Train);
 
 1990                  row = 
Form(
"%-15s%-15s%-15s%-15s%-15s%-15s", 
"", className.
Data(), rocaucCmp.
Data(), effB01Cmp.
Data(),
 
 1991                             effB10Cmp.
Data(), effB30Cmp.
Data());
 
 1992                  Log() << kINFO << row << 
Endl;
 
 1994                  delete rocCurveTrain;
 
 1995                  delete rocCurveTest;
 
 1999         Log() << kINFO << 
Endl;
 
 2000         Log() << kINFO << hLine << 
Endl;
 
 2001         Log() << kINFO << 
Endl;
 
 2015            for (
UInt_t iCol = 0; iCol < numClasses; ++iCol) {
 
 2016               header += 
Form(
" %-14s", classnames[iCol].Data());
 
 2017               headerInfo += 
Form(
" %-14s", 
" test (train)");
 
 2019            stream << kINFO << header << 
Endl;
 
 2020            stream << kINFO << headerInfo << 
Endl;
 
 2022            for (
UInt_t iRow = 0; iRow < numClasses; ++iRow) {
 
 2023               stream << kINFO << 
Form(
" %-14s", classnames[iRow].Data());
 
 2025               for (
UInt_t iCol = 0; iCol < numClasses; ++iCol) {
 
 2027                     stream << kINFO << 
Form(
" %-14s", 
"-");
 
 2029                     Double_t trainValue = matTraining[iRow][iCol];
 
 2030                     Double_t testValue = matTesting[iRow][iCol];
 
 2031                     TString entry = 
Form(
"%-5.3f (%-5.3f)", testValue, trainValue);
 
 2032                     stream << kINFO << 
Form(
" %-14s", entry.
Data());
 
 2035               stream << kINFO << 
Endl;
 
 2039         Log() << kINFO << 
Endl;
 
 2040         Log() << kINFO << 
"Confusion matrices for all methods" << 
Endl;
 
 2041         Log() << kINFO << hLine << 
Endl;
 
 2042         Log() << kINFO << 
Endl;
 
 2043         Log() << kINFO << 
"Does a binary comparison between the two classes given by a " << 
Endl;
 
 2044         Log() << kINFO << 
"particular row-column combination. In each case, the class " << 
Endl;
 
 2045         Log() << kINFO << 
"given by the row is considered signal while the class given " << 
Endl;
 
 2046         Log() << kINFO << 
"by the column index is considered background." << 
Endl;
 
 2047         Log() << kINFO << 
Endl;
 
 2048         for (
UInt_t iMethod = 0; iMethod < methods->size(); ++iMethod) {
 
 2050            if (theMethod == 
nullptr) {
 
 2055            std::vector<TString> classnames;
 
 2056            for (
UInt_t iCls = 0; iCls < numClasses; ++iCls) {
 
 2060                  << 
"=== Showing confusion matrix for method : " << 
Form(
"%-15s", (
const char *)mname[0][iMethod])
 
 2062            Log() << kINFO << 
"(Signal Efficiency for Background Efficiency 0.01%)" << 
Endl;
 
 2063            Log() << kINFO << 
"---------------------------------------------------" << 
Endl;
 
 2064            printMatrix(multiclass_testConfusionEffB01[iMethod], multiclass_trainConfusionEffB01[iMethod], classnames,
 
 2066            Log() << kINFO << 
Endl;
 
 2068            Log() << kINFO << 
"(Signal Efficiency for Background Efficiency 0.10%)" << 
Endl;
 
 2069            Log() << kINFO << 
"---------------------------------------------------" << 
Endl;
 
 2070            printMatrix(multiclass_testConfusionEffB10[iMethod], multiclass_trainConfusionEffB10[iMethod], classnames,
 
 2072            Log() << kINFO << 
Endl;
 
 2074            Log() << kINFO << 
"(Signal Efficiency for Background Efficiency 0.30%)" << 
Endl;
 
 2075            Log() << kINFO << 
"---------------------------------------------------" << 
Endl;
 
 2076            printMatrix(multiclass_testConfusionEffB30[iMethod], multiclass_trainConfusionEffB30[iMethod], classnames,
 
 2078            Log() << kINFO << 
Endl;
 
 2080         Log() << kINFO << hLine << 
Endl;
 
 2081         Log() << kINFO << 
Endl;
 
 2086            Log().EnableOutput();
 
 2089            TString hLine = 
"------------------------------------------------------------------------------------------" 
 2090                            "-------------------------";
 
 2091            Log() << kINFO << 
"Evaluation results ranked by best signal efficiency and purity (area)" << 
Endl;
 
 2092            Log() << kINFO << hLine << 
Endl;
 
 2093            Log() << kINFO << 
"DataSet       MVA                       " << 
Endl;
 
 2094            Log() << kINFO << 
"Name:         Method:          ROC-integ" << 
Endl;
 
 2099            Log() << kDEBUG << hLine << 
Endl;
 
 2100            for (
Int_t k = 0; k < 2; k++) {
 
 2101               if (k == 1 && nmeth_used[k] > 0) {
 
 2102                  Log() << kINFO << hLine << 
Endl;
 
 2103                  Log() << kINFO << 
"Input Variables: " << 
Endl << hLine << 
Endl;
 
 2105               for (
Int_t i = 0; i < nmeth_used[k]; i++) {
 
 2106                  TString datasetName = itrMap->first;
 
 2107                  TString methodName = mname[k][i];
 
 2114                  if (theMethod == 0) {
 
 2120                  std::vector<Bool_t> *mvaResType =
 
 2124                  if (mvaResType->size() != 0) {
 
 2125                     rocIntegral = GetROCIntegral(datasetName, methodName);
 
 2128                  if (sep[k][i] < 0 || sig[k][i] < 0) {
 
 2130                     Log() << kINFO << 
Form(
"%-13s %-15s: %#1.3f", datasetName.
Data(), methodName.
Data(), effArea[k][i])
 
 2142                     Log() << kINFO << 
Form(
"%-13s %-15s: %#1.3f", datasetName.
Data(), methodName.
Data(), rocIntegral)
 
 2156            Log() << kINFO << hLine << 
Endl;
 
 2157            Log() << kINFO << 
Endl;
 
 2158            Log() << kINFO << 
"Testing efficiency compared to training efficiency (overtraining check)" << 
Endl;
 
 2159            Log() << kINFO << hLine << 
Endl;
 
 2161                  << 
"DataSet              MVA              Signal efficiency: from test sample (from training sample) " 
 2163            Log() << kINFO << 
"Name:                Method:          @B=0.01             @B=0.10            @B=0.30   " 
 2165            Log() << kINFO << hLine << 
Endl;
 
 2166            for (
Int_t k = 0; k < 2; k++) {
 
 2167               if (k == 1 && nmeth_used[k] > 0) {
 
 2168                  Log() << kINFO << hLine << 
Endl;
 
 2169                  Log() << kINFO << 
"Input Variables: " << 
Endl << hLine << 
Endl;
 
 2171               for (
Int_t i = 0; i < nmeth_used[k]; i++) {
 
 2173                     mname[k][i].ReplaceAll(
"Variable_", 
"");
 
 2179                        << 
Form(
"%-20s %-15s: %#1.3f (%#1.3f)       %#1.3f (%#1.3f)      %#1.3f (%#1.3f)",
 
 2181                                trainEff01[k][i], eff10[k][i], trainEff10[k][i], eff30[k][i], trainEff30[k][i])
 
 2185            Log() << kINFO << hLine << 
Endl;
 
 2186            Log() << kINFO << 
Endl;
 
 2188            if (
gTools().CheckForSilentOption(GetOptions()))
 
 2189               Log().InhibitOutput();
 
 2192      if (!IsSilentFile()) {
 
 2193         std::list<TString> datasets;
 
 2194         for (
Int_t k = 0; k < 2; k++) {
 
 2195            for (
Int_t i = 0; i < nmeth_used[k]; i++) {
 
 2201               if (std::find(datasets.begin(), datasets.end(), theMethod->
fDataSetInfo.
GetName()) == datasets.end()) {
 
 2218                                        const char *theOption)
 
 2220   fModelPersistence = 
kFALSE;
 
 2221   fSilentFile = 
kTRUE; 
 
 2225   if (vitype == VIType::kShort)
 
 2226      return EvaluateImportanceShort(loader, theMethod, methodTitle, theOption);
 
 2227   else if (vitype == VIType::kAll)
 
 2228      return EvaluateImportanceAll(loader, theMethod, methodTitle, theOption);
 
 2229   else if (vitype == VIType::kRandom) {
 
 2230      if ( nbits > 10 && nbits < 30) {
 
 2232         return EvaluateImportanceRandom(loader, 
static_cast<UInt_t>( pow(2, nbits) ), theMethod, methodTitle, theOption);
 
 2233      } 
else if (nbits < 10)  {
 
 2234         Log() << kERROR << 
"Error in Variable Importance: Random mode require more that 10 variables in the dataset." 
 2236      } 
else if (nbits > 30) {
 
 2237         Log() << kERROR << 
"Error in Variable Importance: Number of variables is too large for Random mode" 
 2247                                           const char *theOption)
 
 2258      Log() << kERROR << 
"Number of combinations is too large , is 2^" << nbits << 
Endl;
 
 2262      Log() << kWARNING << 
"Number of combinations is very large , is 2^" << nbits << 
Endl;
 
 2264   uint64_t range = 
static_cast<uint64_t
>(pow(2, nbits));
 
 2268   std::vector<Double_t> importances(nbits);
 
 2270   std::vector<Double_t> ROC(range);
 
 2272   for (
int i = 0; i < nbits; i++)
 
 2276   for (
x = 1; 
x < range; 
x++) {
 
 2278      std::bitset<VIBITS> xbitset(
x);
 
 2286      for (
int index = 0; index < nbits; index++) {
 
 2297      BookMethod(seedloader, theMethod, methodTitle, theOption);
 
 2302      EvaluateAllMethods();
 
 2305      ROC[
x] = GetROCIntegral(xbitset.to_string(), methodTitle);
 
 2313      this->DeleteAllMethods();
 
 2315      fMethodsMap.clear();
 
 2319   for (
x = 0; 
x < range; 
x++) {
 
 2321      for (uint32_t i = 0; i < 
VIBITS; ++i) {
 
 2322         if (
x & (uint64_t(1) << i)) {
 
 2324            std::bitset<VIBITS> ybitset(
y);
 
 2328            uint32_t ny = 
static_cast<uint32_t
>( log(
x - 
y) / 0.693147 ) ;
 
 2330               importances[ny] = SROC - 0.5;
 
 2336            importances[ny] += SROC - SSROC;
 
 2341   std::cout << 
"--- Variable Importance Results (All)" << std::endl;
 
 2342   return GetImportance(nbits, importances, varNames);
 
 2345static uint64_t 
sum(uint64_t i)
 
 2348   if (i > 62) 
return 0;
 
 2349   return static_cast<uint64_t
>( std::pow(2, i + 1)) - 1;
 
 2359                                             const char *theOption)
 
 2369      Log() << kERROR << 
"Number of combinations is too large , is 2^" << nbits << 
Endl;
 
 2372   long int range = 
sum(nbits);
 
 2375   std::vector<Double_t> importances(nbits);
 
 2376   for (
int i = 0; i < nbits; i++)
 
 2383   std::bitset<VIBITS> xbitset(
x);
 
 2385      Log() << kFATAL << 
"Error: need at least one variable."; 
 
 2391   for (
int index = 0; index < nbits; index++) {
 
 2400   BookMethod(seedloader, theMethod, methodTitle, theOption);
 
 2405   EvaluateAllMethods();
 
 2408   SROC = GetROCIntegral(xbitset.to_string(), methodTitle);
 
 2416   this->DeleteAllMethods();
 
 2417   fMethodsMap.clear();
 
 2421   for (uint32_t i = 0; i < 
VIBITS; ++i) {
 
 2423         y = 
x & ~(uint64_t(1) << i);
 
 2424         std::bitset<VIBITS> ybitset(
y);
 
 2428         uint32_t ny = 
static_cast<uint32_t
>(log(
x - 
y) / 0.693147);
 
 2430            importances[ny] = SROC - 0.5;
 
 2437         for (
int index = 0; index < nbits; index++) {
 
 2446         BookMethod(subseedloader, theMethod, methodTitle, theOption);
 
 2451         EvaluateAllMethods();
 
 2454         SSROC = GetROCIntegral(ybitset.to_string(), methodTitle);
 
 2455         importances[ny] += SROC - SSROC;
 
 2462         delete subseedloader;
 
 2463         this->DeleteAllMethods();
 
 2464         fMethodsMap.clear();
 
 2467   std::cout << 
"--- Variable Importance Results (Short)" << std::endl;
 
 2468   return GetImportance(nbits, importances, varNames);
 
 2474                                              TString methodTitle, 
const char *theOption)
 
 2485   long int range = pow(2, nbits);
 
 2488   std::vector<Double_t> importances(nbits);
 
 2489   for (
int i = 0; i < nbits; i++)
 
 2496      std::bitset<32> xbitset(
x);
 
 2504      for (
int index = 0; index < nbits; index++) {
 
 2513      BookMethod(seedloader, theMethod, methodTitle, theOption);
 
 2518      EvaluateAllMethods();
 
 2521      SROC = GetROCIntegral(xbitset.to_string(), methodTitle);
 
 2530      this->DeleteAllMethods();
 
 2531      fMethodsMap.clear();
 
 2535      for (uint32_t i = 0; i < 32; ++i) {
 
 2536         if (
x & (uint64_t(1) << i)) {
 
 2538            std::bitset<32> ybitset(
y);
 
 2544               importances[ny] = SROC - 0.5;
 
 2552            for (
int index = 0; index < nbits; index++) {
 
 2561            BookMethod(subseedloader, theMethod, methodTitle, theOption);
 
 2566            EvaluateAllMethods();
 
 2569            SSROC = GetROCIntegral(ybitset.to_string(), methodTitle);
 
 2570            importances[ny] += SROC - SSROC;
 
 2575               dynamic_cast<TMVA::MethodBase *
>(fMethodsMap[ybitset.to_string().c_str()][0][0]);
 
 2579            delete subseedloader;
 
 2580            this->DeleteAllMethods();
 
 2581            fMethodsMap.clear();
 
 2585   std::cout << 
"--- Variable Importance Results (Random)" << std::endl;
 
 2586   return GetImportance(nbits, importances, varNames);
 
 2593   TH1F *vih1 = 
new TH1F(
"vih1", 
"", nbits, 0, nbits);
 
 2598   for (
int i = 0; i < nbits; i++) {
 
 2599      normalization = normalization + importances[i];
 
 2607   std::vector<Double_t> x_ie(nbits), y_ie(nbits);
 
 2608   for (
Int_t i = 1; i < nbits + 1; i++) {
 
 2609      x_ie[i - 1] = (i - 1) * 1.;
 
 2610      roc = 100.0 * importances[i - 1] / normalization;
 
 2612      std::cout << 
"--- " << varNames[i - 1] << 
" = " << roc << 
" %" << std::endl;
 
 2616   TGraph *g_ie = 
new TGraph(nbits + 2, &x_ie[0], &y_ie[0]);
 
#define MinNoTrainingEvents
 
void printMatrix(const TMatrixD &mat)
write a matrix
 
TMatrixT< Double_t > TMatrixD
 
char * Form(const char *fmt,...)
 
R__EXTERN TStyle * gStyle
 
R__EXTERN TSystem * gSystem
 
virtual void SetTitleOffset(Float_t offset=1)
Set distance between the axis and the axis title.
 
virtual void SetTitleSize(Float_t size=0.04)
Set size of axis title.
 
virtual void SetFillColor(Color_t fcolor)
Set the fill area color.
 
virtual void SetBinLabel(Int_t bin, const char *label)
Set label for bin.
 
void CenterTitle(Bool_t center=kTRUE)
Center axis title.
 
virtual void SetRangeUser(Double_t ufirst, Double_t ulast)
Set the viewing range for the axis from ufirst to ulast (in user coordinates, that is,...
 
static Int_t GetColor(const char *hexcolor)
Static method returning color number for color specified by hex color string of form: "#rrggbb",...
 
virtual Bool_t cd()
Change current directory to "this" directory.
 
A ROOT file is a suite of consecutive data records (TKey instances) with a well defined format.
 
A TGraph is an object made of two arrays X and Y with npoints each.
 
virtual void SetTitle(const char *title="")
Change (i.e.
 
1-D histogram with a float per channel (see TH1 documentation)}
 
virtual void SetDirectory(TDirectory *dir)
By default, when a histogram is created, it is added to the list of histogram objects in the current ...
 
virtual void SetTitle(const char *title)
See GetStatOverflows for more information.
 
virtual void LabelsOption(Option_t *option="h", Option_t *axis="X")
Sort bins with labels or set option(s) to draw axis with labels.
 
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 void SetBinContent(Int_t bin, Double_t content)
Set bin content see convention for numbering bins in TH1::GetBin In case the bin number is greater th...
 
virtual void SetBarWidth(Float_t width=0.5)
Set the width of bars as fraction of the bin width for drawing mode "B".
 
Service class for 2-D histogram classes.
 
IMethod * Create(const std::string &name, const TString &job, const TString &title, DataSetInfo &dsi, const TString &option)
creates the method if needed based on the method name using the creator function the factory has stor...
 
static ClassifierFactory & Instance()
access to the ClassifierFactory singleton creates the instance if needed
 
TString fWeightFileDirPrefix
 
void SetDrawProgressBar(Bool_t d)
 
void SetUseColor(Bool_t uc)
 
class TMVA::Config::VariablePlotting fVariablePlotting
 
void SetConfigDescription(const char *d)
 
OptionBase * DeclareOptionRef(T &ref, const TString &name, const TString &desc="")
 
void AddPreDefVal(const T &)
 
void SetConfigName(const char *n)
 
virtual void ParseOptions()
options parser
 
const TString & GetOptions() const
 
void CheckForUnusedOptions() const
checks for unused options in option string
 
void PrepareTrainingAndTestTree(const TCut &cut, const TString &splitOpt)
prepare the training and test trees -> same cuts for signal and background
 
DataSetInfo & GetDataSetInfo()
 
void AddVariable(const TString &expression, const TString &title, const TString &unit, char type='F', Double_t min=0, Double_t max=0)
user inserts discriminating variable in data set info
 
Class that contains all the data information.
 
UInt_t GetNVariables() const
 
virtual const char * GetName() const
Returns name of object.
 
const TMatrixD * CorrelationMatrix(const TString &className) const
 
UInt_t GetNClasses() const
 
const TString & GetSplitOptions() const
 
UInt_t GetNTargets() const
 
DataSet * GetDataSet() const
returns data set
 
TH2 * CreateCorrelationMatrixHist(const TMatrixD *m, const TString &hName, const TString &hTitle) const
 
std::vector< TString > GetListOfVariables() const
returns list of variables
 
ClassInfo * GetClassInfo(Int_t clNum) const
 
const TCut & GetCut(Int_t i) const
 
VariableInfo & GetVariableInfo(Int_t i)
 
Bool_t IsSignal(const Event *ev) const
 
DataSetManager * GetDataSetManager()
 
DataInputHandler & DataInput()
 
Class that contains all the data information.
 
Long64_t GetNEvtSigTest()
return number of signal test events in dataset
 
TTree * GetTree(Types::ETreeType type)
create the test/trainings tree with all the variables, the weights, the classes, the targets,...
 
const Event * GetEvent() const
 
Long64_t GetNEvents(Types::ETreeType type=Types::kMaxTreeType) const
 
Results * GetResults(const TString &, Types::ETreeType type, Types::EAnalysisType analysistype)
 
Long64_t GetNTrainingEvents() const
 
void SetCurrentType(Types::ETreeType type) const
 
const std::vector< Event * > & GetEventCollection(Types::ETreeType type=Types::kMaxTreeType) const
 
Long64_t GetNEvtBkgdTest()
return number of background test events in dataset
 
Float_t GetValue(UInt_t ivar) const
return value of i'th variable
 
static void SetIsTraining(Bool_t)
when this static function is called, it sets the flag whether events with negative event weight shoul...
 
This is the main MVA steering class.
 
void PrintHelpMessage(const TString &datasetname, const TString &methodTitle="") const
Print predefined help message of classifier.
 
Bool_t fCorrelations
verbosity level, controls granularity of logging
 
std::vector< IMethod * > MVector
 
void TrainAllMethods()
Iterates through all booked methods and calls training.
 
Bool_t Verbose(void) const
 
void WriteDataInformation(DataSetInfo &fDataSetInfo)
 
MethodBase * BookMethod(DataLoader *loader, TString theMethodName, TString methodTitle, TString theOption="")
Book a classifier or regression method.
 
Factory(TString theJobName, TFile *theTargetFile, TString theOption="")
Standard constructor.
 
void TestAllMethods()
Evaluates all booked methods on the testing data and adds the output to the Results in the corresponi...
 
Bool_t fVerbose
list of transformations to test
 
void EvaluateAllMethods(void)
Iterates over all MVAs that have been booked, and calls their evaluation methods.
 
TH1F * EvaluateImportanceRandom(DataLoader *loader, UInt_t nseeds, Types::EMVA theMethod, TString methodTitle, const char *theOption="")
 
TH1F * GetImportance(const int nbits, std::vector< Double_t > importances, std::vector< TString > varNames)
 
Bool_t fROC
enable to calculate corelations
 
void EvaluateAllVariables(DataLoader *loader, TString options="")
Iterates over all MVA input variables and evaluates them.
 
TString fVerboseLevel
verbose mode
 
TMultiGraph * GetROCCurveAsMultiGraph(DataLoader *loader, UInt_t iClass, Types::ETreeType type=Types::kTesting)
Generate a collection of graphs, for all methods for a given class.
 
TH1F * EvaluateImportance(DataLoader *loader, VIType vitype, Types::EMVA theMethod, TString methodTitle, const char *theOption="")
Evaluate Variable Importance.
 
Double_t GetROCIntegral(DataLoader *loader, TString theMethodName, UInt_t iClass=0, Types::ETreeType type=Types::kTesting)
Calculate the integral of the ROC curve, also known as the area under curve (AUC),...
 
virtual ~Factory()
Destructor.
 
virtual void MakeClass(const TString &datasetname, const TString &methodTitle="") const
 
MethodBase * BookMethodWeightfile(DataLoader *dataloader, TMVA::Types::EMVA methodType, const TString &weightfile)
Adds an already constructed method to be managed by this factory.
 
Bool_t fModelPersistence
the training type
 
std::map< TString, Double_t > OptimizeAllMethods(TString fomType="ROCIntegral", TString fitType="FitGA")
Iterates through all booked methods and sees if they use parameter tuning and if so does just that,...
 
ROCCurve * GetROC(DataLoader *loader, TString theMethodName, UInt_t iClass=0, Types::ETreeType type=Types::kTesting)
Private method to generate a ROCCurve instance for a given method.
 
TH1F * EvaluateImportanceShort(DataLoader *loader, Types::EMVA theMethod, TString methodTitle, const char *theOption="")
 
Types::EAnalysisType fAnalysisType
jobname, used as extension in weight file names
 
Bool_t HasMethod(const TString &datasetname, const TString &title) const
Checks whether a given method name is defined for a given dataset.
 
TGraph * GetROCCurve(DataLoader *loader, TString theMethodName, Bool_t setTitles=kTRUE, UInt_t iClass=0, Types::ETreeType type=Types::kTesting)
Argument iClass specifies the class to generate the ROC curve in a multiclass setting.
 
TH1F * EvaluateImportanceAll(DataLoader *loader, Types::EMVA theMethod, TString methodTitle, const char *theOption="")
 
void SetVerbose(Bool_t v=kTRUE)
 
IMethod * GetMethod(const TString &datasetname, const TString &title) const
Returns pointer to MVA that corresponds to given method title.
 
void DeleteAllMethods(void)
Delete methods.
 
TString fTransformations
option string given by construction (presently only "V")
 
void Greetings()
Print welcome message.
 
Interface for all concrete MVA method implementations.
 
virtual void PrintHelpMessage() const =0
 
virtual Bool_t HasAnalysisType(Types::EAnalysisType type, UInt_t numberClasses, UInt_t numberTargets)=0
 
virtual void MakeClass(const TString &classFileName=TString("")) const =0
 
Virtual base Class for all MVA method.
 
virtual Double_t GetSeparation(TH1 *, TH1 *) const
compute "separation" defined as
 
void SetSilentFile(Bool_t status)
 
void SetWeightFileDir(TString fileDir)
set directory of weight file
 
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...
 
TString GetMethodTypeName() const
 
Bool_t DoMulticlass() const
 
virtual Double_t GetSignificance() const
compute significance of mean difference
 
const char * GetName() const
 
Types::EAnalysisType GetAnalysisType() 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
 
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 Double_t GetEfficiency(const TString &, Types::ETreeType, Double_t &err)
fill background efficiency (resp.
 
virtual void SetAnalysisType(Types::EAnalysisType type)
 
const TString & GetMethodName() const
 
Bool_t DoRegression() const
 
void ProcessSetup()
process all options the "CheckForUnusedOptions" is done in an independent call, since it may be overr...
 
virtual Double_t GetTrainingEfficiency(const TString &)
 
DataSetInfo & DataInfo() const
 
virtual void MakeClass(const TString &classFileName=TString("")) const
create reader class for method (classification only at present)
 
virtual void TestClassification()
initialization
 
void AddOutput(Types::ETreeType type, Types::EAnalysisType analysisType)
 
void ReadStateFromFile()
Function to write options and weights to file.
 
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.
 
DataSetInfo & fDataSetInfo
 
Types::EMVA GetMethodType() const
 
void SetFile(TFile *file)
 
void SetModelPersistence(Bool_t status)
 
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 CheckSetup()
check may be overridden by derived class (sometimes, eg, fitters are used which can only be implement...
 
Class for boosting a TMVA method.
 
void SetBoostedMethodName(TString methodName)
 
DataSetManager * fDataSetManager
 
Class for categorizing the phase space.
 
DataSetManager * fDataSetManager
 
ostringstream derivative to redirect and format output
 
void SetMinType(EMsgType minType)
 
void SetSource(const std::string &source)
 
static void InhibitOutput()
 
Double_t GetEffSForEffB(Double_t effB, const UInt_t num_points=41)
Calculate the signal efficiency (sensitivity) for a given background efficiency (sensitivity).
 
Double_t GetROCIntegral(const UInt_t points=41)
Calculates the ROC integral (AUC)
 
TGraph * GetROCCurve(const UInt_t points=100)
Returns a new TGraph containing the ROC curve.
 
Ranking for variables in method (implementation)
 
virtual void Print() const
get maximum length of variable names
 
Class that is the base-class for a vector of result.
 
Class which takes the results of a multiclass classification.
 
Class that is the base-class for a vector of result.
 
Singleton class for Global types used by TMVA.
 
static Types & Instance()
the the single instance of "Types" if existing already, or create it (Singleton)
 
const TString & GetLabel() const
 
A TMultiGraph is a collection of TGraph (or derived) objects.
 
TList * GetListOfGraphs() const
 
virtual void Add(TGraph *graph, Option_t *chopt="")
Add a new graph to the list of graphs.
 
TH1F * GetHistogram()
Returns a pointer to the histogram used to draw the axis.
 
virtual void Draw(Option_t *chopt="")
Draw this multigraph with its current attributes.
 
TAxis * GetYaxis()
Get y axis of the graph.
 
TAxis * GetXaxis()
Get x axis of the graph.
 
virtual void SetTitle(const char *title="")
Set the title of the TNamed.
 
virtual TObject * Clone(const char *newname="") const
Make a clone of an object using the Streamer facility.
 
virtual const char * GetName() const
Returns name of object.
 
virtual Int_t Write(const char *name=0, Int_t option=0, Int_t bufsize=0)
Write this object to the current directory.
 
@ kOverwrite
overwrite existing object with same name
 
void SetGrid(Int_t valuex=1, Int_t valuey=1) override
 
TLegend * BuildLegend(Double_t x1=0.3, Double_t y1=0.21, Double_t x2=0.3, Double_t y2=0.21, const char *title="", Option_t *option="") override
Build a legend from the graphical objects in the pad.
 
Principal Components Analysis (PCA)
 
virtual void AddRow(const Double_t *x)
Add a data point and update the covariance matrix.
 
const TMatrixD * GetCovarianceMatrix() const
 
virtual void MakePrincipals()
Perform the principal components analysis.
 
Random number generator class based on M.
 
virtual UInt_t Integer(UInt_t imax)
Returns a random integer uniformly distributed on the interval [ 0, imax-1 ].
 
void ToLower()
Change string to lower-case.
 
int CompareTo(const char *cs, ECaseCompare cmp=kExact) const
Compare a string to char *cs2.
 
const char * Data() const
 
TString & ReplaceAll(const TString &s1, const TString &s2)
 
Bool_t BeginsWith(const char *s, ECaseCompare cmp=kExact) const
 
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
 
void SetOptStat(Int_t stat=1)
The type of information printed in the histogram statistics box can be selected via the parameter mod...
 
void SetTitleXOffset(Float_t offset=1)
 
virtual int MakeDirectory(const char *name)
Make a directory.
 
virtual Int_t Write(const char *name=0, Int_t option=0, Int_t bufsize=0)
Write this object to the current directory.
 
void DataLoaderCopy(TMVA::DataLoader *des, TMVA::DataLoader *src)
 
void CreateVariableTransforms(const TString &trafoDefinition, TMVA::DataSetInfo &dataInfo, TMVA::TransformationHandler &transformationHandler, TMVA::MsgLogger &log)
 
MsgLogger & Endl(MsgLogger &ml)
 
static uint64_t sum(uint64_t i)
 
const Int_t MinNoTrainingEvents