2 #include "PlottingUtils/PlottingUtils.h"
3 #include "PlottingUtils/PlottingManager.h"
6 #pragma GCC diagnostic ignored "-Wfloat-conversion"
7 #pragma GCC diagnostic ignored "-Wconversion"
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;
39 SampleNames.push_back(dirname);
48 std::vector<int>
FindDimensions(
const std::string& File,
const std::vector<std::string>& Samples)
50 TFile *file =
M3::Open(File,
"READ", __FILE__, __LINE__);
51 TDirectoryFile *PredicitveDir = file->Get<TDirectoryFile>(
"Predictive");
53 std::vector<int> SampleDimension;
54 for (
const auto& sample : Samples)
57 TDirectoryFile* SampleDir = PredicitveDir->Get<TDirectoryFile>(sample.c_str());
64 std::string histName = fmt::format(
"{}_mc_dim{}", sample, Dimension);
66 TH2D* hist = SampleDir->Get<TH2D>(histName.c_str());
73 SampleDimension.push_back(Dimension);
79 return SampleDimension;
85 std::string TempTile = hist->GetTitle();
86 std::string temp =
"=";
88 std::string::size_type SizeType = TempTile.find(temp);
89 TempTile.erase(0, SizeType+1);
90 pvalue = atof(TempTile.c_str());
95 const std::vector<TFile*>& InputFiles,
96 const std::vector<std::string>& SampleNames)
99 auto Titles = Get<std::vector<std::string>>(Settings[
"FileTitle"], __FILE__, __LINE__);
100 std::vector<std::vector<double>> FlucDrawVec(InputFiles.size());
102 std::string FlucutationType =
"_predfluc_draw";
104 std::cout<<
"\\begin{table}[htb]"<<std::endl;
105 std::cout<<
"\\centering"<<std::endl;
106 std::cout<<
"\\begin{tabular}{ | l | ";
108 for(
unsigned int f = 0; f < InputFiles.size(); f++)
113 std::cout<<
"} \\hline"<<std::endl;
114 std::cout<<
"Sample ";
115 for(
unsigned int f = 0; f < InputFiles.size(); f++)
117 std::cout<<
"& \\multicolumn{1}{| c |}{" + Titles[f] +
" p-value} ";
119 std::cout<<
"\\\\"<<std::endl;
120 for(
unsigned int f = 0; f < InputFiles.size(); f++)
122 std::cout<<
" & Fluctuation of Prediction ";
124 std::cout<<
"\\\\ \\hline"<<std::endl;
125 for(
unsigned int i = 0; i < SampleNames.size(); i++)
127 std::cout<<SampleNames[i];
128 for(
unsigned int f = 0; f < InputFiles.size(); f++)
130 std::string TempString =
"Predictive/" + SampleNames[i]+
"/"+SampleNames[i] + FlucutationType;
131 TH2D *hist2D = InputFiles[f]->Get<TH2D>(TempString.c_str());
133 std::cout<<
" & "<<FlucDraw;
134 FlucDrawVec[f].push_back(FlucDraw);
136 std::cout<<
" \\\\"<<std::endl;
139 for(
unsigned int f = 0; f < InputFiles.size(); f++)
141 TH2D *hFlucPred = InputFiles[f]->Get<TH2D>((
"Predictive/Total/Total" + FlucutationType).c_str());
143 std::cout<<
" & "<<FlucDraw;
145 std::cout<<
" \\\\ \\hline"<<std::endl;
146 std::cout<<
"\\hline"<<std::endl;
147 std::cout<<
"\\end{tabular}"<<std::endl;
148 std::cout<<
"\\end{table}"<<std::endl;
150 auto Threshold = GetFromManager<double>(Settings[
"Significance"], 0.05);
151 for(
unsigned int f = 0; f < InputFiles.size(); f++)
161 const std::vector<TFile*>& InputFiles,
162 const std::vector<std::string>& SampleNames,
163 const std::vector<int>& SampleDimension,
164 const std::unique_ptr<TCanvas>& canv)
169 canv->SetTopMargin(0.10);
170 canv->SetBottomMargin(0.12);
171 canv->SetRightMargin(0.075);
172 canv->SetLeftMargin(0.14);
174 auto PosteriorColor = Get<std::vector<Color_t >>(Settings[
"PosteriorColor"], __FILE__, __LINE__);
175 auto Titles = Get<std::vector<std::string>>(Settings[
"FileTitle"], __FILE__, __LINE__);
176 const int nFiles =
static_cast<int>(InputFiles.size());
179 TCandle::SetScaledViolin(
false);
180 for(
size_t iSample = 0; iSample < SampleNames.size(); iSample++)
182 for(
int iDim = 0; iDim < SampleDimension[iSample]; iDim++)
184 std::vector<std::unique_ptr<TH2D>> ViolinHist(
nFiles);
185 for(
int iFile = 0; iFile <
nFiles; iFile++)
187 InputFiles[iFile]->cd();
188 ViolinHist[iFile] =
M3::Clone(InputFiles[iFile]->Get<TH2D>((
"Predictive/" + SampleNames[iSample]
189 +
"/" + SampleNames[iSample] +
"_mc_dim" + iDim).Data()));
190 ViolinHist[iFile]->SetTitle(
PlotMan->style().prettifySampleName(SampleNames[iSample]).c_str());
191 ViolinHist[iFile]->SetLineColor(PosteriorColor[iFile]);
192 ViolinHist[iFile]->SetMarkerColor(PosteriorColor[iFile]);
193 ViolinHist[iFile]->SetFillColorAlpha(PosteriorColor[iFile], 0.35);
194 ViolinHist[iFile]->SetFillStyle(1001);
195 ViolinHist[iFile]->GetXaxis()->SetTitle(
PlotMan->style().prettifyKinematicName(
196 ViolinHist[iFile]->GetXaxis()->GetTitle()).c_str());
197 ViolinHist[iFile]->GetYaxis()->SetTitle(
"Events");
200 ViolinHist[0]->Draw(
"violinX(03100300)");
201 for(
int iFile = 1; iFile <
nFiles; iFile++) {
202 ViolinHist[iFile]->Draw(
"violinX(03100300) same");
205 TLegend legend(0.50, 0.52, 0.90, 0.88);
206 for(
int ig = 0; ig <
nFiles; ig++) {
207 legend.AddEntry(ViolinHist[ig].get(), Form(
"%s", Titles[ig].c_str()),
"lpf");
209 legend.SetLineStyle(0);
210 legend.SetTextSize(0.03);
213 canv->Print(
"Overlay_Predictive.pdf",
"pdf");
219 const std::vector<TFile*>& InputFiles,
220 const std::vector<std::string>& SampleNames,
221 const std::vector<int>& SampleDimension,
222 const std::unique_ptr<TCanvas>& canv)
227 TPad* pad1 =
new TPad(
"pad1",
"pad1",0,0.25,1,1);
229 TPad* pad2 =
new TPad(
"pad2",
"pad2",0,0,1,0.25);
235 pad1->SetLeftMargin(canv->GetLeftMargin());
236 pad1->SetRightMargin(canv->GetRightMargin());
237 pad1->SetTopMargin(canv->GetTopMargin());
238 pad1->SetBottomMargin(0);
240 pad2->SetLeftMargin(canv->GetLeftMargin());
241 pad2->SetRightMargin(canv->GetRightMargin());
242 pad2->SetTopMargin(0);
243 pad2->SetBottomMargin(0.28);
245 auto PosteriorColor = Get<std::vector<Color_t >>(Settings[
"PosteriorColor"], __FILE__, __LINE__);
246 auto Titles = Get<std::vector<std::string>>(Settings[
"FileTitle"], __FILE__, __LINE__);
248 if(Titles.size() < InputFiles.size() || PosteriorColor.size() < InputFiles.size()){
249 MACH3LOG_ERROR(
"Passed {} files, while only {} titles and {} colors", InputFiles.size(), Titles.size(), PosteriorColor.size());
252 for(
size_t iSample = 0; iSample < SampleNames.size(); iSample++)
254 const int nFiles =
static_cast<int>(InputFiles.size());
255 auto SampleName = SampleNames[iSample];
256 const int nDims = (SampleDimension[iSample] == 2) ? 2 : 1;
257 for(
int iDim = 0; iDim < nDims; iDim++) {
258 std::string DataLocation =
"";
260 DataLocation =
"Predictive/" + SampleName +
"/Data_" + SampleName +
"_Dim" + std::to_string(iDim);
262 DataLocation =
"SampleFolder/data_" + SampleName;
264 TH1D* hist = InputFiles[0]->Get<TH1D>((DataLocation).c_str());
266 std::unique_ptr<TH1D> DataHist =
M3::Clone(hist);
267 DataHist->GetYaxis()->SetTitle(fmt::format(
"Events/{:.0f}",
ScalingFactor).c_str());
269 DataHist->SetLineColor(kBlack);
271 std::vector<double> Integral(
nFiles+1);
272 Integral[
nFiles] = DataHist->Integral();
273 std::vector<std::unique_ptr<TH1D>> PredHist(
nFiles);
275 for(
int iFile = 0; iFile <
nFiles; iFile++)
277 InputFiles[iFile]->cd();
278 std::string HistLocation =
"";
280 HistLocation =
"Predictive/" + SampleName +
"/" + SampleName +
"_mc_PostPred_dim" + std::to_string(iDim);
282 HistLocation =
"Predictive/" + SampleName +
"/" + SampleName +
"_mc_PostPred";
284 PredHist[iFile] =
M3::Clone(InputFiles[iFile]->Get<TH1D>((HistLocation).c_str()));
285 Integral[iFile] = PredHist[iFile]->Integral();
286 PredHist[iFile]->SetTitle(
PlotMan->style().prettifySampleName(SampleName).c_str());
287 PredHist[iFile]->SetLineColor(PosteriorColor[iFile]);
288 PredHist[iFile]->SetMarkerColor(PosteriorColor[iFile]);
289 PredHist[iFile]->SetFillColorAlpha(PosteriorColor[iFile], 0.35);
290 PredHist[iFile]->SetFillStyle(1001);
291 PredHist[iFile]->GetYaxis()->SetTitle(fmt::format(
"Events/{:.0f}",
ScalingFactor).c_str());
296 PredHist[0]->Draw(
"p e2");
297 for(
int iFile = 1; iFile <
nFiles; iFile++)
299 PredHist[iFile]->Draw(
"p e2 same");
301 DataHist->Draw(
"he same");
303 auto legend = std::make_unique<TLegend>(0.50,0.52,0.90,0.88);
304 legend->AddEntry(DataHist.get(), Form(
"Data, #int=%.0f", Integral[
nFiles]),
"le");
305 for(
int ig = 0; ig <
nFiles; ig++ ) {
306 legend->AddEntry(PredHist[ig].get(), Form(
"%s, #int=%.2f", Titles[ig].c_str(), Integral[ig]),
"lpf");
308 legend->SetLineStyle(0);
309 legend->SetTextSize(0.03);
315 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);
317 line->SetLineWidth(2);
318 line->SetLineColor(kBlack);
321 std::unique_ptr<TH1D> RatioPlotData =
M3::Clone(DataHist.get());
322 std::vector<std::unique_ptr<TH1D>> RatioPlot(
nFiles);
324 for(
int ig = 0; ig <
nFiles; ig++ )
326 RatioPlot[ig] =
M3::Clone(DataHist.get());
327 RatioPlot[ig]->SetLineColor(PosteriorColor[ig]);
328 RatioPlot[ig]->SetMarkerColor(PosteriorColor[ig]);
329 RatioPlot[ig]->SetFillColorAlpha(PosteriorColor[ig], 0.35);
330 RatioPlot[ig]->SetFillStyle(1001);
331 RatioPlot[ig]->GetYaxis()->SetTitle(
"Data/MC");
332 auto PrettyX =
PlotMan->style().prettifyKinematicName(PredHist[0]->GetXaxis()->GetTitle());
333 RatioPlot[ig]->GetXaxis()->SetTitle(PrettyX.c_str());
334 RatioPlot[ig]->SetBit(TH1D::kNoTitle);
335 RatioPlot[ig]->GetXaxis()->SetTitleSize(0.12);
336 RatioPlot[ig]->GetYaxis()->SetTitleOffset(0.4);
337 RatioPlot[ig]->GetYaxis()->SetTitleSize(0.10);
339 RatioPlot[ig]->GetXaxis()->SetLabelSize(0.10);
340 RatioPlot[ig]->GetYaxis()->SetLabelSize(0.10);
342 RatioPlot[ig]->Divide(PredHist[ig].get());
346 RatioPlotData->Divide(DataHist.get());
351 for (
int j = 0; j <
nFiles; j++) {
352 for (
int i = 1; i < RatioPlot[0]->GetXaxis()->GetNbins(); i++) {
353 maxz = std::max(maxz, RatioPlot[j]->GetBinContent(i));
354 minz = std::min(minz, RatioPlot[j]->GetBinContent(i));
360 if (std::fabs(1 - maxz) > std::fabs(1-minz))
361 RatioPlot[0]->GetYaxis()->SetRangeUser(1-std::fabs(1-maxz),1+std::fabs(1-maxz));
363 RatioPlot[0]->GetYaxis()->SetRangeUser(1-std::fabs(1-minz),1+std::fabs(1-minz));
365 RatioPlot[0]->Draw(
"p e2");
366 for(
int ig = 1; ig <
nFiles; ig++ ) {
367 RatioPlot[ig]->Draw(
"p e2 same");
369 RatioPlotData->Draw(
"he same");
371 canv->Print(
"Overlay_Predictive.pdf",
"pdf");
381 TF1 *Gauss = hist->GetFunction(
"Fit");
383 Mean = Gauss->GetParameter(1);
384 Error = Gauss->GetParameter(2);
393 const std::vector<std::string>& SampleNames) {
399 std::cout<<
"\\begin{table}[htb]"<<std::endl;
400 std::cout<<
"\\centering"<<std::endl;
401 std::cout<<
"\\begin{tabular}{ | l |";
402 for(
unsigned int f = 0; f < InputFiles.size(); f++)
406 std::cout<<
"} \\hline"<<std::endl;
407 std::cout<<
"Sample ";
408 for(
unsigned int f = 0; f < InputFiles.size(); f++)
410 std::cout<<
"& Event Rates ";
412 std::cout<<
"\\\\ \\hline"<<std::endl;
413 for(
unsigned int i = 0; i < SampleNames.size(); i++)
415 std::cout<<SampleNames[i];
416 std::string TempString =
"Predictive/" + SampleNames[i]+
"/"+SampleNames[i]+
"_sum";
417 for(
unsigned int f = 0; f < InputFiles.size(); f++)
419 TH1D *hist =
static_cast<TH1D*
>(InputFiles[f]->Get(TempString.c_str()));
421 std::cout<<
" & "<<mean<<
" $\\pm$ "<<error;
423 std::cout<<
" \\\\"<<std::endl;
426 for(
unsigned int f = 0; f < InputFiles.size(); f++)
428 TH1D *histTot =
static_cast<TH1D*
>(InputFiles[f]->Get(
"Predictive/Total/Total_sum"));
430 std::cout<<
" & "<<mean<<
" $\\pm$ "<<error;
432 std::cout<<
" \\\\"<<std::endl;
433 std::cout<<
"\\hline"<<std::endl;
434 std::cout<<
"\\end{tabular}"<<std::endl;
435 std::cout<<
"\\end{table}"<<std::endl;
441 const std::vector<std::string>& SampleNames) {
447 std::cout<<
"\\begin{table}[htb]"<<std::endl;
448 std::cout<<
"\\centering"<<std::endl;
449 std::cout<<
"\\begin{tabular}{ | l |";
450 for(
unsigned int f = 0; f < InputFiles.size(); f++)
454 std::cout<<
"} \\hline"<<std::endl;
456 std::cout<<
"Sample ";
457 for(
unsigned int f = 0; f < InputFiles.size(); f++)
459 std::cout<<
"& $\\delta N / N (\\%)$";
461 std::cout<<
"\\\\ \\hline"<<std::endl;
463 for(
unsigned int i = 0; i < SampleNames.size(); i++)
465 std::cout<<SampleNames[i];
466 std::string TempString =
"Predictive/" + SampleNames[i]+
"/"+SampleNames[i]+
"_sum";
467 for(
unsigned int f = 0; f < InputFiles.size(); f++)
469 TH1D *hist =
static_cast<TH1D*
>(InputFiles[f]->Get(TempString.c_str()));
471 std::cout<<
" & "<<error/mean*100;
473 std::cout<<
" \\\\"<<std::endl;
476 for(
unsigned int f = 0; f < InputFiles.size(); f++)
478 TH1D *histTotal =
static_cast<TH1D*
>(InputFiles[f]->Get(
"Predictive/Total/Total_sum"));
480 std::cout<<
" & "<<error/mean*100;
482 std::cout<<
"\\\\ \\hline"<<std::endl;
483 std::cout<<
"\\end{tabular}"<<std::endl;
484 std::cout<<
"\\end{table}"<<std::endl;
490 std::string TempTile = hist->GetTitle();
491 std::string temp =
"=";
493 std::string::size_type SizeType = TempTile.find(temp);
494 TempTile.erase(0, SizeType+1);
495 double llh = atof(TempTile.c_str());
501 const std::vector<std::string>& SampleNames) {
505 std::vector<double> Total(InputFiles.size());
507 std::cout<<
"\\begin{table}[htb]"<<std::endl;
508 std::cout<<
"\\centering"<<std::endl;
509 std::cout<<
"\\begin{tabular}{ | l |";
510 for(
unsigned int f = 0; f < InputFiles.size(); f++)
515 std::cout<<
"} \\hline"<<std::endl;
516 std::cout<<
"Sample ";
517 for(
unsigned int f = 0; f < InputFiles.size(); f++)
519 std::cout<<
"& 2#log#mathcal{L}_{stat} ";
521 std::cout<<
"\\\\ \\hline"<<std::endl;
522 for(
unsigned int i = 0; i < SampleNames.size(); i++)
524 std::cout<<SampleNames[i];
525 std::string TempString =
"Predictive/" + SampleNames[i]+
"/"+SampleNames[i]+
"_mc_PostPred";
526 for(
unsigned int f = 0; f < InputFiles.size(); f++)
528 TH1 *hist =
static_cast<TH1*
>(InputFiles[f]->Get(TempString.c_str()));
530 double llh =
GetLLH(hist);
531 std::cout<<
" & "<<llh;
534 std::cout<<
" \\\\"<<std::endl;
537 for(
unsigned int f = 0; f < InputFiles.size(); f++) {
538 std::cout<<
" & "<<Total[f];
540 std::cout<<
" \\\\"<<std::endl;
541 std::cout<<
"\\hline"<<std::endl;
542 std::cout<<
"\\end{tabular}"<<std::endl;
543 std::cout<<
"\\end{table}"<<std::endl;
544 std::cout<<
" "<<std::endl;
548 const std::vector<std::string>&
FileNames)
550 auto canvas = std::make_unique<TCanvas>(
"canv",
"canv", 1080, 1080);
552 canvas->SetTopMargin(0.11);
553 canvas->SetBottomMargin(0.16);
554 canvas->SetRightMargin(0.075);
555 canvas->SetLeftMargin(0.12);
558 gStyle->SetOptStat(0);
559 gStyle->SetPalette(51);
560 gStyle->SetLegendBorderSize(0);
561 gStyle->SetFillStyle(0);
564 gErrorIgnoreLevel = kWarning;
569 std::vector<TFile*> InputFiles(
FileNames.size());
570 for(
size_t i = 0; i <
FileNames.size(); i++)
578 YAML::Node settings = Config[
"PredictivePlotting"];
579 canvas->Print(
"Overlay_Predictive.pdf[",
"pdf");
584 OverlayViolin(settings, InputFiles, Samples, Dimensions, canvas);
593 canvas->Print(
"Overlay_Predictive.pdf]",
"pdf");
595 for(
size_t i = 0; i <
FileNames.size(); i++)
597 InputFiles[i]->Close();
598 delete InputFiles[i];
603 int main(
int argc,
char **argv)
608 MACH3LOG_ERROR(
"Need at least two arguments, {} <Config.Yaml> <Prior/Post_PredOutput.root>", argv[0]);
611 std::string ConfigName = std::string(argv[1]);
614 for (
int i = 2; i < argc; ++i) {
618 PlotMan =
new MaCh3Plotting::PlottingManager();
void SetMaCh3LoggerFormat()
Set messaging format of the logger.
constexpr const double ScalingFactor
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)
MaCh3Plotting::PlottingManager * PlotMan
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 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)
std::vector< int > FindDimensions(const std::string &File, const std::vector< std::string > &Samples)
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
double FisherCombinedPValue(const std::vector< double > &pvalues)
KS: Combine p-values using Fisher's method.
void PassErrorToRatioPlot(TH1D *RatioHist, TH1D *Hist1, TH1D *DataHist)
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.