makeXSecPlots_TemplateFit.C
Go to the documentation of this file.
5 //#include "NDAna/nuebarcc_inc/NuebarCCIncCrossSectionFunctions.h"
6 
7 #include "RooUnfoldResponse.h"
8 #include "RooUnfoldBayes.h"
9 
10 #include "Utilities/rootlogon.C"
13 
14 using namespace ana;
15 
16 //const double pot = 8.09e20;
17 const double pot = kAna2018FHCPOT;
18 
19 const std::string sDir = "/nova/ana/users/ddoyle/NuebarCrossSection_020319/";
20 const std::string sTemplates = "FitTemplates/fFitTemplates_CovarianceMatrix_newPIDBins_prongcvn.root";
21 const std::string sAnalysis = "SpectraNominal/fCrossSection_Nominal_FakeData_prongcvn_new.root";//
22 
23 
24 void PlotSignalBackground(TH3F* sig, TH3F* tot, std::string out)
25 {
26  TH2F* hDD = (TH2F*)sig->Project3D("yx");
27 
28  for(int i = 1; i <= sig->GetXaxis()->GetNbins(); i++){
29  for(int j = 1; j <= sig->GetYaxis()->GetNbins(); j++){
30 
31  TH1F* hSig1D =
32  (TH1F*)sig->ProjectionZ(ana::UniqueName().c_str(),i,i,j,j);
33  TH1F* hBkgd1D =
34  (TH1F*)tot->ProjectionZ(ana::UniqueName().c_str(),i,i,j,j);
35  hBkgd1D->Add(hSig1D,-1);
36  int sigbin = hSig1D->FindBin(0.85);
37 
38  float tot_sig = hSig1D->Integral(sigbin,-1);
39  float tot_bkgd = hBkgd1D->Integral(sigbin,-1);
40 
41  if(tot_bkgd <= 0) hDD->SetBinContent(i,j,0);
42  else hDD->SetBinContent(i,j,tot_sig/tot_bkgd);
43  }
44  }
45 
46  hDD->SetTitle("");
47  hDD->GetZaxis()->SetTitle("Signal/Background (CVNe > 0.85)");
48  hDD->GetXaxis()->SetTitle("cos #theta_{e}");
49  hDD->GetYaxis()->SetTitle("Electron Energy, E_{e} (GeV)");
50  hDD->GetXaxis()->SetRangeUser(0.75,1);
51  hDD->GetYaxis()->SetRangeUser(1.0,10.0);
52  hDD->GetXaxis()->CenterTitle();
53  hDD->GetYaxis()->CenterTitle();
54  hDD->GetZaxis()->CenterTitle();
55  TCanvas* c88 = new TCanvas("c88","c88");
56  c88->SetRightMargin(0.15);
57  c88->SetLeftMargin(0.15);
58  hDD->SetMarkerColor(kWhite);
59  gStyle->SetPaintTextFormat("4.2f");
60  hDD->Draw("COLZ TEXT");
61  Simulation();
62  c88->SaveAs(out.c_str());
63  c88->Close();
64  delete c88;
65 
66 }
67 
68 void makeXSecPlots_TemplateFit(std::string pidName = "prongCVN",
69  std::string varName = "double",
70  std::string dataName = "nominal",
71  std::string systName = "tot",
72  bool shouldSave = true)
73 {
74 
75  TFile* fTemplates = new TFile((sDir+sTemplates).c_str(),"read");
76  TFile* fAnalysis = new TFile((sDir+sAnalysis).c_str(),"read");
77 
78  //////////////////////////////////////////////////////////////////////////
79  /////////////////// Template Fit ///////// /////////////////////////////
80  //////////////////////////////////////////////////////////////////////////
81 
82  ////////////////////////////////////////////////////////////////////
83  ///////////////////////PPFX Multiverse//////////////////////////////
84  ////////////////////////////////////////////////////////////////////
85  std::vector<std::unique_ptr<ana::Spectrum>> ppfx_spects;
86  for(int iuniv = 0; iuniv < 100; iuniv++){
87  char name[50];
88  sprintf(name, "%s_%i_%s_%s", "ppfx", iuniv,
89  pidName.c_str(), varName.c_str());
90  std::cout << "From " << fTemplates->GetName() << " loading " << name << "....";
91  ppfx_spects.push_back(Spectrum::LoadFrom(fTemplates, name));
92  std::cout << "Done." << std::endl;
93  }
94 
95 
96  //Just looking for +- 1 sigma band, doesn't matter how we get it so
97  //GenieMultiverseSpectra should be able to do it correctly
98  GenieMultiverseSpectra fluxmulti =
99  GenieMultiverseSpectra(100,ppfx_spects,true);
100 
101  const Spectrum* sPPFX_Upper = fluxmulti.UpperSigma();
102  const Spectrum* sPPFX_Lower = fluxmulti.LowerSigma();
103 
104  TH3F* hPPFXUpper = (TH3F*)ana::ToTH3(*sPPFX_Upper,pot,kPOT,
105  costhetabins,
106  eelecbins,
107  pidbins,
108  kBinContent);
109  TH3F* hPPFXLower = (TH3F*)ana::ToTH3(*sPPFX_Lower,pot,kPOT,
110  costhetabins,
111  eelecbins,
112  pidbins,
113  kBinContent);
114 
115  ////////////////////////////////////////////////////////////////////
116  ///////////////////////GENIE Multiverse/////////////////////////////
117  ////////////////////////////////////////////////////////////////////
118  std::cout << "Genie Multiverses..." << std::endl;
119  std::vector<std::unique_ptr<ana::Spectrum>>genie_spects;
120  for(int iuniv = 0; iuniv < 100; iuniv++){
121  char name[50];
122  sprintf(name, "%s_%i_%s_%s", "genie", iuniv,
123  pidName.c_str(), varName.c_str());
124  genie_spects.push_back(Spectrum::LoadFrom(fTemplates, name));
125  }
126 
127  GenieMultiverseSpectra geniemulti =
128  GenieMultiverseSpectra(100,genie_spects,true);
129 
130  const Spectrum* sGenie_Upper = geniemulti.UpperSigma();
131  const Spectrum* sGenie_Lower = geniemulti.LowerSigma();
132 
133  TH3F* hGenieUpper = (TH3F*)ana::ToTH3(*sGenie_Upper, pot, kPOT,
134  costhetabins,
135  eelecbins,
136  pidbins,
137  kBinContent);
138  TH3F* hGenieLower = (TH3F*)ana::ToTH3(*sGenie_Lower, pot, kPOT,
139  costhetabins,
140  eelecbins,
141  pidbins,
142  kBinContent);
143 
144  ////////////////////////////////////////////////////////////////////
145  ////////////////////// Systematics /////////////////////////////////
146  ////////////////////////////////////////////////////////////////////
147  std::cout << "Systematics..." << std::endl;
148  std::vector<TH3F*> systs_hists;
149  std::vector<TH3F*> systs_hists_up;
150  std::vector<TH3F*> systs_hists_down;
151 
152  char name[50];
153  sprintf(name,"calibpos_%s_%s_%s", pidName.c_str(),
154  varName.c_str(), chns[0].name.c_str());
155  systs_hists_up.push_back((TH3F*)(Spectrum::LoadFrom
156  (fTemplates->GetDirectory(name)))
157  ->ToTH3(pot));
158 
159  sprintf(name,"lightup_%s_%s_%s", pidName.c_str(),
160  varName.c_str(), chns[0].name.c_str());
161  systs_hists_up.push_back((TH3F*)(Spectrum::LoadFrom
162  (fTemplates->GetDirectory(name)))
163  ->ToTH3(pot));
164  systs_hists_up.push_back(hGenieUpper);
165  systs_hists_up.push_back(hPPFXUpper);
166 
167  sprintf(name,"calibneg_%s_%s_%s", pidName.c_str(),
168  varName.c_str(), chns[0].name.c_str());
169  systs_hists_down.push_back((TH3F*)(Spectrum::LoadFrom
170  (fTemplates->GetDirectory(name)))
171  ->ToTH3(pot));
172 
173  sprintf(name,"lightdown_%s_%s_%s", pidName.c_str(),
174  varName.c_str(), chns[0].name.c_str());
175  systs_hists_down.push_back((TH3F*)(Spectrum::LoadFrom
176  (fTemplates->GetDirectory(name)))
177  ->ToTH3(pot));
178  systs_hists_down.push_back(hGenieLower);
179  systs_hists_down.push_back(hPPFXLower);
180 
181  sprintf(name,"calibshape_%s_%s_%s", pidName.c_str(),
182  varName.c_str(), chns[0].name.c_str());
183  systs_hists.push_back((TH3F*)(Spectrum::LoadFrom
184  (fTemplates->GetDirectory(name)))->ToTH3(pot));
185  sprintf(name,"ckv_%s_%s_%s", pidName.c_str(),
186  varName.c_str(), chns[0].name.c_str());
187  systs_hists.push_back((TH3F*)(Spectrum::LoadFrom
188  (fTemplates->GetDirectory(name)))->ToTH3(pot));
189 
190  std::vector<TH3F*> systs_calibshape = {systs_hists[0]};
191  std::vector<TH3F*> systs_ckv = {systs_hists[1]};
192  std::vector<TH3F*> systs_genie_up = {hGenieUpper};
193  std::vector<TH3F*> systs_genie_down = {hGenieLower};
194  std::vector<TH3F*> systs_ppfx_up = {hPPFXUpper};
195  std::vector<TH3F*> systs_ppfx_down = {hPPFXLower};
196  std::vector<TH3F*> systs_light_up = {systs_hists_up[1]};
197  std::vector<TH3F*> systs_light_down = {systs_hists_down[1]};
198  std::vector<TH3F*> systs_calib_up = {systs_hists_up[0]};
199  std::vector<TH3F*> systs_calib_down = {systs_hists_down[0]};
200 
201  std::vector<TH3F*> systs_onesided;
202  std::vector<TH3F*> systs_upper;
203  std::vector<TH3F*> systs_lower;
204 
205  if(systName == "tot"){
206  systs_onesided = {systs_hists[0],systs_hists[1]};
207  systs_upper = {systs_hists_up[0], systs_hists_up[1],
208  hGenieUpper,hPPFXUpper};
209  systs_lower = {systs_hists_down[0], systs_hists_down[1],
210  hGenieLower,hPPFXLower};
211  }
212  else if(systName == "calibshape"){
213  systs_onesided = {systs_hists[0]};
214  systs_upper = {};
215  systs_lower = {};
216  }
217  else if(systName == "ckv"){
218  systs_onesided = {systs_hists[1]};
219  systs_upper = {};
220  systs_lower = {};
221  }
222  else if(systName == "genie"){
223  systs_onesided = {};
224  systs_upper = {hGenieUpper};
225  systs_lower = {hGenieLower};
226  }
227  else if(systName == "ppfx"){
228  systs_onesided = {};
229  systs_upper = {hPPFXUpper};
230  systs_lower = {hPPFXLower};
231  }
232  else if(systName == "calib"){
233  systs_onesided = {};
234  systs_upper = {systs_hists_down[0]};
235  systs_lower = {systs_hists_down[0]};
236  }
237  else if(systName == "light"){
238  systs_onesided = {};
239  systs_upper = {systs_hists_up[1]};
240  systs_lower = {systs_hists_down[1]};
241  }
242 
243 
244 
245 
246  ////////////////////////////////////////////////////////////////////
247  ////////////////////// Nominal MC //////////////////////////////////
248  ////////////////////////////////////////////////////////////////////
249  std::cout << "Nominal MC..." << std::endl;
250  std::vector<TH3F*> nominal_hists;
251  for(uint i = 0; i < kcNumChns; i++){
252  sprintf(name, "nominal_%s_%s_%s", pidName.c_str(),
253  varName.c_str(), chns[i].name.c_str());
254  std::cout << "Loading " << name;
255  nominal_hists.push_back((TH3F*)(Spectrum::LoadFrom
256  (fTemplates->GetDirectory(name)))
257  ->ToTH3(pot));
258  std::cout << " Done.." << std::endl;
259  }
260 
261  TH2F* hPlot2D = (TH2F*)nominal_hists[0]->Project3D("yx");
262  hPlot2D->SetName(ana::UniqueName().c_str());
263  hPlot2D->SetTitle("");
264  hPlot2D->GetYaxis()->SetTitle("Electron Energy, E_{e} (GeV)");
265  hPlot2D->GetXaxis()->SetTitle("cos #theta_{e}");
266  hPlot2D->GetYaxis()->CenterTitle();
267  hPlot2D->GetYaxis()->SetTitleOffset(0.45);
268  hPlot2D->GetZaxis()->SetMaxDigits(3);
269  hPlot2D->GetXaxis()->CenterTitle();
270  hPlot2D->GetZaxis()->SetTitle("Events/8.09 #times 10^{20} POT");
271  hPlot2D->GetZaxis()->CenterTitle();
272  hPlot2D->GetXaxis()->SetRangeUser(0.75,1.00);
273  hPlot2D->GetYaxis()->SetRangeUser(1.0,6.0);
274  TH2F* hPlot2D_sig = (TH2F*)nominal_hists[2]->Project3D("yx");
275  TH2F* hPlot2D_sig_2 = (TH2F*)nominal_hists[7]->Project3D("yx");
276  //hPlot2D_sig->Add(hPlot2D_sig_2);
277  hPlot2D_sig->GetXaxis()->SetRangeUser(0.75,1);
278  hPlot2D_sig->GetYaxis()->SetRangeUser(1.0,10.0);
279  hPlot2D_sig->SetName(ana::UniqueName().c_str());
280  hPlot2D_sig->SetTitle("");
281  hPlot2D_sig->GetYaxis()->SetTitle("Electron Energy, E_{e} (GeV)");
282  hPlot2D_sig->GetXaxis()->SetTitle("cos #theta_{e}");
283  hPlot2D_sig->GetYaxis()->CenterTitle();
284  hPlot2D_sig->GetYaxis()->SetTitleOffset(0.45);
285  hPlot2D_sig->GetZaxis()->SetMaxDigits(3);
286  hPlot2D_sig->GetXaxis()->CenterTitle();
287  hPlot2D_sig->GetZaxis()->SetTitle("Signal Events/8.09 #times 10^{20} POT");
288  hPlot2D_sig->GetZaxis()->CenterTitle();
289  //hPlot2D_sig->GetXaxis()->SetRangeUser(0,1.00);
290  //hPlot2D_sig->GetYaxis()->SetRangeUser(0,10.0);
291 
292  std::cout << "Make some plots..." << std::endl;
293  TCanvas* c29 = new TCanvas("c28","c29");
294  c29->SetRightMargin(0.15);
295  hPlot2D_sig->SetMarkerColor(kWhite);
296  gStyle->SetPaintTextFormat("4.0f");
297  hPlot2D_sig->Draw("COLZ TEXT");
298  Simulation();
299  c29->SaveAs("signal_mc_2d.png");
300  c29->Close();
301  delete c29;
302 
303  TH3F* hNominalSignalLike =
304  (TH3F*)nominal_hists[1]->Clone(ana::UniqueName().c_str());
305  hNominalSignalLike->Add(nominal_hists[1]);
306  hNominalSignalLike->Add(nominal_hists[7]);
307 
308  PlotSignalBackground(hNominalSignalLike, nominal_hists[0],
309  "s_b_ratio_signal_region.png");
310 
311 
312  TCanvas *c88 = new TCanvas("c88","c88");
313  c88->SetLogz(1);
314  c88->SetRightMargin(0.15);
315  //c88->SetLeftMargin(0.10);
316  hPlot2D->Draw("COLZ");
317  Simulation();
318  c88->SaveAs("total_mc_2d.png");
319  c88->Close();
320  delete c88;
321 
322  TH2F* hPlot2D_a = (TH2F*)nominal_hists[0]->Project3D("yz");
323  hPlot2D_a->SetName(ana::UniqueName().c_str());
324  hPlot2D_a->SetTitle("");
325  hPlot2D_a->GetYaxis()->SetTitle("Electron Energy, E_{e} (GeV)");
326  hPlot2D_a->GetXaxis()->SetTitle("Event CVNe");
327  hPlot2D_a->GetYaxis()->CenterTitle();
328  hPlot2D_a->GetYaxis()->SetTitleOffset(0.45);
329  hPlot2D_a->GetZaxis()->SetMaxDigits(3);
330  hPlot2D_a->GetXaxis()->CenterTitle();
331  hPlot2D_a->GetZaxis()->SetTitle("Events/8.09 #times 10^{20} POT");
332  hPlot2D_a->GetZaxis()->CenterTitle();
333  hPlot2D_a->GetXaxis()->SetRangeUser(0.,1.00);
334  hPlot2D_a->GetYaxis()->SetRangeUser(1.0,6.0);
335 
336  TCanvas *c89 = new TCanvas("c89","c89");
337  c89->SetLogz(1);
338  c89->SetRightMargin(0.15);
339  //c88->SetLeftMargin(0.10);
340  hPlot2D_a->Draw("COLZ");
341  Simulation();
342  c89->SaveAs("total_mc_2d_electron_pid.png");
343  c89->Close();
344  delete c89;
345 
346  std::vector<int> intvect = {};
347  std::cout << intvect.size() << std::endl;
348 
349 
350  ////////////////////////////////////////////////////////////////////
351  ////////////////////// Fake Data ///////////////////////////////////
352  ////////////////////////////////////////////////////////////////////
353  std::cout << "Fake Data..." << std::endl;
354  std::vector<TH3F*> data_hists;
355  if (dataName.find("ppfx") != std::string::npos) {
356  sprintf(name, "mc_%s_%s_%s", dataName.c_str(),
357  "template", "tot");
358  }
359  else if (dataName.find("genie") != std::string::npos) {
360  sprintf(name, "mc_%s_%s_%s", dataName.c_str(),
361  "template", "tot");
362  }
363  else{
364  sprintf(name, "mc_%s_%s_%s", dataName.c_str(),
365  "template", "tot");
366  }
367  data_hists.push_back((TH3F*)(Spectrum::LoadFrom(fAnalysis->
368  GetDirectory(name)))->
369  ToTH3(pot));
370 
371 
372  std::vector<TH3F*> nominal_hists_3d;
373  for(uint i = 0; i < kcNumChns; i++){
374  sprintf(name, "%s_%s_%s_%s", "mc","nominal",
375  "analysis", chns[i].name.c_str());
376  nominal_hists_3d.push_back((TH3F*)(Spectrum::LoadFrom
377  (fAnalysis->
378  GetDirectory(name)))->ToTH3(pot));
379  }
380 
381 
382  ////////////////////////////////////////////////////////////////////
383  ////////////////////// Do Template Fit//////////////////////////////
384  ////////////////////////////////////////////////////////////////////
385  std::cout << "Template Fit.." << std::endl;
386  std::string out = dataName + "_" + systName;
387  std::vector<TH3F*> weighted_hists_3d =
388  BinByBinTemplateFit(data_hists[0],nominal_hists, systs_onesided,
389  systs_upper,systs_lower,nominal_hists_3d,
390  pidName,varName,out);
391 
392  ////////////////////////////////////////////////////////////////////
393  ////////////////////////////////////////////////////////////////////
394  ////////////////////// Calculate XSec /////////////////////////////
395  ////////////////////////////////////////////////////////////////////
396  ////////////////////////////////////////////////////////////////////
397  std::cout << "Calculate Cross Section... " << std::endl;
398  if(weighted_hists_3d.size() < 4){
399  std::cout << "Issue in template fit. Exiting" << std::endl;
400  return;
401  }
402 
403 
404  //std::vector<TH3F*> weighted_hists_3d = ApplyFitResults(nominal_hists_3d,
405  // vTemplateWeights);
406 
407  sprintf(name, "mc_%s_%s_signal_postfit",dataName.c_str(), systName.c_str());
408  TH3F* hSignalOut = (TH3F*)weighted_hists_3d[2]->Clone(name);
409  hSignalOut->SetName(name);
410 
411 
412  //Convert TH3F To TH1F -> Spectrum
413  const int nx = hSignalOut->GetXaxis()->GetNbins();
414  const int ny = hSignalOut->GetYaxis()->GetNbins();
415  const int nz = hSignalOut->GetZaxis()->GetNbins();
416 
417  // Make sure it's compatible with having been made with this binning
418  TH1F* hHolder = new TH1F("hHolder","",nx*ny*nz,0,nx*ny*nz);
419 
420  for(int i = 0; i < hHolder->GetNbinsX(); ++i){
421  const int nynz = ny*nz;
422  const int nmodnynz = i%nynz;
423  const int ix = i/nynz;
424  const int iy = nmodnynz/nz;
425  const int iz = i%nz;
426 
427  const double val = hSignalOut->GetBinContent(ix+1, iy+1, iz+1);
428  const double err = hSignalOut->GetBinError (ix+1, iy+1, iz+1);
429 
430  hHolder->SetBinContent(i+1,val);
431  hHolder->SetBinError(i+1,err);
432  }
433 
434  std::vector<TH1F*> vHolder;
435  for(int j = 0; j < (int)weighted_hists_3d.size();j++){
436  TH1F* hHold = new TH1F(ana::UniqueName().c_str(),"",nx*ny*nz,0,nx*ny*nz);
437 
438  for(int i = 0; i < hHold->GetNbinsX(); ++i){
439  const int nynz = ny*nz;
440  const int nmodnynz = i%nynz;
441  const int ix = i/nynz;
442  const int iy = nmodnynz/nz;
443  const int iz = i%nz;
444 
445  const double val = weighted_hists_3d[j]->GetBinContent(ix+1, iy+1, iz+1);
446  const double err = weighted_hists_3d[j]->GetBinError (ix+1, iy+1, iz+1);
447 
448  hHold->SetBinContent(i+1,val);
449  hHold->SetBinError(i+1,err);
450  }
451  vHolder.push_back(hHold);
452  sprintf(name, "mc_%s_%s_%s_postfit",dataName.c_str(),
453  systName.c_str(),chns[j].name.c_str());
454  vHolder[j]->SetName(name);
455  }
456 
457  if(shouldSave == true){
458  std::cout << "Saving stuff..." << std::endl;
459  //std::string outfile =
460  //"CrossSection_TemplateFitResults_fakedata_development_stat_prongcvn.root";
461 
463  "CrossSection_TemplateFitResults_fakedata_development_stat.root";
464  TFile *outf = new TFile((/*sDir+*/outfile).c_str(), "update");
465  Spectrum sSignalOut(hHolder,pot,0);
466  sprintf(name, "mc_%s_%s_signal_postfit",dataName.c_str(), systName.c_str());
467  sSignalOut.SaveTo(outf, name);
468 
469  std::vector<Spectrum*> sHolder;
470  for(int j = 0; j < (int)vHolder.size(); j++){
471  sprintf(name, "mc_%s_%s_%s_postfit",dataName.c_str(),
472  systName.c_str(),chns[j].name.c_str());
473  sHolder.push_back(new Spectrum(vHolder[j],pot,0));
474  sHolder[j]->SaveTo(outf, name);
475  }
476  outf->Close();
477  }
478 
479  std::cout << "Almost there..." << std::endl;
480  fTemplates->Close();
481  fAnalysis->Close();
482  std::cout << "Done..." << std::endl;
483 }
484 
const double pot
void Simulation()
Definition: tools.h:16
const XML_Char * name
Definition: expat.h:151
const std::string sTemplates
void PlotSignalBackground(TH3F *sig, TH3F *tot, std::string out)
Cuts and Vars for the 2020 FD DiF Study.
Definition: vars.h:6
const ana::Binning eelecbins
void makeXSecPlots_TemplateFit(std::string pidName="prongCVN", std::string varName="double", std::string dataName="nominal", std::string systName="tot", bool shouldSave=true)
const SelDef chns[knumchns]
const ana::Binning costhetabins
Representation of a spectrum in any variable, with associated POT.
Definition: Spectrum.h:33
const ana::Binning pidbins
static std::unique_ptr< Spectrum > LoadFrom(TDirectory *dir, const std::string &name)
Definition: Spectrum.cxx:607
TFile * outf
Definition: testXsec.C:51
void SaveTo(TDirectory *dir, const std::string &name) const
Definition: Spectrum.cxx:578
const double j
Definition: BetheBloch.cxx:29
std::vector< float > Spectrum
Definition: Constants.h:527
Regular histogram.
Definition: Utilities.h:44
OStream cout
Definition: OStream.cxx:6
std::vector< TH3F * > BinByBinTemplateFit(TH3F *data, std::vector< TH3F * > templates, std::vector< TH3F * > systs_hists, std::vector< TH3F * > systs_hists_up, std::vector< TH3F * > systs_hists_down, std::vector< TH3F * > analysis_templates, std::string pidName, std::string varName, std::string dataName)
const std::string sAnalysis
const std::string sDir
::xsd::cxx::tree::string< char, simple_type > string
Definition: Database.h:154
const int kcNumChns
Definition: NueCCIncCuts.h:293
const Spectrum * UpperSigma(BandOptions opt=kBandFromNominal) const
const Spectrum * LowerSigma(BandOptions opt=kBandFromNominal) const
std::string dataName
const double kAna2018FHCPOT
Definition: Exposures.h:207
std::string name
TH3 * ToTH3(const Spectrum &s, double exposure, ana::EExposureType expotype, const Binning &binsx, const Binning &binsy, const Binning &binsz, ana::EBinType bintype)
Same as ToTH2, but with 3 dimensions.
Definition: Utilities.cxx:303
std::string UniqueName()
Return a different string each time, for creating histograms.
Definition: Utilities.cxx:30
FILE * outfile
Definition: dump_event.C:13
unsigned int uint