14 #include "TObjString.h" 15 #include "TObjArray.h" 17 #include "RooStats/NumberCountingUtils.h" 39 TString
YieldsCut(TString title, TString cuts, vector<TChain*> chain, vector<sfeats> Samples,
int nsig);
40 float GetNdata(TString oneline,
bool doMC);
45 TString folder, folder_ns, folder_1ldata;
46 folder =
"/net/cms2/cms2r0/babymaker/babies/2015_10_19/mc/skim_1lht400mc/";
47 folder_1ldata =
"/net/cms2/cms2r0/babymaker/babies/2015_10_19/data/singlelep/combined/skim_1lht400/";
48 vector<TString> s_trig_sl;
49 s_trig_sl.push_back(folder_1ldata+
"/*Single*");
52 s_tt.push_back(folder+
"*_TTJets*Lept*");
53 s_tt.push_back(folder+
"*_TTJets_HT*");
54 vector<TString> s_wjets;
55 s_wjets.push_back(folder+
"*_WJetsToLNu*");
56 vector<TString> s_ttv;
57 s_ttv.push_back(folder+
"*_TTWJets*");
58 s_ttv.push_back(folder+
"*_TTZTo*");
59 vector<TString> s_single;
60 s_single.push_back(folder+
"*_ST_*");
61 vector<TString> s_other;
62 s_other.push_back(folder+
"*DYJetsToLL*");
63 s_other.push_back(folder+
"*_QCD_HT*");
64 s_other.push_back(folder+
"*_ZJet*");
65 s_other.push_back(folder+
"*_WWTo*");
66 s_other.push_back(folder+
"*ggZH_HToBB*");
67 s_other.push_back(folder+
"*ttHJetTobb*");
68 vector<TString> s_t1t;
69 s_t1t.push_back(folder+
"*T1tttt*1500_*");
70 vector<TString> s_t1tc;
71 s_t1tc.push_back(folder+
"*T1tttt*1200_*");
73 vector<TChain *> chain;
74 vector<sfeats> Samples;
75 Samples.push_back(
sfeats(s_trig_sl,
"Data", 1003,1,
"(trig[4]||trig[8])&&pass&&(mt<140||(mt>140&&mj<400))"));
77 Samples.push_back(
sfeats(s_other,
"Other", 1001));
78 Samples.push_back(
sfeats(s_ttv,
"$t\\bar{t}V$", 1002));
79 Samples.push_back(
sfeats(s_single,
"Single $t$", 1005));
80 Samples.push_back(
sfeats(s_wjets,
"W+jets", 1004));
82 Samples.push_back(
sfeats(s_tt,
"$t\\bar{t}$ (1$\\ell$)", 1000,1,
84 Samples.push_back(
sfeats(s_tt,
"$t\\bar{t}$ ($2\\ell$)", 1006,1,
89 for(
unsigned sam(0); sam < Samples.size(); sam++){
90 chain.push_back(
new TChain(
"tree"));
91 for(
unsigned insam(0); insam < Samples[sam].file.size(); insam++)
92 chain[sam]->Add(Samples[sam].
file[insam]);
96 vector<TChain *> chain_2l;
97 vector<sfeats> Samples_2l;
98 Samples_2l.push_back(
sfeats(s_trig_sl,
"Data", 1003,1,
"(trig[4]||trig[8])&&pass"));
100 Samples_2l.push_back(
sfeats(s_other,
"Other", 1001));
101 Samples_2l.push_back(
sfeats(s_ttv,
"$t\\bar{t}V$", 1002));
102 Samples_2l.push_back(
sfeats(s_single,
"Single $t$", 1005));
103 Samples_2l.push_back(
sfeats(s_wjets,
"W+jets", 1004));
105 Samples_2l.push_back(
sfeats(s_tt,
"$t\\bar{t}$ (1$\\ell$)", 1000,1,
107 Samples_2l.push_back(
sfeats(s_tt,
"$t\\bar{t}$ ($2\\ell$)", 1006,1,
110 for(
unsigned sam(0); sam < Samples_2l.size(); sam++){
111 chain_2l.push_back(
new TChain(
"tree"));
112 for(
unsigned insam(0); insam < Samples_2l[sam].file.size(); insam++)
113 chain_2l[sam]->Add(Samples_2l[sam].
file[insam]);
121 TString minjets_2l(
""), midjets_2l(
"");
122 minjets_2l += (
minjets.Atoi()-1); midjets_2l += (
midjets.Atoi()-1);
123 TString fom(
"$Z_{\\rm bi}$");
126 if(
do_1b) outname.ReplaceAll(
"yields",
"yields_1b");
127 if(
do_2l) outname.ReplaceAll(
"yields",
"yields_2l");
128 if(
do_zbi) outname.ReplaceAll(
"yields",
"yields_zbi");
130 TString baseline(
"ht>450&&met>200");
131 TString cuts_1l(baseline+
"&&(nmus+nels)==1&&nbm>=1&&njets>="+
minjets+
"");
132 TString cuts_1l1b(baseline+
"&&(nmus+nels)==1&&nbm==1&&njets>="+
minjets+
"");
133 TString cuts_2l(
"ht>450&&met>200&&(nmus+nels)==2&&njets>="+minjets_2l+
"");
134 TString cuts_2lbb(
"ht>500&&met>200&&(nmus+nels)==2&&njets>="+minjets_2l+
"");
135 TString cuts_1ltex(
"$H_T>450, \\mathrm{MET}>200, n_{\\rm jets}\\geq "+
minjets+
", n_b\\geq1, n_{\\rm lep}=1$");
136 TString cuts_1l1btex(
"$H_T>450, \\mathrm{MET}>200, n_{\\rm jets}\\geq "+
minjets+
", n_b=1, n_{\\rm lep}=1$");
137 TString cuts_2ltex(
"$H_T>450, \\mathrm{MET}>200, n_{\\rm jets}\\geq "+minjets_2l+
", n_{\\rm lep}=2$");
138 TString cuts_2lbbtex(
"$H_T>450, \\mathrm{MET}>200, n_{\\rm jets}\\geq "+minjets_2l+
", n_{\\rm lep}=2$");
140 cuts_1l.ReplaceAll(
"nbm>=2",
"nbm==1");
141 cuts_1ltex.ReplaceAll(
"n_b\\geq 2",
"n_b=1");
143 ifstream header(
"txt/header.tex");
144 ifstream footer(
"txt/footer.tex");
145 ofstream
file(outname);
146 file<<header.rdbuf();
147 file<<
"\\vspace{80 mm}\n";
148 file <<
"\n\\begin{tabular}[tbp!]{ l | ";
149 for(
unsigned sam(0); sam < Samples.size()-nsig; sam++) file <<
"r";
151 for(
int sam(0); sam < nsig; sam++) file<<
"| r ";
152 file<<
"}\\hline\\hline\n";
153 file <<
" \\multicolumn{1}{c|}{${\\cal L} = "<<
luminosity<<
"$ fb$^{-1}$} ";
154 for(
unsigned sam(0); sam < Samples.size()-nsig; sam++)
155 file <<
" & "<<Samples[sam].label;
156 file<<
" & MC bkg. ";
157 for(
unsigned sam(Samples.size()-nsig); sam < Samples.size(); sam++)
158 file <<
" & "<<Samples[sam].label;
159 file <<
"\\\\ \\hline \n ";
161 TString mtcut, mjcut;
162 TString indent(
"\\hspace{5 mm} ");
164 vector<TString> binnames;
165 for(
unsigned bin(1); bin <= 6; bin++)
166 if(
do_note) binnames.push_back(
"");
168 TString name(
"Bin "); name += bin; name +=
": ";
169 binnames.push_back(name);
171 TString higjets(
""); higjets += (
midjets.Atoi()+1);
172 TString lownj(
"$n_j\\leq "+
midjets+
"$");
173 TString hignj(
"$n_j\\geq "+higjets+
"$");
174 TString lownj_2l(
"$n_j\\leq "+midjets_2l+
"$");
175 TString higjets_2l(
""); higjets_2l += (midjets_2l.Atoi()+1);
176 TString hignj_2l(
"$n_j\\geq "+higjets_2l+
"$");
177 TString lowmet(
"$\\text{MET}\\leq "+highmet+
"$");
178 TString higmet(
"$\\text{MET}> "+highmet+
"$");
180 if(
do_1b) letter =
"B";
181 if(
do_2l) letter =
"D";
185 TString onelineyields[4];
186 for(
int ind(0); ind<4; ind++) {regions[ind] = letter; regions[ind] += (ind+1);}
189 file <<
" \\multicolumn{"<< Samples.size()+1<<
"}{c}{"<< cuts_1ltex <<
"} \\\\ \\hline \\hline\n";
191 mjcut=
"mj<="+
mjthresh; mtcut=
"mt<=140";
192 onelineyields[0] =
YieldsCut(regions[0]+
": $m_T \\leq 140,M_J\\leq "+
mjthresh+
"$", mjcut+
"&&"+mtcut+
"&&"+cuts_1l, chain, Samples, nsig);
193 file << onelineyields[0];
196 mjcut=
"mj>"+
mjthresh; mtcut=
"mt<=140";
197 onelineyields[1] =
YieldsCut(regions[1]+
": $m_T \\leq 140,M_J> "+
mjthresh+
"$", mjcut+
"&&"+mtcut+
"&&"+cuts_1l, chain, Samples, nsig);
198 file << onelineyields[1];
201 mjcut=
"mj<="+
mjthresh; mtcut=
"mt>140";
202 onelineyields[2] =
YieldsCut(regions[2]+
": $m_T > 140,M_J \\leq "+
mjthresh+
"$", mjcut+
"&&"+mtcut+
"&&"+cuts_1l, chain, Samples, nsig);
203 file << onelineyields[2];
206 mjcut=
"mj>"+
mjthresh; mtcut=
"mt>140";
207 onelineyields[3] =
YieldsCut(regions[3]+
": $m_T > 140,M_J > "+
mjthresh+
"$", mjcut+
"&&"+mtcut+
"&&"+cuts_1l, chain, Samples, nsig);
208 file << onelineyields[3];
214 Ndata[0] =
GetNdata(onelineyields[0], 0);
215 Ndata[1] =
GetNdata(onelineyields[1], 0);
216 Ndata[2] =
GetNdata(onelineyields[2], 0);
217 Ndata[3] =
GetNdata(onelineyields[3], 0);
218 Nmc[0] =
GetNdata(onelineyields[0], 1);
219 Nmc[1] =
GetNdata(onelineyields[1], 1);
220 Nmc[2] =
GetNdata(onelineyields[2], 1);
221 Nmc[3] =
GetNdata(onelineyields[3], 1);
223 cout << Ndata[0] <<
" " << Ndata[1] <<
" " << Ndata[2] <<
" " << Ndata[3] << endl;
224 cout << Nmc[0] <<
" " << Nmc[1] <<
" " << Nmc[2] <<
" " << Nmc[3] << endl;
227 float kappa = (Nmc[3]/Nmc[2])/(Nmc[1]/Nmc[0]);
229 vector<vector<float> > entries, weights;
230 for(
int i=0; i<4; i++){
232 if(i<3) tmp.push_back(Ndata[i]);
233 else tmp.push_back(1);
234 vector<float> tmpweights;
235 tmpweights.push_back(1);
237 entries.push_back(tmp);
238 weights.push_back(tmpweights);
240 vector<float> powersk; powersk.push_back(-1); powersk.push_back(1); powersk.push_back(1);
241 float mSigma, pSigma;
242 float kappaData =
calcKappa(entries, weights, powersk, mSigma, pSigma,
true,
true);
244 cout <<
"MC : " << kappa << endl;
245 cout <<
"Data : " << kappaData <<
" " << mSigma <<
" " << pSigma << endl;
247 cout <<
"Precition : " << kappa*kappaData <<
" +" << kappa*pSigma <<
" -" << kappa*mSigma << endl;
249 file <<
"Data driven prediction & \\multicolumn{"<<Samples.size()-1 <<
"}{c}{" << Form(
"$%.1f^{+%.1f}_{-%.1f}$", kappa*kappaData, kappa*pSigma, kappa*mSigma) <<
"} \\\\ \n";
252 file <<
"\\hline \\hline\\multicolumn{"<< Samples.size()+1<<
"}{c}{" 253 <<cuts_2ltex <<
"} \\\\ \\hline \\hline\n";
256 onelineyields[2] =
YieldsCut(
"D3: $M_J \\leq "+
mjthresh+
"$",
"mj <= "+
mjthresh+
"&&"+cuts_2l, chain_2l, Samples_2l, nsig);
257 file << onelineyields[2];
263 file << onelineyields[3];
267 Ndata[2] =
GetNdata(onelineyields[2], 0);
268 Ndata[3] =
GetNdata(onelineyields[3], 0);
269 Nmc[2] =
GetNdata(onelineyields[2], 1);
270 Nmc[3] =
GetNdata(onelineyields[3], 1);
272 cout << Ndata[0] <<
" " << Ndata[1] <<
" " << Ndata[2] <<
" " << Ndata[3] << endl;
273 cout << Nmc[0] <<
" " << Nmc[1] <<
" " << Nmc[2] <<
" " << Nmc[3] << endl;
276 kappa = (Nmc[3]/Nmc[2])/(Nmc[1]/Nmc[0]);
278 entries.pop_back(); entries.pop_back();
279 weights.pop_back(); weights.pop_back();
280 for(
int i=2; i<4; i++){
282 if(i<3) tmp.push_back(Ndata[i]);
283 else tmp.push_back(1);
284 vector<float> tmpweights;
285 tmpweights.push_back(1);
287 entries.push_back(tmp);
288 weights.push_back(tmpweights);
290 kappaData =
calcKappa(entries, weights, powersk, mSigma, pSigma,
true,
true);
292 cout <<
"MC : " << kappa << endl;
293 cout <<
"Data : " << kappaData <<
" " << mSigma <<
" " << pSigma << endl;
295 file <<
"Data driven prediction & \\multicolumn{"<<Samples.size()-1 <<
"}{c}{" << Form(
"$%.1f^{+%.1f}_{-%.1f}$", kappa*kappaData, kappa*pSigma, kappa*mSigma) <<
"} \\\\ \n";
297 file <<
"\\hline\\multicolumn{1}{c|}{} ";
298 for(
unsigned sam(0); sam < Samples.size()-nsig; sam++)
299 file <<
" & "<<Samples[sam].label;
300 file<<
" & MC bkg. ";
301 for(
unsigned sam(Samples.size()-nsig); sam < Samples.size(); sam++)
302 file <<
" & "<<Samples[sam].label;
305 file<<
"\\hline\\hline\n\\end{tabular}"<<endl<<endl;
306 file<<footer.rdbuf();
308 cout<<endl<<
"Written "<<outname<<endl;
311 TString
YieldsCut(TString title, TString cuts, vector<TChain*> chain, vector<sfeats> Samples,
int nsig){
312 TString totCut, Hname =
"histo", out;
313 vector<double> yield, error;
314 double bkg(0), bkg_err(0), err, yield_sam;
315 int nsam(chain.size()), entries(0);
316 for(
int sam(0); sam < nsam; sam++){
317 if(Samples[sam].label.Contains(
"Data")) totCut =
"("+cuts+
"&&"+Samples[sam].cut+
")";
318 else totCut =
luminosity+
"*weight*("+cuts+
"&&"+Samples[sam].cut+
")";
319 entries =
getYieldErr(*chain[sam], totCut, yield_sam, err);
320 yield.push_back(yield_sam);
321 error.push_back(err);
323 if(!Samples[sam].label.Contains(
"Data"))
325 if(yield[sam]>0) bkg += yield[sam];
326 bkg_err = sqrt(pow(bkg_err,2)+pow(err,2));
329 cout<<sam<<
": yield "<<Samples[sam].label<<
" "<<yield[sam]<<
", n "<<entries<<
" \t "<<totCut<<endl;
334 for(
int sam(0); sam < nsam-nsig; sam++) out += (
" \t & " +
RoundNumber(yield[sam],1));
336 for(
int sam(nsam-nsig); sam < nsam; sam++) {
337 float fracerr(sqrt(pow(bkg_err/bkg,2)+0.3*0.3+0.24*0.24));
343 cout<<
RoundNumber(RooStats::NumberCountingUtils::BinomialExpZ(yield[sam], bkg, fracerr),2);
353 TObjArray* tokens = oneline.Tokenize(
"&");
354 TString Ndata_str(dynamic_cast<TObjString *>(tokens->At(index))->GetString());
357 if(!doMC)
return atof(Ndata_str);
359 TObjArray* tokensMC = Ndata_str.Tokenize(
" ");
360 TString Nmc_str(dynamic_cast<TObjString *>(tokensMC->At(0))->GetString());
362 Nmc_str.ReplaceAll(
"$",
"");
363 return atof(Nmc_str);
long getYieldErr(TChain &tree, TString cut, double &yield, double &uncertainty)
TString ntuple_date("2015_05_25")
TString YieldsCut(TString title, TString cuts, vector< TChain * > chain, vector< sfeats > Samples, int nsig)
TString RoundNumber(double num, int decimals, double denom=1.)
float GetNdata(TString oneline, bool doMC)
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)