ra4_stats  0341147a0dc35f80f4e12c6003afb76a38e2ed6e
sensitivity.cxx
Go to the documentation of this file.
1 #include "sensitivity.hpp"
2 
3 #include <vector>
4 #include <string>
5 #include <sstream>
6 #include <initializer_list>
7 #include <stdlib.h>
8 #include <stdio.h>
9 #include <getopt.h>
10 
11 #include "TIterator.h"
12 #include "TFile.h"
13 #include "TGraph.h"
14 #include "TH1D.h"
15 #include "TAxis.h"
16 #include "TCanvas.h"
17 #include "TGaxis.h"
18 #include "TLegend.h"
19 #include "TROOT.h"
20 #include "TStyle.h"
21 
22 #include "RooWorkspace.h"
23 #include "RooArgSet.h"
24 #include "RooAbsArg.h"
25 #include "RooRealVar.h"
26 
27 #include "utilities.hpp"
28 #include "styles.hpp"
29 
30 using namespace std;
31 
32 namespace{
33  string temp_name = "my_temp_name.root";
34  double max_lim = 2.;
35  double sig_scale = 1.1;
36  double min_lumi = 0.;
37  double lumi_increment = 0.5;
38  double max_lumi = 6.;
39  double lumi_in_file = 1.264;
40  bool do_sys = false;
41 }
42 
43 int main(int argc, char *argv[]){
44  GetOptions(argc, argv);
45  styles style("LargeLabels");
46  style.setDefaultStyle();
47  gStyle->SetPadTickX(1);
48  gStyle->SetPadLeftMargin(0.12);
49  gStyle->SetPadRightMargin(0.12);
50 
51  vector<string> files, names;
52  if(!do_sys){
53  files.push_back("m1bk_nc_met400_mj400_nj69_sig0_lumi1p264_unblinded.root"); names.push_back("T1tttt(1500,100)");
54  files.push_back("m1bk_c_met400_mj400_nj69_sig0_lumi1p264_unblinded.root"); names.push_back("T1tttt(1200,800)");
55  } else {
56  files.push_back("m1bk_nc_met400_mj400_nj69_sig0_lumi1p264.root"); names.push_back("All systs");
57  files.push_back("m1bk_nodilep_nc_met400_mj400_nj69_sig0_lumi1p264.root"); names.push_back("No dilep");
58  files.push_back("m1bk_nosys_nc_met400_mj400_nj69_sig0_lumi1p264.root"); names.push_back("No systs");
59  }
60 
61  vector<vector<double> > signif(files.size()), limit(files.size());
62  vector<double> lumis;
63 
64  double max_sig = 0.;
65  for(size_t ifile = 0; ifile < files.size(); ++ifile){
66  for(double lumi = min_lumi; lumi <= max_lumi; lumi += lumi_increment){
67  if(lumi <= 0) continue;
68  if(ifile == 0) lumis.push_back(lumi);
69  signif.at(ifile).push_back(GetSignificance(files.at(ifile), lumi));
70  limit.at(ifile).push_back(GetLimit(files.at(ifile), lumi));
71  cout << files.at(ifile) << ", " << lumi << ": "
72  << signif.at(ifile).back() << ", " << limit.at(ifile).back() << endl;
73  if(signif.at(ifile).back() > max_sig){
74  max_sig = signif.at(ifile).back();
75  }
76  }
77  }
78  max_sig = 5.0/sig_scale;
79  for(size_t ifile = 0; ifile < files.size(); ++ifile){
80  for(size_t ilumi = 0; ilumi < signif.at(ifile).size(); ++ilumi){
81  signif.at(ifile).at(ilumi) *= max_lim/(sig_scale*max_sig);
82  if(signif.at(ifile).at(ilumi) < 0.) signif.at(ifile).at(ilumi) = 0.;
83  if(limit.at(ifile).at(ilumi) < 0.) limit.at(ifile).at(ilumi) = max_lim;
84  if(limit.at(ifile).at(ilumi) > max_lim) limit.at(ifile).at(ilumi) = max_lim;
85  }
86  }
87 
88  vector<TGraph> signif_graphs, limit_graphs, dumb_graphs;
89  for(size_t ifile = 0; ifile < files.size(); ++ifile){
90  signif_graphs.push_back(TGraph(lumis.size(), &lumis.at(0), &signif.at(ifile).at(0)));
91  limit_graphs.push_back(TGraph(lumis.size(), &lumis.at(0), &limit.at(ifile).at(0)));
92  dumb_graphs.push_back(TGraph(0));
93 
94  signif_graphs.back().SetLineStyle(ifile+1);
95  signif_graphs.back().SetLineWidth(5);
96  signif_graphs.back().SetLineColor(kRed);
97 
98  limit_graphs.back().SetLineStyle(ifile+1);
99  limit_graphs.back().SetLineWidth(5);
100  limit_graphs.back().SetLineColor(kBlue);
101 
102  dumb_graphs.back().SetLineStyle(ifile+1);
103  dumb_graphs.back().SetLineWidth(5);
104  dumb_graphs.back().SetLineColor(kBlack);
105  }
106 
107  TH1D h("h", ";Luminosity [fb^{-1}];Expected Limit/X-Section", 1, min_lumi, max_lumi);
108  h.SetMaximum(max_lim);
109  TAxis &yaxis = *h.GetYaxis();
110  yaxis.SetLabelColor(kBlue);
111  yaxis.SetTitleColor(kBlue);
112  yaxis.SetTitleOffset(.8);
113  TCanvas c;
114  c.SetTicks(1,0);
115  TGaxis *raxis = new TGaxis(max_lumi, 0.,
116  max_lumi, max_lim,
117  0., max_sig*sig_scale, 510, "+L");
118  raxis->SetLabelColor(kRed);
119  raxis->SetTitleColor(kRed);
120  raxis->SetTitle("Expected Significance");
121  raxis->SetTitleOffset(yaxis.GetTitleOffset());
122  raxis->SetTitleSize(yaxis.GetTitleSize());
123  //raxis->SetTextSize(yaxis.GetTextSize());
124  raxis->SetLabelSize(yaxis.GetLabelSize());
125  raxis->SetLabelFont(yaxis.GetLabelFont());
126  raxis->SetTitleFont(yaxis.GetTitleFont());
127 
128  h.Draw("hist");
129  TLegend l(1.0-gStyle->GetPadRightMargin()-0.4, 1.0-gStyle->GetPadTopMargin()-0.25,
130  1.0-gStyle->GetPadRightMargin(), 1.0-gStyle->GetPadTopMargin());
131  l.SetBorderSize(0);
132  l.SetFillColor(0);
133  l.SetFillStyle(4000);
134  for(size_t ifile = files.size() - 1; ifile < files.size(); --ifile){
135  signif_graphs.at(ifile).Draw("samel");
136  limit_graphs.at(ifile).Draw("samel");
137  dumb_graphs.at(ifile).Draw("samel");
138  l.AddEntry(&dumb_graphs.at(ifile), names.at(ifile).c_str(), "l");
139  }
140  l.Draw("same");
141  raxis->Draw("same");
142 
143  string pname("sensitivity"); if(do_sys) pname += "_sys";
144  pname += ".pdf";
145  c.Print(pname.c_str());
146 }
147 
148 double GetSignificance(const string &file_name, double lumi){
149  ModifyLumi(file_name, lumi);
150  string results = execute("combine -M ProfileLikelihood --significance --expectSignal=1 -t -1 "+temp_name);
151  return ExtractNumber(results, "Significance: ");
152 }
153 
154 double GetLimit(const string &file_name, double lumi){
155  ModifyLumi(file_name, lumi);
156  string results = execute("combine -M Asymptotic -t -1 "+temp_name);
157  return ExtractNumber(results, "Median for expected limits: ");
158 }
159 
160 void ModifyLumi(const string &file_name, double lumi){
161  execute("cp "+file_name+" "+temp_name);
162  TFile file(temp_name.c_str(), "read");
163  RooWorkspace *w = static_cast<RooWorkspace*>(file.Get("w"));
164  if(w == nullptr) return;
165  const RooArgSet &vars = w->allVars();
166  TIterator *iter_ptr = vars.createIterator();
167  for(; iter_ptr != nullptr && *(*iter_ptr) != nullptr; iter_ptr->Next()){
168  RooRealVar *var = static_cast<RooRealVar*>(*(*iter_ptr));
169  if(var == nullptr) continue;
170  if(lumi < 0.) continue;
171  double ratio = lumi/lumi_in_file;
172  string name = var->GetName();
173  if(Contains(name, "norm_")
174  || Contains(name, "nobs_")
175  || Contains(name, "wmc_")){
176  var->setVal(ratio*var->getVal());
177  if(var->hasMin() && var->hasMax() && var->getMin()>=0. && var->getMax()>=var->getMax()){
178  var->setMax(ratio*var->getMax());
179  }
180  }else if(Contains(name, "strength") && Contains(name, "dilep")){
181  if(ratio>0.) var->setVal(var->getVal()/sqrt(ratio));
182  }
183  }
184  w->writeToFile(temp_name.c_str());
185 }
186 
187 double ExtractNumber(const string &results, const string &key){
188  auto pos = results.find(key);
189  if(pos != string::npos){
190  pos += key.size();
191  istringstream iss(results.substr(pos));
192  double result;
193  iss >> result;
194  return result;
195  }else{
196  return -1.;
197  }
198 }
199 
200 void GetOptions(int argc, char *argv[]){
201  while(true){
202  static struct option long_options[] = {
203  {"sys", no_argument, 0, 's'},
204  {0, 0, 0, 0}
205  };
206 
207  char opt = -1;
208  int option_index;
209  opt = getopt_long(argc, argv, "s", long_options, &option_index);
210  if( opt == -1) break;
211 
212  string optname;
213  switch(opt){
214  case 's':
215  do_sys = true;
216  break;
217  default:
218  printf("Bad option! getopt_long returned character code 0%o\n", opt);
219  break;
220  }
221  }
222 }
void ModifyLumi(const string &file_name, double lumi)
void setDefaultStyle()
Definition: styles.cpp:36
void GetOptions(int argc, char *argv[])
STL namespace.
bool Contains(const std::string &str, const std::string &pat)
Definition: utilities.cpp:26
double ExtractNumber(const string &results, const string &key)
std::string execute(const std::string &cmd)
Definition: utilities.cpp:87
def style(h, width, style, color)
int main(int argc, char *argv[])
Definition: sensitivity.cxx:43
double GetLimit(const string &file_name, double lumi)
list files
Definition: change_r.py:14
double GetSignificance(const string &file_name, double lumi)