60 auto df_ge4m = df.Filter(
"nMuon>=4",
"At least four muons");
61 auto df_iso =
df_ge4m.Filter(
"All(abs(Muon_pfRelIso04_all)<0.40)",
"Require good isolation");
62 auto df_kin =
df_iso.Filter(
"All(Muon_pt>5) && All(abs(Muon_eta)<2.4)",
"Good muon kinematics");
63 auto df_ip3d =
df_kin.Define(
"Muon_ip3d",
"sqrt(Muon_dxy*Muon_dxy + Muon_dz*Muon_dz)");
64 auto df_sip3d =
df_ip3d.Define(
"Muon_sip3d",
"Muon_ip3d/sqrt(Muon_dxyErr*Muon_dxyErr + Muon_dzErr*Muon_dzErr)");
65 auto df_pv =
df_sip3d.Filter(
"All(Muon_sip3d<4) && All(abs(Muon_dxy)<0.5) && All(abs(Muon_dz)<1.0)",
66 "Track close to primary vertex with small uncertainty");
67 auto df_2p2n =
df_pv.Filter(
"nMuon==4 && Sum(Muon_charge==1)==2 && Sum(Muon_charge==-1)==2",
68 "Two positive and two negative muons");
75 auto df_ge4el = df.Filter(
"nElectron>=4",
"At least our electrons");
76 auto df_iso =
df_ge4el.Filter(
"All(abs(Electron_pfRelIso03_all)<0.40)",
"Require good isolation");
77 auto df_kin =
df_iso.Filter(
"All(Electron_pt>7) && All(abs(Electron_eta)<2.5)",
"Good Electron kinematics");
78 auto df_ip3d =
df_kin.Define(
"Electron_ip3d",
"sqrt(Electron_dxy*Electron_dxy + Electron_dz*Electron_dz)");
80 "Electron_ip3d/sqrt(Electron_dxyErr*Electron_dxyErr + Electron_dzErr*Electron_dzErr)");
81 auto df_pv =
df_sip3d.Filter(
"All(Electron_sip3d<4) && All(abs(Electron_dxy)<0.5) && "
82 "All(abs(Electron_dz)<1.0)",
83 "Track close to primary vertex with small uncertainty");
84 auto df_2p2n =
df_pv.Filter(
"nElectron==4 && Sum(Electron_charge==1)==2 && Sum(Electron_charge==-1)==2",
85 "Two positive and two negative electrons");
92 auto df_ge2el2mu = df.Filter(
"nElectron>=2 && nMuon>=2",
"At least two electrons and two muons");
93 auto df_eta =
df_ge2el2mu.Filter(
"All(abs(Electron_eta)<2.5) && All(abs(Muon_eta)<2.4)",
"Eta cuts");
114 auto df_dr =
df_pt.Filter(
dr_cuts, {
"Muon_eta",
"Muon_phi",
"Electron_eta",
"Electron_phi"},
"Dr cuts");
115 auto df_iso =
df_dr.Filter(
"All(abs(Electron_pfRelIso03_all)<0.40) && All(abs(Muon_pfRelIso04_all)<0.40)",
116 "Require good isolation");
117 auto df_el_ip3d =
df_iso.Define(
"Electron_ip3d_el",
"sqrt(Electron_dxy*Electron_dxy + Electron_dz*Electron_dz)");
119 "Electron_ip3d_el/sqrt(Electron_dxyErr*Electron_dxyErr + "
120 "Electron_dzErr*Electron_dzErr)");
121 auto df_el_track =
df_el_sip3d.Filter(
"All(Electron_sip3d_el<4) && All(abs(Electron_dxy)<0.5) && All(abs(Electron_dz)<1.0)",
122 "Electron track close to primary vertex with small uncertainty");
125 "Muon_ip3d_mu/sqrt(Muon_dxyErr*Muon_dxyErr + Muon_dzErr*Muon_dzErr)");
126 auto df_mu_track =
df_mu_sip3d.Filter(
"All(Muon_sip3d_mu<4) && All(abs(Muon_dxy)<0.5) && All(abs(Muon_dz)<1.0)",
127 "Muon track close to primary vertex with small uncertainty");
129 "Two opposite charged electron and muon pairs");
137 idx[0].reserve(2); idx[1].reserve(2);
143 for (
size_t i = 0; i <
idx_cmb[0].size(); i++) {
161 for (
size_t i = 0; i < 4; i++) {
163 idx[1].emplace_back(i);
175 for (
size_t i = 0; i < 2; i++) {
176 const auto i1 = idx[i][0];
const auto i2 = idx[i][1];
191 const auto i1 = idx[0][0];
const auto i2 = idx[0][1];
192 const auto i3 = idx[1][0];
const auto i4 = idx[1][1];
203 auto df_z1_cut = df.Filter(
"Z_mass[0] > 40 && Z_mass[0] < 120",
"Mass of first Z candidate in [40, 120]");
204 auto df_z2_cut =
df_z1_cut.Filter(
"Z_mass[1] > 12 && Z_mass[1] < 120",
"Mass of second Z candidate in [12, 120]");
216 df_base.Define(
"Z_idx",
reco_zz_to_4l, {
"Muon_pt",
"Muon_eta",
"Muon_phi",
"Muon_mass",
"Muon_charge"});
220 for (
size_t i = 0; i < 2; i++) {
221 const auto i1 = idx[i][0];
222 const auto i2 = idx[i][1];
231 df_z_idx.Filter(
filter_z_dr, {
"Z_idx",
"Muon_eta",
"Muon_phi"},
"Delta R separation of muons building Z system");
255 {
"Electron_pt",
"Electron_eta",
"Electron_phi",
"Electron_mass",
"Electron_charge"});
259 for (
size_t i = 0; i < 2; i++) {
260 const auto i1 = idx[i][0];
261 const auto i2 = idx[i][1];
270 "Delta R separation of Electrons building Z system");
274 {
"Z_idx",
"Electron_pt",
"Electron_eta",
"Electron_phi",
"Electron_mass"});
281 {
"Z_idx",
"Electron_pt",
"Electron_eta",
"Electron_phi",
"Electron_mass"});
327 "Muon_pt",
"Muon_eta",
"Muon_phi",
"Muon_mass"});
335 {
"Electron_pt",
"Electron_eta",
"Electron_phi",
"Electron_mass",
"Muon_pt",
"Muon_eta",
"Muon_phi",
"Muon_mass"});
348 auto c =
new TCanvas(
"",
"", 800, 700);
349 c->SetLeftMargin(0.15);
359 h_cmb.GetXaxis()->SetTitleSize(0.04);
360 h_cmb.GetYaxis()->SetTitle(
"N_{Events}");
361 h_cmb.GetYaxis()->SetTitleSize(0.04);
363 h_cmb.SetLineWidth(2);
364 h_cmb.SetMaximum(18);
366 h_bkg.SetLineWidth(2);
367 h_bkg.SetFillStyle(1001);
374 h_data.SetMarkerStyle(20);
375 h_data.SetMarkerSize(1.0);
380 h_cmb.DrawClone(
"HIST");
381 h_bkg.DrawClone(
"HIST SAME");
382 h_data.DrawClone(
"PE1 SAME");
397 cms_label.DrawLatexNDC(0.16, 0.92,
"#bf{CMS Open Data}");
400 header.
DrawLatexNDC(0.63, 0.92,
"#sqrt{s} = 8 TeV, L_{int} = 11.6 fb^{-1}");
413 std::string path =
"root://eospublic.cern.ch//eos/root-eos/cms_opendata_2012_nanoaod/";
414 if (
run_fast) path =
"root://eospublic.cern.ch//eos/root-eos/cms_opendata_2012_nanoaod_skimmed/";
430 "Events", {path +
"Run2012B_DoubleMuParked.root", path +
"Run2012C_DoubleMuParked.root"});
432 "Events", {path +
"Run2012B_DoubleElectron.root", path +
"Run2012C_DoubleElectron.root"});
439 const auto nbins = 36;
442 .Histo1D({
"h_sig_4mu",
"", nbins, 70, 180},
"H_mass",
"weight");
450 .Histo1D({
"h_bkg_4mu",
"", nbins, 70, 180},
"H_mass",
"weight");
454 .Define(
"weight", [] {
return 1.0; })
455 .Histo1D({
"h_data_4mu",
"", nbins, 70, 180},
"H_mass",
"weight");
461 .Histo1D({
"h_sig_4el",
"", nbins, 70, 180},
"H_mass",
"weight");
468 .Histo1D({
"h_bkg_4el",
"", nbins, 70, 180},
"H_mass",
"weight");
472 .Histo1D({
"h_data_4el",
"", nbins, 70, 180},
"H_mass",
"weight");
478 .Histo1D({
"h_sig_2el2mu",
"", nbins, 70, 180},
"H_mass",
"weight");
485 .Histo1D({
"h_bkg_2el2mu",
"", nbins, 70, 180},
"H_mass",
"weight");
489 .Histo1D({
"h_data_2el2mu_doublemu",
"", nbins, 70, 180},
"H_mass",
"weight");
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
winID h TVirtualViewer3D TVirtualGLPainter char TVirtualGLPainter plot
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char filename
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void data
R__EXTERN TStyle * gStyle
ROOT's RDataFrame offers a modern, high-level interface for analysis of data stored in TTree ,...
virtual void SetTextFont(Font_t tfont=62)
Set the text font.
virtual void SetTextSize(Float_t tsize=1)
Set the text size.
1-D histogram with a double per channel (see TH1 documentation)
To draw Mathematical Formula.
TLatex * DrawLatexNDC(Double_t x, Double_t y, const char *text)
Draw this TLatex with new coordinates in NDC.
This class displays a legend box (TPaveText) containing several legend entries.
virtual void SaveAs(const char *filename="", Option_t *option="") const
Save this object in the file specified by filename.
void SetOptStat(Int_t stat=1)
The type of information printed in the histogram statistics box can be selected via the parameter mod...
RVec< T > Reverse(const RVec< T > &v)
Return copy of reversed vector.
RVec< RVec< std::size_t > > Combinations(const std::size_t size1, const std::size_t size2)
Return the indices that represent all combinations of the elements of two RVecs.
Vector1::Scalar DeltaR(const Vector1 &v1, const Vector2 &v2)
Find difference in pseudorapidity (Eta) and Phi between two generic vectors The only requirements on ...
RInterface<::ROOT::Detail::RDF::RNodeBase, void > RNode
unsigned int RunGraphs(std::vector< RResultHandle > handles)
Trigger the event loop of multiple RDataFrames concurrently.
void EnableImplicitMT(UInt_t numthreads=0)
Enable ROOT's implicit multi-threading for all objects and methods that provide an internal paralleli...
void Sort(Index n, const Element *a, Index *index, Bool_t down=kTRUE)
Sort the n elements of the array a of generic templated type Element.