ra4_macros  bede988c286599a3a84b77a4d788ac0a971e89f9
rescale_variations.cxx
Go to the documentation of this file.
1 // rescales selected nuisance parameters and adds variations corresponding to statistical uncertainties
2 #include "TString.h"
3 #include "TFile.h"
4 #include "TH1.h"
5 #include <iostream>
6 
7 bool isBlinded(const std::string &binName, const std::vector<std::string>& blindBins);
8 
9 int main()
10 {
11  // Choose the type of cards to produce: mconly, control, and default
12  // For signal injection studies(mconly), only want to use MC as nuisance parameters
13  // are different for data in sideband regions and MC
14  std::string cardType="mconly";
15  cardType="data";
16 
17  std::string rootfile("variations/sum_rescaled.root");
18  if(cardType=="mconly") rootfile = "variations/sum_rescaled_mconly.root";
19  TFile *f = TFile::Open(rootfile.c_str(), "update");
20 
21  // samples for which MC statistics should be considered
22  std::vector<std::string> mcStatisticsList = {
23  "signal_M750", "signal_M1000", "signal_M1100", "signal_M1200", "signal_M1300", "signal_M1400", "signal_M1500", "qcd", "ttbar"};
24  // systematics for which the template should be rescaled
25  std::vector<std::string> rescaleList = {
26  "qcd_flavor", "qcd_mur", "qcd_muf", "qcd_murf",
27  "ttbar_pt", "jes", "lep_eff",
28  "ttbar_mur", "ttbar_muf", "ttbar_murf"};
29 
30  // signal list
31  std::vector<std::string> signalList = {
32  "signal_M750", "signal_M1000", "signal_M1100", "signal_M1200", "signal_M1300", "signal_M1400", "signal_M1500"};
33  std::vector<std::string> signalRescaleList = {};
34  //"signal_mur", "signal_muf", "signal_murf"};
35  std::vector<std::string> upAndDown = {"Up", "Down"};
36 
37  // Bins
38  std::vector<std::string> binNames = {
39  "bin0", "bin1", "bin2", // bins for control region fit
40  "bin3", "bin4", "bin5", // bins for control region fit
41  "bin6", "bin7", "bin8", "bin9", // lower mj bins
42  "bin10", "bin11", "bin12", // signal bins
43  "bin13", "bin14", "bin15","bin16","bin17"}; // signal bins
44  std::vector<std::string> blindedBins={}; // bins where data_obs = sum of bkg mc
45  if(cardType=="control") blindedBins = {
46  "bin10", "bin11", "bin12",
47  "bin13", "bin14", "bin15","bin16","bin17"};
48  else if (cardType=="mconly") blindedBins=binNames;
49 
50  unsigned int nbins=binNames.size();
51 
52  // only QCD and ttbar shapes should be rescaled
53  // as only these processes have a floating normalization
54  // in the fit
55  for(unsigned int i=0; i<100; i++) {
56  std::string qcd_pdf("qcd_w_pdf");
57  qcd_pdf+=std::to_string(i);
58  rescaleList.push_back(qcd_pdf);
59  std::string ttbar_pdf("ttbar_w_pdf");
60  ttbar_pdf+=std::to_string(i);
61  rescaleList.push_back(ttbar_pdf);
62  //for(auto isignal : signalList) {
63  // std::string signal_pdf("w_pdf");
64  // signal_pdf+=std::to_string(i);
65  // signalRescaleList.push_back(signal_pdf);
66  //}
67  }
68 
69  for(unsigned int ibin=0; ibin<nbins; ibin++) {
70 
71  // FIXME
72  if(ibin>=6 && ibin<=9) continue;
73 
74  TString binname(binNames.at(ibin).c_str());
75  f->cd(binname);
76  for(unsigned int isyst=0; isyst<rescaleList.size(); isyst++) {
77  for(unsigned int idir=0; idir<upAndDown.size(); idir++) {
78  std::string process("qcd");
79  if(rescaleList.at(isyst).find("ttbar")!=std::string::npos) process="ttbar";
80 
81  TString histnameNominal(Form("%s/%s", binNames.at(ibin).c_str(), process.c_str()));
82  std::cout << "Getting histogram " << histnameNominal << std::endl;
83  TString histnameRescale(Form("%s/%s_%s%s", binNames.at(ibin).c_str(), process.c_str(), rescaleList.at(isyst).c_str(), upAndDown.at(idir).c_str()));
84  if(rescaleList.at(isyst).find("pdf")!=std::string::npos &&
85  (rescaleList.at(isyst).find("qcd")!=std::string::npos ||
86  rescaleList.at(isyst).find("ttbar")!=std::string::npos) ) {
87  histnameRescale = Form("%s/%s%s", binNames.at(ibin).c_str(), rescaleList.at(isyst).c_str(), upAndDown.at(idir).c_str());
88  }
89  std::cout << "Getting histogram " << histnameRescale << std::endl;
90  TH1F *nominal = static_cast<TH1F*>(f->Get(histnameNominal));
91  TH1F *rescale = static_cast<TH1F*>(f->Get(histnameRescale));
92  if(rescale->Integral()!=0) {
93  rescale->Scale(nominal->Integral()/rescale->Integral());
94  }
95  //rescale->Write("",TObject::kOverwrite);
96  rescale->Write();
97  }
98  }
99  // rescale signal systematics
100  for(auto isignal : signalList) {
101  for(unsigned int isyst=0; isyst<signalRescaleList.size(); isyst++) {
102  for(unsigned int idir=0; idir<upAndDown.size(); idir++) {
103  TString histnameNominal(Form("%s/%s", binNames.at(ibin).c_str(), isignal.c_str()));
104  std::cout << "Getting histogram " << histnameNominal << std::endl;
105  TString histnameRescale(Form("%s/%s_%s%s", binNames.at(ibin).c_str(), isignal.c_str(), signalRescaleList.at(isyst).c_str(), upAndDown.at(idir).c_str()));
106  // histnameRescale = Form("%s/%s%s", binNames.at(ibin).c_str(), signalRescaleList.at(isyst).c_str(), upAndDown.at(idir).c_str());
107  std::cout << "Getting signal histogram " << histnameRescale << std::endl;
108  TH1F *nominal = static_cast<TH1F*>(f->Get(histnameNominal));
109  TH1F *rescale = static_cast<TH1F*>(f->Get(histnameRescale));
110  if(rescale->Integral()!=0) {
111  rescale->Scale(nominal->Integral()/rescale->Integral());
112  }
113  //rescale->Write("",TObject::kOverwrite);
114  rescale->Write();
115  }
116  }
117  } // end rescaling of signal systematics
118 
119  // add histograms for MC statistics so that Barlow-Beeston method can be implemented
120  // ignore variations for samples with very small contributions
121  // to avoid profusion of useless nuisance parameters
122  for(auto isample : mcStatisticsList) {
123  TString histnameNominal(Form("%s/%s", binNames.at(ibin).c_str(), isample.c_str()));
124  TH1F *nominal = static_cast<TH1F*>(f->Get(histnameNominal));
125  for(unsigned int ib=1; ib<=nbins; ib++) {
126  TH1F *up = static_cast<TH1F*>(nominal->Clone());
127  TH1F *down = static_cast<TH1F*>(nominal->Clone());
128  up->SetBinContent(ib, nominal->GetBinContent(ib)+nominal->GetBinError(ib));
129  float downvalue = nominal->GetBinContent(ib)-nominal->GetBinError(ib);
130  if(downvalue<0) downvalue=0.0;
131  down->SetBinContent(ib, downvalue);
132 
133  TString basename(nominal->GetName());
134  TString upname(Form("%s_mcstat_%s_%s_nb%dUp", nominal->GetName(), isample.c_str(), binname.Data(), ib-1));
135  TString downname(Form("%s_mcstat_%s_%s_nb%dDown", nominal->GetName(), isample.c_str(), binname.Data(), ib-1));
136  up->SetName(upname);
137  down->SetName(downname);
138  //up->Write("",TObject::kOverwrite);
139  //down->Write("",TObject::kOverwrite);
140  up->Write();
141  down->Write();
142  }
143  }
144 
145  if(isBlinded(binNames.at(ibin), blindedBins)) {
146  // add fake data_obs histogram for blinded bins
147  TH1F *data_obs = static_cast<TH1F*>(f->Get(Form("%s/data_obs", binNames.at(ibin).c_str())));
148  TH1F *qcd = static_cast<TH1F*>(f->Get(Form("%s/qcd", binNames.at(ibin).c_str())));
149  TH1F *ttbar = static_cast<TH1F*>(f->Get(Form("%s/ttbar", binNames.at(ibin).c_str())));
150  TH1F *wjets = static_cast<TH1F*>(f->Get(Form("%s/wjets", binNames.at(ibin).c_str())));
151  TH1F *other = static_cast<TH1F*>(f->Get(Form("%s/other", binNames.at(ibin).c_str())));
152  for(int i=1; i<=data_obs->GetNbinsX(); i++) {
153  data_obs->SetBinContent(i, static_cast<int>(qcd->GetBinContent(i)
154  + ttbar->GetBinContent(i)
155  + wjets->GetBinContent(i)
156  + other->GetBinContent(i)));
157  }
158  //data_obs->Write("",TObject::kOverwrite);
159  data_obs->Write();
160  }
161 
162  // go back to the top left directory to start processing next bin
163  f->cd("/");
164  }
165 
166  f->Write();
167  f->Close();
168 
169  return 0;
170 }
171 
172 bool isBlinded(const std::string &binName, const std::vector<std::string>& blindBins)
173 {
174  for(auto iblind : blindBins) {
175  if(binName == iblind) return true;
176  }
177 
178  return false;
179 }
int main()
bool isBlinded(const std::string &binName, const std::vector< std::string > &blindBins)
TFile * f