167 |
|
|
168 |
|
} |
169 |
|
|
170 |
– |
void calculate_upper_limits(string mcjzb, string datajzb) { |
171 |
– |
write_warning("calculate_upper_limits","Upper limit calculation temporarily deactivated"); |
172 |
– |
// write_warning("calculate_upper_limits","Calculation of SUSY upper limits has been temporarily suspended in favor of top discovery"); |
173 |
– |
// rediscover_the_top(mcjzb,datajzb); |
174 |
– |
/* |
175 |
– |
TCanvas *c3 = new TCanvas("c3","c3"); |
176 |
– |
c3->SetLogy(1); |
177 |
– |
vector<float> binning; |
178 |
– |
//binning=allsamples.get_optimal_binsize(mcjzb,cutmass&&cutOSSF&&cutnJets,20,50,800); |
179 |
– |
binning.push_back(50); |
180 |
– |
binning.push_back(100); |
181 |
– |
binning.push_back(150); |
182 |
– |
binning.push_back(200); |
183 |
– |
binning.push_back(500); |
184 |
– |
TH1F *datapredictiona = allsamples.Draw("datapredictiona", "-"+datajzb, binning, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,mc, luminosity); |
185 |
– |
TH1F *datapredictionb = allsamples.Draw("datapredictionb", "-"+datajzb, binning, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,mc, luminosity); |
186 |
– |
TH1F *datapredictionc = allsamples.Draw("datapredictionc", datajzb, binning, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,mc, luminosity); |
187 |
– |
TH1F *dataprediction = (TH1F*)datapredictiona->Clone(); |
188 |
– |
dataprediction->Add(datapredictionb,-1); |
189 |
– |
dataprediction->Add(datapredictionc); |
190 |
– |
TH1F *puresignal = allsamples.Draw("puresignal", mcjzb, binning, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,mc, luminosity,allsamples.FindSample("LM4")); |
191 |
– |
TH1F *signalpred = allsamples.Draw("signalpred", "-"+mcjzb, binning, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,mc, luminosity,allsamples.FindSample("LM4")); |
192 |
– |
TH1F *signalpredlo = allsamples.Draw("signalpredlo", "-"+mcjzb, binning, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,mc, luminosity,allsamples.FindSample("LM4")); |
193 |
– |
TH1F *signalpredro = allsamples.Draw("signalpredro", mcjzb, binning, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,mc, luminosity,allsamples.FindSample("LM4")); |
194 |
– |
TH1F *puredata = allsamples.Draw("puredata", datajzb,binning, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,data,luminosity); |
195 |
– |
signalpred->Add(signalpredlo,-1); |
196 |
– |
signalpred->Add(signalpredro); |
197 |
– |
puresignal->Add(signalpred,-1);//subtracting signal contamination |
198 |
– |
ofstream myfile; |
199 |
– |
myfile.open ("ShapeFit_log.txt"); |
200 |
– |
establish_upper_limits(puredata,dataprediction,puresignal,"LM4",myfile); |
201 |
– |
myfile.close(); |
202 |
– |
*/ |
203 |
– |
} |
204 |
– |
|
170 |
|
vector<float> compute_one_upper_limit(float mceff,float mcefferr, int ibin, string mcjzb, bool doobserved=false) { |
171 |
|
float sigma95=0.0,sigma95A=0.0; |
172 |
|
int nuisancemodel=1; |
391 |
|
|
392 |
|
|
393 |
|
|
394 |
+ |
//********************************************************************** new : Limits using SHAPES *********************************** |
395 |
+ |
|
396 |
+ |
void limit_shapes_for_systematic_effect(TFile *limfile, string identifier, string mcjzb, string datajzb, int JES,vector<float> binning, TCanvas *limcan) { |
397 |
+ |
dout << "Creatig shape templates ... "; |
398 |
+ |
if(identifier!="") dout << "for systematic called "<<identifier; |
399 |
+ |
dout << endl; |
400 |
+ |
int dataormc=mcwithsignal;//this is only for tests - for real life you want dataormc=data !!! |
401 |
+ |
if(dataormc!=data) write_warning("limit_shapes_for_systematic_effect","WATCH OUT! Not using data for limits!!!! this is ok for tests, but not ok for anything official!"); |
402 |
+ |
|
403 |
+ |
TCut limitnJetcut; |
404 |
+ |
if(JES==noJES) limitnJetcut=cutnJets; |
405 |
+ |
else { |
406 |
+ |
if(JES==JESdown) limitnJetcut=cutnJetsJESdown; |
407 |
+ |
if(JES==JESup) limitnJetcut=cutnJetsJESup; |
408 |
+ |
} |
409 |
+ |
TH1F *ZOSSFP = allsamples.Draw("ZOSSFP",datajzb,binning, "JZB4limits", "events",cutmass&&cutOSSF&&limitnJetcut&&basiccut,dataormc,luminosity); |
410 |
+ |
TH1F *ZOSOFP = allsamples.Draw("ZOSOFP",datajzb,binning, "JZB4limits", "events",cutmass&&cutOSOF&&limitnJetcut&&basiccut,dataormc,luminosity); |
411 |
+ |
TH1F *ZOSSFN = allsamples.Draw("ZOSSFN","-"+datajzb,binning, "JZB4limits", "events",cutmass&&cutOSSF&&limitnJetcut&&basiccut,dataormc,luminosity); |
412 |
+ |
TH1F *ZOSOFN = allsamples.Draw("ZOSOFN","-"+datajzb,binning, "JZB4limits", "events",cutmass&&cutOSOF&&limitnJetcut&&basiccut,dataormc,luminosity); |
413 |
+ |
|
414 |
+ |
TH1F *SBOSSFP = allsamples.Draw("SBOSSFP",datajzb,binning, "JZB4limits", "events",cutOSSF&&limitnJetcut&&basiccut&&sidebandcut,dataormc,luminosity); |
415 |
+ |
TH1F *SBOSOFP = allsamples.Draw("SBOSOFP",datajzb,binning, "JZB4limits", "events",cutOSOF&&limitnJetcut&&basiccut&&sidebandcut,dataormc,luminosity); |
416 |
+ |
TH1F *SBOSSFN = allsamples.Draw("SBOSSFN","-"+datajzb,binning, "JZB4limits", "events",cutOSSF&&limitnJetcut&&basiccut&&sidebandcut,dataormc,luminosity); |
417 |
+ |
TH1F *SBOSOFN = allsamples.Draw("SBOSOFN","-"+datajzb,binning, "JZB4limits", "events",cutOSOF&&limitnJetcut&&basiccut&&sidebandcut,dataormc,luminosity); |
418 |
+ |
|
419 |
+ |
TH1F *LZOSSFP = allsamples.Draw("LZOSSFP",mcjzb,binning, "JZB4limits", "events",cutmass&&cutOSSF&&limitnJetcut&&basiccut,mc,luminosity,allsamples.FindSample("LM4")); |
420 |
+ |
TH1F *LZOSOFP = allsamples.Draw("LZOSOFP",mcjzb,binning, "JZB4limits", "events",cutmass&&cutOSOF&&limitnJetcut&&basiccut,mc,luminosity,allsamples.FindSample("LM4")); |
421 |
+ |
TH1F *LZOSSFN = allsamples.Draw("LZOSSFN","-"+mcjzb,binning, "JZB4limits", "events",cutmass&&cutOSSF&&limitnJetcut&&basiccut,mc,luminosity,allsamples.FindSample("LM4")); |
422 |
+ |
TH1F *LZOSOFN = allsamples.Draw("LZOSOFN","-"+mcjzb,binning, "JZB4limits", "events",cutmass&&cutOSOF&&limitnJetcut&&basiccut,mc,luminosity,allsamples.FindSample("LM4")); |
423 |
+ |
|
424 |
+ |
TH1F *LSBOSSFP = allsamples.Draw("LSBOSSFP",mcjzb,binning, "JZB4limits", "events",cutOSSF&&limitnJetcut&&basiccut&&sidebandcut,mc,luminosity,allsamples.FindSample("LM4")); |
425 |
+ |
TH1F *LSBOSOFP = allsamples.Draw("LSBOSOFP",mcjzb,binning, "JZB4limits", "events",cutOSOF&&limitnJetcut&&basiccut&&sidebandcut,mc,luminosity,allsamples.FindSample("LM4")); |
426 |
+ |
TH1F *LSBOSSFN = allsamples.Draw("LSBOSSFN","-"+mcjzb,binning, "JZB4limits", "events",cutOSSF&&limitnJetcut&&basiccut&&sidebandcut,mc,luminosity,allsamples.FindSample("LM4")); |
427 |
+ |
TH1F *LSBOSOFN = allsamples.Draw("LSBOSOFN","-"+mcjzb,binning, "JZB4limits", "events",cutOSOF&&limitnJetcut&&basiccut&&sidebandcut,mc,luminosity,allsamples.FindSample("LM4")); |
428 |
+ |
|
429 |
+ |
string obsname="data_obs"; |
430 |
+ |
string predname="background"; |
431 |
+ |
string signalname="signal"; |
432 |
+ |
if(identifier!="") { |
433 |
+ |
obsname=("data_"+identifier); |
434 |
+ |
predname=("background_"+identifier); |
435 |
+ |
signalname="signal_"+identifier; |
436 |
+ |
} |
437 |
+ |
|
438 |
+ |
TH1F *obs = (TH1F*)ZOSSFP->Clone(); |
439 |
+ |
obs->SetName(obsname.c_str()); |
440 |
+ |
obs->Write(); |
441 |
+ |
TH1F *pred = (TH1F*)ZOSSFN->Clone(); |
442 |
+ |
pred->Add(ZOSOFP,1.0/3); |
443 |
+ |
pred->Add(ZOSOFN,-1.0/3); |
444 |
+ |
pred->Add(SBOSSFP,1.0/3); |
445 |
+ |
pred->Add(SBOSSFN,-1.0/3); |
446 |
+ |
pred->Add(SBOSOFP,1.0/3); |
447 |
+ |
pred->Add(SBOSOFN,-1.0/3); |
448 |
+ |
pred->SetName(predname.c_str()); |
449 |
+ |
pred->Write(); |
450 |
+ |
|
451 |
+ |
// TH1F *Lobs = (TH1F*)LZOSSFP->Clone(); |
452 |
+ |
// TH1F *Lpred = (TH1F*)LZOSSFN->Clone(); |
453 |
+ |
|
454 |
+ |
TH1F *Lobs = new TH1F("Lobs","Lobs",binning.size()-1,&binning[0]); |
455 |
+ |
TH1F *Lpred = new TH1F("Lpred","Lpred",binning.size()-1,&binning[0]); |
456 |
+ |
Lobs->Add(LZOSSFP); |
457 |
+ |
Lpred->Add(LZOSSFN); |
458 |
+ |
Lpred->Add(LZOSOFP,1.0/3); |
459 |
+ |
Lpred->Add(LZOSOFN,-1.0/3); |
460 |
+ |
Lpred->Add(LSBOSSFP,1.0/3); |
461 |
+ |
Lpred->Add(LSBOSSFN,-1.0/3); |
462 |
+ |
Lpred->Add(LSBOSOFP,1.0/3); |
463 |
+ |
Lpred->Add(LSBOSOFN,-1.0/3); |
464 |
+ |
TH1F *signal = (TH1F*)Lobs->Clone(); |
465 |
+ |
signal->Add(Lpred,-1); |
466 |
+ |
signal->SetName(signalname.c_str()); |
467 |
+ |
signal->Write(); |
468 |
+ |
|
469 |
+ |
delete Lobs; |
470 |
+ |
delete Lpred; |
471 |
+ |
|
472 |
+ |
delete ZOSSFP; |
473 |
+ |
delete ZOSOFP; |
474 |
+ |
delete ZOSSFN; |
475 |
+ |
delete ZOSOFN; |
476 |
+ |
|
477 |
+ |
delete SBOSSFP; |
478 |
+ |
delete SBOSOFP; |
479 |
+ |
delete SBOSSFN; |
480 |
+ |
delete SBOSOFN; |
481 |
+ |
|
482 |
+ |
delete LZOSSFP; |
483 |
+ |
delete LZOSOFP; |
484 |
+ |
delete LZOSSFN; |
485 |
+ |
delete LZOSOFN; |
486 |
+ |
|
487 |
+ |
delete LSBOSSFP; |
488 |
+ |
delete LSBOSOFP; |
489 |
+ |
delete LSBOSSFN; |
490 |
+ |
delete LSBOSOFN; |
491 |
+ |
|
492 |
+ |
} |
493 |
+ |
|
494 |
+ |
void prepare_datacard(TFile *f) { |
495 |
+ |
TH1F *dataob = (TH1F*)f->Get("data_obs"); |
496 |
+ |
TH1F *signal = (TH1F*)f->Get("signal"); |
497 |
+ |
TH1F *background = (TH1F*)f->Get("background"); |
498 |
+ |
|
499 |
+ |
ofstream datacard; |
500 |
+ |
ensure_directory_exists(get_directory()+"/limits"); |
501 |
+ |
datacard.open ((get_directory()+"/limits/susylm4datacard.txt").c_str()); |
502 |
+ |
datacard << "Writing this to a file.\n"; |
503 |
+ |
datacard << "imax 1\n"; |
504 |
+ |
datacard << "jmax 1\n"; |
505 |
+ |
datacard << "kmax *\n"; |
506 |
+ |
datacard << "---------------\n"; |
507 |
+ |
datacard << "shapes * * limitfile.root $PROCESS $PROCESS_$SYSTEMATIC\n"; |
508 |
+ |
datacard << "---------------\n"; |
509 |
+ |
datacard << "bin 1\n"; |
510 |
+ |
datacard << "observation "<<dataob->Integral()<<"\n"; |
511 |
+ |
datacard << "------------------------------\n"; |
512 |
+ |
datacard << "bin 1 1\n"; |
513 |
+ |
datacard << "process signal background\n"; |
514 |
+ |
datacard << "process 0 1\n"; |
515 |
+ |
datacard << "rate "<<signal->Integral()<<" "<<background->Integral()<<"\n"; |
516 |
+ |
datacard << "--------------------------------\n"; |
517 |
+ |
datacard << "lumi lnN 1.10 1.0\n"; |
518 |
+ |
datacard << "bgnorm lnN 1.00 1.4 uncertainty on our prediction (40%)\n"; |
519 |
+ |
datacard << "JES shape 1 1 uncertainty on background shape and normalization\n"; |
520 |
+ |
datacard << "peak shape 1 1 uncertainty on signal resolution. Assume the histogram is a 2 sigma shift, \n"; |
521 |
+ |
datacard << "# so divide the unit gaussian by 2 before doing the interpolation\n"; |
522 |
+ |
datacard.close(); |
523 |
+ |
} |
524 |
+ |
|
525 |
+ |
|
526 |
+ |
void prepare_limits(string mcjzb, string datajzb, float jzbpeakerrordata, float jzbpeakerrormc, vector<float> jzbbins) { |
527 |
+ |
ensure_directory_exists(get_directory()+"/limits"); |
528 |
+ |
TFile *limfile = new TFile((get_directory()+"/limits/limitfile.root").c_str(),"RECREATE"); |
529 |
+ |
TCanvas *limcan = new TCanvas("limcan","Canvas for calculating limits"); |
530 |
+ |
limit_shapes_for_systematic_effect(limfile,"",mcjzb,datajzb,noJES,jzbbins,limcan); |
531 |
+ |
limit_shapes_for_systematic_effect(limfile,"peakUp",newjzbexpression(mcjzb,jzbpeakerrormc),newjzbexpression(datajzb,jzbpeakerrordata),noJES,jzbbins,limcan); |
532 |
+ |
limit_shapes_for_systematic_effect(limfile,"peakDown",newjzbexpression(mcjzb,-jzbpeakerrormc),newjzbexpression(datajzb,-jzbpeakerrordata),noJES,jzbbins,limcan); |
533 |
+ |
limit_shapes_for_systematic_effect(limfile,"JESUp",mcjzb,datajzb,JESup,jzbbins,limcan); |
534 |
+ |
limit_shapes_for_systematic_effect(limfile,"JESDown",mcjzb,datajzb,JESdown,jzbbins,limcan); |
535 |
+ |
|
536 |
+ |
prepare_datacard(limfile); |
537 |
+ |
|
538 |
+ |
write_info("prepare_limits","limitfile.root and datacard.txt have been generated. You can now use them to calculate limits!"); |
539 |
+ |
limfile->Close(); |
540 |
+ |
|
541 |
+ |
} |