ROOT  6.06/09
Reference Guide
compareanapp.cxx
Go to the documentation of this file.
1 #include "TMVA/compareanapp.h"
2 #include "TMVA/Types.h"
3 #include "TH2.h"
4 
5 
6 #define CheckDerivedPlots 0
7 //TString DerivedPlotName = "Proba";
8 TString DerivedPlotName = "Rarity";
9 
10 void TMVA::compareanapp( TString finAn , TString finApp ,
11  HistType htype , bool useTMVAStyle )
12 {
13  cout << "=== Compare histograms of two files ===" << endl;
14  cout << " File-1: " << finAn << endl;
15  cout << " File-2: " << finApp << endl;
16 
17  // set style and remove existing canvas'
18  TMVAGlob::Initialize( useTMVAStyle );
19 
20  // switches
21  const Bool_t Draw_CFANN_Logy = kFALSE;
22  const Bool_t Save_Images = kTRUE;
23 
24  TFile* file = TMVAGlob::OpenFile( finAn );
25  TFile* fileApp = new TFile( finApp );
26  file->cd();
27 
28  // define Canvas layout here!
29  const Int_t width = 600; // size of canvas
30 
31  // counter variables
32  Int_t countCanvas = 0;
33 
34  TList methods;
35  TIter next(&methods);
36  TKey *key;
37  while ( (key = (TKey*)next()) ) {
38 
39  TString dirname = ((TDirectory*)key->ReadObj())->GetName();
40  if (dirname.Contains( "Cuts" )) {
41  cout << "--- Found directory: " << dirname << " --> ignoring" << endl;
42  continue;
43  }
44  cout << "--- Found directory: " << dirname
45  << " --> going in" << endl;
46 
47  TString methodName;
48  TMVAGlob::GetMethodName(methodName,key);
49 
50  cout << "--- Method: " << methodName << endl;
51 
52  //TDirectory* mDir = (TDirectory*)
53  key->ReadObj();
54  TList titles;
55  // UInt_t ninst = TMVAGlob::GetListOfTitles(mDir,titles);
56  TIter nextTitle(&titles);
57  TKey *titkey;
58  TDirectory *titDir;
59  while ( (titkey = TMVAGlob::NextKey(nextTitle,"TDirectory")) ) {
60 
61  titDir = (TDirectory *)titkey->ReadObj();
62  TString methodTitle;
63  TMVAGlob::GetMethodTitle(methodTitle,titDir);
64  TString hname = "MVA_" + methodTitle;
65  if (CheckDerivedPlots) hname += TString("_") + DerivedPlotName;
66 
67  TH1* sig = dynamic_cast<TH1*>(titDir->Get( hname + "_S" ));
68  TH1* bgd = dynamic_cast<TH1*>(titDir->Get( hname + "_B" ));
69 
70  if (sig==0 || bgd==0) continue;
71 
72  // chop off useless stuff
73  sig->SetTitle( Form("TMVA output for classifier: %s", methodTitle.Data()) );
74  if (htype == kProbaType)
75  sig->SetTitle( Form("TMVA probability for classifier: %s", methodTitle.Data()) );
76  else if (htype == kRarityType)
77  sig->SetTitle( Form("TMVA Rarity for classifier: %s", methodTitle.Data()) );
78 
79  // create new canvas
80  TString ctitle = ((htype == TMVA::kMVAType) ?
81  Form("TMVA output %s",methodTitle.Data()) :
82  (htype == kProbaType) ?
83  Form("TMVA probability %s",methodTitle.Data()) :
84  Form("TMVA rarity %s",methodTitle.Data()));
85 
86  TString cname = ((htype == TMVA::kMVAType) ?
87  Form("output_%s",methodTitle.Data()) :
88  (htype == kProbaType) ?
89  Form("probability_%s",methodTitle.Data()) :
90  Form("rarity_%s",methodTitle.Data()));
91 
92  TCanvas* c = new TCanvas( Form("canvas%d", countCanvas+1), ctitle,
93  countCanvas*50+200, countCanvas*20, width, width*0.78 );
94 
95  // set the histogram style
97 
98  // normalise both signal and background
99  TMVAGlob::NormalizeHists( sig, bgd );
100 
101  // frame limits (choose judicuous x range)
102  Float_t nrms = 4;
103  Float_t xmin = TMath::Max( TMath::Min(sig->GetMean() - nrms*sig->GetRMS(),
104  bgd->GetMean() - nrms*bgd->GetRMS() ),
105  sig->GetXaxis()->GetXmin() );
106  Float_t xmax = TMath::Min( TMath::Max(sig->GetMean() + nrms*sig->GetRMS(),
107  bgd->GetMean() + nrms*bgd->GetRMS() ),
108  sig->GetXaxis()->GetXmax() );
109  Float_t ymin = 0;
110  Float_t ymax = TMath::Max( sig->GetMaximum(), bgd->GetMaximum() )*1.2 ;
111 
112  if (Draw_CFANN_Logy && methodName == "CFANN") ymin = 0.01;
113 
114  // build a frame
115  Int_t nb = 500;
116  TH2F* frame = new TH2F( TString("frame") + methodTitle, sig->GetTitle(),
117  nb, xmin, xmax, nb, ymin, ymax );
118  frame->GetXaxis()->SetTitle(methodTitle);
119  if (htype == kProbaType ) frame->GetXaxis()->SetTitle( "Signal probability" );
120  else if (htype == kRarityType) frame->GetXaxis()->SetTitle( "Signal rarity" );
121  frame->GetYaxis()->SetTitle("Normalized");
122  TMVAGlob::SetFrameStyle( frame );
123 
124  // eventually: draw the frame
125  frame->Draw();
126 
127  c->GetPad(0)->SetLeftMargin( 0.105 );
128  frame->GetYaxis()->SetTitleOffset( 1.2 );
129 
130  if (Draw_CFANN_Logy && methodName == "CFANN") c->SetLogy();
131 
132  // Draw legend
133  TLegend *legend= new TLegend( c->GetLeftMargin(), 1 - c->GetTopMargin() - 0.12,
134  c->GetLeftMargin() + 0.3, 1 - c->GetTopMargin() );
135  legend->SetFillStyle( 1 );
136  legend->AddEntry(sig,"Signal","F");
137  legend->AddEntry(bgd,"Background","F");
138  legend->SetBorderSize(1);
139  legend->SetMargin( 0.3 );
140  legend->Draw("same");
141 
142  // overlay signal and background histograms
143  sig->Draw("samehist");
144  bgd->Draw("samehist");
145 
146  // retrieve corresponding histogram from TMVApp.root
147  TString hStem(hname);
148  cout << "--- Searching for histogram: " << hStem.Data() << " in application file" << endl;
149 
150  TH1* testHist = (TH1*)fileApp->Get( hStem );
151  if (testHist != 0) {
152  cout << "--> Found application histogram: " << testHist->GetName() << " --> superimpose it" << endl;
153  // compute normalisation factor
154  TMVAGlob::NormalizeHists( testHist );
155  testHist->SetLineWidth( 3 );
156  testHist->SetLineColor( 1 );
157  testHist->Draw("samehist");
158  }
159 
160  // redraw axes
161  frame->Draw("sameaxis");
162 
163  // text for overflows
164  Int_t nbin = sig->GetNbinsX();
165  Double_t dxu = sig->GetBinWidth(0);
166  Double_t dxo = sig->GetBinWidth(nbin+1);
167  TString uoflow = Form( "U/O-flow (S,B): (%.1f, %.1f)%% / (%.1f, %.1f)%%",
168  sig->GetBinContent(0)*dxu*100, bgd->GetBinContent(0)*dxu*100,
169  sig->GetBinContent(nbin+1)*dxo*100, bgd->GetBinContent(nbin+1)*dxo*100 );
170  TText* t = new TText( 0.975, 0.115, uoflow );
171  t->SetNDC();
172  t->SetTextSize( 0.030 );
173  t->SetTextAngle( 90 );
174  t->AppendPad();
175 
176  // save canvas to file
177  c->Update();
179  if (Save_Images) {
180  if (htype == TMVA::kMVAType) TMVAGlob::imgconv( c, Form("plots/mva_%s", methodTitle.Data()) );
181  else if (htype == TMVA::kProbaType) TMVAGlob::imgconv( c, Form("plots/proba_%s", methodTitle.Data()) );
182  else TMVAGlob::imgconv( c, Form("plots/rarity_%s", methodTitle.Data()) );
183  }
184  countCanvas++;
185  }
186  }
187 }
virtual Bool_t cd(const char *path=0)
Change current directory to "this" directory.
virtual void SetTitleOffset(Float_t offset=1)
Set distance between the axis and the axis title Offset is a correction factor with respect to the "s...
Definition: TAttAxis.cxx:244
virtual const char * GetTitle() const
Returns title of object.
Definition: TNamed.h:52
virtual void SetLineWidth(Width_t lwidth)
Definition: TAttLine.h:57
void imgconv(TCanvas *c, const TString &fname)
Definition: tmvaglob.cxx:212
float xmin
Definition: THbookFile.cxx:93
virtual Double_t GetBinContent(Int_t bin) const
Return content of bin number bin.
Definition: TH1.cxx:4629
This class displays a legend box (TPaveText) containing several legend entries.
Definition: TLegend.h:35
virtual TObject * Get(const char *namecycle)
Return pointer to object identified by namecycle.
Definition: TDirectory.cxx:727
ClassImp(TSeqCollection) Int_t TSeqCollection TIter next(this)
Return index of object in collection.
float Float_t
Definition: RtypesCore.h:53
THist< 2, float > TH2F
Definition: THist.h:321
float ymin
Definition: THbookFile.cxx:93
TFile * OpenFile(const TString &fin)
Definition: tmvaglob.cxx:192
void NormalizeHists(TH1 *sig, TH1 *bkg=0)
Definition: tmvaglob.cxx:317
virtual void Draw(Option_t *option="")
Draw this legend with its current attributes.
Definition: TLegend.cxx:373
A ROOT file is a suite of consecutive data records (TKey instances) with a well defined format...
Definition: TFile.h:45
#define CheckDerivedPlots
Definition: compareanapp.cxx:6
virtual TObject * Get(const char *namecycle)
Return pointer to object identified by namecycle.
void SetSignalAndBackgroundStyle(TH1 *sig, TH1 *bkg, TH1 *all=0)
Definition: tmvaglob.cxx:8
void SetFrameStyle(TH1 *frame, Float_t scale=1.0)
Definition: tmvaglob.cxx:77
Basic string class.
Definition: TString.h:137
Short_t Min(Short_t a, Short_t b)
Definition: TMathBase.h:170
int Int_t
Definition: RtypesCore.h:41
bool Bool_t
Definition: RtypesCore.h:59
void SetMargin(Float_t margin)
Definition: TLegend.h:80
const Bool_t kFALSE
Definition: Rtypes.h:92
virtual void SetFillStyle(Style_t fstyle)
Definition: TAttFill.h:52
virtual Int_t GetNbinsX() const
Definition: TH1.h:296
TKey * NextKey(TIter &keyIter, TString className)
Definition: tmvaglob.cxx:357
TLegend * legend
Definition: pirndm.C:35
virtual Double_t GetBinWidth(Int_t bin) const
return bin width for 1D historam Better to use h1.GetXaxis().GetBinWidth(bin)
Definition: TH1.cxx:8492
const char * Data() const
Definition: TString.h:349
Float_t GetTopMargin() const
Definition: TAttPad.h:56
void GetMethodTitle(TString &name, TKey *ikey)
Definition: tmvaglob.cxx:341
Base class for several text objects.
Definition: TText.h:42
Book space in a file, create I/O buffers, to fill them, (un)compress them.
Definition: TKey.h:30
Double_t GetXmin() const
Definition: TAxis.h:137
A doubly linked list.
Definition: TList.h:47
virtual void SetLineColor(Color_t lcolor)
Definition: TAttLine.h:54
float ymax
Definition: THbookFile.cxx:93
virtual Double_t GetMean(Int_t axis=1) const
For axis = 1,2 or 3 returns the mean value of the histogram along X,Y or Z axis.
Definition: TH1.cxx:7014
std::string GetMethodName(TCppMethod_t)
Definition: Cppyy.cxx:707
void Initialize(Bool_t useTMVAStyle=kTRUE)
Definition: tmvaglob.cxx:176
virtual void Draw(Option_t *option="")
Draw this histogram with options.
Definition: TH1.cxx:2878
2-D histogram with a float per channel (see TH1 documentation)}
Definition: TH2.h:256
char * Form(const char *fmt,...)
virtual const char * GetName() const
Returns name of object.
Definition: TNamed.h:51
TAxis * GetYaxis()
Definition: TH1.h:320
float xmax
Definition: THbookFile.cxx:93
void plot_logo(Float_t v_scale=1.0, Float_t skew=1.0)
Definition: tmvaglob.cxx:263
Double_t GetRMS(Int_t axis=1) const
Definition: TH1.h:315
TString DerivedPlotName
Definition: compareanapp.cxx:8
Float_t GetLeftMargin() const
Definition: TAttPad.h:54
The Canvas class.
Definition: TCanvas.h:48
double Double_t
Definition: RtypesCore.h:55
TLegendEntry * AddEntry(const TObject *obj, const char *label="", Option_t *option="lpf")
Add a new entry to this legend.
Definition: TLegend.cxx:280
Describe directory structure in memory.
Definition: TDirectory.h:41
Double_t GetXmax() const
Definition: TAxis.h:138
The TH1 histogram class.
Definition: TH1.h:80
HistType
Definition: Types.h:71
virtual TVirtualPad * GetPad(Int_t subpadnumber) const
Get a pointer to subpadnumber of this pad.
Definition: TPad.cxx:2774
virtual TObject * ReadObj()
To read a TObject* from the file.
Definition: TKey.cxx:727
Short_t Max(Short_t a, Short_t b)
Definition: TMathBase.h:202
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
Definition: TString.h:567
virtual void SetTitle(const char *title)
Change (i.e.
Definition: TH1.cxx:6268
void compareanapp(TString finAn="TMVA.root", TString finApp="TMVApp.root", HistType htype=kMVAType, bool useTMVAStyle=kTRUE)
virtual void Update()
Update canvas pad buffers.
Definition: TCanvas.cxx:2179
virtual Double_t GetMaximum(Double_t maxval=FLT_MAX) const
Return maximum value smaller than maxval of bins in the range, unless the value has been overridden b...
Definition: TH1.cxx:7921
const Bool_t kTRUE
Definition: Rtypes.h:91
virtual void SetTitle(const char *title="")
Change (i.e. set) the title of the TNamed.
Definition: TNamed.cxx:152
virtual void SetBorderSize(Int_t bordersize=4)
Definition: TPave.h:82
TAxis * GetXaxis()
Definition: TH1.h:319
virtual void SetLeftMargin(Float_t leftmargin)
Set Pad left margin in fraction of the pad width.
Definition: TAttPad.cxx:107
virtual void SetLogy(Int_t value=1)
Set Lin/Log scale for Y.
Definition: TPad.cxx:5318