ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/ShapeLimit.C
Revision: 1.5
Committed: Wed Apr 25 15:27:13 2012 UTC (13 years ago) by buchmann
Content type: text/plain
Branch: MAIN
Changes since 1.4: +2 -1 lines
Log Message:
Forcing stat down to be positive semi-definite

File Contents

# User Rev Content
1 buchmann 1.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     //#include "TTbar_stuff.C"
22     using namespace std;
23    
24     using namespace PlottingSetup;
25    
26     namespace SUSYScanSpace {
27     vector<string> loaded_files;
28     int SUSYscantype;
29     float SavedMGlu;
30     float SavedMLSP;
31     string SavedMLSPname;
32     string SavedMGluname;
33     }
34    
35 buchmann 1.2 const char* strip_flip_away(string flipped_name) {
36     int pos = flipped_name.find("flipped_");
37     if(pos>=0&&pos<1000) flipped_name=flipped_name.substr(8,1000);
38     return flipped_name.c_str();
39     }
40    
41     void prepare_limit_datacard(string RunDirectory, TFile *f, float uJSU, float uPDF, int flipped) {
42     TH1F *dataob;
43     if(flipped) dataob = (TH1F*)f->Get("flipped_data_obs");
44     else dataob = (TH1F*)f->Get("data_obs");
45     TH1F *signal;
46    
47     if(flipped) signal = (TH1F*)f->Get("flipped_signal");
48     else signal = (TH1F*)f->Get("signal");
49    
50     TH1F *background1;
51     if(flipped) background1 = (TH1F*)f->Get("flipped_TTbarBackground");
52     else background1 = (TH1F*)f->Get("TTbarBackground");
53    
54     TH1F *background2;
55     if(flipped) background2 = (TH1F*)f->Get("flipped_ZJetsBackground");
56     else background2 = (TH1F*)f->Get("ZJetsBackground");
57    
58     assert(dataob);
59     assert(signal);
60     assert(background1);
61     assert(background2);
62    
63     ofstream datacard;
64 buchmann 1.3 write_warning(__FUNCTION__,"Need to rethink systematics we want to use !");
65 buchmann 1.2 datacard.open ((RunDirectory+"/susydatacard.txt").c_str());
66     datacard << "Writing this to a file.\n";
67     datacard << "imax 1\n"; // number of channels
68     datacard << "jmax 2\n"; // number of backgrounds (Z+Jets prediction and TTbar prediction)
69     datacard << "kmax *\n"; // number of nuisance parameters (sources of systematic uncertainties)
70     datacard << "---------------\n";
71     datacard << "shapes * * limitfile.root $PROCESS $PROCESS_$SYSTEMATIC\n";
72     datacard << "---------------\n";
73     datacard << "bin 1\n";
74     datacard << "observation "<<dataob->Integral()<<"\n";
75     datacard << "------------------------------\n";
76     datacard << "bin 1 1 1\n";
77     datacard << "process signal TTbarBackground ZJetsBackground\n";
78     datacard << "process 0 1 2\n";
79     datacard << "rate "<<signal->Integral()<<" "<<background1->Integral()<<" "<<background2->Integral()<<"\n";
80     datacard << "--------------------------------\n";
81 buchmann 1.3 datacard << "lumi lnN " << 1+ PlottingSetup::lumiuncert << " - - luminosity uncertainty\n"; // only affects MC -> signal!
82     datacard << "Stat shape - 1 - statistical uncertainty (ttbar)\n";
83     datacard << "Stat shape - - 1 statistical uncertainty (zjets)\n";
84 buchmann 1.4 datacard << "Sys shape - 1 - systematic uncertainty on ttbar\n";
85     datacard << "Sys shape - - 1 systematic uncertainty on zjets\n";
86     datacard << "Stat shape 1 - - statistical uncertainty (signal)\n";
87 buchmann 1.2 datacard << "JES shape 1 - - uncertainty on Jet Energy Scale\n";
88     datacard << "JSU lnN " << 1+uJSU << " - - JZB Scale Uncertainty\n";
89     if(uPDF>0) datacard << "PDF lnN " << 1+uPDF << " - - uncertainty from PDFs\n";
90    
91 buchmann 1.3 // datacard << "peak shape 1 1 uncertainty on signal resolution.
92 buchmann 1.2 datacard.close();
93     }
94    
95     float QuickDrawNevents=0;
96    
97 buchmann 1.1 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) {
98     TH1F *histo = new TH1F(hname.c_str(),hname.c_str(),binning.size()-1,&binning[0]);
99     histo->Sumw2();
100     stringstream drawcommand;
101     drawcommand << variable << ">>" << hname;
102     if(SUSYScanSpace::SUSYscantype!=mSUGRA) {
103     events->Draw(drawcommand.str().c_str(),(essentialcut&&cut&&addcut.c_str())*cutWeight);
104     } else {
105     float totalxs=0;
106     for(int i=0;i<12;i++) {
107     stringstream drawcommand2;
108     drawcommand2 << variable << ">>+" << hname;
109     stringstream mSUGRAweight;
110     float xs = XSForProcessViaAddCutWrapper(addcut,xsec,i);
111     totalxs+=xs;
112 buchmann 1.4 mSUGRAweight << "(0.5*(2*(process==" << i << "))*" << xs << ")";
113 buchmann 1.1 events->Draw(drawcommand2.str().c_str(),(essentialcut&&cut&&addcut.c_str())*cutWeight*mSUGRAweight.str().c_str());
114     }
115 buchmann 1.4 histo->Scale(1.0/totalxs); // to get back to 1 /pb normalization
116 buchmann 1.1 }
117     events->Draw("eventNum",addcut.c_str(),"goff");
118     float nevents = events->GetSelectedRows();
119 buchmann 1.2 QuickDrawNevents=nevents;
120 buchmann 1.1 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
121    
122     return histo;
123     }
124    
125     /*void do_stat_up(TH1F *h, float sign=1.0) {
126     for(int i=1;i<=h->GetNbinsX();i++) {
127     h->SetBinContent(i,h->GetBinContent(i)+sign*h->GetBinError(i));
128     }
129     h->Write();
130     }
131    
132     void do_stat_dn(TH1F *h) {
133     do_stat_up(h,-1.0);
134     }*/
135    
136     void SQRT(TH1F *h) {
137     for (int i=1;i<=h->GetNbinsX();i++) {
138     h->SetBinContent(i,TMath::Sqrt(h->GetBinContent(i)));
139     }
140     }
141    
142     TH1F* Multiply(TH1F *h1, TH1F *h2) {
143     TH1F *h = (TH1F*)h1->Clone();
144     for(int i=1;i<=h1->GetNbinsX();i++) {
145     h->SetBinContent(i,h1->GetBinContent(i) * h2->GetBinContent(i));
146     }
147     return h;
148     }
149    
150     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) {
151 buchmann 1.4
152 buchmann 1.1 binning.push_back(8000);
153     limfile->cd();
154 buchmann 1.4 dout << "Creating shape templates ";
155 buchmann 1.1 if(identifier!="") dout << "for "<<identifier;
156     dout << " ... " << endl;
157    
158     TCut limitnJetcut;
159 buchmann 1.4
160 buchmann 1.1 if(JES==noJES) limitnJetcut=cutnJets;
161     else {
162     if(JES==JESdown) limitnJetcut=cutnJetsJESdown;
163     if(JES==JESup) limitnJetcut=cutnJetsJESup;
164     }
165    
166     float zjetsestimateuncert=zjetsestimateuncertONPEAK;
167     float emuncert=emuncertONPEAK;
168     float emsidebanduncert=emsidebanduncertONPEAK;
169     float eemmsidebanduncert=eemmsidebanduncertONPEAK;
170    
171     if(!PlottingSetup::RestrictToMassPeak) {
172     zjetsestimateuncert=zjetsestimateuncertOFFPEAK;
173     emuncert=emuncertOFFPEAK;
174     emsidebanduncert=emsidebanduncertOFFPEAK;
175     eemmsidebanduncert=eemmsidebanduncertOFFPEAK;
176     }
177    
178     if(signalonly) {
179 buchmann 1.2 cout << "Processing a signal with mcjzb: " << mcjzb << " (identifier: " << identifier << ")" << endl;
180 buchmann 1.1 TH1F *ZOSSFP = QuickDraw(signalevents,"ZOSSFP",mcjzb,binning, "JZB", "events",cutmass&&cutOSSF&&limitnJetcut&&basiccut,addcut,mc,luminosity,xsec);
181     TH1F *ZOSOFP = QuickDraw(signalevents,"ZOSOFP",mcjzb,binning, "JZB", "events",cutmass&&cutOSOF&&limitnJetcut&&basiccut,addcut,mc,luminosity,xsec);
182     TH1F *ZOSSFN = QuickDraw(signalevents,"ZOSSFN","-"+mcjzb,binning, "JZB", "events",cutmass&&cutOSSF&&limitnJetcut&&basiccut,addcut,mc,luminosity,xsec);
183     TH1F *ZOSOFN = QuickDraw(signalevents,"ZOSOFN","-"+mcjzb,binning, "JZB", "events",cutmass&&cutOSOF&&limitnJetcut&&basiccut,addcut,mc,luminosity,xsec);
184    
185     TH1F *SBOSSFP;
186     TH1F *SBOSOFP;
187     TH1F *SBOSSFN;
188     TH1F *SBOSOFN;
189    
190     if(PlottingSetup::RestrictToMassPeak) {
191     SBOSSFP = QuickDraw(signalevents,"SBOSSFP",mcjzb,binning, "JZB", "events",cutOSSF&&limitnJetcut&&basiccut&&sidebandcut,addcut,mc,luminosity,xsec);
192     SBOSOFP = QuickDraw(signalevents,"SBOSOFP",mcjzb,binning, "JZB", "events",cutOSOF&&limitnJetcut&&basiccut&&sidebandcut,addcut,mc,luminosity,xsec);
193     SBOSSFN = QuickDraw(signalevents,"SBOSSFN","-"+mcjzb,binning, "JZB", "events",cutOSSF&&limitnJetcut&&basiccut&&sidebandcut,addcut,mc,luminosity,xsec);
194     SBOSOFN = QuickDraw(signalevents,"SBOSOFN","-"+mcjzb,binning, "JZB", "events",cutOSOF&&limitnJetcut&&basiccut&&sidebandcut,addcut,mc,luminosity,xsec);
195     }
196    
197     string signalname="signal";
198     if(identifier!="") {
199     signalname="signal_"+identifier;
200     }
201    
202     TH1F *Lobs = new TH1F("Lobs","Lobs",binning.size()-1,&binning[0]);
203     TH1F *Lpred = new TH1F("Lpred","Lpred",binning.size()-1,&binning[0]);
204    
205     TH1F *flippedLobs = new TH1F("flippedLobs","flippedLobs",binning.size()-1,&binning[0]);
206     TH1F *flippedLpred = new TH1F("flippedLpred","flippedLpred",binning.size()-1,&binning[0]);
207    
208     Lobs->Add(ZOSSFP);
209     Lpred->Add(ZOSSFN);
210    
211 buchmann 1.2 cout << "SITUATION FOR SIGNAL: " << endl;
212     cout << " OSSF JZB> 0 : " << ZOSSFP->Integral() << " JZB < 0 :" << ZOSSFN->Integral() << endl;
213     cout << " OSOF JZB> 0 : " << ZOSOFP->Integral() << " JZB < 0 :" << ZOSOFN->Integral() << endl;
214     if(PlottingSetup::RestrictToMassPeak) {
215     cout << " OSSF SB JZB> 0 : " << SBOSSFP->Integral() << " JZB < 0 :" << SBOSSFN->Integral() << endl;
216     cout << " OSOF SB JZB> 0 : " << SBOSOFP->Integral() << " JZB < 0 :" << SBOSOFN->Integral() << endl;
217     }
218 buchmann 1.4
219 buchmann 1.2
220 buchmann 1.1 flippedLobs->Add(ZOSSFN);
221     flippedLpred->Add(ZOSSFP);
222    
223     if(PlottingSetup::RestrictToMassPeak) {
224     Lpred->Add(ZOSOFP,1.0/3);
225     Lpred->Add(ZOSOFN,-1.0/3);
226     Lpred->Add(SBOSSFP,1.0/3);
227     Lpred->Add(SBOSSFN,-1.0/3);
228     Lpred->Add(SBOSOFP,1.0/3);
229     Lpred->Add(SBOSOFN,-1.0/3);
230    
231     //flipped prediction
232     flippedLpred->Add(ZOSOFP,-1.0/3);
233     flippedLpred->Add(ZOSOFN,1.0/3);
234     flippedLpred->Add(SBOSSFP,-1.0/3);
235     flippedLpred->Add(SBOSSFN,1.0/3);
236     flippedLpred->Add(SBOSOFP,-1.0/3);
237     flippedLpred->Add(SBOSOFN,1.0/3);
238    
239     } else {
240     Lpred->Add(ZOSOFP,1.0);
241     Lpred->Add(ZOSOFN,-1.0);
242 buchmann 1.2
243 buchmann 1.1 //flipped prediction
244     flippedLpred->Add(ZOSOFP,-1.0);
245     flippedLpred->Add(ZOSOFN,1.0);
246     }
247    
248 buchmann 1.2 TH1F *signal = (TH1F*)Lobs->Clone("signal");
249 buchmann 1.1 signal->Add(Lpred,-1);
250     signal->SetName(signalname.c_str());
251 buchmann 1.2 signal->SetTitle(signalname.c_str());
252 buchmann 1.1 signal->Write();
253    
254     TH1F *flippedsignal = (TH1F*)flippedLobs->Clone();
255     flippedsignal->Add(flippedLpred,-1);
256     flippedsignal->SetName(("flipped_"+signalname).c_str());
257     flippedsignal->Write();
258    
259     if(identifier=="") {
260     TH1F *signalStatUp = (TH1F*)signal->Clone();
261     signalStatUp->SetName(((string)signal->GetName()+"_StatUp").c_str());
262     signalStatUp->SetTitle(((string)signal->GetTitle()+"_StatUp").c_str());
263    
264     TH1F *signalStatDn = (TH1F*)signal->Clone();
265     signalStatDn->SetName(((string)signal->GetName()+"_StatDown").c_str());
266     signalStatDn->SetTitle(((string)signal->GetTitle()+"_StatDown").c_str());
267    
268     for(int i=1;i<=signalStatDn->GetNbinsX();i++) {
269 buchmann 1.2 float staterr = TMath::Sqrt(Lpred->GetBinContent(i) + Lobs->GetBinContent(i));
270 buchmann 1.4 cout << "Stat err in bin " << i << " : " << staterr << endl;
271     cout << " prediction: " << Lpred->GetBinContent(i) << " , observation: " << Lobs->GetBinContent(i) << " --> signal: " << signal->GetBinContent(i) << endl;
272     cout << " we obtain : " << signal->GetBinContent(i)-staterr << " , " << signal->GetBinContent(i)+staterr << endl;
273 buchmann 1.5 if(signal->GetBinContent(i)-staterr>0) signalStatDn->SetBinContent(i,signal->GetBinContent(i)-staterr);
274     else signalStatDn->SetBinContent(i,0);
275 buchmann 1.2 signalStatUp->SetBinContent(i,signal->GetBinContent(i)+staterr);
276     signal->SetBinError(i,staterr);
277 buchmann 1.1 }
278    
279     signalStatDn->Write();
280     signalStatUp->Write();
281    
282     delete signalStatDn;
283     delete signalStatUp;
284    
285     TH1F *flippedsignalStatUp = (TH1F*)flippedsignal->Clone();
286     flippedsignalStatUp->SetName(((string)flippedsignal->GetName()+"_StatUp").c_str());
287     flippedsignalStatUp->SetTitle(((string)flippedsignal->GetTitle()+"_StatUp").c_str());
288    
289     TH1F *flippedsignalStatDn = (TH1F*)flippedsignal->Clone();
290     flippedsignalStatDn->SetName(((string)flippedsignal->GetName()+"_StatDown").c_str());
291     flippedsignalStatDn->SetTitle(((string)flippedsignal->GetTitle()+"_StatDown").c_str());
292    
293     for(int i=1;i<=flippedsignalStatDn->GetNbinsX();i++) {
294 buchmann 1.2 float staterr = TMath::Sqrt(flippedLpred->GetBinContent(i) + flippedLobs->GetBinContent(i));
295     flippedsignalStatDn->SetBinContent(i,flippedsignal->GetBinContent(i)-staterr);
296     flippedsignalStatUp->SetBinContent(i,flippedsignal->GetBinContent(i)+staterr);
297     flippedsignal->SetBinError(i,staterr);
298 buchmann 1.1 }
299    
300     flippedsignalStatDn->Write();
301     flippedsignalStatUp->Write();
302    
303     delete flippedsignalStatDn;
304     delete flippedsignalStatUp;
305     }
306    
307     delete ZOSSFP;
308     delete ZOSOFP;
309     delete ZOSSFN;
310     delete ZOSOFN;
311    
312     if(PlottingSetup::RestrictToMassPeak) {
313     delete SBOSSFP;
314     delete SBOSOFP;
315     delete SBOSSFN;
316     delete SBOSOFN;
317     }
318    
319     delete Lobs;
320     delete Lpred;
321     delete flippedLobs;
322     delete flippedLpred;
323     }
324    
325    
326     if(dataonly) {
327     cout << "Processing data with datajzb: " << datajzb << endl;
328     TH1F *ZOSSFP = allsamples.Draw("ZOSSFP",datajzb,binning, "JZB", "events",cutmass&&cutOSSF&&limitnJetcut&&basiccut,data,luminosity);
329     TH1F *ZOSOFP = allsamples.Draw("ZOSOFP",datajzb,binning, "JZB", "events",cutmass&&cutOSOF&&limitnJetcut&&basiccut,data,luminosity);
330     TH1F *ZOSSFN = allsamples.Draw("ZOSSFN","-"+datajzb,binning, "JZB", "events",cutmass&&cutOSSF&&limitnJetcut&&basiccut,data,luminosity);
331     TH1F *ZOSOFN = allsamples.Draw("ZOSOFN","-"+datajzb,binning, "JZB", "events",cutmass&&cutOSOF&&limitnJetcut&&basiccut,data,luminosity);
332    
333     TH1F *SBOSSFP;
334     TH1F *SBOSOFP;
335     TH1F *SBOSSFN;
336     TH1F *SBOSOFN;
337    
338     if(PlottingSetup::RestrictToMassPeak) {
339     SBOSSFP = allsamples.Draw("SBOSSFP",datajzb,binning, "JZB", "events",cutOSSF&&limitnJetcut&&basiccut&&sidebandcut,data,luminosity);
340     SBOSOFP = allsamples.Draw("SBOSOFP",datajzb,binning, "JZB", "events",cutOSOF&&limitnJetcut&&basiccut&&sidebandcut,data,luminosity);
341     SBOSSFN = allsamples.Draw("SBOSSFN","-"+datajzb,binning, "JZB", "events",cutOSSF&&limitnJetcut&&basiccut&&sidebandcut,data,luminosity);
342     SBOSOFN = allsamples.Draw("SBOSOFN","-"+datajzb,binning, "JZB", "events",cutOSOF&&limitnJetcut&&basiccut&&sidebandcut,data,luminosity);
343     }
344    
345     string obsname="data_obs";
346     string predname="background";
347     string Zpredname="ZJetsBackground";
348     string Tpredname="TTbarBackground";
349     if(identifier!="") {
350     obsname=("data_"+identifier);
351     predname=("background_"+identifier);
352     Zpredname=("ZJetsBackground_"+identifier);
353     Tpredname=("TTbarBackground_"+identifier);
354     }
355    
356     TH1F *obs = (TH1F*)ZOSSFP->Clone("observation");
357     obs->SetName(obsname.c_str());
358     obs->Write();
359    
360     TH1F *flippedobs = (TH1F*)ZOSSFN->Clone("flipped_observation");
361     flippedobs->SetName(("flipped_"+obsname).c_str());
362     flippedobs->Write();
363    
364     TH1F *Tpred = (TH1F*)ZOSSFN->Clone("TTbarprediction");
365     TH1F *Zpred = (TH1F*)ZOSSFN->Clone("ZJetsprediction");
366    
367     TH1F *pred = (TH1F*)ZOSSFN->Clone("prediction");
368    
369     TH1F *flippedTpred = (TH1F*)ZOSSFP->Clone("flipped_TTbarprediction");
370     TH1F *flippedZpred = (TH1F*)ZOSSFP->Clone("flipped_ZJetsprediction");
371    
372     TH1F *flippedpred = (TH1F*)ZOSSFP->Clone("flipped_prediction");
373     if(PlottingSetup::RestrictToMassPeak) {
374     pred->Add(ZOSOFP,1.0/3);
375     pred->Add(ZOSOFN,-1.0/3);
376     pred->Add(SBOSSFP,1.0/3);
377     pred->Add(SBOSSFN,-1.0/3);
378     pred->Add(SBOSOFP,1.0/3);
379     pred->Add(SBOSOFN,-1.0/3);
380    
381     Tpred->Add(ZOSSFN,-1.0);
382     Tpred->Add(ZOSOFP,1.0/3);
383     Tpred->Add(SBOSSFP,1.0/3);
384     Tpred->Add(SBOSOFP,1.0/3);
385    
386     Zpred->Add(ZOSOFN,-1.0/3);
387     Zpred->Add(SBOSSFN,-1.0/3);
388     Zpred->Add(SBOSOFN,-1.0/3);
389    
390     //flipped
391     flippedpred->Add(ZOSOFP,-1.0/3);
392     flippedpred->Add(ZOSOFN,1.0/3);
393     flippedpred->Add(SBOSSFP,-1.0/3);
394     flippedpred->Add(SBOSSFN,1.0/3);
395     flippedpred->Add(SBOSOFP,-1.0/3);
396     flippedpred->Add(SBOSOFN,1.0/3);
397    
398     flippedTpred->Add(ZOSSFP,-1.0);
399     flippedTpred->Add(ZOSOFN,1.0/3);
400     flippedTpred->Add(SBOSSFN,1.0/3);
401     flippedTpred->Add(SBOSOFN,1.0/3);
402    
403     flippedZpred->Add(ZOSOFP,-1.0/3);
404     flippedZpred->Add(SBOSSFP,-1.0/3);
405     flippedZpred->Add(SBOSOFP,-1.0/3);
406     } else {
407     pred->Add(ZOSOFP,1.0);
408     pred->Add(ZOSOFN,-1.0);
409    
410     Tpred->Add(ZOSSFN,-1.0);
411     Tpred->Add(ZOSOFP,1.0);
412    
413     Zpred->Add(ZOSOFN,-1.0);
414    
415     //flipped
416     flippedpred->Add(ZOSOFN,1.0);
417     flippedpred->Add(ZOSOFP,-1.0);
418    
419     flippedTpred->Add(ZOSSFP,-1.0);
420     flippedTpred->Add(ZOSOFN,1.0);
421    
422     flippedZpred->Add(ZOSOFP,-1.0);
423     }
424    
425     pred->SetName(predname.c_str());
426     Tpred->SetName(Tpredname.c_str());
427     Zpred->SetName(Zpredname.c_str());
428    
429     flippedpred->SetName(("flipped_"+predname).c_str());
430     flippedTpred->SetName(("flipped_"+Tpredname).c_str());
431     flippedZpred->SetName(("flipped_"+Zpredname).c_str());
432    
433     pred->Write();
434     Tpred->Write();
435     Zpred->Write();
436    
437     flippedpred->Write();
438     flippedTpred->Write();
439     flippedZpred->Write();
440    
441     if(identifier=="") {
442     float stretchfactor=1.0;
443     bool isonpeak=false;
444     if(PlottingSetup::RestrictToMassPeak) {
445     stretchfactor=1.0/3.0;
446     isonpeak=true;
447     }
448    
449     //--------------------------------------------------------statistical uncertainty
450    
451     TH1F *predstaterr = (TH1F*)ZOSSFN->Clone("predstaterr");
452     predstaterr->Add(ZOSOFP,stretchfactor*stretchfactor);
453     predstaterr->Add(ZOSOFN,stretchfactor*stretchfactor);
454     if(isonpeak) predstaterr->Add(SBOSSFP,stretchfactor*stretchfactor);
455     if(isonpeak) predstaterr->Add(SBOSSFN,stretchfactor*stretchfactor);
456     if(isonpeak) predstaterr->Add(SBOSOFP,stretchfactor*stretchfactor);
457     if(isonpeak) predstaterr->Add(SBOSOFN,stretchfactor*stretchfactor);
458     SQRT(predstaterr);
459     TH1F *bgStatUp = (TH1F*)pred->Clone("background_StatUp");
460     bgStatUp->Add(predstaterr);
461     bgStatUp->Write();
462 buchmann 1.2 TH1F *bgStatDn = (TH1F*)pred->Clone("background_StatDown");
463 buchmann 1.1 bgStatDn->Add(predstaterr,-1);
464     bgStatDn->Write();
465     // delete bgStatDn;
466     // delete bgStatUp;
467     delete predstaterr;
468    
469    
470     TH1F *flippedpredstaterr = (TH1F*)ZOSSFP->Clone("predstaterr");
471     flippedpredstaterr->Add(ZOSOFP,stretchfactor*stretchfactor);
472     flippedpredstaterr->Add(ZOSOFN,stretchfactor*stretchfactor);
473     if(isonpeak) flippedpredstaterr->Add(SBOSSFP,stretchfactor*stretchfactor);
474     if(isonpeak) flippedpredstaterr->Add(SBOSSFN,stretchfactor*stretchfactor);
475     if(isonpeak) flippedpredstaterr->Add(SBOSOFP,stretchfactor*stretchfactor);
476     if(isonpeak) flippedpredstaterr->Add(SBOSOFN,stretchfactor*stretchfactor);
477     SQRT(flippedpredstaterr);
478     TH1F *fbgStatUp = (TH1F*)flippedpred->Clone("flipped_background_StatUp");
479     fbgStatUp->Add(predstaterr);
480     fbgStatUp->Write();
481 buchmann 1.2 TH1F *fbgStatDn = (TH1F*)flippedpred->Clone("flipped_background_StatDown");
482 buchmann 1.1 fbgStatDn->Add(predstaterr,-1);
483     fbgStatDn->Write();
484     // delete fbgStatDn;
485     // delete fbgStatUp;
486     delete predstaterr;
487    
488     TH1F *Tpredstaterr = (TH1F*)ZOSOFP->Clone("Tpredstaterr");
489     Tpredstaterr->Scale(stretchfactor*stretchfactor);
490     if(isonpeak) Tpredstaterr->Add(SBOSSFP,stretchfactor*stretchfactor);
491     if(isonpeak) Tpredstaterr->Add(SBOSOFP,stretchfactor*stretchfactor);
492     SQRT(Tpredstaterr);
493     TH1F *TpredStatUp = (TH1F*)Tpred->Clone("TTbarBackground_StatUp");
494     TpredStatUp->Add(Tpredstaterr);
495     TpredStatUp->Write();
496 buchmann 1.2 TH1F *TpredStatDn = (TH1F*)Tpred->Clone("TTbarBackground_StatDown");
497 buchmann 1.1 TpredStatDn->Add(Tpredstaterr,-1);
498     TpredStatDn->Write();
499     // delete TpredStatDn;
500     // delete TpredStatUp;
501     delete Tpredstaterr;
502    
503     TH1F *fTpredstaterr = (TH1F*)ZOSOFN->Clone("flipped_Tpredstaterr");
504     fTpredstaterr->Scale(stretchfactor*stretchfactor);
505     if(isonpeak) fTpredstaterr->Add(SBOSSFN,stretchfactor*stretchfactor);
506     if(isonpeak) fTpredstaterr->Add(SBOSOFN,stretchfactor*stretchfactor);
507     SQRT(fTpredstaterr);
508     TH1F *fTpredStatUp = (TH1F*)flippedTpred->Clone("flipped_TTbarBackground_StatUp");
509     fTpredStatUp->Add(fTpredstaterr);
510     fTpredStatUp->Write();
511 buchmann 1.2 TH1F *fTpredStatDn = (TH1F*)flippedTpred->Clone("flipped_TTbarBackground_StatDown");
512 buchmann 1.1 fTpredStatDn->Add(fTpredstaterr,-1);
513     fTpredStatDn->Write();
514     // delete fTpredStatDn;
515     // delete fTpredStatUp;
516     delete fTpredstaterr;
517    
518    
519     TH1F *Zpredstaterr = (TH1F*)ZOSSFN->Clone("ZJetsstaterr");
520     Zpredstaterr->Add(ZOSOFN,stretchfactor*stretchfactor);
521     if(isonpeak) Zpredstaterr->Add(SBOSSFN,stretchfactor*stretchfactor);
522     if(isonpeak) Zpredstaterr->Add(SBOSOFN,stretchfactor*stretchfactor);
523     SQRT(Zpredstaterr);
524     TH1F *ZpredStatUp = (TH1F*)Zpred->Clone("ZJetsBackground_StatUp");
525     ZpredStatUp->Add(Zpredstaterr);
526     ZpredStatUp->Write();
527 buchmann 1.2 TH1F *ZpredStatDn = (TH1F*)Zpred->Clone("ZJetsBackground_StatDown");
528 buchmann 1.1 ZpredStatDn->Add(Zpredstaterr,-1);
529     ZpredStatDn->Write();
530     // delete ZpredStatDn;
531     // delete ZpredStatUp;
532     delete Zpredstaterr;
533    
534     TH1F *fZpredstaterr = (TH1F*)ZOSSFP->Clone("flipped_ZJetsstaterr");
535     Zpredstaterr->Add(ZOSOFP,stretchfactor*stretchfactor);
536     if(isonpeak) fZpredstaterr->Add(SBOSSFP,stretchfactor*stretchfactor);
537     if(isonpeak) fZpredstaterr->Add(SBOSOFP,stretchfactor*stretchfactor);
538     SQRT(fTpredstaterr);
539     TH1F *fZpredStatUp = (TH1F*)flippedZpred->Clone("flipped_ZJetsBackground_StatUp");
540     fZpredStatUp->Add(fZpredstaterr);
541     fZpredStatUp->Write();
542 buchmann 1.2 TH1F *fZpredStatDn = (TH1F*)flippedZpred->Clone("flipped_ZJetsBackground_StatDown");
543 buchmann 1.1 fZpredStatDn->Add(fZpredstaterr,-1);
544     fZpredStatDn->Write();
545     // delete fZpredStatDn;
546     // delete fZpredStatUp;
547     delete fZpredstaterr;
548    
549     //--------------------------------------------------------systematic uncertainty
550    
551     TH1F *predsyserr = (TH1F*)pred->Clone("SysError");
552     predsyserr->Add(pred,-1);//getting everything to zero.
553     predsyserr->Add(Multiply(ZOSSFN,ZOSSFN),zjetsestimateuncert*zjetsestimateuncert);
554     predsyserr->Add(Multiply(ZOSOFP,ZOSOFP),stretchfactor*stretchfactor*emuncert*emuncert);
555     predsyserr->Add(Multiply(ZOSOFN,ZOSOFN),stretchfactor*stretchfactor*emuncert*emuncert);
556     if(isonpeak) predsyserr->Add(Multiply(SBOSSFP,SBOSSFP),stretchfactor*stretchfactor*eemmsidebanduncert*eemmsidebanduncert);
557     if(isonpeak) predsyserr->Add(Multiply(SBOSSFN,SBOSSFN),stretchfactor*stretchfactor*eemmsidebanduncert*eemmsidebanduncert);
558     if(isonpeak) predsyserr->Add(Multiply(SBOSOFP,SBOSOFP),stretchfactor*stretchfactor*emsidebanduncert*emsidebanduncert);
559     if(isonpeak) predsyserr->Add(Multiply(SBOSOFN,SBOSOFN),stretchfactor*stretchfactor*emsidebanduncert*emsidebanduncert);
560     SQRT(predsyserr);
561     TH1F *bgSysUp = (TH1F*)pred->Clone("background_SysUp");
562     bgSysUp->Add(predsyserr);
563     bgSysUp->Write();
564 buchmann 1.2 TH1F *bgSysDn = (TH1F*)pred->Clone("background_SysDown");
565 buchmann 1.1 bgSysDn->Add(predsyserr,-1);
566     bgSysDn->Write();
567     delete predsyserr;
568    
569     TH1F *fpredsyserr = (TH1F*)pred->Clone("SysError");
570     fpredsyserr->Add(pred,-1);//getting everything to zero.
571     fpredsyserr->Add(Multiply(ZOSSFP,ZOSSFP),zjetsestimateuncert*zjetsestimateuncert);
572     fpredsyserr->Add(Multiply(ZOSOFP,ZOSOFP),stretchfactor*stretchfactor*emuncert*emuncert);
573     fpredsyserr->Add(Multiply(ZOSOFN,ZOSOFN),stretchfactor*stretchfactor*emuncert*emuncert);
574     if(isonpeak) fpredsyserr->Add(Multiply(SBOSSFP,SBOSSFP),stretchfactor*stretchfactor*eemmsidebanduncert*eemmsidebanduncert);
575     if(isonpeak) fpredsyserr->Add(Multiply(SBOSSFN,SBOSSFN),stretchfactor*stretchfactor*eemmsidebanduncert*eemmsidebanduncert);
576     if(isonpeak) fpredsyserr->Add(Multiply(SBOSOFP,SBOSOFP),stretchfactor*stretchfactor*emsidebanduncert*emsidebanduncert);
577     if(isonpeak) fpredsyserr->Add(Multiply(SBOSOFN,SBOSOFN),stretchfactor*stretchfactor*emsidebanduncert*emsidebanduncert);
578     SQRT(fpredsyserr);
579     TH1F *fbgSysUp = (TH1F*)flippedpred->Clone("flipped_background_SysUp");
580     fbgSysUp->Add(fpredsyserr);
581     fbgSysUp->Write();
582 buchmann 1.2 TH1F *fbgSysDn = (TH1F*)flippedpred->Clone("flipped_background_SysDown");
583 buchmann 1.1 fbgSysDn->Add(fpredsyserr,-1);
584     fbgSysDn->Write();
585     delete fpredsyserr;
586    
587    
588     TH1F *Tpredsyserr = (TH1F*)Tpred->Clone("SysError");
589     Tpredsyserr->Add(Tpred,-1);//getting everything to zero.
590     Tpredsyserr->Add(Multiply(ZOSOFP,ZOSOFP),stretchfactor*stretchfactor*emuncert*emuncert);
591     if(isonpeak) Tpredsyserr->Add(Multiply(SBOSSFP,SBOSSFP),stretchfactor*stretchfactor*eemmsidebanduncert*eemmsidebanduncert);
592     if(isonpeak) Tpredsyserr->Add(Multiply(SBOSOFP,SBOSOFP),stretchfactor*stretchfactor*emsidebanduncert*emsidebanduncert);
593     SQRT(Tpredsyserr);
594     TH1F *TpredSysUp = (TH1F*)Tpred->Clone("TTbarBackground_SysUp");
595     TpredSysUp->Add(Tpredsyserr);
596     TpredSysUp->Write();
597 buchmann 1.2 TH1F *TpredSysDn = (TH1F*)Tpred->Clone("TTbarBackground_SysDown");
598 buchmann 1.1 TpredSysDn->Add(Tpredsyserr,-1);
599     TpredSysDn->Write();
600     delete Tpredsyserr;
601    
602     TH1F *fTpredsyserr = (TH1F*)Tpred->Clone("SysError");
603     fTpredsyserr->Add(Tpred,-1);//getting everything to zero.
604     fTpredsyserr->Add(Multiply(ZOSOFN,ZOSOFN),stretchfactor*stretchfactor*emuncert*emuncert);
605     if(isonpeak) fTpredsyserr->Add(Multiply(SBOSSFN,SBOSSFN),stretchfactor*stretchfactor*eemmsidebanduncert*eemmsidebanduncert);
606     if(isonpeak) fTpredsyserr->Add(Multiply(SBOSOFN,SBOSOFN),stretchfactor*stretchfactor*emsidebanduncert*emsidebanduncert);
607     SQRT(fTpredsyserr);
608     TH1F *fTpredSysUp = (TH1F*)flippedTpred->Clone("flipped_TTbarBackground_SysUp");
609     fTpredSysUp->Add(fTpredsyserr);
610     fTpredSysUp->Write();
611 buchmann 1.2 TH1F *fTpredSysDn = (TH1F*)flippedTpred->Clone("flipped_TTbarBackground_SysDown");
612 buchmann 1.1 fTpredSysDn->Add(fTpredsyserr,-1);
613     fTpredSysDn->Write();
614     delete fTpredsyserr;
615    
616    
617     //------------------------------------------------------------------------------------------------------------------------
618     TH1F *Zpredsyserr = (TH1F*)Zpred->Clone("SysError");
619     Zpredsyserr->Add(Zpred,-1);//getting everything to zero.
620     Zpredsyserr->Add(Multiply(ZOSSFN,ZOSSFN),zjetsestimateuncert*zjetsestimateuncert);
621     Zpredsyserr->Add(Multiply(ZOSOFN,ZOSOFN),stretchfactor*stretchfactor*emuncert*emuncert);
622     if(isonpeak) Zpredsyserr->Add(Multiply(SBOSSFN,SBOSSFN),stretchfactor*stretchfactor*eemmsidebanduncert*eemmsidebanduncert);
623     if(isonpeak) Zpredsyserr->Add(Multiply(SBOSOFN,SBOSOFN),stretchfactor*stretchfactor*emsidebanduncert*emsidebanduncert);
624     SQRT(Zpredsyserr);
625     TH1F *ZpredSysUp = (TH1F*)Zpred->Clone("ZJetsBackground_SysUp");
626     ZpredSysUp->Add(Zpredsyserr);
627     ZpredSysUp->Write();
628 buchmann 1.2 TH1F *ZpredSysDn = (TH1F*)Zpred->Clone("ZJetsBackground_SysDown");
629 buchmann 1.1 ZpredSysDn->Add(Zpredsyserr,-1);
630     ZpredSysDn->Write();
631     delete Zpredsyserr;
632    
633     TH1F *fZpredsyserr = (TH1F*)Zpred->Clone("SysError");
634     fZpredsyserr->Add(Zpred,-1);//getting everything to zero.
635     fZpredsyserr->Add(Multiply(ZOSSFP,ZOSSFP),zjetsestimateuncert*zjetsestimateuncert);
636     fZpredsyserr->Add(Multiply(ZOSOFP,ZOSOFP),stretchfactor*stretchfactor*emuncert*emuncert);
637     if(isonpeak) fZpredsyserr->Add(Multiply(SBOSSFP,SBOSSFP),stretchfactor*stretchfactor*eemmsidebanduncert*eemmsidebanduncert);
638     if(isonpeak) fZpredsyserr->Add(Multiply(SBOSOFP,SBOSOFP),stretchfactor*stretchfactor*emsidebanduncert*emsidebanduncert);
639     SQRT(fZpredsyserr);
640     TH1F *fZpredSysUp = (TH1F*)flippedZpred->Clone("flipped_ZJetsBackground_SysUp");
641     fZpredSysUp->Add(fZpredsyserr);
642     fZpredSysUp->Write();
643 buchmann 1.2 TH1F *fZpredSysDn = (TH1F*)flippedZpred->Clone("flipped_ZJetsBackground_SysDown");
644 buchmann 1.1 fZpredSysDn->Add(fZpredsyserr,-1);
645     fZpredSysDn->Write();
646     delete fZpredsyserr;
647     }
648    
649 buchmann 1.2 /*if(identifier=="") {
650 buchmann 1.1 for(int i=0;i<binning.size()-1;i++) {
651     cout << "[ " << 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;
652     }
653 buchmann 1.2 }*/
654 buchmann 1.1 delete ZOSSFP;
655     delete ZOSOFP;
656     delete ZOSSFN;
657     delete ZOSOFN;
658    
659     if(PlottingSetup::RestrictToMassPeak) {
660     delete SBOSSFP;
661     delete SBOSOFP;
662     delete SBOSSFN;
663     delete SBOSOFN;
664     }
665     }
666    
667     }
668    
669 buchmann 1.4 ShapeDroplet LimitsFromShapes(bool asymptotic, float firstGuess, TTree *events, string addcut, string name, string mcjzb, string datajzb, vector<float> jzbbins, float jzbpeakerrormc, float jzbpeakerrordata) {
670 buchmann 1.1 map < pair<float, float>, map<string, float> > xsec;
671     if(SUSYScanSpace::SUSYscantype==mSUGRA) xsec=getXsec(PlottingSetup::cbafbasedir+"/"+mSUGRAxsFile);
672    
673     time_t timestamp;
674     tm *now;
675     timestamp = time(0);
676     now = localtime(&timestamp);
677     stringstream RunDirectoryS;
678     RunDirectoryS << PlottingSetup::cbafbasedir << "/exchange/ShapeComputation___" << name << "__" << now->tm_hour << "h_" << now->tm_min << "m_" << now->tm_sec << "s___" << rand();
679     string RunDirectory = RunDirectoryS.str();
680    
681     ensure_directory_exists(RunDirectory);
682    
683     TFile *datafile = new TFile("../StoredShapes.root","READ");
684     if(datafile->IsZombie()) {
685     write_error(__FUNCTION__,"Fatal error: The stored shapes are not available!");
686     assert(!datafile->IsZombie());
687     }
688     cout << "Run Directory: " << RunDirectory << endl;
689 buchmann 1.2 TFile *limfile = new TFile((RunDirectory+"/PRElimitfile.root").c_str(),"RECREATE");
690 buchmann 1.1
691     TIter nextkey(datafile->GetListOfKeys());
692     TKey *key;
693     while ((key = (TKey*)nextkey()))
694     {
695     TH1F *obj =(TH1F*) key->ReadObj();
696     limfile->cd();
697     obj->Write();
698     }
699    
700     TCanvas *limcan = new TCanvas("limcan","Canvas for calculating limits");
701    
702     bool signalonly=true;
703     bool dataonly=false;
704    
705     generate_shapes_for_systematic(signalonly,dataonly,limfile,events,"",mcjzb,datajzb,noJES,jzbbins,limcan,addcut,xsec);
706 buchmann 1.2 // generate_shapes_for_systematic(signalonly,dataonly,limfile,events,"peakUp",newjzbexpression(mcjzb,jzbpeakerrormc),newjzbexpression(datajzb,jzbpeakerrordata),noJES,jzbbins,limcan,addcut,xsec);
707     // generate_shapes_for_systematic(signalonly,dataonly,limfile,events,"peakDown",newjzbexpression(mcjzb,-jzbpeakerrormc),newjzbexpression(datajzb,-jzbpeakerrordata),noJES,jzbbins,limcan,addcut,xsec);
708 buchmann 1.1 generate_shapes_for_systematic(signalonly,dataonly,limfile,events,"JESUp",mcjzb,datajzb,JESup,jzbbins,limcan,addcut,xsec);
709     generate_shapes_for_systematic(signalonly,dataonly,limfile,events,"JESDown",mcjzb,datajzb,JESdown,jzbbins,limcan,addcut,xsec);
710    
711     float JZBScaleUncert=0.05; //if you modify this value please also adapt it in Systematics.C not only here in ShapeLimit.C
712     float scaledown=0,scaleup=0,scalesyst=0;
713     float mceff=0,mcefferr=0;
714     int flipped=0;
715     int Neventsinfile=10000;//doesn't matter.
716     string informalname="ShapeAnalysis";
717    
718     bool docomplicatedmSUGRAxsreweighting=false; //if you modify this value please also adapt it in Systematics.C not only here in ShapeLimit.C
719    
720     MCefficiency(events,mceff,mcefferr,flipped,mcjzb,requireZ,Neventsinfile,SUSYScanSpace::SUSYscantype,xsec,addcut,-1);
721     if(mceff<0) flipped=1;
722     doJZBscale(events,SUSYScanSpace::SUSYscantype==mSUGRA&&docomplicatedmSUGRAxsreweighting,xsec,scaledown,scaleup,scalesyst,JZBScaleUncert,informalname,flipped,requireZ,addcut);
723 buchmann 1.4 float PDFuncert=0;
724 buchmann 1.1 int NPdfs = get_npdfs(events);
725     if(SUSYScanSpace::SUSYscantype!=mSUGRA) PDFuncert = get_pdf_uncertainty(events, flipped, mcjzb, requireZ, Neventsinfile, SUSYScanSpace::SUSYscantype, xsec, NPdfs, addcut);
726    
727 buchmann 1.2 float JZBscale=scaledown;
728     if(scaleup>scaledown) JZBscale=scaleup;
729     dout << endl;
730     dout << endl;
731     dout << "Will use the following scalar (non-shape) systematics : " << endl;
732     dout << " JZB Scale (JSU) : " << JZBscale << endl;
733     dout << " PDF : " << PDFuncert << endl;
734    
735 buchmann 1.4 float SignalIntegral;
736     if(flipped) {
737     TH1F *flisi = (TH1F*)(limfile->Get("flipped_signal"));
738     SignalIntegral= flisi ->Integral();
739     delete flisi;
740     }
741     else {
742     TH1F *flisi = (TH1F*)(limfile->Get("signal"));
743     SignalIntegral= flisi ->Integral();
744     delete flisi;
745     }
746    
747 buchmann 1.2 TFile *final_limfile = new TFile((RunDirectory+"/limitfile.root").c_str(),"RECREATE");
748    
749     TIter nnextkey(limfile->GetListOfKeys());
750     TKey *nkey;
751 buchmann 1.4
752     if(SignalIntegral==0) SignalIntegral=1; //case when the integral is zero - don't try to normalize, just leave it as it is
753    
754 buchmann 1.2 while ((nkey = (TKey*)nnextkey()))
755     {
756     TH1F *obj =(TH1F*) nkey->ReadObj();
757     if(flipped&&!Contains(obj->GetName(),"flipped")) continue;
758     if(!flipped&&Contains(obj->GetName(),"flipped")) continue;
759     if(flipped) obj->SetName(strip_flip_away(obj->GetName()));
760     final_limfile->cd();
761 buchmann 1.4 if(Contains(obj->GetName(),"signal")) {
762     obj->Scale(1.0/SignalIntegral);
763     }
764 buchmann 1.2 obj->Write();
765     }
766 buchmann 1.1
767 buchmann 1.4 prepare_limit_datacard(RunDirectory,final_limfile,JZBscale,PDFuncert,flipped);
768    
769 buchmann 1.2 final_limfile->Close();
770 buchmann 1.1 limfile->Close();
771 buchmann 1.4 dout << "Info: Shape root file and datacard have been generated in " << RunDirectory << endl;
772     stringstream command;
773     if(asymptotic) {
774     if(firstGuess>0) command << "bash CreateModel.sh " << RunDirectory << " susydatacard.txt" << " 1 0 0 " << firstGuess; // ASYMPTOTIC LIMITS WITH FIRST GUESS
775     else command << "bash CreateModel.sh " << RunDirectory << " susydatacard.txt" << " 0 0 0 0"; // ASYMPTOTIC LIMITS
776     }
777     else command << "bash CreateModel.sh " << RunDirectory << " susydatacard.txt" << " 2 0 " << int(0.5 * firstGuess) << " " << int(2*firstGuess); // ASYMPTOTIC LIMITS
778     dout <<"Going to run : " << command.str() << endl;
779     int CreatedModelFileExitCode = gSystem->Exec(command.str().c_str());
780 buchmann 1.2 cout << "exit code of limit algorithm (CreateModel.sh) : " << CreatedModelFileExitCode << endl;
781     assert(CreatedModelFileExitCode==0);
782     ShapeDroplet alpha;
783     alpha.readDroplet(RunDirectory+"/ShapeDropletResult.txt");
784     alpha.PDF=PDFuncert;
785     alpha.JSU=JZBscale;
786 buchmann 1.4 alpha.SignalIntegral=SignalIntegral;
787 buchmann 1.2 dout << "Done reading limit information from droplet" << endl;
788     dout << alpha << endl;
789 buchmann 1.1
790     dout << "Everything is saved in " << RunDirectory << endl;
791 buchmann 1.4 dout << "Will transfer model and datacard over for possible post-processing" << endl;
792     dout << " 1) Make sure models directory exists ... " << std::flush;
793     gSystem->Exec("mkdir -p models/");
794     dout << " ok!" << endl;
795     dout << " 2) Deleting any previous model files with the same name ... " << std::flush;
796     stringstream delcommand;
797     delcommand << "rm models/model_" << name << ".root";
798     gSystem->Exec(delcommand.str().c_str());
799     stringstream delcommand2;
800     delcommand2 << "rm models/model_" << name << ".txt";
801     gSystem->Exec(delcommand2.str().c_str());
802     dout << " ok!" << endl;
803     dout << " 3) Transfering the new model files ... " << std::flush;
804     stringstream copycommand;
805     copycommand << "cp " << RunDirectory << "/model.root models/model_" << name << ".root";
806     gSystem->Exec(copycommand.str().c_str());
807     stringstream copycommand2;
808     copycommand2 << "cp " << RunDirectory << "/susydatacard.txt models/model_" << name << ".txt";
809     gSystem->Exec(copycommand2.str().c_str());
810     stringstream copycommand3;
811     copycommand3 << "cp " << RunDirectory << "/limitfile.root models/model_" << name << "_histo.root";
812     gSystem->Exec(copycommand3.str().c_str());
813     dout << " ok!" << endl;
814     dout << " 4) Removing original working directory (" << RunDirectory << ") ... " << std::flush;
815     write_warning(__FUNCTION__,"Watch out : need to uncomment the line below to remove the original working directory again");
816 buchmann 1.1 // gSystem->Exec(("rm -r "+RunDirectory).c_str());
817 buchmann 1.4 dout << " ok!" << endl;
818     delete limcan;
819     return alpha;
820 buchmann 1.1 }
821    
822     void PrepareDataShapes(string datajzb, vector<float> jzbbins, float jzbpeakerrordata) {
823 buchmann 1.2 // dout << "Generating data shape templates ... " << endl;
824 buchmann 1.1 map < pair<float, float>, map<string, float> > xsec;
825     TFile *datafile = new TFile("../DistributedModelCalculations/StoredShapes.root","RECREATE");
826     TCanvas *limcan = new TCanvas("limcan","Canvas for calculating limits");
827     TTree *faketree;
828     bool dataonly=true;
829     bool signalonly=false;
830     string mcjzb="JZBforMCinPrepareDataShapes";//this string is not used.
831     float jzbpeakerrormc=0;
832     generate_shapes_for_systematic(signalonly,dataonly,datafile,faketree,"",mcjzb,datajzb,noJES,jzbbins,limcan,"",xsec);
833     // don't need these effects for obs & pred, only for signal!
834     // generate_shapes_for_systematic(signalonly,dataonly,datafile,faketree,"peakUp",newjzbexpression(mcjzb,jzbpeakerrormc),newjzbexpression(datajzb,jzbpeakerrordata),noJES,jzbbins,limcan,"",xsec);
835     // generate_shapes_for_systematic(signalonly,dataonly,datafile,faketree,"peakDown",newjzbexpression(mcjzb,-jzbpeakerrormc),newjzbexpression(datajzb,-jzbpeakerrordata),noJES,jzbbins,limcan,"",xsec);
836     // generate_shapes_for_systematic(signalonly,dataonly,datafile,faketree,"JESUp",mcjzb,datajzb,JESup,jzbbins,limcan,"",xsec);
837     // generate_shapes_for_systematic(signalonly,dataonly,datafile,faketree,"JESDown",mcjzb,datajzb,JESdown,jzbbins,limcan,"",xsec);
838     datafile->Close();
839     }
840