21 #include "TGraphAsymmErrors.h" 44 void plotKappa(vector<vector<double> > &vx, vector<vector<double> > &vy, vector<vector<double> > &vexl,
45 vector<vector<double> > &vexh, vector<vector<double> > &veyl, vector<vector<double> > &veyh,
46 vector<vector<double> > &vdx, vector<vector<double> > &vdy, vector<vector<double> > &vmx,
47 vector<vector<double> > &vmy,
unsigned iDiv,
48 unsigned idata, TH1D &histo, vector<TString> &nbcuts);
50 int main(
int argc,
char *argv[]){
51 float time_setup(0.), time_ntu(0.), time_gen(0.);
52 time_t begtime, endtime;
56 while((c=getopt(argc, argv,
"m:i:nkp"))!=-1){
62 iDivGlobal=
static_cast<unsigned>(atoi(optarg));
80 TString folder=
"/cms5r0/manuelf/archive/2015_05_25/divided/";
81 TString folder_ns=
"/cms5r0/ald77/archive/"+
ntuple_date+
"/";
84 s_tt.push_back(folder+
"*_TTJet*");
85 vector<TString> s_singlet;
86 s_singlet.push_back(folder+
"*_T*channel*");
87 vector<TString> s_other;
88 s_other.push_back(folder+
"*QCD_HT*");
89 s_other.push_back(folder+
"*_ZJet*");
90 s_other.push_back(folder+
"*DY*");
91 s_other.push_back(folder+
"*WH_HToBB*");
92 s_other.push_back(folder+
"*TTW*");
93 s_other.push_back(folder+
"*TTZ*");
94 s_other.push_back(folder+
"*_WJets*");
97 vector<sfeats> Samples;
110 vector<int> ra4_sam, ra4_sam_ns;
111 unsigned nsam(Samples.size());
112 for(
unsigned sam(0); sam < nsam; sam++){
113 ra4_sam.push_back(sam);
114 ra4_sam_ns.push_back(nsam+sam);
115 vector<TString> sam_files = Samples[sam].file;
116 for(
unsigned ifile(0); ifile < sam_files.size(); ifile++)
117 sam_files[ifile].ReplaceAll(folder, folder_ns);
125 vector<vector<TChain *> >chain;
126 for(
unsigned div(0); div < nDiv; div++){
127 chain.push_back(vector<TChain *>());
128 for(
unsigned sam(0); sam < Samples.size(); sam++){
129 chain[div].push_back(
new TChain(
"tree"));
130 for(
unsigned insam(0); insam < Samples[sam].file.size(); insam++){
131 name = Samples[sam].file[insam]+
"_";
132 name += div+1; name +=
"of"; name += nDiv; name +=
".root";
133 chain[div][sam]->Add(name);
142 if(
method==1) mjthresh =
"600";
143 float mSigma, pSigma;
144 vector<float> powersk, powersn;
145 vector<TString> cuts;
146 cuts.push_back(
"mt<=140&&mj<="+mjthresh);
147 cuts.push_back(
"mt<=140&&mj>"+mjthresh);
148 cuts.push_back(
"mt>140&&mj<="+mjthresh);
149 cuts.push_back(
"mt>140&&mj>"+mjthresh);
152 powersn.push_back(1);
153 powersn.push_back(-1);
154 powersn.push_back(-1);
155 powersn.push_back(1);
157 powersn.push_back(-1);
158 powersn.push_back(1);
159 powersn.push_back(1);
164 TString baseline(
"(nmus+nels)==1&&ht>500&&met>200&&njets>=7&&nbm>=1");
165 vector<TString> metcuts, njcuts, nbcuts, metnames;
169 metcuts.push_back(
"met>200&&met<=400");
170 metcuts.push_back(
"met>400");
171 njcuts.push_back(
"njets<=8");
172 njcuts.push_back(
"njets>=9");
173 nbcuts.push_back(
"nbm==1");
176 nbcuts.push_back(
"nbm==2");
177 nbcuts.push_back(
"nbm>=3");
178 nbcuts.push_back(
"nbm>=2");
180 for(
unsigned imet(0); imet<metcuts.size(); imet++){
181 metnames.push_back(metcuts[imet]);
182 metnames[imet].ReplaceAll(
"met>",
"");
183 metnames[imet].ReplaceAll(
"met<=",
"");
184 metnames[imet].ReplaceAll(
"&&",
"-");
185 if(!metnames[imet].
Contains(
"-")) metnames[imet] +=
"+";
186 metnames[imet] =
"#splitline{MET}{"+metnames[imet]+
"}";
189 float minh(0), maxh(10), wtot(maxh-minh);
190 float wnj(wtot/static_cast<float>(njcuts.size()));
191 float wmet(wnj/static_cast<float>(metcuts.size()));
192 float wnb(wmet/static_cast<float>(nbcuts.size()+4));
193 if(
method==3) wnb = wmet/
static_cast<float>(nbcuts.size()+4-1);
196 vector<vector<vector<double> > > vx, vy, vexl, vexh, veyl, veyh;
197 vector<vector<vector<double> > > vdx, vdy, vmx, vmy;
199 for(
unsigned idata(0); idata<nData; idata++){
200 vx.push_back (vector<vector<double> >());
201 vy.push_back (vector<vector<double> >());
202 vexl.push_back(vector<vector<double> >());
203 vexh.push_back(vector<vector<double> >());
204 veyl.push_back(vector<vector<double> >());
205 veyh.push_back(vector<vector<double> >());
206 for(
unsigned inb(0); inb<nbcuts.size(); inb++){
207 vx[idata].push_back (vector<double>());
208 vy[idata].push_back (vector<double>());
209 vexl[idata].push_back(vector<double>());
210 vexh[idata].push_back(vector<double>());
211 veyl[idata].push_back(vector<double>());
212 veyh[idata].push_back(vector<double>());
214 vdx.push_back (vector<vector<double> >());
215 vdy.push_back (vector<vector<double> >());
216 vmx.push_back(vector<vector<double> >());
217 vmy.push_back(vector<vector<double> >());
218 for(
unsigned inb(0); inb<nbcuts.size(); inb++){
219 vdx[idata].push_back (vector<double>());
220 vdy[idata].push_back (vector<double>());
221 vmx[idata].push_back(vector<double>());
222 vmy[idata].push_back(vector<double>());
226 time(&endtime); time_setup = difftime(endtime, begtime);
230 for(
unsigned inj(0); inj<njcuts.size(); inj++){
231 for(
unsigned imet(0); imet<metcuts.size(); imet++){
232 for(
unsigned inb(0); inb<nbcuts.size(); inb++){
233 if(
method==3 && ((imet==0&&inb==3) || (imet==1&& (inb==1||inb==2))))
continue;
234 vector<vector<vector<float> > > entries, weights;
235 for(
unsigned div(0); div < nDiv; div++){
236 entries.push_back(vector<vector<float> >());
237 weights.push_back(vector<vector<float> >());
242 for(
unsigned obs(0); obs < powersn.size(); obs++) {
243 entries[div].push_back(vector<float>());
244 weights[div].push_back(vector<float>());
245 for(
unsigned sam(0); sam < ra4_sam.size(); sam++) {
246 totcut = (
lumi+
"*weight*("+baseline+
"&&"+nbcuts[inb]+
"&&"+metcuts[imet]+
"&&"+cuts[obs]+
247 "&&"+Samples[ra4_sam[sam]].cut);
248 if(
method==1 || obs%2==1 || powersk.size()<3) totcut +=
"&&"+njcuts[inj];
251 double yield(0.), sigma(0.), avWeight(1.);
253 Nentries =
getYieldErr(*chain[div][ra4_sam[sam]], totcut, yield, sigma);
254 if(yield<0) entries[div][obs].push_back(0);
255 else entries[div][obs].push_back(Nentries);
257 totcut = (
lumi+
"*weight*("+baseline+
"&&"+cuts[obs]+
")");
258 Nentries =
getYieldErr(*chain[div][ra4_sam[sam]], totcut, yield, sigma);
261 totcut = (
lumi+
"*weight*("+baseline+
")");
262 Nentries =
getYieldErr(*chain[div][ra4_sam[sam]], totcut, yield, sigma);
268 avWeight = fabs(yield/static_cast<double>(Nentries));
269 weights[div][obs].push_back(avWeight);
275 time(&endtime); time_ntu += difftime(endtime, begtime);
277 for(
unsigned idata(0); idata<nData; idata++){
278 double kappa(0), fixk(1);
280 mSigma, pSigma, (idata%2)==1);
281 else kappa =
calcKappa(entries[iDivGlobal], weights[iDivGlobal], powersn,
282 mSigma, pSigma, (idata%2)==1);
283 float xpoint = inj*wnj+imet*wmet+(inb+2)*wnb;
284 if(
method==3 && inb==3) xpoint = inj*wnj+imet*wmet+(inb)*wnb;
289 vx[idata][inb].push_back(xpoint);
290 vy[idata][inb].push_back(
kappa);
291 vexl[idata][inb].push_back(0);
292 vexh[idata][inb].push_back(0);
293 veyl[idata][inb].push_back(mSigma);
294 veyh[idata][inb].push_back(pSigma);
295 vector<float> averobs(powersn.size(),0);
296 for(
unsigned div(0); div < nDiv; div++){
297 if(div==iDivGlobal)
continue;
299 for(
unsigned obs(0); obs < powersn.size(); obs++) {
301 for(
unsigned sam(0); sam < ra4_sam.size(); sam++) {
302 observed += entries[div][obs][sam]*weights[div][obs][sam];
304 averobs[obs] += observed;
305 if(observed>0 || powersn[obs]>=0)
kappa *= pow(observed, powersn[obs]);
308 vdx[idata][inb].push_back(xpoint);
309 vdy[idata][inb].push_back(
kappa);
312 for(
unsigned obs(0); obs < powersn.size(); obs++) {
313 averobs[obs] /=
static_cast<float>(nDiv-1);
314 if(averobs[obs]>0 || powersn[obs]>=0)
kappa *= pow(averobs[obs], powersn[obs]);
317 vmx[idata][inb].push_back(xpoint);
318 vmy[idata][inb].push_back(
kappa);
321 time(&endtime); time_gen += difftime(endtime, begtime);
387 TH1D histo(
"histo",
cuts2title(baseline),njcuts.size()*metcuts.size(), minh, maxh);
388 for(
unsigned inj(0); inj<njcuts.size(); inj++)
389 for(
unsigned imet(0); imet<metcuts.size(); imet++)
390 histo.GetXaxis()->SetBinLabel(1+imet+inj*metcuts.size(), metnames[imet]);
391 for(
unsigned idata(0); idata<nData; idata++)
392 plotKappa(vx[idata], vy[idata], vexl[idata], vexh[idata], veyl[idata], veyh[idata],
393 vdx[idata], vdy[idata], vmx[idata], vmy[idata],
iDivGlobal, idata, histo, nbcuts);
396 time(&endtime); time_setup += difftime(endtime, begtime);
398 cout<<endl<<
"Total time: set up "<<time_setup<<
" s, finding yields "<<time_ntu
399 <<
" s, toys "<<time_gen<<
" s"<<endl<<endl;
402 void plotKappa(vector<vector<double> > &vx, vector<vector<double> > &vy, vector<vector<double> > &vexl,
403 vector<vector<double> > &vexh, vector<vector<double> > &veyl, vector<vector<double> > &veyh,
404 vector<vector<double> > &vdx, vector<vector<double> > &vdy, vector<vector<double> > &vmx, vector<vector<double> > &vmy,
unsigned iDiv,
405 unsigned idata, TH1D &histo, vector<TString> &nbcuts){
407 bool do_data((idata%2)==1), do_pred(idata>=2);
411 float max_axis(2.2), max_kappa(0.);
412 unsigned nbsize(vx.size());
413 float minh(histo.GetBinLowEdge(1)), maxh(histo.GetBinLowEdge(histo.GetNbinsX()+1));
414 float wtot(maxh-minh);
415 for(
unsigned inb(0); inb<nbsize; inb++){
416 for(
unsigned ik(0); ik<vy.size(); ik++){
417 if(vy[inb][ik] > max_kappa) max_kappa = vy[inb][ik];
418 if(vy[inb][ik] > max_axis && vy[inb][ik]-veyl[inb][ik] < max_axis && !do_pred) {
419 veyl[inb][ik] = max_axis-(vy[inb][ik]-veyl[inb][ik]);
420 vy[inb][ik] = max_axis;
424 if(do_pred) max_axis = max_kappa*1.3;
427 TLine line; line.SetLineColor(28); line.SetLineWidth(4); line.SetLineStyle(2);
429 TString ytitle(
"#kappa^{MC}");
430 if(do_pred) ytitle =
"N_{2}#timesN_{3}/N_{1}";
431 if(do_data) ytitle +=
" (data uncert.)";
432 else ytitle +=
" (MC uncert.)";
434 histo.SetYTitle(ytitle);
435 histo.SetMaximum(max_axis);
437 if(!(do_pred && !
do_normalized)) line.DrawLine(minh, 1, maxh, 1);
438 line.SetLineColor(1); line.SetLineWidth(2);
439 line.DrawLine(minh+wtot/2., 0, minh+wtot/2, max_axis);
441 double legX(style.
PadLeftMargin+0.03), legY(0.902), legSingle = 0.052;
442 if(do_pred) legX = 0.62;
443 double legW = 0.29, legH = legSingle*nbsize;
444 if(nbsize>3) legH = legSingle*((nbsize+1)/2);
445 TLegend
leg(legX, legY-legH, legX+legW, legY);
446 leg.SetTextSize(style.
LegendSize); leg.SetFillColor(0);
447 leg.SetFillStyle(0); leg.SetBorderSize(0);
448 leg.SetTextFont(style.
nFont);
449 if(nbsize>3) leg.SetNColumns(2);
450 TGraphAsymmErrors
graph[20];
451 TGraph graphd[20], graphm[20];
452 int colors[] = {2,4,kMagenta+2, kGreen+3},
styles[] = {20, 21, 22, 23};
453 for(
unsigned inb(0); inb<nbsize; inb++){
454 graph[inb] = TGraphAsymmErrors(vx[inb].size(), &(vx[inb][0]), &(vy[inb][0]),
455 &(vexl[inb][0]), &(vexh[inb][0]), &(veyl[inb][0]), &(veyh[inb][0]));
456 graph[inb].SetMarkerStyle(styles[inb]); graph[inb].SetMarkerSize(1.4);
457 graph[inb].SetMarkerColor(colors[inb]); graph[inb].SetLineColor(colors[inb]);graph[inb].SetLineWidth(4);
458 graph[inb].Draw(
"p same");
459 graphd[inb] = TGraph(vdx[inb].size(), &(vdx[inb][0]), &(vdy[inb][0]));
460 graphd[inb].SetMarkerStyle(34); graphd[inb].SetMarkerSize(1.2);
461 graphd[inb].SetMarkerColor(kCyan+2); graphd[inb].SetLineColor(colors[inb]);
462 graphd[inb].Draw(
"p same");
463 graphm[inb] = TGraph(vmx[inb].size(), &(vmx[inb][0]), &(vmy[inb][0]));
464 graphm[inb].SetMarkerStyle(20); graphm[inb].SetMarkerSize(1.3);
465 graphm[inb].SetMarkerColor(1); graphm[inb].SetLineColor(colors[inb]);
466 graphm[inb].Draw(
"p same");
467 nbcuts[inb].ReplaceAll(
"nbm",
"n_{b}");
468 nbcuts[inb].ReplaceAll(
"==",
" = ");
469 nbcuts[inb].ReplaceAll(
">=",
" #geq ");
470 leg.AddEntry(&graph[inb], nbcuts[inb],
"p");
473 TLatex label; label.SetNDC(kTRUE);label.SetTextAlign(22);
474 label.DrawLatex(0.37,0.03,
"7 #leq n_{j} #leq 8");
475 label.DrawLatex(0.73,0.03,
"n_{j} #geq 9");
477 TString pname =
"plots/kappa_method"; pname +=
method;
478 pname +=
"_div"; pname += iDiv;
487 if(do_data) pname +=
"_data";
491 if(do_pred || !
do_kappa) pname.ReplaceAll(
"kappa",
"npred");
long getYieldErr(TChain &tree, TString cut, double &yield, double &uncertainty)
bool Contains(const std::string &text, const std::string &pattern)
TString cuts2title(TString title)
void moveYAxisLabel(TH1 *h, float maxi, bool isLog=false)
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, vector< vector< double > > &vdx, vector< vector< double > > &vdy, vector< vector< double > > &vmx, vector< vector< double > > &vmy, unsigned iDiv, unsigned idata, TH1D &histo, vector< TString > &nbcuts)
bool do_normalized(false)
TString ntuple_date("2015_05_25")
int main(int argc, char *argv[])
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)