46 "dataframe" +
os.sep,
"df103_NanoAODHiggsAnalysis_python.h")
53 """Reconstruct Higgs from two electrons and two muons"""
57 df_z_mass =
df_base.Define(
"Z_mass",
"compute_z_masses_2el2mu(Electron_pt, Electron_eta, Electron_phi,"
58 " Electron_mass, Muon_pt, Muon_eta, Muon_phi, Muon_mass)")
62 df_h_mass =
df_z_cut.Define(
"H_mass",
"compute_higgs_mass_2el2mu(Electron_pt, Electron_eta, Electron_phi,"
63 " Electron_mass, Muon_pt, Muon_eta, Muon_phi, Muon_mass)")
69 """Select interesting events with two electrons and two muons"""
70 df_ge2el2mu =
df.Filter(
"nElectron>=2 && nMuon>=2",
"At least two electrons and two muons")
71 df_eta =
df_ge2el2mu.Filter(
"All(abs(Electron_eta)<2.5) && All(abs(Muon_eta)<2.4)",
"Eta cuts")
73 df_pt =
df_eta.Filter(
"pt_cuts(Muon_pt, Electron_pt)",
"Pt cuts")
75 df_dr =
df_pt.Filter(
"dr_cuts(Muon_eta, Muon_phi, Electron_eta, Electron_phi)",
"Dr cuts")
77 df_iso =
df_dr.Filter(
"All(abs(Electron_pfRelIso03_all)<0.40) && All(abs(Muon_pfRelIso04_all)<0.40)",
78 "Require good isolation")
79 df_el_ip3d =
df_iso.Define(
"Electron_ip3d_el",
"sqrt(Electron_dxy*Electron_dxy + Electron_dz*Electron_dz)")
81 "Electron_ip3d_el/sqrt(Electron_dxyErr*Electron_dxyErr + "
82 "Electron_dzErr*Electron_dzErr)")
83 df_el_track =
df_el_sip3d.Filter(
"All(Electron_sip3d_el<4) && All(abs(Electron_dxy)<0.5) &&"
84 " All(abs(Electron_dz)<1.0)",
85 "Electron track close to primary vertex with small uncertainty")
86 df_mu_ip3d =
df_el_track.Define(
"Muon_ip3d_mu",
"sqrt(Muon_dxy*Muon_dxy + Muon_dz*Muon_dz)")
89 "Muon_ip3d_mu/sqrt(Muon_dxyErr*Muon_dxyErr + Muon_dzErr*Muon_dzErr)")
90 df_mu_track =
df_mu_sip3d.Filter(
"All(Muon_sip3d_mu<4) && All(abs(Muon_dxy)<0.5) && All(abs(Muon_dz)<1.0)",
91 "Muon track close to primary vertex with small uncertainty")
93 "Two opposite charged electron and muon pairs")
99 """Reconstruct Higgs from four muons"""
104 df_z_idx =
df_base.Define(
"Z_idx",
"reco_zz_to_4l(Muon_pt, Muon_eta, Muon_phi, Muon_mass, Muon_charge)")
107 df_z_dr =
df_z_idx.Filter(
"filter_z_dr(Z_idx, Muon_eta, Muon_phi)",
"Delta R separation of muons building Z system")
110 df_z_mass =
df_z_dr.Define(
"Z_mass",
"compute_z_masses_4l(Z_idx, Muon_pt, Muon_eta, Muon_phi, Muon_mass)")
116 df_h_mass =
df_z_cut.Define(
"H_mass",
"compute_higgs_mass_4l(Z_idx, Muon_pt, Muon_eta, Muon_phi, Muon_mass)")
122 """Select interesting events with four muons"""
123 df_ge4m =
df.Filter(
"nMuon>=4",
"At least four muons")
125 df_iso =
df_ge4m.Filter(
"All(abs(Muon_pfRelIso04_all)<0.40)",
"Require good isolation")
126 df_kin =
df_iso.Filter(
"All(Muon_pt>5) && All(abs(Muon_eta)<2.4)",
"Good muon kinematics")
127 df_ip3d =
df_kin.Define(
"Muon_ip3d",
"sqrt(Muon_dxy*Muon_dxy + Muon_dz*Muon_dz)")
128 df_sip3d =
df_ip3d.Define(
"Muon_sip3d",
"Muon_ip3d/sqrt(Muon_dxyErr*Muon_dxyErr + Muon_dzErr*Muon_dzErr)")
129 df_pv =
df_sip3d.Filter(
"All(Muon_sip3d<4) && All(abs(Muon_dxy)<0.5) && All(abs(Muon_dz)<1.0)",
130 "Track close to primary vertex with small uncertainty")
131 df_2p2n =
df_pv.Filter(
"nMuon==4 && Sum(Muon_charge==1)==2 && Sum(Muon_charge==-1)==2",
132 "Two positive and two negative muons")
138 """Apply selection on reconstructed Z candidates"""
139 df_z1_cut =
df.Filter(
"Z_mass[0] > 40 && Z_mass[0] < 120",
"Mass of first Z candidate in [40, 120]")
140 df_z2_cut =
df_z1_cut.Filter(
"Z_mass[1] > 12 && Z_mass[1] < 120",
"Mass of second Z candidate in [12, 120]")
146 """Reconstruct Higgs from four electrons"""
152 "reco_zz_to_4l(Electron_pt, Electron_eta, Electron_phi, Electron_mass, Electron_charge)")
155 df_z_dr =
df_z_idx.Filter(
"filter_z_dr(Z_idx, Electron_eta, Electron_phi)",
156 "Delta R separation of Electrons building Z system")
160 "compute_z_masses_4l(Z_idx, Electron_pt, Electron_eta, Electron_phi, Electron_mass)")
167 "compute_higgs_mass_4l(Z_idx, Electron_pt, Electron_eta, Electron_phi, Electron_mass)")
173 """Select interesting events with four electrons"""
174 df_ge4el =
df.Filter(
"nElectron>=4",
"At least our electrons")
175 df_iso =
df_ge4el.Filter(
"All(abs(Electron_pfRelIso03_all)<0.40)",
"Require good isolation")
176 df_kin =
df_iso.Filter(
"All(Electron_pt>7) && All(abs(Electron_eta)<2.5)",
"Good Electron kinematics")
177 df_ip3d =
df_kin.Define(
"Electron_ip3d",
"sqrt(Electron_dxy*Electron_dxy + Electron_dz*Electron_dz)")
179 "Electron_ip3d/sqrt(Electron_dxyErr*Electron_dxyErr + Electron_dzErr*Electron_dzErr)")
180 df_pv =
df_sip3d.Filter(
"All(Electron_sip3d<4) && All(abs(Electron_dxy)<0.5) && All(abs(Electron_dz)<1.0)",
181 "Track close to primary vertex with small uncertainty")
182 df_2p2n =
df_pv.Filter(
"nElectron==4 && Sum(Electron_charge==1)==2 && Sum(Electron_charge==-1)==2",
183 "Two positive and two negative electrons")
188def plot(sig, bkg, data, x_label, filename):
190 Plot invariant mass for signal and background processes from simulated
191 events overlay the measured data.
261def df103_NanoAODHiggsAnalysis():
264 path =
"root://eospublic.cern.ch//eos/root-eos/cms_opendata_2012_nanoaod/"
266 if run_fast: path =
"root://eospublic.cern.ch//eos/root-eos/cms_opendata_2012_nanoaod_skimmed/"
282 df_data_doublemu =
ROOT.RDataFrame(
"Events", (path + f
for f
in [
"Run2012B_DoubleMuParked.root",
"Run2012C_DoubleMuParked.root"]))
283 df_data_doubleel =
ROOT.RDataFrame(
"Events", (path + f
for f
in [
"Run2012B_DoubleElectron.root",
"Run2012C_DoubleElectron.root"]))
292 nevt_ZZTo4mu = 1499064.0
295 nevt_ZZTo4el = 1499093.0
297 xsec_ZZTo2el2mu = 0.18
298 nevt_ZZTo2el2mu = 1497445.0
300 xsec_SMHiggsToZZTo4L = 0.0065
301 nevt_SMHiggsToZZTo4L = 299973.0
304 weight_sig_4mu = luminosity * xsec_SMHiggsToZZTo4L / nevt_SMHiggsToZZTo4L
305 weight_bkg_4mu = luminosity * xsec_ZZTo4mu * scale_ZZTo4l / nevt_ZZTo4mu
307 weight_sig_4el = luminosity * xsec_SMHiggsToZZTo4L / nevt_SMHiggsToZZTo4L
308 weight_bkg_4el = luminosity * xsec_ZZTo4el * scale_ZZTo4l / nevt_ZZTo4el
310 weight_sig_2el2mu = luminosity * xsec_SMHiggsToZZTo4L / nevt_SMHiggsToZZTo4L
311 weight_bkg_2el2mu = luminosity * xsec_ZZTo2el2mu * scale_ZZTo4l / nevt_ZZTo2el2mu
317 .Histo1D((
"h_sig_4mu",
"", nbins, 70, 180),
"H_mass",
"weight")
322 .Histo1D((
"h_bkg_4mu",
"", nbins, 70, 180),
"H_mass",
"weight")
327 .Histo1D((
"h_data_4mu",
"", nbins, 70, 180),
"H_mass",
"weight")
333 .Histo1D((
"h_sig_4el",
"", nbins, 70, 180),
"H_mass",
"weight")
338 .Histo1D((
"h_bkg_4el",
"", nbins, 70, 180),
"H_mass",
"weight")
343 .Histo1D((
"h_data_4el",
"", nbins, 70, 180),
"H_mass",
"weight")
349 .Histo1D((
"h_sig_2el2mu",
"", nbins, 70, 180),
"H_mass",
"weight")
354 .Histo1D((
"h_bkg_2el2mu",
"", nbins, 70, 180),
"H_mass",
"weight")
359 .Histo1D((
"h_data_2el2mu_doublemu",
"", nbins, 70, 180),
"H_mass",
"weight")
366 df_h_sig_4el, df_h_bkg_4el, df_h_data_4el,
367 df_h_sig_2el2mu, df_h_bkg_2el2mu, df_h_data_2el2mu])
383 plot(signal_4mu, background_4mu, data_4mu,
"m_{4#mu} (GeV)",
"higgs_4mu.pdf")
384 plot(signal_4el, background_4el, data_4el,
"m_{4e} (GeV)",
"higgs_4el.pdf")
385 plot(signal_2el2mu, background_2el2mu, data_2el2mu,
"m_{2e2#mu} (GeV)",
"higgs_2el2mu.pdf")
392 h_sig_4l = signal_4mu
396 h_bkg_4l = background_4mu
405 plot(h_sig_4l, h_bkg_4l, h_data_4l,
"m_{4l} (GeV)",
"higgs_4l.pdf")
408if __name__ ==
"__main__":
409 df103_NanoAODHiggsAnalysis()
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 Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t format
ROOT's RDataFrame offers a modern, high-level interface for analysis of data stored in TTree ,...