/* * makeMVACompareGraphs.C * * Created on: Nov 13, 2018 * Author: John Russell * * The purpose of this macro is to systematically create efficiency curves, * formatted for comparative purposes to sample PDFs. */ void produceMVAGraphs(TString MVAType, int polIdx) { int numBinsX = 10000; // The TH1D objects produced by TMVA appear to consistently have 10000 bins. gStyle -> SetOptStat(0); // Values pulled from "tmva/src/ROCCalc.cxx". int FillStyle__S = 1001; int FillColor__S = TColor::GetColor("#7d99d1"); int LineColor__S = TColor::GetColor("#0000ee"); int FillStyle__B = 3554; int FillColor__B = TColor::GetColor("#ff0000"); int LineColor__B = TColor::GetColor("#ff0000"); int ww = 600; // Canvas width. int wh = int(0.78 * ww); // Canvas height. TString filePath = MVAType + "Results/KL" + MVAType + "UpdateReduced.root"; TFile TMVAFile(filePath); // Shortcuts for repeated TStrings. TString pol = polIdx ? "v" : "h"; // Assign polarity TString associated with integer index (0 = "h", 1 = "v"). TString method = pol + "PolSignalUnblinded" + MVAType; TString MVAMethod = "MVA_" + method; // Create canvases for hPol plots. TCanvas cEffBAndS("cEffBandS", "Canvas for " + method + "_EffBandS.", 200, 0, ww, wh); TCanvas cEffBvsS("cEffBvsS", "Canvas for " + method + "_EffBvsS.", 200, 0, ww, wh); TCanvas cRejBAndS("cRejBandS", "Canvas for " + method + "_RejBandS.", 200, 0, ww, wh); TCanvas cRejBvsS("cRejBvsS", "Canvas for " + method + "_RejBvsS.", 200, 0, ww, wh); // Move into directory containing plots of given polarization. gDirectory -> cd(MVAType + "Results/Method_" + method + "/" + method); // Draw "effBAndS" canvas. TH1D * signalUnblinded_effS = (TH1D *) gDirectory -> Get(MVAMethod + "_effS"); signalUnblinded_effS -> SetFillStyle(FillStyle__S); signalUnblinded_effS -> SetFillColor(FillColor__S); signalUnblinded_effS -> SetLineColor(LineColor__S); signalUnblinded_effS -> SetLineWidth(1); // signalUnblinded_effS -> SetAxisRange(1e-8, 1, "y"); signalUnblinded_effS -> SetTitle(MVAMethod); signalUnblinded_effS -> GetYaxis() -> SetTitleOffset(1.2); TH1D * signalUnblinded_effB = (TH1D *) gDirectory -> Get(MVAMethod + "_effB"); signalUnblinded_effB -> SetFillStyle(FillStyle__B); signalUnblinded_effB -> SetFillColor(FillColor__B); signalUnblinded_effB -> SetLineColor(LineColor__B); signalUnblinded_effB -> SetLineWidth(1); TH1D * signalUnblinded_trainingEffS = (TH1D *) gDirectory -> Get(MVAMethod + "_trainingEffS"); signalUnblinded_trainingEffS -> SetMarkerSize(0.7); signalUnblinded_trainingEffS -> SetMarkerStyle(20); signalUnblinded_trainingEffS -> SetMarkerColor(LineColor__S); signalUnblinded_trainingEffS -> SetLineColor(LineColor__S); signalUnblinded_trainingEffS -> SetLineWidth(1); TH1D * signalUnblinded_trainingEffB = (TH1D *) gDirectory -> Get(MVAMethod + "_trainingEffB"); signalUnblinded_trainingEffB -> SetMarkerSize(0.7); signalUnblinded_trainingEffB -> SetMarkerStyle(20); signalUnblinded_trainingEffB -> SetMarkerColor(LineColor__B); signalUnblinded_trainingEffB -> SetLineColor(LineColor__B); signalUnblinded_trainingEffB -> SetLineWidth(1); TLegend effLegend1(cEffBAndS.GetLeftMargin(), 1 - cEffBAndS.GetTopMargin() - 0.12, cEffBAndS.GetLeftMargin() + 0.40, 1 - cEffBAndS.GetTopMargin()); effLegend1.SetFillStyle(1); effLegend1.SetBorderSize(1); effLegend1.AddEntry(signalUnblinded_effS, "Signal efficiency", "F"); effLegend1.AddEntry(signalUnblinded_effB, "Background rejection", "F"); effLegend1.SetMargin(0.2); TLegend effLegend2(1 - cEffBAndS.GetRightMargin() - 0.42, 1 - cEffBAndS.GetTopMargin() - 0.12, 1 - cEffBAndS.GetRightMargin(), 1 - cEffBAndS.GetTopMargin()); effLegend2.SetFillStyle(1); effLegend2.SetBorderSize(1); effLegend2.AddEntry(signalUnblinded_trainingEffS, "Signal (training sample)","P"); effLegend2.AddEntry(signalUnblinded_trainingEffB, "Background (training sample)","P"); effLegend2.SetMargin(0.1); // Set up a "frame" for the background efficiency, as done in tmva/tmvagui/src/mvas.cxx. float nrms = 10; float effXMin = TMath::Max(TMath::Min(signalUnblinded_effS -> GetMean() - nrms * signalUnblinded_effS -> GetRMS(), signalUnblinded_effB -> GetMean() - nrms * signalUnblinded_effB -> GetRMS()), signalUnblinded_effS -> GetXaxis() -> GetXmin()); float effXMax = TMath::Min(TMath::Max(signalUnblinded_effS -> GetMean() + nrms * signalUnblinded_effS -> GetRMS(), signalUnblinded_effB -> GetMean() + nrms * signalUnblinded_effB -> GetRMS()), signalUnblinded_effS -> GetXaxis() -> GetXmax()); float yMin = 1e-8; // float yMin = 0; float maxMult = 1.3; float effYMax = TMATH::Max(signalUnblinded_effS -> GetMaximum(), signalUnblinded_effB -> GetMaximum()) * maxMult; int nb = 500; TH2F effFrame("effFrame", signalUnblinded_effS -> GetTitle(), nb, effXMin, effXMax, nb, yMin, effYMax); cEffBAndS.cd(); cEffBAndS.GetPad(0) -> SetLeftMargin(0.105); cEffBAndS.SetLogy(); effFrame.Draw(); effLegend1.Draw("same"); effLegend2.Draw("same"); signalUnblinded_effS -> Draw("samehist"); signalUnblinded_effB -> Draw("samehist"); signalUnblinded_trainingEffS -> Draw("e1same"); signalUnblinded_trainingEffB -> Draw("e1same"); effFrame.Draw("sameaxis"); // Redraw axes. cEffBAndS.SaveAs(MVAType + "Results/" + MVAType + "_" + pol + "PolSignalUnblinded_effBAndS.png"); // Draw "effBvsS" canvas. TH1D * signalUnblinded_effBvsS = (TH1D *) gDirectory -> Get(MVAMethod + "_effBvsS"); signalUnblinded_effBvsS -> SetFillStyle(FillStyle__B); signalUnblinded_effBvsS -> SetFillColor(LineColor__S); signalUnblinded_effBvsS -> SetLineColor(LineColor__S); signalUnblinded_effBvsS -> SetLineWidth(1); // signalUnblinded_effBvsS -> SetAxisRange(1e-8, 1, "x"); // signalUnblinded_effBvsS -> SetAxisRange(1e-8, 1, "y"); signalUnblinded_effBvsS -> GetYaxis() -> SetTitleOffset(1.2); TH1D * signalUnblinded_trainingEffBvsS = (TH1D *) gDirectory -> Get(MVAMethod + "_trainingEffBvsS"); signalUnblinded_trainingEffBvsS -> SetMarkerSize(0.7); signalUnblinded_trainingEffBvsS -> SetMarkerStyle(20); signalUnblinded_trainingEffBvsS -> SetMarkerColor(LineColor__S); signalUnblinded_trainingEffBvsS -> SetLineColor(LineColor__S); signalUnblinded_trainingEffBvsS -> SetLineWidth(1); TLegend effROCLegend(cEffBvsS.GetLeftMargin(), 1 - cEffBvsS.GetTopMargin() - 0.12, cEffBvsS.GetLeftMargin() + 0.40, 1 - cEffBvsS.GetTopMargin()); effROCLegend.SetFillStyle(1); effROCLegend.SetBorderSize(1); effROCLegend.AddEntry(signalUnblinded_effBvsS, "Background efficiency", "F"); effROCLegend.AddEntry(signalUnblinded_trainingEffBvsS, "Background (training sample)", "P"); effROCLegend.SetMargin(0.2); cEffBvsS.cd(); cEffBvsS.GetPad(0) -> SetLeftMargin(0.105); cEffBvsS.SetLogx(); cEffBvsS.SetLogy(); signalUnblinded_effBvsS -> Draw(); signalUnblinded_trainingEffBvsS -> Draw("same"); effROCLegend.Draw("same"); cEffBvsS.SaveAs(MVAType + "Results/" + MVAType + "_" + pol + "PolSignalUnblinded_effBvsS.png"); // Draw "rejBAndS" canvas. TH1D * signalUnblinded_rejB = (TH1D *) signalUnblinded_effB -> Clone(MVAMethod + "_rejB"); signalUnblinded_rejB -> Scale(-1); for (int binX = 1; binX <= numBinsX; ++binX) signalUnblinded_rejB -> AddBinContent(binX); signalUnblinded_rejB -> SetFillStyle(FillStyle__B); signalUnblinded_rejB -> SetFillColor(FillColor__B); signalUnblinded_rejB -> SetLineColor(LineColor__B); signalUnblinded_rejB -> SetLineWidth(1); TH1D * signalUnblinded_trainingRejB = (TH1D *) signalUnblinded_trainingEffB -> Clone(MVAMethod + "_trainingRejB"); signalUnblinded_trainingRejB -> Scale(-1); for (int binX = 1; binX <= numBinsX; ++binX) signalUnblinded_trainingRejB -> AddBinContent(binX); signalUnblinded_trainingRejB -> SetMarkerSize(0.7); signalUnblinded_trainingRejB -> SetMarkerStyle(20); signalUnblinded_trainingRejB -> SetMarkerColor(LineColor__B); signalUnblinded_trainingRejB -> SetLineColor(LineColor__B); signalUnblinded_trainingRejB -> SetLineWidth(1); TLegend rejLegend1(cRejBAndS.GetLeftMargin(), 1 - cRejBAndS.GetTopMargin() - 0.12, cRejBAndS.GetLeftMargin() + 0.40, 1 - cRejBAndS.GetTopMargin()); rejLegend1.SetFillStyle(1); rejLegend1.SetBorderSize(1); rejLegend1.AddEntry(signalUnblinded_effS, "Signal efficiency", "F"); rejLegend1.AddEntry(signalUnblinded_rejB, "Background rejection", "F"); rejLegend1.SetMargin(0.2); TLegend rejLegend2(1 - cRejBAndS.GetRightMargin() - 0.42, 1 - cRejBAndS.GetTopMargin() - 0.12, 1 - cRejBAndS.GetRightMargin(), 1 - cRejBAndS.GetTopMargin()); rejLegend2.SetFillStyle(1); rejLegend2.SetBorderSize(1); rejLegend2.AddEntry(signalUnblinded_trainingEffS, "Signal (training sample)","P"); rejLegend2.AddEntry(signalUnblinded_trainingRejB, "Background (training sample)","P"); rejLegend2.SetMargin(0.1); // Set up a "frame" for the background rejection, as done in tmva/tmvagui/src/mvas.cxx. float rejXMin = TMath::Max(TMath::Min(signalUnblinded_effS -> GetMean() - nrms * signalUnblinded_effS -> GetRMS(), signalUnblinded_rejB -> GetMean() - nrms * signalUnblinded_rejB -> GetRMS()), signalUnblinded_effS -> GetXaxis() -> GetXmin()); float rejXMax = TMath::Min(TMath::Max(signalUnblinded_effS -> GetMean() + nrms * signalUnblinded_effS -> GetRMS(), signalUnblinded_rejB -> GetMean() + nrms * signalUnblinded_rejB -> GetRMS()), signalUnblinded_effS -> GetXaxis() -> GetXmax()); float rejYMax = TMATH::Max(signalUnblinded_effS -> GetMaximum(), signalUnblinded_rejB -> GetMaximum()) * maxMult; TH2F rejFrame("rejFrame", signalUnblinded_effS -> GetTitle(), nb, rejXMin, rejXMax, nb, yMin, rejYMax); cRejBAndS.cd(); cRejBAndS.GetPad(0) -> SetLeftMargin(0.105); cRejBAndS.SetLogy(); rejFrame.Draw(); signalUnblinded_effS -> Draw("same"); signalUnblinded_rejB -> Draw("same"); signalUnblinded_trainingEffS -> Draw("e1same"); signalUnblinded_trainingRejB -> Draw("e1same"); rejLegend1.Draw("same"); rejLegend2.Draw("same"); rejFrame.Draw("sameaxis"); cRejBAndS.SaveAs(MVAType + "Results/" + MVAType + "_" + pol + "PolSignalUnblinded_rejBAndS.png"); // Draw "rejBvsS" canvas. TH1D * signalUnblinded_rejBvsS = (TH1D *) gDirectory -> Get(MVAMethod + "_rejBvsS"); signalUnblinded_rejBvsS -> SetFillStyle(FillStyle__B); signalUnblinded_rejBvsS -> SetFillColor(LineColor__S); signalUnblinded_rejBvsS -> SetLineColor(LineColor__S); signalUnblinded_rejBvsS -> SetLineWidth(1); // signalUnblinded_rejBvsS -> SetAxisRange(1e-8, 1, "x"); // signalUnblinded_rejBvsS -> SetAxisRange(1e-8, 1, "y"); signalUnblinded_rejBvsS -> GetYaxis() -> SetTitleOffset(1.2); TH1D * signalUnblinded_trainingRejBvsS = (TH1D *) gDirectory -> Get(MVAMethod + "_trainingRejBvsS"); signalUnblinded_trainingRejBvsS -> SetMarkerSize(0.7); signalUnblinded_trainingRejBvsS -> SetMarkerStyle(20); signalUnblinded_trainingRejBvsS -> SetMarkerColor(LineColor__S); signalUnblinded_trainingRejBvsS -> SetLineColor(LineColor__S); signalUnblinded_trainingRejBvsS -> SetLineWidth(1); TLegend rejROCLegend(cRejBvsS.GetLeftMargin(), 1 - cRejBvsS.GetTopMargin() - 0.12, cRejBvsS.GetLeftMargin() + 0.40, 1 - cRejBvsS.GetTopMargin()); rejROCLegend.SetFillStyle(1); rejROCLegend.SetBorderSize(1); rejROCLegend.AddEntry(signalUnblinded_rejBvsS, "Background rejection", "F"); rejROCLegend.AddEntry(signalUnblinded_trainingRejBvsS, "Background (training sample)", "P"); rejROCLegend.SetMargin(0.2); cRejBvsS.cd(); cRejBvsS.GetPad(0) -> SetLeftMargin(0.105); cRejBvsS.SetLogx(); cRejBvsS.SetLogy(); signalUnblinded_rejBvsS -> Draw(); signalUnblinded_trainingRejBvsS -> Draw("same"); rejROCLegend.Draw("same"); cRejBvsS.SaveAs(MVAType + "Results/" + MVAType + "_" + pol + "PolSignalUnblinded_rejBvsS.png"); // Close the file. TMVAFile.Close(); } void makeMVACompareGraphs() { produceMVAGraphs("FisherIdeal", 0); produceMVAGraphs("FisherIdeal", 1); produceMVAGraphs("Fisher", 0); produceMVAGraphs("Fisher", 1); produceMVAGraphs("BDT", 0); produceMVAGraphs("BDT", 1); }