ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/AnalysisFramework/Plotting/Modules/LimitCalculation.C
Revision: 1.29
Committed: Wed Nov 16 13:41:30 2011 UTC (13 years, 5 months ago) by buchmann
Content type: text/plain
Branch: MAIN
Changes since 1.28: +9 -1 lines
Log Message:
Two new features: the time limit for the limit capsule algorithm is raised for the crab case (1h); if the algorithm runs into this limit three times (i.e. fails completely) a file is placed in 'exchange' which is then detected by the run script, as the algorithm counts as failed at this point, and the CRAB jobs will be considered failed

File Contents

# User Rev Content
1 buchmann 1.26 /****
2    
3     Off peak status (RestrictToMassPeak) :
4    
5     x Necessary adaptations identified
6     x Started working on necessary adaptations
7     x Necessary adaptations implemented
8     x Necessary adaptations tested
9    
10     DONE!
11    
12    
13     ****/
14 buchmann 1.1 #include <iostream>
15     #include <vector>
16     #include <sys/stat.h>
17 buchmann 1.6 #include <fstream>
18 buchmann 1.1
19     #include <TCut.h>
20     #include <TROOT.h>
21     #include <TCanvas.h>
22     #include <TMath.h>
23     #include <TColor.h>
24     #include <TPaveText.h>
25     #include <TRandom.h>
26     #include <TH1.h>
27     #include <TH2.h>
28     #include <TF1.h>
29     #include <TSQLResult.h>
30     #include <TProfile.h>
31 buchmann 1.20 #include <TSystem.h>
32     #include "LimitDroplet.C"
33 buchmann 1.1
34     //#include "TTbar_stuff.C"
35     using namespace std;
36    
37     using namespace PlottingSetup;
38    
39    
40     void rediscover_the_top(string mcjzb, string datajzb) {
41 buchmann 1.3 dout << "Hi! today we are going to (try to) rediscover the top!" << endl;
42 buchmann 1.1 TCanvas *c3 = new TCanvas("c3","c3");
43     c3->SetLogy(1);
44     vector<float> binning;
45     //binning=allsamples.get_optimal_binsize(mcjzb,cutmass&&cutOSSF&&cutnJets,20,50,800);
46     /*
47     binning.push_back(50);
48     binning.push_back(100);
49     binning.push_back(150);
50     binning.push_back(200);
51     binning.push_back(500);
52    
53    
54     TH1F *dataprediction = allsamples.Draw("dataprediction", "-"+datajzb, binning, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,data, luminosity);
55     TH1F *puresignal = allsamples.Draw("puresignal", datajzb, binning, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,data, luminosity);
56     // TH1F *puresignal = allsamples.Draw("puresignal", mcjzb, binning, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,mc, luminosity,allsamples.FindSample("TTJets"));
57     TH1F *observed = allsamples.Draw("observed", datajzb,binning, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,data,luminosity);
58     /*
59     ofstream myfile;
60     TH1F *ratio = (TH1F*)observed->Clone();
61     ratio->Divide(dataprediction);
62     ratio->GetYaxis()->SetTitle("Ratio obs/pred");
63     ratio->Draw();
64     c3->SaveAs("testratio.png");
65     myfile.open ("ShapeFit_log.txt");
66     establish_upper_limits(observed,dataprediction,puresignal,"LM4",myfile);
67     myfile.close();
68     */
69    
70    
71     int nbins=100;
72     float low=0;
73     float hi=500;
74     TCanvas *c4 = new TCanvas("c4","c4",900,900);
75     c4->Divide(2,2);
76     c4->cd(1);
77     c4->cd(1)->SetLogy(1);
78     TH1F *datapredictiont = allsamples.Draw("datapredictiont", "-"+datajzb, nbins,low,hi, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,data, luminosity);
79     TH1F *datapredictiono = allsamples.Draw("datapredictiono", "-"+datajzb, nbins,low,hi, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,data, luminosity);
80     datapredictiont->Add(datapredictiono,-1);
81 buchmann 1.3 dout << "Second way of doing this !!!! Analytical shape to the left :-D" << endl;
82 buchmann 1.1 vector<TF1*> functions = do_cb_fit_to_plot(datapredictiont,10);
83     datapredictiont->SetMarkerColor(kRed);
84     datapredictiont->SetLineColor(kRed);
85     datapredictiont->Draw();
86     functions[1]->Draw("same");
87     TText *title1 = write_title("Top Background Prediction (JZB<0, with osof subtr)");
88     title1->Draw();
89    
90     c4->cd(2);
91     c4->cd(2)->SetLogy(1);
92     TH1F *observedt = allsamples.Draw("observedt", datajzb, nbins,low,hi, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,data, luminosity);
93     observedt->Draw();
94     datapredictiont->Draw("histo,same");
95     functions[1]->Draw("same");
96     TText *title2 = write_title("Observed and predicted background");
97     title2->Draw();
98    
99     c4->cd(3);
100     c4->cd(3)->SetLogy(1);
101     // TH1F *ratio = (TH1F*)observedt->Clone();
102    
103     TH1F *analytical_background_prediction= new TH1F("analytical_background_prediction","",nbins,low,hi);
104     for(int i=0;i<=nbins;i++) {
105     analytical_background_prediction->SetBinContent(i+1,functions[1]->Eval(((hi-low)/((float)nbins))*(i+0.5)));
106     analytical_background_prediction->SetBinError(i+1,TMath::Sqrt(functions[1]->Eval(((hi-low)/((float)nbins))*(i+0.5))));
107     }
108     analytical_background_prediction->GetYaxis()->SetTitle("JZB [GeV]");
109     analytical_background_prediction->GetYaxis()->CenterTitle();
110     TH1F *analyticaldrawonly = (TH1F*)analytical_background_prediction->Clone();
111     analytical_background_prediction->SetFillColor(TColor::GetColor("#3399FF"));
112     analytical_background_prediction->SetMarkerSize(0);
113     analytical_background_prediction->Draw("e5");
114     analyticaldrawonly->Draw("histo,same");
115     functions[1]->Draw("same");
116     TText *title3 = write_title("Analytical bg pred histo");
117     title3->Draw();
118    
119     c4->cd(4);
120     // c4->cd(4)->SetLogy(1);
121     vector<float> ratio_binning;
122     ratio_binning.push_back(0);
123     ratio_binning.push_back(5);
124     ratio_binning.push_back(10);
125     ratio_binning.push_back(20);
126     ratio_binning.push_back(50);
127     // ratio_binning.push_back(60);
128     /*
129     ratio_binning.push_back(51);
130     ratio_binning.push_back(52);
131     ratio_binning.push_back(53);
132     ratio_binning.push_back(54);
133     ratio_binning.push_back(55);
134     ratio_binning.push_back(56);
135     ratio_binning.push_back(57);
136     ratio_binning.push_back(58);
137     ratio_binning.push_back(59);
138     ratio_binning.push_back(60);
139     // ratio_binning.push_back(70);*/
140     // ratio_binning.push_back(80);
141     // ratio_binning.push_back(90);
142     ratio_binning.push_back(80);
143     // ratio_binning.push_back(110);
144     ratio_binning.push_back(500);
145    
146     TH1F *observedtb = allsamples.Draw("observedtb", datajzb, ratio_binning, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,data, luminosity);
147     TH1F *datapredictiontb = allsamples.Draw("datapredictiontb", "-"+datajzb, ratio_binning, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,data, luminosity);
148     TH1F *datapredictiontbo = allsamples.Draw("datapredictiontbo", "-"+datajzb, ratio_binning, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,data, luminosity);
149     datapredictiontb->Add(datapredictiontbo,-1);
150     TH1F *analytical_background_predictionb = allsamples.Draw("analytical_background_predictionb",datajzb, ratio_binning, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets&&"mll<2",data, luminosity);
151     for(int i=0;i<=ratio_binning.size();i++) {
152     analytical_background_predictionb->SetBinContent(i+1,functions[1]->Eval(analytical_background_predictionb->GetBinCenter(i)));
153     analytical_background_predictionb->SetBinError(i+1,TMath::Sqrt(functions[1]->Eval(analytical_background_predictionb->GetBinCenter(i))));
154     }
155    
156     TH1F *ratio = (TH1F*) observedtb->Clone();
157     ratio->Divide(datapredictiontb);
158    
159     for (int i=0;i<=ratio_binning.size();i++) {
160 buchmann 1.3 dout << observedtb->GetBinLowEdge(i+1) << ";"<<observedtb->GetBinContent(i+1) << ";" << datapredictiontb->GetBinContent(i+1) << " --> " << ratio->GetBinContent(i+1) << "+/-" << ratio->GetBinError(i+1) << endl;
161 buchmann 1.1 }
162    
163     // ratio->Divide(datapredictiontb);
164     // ratio->Divide(analytical_background_predictionb);
165     // TGraphAsymmErrors *JZBratio= histRatio(observedtb,analytical_background_predictionb,data,ratio_binning);
166     // ratio->Divide(analytical_background_prediction);
167     // ratio->Divide(datapredictiont);
168     // ratio->GetYaxis()->SetTitle("obs/pred");
169     // JZBratio->Draw("AP");
170     ratio->GetYaxis()->SetRangeUser(0,10);
171     ratio->Draw();
172     //analytical_background_predictionb->Draw();
173     // JZBratio->SetTitle("");
174     TText *title4 = write_title("Ratio of observed to predicted");
175     title4->Draw();
176    
177     // CompleteSave(c4,"test/ttbar_discovery_dataprediction___analytical_function");
178     CompleteSave(c4,"test/ttbar_discovery_dataprediction__analytical__new_binning_one_huge_bin_from_80");
179    
180    
181    
182    
183    
184     }
185    
186 buchmann 1.28 vector<float> compute_one_upper_limit(float mceff,float mcefferr, int ibin, string mcjzb, string plotfilename, bool doexpected, int flipped) {
187 buchmann 1.11 float sigma95=-9.9,sigma95A=-9.9;
188 buchmann 1.15 /*
189     USAGE OF ROOSTATS_CL95
190     " Double_t limit = roostats_cl95(ilum, slum, eff, seff, bck, sbck, n, gauss = false, nuisanceModel, method, plotFileName, seed); \n"
191     " LimitResult expected_limit = roostats_clm(ilum, slum, eff, seff, bck, sbck, ntoys, nuisanceModel, method, seed); \n"
192     " Double_t average_limit = roostats_cla(ilum, slum, eff, seff, bck, sbck, nuisanceModel, method, seed); \n"
193     " \n"
194     "
195     " Double_t obs_limit = limit.GetObservedLimit(); \n"
196     " Double_t exp_limit = limit.GetExpectedLimit(); \n"
197     " Double_t exp_up = limit.GetOneSigmaHighRange(); \n"
198     " Double_t exp_down = limit.GetOneSigmaLowRange(); \n"
199     " Double_t exp_2up = limit.GetTwoSigmaHighRange(); \n"
200     " Double_t exp_2down = limit.GetTwoSigmaLowRange(); \n"
201     */
202 buchmann 1.12 if(mceff<=0) {
203 buchmann 1.11 write_warning(__FUNCTION__,"Cannot compute upper limit in this configuration as the efficiency is negative:");
204     dout << "mc efficiency=" << mceff << " +/- " << mcefferr;
205     vector<float> sigmas;
206     sigmas.push_back(-1);
207     sigmas.push_back(-1);
208     return sigmas;
209     } else {
210 buchmann 1.15 int nlimittoysused=1;
211 buchmann 1.20
212     ///------------------------------------------ < NEW > ----------------------------------------------------------
213    
214     int secondssince1970=time(NULL);
215     stringstream repname;
216     repname << PlottingSetup::cbafbasedir << "/exchange/report_" << secondssince1970 << "_"<<plotfilename<< "__"<< ".txt";
217    
218     /* - report filename [1]
219     - luminosity [2]
220     - lumi uncert [3]
221     - MC efficiency [4]
222     - MC efficiency error [5]
223     - Npred [6]
224     - Nprederr [7]
225     - Nobs [8]
226     - JZB cut [9]
227     - plot name [10]*/
228    
229 buchmann 1.28 if(flipped==0) dout << "Calling limit capsule instead of calling : CL95(" << luminosity << "," << lumiuncert*luminosity << "," << mceff << "," << mcefferr << "," << Npred[ibin] << "," << Nprederr[ibin] << "," << Nobs[ibin] << "," << false << "," << nuisancemodel<< ") " << endl;
230     if(flipped>0) dout << "Calling limit capsule instead of calling : CL95(" << luminosity << "," << lumiuncert*luminosity << "," << mceff << "," << mcefferr << "," << flippedNpred[ibin] << "," << flippedNprederr[ibin] << "," << flippedNobs[ibin] << "," << false << "," << nuisancemodel<< ") " << endl;
231 buchmann 1.20
232 buchmann 1.24 stringstream command;
233 buchmann 1.28 if(flipped==0) command << PlottingSetup::cbafbasedir << "/DistributedModelCalculations/Limits/TimedLimitCapsule.exec " << repname.str() << " " << luminosity << " " << luminosity*lumiuncert << " " << mceff << " " << mcefferr << " " << Npred[ibin] << " " << Nprederr[ibin] << " " << Nobs[ibin] << " " << -1 << " " << PlottingSetup::basedirectory << "/" << plotfilename << " " << doexpected;
234     if(flipped>0) command << PlottingSetup::cbafbasedir << "/DistributedModelCalculations/Limits/TimedLimitCapsule.exec " << repname.str() << " " << luminosity << " " << luminosity*lumiuncert << " " << mceff << " " << mcefferr << " " << flippedNpred[ibin] << " " << flippedNprederr[ibin] << " " << flippedNobs[ibin] << " " << -1 << " " << PlottingSetup::basedirectory << "/" << plotfilename << " " << doexpected;
235 buchmann 1.21 dout << command.str() << endl;
236 buchmann 1.20
237     int retval = 256;
238     int attempts=0;
239 buchmann 1.26 while(!(retval==0||attempts>=3)) {//try up to 3 times
240 buchmann 1.20 attempts++;
241 buchmann 1.28 dout << "Starting limit calculation (TimedLimitCapsule) now : Attempt " << attempts << endl;
242 buchmann 1.20 retval=gSystem->Exec(command.str().c_str());
243     }
244 buchmann 1.29 char hostname[1023];
245     string completehostname=GetCompleteHostname();
246     gethostname(hostname,1023);
247     if((!((Contains(hostname,"t3ui")||Contains(hostname,"t3wn"))))&&retval==256) {
248     //running via CRAB and encountered the same problem too often: place a problem file to mark this problem!
249     stringstream markproblem;
250     markproblem << "touch " << PlottingSetup::basedirectory << "/exchange/problemswhilesettinglimits.txt";
251     gSystem->Exec(markproblem.str().c_str());
252     }
253 buchmann 1.20 LimitDroplet limres;
254     limres.readDroplet(repname.str());
255 buchmann 1.21 dout << limres << endl;
256 buchmann 1.20 remove(repname.str().c_str());
257 buchmann 1.22 sigma95=limres.observed;
258 buchmann 1.20
259    
260     ///------------------------------------------ < /NEW > ----------------------------------------------------------
261 buchmann 1.2 vector<float> sigmas;
262 buchmann 1.25 sigmas.push_back(sigma95);
263 buchmann 1.22 if(doexpected) {
264 buchmann 1.25 sigmas.push_back(limres.expected);
265     sigmas.push_back(limres.upper68);
266     sigmas.push_back(limres.lower68);
267     sigmas.push_back(limres.upper95);
268     sigmas.push_back(limres.lower95);
269 buchmann 1.18 }
270 buchmann 1.25
271 buchmann 1.2 return sigmas;
272 buchmann 1.15
273    
274 buchmann 1.25 }//end of mc efficiency is ok
275 buchmann 1.2 }
276    
277 buchmann 1.28 void compute_upper_limits_from_counting_experiment(vector<vector<float> > uncertainties,vector<float> jzbcuts, string mcjzb, bool doexpected, int flipped) {
278 buchmann 1.3 dout << "Doing counting experiment ... " << endl;
279 buchmann 1.2 vector<vector<string> > limits;
280     vector<vector<float> > vlimits;
281    
282 buchmann 1.1
283     for(int isample=0;isample<signalsamples.collection.size();isample++) {
284 buchmann 1.2 vector<string> rows;
285     vector<float> vrows;
286 buchmann 1.3 dout << "Considering sample " << signalsamples.collection[isample].samplename << endl;
287 buchmann 1.2 rows.push_back(signalsamples.collection[isample].samplename);
288 buchmann 1.1 for(int ibin=0;ibin<jzbcuts.size();ibin++) {
289 buchmann 1.3 dout << "_________________________________________________________________________________" << endl;
290 buchmann 1.2 float JZBcutat=uncertainties[isample*jzbcuts.size()+ibin][0];
291     float mceff=uncertainties[isample*jzbcuts.size()+ibin][1];
292     float staterr=uncertainties[isample*jzbcuts.size()+ibin][2];
293     float systerr=uncertainties[isample*jzbcuts.size()+ibin][3];
294     float toterr =uncertainties[isample*jzbcuts.size()+ibin][4];
295 fronga 1.9 float observed,observederr,null,result;
296 buchmann 1.11
297     // fill_result_histos(observed,observederr, null,null,null,null,null,null,null,mcjzb,JZBcutat,14000,(int)5,result,(signalsamples.FindSample(signalsamples.collection[isample].filename)),signalsamples);
298     // observed-=result;//this is the actual excess we see!
299     // float expected=observed/luminosity;
300 buchmann 1.17 string plotfilename=(string)(TString(signalsamples.collection[isample].samplename)+TString("___JZB_geq_")+TString(any2string(JZBcutat))+TString(".png"));
301 buchmann 1.3 dout << "Sample: " << signalsamples.collection[isample].samplename << ", JZB>"<<JZBcutat<< " : " << mceff << " +/- " << staterr << " (stat) +/- " << systerr << " (syst) --> toterr = " << toterr << endl;
302 buchmann 1.28 vector<float> sigmas = compute_one_upper_limit(mceff,toterr,ibin,mcjzb,plotfilename,doexpected,flipped);
303 buchmann 1.2
304 buchmann 1.22 if(doexpected) {
305 buchmann 1.11 // rows.push_back(any2string(sigmas[0])+";"+any2string(sigmas[1])+";"+"("+any2string(expected)+")");
306     rows.push_back(any2string(sigmas[0])+";"+any2string(sigmas[1])+";"+"("+any2string(signalsamples.collection[isample].xs)+")");
307 buchmann 1.2 vrows.push_back(sigmas[0]);
308     vrows.push_back(sigmas[1]);
309 buchmann 1.11 // vrows.push_back(expected);
310     vrows.push_back(signalsamples.collection[isample].xs);
311 buchmann 1.2 }
312     else {
313 buchmann 1.11 // rows.push_back(any2string(sigmas[0])+"("+any2string(expected)+")");
314     rows.push_back(any2string(sigmas[0]));
315 buchmann 1.2 vrows.push_back(sigmas[0]);
316 buchmann 1.11 vrows.push_back(signalsamples.collection[isample].xs);
317     // vrows.push_back(expected);
318 buchmann 1.2 }
319 buchmann 1.1 }//end of bin loop
320 buchmann 1.2 limits.push_back(rows);
321     vlimits.push_back(vrows);
322 buchmann 1.1 }//end of sample loop
323 buchmann 1.12 dout << endl << endl << endl << "_________________________________________________________________________________________________" << endl << endl;
324 buchmann 1.11 dout << endl << endl << "PAS table 3: (notation: limit [95%CL])" << endl << endl;
325 buchmann 1.3 dout << "\t";
326 buchmann 1.2 for (int irow=0;irow<jzbcuts.size();irow++) {
327 buchmann 1.3 dout << jzbcuts[irow] << "\t";
328 buchmann 1.2 }
329 buchmann 1.3 dout << endl;
330 buchmann 1.2 for(int irow=0;irow<limits.size();irow++) {
331     for(int ientry=0;ientry<limits[irow].size();ientry++) {
332 buchmann 1.12 if (limits[irow][ientry]>0) dout << limits[irow][ientry] << "\t";
333     else dout << " (N/A) \t";
334 buchmann 1.2 }
335 buchmann 1.3 dout << endl;
336 buchmann 1.2 }
337    
338 buchmann 1.22 if(!doexpected) {
339 buchmann 1.12 dout << endl << endl << "LIMITS: (Tex)" << endl;
340 buchmann 1.13 tout << "\\begin{table}[hbtp]" << endl;
341 buchmann 1.21 tout << "\\renewcommand{\\arraystretch}{1.3}" << endl;
342 buchmann 1.13 tout << "\\begin{center}" << endl;
343 buchmann 1.14 tout << "\\caption{Observed upper limits on the cross section of different LM benchmark points " << (ConsiderSignalContaminationForLimits?" (accounting for signal contamination)":" (not accounting for signal contamination)") << "}\\label{tab:lmresults}" << endl;
344 buchmann 1.13 tout << "" << endl;
345 buchmann 1.12 tout << "\\begin{tabular}{ | l | ";
346     for (int irow=0;irow<jzbcuts.size();irow++) tout << " l |";
347     tout << "} " << endl << " \\hline " << endl << "& \t ";
348 buchmann 1.2 for (int irow=0;irow<jzbcuts.size();irow++) {
349 buchmann 1.12 tout << "JZB $>$ " << jzbcuts[irow] << " GeV & \t ";
350 buchmann 1.2 }
351 buchmann 1.12 tout << " \\\\ \\hline " << endl;
352 buchmann 1.2 for(int irow=0;irow<limits.size();irow++) {
353 buchmann 1.12 tout << limits[irow][0] << " \t";
354 buchmann 1.2 for(int ientry=0;ientry<jzbcuts.size();ientry++) {
355 buchmann 1.12 if(vlimits[irow][2*ientry]>0) tout << " & " << Round(vlimits[irow][2*ientry],2) << " \t (" << Round(vlimits[irow][2*ientry] / vlimits[irow][2*ientry+1],3)<< "x \\sigma ) \t";
356     else tout << " & ( N / A ) \t";
357 buchmann 1.11 // dout << Round(vlimits[irow][2*ientry],3) << " / " << Round(vlimits[irow][2*ientry+1],3)<< "\t";
358 buchmann 1.2 }
359 buchmann 1.12 tout << " \\\\ \\hline " << endl;
360 buchmann 1.2 }
361 buchmann 1.12 tout << "\\end{tabular}" << endl;
362 buchmann 1.13 tout << " \\end{tabular}"<< endl;
363     tout << "\\end{center}"<< endl;
364     tout << "\\end{table} "<< endl;
365    
366 buchmann 1.2 }//do observed
367 buchmann 1.3
368     dout << endl << endl << "Final selection efficiencies with total statistical and systematic errors, and corresponding observed and expected upper limits (UL) on ($\\sigma\\times$ BR $\\times$ acceptance) for the LM4 and LM8 scenarios, in the different regions. The last column contains the predicted ($\\sigma \\times $BR$\\times$ acceptance) at NLO obtained from Monte Carlo simulation." << endl;
369 buchmann 1.11 dout << "Scenario \t Efficiency [%] \t Upper limits [pb] \t \\sigma [pb]" << endl;
370 buchmann 1.3 for(int icut=0;icut<jzbcuts.size();icut++) {
371 buchmann 1.14 dout << "Region with JZB>" << jzbcuts[icut] << (ConsiderSignalContaminationForLimits?" (accounting for signal contamination)":" (not accounting for signal contamination)") << endl;
372 buchmann 1.3 for(int isample=0;isample<signalsamples.collection.size();isample++) {
373 buchmann 1.11 dout << limits[isample][0] << "\t" << Round(100*uncertainties[isample*jzbcuts.size()+icut][1],3) << "+/-" << Round(100*uncertainties[isample*jzbcuts.size()+icut][2],3) << " (stat) +/- " << Round(100*uncertainties[isample*jzbcuts.size()+icut][3],3) << " (syst) \t" << Round((vlimits[isample][2*icut]),3) << "\t" << Round(vlimits[isample][2*icut+1],3) << endl;
374 buchmann 1.3 }
375     dout << endl;
376     }
377 buchmann 1.1 }
378    
379    
380    
381 buchmann 1.7 /********************************************************************** new : Limits using SHAPES ***********************************
382    
383    
384     SSSSSSSSSSSSSSS hhhhhhh
385     SS:::::::::::::::Sh:::::h
386     S:::::SSSSSS::::::Sh:::::h
387     S:::::S SSSSSSSh:::::h
388     S:::::S h::::h hhhhh aaaaaaaaaaaaa ppppp ppppppppp eeeeeeeeeeee ssssssssss
389     S:::::S h::::hh:::::hhh a::::::::::::a p::::ppp:::::::::p ee::::::::::::ee ss::::::::::s
390     S::::SSSS h::::::::::::::hh aaaaaaaaa:::::ap:::::::::::::::::p e::::::eeeee:::::eess:::::::::::::s
391     SS::::::SSSSS h:::::::hhh::::::h a::::app::::::ppppp::::::pe::::::e e:::::es::::::ssss:::::s
392     SSS::::::::SS h::::::h h::::::h aaaaaaa:::::a p:::::p p:::::pe:::::::eeeee::::::e s:::::s ssssss
393     SSSSSS::::S h:::::h h:::::h aa::::::::::::a p:::::p p:::::pe:::::::::::::::::e s::::::s
394     S:::::S h:::::h h:::::h a::::aaaa::::::a p:::::p p:::::pe::::::eeeeeeeeeee s::::::s
395     S:::::S h:::::h h:::::ha::::a a:::::a p:::::p p::::::pe:::::::e ssssss s:::::s
396     SSSSSSS S:::::S h:::::h h:::::ha::::a a:::::a p:::::ppppp:::::::pe::::::::e s:::::ssss::::::s
397     S::::::SSSSSS:::::S h:::::h h:::::ha:::::aaaa::::::a p::::::::::::::::p e::::::::eeeeeeee s::::::::::::::s
398     S:::::::::::::::SS h:::::h h:::::h a::::::::::aa:::ap::::::::::::::pp ee:::::::::::::e s:::::::::::ss
399     SSSSSSSSSSSSSSS hhhhhhh hhhhhhh aaaaaaaaaa aaaap::::::pppppppp eeeeeeeeeeeeee sssssssssss
400     p:::::p
401     p:::::p
402     p:::::::p
403     p:::::::p
404     p:::::::p
405     ppppppppp
406    
407    
408     *********************************************************************** new : Limits using SHAPES ***********************************/
409    
410 buchmann 1.5
411     void limit_shapes_for_systematic_effect(TFile *limfile, string identifier, string mcjzb, string datajzb, int JES,vector<float> binning, TCanvas *limcan) {
412     dout << "Creatig shape templates ... ";
413     if(identifier!="") dout << "for systematic called "<<identifier;
414     dout << endl;
415     int dataormc=mcwithsignal;//this is only for tests - for real life you want dataormc=data !!!
416 buchmann 1.6 if(dataormc!=data) write_warning(__FUNCTION__,"WATCH OUT! Not using data for limits!!!! this is ok for tests, but not ok for anything official!");
417 buchmann 1.5
418     TCut limitnJetcut;
419     if(JES==noJES) limitnJetcut=cutnJets;
420     else {
421     if(JES==JESdown) limitnJetcut=cutnJetsJESdown;
422     if(JES==JESup) limitnJetcut=cutnJetsJESup;
423     }
424     TH1F *ZOSSFP = allsamples.Draw("ZOSSFP",datajzb,binning, "JZB4limits", "events",cutmass&&cutOSSF&&limitnJetcut&&basiccut,dataormc,luminosity);
425     TH1F *ZOSOFP = allsamples.Draw("ZOSOFP",datajzb,binning, "JZB4limits", "events",cutmass&&cutOSOF&&limitnJetcut&&basiccut,dataormc,luminosity);
426     TH1F *ZOSSFN = allsamples.Draw("ZOSSFN","-"+datajzb,binning, "JZB4limits", "events",cutmass&&cutOSSF&&limitnJetcut&&basiccut,dataormc,luminosity);
427     TH1F *ZOSOFN = allsamples.Draw("ZOSOFN","-"+datajzb,binning, "JZB4limits", "events",cutmass&&cutOSOF&&limitnJetcut&&basiccut,dataormc,luminosity);
428    
429 buchmann 1.26 TH1F *SBOSSFP;
430     TH1F *SBOSOFP;
431     TH1F *SBOSSFN;
432     TH1F *SBOSOFN;
433 buchmann 1.5
434     TH1F *LZOSSFP = allsamples.Draw("LZOSSFP",mcjzb,binning, "JZB4limits", "events",cutmass&&cutOSSF&&limitnJetcut&&basiccut,mc,luminosity,allsamples.FindSample("LM4"));
435     TH1F *LZOSOFP = allsamples.Draw("LZOSOFP",mcjzb,binning, "JZB4limits", "events",cutmass&&cutOSOF&&limitnJetcut&&basiccut,mc,luminosity,allsamples.FindSample("LM4"));
436     TH1F *LZOSSFN = allsamples.Draw("LZOSSFN","-"+mcjzb,binning, "JZB4limits", "events",cutmass&&cutOSSF&&limitnJetcut&&basiccut,mc,luminosity,allsamples.FindSample("LM4"));
437     TH1F *LZOSOFN = allsamples.Draw("LZOSOFN","-"+mcjzb,binning, "JZB4limits", "events",cutmass&&cutOSOF&&limitnJetcut&&basiccut,mc,luminosity,allsamples.FindSample("LM4"));
438    
439 buchmann 1.26 TH1F *LSBOSSFP;
440     TH1F *LSBOSOFP;
441     TH1F *LSBOSSFN;
442     TH1F *LSBOSOFN;
443    
444     flag_this_change(__FUNCTION__,__LINE__,false);//PlottingSetup::RestrictToMassPeak
445     if(PlottingSetup::RestrictToMassPeak) {
446     SBOSSFP = allsamples.Draw("SBOSSFP",datajzb,binning, "JZB4limits", "events",cutOSSF&&limitnJetcut&&basiccut&&sidebandcut,dataormc,luminosity);
447     SBOSOFP = allsamples.Draw("SBOSOFP",datajzb,binning, "JZB4limits", "events",cutOSOF&&limitnJetcut&&basiccut&&sidebandcut,dataormc,luminosity);
448     SBOSSFN = allsamples.Draw("SBOSSFN","-"+datajzb,binning, "JZB4limits", "events",cutOSSF&&limitnJetcut&&basiccut&&sidebandcut,dataormc,luminosity);
449     SBOSOFN = allsamples.Draw("SBOSOFN","-"+datajzb,binning, "JZB4limits", "events",cutOSOF&&limitnJetcut&&basiccut&&sidebandcut,dataormc,luminosity);
450    
451     LSBOSSFP = allsamples.Draw("LSBOSSFP",mcjzb,binning, "JZB4limits", "events",cutOSSF&&limitnJetcut&&basiccut&&sidebandcut,mc,luminosity,allsamples.FindSample("LM4"));
452     LSBOSOFP = allsamples.Draw("LSBOSOFP",mcjzb,binning, "JZB4limits", "events",cutOSOF&&limitnJetcut&&basiccut&&sidebandcut,mc,luminosity,allsamples.FindSample("LM4"));
453     LSBOSSFN = allsamples.Draw("LSBOSSFN","-"+mcjzb,binning, "JZB4limits", "events",cutOSSF&&limitnJetcut&&basiccut&&sidebandcut,mc,luminosity,allsamples.FindSample("LM4"));
454     LSBOSOFN = allsamples.Draw("LSBOSOFN","-"+mcjzb,binning, "JZB4limits", "events",cutOSOF&&limitnJetcut&&basiccut&&sidebandcut,mc,luminosity,allsamples.FindSample("LM4"));
455     }
456 buchmann 1.5
457     string obsname="data_obs";
458     string predname="background";
459     string signalname="signal";
460     if(identifier!="") {
461     obsname=("data_"+identifier);
462     predname=("background_"+identifier);
463     signalname="signal_"+identifier;
464     }
465    
466 buchmann 1.26 TH1F *obs = (TH1F*)ZOSSFP->Clone("observation");
467 buchmann 1.5 obs->SetName(obsname.c_str());
468     obs->Write();
469 buchmann 1.26 TH1F *pred = (TH1F*)ZOSSFN->Clone("prediction");
470     flag_this_change(__FUNCTION__,__LINE__,false);//PlottingSetup::RestrictToMassPeak
471     if(PlottingSetup::RestrictToMassPeak) {
472     pred->Add(ZOSOFP,1.0/3);
473     pred->Add(ZOSOFN,-1.0/3);
474     pred->Add(SBOSSFP,1.0/3);
475     pred->Add(SBOSSFN,-1.0/3);
476     pred->Add(SBOSOFP,1.0/3);
477     pred->Add(SBOSOFN,-1.0/3);
478     } else {
479     pred->Add(ZOSOFP,1.0);
480     pred->Add(ZOSOFN,-1.0);
481     }
482    
483 buchmann 1.5 pred->SetName(predname.c_str());
484     pred->Write();
485    
486     // TH1F *Lobs = (TH1F*)LZOSSFP->Clone();
487     // TH1F *Lpred = (TH1F*)LZOSSFN->Clone();
488    
489     TH1F *Lobs = new TH1F("Lobs","Lobs",binning.size()-1,&binning[0]);
490     TH1F *Lpred = new TH1F("Lpred","Lpred",binning.size()-1,&binning[0]);
491     Lobs->Add(LZOSSFP);
492     Lpred->Add(LZOSSFN);
493 buchmann 1.26 flag_this_change(__FUNCTION__,__LINE__,false);//PlottingSetup::RestrictToMassPeak
494     if(PlottingSetup::RestrictToMassPeak) {
495     Lpred->Add(LZOSOFP,1.0/3);
496     Lpred->Add(LZOSOFN,-1.0/3);
497     Lpred->Add(LSBOSSFP,1.0/3);
498     Lpred->Add(LSBOSSFN,-1.0/3);
499     Lpred->Add(LSBOSOFP,1.0/3);
500     Lpred->Add(LSBOSOFN,-1.0/3);
501     } else {
502     Lpred->Add(LZOSOFP,1.0);
503     Lpred->Add(LZOSOFN,-1.0);
504     }
505    
506 buchmann 1.5 TH1F *signal = (TH1F*)Lobs->Clone();
507     signal->Add(Lpred,-1);
508     signal->SetName(signalname.c_str());
509     signal->Write();
510    
511     delete Lobs;
512     delete Lpred;
513    
514     delete ZOSSFP;
515     delete ZOSOFP;
516     delete ZOSSFN;
517     delete ZOSOFN;
518    
519 buchmann 1.26 if(PlottingSetup::RestrictToMassPeak) {
520     delete SBOSSFP;
521     delete SBOSOFP;
522     delete SBOSSFN;
523     delete SBOSOFN;
524     }
525 buchmann 1.5
526     delete LZOSSFP;
527     delete LZOSOFP;
528     delete LZOSSFN;
529     delete LZOSOFN;
530    
531 buchmann 1.26 if(PlottingSetup::RestrictToMassPeak) {
532     delete LSBOSSFP;
533     delete LSBOSOFP;
534     delete LSBOSSFN;
535     delete LSBOSOFN;
536     }
537 buchmann 1.5
538     }
539    
540     void prepare_datacard(TFile *f) {
541     TH1F *dataob = (TH1F*)f->Get("data_obs");
542     TH1F *signal = (TH1F*)f->Get("signal");
543     TH1F *background = (TH1F*)f->Get("background");
544    
545     ofstream datacard;
546     ensure_directory_exists(get_directory()+"/limits");
547 buchmann 1.6 datacard.open ((get_directory()+"/limits/susydatacard.txt").c_str());
548 buchmann 1.5 datacard << "Writing this to a file.\n";
549     datacard << "imax 1\n";
550     datacard << "jmax 1\n";
551     datacard << "kmax *\n";
552     datacard << "---------------\n";
553     datacard << "shapes * * limitfile.root $PROCESS $PROCESS_$SYSTEMATIC\n";
554     datacard << "---------------\n";
555     datacard << "bin 1\n";
556     datacard << "observation "<<dataob->Integral()<<"\n";
557     datacard << "------------------------------\n";
558     datacard << "bin 1 1\n";
559     datacard << "process signal background\n";
560     datacard << "process 0 1\n";
561     datacard << "rate "<<signal->Integral()<<" "<<background->Integral()<<"\n";
562     datacard << "--------------------------------\n";
563     datacard << "lumi lnN 1.10 1.0\n";
564     datacard << "bgnorm lnN 1.00 1.4 uncertainty on our prediction (40%)\n";
565     datacard << "JES shape 1 1 uncertainty on background shape and normalization\n";
566     datacard << "peak shape 1 1 uncertainty on signal resolution. Assume the histogram is a 2 sigma shift, \n";
567     datacard << "# so divide the unit gaussian by 2 before doing the interpolation\n";
568     datacard.close();
569     }
570    
571    
572     void prepare_limits(string mcjzb, string datajzb, float jzbpeakerrordata, float jzbpeakerrormc, vector<float> jzbbins) {
573     ensure_directory_exists(get_directory()+"/limits");
574     TFile *limfile = new TFile((get_directory()+"/limits/limitfile.root").c_str(),"RECREATE");
575     TCanvas *limcan = new TCanvas("limcan","Canvas for calculating limits");
576     limit_shapes_for_systematic_effect(limfile,"",mcjzb,datajzb,noJES,jzbbins,limcan);
577     limit_shapes_for_systematic_effect(limfile,"peakUp",newjzbexpression(mcjzb,jzbpeakerrormc),newjzbexpression(datajzb,jzbpeakerrordata),noJES,jzbbins,limcan);
578     limit_shapes_for_systematic_effect(limfile,"peakDown",newjzbexpression(mcjzb,-jzbpeakerrormc),newjzbexpression(datajzb,-jzbpeakerrordata),noJES,jzbbins,limcan);
579     limit_shapes_for_systematic_effect(limfile,"JESUp",mcjzb,datajzb,JESup,jzbbins,limcan);
580     limit_shapes_for_systematic_effect(limfile,"JESDown",mcjzb,datajzb,JESdown,jzbbins,limcan);
581    
582     prepare_datacard(limfile);
583 buchmann 1.6 limfile->Close();
584 buchmann 1.5 write_info("prepare_limits","limitfile.root and datacard.txt have been generated. You can now use them to calculate limits!");
585    
586 fronga 1.9 }