21 #include "TGraphAsymmErrors.h" 45 void plotKappa(vector<vector<double> > &vx, vector<vector<double> > &vy, vector<vector<double> > &vexl,
46 vector<vector<double> > &vexh, vector<vector<double> > &veyl, vector<vector<double> > &veyh,
47 unsigned idata, TH1D &histo, vector<TString> &nbcuts);
48 int main(
int argc,
char *argv[]){
49 float time_setup(0.), time_ntu(0.), time_gen(0.);
50 time_t begtime, endtime;
54 while((c=getopt(argc, argv,
"r:m:n:to12"))!=-1){
57 if(strcmp(optarg,
"mt")==0){
do_rmt =
true;
do_rmj =
false; }
58 else if(strcmp(optarg,
"mj")==0){
do_rmt =
false;
do_rmj =
true; }
59 else { cout<<
"-r flag needs to be either \"mt\" or \"mj\" for Rmt or Rmj, respectively"<<endl; exit(0); }
63 if(
method!=1&&
method!=3){ cout<<
"-m flag can only be 1 or 3 (no other methods supported)"<<endl; exit(0); }
88 TString folder=
"/cms5r0/rohan/archive/"+
ntuple_date+
"/skim/";
89 TString folder_1l=
"/cms5r0/rohan/archive/"+
ntuple_date+
"/skim_1l/";
90 TString folder_2l=
"/cms5r0/rohan/archive/"+
ntuple_date+
"/skim_2l/";
91 TString folder_genht=
"/cms5r0/rohan/archive/"+
ntuple_date+
"/skim_genht/";
95 s_tt.push_back(folder_genht+
"*_TTJets*SingleLept*");
96 s_tt.push_back(folder_1l+
"*_TTJets*HT*");
99 s_tt.push_back(folder_genht+
"*_TTJets*DiLept*");
100 s_tt.push_back(folder_2l+
"*_TTJets*HT*");
103 s_tt.push_back(folder_genht+
"*_TTJets*Lept*");
104 s_tt.push_back(folder+
"*_TTJets*HT*");
107 vector<sfeats> Samples;
108 Samples.push_back(
sfeats(s_tt,
"t#bar{t}", 46,1));
111 vector<int> ra4_sam, ra4_sam_ns;
112 unsigned nsam(Samples.size());
113 for(
unsigned sam(0); sam < nsam; sam++){
114 ra4_sam.push_back(sam);
124 vector<TChain *> chain;
125 for(
unsigned sam(0); sam < Samples.size(); sam++){
126 chain.push_back(
new TChain(
"tree"));
127 for(
unsigned insam(0); insam < Samples[sam].file.size(); insam++)
128 chain[sam]->Add(Samples[sam].
file[insam]);
132 if(
method==1) mjthresh =
"600";
133 float mSigma, pSigma;
134 vector<float> powersk;
135 vector<TString> cuts;
137 powersk.push_back(-1); cuts.push_back(
"mt<=140");
138 powersk.push_back(1); cuts.push_back(
"mt>140");
140 powersk.push_back(-1); cuts.push_back(
"mj<="+mjthresh);
141 powersk.push_back(1); cuts.push_back(
"mj>"+mjthresh);
144 TString baseline(
"ht>500&&met>200&&njets>=7&&nbm>=2&&nleps==1");
145 vector<TString> njcuts, metcuts, extcuts, njnames, metnames;
146 njcuts.push_back(
"njets<=8");
147 njcuts.push_back(
"njets>=9");
149 metcuts.push_back(
"met<=400");
150 metcuts.push_back(
"met>400");
152 metcuts.push_back(
"met<=400&&nbm==2");
153 metcuts.push_back(
"met<=400&&nbm>=3");
154 metcuts.push_back(
"met>400");
157 extcuts.push_back(
"mj>"+mjthresh);
158 extcuts.push_back(
"mj<="+mjthresh);
161 extcuts.push_back(
"mt>140");
162 extcuts.push_back(
"mt<=140");
164 for(
unsigned inj(0); inj<njcuts.size(); inj++){
165 njnames.push_back(njcuts[inj]);
166 njnames[inj].ReplaceAll(
"<=",
" #leq ");
167 njnames[inj].ReplaceAll(
"==",
" = ");
168 njnames[inj].ReplaceAll(
">",
" > ");
171 for(
unsigned imet(0); imet<metcuts.size(); imet++){
172 metnames.push_back(metcuts[imet]);
173 metnames[imet].ReplaceAll(
"met<=400&&nbm==2",
"met#leq400,n_{b}=2");
174 metnames[imet].ReplaceAll(
"met<=400&&nbm>=3",
"met#leq400,n_{b}#geq3");
175 metnames[imet].ReplaceAll(
"met>400",
"met>400");
176 metnames[imet].ReplaceAll(
"njets",
"n_{j}");
177 metnames[imet].ReplaceAll(
">=",
" #geq ");
178 metnames[imet].ReplaceAll(
"<=",
" #leq ");
179 metnames[imet].ReplaceAll(
"==",
" = ");
182 float minh(0), maxh(njcuts.size()*metcuts.size()), wtot(maxh-minh);
183 float wmet(wtot/static_cast<float>(njcuts.size()));
184 float wnj(wmet/static_cast<float>(metcuts.size()));
185 float wnb(wnj/static_cast<float>(extcuts.size()+4));
188 vector<vector<vector<double> > > vx, vy, vexl, vexh, veyl, veyh;
189 for(
unsigned idata(0); idata<4; idata++){
190 vx.push_back (vector<vector<double> >());
191 vy.push_back (vector<vector<double> >());
192 vexl.push_back(vector<vector<double> >());
193 vexh.push_back(vector<vector<double> >());
194 veyl.push_back(vector<vector<double> >());
195 veyh.push_back(vector<vector<double> >());
196 for(
unsigned iext(0); iext<extcuts.size(); iext++){
197 vx[idata].push_back (vector<double>());
198 vy[idata].push_back (vector<double>());
199 vexl[idata].push_back(vector<double>());
200 vexh[idata].push_back(vector<double>());
201 veyl[idata].push_back(vector<double>());
202 veyh[idata].push_back(vector<double>());
206 time(&endtime); time_setup = difftime(endtime, begtime);
210 for(
unsigned inj(0); inj<njcuts.size(); inj++){
211 for(
unsigned imet(0); imet<metcuts.size(); imet++){
212 for(
unsigned iext(0); iext<extcuts.size(); iext++){
213 vector<vector<float> > entries;
214 vector<vector<float> > weights;
215 for(
unsigned obs(0); obs < powersk.size(); obs++) {
216 entries.push_back(vector<float>());
217 weights.push_back(vector<float>());
218 float yield_singlet(0);
219 for(
unsigned sam(0); sam < ra4_sam.size(); sam++) {
220 totcut = (
lumi+
"*weight*("+baseline+
"&&"+extcuts[iext]+
"&&"+metcuts[imet]+
"&&"+cuts[obs]+
221 "&&"+Samples[ra4_sam[sam]].cut);
222 if(
method==1 || (
do_rmj&&obs%2==1) || (
do_rmt&&iext%2==0)) totcut +=
"&&"+njcuts[inj];
225 double yield(0.), sigma(0.), avWeight(1.);
227 Nentries =
getYieldErr(*chain[ra4_sam[sam]], totcut, yield, sigma);
230 if(Samples[ra4_sam[sam]].label==
"Single t"){
231 if(yield>0) yield_singlet = yield;
234 if(Samples[ra4_sam[sam]].label==
"Other") yield += yield_singlet;
235 if(yield<=0) entries[obs].push_back(0);
238 else entries[obs].push_back(Nentries);
241 totcut = (
lumi+
"*weight*("+baseline+
"&&"+cuts[obs]+
")");
242 Nentries =
getYieldErr(*chain[ra4_sam[sam]], totcut, yield, sigma);
245 totcut = (
lumi+
"*weight*("+baseline+
")");
246 Nentries =
getYieldErr(*chain[ra4_sam[sam]], totcut, yield, sigma);
250 else avWeight = fabs(yield/static_cast<double>(Nentries));
251 weights[obs].push_back(avWeight);
256 time(&endtime); time_ntu += difftime(endtime, begtime);
258 for(
unsigned idata(0); idata<1; idata++){
259 if(
do_2l && idata>=2)
continue;
261 kappa =
calcKappa(entries, weights, powersk, mSigma, pSigma, (idata%2)==1,
false);
262 float xpoint = imet*wnj+inj*wmet+(iext+2)*wnb;
263 if(
method==3 && iext==3) xpoint = imet*wnj+inj*wmet+(iext)*wnb;
264 vx[idata][iext].push_back(xpoint);
265 vy[idata][iext].push_back(kappa);
266 vexl[idata][iext].push_back(0);
267 vexh[idata][iext].push_back(0);
268 veyl[idata][iext].push_back(mSigma);
269 veyh[idata][iext].push_back(pSigma);
271 time(&endtime); time_gen += difftime(endtime, begtime);
278 vector<unsigned> ind(extcuts.size(),0);
280 for(
unsigned inj(0); inj<njcuts.size(); inj++){
281 for(
unsigned imet(0); imet<metcuts.size(); imet++){
283 if(
method==3 && ((inj==0&&iext==3) || (inj==1&& (iext==1||iext==2))))
continue;
284 float MC(vy[0][iext][ind[iext]]), Data(vy[1][iext][ind[iext]]);
285 float epMC(veyh[0][iext][ind[iext]]), emMC(veyl[0][iext][ind[iext]]);
286 float epData(veyh[1][iext][ind[iext]]), emData(veyl[1][iext][ind[iext]]);
287 float epTotal(sqrt(pow(epMC/MC,2)+pow(epData/Data,2))), emTotal(sqrt(pow(emMC/MC,2)+pow(emData/Data,2)));
289 njcuts[inj].ReplaceAll(
"met>200&&",
"");
290 TString cutname = metcuts[imet]+
", "+njcuts[inj];
291 if(
method==3) cutname +=
", "+extcuts[iext];
302 TH1D histo(
"histo",
cuts2title(baseline),metcuts.size()*njcuts.size(), minh, maxh);
303 if(
method==3) histo.SetLabelSize(0.047,
"X");
304 for(
unsigned inj(0); inj<njcuts.size(); inj++)
305 for(
unsigned imet(0); imet<metcuts.size(); imet++)
306 histo.GetXaxis()->SetBinLabel(1+imet+inj*metcuts.size(), metnames[imet]);
307 for(
unsigned idata(0); idata<1; idata++)
308 plotKappa(vx[idata], vy[idata], vexl[idata], vexh[idata], veyl[idata], veyh[idata], idata, histo, extcuts);
311 time(&endtime); time_setup += difftime(endtime, begtime);
313 cout<<endl<<
"Total time: set up "<<time_setup<<
" s, finding yields "<<time_ntu
314 <<
" s, toys "<<time_gen<<
" s"<<endl<<endl;
317 void plotKappa(vector<vector<double> > &vx, vector<vector<double> > &vy, vector<vector<double> > &vexl,
318 vector<vector<double> > &vexh, vector<vector<double> > &veyl, vector<vector<double> > &veyh,
319 unsigned idata, TH1D &histo, vector<TString> &extcuts){
321 bool do_data((idata%2)==1), do_pred(
true);
324 float max_axis(3.2), max_kappa(0.);
325 unsigned nbsize(vx.size());
326 float minh(histo.GetBinLowEdge(1)), maxh(histo.GetBinLowEdge(histo.GetNbinsX()+1));
327 float wtot(maxh-minh);
328 for(
unsigned iext(0); iext<nbsize; iext++){
329 for(
unsigned ik(0); ik<vy[iext].size(); ik++){
330 if((vy[iext][ik]+veyh[iext][ik]) > max_kappa) max_kappa = vy[iext][ik]+veyh[iext][ik];
333 max_axis = max_kappa*1.1;
335 TLine line; line.SetLineColor(28); line.SetLineWidth(4); line.SetLineStyle(3);
337 TString ytitle(
"#kappa^{MC}");
338 if(do_pred&&
do_rmt) ytitle =
"R_{mT}";
339 else if(do_pred&&
do_rmj) ytitle =
"R_{MJ}";
340 histo.SetYTitle(ytitle);
341 if(
false) histo.SetMaximum(max_axis);
342 if(
do_rmt) histo.SetMaximum(0.25);
343 if(
do_rmj) histo.SetMaximum(1.5);
345 if(!do_pred) line.DrawLine(minh, 1, maxh, 1);
346 line.SetLineColor(1); line.SetLineWidth(2);
347 if(
do_rmt) line.DrawLine(minh+wtot/2., 0, minh+wtot/2, 0.25);
348 if(
do_rmj) line.DrawLine(minh+wtot/2., 0, minh+wtot/2, 1.5);
350 double legX(style.
PadLeftMargin+0.0), legY(0.88), legSingle = 0.052;
351 double legW = 0.29, legH = legSingle*nbsize;
352 if(nbsize>3) legH = legSingle*((nbsize+1)/2);
353 TLegend
leg(legX, legY-legH, legX+legW, legY);
354 leg.SetTextSize(style.
LegendSize); leg.SetFillColor(0);
355 leg.SetFillStyle(0); leg.SetBorderSize(0);
356 leg.SetTextFont(style.
nFont);
357 if(nbsize>3) leg.SetNColumns(2);
358 TGraphAsymmErrors
graph[20];
359 int colors[] = {31,46,kMagenta+2, kGreen+3},
styles[] = {20, 21, 22, 23};
360 for(
unsigned iext(0); iext<nbsize; iext++){
361 graph[iext] = TGraphAsymmErrors(vx[iext].size(), &(vx[iext][0]), &(vy[iext][0]),
362 &(vexl[iext][0]), &(vexh[iext][0]), &(veyl[iext][0]), &(veyh[iext][0]));
363 graph[iext].SetMarkerStyle(styles[iext]); graph[iext].SetMarkerSize(1.4);
364 graph[iext].SetMarkerColor(colors[iext]); graph[iext].SetLineColor(colors[iext]);
365 graph[iext].Draw(
"p same");
366 extcuts[iext].ReplaceAll(
"mt",
"m_{T}");
367 extcuts[iext].ReplaceAll(
"mj",
"MJ");
368 extcuts[iext].ReplaceAll(
"==",
" = ");
369 extcuts[iext].ReplaceAll(
"<=",
" #leq ");
370 extcuts[iext].ReplaceAll(
">",
" > ");
371 leg.AddEntry(&graph[iext], extcuts[iext],
"p");
375 label.SetNDC(kTRUE); label.SetTextAlign(22); label.SetTextColor(1);
377 label.DrawLatex(0.37,0.03,
"7 #leq n_{jets} #leq 8");
378 label.DrawLatex(0.73,0.03,
"n_{jets} #geq 9");
383 if(
do_rmt) pname =
"plots/rmt";
384 if(
do_rmj) pname =
"plots/rmj";
396 if(do_data) pname +=
"_data";
399 if(do_pred) pname.ReplaceAll(
"kappa",
"npred");
long getYieldErr(TChain &tree, TString cut, double &yield, double &uncertainty)
bool do_sigma_avError(true)
int main(int argc, char *argv[])
TString cuts2title(TString title)
void moveYAxisLabel(TH1 *h, float maxi, bool isLog=false)
TString RoundNumber(double num, int decimals, double denom=1.)
TString ntuple_date("2015_09_14")
double calcKappa(std::vector< std::vector< float > > &entries, std::vector< std::vector< float > > &weights, std::vector< float > &powers, float &mSigma, float &pSigma, bool do_data=false, bool verbose=false, bool do_plot=false, int nrep=100000)
void plotKappa(vector< vector< double > > &vx, vector< vector< double > > &vy, vector< vector< double > > &vexl, vector< vector< double > > &vexh, vector< vector< double > > &veyl, vector< vector< double > > &veyh, unsigned idata, TH1D &histo, vector< TString > &nbcuts)