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;
993 for (
int j = 1; j <
maxBins[SampleNum]+1; ++j)
996 TH1D *W2Projection =
w2Hist[SampleNum][j].get();
999 const double nData =
DataHist[SampleNum]->GetBinContent(j);
1003 const double nMean = Projection->GetMean();
1004 const double nMeanError = Projection->GetRMS();
1005 const double nMode = Projection->GetBinCenter(Projection->GetMaximumBin());
1008 const double nW2Mean = W2Projection->GetMean();
1009 const double nW2Mode = W2Projection->GetBinCenter(W2Projection->GetMaximumBin());
1011 double TempLLH_Mean = 0.0;
1012 double TempLLH_Mode = 0.0;
1020 negLogL_Mean += 2*TempLLH_Mean;
1023 MeanHist[SampleNum]->SetBinContent(j,
MeanHist[SampleNum]->GetBinContent(j)+nMean);
1025 MeanHist[SampleNum]->SetBinError(j, nMeanError);
1029 TH1D *BetaTemp =
BetaHist[SampleNum][j].get();
1030 const double nBetaMean = BetaTemp->GetMean();
1031 const double nBetaMeanError = BetaTemp->GetRMS();
1035 const double ErrorTemp = std::sqrt( (nBetaMean*nMeanError) * (nBetaMean*nMeanError) + (nMean*nBetaMeanError) * (nMean*nBetaMeanError));
1040 ModeHist[SampleNum]->SetBinContent(j,
ModeHist[SampleNum]->GetBinContent(j)+nMode);
1042 ModeHist[SampleNum]->SetBinError(j, nModeError);
1050 lnLHist_Mean[SampleNum]->SetBinContent(j, 2.0*TempLLH_Mean);
1051 lnLHist_Mode[SampleNum]->SetBinContent(j, 2.0*TempLLH_Mode);
1061 for (
int i = 1; i <
maxBins[SampleNum]+1; ++i)
1069 const double nMean = Projection->GetMean();
1070 const double nMeanError = Projection->GetRMS();
1079 llh_total_temp += negLogL_Mean;
1083 for (
int SampleNum = 0; SampleNum <
nSamples; ++SampleNum)
1096 const double nMean = MeanProjectX->GetBinContent(j);
1097 const double nW2Mean = W2MeanProjectX->GetBinContent(j);
1099 double TempLLH_Mean = 0.0;
1106 delete MeanProjectX;
1107 delete W2MeanProjectX;
1113 std::stringstream ss;
1115 lnLHist->SetTitle((std::string(
lnLHist->GetTitle())+
"_"+ss.str()).c_str());
1135 double AveragePenalty = 0;
1138 std::vector<double> LLH_PredFluc_V(
nThrows);
1139 std::vector<double> LLH_DataDraw_V(
nThrows);
1140 std::vector<double> LLH_DrawFlucDraw_V(
nThrows);
1145 for (
unsigned int i = 0; i <
nThrows; ++i)
1152 double total_llh_data_draw_temp = 0.0;
1153 double total_llh_drawfluc_draw_temp = 0.0;
1154 double total_llh_predfluc_draw_temp = 0.0;
1156 double total_llh_rate_data_draw_temp = 0.0;
1157 double total_llh_rate_predfluc_draw_temp = 0.0;
1159 double total_llh_data_drawfluc_temp = 0.0;
1160 double total_llh_data_predfluc_temp = 0.0;
1161 double total_llh_draw_pred_temp = 0.0;
1162 double total_llh_drawfluc_pred_temp = 0.0;
1163 double total_llh_drawfluc_predfluc_temp = 0.0;
1164 double total_llh_predfluc_pred_temp = 0.0;
1165 double total_llh_datafluc_draw_temp = 0.0;
1167 double total_llh_data_draw_ProjectX_temp = 0.0;
1168 double total_llh_drawfluc_draw_ProjectX_temp = 0.0;
1175 std::vector<TH2Poly*> FluctHist(
nSamples);
1177 std::vector<TH2Poly*> FluctDrawHist(
nSamples);
1179 std::vector<TH2Poly*> DataFlucHist(
nSamples);
1182 std::vector<TH1D*> FluctDrawHistProjectX(
nSamples);
1183 std::vector<TH1D*> DrawHistProjectX(
nSamples);
1184 std::vector<TH1D*> DrawHistProjectY(
nSamples);
1185 std::vector<TH1D*> DrawW2HistProjectX(
nSamples);
1188 for (
int SampleNum = 0; SampleNum <
nSamples; ++SampleNum)
1190 FluctHist[SampleNum] =
static_cast<TH2Poly*
>(
MeanHist[SampleNum]->Clone());
1191 FluctDrawHist[SampleNum] =
static_cast<TH2Poly*
>(
MeanHist[SampleNum]->Clone());
1192 DataFlucHist[SampleNum] =
static_cast<TH2Poly*
>(
MeanHist[SampleNum]->Clone());
1194 FluctDrawHistProjectX[SampleNum] =
static_cast<TH1D*
>(
DataHist_ProjectX[SampleNum]->Clone());
1197 TH2Poly *DrawHist =
MCVector[i][SampleNum];
1198 TH2Poly *DrawW2Hist =
W2MCVector[i][SampleNum];
1201 DrawHistProjectX[SampleNum] =
ProjectPoly(DrawHist,
true, SampleNum);
1202 DrawW2HistProjectX[SampleNum] =
ProjectPoly(DrawW2Hist,
true, SampleNum);
1203 DrawHistProjectY[SampleNum] =
ProjectPoly(DrawHist,
false, SampleNum);
1207 #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)
1210 for (
int SampleNum = 0; SampleNum <
nSamples; ++SampleNum)
1213 TH2Poly *DrawHist =
MCVector[i][SampleNum];
1214 TH2Poly *DrawW2Hist =
W2MCVector[i][SampleNum];
1216 if (DrawHist ==
nullptr)
continue;
1260 const double DataDrawLLH =
GetLLH(
DataHist[SampleNum], DrawHist, DrawW2Hist);
1262 total_llh_data_draw_temp += DataDrawLLH;
1265 const double DrawFlucDrawLLH =
GetLLH(FluctDrawHist[SampleNum], DrawHist, DrawW2Hist);
1267 total_llh_drawfluc_draw_temp += DrawFlucDrawLLH;
1270 const double PredFlucDrawLLH =
GetLLH(FluctHist[SampleNum], DrawHist, DrawW2Hist);
1272 total_llh_predfluc_draw_temp += PredFlucDrawLLH;
1278 total_llh_rate_data_draw_temp += RateDataDrawLLH;
1283 total_llh_rate_predfluc_draw_temp += RatePredFlucDrawLLH;
1287 const double DataDrawFlucLLH =
GetLLH(
DataHist[SampleNum], FluctDrawHist[SampleNum], DrawW2Hist);
1289 total_llh_data_drawfluc_temp += DataDrawFlucLLH;
1294 total_llh_data_predfluc_temp += DataPredFlucLLH;
1299 total_llh_draw_pred_temp += DrawPredLLH;
1304 total_llh_drawfluc_pred_temp += DrawFlucPredLLH;
1307 const double DrawFlucPredFlucLLH =
GetLLH(FluctDrawHist[SampleNum], FluctHist[SampleNum],
W2MeanHist[SampleNum]);
1309 total_llh_drawfluc_predfluc_temp += DrawFlucPredFlucLLH;
1314 total_llh_predfluc_pred_temp += PredFlucPredLLH;
1317 const double DataFlucDrawLLH =
GetLLH(DataFlucHist[SampleNum], DrawHist, DrawW2Hist);
1319 total_llh_datafluc_draw_temp += DataFlucDrawLLH;
1329 const double DataDrawLLH_ProjectX =
GetLLH(
DataHist_ProjectX[SampleNum], DrawHistProjectX[SampleNum], DrawW2HistProjectX[SampleNum]);
1331 total_llh_data_draw_ProjectX_temp += DataDrawLLH_ProjectX;
1333 const double DrawFlucDrawLLH_ProjectX =
GetLLH(FluctDrawHistProjectX[SampleNum], DrawHistProjectX[SampleNum], DrawW2HistProjectX[SampleNum]);
1335 total_llh_drawfluc_draw_ProjectX_temp += DrawFlucDrawLLH_ProjectX;
1343 for (
int SampleNum = 0; SampleNum <
nSamples; ++SampleNum)
1345 delete FluctHist[SampleNum];
1346 delete FluctDrawHist[SampleNum];
1347 delete DataFlucHist[SampleNum];
1348 delete FluctDrawHistProjectX[SampleNum];
1349 delete DrawHistProjectX[SampleNum];
1350 delete DrawHistProjectY[SampleNum];
1351 delete DrawW2HistProjectX[SampleNum];
1409 AveragePenalty = AveragePenalty/double(
nThrows);
1410 MACH3LOG_INFO(
"Average LLH penalty over toys is {:.2f}", AveragePenalty);
1412 unsigned int Accept_PredFluc = 0;
1413 unsigned int Accept_DrawFluc = 0;
1414 for (
unsigned int i = 0; i <
nThrows; ++i)
1416 if (LLH_DataDraw_V[i] > LLH_DrawFlucDraw_V[i]) Accept_DrawFluc++;
1417 if (LLH_DataDraw_V[i] > LLH_PredFluc_V[i]) Accept_PredFluc++;
1419 const double pvalue_DrawFluc = double(Accept_DrawFluc)/double(
nThrows);
1420 const double pvalue_PredFluc = double(Accept_PredFluc)/double(
nThrows);
1422 MACH3LOG_INFO(
"Calculated exact p-value using Fluctuation of Draw: {:.2f}", pvalue_DrawFluc);
1423 MACH3LOG_INFO(
"Calculated exact p-value using Fluctuation of Prediction: {:.2f}", pvalue_PredFluc);
1446 const double TotalIntegral = Histogram->Integral();
1449 double llh_reference = 0.0;
1451 llh_reference = llh_ref;
1455 for (
int i = 0; i < Histogram->GetXaxis()->GetNbins(); ++i) {
1456 const double xvalue = Histogram->GetBinCenter(i+1);
1457 if (xvalue >= llh_reference) {
1458 Above += Histogram->GetBinContent(i+1);
1461 const double pvalue = Above/TotalIntegral;
1462 std::stringstream ss;
1463 ss << int(Above) <<
"/" << int(TotalIntegral) <<
"=" << pvalue;
1464 Histogram->SetTitle((std::string(Histogram->GetTitle())+
"_"+ss.str()).c_str());
1467 auto TempLine = std::make_unique<TLine>(llh_reference , Histogram->GetMinimum(), llh_reference, Histogram->GetMaximum());
1468 TempLine->SetLineColor(kBlack);
1469 TempLine->SetLineWidth(2);
1472 TH1D *TempHistogram =
static_cast<TH1D*
>(Histogram->Clone());
1473 TempHistogram->SetFillStyle(1001);
1474 TempHistogram->SetFillColor(kRed);
1475 for (
int i = 0; i < TempHistogram->GetNbinsX(); ++i) {
1476 if (TempHistogram->GetBinCenter(i+1) < llh_reference) {
1477 TempHistogram->SetBinContent(i+1, 0.0);
1481 auto Legend = std::make_unique<TLegend>(0.6, 0.6, 0.9, 0.9);
1482 Legend->SetFillColor(0);
1483 Legend->SetFillStyle(0);
1484 Legend->SetLineWidth(0);
1485 Legend->SetLineColor(0);
1486 Legend->AddEntry(TempLine.get(), Form(
"Reference LLH, %.0f, p-value=%.2f", llh_reference, pvalue),
"l");
1487 Legend->AddEntry(Histogram, Form(
"LLH, #mu=%.1f#pm%.1f", Histogram->GetMean(), Histogram->GetRMS()),
"l");
1488 std::string Title = Histogram->GetName();
1490 TCanvas *TempCanvas =
new TCanvas(Title.c_str(), Title.c_str(), 1024, 1024);
1491 TempCanvas->SetGridx();
1492 TempCanvas->SetGridy();
1494 TempHistogram->Draw(
"same");
1495 TempLine->Draw(
"same");
1496 Legend->Draw(
"same");
1498 TempCanvas->Write();
1500 delete TempHistogram;
1509 auto TempLine = std::make_unique<TLine>(DataRate, Histogram->GetMinimum(), DataRate, Histogram->GetMaximum());
1510 TempLine->SetLineColor(kRed);
1511 TempLine->SetLineWidth(2);
1513 TF1 *Fitter =
new TF1(
"Fit",
"gaus", Histogram->GetBinLowEdge(1), Histogram->GetBinLowEdge(Histogram->GetNbinsX()+1));
1514 Histogram->Fit(Fitter,
"RQ");
1515 Fitter->SetLineColor(kRed-5);
1518 for (
int z = 0; z < Histogram->GetNbinsX(); ++z) {
1519 const double xvalue = Histogram->GetBinCenter(z+1);
1520 if (xvalue >= DataRate) {
1521 Above += Histogram->GetBinContent(z+1);
1524 const double pvalue = Above/Histogram->Integral();
1525 auto Legend = std::make_unique<TLegend>(0.4, 0.75, 0.98, 0.90);
1526 Legend->SetFillColor(0);
1527 Legend->SetFillStyle(0);
1528 Legend->SetLineWidth(0);
1529 Legend->SetLineColor(0);
1530 Legend->AddEntry(TempLine.get(), Form(
"Data, %.0f, p-value=%.2f", DataRate, pvalue),
"l");
1531 Legend->AddEntry(Histogram, Form(
"MC, #mu=%.1f#pm%.1f", Histogram->GetMean(), Histogram->GetRMS()),
"l");
1532 Legend->AddEntry(Fitter, Form(
"Gauss, #mu=%.1f#pm%.1f", Fitter->GetParameter(1), Fitter->GetParameter(2)),
"l");
1533 std::string TempTitle = std::string(Histogram->GetName());
1534 TempTitle +=
"_canv";
1535 TCanvas *TempCanvas =
new TCanvas(TempTitle.c_str(), TempTitle.c_str(), 1024, 1024);
1536 TempCanvas->SetGridx();
1537 TempCanvas->SetGridy();
1538 TempCanvas->SetRightMargin(0.03);
1539 TempCanvas->SetBottomMargin(0.08);
1540 TempCanvas->SetLeftMargin(0.10);
1541 TempCanvas->SetTopMargin(0.06);
1544 TempLine->Draw(
"same");
1545 Fitter->Draw(
"same");
1546 Legend->Draw(
"same");
1547 TempCanvas->Write();
1558 const double llh =
GetLLH(DatHist, MCHist, W2Hist);
1559 std::stringstream ss;
1560 ss <<
"_2LLH=" << llh;
1561 MCHist->SetTitle((std::string(MCHist->GetTitle())+ss.str()).c_str());
1562 MACH3LOG_INFO(
"{:<55} {:<10.2f} {:<10.2f} {:<10.2f}", MCHist->GetName(), DatHist->Integral(), MCHist->Integral(), llh);
1569 const double llh =
GetLLH(DatHist, MCHist, W2Hist);
1570 std::stringstream ss;
1571 ss <<
"_2LLH=" << llh;
1572 MCHist->SetTitle((std::string(MCHist->GetTitle())+ss.str()).c_str());
1580 for (
int i = 1; i < DatHist->GetNumberOfBins()+1; ++i)
1582 const double data = DatHist->GetBinContent(i);
1583 const double mc = MCHist->GetBinContent(i);
1584 const double w2 = W2Hist->GetBinContent(i);
1595 for (
int i = 1; i <= DatHist->GetXaxis()->GetNbins(); ++i)
1597 const double data = DatHist->GetBinContent(i);
1598 const double mc = MCHist->GetBinContent(i);
1599 const double w2 = W2Hist->GetBinContent(i);
1610 TDirectory *BetaDir =
Outputfile->mkdir(
"BetaParameters");
1613 int originalErrorLevel = gErrorIgnoreLevel;
1616 gErrorIgnoreLevel = kFatal;
1619 std::vector<TDirectory *> DirBeta(
nSamples);
1623 DirBeta[i] = BetaDir->mkdir((
SampleNames[i]).c_str());
1627 for (
int j = 1; j <
maxBins[i]+1; ++j)
1629 const double data =
DataHist[i]->GetBinContent(j);
1630 const double mc =
NominalHist[i]->GetBinContent(j);
1631 const double w2 =
W2NomHist[i]->GetBinContent(j);
1635 auto TempLine = std::unique_ptr<TLine>(
new TLine(BetaPrior,
BetaHist[i][j]->GetMinimum(), BetaPrior,
BetaHist[i][j]->GetMaximum()));
1636 TempLine->SetLineColor(kRed);
1637 TempLine->SetLineWidth(2);
1640 TF1 *Fitter =
new TF1(
"Fit",
"gaus",
BetaHist[i][j]->GetBinLowEdge(1),
BetaHist[i][j]->GetBinLowEdge(
BetaHist[i][j]->GetNbinsX()+1));
1642 Fitter->SetLineColor(kRed-5);
1644 auto Legend = std::make_unique<TLegend>(0.4, 0.75, 0.98, 0.90);
1645 Legend->SetFillColor(0);
1646 Legend->SetFillStyle(0);
1647 Legend->SetLineWidth(0);
1648 Legend->SetLineColor(0);
1649 Legend->AddEntry(TempLine.get(), Form(
"Prior #mu=%.4f, N_{data}=%.0f", BetaPrior, data),
"l");
1650 Legend->AddEntry(
BetaHist[i][j].get(), Form(
"Post, #mu=%.4f#pm%.4f",
BetaHist[i][j]->GetMean(),
BetaHist[i][j]->GetRMS()),
"l");
1651 Legend->AddEntry(Fitter, Form(
"Gauss, #mu=%.4f#pm%.4f", Fitter->GetParameter(1), Fitter->GetParameter(2)),
"l");
1652 std::string TempTitle = std::string(
BetaHist[i][j]->GetName());
1654 TempTitle +=
"_canv";
1655 TCanvas *TempCanvas =
new TCanvas(TempTitle.c_str(), TempTitle.c_str(), 1024, 1024);
1656 TempCanvas->SetGridx();
1657 TempCanvas->SetGridy();
1658 TempCanvas->SetRightMargin(0.03);
1659 TempCanvas->SetBottomMargin(0.08);
1660 TempCanvas->SetLeftMargin(0.10);
1661 TempCanvas->SetTopMargin(0.06);
1664 TempLine->Draw(
"same");
1665 Fitter->Draw(
"same");
1666 Legend->Draw(
"same");
1667 TempCanvas->Write();
1673 DirBeta[i]->Write();
1679 gErrorIgnoreLevel = originalErrorLevel;
1692 std::vector<double> NEvents_Sample(
nSamples);
1693 double event_rate = 0.;
1696 TTree* Event_Rate_Tree =
new TTree(
"Event_Rate_draws",
"Event_Rate_draws");
1697 Event_Rate_Tree->Branch(
"Event_Rate", &event_rate);
1704 while (SampleName.find(
"-") != std::string::npos) {
1705 SampleName.replace(SampleName.find(
"-"), 1, std::string(
"_"));
1707 Event_Rate_Tree->Branch((SampleName+
"_Event_Rate").c_str(), &NEvents_Sample[i]);
1711 auto EventHist = std::make_unique<TH1D>(
"EventHist",
"Total Event Rate", 100, 1, -1);
1712 EventHist->SetDirectory(
nullptr);
1713 EventHist->GetXaxis()->SetTitle(
"Total event rate");
1714 EventHist->GetYaxis()->SetTitle(
"Counts");
1715 EventHist->SetLineWidth(2);
1718 std::vector<std::unique_ptr<TH1D>> SumHist(
nSamples);
1721 std::string name = std::string(
NominalHist[i]->GetName());
1722 name = name.substr(0, name.find(
"_nom"));
1724 SumHist[i] = std::make_unique<TH1D>((name+
"_sum").c_str(),(name+
"_sum").c_str(), 100, 1, -1);
1725 SumHist[i]->GetXaxis()->SetTitle(
"N_{events}");
1726 SumHist[i]->GetYaxis()->SetTitle(
"Counts");
1728 std::stringstream ss;
1730 SumHist[i]->SetTitle((std::string(SumHist[i]->GetTitle())+
"_"+ss.str()).c_str());
1733 for (
unsigned int it = 0; it <
nThrows; ++it)
1735 double event_rate_temp = 0.;
1738 #pragma omp parallel for reduction(+:event_rate_temp)
1740 for (
int SampleNum = 0; SampleNum <
nSamples; ++SampleNum)
1744 SumHist[SampleNum]->Fill(NEvents_Sample[SampleNum],
WeightVector[it]);
1746 event_rate_temp += NEvents_Sample[SampleNum];
1748 event_rate = event_rate_temp;
1749 EventHist->Fill(event_rate);
1750 Event_Rate_Tree->Fill();
1752 Event_Rate_Tree->Write();
1753 delete Event_Rate_Tree;
1755 double DataRate = 0.0;
1757 #pragma omp parallel for reduction(+:DataRate)
1765 for (
int SampleNum = 0; SampleNum <
nSamples; ++SampleNum)
1767 Dir[SampleNum]->cd();
1773 TDirectory *CorrDir =
Outputfile->mkdir(
"Correlations");
1776 TMatrixDSym* SampleCorrelation =
new TMatrixDSym(
nSamples);
1777 std::vector<std::vector<std::unique_ptr<TH2D>>> SamCorr(
nSamples);
1782 (*SampleCorrelation)(i,i) = 1.0;
1783 const double Min_i = SumHist[i]->GetXaxis()->GetBinLowEdge(1);
1784 const double Max_i = SumHist[i]->GetXaxis()->GetBinUpEdge(SumHist[i]->GetNbinsX()+1);
1787 const double Min_j = SumHist[j]->GetXaxis()->GetBinLowEdge(1);
1788 const double Max_j = SumHist[j]->GetXaxis()->GetBinUpEdge(SumHist[j]->GetNbinsX()+1);
1791 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);
1792 SamCorr[i][j]->SetDirectory(
nullptr);
1793 SamCorr[i][j]->SetMinimum(0);
1794 SamCorr[i][j]->GetXaxis()->SetTitle(
SampleNames[i].c_str());
1795 SamCorr[i][j]->GetYaxis()->SetTitle(
SampleNames[j].c_str());
1796 SamCorr[i][j]->GetZaxis()->SetTitle(
"Events");
1802 #pragma omp parallel for
1806 for (
int j = 0; j <= i; ++j)
1809 if (j == i)
continue;
1811 for (
unsigned int it = 0; it <
nThrows; ++it)
1815 SamCorr[i][j]->Smooth();
1818 (*SampleCorrelation)(i,j) = SamCorr[i][j]->GetCorrelationFactor();
1819 (*SampleCorrelation)(j,i) = (*SampleCorrelation)(i,j);
1824 hSamCorr->SetDirectory(
nullptr);
1825 hSamCorr->GetZaxis()->SetTitle(
"Correlation");
1826 hSamCorr->SetMinimum(-1);
1827 hSamCorr->SetMaximum(1);
1828 hSamCorr->GetXaxis()->SetLabelSize(0.015);
1829 hSamCorr->GetYaxis()->SetLabelSize(0.015);
1834 hSamCorr->GetXaxis()->SetBinLabel(i+1,
SampleNames[i].c_str());
1838 hSamCorr->GetYaxis()->SetBinLabel(j+1,
SampleNames[j].c_str());
1840 const double corr = (*SampleCorrelation)(i,j);
1841 hSamCorr->SetBinContent(i+1, j+1, corr);
1844 hSamCorr->Draw(
"colz");
1845 hSamCorr->Write(
"Sample_Corr");
1847 SampleCorrelation->Write(
"Sample_Correlation");
1848 delete SampleCorrelation;
1852 for (
int j = 0; j <= i; ++j)
1855 if (j == i)
continue;
1856 SamCorr[i][j]->Write();
1861 bool DoPerKinemBin =
false;
1865 for (
int SampleNum = 0; SampleNum <
nSamples; ++SampleNum)
1867 TMatrixDSym* KinCorrelation =
new TMatrixDSym(
maxBins[SampleNum]);
1868 std::vector<std::vector<std::unique_ptr<TH2D>>> KinCorr(
maxBins[SampleNum]);
1869 for (
int i = 0; i <
maxBins[SampleNum]; ++i)
1871 KinCorr[i].resize(
maxBins[SampleNum]);
1872 (*KinCorrelation)(i,i) = 1.0;
1874 const double Min_i =
PosteriorHist[SampleNum][i+1]->GetXaxis()->GetBinLowEdge(1);
1878 TH2PolyBin* bin =
static_cast<TH2PolyBin*
>(
NominalHist[SampleNum]->GetBins()->At(i));
1880 std::stringstream ss2;
1881 ss2 <<
"p_{#mu} (" << bin->GetXMin() <<
"-" << bin->GetXMax() <<
")";
1882 ss2 <<
" cos#theta_{#mu} (" << bin->GetYMin() <<
"-" << bin->GetYMax() <<
")";
1884 for (
int j = 0; j <
maxBins[SampleNum]; ++j)
1886 const double Min_j =
PosteriorHist[SampleNum][j+1]->GetXaxis()->GetBinLowEdge(1);
1890 KinCorr[i][j] = std::make_unique<TH2D>( Form(
"Kin_%i_%i_%i", SampleNum, i, j),
1891 Form(
"Kin_%i_%i_%i", SampleNum, i, j), 70, Min_i, Max_i, 70, Min_j, Max_j);
1892 KinCorr[i][j]->SetDirectory(
nullptr);
1893 KinCorr[i][j]->SetMinimum(0);
1895 KinCorr[i][j]->GetXaxis()->SetTitle(ss2.str().c_str());
1897 bin =
static_cast<TH2PolyBin*
>(
NominalHist[SampleNum]->GetBins()->At(j));
1899 std::stringstream ss3;
1900 ss3 <<
"p_{#mu} (" << bin->GetXMin() <<
"-" << bin->GetXMax() <<
")";
1901 ss3 <<
" cos#theta_{#mu} (" << bin->GetYMin() <<
"-" << bin->GetYMax() <<
")";
1902 KinCorr[i][j]->GetYaxis()->SetTitle(ss3.str().c_str());
1903 KinCorr[i][j]->GetZaxis()->SetTitle(
"Events");
1908 #pragma omp parallel for
1910 for (
int i = 0; i <
maxBins[SampleNum]; ++i)
1912 for (
int j = 0; j <= i; ++j)
1915 if (j == i)
continue;
1917 for (
unsigned int it = 0; it <
nThrows; ++it)
1919 KinCorr[i][j]->Fill(
MCVector[it][SampleNum]->GetBinContent(i+1),
MCVector[it][SampleNum]->GetBinContent(j+1));
1921 KinCorr[i][j]->Smooth();
1924 (*KinCorrelation)(i,j) = KinCorr[i][j]->GetCorrelationFactor();
1925 (*KinCorrelation)(j,i) = (*KinCorrelation)(i,j);
1931 hKinCorr->SetDirectory(
nullptr);
1932 hKinCorr->GetZaxis()->SetTitle(
"Correlation");
1933 hKinCorr->SetMinimum(-1);
1934 hKinCorr->SetMaximum(1);
1935 hKinCorr->GetXaxis()->SetLabelSize(0.015);
1936 hKinCorr->GetYaxis()->SetLabelSize(0.015);
1939 for (
int i = 0; i <
maxBins[SampleNum]; ++i)
1942 TH2PolyBin* bin =
static_cast<TH2PolyBin*
>(
NominalHist[SampleNum]->GetBins()->At(i));
1944 std::stringstream ss2;
1945 ss2 <<
"p_{#mu} (" << bin->GetXMin() <<
"-" << bin->GetXMax() <<
")";
1946 ss2 <<
" cos#theta_{#mu} (" << bin->GetYMin() <<
"-" << bin->GetYMax() <<
")";
1947 hKinCorr->GetXaxis()->SetBinLabel(i+1, ss2.str().c_str());
1949 for (
int j = 0; j <
maxBins[SampleNum]; ++j)
1951 bin =
static_cast<TH2PolyBin*
>(
NominalHist[SampleNum]->GetBins()->At(j));
1953 std::stringstream ss3;
1954 ss3 <<
"p_{#mu} (" << bin->GetXMin() <<
"-" << bin->GetXMax() <<
")";
1955 ss3 <<
" cos#theta_{#mu} (" << bin->GetYMin() <<
"-" << bin->GetYMax() <<
")";
1956 KinCorr[i][j]->GetYaxis()->SetTitle(ss3.str().c_str());
1958 hKinCorr->GetYaxis()->SetBinLabel(j+1, ss3.str().c_str());
1960 const double corr = (*KinCorrelation)(i,j);
1961 hKinCorr->SetBinContent(i+1, j+1, corr);
1964 hKinCorr->Draw(
"colz");
1965 hKinCorr->Write((
SampleNames[SampleNum] +
"_Corr").c_str());
1967 KinCorrelation->Write((
SampleNames[SampleNum] +
"_Correlation").c_str());
1968 delete KinCorrelation;
1985 MACH3LOG_INFO(
"Not calculating correlations per each kinematic bin");
1995 EventHist_ByMode[j] =
new TH1D(Form(
"EventHist_%s", ModeName.c_str()), Form(
"Total Event Rate %s", ModeName.c_str()), 100, 1, -1);
1996 EventHist_ByMode[j]->GetXaxis()->SetTitle(
"Total event rate");
1997 EventHist_ByMode[j]->GetYaxis()->SetTitle(
"Counts");
1998 EventHist_ByMode[j]->SetLineWidth(2);
2002 for (
unsigned int it = 0; it <
nThrows; ++it)
2006 double event_rate_temp = 0.;
2008 #pragma omp parallel for reduction(+:event_rate_temp)
2010 for (
int SampleNum = 0; SampleNum <
nSamples; SampleNum++)
2014 EventHist_ByMode[j]->Fill(event_rate_temp);
2023 TMatrixDSym* ModeCorrelation =
new TMatrixDSym(
Modes->
GetNModes()+1);
2030 (*ModeCorrelation)(i,i) = 1.0;
2032 const double Min_i = EventHist_ByMode[i]->GetXaxis()->GetBinLowEdge(1);
2033 const double Max_i = EventHist_ByMode[i]->GetXaxis()->GetBinUpEdge(EventHist_ByMode[i]->GetNbinsX()+1);
2036 const double Min_j = EventHist_ByMode[j]->GetXaxis()->GetBinLowEdge(1);
2037 const double Max_j = EventHist_ByMode[j]->GetXaxis()->GetBinUpEdge(EventHist_ByMode[j]->GetNbinsX()+1);
2040 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);
2041 ModeCorr[i][j]->SetDirectory(
nullptr);
2042 ModeCorr[i][j]->SetMinimum(0);
2045 ModeCorr[i][j]->GetZaxis()->SetTitle(
"Events");
2051 #pragma omp parallel for
2055 for (
int j = 0; j <= i; ++j)
2058 if (j == i)
continue;
2060 for (
unsigned int it = 0; it <
nThrows; ++it)
2062 double Integral_X = 0.;
2063 double Integral_Y = 0.;
2064 for (
int SampleNum = 0; SampleNum <
nSamples; ++SampleNum)
2069 ModeCorr[i][j]->Fill(Integral_X, Integral_Y);
2071 ModeCorr[i][j]->Smooth();
2074 (*ModeCorrelation)(i,j) = ModeCorr[i][j]->GetCorrelationFactor();
2075 (*ModeCorrelation)(j,i) = (*ModeCorrelation)(i,j);
2080 hModeCorr->SetDirectory(
nullptr);
2081 hModeCorr->GetZaxis()->SetTitle(
"Correlation");
2082 hModeCorr->SetMinimum(-1);
2083 hModeCorr->SetMaximum(1);
2084 hModeCorr->GetXaxis()->SetLabelSize(0.015);
2085 hModeCorr->GetYaxis()->SetLabelSize(0.015);
2096 const double corr = (*ModeCorrelation)(i,j);
2097 hModeCorr->SetBinContent(i+1, j+1, corr);
2100 hModeCorr->Draw(
"colz");
2101 hModeCorr->Write(
"Mode_Corr");
2106 for (
int j = 0; j <= i; ++j)
2109 if (j == i)
continue;
2110 ModeCorr[i][j]->Write();
2118 delete ModeCorr[i][j];
2120 delete[] ModeCorr[i];
2123 ModeCorrelation->Write(
"Mode_Correlation");
2124 delete ModeCorrelation;
2128 delete EventHist_ByMode[j];
2136 MACH3LOG_INFO(
"Calculating correlations took {:.2f}s", timer.RealTime());
2144 TH1D* Projection =
nullptr;
2147 name = std::string(Histogram->GetName()) +
"_x";
2148 Projection = Histogram->ProjectionX(name.c_str(), 1, Histogram->GetYaxis()->GetNbins(),
"e");
2150 name = std::string(Histogram->GetName()) +
"_y";
2151 Projection = Histogram->ProjectionY(name.c_str(), 1, Histogram->GetXaxis()->GetNbins(),
"e");
2163 TH1D* Projection =
nullptr;
2166 name = std::string(Histogram->GetName()) +
"_x";
2167 Projection =
PolyProjectionX(Histogram, name.c_str(), xbins, MakeErrorHist);
2169 name = std::string(Histogram->GetName()) +
"_y";
2170 Projection =
PolyProjectionY(Histogram, name.c_str(), ybins, MakeErrorHist);
2224 double DataRate = 0.0;
2225 double BinsRate = 0.0;
2227 #pragma omp parallel for reduction(+:DataRate, BinsRate)
2231 if (
DataHist[i] ==
nullptr)
continue;
2238 MACH3LOG_INFO(
"Calculated Bayesian Information Criterion using global number of events: {:.2f}", EventRateBIC);
2239 MACH3LOG_INFO(
"Calculated Bayesian Information Criterion using global number of bins: {:.2f}", BinBasedBIC);
2251 #pragma omp parallel for reduction(+:Dbar)
2253 for (
unsigned int i = 0; i <
nThrows; ++i)
2255 double LLH_temp = 0.;
2256 for (
int SampleNum = 0; SampleNum <
nSamples; ++SampleNum)
2269 const double p_D = std::fabs(Dbar - Dhat);
2272 const double DIC_stat = Dhat + 2 * p_D;
2273 MACH3LOG_INFO(
"Effective number of parameters following DIC formalism is equal to: {:.2f}", p_D);
2287 #pragma omp parallel for reduction(+:lppd, p_WAIC)
2289 for (
int SampleNum = 0; SampleNum <
nSamples; ++SampleNum) {
2290 int nBins =
maxBins[SampleNum];
2291 for (
int i = 1; i <= nBins; ++i) {
2292 double mean_llh = 0.;
2293 double sum_exp_llh = 0;
2294 double mean_llh_squared = 0.;
2296 for (
unsigned int s = 0; s <
nThrows; ++s) {
2297 const double data =
DataHist[SampleNum]->GetBinContent(i);
2298 const double mc =
MCVector[s][SampleNum]->GetBinContent(i);
2299 const double w2 =
W2MCVector[s][SampleNum]->GetBinContent(i);
2305 double LLH_temp = -neg_LLH_temp;
2307 mean_llh += LLH_temp;
2308 mean_llh_squared += LLH_temp * LLH_temp;
2309 sum_exp_llh += std::exp(LLH_temp);
2316 sum_exp_llh = std::log(sum_exp_llh);
2319 lppd += sum_exp_llh;
2322 p_WAIC += mean_llh_squared - (mean_llh * mean_llh);
2327 double WAIC = -2 * (lppd - p_WAIC);
2328 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, const 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.
double NoOverflowIntegral(TH2Poly *poly)
WP: Helper function for calculating binned Integral of TH2Poly i.e not including overflow.
TH1D * PolyProjectionY(TObject *poly, const std::string &TempName, const std::vector< double > &ybins, const bool computeErrors)
WP: Poly Projectors.
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 ...
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.
MaCh3Modes * GetMaCh3Modes() const
Return pointer to MaCh3 modes.
virtual std::string GetSampleTitle(const int iSample) const =0
Get fancy title for specified samples.
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...
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.
~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.
SampleSummary(const int n_Samples, const std::string &Filename, SampleHandlerInterface *const sample, const int nSteps)
Constructor.
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....
SampleHandlerInterface * SampleHandler
Pointer to SampleHandler object, mostly used to get sample names, binning etc.
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.
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.
void PrintProgressBar(const Long64_t Done, const Long64_t All)
KS: Simply print progress bar.
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.