Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
training_history.cxx
Go to the documentation of this file.
2 
3 #include "TH2F.h"
4 #include "TFile.h"
5 #include "TIterator.h"
6 #include "TKey.h"
7 
8 void TMVA::plot_training_history(TString dataset, TFile* /*file*/, TDirectory* BinDir)
9 {
10 
11  Bool_t __PLOT_LOGO__ = kTRUE;
12  Bool_t __SAVE_IMAGE__ = kTRUE;
13 
14  // the coordinates
15  Float_t x1 = 999;
16  Float_t x2 = -999;
17  Float_t y1 = 999.;
18  Float_t y2 = -999;
19 
20  // create canvas
21  TCanvas* c = new TCanvas( "c", "the canvas", 200, 0, 650, 500 );
22 
23  // global style settings
24  c->SetGrid();
25  c->SetTicks();
26 
27  // legend
28  Float_t x0L = 0.107, y0H = 0.899;
29  Float_t dxL = 0.457-x0L, dyH = 0.22;
30 
31  TLegend *legend = new TLegend( x0L, y0H-dyH, x0L+dxL, y0H );
32  //legend->SetTextSize( 0.05 );
33  legend->SetHeader( "MVA Method:" );
34  legend->SetMargin( 0.4 );
35 
36  TString xtit = "Training Step";
37  TString ytit = "";
38 
39  TString ftit = "Training History";
40 
41  TString hNameRef = "";//training_history";
42 
43  TList xhists;
44  TList xmethods;
45  UInt_t xnm = TMVAGlob::GetListOfMethods( xmethods ,BinDir);
46  if (xnm==0){
47  cout << "ups .. no methods found in to plot training history for ... give up" << endl;
48  return;
49  }
50  TIter xnext(&xmethods);
51  // loop over all methods
52  TKey *xkey;
53  while ((xkey = (TKey*)xnext())) {
54  TDirectory * mDir = (TDirectory*)xkey->ReadObj();
55  TList titles;
56  UInt_t ninst = TMVAGlob::GetListOfTitles(mDir,titles);
57  if (ninst==0) cout << "hmm... sorry, but this printout was supposed to be only to keep the compiler quite.. never supposed to happen :(" << endl;
58  TIter nextTitle(&titles);
59  TKey *titkey;
60  TDirectory *titDir;
61  while ((titkey = TMVAGlob::NextKey(nextTitle,"TDirectory"))) {
62  titDir = (TDirectory *)titkey->ReadObj();
63  TString methodTitle;
64  TMVAGlob::GetMethodTitle(methodTitle,titDir);
65  TIter nextKey( titDir->GetListOfKeys() );
66  TKey *hkey2;
67  while ((hkey2 = TMVAGlob::NextKey(nextKey,"TH1"))) {
68  TH1 *h = (TH1*)hkey2->ReadObj();
69  TString hname = h->GetName();
70  if (hname.Contains( hNameRef ) && hname.BeginsWith( "TrainingHistory_" )) {
71 
72  if (h->GetMaximum() > y2) y2 = h->GetMaximum()*1.1;
73  if (h->GetMinimum() < y1) y1 = h->GetMinimum();
74  if (h->GetBinLowEdge(0) < x1 ) x1 = h->GetBinLowEdge(0);
75  if (h->GetBinLowEdge(h->GetNbinsX()+1 ) > x2 ) x2 = h->GetBinLowEdge(h->GetNbinsX()+1 );
76 
77  }
78  }
79  }
80  }
81 
82 
83  // draw empty frame
84  if(gROOT->FindObject("frame")!=0) gROOT->FindObject("frame")->Delete();
85  TH2F* frame = new TH2F( "frame", ftit, 500, x1, x2, 500, y1, y2 );
86  frame->GetXaxis()->SetTitle( xtit );
87  frame->GetYaxis()->SetTitle( ytit );
88  TMVAGlob::SetFrameStyle( frame, 1.0 );
89 
90  frame->Draw();
91 
92  Int_t color = 1;
93  Int_t nmva = 0;
94  TKey *key;
95 
96  TList hists;
97  TList methods;
98  UInt_t nm = TMVAGlob::GetListOfMethods( methods,BinDir );
99  if (nm==0){
100  cout << "ups .. no methods found in to plot ROC curve for ... give up" << endl;
101  return;
102  }
103  // TIter next(file->GetListOfKeys());
104  TIter next(&methods);
105 
106  // loop over all methods
107  while ((key = (TKey*)next())) {
108  TDirectory * mDir = (TDirectory*)key->ReadObj();
109  TList titles;
110  UInt_t ninst = TMVAGlob::GetListOfTitles(mDir,titles);
111  if (ninst==0) cout << "hmm... sorry, but this printout was supposed to be only to keep the compiler quite.. never supposed to happen :(" << endl;
112  TIter nextTitle(&titles);
113  TKey *titkey;
114  TDirectory *titDir;
115  while ((titkey = TMVAGlob::NextKey(nextTitle,"TDirectory"))) {
116  titDir = (TDirectory *)titkey->ReadObj();
117  TString methodTitle;
118  TMVAGlob::GetMethodTitle(methodTitle,titDir);
119  TIter nextKey( titDir->GetListOfKeys() );
120  TKey *hkey2;
121  while ((hkey2 = TMVAGlob::NextKey(nextKey,"TH1"))) {
122  TH1 *h = (TH1*)hkey2->ReadObj();
123  TString hname = h->GetName();
124  if (hname.Contains( hNameRef ) && hname.BeginsWith( "TrainingHistory_" )) {
125  h->SetLineWidth(3);
126  h->SetLineColor(color);
127  color++; if (color == 5 || color == 10 || color == 11) color++;
128  h->Draw("csame");
129  hists.Add(h);
130  nmva++;
131  }
132  }
133  }
134  }
135 
136  while (hists.GetSize()) {
137  TListIter hIt(&hists);
138  TH1* hist(0);
139  Double_t largestInt=-1;
140  TH1* histWithLargestInt(0);
141  while ((hist = (TH1*)hIt())!=0) {
142  Double_t integral = hist->Integral(1,hist->FindBin(0.9999));
143  if (integral>largestInt) {
144  largestInt = integral;
145  histWithLargestInt = hist;
146  }
147  }
148  if (histWithLargestInt == 0) {
149  cout << "ERROR - unknown hist \"histWithLargestInt\" --> serious problem in ROOT file" << endl;
150  break;
151  }
152  legend->AddEntry(histWithLargestInt,TString(histWithLargestInt->GetTitle()).ReplaceAll("MVA_",""),"l");
153  hists.Remove(histWithLargestInt);
154  }
155 
156  // rescale legend box size
157  // current box size has been tuned for 3 MVAs + 1 title
158  dyH *= (Float_t(TMath::Min(10,nmva) - 3.0)/4.0);
159  legend->SetY2( y0H + dyH);
160 
161  // redraw axes
162  frame->Draw("sameaxis");
163  legend->Draw("same");
164 
165  // ============================================================
166 
167  if (__PLOT_LOGO__) TMVAGlob::plot_logo();
168 
169  // ============================================================
170 
171  c->Update();
172 
173  TString fname = dataset+"/plots/" + hNameRef;
174  if (TString(BinDir->GetName()).Contains("multicut")){
175  TString fprepend(BinDir->GetName());
176  fprepend.ReplaceAll("multicutMVA_","");
177  fname = dataset+"plots/" + fprepend + "_" + hNameRef;
178  }
179  if (__SAVE_IMAGE__) TMVAGlob::imgconv( c, fname );
180 
181  return;
182 }
183 
184 void TMVA::training_history(TString dataset, TString fin , Bool_t useTMVAStyle )
185 {
186 
187  // set style and remove existing canvas'
188  TMVAGlob::Initialize( useTMVAStyle );
189 
190  // checks if file with name "fin" is already open, and if not opens one
191  TFile* file = TMVAGlob::OpenFile( fin );
192 
193  plot_training_history(dataset, file, file->GetDirectory(dataset.Data()));
194 
195  return;
196 }
197