#include "TMVA/TMVAGui.h"
#include "TMVA/Types.h"
#include <iostream>
#include <vector>

#include "TList.h"
#include "TROOT.h"
#include "TKey.h"
#include "TString.h"
#include "TControlBar.h"
#include "TObjString.h"
#include "TClass.h"



// some global lists
static TList*               TMVAGui_keyContent;
static std::vector<TString> TMVAGui_inactiveButtons;

TList* TMVA::GetKeyList( const TString& pattern )
{
   TList* list = new TList();

   TIter next( TMVAGui_keyContent );
   TKey* key(0);
   while ((key = (TKey*)next())) {         
      if (TString(key->GetName()).Contains( pattern )) { list->Add( new TObjString( key->GetName() ) ); }
   }
   return list;
}

// utility function
void TMVA::ActionButton( TControlBar* cbar, 
                   const TString& title, const TString& macro, const TString& comment, 
                   const TString& buttonType, TString requiredKey ) 
{
   cbar->AddButton( title, macro, comment, buttonType );

   // search    
   if (requiredKey != "") {
      Bool_t found = kFALSE;
      TIter next( TMVAGui_keyContent );
      TKey* key(0);
      while ((key = (TKey*)next())) {         
         if (TString(key->GetName()).Contains( requiredKey )) { found = kTRUE; break; }
      }
      if (!found) TMVAGui_inactiveButtons.push_back( title );
   }
}

// main GUI
void TMVA::TMVAGui( const char* fName  ) 
{   
   // Use this script in order to run the various individual macros
   // that plot the output of TMVA (e.g. running TMVAClassification.C),
   // stored in the file "TMVA.root"

   TString curMacroPath(gROOT->GetMacroPath());
   // uncomment next line for macros submitted to next root version
   gROOT->SetMacroPath(curMacroPath+":./:$ROOTSYS/tmva/test/:");
   
   // for the sourceforge version, including $ROOTSYS/tmva/test in the
   // macro path is a mistake, especially if "./" was not part of path
   // add ../macros to the path (comment out next line for the ROOT version of TMVA)
   // gROOT->SetMacroPath(curMacroPath+":../macros:");

   TString curIncludePath=gSystem->GetIncludePath();
   TString newIncludePath=TString("-I../ ")+curIncludePath;
   gSystem->SetIncludePath(newIncludePath);
  
   cout << "--- Launch TMVA GUI to view input file: " << fName << endl;

   // init
   TMVAGui_inactiveButtons.clear();

   // check if file exist
   TFile* file = TFile::Open( fName );
   if (!file) {
      cout << "==> Abort TMVAGui, please verify filename" << endl;
      return;
   }
   // find all references   
   TMVAGui_keyContent = (TList*)file->GetListOfKeys()->Clone();

   // close file
   file->Close();

   TString defaultRequiredClassifier = "";

   //   gROOT->Reset();
   //   gStyle->SetScreenFactor(2); // if you have a large screen, select 1,2 or 1.4

   // create the control bar
   TControlBar* cbar = new TControlBar( "vertical", "TMVA Plotting Macros for Classification", 0, 0 );

   const TString buttonType( "button" );

   // configure buttons   
   Int_t ic = 1;

   // find all input variables types
   TList* keylist = GetKeyList( "InputVariables" );
   TListIter it( keylist );
   TObjString* str = 0;
   char ch = 'a';
   while ((str = (TObjString*)it())) {
      TString tmp   = str->GetString();
      TString title = Form( "Input variables '%s'-transformed (training sample)", 
                            tmp.ReplaceAll("InputVariables_","").Data() );
      if (tmp.Contains( "Id" )) title = "Input variables (training sample)";
      ActionButton( cbar, 
                    Form( "(%i%c) %s", ic, ch++, title.Data() ),
                    Form( "TMVA::variables(\"%s\",\"%s\",\"%s\")", fName, str->GetString().Data(), title.Data() ),
                    Form( "Plots all '%s'-transformed input variables (macro variables(...))", str->GetString().Data() ),
                    buttonType, str->GetString() );
   }      
   ic++;

   // correlation scatter plots 
   it.Reset(); ch = 'a';
   while ((str = (TObjString*)it())) {
      TString tmp   = str->GetString();
      TString title = Form( "Input variable correlations '%s'-transformed (scatter profiles)", 
                            tmp.ReplaceAll("InputVariables_","").Data() );
      if (tmp.Contains( "Id" )) title = "Input variable correlations (scatter profiles)";
      ActionButton( cbar, 
                    Form( "(%i%c) %s", ic, ch++, title.Data() ),
                    Form( "TMVA::CorrGui(\"%s\",\"%s\",\"%s\")", fName, str->GetString().Data(), title.Data() ),
                    Form( "Plots all correlation profiles between '%s'-transformed input variables (macro CorrGui(...))", 
                          str->GetString().Data() ),
                    buttonType, str->GetString() );
   }      
  
   TString title;
   // coefficients
   title =Form( "(%i) Input Variable Linear Correlation Coefficients", ++ic );
   ActionButton( cbar,  
                 title,
                 Form( "TMVA::correlations(\"%s\")", fName ),
                 "Plots signal and background correlation summaries for all input variables (macro correlations.C)", 
                 buttonType );

   title =Form( "(%ia) Classifier Output Distributions (test sample)", ++ic );
   ActionButton( cbar,  
                 title,
                 Form( "TMVA::mvas(\"%s\",  TMVA::kMVAType)", fName ),
                 "Plots the output of each classifier for the test data (macro mvas(...,0))",
                 buttonType, defaultRequiredClassifier );

   title =Form( "(%ib) Classifier Output Distributions (test and training samples superimposed)", ic );
   ActionButton( cbar,  
                 title,
                 Form( "TMVA::mvas(\"%s\",  TMVA::kCompareType )", fName),
                 "Plots the output of each classifier for the test (histograms) and training (dots) data (macro mvas(...,3))",
                 buttonType, defaultRequiredClassifier );

   title = Form( "(%ic) Classifier Probability Distributions (test sample)", ic );
   ActionButton( cbar,  
                 title,
                 Form( "TMVA::mvas(\"%s\", TMVA::kProbaType)", fName ),
                 "Plots the probability of each classifier for the test data (macro mvas(...,1))",
                 buttonType, defaultRequiredClassifier );

   title =Form( "(%id) Classifier Rarity Distributions (test sample)", ic );
   ActionButton( cbar,  
                 title,
                 Form( "TMVA::mvas(\"%s\", TMVA::kRarityType)", fName ),
                 "Plots the Rarity of each classifier for the test data (macro mvas(...,2)) - background distribution should be uniform",
                 buttonType, defaultRequiredClassifier );

   title =Form( "(%ia) Classifier Cut Efficiencies", ++ic );
   ActionButton( cbar,  
                 title,
                 Form( "TMVA::mvaeffs(\"%s\")", fName ),
                 "Plots signal and background efficiencies versus cut on classifier output (macro mvaeffs.cxx)",
                 buttonType, defaultRequiredClassifier );

   title = Form( "(%ib) Classifier Background Rejection vs Signal Efficiency (ROC curve)", ic );
   ActionButton( cbar,  
                 title,
                 Form( "TMVA::efficiencies(\"%s\")", fName ),
                 "Plots background rejection vs signal efficiencies (macro efficiencies.cxx) [\"ROC\" stands for \"Receiver Operation Characteristics\"]",
                 buttonType, defaultRequiredClassifier );

   title = Form( "(%ib) Classifier 1/(Backgr. Efficiency) vs Signal Efficiency (ROC curve)", ic );
   ActionButton( cbar,  
                 title,
                 Form( "TMVA::efficiencies(\"%s\",%d)", fName, 3 ),
                 "Plots 1/(background eff.)  vs signal efficiencies (macro efficiencies.cxx) [\"ROC\" stands for \"Receiver Operation Characteristics\"]",
                 buttonType, defaultRequiredClassifier );

   title = Form( "(%i) Parallel Coordinates (requires ROOT-version >= 5.17)", ++ic );
   ActionButton( cbar,  
                 title,
                 Form( "TMVA::paracoor(\"%s\")", fName ),
                 "Plots parallel coordinates for classifiers and input variables (macro paracoor.cxx, requires ROOT >= 5.17)",
                 buttonType, defaultRequiredClassifier );

   // parallel coordinates only exist since ROOT 5.17
   #if ROOT_VERSION_CODE < ROOT_VERSION(5,17,0)
   TMVAGui_inactiveButtons.push_back( title );
   #endif

   title =Form( "(%i) PDFs of Classifiers (requires \"CreateMVAPdfs\" option set)", ++ic );
   ActionButton( cbar,  
                 title,
                 Form( "TMVA::probas(\"%s\")", fName ),
                 "Plots the PDFs of the classifier output distributions for signal and background - if requested (macro probas.cxx)",
                 buttonType, defaultRequiredClassifier );

   title = Form( "(%i) Likelihood Reference Distributiuons", ++ic);
   ActionButton( cbar,  
                 title,
                 Form( "TMVA::likelihoodrefs(\"%s\")", fName ), 
                 "Plots to verify the likelihood reference distributions (macro likelihoodrefs.cxx)",
                 buttonType, "Likelihood" );

   title = Form( "(%ia) Network Architecture (MLP)", ++ic );
   TString call = Form( "TMVA::network(\"%s\")", fName );
   ActionButton( cbar,  
                 title,
                 call, 
                 "Plots the MLP weights (macro network.cxx)",
                 buttonType, "MLP" );

   title = Form( "(%ib) Network Convergence Test (MLP)", ic );
   ActionButton( cbar,  
                 title,
                 Form( "TMVA::annconvergencetest(\"%s\")", fName ), 
                 "Plots error estimator versus training epoch for training and test samples (macro annconvergencetest.C)",
                 buttonType, "MLP" );

   title = Form( "(%i) Decision Trees (BDT)", ++ic );
   ActionButton( cbar,  
                 title,
                 Form( "TMVA::BDT(\"%s\")", fName ),
                 "Plots the Decision Trees trained by BDT algorithms (macro BDT(itree,...))",
                 buttonType, "BDT" );
   
   title = Form( "(%i) Decision Tree Control Plots (BDT)", ++ic );
   ActionButton( cbar,  
                 title,
                 Form( "TMVA::BDTControlPlots(\"%s\")", fName ),
                 "Plots to monitor boosting and pruning of decision trees (macro BDTControlPlots.cxx)",
                 buttonType, "BDT" );
   //    ActionButton( cbar,  
   //                  Form( "(%i) Rule Ensemble Importance Plots (RuleFit)", ++ic ),
   //                  Form( "TMVA::rulevis(\"%s\",0)", fName ),
   //                  "Plots all input variables with rule ensemble weights, including linear terms (macro rulevis.cxx)",
   //                  buttonType, "RuleFit" );

   title = Form( "(%i) Plot Foams (PDEFoam)", ++ic );
   ActionButton( cbar,  
                 title,
                 Form("TMVA::PlotFoams(\"weights/TMVAClassification_PDEFoam.weights_foams.root\")"),
                 "Plot Foams (macro PlotFoams.cxx)",
                 buttonType, "PDEFoam" );

   title = Form( "(%i) General Boost Control Plots", ++ic );
   ActionButton( cbar,  
                 title,
                 Form( "TMVA::BoostControlPlots(\"%s\")", fName ),
                 "Plots to monitor boosting of general classifiers (macro BoostControlPlots)",
                 buttonType, "Boost" );

   cbar->AddSeparator();

   cbar->AddButton( Form( "(%i) Quit", ++ic ),   ".q", "Quit", buttonType );

   // set the style 
   cbar->SetTextColor("black");

   // there seems to be a bug in ROOT: font jumps back to default after pressing on >2 different buttons
   // cbar->SetFont("-adobe-helvetica-bold-r-*-*-12-*-*-*-*-*-iso8859-1");
   
   // draw
   cbar->Show();

   // indicate inactive buttons
   for (UInt_t i=0; i<TMVAGui_inactiveButtons.size(); i++) cbar->SetButtonState(TMVAGui_inactiveButtons[i], 3 );
   if (TMVAGui_inactiveButtons.size() > 0) {
      cout << "=== Note: inactive buttons indicate classifiers that were not trained, ===" << endl;
      cout << "===       or functionalities that were not invoked during the training ===" << endl;
   }

   gROOT->SaveContext();
}
 TMVAGui.cxx:1
 TMVAGui.cxx:2
 TMVAGui.cxx:3
 TMVAGui.cxx:4
 TMVAGui.cxx:5
 TMVAGui.cxx:6
 TMVAGui.cxx:7
 TMVAGui.cxx:8
 TMVAGui.cxx:9
 TMVAGui.cxx:10
 TMVAGui.cxx:11
 TMVAGui.cxx:12
 TMVAGui.cxx:13
 TMVAGui.cxx:14
 TMVAGui.cxx:15
 TMVAGui.cxx:16
 TMVAGui.cxx:17
 TMVAGui.cxx:18
 TMVAGui.cxx:19
 TMVAGui.cxx:20
 TMVAGui.cxx:21
 TMVAGui.cxx:22
 TMVAGui.cxx:23
 TMVAGui.cxx:24
 TMVAGui.cxx:25
 TMVAGui.cxx:26
 TMVAGui.cxx:27
 TMVAGui.cxx:28
 TMVAGui.cxx:29
 TMVAGui.cxx:30
 TMVAGui.cxx:31
 TMVAGui.cxx:32
 TMVAGui.cxx:33
 TMVAGui.cxx:34
 TMVAGui.cxx:35
 TMVAGui.cxx:36
 TMVAGui.cxx:37
 TMVAGui.cxx:38
 TMVAGui.cxx:39
 TMVAGui.cxx:40
 TMVAGui.cxx:41
 TMVAGui.cxx:42
 TMVAGui.cxx:43
 TMVAGui.cxx:44
 TMVAGui.cxx:45
 TMVAGui.cxx:46
 TMVAGui.cxx:47
 TMVAGui.cxx:48
 TMVAGui.cxx:49
 TMVAGui.cxx:50
 TMVAGui.cxx:51
 TMVAGui.cxx:52
 TMVAGui.cxx:53
 TMVAGui.cxx:54
 TMVAGui.cxx:55
 TMVAGui.cxx:56
 TMVAGui.cxx:57
 TMVAGui.cxx:58
 TMVAGui.cxx:59
 TMVAGui.cxx:60
 TMVAGui.cxx:61
 TMVAGui.cxx:62
 TMVAGui.cxx:63
 TMVAGui.cxx:64
 TMVAGui.cxx:65
 TMVAGui.cxx:66
 TMVAGui.cxx:67
 TMVAGui.cxx:68
 TMVAGui.cxx:69
 TMVAGui.cxx:70
 TMVAGui.cxx:71
 TMVAGui.cxx:72
 TMVAGui.cxx:73
 TMVAGui.cxx:74
 TMVAGui.cxx:75
 TMVAGui.cxx:76
 TMVAGui.cxx:77
 TMVAGui.cxx:78
 TMVAGui.cxx:79
 TMVAGui.cxx:80
 TMVAGui.cxx:81
 TMVAGui.cxx:82
 TMVAGui.cxx:83
 TMVAGui.cxx:84
 TMVAGui.cxx:85
 TMVAGui.cxx:86
 TMVAGui.cxx:87
 TMVAGui.cxx:88
 TMVAGui.cxx:89
 TMVAGui.cxx:90
 TMVAGui.cxx:91
 TMVAGui.cxx:92
 TMVAGui.cxx:93
 TMVAGui.cxx:94
 TMVAGui.cxx:95
 TMVAGui.cxx:96
 TMVAGui.cxx:97
 TMVAGui.cxx:98
 TMVAGui.cxx:99
 TMVAGui.cxx:100
 TMVAGui.cxx:101
 TMVAGui.cxx:102
 TMVAGui.cxx:103
 TMVAGui.cxx:104
 TMVAGui.cxx:105
 TMVAGui.cxx:106
 TMVAGui.cxx:107
 TMVAGui.cxx:108
 TMVAGui.cxx:109
 TMVAGui.cxx:110
 TMVAGui.cxx:111
 TMVAGui.cxx:112
 TMVAGui.cxx:113
 TMVAGui.cxx:114
 TMVAGui.cxx:115
 TMVAGui.cxx:116
 TMVAGui.cxx:117
 TMVAGui.cxx:118
 TMVAGui.cxx:119
 TMVAGui.cxx:120
 TMVAGui.cxx:121
 TMVAGui.cxx:122
 TMVAGui.cxx:123
 TMVAGui.cxx:124
 TMVAGui.cxx:125
 TMVAGui.cxx:126
 TMVAGui.cxx:127
 TMVAGui.cxx:128
 TMVAGui.cxx:129
 TMVAGui.cxx:130
 TMVAGui.cxx:131
 TMVAGui.cxx:132
 TMVAGui.cxx:133
 TMVAGui.cxx:134
 TMVAGui.cxx:135
 TMVAGui.cxx:136
 TMVAGui.cxx:137
 TMVAGui.cxx:138
 TMVAGui.cxx:139
 TMVAGui.cxx:140
 TMVAGui.cxx:141
 TMVAGui.cxx:142
 TMVAGui.cxx:143
 TMVAGui.cxx:144
 TMVAGui.cxx:145
 TMVAGui.cxx:146
 TMVAGui.cxx:147
 TMVAGui.cxx:148
 TMVAGui.cxx:149
 TMVAGui.cxx:150
 TMVAGui.cxx:151
 TMVAGui.cxx:152
 TMVAGui.cxx:153
 TMVAGui.cxx:154
 TMVAGui.cxx:155
 TMVAGui.cxx:156
 TMVAGui.cxx:157
 TMVAGui.cxx:158
 TMVAGui.cxx:159
 TMVAGui.cxx:160
 TMVAGui.cxx:161
 TMVAGui.cxx:162
 TMVAGui.cxx:163
 TMVAGui.cxx:164
 TMVAGui.cxx:165
 TMVAGui.cxx:166
 TMVAGui.cxx:167
 TMVAGui.cxx:168
 TMVAGui.cxx:169
 TMVAGui.cxx:170
 TMVAGui.cxx:171
 TMVAGui.cxx:172
 TMVAGui.cxx:173
 TMVAGui.cxx:174
 TMVAGui.cxx:175
 TMVAGui.cxx:176
 TMVAGui.cxx:177
 TMVAGui.cxx:178
 TMVAGui.cxx:179
 TMVAGui.cxx:180
 TMVAGui.cxx:181
 TMVAGui.cxx:182
 TMVAGui.cxx:183
 TMVAGui.cxx:184
 TMVAGui.cxx:185
 TMVAGui.cxx:186
 TMVAGui.cxx:187
 TMVAGui.cxx:188
 TMVAGui.cxx:189
 TMVAGui.cxx:190
 TMVAGui.cxx:191
 TMVAGui.cxx:192
 TMVAGui.cxx:193
 TMVAGui.cxx:194
 TMVAGui.cxx:195
 TMVAGui.cxx:196
 TMVAGui.cxx:197
 TMVAGui.cxx:198
 TMVAGui.cxx:199
 TMVAGui.cxx:200
 TMVAGui.cxx:201
 TMVAGui.cxx:202
 TMVAGui.cxx:203
 TMVAGui.cxx:204
 TMVAGui.cxx:205
 TMVAGui.cxx:206
 TMVAGui.cxx:207
 TMVAGui.cxx:208
 TMVAGui.cxx:209
 TMVAGui.cxx:210
 TMVAGui.cxx:211
 TMVAGui.cxx:212
 TMVAGui.cxx:213
 TMVAGui.cxx:214
 TMVAGui.cxx:215
 TMVAGui.cxx:216
 TMVAGui.cxx:217
 TMVAGui.cxx:218
 TMVAGui.cxx:219
 TMVAGui.cxx:220
 TMVAGui.cxx:221
 TMVAGui.cxx:222
 TMVAGui.cxx:223
 TMVAGui.cxx:224
 TMVAGui.cxx:225
 TMVAGui.cxx:226
 TMVAGui.cxx:227
 TMVAGui.cxx:228
 TMVAGui.cxx:229
 TMVAGui.cxx:230
 TMVAGui.cxx:231
 TMVAGui.cxx:232
 TMVAGui.cxx:233
 TMVAGui.cxx:234
 TMVAGui.cxx:235
 TMVAGui.cxx:236
 TMVAGui.cxx:237
 TMVAGui.cxx:238
 TMVAGui.cxx:239
 TMVAGui.cxx:240
 TMVAGui.cxx:241
 TMVAGui.cxx:242
 TMVAGui.cxx:243
 TMVAGui.cxx:244
 TMVAGui.cxx:245
 TMVAGui.cxx:246
 TMVAGui.cxx:247
 TMVAGui.cxx:248
 TMVAGui.cxx:249
 TMVAGui.cxx:250
 TMVAGui.cxx:251
 TMVAGui.cxx:252
 TMVAGui.cxx:253
 TMVAGui.cxx:254
 TMVAGui.cxx:255
 TMVAGui.cxx:256
 TMVAGui.cxx:257
 TMVAGui.cxx:258
 TMVAGui.cxx:259
 TMVAGui.cxx:260
 TMVAGui.cxx:261
 TMVAGui.cxx:262
 TMVAGui.cxx:263
 TMVAGui.cxx:264
 TMVAGui.cxx:265
 TMVAGui.cxx:266
 TMVAGui.cxx:267
 TMVAGui.cxx:268
 TMVAGui.cxx:269
 TMVAGui.cxx:270
 TMVAGui.cxx:271
 TMVAGui.cxx:272
 TMVAGui.cxx:273
 TMVAGui.cxx:274
 TMVAGui.cxx:275
 TMVAGui.cxx:276
 TMVAGui.cxx:277
 TMVAGui.cxx:278
 TMVAGui.cxx:279
 TMVAGui.cxx:280
 TMVAGui.cxx:281
 TMVAGui.cxx:282
 TMVAGui.cxx:283
 TMVAGui.cxx:284
 TMVAGui.cxx:285
 TMVAGui.cxx:286
 TMVAGui.cxx:287