ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/ShapeLimit.C
Revision: 1.17
Committed: Fri Sep 7 13:40:44 2012 UTC (12 years, 8 months ago) by buchmann
Content type: text/plain
Branch: MAIN
CVS Tags: HEAD
Changes since 1.16: +1 -1 lines
Log Message:
Minor fixes for comparisons between signed and unsigned integer expressions

File Contents

# Content
1 #include <iostream>
2 #include <vector>
3 #include <sys/stat.h>
4 #include <fstream>
5
6 #include <TCut.h>
7 #include <TROOT.h>
8 #include <TCanvas.h>
9 #include <TMath.h>
10 #include <TColor.h>
11 #include <TPaveText.h>
12 #include <TRandom.h>
13 #include <TH1.h>
14 #include <TH2.h>
15 #include <TF1.h>
16 #include <TSQLResult.h>
17 #include <TProfile.h>
18 #include <TSystem.h>
19 #include <TRandom3.h>
20
21 using namespace std;
22
23 using namespace PlottingSetup;
24
25 namespace SUSYScanSpace {
26 vector<string> loaded_files;
27 int SUSYscantype;
28 float SavedMGlu;
29 float SavedMLSP;
30 string SavedMLSPname;
31 string SavedMGluname;
32 }
33
34 const char* strip_flip_away(string flipped_name) {
35 int pos = flipped_name.find("flipped_");
36 if(pos>=0&&pos<1000) flipped_name=flipped_name.substr(8,1000);
37 return flipped_name.c_str();
38 }
39
40 void EliminateNegativeEntries(TH1F *histo) {
41 for(int i=1;i<=histo->GetNbinsX();i++) {
42 if(histo->GetBinContent(i)<0) histo->SetBinContent(i,0);
43 }
44 }
45
46 vector<float> get_expected_points(float observed,int npoints, string RunDirectory, bool doPlot=false) {
47 TF1 *gaus = new TF1("gaus","gaus(0)",0,10*observed);
48 gaus->SetParameters(1,observed,2*observed);
49 gaus->SetParameter(0,1/(gaus->Integral(0,10*observed)));
50 float currentpoint=0.01;
51 float stepsize=observed/100;
52 vector<float> points;
53 while(currentpoint<25*observed && (int)points.size()<npoints) {
54
55 if(gaus->Integral(0,currentpoint)>((points.size()+1.0)/(npoints+2.0))) {
56 if(Verbosity>0) dout << "Added points for calculation at " << currentpoint << " (integral is " << gaus->Integral(0,currentpoint) << ")" << endl;
57 points.push_back(currentpoint);
58 if((int)points.size()==npoints) break;
59 }
60 currentpoint+=stepsize;
61 }
62 if(doPlot) {
63 gaus->SetName("Expected limit computation points");
64 gaus->SetTitle("Expected limit computation points");
65 TCanvas *can = new TCanvas("can","can");
66 gaus->Draw();
67 TLine *lines[npoints];
68 for(int i=0;i<npoints;i++) {
69 lines[i] = new TLine(points[i],0,points[i],gaus->GetMaximum());
70 lines[i]->SetLineColor(kBlue);
71 lines[i]->Draw();
72 }
73 can->SaveAs((RunDirectory+"/DistributionOfComputedPoints.png").c_str());
74 delete can;
75 for(int i=0;i<npoints;i++) delete lines[i];
76 }
77 delete gaus;
78
79 return points;
80 }
81
82 void prepare_MC_datacard(string RunDirectory, TFile *f, float uJSU, float uPDF) {
83 TH1F *dataob = (TH1F*)f->Get("data_obs");
84 TH1F *signal = (TH1F*)f->Get("signal");
85 assert(dataob);
86 assert(signal);
87
88 write_warning(__FUNCTION__,"The following two defs for th1's are fake");TH1F *Tbackground; TH1F *Zbackground;
89 write_warning(__FUNCTION__,"Not correctly implemented yet for MC");
90 ofstream datacard;
91 write_warning(__FUNCTION__,"Need to rethink systematics we want to use !");
92 datacard.open ((RunDirectory+"/susydatacard.txt").c_str());
93 dout << "Writing this to a file.\n";
94 datacard << "imax 1\n"; // number of channels
95 datacard << "jmax 2\n"; // number of backgrounds (Z+Jets prediction and TTbar prediction)
96 datacard << "kmax *\n"; // number of nuisance parameters (sources of systematic uncertainties)
97 datacard << "---------------\n";
98 datacard << "shapes * * limitfile.root $PROCESS $PROCESS_$SYSTEMATIC\n";
99 datacard << "---------------\n";
100 datacard << "bin 1\n";
101 datacard << "observation "<<dataob->Integral()<<"\n";
102 datacard << "------------------------------\n";
103 datacard << "bin 1 1 1\n";
104 datacard << "process signal TTbarBackground ZJetsBackground\n";
105 datacard << "process 0 1 2\n";
106 datacard << "rate "<<signal->Integral()<<" "<<Tbackground->Integral()<<" "<<Zbackground->Integral()<<"\n";
107 datacard << "--------------------------------\n";
108 datacard << "lumi lnN " << 1+ PlottingSetup::lumiuncert << " - - luminosity uncertainty\n"; // only affects MC -> signal!
109 datacard << "Stat shape - 1 - statistical uncertainty (ttbar)\n";
110 datacard << "Stat shape - - 1 statistical uncertainty (zjets)\n";
111 datacard << "Sys shape - 1 - systematic uncertainty on ttbar\n";
112 datacard << "Sys shape - - 1 systematic uncertainty on zjets\n";
113 datacard << "Stat shape 1 - - statistical uncertainty (signal)\n";
114 datacard << "JES shape 1 - - uncertainty on Jet Energy Scale\n";
115 datacard << "JSU lnN " << 1+uJSU << " - - JZB Scale Uncertainty\n";
116 if(uPDF>0) datacard << "PDF lnN " << 1+uPDF << " - - uncertainty from PDFs\n";
117 datacard.close();
118 }
119
120 void prepare_datadriven_datacard(string RunDirectory, TFile *f, float uJSU, float uPDF) {
121 TH1F *dataob = (TH1F*)f->Get("data_obs");
122 TH1F *signal = (TH1F*)f->Get("signal");
123 TH1F *Tbackground = (TH1F*)f->Get("TTbarBackground");
124 TH1F *Zbackground = (TH1F*)f->Get("ZJetsBackground");
125
126 assert(dataob);
127 assert(signal);
128 assert(Tbackground);
129 assert(Zbackground);
130
131
132 ofstream datacard;
133 write_warning(__FUNCTION__,"Need to rethink systematics we want to use !");
134 datacard.open ((RunDirectory+"/susydatacard.txt").c_str());
135 datacard << "Writing this to a file.\n";
136 datacard << "imax " << dataob->GetNbinsX() << "\n"; // number of channels
137 datacard << "jmax 2\n"; // number of backgrounds (Z+Jets prediction and TTbar prediction)
138 datacard << "kmax *\n"; // number of nuisance parameters (sources of systematic uncertainties)
139 datacard << "---------------\n";
140 datacard << "bin\t";
141 for(int i=1;i<=dataob->GetNbinsX();i++) datacard << " " << dataob->GetBinLowEdge(i) << "to" << dataob->GetBinLowEdge(i)+dataob->GetBinWidth(i) << " \t";
142 datacard << "\n";
143 datacard << "observation\t";
144 for(int i=1;i<=dataob->GetNbinsX();i++) datacard << " " << dataob->GetBinContent(i) << " \t";
145 datacard<<"\n";
146 datacard << "------------------------------\n";
147 datacard << "bin\t";
148 for(int i=1;i<=dataob->GetNbinsX();i++) {
149 datacard << " " << dataob->GetBinLowEdge(i) << "to" << dataob->GetBinLowEdge(i)+dataob->GetBinWidth(i) << "\t" <<
150 " " << dataob->GetBinLowEdge(i) << "to" << dataob->GetBinLowEdge(i)+dataob->GetBinWidth(i) << "\t" <<
151 " " << dataob->GetBinLowEdge(i) << "to" << dataob->GetBinLowEdge(i)+dataob->GetBinWidth(i) << "\t";
152 }
153 datacard << "\n";
154 datacard << "process\t";
155 for(int i=1;i<=dataob->GetNbinsX();i++) datacard << "\t signal \t TTbarBackground \t ZJetsBackground";
156 datacard << "\n";
157 datacard << "process\t";
158 for(int i=1;i<=dataob->GetNbinsX();i++) datacard << "\t 0 \t 1 \t 2";
159 datacard << "\n";
160
161
162 datacard << "rate\t";
163 for(int i=1;i<=dataob->GetNbinsX();i++) datacard << "\t " << signal->GetBinContent(i) << " \t " << Tbackground->GetBinContent(i) << " \t " << Zbackground->GetBinContent(i) << "\t";
164 datacard<<"\n";
165
166 datacard << "--------------------------------\n";
167
168
169 datacard << "lumi lnN \t";
170 for(int i=1;i<=dataob->GetNbinsX();i++) datacard << " " << 1+ PlottingSetup::lumiuncert << "\t - \t -";
171 datacard << " luminosity uncertainty\n"; // only affects MC -> signal!
172
173 // Statistical uncertainty
174 datacard << "Stat lnN \t";
175 for(int i=1;i<=dataob->GetNbinsX();i++) {
176 //Signal
177 float central = signal->GetBinContent(i);
178 float up = ((TH1F*)f->Get("signal_StatDown"))->GetBinContent(i);
179 float down = ((TH1F*)f->Get("signal_StatUp"))->GetBinContent(i);
180 float suncert=0;
181 if(central>0) {
182 if(abs(up-central)>abs(down-central)) suncert=abs(up-central)/central;
183 else suncert=abs(central-down)/central;
184 }
185
186 //TTbar
187 central = Tbackground->GetBinContent(i);
188 up = ((TH1F*)f->Get("TTbarBackground_StatUp"))->GetBinContent(i);
189 down = ((TH1F*)f->Get("TTbarBackground_StatDown"))->GetBinContent(i);
190 float tuncert=0;
191 if(central>0) {
192 if(abs(up-central)>abs(down-central)) tuncert=abs(up-central)/central;
193 else tuncert=abs(central-down)/central;
194 }
195 //ZJets
196 central = Zbackground->GetBinContent(i);
197 up = ((TH1F*)f->Get("ZJetsBackground_StatUp"))->GetBinContent(i);
198 down = ((TH1F*)f->Get("ZJetsBackground_StatDown"))->GetBinContent(i);
199 float zuncert=0;
200 if(central>0) {
201 if(abs(up-central)>abs(down-central)) zuncert=abs(up-central)/central;
202 else zuncert=abs(central-down)/central;
203 }
204 datacard << " " << 1+suncert << " \t " << 1+tuncert << "\t " << 1+zuncert << " \t ";
205 }
206
207 datacard << " statistical uncertainty\n";
208
209 // Statistical uncertainty
210 datacard << "Sys lnN \t";
211 for(int i=1;i<=dataob->GetNbinsX();i++) {
212 float central = Tbackground->GetBinContent(i);
213 float up = ((TH1F*)f->Get("TTbarBackground_SysUp"))->GetBinContent(i);
214 float down = ((TH1F*)f->Get("TTbarBackground_SysDown"))->GetBinContent(i);
215 float tuncert=0;
216 if(central>0) {
217 if(abs(up-central)>abs(down-central)) tuncert=abs(up-central)/central;
218 else tuncert=abs(central-down)/central;
219 }
220 central = Zbackground->GetBinContent(i);
221 up = ((TH1F*)f->Get("ZJetsBackground_SysUp"))->GetBinContent(i);
222 down = ((TH1F*)f->Get("ZJetsBackground_SysDown"))->GetBinContent(i);
223 float zuncert=0;
224 if(central>0) {
225 if(abs(up-central)>abs(down-central)) zuncert=abs(up-central)/central;
226 else zuncert=abs(central-down)/central;
227 }
228 datacard << " - \t " << 1+tuncert << "\t " << 1+zuncert << " \t ";
229 }
230
231 datacard << " systematic uncertainty\n";
232
233
234 float JESup = ((TH1F*)f->Get("signal_JESUp"))->Integral();
235 float JESdn = ((TH1F*)f->Get("signal_JESDown"))->Integral();
236 float central = signal->Integral();
237 float uJES=0;
238 if(abs(JESup-central)>abs(JESdn-central)) uJES=abs(JESup-central)/central;
239 else uJES=abs(central-JESdn)/central;
240 datacard << "JES lnN";
241 for(int i=1;i<=dataob->GetNbinsX();i++) datacard << " " << 1+uJES << "\t - \t - \t";
242 datacard << "uncertainty on Jet Energy Scale\n";
243
244 datacard << "JSU lnN ";
245 for(int i=1;i<=dataob->GetNbinsX();i++) datacard << " " << 1+uJSU << "\t - \t - \t";
246 datacard << "JZB Scale Uncertainty\n";
247
248 if(uPDF>0) {
249 datacard << "PDF lnN ";
250 for(int i=1;i<=dataob->GetNbinsX();i++) datacard << " " << 1+uPDF << "\t - \t - \t";
251 datacard << "uncertainty from PDFs\n";
252 }
253
254 datacard.close();
255 }
256
257 void prepare_limit_datacard(string RunDirectory, TFile *f, float uJSU, float uPDF) {
258
259 if(FullMCAnalysis) {
260 //dealing with MC analysis - need to use shapes.
261 prepare_MC_datacard(RunDirectory,f,uJSU,uPDF);
262 } else {
263 //doing mutibin analysis
264 prepare_datadriven_datacard(RunDirectory,f,uJSU,uPDF);
265 }
266
267 }
268
269 float QuickDrawNevents=0;
270
271 TH1F* QuickDraw(TTree *events, string hname, string variable, vector<float> binning, string xlabel, string ylabel, TCut cut, string addcut, bool dataormc, float luminosity, map < pair<float, float>, map<string, float> > &xsec) {
272 TH1F *histo = new TH1F(hname.c_str(),hname.c_str(),binning.size()-1,&binning[0]);
273 histo->Sumw2();
274 stringstream drawcommand;
275 drawcommand << variable << ">>" << hname;
276 if(SUSYScanSpace::SUSYscantype!=mSUGRA) {
277 events->Draw(drawcommand.str().c_str(),(essentialcut&&cut&&addcut.c_str())*cutWeight);
278 } else {
279 float totalxs=0;
280 for(int i=0;i<12;i++) {
281 stringstream drawcommand2;
282 drawcommand2 << variable << ">>+" << hname;
283 stringstream mSUGRAweight;
284 float xs = XSForProcessViaAddCutWrapper(addcut,xsec,i);
285 totalxs+=xs;
286 mSUGRAweight << "(0.5*(2*(process==" << i << "))*" << xs << ")";
287 events->Draw(drawcommand2.str().c_str(),(essentialcut&&cut&&addcut.c_str())*cutWeight*mSUGRAweight.str().c_str());
288 }
289 histo->Scale(1.0/totalxs); // to get back to 1 /pb normalization
290 }
291 events->Draw("eventNum",addcut.c_str(),"goff");
292 float nevents = events->GetSelectedRows();
293 QuickDrawNevents=nevents;
294 histo->Scale(luminosity/nevents); // this will give a histogram which is normalized to 1 pb so that any limit will be with respect to 1 pb
295
296 return histo;
297 }
298
299 TH2F* empty2d(string hname) {
300 TH2F *h = new TH2F(hname.c_str(),hname.c_str(),1000,0,1000,1000,0,1000);
301 return h;
302 }
303
304 TH2F* QuickDraw2d(TTree *events, string hname, string variable, string xlabel, string ylabel, TCut cut, string addcut, bool dataormc, float luminosity, map < pair<float, float>, map<string, float> > &xsec) {
305 TH2F *histo = empty2d(hname);
306 histo->Sumw2();
307 stringstream drawcommand;
308 drawcommand << variable << ":mll>>" << hname;
309 if(SUSYScanSpace::SUSYscantype!=mSUGRA) {
310 events->Draw(drawcommand.str().c_str(),(essentialcut&&cut&&addcut.c_str())*cutWeight);
311 } else {
312 float totalxs=0;
313 for(int i=0;i<12;i++) {
314 stringstream drawcommand2;
315 drawcommand2 << variable << ">>+" << hname;
316 stringstream mSUGRAweight;
317 float xs = XSForProcessViaAddCutWrapper(addcut,xsec,i);
318 totalxs+=xs;
319 mSUGRAweight << "(0.5*(2*(process==" << i << "))*" << xs << ")";
320 events->Draw(drawcommand2.str().c_str(),(essentialcut&&cut&&addcut.c_str())*cutWeight*mSUGRAweight.str().c_str());
321 }
322 histo->Scale(1.0/totalxs); // to get back to 1 /pb normalization
323 }
324 events->Draw("eventNum",addcut.c_str(),"goff");
325 float nevents = events->GetSelectedRows();
326 QuickDrawNevents=nevents;
327 histo->Scale(luminosity/nevents); // this will give a histogram which is normalized to 1 pb so that any limit will be with respect to 1 pb
328
329 return histo;
330 }
331
332 TH1F* Multiply(TH1F *h1, TH1F *h2) {
333 TH1F *h = (TH1F*)h1->Clone();
334 for(int i=1;i<=h1->GetNbinsX();i++) {
335 h->SetBinContent(i,h1->GetBinContent(i) * h2->GetBinContent(i));
336 }
337 return h;
338 }
339
340
341 string ReduceNumericHistoName(string origname) {
342 int pos = origname.find("__h_");
343 if(pos == -1) return origname;
344 return origname.substr(0,pos);
345 }
346
347
348
349 void generate_mc_shapes(bool dotree, TTree *signalevents, string mcjzb,string datajzb,vector<float> binning, TCut weight, TCut JetCut, string addcut, string identifier, map < pair<float, float>, map<string, float> > &xsec) {
350 //weight can be varied to take care of efficiency errors (weightEffUp, weightEffDown)
351 vector<float> mbinning;
352 mbinning.push_back(-8000);
353 for(int i=binning.size()-1;i>=0;i--) mbinning.push_back(-binning[i]);
354 mbinning.push_back(0);
355 for(int i=0;i<(int)binning.size();i++) mbinning.push_back(binning[i]);
356 mbinning.push_back(8000);
357
358
359 TCanvas *shapecan = new TCanvas("shapecan","shapecan");
360 TH1F* Signal;
361
362 stringstream sInverseCutWeight;
363 sInverseCutWeight << "(1.0/" << (const char*)cutWeight<<")";
364 TCut InverseCutWeight(sInverseCutWeight.str().c_str());
365 if(weight==cutWeight) InverseCutWeight = TCut("1.0");
366 if(!dotree) {
367 //dealing with ALL MC samples (when we save the standard file)
368 THStack McPredicted = allsamples.DrawStack("McPred",mcjzb,mbinning, "JZB [GeV]", "events", ((cutmass&&cutOSSF&&JetCut)*(weight*InverseCutWeight)),mc,luminosity);
369 int nhists = McPredicted.GetHists()->GetEntries();
370 for (int i = 0; i < nhists; i++) {
371 TH1* hist = static_cast<TH1*>(McPredicted.GetHists()->At(i));
372 // cout << hist->GetName() << " : " << hist->Integral() << endl;
373 // cout << " " << ReduceNumericHistoName(hist->GetName()) << endl;
374 if(identifier=="StatUp") {
375 float appliedweight = hist->Integral() / hist->GetEntries();
376 for(int ibin=1;ibin<=hist->GetNbinsX();ibin++) hist->SetBinContent(ibin,hist->GetBinContent(ibin)+appliedweight*TMath::Sqrt(hist->GetBinContent(ibin)/appliedweight));
377 }
378 if(identifier=="StatDown") {
379 float appliedweight = hist->Integral() / hist->GetEntries();
380 for(int ibin=1;ibin<=hist->GetNbinsX();ibin++) hist->SetBinContent(ibin,hist->GetBinContent(ibin)-appliedweight*TMath::Sqrt(hist->GetBinContent(ibin)/appliedweight));
381 }
382 hist->SetName(("mc_"+ReduceNumericHistoName(hist->GetName())+"_"+identifier).c_str());
383 hist->Write();
384 }
385 } else {
386 string histoname="mc_signal";
387 if(identifier!="") histoname=histoname+"_"+identifier;
388 Signal = QuickDraw(signalevents,histoname,mcjzb,binning,"JZB", "events",((cutmass&&cutOSSF&&JetCut&&basiccut))*(weight*InverseCutWeight),addcut,mc,luminosity,xsec);
389 if(identifier=="StatUp") {
390 float appliedweight = Signal->Integral() / Signal->GetEntries();
391 for(int ibin=1;ibin<=Signal->GetNbinsX();ibin++) Signal->SetBinContent(ibin,Signal->GetBinContent(ibin)+appliedweight*TMath::Sqrt(Signal->GetBinContent(ibin)/appliedweight));
392 }
393 if(identifier=="StatDown") {
394 float appliedweight = Signal->Integral() / Signal->GetEntries();
395 for(int ibin=1;ibin<=Signal->GetNbinsX();ibin++) Signal->SetBinContent(ibin,Signal->GetBinContent(ibin)-appliedweight*TMath::Sqrt(Signal->GetBinContent(ibin)/appliedweight));
396 }
397 Signal->Write();
398 }
399
400 /*
401 *
402 * Jet energy scale (easy, use different JetCut)
403 * JZB Scale Uncertainty (will be a number - signal only)
404 * Efficiency (will be weightEffUp, weightEffDown)
405 * PDFs (signal only) -> Will be a number yet again, computed in the traditional way
406 */
407 delete shapecan;
408
409 }
410
411
412 void generate_shapes_for_systematic(bool signalonly, bool dataonly,TFile *limfile, TTree *signalevents, string identifier, string mcjzb, string datajzb, int JES,vector<float> binning, TCanvas *limcan, string addcut, map < pair<float, float>, map<string, float> > &xsec) {
413
414 binning.push_back(8000);
415 limfile->cd();
416 dout << "Creating shape templates ";
417 if(identifier!="") dout << "for "<<identifier;
418 dout << " ... " << endl;
419
420 TCut limitnJetcut;
421
422 if(JES==noJES) limitnJetcut=cutnJets;
423 else {
424 if(JES==JESdown) limitnJetcut=cutnJetsJESdown;
425 if(JES==JESup) limitnJetcut=cutnJetsJESup;
426 }
427
428 float zjetsestimateuncert=zjetsestimateuncertONPEAK;
429 float emuncert=emuncertONPEAK;
430 float emsidebanduncert=emsidebanduncertONPEAK;
431 float eemmsidebanduncert=eemmsidebanduncertONPEAK;
432
433 if(!PlottingSetup::RestrictToMassPeak) {
434 zjetsestimateuncert=zjetsestimateuncertOFFPEAK;
435 emuncert=emuncertOFFPEAK;
436 emsidebanduncert=emsidebanduncertOFFPEAK;
437 eemmsidebanduncert=eemmsidebanduncertOFFPEAK;
438 }
439
440 if(signalonly) {
441 dout << "Processing a signal with mcjzb: " << mcjzb << " (identifier: '" << identifier << "')" << endl;
442 TH1F *ZOSSFP = QuickDraw(signalevents,"ZOSSFP",mcjzb,binning, "JZB", "events",cutmass&&cutOSSF&&limitnJetcut&&basiccut,addcut,mc,luminosity,xsec);
443 TH1F *ZOSSFN = QuickDraw(signalevents,"ZOSSFN","-"+mcjzb,binning, "JZB", "events",cutmass&&cutOSSF&&limitnJetcut&&basiccut,addcut,mc,luminosity,xsec);
444 TH1F *ZOSOFP;
445 TH1F *ZOSOFN;
446
447 TH2F *ZOSSFP2d = QuickDraw2d(signalevents,"ZOSSFP2d",mcjzb, "JZB", "events",cutmass&&cutOSSF&&limitnJetcut&&basiccut,addcut,mc,luminosity,xsec);
448 TH2F *ZOSSFN2d = QuickDraw2d(signalevents,"ZOSSFN2d","-"+mcjzb,"JZB", "events",cutmass&&cutOSSF&&limitnJetcut&&basiccut,addcut,mc,luminosity,xsec);
449 TH2F *ZOSOFP2d;
450 TH2F *ZOSOFN2d;
451
452 if(!PlottingSetup::FullMCAnalysis) {
453 ZOSOFP = QuickDraw(signalevents,"ZOSOFP",mcjzb,binning, "JZB", "events",cutmass&&cutOSOF&&limitnJetcut&&basiccut,addcut,mc,luminosity,xsec);
454 ZOSOFN = QuickDraw(signalevents,"ZOSOFN","-"+mcjzb,binning, "JZB", "events",cutmass&&cutOSOF&&limitnJetcut&&basiccut,addcut,mc,luminosity,xsec);
455
456 ZOSOFP2d = QuickDraw2d(signalevents,"ZOSOFP2d",mcjzb, "JZB", "events",cutmass&&cutOSOF&&limitnJetcut&&basiccut,addcut,mc,luminosity,xsec);
457 ZOSOFN2d = QuickDraw2d(signalevents,"ZOSOFN2d","-"+mcjzb, "JZB", "events",cutmass&&cutOSOF&&limitnJetcut&&basiccut,addcut,mc,luminosity,xsec);
458 }
459
460 TH1F *SBOSSFP;
461 TH1F *SBOSOFP;
462 TH1F *SBOSSFN;
463 TH1F *SBOSOFN;
464
465 TH2F *SBOSSFP2d;
466 TH2F *SBOSOFP2d;
467 TH2F *SBOSSFN2d;
468 TH2F *SBOSOFN2d;
469
470 if(PlottingSetup::RestrictToMassPeak&&!PlottingSetup::FullMCAnalysis&&PlottingSetup::UseSidebandsForcJZB) {
471 SBOSSFP = QuickDraw(signalevents,"SBOSSFP",mcjzb,binning, "JZB", "events",cutOSSF&&limitnJetcut&&basiccut&&sidebandcut,addcut,mc,luminosity,xsec);
472 SBOSOFP = QuickDraw(signalevents,"SBOSOFP",mcjzb,binning, "JZB", "events",cutOSOF&&limitnJetcut&&basiccut&&sidebandcut,addcut,mc,luminosity,xsec);
473 SBOSSFN = QuickDraw(signalevents,"SBOSSFN","-"+mcjzb,binning, "JZB", "events",cutOSSF&&limitnJetcut&&basiccut&&sidebandcut,addcut,mc,luminosity,xsec);
474 SBOSOFN = QuickDraw(signalevents,"SBOSOFN","-"+mcjzb,binning, "JZB", "events",cutOSOF&&limitnJetcut&&basiccut&&sidebandcut,addcut,mc,luminosity,xsec);
475
476 SBOSSFP2d = QuickDraw2d(signalevents,"SBOSSFP2d",mcjzb,"JZB", "events",cutOSSF&&limitnJetcut&&basiccut&&sidebandcut,addcut,mc,luminosity,xsec);
477 SBOSOFP2d = QuickDraw2d(signalevents,"SBOSOFP2d",mcjzb,"JZB", "events",cutOSOF&&limitnJetcut&&basiccut&&sidebandcut,addcut,mc,luminosity,xsec);
478 SBOSSFN2d = QuickDraw2d(signalevents,"SBOSSFN2d","-"+mcjzb,"JZB", "events",cutOSSF&&limitnJetcut&&basiccut&&sidebandcut,addcut,mc,luminosity,xsec);
479 SBOSOFN2d = QuickDraw2d(signalevents,"SBOSOFN2d","-"+mcjzb,"JZB", "events",cutOSOF&&limitnJetcut&&basiccut&&sidebandcut,addcut,mc,luminosity,xsec);
480 }
481
482 string signalname="signal";
483 if(identifier!="") signalname="signal_"+identifier;
484
485 TH1F *Lobs = new TH1F("Lobs","Lobs",binning.size()-1,&binning[0]);
486 TH1F *Lpred = new TH1F("Lpred","Lpred",binning.size()-1,&binning[0]);
487
488 TH2F *Lobs2d = empty2d("Lobs2d");
489 TH2F *Lpred2d = empty2d("Lobs2d");
490
491 TH1F *flippedLobs = new TH1F("flippedLobs","flippedLobs",binning.size()-1,&binning[0]);
492 TH1F *flippedLpred = new TH1F("flippedLpred","flippedLpred",binning.size()-1,&binning[0]);
493
494 TH2F *flippedLobs2d = empty2d("flippedLobs2d");
495 TH2F *flippedLpred2d = empty2d("flippedLpred2d");
496
497 Lobs->Add(ZOSSFP);
498 Lobs2d->Add(ZOSSFP2d);
499 if(!PlottingSetup::FullMCAnalysis) {
500 Lpred->Add(ZOSSFN);
501 Lpred2d->Add(ZOSSFN2d);
502 }
503
504 dout << "SITUATION FOR SIGNAL: " << endl;
505 if(PlottingSetup::FullMCAnalysis) {
506 dout << " OSSF JZB> 0 : " << ZOSSFP->Integral() << endl;
507 } else {
508 dout << " OSSF JZB> 0 : " << ZOSSFP->Integral() << " JZB < 0 :" << ZOSSFN->Integral() << endl;
509 dout << " OSOF JZB> 0 : " << ZOSOFP->Integral() << " JZB < 0 :" << ZOSOFN->Integral() << endl;
510
511 if(PlottingSetup::RestrictToMassPeak&&!PlottingSetup::FullMCAnalysis&&PlottingSetup::UseSidebandsForcJZB) {
512 dout << " OSSF SB JZB> 0 : " << SBOSSFP->Integral() << " JZB < 0 :" << SBOSSFN->Integral() << endl;
513 dout << " OSOF SB JZB> 0 : " << SBOSOFP->Integral() << " JZB < 0 :" << SBOSOFN->Integral() << endl;
514 }
515 }
516
517 flippedLobs->Add(ZOSSFN);
518 flippedLobs2d->Add(ZOSSFN2d);
519
520 if(!PlottingSetup::FullMCAnalysis) {
521 flippedLpred->Add(ZOSSFP);
522 flippedLpred2d->Add(ZOSSFP2d);
523 }
524
525 if(!PlottingSetup::FullMCAnalysis) {
526 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
527 Lpred->Add(ZOSOFP,1.0/3);
528 Lpred->Add(ZOSOFN,-1.0/3);
529 Lpred->Add(SBOSSFP,1.0/3);
530 Lpred->Add(SBOSSFN,-1.0/3);
531 Lpred->Add(SBOSOFP,1.0/3);
532 Lpred->Add(SBOSOFN,-1.0/3);
533
534 //flipped prediction
535 flippedLpred->Add(ZOSOFP,-1.0/3);
536 flippedLpred->Add(ZOSOFN,1.0/3);
537 flippedLpred->Add(SBOSSFP,-1.0/3);
538 flippedLpred->Add(SBOSSFN,1.0/3);
539 flippedLpred->Add(SBOSOFP,-1.0/3);
540 flippedLpred->Add(SBOSOFN,1.0/3);
541
542 //2d stuff: regular
543 Lpred2d->Add(ZOSOFP2d,1.0/3);
544 Lpred2d->Add(ZOSOFN2d,-1.0/3);
545 Lpred2d->Add(SBOSSFP2d,1.0/3);
546 Lpred2d->Add(SBOSSFN2d,-1.0/3);
547 Lpred2d->Add(SBOSOFP2d,1.0/3);
548 Lpred2d->Add(SBOSOFN2d,-1.0/3);
549
550 //3d stuff: flipped prediction
551 flippedLpred2d->Add(ZOSOFP2d,-1.0/3);
552 flippedLpred2d->Add(ZOSOFN2d,1.0/3);
553 flippedLpred2d->Add(SBOSSFP2d,-1.0/3);
554 flippedLpred2d->Add(SBOSSFN2d,1.0/3);
555 flippedLpred2d->Add(SBOSOFP2d,-1.0/3);
556 flippedLpred2d->Add(SBOSOFN2d,1.0/3);
557 } else {
558 Lpred->Add(ZOSOFP,1.0);
559 Lpred->Add(ZOSOFN,-1.0);
560
561 //flipped prediction
562 flippedLpred->Add(ZOSOFP,-1.0);
563 flippedLpred->Add(ZOSOFN,1.0);
564
565 //2d stuff
566 Lpred2d->Add(ZOSOFP2d,1.0);
567 Lpred2d->Add(ZOSOFN2d,-1.0);
568
569 //flipped prediction
570 flippedLpred2d->Add(ZOSOFP2d,-1.0);
571 flippedLpred2d->Add(ZOSOFN2d,1.0);
572 }
573 }
574
575 TH1F *signal = (TH1F*)Lobs->Clone("signal");
576 TH1F *signal2d = (TH1F*)Lobs2d->Clone("signal2d");
577
578 if(!PlottingSetup::FullMCAnalysis) signal->Add(Lpred,-1);
579 signal->SetName(signalname.c_str());
580 signal->SetTitle(signalname.c_str());
581 signal->Write();
582
583 if(!PlottingSetup::FullMCAnalysis) signal2d->Add(Lpred2d,-1);
584 signal2d->SetName((signalname+"2d").c_str());
585 signal2d->SetTitle((signalname+"2d").c_str());
586 signal2d->Write();
587
588 TH1F *flippedsignal = (TH1F*)flippedLobs->Clone();
589 if(!PlottingSetup::FullMCAnalysis) flippedsignal->Add(flippedLpred,-1);
590 flippedsignal->SetName(("flipped_"+signalname).c_str());
591 flippedsignal->Write();
592
593 TH2F *flippedsignal2d = (TH2F*)flippedLobs2d->Clone();
594 if(!PlottingSetup::FullMCAnalysis) flippedsignal2d->Add(flippedLpred,-1);
595 flippedsignal2d->SetName(("flipped2d_"+signalname).c_str());
596 flippedsignal2d->Write();
597
598 if(identifier=="") {
599 TH1F *signalStatUp = (TH1F*)signal->Clone();
600 signalStatUp->SetName(((string)signal->GetName()+"_StatUp").c_str());
601 signalStatUp->SetTitle(((string)signal->GetTitle()+"_StatUp").c_str());
602
603 TH1F *signalStatDn = (TH1F*)signal->Clone();
604 signalStatDn->SetName(((string)signal->GetName()+"_StatDown").c_str());
605 signalStatDn->SetTitle(((string)signal->GetTitle()+"_StatDown").c_str());
606
607 TH2F *signalStatUp2d = (TH2F*)signal->Clone();
608 signalStatUp2d->SetName(((string)signal2d->GetName()+"_StatUp").c_str());
609 signalStatUp2d->SetTitle(((string)signal2d->GetTitle()+"_StatUp").c_str());
610
611 TH2F *signalStatDn2d = (TH2F*)signal->Clone();
612 signalStatDn2d->SetName(((string)signal2d->GetName()+"_StatDown").c_str());
613 signalStatDn2d->SetTitle(((string)signal2d->GetTitle()+"_StatDown").c_str());
614
615
616 for(int i=1;i<=signalStatDn->GetNbinsX();i++) {
617 float staterr;
618 if(!PlottingSetup::FullMCAnalysis) staterr = TMath::Sqrt(Lpred->GetBinContent(i) + Lobs->GetBinContent(i));
619 else staterr = TMath::Sqrt(Lobs->GetBinContent(i));
620
621 if(!PlottingSetup::FullMCAnalysis) {
622 dout << "Stat err in bin " << i << " : " << staterr << endl;
623 dout << " prediction: " << Lpred->GetBinContent(i) << " , observation: " << Lobs->GetBinContent(i) << " --> signal: " << signal->GetBinContent(i) << endl;
624 dout << " we obtain : " << signal->GetBinContent(i)-staterr << " , " << signal->GetBinContent(i)+staterr << endl;
625 }
626 if(signal->GetBinContent(i)-staterr>0) signalStatDn->SetBinContent(i,signal->GetBinContent(i)-staterr);
627 else signalStatDn->SetBinContent(i,0);
628 signalStatUp->SetBinContent(i,signal->GetBinContent(i)+staterr);
629 signal->SetBinError(i,staterr);
630 }
631
632 for(int i=1;i<=signalStatDn->GetNbinsX();i++) {
633 for(int j=1;j<=signalStatDn->GetNbinsY();j++) {
634 float staterr;
635 if(!PlottingSetup::FullMCAnalysis) staterr = TMath::Sqrt(Lpred2d->GetBinContent(i,j) + Lobs2d->GetBinContent(i,j));
636 else staterr = TMath::Sqrt(Lobs2d->GetBinContent(i,j));
637
638 if(!PlottingSetup::FullMCAnalysis) {
639 dout << "Stat err in bin " << i << ", " << j << " : " << staterr << endl;
640 dout << " prediction: " << Lpred2d->GetBinContent(i,j) << " , observation: " << Lobs2d->GetBinContent(i,j) << " --> signal: " << signal2d->GetBinContent(i,j) << endl;
641 dout << " we obtain : " << signal2d->GetBinContent(i,j)-staterr << " , " << signal2d->GetBinContent(i,j)+staterr << endl;
642 }
643 if(signal2d->GetBinContent(i,j)-staterr>0) signalStatDn2d->SetBinContent(i,j,signal2d->GetBinContent(i,j)-staterr);
644 else signalStatDn2d->SetBinContent(i,j,0);
645 signalStatUp2d->SetBinContent(i,signal2d->GetBinContent(i,j)+staterr);
646 signal2d->SetBinError(i,j,staterr);
647 }
648 }
649
650 //----------------------------------- ******** GOTTEN HERE *******---------------------------------------
651
652 signalStatDn->Write();
653 signalStatUp->Write();
654
655 delete signalStatDn;
656 delete signalStatUp;
657
658 TH1F *flippedsignalStatUp = (TH1F*)flippedsignal->Clone();
659 flippedsignalStatUp->SetName(((string)flippedsignal->GetName()+"_StatUp").c_str());
660 flippedsignalStatUp->SetTitle(((string)flippedsignal->GetTitle()+"_StatUp").c_str());
661
662 TH1F *flippedsignalStatDn = (TH1F*)flippedsignal->Clone();
663 flippedsignalStatDn->SetName(((string)flippedsignal->GetName()+"_StatDown").c_str());
664 flippedsignalStatDn->SetTitle(((string)flippedsignal->GetTitle()+"_StatDown").c_str());
665
666 for(int i=1;i<=flippedsignalStatDn->GetNbinsX();i++) {
667 float staterr;
668 if(!PlottingSetup::FullMCAnalysis) staterr = TMath::Sqrt(flippedLpred->GetBinContent(i) + flippedLobs->GetBinContent(i));
669 else staterr = TMath::Sqrt(flippedLobs->GetBinContent(i));
670 if(flippedsignal->GetBinContent(i)-staterr>0) flippedsignalStatDn->SetBinContent(i,flippedsignal->GetBinContent(i)-staterr);
671 else flippedsignalStatDn->SetBinContent(i,0);
672 flippedsignalStatUp->SetBinContent(i,flippedsignal->GetBinContent(i)+staterr);
673 flippedsignal->SetBinError(i,staterr);
674 }
675
676 flippedsignalStatDn->Write();
677 flippedsignalStatUp->Write();
678
679 delete flippedsignalStatDn;
680 delete flippedsignalStatUp;
681 }
682
683 delete ZOSSFP;
684 delete ZOSOFP;
685 delete ZOSSFN;
686 delete ZOSOFN;
687
688 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
689 delete SBOSSFP;
690 delete SBOSOFP;
691 delete SBOSSFN;
692 delete SBOSOFN;
693 }
694
695 delete Lobs;
696 delete Lpred;
697 delete flippedLobs;
698 delete flippedLpred;
699 }
700
701
702 if(dataonly) {
703 dout << "Processing data with datajzb: " << datajzb << endl;
704 TH1F *ZOSSFP = allsamples.Draw("ZOSSFP",datajzb,binning, "JZB", "events",cutmass&&cutOSSF&&limitnJetcut&&basiccut,data,luminosity);
705 TH1F *ZOSOFP = allsamples.Draw("ZOSOFP",datajzb,binning, "JZB", "events",cutmass&&cutOSOF&&limitnJetcut&&basiccut,data,luminosity);
706 TH1F *ZOSSFN = allsamples.Draw("ZOSSFN","-"+datajzb,binning, "JZB", "events",cutmass&&cutOSSF&&limitnJetcut&&basiccut,data,luminosity);
707 TH1F *ZOSOFN = allsamples.Draw("ZOSOFN","-"+datajzb,binning, "JZB", "events",cutmass&&cutOSOF&&limitnJetcut&&basiccut,data,luminosity);
708
709 TH1F *SBOSSFP;
710 TH1F *SBOSOFP;
711 TH1F *SBOSSFN;
712 TH1F *SBOSOFN;
713
714 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
715 SBOSSFP = allsamples.Draw("SBOSSFP",datajzb,binning, "JZB", "events",cutOSSF&&limitnJetcut&&basiccut&&sidebandcut,data,luminosity);
716 SBOSOFP = allsamples.Draw("SBOSOFP",datajzb,binning, "JZB", "events",cutOSOF&&limitnJetcut&&basiccut&&sidebandcut,data,luminosity);
717 SBOSSFN = allsamples.Draw("SBOSSFN","-"+datajzb,binning, "JZB", "events",cutOSSF&&limitnJetcut&&basiccut&&sidebandcut,data,luminosity);
718 SBOSOFN = allsamples.Draw("SBOSOFN","-"+datajzb,binning, "JZB", "events",cutOSOF&&limitnJetcut&&basiccut&&sidebandcut,data,luminosity);
719 }
720
721 string obsname="data_obs";
722 string predname="background";
723 string Zpredname="ZJetsBackground";
724 string Tpredname="TTbarBackground";
725 if(identifier!="") {
726 obsname=("data_"+identifier);
727 predname=("background_"+identifier);
728 Zpredname=("ZJetsBackground_"+identifier);
729 Tpredname=("TTbarBackground_"+identifier);
730 }
731
732 TH1F *obs = (TH1F*)ZOSSFP->Clone("observation");
733 obs->SetName(obsname.c_str());
734 obs->Write();
735
736 TH1F *flippedobs = (TH1F*)ZOSSFN->Clone("flipped_observation");
737 flippedobs->SetName(("flipped_"+obsname).c_str());
738 flippedobs->Write();
739
740 TH1F *Tpred = (TH1F*)ZOSSFN->Clone("TTbarprediction");
741 TH1F *Zpred = (TH1F*)ZOSSFN->Clone("ZJetsprediction");
742
743 TH1F *pred = (TH1F*)ZOSSFN->Clone("prediction");
744
745 TH1F *flippedTpred = (TH1F*)ZOSSFP->Clone("flipped_TTbarprediction");
746 TH1F *flippedZpred = (TH1F*)ZOSSFP->Clone("flipped_ZJetsprediction");
747
748 TH1F *flippedpred = (TH1F*)ZOSSFP->Clone("flipped_prediction");
749 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
750 pred->Add(ZOSOFP,1.0/3);
751 pred->Add(ZOSOFN,-1.0/3);
752 pred->Add(SBOSSFP,1.0/3);
753 pred->Add(SBOSSFN,-1.0/3);
754 pred->Add(SBOSOFP,1.0/3);
755 pred->Add(SBOSOFN,-1.0/3);
756
757 Tpred->Add(ZOSSFN,-1.0);
758 Tpred->Add(ZOSOFP,1.0/3);
759 Tpred->Add(SBOSSFP,1.0/3);
760 Tpred->Add(SBOSOFP,1.0/3);
761
762 Zpred->Add(ZOSOFN,-1.0/3);
763 Zpred->Add(SBOSSFN,-1.0/3);
764 Zpred->Add(SBOSOFN,-1.0/3);
765
766 //flipped
767 flippedpred->Add(ZOSOFP,-1.0/3);
768 flippedpred->Add(ZOSOFN,1.0/3);
769 flippedpred->Add(SBOSSFP,-1.0/3);
770 flippedpred->Add(SBOSSFN,1.0/3);
771 flippedpred->Add(SBOSOFP,-1.0/3);
772 flippedpred->Add(SBOSOFN,1.0/3);
773
774 flippedTpred->Add(ZOSSFP,-1.0);
775 flippedTpred->Add(ZOSOFN,1.0/3);
776 flippedTpred->Add(SBOSSFN,1.0/3);
777 flippedTpred->Add(SBOSOFN,1.0/3);
778
779 flippedZpred->Add(ZOSOFP,-1.0/3);
780 flippedZpred->Add(SBOSSFP,-1.0/3);
781 flippedZpred->Add(SBOSOFP,-1.0/3);
782 } else {
783 pred->Add(ZOSOFP,1.0);
784 pred->Add(ZOSOFN,-1.0);
785
786 Tpred->Add(ZOSSFN,-1.0);
787 Tpred->Add(ZOSOFP,1.0);
788
789 Zpred->Add(ZOSOFN,-1.0);
790
791 //flipped
792 flippedpred->Add(ZOSOFN,1.0);
793 flippedpred->Add(ZOSOFP,-1.0);
794
795 flippedTpred->Add(ZOSSFP,-1.0);
796 flippedTpred->Add(ZOSOFN,1.0);
797
798 flippedZpred->Add(ZOSOFP,-1.0);
799 }
800
801 pred->SetName(predname.c_str());
802 Tpred->SetName(Tpredname.c_str());
803 Zpred->SetName(Zpredname.c_str());
804
805 flippedpred->SetName(("flipped_"+predname).c_str());
806 flippedTpred->SetName(("flipped_"+Tpredname).c_str());
807 flippedZpred->SetName(("flipped_"+Zpredname).c_str());
808
809 pred->Write();
810 Tpred->Write();
811 Zpred->Write();
812
813 flippedpred->Write();
814 flippedTpred->Write();
815 flippedZpred->Write();
816
817 if(identifier=="") {
818 float stretchfactor=1.0;
819 bool isonpeak=false;
820 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
821 stretchfactor=1.0/3.0;
822 isonpeak=true;
823 }
824
825 //--------------------------------------------------------statistical uncertainty
826
827 TH1F *predstaterr = (TH1F*)ZOSSFN->Clone("predstaterr");
828 predstaterr->Add(ZOSOFP,stretchfactor*stretchfactor);
829 predstaterr->Add(ZOSOFN,stretchfactor*stretchfactor);
830 if(isonpeak) predstaterr->Add(SBOSSFP,stretchfactor*stretchfactor);
831 if(isonpeak) predstaterr->Add(SBOSSFN,stretchfactor*stretchfactor);
832 if(isonpeak) predstaterr->Add(SBOSOFP,stretchfactor*stretchfactor);
833 if(isonpeak) predstaterr->Add(SBOSOFN,stretchfactor*stretchfactor);
834 SQRT(predstaterr);
835 TH1F *bgStatUp = (TH1F*)pred->Clone("background_StatUp");
836 bgStatUp->Add(predstaterr);
837 EliminateNegativeEntries(bgStatUp);
838 bgStatUp->Write();
839 TH1F *bgStatDn = (TH1F*)pred->Clone("background_StatDown");
840 bgStatDn->Add(predstaterr,-1);
841 EliminateNegativeEntries(bgStatDn);
842 bgStatDn->Write();
843 // delete bgStatDn;
844 // delete bgStatUp;
845 delete predstaterr;
846
847
848 TH1F *flippedpredstaterr = (TH1F*)ZOSSFP->Clone("predstaterr");
849 flippedpredstaterr->Add(ZOSOFP,stretchfactor*stretchfactor);
850 flippedpredstaterr->Add(ZOSOFN,stretchfactor*stretchfactor);
851 if(isonpeak) flippedpredstaterr->Add(SBOSSFP,stretchfactor*stretchfactor);
852 if(isonpeak) flippedpredstaterr->Add(SBOSSFN,stretchfactor*stretchfactor);
853 if(isonpeak) flippedpredstaterr->Add(SBOSOFP,stretchfactor*stretchfactor);
854 if(isonpeak) flippedpredstaterr->Add(SBOSOFN,stretchfactor*stretchfactor);
855 SQRT(flippedpredstaterr);
856 TH1F *fbgStatUp = (TH1F*)flippedpred->Clone("flipped_background_StatUp");
857 fbgStatUp->Add(predstaterr);
858 EliminateNegativeEntries(fbgStatUp);
859 fbgStatUp->Write();
860 TH1F *fbgStatDn = (TH1F*)flippedpred->Clone("flipped_background_StatDown");
861 fbgStatDn->Add(predstaterr,-1);
862 EliminateNegativeEntries(fbgStatDn);
863 fbgStatDn->Write();
864 // delete fbgStatDn;
865 // delete fbgStatUp;
866 delete predstaterr;
867
868 TH1F *Tpredstaterr = (TH1F*)ZOSOFP->Clone("Tpredstaterr");
869 Tpredstaterr->Scale(stretchfactor*stretchfactor);
870 if(isonpeak) Tpredstaterr->Add(SBOSSFP,stretchfactor*stretchfactor);
871 if(isonpeak) Tpredstaterr->Add(SBOSOFP,stretchfactor*stretchfactor);
872 SQRT(Tpredstaterr);
873 TH1F *TpredStatUp = (TH1F*)Tpred->Clone("TTbarBackground_StatUp");
874 TpredStatUp->Add(Tpredstaterr);
875 EliminateNegativeEntries(TpredStatUp);
876 TpredStatUp->Write();
877 TH1F *TpredStatDn = (TH1F*)Tpred->Clone("TTbarBackground_StatDown");
878 TpredStatDn->Add(Tpredstaterr,-1);
879 EliminateNegativeEntries(TpredStatDn);
880 TpredStatDn->Write();
881 // delete TpredStatDn;
882 // delete TpredStatUp;
883 delete Tpredstaterr;
884
885 TH1F *fTpredstaterr = (TH1F*)ZOSOFN->Clone("flipped_Tpredstaterr");
886 fTpredstaterr->Scale(stretchfactor*stretchfactor);
887 if(isonpeak) fTpredstaterr->Add(SBOSSFN,stretchfactor*stretchfactor);
888 if(isonpeak) fTpredstaterr->Add(SBOSOFN,stretchfactor*stretchfactor);
889 SQRT(fTpredstaterr);
890 TH1F *fTpredStatUp = (TH1F*)flippedTpred->Clone("flipped_TTbarBackground_StatUp");
891 fTpredStatUp->Add(fTpredstaterr);
892 EliminateNegativeEntries(fTpredStatUp);
893 fTpredStatUp->Write();
894 TH1F *fTpredStatDn = (TH1F*)flippedTpred->Clone("flipped_TTbarBackground_StatDown");
895 fTpredStatDn->Add(fTpredstaterr,-1);
896 EliminateNegativeEntries(fTpredStatDn);
897 fTpredStatDn->Write();
898 // delete fTpredStatDn;
899 // delete fTpredStatUp;
900 delete fTpredstaterr;
901
902
903 TH1F *Zpredstaterr = (TH1F*)ZOSSFN->Clone("ZJetsstaterr");
904 Zpredstaterr->Add(ZOSOFN,stretchfactor*stretchfactor);
905 if(isonpeak) Zpredstaterr->Add(SBOSSFN,stretchfactor*stretchfactor);
906 if(isonpeak) Zpredstaterr->Add(SBOSOFN,stretchfactor*stretchfactor);
907 SQRT(Zpredstaterr);
908 TH1F *ZpredStatUp = (TH1F*)Zpred->Clone("ZJetsBackground_StatUp");
909 ZpredStatUp->Add(Zpredstaterr);
910 EliminateNegativeEntries(ZpredStatUp);
911 ZpredStatUp->Write();
912 TH1F *ZpredStatDn = (TH1F*)Zpred->Clone("ZJetsBackground_StatDown");
913 ZpredStatDn->Add(Zpredstaterr,-1);
914 EliminateNegativeEntries(ZpredStatDn);
915 ZpredStatDn->Write();
916 // delete ZpredStatDn;
917 // delete ZpredStatUp;
918 delete Zpredstaterr;
919
920 TH1F *fZpredstaterr = (TH1F*)ZOSSFP->Clone("flipped_ZJetsstaterr");
921 Zpredstaterr->Add(ZOSOFP,stretchfactor*stretchfactor);
922 if(isonpeak) fZpredstaterr->Add(SBOSSFP,stretchfactor*stretchfactor);
923 if(isonpeak) fZpredstaterr->Add(SBOSOFP,stretchfactor*stretchfactor);
924 SQRT(fTpredstaterr);
925 TH1F *fZpredStatUp = (TH1F*)flippedZpred->Clone("flipped_ZJetsBackground_StatUp");
926 fZpredStatUp->Add(fZpredstaterr);
927 EliminateNegativeEntries(fZpredStatUp);
928 fZpredStatUp->Write();
929 TH1F *fZpredStatDn = (TH1F*)flippedZpred->Clone("flipped_ZJetsBackground_StatDown");
930 fZpredStatDn->Add(fZpredstaterr,-1);
931 EliminateNegativeEntries(fZpredStatDn);
932 fZpredStatDn->Write();
933 // delete fZpredStatDn;
934 // delete fZpredStatUp;
935 delete fZpredstaterr;
936
937 //--------------------------------------------------------systematic uncertainty
938
939 TH1F *predsyserr = (TH1F*)pred->Clone("SysError");
940 predsyserr->Add(pred,-1);//getting everything to zero.
941 predsyserr->Add(Multiply(ZOSSFN,ZOSSFN),zjetsestimateuncert*zjetsestimateuncert);
942 predsyserr->Add(Multiply(ZOSOFP,ZOSOFP),stretchfactor*stretchfactor*emuncert*emuncert);
943 predsyserr->Add(Multiply(ZOSOFN,ZOSOFN),stretchfactor*stretchfactor*emuncert*emuncert);
944 if(isonpeak) predsyserr->Add(Multiply(SBOSSFP,SBOSSFP),stretchfactor*stretchfactor*eemmsidebanduncert*eemmsidebanduncert);
945 if(isonpeak) predsyserr->Add(Multiply(SBOSSFN,SBOSSFN),stretchfactor*stretchfactor*eemmsidebanduncert*eemmsidebanduncert);
946 if(isonpeak) predsyserr->Add(Multiply(SBOSOFP,SBOSOFP),stretchfactor*stretchfactor*emsidebanduncert*emsidebanduncert);
947 if(isonpeak) predsyserr->Add(Multiply(SBOSOFN,SBOSOFN),stretchfactor*stretchfactor*emsidebanduncert*emsidebanduncert);
948 SQRT(predsyserr);
949 TH1F *bgSysUp = (TH1F*)pred->Clone("background_SysUp");
950 bgSysUp->Add(predsyserr);
951 EliminateNegativeEntries(bgSysUp);
952 bgSysUp->Write();
953 TH1F *bgSysDn = (TH1F*)pred->Clone("background_SysDown");
954 bgSysDn->Add(predsyserr,-1);
955 EliminateNegativeEntries(bgSysDn);
956 bgSysDn->Write();
957 delete predsyserr;
958
959 TH1F *fpredsyserr = (TH1F*)pred->Clone("SysError");
960 fpredsyserr->Add(pred,-1);//getting everything to zero.
961 fpredsyserr->Add(Multiply(ZOSSFP,ZOSSFP),zjetsestimateuncert*zjetsestimateuncert);
962 fpredsyserr->Add(Multiply(ZOSOFP,ZOSOFP),stretchfactor*stretchfactor*emuncert*emuncert);
963 fpredsyserr->Add(Multiply(ZOSOFN,ZOSOFN),stretchfactor*stretchfactor*emuncert*emuncert);
964 if(isonpeak) fpredsyserr->Add(Multiply(SBOSSFP,SBOSSFP),stretchfactor*stretchfactor*eemmsidebanduncert*eemmsidebanduncert);
965 if(isonpeak) fpredsyserr->Add(Multiply(SBOSSFN,SBOSSFN),stretchfactor*stretchfactor*eemmsidebanduncert*eemmsidebanduncert);
966 if(isonpeak) fpredsyserr->Add(Multiply(SBOSOFP,SBOSOFP),stretchfactor*stretchfactor*emsidebanduncert*emsidebanduncert);
967 if(isonpeak) fpredsyserr->Add(Multiply(SBOSOFN,SBOSOFN),stretchfactor*stretchfactor*emsidebanduncert*emsidebanduncert);
968 SQRT(fpredsyserr);
969 TH1F *fbgSysUp = (TH1F*)flippedpred->Clone("flipped_background_SysUp");
970 fbgSysUp->Add(fpredsyserr);
971 EliminateNegativeEntries(fbgSysUp);
972 fbgSysUp->Write();
973 TH1F *fbgSysDn = (TH1F*)flippedpred->Clone("flipped_background_SysDown");
974 fbgSysDn->Add(fpredsyserr,-1);
975 EliminateNegativeEntries(fbgSysDn);
976 fbgSysDn->Write();
977 delete fpredsyserr;
978
979
980 TH1F *Tpredsyserr = (TH1F*)Tpred->Clone("SysError");
981 Tpredsyserr->Add(Tpred,-1);//getting everything to zero.
982 Tpredsyserr->Add(Multiply(ZOSOFP,ZOSOFP),stretchfactor*stretchfactor*emuncert*emuncert);
983 if(isonpeak) Tpredsyserr->Add(Multiply(SBOSSFP,SBOSSFP),stretchfactor*stretchfactor*eemmsidebanduncert*eemmsidebanduncert);
984 if(isonpeak) Tpredsyserr->Add(Multiply(SBOSOFP,SBOSOFP),stretchfactor*stretchfactor*emsidebanduncert*emsidebanduncert);
985 SQRT(Tpredsyserr);
986 TH1F *TpredSysUp = (TH1F*)Tpred->Clone("TTbarBackground_SysUp");
987 TpredSysUp->Add(Tpredsyserr);
988 EliminateNegativeEntries(TpredSysUp);
989 TpredSysUp->Write();
990 TH1F *TpredSysDn = (TH1F*)Tpred->Clone("TTbarBackground_SysDown");
991 TpredSysDn->Add(Tpredsyserr,-1);
992 EliminateNegativeEntries(TpredSysDn);
993 TpredSysDn->Write();
994 delete Tpredsyserr;
995
996 TH1F *fTpredsyserr = (TH1F*)Tpred->Clone("SysError");
997 fTpredsyserr->Add(Tpred,-1);//getting everything to zero.
998 fTpredsyserr->Add(Multiply(ZOSOFN,ZOSOFN),stretchfactor*stretchfactor*emuncert*emuncert);
999 if(isonpeak) fTpredsyserr->Add(Multiply(SBOSSFN,SBOSSFN),stretchfactor*stretchfactor*eemmsidebanduncert*eemmsidebanduncert);
1000 if(isonpeak) fTpredsyserr->Add(Multiply(SBOSOFN,SBOSOFN),stretchfactor*stretchfactor*emsidebanduncert*emsidebanduncert);
1001 SQRT(fTpredsyserr);
1002 TH1F *fTpredSysUp = (TH1F*)flippedTpred->Clone("flipped_TTbarBackground_SysUp");
1003 fTpredSysUp->Add(fTpredsyserr);
1004 EliminateNegativeEntries(fTpredSysUp);
1005 fTpredSysUp->Write();
1006 TH1F *fTpredSysDn = (TH1F*)flippedTpred->Clone("flipped_TTbarBackground_SysDown");
1007 fTpredSysDn->Add(fTpredsyserr,-1);
1008 EliminateNegativeEntries(fTpredSysDn);
1009 fTpredSysDn->Write();
1010 delete fTpredsyserr;
1011
1012
1013 //------------------------------------------------------------------------------------------------------------------------
1014 TH1F *Zpredsyserr = (TH1F*)Zpred->Clone("SysError");
1015 Zpredsyserr->Add(Zpred,-1);//getting everything to zero.
1016 Zpredsyserr->Add(Multiply(ZOSSFN,ZOSSFN),zjetsestimateuncert*zjetsestimateuncert);
1017 Zpredsyserr->Add(Multiply(ZOSOFN,ZOSOFN),stretchfactor*stretchfactor*emuncert*emuncert);
1018 if(isonpeak) Zpredsyserr->Add(Multiply(SBOSSFN,SBOSSFN),stretchfactor*stretchfactor*eemmsidebanduncert*eemmsidebanduncert);
1019 if(isonpeak) Zpredsyserr->Add(Multiply(SBOSOFN,SBOSOFN),stretchfactor*stretchfactor*emsidebanduncert*emsidebanduncert);
1020 SQRT(Zpredsyserr);
1021 TH1F *ZpredSysUp = (TH1F*)Zpred->Clone("ZJetsBackground_SysUp");
1022 ZpredSysUp->Add(Zpredsyserr);
1023 EliminateNegativeEntries(ZpredSysUp);
1024 ZpredSysUp->Write();
1025 TH1F *ZpredSysDn = (TH1F*)Zpred->Clone("ZJetsBackground_SysDown");
1026 ZpredSysDn->Add(Zpredsyserr,-1);
1027 EliminateNegativeEntries(ZpredSysDn);
1028 ZpredSysDn->Write();
1029 delete Zpredsyserr;
1030
1031 TH1F *fZpredsyserr = (TH1F*)Zpred->Clone("SysError");
1032 fZpredsyserr->Add(Zpred,-1);//getting everything to zero.
1033 fZpredsyserr->Add(Multiply(ZOSSFP,ZOSSFP),zjetsestimateuncert*zjetsestimateuncert);
1034 fZpredsyserr->Add(Multiply(ZOSOFP,ZOSOFP),stretchfactor*stretchfactor*emuncert*emuncert);
1035 if(isonpeak) fZpredsyserr->Add(Multiply(SBOSSFP,SBOSSFP),stretchfactor*stretchfactor*eemmsidebanduncert*eemmsidebanduncert);
1036 if(isonpeak) fZpredsyserr->Add(Multiply(SBOSOFP,SBOSOFP),stretchfactor*stretchfactor*emsidebanduncert*emsidebanduncert);
1037 SQRT(fZpredsyserr);
1038 TH1F *fZpredSysUp = (TH1F*)flippedZpred->Clone("flipped_ZJetsBackground_SysUp");
1039 fZpredSysUp->Add(fZpredsyserr);
1040 EliminateNegativeEntries(fZpredSysUp);
1041 fZpredSysUp->Write();
1042 TH1F *fZpredSysDn = (TH1F*)flippedZpred->Clone("flipped_ZJetsBackground_SysDown");
1043 fZpredSysDn->Add(fZpredsyserr,-1);
1044 EliminateNegativeEntries(fZpredSysDn);
1045 fZpredSysDn->Write();
1046 delete fZpredsyserr;
1047 }
1048
1049 /*if(identifier=="") {
1050 for(int i=0;i<binning.size()-1;i++) {
1051 dout << "[ " << binning[i] << " , " << binning[i+1] << "] : O " << obs->GetBinContent(i+1) << " P " << pred->GetBinContent(i+1) << " (Z: " << Zpred->GetBinContent(i+1) << " , T: " << Tpred->GetBinContent(i+1) << ")" << endl;
1052 }
1053 }*/
1054 delete ZOSSFP;
1055 delete ZOSOFP;
1056 delete ZOSSFN;
1057 delete ZOSOFN;
1058
1059 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
1060 delete SBOSSFP;
1061 delete SBOSOFP;
1062 delete SBOSSFN;
1063 delete SBOSOFN;
1064 }
1065 }
1066
1067
1068 //----------------------------------- ******** GOTTEN HERE *******---------------------------------------
1069
1070
1071
1072
1073
1074 }
1075
1076 void DoFullCls(string RunDirectory,float firstGuess) {
1077 vector<float> epoints = get_expected_points(firstGuess,25,RunDirectory,true);//get 20 points;
1078 ofstream RealScript;
1079 dout << "Going to write the full CLs script to " << RunDirectory << "/LimitScript.sh" << endl;
1080 RealScript.open ((RunDirectory+"/LimitScript.sh").c_str());
1081 RealScript << "#!/bin/bash \n";
1082 RealScript << "\n";
1083 RealScript << "RunDirectory=" << RunDirectory << "\n";
1084 RealScript << "CMSSWDirectory=" << PlottingSetup::CMSSW_dir << "\n";
1085 RealScript << "ORIGTMP=$TMP\n";
1086 RealScript << "ORIGTMPDIR=$TMPDIR\n";
1087 RealScript << "export TMP=" << RunDirectory << "\n";
1088 RealScript << "export TMPDIR=" << RunDirectory << "\n";
1089 RealScript << "\n";
1090 RealScript << "echo \"Going to compute limit in $RunDirectory\"\n";
1091 RealScript << "ORIGDIR=`pwd`\n";
1092 RealScript << "\n";
1093 RealScript << "pushd $CMSSWDirectory\n";
1094 RealScript << "cd ~/final_production_2011/CMSSW_4_2_8/src/HiggsAnalysis/\n";
1095 RealScript << "origscramarch=$SCRAM_ARCH\n";
1096 RealScript << "origbase=$CMSSW_BASE\n";
1097 RealScript << "export SCRAM_ARCH=slc5_amd64_gcc434\n";
1098 RealScript << "eval `scram ru -sh`\n";
1099 RealScript << "\n";
1100 RealScript << "mkdir -p $RunDirectory\n";
1101 RealScript << "cd $RunDirectory\n";
1102 RealScript << "echo `pwd`\n";
1103 RealScript << "mkdir -p FullCLs\n";
1104 RealScript << "cd FullCLs\n";
1105 RealScript << "\n";
1106 RealScript << "combineEXE=\"${CMSSW_BASE}/bin/${SCRAM_ARCH}/combine\"\n";
1107 RealScript << "\n";
1108 RealScript << "dobreak=0\n";
1109 RealScript << "npoints=0\n";
1110 RealScript << "time for i in {";
1111 RealScript << epoints[0]/4 << ","; // adding a VERY VERY low point just to be totally safe
1112 RealScript << epoints[0]/2 << ","; // adding a VERY low point just to be safe
1113 for(int i=0;i<(int)epoints.size();i++) RealScript << epoints[i] << ",";
1114 RealScript << 2*epoints[epoints.size()-1] << ","; // adding a VERY high point just to be safe
1115 RealScript << 4*epoints[epoints.size()-1]; // adding a VERY VERY high point just to be totally safe
1116 RealScript << "}; do \n";
1117 RealScript << "let \"npoints = npoints +1\"\n";
1118 RealScript << "if [[ $dobreak -gt 0 ]]; then \n";
1119 RealScript << " continue \n";
1120 RealScript << "fi \n";
1121 RealScript << "echo -e \" Going to compute CLs for $i \\n\"\n";
1122 RealScript << "echo $(date +%d%b%Y,%H:%M:%S)\n";
1123 RealScript << "time " << PlottingSetup::cbafbasedir << "/DistributedModelCalculations/Utilities/TimeOut \"$combineEXE ../susydatacard.txt -M HybridNew --freq -T 500 --clsAcc 0 -v 0 -n TestPoint --saveHybridResult --saveToys -s -1 -i 8 --singlePoint $i >/dev/null 2>/dev/null\"\n";
1124 // RealScript << "$combineEXE ../susydatacard.txt -M HybridNew --freq -T 500 --clsAcc 0 -v 0 -n TestPoint --saveHybridResult --saveToys -s -1 -i 8 --singlePoint $i >/dev/null 2>/dev/null \n";
1125 RealScript << "errorsize=$?\n";
1126 RealScript << "rm " << RunDirectory << "/rstat* 2>/dev/null \n";
1127 RealScript << "if [[ $errorsize -gt 0 ]]; then \n";
1128 RealScript << " echo \"Apparently something went wrong (had to be aborted)\"\n";
1129 RealScript << " if [[ $npoints -gt 10 ]]; then \n";
1130 RealScript << " dobreak=1 \n";
1131 RealScript << " fi \n";
1132 RealScript << "fi \n";
1133 RealScript << "done\n";
1134
1135 RealScript << "\n";
1136 RealScript << "hadd -f FullCLs.root higgsCombine*.root\n";
1137 RealScript << "mkdir originalFiles\n";
1138 RealScript << "mv higgsCombine* originalFiles\n";
1139 RealScript << "$combineEXE ../susydatacard.txt -M HybridNew --freq --grid=FullCLs.root\n";
1140 RealScript << "$combineEXE ../susydatacard.txt -M HybridNew --freq --grid=FullCLs.root --expectedFromGrid 0.5\n";
1141 RealScript << "$combineEXE ../susydatacard.txt -M HybridNew --freq --grid=FullCLs.root --expectedFromGrid 0.84\n";
1142 RealScript << "$combineEXE ../susydatacard.txt -M HybridNew --freq --grid=FullCLs.root --expectedFromGrid 0.16\n";
1143 RealScript << "$combineEXE ../susydatacard.txt -M HybridNew --freq --grid=FullCLs.root --expectedFromGrid 0.975\n";
1144 RealScript << "$combineEXE ../susydatacard.txt -M HybridNew --freq --grid=FullCLs.root --expectedFromGrid 0.025\n";
1145 RealScript << "\n";
1146 RealScript << "hadd FinalResult.root higgsCombineTest.HybridNew*\n";
1147 RealScript << "\n";
1148 RealScript << "g++ " << PlottingSetup::cbafbasedir << "/DistributedModelCalculations/ShapeLimits/ReadAndSave.C -o ReadAndSave.exec `root-config --glibs --cflags` \n";
1149 RealScript << "./ReadAndSave.exec FinalResult.root " << RunDirectory << "/FullCLsShapeDropletResult.txt \n";
1150 RealScript << "\n";
1151 RealScript << "rm " << RunDirectory << "/rstat* \n";
1152 RealScript << "\n";
1153 RealScript << "#####\n";
1154 RealScript << "echo \"Finalizing ...\"\n";
1155 RealScript << "cd $ORIGDIR\n";
1156 RealScript << "echo $ORIGDIR\n";
1157 RealScript << "ls -ltrh ../SandBox/ | grep combine\n";
1158 RealScript << "export SCRAM_ARCH=$origscramarch\n";
1159 RealScript << "export TMP=$ORIGTMP\n";
1160 RealScript << "export TMPDIR=$ORIGTMPDIR\n";
1161 RealScript << "exit 0\n";
1162 RealScript << "\n";
1163 RealScript.close();
1164 gSystem->Exec(("bash "+RunDirectory+"/LimitScript.sh").c_str());
1165 }
1166
1167
1168 ShapeDroplet LimitsFromShapes(float low_fullCLs, float high_CLs, TTree *events, string addcut, string name, string mcjzb, string datajzb, vector<float> jzbbins, float jzbpeakerrormc, float jzbpeakerrordata) {
1169 map < pair<float, float>, map<string, float> > xsec;
1170 if(SUSYScanSpace::SUSYscantype==mSUGRA) xsec=getXsec(PlottingSetup::cbafbasedir+"/"+mSUGRAxsFile);
1171
1172 time_t timestamp;
1173 tm *now;
1174 timestamp = time(0);
1175 now = localtime(&timestamp);
1176 stringstream RunDirectoryS;
1177 RunDirectoryS << PlottingSetup::cbafbasedir << "/exchange/ShapeComputation___" << name << "__" << now->tm_hour << "h_" << now->tm_min << "m_" << now->tm_sec << "s___" << rand();
1178 string RunDirectory = RunDirectoryS.str();
1179
1180 ensure_directory_exists(RunDirectory);
1181
1182 TFile *datafile = new TFile((PlottingSetup::cbafbasedir+"/DistributedModelCalculations/StoredShapes.root").c_str());
1183 if(datafile->IsZombie()) {
1184 write_error(__FUNCTION__,"Fatal error: The stored shapes are not available!");
1185 assert(!datafile->IsZombie());
1186 }
1187 dout << "Run Directory: " << RunDirectory << endl;
1188 TFile *limfile = new TFile((RunDirectory+"/PRElimitfile.root").c_str(),"RECREATE");
1189
1190 TIter nextkey(datafile->GetListOfKeys());
1191 TKey *key;
1192 while ((key = (TKey*)nextkey()))
1193 {
1194 TH1F *obj =(TH1F*) key->ReadObj();
1195 limfile->cd();
1196 obj->Write();
1197 }
1198
1199 TCanvas *limcan = new TCanvas("limcan","Canvas for calculating limits");
1200
1201 bool signalonly=true;
1202 bool dataonly=false;
1203
1204 generate_shapes_for_systematic(signalonly,dataonly,limfile,events,"",mcjzb,datajzb,noJES,jzbbins,limcan,addcut,xsec);
1205 generate_shapes_for_systematic(signalonly,dataonly,limfile,events,"JESUp",mcjzb,datajzb,JESup,jzbbins,limcan,addcut,xsec);
1206 generate_shapes_for_systematic(signalonly,dataonly,limfile,events,"JESDown",mcjzb,datajzb,JESdown,jzbbins,limcan,addcut,xsec);
1207
1208 float JZBScaleUncert=0.05; //if you modify this value please also adapt it in Systematics.C not only here in ShapeLimit.C
1209 float scaledown=0,scaleup=0,scalesyst=0;
1210 float mceff=0,mcefferr=0;
1211 int flipped=0;
1212 int Neventsinfile=10000;//doesn't matter.
1213 string informalname="ShapeAnalysis";
1214
1215 bool docomplicatedmSUGRAxsreweighting=false; //if you modify this value please also adapt it in Systematics.C not only here in ShapeLimit.C
1216
1217 MCefficiency(events,mceff,mcefferr,flipped,mcjzb,requireZ,Neventsinfile,SUSYScanSpace::SUSYscantype,xsec,addcut,-1);
1218 if(mceff<0) {
1219 flipped=1;
1220 write_info(__FUNCTION__,"Doing flipping!");
1221 }
1222 doJZBscale(events,SUSYScanSpace::SUSYscantype==mSUGRA&&docomplicatedmSUGRAxsreweighting,xsec,scaledown,scaleup,scalesyst,JZBScaleUncert,informalname,flipped,requireZ,addcut);
1223 float PDFuncert=0;
1224 int NPdfs = get_npdfs(events);
1225 if(SUSYScanSpace::SUSYscantype!=mSUGRA) PDFuncert = get_pdf_uncertainty(events, flipped, mcjzb, requireZ, Neventsinfile, SUSYScanSpace::SUSYscantype, xsec, NPdfs, addcut);
1226
1227 float JZBscale=scaledown;
1228 if(scaleup>scaledown) JZBscale=scaleup;
1229 dout << endl;
1230 dout << endl;
1231 dout << "Will use the following scalar (non-shape) systematics : " << endl;
1232 dout << " JZB Scale (JSU) : " << JZBscale << endl;
1233 dout << " PDF : " << PDFuncert << endl;
1234
1235 float SignalIntegral;
1236 if(flipped) {
1237 TH1F *flisi = (TH1F*)(limfile->Get("flipped_signal"));
1238 SignalIntegral= flisi ->Integral();
1239 delete flisi;
1240 }
1241 else {
1242 TH1F *flisi = (TH1F*)(limfile->Get("signal"));
1243 SignalIntegral= flisi ->Integral();
1244 delete flisi;
1245 }
1246
1247 TFile *final_limfile = new TFile((RunDirectory+"/limitfile.root").c_str(),"RECREATE");
1248
1249 TIter nnextkey(limfile->GetListOfKeys());
1250 TKey *nkey;
1251
1252 if(SignalIntegral==0) SignalIntegral=1; //case when the integral is zero - don't try to normalize, just leave it as it is
1253
1254 while ((nkey = (TKey*)nnextkey()))
1255 {
1256 TH1F *obj =(TH1F*) nkey->ReadObj();
1257 if(flipped&&!Contains(obj->GetName(),"flipped")) continue;
1258 if(!flipped&&Contains(obj->GetName(),"flipped")) continue;
1259 if(flipped) obj->SetName(strip_flip_away(obj->GetName()));
1260 final_limfile->cd();
1261 if(Contains(obj->GetName(),"signal")) {
1262 obj->Scale(1.0/SignalIntegral);
1263 }
1264 obj->Write();
1265 }
1266
1267 prepare_limit_datacard(RunDirectory,final_limfile,JZBscale,PDFuncert);
1268
1269 final_limfile->Close();
1270 limfile->Close();
1271 dout << "Info: Shape root file and datacard have been generated in " << RunDirectory << endl;
1272 stringstream command;
1273 string DropletLocation;
1274 int CreatedModelFileExitCode;
1275 //----------------------------------------------------------------
1276 //do an asymptotic limit first
1277 command << "bash " << PlottingSetup::cbafbasedir<< "/DistributedModelCalculations/ShapeLimits/CreateModel.sh " << RunDirectory << " susydatacard.txt" << " 0 0 0 0"; // ASYMPTOTIC LIMITS
1278 dout <<"Going to run : " << command.str() << endl;
1279 CreatedModelFileExitCode = gSystem->Exec(command.str().c_str());
1280 dout << "exit code of limit algorithm (CreateModel.sh) : " << CreatedModelFileExitCode << endl;
1281 if(!(CreatedModelFileExitCode==0)) {
1282 write_warning(__FUNCTION__,"Something bad happened. It looks like a shape analysis is not the way to go. ");
1283 ShapeDroplet beta;
1284 beta.observed=-12345; // this is the flag to say watch out something went wrong with the signal ...
1285 beta.SignalIntegral=1;
1286 return beta;
1287 }
1288 DropletLocation=RunDirectory+"/ShapeDropletResult.txt";
1289 ShapeDroplet beta;
1290 beta.readDroplet(DropletLocation);
1291 float obsLimit = beta.observed/SignalIntegral;
1292 dout << "Checking if the obtained limit (" << beta.observed << " / " << SignalIntegral << " = " << beta.observed/SignalIntegral << " is in [" << low_fullCLs << " , " << high_CLs << "]" << endl;
1293 if(obsLimit<high_CLs && obsLimit>low_fullCLs) {
1294 //if(PlottingSetup::scantype!=mSUGRA||(obsLimit<high_CLs && obsLimit>low_fullCLs)) {
1295 dout << " It is! Full CLs ahead!" << endl;
1296 DoFullCls(RunDirectory,beta.observed);
1297 DropletLocation=RunDirectory+"/FullCLsShapeDropletResult.txt";
1298 } else {
1299 dout << " It is not ... happy with asymptotic limits." << endl;
1300 }
1301 //----------------------------------------------------------------
1302 ShapeDroplet alpha;
1303 alpha.readDroplet(DropletLocation);
1304 alpha.PDF=PDFuncert;
1305 alpha.JSU=JZBscale;
1306 alpha.SignalIntegral=SignalIntegral;
1307 dout << "Done reading limit information from droplet" << endl;
1308 dout << alpha << endl;
1309
1310 dout << "Everything is saved in " << RunDirectory << endl;
1311 dout << "Cleaning up ... " << std::flush;
1312 write_warning(__FUNCTION__,"NOT CLEANING UP");
1313 // gSystem->Exec(("rm -rf "+RunDirectory).c_str());
1314 dout << " ok!" << endl;
1315 delete limcan;
1316 return alpha;
1317 }
1318
1319 void PrepareDataShapes(string mcjzb, string datajzb, vector<float> jzbbins, float jzbpeakerrordata) {
1320 dout << "Preparing data shapes ... " << endl;
1321 map < pair<float, float>, map<string, float> > xsec;
1322 TFile *datafile = new TFile("../DistributedModelCalculations/StoredShapes.root","RECREATE");
1323 TCanvas *limcan = new TCanvas("limcan","Canvas for calculating limits");
1324 TTree *faketree;
1325 bool dataonly=true;
1326 bool signalonly=false;
1327
1328 generate_shapes_for_systematic(signalonly,dataonly,datafile,faketree,"",mcjzb,datajzb,noJES,jzbbins,limcan,"",xsec);
1329
1330 generate_mc_shapes(false,faketree,mcjzb,datajzb,jzbbins,cutWeight,cutnJets,"","",xsec);
1331 generate_mc_shapes(false,faketree,mcjzb,datajzb,jzbbins,cutWeight,cutnJetsJESup,"","JESUp",xsec);
1332 generate_mc_shapes(false,faketree,mcjzb,datajzb,jzbbins,cutWeight,cutnJetsJESdown,"","JESDown",xsec);
1333 generate_mc_shapes(false,faketree,mcjzb,datajzb,jzbbins,TCut("weightEffUp"),cutnJets,"","EffUp",xsec);
1334 generate_mc_shapes(false,faketree,mcjzb,datajzb,jzbbins,TCut("weightEffDown"),cutnJets,"","EffDown",xsec);
1335 generate_mc_shapes(false,faketree,mcjzb,datajzb,jzbbins,cutWeight,cutnJets,"","StatUp",xsec);
1336 generate_mc_shapes(false,faketree,mcjzb,datajzb,jzbbins,cutWeight,cutnJets,"","StatDown",xsec);
1337
1338 datafile->Close();
1339
1340 }
1341