5 #include "CAFAna/pca/genie_diag_utils.h" 6 #include "CAFAna/pca/genie_plot_utils.h" 15 #include "TMatrixDSymEigen.h" 16 #include "TMatrixDSym.h" 44 for(
unsigned int i = 0;
i < samples.size();++
i){
49 std::vector<TH1D*> hUni;
58 std::vector<TH1D*> temp_hist;
59 for(
unsigned int j = 1;
j < hUni.size();++
j)
60 temp_hist.push_back(hUni[
j]);
70 for(
unsigned int i = length/2;
i <
length;++
i){
72 if(
i == length/2+4 ||
i == length/2+5)
continue;
74 if(
i == length/2+6 ||
i == length/2+7 ||
i == length/2+8 ||
i == length/2+9){
88 for(
unsigned int i = length/2;
i <
length;++
i){
89 if(
i == length/2+4 ||
i == length/2+5)
continue;
90 if(
i == length/2+6 ||
i == length/2+7 ||
i == length/2+8 ||
i == length/2+9){
103 for(
unsigned int i = 0;
i < length/2;++
i){
116 double nom_area =
nom_hist[
i]->Integral();
117 if(nom_area == 0)
continue;
129 TH1D* joint_hist_nom, std::vector<TH1D*> joint_hist_systs)
137 TH1D* retplus =
new TH1D(x);
139 retplus->SetName(nameplus.c_str());
140 retplus->Add(joint_hist_nom);
145 TH1D* retminus =
new TH1D(x);
147 retminus->SetName(nameminus.c_str());
148 retminus->Add(joint_hist_nom);
151 std::vector<TH1D*> h_proj_univs;
153 for(
unsigned int i = 0;
i <
univ_hist[0].size();
i+=10){
155 double projection = 0;
157 for(
int binIdx = 1; binIdx <= joint_hist_systs[
i]->GetNbinsX(); binIdx++)
158 projection += -1.*x[binIdx-1]*(joint_hist_systs[
i]->GetBinContent(binIdx)-joint_hist_nom->GetBinContent(binIdx));
160 projection *= 1./(x.Norm2Sqr());
165 TH1D*
ret =
new TH1D(y);
167 ret->SetName(name.c_str());
168 ret->Add(joint_hist_nom);
169 h_proj_univs.push_back(ret);
179 TH1D* joint_hist_nom, std::vector<TH1D*> joint_hist_systs)
181 TFile* saveHists =
new TFile(
"pc_shifts.root",
"RECREATE");
182 TDirectory *nomdir = saveHists->mkdir(
"nom");
184 TH1D* nom_save_hist = (TH1D*)joint_hist_nom->Clone(
"genie_nom");
185 nom_save_hist->Write();
188 TDirectory *univdir = saveHists->mkdir(
"univs");
190 for(
auto joint_hist_univ: joint_hist_systs) {
192 TH1D* joint_hist_syst_ratio = (TH1D*)joint_hist_univ->Clone(name_univ.c_str());
193 joint_hist_syst_ratio->Write();
197 TDirectory *pcdir = saveHists->mkdir(
"shifts");
201 TH1D* genieplus = (TH1D*)pc_shift->Clone(
"");
203 genieplus->SetName(nameplus_save.c_str());
205 if(pcIdx >= ncomponents)
break;
215 std::vector<TString> samples = {
216 "FHC_NumuND_numus_QE",
217 "RHC_NumuND_numus_QE",
218 "FHC_NumuND_numus_nonQE",
219 "RHC_NumuND_numus_nonQE",
220 "FHC_NumuND_ncs_All",
221 "RHC_NumuND_ncs_All",
225 "FHC_NueND_nues_nonQE",
226 "RHC_NueND_nues_nonQE",
227 "FHC_NueND_numus_All",
228 "RHC_NueND_numus_All",
232 "FHC_NumuFD_numus_QE",
233 "RHC_NumuFD_numus_QE",
234 "FHC_NumuFD_numus_nonQE",
235 "RHC_NumuFD_numus_nonQE",
236 "FHC_NumuFD_ncs_All",
237 "RHC_NumuFD_ncs_All",
241 "FHC_NueFD_nues_nonQE",
242 "RHC_NueFD_nues_nonQE",
243 "FHC_NueFD_numus_All",
244 "RHC_NueFD_numus_All",
265 std::vector <TH1D*> joint_hist_systs;
267 std::vector<TH1D*> temp_hist;
270 joint_hist_systs.push_back(joint_hist_univ);
275 int joint_nbins = joint_hist_nom->GetNbinsX();
278 const std::vector<TH1D*>
genie(joint_hist_systs.begin(), joint_hist_systs.end());
282 TMatrixDSymEigen cov(*covMx.get());
285 eigenvectors.Transpose(V);
286 TVectorD eigenvalues = cov.GetEigenValues();
295 int ncomponents = 100;
296 SavePCAShifts(ncomponents, joint_hist_nom, joint_hist_systs);
300 joint_hist_nom->SetMaximum(1.4*joint_hist_nom->GetMaximum());
301 joint_hist_nom->GetXaxis()->CenterTitle();
302 joint_hist_plus->SetLineColor(kAzure);
303 joint_hist_minus->SetLineColor(
kRed);
304 std::vector<TH1D*> joints;
305 for(
unsigned int i = 0;
i < joint_hist_systs.size();++
i){
306 joint_hist_systs[
i]->SetLineColor(kGray);
307 joints.push_back(joint_hist_systs[
i]);
309 joints.push_back(joint_hist_minus);
310 joints.push_back(joint_hist_plus);
314 TLegend *
l =
new TLegend(0.64,0.69,0.92,0.84);
316 l->AddEntry(joint_hist_nom,
"Nominal MC",
"l");
317 l->AddEntry(joint_hist_plus,
"+1#sigma Universe",
"l");
318 l->AddEntry(joint_hist_minus,
"-1#sigma Universe",
"l");
319 l->AddEntry(joint_hist_systs[0],
"Genie Universe",
"l");
329 c1->Print(
"plots/genie_all.pdf");
332 TH2D *histCov =
new TH2D(
"histCov",
"Bin-Bin Covariance", joint_nbins, 0, joint_nbins, joint_nbins, 0, joint_nbins);
333 for(
int xbinIdx = 1; xbinIdx <= joint_nbins; xbinIdx++){
334 for(
int ybinIdx = 1; ybinIdx <= joint_nbins; ybinIdx++){
335 histCov->Fill(xbinIdx, ybinIdx, (*covMx)[xbinIdx-1][ybinIdx-1]);
339 gStyle->SetPalette(kCool);
341 TCanvas *
c2 =
new TCanvas(
"c2",
"c2");
342 histCov->GetXaxis()->CenterTitle();
343 histCov->GetYaxis()->CenterTitle();
344 histCov->Draw(
"COLZ");
346 c2->SetRightMargin(0.125);
351 c2->Print(
"plots/genie_covariance.pdf");
353 for(
int i = 0;
i < eigenvalues.GetNrows();++
i)
354 if(eigenvalues[
i] < 10
E-15){
364 TCanvas *
c3 =
new TCanvas(
"c3",
"c3");
365 TH1D* histEigen =
new TH1D(eigenvalues);
366 histEigen->SetName(
"pi");
367 histEigen->GetXaxis()->SetTitle(
"Eigennumber");
368 histEigen->GetYaxis()->SetTitle(
"Eigenvalue");
369 histEigen->SetMarkerStyle(kFullCircle);
370 histEigen->GetXaxis()->SetRangeUser(0,238);
371 histEigen->GetXaxis()->CenterTitle();
372 histEigen->GetYaxis()->CenterTitle();
373 histEigen->Draw(
"p");
376 c3->Print(
"plots/genie_eigen.pdf");
379 TCanvas *
c4 =
new TCanvas(
"c4",
"c4");
380 TVectorD eigenInt(eigenvalues.GetNrows());
382 for(
int i = 0;
i < eigenvalues.GetNrows();++
i){
384 eigenInt[
i] = sum/eigenvalues.Sum();
386 TH1D* histEigenInt =
new TH1D(eigenInt);
387 histEigenInt->GetXaxis()->SetTitle(
"N_PC");
388 histEigenInt->GetYaxis()->SetTitle(
"Total Explained Variance");
389 histEigenInt->SetMarkerStyle(kFullCircle);
390 histEigenInt->GetXaxis()->SetRangeUser(0,238);
391 histEigenInt->GetXaxis()->CenterTitle();
392 histEigenInt->GetYaxis()->CenterTitle();
393 histEigenInt->Draw(
"p");
398 c4->Print(
"plots/genie_coverage.pdf");
403 for(
int i = 0;
i < 20;++
i){
414 TLegend *lproj =
new TLegend(0.64,0.69,0.92,0.84);
415 lproj->SetFillStyle(0);
416 lproj->AddEntry(joint_hist_nom,
"Nominal MC",
"l");
419 lproj->AddEntry(
pc_projections[i][0],
"Universes Projections",
"l");
429 tex->SetTextSize(1./30);
430 tex->SetTextAlign(32);
433 if(i<10) cproj->Print((
"plots/genie_proj_PC00"+
std::to_string(i)+
".pdf").c_str());
434 else if(i<100) cproj->Print((
"plots/genie_proj_PC0"+
std::to_string(i)+
".pdf").c_str());
TCanvas * QuickUnivRatioPlot(std::string name, TH1D *hNom, std::vector< TH1D * > others)
std::vector< int > axis_widths
std::vector< TH1D * > shifts_minus
Cuts and Vars for the 2020 FD DiF Study.
void genie_syst_pca(const int nuniverses=1000)
THE MAIN GENIE PROJECT NAMESPACE
std::vector< TH1D * > shifts_plus
void drawBinLines(std::vector< int > width)
TH1D * CombineHistograms(std::vector< TH1D * > hists)
void SavePCAShifts(int ncomponents, TH1D *joint_hist_nom, std::vector< TH1D * > joint_hist_systs)
const double kAna2018RHCPOT
void drawLabels(std::vector< std::string > labels)
std::vector< TH1D * > pc_shifts_minus
void FillHists(std::string fileName, std::vector< TString > samples, const int nuniverses)
std::vector< TH1D * > pc_shifts_plus
void FillPCAContainers(TMatrixD eigenvectors, TVectorD eigenvalues, TH1D *joint_hist_nom, std::vector< TH1D * > joint_hist_systs)
std::unique_ptr< TMatrixDSym > GetCovMx(const std::vector< TH1D * > &hists)
std::vector< TH1D * > nom_hist
std::vector< std::vector< TH1D * > > pc_projections
std::vector< std::vector< TH1D * > > univ_hist
const double kAna2018FHCPOT
void SuppressND(double sup)
std::string to_string(ModuleType mt)
void CrossCheckDiag(TMatrixDSym covMx, TMatrixD V, TMatrixD eigenvectors, TVectorD eigenvalues, double tolerance=1e-14)
std::vector< std::string > axis_labels
TH1D * ErrorBand(TH1D *hNom, std::vector< TH1D * > hUnivs, int nsigmas)
simulatedPeak Scale(1/simulationNormalisationFactor)
void drawCoverLines(TH1D *hist)