20 #include "CAFAna/nue/Ana2018/joint_fit_2018_tools.h" 45 void FillGraphs(std::vector<TGraph*> g1,std::vector<TGraph*> g2,std::vector<TGraph*> g3,
46 const Int_t kFillColor1,
const Int_t kFillColor2,
const Int_t kFillColor3,
47 const Int_t kDarkColor,
const TString surftype);
54 Double_t
white[9] = { 1, 1, 1, 1, 1, 1, 1, 1, 1 };
55 Double_t Red[9] = { 61./255., 99./255., 136./255., 181./255., 213./255., 225./255., 198./255., 99./255., 61./255.};
56 Double_t Green[9] = { 149./255., 140./255., 96./255., 83./255., 132./255., 178./255., 190./255., 140./255., 149./255};
57 Double_t Blue[9] = { 214./255., 203./255., 168./255., 135./255., 110./255., 100./255., 111./255., 203./255., 214./255.};
58 Double_t Length[9] = { 0.0000, 0.1250, 0.2500, 0.3750, 0.5000, 0.6250, 0.7500, 0.8750, 1.0000};
60 TColor::CreateGradientColorTable(9, Length, Red, Green, Blue, 255, 1.0);
61 gStyle->SetNumberContours(255);
67 bool corrSysts =
true,
68 TString
options=
"joint_both_onlyIH",
69 bool dmsqSurf =
false,
70 bool th13Surf =
false,
74 bool fillContour =
false)
78 bool nueOnly =
options.Contains(
"nueOnly");
79 bool numuOnly =
options.Contains(
"numuOnly");
80 bool joint =
options.Contains(
"joint");
81 assert (nueOnly || numuOnly || joint);
83 bool FHCOnly =
options.Contains(
"FHCOnly");
84 bool RHCOnly =
options.Contains(
"RHCOnly");
85 bool both =
options.Contains(
"both");
86 assert (FHCOnly || RHCOnly || both);
88 bool onlyNH =
options.Contains(
"onlyNH");
89 bool onlyIH =
options.Contains(
"onlyIH");
92 if(dmsqSurf) suffix+=
"_dmsq";
93 if(th13Surf) suffix+=
"_th13";
94 if(corrSysts) suffix+=
"_systs";
95 else suffix+=
"_stats";
109 TString
outfilename (outdir +
"hist_contours_2018_" + suffix);
123 std::vector <const IPrediction * > preds;
124 std::vector <const IPrediction * > preds_numu_only;
125 std::vector <std::pair <TH1D*, double > >
cosmics;
126 std::vector <std::pair <TH1D*, double > > cosmics_numu_only;
127 std::vector <Spectrum * >
data;
128 std::vector <Spectrum * > data_numu_only;
129 std::vector <const IExperiment * > expts;
130 std::vector <const IExperiment * > expts_numu_only;
140 if(FHCOnly || both ) {
144 if(RHCOnly || both ) {
152 if(FHCOnly || both ) {
155 preds.insert(preds.end(),numu_preds.begin(), numu_preds.end());
156 preds_numu_only.insert(preds_numu_only.end(),numu_preds.begin(), numu_preds.end());
159 cosmics.insert(cosmics.end(),numu_cosmics.begin(), numu_cosmics.end());
160 cosmics_numu_only.insert(cosmics_numu_only.end(),numu_cosmics.begin(), numu_cosmics.end());
163 if(RHCOnly || both ) {
166 preds.insert(preds.end(),numu_preds.begin(), numu_preds.end());
167 preds_numu_only.insert(preds_numu_only.end(),numu_preds.begin(), numu_preds.end());
170 cosmics.insert(cosmics.end(),numu_cosmics.begin(), numu_cosmics.end());
171 cosmics_numu_only.insert(cosmics_numu_only.end(),numu_cosmics.begin(), numu_cosmics.end());
179 cout<<
"\n\n Predictions used for the fit:\n";
181 for(
int i = 0;
i <
int(preds.size()); ++
i){
186 if(nueOnly || both) {
200 auto thisdata =
GetFakeData (preds[
i], calc_fake, POT, cosmics[i].first);
201 cout<<i<<
" POT "<<POT<<
" tot MC "<<preds[
i]->Predict(calc_fake).Integral(POT)<<
" cos "<<cosmics[
i].first->Integral()<<
" cos er "<<cosmics[
i].second<<
" analyze data "<<thisdata->Integral(POT)<<
endl;
208 cosmics[
i].first->SetMarkerStyle(34);
210 cosmics[
i].first->Draw(
"hist p same");
212 gPad->Print(outdir +
"debug_predictions_" + suffix +
"_" +
std::to_string(i) +
".pdf");
219 cout<<
"\n\nMake numu only experiment to get the seeds"<<
endl;
221 for(
int i = 0;
i < (
int) preds_numu_only.size(); ++
i){
229 auto thisdata =
GetFakeData (preds_numu_only[
i],calc_fake, POT, cosmics_numu_only[i].first);
230 cout<<i<<
" POT "<<POT<<
" tot MC "<<preds_numu_only[
i]->Predict(calc_fake).Integral(POT)<<
" cos "<<cosmics_numu_only[
i].first->Integral()<<
" cos er "<<cosmics_numu_only[
i].second<<
" analyze data "<<thisdata->Integral(POT)<<
endl;
231 expts_numu_only.push_back(
new SingleSampleExperiment(preds_numu_only[i],*thisdata, cosmics_numu_only[i].first,cosmics_numu_only[i].
second));
244 std::cout <<
"Adding WorldReactorConstraint2017\n";
248 std::cout <<
"Adding Dmsq32ConstraintPDG2017\n";
252 std::cout <<
"Creating Multiexperiment with a total of " 253 << expts.size() <<
" experiments\n\n" <<
std::endl;
256 std::cout <<
"Creating Multiexperiment of numu only SimpleExp with a total of " 257 << expts_numu_only.size() <<
" experiments\n\n" <<
std::endl;
262 preds_numu_only.clear();
269 std::vector< const ISyst * >
systs = {};
270 std::vector< const ISyst * > systs_numu_only = {};
314 std::vector <SystShifts> seedShifts = {};
324 cout<<
"------------------- Start prestage seeds --------------------------"<<
endl;
326 double minchi_numu = 1E20;
327 double pre_seed_th23;
328 double pre_seed_dmsq;
332 double maxmix = 0.514;
333 double numu_pre_seedLONH, numu_pre_seedUONH, numu_pre_seedLOIH, numu_pre_seedUOIH, dmsq_numu_pre_seedNH, dmsq_numu_pre_seedIH;
336 std::cout <<
"\n\nFinding test best fit " << (hie>0?
"NH " :
"IH ") <<
"\n\n";
339 auto thisminchi = fitnumu_only.Fit(calc, auxShifts ,
344 if(thisminchi < minchi_numu) minchi_numu = thisminchi;
350 numu_pre_seedLONH = ((pre_seed_th23>maxmix)?(2*maxmix-pre_seed_th23):pre_seed_th23);
351 numu_pre_seedUONH = ((pre_seed_th23>maxmix)?pre_seed_th23:(2*maxmix-pre_seed_th23));
356 cout<<
"------------------- End prestage seeds --------------------------"<<
endl;
359 std::vector<double> seeds;
364 std::vector <th23helper> th23seeds;
370 std::vector<double> th23_all_seeds_NH = {numu_pre_seedLONH, 0.5, numu_pre_seedUONH};
372 std::vector<double> delta_seeds = {0, 0.5, 1., 1.5};
378 double minchi23 = 1E20;
381 for (
auto & thseed: th23seeds){
384 << (hie>0?
" NH " :
" IH ")
386 for (
auto const &
s:thseed.seeds)
std::cout <<
s <<
", ";
388 cout<<
"pre seed from numu is "<<pre_seed_dmsq<<
endl;
396 Fitter fit23(exptThis, fitvars, systs);
401 auto thisminchi = fit23.Fit(calc,auxShifts ,{
403 {thseed.var, thseed.seeds},
409 minchi23=
min(minchi23, thisminchi);
417 TFile *
outfile =
new TFile(outfilename+
".root",
"recreate");
422 cout<<
"minchi wrote into the file "<<minchi23<<
endl;
423 v.Write(
"overall_minchi");
428 std::cerr <<
"\n WARNING Using 20 bins for dmsq surface\n\n";
433 for(
int hie: {-1, +1}){
435 if((onlyNH && hie<0) || (onlyIH && hie>0))
continue;
437 std::cout <<
"Starting surface " << (hie>0?
"NH ":
"IH") <<
"\n\n";
438 cout<<
"the delta seeds are ";
439 for (
auto const &
s:delta_seeds)
std::cout <<
s <<
", ";
443 if(!th13Surf && ! dmsqSurf){
447 double low = (nueOnly||RHCOnly)?0:0.3;
448 double high = (nueOnly||RHCOnly)?1:0.7;
449 cout<<
"low "<<low<<
" high "<<high<<
endl;
458 auto surf1=surf23.
ToTH2(minchi23);
460 surf1->Write((TString)
"delta_th23_"+hieStr);
461 surf23.SaveTo(outfile->mkdir((TString)
"surf_delta_th23_"+hieStr));
465 if(!th13Surf && dmsqSurf){
469 double low = (nueOnly||RHCOnly)?0.2:0.35;
470 double high = (nueOnly||RHCOnly)?1:0.7;
471 cout<<
"low "<<low<<
" high "<<high<<
endl;
478 (hie>0?(RHCOnly?2.0:2.2):(RHCOnly?-3.5:-2.8)),(hie>0?(RHCOnly?3.2:2.85):(RHCOnly?-2.0:-2.3)),
481 auto surf6=surf23m.
ToTH2(minchi23);
483 surf6->Write((TString)
"th23_dm32_"+(hie>0?
"NH":
"IH"));
484 surf23m.SaveTo(outfile->mkdir((TString)
"surf_th23_dm32_"+(hie>0?
"NH":
"IH")));
499 auto surf4 = surf13.
ToTH2(minchi23);
501 surf4->Write((TString)
"th13_delta_"+(hie>0?
"NH":
"IH"));
502 surf13.SaveTo(outfile->mkdir((TString)
"surf_th13_delta_"+(hie>0?
"NH":
"IH")));
521 TFile *
infile =
new TFile (outfilename+
".root",
"read");
523 auto mins =* (
TVectorD*)infile->Get(
"overall_minchi");
524 double minchi23 = mins[0];
526 std::vector <TString> surfNames;
527 if(!th13Surf && ! dmsqSurf)surfNames = {
"delta_th23_"};
528 if (dmsqSurf) surfNames.push_back(
"th23_dm32_");
529 if (th13Surf) surfNames.push_back(
"th13_delta_");
530 for(TString surfName:surfNames){
532 for (
int hie:{-1,+1}){
534 if((onlyNH && hie<0) || (onlyIH && hie>0))
continue;
537 if(surfName.Contains(
"delta_th23")) {
538 if (zoomIn)
DrawContourCanvas(surfName, 0., 2., (RHCOnly?0.15:0.275), (RHCOnly?0.8:0.725));
541 if(surfName.Contains(
"th23_dm32")) {
542 if (hie>0)
DrawContourCanvas(surfName, ((nueOnly||RHCOnly)?0.2:0.3), ((nueOnly||RHCOnly)?0.8:0.7), (RHCOnly?1.8:2.05), (RHCOnly?3.3:2.85));
543 else DrawContourCanvas(surfName, ((nueOnly||RHCOnly)?0.2:0.3), ((nueOnly||RHCOnly)?0.8:0.7), (RHCOnly?-3.5:-2.95), (RHCOnly?-2.0:-2.25));
545 if(surfName.Contains(
"th13_delta")) {
551 TH2 * hsurf = (TH2*)infile->Get(surfName+(hie>0?
"NH":
"IH"));
557 Int_t kFillColor1 = TColor::GetColorTransparent(k2SigmaConfidenceColor, 0.75);
558 Int_t kFillColor2 = TColor::GetColorTransparent(k2SigmaConfidenceColor, 0.38);
559 Int_t kFillColor3 = TColor::GetColorTransparent(k2SigmaConfidenceColor, 0.18);
560 Int_t kFCFillColor1 = TColor::GetColorTransparent(k2SigmaConfidenceColor, 0.75);
561 Int_t kFCFillColor2 = TColor::GetColorTransparent(k2SigmaConfidenceColor, 0.38);
562 Int_t kFCFillColor3 = TColor::GetColorTransparent(k2SigmaConfidenceColor, 0.18);
563 Int_t kDarkColor = kGray+3;
566 auto g1 =
surf.GetGraphs(surf_1Sigma,minchi23);
567 auto g2 =
surf.GetGraphs(surf_2Sigma,minchi23);
568 auto g3 =
surf.GetGraphs(surf_3Sigma,minchi23);
570 kFillColor1, kFillColor2, kFillColor3,
571 kDarkColor, suffix + surfName + (hie>0?
"NH":
"IH"));
574 cout<<
"minchi from file is "<<minchi23<<
endl;
576 surf.DrawContour(surf_1Sigma, kSolid, kFillColor1,minchi23);
578 surf.DrawContour(surf_3Sigma, kSolid, kFillColor3,minchi23);
586 if(bestfit && both && corrSysts && hie>0){
593 else{delta = 0.678516; th13 = 0.0957894;}
595 bf.SetMarkerColor(kDarkColor);
597 bf.SetMarkerStyle(43);
599 if(!dmsqSurf && ! th13Surf){
617 kFillColor1,kFillColor2,kFillColor3,kDarkColor,
622 leg->SetFillStyle(1001);
624 leg->SetX1(0.7);
leg->SetX2(0.8);
625 leg->SetY1(0.4);
leg->SetY2(0.85);
626 leg->SetHeader(
"No FC");
628 TGraph *
dummy =
new TGraph;
629 dummy->SetLineWidth(2);
630 dummy->SetLineColor(kGray+2);
631 dummy->SetFillColor(kGray);
632 leg->AddEntry(dummy,
"#splitline{Reactor}{68%C.L.}",
"f");
639 for(TString
ext: {
".pdf",
".root"}){
640 gPad->Print(outdir +
"contour_" + suffix +
"_" +
643 (zoomIn?
"_zoom":
"") +
651 int nSysts = corrSysts ? 51 : 0;
652 for (
int i = 0;
i < nSysts; ++
i){
653 hists.push_back((TH2*) infile->Get((TString)
"surf_" + surfName +
654 (hie > 0 ?
"NH" :
"IH") +
661 if(TString(
hists[i]->GetTitle()).Contains(
"delta")) {
663 hists[
i]->GetZaxis()->SetRangeUser(0,2);
665 else gStyle->SetPalette(87);
667 double minz =
hists[
i]->GetBinContent(
hists[i]->GetMinimumBin());
668 double maxz =
hists[
i]->GetBinContent(
hists[i]->GetMaximumBin());
670 hists[
i]->GetZaxis()->SetRangeUser(-lim,+lim);
672 if(i==(
hists.size()-1)) {
673 gStyle->SetPalette(56);
674 hists[
i]->GetZaxis()->SetRangeUser(0.,11.83);
678 hists[
i]->GetYaxis()->SetTitleOffset(0.8);
679 gPad->SetRightMargin(0.14);
680 surf.DrawContour(surf_1Sigma, kSolid, kDarkColor,minchi23);
681 surf.DrawContour(surf_2Sigma, kSolid, kDarkColor,minchi23);
682 surf.DrawContour(surf_3Sigma, kSolid, kDarkColor,minchi23);
683 gPad->Print(outdir +
"debug_contour_" + suffix +
"_" +
685 (hie > 0 ?
"NH":
"IH") +
686 (zoomIn ?
"_zoom" :
"") +
699 TLatex * ltxNH =
new TLatex(0.16,0.89,
"#bf{NH}");
702 ltxNH->SetTextAlign(22);
704 if(th13) ltxNH->Draw();
705 else if(!vert) ltxNH->DrawLatex(.85,.20,
"#bf{NH}");
706 else ltxNH->DrawLatex(.85,.85,
"#bf{NH}");
709 TLatex * ltxIH =
new TLatex (0.16,0.46,
"#bf{IH}");
712 ltxIH->SetTextAlign(22);
714 if(th13) ltxIH->Draw();
715 else if(!vert) ltxIH->DrawLatex(.85,.20,
"#bf{IH}");
716 else ltxIH->DrawLatex(.85,.85,
"#bf{IH}");
721 void FillGraphs(std::vector<TGraph*> g1,std::vector<TGraph*> g2,std::vector<TGraph*> g3,
722 const Int_t kFillColor1,
const Int_t kFillColor2,
const Int_t kFillColor3,
723 const Int_t kDarkColor,
const TString surftype)
725 bool isJoint = surftype.Contains(
"joint");
726 bool isBoth = surftype.Contains(
"both");
727 bool isRHC = surftype.Contains(
"RHCOnly");
728 bool isNH = surftype.Contains(
"NH");
729 bool isSysts = surftype.Contains(
"systs");
730 bool isFccorr = surftype.Contains(
"fccorr");
732 if (surftype.Contains(
"delta_th23")){
734 if(isJoint && isNH ){
737 JoinGraphs(g3[0], g3[1], kFillColor3)->Draw(
"f");
740 JoinGraphs(g2[0], g2[1], kFillColor2)->Draw(
"f same");
741 JoinGraphs(g2[1], g2[2], kFillColor2)->Draw(
"f same");
744 JoinGraphs(g3[0], g3[1], kFillColor3)->Draw(
"f");
746 JoinGraphs(g2[0], g2[1], kWhite)->Draw(
"c f");
747 JoinGraphs(g2[0], g2[1], kFillColor2)->Draw(
"c f");
751 for (
auto &
g:g1) {
g->SetFillColor(kWhite);
g->DrawClone(
"c f");}
752 for (
auto &
g:g1) {
g->SetFillColor(kFillColor1);
g->Draw(
"c f");}
753 for (
auto &
g:g1) {
g->Draw(
"c");}
757 if(isJoint && !isNH){
758 if(isRHC)
JoinGraphs(g3[0], g3[1], kFillColor3)->Draw(
"f");
760 JoinGraphs(g3[0], g3[2], kFillColor3)->Draw(
"f c");
761 g3[1]->SetFillColor(kFillColor3); g3[1]->Draw(
"f c");
762 g3[3]->SetFillColor(kFillColor3); g3[3]->Draw(
"f c");
769 g->SetFillColor(kWhite);
g->DrawClone(
"f c");
770 g->SetFillColor(kFillColor2);
g->Draw(
"f c");
771 g->SetLineColor(kDarkColor);
776 g->SetFillColor(kWhite);
g->DrawClone(
"f c");
777 g->SetFillColor(kFillColor1);
g->Draw(
"f c");
778 g->SetLineColor(kDarkColor);
782 for(
auto &
gs:{g3, g2, g1}){
784 g->SetLineColor(kDarkColor);
792 if (surftype.Contains(
"th23_dm32")){
794 g->SetFillColor(kFillColor3);
g->Draw(
"cf");
797 g->SetFillColor(kWhite);
g->DrawClone(
"cf");
798 g->SetFillColor(kFillColor2);
g->Draw(
"cf");
801 g->SetFillColor(kWhite);
g->DrawClone(
"cf");
802 g->SetFillColor(kFillColor1);
g->Draw(
"cf");
804 for (
auto &
gs:{g3,g2,g1}){
806 g->SetLineColor(kDarkColor);
814 if (surftype.Contains(
"th13_delta")) {
816 JoinGraphs(g3[0], g3[1], kFillColor3)->Draw(
"f");
819 JoinGraphs(g2[0], g2[1], kFillColor2)->Draw(
"f");
822 for (
auto &
g:g2) {
g->SetFillColor(kWhite);
g->DrawClone(
"f");}
823 for (
auto &
g:g2) {
g->SetFillColor(kFillColor2);
g->Draw(
"f");}
825 for (
auto &
g:g1) {
g->SetFillColor(kWhite);
g->DrawClone(
"f");}
826 for (
auto &
g:g1) {
g->SetFillColor(kFillColor1);
g->Draw(
"f");}
832 JoinGraphs(g3[0], g3[1], kFillColor3)->Draw(
"f c");
833 JoinGraphs(g2[0], g2[1], kWhite)->Draw(
"f c");
834 JoinGraphs(g2[0], g2[1], kFillColor2)->Draw(
"f c");
839 JoinGraphs(g1[0], g1[1], kWhite)->Draw(
"f c");
840 JoinGraphs(g1[0], g1[1], kFillColor1)->Draw(
"f c");
843 for (
auto &
gs:{g3,g2,g1}){
845 g->SetLineColor(kDarkColor);
856 TBox* box =
new TBox(mean-err, 0, mean+err, 2);
857 box->SetFillColorAlpha(kGray,0.7);
859 TLine* linLo =
new TLine(mean-err, 0, mean-err, 2);
860 linLo->SetLineColor(kGray+2);
861 linLo->SetLineWidth(2);
863 TLine* linHi =
new TLine(mean+err, 0, mean+err, 2);
864 linHi->SetLineColor(kGray+2);
865 linHi->SetLineWidth(2);
const Color_t kPrimColorIH
T max(const caf::Proxy< T > &a, T b)
const Color_t kPrimColorNH
Cuts and Vars for the 2020 FD DiF Study.
void ResetOscCalcToDefault(osc::IOscCalcAdjustable *calc)
Reset calculator to default assumptions for all parameters.
fvar< T > fabs(const fvar< T > &x)
double GetValue(const osc::IOscCalcAdjustable *osc) const override
const Color_t kCosmicBackgroundColor
void FillGraphs(std::vector< TGraph * > g1, std::vector< TGraph * > g2, std::vector< TGraph * > g3, const Int_t kFillColor1, const Int_t kFillColor2, const Int_t kFillColor3, const Int_t kDarkColor, const TString surftype)
Simple record of shifts applied to systematic parameters.
const Dmsq32Constraint kDmsq32ConstraintPDG2017(2.45e-3, 0.05e-3, 2.52e-3, 0.05e-3)
const FitSinSqTheta23UpperOctant kFitSinSqTheta23UpperOctant
TH2 * Gaussian68Percent2D(const FrequentistSurface &s)
Up-value surface for 68% confidence in 2D in gaussian approximation.
const Color_t k2SigmaConfidenceColorNH
TH2 * Gaussian2Sigma2D(const FrequentistSurface &s)
Up-value surface for 2 sigma confidence in 2D in gaussian approximation.
static SystShifts Nominal()
osc::IOscCalcAdjustable * DefaultOscCalc()
Create a new calculator with default assumptions for all parameters.
virtual void SetDmsq32(const T &dmsq32)=0
const double kAna2018RHCPOT
const XML_Char const XML_Char * data
void demoFitContours(bool createFile=false, bool corrSysts=true, TString options="joint_both_onlyIH", bool dmsqSurf=false, bool th13Surf=false, bool zoomIn=true, bool fillContour=false)
Start the Demo script (it's a bit simplified nue / Ana2018 / FitandFC / joint_fit_2018_contours.C):
Log-likelihood scan across two parameters.
string outfilename
knobs that need extra care
const DummyAnaSyst kAnaCalibrationSyst("Calibration","AbsCalib")
void SetPaletteDeltaCyclicNew()
void DrawHieTag(int hie, bool th13=true, bool vert=false)
void DrawReactorConstraint(double mean, double err)
TH2 * Gaussian3Sigma2D(const FrequentistSurface &s)
Up-value surface for 3 sigma confidence in 2D in gaussian approximation.
const ReactorExperiment * WorldReactorConstraint2017()
Reactor constraint from PDG 2017.
virtual T GetDmsq32() const
const ConstrainedFitVarWithPrior fitDmSq32Scaled_UniformPrior & kFitDmSq32Scaled
void DrawContourCanvas(TString surfName, double minx=0, double maxx=2, double miny=0, double maxy=1)
TGraph * JoinGraphs(TGraph *a, TGraph *b, int fillcol)
Join graphs and set a fill color. Useful for contours.
std::vector< double > POT
static float min(const float a, const float b, const float c)
virtual T GetTh13() const
TH2 * ToTH2(double minchi=-1) const
TLegend * ContourLegend(int hie, bool fillContour, bool fccorr, Int_t kFillColor1, Int_t kFillColor2, Int_t kFillColor3, Int_t kDarkColor, bool bestFit)
Combine multiple component experiments.
const Style_t k2SigmaConfidenceStyle
const FitSinSqTheta23LowerOctant kFitSinSqTheta23LowerOctant
const ConstrainedFitVarWithPrior fitSsqTh23_UniformPriorSsqTh23 & kFitSinSqTheta23
assert(nhit_max >=nhit_nbins)
Interface definition for fittable variables.
const Float_t kBlessedLabelFontSize
const FitSinSq2Theta13 kFitSinSq2Theta13
const double kAna2018FHCPOT
TH1 * DataMCComparison(const Spectrum &data, const Spectrum &mc, EBinType bintype)
std::string to_string(ModuleType mt)
const FitVarWithPrior fitDeltaInPiUnits_UniformPriordCP & kFitDeltaInPiUnits
static std::unique_ptr< FrequentistSurface > LoadFrom(TDirectory *dir, const std::string &name)
const Color_t k2SigmaConfidenceColorIH
Compare a single data spectrum to the MC + cosmics expectation.