15 HistAnalysis::DoScaleFactors(TString PlotVar, Int_t NumBins, Double_t *XBins,
16 ScaleFactorMethod method)
18 DisplayFunc(__func__);
21 outputName.Form(
"ScaleFactors_%d", fNumCreated++);
22 TH1D* output =
new TH1D(outputName, outputName, NumBins, XBins);
27 SetDefaultExpr(PlotVar);
30 std::vector<TH1D*> dataHists;
31 SetDefaultWeight(fBaseCut);
32 dataHists.push_back(GetHist(NumBins, XBins, kData));
33 for (UInt_t iCut = 0; iCut != fScaleFactorCuts.size(); ++iCut) {
34 SetDefaultWeight(fBaseCut + fDataSFCuts[iCut]);
35 dataHists.push_back(GetHist(NumBins, XBins, kData));
39 std::vector<TH1D*> signalHists;
40 std::vector<TH1D*> backgroundHists;
41 SetDefaultWeight(fBaseCut);
42 signalHists.push_back(GetHist(NumBins, XBins, fSignalType, fSignalName, fSearchBy));
43 backgroundHists.push_back(GetHist(NumBins, XBins, fSignalType, fSignalName, fSearchBy,
false));
44 for (UInt_t iCut = 0; iCut != fScaleFactorCuts.size(); ++iCut) {
45 SetDefaultWeight(fBaseCut + fScaleFactorCuts[iCut]);
46 signalHists.push_back(GetHist(NumBins, XBins, fSignalType, fSignalName, fSearchBy));
47 backgroundHists.push_back(GetHist(NumBins, XBins, fSignalType, fSignalName, fSearchBy,
false));
50 for (Int_t iBin = 1; iBin != NumBins + 1; ++iBin) {
53 Double_t scale = -1.0 - fBackgroundChange;
55 scale *= dataHists[0]->GetBinContent(iBin)/
56 (backgroundHists[0]->GetBinContent(iBin) +
57 signalHists[0]->GetBinContent(iBin));
59 for (UInt_t iHist = 0; iHist != dataHists.size(); ++iHist)
60 dataHists[iHist]->Add(backgroundHists[iHist], scale);
62 std::vector<Double_t> data_yields;
63 std::vector<Double_t> data_error;
64 std::vector<Double_t> mc_yields;
65 std::vector<Double_t> mc_error;
67 Double_t factor = 1.0;
74 for (UInt_t iHist = 0; iHist != dataHists.size(); ++iHist) {
76 Double_t yield = dataHists[iHist]->IntegralAndError(iBin, iBin, error);
77 data_yields.push_back(yield);
78 data_error.push_back(error);
80 yield = signalHists[iHist]->IntegralAndError(iBin, iBin, error);
81 mc_yields.push_back(yield);
82 mc_error.push_back(error);
85 factor = mc_yields[0]/data_yields[0];
87 Message(eDebug,
"Normalizing factor: %f", factor);
92 std::cerr <<
"I do not support that option right now." << std::endl;
96 if (fPrintingMethod != kNone) {
98 std::cout << std::endl <<
"Bin: " << iBin <<
" Var: " << PlotVar;
99 std::cout <<
" " << XBins[iBin - 1] <<
" to " << XBins[iBin] << std::endl << std::endl;
101 std::cout <<
"\\hline" << std::endl;
102 std::cout <<
" & No Cut";
104 for (UInt_t iCut = 0; iCut != fCutNames.size(); ++iCut)
105 std::cout <<
" & " << fCutNames[iCut];
107 std::cout <<
" \\\\" << std::endl;
108 std::cout <<
"\\hline" << std::endl;
110 if (fPrintingMethod == kPresentation)
111 std::cout <<
"\\makecell{Background \\\\ Subtracted \\\\ Data}";
113 std::cout <<
"Background Subtracted Data";
115 for (UInt_t iYield = 0; iYield != data_yields.size(); ++iYield) {
116 std::cout <<
" & " << TString::Format(fFormat,data_yields[iYield]);
117 std::cout <<
" $\\pm$ " << TString::Format(fFormat,data_error[iYield]);
120 std::cout <<
" \\\\" << std::endl;
122 if (fPrintingMethod == kPresentation)
123 std::cout <<
"\\makecell{Signal-\\\\ matched MC}";
125 std::cout <<
"Signal-matched MC";
127 for (UInt_t iYield = 0; iYield != mc_yields.size(); ++iYield) {
128 std::cout <<
" & " << TString::Format(fFormat,mc_yields[iYield]);
129 std::cout <<
" $\\pm$ " << TString::Format(fFormat,mc_error[iYield]);
131 std::cout <<
" \\\\" << std::endl;
132 std::cout <<
"\\hline" << std::endl;
134 if (fPrintingMethod == kPresentation)
135 std::cout <<
"\\makecell{Normalized \\\\ Ratio}";
137 std::cout <<
"Normalized Ratio";
139 for (UInt_t iYield = 0; iYield != data_yields.size(); ++iYield) {
140 std::cout <<
" & " << TString::Format(fFormat, data_yields[iYield]/mc_yields[iYield] * factor);
141 std::cout <<
" $\\pm$ " << TString::Format(fFormat,
142 TMath::Sqrt(pow(data_error[iYield]/mc_yields[iYield],2) +
143 pow(data_yields[iYield]/pow(mc_yields[iYield],2) * mc_error[iYield],2)) *
147 std::cout <<
" \\\\" << std::endl;
148 std::cout <<
"\\hline" << std::endl;
152 Double_t FinalSF = data_yields.back()/mc_yields.back() * factor;
153 Double_t FinalError = TMath::Sqrt(pow(data_error.back()/mc_yields.back(), 2) +
154 pow(data_yields.back()/pow(mc_yields.back(), 2) *
155 mc_error.back(), 2)) * factor;
157 Message(eInfo,
"Bin %i final scale factor: %f", iBin, FinalSF);
158 Message(eInfo,
"Bin %i final scale error: %f", iBin, FinalError);
160 output->SetBinContent(iBin, FinalSF);
161 output->SetBinError(iBin, FinalError);
174 Double_t XBins[NumBins+1];
230 dataHist->Add(backgroundHist, -1.0);
231 delete backgroundHist;
238 dataHist->Scale(1.0/dataHist->Integral());
239 mcHist->Scale(1.0/mcHist->Integral());
243 dataHist->Divide(mcHist);
245 TH1F *uncHist =
new TH1F(
"unc",
"unc", NumBins, XBins);
246 for (Int_t iBin = 1; iBin != NumBins + 1; ++iBin)
247 uncHist->SetBinContent(iBin, dataHist->GetBinError(iBin)/dataHist->GetBinContent(iBin));
249 TFile *theFile =
new TFile(OutFile,
"RECREATE");
250 theFile->WriteTObject(dataHist, OutHist);
251 theFile->WriteTObject(uncHist, OutHist +
"_unc");
266 Double_t XBins[NumBins+1];
280 std::vector<TH1D*> hists;
282 hists.push_back(theHist);
286 BaseCanvas(FileBase, hists, XLabel,
"Scale Factor");
298 Double_t XBins[NumBins+1];