2 #include "PlottingUtils/PlottingUtils.h"
3 #include "PlottingUtils/PlottingManager.h"
7 #pragma GCC diagnostic ignored "-Wfloat-conversion"
8 #pragma GCC diagnostic ignored "-Wconversion"
15 M3::Plotting::PlottingManager*
PlotMan =
nullptr;
19 TFile *file =
M3::Open(File,
"READ", __FILE__, __LINE__);
20 TDirectoryFile *PredicitveDir = file->Get<TDirectoryFile>(
"Predictive");
22 std::vector<std::string> SampleNames;
24 TIter next(PredicitveDir->GetListOfKeys());
28 while ((key =
static_cast<TKey*
>(next()))) {
30 auto classname = std::string(key->GetClassName());
31 auto dirname = std::string(key->GetName());
33 if (classname !=
"TDirectoryFile")
continue;
34 dirname = std::string(key->GetName());
36 if(dirname ==
"Total")
continue;
37 if(dirname ==
"BetaParameters")
continue;
38 if(dirname ==
"Correlations")
continue;
40 SampleNames.push_back(dirname);
49 std::vector<int>
FindDimensions(
const std::string& File,
const std::vector<std::string>& Samples)
51 TFile *file =
M3::Open(File,
"READ", __FILE__, __LINE__);
52 TDirectoryFile *PredicitveDir = file->Get<TDirectoryFile>(
"Predictive");
54 std::vector<int> SampleDimension;
55 for (
const auto& sample : Samples)
58 TDirectoryFile* SampleDir = PredicitveDir->Get<TDirectoryFile>(sample.c_str());
65 std::string histName = fmt::format(
"{}_mc_dim{}", sample, Dimension);
67 TH2D* hist = SampleDir->Get<TH2D>(histName.c_str());
74 SampleDimension.push_back(Dimension);
80 return SampleDimension;
84 std::vector<std::vector<std::string>>
FindModes(
const std::string& File,
85 const std::vector<std::string>& SampleNames)
87 TFile *file =
M3::Open(File,
"READ", __FILE__, __LINE__);
88 TDirectoryFile *PredictiveDir = file->Get<TDirectoryFile>(
"Predictive");
90 std::vector<std::vector<std::string>> ModeNames(SampleNames.size());
92 for(
size_t iSample = 0; iSample < SampleNames.size(); iSample++)
94 TDirectoryFile* SampleDir = PredictiveDir->Get<TDirectoryFile>(SampleNames[iSample].c_str());
95 if(!SampleDir)
continue;
97 TDirectoryFile* ByModeDir = SampleDir->Get<TDirectoryFile>(
"ByMode");
98 if(!ByModeDir)
continue;
101 TIter next(ByModeDir->GetListOfKeys());
104 while ((key =
static_cast<TKey*
>(next())))
106 TObject* obj = key->ReadObj();
107 if (!obj->InheritsFrom(
"TH1"))
continue;
109 std::string histName = obj->GetName();
112 std::string prefix = SampleNames[iSample] +
"_";
113 std::string suffix =
"_dim0";
115 if (histName.find(prefix) == 0 &&
116 histName.rfind(suffix) == histName.size() - suffix.size())
118 std::string Mode = histName.substr(prefix.size(),
119 histName.size() - prefix.size() - suffix.size());
120 MACH3LOG_DEBUG(
"Found mode '{}' for sample {}", Mode, SampleNames[iSample]);
121 ModeNames[iSample].push_back(Mode);
134 Hist->SetTitle(
PlotMan->style().prettifySampleName(SampleName).c_str());
135 auto BinWidthScale =
PlotMan->style().getBinWidthScale(Hist->GetXaxis()->GetTitle());
136 auto PrettyX =
PlotMan->style().prettifyKinematicName(Hist->GetXaxis()->GetTitle());
137 Hist->GetXaxis()->SetTitle(PrettyX.c_str());
138 Hist->GetYaxis()->SetTitle(fmt::format(
"Events/{:.0f}", BinWidthScale).c_str());
145 std::string TempTile = hist->GetTitle();
146 std::string temp =
"=";
148 std::string::size_type SizeType = TempTile.find(temp);
149 TempTile.erase(0, SizeType+1);
150 pvalue = atof(TempTile.c_str());
155 const std::vector<TFile*>& InputFiles,
156 const std::vector<std::string>& SampleNames)
159 auto Titles = Get<std::vector<std::string>>(Settings[
"FileTitle"], __FILE__, __LINE__);
160 std::vector<std::vector<double>> FlucDrawVec(InputFiles.size());
162 std::string FlucutationType =
"_predfluc_draw";
164 std::cout<<
"\\begin{table}[htb]"<<std::endl;
165 std::cout<<
"\\centering"<<std::endl;
166 std::cout<<
"\\begin{tabular}{ | l | ";
168 for(
unsigned int f = 0; f < InputFiles.size(); f++)
173 std::cout<<
"} \\hline"<<std::endl;
174 std::cout<<
"Sample ";
175 for(
unsigned int f = 0; f < InputFiles.size(); f++)
177 std::cout<<
"& \\multicolumn{1}{| c |}{" + Titles[f] +
" p-value} ";
179 std::cout<<
"\\\\"<<std::endl;
180 for(
unsigned int f = 0; f < InputFiles.size(); f++)
182 std::cout<<
" & Fluctuation of Prediction ";
184 std::cout<<
"\\\\ \\hline"<<std::endl;
185 for(
unsigned int i = 0; i < SampleNames.size(); i++)
187 std::cout<<SampleNames[i];
188 for(
unsigned int f = 0; f < InputFiles.size(); f++)
190 std::string TempString =
"Predictive/" + SampleNames[i]+
"/"+SampleNames[i] + FlucutationType;
191 TH2D *hist2D = InputFiles[f]->Get<TH2D>(TempString.c_str());
193 std::cout<<
" & "<<FlucDraw;
194 FlucDrawVec[f].push_back(FlucDraw);
196 std::cout<<
" \\\\"<<std::endl;
199 for(
unsigned int f = 0; f < InputFiles.size(); f++)
201 TH2D *hFlucPred = InputFiles[f]->Get<TH2D>((
"Predictive/Total/Total" + FlucutationType).c_str());
203 std::cout<<
" & "<<FlucDraw;
205 std::cout<<
" \\\\ \\hline"<<std::endl;
206 std::cout<<
"\\hline"<<std::endl;
207 std::cout<<
"\\end{tabular}"<<std::endl;
208 std::cout<<
"\\end{table}"<<std::endl;
210 auto Threshold = GetFromManager<double>(Settings[
"Significance"], 0.05, __FILE__ , __LINE__);
211 for(
unsigned int f = 0; f < InputFiles.size(); f++)
221 const std::vector<TFile*>& InputFiles,
222 const std::vector<std::string>& SampleNames,
223 const std::vector<int>& SampleDimension,
224 const std::unique_ptr<TCanvas>& canv)
229 canv->SetTopMargin(0.10);
230 canv->SetBottomMargin(0.12);
231 canv->SetRightMargin(0.075);
232 canv->SetLeftMargin(0.14);
234 auto PosteriorColor = Get<std::vector<Color_t >>(Settings[
"PosteriorColor"], __FILE__, __LINE__);
235 auto Titles = Get<std::vector<std::string>>(Settings[
"FileTitle"], __FILE__, __LINE__);
236 const int nFiles =
static_cast<int>(InputFiles.size());
239 TCandle::SetScaledViolin(
false);
240 for(
size_t iSample = 0; iSample < SampleNames.size(); iSample++)
242 for(
int iDim = 0; iDim < SampleDimension[iSample]; iDim++)
244 std::vector<std::unique_ptr<TH2D>> ViolinHist(
nFiles);
245 for(
int iFile = 0; iFile <
nFiles; iFile++)
247 InputFiles[iFile]->cd();
248 ViolinHist[iFile] =
M3::Clone(InputFiles[iFile]->Get<TH2D>((
"Predictive/" + SampleNames[iSample]
249 +
"/" + SampleNames[iSample] +
"_mc_dim" + iDim).Data()));
250 ViolinHist[iFile]->SetTitle(
PlotMan->style().prettifySampleName(SampleNames[iSample]).c_str());
251 ViolinHist[iFile]->SetLineColor(PosteriorColor[iFile]);
252 ViolinHist[iFile]->SetMarkerColor(PosteriorColor[iFile]);
253 ViolinHist[iFile]->SetFillColorAlpha(PosteriorColor[iFile], 0.35);
254 ViolinHist[iFile]->SetFillStyle(1001);
255 ViolinHist[iFile]->GetXaxis()->SetTitle(
PlotMan->style().prettifyKinematicName(
256 ViolinHist[iFile]->GetXaxis()->GetTitle()).c_str());
257 ViolinHist[iFile]->GetYaxis()->SetTitle(
"Events");
260 ViolinHist[0]->Draw(
"violinX(03100300)");
261 for(
int iFile = 1; iFile <
nFiles; iFile++) {
262 ViolinHist[iFile]->Draw(
"violinX(03100300) same");
265 TLegend legend(0.50, 0.52, 0.90, 0.88);
266 for(
int ig = 0; ig <
nFiles; ig++) {
267 legend.AddEntry(ViolinHist[ig].get(), Form(
"%s", Titles[ig].c_str()),
"lpf");
269 legend.SetLineStyle(0);
270 legend.SetTextSize(0.03);
273 canv->Print(
"Overlay_Predictive.pdf",
"pdf");
279 const std::vector<TFile*>& InputFiles,
280 const std::vector<std::string>& SampleNames,
281 const std::vector<int>& SampleDimension,
282 const std::unique_ptr<TCanvas>& canv)
287 TPad* pad1 =
new TPad(
"pad1",
"pad1",0,0.25,1,1);
289 TPad* pad2 =
new TPad(
"pad2",
"pad2",0,0,1,0.25);
295 pad1->SetLeftMargin(canv->GetLeftMargin());
296 pad1->SetRightMargin(canv->GetRightMargin());
297 pad1->SetTopMargin(canv->GetTopMargin());
298 pad1->SetBottomMargin(0);
300 pad2->SetLeftMargin(canv->GetLeftMargin());
301 pad2->SetRightMargin(canv->GetRightMargin());
302 pad2->SetTopMargin(0);
303 pad2->SetBottomMargin(0.28);
305 auto PosteriorColor = Get<std::vector<Color_t >>(Settings[
"PosteriorColor"], __FILE__, __LINE__);
306 auto Titles = Get<std::vector<std::string>>(Settings[
"FileTitle"], __FILE__, __LINE__);
308 if(Titles.size() < InputFiles.size() || PosteriorColor.size() < InputFiles.size()){
309 MACH3LOG_ERROR(
"Passed {} files, while only {} titles and {} colors", InputFiles.size(), Titles.size(), PosteriorColor.size());
312 for(
size_t iSample = 0; iSample < SampleNames.size(); iSample++)
314 const int nFiles =
static_cast<int>(InputFiles.size());
315 auto SampleName = SampleNames[iSample];
316 const int nDims = (SampleDimension[iSample] == 2) ? 2 : 1;
317 for(
int iDim = 0; iDim < nDims; iDim++) {
318 std::string DataLocation =
"";
320 DataLocation =
"Predictive/" + SampleName +
"/Data_" + SampleName +
"_Dim" + std::to_string(iDim);
322 DataLocation =
"SampleFolder/data_" + SampleName;
324 TH1D* hist = InputFiles[0]->Get<TH1D>((DataLocation).c_str());
326 auto BinWidthScale =
PlotMan->style().getBinWidthScale(hist->GetXaxis()->GetTitle());
327 std::unique_ptr<TH1D> DataHist =
M3::Clone(hist);
331 DataHist->SetLineColor(kBlack);
332 DataPoissonErrors->SetLineColor(kBlack);
334 std::vector<double> Integral(
nFiles+1);
335 Integral[
nFiles] = DataHist->Integral();
336 std::vector<std::unique_ptr<TH1D>> PredHist(
nFiles);
338 for(
int iFile = 0; iFile <
nFiles; iFile++)
340 InputFiles[iFile]->cd();
341 std::string HistLocation =
"";
343 HistLocation =
"Predictive/" + SampleName +
"/" + SampleName +
"_mc_PostPred_dim" + std::to_string(iDim);
345 HistLocation =
"Predictive/" + SampleName +
"/" + SampleName +
"_mc_PostPred";
347 PredHist[iFile] =
M3::Clone(InputFiles[iFile]->Get<TH1D>((HistLocation).c_str()));
348 Integral[iFile] = PredHist[iFile]->Integral();
349 PredHist[iFile]->SetLineColor(PosteriorColor[iFile]);
350 PredHist[iFile]->SetMarkerColor(PosteriorColor[iFile]);
351 PredHist[iFile]->SetFillColorAlpha(PosteriorColor[iFile], 0.35);
352 PredHist[iFile]->SetFillStyle(1001);
357 PredHist[0]->Draw(
"p e2");
358 for(
int iFile = 1; iFile <
nFiles; iFile++) {
359 PredHist[iFile]->Draw(
"p e2 same");
361 DataPoissonErrors->Draw(
"p same");
363 auto legend = std::make_unique<TLegend>(0.50,0.52,0.90,0.88);
364 legend->AddEntry(DataPoissonErrors.get(), Form(
"Data, #int=%.0f", Integral[
nFiles]),
"le");
365 for(
int ig = 0; ig <
nFiles; ig++ ) {
366 legend->AddEntry(PredHist[ig].get(), Form(
"%s, #int=%.2f", Titles[ig].c_str(), Integral[ig]),
"lpf");
368 legend->SetLineStyle(0);
369 legend->SetTextSize(0.03);
375 auto line = std::make_unique<TLine>(PredHist[0]->GetXaxis()->GetBinLowEdge(PredHist[0]->GetXaxis()->GetFirst()), 1.0, PredHist[0]->GetXaxis()->GetBinUpEdge(PredHist[0]->GetXaxis()->GetLast()), 1.0);
377 line->SetLineWidth(2);
378 line->SetLineColor(kBlack);
381 std::unique_ptr<TH1D> RatioPlotData =
M3::Clone(DataHist.get());
382 std::vector<std::unique_ptr<TH1D>> RatioPlot(
nFiles);
384 for(
int ig = 0; ig <
nFiles; ig++ )
386 RatioPlot[ig] =
M3::Clone(DataHist.get());
387 RatioPlot[ig]->SetLineColor(PosteriorColor[ig]);
388 RatioPlot[ig]->SetMarkerColor(PosteriorColor[ig]);
389 RatioPlot[ig]->SetFillColorAlpha(PosteriorColor[ig], 0.35);
390 RatioPlot[ig]->SetFillStyle(1001);
391 RatioPlot[ig]->GetYaxis()->SetTitle(
"Data/MC");
392 auto PrettyX =
PlotMan->style().prettifyKinematicName(PredHist[0]->GetXaxis()->GetTitle());
393 RatioPlot[ig]->GetXaxis()->SetTitle(PrettyX.c_str());
394 RatioPlot[ig]->SetBit(TH1D::kNoTitle);
395 RatioPlot[ig]->GetXaxis()->SetTitleSize(0.12);
396 RatioPlot[ig]->GetYaxis()->SetTitleOffset(0.4);
397 RatioPlot[ig]->GetYaxis()->SetTitleSize(0.10);
399 RatioPlot[ig]->GetXaxis()->SetLabelSize(0.10);
400 RatioPlot[ig]->GetYaxis()->SetLabelSize(0.10);
402 RatioPlot[ig]->Divide(PredHist[ig].get());
406 RatioPlotData->Divide(DataHist.get());
409 M3::Plotting::SetSymmetricRatioRange(RatioPlot);
411 RatioPlot[0]->Draw(
"p e2");
412 for(
int ig = 1; ig <
nFiles; ig++ ) {
413 RatioPlot[ig]->Draw(
"p e2 same");
415 RatioPlotData->Draw(
"he same");
417 canv->Print(
"Overlay_Predictive.pdf",
"pdf");
426 const std::vector<TFile*>& InputFiles,
427 const std::vector<std::string>& SampleNames,
428 const std::vector<int>& SampleDimension,
429 const std::vector<std::vector<std::string>>& Modes,
430 const std::unique_ptr<TCanvas>& canv)
434 constexpr
auto DefaultColor = kBlack;
435 auto Titles = Get<std::vector<std::string>>(Settings[
"FileTitle"], __FILE__, __LINE__);
436 auto RelevantModesName = Get<std::vector<std::string>>(Settings[
"RelevantModesName"], __FILE__, __LINE__);
437 auto RelevantColors = Get<std::vector<Color_t>>(Settings[
"RelevantModesColors"], __FILE__, __LINE__);
438 int nRelevantModes =
static_cast<int>(RelevantModesName.size());
439 const int nFiles =
static_cast<int>(InputFiles.size());
440 if(Titles.size() < InputFiles.size()){
441 MACH3LOG_ERROR(
"Passed {} files, while only {} titles", InputFiles.size(), Titles.size());
444 if(RelevantModesName.size() != RelevantColors.size()) {
445 MACH3LOG_ERROR(
"Colors ({}) doesn't match relevant modes {}", RelevantColors.size(), RelevantModesName.size());
448 for(
int iFile = 0; iFile <
nFiles; iFile++ )
450 for(
size_t iSample = 0; iSample < SampleNames.size(); iSample++)
452 auto SampleName = SampleNames[iSample];
453 for(
int iDim = 0; iDim < SampleDimension[iSample]; iDim++)
455 const int nDims = (SampleDimension[iSample] == 2) ? 2 : 1;
456 std::string HistLocation =
"";
458 HistLocation =
"Predictive/" + SampleName +
"/" + SampleName +
"_mc_PostPred_dim" + std::to_string(iDim);
460 HistLocation =
"Predictive/" + SampleName +
"/" + SampleName +
"_mc_PostPred";
462 std::unique_ptr<TH1D> Sample_MC_Full =
M3::Clone(InputFiles[iFile]->Get<TH1D>((HistLocation).c_str()));
463 Sample_MC_Full->SetLineColor(kOrange);
464 Sample_MC_Full->SetLineWidth(2);
465 Sample_MC_Full->SetMarkerColor(kOrange);
468 std::string DataLocation =
"";
469 std::unique_ptr<TH1D> Sample_Data;
471 DataLocation =
"Predictive/" + SampleName +
"/Data_" + SampleName +
"_Dim" + std::to_string(iDim);
472 }
else if(nDims == 1) {
473 DataLocation =
"SampleFolder/data_" + SampleName;
475 if(DataLocation !=
"") {
476 Sample_Data =
M3::Clone(InputFiles[iFile]->Get<TH1D>((DataLocation).c_str()));
477 Sample_Data->SetLineColor(kBlack);
478 Sample_Data->SetLineWidth(2);
479 Sample_Data->SetMarkerColor(kBlack);
482 int nModes =
static_cast<int>(Modes[iSample].size());
484 std::vector<bool> isRelevantMode(nModes,
false);
485 std::vector<Color_t > ColorMap(nModes, DefaultColor);
486 for(
int iMode = 0; iMode < nModes; iMode++) {
487 for(
int iRelevant = 0; iRelevant < nRelevantModes; iRelevant++) {
488 if(Modes[iSample][iMode] == RelevantModesName[iRelevant]) {
489 isRelevantMode[iMode] =
true;
490 ColorMap[iMode] = RelevantColors[iRelevant];
494 auto Sample_Stack = std::make_unique<THStack>(SampleName.c_str(), SampleName.c_str());
496 std::unique_ptr<TH1D> Sample_MC_Other;
498 std::vector<std::unique_ptr<TH1D>> Sample_MC(nModes);
499 std::vector<double> Integrals(nModes, 0.);
500 for(
int iMode = 0; iMode < nModes; iMode++)
502 std::string FileLocaction =
"Predictive/" + SampleName +
"/ByMode/" + SampleName
503 +
"_" + Modes[iSample][iMode] +
"_dim" + std::to_string(iDim);
504 auto SpectraByMode = InputFiles[iFile]->Get<TH2D>((FileLocaction).c_str());
505 if(SpectraByMode ==
nullptr){
506 MACH3LOG_ERROR(
"Something went wrong and didn't find histogram: {}", FileLocaction);
510 Integrals[iMode] = Sample_MC[iMode]->Integral();
513 if(Sample_MC_Other ==
nullptr) {
514 Sample_MC_Other =
M3::Clone(Sample_MC[iMode].get());
515 Sample_MC_Other->Reset();
516 Sample_MC_Other->SetFillColor(DefaultColor);
517 Sample_MC_Other->SetLineColor(DefaultColor);
519 if(!isRelevantMode[iMode]) {
520 Sample_MC_Other->Add(Sample_MC[iMode].get());
522 Sample_MC[iMode]->SetFillColor(ColorMap[iMode]);
523 Sample_MC[iMode]->SetLineColor(ColorMap[iMode]);
525 Sample_Stack->Add(Sample_MC_Other.get());
527 for(
int iMode = nModes-1; iMode >= 0; iMode--) {
528 if(isRelevantMode[iMode]) Sample_Stack->Add( Sample_MC[iMode].get() );
530 Sample_Stack->Draw(
"hist");
531 Sample_MC_Full->Draw(
"SAME he");
532 if(Sample_Data) Sample_Data->Draw(
"SAME pe");
534 Sample_Stack->GetXaxis();
535 Sample_Stack->SetTitle(Sample_MC_Other->GetTitle());
536 Sample_Stack->GetXaxis()->SetTitle(Sample_MC_Other->GetXaxis()->GetTitle());
537 Sample_Stack->GetYaxis()->SetTitle(Sample_MC_Other->GetYaxis()->GetTitle());
539 double FullIntegral = std::accumulate(Integrals.begin(), Integrals.end(), 0.0);
540 double OtherIntegral = 0.;
541 TLegend legend(0.50,0.52,0.85,0.88);
542 if(Sample_Data) legend.AddEntry(Sample_Data.get(),
"Data",
"ple");
543 legend.AddEntry(Sample_MC_Full.get(), Titles[iFile].c_str(),
"fple");
544 for(
int iMode = 0; iMode < nModes; iMode++) {
545 if(isRelevantMode[iMode]) {
546 std::string Label = Form(
"%s: %.1f%%", Modes[iSample][iMode].c_str(), Integrals[iMode]/FullIntegral*100);
547 legend.AddEntry(Sample_MC[iMode].get(), Label.c_str() ,
"lf");
549 OtherIntegral += Integrals[iMode]/FullIntegral;
552 legend.AddEntry(Sample_MC_Other.get(), Form(
"Other: %.1f%%", OtherIntegral*100),
"lf");
553 legend.SetTextSize(0.03);
556 canv->Print(
"Overlay_Predictive.pdf",
"pdf");
565 TF1 *Gauss = hist->GetFunction(
"Fit");
567 Mean = Gauss->GetParameter(1);
568 Error = Gauss->GetParameter(2);
577 const std::vector<std::string>& SampleNames) {
583 std::cout<<
"\\begin{table}[htb]"<<std::endl;
584 std::cout<<
"\\centering"<<std::endl;
585 std::cout<<
"\\begin{tabular}{ | l |";
586 for(
unsigned int f = 0; f < InputFiles.size(); f++)
590 std::cout<<
"} \\hline"<<std::endl;
591 std::cout<<
"Sample ";
592 for(
unsigned int f = 0; f < InputFiles.size(); f++)
594 std::cout<<
"& Event Rates ";
596 std::cout<<
"\\\\ \\hline"<<std::endl;
597 for(
unsigned int i = 0; i < SampleNames.size(); i++)
599 std::cout<<SampleNames[i];
600 std::string TempString =
"Predictive/" + SampleNames[i]+
"/"+SampleNames[i]+
"_sum";
601 for(
unsigned int f = 0; f < InputFiles.size(); f++)
603 TH1D *hist =
static_cast<TH1D*
>(InputFiles[f]->Get(TempString.c_str()));
605 std::cout<<
" & "<<mean<<
" $\\pm$ "<<error;
607 std::cout<<
" \\\\"<<std::endl;
610 for(
unsigned int f = 0; f < InputFiles.size(); f++)
612 TH1D *histTot =
static_cast<TH1D*
>(InputFiles[f]->Get(
"Predictive/Total/Total_sum"));
614 std::cout<<
" & "<<mean<<
" $\\pm$ "<<error;
616 std::cout<<
" \\\\"<<std::endl;
617 std::cout<<
"\\hline"<<std::endl;
618 std::cout<<
"\\end{tabular}"<<std::endl;
619 std::cout<<
"\\end{table}"<<std::endl;
625 const std::vector<std::string>& SampleNames) {
631 std::cout<<
"\\begin{table}[htb]"<<std::endl;
632 std::cout<<
"\\centering"<<std::endl;
633 std::cout<<
"\\begin{tabular}{ | l |";
634 for(
unsigned int f = 0; f < InputFiles.size(); f++)
638 std::cout<<
"} \\hline"<<std::endl;
640 std::cout<<
"Sample ";
641 for(
unsigned int f = 0; f < InputFiles.size(); f++)
643 std::cout<<
"& $\\delta N / N (\\%)$";
645 std::cout<<
"\\\\ \\hline"<<std::endl;
647 for(
unsigned int i = 0; i < SampleNames.size(); i++)
649 std::cout<<SampleNames[i];
650 std::string TempString =
"Predictive/" + SampleNames[i]+
"/"+SampleNames[i]+
"_sum";
651 for(
unsigned int f = 0; f < InputFiles.size(); f++)
653 TH1D *hist =
static_cast<TH1D*
>(InputFiles[f]->Get(TempString.c_str()));
655 std::cout<<
" & "<<error/mean*100;
657 std::cout<<
" \\\\"<<std::endl;
660 for(
unsigned int f = 0; f < InputFiles.size(); f++)
662 TH1D *histTotal =
static_cast<TH1D*
>(InputFiles[f]->Get(
"Predictive/Total/Total_sum"));
664 std::cout<<
" & "<<error/mean*100;
666 std::cout<<
"\\\\ \\hline"<<std::endl;
667 std::cout<<
"\\end{tabular}"<<std::endl;
668 std::cout<<
"\\end{table}"<<std::endl;
674 std::string TempTile = hist->GetTitle();
675 std::string temp =
"=";
677 std::string::size_type SizeType = TempTile.find(temp);
678 TempTile.erase(0, SizeType+1);
679 double llh = atof(TempTile.c_str());
685 const std::vector<std::string>& SampleNames) {
689 std::vector<double> Total(InputFiles.size());
691 std::cout<<
"\\begin{table}[htb]"<<std::endl;
692 std::cout<<
"\\centering"<<std::endl;
693 std::cout<<
"\\begin{tabular}{ | l |";
694 for(
unsigned int f = 0; f < InputFiles.size(); f++)
699 std::cout<<
"} \\hline"<<std::endl;
700 std::cout<<
"Sample ";
701 for(
unsigned int f = 0; f < InputFiles.size(); f++)
703 std::cout<<
"& 2#log#mathcal{L}_{stat} ";
705 std::cout<<
"\\\\ \\hline"<<std::endl;
706 for(
unsigned int i = 0; i < SampleNames.size(); i++)
708 std::cout<<SampleNames[i];
709 std::string TempString =
"Predictive/" + SampleNames[i]+
"/"+SampleNames[i]+
"_mc_PostPred";
710 for(
unsigned int f = 0; f < InputFiles.size(); f++)
712 TH1 *hist =
static_cast<TH1*
>(InputFiles[f]->Get(TempString.c_str()));
714 double llh =
GetLLH(hist);
715 std::cout<<
" & "<<llh;
718 std::cout<<
" \\\\"<<std::endl;
721 for(
unsigned int f = 0; f < InputFiles.size(); f++) {
722 std::cout<<
" & "<<Total[f];
724 std::cout<<
" \\\\"<<std::endl;
725 std::cout<<
"\\hline"<<std::endl;
726 std::cout<<
"\\end{tabular}"<<std::endl;
727 std::cout<<
"\\end{table}"<<std::endl;
728 std::cout<<
" "<<std::endl;
732 const std::vector<std::string>&
FileNames)
734 auto canvas = std::make_unique<TCanvas>(
"canv",
"canv", 1080, 1080);
736 canvas->SetTopMargin(0.11);
737 canvas->SetBottomMargin(0.16);
738 canvas->SetRightMargin(0.075);
739 canvas->SetLeftMargin(0.12);
742 gStyle->SetOptStat(0);
743 gStyle->SetPalette(51);
744 gStyle->SetLegendBorderSize(0);
745 gStyle->SetFillStyle(0);
748 gErrorIgnoreLevel = kWarning;
754 std::vector<TFile*> InputFiles(
FileNames.size());
755 for(
size_t i = 0; i <
FileNames.size(); i++) {
762 YAML::Node settings = Config[
"PredictivePlotting"];
763 canvas->Print(
"Overlay_Predictive.pdf[",
"pdf");
768 OverlayViolin(settings, InputFiles, Samples, Dimensions, canvas);
779 canvas->Print(
"Overlay_Predictive.pdf]",
"pdf");
781 for(
size_t i = 0; i <
FileNames.size(); i++)
783 InputFiles[i]->Close();
784 delete InputFiles[i];
789 int main(
int argc,
char **argv)
794 MACH3LOG_ERROR(
"Need at least two arguments, {} <Config.Yaml> <Prior/Post_PredOutput.root>", argv[0]);
797 std::string ConfigName = std::string(argv[1]);
800 for (
int i = 2; i < argc; ++i) {
804 PlotMan =
new M3::Plotting::PlottingManager();
std::unique_ptr< TH1D > MakeSummaryFromSpectra(const TH2D *Spectra, const std::string &name)
Build a 1D posterior-predictive summary from a violin spectrum.
void SetMaCh3LoggerFormat()
Set messaging format of the logger.
void OverlayPredicitve(const YAML::Node &Settings, const std::vector< TFile * > &InputFiles, const std::vector< std::string > &SampleNames, const std::vector< int > &SampleDimension, const std::unique_ptr< TCanvas > &canv)
double GetPValue(const TH2D *hist)
void PrintPosteriorPValue(const YAML::Node &Settings, const std::vector< TFile * > &InputFiles, const std::vector< std::string > &SampleNames)
void PredictivePlotting(const std::string &ConfigName, const std::vector< std::string > &FileNames)
int main(int argc, char **argv)
std::vector< std::string > FindSamples(const std::string &File)
void GetMeanError(TH1D *hist, double &Mean, double &Error)
KS: Get mean and error from gaussian fit to event distribution.
void OverlayPredicitveByMode(const YAML::Node &Settings, const std::vector< TFile * > &InputFiles, const std::vector< std::string > &SampleNames, const std::vector< int > &SampleDimension, const std::vector< std::vector< std::string >> &Modes, const std::unique_ptr< TCanvas > &canv)
void PrintPredictiveLLH(const std::vector< TFile * > &InputFiles, const std::vector< std::string > &SampleNames)
KS Print Predictive LLH into Latex table format.
void OverlayViolin(const YAML::Node &Settings, const std::vector< TFile * > &InputFiles, const std::vector< std::string > &SampleNames, const std::vector< int > &SampleDimension, const std::unique_ptr< TCanvas > &canv)
void PretifyHistogram(TH1 *Hist, const std::string &SampleName)
std::vector< std::vector< std::string > > FindModes(const std::string &File, const std::vector< std::string > &SampleNames)
std::vector< int > FindDimensions(const std::string &File, const std::vector< std::string > &Samples)
M3::Plotting::PlottingManager * PlotMan
void PrintPosteriorFractionalUncertainties(const std::vector< TFile * > &InputFiles, const std::vector< std::string > &SampleNames)
KS: Print Fractional Uncertainties into Latex table format.
void PrintPosteriorEventRates(const std::vector< TFile * > &InputFiles, const std::vector< std::string > &SampleNames)
KS Print event rates in Latex like table.
std::vector< std::string > FileNames
std::unique_ptr< TGraphAsymmErrors > PoissonGraphScaled(const TH1D *hist, double scale, double cl)
Create a TGraphAsymmErrors from a histogram using exact Poisson confidence intervals instead of symme...
double FisherCombinedPValue(const std::vector< double > &pvalues)
KS: Combine p-values using Fisher's method.
void PassErrorToRatioPlot(TH1D *RatioHist, TH1D *Hist1, TH1D *DataHist)
Propagate numerator uncertainties to a ratio histogram.
void CheckBonferoniCorrectedpValue(const std::vector< std::string > &SampleNameVec, const std::vector< double > &PValVec, const double Threshold)
KS: For more see https://www.t2k.org/docs/technotes/429/TN429_v8#page=63.
#define M3OpenConfig(filename)
Macro to simplify calling LoadYaml with file and line info.
Custom exception class used throughout MaCh3.
std::unique_ptr< ObjectType > Clone(const ObjectType *obj, const std::string &name="")
KS: Creates a copy of a ROOT-like object and wraps it in a smart pointer.
void ScaleHistogram(TH1 *Sample_Hist, const double scale)
Scale histogram to get divided by bin width.
TFile * Open(const std::string &Name, const std::string &Type, const std::string &File, const int Line)
Opens a ROOT file with the given name and mode.