4 #pragma GCC diagnostic ignored "-Wfloat-conversion"
5 #pragma GCC diagnostic ignored "-Wuseless-cast"
13 MACH3LOG_DEBUG(
"With OpenMP and {} threads", omp_get_max_threads());
19 else MACH3LOG_INFO(
"Using alternative method of statistical fluctuation, which is much slower");
44 rnd = std::make_unique<TRandom3>();
77 lnLHist = std::make_unique<TH1D>(
"lnLHist_predpredfluc",
"lnLHist_predpredfluc", 100, 1, -1);
79 lnLHist->GetXaxis()->SetTitle(
"-2LLH (Pred Fluc, Pred)");
80 lnLHist->GetYaxis()->SetTitle(
"Counts");
82 lnLHist_drawdata = std::make_unique<TH1D>(
"lnLHist_drawdata",
"lnLHist_drawdata", 100, 1, -1);
87 lnLHist_drawfluc = std::make_unique<TH1D>(
"lnLHist_drawpredfluc",
"lnLHist_drawpredfluc", 100, 1, -1);
92 lnLHist_drawflucdraw = std::make_unique<TH1D>(
"lnLHist_drawflucdraw",
"lnLHist_drawflucdraw", 100, 1, -1);
97 lnLDrawHist = std::make_unique<TH2D>(
"lnLDrawHist",
"lnLDrawHist", 50, 1, -1, 50, 1, -1);
99 lnLDrawHist->GetXaxis()->SetTitle(
"-2LLH_{Pred Fluc, Draw}");
100 lnLDrawHist->GetYaxis()->SetTitle(
"-2LLH_{Data, Draw}");
102 lnLFlucHist = std::make_unique<TH2D>(
"lnLFlucHist",
"lnLFlucHist", 50, 1, -1, 50, 1, -1);
104 lnLFlucHist->GetXaxis()->SetTitle(
"-2LLH_{Draw Fluc, Draw}");
105 lnLFlucHist->GetYaxis()->SetTitle(
"-2LLH_{Data, Draw}");
107 lnLDrawHistRate = std::make_unique<TH2D>(
"lnLDrawHistRate",
"lnLDrawHistRate", 50, 1, -1, 50, 1, -1);
113 lnLFlucHist_ProjectX = std::make_unique<TH2D>(
"lnLFlucHist_ProjectX",
"lnLFlucHist_ProjectX", 50, 1, -1, 50, 1, -1);
125 std::stringstream ss;
126 ss <<
"Draws/" << binwidth;
127 RandomHist->GetYaxis()->SetTitle(ss.str().c_str());
175 if(
DataHist[i] ==
nullptr)
continue;
178 for (
int k = 1; k <=
maxBins[i]; ++k)
192 if(
DataHist[i] ==
nullptr)
continue;
221 MACH3LOG_ERROR(
"Size of SampleVector input != number of defined samples");
224 MACH3LOG_ERROR(
"Something has gone wrong with making the Samples");
235 const int Length = int(Data.size());
238 for (
int i = 0; i < Length; ++i) {
239 if (Data[i] ==
nullptr) {
245 std::string classname = std::string(
DataHist[i]->Class_Name());
246 if(classname ==
"TH2Poly")
248 DataHist[i] =
static_cast<TH2Poly*
>(Data[i]->Clone());
255 MACH3LOG_ERROR(
"Right now I only support TH2Poly but I am ambitious piece of code and surely will have more support in the future");
266 const int Length = int(Nominal.size());
270 for (
int i = 0; i < Length; ++i)
272 if (Nominal[i] ==
nullptr) {
288 NominalHist[i] =
static_cast<TH2Poly*
>(Nominal[i]->Clone());
290 W2NomHist[i] =
static_cast<TH2Poly*
>(NomW2[i]->Clone());
307 for (
int i = 0; i < Length; ++i) {
309 if (Nominal[i] !=
nullptr)
311 std::string name = std::string(
NominalHist[i]->GetName());
312 name = name.substr(0, name.find(
"_nom"));
319 for (
int j = 0; j <=
maxBins[i]; ++j)
323 lnLHist_Mean[i]->SetNameTitle((name+
"_MeanlnL").c_str(), (name+
"_MeanlnL").c_str());
325 lnLHist_Mean[i]->GetZaxis()->SetTitle(
"-2lnL_{sample} #times sign(MC-data)");
327 lnLHist_Mode[i]->SetNameTitle((name+
"_ModelnL").c_str(), (name+
"_ModelnL").c_str());
329 lnLHist_Mode[i]->GetZaxis()->SetTitle(
"-2lnL_{sample} #times sign(MC-data)");
331 lnLHist_Mean_ProjectX[i]->SetNameTitle((name+
"_MeanlnL_ProjectX").c_str(), (name+
"_MeanlnL_ProjectX").c_str());
335 MeanHist[i]->SetNameTitle((name+
"_mean").c_str(), (name+
"_mean").c_str());
337 MeanHist[i]->GetZaxis()->SetTitle(
"Mean");
341 MeanHistCorrected[i]->SetNameTitle((name+
"_mean_corrected").c_str(), (name+
"_mean_corrected").c_str());
350 ViolinHists_ProjectX[i] =
new TH2D((name+
"_Violin_ProjectX").c_str(), (name+
"_Violin_ProjectX").c_str(),
int(xbins.size()-1), &xbins[0] , 400, 0, MaxBinning);
355 ViolinHists_ProjectY[i] =
new TH2D((name+
"_Violin_ProjectY").c_str(), (name+
"_Violin_ProjectY").c_str(),
int(ybins.size()-1), &ybins[0] , 400, 0, MaxBinning);
360 ModeHist[i]->SetNameTitle((name+
"_mode").c_str(), (name+
"_mode").c_str());
362 ModeHist[i]->GetZaxis()->SetTitle(
"Mode");
364 W2MeanHist[i]->SetNameTitle((name+
"_w2mean").c_str(), (name+
"_w2mean").c_str());
366 W2MeanHist[i]->GetZaxis()->SetTitle(
"W2Mean");
368 W2ModeHist[i]->SetNameTitle((name+
"_w2mode").c_str(), (name+
"_w2mode").c_str());
370 W2ModeHist[i]->GetZaxis()->SetTitle(
"W2Mode");
373 lnLHist_Mean1D[i] =
new TH1D((name+
"_MeanlnL1D").c_str(),(name+
"_MeanlnL1D").c_str(), 50, 1, -1);
377 lnLHist_Mode1D[i] =
new TH1D((name+
"_ModelnL1D").c_str(),(name+
"_ModelnL1D").c_str(), 50, 1, -1);
395 for (
int i = 0; i < Length; ++i)
406 void SampleSummary::AddThrow(std::vector<TH2Poly*> &SampleVector, std::vector<TH2Poly*> &W2Vec,
const double LLHPenalty,
const double Weight,
const int DrawNumber) {
412 const int size = int(SampleVector.size());
424 for (
int SampleNum = 0; SampleNum <
nSamples; ++SampleNum)
426 const int nXBins = 500;
428 std::string name = std::string(SampleVector[SampleNum]->GetName());
429 for (
int i = 1; i <=
maxBins[SampleNum]; ++i)
432 TH2PolyBin* bin =
static_cast<TH2PolyBin*
>(SampleVector[SampleNum]->GetBins()->At(i-1));
435 std::stringstream ss2;
437 ss2 <<
"p_{#mu} (" << bin->GetXMin() <<
"-" << bin->GetXMax() <<
")";
438 ss2 <<
" cos#theta_{#mu} (" << bin->GetYMin() <<
"-" << bin->GetYMax() <<
")";
440 PosteriorHist[SampleNum][i] = std::make_unique<TH1D>(ss2.str().c_str(), ss2.str().c_str(),nXBins, 1, -1);
442 w2Hist[SampleNum][i] = std::make_unique<TH1D>((
"w2_"+ss2.str()).c_str(), (
"w2_"+ss2.str()).c_str(),nXBins, 1, -1);
443 w2Hist[SampleNum][i]->SetDirectory(
nullptr);
446 std::string betaName =
"#beta_param_";
447 BetaHist[SampleNum][i] = std::make_unique<TH1D>((betaName + ss2.str()).c_str(), (betaName + ss2.str()).c_str(), 70, 1, -1);
448 BetaHist[SampleNum][i]->SetDirectory(
nullptr);
449 BetaHist[SampleNum][i]->GetXaxis()->SetTitle(
"#beta parameter value");
450 BetaHist[SampleNum][i]->GetYaxis()->SetTitle(
"Counts");
459 #pragma omp parallel for
461 for (
int SampleNum = 0; SampleNum <
nSamples; ++SampleNum)
463 if (SampleVector[SampleNum] ==
nullptr)
continue;
466 for (
int i = 1; i <=
maxBins[SampleNum]; ++i) {
467 const double Content = SampleVector[SampleNum]->GetBinContent(i);
469 const double w2 = W2Vec[SampleNum]->GetBinContent(i);
470 w2Hist[SampleNum][i]->Fill(w2, Weight);
473 const double data =
DataHist[SampleNum]->GetBinContent(i);
475 BetaHist[SampleNum][i]->Fill(BetaParam, Weight);
494 for (
int SampleNum = 0; SampleNum <
nSamples; SampleNum++)
496 if (
DataHist[SampleNum] ==
nullptr)
continue;
503 constexpr
int nXBins = 500;
505 std::string name = std::string(
NominalHist[SampleNum]->GetName());
506 name = name.substr(0, name.find(
"_nom"));
509 for (
int i = 1; i <=
maxBins[SampleNum]; i++)
512 TH2PolyBin* bin =
static_cast<TH2PolyBin*
>(
NominalHist[SampleNum]->GetBins()->At(i-1));
515 std::stringstream ss2;
517 ss2 <<
"p_{#mu} (" << bin->GetXMin() <<
"-" << bin->GetXMax() <<
")";
518 ss2 <<
" cos#theta_{#mu} (" << bin->GetYMin() <<
"-" << bin->GetYMax() <<
")";
521 PosteriorHist_ByMode[SampleNum][j][i] =
new TH1D((name+ss2.str()).c_str(),(name+ss2.str()).c_str(),nXBins, 1, -1);
524 MeanHist_ByMode[SampleNum][j]->SetNameTitle((name+
"_mean").c_str(), (name+
"_mean").c_str());
533 #pragma omp parallel for
535 for (
int SampleNum = 0; SampleNum <
nSamples; SampleNum++)
537 if (
DataHist[SampleNum] ==
nullptr)
continue;
543 for (
int i = 1; i <=
maxBins[SampleNum]; ++i)
545 const double Content = SampleVector_ByMode[SampleNum][j]->GetBinContent(i);
558 TempString.replace(TempString.find(
".root"), 5, std::string(
"_procsW2.root"));
595 OutputTree =
new TTree(
"LLH_draws",
"LLH_draws");
603 while (SampleName.find(
" ") != std::string::npos) {
604 SampleName.replace(SampleName.find(
" "), 1, std::string(
"_"));
608 while (SampleName.find(
"-") != std::string::npos) {
609 SampleName.replace(SampleName.find(
"-"), 1, std::string(
"_"));
677 MACH3LOG_INFO(
"Made Prior/Posterior Predictive, it took {:.2f}s, now writing...", timer.RealTime());
707 RatioHistMean->GetZaxis()->SetTitle(
"Data/Mean");
709 RatioHistMode->GetZaxis()->SetTitle(
"Data/Mode");
711 RatioHistNom->GetZaxis()->SetTitle(
"Data/Nom");
723 TH1D *MeanHistCorrectedProjectX =
nullptr;
725 TH1D *MeanHistCorrectedProjectY =
nullptr;
756 while (SampleName.find(
"-") != std::string::npos) {
757 SampleName.replace(SampleName.find(
"-"), 1, std::string(
"_"));
759 OutputTree->Draw((SampleName+
"_data_draw:"+SampleName+
"_drawfluc_draw>>htemp").c_str());
760 TH2D *TempHistogram =
static_cast<TH2D*
>(gDirectory->Get(
"htemp")->Clone());
761 TempHistogram->GetXaxis()->SetTitle(
"-2LLH(Draw Fluc, Draw)");
762 TempHistogram->GetYaxis()->SetTitle(
"-2LLH(Data, Draw)");
763 TempHistogram->SetNameTitle((
SampleNames[i]+
"_drawfluc_draw").c_str(), (
SampleNames[i]+
"_drawfluc_draw").c_str());
765 TempHistogram->Write();
766 delete TempHistogram;
769 OutputTree->Draw((SampleName+
"_data_draw:"+SampleName+
"_predfluc_draw>>htemp2").c_str());
770 TH2D *TempHistogram2 =
static_cast<TH2D*
>(gDirectory->Get(
"htemp2")->Clone());
771 TempHistogram2->GetXaxis()->SetTitle(
"-2LLH(Pred Fluc, Draw)");
772 TempHistogram2->GetYaxis()->SetTitle(
"-2LLH(Data, Draw)");
773 TempHistogram2->SetNameTitle((
SampleNames[i]+
"_predfluc_draw").c_str(), (
SampleNames[i]+
"_predfluc_draw").c_str());
775 TempHistogram2->Write();
776 delete TempHistogram2;
779 OutputTree->Draw((SampleName+
"_rate_data_draw:"+SampleName+
"_rate_predfluc_draw>>htemp3").c_str());
780 TH2D *TempHistogram3 =
static_cast<TH2D*
>(gDirectory->Get(
"htemp3")->Clone());
781 TempHistogram3->GetXaxis()->SetTitle(
"-2LLH(Pred Fluc, Draw)");
782 TempHistogram3->GetYaxis()->SetTitle(
"-2LLH(Data, Draw)");
783 TempHistogram3->SetNameTitle((
SampleNames[i]+
"_rate_predfluc_draw").c_str(), (
SampleNames[i]+
"_rate_predfluc_draw").c_str());
785 TempHistogram3->Write();
786 delete TempHistogram3;
789 OutputTree->Draw((SampleName+
"_data_draw_ProjectX:"+SampleName+
"_drawfluc_draw_ProjectX>>htemp4").c_str());
790 TH2D *TempHistogram4 =
static_cast<TH2D*
>(gDirectory->Get(
"htemp4")->Clone());
793 TempHistogram4->SetNameTitle((
SampleNames[i]+
"_drawfluc_draw_ProjectX").c_str(), (
SampleNames[i]+
"_drawfluc_draw_ProjectX").c_str());
795 TempHistogram4->Write();
796 delete TempHistogram4;
803 RatioHistMean->Write();
804 RatioHistMode->Write();
805 RatioHistNom->Write();
812 DataNormHist->Write();
813 NomNormHist->Write();
814 MeanNormHist->Write();
815 ModeNormHist->Write();
818 NomProjectX->Write();
819 MeanProjectX->Write();
820 ModeProjectX->Write();
821 if(
DoBetaParam) MeanHistCorrectedProjectX->Write();
825 NomProjectY->Write();
826 MeanProjectY->Write();
827 ModeProjectY->Write();
828 if(
DoBetaParam) MeanHistCorrectedProjectY->Write();
831 W2NomProjectX->Write();
832 W2MeanProjectX->Write();
833 W2ModeProjectX->Write();
835 W2NomProjectY->Write();
836 W2MeanProjectY->Write();
837 W2ModeProjectY->Write();
842 TDirectory* DebugDir =
Dir[i]->mkdir(
"Debug");
844 for (
int b = 1; b <=
maxBins[i]; ++b)
851 TempLine->SetLineColor(kRed);
852 TempLine->SetLineWidth(2);
854 auto TempLineData = std::make_unique<TLine>(
DataHist[i]->GetBinContent(b),
PosteriorHist[i][b]->GetMinimum(),
856 TempLineData->SetLineColor(kGreen);
857 TempLineData->SetLineWidth(2);
862 Fitter->SetLineColor(kRed-5);
864 auto Legend = std::make_unique<TLegend>(0.4, 0.75, 0.98, 0.90);
865 Legend->SetFillColor(0);
866 Legend->SetFillStyle(0);
867 Legend->SetLineWidth(0);
868 Legend->SetLineColor(0);
869 Legend->AddEntry(TempLineData.get(), Form(
"Data #mu=%.2f",
DataHist[i]->GetBinContent(b)),
"l");
870 Legend->AddEntry(TempLine.get(), Form(
"Prior #mu=%.2f",
NominalHist[i]->GetBinContent(b)),
"l");
872 Legend->AddEntry(Fitter, Form(
"Gauss, #mu=%.2f#pm%.2f", Fitter->GetParameter(1), Fitter->GetParameter(2)),
"l");
873 std::string TempTitle = std::string(
PosteriorHist[i][b]->GetName());
875 TempTitle +=
"_canv";
876 TCanvas *TempCanvas =
new TCanvas(TempTitle.c_str(), TempTitle.c_str(), 1024, 1024);
877 TempCanvas->SetGridx();
878 TempCanvas->SetGridy();
879 TempCanvas->SetRightMargin(0.03);
880 TempCanvas->SetBottomMargin(0.08);
881 TempCanvas->SetLeftMargin(0.10);
882 TempCanvas->SetTopMargin(0.06);
885 TempLine->Draw(
"same");
886 TempLineData->Draw(
"same");
887 Fitter->Draw(
"same");
888 Legend->Draw(
"same");
922 MeanProjectX_ByMode->Write();
923 MeanProjectY_ByMode->Write();
927 for (
int b = 1; b <=
maxBins[i]; ++b)
932 delete MeanProjectX_ByMode;
933 delete MeanProjectY_ByMode;
937 delete RatioHistMean;
938 delete RatioHistMode;
958 delete W2NomProjectX;
959 delete W2MeanProjectX;
960 delete W2ModeProjectX;
962 delete W2NomProjectY;
963 delete W2MeanProjectY;
964 delete W2ModeProjectY;
978 double llh_total_temp = 0.0;
982 #pragma omp parallel for reduction(+:llh_total_temp)
984 for (
int SampleNum = 0; SampleNum <
nSamples; ++SampleNum)
990 double negLogL_Mean = 0.0;
991 double negLogL_Mode = 0.0;
994 for (
int j = 1; j <
maxBins[SampleNum]+1; ++j)
997 TH1D *W2Projection =
w2Hist[SampleNum][j].get();
1000 const double nData =
DataHist[SampleNum]->GetBinContent(j);
1004 const double nMean = Projection->GetMean();
1005 const double nMeanError = Projection->GetRMS();
1006 const double nMode = Projection->GetBinCenter(Projection->GetMaximumBin());
1009 const double nW2Mean = W2Projection->GetMean();
1010 const double nW2Mode = W2Projection->GetBinCenter(W2Projection->GetMaximumBin());
1012 double TempLLH_Mean = 0.0;
1013 double TempLLH_Mode = 0.0;
1021 negLogL_Mean += 2*TempLLH_Mean;
1022 negLogL_Mode += 2*TempLLH_Mode;
1025 MeanHist[SampleNum]->SetBinContent(j,
MeanHist[SampleNum]->GetBinContent(j)+nMean);
1027 MeanHist[SampleNum]->SetBinError(j, nMeanError);
1031 TH1D *BetaTemp =
BetaHist[SampleNum][j].get();
1032 const double nBetaMean = BetaTemp->GetMean();
1033 const double nBetaMeanError = BetaTemp->GetRMS();
1037 const double ErrorTemp = std::sqrt( (nBetaMean*nMeanError) * (nBetaMean*nMeanError) + (nMean*nBetaMeanError) * (nMean*nBetaMeanError));
1042 ModeHist[SampleNum]->SetBinContent(j,
ModeHist[SampleNum]->GetBinContent(j)+nMode);
1044 ModeHist[SampleNum]->SetBinError(j, nModeError);
1052 lnLHist_Mean[SampleNum]->SetBinContent(j, 2.0*TempLLH_Mean);
1053 lnLHist_Mode[SampleNum]->SetBinContent(j, 2.0*TempLLH_Mode);
1063 for (
int i = 1; i <
maxBins[SampleNum]+1; ++i)
1071 const double nMean = Projection->GetMean();
1072 const double nMeanError = Projection->GetRMS();
1081 llh_total_temp += negLogL_Mean;
1085 for (
int SampleNum = 0; SampleNum <
nSamples; ++SampleNum)
1098 const double nMean = MeanProjectX->GetBinContent(j);
1099 const double nW2Mean = W2MeanProjectX->GetBinContent(j);
1101 double TempLLH_Mean = 0.0;
1108 delete MeanProjectX;
1109 delete W2MeanProjectX;
1115 std::stringstream ss;
1117 lnLHist->SetTitle((std::string(
lnLHist->GetTitle())+
"_"+ss.str()).c_str());
1137 double AveragePenalty = 0;
1140 std::vector<double> LLH_PredFluc_V(
nThrows);
1141 std::vector<double> LLH_DataDraw_V(
nThrows);
1142 std::vector<double> LLH_DrawFlucDraw_V(
nThrows);
1147 for (
unsigned int i = 0; i <
nThrows; ++i)
1154 double total_llh_data_draw_temp = 0.0;
1155 double total_llh_drawfluc_draw_temp = 0.0;
1156 double total_llh_predfluc_draw_temp = 0.0;
1158 double total_llh_rate_data_draw_temp = 0.0;
1159 double total_llh_rate_predfluc_draw_temp = 0.0;
1161 double total_llh_data_drawfluc_temp = 0.0;
1162 double total_llh_data_predfluc_temp = 0.0;
1163 double total_llh_draw_pred_temp = 0.0;
1164 double total_llh_drawfluc_pred_temp = 0.0;
1165 double total_llh_drawfluc_predfluc_temp = 0.0;
1166 double total_llh_predfluc_pred_temp = 0.0;
1167 double total_llh_datafluc_draw_temp = 0.0;
1169 double total_llh_data_draw_ProjectX_temp = 0.0;
1170 double total_llh_drawfluc_draw_ProjectX_temp = 0.0;
1177 std::vector<TH2Poly*> FluctHist(
nSamples);
1179 std::vector<TH2Poly*> FluctDrawHist(
nSamples);
1181 std::vector<TH2Poly*> DataFlucHist(
nSamples);
1184 std::vector<TH1D*> FluctDrawHistProjectX(
nSamples);
1185 std::vector<TH1D*> DrawHistProjectX(
nSamples);
1186 std::vector<TH1D*> DrawHistProjectY(
nSamples);
1187 std::vector<TH1D*> DrawW2HistProjectX(
nSamples);
1190 for (
int SampleNum = 0; SampleNum <
nSamples; ++SampleNum)
1192 FluctHist[SampleNum] =
static_cast<TH2Poly*
>(
MeanHist[SampleNum]->Clone());
1193 FluctDrawHist[SampleNum] =
static_cast<TH2Poly*
>(
MeanHist[SampleNum]->Clone());
1194 DataFlucHist[SampleNum] =
static_cast<TH2Poly*
>(
MeanHist[SampleNum]->Clone());
1196 FluctDrawHistProjectX[SampleNum] =
static_cast<TH1D*
>(
DataHist_ProjectX[SampleNum]->Clone());
1199 TH2Poly *DrawHist =
MCVector[i][SampleNum];
1200 TH2Poly *DrawW2Hist =
W2MCVector[i][SampleNum];
1203 DrawHistProjectX[SampleNum] =
ProjectPoly(DrawHist,
true, SampleNum);
1204 DrawW2HistProjectX[SampleNum] =
ProjectPoly(DrawW2Hist,
true, SampleNum);
1205 DrawHistProjectY[SampleNum] =
ProjectPoly(DrawHist,
false, SampleNum);
1209 #pragma omp parallel for reduction(+:total_llh_data_draw_temp, total_llh_drawfluc_draw_temp, total_llh_predfluc_draw_temp, total_llh_rate_data_draw_temp, total_llh_rate_predfluc_draw_temp, total_llh_data_drawfluc_temp, total_llh_data_predfluc_temp, total_llh_draw_pred_temp, total_llh_drawfluc_pred_temp, total_llh_drawfluc_predfluc_temp, total_llh_predfluc_pred_temp, total_llh_datafluc_draw_temp, total_llh_data_draw_ProjectX_temp, total_llh_drawfluc_draw_ProjectX_temp)
1212 for (
int SampleNum = 0; SampleNum <
nSamples; ++SampleNum)
1215 TH2Poly *DrawHist =
MCVector[i][SampleNum];
1216 TH2Poly *DrawW2Hist =
W2MCVector[i][SampleNum];
1218 if (DrawHist ==
nullptr)
continue;
1262 const double DataDrawLLH =
GetLLH(
DataHist[SampleNum], DrawHist, DrawW2Hist);
1264 total_llh_data_draw_temp += DataDrawLLH;
1267 const double DrawFlucDrawLLH =
GetLLH(FluctDrawHist[SampleNum], DrawHist, DrawW2Hist);
1269 total_llh_drawfluc_draw_temp += DrawFlucDrawLLH;
1272 const double PredFlucDrawLLH =
GetLLH(FluctHist[SampleNum], DrawHist, DrawW2Hist);
1274 total_llh_predfluc_draw_temp += PredFlucDrawLLH;
1280 total_llh_rate_data_draw_temp += RateDataDrawLLH;
1285 total_llh_rate_predfluc_draw_temp += RatePredFlucDrawLLH;
1289 const double DataDrawFlucLLH =
GetLLH(
DataHist[SampleNum], FluctDrawHist[SampleNum], DrawW2Hist);
1291 total_llh_data_drawfluc_temp += DataDrawFlucLLH;
1296 total_llh_data_predfluc_temp += DataPredFlucLLH;
1301 total_llh_draw_pred_temp += DrawPredLLH;
1306 total_llh_drawfluc_pred_temp += DrawFlucPredLLH;
1309 const double DrawFlucPredFlucLLH =
GetLLH(FluctDrawHist[SampleNum], FluctHist[SampleNum],
W2MeanHist[SampleNum]);
1311 total_llh_drawfluc_predfluc_temp += DrawFlucPredFlucLLH;
1316 total_llh_predfluc_pred_temp += PredFlucPredLLH;
1319 const double DataFlucDrawLLH =
GetLLH(DataFlucHist[SampleNum], DrawHist, DrawW2Hist);
1321 total_llh_datafluc_draw_temp += DataFlucDrawLLH;
1331 const double DataDrawLLH_ProjectX =
GetLLH(
DataHist_ProjectX[SampleNum], DrawHistProjectX[SampleNum], DrawW2HistProjectX[SampleNum]);
1333 total_llh_data_draw_ProjectX_temp += DataDrawLLH_ProjectX;
1335 const double DrawFlucDrawLLH_ProjectX =
GetLLH(FluctDrawHistProjectX[SampleNum], DrawHistProjectX[SampleNum], DrawW2HistProjectX[SampleNum]);
1337 total_llh_drawfluc_draw_ProjectX_temp += DrawFlucDrawLLH_ProjectX;
1345 for (
int SampleNum = 0; SampleNum <
nSamples; ++SampleNum)
1347 delete FluctHist[SampleNum];
1348 delete FluctDrawHist[SampleNum];
1349 delete DataFlucHist[SampleNum];
1350 delete FluctDrawHistProjectX[SampleNum];
1351 delete DrawHistProjectX[SampleNum];
1352 delete DrawHistProjectY[SampleNum];
1353 delete DrawW2HistProjectX[SampleNum];
1411 AveragePenalty = AveragePenalty/double(
nThrows);
1412 MACH3LOG_INFO(
"Average LLH penalty over toys is {:.2f}", AveragePenalty);
1414 unsigned int Accept_PredFluc = 0;
1415 unsigned int Accept_DrawFluc = 0;
1416 for (
unsigned int i = 0; i <
nThrows; ++i)
1418 if (LLH_DataDraw_V[i] > LLH_DrawFlucDraw_V[i]) Accept_DrawFluc++;
1419 if (LLH_DataDraw_V[i] > LLH_PredFluc_V[i]) Accept_PredFluc++;
1421 const double pvalue_DrawFluc = double(Accept_DrawFluc)/double(
nThrows);
1422 const double pvalue_PredFluc = double(Accept_PredFluc)/double(
nThrows);
1424 MACH3LOG_INFO(
"Calculated exact p-value using Fluctuation of Draw: {:.2f}", pvalue_DrawFluc);
1425 MACH3LOG_INFO(
"Calculated exact p-value using Fluctuation of Prediction: {:.2f}", pvalue_PredFluc);
1448 const double TotalIntegral = Histogram->Integral();
1451 double llh_reference = 0.0;
1453 llh_reference = llh_ref;
1457 for (
int i = 0; i < Histogram->GetXaxis()->GetNbins(); ++i) {
1458 const double xvalue = Histogram->GetBinCenter(i+1);
1459 if (xvalue >= llh_reference) {
1460 Above += Histogram->GetBinContent(i+1);
1463 const double pvalue = Above/TotalIntegral;
1464 std::stringstream ss;
1465 ss << int(Above) <<
"/" << int(TotalIntegral) <<
"=" << pvalue;
1466 Histogram->SetTitle((std::string(Histogram->GetTitle())+
"_"+ss.str()).c_str());
1469 auto TempLine = std::make_unique<TLine>(llh_reference , Histogram->GetMinimum(), llh_reference, Histogram->GetMaximum());
1470 TempLine->SetLineColor(kBlack);
1471 TempLine->SetLineWidth(2);
1474 TH1D *TempHistogram =
static_cast<TH1D*
>(Histogram->Clone());
1475 TempHistogram->SetFillStyle(1001);
1476 TempHistogram->SetFillColor(kRed);
1477 for (
int i = 0; i < TempHistogram->GetNbinsX(); ++i) {
1478 if (TempHistogram->GetBinCenter(i+1) < llh_reference) {
1479 TempHistogram->SetBinContent(i+1, 0.0);
1483 auto Legend = std::make_unique<TLegend>(0.6, 0.6, 0.9, 0.9);
1484 Legend->SetFillColor(0);
1485 Legend->SetFillStyle(0);
1486 Legend->SetLineWidth(0);
1487 Legend->SetLineColor(0);
1488 Legend->AddEntry(TempLine.get(), Form(
"Reference LLH, %.0f, p-value=%.2f", llh_reference, pvalue),
"l");
1489 Legend->AddEntry(Histogram, Form(
"LLH, #mu=%.1f#pm%.1f", Histogram->GetMean(), Histogram->GetRMS()),
"l");
1490 std::string Title = Histogram->GetName();
1492 TCanvas *TempCanvas =
new TCanvas(Title.c_str(), Title.c_str(), 1024, 1024);
1493 TempCanvas->SetGridx();
1494 TempCanvas->SetGridy();
1496 TempHistogram->Draw(
"same");
1497 TempLine->Draw(
"same");
1498 Legend->Draw(
"same");
1500 TempCanvas->Write();
1502 delete TempHistogram;
1511 auto TempLine = std::make_unique<TLine>(DataRate, Histogram->GetMinimum(), DataRate, Histogram->GetMaximum());
1512 TempLine->SetLineColor(kRed);
1513 TempLine->SetLineWidth(2);
1515 TF1 *Fitter =
new TF1(
"Fit",
"gaus", Histogram->GetBinLowEdge(1), Histogram->GetBinLowEdge(Histogram->GetNbinsX()+1));
1516 Histogram->Fit(Fitter,
"RQ");
1517 Fitter->SetLineColor(kRed-5);
1520 for (
int z = 0; z < Histogram->GetNbinsX(); ++z) {
1521 const double xvalue = Histogram->GetBinCenter(z+1);
1522 if (xvalue >= DataRate) {
1523 Above += Histogram->GetBinContent(z+1);
1526 const double pvalue = Above/Histogram->Integral();
1527 auto Legend = std::make_unique<TLegend>(0.4, 0.75, 0.98, 0.90);
1528 Legend->SetFillColor(0);
1529 Legend->SetFillStyle(0);
1530 Legend->SetLineWidth(0);
1531 Legend->SetLineColor(0);
1532 Legend->AddEntry(TempLine.get(), Form(
"Data, %.0f, p-value=%.2f", DataRate, pvalue),
"l");
1533 Legend->AddEntry(Histogram, Form(
"MC, #mu=%.1f#pm%.1f", Histogram->GetMean(), Histogram->GetRMS()),
"l");
1534 Legend->AddEntry(Fitter, Form(
"Gauss, #mu=%.1f#pm%.1f", Fitter->GetParameter(1), Fitter->GetParameter(2)),
"l");
1535 std::string TempTitle = std::string(Histogram->GetName());
1536 TempTitle +=
"_canv";
1537 TCanvas *TempCanvas =
new TCanvas(TempTitle.c_str(), TempTitle.c_str(), 1024, 1024);
1538 TempCanvas->SetGridx();
1539 TempCanvas->SetGridy();
1540 TempCanvas->SetRightMargin(0.03);
1541 TempCanvas->SetBottomMargin(0.08);
1542 TempCanvas->SetLeftMargin(0.10);
1543 TempCanvas->SetTopMargin(0.06);
1546 TempLine->Draw(
"same");
1547 Fitter->Draw(
"same");
1548 Legend->Draw(
"same");
1549 TempCanvas->Write();
1560 const double llh =
GetLLH(DatHist, MCHist, W2Hist);
1561 std::stringstream ss;
1562 ss <<
"_2LLH=" << llh;
1563 MCHist->SetTitle((std::string(MCHist->GetTitle())+ss.str()).c_str());
1564 MACH3LOG_INFO(
"{:<55} {:<10.2f} {:<10.2f} {:<10.2f}", MCHist->GetName(), DatHist->Integral(), MCHist->Integral(), llh);
1571 const double llh =
GetLLH(DatHist, MCHist, W2Hist);
1572 std::stringstream ss;
1573 ss <<
"_2LLH=" << llh;
1574 MCHist->SetTitle((std::string(MCHist->GetTitle())+ss.str()).c_str());
1582 for (
int i = 1; i < DatHist->GetNumberOfBins()+1; ++i)
1584 const double data = DatHist->GetBinContent(i);
1585 const double mc = MCHist->GetBinContent(i);
1586 const double w2 = W2Hist->GetBinContent(i);
1597 for (
int i = 1; i <= DatHist->GetXaxis()->GetNbins(); ++i)
1599 const double data = DatHist->GetBinContent(i);
1600 const double mc = MCHist->GetBinContent(i);
1601 const double w2 = W2Hist->GetBinContent(i);
1612 TDirectory *BetaDir =
Outputfile->mkdir(
"BetaParameters");
1615 int originalErrorLevel = gErrorIgnoreLevel;
1618 gErrorIgnoreLevel = kFatal;
1621 std::vector<TDirectory *> DirBeta(
nSamples);
1625 DirBeta[i] = BetaDir->mkdir((
SampleNames[i]).c_str());
1629 for (
int j = 1; j <
maxBins[i]+1; ++j)
1631 const double data =
DataHist[i]->GetBinContent(j);
1632 const double mc =
NominalHist[i]->GetBinContent(j);
1633 const double w2 =
W2NomHist[i]->GetBinContent(j);
1637 auto TempLine = std::unique_ptr<TLine>(
new TLine(BetaPrior,
BetaHist[i][j]->GetMinimum(), BetaPrior,
BetaHist[i][j]->GetMaximum()));
1638 TempLine->SetLineColor(kRed);
1639 TempLine->SetLineWidth(2);
1642 TF1 *Fitter =
new TF1(
"Fit",
"gaus",
BetaHist[i][j]->GetBinLowEdge(1),
BetaHist[i][j]->GetBinLowEdge(
BetaHist[i][j]->GetNbinsX()+1));
1644 Fitter->SetLineColor(kRed-5);
1646 auto Legend = std::make_unique<TLegend>(0.4, 0.75, 0.98, 0.90);
1647 Legend->SetFillColor(0);
1648 Legend->SetFillStyle(0);
1649 Legend->SetLineWidth(0);
1650 Legend->SetLineColor(0);
1651 Legend->AddEntry(TempLine.get(), Form(
"Prior #mu=%.4f, N_{data}=%.0f", BetaPrior, data),
"l");
1652 Legend->AddEntry(
BetaHist[i][j].get(), Form(
"Post, #mu=%.4f#pm%.4f",
BetaHist[i][j]->GetMean(),
BetaHist[i][j]->GetRMS()),
"l");
1653 Legend->AddEntry(Fitter, Form(
"Gauss, #mu=%.4f#pm%.4f", Fitter->GetParameter(1), Fitter->GetParameter(2)),
"l");
1654 std::string TempTitle = std::string(
BetaHist[i][j]->GetName());
1656 TempTitle +=
"_canv";
1657 TCanvas *TempCanvas =
new TCanvas(TempTitle.c_str(), TempTitle.c_str(), 1024, 1024);
1658 TempCanvas->SetGridx();
1659 TempCanvas->SetGridy();
1660 TempCanvas->SetRightMargin(0.03);
1661 TempCanvas->SetBottomMargin(0.08);
1662 TempCanvas->SetLeftMargin(0.10);
1663 TempCanvas->SetTopMargin(0.06);
1666 TempLine->Draw(
"same");
1667 Fitter->Draw(
"same");
1668 Legend->Draw(
"same");
1669 TempCanvas->Write();
1675 DirBeta[i]->Write();
1681 gErrorIgnoreLevel = originalErrorLevel;
1694 std::vector<double> NEvents_Sample(
nSamples);
1695 double event_rate = 0.;
1698 TTree* Event_Rate_Tree =
new TTree(
"Event_Rate_draws",
"Event_Rate_draws");
1699 Event_Rate_Tree->Branch(
"Event_Rate", &event_rate);
1706 while (SampleName.find(
"-") != std::string::npos) {
1707 SampleName.replace(SampleName.find(
"-"), 1, std::string(
"_"));
1709 Event_Rate_Tree->Branch((SampleName+
"_Event_Rate").c_str(), &NEvents_Sample[i]);
1713 auto EventHist = std::make_unique<TH1D>(
"EventHist",
"Total Event Rate", 100, 1, -1);
1714 EventHist->SetDirectory(
nullptr);
1715 EventHist->GetXaxis()->SetTitle(
"Total event rate");
1716 EventHist->GetYaxis()->SetTitle(
"Counts");
1717 EventHist->SetLineWidth(2);
1720 std::vector<std::unique_ptr<TH1D>> SumHist(
nSamples);
1723 std::string name = std::string(
NominalHist[i]->GetName());
1724 name = name.substr(0, name.find(
"_nom"));
1726 SumHist[i] = std::make_unique<TH1D>((name+
"_sum").c_str(),(name+
"_sum").c_str(), 100, 1, -1);
1727 SumHist[i]->GetXaxis()->SetTitle(
"N_{events}");
1728 SumHist[i]->GetYaxis()->SetTitle(
"Counts");
1730 std::stringstream ss;
1732 SumHist[i]->SetTitle((std::string(SumHist[i]->GetTitle())+
"_"+ss.str()).c_str());
1735 for (
unsigned int it = 0; it <
nThrows; ++it)
1737 double event_rate_temp = 0.;
1740 #pragma omp parallel for reduction(+:event_rate_temp)
1742 for (
int SampleNum = 0; SampleNum <
nSamples; ++SampleNum)
1746 SumHist[SampleNum]->Fill(NEvents_Sample[SampleNum],
WeightVector[it]);
1748 event_rate_temp += NEvents_Sample[SampleNum];
1750 event_rate = event_rate_temp;
1751 EventHist->Fill(event_rate);
1752 Event_Rate_Tree->Fill();
1754 Event_Rate_Tree->Write();
1755 delete Event_Rate_Tree;
1757 double DataRate = 0.0;
1759 #pragma omp parallel for reduction(+:DataRate)
1767 for (
int SampleNum = 0; SampleNum <
nSamples; ++SampleNum)
1769 Dir[SampleNum]->cd();
1775 TDirectory *CorrDir =
Outputfile->mkdir(
"Correlations");
1778 TMatrixDSym* SampleCorrelation =
new TMatrixDSym(
nSamples);
1779 std::vector<std::vector<std::unique_ptr<TH2D>>> SamCorr(
nSamples);
1784 (*SampleCorrelation)(i,i) = 1.0;
1785 const double Min_i = SumHist[i]->GetXaxis()->GetBinLowEdge(1);
1786 const double Max_i = SumHist[i]->GetXaxis()->GetBinUpEdge(SumHist[i]->GetNbinsX()+1);
1789 const double Min_j = SumHist[j]->GetXaxis()->GetBinLowEdge(1);
1790 const double Max_j = SumHist[j]->GetXaxis()->GetBinUpEdge(SumHist[j]->GetNbinsX()+1);
1793 SamCorr[i][j] = std::make_unique<TH2D>(Form(
"SamCorr_%i_%i", i, j), Form(
"SamCorr_%i_%i", i, j), 70, Min_i, Max_i, 70, Min_j, Max_j);
1794 SamCorr[i][j]->SetDirectory(
nullptr);
1795 SamCorr[i][j]->SetMinimum(0);
1796 SamCorr[i][j]->GetXaxis()->SetTitle(
SampleNames[i].c_str());
1797 SamCorr[i][j]->GetYaxis()->SetTitle(
SampleNames[j].c_str());
1798 SamCorr[i][j]->GetZaxis()->SetTitle(
"Events");
1804 #pragma omp parallel for
1808 for (
int j = 0; j <= i; ++j)
1811 if (j == i)
continue;
1813 for (
unsigned int it = 0; it <
nThrows; ++it)
1817 SamCorr[i][j]->Smooth();
1820 (*SampleCorrelation)(i,j) = SamCorr[i][j]->GetCorrelationFactor();
1821 (*SampleCorrelation)(j,i) = (*SampleCorrelation)(i,j);
1826 hSamCorr->SetDirectory(
nullptr);
1827 hSamCorr->GetZaxis()->SetTitle(
"Correlation");
1828 hSamCorr->SetMinimum(-1);
1829 hSamCorr->SetMaximum(1);
1830 hSamCorr->GetXaxis()->SetLabelSize(0.015);
1831 hSamCorr->GetYaxis()->SetLabelSize(0.015);
1836 hSamCorr->GetXaxis()->SetBinLabel(i+1,
SampleNames[i].c_str());
1840 hSamCorr->GetYaxis()->SetBinLabel(j+1,
SampleNames[j].c_str());
1842 const double corr = (*SampleCorrelation)(i,j);
1843 hSamCorr->SetBinContent(i+1, j+1, corr);
1846 hSamCorr->Draw(
"colz");
1847 hSamCorr->Write(
"Sample_Corr");
1849 SampleCorrelation->Write(
"Sample_Correlation");
1850 delete SampleCorrelation;
1854 for (
int j = 0; j <= i; ++j)
1857 if (j == i)
continue;
1858 SamCorr[i][j]->Write();
1863 bool DoPerKinemBin =
false;
1867 for (
int SampleNum = 0; SampleNum <
nSamples; ++SampleNum)
1869 TMatrixDSym* KinCorrelation =
new TMatrixDSym(
maxBins[SampleNum]);
1870 std::vector<std::vector<std::unique_ptr<TH2D>>> KinCorr(
maxBins[SampleNum]);
1871 for (
int i = 0; i <
maxBins[SampleNum]; ++i)
1873 KinCorr[i].resize(
maxBins[SampleNum]);
1874 (*KinCorrelation)(i,i) = 1.0;
1876 const double Min_i =
PosteriorHist[SampleNum][i+1]->GetXaxis()->GetBinLowEdge(1);
1880 TH2PolyBin* bin =
static_cast<TH2PolyBin*
>(
NominalHist[SampleNum]->GetBins()->At(i));
1882 std::stringstream ss2;
1883 ss2 <<
"p_{#mu} (" << bin->GetXMin() <<
"-" << bin->GetXMax() <<
")";
1884 ss2 <<
" cos#theta_{#mu} (" << bin->GetYMin() <<
"-" << bin->GetYMax() <<
")";
1886 for (
int j = 0; j <
maxBins[SampleNum]; ++j)
1888 const double Min_j =
PosteriorHist[SampleNum][j+1]->GetXaxis()->GetBinLowEdge(1);
1892 KinCorr[i][j] = std::make_unique<TH2D>( Form(
"Kin_%i_%i_%i", SampleNum, i, j),
1893 Form(
"Kin_%i_%i_%i", SampleNum, i, j), 70, Min_i, Max_i, 70, Min_j, Max_j);
1894 KinCorr[i][j]->SetDirectory(
nullptr);
1895 KinCorr[i][j]->SetMinimum(0);
1897 KinCorr[i][j]->GetXaxis()->SetTitle(ss2.str().c_str());
1899 bin =
static_cast<TH2PolyBin*
>(
NominalHist[SampleNum]->GetBins()->At(j));
1901 std::stringstream ss3;
1902 ss3 <<
"p_{#mu} (" << bin->GetXMin() <<
"-" << bin->GetXMax() <<
")";
1903 ss3 <<
" cos#theta_{#mu} (" << bin->GetYMin() <<
"-" << bin->GetYMax() <<
")";
1904 KinCorr[i][j]->GetYaxis()->SetTitle(ss3.str().c_str());
1905 KinCorr[i][j]->GetZaxis()->SetTitle(
"Events");
1910 #pragma omp parallel for
1912 for (
int i = 0; i <
maxBins[SampleNum]; ++i)
1914 for (
int j = 0; j <= i; ++j)
1917 if (j == i)
continue;
1919 for (
unsigned int it = 0; it <
nThrows; ++it)
1921 KinCorr[i][j]->Fill(
MCVector[it][SampleNum]->GetBinContent(i+1),
MCVector[it][SampleNum]->GetBinContent(j+1));
1923 KinCorr[i][j]->Smooth();
1926 (*KinCorrelation)(i,j) = KinCorr[i][j]->GetCorrelationFactor();
1927 (*KinCorrelation)(j,i) = (*KinCorrelation)(i,j);
1933 hKinCorr->SetDirectory(
nullptr);
1934 hKinCorr->GetZaxis()->SetTitle(
"Correlation");
1935 hKinCorr->SetMinimum(-1);
1936 hKinCorr->SetMaximum(1);
1937 hKinCorr->GetXaxis()->SetLabelSize(0.015);
1938 hKinCorr->GetYaxis()->SetLabelSize(0.015);
1941 for (
int i = 0; i <
maxBins[SampleNum]; ++i)
1944 TH2PolyBin* bin =
static_cast<TH2PolyBin*
>(
NominalHist[SampleNum]->GetBins()->At(i));
1946 std::stringstream ss2;
1947 ss2 <<
"p_{#mu} (" << bin->GetXMin() <<
"-" << bin->GetXMax() <<
")";
1948 ss2 <<
" cos#theta_{#mu} (" << bin->GetYMin() <<
"-" << bin->GetYMax() <<
")";
1949 hKinCorr->GetXaxis()->SetBinLabel(i+1, ss2.str().c_str());
1951 for (
int j = 0; j <
maxBins[SampleNum]; ++j)
1953 bin =
static_cast<TH2PolyBin*
>(
NominalHist[SampleNum]->GetBins()->At(j));
1955 std::stringstream ss3;
1956 ss3 <<
"p_{#mu} (" << bin->GetXMin() <<
"-" << bin->GetXMax() <<
")";
1957 ss3 <<
" cos#theta_{#mu} (" << bin->GetYMin() <<
"-" << bin->GetYMax() <<
")";
1958 KinCorr[i][j]->GetYaxis()->SetTitle(ss3.str().c_str());
1960 hKinCorr->GetYaxis()->SetBinLabel(j+1, ss3.str().c_str());
1962 const double corr = (*KinCorrelation)(i,j);
1963 hKinCorr->SetBinContent(i+1, j+1, corr);
1966 hKinCorr->Draw(
"colz");
1967 hKinCorr->Write((
SampleNames[SampleNum] +
"_Corr").c_str());
1969 KinCorrelation->Write((
SampleNames[SampleNum] +
"_Correlation").c_str());
1970 delete KinCorrelation;
1987 MACH3LOG_INFO(
"Not calculating correlations per each kinematic bin");
1997 EventHist_ByMode[j] =
new TH1D(Form(
"EventHist_%s", ModeName.c_str()), Form(
"Total Event Rate %s", ModeName.c_str()), 100, 1, -1);
1998 EventHist_ByMode[j]->GetXaxis()->SetTitle(
"Total event rate");
1999 EventHist_ByMode[j]->GetYaxis()->SetTitle(
"Counts");
2000 EventHist_ByMode[j]->SetLineWidth(2);
2004 for (
unsigned int it = 0; it <
nThrows; ++it)
2008 double event_rate_temp = 0.;
2010 #pragma omp parallel for reduction(+:event_rate_temp)
2012 for (
int SampleNum = 0; SampleNum <
nSamples; SampleNum++)
2016 EventHist_ByMode[j]->Fill(event_rate_temp);
2025 TMatrixDSym* ModeCorrelation =
new TMatrixDSym(
Modes->
GetNModes()+1);
2032 (*ModeCorrelation)(i,i) = 1.0;
2034 const double Min_i = EventHist_ByMode[i]->GetXaxis()->GetBinLowEdge(1);
2035 const double Max_i = EventHist_ByMode[i]->GetXaxis()->GetBinUpEdge(EventHist_ByMode[i]->GetNbinsX()+1);
2038 const double Min_j = EventHist_ByMode[j]->GetXaxis()->GetBinLowEdge(1);
2039 const double Max_j = EventHist_ByMode[j]->GetXaxis()->GetBinUpEdge(EventHist_ByMode[j]->GetNbinsX()+1);
2042 ModeCorr[i][j] =
new TH2D(Form(
"ModeCorr_%i_%i",i,j), Form(
"ModeCorr_%i_%i",i,j), 70, Min_i, Max_i, 70, Min_j, Max_j);
2043 ModeCorr[i][j]->SetDirectory(
nullptr);
2044 ModeCorr[i][j]->SetMinimum(0);
2047 ModeCorr[i][j]->GetZaxis()->SetTitle(
"Events");
2053 #pragma omp parallel for
2057 for (
int j = 0; j <= i; ++j)
2060 if (j == i)
continue;
2062 for (
unsigned int it = 0; it <
nThrows; ++it)
2064 double Integral_X = 0.;
2065 double Integral_Y = 0.;
2066 for (
int SampleNum = 0; SampleNum <
nSamples; ++SampleNum)
2071 ModeCorr[i][j]->Fill(Integral_X, Integral_Y);
2073 ModeCorr[i][j]->Smooth();
2076 (*ModeCorrelation)(i,j) = ModeCorr[i][j]->GetCorrelationFactor();
2077 (*ModeCorrelation)(j,i) = (*ModeCorrelation)(i,j);
2082 hModeCorr->SetDirectory(
nullptr);
2083 hModeCorr->GetZaxis()->SetTitle(
"Correlation");
2084 hModeCorr->SetMinimum(-1);
2085 hModeCorr->SetMaximum(1);
2086 hModeCorr->GetXaxis()->SetLabelSize(0.015);
2087 hModeCorr->GetYaxis()->SetLabelSize(0.015);
2098 const double corr = (*ModeCorrelation)(i,j);
2099 hModeCorr->SetBinContent(i+1, j+1, corr);
2102 hModeCorr->Draw(
"colz");
2103 hModeCorr->Write(
"Mode_Corr");
2108 for (
int j = 0; j <= i; ++j)
2111 if (j == i)
continue;
2112 ModeCorr[i][j]->Write();
2120 delete ModeCorr[i][j];
2122 delete[] ModeCorr[i];
2125 ModeCorrelation->Write(
"Mode_Correlation");
2126 delete ModeCorrelation;
2130 delete EventHist_ByMode[j];
2138 MACH3LOG_INFO(
"Calculating correlations took {:.2f}s", timer.RealTime());
2146 TH1D* Projection =
nullptr;
2149 name = std::string(Histogram->GetName()) +
"_x";
2150 Projection = Histogram->ProjectionX(name.c_str(), 1, Histogram->GetYaxis()->GetNbins(),
"e");
2152 name = std::string(Histogram->GetName()) +
"_y";
2153 Projection = Histogram->ProjectionY(name.c_str(), 1, Histogram->GetXaxis()->GetNbins(),
"e");
2165 TH1D* Projection =
nullptr;
2168 name = std::string(Histogram->GetName()) +
"_x";
2169 Projection =
PolyProjectionX(Histogram, name.c_str(), xbins, MakeErrorHist);
2171 name = std::string(Histogram->GetName()) +
"_y";
2172 Projection =
PolyProjectionY(Histogram, name.c_str(), ybins, MakeErrorHist);
2226 double DataRate = 0.0;
2227 double BinsRate = 0.0;
2229 #pragma omp parallel for reduction(+:DataRate, BinsRate)
2233 if (
DataHist[i] ==
nullptr)
continue;
2240 MACH3LOG_INFO(
"Calculated Bayesian Information Criterion using global number of events: {:.2f}", EventRateBIC);
2241 MACH3LOG_INFO(
"Calculated Bayesian Information Criterion using global number of bins: {:.2f}", BinBasedBIC);
2253 #pragma omp parallel for reduction(+:Dbar)
2255 for (
unsigned int i = 0; i <
nThrows; ++i)
2257 double LLH_temp = 0.;
2258 for (
int SampleNum = 0; SampleNum <
nSamples; ++SampleNum)
2271 const double p_D = std::fabs(Dbar - Dhat);
2274 const double DIC_stat = Dhat + 2 * p_D;
2275 MACH3LOG_INFO(
"Effective number of parameters following DIC formalism is equal to: {:.2f}", p_D);
2289 #pragma omp parallel for reduction(+:lppd, p_WAIC)
2291 for (
int SampleNum = 0; SampleNum <
nSamples; ++SampleNum) {
2293 for (
int i = 1; i <=
nBins; ++i) {
2294 double mean_llh = 0.;
2295 double sum_exp_llh = 0;
2296 double mean_llh_squared = 0.;
2298 for (
unsigned int s = 0; s <
nThrows; ++s) {
2299 const double data =
DataHist[SampleNum]->GetBinContent(i);
2300 const double mc =
MCVector[s][SampleNum]->GetBinContent(i);
2301 const double w2 =
W2MCVector[s][SampleNum]->GetBinContent(i);
2307 double LLH_temp = -neg_LLH_temp;
2309 mean_llh += LLH_temp;
2310 mean_llh_squared += LLH_temp * LLH_temp;
2311 sum_exp_llh += std::exp(LLH_temp);
2318 sum_exp_llh = std::log(sum_exp_llh);
2321 lppd += sum_exp_llh;
2324 p_WAIC += mean_llh_squared - (mean_llh * mean_llh);
2329 double WAIC = -2 * (lppd - p_WAIC);
2330 MACH3LOG_INFO(
"Effective number of parameters following WAIC formalism is equal to: {:.2f}", p_WAIC);
void MakeFluctuatedHistogramAlternative(TH1D *FluctHist, TH1D *PolyHist, TRandom3 *rand)
Make Poisson fluctuation of TH1D hist using slow method which is only for cross-check.
void NormaliseTH2Poly(TH2Poly *Histogram)
Helper to Normalise histograms.
void MakeFluctuatedHistogramStandard(TH1D *FluctHist, TH1D *PolyHist, TRandom3 *rand)
Make Poisson fluctuation of TH1D hist using default fast method.
TH1D * PolyProjectionX(TObject *poly, std::string TempName, const std::vector< double > &xbins, const bool computeErrors)
WP: Poly Projectors.
void FastViolinFill(TH2D *violin, TH1D *hist_1d)
KS: Fill Violin histogram with entry from a toy.
TH2Poly * NormalisePoly(TH2Poly *Histogram)
WP: Helper to Normalise histograms.
TH2Poly * RatioPolys(TH2Poly *NumHist, TH2Poly *DenomHist)
Helper to make ratio of TH2Polys.
TH1D * PolyProjectionY(TObject *poly, std::string TempName, const std::vector< double > &ybins, const bool computeErrors)
WP: Poly Projectors.
double NoOverflowIntegral(TH2Poly *poly)
WP: Helper function for calculating binned Integral of TH2Poly i.e not including overflow.
double GetBetaParameter(const double data, const double mc, const double w2, const TestStatistic TestStat)
KS: Calculate Beta parameter which will be different based on specified test statistic.
double GetBIC(const double llh, const int data, const int nPars)
Get the Bayesian Information Criterion (BIC) or Schwarz information criterion (also SIC,...
void Get2DBayesianpValue(TH2D *Histogram)
Calculates the 2D Bayesian p-value and generates a visualization.
double GetModeError(TH1D *hpost)
Get the mode error from a TH1D.
Custom exception class used throughout MaCh3.
int GetNModes() const
KS: Get number of modes, keep in mind actual number is +1 greater due to unknown category.
std::string GetMaCh3ModeName(const int Index) const
KS: Get normal name of mode, if mode not known you will get UNKNOWN_BAD.
Class responsible for handling implementation of samples used in analysis, reweighting and returning ...
virtual std::string GetKinVarName(const int iSample, const int Dimension) const =0
Return Kinematic Variable name for specified sample and dimension for example "Reconstructed_Neutrino...
MaCh3Modes * GetMaCh3Modes() const
Return pointer to MaCh3 modes.
double GetTestStatLLH(const double data, const double mc, const double w2) const
Calculate test statistic for a single bin. Calculation depends on setting of fTestStatistic....
virtual std::vector< double > ReturnKinematicParameterBinning(const int Sample, const std::string &KinematicParameter) const =0
Return the binning used to draw a kinematic parameter.
virtual std::string GetSampleTitle(const int Sample) const =0
void StudyInformationCriterion(M3::kInfCrit Criterion)
Information Criterion.
std::vector< TH2Poly * > lnLHist_Mode
The LLH distribution in pmu cosmu for using the mode in each bin.
std::vector< double > LLHPenaltyVector
Vector to hold the penalty term.
std::vector< double > llh_data_draw_ProjectX
Projection X (most likely muon momentum) of LLH.
void MakeCutEventRate(TH1D *Histogram, const double DataRate)
Make the 1D Event Rate Hist.
SampleHandlerBase * SampleHandler
Pointer to SampleHandler object, mostly used to get sample names, binning etc.
~SampleSummary()
Destructor.
std::vector< double > llh_predfluc_draw
Fluctuated Predictive vs Draw.
void AddThrow(std::vector< TH2Poly * > &MCHist, std::vector< TH2Poly * > &W2Hist, const double LLHPenalty=0.0, const double Weight=1.0, const int DrawNumber=0)
KS: Add histograms with throws.
std::vector< std::vector< TH2Poly * > > MCVector
Vector of vectors which holds the loaded MC histograms.
std::vector< TH2Poly * > lnLHist_Mean
The LLH distribution in pmu cosmu for using the mean in each bin.
void CalcLLH(TH2Poly *const &Data, TH2Poly *const &MC, TH2Poly *const &W2)
Helper functions to calculate likelihoods using TH2Poly, will modify MC hist title to include LLH.
double total_llh_predfluc_pred
Fluctuated Predictive vs Predictive.
double total_llh_drawfluc_draw_ProjectX
Fluctuated Draw vs Draw for projection X (most likely muon momentum)
std::vector< std::vector< TH2Poly * > > W2MCVector
Vector of vectors which holds the loaded W2 histograms.
std::vector< TH2Poly * > W2MeanHist
Pointer to the w2 histograms (for mean values).
double total_llh_data_draw
Data vs Draw.
std::unique_ptr< TH1D > RandomHist
Holds the history of which entries have been drawn in the MCMC file.
double total_llh_rate_predfluc_draw
Fluctuated Predictive vs Draw using Rate.
void MakeChi2Hists()
Make the fluctuated histograms (2D and 1D) for the chi2s Essentially taking the MCMC draws and calcul...
std::vector< double > llh_data_predfluc
Data vs Fluctuated Predictive.
void StudyBIC()
Study Bayesian Information Criterion (BIC) .
std::unique_ptr< TRandom3 > rnd
Random number generator.
std::vector< TH1D * > lnLHist_Mode1D
Holds the bin-by-bin LLH for the mode posterior predictive vs the data.
std::string OutputName
Output filename.
void MakePredictive()
Finalise the distributions from the thrown samples.
std::vector< double > llh_predfluc_pred
Fluctuated Predictive vs Predictive.
std::vector< std::vector< std::unique_ptr< TH1D > > > BetaHist
Distribution of beta parameters in Barlow Beeston formalisms.
int nModelParams
Number of parameters.
std::vector< TH2D * > ViolinHists_ProjectX
Posterior predictive but for X projection but as a violin plot.
bool first_pass
KS: Hacky flag to let us know if this is first toy.
std::vector< TH2Poly * > NominalHist
The nominal histogram for the selection.
std::vector< std::vector< std::unique_ptr< TH1D > > > PosteriorHist
The posterior predictive for the whole selection: this gets built after adding in the toys....
double total_llh_draw_pred
Draw vs Predictive.
std::vector< double > llh_drawfluc_draw
Fluctuated Draw vs Draw.
double total_llh_data_draw_ProjectX
Data vs Draw for projection X (most likely muon momentum)
std::vector< TH2Poly * > MeanHistCorrected
The posterior predictive distribution in pmu cosmu using the mean after applying Barlow-Beeston Corre...
std::vector< double > llh_drawfluc_predfluc
Fluctuated Draw vs Fluctuated Predictive.
MaCh3Modes * Modes
MaCh3 Modes.
std::vector< double > llh_data_draw
Data vs Draw.
double total_llh_data_drawfluc
Data vs Fluctuated Draw.
void AddData(std::vector< TH2Poly * > &DataHist)
KS: Add data histograms.
TH1D * ProjectPoly(TH2Poly *Histogram, const bool ProjectX, const int selection, const bool MakeErrorHist=false)
Helper to project TH2Poly onto axis.
std::unique_ptr< TH1D > lnLHist
The histogram containing the lnL for each throw.
std::vector< TH1D * > lnLHist_Mean1D
Holds the bin-by-bin LLH for the mean posterior predictive vs the data.
TTree * OutputTree
TTree which we save useful information to.
bool DoByModePlots
By mode variables.
std::vector< TH1D * > lnLHist_Mean_ProjectX
The LLH distribution in pmu using the mean in each bin.
void PrepareOutput()
KS: Prepare output tree and necessary variables.
SampleSummary(const int n_Samples, const std::string &Filename, SampleHandlerBase *const sample, const int nSteps)
Constructor.
double total_llh_drawfluc_draw
Fluctuated Draw vs Draw.
std::vector< TH2Poly * > DataHist
The data histogram for the selection.
std::vector< double > llh_draw_pred
Draw vs Predictive.
double total_llh_predfluc_draw
Fluctuated Predictive vs Draw.
int Debug
Tells Debug level to save additional histograms.
std::vector< double > llh_drawfluc_draw_ProjectX
bool CheckSamples(const int Length)
Check the length of samples agrees.
std::unique_ptr< TH2D > lnLDrawHist
The 2D lnLhist, showing (draw vs data) and (draw vs fluct), anything above y=x axis is the p-value.
void AddNominal(std::vector< TH2Poly * > &NominalHist, std::vector< TH2Poly * > &W2Nom)
KS: Add prior histograms.
void StudyDIC()
KS: Get the Deviance Information Criterion (DIC) .
void AddThrowByMode(std::vector< std::vector< TH2Poly * >> &SampleVector_ByMode)
KS: Add histograms for each mode.
std::vector< TH2D * > ViolinHists_ProjectY
Posterior predictive but for Y projection but as a violin plot.
std::vector< double > llh_data_drawfluc
Data vs Fluctuated Draw.
std::vector< TH2Poly * > ModeHist
The posterior predictive distribution in pmu cosmu using the mode.
std::vector< std::string > SampleNames
name for each sample
std::vector< TH2Poly * > W2NomHist
Pointer to the w2 histograms (for nominal values).
double total_llh_drawfluc_pred
Fluctuated Draw vs Predictive.
void StudyWAIC()
KS: Get the Watanabe-Akaike information criterion (WAIC) .
std::vector< TDirectory * > Dir
Directory for each sample.
std::vector< double > llh_rate_predfluc_draw
Fluctuated Predictive vs Draw using rate only.
unsigned int nThrows
Number of throws.
std::vector< TH1D * > lnLHist_Sample_DrawData
The histogram containing the lnL (draw vs data) for each throw for each sample.
std::vector< std::vector< std::unique_ptr< TH1D > > > w2Hist
The posterior predictive for the whole selection: this gets built after adding in the toys....
TH1D **** PosteriorHist_ByMode
Histogram which corresponds to each bin in the sample's th2poly.
std::unique_ptr< TH1D > lnLHist_drawflucdraw
The lnLhist for the draw vs draw fluctuated.
TFile * Outputfile
Output filename.
double llh_total
Total LLH for the posterior predictive distribution.
void Write()
KS: Write results into root file.
std::unique_ptr< TH2D > lnLDrawHistRate
The 2D lnLhist, showing (draw vs data) and (draw vs fluct), using rate, anything above y=x axis is th...
double total_llh_rate_data_draw
Rate Data vs Draw.
std::unique_ptr< TH1D > lnLHist_drawdata
The lnLhist for the draw vs data.
TestStatistic likelihood
Type of likelihood for example Poisson, Barlow-Beeston or Ice Cube.
int nSamples
Number of samples.
void MakeCutLLH()
Make the cut LLH histogram.
std::vector< std::vector< std::vector< TH2Poly * > > > MCVectorByMode
Vector of vectors which holds the loaded MC histograms for each mode.
std::vector< double > llh_drawfluc_pred
Fluctuated Draw vs Predictive.
std::vector< std::vector< TH2Poly * > > MeanHist_ByMode
The posterior predictive distribution in pmu cosmu using the mean.
std::vector< double > llh_datafluc_draw
Fluctuated Data vs Draw.
std::vector< TH1D * > DataHist_ProjectX
The data histogram for the selection X projection.
void MakeCutLLH1D(TH1D *Histogram, double llh_ref=-999)
std::vector< TH1D * > DataHist_ProjectY
The data histogram for the selection Y projection.
void PlotBetaParameters()
KS: In Barlow Beeston we have Beta Parameters which scale generated MC.
double GetLLH(TH2Poly *const &Data, TH2Poly *const &MC, TH2Poly *const &W2)
Helper functions to calculate likelihoods using TH2Poly.
std::vector< double > WeightVector
Vector holding weight.
void MakeFluctuatedHistogram(TH1D *FluctHist, TH1D *PolyHist)
Make Poisson fluctuation of TH1D hist.
std::vector< double > llh_rate_data_draw
Data vs Draw using rate only.
bool isPriorPredictive
bool whether we have Prior or Posterior Predictive
bool DoBetaParam
Are we making Beta Histograms.
std::vector< TH2Poly * > W2ModeHist
Pointer to the w2 histograms (for mode values).
std::unique_ptr< TH2D > lnLFlucHist
The 2D lnLHist, showing (draw vs data) and (draw vs draw fluct), anything above y=x axis is the p-val...
bool StandardFluctuation
KS: We have two methods for Poissonian fluctuation.
std::unique_ptr< TH2D > lnLFlucHist_ProjectX
The 2D lnLHist but for ProjectionX histogram (pmu), showing (draw vs data) and (draw vs draw fluct),...
std::unique_ptr< TH1D > lnLHist_drawfluc
The lnLhist for the draw vs MC fluctuated.
bool doShapeOnly
bool whether to normalise each toy to have shape based p-value and pos pred distribution
std::vector< TH1D * > lnLHist_Sample_PredflucDraw
The histogram containing the lnL (draw vs pred fluct) for each throw for each sample.
double total_llh_data_predfluc
Data vs Fluctuated Predictive.
double llh_penalty
LLH penalty for each throw.
std::vector< TH2Poly * > MeanHist
The posterior predictive distribution in pmu cosmu using the mean.
unsigned int nChainSteps
Number of throws by user.
std::vector< int > maxBins
Max Number of Bins per each sample.
TH1D * ProjectHist(TH2D *Histogram, const bool ProjectX)
Helper to project TH2D onto axis.
double total_llh_drawfluc_predfluc
Fluctuated Draw vs Fluctuated Predictive.
double total_llh_datafluc_draw
Fluctuated Data vs Draw.
void StudyKinematicCorrelations()
KS: Study how correlated are sample or kinematic bins.
std::vector< TH1D * > lnLHist_Sample_DrawflucDraw
The histogram containing the lnL (draw vs draw fluct) for each throw for each sample.
kInfCrit
KS: Different Information Criterion tests mostly based Gelman paper.
@ kWAIC
Watanabe-Akaike information criterion.
@ kInfCrits
This only enumerates.
@ kBIC
Bayesian Information Criterion.
@ kDIC
Deviance Information Criterion.
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.
void PrintProgressBar(const Long64_t Done, const Long64_t All)
KS: Simply print progress bar.