probas.C
#include "tmvaglob.C"
// this macro plots the MVA probability distributions (Signal and
// Background overlayed) of different MVA methods run in TMVA
// (e.g. running TMVAnalysis.C).
// input: - Input file (result from TMVA)
// - use of TMVA plotting TStyle
void probas( TString fin = "TMVA.root", Bool_t useTMVAStyle = kTRUE )
{
// set style and remove existing canvas'
TMVAGlob::Initialize( useTMVAStyle );
// switches
const Bool_t Draw_CFANN_Logy = kFALSE;
const Bool_t Save_Images = kTRUE;
// checks if file with name "fin" is already open, and if not opens one
TFile* file = TMVAGlob::OpenFile( fin );
// define Canvas layout here!
Int_t xPad = 1; // no of plots in x
Int_t yPad = 1; // no of plots in y
Int_t noPad = xPad * yPad ;
const Int_t width = 600; // size of canvas
// this defines how many canvases we need
TCanvas *c = 0;
// counter variables
Int_t countCanvas = 0;
// list of existing MVAs
const Int_t nveto = 1;
TString suffixSig = "_tr_S";
TString suffixBgd = "_tr_B";
// search for the right histograms in full list of keys
TList methods;
UInt_t nmethods = TMVAGlob::GetListOfMethods( methods );
if (nmethods==0) {
cout << "--- Probas.C: no methods found!" << endl;
return;
}
TIter next(&methods);
TKey *key, *hkey;
char fname[200];
TH1* sig(0);
TH1* bgd(0);
while ((key = (TKey*)next())) {
TDirectory * mDir = (TDirectory*)key->ReadObj();
TList titles;
UInt_t ni = TMVAGlob::GetListOfTitles( mDir, titles );
TString methodName;
TMVAGlob::GetMethodName(methodName,key);
if (ni==0) {
cout << "+++ No titles found for classifier: " << methodName << endl;
return;
}
TIter nextTitle(&titles);
TKey *instkey;
TDirectory *instDir;
// iterate over all classifiers
while ((instkey = (TKey *)nextTitle())) {
instDir = (TDirectory *)instkey->ReadObj();
TString instName = instkey->GetName();
TList h1hists;
UInt_t nhists = TMVAGlob::GetListOfKeys( h1hists, "TH1", instDir );
if (nhists==0) cout << "*** No histograms found!" << endl;
TIter nextInDir(&h1hists);
TString methodTitle;
TMVAGlob::GetMethodTitle(methodTitle,instDir);
Bool_t found = kFALSE;
while (hkey = (TKey*)nextInDir()) {
TH1 *th1 = (TH1*)hkey->ReadObj();
TString hname= th1->GetName();
if (hname.Contains( suffixSig ) && !hname.Contains( "Cut") &&
!hname.Contains("original") && !hname.Contains("smoothed")) {
// retrieve corresponding signal and background histograms
TString hnameS = hname;
TString hnameB = hname; hnameB.ReplaceAll("_S","_B");
sig = (TH1*)instDir->Get( hnameS );
bgd = (TH1*)instDir->Get( hnameB );
if (sig == 0 || bgd == 0) {
cout << "*** probas.C: big troubles in probas.... histogram: " << hname << " not found" << endl;
return;
}
TH1* sigF(0);
TH1* bkgF(0);
for (int i=0; i<= 5; i++) {
TString hspline = hnameS + Form("_smoothed_hist_from_spline%i",i);
sigF = (TH1*)instDir->Get( hspline );
if (sigF) {
bkgF = (TH1*)instDir->Get( hspline.ReplaceAll("_tr_S","_tr_B") );
break;
}
}
if (!sigF){
TString hspline = hnameS + TString("_smoothed_hist_from_KDE");
sigF = (TH1*)instDir->Get( hspline );
if (sigF) {
bkgF = (TH1*)instDir->Get( hspline.ReplaceAll("_tr_S","_tr_B") );
}
}
if ((sigF == NULL || bkgF == NULL) &&!hname.Contains("hist") ) {
cout << "*** probas.C: big troubles - did not find probability histograms" << endl;
return;
}
else {
// remove the signal suffix
// check that exist
if (NULL != sigF && NULL != bkgF && NULL!=sig && NULL!=bgd) {
TString hname = sig->GetName();
found = kTRUE;
// chop off useless stuff
sig->SetTitle( TString("TMVA output for classifier: ") + methodTitle );
// create new canvas
cout << "--- Book canvas no: " << countCanvas << endl;
char cn[20];
sprintf( cn, "canvas%d", countCanvas+1 );
c = new TCanvas( cn, Form("TMVA Output Fit Variables %s",methodTitle.Data()),
countCanvas*50+200, countCanvas*20, width, width*0.78 );
// set the histogram style
TMVAGlob::SetSignalAndBackgroundStyle( sig, bgd );
TMVAGlob::SetSignalAndBackgroundStyle( sigF, bkgF );
// frame limits (choose judicuous x range)
Float_t nrms = 4;
Float_t xmin = TMath::Max( TMath::Min(sig->GetMean() - nrms*sig->GetRMS(),
bgd->GetMean() - nrms*bgd->GetRMS() ),
sig->GetXaxis()->GetXmin() );
Float_t xmax = TMath::Min( TMath::Max(sig->GetMean() + nrms*sig->GetRMS(),
bgd->GetMean() + nrms*bgd->GetRMS() ),
sig->GetXaxis()->GetXmax() );
Float_t ymin = 0;
Float_t ymax = TMath::Max( sig->GetMaximum(), bgd->GetMaximum() )*1.5;
if (Draw_CFANN_Logy && mvaName[imva] == "CFANN") ymin = 0.01;
// build a frame
Int_t nb = 500;
TH2F* frame = new TH2F( TString("frame") + sig->GetName() + "_proba", sig->GetTitle(),
nb, xmin, xmax, nb, ymin, ymax );
frame->GetXaxis()->SetTitle(methodTitle);
frame->GetYaxis()->SetTitle("Normalized");
TMVAGlob::SetFrameStyle( frame );
// eventually: draw the frame
frame->Draw();
if (Draw_CFANN_Logy && mvaName[imva] == "CFANN") c->SetLogy();
// overlay signal and background histograms
sig->SetMarkerColor( TMVAGlob::c_SignalLine );
sig->SetMarkerSize( 0.7 );
sig->SetMarkerStyle( 20 );
sig->SetLineWidth(1);
bgd->SetMarkerColor( TMVAGlob::c_BackgroundLine );
bgd->SetMarkerSize( 0.7 );
bgd->SetMarkerStyle( 24 );
bgd->SetLineWidth(1);
sig->Draw("samee");
bgd->Draw("samee");
sigF->SetFillStyle( 0 );
bkgF->SetFillStyle( 0 );
sigF->Draw("samehist");
bkgF->Draw("samehist");
// redraw axes
frame->Draw("sameaxis");
// Draw legend
TLegend *legend= new TLegend( c->GetLeftMargin(), 1 - c->GetTopMargin() - 0.2,
c->GetLeftMargin() + 0.4, 1 - c->GetTopMargin() );
legend->AddEntry(sig,"Signal data","P");
legend->AddEntry(sigF,"Signal PDF","L");
legend->AddEntry(bgd,"Background data","P");
legend->AddEntry(bkgF,"Background PDF","L");
legend->Draw("same");
legend->SetBorderSize(1);
legend->SetMargin( 0.3 );
// save canvas to file
c->Update();
TMVAGlob::plot_logo();
sprintf( fname, "plots/mva_pdf_%s_c%i", methodTitle.Data(), countCanvas+1 );
if (Save_Images) TMVAGlob::imgconv( c, fname );
countCanvas++;
}
}
}
}
if(!found){
cout << "--- No PDFs found for method " << methodTitle << ". Did you request \"CreateMVAPdfs\" in the option string?" << endl;
}
}
}
}