ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/VHbb/python/myutils/tmvaglob.C
Revision: 1.1
Committed: Wed Jan 16 16:35:44 2013 UTC (12 years, 3 months ago) by peller
Content type: text/plain
Branch: MAIN
CVS Tags: lhcp_UnblindFix, hcp_Unblind, lhcp_11April, LHCP_PreAppFixAfterFreeze, LHCP_PreAppFreeze, workingVersionAfterHCP, HEAD
Log Message:
reorganized the whole repository. Macros im myutils, config files in subdirectories. Config file split in parts. Path config file restructured. Moved all path options to the path config. Changed the code accordingly.

File Contents

# User Rev Content
1 peller 1.1 // global TMVA style settings
2     #ifndef TMVA_TMVAGLOB
3     #define TMVA_TMVAGLOB
4    
5     #include <iostream>
6     #include <vector>
7    
8     #include "TPad.h"
9     #include "TCanvas.h"
10     #include "TColor.h"
11     #include "TSystem.h"
12     #include "TImage.h"
13     #include "TKey.h"
14     #include "TH1.h"
15     #include "TROOT.h"
16     #include "TStyle.h"
17     #include "TFile.h"
18     #include "TDirectory.h"
19     #include "TObjArray.h"
20    
21    
22     #include "RVersion.h"
23    
24     using std::cout;
25     using std::endl;
26    
27     namespace TMVAGlob {
28    
29     // --------- S t y l e ---------------------------
30     static Bool_t UsePaperStyle = 0;
31     // -----------------------------------------------
32    
33     enum TypeOfPlot { kId = 0,
34     kNorm,
35     kDecorrelated,
36     kPCA,
37     kGaussDecorr,
38     kNumOfMethods };
39    
40     static Int_t c_Canvas = TColor::GetColor( "#ffffff" );
41     static Int_t c_FrameFill = TColor::GetColor( "#ffffff" );
42     static Int_t c_TitleBox = TColor::GetColor( "#ffffff" );
43     static Int_t c_TitleBorder = TColor::GetColor( "#ffffff" );
44     static Int_t c_TitleText = TColor::GetColor( "#000000" );
45     static Int_t c_SignalLine = TColor::GetColor( "#0000ee" );
46     static Int_t c_SignalFill = TColor::GetColor( "#7d99d1" );
47     static Int_t c_BackgroundLine = TColor::GetColor( "#ff0000" );
48     static Int_t c_BackgroundFill = TColor::GetColor( "#ff0000" );
49     static Int_t c_NovelBlue = TColor::GetColor( "#2244a5" );
50    
51     // set the style
52     void SetSignalAndBackgroundStyle( TH1* sig, TH1* bkg, TH1* all = 0 )
53     {
54     //signal
55     // const Int_t FillColor__S = 38 + 150; // change of Color Scheme in ROOT-5.16.
56     // convince yourself with gROOT->GetListOfColors()->Print()
57     Int_t FillColor__S = c_SignalFill;
58     Int_t FillStyle__S = 1001;
59     Int_t LineColor__S = c_SignalLine;
60     Int_t LineWidth__S = 2;
61    
62     // background
63     //Int_t icolor = UsePaperStyle ? 2 + 100 : 2;
64     Int_t FillColor__B = c_BackgroundFill;
65     Int_t FillStyle__B = 3554;
66     Int_t LineColor__B = c_BackgroundLine;
67     Int_t LineWidth__B = 2;
68    
69     if (sig != NULL) {
70     sig->SetLineColor( LineColor__S );
71     sig->SetLineWidth( LineWidth__S );
72     sig->SetFillStyle( FillStyle__S );
73     sig->SetFillColor( FillColor__S );
74     }
75    
76     if (bkg != NULL) {
77     bkg->SetLineColor( LineColor__B );
78     bkg->SetLineWidth( LineWidth__B );
79     bkg->SetFillStyle( FillStyle__B );
80     bkg->SetFillColor( FillColor__B );
81     }
82    
83     if (all != NULL) {
84     all->SetLineColor( LineColor__S );
85     all->SetLineWidth( LineWidth__S );
86     all->SetFillStyle( FillStyle__S );
87     all->SetFillColor( FillColor__S );
88     }
89     }
90    
91     void SetMultiClassStyle( TObjArray* hists )
92     {
93     //signal
94     // const Int_t FillColor__S = 38 + 150; // change of Color Scheme in ROOT-5.16.
95     // convince yourself with gROOT->GetListOfColors()->Print()
96     //Int_t FillColor__S = c_SignalFill;
97     //Int_t FillStyle__S = 1001;
98     //Int_t LineColor__S = c_SignalLine;
99     //Int_t LineWidth__S = 2;
100    
101     // background
102     //Int_t icolor = UsePaperStyle ? 2 + 100 : 2;
103     //Int_t FillColor__B = c_BackgroundFill;
104     //Int_t FillStyle__B = 3554;
105     //Int_t LineColor__B = c_BackgroundLine;
106     //Int_t LineWidth__B = 2;
107    
108     Int_t FillColors[10] = {38,2,3,6,7,8,9,10};
109     Int_t LineColors[10] = {4,2,3,6,7,8,9,11};
110     Int_t FillStyles[5] = {1001,3554,3003,3545,0};
111    
112     for(Int_t i=0; i<hists->GetEntriesFast(); ++i){
113     ((TH1*)(*hists)[i])->SetFillColor(FillColors[i%10]);
114     ((TH1*)(*hists)[i])->SetFillStyle(FillStyles[i%5]);
115     ((TH1*)(*hists)[i])->SetLineColor(LineColors[i%10]);
116     ((TH1*)(*hists)[i])->SetLineWidth(2);
117     }
118     }
119    
120     // set frame styles
121     void SetFrameStyle( TH1* frame, Float_t scale = 1.0 )
122     {
123     frame->SetLabelOffset( 0.012, "X" );// label offset on x axis
124     frame->SetLabelOffset( 0.012, "Y" );// label offset on x axis
125     frame->GetXaxis()->SetTitleOffset( 1.25 );
126     frame->GetYaxis()->SetTitleOffset( 1.22 );
127     frame->GetXaxis()->SetTitleSize( 0.045*scale );
128     frame->GetYaxis()->SetTitleSize( 0.045*scale );
129     Float_t labelSize = 0.04*scale;
130     frame->GetXaxis()->SetLabelSize( labelSize );
131     frame->GetYaxis()->SetLabelSize( labelSize );
132    
133     // global style settings
134     gPad->SetTicks();
135     gPad->SetLeftMargin ( 0.108*scale );
136     gPad->SetRightMargin ( 0.050*scale );
137     gPad->SetBottomMargin( 0.120*scale );
138     }
139    
140     void SetTMVAStyle() {
141    
142     TStyle *TMVAStyle = gROOT->GetStyle("TMVA");
143     if(TMVAStyle!=0) {
144     gROOT->SetStyle("TMVA");
145     return;
146     }
147    
148     TMVAStyle = new TStyle(*gROOT->GetStyle("Plain")); // our style is based on Plain
149     TMVAStyle->SetName("TMVA");
150     TMVAStyle->SetTitle("TMVA style based on \"Plain\" with modifications defined in tmvaglob.C");
151     gROOT->GetListOfStyles()->Add(TMVAStyle);
152     gROOT->SetStyle("TMVA");
153    
154     TMVAStyle->SetLineStyleString( 5, "[52 12]" );
155     TMVAStyle->SetLineStyleString( 6, "[22 12]" );
156     TMVAStyle->SetLineStyleString( 7, "[22 10 7 10]" );
157    
158     // the pretty color palette of old
159     TMVAStyle->SetPalette((UsePaperStyle ? 18 : 1),0);
160    
161     // use plain black on white colors
162     TMVAStyle->SetFrameBorderMode(0);
163     TMVAStyle->SetCanvasBorderMode(0);
164     TMVAStyle->SetPadBorderMode(0);
165     TMVAStyle->SetPadColor(0);
166     TMVAStyle->SetFillStyle(0);
167    
168     TMVAStyle->SetLegendBorderSize(0);
169    
170     // title properties
171     // TMVAStyle->SetTitleW(.4);
172     // TMVAStyle->SetTitleH(.10);
173     // MVAStyle->SetTitleX(.5);
174     // TMVAStyle->SetTitleY(.9);
175     TMVAStyle->SetTitleFillColor( c_TitleBox );
176     TMVAStyle->SetTitleTextColor( c_TitleText );
177     TMVAStyle->SetTitleBorderSize( 1 );
178     TMVAStyle->SetLineColor( c_TitleBorder );
179     if (!UsePaperStyle) {
180     TMVAStyle->SetFrameFillColor( c_FrameFill );
181     TMVAStyle->SetCanvasColor( c_Canvas );
182     }
183    
184     // set the paper & margin sizes
185     TMVAStyle->SetPaperSize(20,26);
186     TMVAStyle->SetPadTopMargin(0.10);
187     TMVAStyle->SetPadRightMargin(0.05);
188     TMVAStyle->SetPadBottomMargin(0.11);
189     TMVAStyle->SetPadLeftMargin(0.12);
190    
191     // use bold lines and markers
192     TMVAStyle->SetMarkerStyle(21);
193     TMVAStyle->SetMarkerSize(0.3);
194     TMVAStyle->SetHistLineWidth(2);
195     TMVAStyle->SetLineStyleString(2,"[12 12]"); // postscript dashes
196    
197     // do not display any of the standard histogram decorations
198     TMVAStyle->SetOptTitle(1);
199     TMVAStyle->SetTitleH(0.052);
200    
201     TMVAStyle->SetOptStat(0);
202     TMVAStyle->SetOptFit(0);
203    
204     // put tick marks on top and RHS of plots
205     TMVAStyle->SetPadTickX(1);
206     TMVAStyle->SetPadTickY(1);
207    
208     }
209    
210     void DestroyCanvases()
211     {
212    
213     TList* loc = (TList*)gROOT->GetListOfCanvases();
214     TListIter itc(loc);
215     TObject *o(0);
216     while ((o = itc())) delete o;
217     }
218    
219     // set style and remove existing canvas'
220     void Initialize( Bool_t useTMVAStyle = kTRUE )
221     {
222     // destroy canvas'
223     DestroyCanvases();
224    
225     // set style
226     if (!useTMVAStyle) {
227     gROOT->SetStyle("Plain");
228     gStyle->SetOptStat(0);
229     return;
230     }
231    
232     SetTMVAStyle();
233     }
234    
235     // checks if file with name "fin" is already open, and if not opens one
236     TFile* OpenFile( const TString& fin )
237     {
238     TFile* file = gDirectory->GetFile();
239     if (file==0 || fin != file->GetName()) {
240     if (file != 0) {
241     gROOT->cd();
242     file->Close();
243     }
244     cout << "--- Opening root file " << fin << " in read mode" << endl;
245     file = TFile::Open( fin, "READ" );
246     }
247     else {
248     file = gDirectory->GetFile();
249     }
250    
251     file->cd();
252     return file;
253     }
254    
255     // used to create output file for canvas
256     void imgconv( TCanvas* c, const TString & fname )
257     {
258     // return;
259     if (NULL == c) {
260     cout << "*** Error in TMVAGlob::imgconv: canvas is NULL" << endl;
261     }
262     else {
263     // create directory if not existing
264     TString f = fname;
265     TString dir = f.Remove( f.Last( '/' ), f.Length() - f.Last( '/' ) );
266     gSystem->mkdir( dir );
267    
268     TString pngName = fname + ".png";
269     TString gifName = fname + ".gif";
270     TString epsName = fname + ".eps";
271     c->cd();
272    
273     // create eps (other option: c->Print( epsName ))
274     if (UsePaperStyle) {
275     c->Print(epsName);
276     }
277     else {
278     cout << "--- --------------------------------------------------------------------" << endl;
279     cout << "--- If you want to save the image as eps, gif or png, please comment out " << endl;
280     cout << "--- the corresponding lines (line no. 239-241) in tmvaglob.C" << endl;
281     cout << "--- --------------------------------------------------------------------" << endl;
282     c->Print(epsName);
283     c->Print(pngName);
284     // c->Print(gifName);
285     }
286     }
287     }
288    
289     TImage * findImage(const char * imageName)
290     {
291     // looks for the image in macropath
292     TString macroPath(gROOT->GetMacroPath()); // look for the image in here
293     Ssiz_t curIndex(0);
294     TImage *img(0);
295     while(1) {
296     Ssiz_t pathStart = curIndex;
297     curIndex = macroPath.Index(":",curIndex);
298     Ssiz_t pathEnd = (curIndex==-1)?macroPath.Length():curIndex;
299     TString path(macroPath(pathStart,pathEnd-pathStart));
300    
301     gSystem->ExpandPathName(path);
302     const char* fullName = Form("%s/%s", path.Data(), imageName);
303    
304     Bool_t fileFound = ! gSystem->AccessPathName(fullName);
305    
306     if(fileFound) {
307     img = TImage::Open(fullName);
308     break;
309     }
310     if(curIndex==-1) break;
311     curIndex++;
312     }
313     return img;
314     }
315    
316     void plot_logo( Float_t v_scale = 1.0, Float_t skew = 1.0 )
317     {
318    
319     TImage *img = findImage("tmva_logo.gifblabla");
320     if (!img) {
321     cout << "+++ Could not open image tmva_logo.gif" << endl;
322     return;
323     }
324    
325     img->SetConstRatio(kFALSE);
326     UInt_t h_ = img->GetHeight();
327     UInt_t w_ = img->GetWidth();
328    
329     Float_t r = w_/h_;
330     gPad->Update();
331     Float_t rpad = Double_t(gPad->VtoAbsPixel(0) - gPad->VtoAbsPixel(1))/(gPad->UtoAbsPixel(1) - gPad->UtoAbsPixel(0));
332     r *= rpad;
333    
334     Float_t d = 0.055;
335     // absolute coordinates
336     Float_t x1R = 1 - gStyle->GetPadRightMargin();
337     Float_t y1B = 1 - gStyle->GetPadTopMargin()+.01; // we like the logo to sit a bit above the histo
338    
339     Float_t x1L = x1R - d*r/skew;
340     Float_t y1T = y1B + d*v_scale*skew;
341     if (y1T>0.99) y1T = 0.99;
342    
343     TPad *p1 = new TPad("imgpad", "imgpad", x1L, y1B, x1R, y1T );
344     p1->SetRightMargin(0);
345     p1->SetBottomMargin(0);
346     p1->SetLeftMargin(0);
347     p1->SetTopMargin(0);
348     p1->Draw();
349    
350     Int_t xSizeInPixel = p1->UtoAbsPixel(1) - p1->UtoAbsPixel(0);
351     Int_t ySizeInPixel = p1->VtoAbsPixel(0) - p1->VtoAbsPixel(1);
352     if (xSizeInPixel<=25 || ySizeInPixel<=25) {
353     delete p1;
354     return; // ROOT doesn't draw smaller than this
355     }
356    
357     p1->cd();
358     img->Draw();
359     }
360    
361     void NormalizeHist( TH1* h )
362     {
363     if (h==0) return;
364     if (h->GetSumw2N() == 0) h->Sumw2();
365     if(h->GetSumOfWeights()!=0) {
366     Float_t dx = (h->GetXaxis()->GetXmax() - h->GetXaxis()->GetXmin())/h->GetNbinsX();
367     h->Scale( 1.0/h->GetSumOfWeights()/dx );
368     }
369     }
370     void NormalizeHists( TH1* sig, TH1* bkg = 0 )
371     {
372     if (sig->GetSumw2N() == 0) sig->Sumw2();
373     if (bkg && bkg->GetSumw2N() == 0) bkg->Sumw2();
374    
375     if(sig->GetSumOfWeights()!=0) {
376     Float_t dx = (sig->GetXaxis()->GetXmax() - sig->GetXaxis()->GetXmin())/sig->GetNbinsX();
377     sig->Scale( 1.0/sig->GetSumOfWeights()/dx );
378     }
379     if (bkg != 0 && bkg->GetSumOfWeights()!=0) {
380     Float_t dx = (bkg->GetXaxis()->GetXmax() - bkg->GetXaxis()->GetXmin())/bkg->GetNbinsX();
381     bkg->Scale( 1.0/bkg->GetSumOfWeights()/dx );
382     }
383     }
384    
385     // the following are tools to help handling different methods and titles
386    
387    
388     void GetMethodName( TString & name, TKey * mkey ) {
389     if (mkey==0) return;
390     name = mkey->GetName();
391     name.ReplaceAll("Method_","");
392     }
393    
394     void GetMethodTitle( TString & name, TKey * ikey ) {
395     if (ikey==0) return;
396     name = ikey->GetName();
397     }
398    
399     void GetMethodName( TString & name, TDirectory * mdir ) {
400     if (mdir==0) return;
401     name = mdir->GetName();
402     name.ReplaceAll("Method_","");
403     }
404    
405     void GetMethodTitle( TString & name, TDirectory * idir ) {
406     if (idir==0) return;
407     name = idir->GetName();
408     }
409    
410     TKey *NextKey( TIter & keyIter, TString className) {
411     TKey *key=(TKey *)keyIter.Next();
412     TKey *rkey=0;
413     Bool_t loop=(key!=0);
414     //
415     while (loop) {
416     TClass *cl = gROOT->GetClass(key->GetClassName());
417     if (cl->InheritsFrom(className.Data())) {
418     loop = kFALSE;
419     rkey = key;
420     } else {
421     key = (TKey *)keyIter.Next();
422     if (key==0) loop = kFALSE;
423     }
424     }
425     return rkey;
426     }
427    
428     UInt_t GetListOfKeys( TList& keys, TString inherits, TDirectory *dir=0 )
429     {
430     // get a list of keys with a given inheritance
431     // the list contains TKey objects
432     if (dir==0) dir = gDirectory;
433     TIter mnext(dir->GetListOfKeys());
434     TKey *mkey;
435     keys.Clear();
436     keys.SetOwner(kFALSE);
437     UInt_t ni=0;
438     while ((mkey = (TKey*)mnext())) {
439     // make sure, that we only look at TDirectory with name Method_<xxx>
440     TClass *cl = gROOT->GetClass(mkey->GetClassName());
441     if (cl->InheritsFrom(inherits)) {
442     keys.Add(mkey);
443     ni++;
444     }
445     }
446     return ni;
447     }
448    
449     Int_t GetNumberOfTargets( TDirectory *dir )
450     {
451     TIter next(dir->GetListOfKeys());
452     TKey* key = 0;
453     Int_t noTrgts = 0;
454    
455     while ((key = (TKey*)next())) {
456     if (key->GetCycle() != 1) continue;
457     if (TString(key->GetName()).Contains("__Regression_target")) noTrgts++;
458     }
459     return noTrgts;
460     }
461    
462     Int_t GetNumberOfInputVariables( TDirectory *dir )
463     {
464     TIter next(dir->GetListOfKeys());
465     TKey* key = 0;
466     Int_t noVars = 0;
467    
468     while ((key = (TKey*)next())) {
469     if (key->GetCycle() != 1) continue;
470    
471     // count number of variables (signal is sufficient), exclude target(s)
472     if (TString(key->GetName()).Contains("__Signal") || (TString(key->GetName()).Contains("__Regression") && !(TString(key->GetName()).Contains("__Regression_target")))) noVars++;
473     }
474    
475     return noVars;
476     }
477    
478     std::vector<TString> GetInputVariableNames(TDirectory *dir )
479     {
480     TIter next(dir->GetListOfKeys());
481     TKey* key = 0;
482     //set<std::string> varnames;
483     std::vector<TString> names;
484    
485     while ((key = (TKey*)next())) {
486     if (key->GetCycle() != 1) continue;
487     TClass *cl = gROOT->GetClass(key->GetClassName());
488     if (!cl->InheritsFrom("TH1")) continue;
489     TString name(key->GetName());
490     Int_t pos = name.First("__");
491     name.Remove(pos);
492     Bool_t hasname = false;
493     std::vector<TString>::const_iterator iter = names.begin();
494     while(iter != names.end()){
495     if(name.CompareTo(*iter)==0)
496     hasname=true;
497     iter++;
498     }
499     if(!hasname)
500     names.push_back(name);
501     }
502     return names;
503     }
504    
505     Int_t GetNumberOfInputVariablesMultiClass( TDirectory *dir ){
506     std::vector<TString> names(GetInputVariableNames(dir));
507     return names.end() - names.begin();
508     }
509    
510     std::vector<TString> GetClassNames(TDirectory *dir )
511     {
512    
513     TIter next(dir->GetListOfKeys());
514     TKey* key = 0;
515     //set<std::string> varnames;
516     std::vector<TString> names;
517    
518     while ((key = (TKey*)next())) {
519     if (key->GetCycle() != 1) continue;
520     TClass *cl = gROOT->GetClass(key->GetClassName());
521     if (!cl->InheritsFrom("TH1")) continue;
522     TString name(key->GetName());
523     name.ReplaceAll("_Deco","");
524     name.ReplaceAll("_Gauss","");
525     name.ReplaceAll("_PCA","");
526     name.ReplaceAll("_Id","");
527     name.ReplaceAll("_vs_","");
528     char c = '_';
529     Int_t pos = name.Last(c);
530     name.Remove(0,pos+1);
531    
532     /*Int_t pos = name.First("__");
533     name.Remove(0,pos+2);
534     char c = '_';
535     pos = name.Last(c);
536     name.Remove(pos);
537     if(name.Contains("Gauss")){
538     pos = name.Last(c);
539     name.Remove(pos);
540     }
541     pos = name.Last(c);
542     if(pos!=-1)
543     name.Remove(0,pos+1);
544     */
545     Bool_t hasname = false;
546     std::vector<TString>::const_iterator iter = names.begin();
547     while(iter != names.end()){
548     if(name.CompareTo(*iter)==0)
549     hasname=true;
550     iter++;
551     }
552     if(!hasname)
553     names.push_back(name);
554     }
555     return names;
556     }
557    
558    
559     TKey* FindMethod( TString name, TDirectory *dir=0 )
560     {
561     // find the key for a method
562     if (dir==0) dir = gDirectory;
563     TIter mnext(dir->GetListOfKeys());
564     TKey *mkey;
565     TKey *retkey=0;
566     Bool_t loop=kTRUE;
567     while (loop) {
568     mkey = (TKey*)mnext();
569     if (mkey==0) {
570     loop = kFALSE;
571     }
572     else {
573     TString clname = mkey->GetClassName();
574     TClass *cl = gROOT->GetClass(clname);
575     if (cl->InheritsFrom("TDirectory")) {
576     TString mname = mkey->GetName(); // method name
577     TString tname = "Method_"+name; // target name
578     if (mname==tname) { // target found!
579     loop = kFALSE;
580     retkey = mkey;
581     }
582     }
583     }
584     }
585     return retkey;
586     }
587    
588     Bool_t ExistMethodName( TString name, TDirectory *dir=0 )
589     {
590     // find the key for a method
591     if (dir==0) dir = gDirectory;
592     TIter mnext(dir->GetListOfKeys());
593     TKey *mkey;
594     Bool_t loop=kTRUE;
595     while (loop) {
596     mkey = (TKey*)mnext();
597     if (mkey==0) {
598     loop = kFALSE;
599     }
600     else {
601     TString clname = mkey->GetClassName();
602     TString keyname = mkey->GetName();
603     TClass *cl = gROOT->GetClass(clname);
604     if (keyname.Contains("Method") && cl->InheritsFrom("TDirectory")) {
605    
606     TDirectory* d_ = (TDirectory*)dir->Get( keyname );
607     if (!d_) {
608     cout << "HUUUGE TROUBLES IN TMVAGlob::ExistMethodName() --> contact authors" << endl;
609     return kFALSE;
610     }
611    
612     TIter mnext_(d_->GetListOfKeys());
613     TKey *mkey_;
614     while ((mkey_ = (TKey*)mnext_())) {
615     TString clname_ = mkey_->GetClassName();
616     TClass *cl_ = gROOT->GetClass(clname_);
617     if (cl_->InheritsFrom("TDirectory")) {
618     TString mname = mkey_->GetName(); // method name
619     if (mname==name) { // target found!
620     return kTRUE;
621     }
622     }
623     }
624     }
625     }
626     }
627     return kFALSE;
628     }
629    
630     UInt_t GetListOfMethods( TList & methods, TDirectory *dir=0 )
631     {
632     // get a list of methods
633     // the list contains TKey objects
634     if (dir==0) dir = gDirectory;
635     TIter mnext(dir->GetListOfKeys());
636     TKey *mkey;
637     methods.Clear();
638     methods.SetOwner(kFALSE);
639     UInt_t ni=0;
640     while ((mkey = (TKey*)mnext())) {
641     // make sure, that we only look at TDirectory with name Method_<xxx>
642     TString name = mkey->GetClassName();
643     TClass *cl = gROOT->GetClass(name);
644     if (cl->InheritsFrom("TDirectory")) {
645     if (TString(mkey->GetName()).BeginsWith("Method_")) {
646     methods.Add(mkey);
647     ni++;
648     }
649     }
650     }
651     cout << "--- Found " << ni << " classifier types" << endl;
652     return ni;
653     }
654    
655     UInt_t GetListOfJobs( TFile* file, TList& jobdirs)
656     {
657     // get a list of all jobs in all method directories
658     // based on ideas by Peter and Joerg found in macro deviations.C
659     TIter next(file->GetListOfKeys());
660     TKey *key(0);
661     while ((key = (TKey*)next())) {
662    
663     if (TString(key->GetName()).BeginsWith("Method_")) {
664     if (gROOT->GetClass(key->GetClassName())->InheritsFrom("TDirectory")) {
665    
666     TDirectory* mDir = (TDirectory*)key->ReadObj();
667    
668     TIter keyIt(mDir->GetListOfKeys());
669     TKey *jobkey;
670     while ((jobkey = (TKey*)keyIt())) {
671     if (!gROOT->GetClass(jobkey->GetClassName())->InheritsFrom("TDirectory")) continue;
672    
673     TDirectory *jobDir = (TDirectory *)jobkey->ReadObj();
674     cout << "jobdir name " << jobDir->GetName() << endl;
675     jobdirs.Add(jobDir);
676     }
677     }
678     }
679     }
680     return jobdirs.GetSize();
681     }
682    
683     UInt_t GetListOfTitles( TDirectory *rfdir, TList & titles )
684     {
685     // get a list of titles (i.e TDirectory) given a method dir
686     UInt_t ni=0;
687     if (rfdir==0) return 0;
688     TList *keys = rfdir->GetListOfKeys();
689     if (keys==0) {
690     cout << "+++ Directory '" << rfdir->GetName() << "' contains no keys" << endl;
691     return 0;
692     }
693     //
694     TIter rfnext(rfdir->GetListOfKeys());
695     TKey *rfkey;
696     titles.Clear();
697     titles.SetOwner(kFALSE);
698     while ((rfkey = (TKey*)rfnext())) {
699     // make sure, that we only look at histograms
700     TClass *cl = gROOT->GetClass(rfkey->GetClassName());
701     if (cl->InheritsFrom("TDirectory")) {
702     titles.Add(rfkey);
703     ni++;
704     }
705     }
706     cout << "--- Found " << ni << " instance(s) of the method " << rfdir->GetName() << endl;
707     return ni;
708     }
709    
710     UInt_t GetListOfTitles( TString & methodName, TList & titles, TDirectory *dir=0 )
711     {
712     // get the list of all titles for a given method
713     // if the input dir is 0, gDirectory is used
714     // returns a list of keys
715     UInt_t ni=0;
716     if (dir==0) dir = gDirectory;
717     TDirectory* rfdir = (TDirectory*)dir->Get( methodName );
718     if (rfdir==0) {
719     cout << "+++ Could not locate directory '" << methodName << endl;
720     return 0;
721     }
722    
723     return GetListOfTitles( rfdir, titles );
724    
725     TList *keys = rfdir->GetListOfKeys();
726     if (keys==0) {
727     cout << "+++ Directory '" << methodName << "' contains no keys" << endl;
728     return 0;
729     }
730     //
731     TIter rfnext(rfdir->GetListOfKeys());
732     TKey *rfkey;
733     titles.Clear();
734     titles.SetOwner(kFALSE);
735     while ((rfkey = (TKey*)rfnext())) {
736     // make sure, that we only look at histograms
737     TClass *cl = gROOT->GetClass(rfkey->GetClassName());
738     if (cl->InheritsFrom("TDirectory")) {
739     titles.Add(rfkey);
740     ni++;
741     }
742     }
743     cout << "--- Found " << ni << " instance(s) of the method " << methodName << endl;
744     return ni;
745     }
746    
747     TDirectory *GetInputVariablesDir( TMVAGlob::TypeOfPlot type, TDirectory *dir=0 )
748     {
749     // get the InputVariables directory
750     const TString directories[TMVAGlob::kNumOfMethods] = { "InputVariables_Id",
751     "InputVariables_Deco",
752     "InputVariables_PCA",
753     "InputVariables_Gauss_Deco" };
754     if (dir==0) dir = gDirectory;
755    
756     // get top dir containing all hists of the variables
757     dir = (TDirectory*)gDirectory->Get( directories[type] );
758     if (dir==0) {
759     cout << "+++ Could not locate input variable directory '" << directories[type] << endl;
760     return 0;
761     }
762     return dir;
763     }
764    
765     TDirectory *GetCorrelationPlotsDir( TMVAGlob::TypeOfPlot type, TDirectory *dir=0 )
766     {
767     // get the CorrelationPlots directory
768     if (dir==0) dir = GetInputVariablesDir( type, 0 );
769     if (dir==0) return 0;
770     //
771     TDirectory* corrdir = (TDirectory*)dir->Get( "CorrelationPlots" );
772     if (corrdir==0) {
773     cout << "+++ Could not find CorrelationPlots directory 'CorrelationPlots'" << endl;
774     return 0;
775     }
776     return corrdir;
777     }
778    
779     }
780    
781     #endif