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

# Content
1 /****
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 #include <iostream>
15 #include <vector>
16 #include <sys/stat.h>
17 #include <fstream>
18
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 #include <TSystem.h>
32 #include "LimitDroplet.C"
33
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 dout << "Hi! today we are going to (try to) rediscover the top!" << endl;
42 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 dout << "Second way of doing this !!!! Analytical shape to the left :-D" << endl;
82 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 dout << observedtb->GetBinLowEdge(i+1) << ";"<<observedtb->GetBinContent(i+1) << ";" << datapredictiontb->GetBinContent(i+1) << " --> " << ratio->GetBinContent(i+1) << "+/-" << ratio->GetBinError(i+1) << endl;
161 }
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 vector<float> compute_one_upper_limit(float mceff,float mcefferr, int ibin, string mcjzb, string plotfilename, bool doexpected, int flipped) {
187 float sigma95=-9.9,sigma95A=-9.9;
188 /*
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 if(mceff<=0) {
203 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 int nlimittoysused=1;
211
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 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
232 stringstream command;
233 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 dout << command.str() << endl;
236
237 int retval = 256;
238 int attempts=0;
239 while(!(retval==0||attempts>=3)) {//try up to 3 times
240 attempts++;
241 dout << "Starting limit calculation (TimedLimitCapsule) now : Attempt " << attempts << endl;
242 retval=gSystem->Exec(command.str().c_str());
243 }
244 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 LimitDroplet limres;
254 limres.readDroplet(repname.str());
255 dout << limres << endl;
256 remove(repname.str().c_str());
257 sigma95=limres.observed;
258
259
260 ///------------------------------------------ < /NEW > ----------------------------------------------------------
261 vector<float> sigmas;
262 sigmas.push_back(sigma95);
263 if(doexpected) {
264 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 }
270
271 return sigmas;
272
273
274 }//end of mc efficiency is ok
275 }
276
277 void compute_upper_limits_from_counting_experiment(vector<vector<float> > uncertainties,vector<float> jzbcuts, string mcjzb, bool doexpected, int flipped) {
278 dout << "Doing counting experiment ... " << endl;
279 vector<vector<string> > limits;
280 vector<vector<float> > vlimits;
281
282
283 for(int isample=0;isample<signalsamples.collection.size();isample++) {
284 vector<string> rows;
285 vector<float> vrows;
286 dout << "Considering sample " << signalsamples.collection[isample].samplename << endl;
287 rows.push_back(signalsamples.collection[isample].samplename);
288 for(int ibin=0;ibin<jzbcuts.size();ibin++) {
289 dout << "_________________________________________________________________________________" << endl;
290 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 float observed,observederr,null,result;
296
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 string plotfilename=(string)(TString(signalsamples.collection[isample].samplename)+TString("___JZB_geq_")+TString(any2string(JZBcutat))+TString(".png"));
301 dout << "Sample: " << signalsamples.collection[isample].samplename << ", JZB>"<<JZBcutat<< " : " << mceff << " +/- " << staterr << " (stat) +/- " << systerr << " (syst) --> toterr = " << toterr << endl;
302 vector<float> sigmas = compute_one_upper_limit(mceff,toterr,ibin,mcjzb,plotfilename,doexpected,flipped);
303
304 if(doexpected) {
305 // 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 vrows.push_back(sigmas[0]);
308 vrows.push_back(sigmas[1]);
309 // vrows.push_back(expected);
310 vrows.push_back(signalsamples.collection[isample].xs);
311 }
312 else {
313 // rows.push_back(any2string(sigmas[0])+"("+any2string(expected)+")");
314 rows.push_back(any2string(sigmas[0]));
315 vrows.push_back(sigmas[0]);
316 vrows.push_back(signalsamples.collection[isample].xs);
317 // vrows.push_back(expected);
318 }
319 }//end of bin loop
320 limits.push_back(rows);
321 vlimits.push_back(vrows);
322 }//end of sample loop
323 dout << endl << endl << endl << "_________________________________________________________________________________________________" << endl << endl;
324 dout << endl << endl << "PAS table 3: (notation: limit [95%CL])" << endl << endl;
325 dout << "\t";
326 for (int irow=0;irow<jzbcuts.size();irow++) {
327 dout << jzbcuts[irow] << "\t";
328 }
329 dout << endl;
330 for(int irow=0;irow<limits.size();irow++) {
331 for(int ientry=0;ientry<limits[irow].size();ientry++) {
332 if (limits[irow][ientry]>0) dout << limits[irow][ientry] << "\t";
333 else dout << " (N/A) \t";
334 }
335 dout << endl;
336 }
337
338 if(!doexpected) {
339 dout << endl << endl << "LIMITS: (Tex)" << endl;
340 tout << "\\begin{table}[hbtp]" << endl;
341 tout << "\\renewcommand{\\arraystretch}{1.3}" << endl;
342 tout << "\\begin{center}" << endl;
343 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 tout << "" << endl;
345 tout << "\\begin{tabular}{ | l | ";
346 for (int irow=0;irow<jzbcuts.size();irow++) tout << " l |";
347 tout << "} " << endl << " \\hline " << endl << "& \t ";
348 for (int irow=0;irow<jzbcuts.size();irow++) {
349 tout << "JZB $>$ " << jzbcuts[irow] << " GeV & \t ";
350 }
351 tout << " \\\\ \\hline " << endl;
352 for(int irow=0;irow<limits.size();irow++) {
353 tout << limits[irow][0] << " \t";
354 for(int ientry=0;ientry<jzbcuts.size();ientry++) {
355 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 // dout << Round(vlimits[irow][2*ientry],3) << " / " << Round(vlimits[irow][2*ientry+1],3)<< "\t";
358 }
359 tout << " \\\\ \\hline " << endl;
360 }
361 tout << "\\end{tabular}" << endl;
362 tout << " \\end{tabular}"<< endl;
363 tout << "\\end{center}"<< endl;
364 tout << "\\end{table} "<< endl;
365
366 }//do observed
367
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 dout << "Scenario \t Efficiency [%] \t Upper limits [pb] \t \\sigma [pb]" << endl;
370 for(int icut=0;icut<jzbcuts.size();icut++) {
371 dout << "Region with JZB>" << jzbcuts[icut] << (ConsiderSignalContaminationForLimits?" (accounting for signal contamination)":" (not accounting for signal contamination)") << endl;
372 for(int isample=0;isample<signalsamples.collection.size();isample++) {
373 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 }
375 dout << endl;
376 }
377 }
378
379
380
381 /********************************************************************** 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
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 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
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 TH1F *SBOSSFP;
430 TH1F *SBOSOFP;
431 TH1F *SBOSSFN;
432 TH1F *SBOSOFN;
433
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 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
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 TH1F *obs = (TH1F*)ZOSSFP->Clone("observation");
467 obs->SetName(obsname.c_str());
468 obs->Write();
469 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 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 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 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 if(PlottingSetup::RestrictToMassPeak) {
520 delete SBOSSFP;
521 delete SBOSOFP;
522 delete SBOSSFN;
523 delete SBOSOFN;
524 }
525
526 delete LZOSSFP;
527 delete LZOSOFP;
528 delete LZOSSFN;
529 delete LZOSOFN;
530
531 if(PlottingSetup::RestrictToMassPeak) {
532 delete LSBOSSFP;
533 delete LSBOSOFP;
534 delete LSBOSSFN;
535 delete LSBOSOFN;
536 }
537
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 datacard.open ((get_directory()+"/limits/susydatacard.txt").c_str());
548 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 limfile->Close();
584 write_info("prepare_limits","limitfile.root and datacard.txt have been generated. You can now use them to calculate limits!");
585
586 }