ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/WZStudy.C
Revision: 1.10
Committed: Fri Apr 26 06:56:58 2013 UTC (12 years ago) by buchmann
Content type: text/plain
Branch: MAIN
CVS Tags: HEAD
Changes since 1.9: +30 -17 lines
Log Message:
- Using dedicated sample collection (SingleLeptonData) to avoid confusion
- Added luminosity cross-checks (to make sure SingleLeptonData is complete)
- Adapted mT cut from 50 to 40 GeV
- Enforce Trigger matching (tri_MatchFound), and use weights (96% for SingleMu, 90% for SingleElectron)

File Contents

# User Rev Content
1 buchmann 1.1 #include <iostream>
2     #include <vector>
3     #include <sys/stat.h>
4    
5     #include <TCut.h>
6     #include <TROOT.h>
7     #include <TCanvas.h>
8     #include <TMath.h>
9     #include <TColor.h>
10     #include <TPaveText.h>
11     #include <TRandom.h>
12     #include <TH1.h>
13     #include <TH2.h>
14     #include <TF1.h>
15     #include <TSQLResult.h>
16     #include <TProfile.h>
17     #include <TLegendEntry.h>
18    
19     using namespace std;
20    
21 buchmann 1.4 namespace TriLeptons {
22     float Rsfof_CorrectionFactor=-1;
23     float Rsfof_CorrectionFactor_Error=-1;
24     }
25    
26 buchmann 1.3 string IdentifierForUnderlinedEntry(string Entry) {
27     if(Contains(Entry,"t_bar_t__")) return "ttbar";
28     if(Contains(Entry,"Single_top__")) return "SingleTop";
29     if(Contains(Entry,"W_Jets__")) return "W+Jets";
30     if(Contains(Entry,"WZ__")) return "WZ";
31     if(Contains(Entry,"Z_Jets")) return "Z+Jets";
32     if(Contains(Entry,"DATA")) return "Data";
33     if(Contains(Entry,"2l2q_")) return "ZZ->2l2q";
34     if(Contains(Entry,"4l_")) return "ZZ->4l";
35     return Entry;
36     }
37 buchmann 1.2
38 buchmann 1.3 void WZ_kin_plot(string variable, int nbins, float min, float high, string xlabel, TCut cut, string saveas) {
39 buchmann 1.1 TCanvas *can = new TCanvas("can","can");
40     TPad *pad = new TPad("pad","pad",0,0,1,1);
41     pad->cd();
42    
43 buchmann 1.3 THStack stack = allsamples.DrawStack("stack",variable,nbins,min,high,xlabel, "events", cut,mc, luminosity);
44 buchmann 1.10 TH1F *hdata = SingleLeptonData.Draw("hdata",variable,nbins,min,high,xlabel, "events", cut,data, luminosity);
45 buchmann 1.4
46     float StackMax=CollapseStack(stack)->GetMaximum();
47     if(StackMax>hdata->GetMaximum()) hdata->SetMaximum(1.2*StackMax);
48 buchmann 1.3 hdata->Draw("e1");
49 buchmann 1.6 stack.Draw("histo,same");
50 buchmann 1.3 hdata->Draw("e1,same");
51 buchmann 1.4
52 buchmann 1.1 TLegend *kinleg = allsamples.allbglegend();
53     kinleg->Draw();
54     DrawPrelim();
55    
56 buchmann 1.3 float total=0;
57     float wz=0;
58 buchmann 1.10 // cout << "Numbers with variable " << variable << " and cut " << cut << ": " << endl;
59 buchmann 1.3 TIter nextSF = TIter(stack.GetHists());
60 buchmann 1.1 TH1F *h;
61 buchmann 1.3 stringstream spurity;
62     int bracecounter=0;
63    
64    
65 buchmann 1.1 while ( h = (TH1F*)nextSF() ) {
66 buchmann 1.10 // cout << IdentifierForUnderlinedEntry(h->GetName()) << " : " << h->Integral() << endl;
67 buchmann 1.3 if(IdentifierForUnderlinedEntry(h->GetName())=="WZ") {
68     wz+=h->Integral();
69     total+=h->Integral();
70     } else {
71     if(IdentifierForUnderlinedEntry(h->GetName())!="Data") total+=h->Integral();
72     }
73     bracecounter++;
74     spurity << "#splitline{" << IdentifierForUnderlinedEntry(h->GetName()) << " : " << h->Integral() << "}{";
75 buchmann 1.1 }
76 buchmann 1.3
77 buchmann 1.4 spurity << "#splitline{Purity: " << wz/total << "}{N(events): " << total << "}";
78 buchmann 1.3 for(int i=0;i<bracecounter;i++) spurity << "}";
79    
80     TPaveText *PurityPaveText = new TPaveText(0.60, 0.40,0.89, 0.6,"blNDC");
81     PurityPaveText->SetFillStyle(4000);
82     PurityPaveText->SetBorderSize(0);
83     PurityPaveText->SetFillColor(kWhite);
84     PurityPaveText->SetTextFont(42);
85     PurityPaveText->SetTextSize(0.021);
86     PurityPaveText->AddText(spurity.str().c_str());
87 buchmann 1.9 //PurityPaveText->Draw();
88 buchmann 1.1
89    
90 buchmann 1.3 // TText *purity = new TText(0.8,0.6,spurity.str().c_str());
91     // purity->Draw();
92 buchmann 1.10 // cout << "DATA : " << hdata->Integral() << endl;
93 buchmann 1.1
94 buchmann 1.8 Save_With_Ratio(hdata,stack,pad->cd(),"WZ_study/"+saveas);
95    
96     float sumData=0;
97     float sumMC=0;
98     TH1F *cstack = CollapseStack(stack);
99    
100     for(int i=1;i<=hdata->GetNbinsX();i++) {
101     if(hdata->GetBinCenter(i)>=20 && hdata->GetBinCenter(i)<=70) {
102     sumData+=hdata->GetBinContent(i);
103     sumMC+=cstack->GetBinContent(i);
104     }
105     }
106     delete cstack;
107     cout << " [20,70] for " << saveas << " : " << sumData << " (data) vs " << sumMC << " (mc) " << endl;
108    
109 buchmann 1.10 CleanLegends();
110 buchmann 1.3 delete hdata;
111     delete can;
112     }
113    
114 buchmann 1.4 void SF_vs_OF_plots(string variable, int nbins, float min, float high, string xlabel, TCut cut, TCut sf, TCut of, int mcordata, string saveas) {
115     TCanvas *can = new TCanvas("can","can");
116     TPad *pad = new TPad("pad","pad",0,0,1,1);
117     pad->cd();
118    
119     TLegend *kinleg = make_legend();
120     if(mcordata==data) kinleg->SetHeader("Data");
121     else kinleg->SetHeader("MC");
122    
123 buchmann 1.10 TH1F *sfdata;
124     TH1F *ofdata;
125    
126     if(mcordata==data) {
127     ofdata = SingleLeptonData.Draw("ofdata",variable,nbins,min,high,xlabel, "events", cut&&of,mcordata, luminosity);
128     sfdata = SingleLeptonData.Draw("sfdata",variable,nbins,min,high,xlabel, "events", cut&&sf,mcordata, luminosity);
129     } else {
130     ofdata = allsamples.Draw("ofdata",variable,nbins,min,high,xlabel, "events", cut&&of,mcordata, luminosity);
131     sfdata = allsamples.Draw("sfdata",variable,nbins,min,high,xlabel, "events", cut&&sf,mcordata, luminosity);
132     }
133 buchmann 1.4
134     float OFmax=ofdata->GetMaximum();
135     if(OFmax>sfdata->GetMaximum()) sfdata->SetMaximum(1.2*OFmax);
136     ofdata->SetLineColor(kRed);
137     sfdata->Draw("e1");
138     ofdata->Draw("histo,same");
139     sfdata->Draw("e1,same");
140    
141     kinleg->AddEntry(sfdata,"Same flavor","p");
142     kinleg->AddEntry(ofdata,"Opposite flavor","l");
143     kinleg->Draw();
144     if(mcordata==data) DrawPrelim();
145     else DrawMCPrelim();
146    
147 buchmann 1.8 Save_With_Ratio(sfdata,ofdata,pad->cd(),"WZ_study/SF_vs_OF_plots/"+saveas);
148 buchmann 1.4 delete sfdata;
149     delete ofdata;
150     delete can;
151     }
152    
153 buchmann 1.3 void write_report(TCut BasicCut, TCut cut, ofstream &report) {
154     THStack stack = allsamples.DrawStack("stack","tri_mll",10,0,1000,"m_{ll}", "events", BasicCut&&cut,mc, luminosity);
155     float total=0;
156     float wz=0;
157     TIter nextSF = TIter(stack.GetHists());
158     TH1F *h;
159 buchmann 1.1 while ( h = (TH1F*)nextSF() ) {
160 buchmann 1.3 cout << IdentifierForUnderlinedEntry(h->GetName()) << " : " << h->Integral() << endl;
161     if(IdentifierForUnderlinedEntry(h->GetName())=="WZ") {
162     wz+=h->Integral();
163     total+=h->Integral();
164     } else {
165     if(IdentifierForUnderlinedEntry(h->GetName())!="Data") total+=h->Integral();
166     }
167     report << h->Integral() << ";";
168     }
169     report << wz/total << ";\n";
170     report << flush;
171    
172     }
173    
174 buchmann 1.4 vector<string> producecuts(string variablename, float cut1, float cut2, float cut3=-1, float cut4=-1, float cut5=-1, float cut6=-1, float cut7=-1, float cut8=-1, float cut9=-1, float cut10=-1, float cut11=-1 ) {
175     float allcuts[12] = {cut1,cut2,cut3,cut4,cut5,cut6,cut7,cut8,cut9,cut10,cut11};
176 buchmann 1.3 vector<string> cuts;
177 buchmann 1.4 for(int i = 0; i < 11; ++i ) {
178 buchmann 1.3 if(allcuts[i]<0) continue;
179     stringstream nowcut;
180     nowcut << variablename << allcuts[i];
181     cuts.push_back(nowcut.str());
182     }
183     return cuts;
184     }
185    
186    
187     void OptimizeSelection(TCut BasicCut) {
188     ofstream report;
189     report.open ("report3.txt");
190    
191 buchmann 1.4 vector<string> mt = producecuts("tri_mT>",0,10,15,20,25,30,35,40,45,50);
192 buchmann 1.3 vector<string> et = producecuts("met[4]>",0,10,20,30,40,50);
193 buchmann 1.4 vector<string> mll = producecuts("abs(tri_mll-91.2)<",10000,5,10,15,20);
194     vector<string> mlll = producecuts("abs(tri_mlll-91)>",0,5,10,15,20,25,30,40,50);
195 buchmann 1.3
196     for(int imt=0;imt<mt.size();imt++) {
197     for(int iet=0;iet<et.size();iet++) {
198     for(int imll=0;imll<mll.size();imll++) {
199     for(int imlll=0;imlll<mlll.size();imlll++) {
200     stringstream cut;
201     cut << mt[imt] << " && " << et[iet] << " && " << mll[imll] << " && " << mlll[imlll];
202     report << mt[imt] << ";" << et[iet] << ";" << mll[imll] << ";" << mlll[imlll] <<";";
203     // cout << "Cut is : " << cut.str() << endl;
204     write_report(BasicCut, TCut(cut.str().c_str()),report);
205     }
206     }
207     }
208 buchmann 1.1 }
209 buchmann 1.3 report.close();
210     }
211    
212 buchmann 1.4 void SF_OF_comparison(TCut BasicCut, TCut Selection) {
213     int nbins=38;
214     float mll_low=10;
215     float mll_hi=200;
216    
217     // all MC samples
218     TH1F *sfmc = allsamples.Draw("sfmc" ,"tri_submll",nbins,mll_low,mll_hi,"m_{l_{2}l_{3}} [GeV]", "events", BasicCut&&Selection&&TriLepSF,mc , luminosity);
219     TH1F *ofmc = allsamples.Draw("ofmc" ,"tri_submll",nbins,mll_low,mll_hi,"m_{l_{2}l_{3}} [GeV]", "events", BasicCut&&Selection&&TriLepOF,mc , luminosity);
220    
221     TCanvas *can = new TCanvas("can","can");
222     TPad *pad = new TPad("pad","pad",0,0,1,1);
223     pad->cd();
224     if(ofmc->GetMaximum()>sfmc->GetMaximum()) sfmc->SetMaximum(1.3*ofmc->GetMaximum());
225     ofmc->SetLineColor(kRed);
226     TLegend *leg = make_legend();
227     leg->AddEntry(sfmc,"same flavor","P");
228     leg->AddEntry(ofmc,"opposite flavor","L");
229     leg->SetHeader("MC:");
230     sfmc->Draw("e1");
231     ofmc->Draw("histo,same");
232     sfmc->Draw("e1,same");
233     leg->Draw();
234     DrawMCPrelim();
235    
236 buchmann 1.8 Save_With_Ratio(sfmc,ofmc,pad->cd(),"WZ_study/OFSFcomparison_MC");
237 buchmann 1.4
238     // WZ only
239     TH1F *sfwz = allsamples.Draw("sfwz" ,"tri_submll",nbins,mll_low,mll_hi,"m_{l_{2}l_{3}} [GeV]", "events", BasicCut&&Selection&&TriLepSF,mc , luminosity,allsamples.FindSample("WZJetsTo3"));
240     TH1F *ofwz = allsamples.Draw("ofwz" ,"tri_submll",nbins,mll_low,mll_hi,"m_{l_{2}l_{3}} [GeV]", "events", BasicCut&&Selection&&TriLepOF,mc , luminosity,allsamples.FindSample("WZJetsTo3"));
241    
242     TPad *pad2 = new TPad("pad","pad",0,0,1,1);
243     pad2->cd();
244     if(ofwz->GetMaximum()>sfwz->GetMaximum()) sfwz->SetMaximum(1.3*ofwz->GetMaximum());
245     ofwz->SetLineColor(kRed);
246     sfwz->Draw("e1");
247     ofwz->Draw("histo,same");
248     sfwz->Draw("e1,same");
249     leg->SetHeader("WZ MC:");
250     leg->Draw();
251     DrawMCPrelim();
252    
253 buchmann 1.8 Save_With_Ratio(sfwz,ofwz,pad2->cd(),"WZ_study/OFSFcomparison_WZ");
254 buchmann 1.4
255     // data
256 buchmann 1.10 TH1F *sfdata = SingleLeptonData.Draw("sfdata","tri_submll",nbins,mll_low,mll_hi,"m_{l_{2}l_{3}} [GeV]", "events", BasicCut&&Selection&&TriLepSF,data, luminosity);
257     TH1F *ofdata = SingleLeptonData.Draw("ofdata","tri_submll",nbins,mll_low,mll_hi,"m_{l_{2}l_{3}} [GeV]", "events", BasicCut&&Selection&&TriLepOF,data, luminosity);
258 buchmann 1.4
259     TPad *pad3 = new TPad("pad","pad",0,0,1,1);
260     pad3->cd();
261     if(ofdata->GetMaximum()>sfdata->GetMaximum()) sfdata->SetMaximum(1.3*ofdata->GetMaximum());
262     ofdata->SetLineColor(kRed);
263     sfdata->Draw("e1");
264     ofdata->Draw("histo,same");
265     sfdata->Draw("e1,same");
266     leg->SetHeader("Data:");
267     leg->Draw();
268     DrawPrelim();
269    
270 buchmann 1.8 Save_With_Ratio(sfdata,ofdata,pad3->cd(),"WZ_study/OFSFcomparison_data");
271 buchmann 1.4
272     delete can;
273    
274     dout << "SF events: " << sfdata->Integral() << " (mc : " << sfmc->Integral() << " , wz : " << sfwz->Integral() << " ) WZ purity: " << 100*sfwz->Integral()/sfmc->Integral() << " %" << endl;
275     dout << "OF events: " << ofdata->Integral() << " (mc : " << ofmc->Integral() << " , wz : " << ofwz->Integral() << " ) WZ purity: " << 100*ofwz->Integral()/ofmc->Integral() << " %" << endl;
276    
277     dout << "RATIO : SF / OF = " << sfdata->Integral() / ofdata->Integral() << " +/- " << (sfdata->Integral()/ofdata->Integral()) * TMath::Sqrt(1/sfdata->Integral()+1/ofdata->Integral()) << " (stat) " << endl;
278    
279 buchmann 1.5 TriLeptons::Rsfof_CorrectionFactor=ofwz->Integral() / sfwz->Integral();
280 buchmann 1.6 TriLeptons::Rsfof_CorrectionFactor_Error=(ofwz->Integral()/sfwz->Integral()) * TMath::Sqrt(1/sfwz->GetEntries()+1/ofwz->GetEntries());
281 buchmann 1.9 delete sfdata;
282     delete ofdata;
283     delete sfwz;
284     delete ofwz;
285 buchmann 1.4
286     }
287    
288     void DrawMatchGenDistribution(string variable, int nbins, float low, float high, bool uselog, string xlabel, string SaveAs, TCut basecut) {
289     TLegend *leg = make_legend();
290     leg->SetY1(0.7);
291     TCanvas *can = new TCanvas("can","can");
292     TPad *pad = new TPad("pad","pad",0,0,1,1);
293     pad->cd();
294     pad->SetLogy(uselog);
295    
296     TCut IsMatch("(gentri_GoodWMatch&&gentri_GoodZMatch)");
297     TCut NoMatch("!(gentri_GoodWMatch&&gentri_GoodZMatch)");
298    
299     TH1F *goodMatch = allsamples.Draw("goodMatch",variable,nbins,low,high,xlabel,"events",basecut&&IsMatch,mc,luminosity,allsamples.FindSample("WZJetsTo3"));
300     TH1F *noMatch = allsamples.Draw("noMatch", variable,nbins,low,high,xlabel,"events",basecut&&NoMatch,mc,luminosity,allsamples.FindSample("WZJetsTo3"));
301    
302     noMatch->SetLineColor(TColor::GetColor("#FF0000"));//an evil red
303     goodMatch->SetLineColor(TColor::GetColor("#04B404")); // a nice green
304    
305     // noMatch->Scale(1.0/noMatch->Integral());
306     // goodMatch->Scale(1.0/goodMatch->Integral());
307    
308     if(noMatch->GetMaximum()>goodMatch->GetMaximum()) goodMatch->SetMaximum(1.3*noMatch->GetMaximum());
309    
310     goodMatch->Draw("histo");
311     noMatch->Draw("histo,same");
312    
313     leg->AddEntry(goodMatch,"correct match","l");
314     leg->AddEntry(noMatch,"incorrect match","l");
315     leg->Draw();
316    
317 buchmann 1.8 Save_With_Ratio(goodMatch,noMatch,pad->cd(),"WZ_study/GenMatchComparison/"+SaveAs);
318 buchmann 1.4
319     delete goodMatch;
320     delete noMatch;
321     delete can;
322     }
323    
324     void DrawMatchRecoDistribution(string variable, int nbins, float low, float high, bool uselog, string xlabel, string SaveAs, TCut basecut) {
325     TLegend *leg = make_legend();
326     leg->SetY1(0.7);
327     TCanvas *can = new TCanvas("can","can");
328     TPad *pad = new TPad("pad","pad",0,0,1,1);
329     pad->cd();
330     pad->SetLogy(uselog);
331    
332     TCut IsMatch("(tri_GoodWMatch&&tri_GoodZMatch)");
333     TCut NoMatch("!(tri_GoodWMatch&&tri_GoodZMatch)");
334    
335     TH1F *goodMatch = allsamples.Draw("goodMatch",variable,nbins,low,high,xlabel,"events",basecut&&IsMatch,mc,luminosity,allsamples.FindSample("WZJetsTo3"));
336     TH1F *noMatch = allsamples.Draw("noMatch", variable,nbins,low,high,xlabel,"events",basecut&&NoMatch,mc,luminosity,allsamples.FindSample("WZJetsTo3"));
337    
338     noMatch->SetLineColor(TColor::GetColor("#FF0000"));//an evil red
339     goodMatch->SetLineColor(TColor::GetColor("#04B404")); // a nice green
340    
341     // noMatch->Scale(1.0/noMatch->Integral());
342     // goodMatch->Scale(1.0/goodMatch->Integral());
343    
344     if(noMatch->GetMaximum()>goodMatch->GetMaximum()) goodMatch->SetMaximum(1.3*noMatch->GetMaximum());
345    
346     goodMatch->Draw("histo");
347     noMatch->Draw("histo,same");
348    
349     leg->AddEntry(goodMatch,"correct match","l");
350     leg->AddEntry(noMatch,"incorrect match","l");
351     leg->Draw();
352     DrawPrelim();
353    
354 buchmann 1.8 Save_With_Ratio(goodMatch,noMatch,pad->cd(),"WZ_study/RecoMatchComparison/"+SaveAs);
355 buchmann 1.4
356     delete goodMatch;
357     delete noMatch;
358     delete can;
359     }
360    
361     void GenSFOFCalculator(string title, TCut Cut) {
362     TH1F *histoSF = allsamples.Draw("histoSF","gentri_mll",1,0,1000,"processing","events",Cut&&TCut("abs(gentri_id2)==abs(gentri_id3)"),mc,luminosity,allsamples.FindSample("WZJetsTo3"));
363     TH1F *histoOF = allsamples.Draw("histoOF","gentri_mll",1,0,1000,"processing","events",Cut&&TCut("abs(gentri_id2)!=abs(gentri_id3)"),mc,luminosity,allsamples.FindSample("WZJetsTo3"));
364     cout << title << endl;
365     cout << " " << (const char*) Cut << endl;
366     cout << " SF: \t" << histoSF->Integral() << " +/- " << sqrt(histoSF->GetEntries())*(histoSF->Integral()/histoSF->GetEntries()) << endl;
367     cout << " OF: \t" << histoOF->Integral() << " +/- " << sqrt(histoOF->Integral())*(histoOF->Integral()/histoOF->GetEntries()) << endl;
368     cout << " SF/OF: \t" << histoSF->Integral() / histoOF->Integral() << " +/- " << histoSF->GetEntries() / histoOF->GetEntries() * sqrt(1.0/histoSF->GetEntries() + 1.0 / histoOF->GetEntries()) << endl;
369    
370     delete histoSF;
371     delete histoOF;
372     }
373    
374     void reco_SF_OF_comparison(TCut Base, TCut Selection) {
375    
376     bool dolog=true;
377     bool nolog=false;
378    
379     DrawMatchRecoDistribution("tri_mlll",60,0,300,dolog,"m_{lll}","TrileptonMass",Base);
380     DrawMatchRecoDistribution("tri_mll",60,0,300,dolog,"m_{l_{1}l_{2}}","LeadingDileptonMass",Base);
381     DrawMatchRecoDistribution("tri_mT",50,0,100,nolog,"m_{T}","MT",Base);
382     DrawMatchRecoDistribution("tri_submll",60,0,300,nolog,"m_{l_{2}l_{3}}","SubleadingDileptonMass",Base);
383     DrawMatchRecoDistribution("tri_submll",60,0,300,nolog,"m_{l_{2}l_{3}}","SubleadingDileptonMass_SF",Base&&TCut("abs(tri_id2)==abs(tri_id3)"));
384     DrawMatchRecoDistribution("tri_submll",60,0,300,nolog,"m_{l_{2}l_{3}}","SubleadingDileptonMass_OF",Base&&TCut("abs(tri_id2)!=abs(tri_id3)"));
385     DrawMatchRecoDistribution("genMET",60,0,300,dolog,"gen MET","MET",Base);
386     DrawMatchRecoDistribution("abs(tri_id1)",50,-0.5,49.5,nolog,"id(l_{1})","genID1",Base);
387     DrawMatchRecoDistribution("abs(tri_id2)",50,-0.5,49.5,nolog,"id(l_{2})","genID2",Base);
388     DrawMatchRecoDistribution("abs(tri_id3)",50,-0.5,49.5,nolog,"id(l_{3})","genID3",Base);
389     DrawMatchRecoDistribution("abs(tri_genMID1)",50,-0.5,49.5,nolog,"mother id(l_{1})","genMID1",Base);
390     DrawMatchRecoDistribution("abs(tri_genMID2)",50,-0.5,49.5,nolog,"mother id(l_{2})","genMID2",Base);
391     DrawMatchRecoDistribution("abs(tri_genMID3)",50,-0.5,49.5,nolog,"mother id(l_{3})","genMID3",Base);
392    
393     DrawMatchRecoDistribution("tri_mlll",60,0,300,dolog,"m_{lll}","FullSelection/TrileptonMass",Base&&Selection);
394     DrawMatchRecoDistribution("tri_mll",60,0,300,dolog,"m_{l_{1}l_{2}}","FullSelection/LeadingDileptonMass",Base&&Selection);
395     DrawMatchRecoDistribution("tri_mT",50,0,100,nolog,"m_{T}","FullSelection/MT",Base&&Selection);
396     DrawMatchRecoDistribution("tri_submll",60,0,300,nolog,"m_{l_{2}l_{3}}","FullSelection/SubleadingDileptonMass",Base&&Selection);
397     DrawMatchRecoDistribution("tri_submll",60,0,300,nolog,"m_{l_{2}l_{3}}","FullSelection/SubleadingDileptonMass_SF",Base&&TCut("abs(tri_id2)==abs(tri_id3)")&&Selection);
398     DrawMatchRecoDistribution("tri_submll",60,0,300,nolog,"m_{l_{2}l_{3}}","FullSelection/SubleadingDileptonMass_OF",Base&&TCut("abs(tri_id2)!=abs(tri_id3)")&&Selection);
399     DrawMatchRecoDistribution("genMET",60,0,300,dolog,"gen MET","FullSelection/MET",Base&&Selection);
400     DrawMatchRecoDistribution("abs(tri_id1)",50,-0.5,49.5,nolog,"id(l_{1})","FullSelection/genID1",Base&&Selection);
401     DrawMatchRecoDistribution("abs(tri_id2)",50,-0.5,49.5,nolog,"id(l_{2})","FullSelection/genID2",Base&&Selection);
402     DrawMatchRecoDistribution("abs(tri_id3)",50,-0.5,49.5,nolog,"id(l_{3})","FullSelection/genID3",Base&&Selection);
403     DrawMatchRecoDistribution("abs(tri_genMID1)",50,-0.5,49.5,nolog,"mother id(l_{1})","FullSelection/genMID1",Base&&Selection);
404     DrawMatchRecoDistribution("abs(tri_genMID2)",50,-0.5,49.5,nolog,"mother id(l_{2})","FullSelection/genMID2",Base&&Selection);
405     DrawMatchRecoDistribution("abs(tri_genMID3)",50,-0.5,49.5,nolog,"mother id(l_{3})","FullSelection/genMID3",Base&&Selection);
406     }
407    
408     void generator_SF_OF_comparison() {
409     /*we want to analyze the cuts at generator level (and their impact), plus understand how bad matching can affect the selection.
410     we want to know the distributions for correctly and incorrectly matched W/Z for the following variables:
411     - M_{lll}
412     - M_{ll}
413     - M_{T}
414     - M_{l_{2}l_{3}}
415     - MET
416     */
417     TCut genBase("genNleptons>=3 && gentri_pt1>30 && gentri_pt2>20 && gentri_pt3>20");
418     TCut genParticleBase("genNleptons>=3 && pgentri_pt1>30 && pgentri_pt2>20 && pgentri_pt3>20");
419    
420     TCut Selection("abs(gentri_mlll-91)>30 && genMET>30 && abs(gentri_mll-91)<10 && gentri_mT > 40");
421     TCut genParticleSelection("abs(pgentri_mlll-91)>30 && genMET>30 && abs(pgentri_mll-91)<10 && abs(pgentri_submll-91)>20 && pgentri_mT > 40");
422    
423     bool dolog=true;
424     bool nolog=false;
425    
426     DrawMatchGenDistribution("gentri_mlll",60,0,300,dolog,"m_{lll}","TrileptonMass",genBase);
427     DrawMatchGenDistribution("gentri_mll",60,0,300,dolog,"m_{l_{1}l_{2}}","LeadingDileptonMass",genBase);
428     DrawMatchGenDistribution("gentri_mT",50,0,100,nolog,"m_{T}","MT",genBase);
429     DrawMatchGenDistribution("gentri_submll",60,0,300,nolog,"m_{l_{2}l_{3}}","SubleadingDileptonMass",genBase);
430     DrawMatchGenDistribution("gentri_submll",60,0,300,nolog,"m_{l_{2}l_{3}}","SubleadingDileptonMass_SF",genBase&&TCut("abs(gentri_id2)==abs(gentri_id3)"));
431     DrawMatchGenDistribution("gentri_submll",60,0,300,nolog,"m_{l_{2}l_{3}}","SubleadingDileptonMass_OF",genBase&&TCut("abs(gentri_id2)!=abs(gentri_id3)"));
432     DrawMatchGenDistribution("genMET",60,0,300,dolog,"gen MET","MET",genBase);
433     DrawMatchGenDistribution("abs(gentri_id1)",50,-0.5,49.5,nolog,"id(l_{1})","genID1",genBase);
434     DrawMatchGenDistribution("abs(gentri_id2)",50,-0.5,49.5,nolog,"id(l_{2})","genID2",genBase);
435     DrawMatchGenDistribution("abs(gentri_id3)",50,-0.5,49.5,nolog,"id(l_{3})","genID3",genBase);
436     DrawMatchGenDistribution("abs(gentri_genMID1)",50,-0.5,49.5,nolog,"mother id(l_{1})","genMID1",genBase);
437     DrawMatchGenDistribution("abs(gentri_genMID2)",50,-0.5,49.5,nolog,"mother id(l_{2})","genMID2",genBase);
438     DrawMatchGenDistribution("abs(gentri_genMID3)",50,-0.5,49.5,nolog,"mother id(l_{3})","genMID3",genBase);
439    
440     DrawMatchGenDistribution("gentri_mlll",60,0,300,dolog,"m_{lll}","FullSelection/TrileptonMass",genBase&&Selection);
441     DrawMatchGenDistribution("gentri_mll",60,0,300,dolog,"m_{l_{1}l_{2}}","FullSelection/LeadingDileptonMass",genBase&&Selection);
442     DrawMatchGenDistribution("gentri_mT",50,0,100,nolog,"m_{T}","FullSelection/MT",genBase&&Selection);
443     DrawMatchGenDistribution("gentri_submll",60,0,300,nolog,"m_{l_{2}l_{3}}","FullSelection/SubleadingDileptonMass",genBase&&Selection);
444     DrawMatchGenDistribution("gentri_submll",60,0,300,nolog,"m_{l_{2}l_{3}}","FullSelection/SubleadingDileptonMass_SF",genBase&&TCut("abs(gentri_id2)==abs(gentri_id3)")&&Selection);
445     DrawMatchGenDistribution("gentri_submll",60,0,300,nolog,"m_{l_{2}l_{3}}","FullSelection/SubleadingDileptonMass_OF",genBase&&TCut("abs(gentri_id2)!=abs(gentri_id3)")&&Selection);
446     DrawMatchGenDistribution("genMET",60,0,300,dolog,"gen MET","FullSelection/MET",genBase&&Selection);
447     DrawMatchGenDistribution("abs(gentri_id1)",50,-0.5,49.5,nolog,"id(l_{1})","FullSelection/genID1",genBase&&Selection);
448     DrawMatchGenDistribution("abs(gentri_id2)",50,-0.5,49.5,nolog,"id(l_{2})","FullSelection/genID2",genBase&&Selection);
449     DrawMatchGenDistribution("abs(gentri_id3)",50,-0.5,49.5,nolog,"id(l_{3})","FullSelection/genID3",genBase&&Selection);
450     DrawMatchGenDistribution("abs(gentri_genMID1)",50,-0.5,49.5,nolog,"mother id(l_{1})","FullSelection/genMID1",genBase&&Selection);
451     DrawMatchGenDistribution("abs(gentri_genMID2)",50,-0.5,49.5,nolog,"mother id(l_{2})","FullSelection/genMID2",genBase&&Selection);
452     DrawMatchGenDistribution("abs(gentri_genMID3)",50,-0.5,49.5,nolog,"mother id(l_{3})","FullSelection/genMID3",genBase&&Selection);
453    
454     return;
455    
456    
457     GenSFOFCalculator("Basic selection",genBase);
458     GenSFOFCalculator("Basic selection, correct Z",genBase&&TCut("gentri_GoodZMatch"));
459     GenSFOFCalculator("Basic selection, wrong Z",genBase&&TCut("!gentri_GoodZMatch"));
460     GenSFOFCalculator("Outside |m_{23}-Z|<20",genBase&&TCut("abs(gentri_submll-91)>20"));
461     GenSFOFCalculator("Outside |m_{23}-Z|<20, Correct Z", genBase&&TCut("abs(gentri_submll-91)>20&&gentri_GoodZMatch"));
462     GenSFOFCalculator("Outside |m_{23}-Z|<20, Wrong Z", genBase&&TCut("abs(gentri_submll-91)>20&&!gentri_GoodZMatch"));
463     GenSFOFCalculator("Outside |m_{23}-Z|<20, Correct W", genBase&&TCut("abs(gentri_submll-91)>20&&gentri_GoodWMatch"));
464     GenSFOFCalculator("Outside |m_{23}-Z|<20, Wrong W", genBase&&TCut("abs(gentri_submll-91)>20&&!gentri_GoodWMatch"));
465     GenSFOFCalculator("Outside |m_{23}-Z|<20, Correct Z, correct W", genBase&&TCut("abs(gentri_submll-91)>20&&gentri_GoodZMatch&&gentri_GoodWMatch"));
466     GenSFOFCalculator("Outside |m_{23}-Z|<20, Wrong Z or W", genBase&&TCut("abs(gentri_submll-91)>20&&!(gentri_GoodZMatch&&gentri_GoodWMatch)"));
467     GenSFOFCalculator("Full selection, Correct Z and W", genBase&&Selection&&TCut("abs(gentri_submll-91)>20&&(gentri_GoodZMatch&&gentri_GoodWMatch)"));
468     GenSFOFCalculator("Full selection, Wrong Z or W", genBase&&Selection&&TCut("abs(gentri_submll-91)>20&&!(gentri_GoodZMatch&&gentri_GoodWMatch)"));
469     // GenSFOFCalculator("Full selection", genBase&&Selection);
470     // GenSFOFCalculator("Full selection with genParticles", genBase&&genParticleSelection&&TCut("abs(gentri_submll-91)>20"));
471    
472    
473     }
474    
475    
476     void AlgorithmTest(TCut BasicCut, TCut Selection) {
477     TCut Pure("tri_GoodWMatch && tri_GoodZMatch");
478    
479     int nbins=38;
480     float mll_low=10;
481     float mll_hi=200;
482    
483     TCanvas *can = new TCanvas("can","can");
484     TH1F *sfwz = allsamples.Draw("sfwz" ,"tri_submll",nbins,mll_low,mll_hi,"m_{l_{2}l_{3}} [GeV]", "events", BasicCut&&Selection&&TriLepSF,mc,luminosity,allsamples.FindSample("WZJetsTo3"));
485     TH1F *ofwz = allsamples.Draw("ofwz" ,"tri_submll",nbins,mll_low,mll_hi,"m_{l_{2}l_{3}} [GeV]", "events", BasicCut&&Selection&&TriLepOF,mc,luminosity,allsamples.FindSample("WZJetsTo3"));
486    
487     TH1F *sfwzpure = allsamples.Draw("sfwzpure","tri_submll",nbins,mll_low,mll_hi,"m_{l_{2}l_{3}} [GeV]", "events", BasicCut&&Selection&&TriLepSF&&Pure,mc,luminosity,allsamples.FindSample("WZJetsTo3"));
488     TH1F *ofwzpure = allsamples.Draw("ofwzpure","tri_submll",nbins,mll_low,mll_hi,"m_{l_{2}l_{3}} [GeV]", "events", BasicCut&&Selection&&TriLepOF&&Pure,mc,luminosity,allsamples.FindSample("WZJetsTo3"));
489    
490     delete can;
491    
492 buchmann 1.6 dout << "SF WZ events: " << sfwz->Integral() << " (correctly combined WZ: " << sfwzpure->Integral() << ")" << endl;
493     dout << "OF WZ events: " << ofwz->Integral() << " (correctly combined WZ: " << ofwzpure->Integral() << ")" << endl;
494 buchmann 1.4
495     dout << "RATIO : SF / OF = " << sfwz->Integral() / ofwz->Integral() << " +/- " << sfwz->Integral()/ofwz->Integral() * sqrt(1/sfwz->GetEntries() + 1/ofwz->GetEntries()) << endl;
496     dout << " PURE: SF / OF = " << sfwzpure->Integral() / ofwzpure->Integral() << " +/- " << sfwzpure->Integral()/ofwzpure->Integral() * sqrt(1/sfwzpure->GetEntries() + 1/ofwzpure->GetEntries()) << endl;
497     dout << "PURITY: " << endl;
498     dout << " SF : " << 100.0*sfwzpure->Integral()/sfwz->Integral() << " +/- " << 100.0*sfwzpure->Integral()/sfwz->Integral() * sqrt(1/sfwzpure->GetEntries() + 1/sfwz->GetEntries()) <<endl;
499     dout << " OF : " << 100.0*ofwzpure->Integral()/ofwz->Integral() << " +/- " << 100.0*ofwzpure->Integral()/ofwz->Integral() * sqrt(1/ofwzpure->GetEntries() + 1/ofwz->GetEntries()) <<endl;
500    
501    
502     delete sfwz;
503     delete ofwz;
504     delete sfwzpure;
505     delete ofwzpure;
506     }
507    
508     void GetResult(TCut BasicCut, TCut Selection) {
509     if(TriLeptons::Rsfof_CorrectionFactor<0 || TriLeptons::Rsfof_CorrectionFactor_Error<0) SF_OF_comparison(BasicCut,Selection);
510     int nbins=38;
511     float mll_low=10;
512     float mll_hi=200;
513    
514     TCanvas *can = new TCanvas("can","can");
515 buchmann 1.10 TH1F *sfwz = SingleLeptonData.Draw("sfwz" ,"tri_submll",nbins,mll_low,mll_hi,"m_{l_{2}l_{3}} [GeV]", "events", BasicCut&&Selection&&TriLepSF,data,luminosity);
516     TH1F *ofwz = SingleLeptonData.Draw("ofwz" ,"tri_submll",nbins,mll_low,mll_hi,"m_{l_{2}l_{3}} [GeV]", "events", BasicCut&&Selection&&TriLepOF,data,luminosity);
517 buchmann 1.4
518     delete can;
519    
520     dout << " ****** FINAL RESULT ****** " << endl;
521     dout << "SF events: " << sfwz->Integral() << " +/- " << sqrt(sfwz->Integral()) << endl;
522     dout << "OF events: " << ofwz->Integral() << " +/- " << sqrt(ofwz->Integral()) << endl;
523    
524 buchmann 1.6 dout << "Correction factor : " << TriLeptons::Rsfof_CorrectionFactor << " +/- " << TriLeptons::Rsfof_CorrectionFactor_Error << endl;
525    
526 buchmann 1.4 float rawstatuncert=sfwz->Integral()/ofwz->Integral() * sqrt(1/sfwz->GetEntries() + 1/ofwz->GetEntries());
527     float rawresult=sfwz->Integral() / ofwz->Integral();
528     dout << "UNCORRECTED RATIO : SF / OF = " << rawresult << " +/- " << rawstatuncert << endl;
529     dout << "CORRECTED RATIO : SF / OF = " << TriLeptons::Rsfof_CorrectionFactor * rawresult << " +/- " << (TriLeptons::Rsfof_CorrectionFactor * rawresult) * sqrt(rawstatuncert*rawstatuncert/(rawresult*rawresult) + ( TriLeptons::Rsfof_CorrectionFactor_Error * TriLeptons::Rsfof_CorrectionFactor_Error )/(TriLeptons::Rsfof_CorrectionFactor * TriLeptons::Rsfof_CorrectionFactor));
530    
531    
532     delete sfwz;
533     delete ofwz;
534     // delete can;
535     }
536    
537    
538     void PredictionFailurePlot(string truthvariable, string predictionvariable, int nbins, float min, float max, TCut PredictionCut, TCut TruthCut, string saveas, string xlabel) {
539     TLegend *leg = make_legend();
540     leg->SetY1(0.7);
541     TCanvas *can = new TCanvas("can","can");
542     TPad *pad = new TPad("pad","pad",0,0,1,1);
543     pad->cd();
544     // pad->SetLogy(1);
545    
546     TH1F *Prediction = allsamples.Draw("Prediction",predictionvariable,nbins,min,max,xlabel,"events",PredictionCut,mc,luminosity,allsamples.FindSample("WZJetsTo3"));
547     TH1F *MCTruth = allsamples.Draw("MCTruth", truthvariable, nbins,min,max,xlabel,"events",TruthCut ,mc,luminosity,allsamples.FindSample("WZJetsTo3"));
548    
549     Prediction->SetLineColor(TColor::GetColor("#FF0000"));//an evil red
550     MCTruth->SetLineColor(TColor::GetColor("#04B404")); // a nice green
551    
552     // if(Prediction->GetMaximum()>MCTruth->GetMaximum()) MCTruth->SetMaximum(1.3*Prediction->GetMaximum());
553    
554     if(MCTruth->GetMaximum()>Prediction->GetMaximum()) {
555     MCTruth->SetMaximum(MCTruth->GetMaximum()*1.2);
556     MCTruth->DrawNormalized("histo");
557     Prediction->DrawNormalized("histo,same");
558     } else {
559     Prediction->SetMaximum(Prediction->GetMaximum()*1.2);
560     Prediction->DrawNormalized("histo");
561     MCTruth->DrawNormalized("histo,same");
562     }
563    
564    
565     leg->AddEntry(Prediction,"prediction (norm.)","l");
566     leg->AddEntry(MCTruth,"MC truth (norm.)","l");
567     leg->Draw();
568     DrawMCPrelim();
569 buchmann 1.8 Save_With_Ratio(MCTruth,Prediction,pad->cd(),"WZ_study/PredictionMethodFailure/"+saveas);
570 buchmann 1.4
571     delete Prediction;
572     delete MCTruth;
573     delete can;
574    
575    
576    
577     }
578    
579     void WhyDoesThePredictionMethodFail(TCut PredictionCut, TCut TruthCut) {
580     PredictionFailurePlot("tri_submll","tri_badsubmll",50,0,200,PredictionCut,TruthCut,"SubMll","m_{23}");
581     PredictionFailurePlot("tri_mT","tri_badmT",50,0,200,PredictionCut,TruthCut,"MT","m_{T}");
582     PredictionFailurePlot("tri_mll","tri_badmll",25,0,200,PredictionCut,TruthCut,"Mll","m_{12}");
583     }
584    
585    
586     void ComputeNewMiscombinationRate(TCut origSelection, TCut sBasicCut) {
587     TCanvas *can = new TCanvas("can","can");
588    
589     string sSelection= (const char*)origSelection;
590     sSelection= ReplaceAll(sSelection,"tri_","tri_bad");
591     sSelection= ReplaceAll(sSelection,"tri_badmlll","tri_mlll");
592     cout << "modified " << (const char*)origSelection << " to " << sSelection << endl;
593    
594     TCut FlavorBlindSelection((sSelection+(string)"&&(abs(tri_id2)!=abs(tri_id3))").c_str()); // making sure we select OF events
595     TCut CorrectSelection (origSelection && TCut("(abs(tri_id2)!=abs(tri_id3))")); // making sure we select OF events
596     TCut OFZ ("tri_mll!=tri_badmll");
597    
598     TH1F *WZ_OF_OFZ = allsamples.Draw("WZ_OFZ" ,"tri_badsubmll",1,0.0,1000.0,"m_{l_{2}l_{3}} [GeV]", "events", FlavorBlindSelection&&OFZ ,mc,luminosity,allsamples.FindSample("WZJetsTo3"));
599     TH1F *WZ_OF_any = allsamples.Draw("WZ_OF_any" ,"tri_badsubmll",1,0.0,1000.0,"m_{l_{2}l_{3}} [GeV]", "events", FlavorBlindSelection ,mc,luminosity,allsamples.FindSample("WZJetsTo3"));
600    
601 buchmann 1.10 TH1F *data_OF_OFZ = SingleLeptonData.Draw("data_OFZ" ,"tri_badsubmll",1,0.0,1000.0,"m_{l_{2}l_{3}} [GeV]", "events", FlavorBlindSelection&&OFZ ,data,luminosity);
602     TH1F *data_OF_any = SingleLeptonData.Draw("data_OF_any" ,"tri_badsubmll",1,0.0,1000.0,"m_{l_{2}l_{3}} [GeV]", "events", FlavorBlindSelection ,data,luminosity);
603 buchmann 1.5
604 buchmann 1.6 dout << "Miscombination rate in WZ sample with selection in place : " << 100 * WZ_OF_OFZ->Integral() / WZ_OF_any->Integral() << " +/- " << 100*(WZ_OF_OFZ->Integral() / WZ_OF_any->Integral())* sqrt( 1.0/WZ_OF_OFZ->GetEntries() + 1.0/WZ_OF_any->GetEntries())<< " % (" << WZ_OF_OFZ->Integral() << " / " << WZ_OF_any->Integral() << ")" << endl;
605     dout << "Miscombination rate in DATA with selection in place : " << 100 * data_OF_OFZ->Integral() / data_OF_any->Integral() << " +/- " << 100*(data_OF_OFZ->Integral() / data_OF_any->Integral()) * sqrt( 1.0/data_OF_OFZ->Integral() + 1.0/data_OF_any->Integral() ) << " % (" << data_OF_OFZ->Integral() << " / " << data_OF_any->Integral() << ")" << endl;
606 buchmann 1.4
607     delete WZ_OF_any;
608     delete WZ_OF_OFZ;
609     delete can;
610     }
611    
612     void ComputeMiscombinationRate(TCut origSelection, TCut sBasicCut) {
613     /* TCanvas *can = new TCanvas("can","can");
614     //idea: use the flavor-blind version of the algorithm to obtain the yields in our signal region.
615     string sSelection= (const char*)origSelection;
616     sSelection= ReplaceAll(sSelection,"tri_","tri_bad");
617     sSelection= ReplaceAll(sSelection,"tri_badmlll","tri_mlll");
618     cout << "modified " << (const char*)origSelection << " to " << sSelection << endl;
619    
620     TCut BadSelection((sSelection+(string)"&&abs(tri_id2)!=abs(tri_id3)").c_str()); // making sure we select OF events
621     TCut GoodSelection(origSelection && TCut("abs(tri_id2)!=abs(tri_id3)")); // making sure we select OF events
622    
623     TCut BasicCut(sBasicCut&&TCut("tri_id2!=tri_id3"));
624    
625     TCut TruthBad("!(tri_GoodZMatch&&tri_GoodZMatch)");
626     TCut MethodBad("!(tri_id2==tri_badid2&&tri_id3==tri_badid3)");
627    
628     for(int icut=0;icut<2;icut++) {
629     TCut Goodused;
630     TCut Badused;
631     if(icut==0) {
632     Goodused=BasicCut;
633     Badused =BasicCut;
634     cout << "Preselection only: " << endl;
635     cout << " used : " << (const char*) Goodused << endl;
636     } else {
637     Goodused=BasicCut&&GoodSelection;
638     Badused =BasicCut&&BadSelection;
639     cout << "Full selection: " << endl;
640     cout << " Good used : " << (const char*) Goodused << endl;
641     cout << " Bad used : " << (const char*) Goodused << endl;
642     }
643    
644     TH1F *Truth_badcomb = allsamples.Draw("Truth_badcomb" ,"tri_submll",1,0.0,1000.0,"m_{l_{2}l_{3}} [GeV]", "events", Goodused ,mc,luminosity,allsamples.FindSample("WZJetsTo3"));
645     TH1F *Truth_all = allsamples.Draw("Truth_all" ,"tri_submll",1,0.0,1000.0,"m_{l_{2}l_{3}} [GeV]", "events", Goodused ,mc,luminosity,allsamples.FindSample("WZJetsTo3"));
646    
647     TH1F *Events_WZ = allsamples.Draw("Events_WZ" ,"tri_submll",1,0.0,1000.0,"m_{l_{2}l_{3}} [GeV]", "events", Goodused ,mc,luminosity,allsamples.FindSample("WZJetsTo3"));
648     TH1F *bad_WZ = allsamples.Draw("bad_WZ" ,"tri_submll",1,0.0,1000.0,"m_{l_{2}l_{3}} [GeV]", "events", Goodused&&TruthBad ,mc,luminosity,allsamples.FindSample("WZJetsTo3"));
649     TH1F *MethodBad_WZ = allsamples.Draw("MethodBad_WZ" ,"tri_submll",1,0.0,1000.0,"m_{l_{2}l_{3}} [GeV]", "events", Badused&&MethodBad,mc,luminosity,allsamples.FindSample("WZJetsTo3"));
650     TH1F *MethodBad_WZg= allsamples.Draw("MethodBad_WZg","tri_submll",1,0.0,1000.0,"m_{l_{2}l_{3}} [GeV]", "events", Badused,mc,luminosity,allsamples.FindSample("WZJetsTo3"));
651    
652     cout << " ********** WZ **********" << endl;
653     cout << " N events : " << Events_WZ->Integral() << "\t (mc events: " << Events_WZ->GetEntries() << ")" << endl;
654     cout << " Bad combinations: " << bad_WZ->Integral() << "\t (mc events: " << bad_WZ->GetEntries() << ")" << endl;
655     cout << " Predicted bad com.: " << MethodBad_WZ->Integral() << " / " << MethodBad_WZg->Integral() << "\t (mc events: " << MethodBad_WZ->GetEntries() << ")" << endl;
656    
657    
658     delete Events_WZ;
659     delete bad_WZ;
660     delete MethodBad_WZ;
661     delete MethodBad_WZg;
662     }
663     delete can;
664    
665     WhyDoesThePredictionMethodFail(BasicCut&&MethodBad,BasicCut&&TruthBad);
666     */
667     }
668    
669    
670    
671    
672 buchmann 1.3 void CarryOutWZStudy() {
673 buchmann 1.10
674     WZ_kin_plot("mll",40,0,200,"m_{Z} [GeV]",TCut("id1==id2 && pfJetGoodNum40>=3 && abs(mll-91.2)<20 && pt1>30 && pt2>20 && abs(eta1)<2.4 && abs(eta2)<2.4"),"Crosscheck_Lumi");
675     WZ_kin_plot("mll",40,0,200,"m_{Z} [GeV]",TCut("id1==id2 && id1==0 && pfJetGoodNum40>=3 && abs(mll-91.2)<20 && pt1>30 && pt2>20 && abs(eta1)<2.4 && abs(eta2)<2.4"),"Crosscheck_Lumi_ee");
676     WZ_kin_plot("mll",40,0,200,"m_{Z} [GeV]",TCut("id1==id2 && id1==1 && pfJetGoodNum40>=3 && abs(mll-91.2)<20 && pt1>30 && pt2>20 && abs(eta1)<2.4 && abs(eta2)<2.4"),"Crosscheck_Lumi_mm");
677    
678 buchmann 1.9 TCut BasicCut("tri_MatchFound&&leptonNum>2&&tri_pt1>30&&tri_pt2>20&&tri_pt3>20");
679 buchmann 1.10 TCut Selection("abs(tri_mlll-91)>30 && tri_mT>40 && met[4] > 30 && abs(tri_mll-91)<10 && tri_submll > 10 && abs(tri_submll-91)>5");
680 buchmann 1.7
681 buchmann 1.4 //OptimizeSelection(BasicCut);
682    
683     //ComputeMiscombinationRate(Selection, BasicCut);
684    
685 buchmann 1.8 // ComputeNewMiscombinationRate(Selection, BasicCut);
686 buchmann 1.9
687 buchmann 1.3 WZ_kin_plot("tri_mll",40,0,200,"m_{Z} [GeV]",BasicCut,"Inclusive/Zmass");
688     WZ_kin_plot("tri_mlll",40,0,400,"m_{ll} [GeV]",BasicCut,"Inclusive/TrileptonMass");
689     WZ_kin_plot("tri_mT",40,0,200,"m_{T} [GeV]",BasicCut,"Inclusive/mT");
690     WZ_kin_plot("met[4]", 40,0,400,"raw PFMET [GeV]",BasicCut,"Inclusive/MET");
691     WZ_kin_plot("tri_pt1",40,0,400,"p_{T}^{1} [GeV]",BasicCut,"Inclusive/Pt1");
692     WZ_kin_plot("tri_pt2",40,0,400,"p_{T}^{2} [GeV]",BasicCut,"Inclusive/Pt2");
693     WZ_kin_plot("tri_pt3",40,0,400,"p_{T}^{3} [GeV]",BasicCut,"Inclusive/Pt3");
694 buchmann 1.9 /*
695 buchmann 1.3 WZ_kin_plot("tri_mll",40,0,200,"m_{Z} [GeV]",BasicCut&&TCut("abs(tri_mlll-91)>30"),"Mlll_cut/Zmass");
696     WZ_kin_plot("tri_mlll",40,0,400,"m_{ll} [GeV]",BasicCut&&TCut("abs(tri_mlll-91)>30"),"Mlll_cut/TrileptonMass");
697     WZ_kin_plot("tri_mT",40,0,200,"m_{T} [GeV]",BasicCut&&TCut("abs(tri_mlll-91)>30"),"Mlll_cut/mT");
698     WZ_kin_plot("met[4]", 40,0,400,"raw PFMET [GeV]",BasicCut&&TCut("abs(tri_mlll-91)>30"),"Mlll_cut/MET");
699    
700     WZ_kin_plot("tri_mll",40,0,200,"m_{Z} [GeV]",BasicCut&&TCut("abs(tri_mll-91)<10"),"Zwindow/Zmass");
701     WZ_kin_plot("tri_mlll",40,0,400,"m_{ll} [GeV]",BasicCut&&TCut("abs(tri_mll-91)<10"),"Zwindow/TrileptonMass");
702     WZ_kin_plot("tri_mT",40,0,200,"m_{T} [GeV]",BasicCut&&TCut("abs(tri_mll-91)<10"),"Zwindow/mT");
703     WZ_kin_plot("met[4]", 40,0,400,"raw PFMET [GeV]",BasicCut&&TCut("abs(tri_mll-91)<10"),"Zwindow/MET");
704    
705     WZ_kin_plot("tri_mll",40,0,200,"m_{Z} [GeV]",BasicCut,"CutFlow/Zmass__0_CutOnNothing");
706     WZ_kin_plot("tri_mll",40,0,200,"m_{Z} [GeV]",BasicCut&&TCut("tri_mT>40"),"CutFlow/Zmass__1_CutOn_MT");
707     WZ_kin_plot("tri_mll",40,0,200,"m_{Z} [GeV]",BasicCut&&TCut("tri_mT>40&&abs(tri_mlll-91)>30"),"CutFlow/Zmass__2_CutOn_MT_n_Mll");
708     WZ_kin_plot("tri_mll",40,0,200,"m_{Z} [GeV]",BasicCut&&TCut("tri_mT>40&&abs(tri_mlll-91)>30&&met[4]>30"),"CutFlow/Zmass__3_CutOn_MT_n_Mll_n_Met");
709     WZ_kin_plot("tri_mll",40,0,200,"m_{Z} [GeV]",BasicCut&&TCut("tri_mT>40&&abs(tri_mlll-91)>30&&met[4]>30&&abs(tri_mll-91)<10"),"CutFlow/Zmass__4_CutOn_MT_n_Mll_n_Met_MllWindow");
710    
711     WZ_kin_plot("tri_mT",40,0,200,"m_{T} [GeV]",BasicCut,"CutFlow/MT__0_CutOnNothing");
712     WZ_kin_plot("tri_mT",40,0,200,"m_{T} [GeV]",BasicCut&&TCut("tri_mT>40"),"CutFlow/MT__1_CutOn_MT");
713     WZ_kin_plot("tri_mT",40,0,200,"m_{T} [GeV]",BasicCut&&TCut("tri_mT>40&&abs(tri_mlll-91)>30"),"CutFlow/MT__2_CutOn_MT_n_Mll");
714     WZ_kin_plot("tri_mT",40,0,200,"m_{T} [GeV]",BasicCut&&TCut("tri_mT>40&&abs(tri_mlll-91)>30&&met[4]>30"),"CutFlow/MT__3_CutOn_MT_n_Mll_n_Met");
715     WZ_kin_plot("tri_mT",40,0,200,"m_{T} [GeV]",BasicCut&&TCut("tri_mT>40&&abs(tri_mlll-91)>30&&met[4]>30&&abs(tri_mll-91)<10"),"CutFlow/MT__4_CutOn_MT_n_Mll_n_Met_MllWindow");
716    
717     WZ_kin_plot("met[4]",40,0,200,"MET [GeV]",BasicCut,"CutFlow/MET__0_CutOnNothing");
718     WZ_kin_plot("met[4]",40,0,200,"MET [GeV]",BasicCut&&TCut("tri_mT>40"),"CutFlow/MET__1_CutOn_MT");
719     WZ_kin_plot("met[4]",40,0,200,"MET [GeV]",BasicCut&&TCut("tri_mT>40&&abs(tri_mlll-91)>30"),"CutFlow/MET__2_CutOn_MT_n_Mll");
720     WZ_kin_plot("met[4]",40,0,200,"MET [GeV]",BasicCut&&TCut("tri_mT>40&&abs(tri_mlll-91)>30&&met[4]>30"),"CutFlow/MET__3_CutOn_MT_n_Mll_n_Met");
721     WZ_kin_plot("met[4]",40,0,200,"MET [GeV]",BasicCut&&TCut("tri_mT>40&&abs(tri_mlll-91)>30&&met[4]>30&&abs(tri_mll-91)<10"),"CutFlow/MET__4_CutOn_MT_n_Mll_n_Met_MllWindow");
722    
723 buchmann 1.9 */
724 buchmann 1.3 WZ_kin_plot("tri_mll",40,0,200,"m_{Z} [GeV]",BasicCut&&Selection,"Zmass");
725     WZ_kin_plot("tri_mlll",40,0,400,"m_{lll} [GeV]",BasicCut&&Selection,"TrileptonMass");
726     WZ_kin_plot("tri_mT",40,0,200,"m_{T} [GeV]",BasicCut&&Selection,"mT");
727     WZ_kin_plot("met[4]", 40,0,400,"raw PFMET [GeV]",BasicCut&&Selection,"MET");
728     WZ_kin_plot("tri_pt1",40,0,400,"p_{T}^{1} [GeV]",BasicCut&&Selection,"Pt1");
729     WZ_kin_plot("tri_pt2",40,0,400,"p_{T}^{2} [GeV]",BasicCut&&Selection,"Pt2");
730     WZ_kin_plot("tri_pt3",40,0,400,"p_{T}^{3} [GeV]",BasicCut&&Selection,"Pt3");
731 buchmann 1.4
732 buchmann 1.9
733 buchmann 1.4 WZ_kin_plot("tri_submll",40,0,200,"m_{l_{2}l_{3}} [GeV]",BasicCut&&Selection&&TriLepSF,"mllsub_SF");
734 buchmann 1.9 WZ_kin_plot("tri_submll",40,0,200,"m_{l_{2}l_{3}} [GeV]",BasicCut&&Selection&&TriLepOF,"mllsub_OF");
735 buchmann 1.4 WZ_kin_plot("tri_submll",40,0,200,"m_{l_{2}l_{3}} [GeV]",BasicCut&&Selection&&TriLepSF&&TCut("tri_id2==0"),"mllsub_SF_ee");
736     WZ_kin_plot("tri_submll",40,0,200,"m_{l_{2}l_{3}} [GeV]",BasicCut&&Selection&&TriLepSF&&TCut("tri_id2==1"),"mllsub_SF_mm");
737     WZ_kin_plot("tri_submll",40,0,200,"m_{l_{2}l_{3}} [GeV]",BasicCut&&Selection&&TriLepOF&&TCut("tri_id2==0"),"mllsub_OF_em");
738     WZ_kin_plot("tri_submll",40,0,200,"m_{l_{2}l_{3}} [GeV]",BasicCut&&Selection&&TriLepOF&&TCut("tri_id2==1"),"mllsub_OF_me");
739 buchmann 1.9
740 buchmann 1.4
741     SF_OF_comparison(BasicCut,Selection);
742     // generator_SF_OF_comparison();
743     // reco_SF_OF_comparison(BasicCut,Selection);
744    
745     SF_vs_OF_plots("tri_submll",40,0,200,"m_{l_{2}l_{3}} [GeV]",BasicCut&&Selection,TriLepSF,TriLepOF,mc,"mllsub_MC");
746     SF_vs_OF_plots("tri_submll",40,0,200,"m_{l_{2}l_{3}} [GeV]",BasicCut&&Selection,TriLepSF,TriLepOF,data,"mllsub_data");
747     AlgorithmTest(BasicCut,Selection);
748     GetResult(BasicCut,Selection);
749    
750    
751     }
752    
753     void Make_Chi2_Resolution_Minimization(TGraph *gr) {
754     TCanvas *can2 = new TCanvas("can2","can2");
755     can2->cd();
756     gStyle->SetOptFit(0);
757     gr->Draw("AP*");
758     gr->GetXaxis()->SetTitle("MET scale factor");
759     gr->GetYaxis()->SetTitle("#chi^{2}");
760     gr->GetXaxis()->CenterTitle();
761     gr->GetYaxis()->CenterTitle();
762     gr->Draw("AP*");
763     gr->Fit("pol3");
764     TF1 *fit = (TF1*)gr->GetFunction("pol3");
765     fit->SetLineWidth(2);
766     fit->SetLineColor(kBlue);
767     gr->Draw("AP*");
768     DrawPrelim();
769     CompleteSave(can2,"WZ_study/DYResolution/Result_Chi2");
770     delete can2;
771     }
772 buchmann 1.3
773 buchmann 1.4 void ExtractDYMissingResolution() {
774 buchmann 1.3
775 buchmann 1.4 TCanvas *can = new TCanvas("can","can");
776    
777 buchmann 1.10 TH1F *histoSF = SingleLeptonData.Draw("histoSF","met[4]",50,0,100,"MET [GeV]","events",TCut("id1==id2&&mll>0&&pfJetGoodNum40>=2"),data,luminosity);
778     TH1F *histoOF = SingleLeptonData.Draw("histoOF","met[4]",50,0,100,"MET [GeV]","events",TCut("id1!=id2&&mll>0&&pfJetGoodNum40>=2"),data,luminosity);
779 buchmann 1.4 THStack histoMC = allsamples.DrawStack("histoMC","met[4]",50,0,100,"MET [GeV]","events",TCut("id1==id2&&mll>0&&pfJetGoodNum40>=2"),mc,luminosity);
780     TFile *f = new TFile("file.root","RECREATE");
781 buchmann 1.3
782 buchmann 1.4 TH1F *MC_wo_DY = CollapseStack(histoMC);
783     TIter nextSF = TIter(histoMC.GetHists());
784     TH1F *h;
785     while ( h = (TH1F*)nextSF() ) {
786     if(Contains(h->GetName(),"Z_Jets")) {
787     MC_wo_DY->Add(h,-1);
788     }
789     }
790     MC_wo_DY->Write();
791    
792    
793     int ntests=150;
794     TH1F *DYres[ntests];
795    
796     float min_chi2=-1;
797     int best_index=-1;
798     stringstream allresults;
799     TGraph *gr = new TGraph();
800     for(int i=0;i<ntests;i++) {
801    
802     float smearby=0.15*i/((float)ntests);
803    
804     stringstream drawvariable;
805     drawvariable << "((" << 1+smearby << ")*met[4])";
806     cout << "Going to use the variable " << drawvariable.str() << endl;
807     stringstream name;
808     name << "histo_DY_" << i;
809     DYres[i] = allsamples.Draw(name.str().c_str(),drawvariable.str(),50,0,100,"MET [GeV]","events",TCut("id1==id2&&mll>0&&pfJetGoodNum40>=2"),mc,luminosity, allsamples.FindSample("DYJets"));
810     DYres[i]->Write();
811    
812     TPad *pad = new TPad("pad","pad",0,0,1,1);
813     pad->cd();
814    
815     DrawPrelim();
816     MC_wo_DY->SetFillColor(kWhite);
817     MC_wo_DY->SetLineColor(kBlue);
818     TLegend *leg = make_legend();
819     leg->SetY1(0.8);
820     leg->AddEntry(histoSF,"data","pl");
821     leg->AddEntry(MC_wo_DY,"MC","l");
822    
823     TH1F *sum = (TH1F*)MC_wo_DY->Clone("sum");
824     sum->Add(DYres[i]);
825     sum->Draw("histo");
826     histoSF->Draw("e1,same");
827     stringstream Result;
828    
829     Double_t chi2;
830     Int_t ndf,igood;
831     Double_t res=0.0;
832     Double_t chi2prob = MarcosChi2TestX(histoSF,sum,chi2,ndf,igood,"UW");
833     Result << "#splitline{Smeared by : " << std::setprecision(3) << 100*smearby << " %}{#splitline{#chi^{2} / NDF : " << std::setprecision(3) << chi2 << " / " << ndf << "}{ #chi^{2} prob : " << std::setprecision(3) << chi2prob << "}}";
834    
835     allresults << "\n" << smearby << ";" << chi2;
836     gr->SetPoint(i,smearby,chi2);
837    
838     if(min_chi2<0||chi2<min_chi2) {
839     min_chi2=chi2;
840     best_index=i;
841     }
842    
843     TPaveText *PurityPaveText = new TPaveText(0.60, 0.40,0.89, 0.6,"blNDC");
844     PurityPaveText->SetFillStyle(4000);
845     PurityPaveText->SetBorderSize(0);
846     PurityPaveText->SetFillColor(kWhite);
847     PurityPaveText->SetTextFont(42);
848     PurityPaveText->SetTextSize(0.042);
849     PurityPaveText->AddText(Result.str().c_str());
850     PurityPaveText->Draw();
851     DrawPrelim();
852     leg->Draw();
853    
854    
855     stringstream savethis;
856     savethis << "WZ_study/DYResolution/Response" << 100*smearby << "Percent";
857    
858 buchmann 1.8 Save_With_Ratio(histoSF,sum,pad->cd(),savethis.str());
859 buchmann 1.4 }
860    
861     gr->SetTitle("Chi2Diagram");
862     gr->SetName("Chi2Diagram");
863    
864    
865     dout << "Result summary: " << endl;
866     dout << allresults.str() << endl;
867 buchmann 1.3
868 buchmann 1.4 nextSF = TIter(histoMC.GetHists());
869     THStack stack;
870     while ( h = (TH1F*)nextSF() ) {
871     if(!Contains(h->GetName(),"Z_Jets")) {
872     stack.Add(h);
873     }
874     }
875 buchmann 1.3
876    
877 buchmann 1.4 TPad *pad = new TPad("pad","pad",0,0,1,1);
878     pad->cd();
879    
880     DYres[best_index]->SetFillColor(kYellow);
881     DYres[best_index]->SetLineColor(kYellow);
882 buchmann 1.1
883 buchmann 1.4 stack.Add(DYres[best_index]);
884     stack.Draw();
885     histoSF->Draw("e1,same");
886     DrawPrelim();
887 buchmann 1.8 Save_With_Ratio(histoSF,CollapseStack(stack),pad->cd(),"WZ_study/DYResolution/Result");
888 buchmann 1.1
889 buchmann 1.4 TFile *fr = new TFile("rumba.root","RECREATE");
890     gr->Write();
891     fr->Close();
892 buchmann 1.1
893 buchmann 1.4 delete can;
894 buchmann 1.1
895 buchmann 1.4 Make_Chi2_Resolution_Minimization(gr);
896    
897 buchmann 1.1 }
898    
899     void WZstudy() {
900 buchmann 1.4 // ExtractDYMissingResolution();
901 buchmann 1.1
902 buchmann 1.10 cutWeight=TCut("(weight*(weight<1000)*(is_data*tri_MatchFound+(!is_data)*(0.96*(tri_id1==1)+0.90*(tri_id1==0))))");
903 buchmann 1.1 switch_overunderflow(true);
904     cout << "Essential cut is " << (const char*) essentialcut << endl;
905     cout << "Going to set essential cut to new triggers" << endl;
906     TCut essential_bkp = essentialcut;
907 buchmann 1.3 essentialcut=TCut("mll>5||mll<6");
908 buchmann 1.1 cout << "Essential cut is now " << (const char*) essentialcut << endl;
909    
910     CarryOutWZStudy();
911    
912    
913     cout << "Essential cut is now " << (const char*) essentialcut << endl;
914     essentialcut = essential_bkp;
915     cout << "Essential cut is now " << (const char*) essentialcut << " (restored)" << endl;
916     switch_overunderflow(false);
917 buchmann 1.4
918 buchmann 1.1 }
919 buchmann 1.3