40 std::vector<HistHolder*>
45 std::vector<HistHolder*> HistHolders;
48 TString previousEntry =
"";
49 TH1D *tempMCHist = NULL;
52 for (UInt_t iHist = 0; iHist != hists.size(); ++iHist) {
54 Message(
eDebug,
"About to process Histogram", iHist,
"out of", hists.size());
55 Message(
eDebug,
"Entry is", (*fileInfo)[iHist]->fEntry,
"Previous entry is",previousEntry,
"");
58 if (hists[iHist]->Integral() < 0) {
59 Message(
eError,
"Histogram for", (*fileInfo)[iHist]->fFileName,
"has negative integral", hists[iHist]->Integral());
63 if ((*fileInfo)[iHist]->fEntry != previousEntry) {
67 previousEntry = (*fileInfo)[iHist]->fEntry;
69 tempName.Format(
"StackedHist_%d", iHist);
70 tempMCHist = (TH1D*) hists[iHist]->Clone(tempName);
71 tempHistHolder =
new HistHolder(tempMCHist, (*fileInfo)[iHist]->fEntry,
72 (*fileInfo)[iHist]->fColorStyle,
74 (
fForceTop == (*fileInfo)[iHist]->fEntry),
76 HistHolders.push_back(tempHistHolder);
80 tempMCHist->Add(hists[iHist]);
85 Message(
eDebug,
"Number of unique entries so far:", HistHolders.size());
95 TString XLabel, TString YLabel, Bool_t logY)
101 Double_t XBins[NumXBins+1];
103 MakeCanvas(FileBase, NumXBins, XBins, XLabel, YLabel, logY);
112 TString XLabel, TString YLabel, Bool_t logY) {
115 Message(
eDebug,
"Number of Data Histograms:", DataHists.size());
119 std::vector<TH1D*> SignalHists;
122 Message(
eDebug,
"Number of Signal Histograms:", SignalHists.size());
124 MakeCanvas(FileBase, DataHists, MCHists, SignalHists, XLabel, YLabel, logY);
133 Message(
eDebug,
"Number of Data Histograms:", DataHists.size());
137 std::vector<TH1D*> SignalHists;
140 Message(
eDebug,
"Number of Signal Histograms:", SignalHists.size());
142 MakeCanvas(FileBase, DataHists, MCHists, SignalHists, XLabel, YLabel, logY);
144 catch(out_of_range e) {
145 Message(
eError,
"Didn't get", FileBase,
"from histograms...");
151 PlotStack::MakeCanvas(TString FileBase, std::vector<TH1D*> DataHists, std::vector<TH1D*> MCHists, std::vector<TH1D*> SignalHists,
152 TString XLabel, TString YLabel, Bool_t logY) {
161 YLabel =
"Events/Bin";
172 const Int_t NumXBins = MCHists[0]->GetNbinsX();
173 const Double_t *XBins = MCHists[0]->GetXaxis()->GetXbins()->GetArray();
180 std::vector<TFile*> TemplateFiles;
181 TFile *templateFile = NULL;
188 TemplateFiles.push_back(templateFile);
192 TH1D *DataHist = (TH1D*) DataHists[0]->Clone(
"DataHist");
193 Message(
eDebug,
"Final Data Histogram created at", DataHist);
194 DataHist->Reset(
"M");
196 for (UInt_t iHist = 0; iHist < DataHists.size(); iHist++)
197 DataHist->Add(DataHists[iHist]);
205 for (UInt_t iHist = 0; iHist != HistHolders.size(); ++iHist) {
209 Message(
eInfo,
"Replacing histogram %s with a template",
212 TH1D *templateHist = (TH1D*) TemplateFiles[iTemp]->Get(
fTemplateHists[iTemp]);
213 TH1D *toFormat = (TH1D*) templateHist->Rebin(NumXBins,
"", XBins);
214 toFormat->SetFillStyle(HistHolders[iHist]->fHist->GetFillStyle());
215 toFormat->SetFillColor(HistHolders[iHist]->fHist->GetFillColor());
216 toFormat->SetMarkerSize(HistHolders[iHist]->fHist->GetMarkerSize());
217 HistHolders[iHist]->fHist = toFormat;
235 if (variable.EndsWith(
"Up") or variable.EndsWith(
"Down"))
236 variable = variable(0, variable.Index(TRegexp(
"_[^_]+$")));
238 for (UInt_t iHist = 0; iHist != HistHolders.size(); ++iHist) {
240 tempHist = (TH1D*) HistHolders[iHist]->fHist->Clone();
245 dumpFile->WriteTObject(tempHist, TString::Format(
"%s__%s__%s",
247 HistHolders[iHist]->fTree.Data(),
255 for (
auto iHist = SignalHolders.begin(); iHist != SignalHolders.end(); ++iHist) {
257 tempHist = (TH1D*) (*iHist)->fHist->Clone();
262 dumpFile->WriteTObject(tempHist, TString::Format(
"%s__%s__%s",
264 (*iHist)->fTree.Data(),
273 tempHist = (TH1D*) DataHist->Clone();
275 dumpFile->WriteTObject(tempHist, TString::Format(
"%s__data_obs__%s",
289 Message(
eDebug,
"Number of unique histograms: %i", HistHolders.size());
291 std::vector<TH1D*> AllHists;
292 for (UInt_t iLarger = 0; iLarger != HistHolders.size(); ++iLarger) {
295 Message(
eInfo,
"Entry", HistHolders[iLarger]->fEntry,
"has total integral",
298 for (UInt_t iSmaller = iLarger + 1; iSmaller != HistHolders.size(); ++iSmaller) {
300 HistHolders[iLarger]->fHist->Add(HistHolders[iSmaller]->fHist);
303 Message(
eDebug,
"Histogram", iLarger,
"has integral", HistHolders[iLarger]->fHist->Integral());
305 if (HistHolders[iLarger]->fHist->Integral() > 0 || iLarger == 0) {
309 AllHists.push_back(HistHolders[iLarger]->fHist);
311 if ((HistHolders[iLarger]->fHist->Integral() >
fMinLegendFrac * HistHolders[0]->fHist->Integral()) ||
312 (iLarger == HistHolders.size() - 1))
314 else if ((HistHolders[iLarger]->fHist->Integral() >
fIgnoreInLinear * HistHolders[0]->fHist->Integral()) ||
316 if (HistHolders[iLarger + 1]->fHist->Integral() > 0) {
318 HistHolders[iLarger]->fHist->SetFillColor(
fOthersColor);
322 AddLegendEntry(HistHolders[iLarger]->fEntry, HistHolders[iLarger]->fColor, 1, 1);
330 Message(
eDebug,
"There are now", AllHists.size() ,
"total histograms to plot.");
336 if (not DataHist->Integral()) {
337 auto* match = AllHists[0];
338 for (
int i_bin = 1; i_bin <= NumXBins; ++i_bin) {
339 auto content = match->GetBinContent(i_bin);
340 DataHist->SetBinContent(i_bin, content);
341 DataHist->SetBinError(i_bin, sqrt(content));
347 AllHists.push_back(DataHist);
350 std::sort(SignalHolders.begin(), SignalHolders.end(),
SortHistHolders);
354 for (UInt_t iHist = 0; iHist != SignalHolders.size(); ++iHist) {
360 if (AllHists.size() > 1)
361 SignalHolders[iHist]->fHist->Add(AllHists[0]);
365 AllHists.push_back(SignalHolders[iHist]->fHist);
366 AddLegendEntry(SignalHolders[iHist]->fEntry, 1, 2, SignalHolders[iHist]->fColor);
367 Message(
eDebug,
"There are now", AllHists.size(),
"total histograms to plot.");
372 TH1D* post_fit =
new TH1D(tempName, tempName, NumXBins, XBins);
377 if(sqlite3_open(
fPostFitFile.Data(), &conn) != SQLITE_OK) {
383 for (
int i_bin = 1; i_bin <= NumXBins; i_bin++) {
384 sqlite3_stmt *fetch_stmt;
385 sqlite3_prepare_v2(conn, R
"SQL( 386 SELECT yield FROM postfit_yields 387 WHERE region = ? AND bin = ? AND signal = ? 388 )SQL", -1, &fetch_stmt, NULL); 390 sqlite3_bind_text(fetch_stmt, 1, fRegion.Data(), -1, NULL); 391 sqlite3_bind_int(fetch_stmt, 2, i_bin); 392 sqlite3_bind_text(fetch_stmt, 3, signal_name, -1, NULL); 394 int rc = sqlite3_step(fetch_stmt);
396 post_fit->SetBinContent(i_bin, sqlite3_column_double(fetch_stmt, 0));
398 sqlite3_finalize(fetch_stmt);
403 post_fit->SetLineWidth(2);
404 post_fit->SetLineColor(2);
408 AllHists.push_back(post_fit);
413 Message(
eDebug,
"There are now", AllHists.size() ,
"total histograms to plot.");
420 if (not std::getenv(
"blind"))
424 for (UInt_t iHist = 0; iHist != AllHists.size(); ++iHist) {
425 delete AllHists[iHist];
426 AllHists[iHist] =
nullptr;
428 for (UInt_t iHist = 0; iHist != MCHists.size(); ++iHist) {
429 delete MCHists[iHist];
430 MCHists[iHist] =
nullptr;
432 for (UInt_t iHist = 0; iHist != DataHists.size(); ++iHist) {
433 delete DataHists[iHist];
434 DataHists[iHist] =
nullptr;
439 TemplateFiles[iTemp]->Close();