ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/ShapeLimit.C
Revision: 1.12
Committed: Tue May 15 19:37:47 2012 UTC (12 years, 11 months ago) by buchmann
Content type: text/plain
Branch: MAIN
Changes since 1.11: +125 -17 lines
Log Message:
Updated limit implementation (shape limits via grid of points)

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