2 |
|
#include <vector> |
3 |
|
#include <sys/stat.h> |
4 |
|
#include <sstream> |
5 |
+ |
#include <assert.h> |
6 |
|
|
7 |
|
#include <TCut.h> |
8 |
|
#include <TLatex.h> |
42 |
|
|
43 |
|
bool drawefficiencydesertline=false; |
44 |
|
|
45 |
+ |
bool wrongwaytodothis=true; |
46 |
+ |
|
47 |
|
string xsecfilename; |
48 |
|
|
49 |
|
void set_range(TH2F *histo, int scantype, bool pushoutlabels); |
122 |
|
line = new TLine(50.+75.0, 50.0+verticaloffset, 1200., 1200.0-75.0+verticaloffset); |
123 |
|
line->SetLineStyle(2); |
124 |
|
line->SetLineWidth(2); |
125 |
< |
line->Draw("same"); |
125 |
> |
//line->Draw("same"); |
126 |
> |
// Add a dashed line to indicate where x changes |
127 |
> |
float offset = 0.; |
128 |
> |
if ( 0 == scanx.compare("0.5") ) { offset = 91.2/0.5; } |
129 |
> |
else if ( 0 == scanx.compare("0.25") ) { offset = 91.2/0.25; } |
130 |
> |
else if ( 0 == scanx.compare("0.75") ) { offset = 91.2/0.75; } |
131 |
> |
|
132 |
> |
if ( offset>0 ) { |
133 |
> |
line->DrawLine(50+offset, 50.0, 1200., 1200.0-offset); |
134 |
> |
} |
135 |
|
} |
136 |
|
|
137 |
|
TH2F* prep_histo(TH2F *oldhist, int scantype) {///DONE |
432 |
|
desertline->Draw("same"); |
433 |
|
} |
434 |
|
|
435 |
< |
TH2F *emptyh = (TH2F*)limits->Clone("emptyh"); |
436 |
< |
for(int i=1;i<=emptyh->GetNbinsX();i++) { |
437 |
< |
for(int j=1;j<=emptyh->GetNbinsX();j++) { |
438 |
< |
emptyh->SetBinContent(i,j,0); |
427 |
< |
} |
428 |
< |
} |
429 |
< |
|
430 |
< |
SugarCoatThis(finalcanvas,10,emptyh,exclline); |
431 |
< |
// exclline->Draw("c"); |
435 |
> |
TH2F *emptyh = new TH2F("emptyh","emptyh",1,1,2,1,1,2); |
436 |
> |
|
437 |
> |
|
438 |
> |
exclline->Draw("c"); |
439 |
|
|
440 |
|
// fill_with_text(exclline,excllined3,excllinet3,finalcanvas,scantype,scanx); |
441 |
|
stringstream real; |
645 |
|
pointcounter++; |
646 |
|
} |
647 |
|
} |
648 |
< |
for(int i=pointcounter;i<points.size();i++) graph->SetPoint(i,lastx,lasty); |
648 |
> |
for(int i=pointcounter;i<=points.size();i++) graph->SetPoint(i,lastx,lasty); |
649 |
|
if(scantype==PlottingSetup::GMSB||scantype==PlottingSetup::SMS) { |
650 |
|
//The final point will be a continuation of the last one, towards the diagonal |
651 |
|
float x,y; |
657 |
|
return graph; |
658 |
|
} |
659 |
|
|
660 |
< |
void draw_mSUGRA_exclusion(TH2F *crosssection, TH2F *limitmap, TH2F *expmap, TH2F *expplusmap, TH2F *expminusmap, TH2F *exp2plusmap, TH2F *exp2minusmap) { |
660 |
> |
TH2F* cast_into_shape(TH2F *origin, TH2F *reference) { |
661 |
> |
TH2F *newh = (TH2F*)reference->Clone(origin->GetName()); |
662 |
> |
for(int ix=1;ix<=reference->GetNbinsX();ix++) { |
663 |
> |
for(int iy=1;iy<=reference->GetNbinsY();iy++) { |
664 |
> |
// reference->SetBinContent(ix,iy,origin->GetBinContent(ix,iy)); |
665 |
> |
newh->SetBinContent(ix,iy,origin->GetBinContent(ix,iy)); |
666 |
> |
} |
667 |
> |
} |
668 |
> |
return newh; |
669 |
> |
} |
670 |
> |
|
671 |
> |
void draw_mSUGRA_exclusion(TH2F *ocrosssection, TH2F *oFilterEfficiency, TH2F *oabsXS, TH2F *limitmap, TH2F *expmap, TH2F *expplusmap, TH2F *expminusmap, TH2F *exp2plusmap, TH2F *exp2minusmap) { |
672 |
> |
TH2F *crosssection = (TH2F*)ocrosssection->Clone("crosssection"); |
673 |
> |
// TH2F *limitmap = (TH2F*)olimitmap->Clone(((string)olimitmap->GetName()+"clone").c_str()); |
674 |
|
TH2F *cleanhisto = (TH2F*)limitmap->Clone("clean"); |
675 |
|
for(int ix=1;ix<=cleanhisto->GetNbinsX();ix++) { |
676 |
|
for(int iy=1;iy<=cleanhisto->GetNbinsY();iy++) { |
677 |
|
cleanhisto->SetBinContent(ix,iy,0); |
678 |
|
} |
679 |
|
} |
680 |
+ |
|
681 |
+ |
|
682 |
+ |
TH2F *FilterEfficiency; |
683 |
+ |
TH2F *absXS; |
684 |
+ |
|
685 |
+ |
|
686 |
+ |
|
687 |
+ |
|
688 |
+ |
write_warning(__FUNCTION__,"You'll want to switch off 'wrongwaytodothis')"); |
689 |
+ |
|
690 |
+ |
if(wrongwaytodothis) { |
691 |
+ |
//this part is the one you want to remove. |
692 |
+ |
TFile *Efficiencies = new TFile("FilterEfficiencyv3.root"); |
693 |
+ |
FilterEfficiency = cast_into_shape((TH2F*) Efficiencies->Get("FilterEfficiency"),limitmap); |
694 |
+ |
assert(FilterEfficiency); |
695 |
+ |
assert(crosssection); |
696 |
+ |
absXS=(TH2F*)crosssection->Clone("absXS"); |
697 |
+ |
crosssection->Multiply(FilterEfficiency); |
698 |
+ |
} else { |
699 |
+ |
//this part is the one you want to keep! |
700 |
+ |
FilterEfficiency=(TH2F*)oFilterEfficiency->Clone("FilterEfficiency"); |
701 |
+ |
absXS=(TH2F*)oabsXS->Clone("absXS"); |
702 |
+ |
} |
703 |
+ |
|
704 |
+ |
|
705 |
|
|
706 |
|
TH2F *limits = (TH2F*)limitmap->Clone("limits"); |
707 |
|
set_range(limits,true,false); |
752 |
|
if(draw2sigma) smooth_line(expected2); |
753 |
|
|
754 |
|
TCanvas *te = new TCanvas("te","te"); |
755 |
+ |
te->SetRightMargin(standardmargin); |
756 |
|
// decorate_mSUGRA(cleanhisto,te,expected,expected2,observed); |
757 |
< |
SugarCoatThis(te,10,cleanhisto,observed); |
757 |
> |
TH2F *noh = new TH2F("noh","noh",1,1,2,1,1,2); |
758 |
> |
SugarCoatThis(te,10,noh,observed); |
759 |
|
// expected->Draw("c"); |
760 |
|
// observed->Draw("c"); |
761 |
|
stringstream saveas; |
764 |
|
CompleteSave(te,saveas.str()); |
765 |
|
delete te; |
766 |
|
|
767 |
< |
TCanvas *overview = new TCanvas("overview","overview",1000,1000); |
767 |
> |
TCanvas *overview = new TCanvas("overview","overview",1500,1000); |
768 |
> |
|
769 |
|
set_range(crosssection,true,false); |
770 |
|
set_range(limits,true,false); |
771 |
|
set_range(limitmap,true,false); |
772 |
|
|
773 |
|
TGraph *emptygraph = new TGraph(0); |
774 |
|
|
775 |
< |
overview->Divide(2,2); |
775 |
> |
overview->Divide(3,2); |
776 |
|
overview->cd(1); |
777 |
|
overview->cd(1)->SetLogz(1); |
778 |
< |
crosssection->GetZaxis()->SetRangeUser(0.0001,100); |
779 |
< |
// SugarCoatThis(overview->cd(1),10,crosssection,emptygraph); |
732 |
< |
crosssection->Draw("COLZ"); |
778 |
> |
absXS->GetZaxis()->SetRangeUser(0.0001,100); |
779 |
> |
absXS->Draw("COLZ"); |
780 |
|
TText *title0 = write_title("Cross Section"); |
781 |
|
title0->Draw("same"); |
782 |
|
overview->cd(2); |
783 |
< |
overview->cd(2)->SetLogz(1); |
784 |
< |
limits->GetZaxis()->SetRangeUser(0.1,100); |
783 |
> |
FilterEfficiency->GetZaxis()->SetRangeUser(0.01,0.7); |
784 |
> |
FilterEfficiency->Draw("COLZ"); |
785 |
> |
TText *title0aa = write_title("Filter #epsilon"); |
786 |
> |
title0aa->Draw("same"); |
787 |
> |
overview->cd(3); |
788 |
> |
overview->cd(3)->SetLogz(1); |
789 |
> |
crosssection->GetZaxis()->SetRangeUser(0.0001,100); |
790 |
> |
crosssection->Draw("COLZ"); |
791 |
> |
TText *title0a = write_title("Filter #epsilon x Cross Section"); |
792 |
> |
title0a->Draw("same"); |
793 |
> |
|
794 |
> |
overview->cd(4); |
795 |
> |
overview->cd(4)->SetLogz(1); |
796 |
> |
limits->GetZaxis()->SetRangeUser(0.01,100); |
797 |
|
limits->Draw("COLZ"); |
798 |
|
TText *title1 = write_title("Cross Section Upper Limit"); |
799 |
|
title1->Draw("same"); |
800 |
< |
overview->cd(3); |
800 |
> |
overview->cd(5); |
801 |
|
limitmap->Draw("COLZ"); |
802 |
|
TText *title2 = write_title("UL/XS"); |
803 |
|
title2->Draw("same"); |
804 |
|
observed->Draw("c"); |
805 |
< |
overview->cd(4); |
805 |
> |
overview->cd(6); |
806 |
> |
overview->cd(6)->SetRightMargin(standardmargin); |
807 |
|
// decorate_mSUGRA(cleanhisto,overview->cd(4),expected,expected2,observed); |
808 |
< |
SugarCoatThis(overview->cd(4),10,cleanhisto,observed); |
808 |
> |
SugarCoatThis(overview->cd(6),10,noh,observed); |
809 |
|
// observed->Draw("c"); |
810 |
|
stringstream saveas2; |
811 |
|
if((int)((string)limitmap->GetName()).find("limitmap")>0) saveas2 << "Limits/exclusion_overview_for_JZB_geq_" << ((string)limitmap->GetName()).substr(((string)limitmap->GetName()).find("limitmap")+8,10); |
812 |
|
else saveas2 << "Limits/exclusion_overview_for_bestlimits"; |
813 |
|
CompleteSave(overview,saveas2.str()); |
814 |
|
delete overview; |
815 |
< |
|
815 |
> |
delete noh; |
816 |
> |
delete crosssection; |
817 |
> |
delete absXS; |
818 |
> |
delete FilterEfficiency; |
819 |
|
|
820 |
|
} |
821 |
|
|
925 |
|
bestlimitsource->GetYaxis()->CenterTitle(0); |
926 |
|
bestlimitsource->Draw("COL"); |
927 |
|
gPad->Update(); |
865 |
– |
if(scantype!=PlottingSetup::mSUGRA) bestlimitsource->Draw("TEXT,same"); |
928 |
|
TLegend *sourceleg = new TLegend(0.2,0.5,0.55,0.75); |
929 |
|
for(int i=0;i<explimits.size();i++) { |
930 |
|
stringstream legendentry; |
974 |
|
vector<TH2F*> obslimits; |
975 |
|
vector<TH2F*> flipmaps; |
976 |
|
vector<TH2F*> crosssections; |
977 |
< |
|
977 |
> |
vector<TH2F*> AbsCrossSection; |
978 |
> |
vector<TH2F*> FilterEfficiencies; |
979 |
|
for(int ilim=0;ilim<limits.size();ilim++) { |
980 |
|
if(TString(limits[ilim]->GetName()).Contains("_explimitmap")) explimits.push_back(limits[ilim]); |
981 |
|
if(scantype==PlottingSetup::mSUGRA && TString(limits[ilim]->GetName()).Contains("_exp1plimitmap")) exp1plimits.push_back(limits[ilim]); |
982 |
|
if(scantype==PlottingSetup::mSUGRA && TString(limits[ilim]->GetName()).Contains("_exp1mlimitmap")) exp1mlimits.push_back(limits[ilim]); |
983 |
|
if(scantype==PlottingSetup::mSUGRA && TString(limits[ilim]->GetName()).Contains("_exp2plimitmap")) exp2plimits.push_back(limits[ilim]); |
984 |
|
if(scantype==PlottingSetup::mSUGRA && TString(limits[ilim]->GetName()).Contains("_exp2mlimitmap")) exp2mlimits.push_back(limits[ilim]); |
985 |
< |
if(scantype==PlottingSetup::mSUGRA && TString(limits[ilim]->GetName()).Contains("_XS")) crosssections.push_back(limits[ilim]); |
985 |
> |
// if(scantype==PlottingSetup::mSUGRA && TString(limits[ilim]->GetName()).Contains("_XS")) crosssections.push_back(limits[ilim]); |
986 |
> |
if(scantype==PlottingSetup::mSUGRA && TString(limits[ilim]->GetName()).Contains("_absXS")) AbsCrossSection.push_back(limits[ilim]); |
987 |
> |
if(scantype==PlottingSetup::mSUGRA && TString(limits[ilim]->GetName()).Contains("_FilterEfficiency")) FilterEfficiencies.push_back(limits[ilim]); |
988 |
> |
if(wrongwaytodothis) { |
989 |
> |
if(scantype==PlottingSetup::mSUGRA && TString(limits[ilim]->GetName()).Contains("_XS")) AbsCrossSection.push_back(limits[ilim]); |
990 |
> |
if(scantype==PlottingSetup::mSUGRA && TString(limits[ilim]->GetName()).Contains("_absXS")) crosssections .push_back(limits[ilim]); |
991 |
> |
if(scantype==PlottingSetup::mSUGRA && TString(limits[ilim]->GetName()).Contains("_XS")) FilterEfficiencies.push_back(limits[ilim]); |
992 |
> |
} |
993 |
|
if(TString(limits[ilim]->GetName()).Contains("_limitmap")) obslimits.push_back(limits[ilim]); |
994 |
|
// if(TString(limits[ilim]->GetName()).Contains("_limitflipmap")) flipmaps.push_back(limits[ilim]); |
995 |
|
} |
996 |
|
|
997 |
+ |
cout << "Size: " << AbsCrossSection.size() << endl; |
998 |
|
TH2F *xsec; |
999 |
|
if(scantype!=PlottingSetup::mSUGRA) xsec = adjust_histo(get_XS(xsecfilename,"gluino",limits[0]),limits[0]); |
1000 |
|
vector<TH2F*> bestexplimits; |
1010 |
|
make_SMS_exclusion(bestlimits,xsec,scantype,scanx); |
1011 |
|
} else { |
1012 |
|
for(int ilim=0;ilim<obslimits.size();ilim++) { |
1013 |
< |
draw_mSUGRA_exclusion(crosssections[0], obslimits[ilim], explimits[ilim], exp1mlimits[ilim], exp1plimits[ilim], exp2mlimits[ilim], exp2plimits[ilim]); |
1013 |
> |
draw_mSUGRA_exclusion(crosssections[0],FilterEfficiencies[0],AbsCrossSection[0],obslimits[ilim], explimits[ilim], exp1mlimits[ilim], exp1plimits[ilim], exp2mlimits[ilim], exp2plimits[ilim]); |
1014 |
|
} |
1015 |
< |
draw_mSUGRA_exclusion(crosssections[0], bestlimits, bestexplimits[0], bestexplimits[1], bestexplimits[2], bestexplimits[3], bestexplimits[4]); |
1015 |
> |
draw_mSUGRA_exclusion(crosssections[0],FilterEfficiencies[0],AbsCrossSection[0],bestlimits, bestexplimits[0], bestexplimits[1], bestexplimits[2], bestexplimits[3], bestexplimits[4]); |
1016 |
|
} |
1017 |
|
delete bestlimits; |
1018 |
|
} |
1182 |
|
|
1183 |
|
void process_file(TFile* file, float stdmargin) { |
1184 |
|
standardmargin=stdmargin; |
1185 |
< |
xsecfilename="reference_xSec_SMS-new.root"; |
1185 |
> |
xsecfilename=PlottingSetup::cbafbasedir+"/"+PlottingSetup::SMSReferenceXSFile; |
1186 |
|
|
1187 |
|
// can receive a file with systematics and limits mixed, or a file with systematics only , or a file with limits only. |
1188 |
|
TIter nextkey(file->GetListOfKeys()); |
1213 |
|
if(name.Contains("exclusionmap")) is_limit=true; |
1214 |
|
if(name.Contains("crosssectionmap")) is_limit=true; |
1215 |
|
if(name.Contains("XS")) is_limit=true; |
1216 |
+ |
if(name.Contains("absXS")) is_limit=true; |
1217 |
|
if(name.Contains("limitflipmap")) is_limit=true; |
1218 |
|
|
1219 |
|
if(name.Contains("sysjes")) is_systematic=true; |
1238 |
|
if(name.Contains("mSUGRA")) scantype=PlottingSetup::mSUGRA; |
1239 |
|
if(name.Contains("GMSB")) scantype=PlottingSetup::GMSB; |
1240 |
|
} |
1241 |
< |
if(systematics_histos.size()>0) make_all_syst_plots(systematics_histos,scantype,scanx); |
1241 |
> |
write_warning(__FUNCTION__,"Deactivated systematics plots"); |
1242 |
> |
// if(systematics_histos.size()>0) make_all_syst_plots(systematics_histos,scantype,scanx); |
1243 |
|
if(limits_histos.size()>0) create_exclusion_plots(limits_histos,scantype,scanx); |
1244 |
|
} |
1245 |
|
|