6 #include "PlottingUtils/PlottingManager.h"
9 #pragma GCC diagnostic ignored "-Wfloat-conversion"
10 #pragma GCC diagnostic ignored "-Wconversion"
22 int originalErrorLevel = gErrorIgnoreLevel;
23 gErrorIgnoreLevel = kFatal;
24 auto ratioPlotSplit =
PlotMan->getOption<
double>(
"ratioPlotSplit");
27 LLHPad =
new TPad(
"LLHPad",
"LLHPad", 0.0, ratioPlotSplit, 1.0, 1.0);
28 LLHPad->SetBottomMargin(0.0);
29 ratioPad =
new TPad(
"ratioPad",
"ratioPad", 0.0, 0.0, 1.0, ratioPlotSplit);
30 ratioPad->SetTopMargin(0.0);
31 ratioPad->SetBottomMargin(0.3);
33 LLHPad =
new TPad(
"AllSampPad",
"AllSampPad", 0.0, 0.0, 1.0, 1.0);
34 ratioPad =
new TPad(
"AllSampRatioPad",
"AllSampRatioPad", 0.0, 0.0, 0.0, 0.0);
37 ratioPad->AppendPad();
38 gErrorIgnoreLevel = originalErrorLevel;
42 std::vector<float> &cumSums, std::vector<bool> &drawLabel,
43 THStack *sampleStack, TLegend *splitSamplesLegend,
44 float baselineLLH_main = 0.00001)
46 auto sampNames =
PlotMan->input().getTaggedSamples(
PlotMan->getOption<std::vector<std::string>>(
"sampleTags"));
47 size_t nSamples = sampNames.size();
49 cumSums.resize(nSamples);
50 drawLabel.resize(nSamples);
52 float LLH_main_integ = LLH_allSams.Integral();
54 int nBins = LLH_allSams.GetNbinsX();
56 MACH3LOG_DEBUG(
"getting split sample THStack for {} known samples", nSamples);
57 for (uint i = 0; i < nSamples; i++)
59 std::string sampName = sampNames[i];
64 new TH1D(
PlotMan->input().getSampleSpecificLLHScan_TH1D(fileIdx, parameterName, sampName));
65 LLH_indivSam->SetName(Form(
"%i_%s_%s", fileIdx, parameterName.c_str(), sampName.c_str()));
66 LLH_indivSam->SetBit(kCanDelete);
69 if (LLH_indivSam->GetNbinsX() == 1)
71 MACH3LOG_DEBUG(
" sample hist had only 1 bin - assuming it doesn't exist");
78 LLH_indivSam->SetStats(0);
79 LLH_indivSam->SetLineColor(TColor::GetColorPalette(
80 floor(
static_cast<float>(i) * TColor::GetNumberOfColors() /
static_cast<float>(nSamples))));
81 LLH_indivSam->SetFillColor(TColor::GetColorPalette(
82 floor(
static_cast<float>(i) * TColor::GetNumberOfColors() /
static_cast<float>(nSamples))));
83 sampleStack->Add(LLH_indivSam);
84 splitSamplesLegend->AddEntry(LLH_indivSam,
PlotMan->style().prettifySampleName(sampName).c_str(),
"lf");
86 float lastBinLLH = LLH_indivSam->GetBinContent(nBins);
89 MACH3LOG_DEBUG(
" Last bin LLH = {} :: cumulative LLH = {}", lastBinLLH, cumSum);
90 MACH3LOG_DEBUG(
" LLH fraction = {} / {} = {}", LLH_indivSam->Integral(), LLH_main_integ, LLH_indivSam->Integral() / LLH_main_integ);
93 auto sampleLabelThreshold =
PlotMan->getOption<
double>(
"sampleLabelThreshold");
95 if ((LLH_indivSam->Integral() / LLH_main_integ > sampleLabelThreshold) &&
96 (LLH_indivSam->Integral() / baselineLLH_main > sampleLabelThreshold))
100 drawLabel[i] =
false;
110 double stackMax = ratioCompStack->GetMaximum(
"NOSTACK");
111 double stackMin = ratioCompStack->GetMinimum(
"NOSTACK");
113 double stackLim = std::max(std::abs(1.0 - stackMax), std::abs(1.0 - stackMin));
114 auto yTitleOffset =
PlotMan->getOption<
double>(
"yTitleOffset");
115 auto ratioPlotSplit =
PlotMan->getOption<
double>(
"ratioPlotSplit");
117 auto ratioLabelScaling = (1.0 / ratioPlotSplit - 1.0);
119 ratioCompStack->SetMinimum(1.0 - 1.05 * stackLim);
120 ratioCompStack->SetMaximum(1.0 + 1.05 * stackLim);
123 ratioCompStack->Draw(Form(
"NOSTACK%s",
PlotMan->getDrawOptions().c_str()));
126 ratioCompStack->GetXaxis()->SetLabelSize(ratioLabelScaling *
127 ratioCompStack->GetXaxis()->GetLabelSize());
128 ratioCompStack->GetXaxis()->SetTitleSize(ratioLabelScaling *
129 ratioCompStack->GetXaxis()->GetLabelSize());
130 ratioCompStack->GetXaxis()->SetTitle(
"Parameter Variation");
132 ratioCompStack->GetYaxis()->SetLabelSize(ratioLabelScaling *
133 ratioCompStack->GetYaxis()->GetLabelSize());
134 ratioCompStack->GetYaxis()->SetTitleSize(ratioLabelScaling *
135 ratioCompStack->GetYaxis()->GetLabelSize());
136 ratioCompStack->GetYaxis()->SetTitleOffset(yTitleOffset);
137 ratioCompStack->GetYaxis()->SetNdivisions(5, 2, 0);
141 const std::string& LLHType,
142 const std::string& outputFileName,
143 const std::unique_ptr<TCanvas>& canv) {
145 auto compStack = std::make_unique<THStack>(
"LLH_Stack",
"");
146 auto ratioCompStack = std::make_unique<THStack>(
"LLH_Ratio_Stack",
"");
147 auto legend = std::make_unique<TLegend>(0.3, 0.6, 0.7, 0.8);
149 TPad* LLHPad =
nullptr;
150 TPad* ratioPad =
nullptr;
154 TH1D LLH_main =
PlotMan->input().getLLHScan_TH1D(0, paramName, LLHType);
155 LLH_main.SetStats(0);
157 LLH_main.SetLineColor(kBlack);
158 compStack->Add(&LLH_main);
159 legend->AddEntry(&LLH_main,
PlotMan->getFileLabel(0).c_str(),
"l");
161 int nBins = LLH_main.GetNbinsX();
162 int lineWidth =
PlotMan->getOption<
int>(
"lineWidth");
164 for (
unsigned int extraFileIdx = 1; extraFileIdx <
PlotMan->input().getNInputFiles(); extraFileIdx++)
166 int originalErrorLevel = gErrorIgnoreLevel;
167 gErrorIgnoreLevel = kFatal;
169 TH1D *compHist =
new TH1D(
PlotMan->input().getLLHScan_TH1D(extraFileIdx, paramName, LLHType));
170 compHist->SetName(Form(
"LLHScan_%s_%s_%d", paramName.c_str(), LLHType.c_str(), extraFileIdx));
171 compHist->SetBit(kCanDelete);
172 gErrorIgnoreLevel = originalErrorLevel;
173 if (compHist->GetNbinsX() == 0)
177 compHist->SetLineColor(
178 TColor::GetColorPalette(floor(
static_cast<float>(extraFileIdx) * TColor::GetNumberOfColors() /
179 static_cast<float>(
PlotMan->input().getNInputFiles()))));
180 compHist->SetLineStyle(2 + extraFileIdx % 9);
181 compHist->SetLineWidth(lineWidth);
183 TH1D *divHist =
static_cast<TH1D*
>(compHist->Clone(Form(
"RatioHist_%i", extraFileIdx)));
184 divHist->SetBit(kCanDelete);
189 divHist->Divide(compHist, &LLH_main);
190 ratioCompStack->Add(divHist);
194 compStack->Add(compHist);
195 legend->AddEntry(compHist,
PlotMan->getFileLabel(extraFileIdx).c_str(),
"l");
197 auto yTitleOffset =
PlotMan->getOption<
double>(
"yTitleOffset");
205 compStack->Draw(Form(
"NOSTACK%s",
PlotMan->getDrawOptions().c_str()));
207 compStack->GetXaxis()->SetTitle(
"Parameter Variation");
208 compStack->GetYaxis()->SetTitle(Form(
"-2LLH_{%s}", LLHType.c_str()));
209 compStack->SetTitle(
PlotMan->style().prettifyParamName(paramName).c_str());
210 compStack->GetYaxis()->SetTitleOffset(yTitleOffset);
225 TLine line = TLine();
226 line.SetLineColor(kBlack);
227 line.SetLineWidth(lineWidth);
228 line.DrawLine(LLH_main.GetBinLowEdge(1), 1.0, LLH_main.GetBinLowEdge(nBins + 1), 1.0);
232 canv->SaveAs(outputFileName.c_str());
238 const std::string& outputFileName,
239 const std::unique_ptr<TCanvas>& canv) {
242 TPad* LLHPad =
nullptr;
243 TPad* ratioPad =
nullptr;
248 canv->Divide(
PlotMan->getNFiles());
251 TH1D LLH_main =
PlotMan->input().getLLHScan_TH1D(0, paramName,
"sample");
252 if (LLH_main.GetNbinsX() == 1)
254 MACH3LOG_DEBUG(
" Main LLH had only 1 bin, assuming it doesn't exist");
258 auto baseSplitSamplesStack = std::make_unique<THStack>(
259 paramName.c_str(), Form(
"%s - %s", paramName.c_str(),
PlotMan->getFileLabel(0).c_str()));
261 auto baseSplitSamplesLegend = std::make_unique<TLegend>(0.37, 0.475, 0.63, 0.9);
264 canv->cd(1)->SetGrid();
268 canv->cd(1)->SetLeftMargin(0.15);
269 std::vector<float> cumSums;
270 std::vector<bool> drawLabel;
272 getSplitSampleStack(0, paramName, LLH_main, cumSums, drawLabel, baseSplitSamplesStack.get(),
273 baseSplitSamplesLegend.get());
274 baseSplitSamplesStack->Draw(
PlotMan->getDrawOptions().c_str());
276 baseSplitSamplesStack->GetYaxis()->SetTitle(
"-2LLH_{sam}");
277 if (
PlotMan->getPlotRatios() ==
false) baseSplitSamplesStack->GetXaxis()->SetTitle(
"Parameter Variation");
281 bool totalOnSplitPlots =
PlotMan->getOption<
bool>(
"totalOnSplitPlots");
282 if (totalOnSplitPlots)
284 LLH_main.SetLineWidth(1);
285 LLH_main.Draw(Form(
"same%s",
PlotMan->getDrawOptions().c_str()));
286 baseSplitSamplesLegend->AddEntry(&LLH_main,
"All Samples",
"l");
289 baseSplitSamplesLegend->Draw();
291 auto label = std::make_unique<TLatex>();
293 label->SetTextAlign(11);
294 label->SetTextAngle(-55);
295 label->SetTextSize(0.012);
296 const auto& SampleTags =
PlotMan->getOption<std::vector<std::string>>(
"sampleTags");
299 for (uint i = 0; i <
PlotMan->input().getTaggedSamples(SampleTags).size(); i++)
302 std::string sampName =
PlotMan->input().getTaggedSamples(SampleTags)[i];
310 label->DrawLatex(LLH_main.GetBinLowEdge(LLH_main.GetNbinsX() + 1), cumSums[i],
311 Form(
"#leftarrow%s",
PlotMan->style().prettifySampleName(sampName).c_str()));
316 for (
unsigned int extraFileIdx = 1; extraFileIdx <
PlotMan->getNFiles(); extraFileIdx++)
318 MACH3LOG_DEBUG(
" - Adding plot for additional file {}", extraFileIdx);
319 canv->cd(1 + extraFileIdx);
321 std::vector<float> extraCumSums;
322 std::vector<bool> extraDrawLabel;
324 THStack *splitSamplesStack =
325 new THStack(paramName.c_str(),
326 Form(
"%s - %s", paramName.c_str(),
PlotMan->getFileLabel(extraFileIdx).c_str()));
328 auto splitSamplesLegend = std::make_unique<TLegend>(0.37, 0.475, 0.63, 0.9);
329 splitSamplesStack->SetBit(kCanDelete);
330 splitSamplesLegend->SetBit(kCanDelete);
332 int originalErrorLevel = gErrorIgnoreLevel;
333 gErrorIgnoreLevel = kFatal;
334 TH1D compLLH_main =
PlotMan->input().getLLHScan_TH1D(extraFileIdx, paramName,
"sample");
335 compLLH_main.SetName((compLLH_main.GetName() + std::string(
"_file_") + extraFileIdx).Data());
336 gErrorIgnoreLevel = originalErrorLevel;
337 if (compLLH_main.GetNbinsX() == 1)
339 delete splitSamplesStack;
342 bool sameAxis =
PlotMan->getOption<
bool>(
"sameAxis");
348 splitSamplesStack, splitSamplesLegend.get(), LLH_main.Integral());
351 splitSamplesStack, splitSamplesLegend.get());
359 splitSamplesStack->Draw(
PlotMan->getDrawOptions().c_str());
361 splitSamplesStack->SetMaximum(baseSplitSamplesStack->GetMaximum());
363 if (totalOnSplitPlots)
365 compLLH_main.Draw(Form(
"same%s",
PlotMan->getDrawOptions().c_str()));
366 compLLH_main.SetLineColor(kBlack);
367 splitSamplesLegend->AddEntry(&compLLH_main,
"All Samples",
"l");
369 splitSamplesLegend->Draw();
372 baseSplitSamplesStack->GetYaxis()->SetTitle(
"-2LLH_{sam}");
373 if (
PlotMan->getPlotRatios() ==
false) baseSplitSamplesStack->GetXaxis()->SetTitle(
"Parameter Variation");
378 for (uint i = 0; i <
PlotMan->input().getTaggedSamples(
PlotMan->getOption<std::vector<std::string>>(
"sampleTags")).size(); i++)
380 std::string sampName =
PlotMan->input().getTaggedSamples(
PlotMan->getOption<std::vector<std::string>>(
"sampleTags"))[i];
383 label->DrawLatex(compLLH_main.GetBinLowEdge(compLLH_main.GetNbinsX() + 1), extraCumSums[i],
384 Form(
"#leftarrow%s",
PlotMan->style().prettifySampleName(sampName).c_str()));
389 THStack *splitSamplesStackRatios =
new THStack(paramName.c_str(),
"");
391 TList *baselineHistList = baseSplitSamplesStack->GetHists();
392 TList *compHistList = splitSamplesStack->GetHists();
393 for (uint sampleIdx = 0; sampleIdx <
PlotMan->input().getTaggedSamples(
PlotMan->getOption<std::vector<std::string>>(
"sampleTags")).size(); sampleIdx++)
395 TH1D *divHist =
new TH1D(
396 Form(
"%s_%s_splitDiv_%i", paramName.c_str(),
PlotMan->getFileLabel(extraFileIdx).c_str(),
398 Form(
"%s_%s_splitDiv", paramName.c_str(),
PlotMan->getFileLabel(extraFileIdx).c_str()),
399 compLLH_main.GetNbinsX(), compLLH_main.GetBinLowEdge(1),
400 compLLH_main.GetBinLowEdge(compLLH_main.GetNbinsX() + 1));
401 divHist->Divide(
static_cast<TH1D*
>(compHistList->At(sampleIdx)),
402 static_cast<TH1D*
>(baselineHistList->At(sampleIdx)));
403 splitSamplesStackRatios->Add(divHist);
404 divHist->SetLineColor((
static_cast<TH1D*
>(compHistList->At(sampleIdx))->GetLineColor()));
407 canv->cd(2 + extraFileIdx);
415 canv->SaveAs(outputFileName.c_str());
421 PlotMan->style().setPalette(
PlotMan->getOption<std::string>(
"colorPalette"));
424 auto canv = std::make_unique<TCanvas>(
"canv",
"", 1024, 1024);
425 gStyle->SetOptTitle(2);
427 auto splitSamplesCanv = std::make_unique<TCanvas>(
"splitSampCanv",
"", 4096 *
PlotMan->getNFiles(), 4096);
429 canv->SaveAs((
PlotMan->getOutputName(
"_Sample") +
"[").c_str());
430 canv->SaveAs((
PlotMan->getOutputName(
"_Penalty") +
"[").c_str());
431 canv->SaveAs((
PlotMan->getOutputName(
"_Total") +
"[").c_str());
433 if (
PlotMan->getSplitBySample())
434 canv->SaveAs((
PlotMan->getOutputName(
"_bySample") +
"[").c_str());
437 for (
const std::string& par :
PlotMan->getOption<std::vector<std::string>>(
"parameterTags")){
438 params += par +
", ";
442 for (std::string paramName :
PlotMan->input().getTaggedParameters(
PlotMan->getOption<std::vector<std::string>>(
"parameterTags")))
454 if (
PlotMan->getSplitBySample())
460 canv->SaveAs((
PlotMan->getOutputName(
"_Sample") +
"]").c_str());
461 canv->SaveAs((
PlotMan->getOutputName(
"_Penalty") +
"]").c_str());
462 canv->SaveAs((
PlotMan->getOutputName(
"_Total") +
"]").c_str());
463 if (
PlotMan->getSplitBySample())
464 canv->SaveAs((
PlotMan->getOutputName(
"_bySample") +
"]").c_str());
471 int main(
int argc,
char **argv) {
475 PlotMan =
new M3::Plotting::PlottingManager();
476 PlotMan->parseInputs(argc, argv);
479 if(
PlotMan->getPlotRatios() &&
PlotMan->input().getNInputFiles() == 1){
void SetMaCh3LoggerFormat()
Set messaging format of the logger.
void drawRatioStack(THStack *ratioCompStack)
int main(int argc, char **argv)
void SetTPads(TPad *&LLHPad, TPad *&ratioPad)
TPad is SUPER FRAGILE, it is safer to just make raw pointer, while ROOT behave weirdly with smart poi...
void getSplitSampleStack(int fileIdx, const std::string ¶meterName, const TH1D &LLH_allSams, std::vector< float > &cumSums, std::vector< bool > &drawLabel, THStack *sampleStack, TLegend *splitSamplesLegend, float baselineLLH_main=0.00001)
void makeSplitSampleLLHScanComparisons(const std::string ¶mName, const std::string &outputFileName, const std::unique_ptr< TCanvas > &canv)
void makeLLHScanComparisons(const std::string ¶mName, const std::string &LLHType, const std::string &outputFileName, const std::unique_ptr< TCanvas > &canv)
M3::Plotting::PlottingManager * PlotMan
Custom exception class used throughout MaCh3.
void MaCh3Welcome()
KS: Prints welcome message with MaCh3 logo.