Expressions and pre-filled histograms¶
Variables are expressions with NumPy functions and per-event reductions:
first(Muon_pt) is the leading muon, Muon_pt * cosh(Muon_eta) the muon momentum.
rf.histogram returns a plain hist.Hist; rf.plot_histograms draws any collection
of them with the usual options.

import rootfig as rf
style = rf.Style()
all_muons = rf.histogram(signal, pt)
leading = rf.histogram(signal, pt.replace(expression="first(Muon_pt)"))
momentum = rf.histogram(signal, pt.replace(expression="Muon_pt * cosh(Muon_eta)"))
rf.plot_histograms(
[all_muons, leading, momentum],
labels=["All muons", "Leading muon", r"Muon $|\vec{p}|$"],
variable=pt.replace(label=r"$p_T^{\mu}$ or $|\vec{p}^{\,\mu}|$"),
logy=True,
style=style,
)

import rootfig as rf
style = rf.Style(experiment="ATLAS", status="Internal", lumi=140, com=13.6)
all_muons = rf.histogram(signal, pt)
leading = rf.histogram(signal, pt.replace(expression="first(Muon_pt)"))
momentum = rf.histogram(signal, pt.replace(expression="Muon_pt * cosh(Muon_eta)"))
rf.plot_histograms(
[all_muons, leading, momentum],
labels=["All muons", "Leading muon", r"Muon $|\vec{p}|$"],
variable=pt.replace(label=r"$p_T^{\mu}$ or $|\vec{p}^{\,\mu}|$"),
logy=True,
style=style,
)

import rootfig as rf
style = rf.Style(experiment="CMS", status="Preliminary", lumi=138, com=13.6)
all_muons = rf.histogram(signal, pt)
leading = rf.histogram(signal, pt.replace(expression="first(Muon_pt)"))
momentum = rf.histogram(signal, pt.replace(expression="Muon_pt * cosh(Muon_eta)"))
rf.plot_histograms(
[all_muons, leading, momentum],
labels=["All muons", "Leading muon", r"Muon $|\vec{p}|$"],
variable=pt.replace(label=r"$p_T^{\mu}$ or $|\vec{p}^{\,\mu}|$"),
logy=True,
style=style,
)

import rootfig as rf
style = rf.Style(experiment="LHCb", status="Preliminary", lumi=9, com=13.6)
all_muons = rf.histogram(signal, pt)
leading = rf.histogram(signal, pt.replace(expression="first(Muon_pt)"))
momentum = rf.histogram(signal, pt.replace(expression="Muon_pt * cosh(Muon_eta)"))
rf.plot_histograms(
[all_muons, leading, momentum],
labels=["All muons", "Leading muon", r"Muon $|\vec{p}|$"],
variable=pt.replace(label=r"$p_T^{\mu}$ or $|\vec{p}^{\,\mu}|$"),
logy=True,
style=style,
)

import rootfig as rf
style = rf.Style(experiment="ALICE", status="Preliminary")
all_muons = rf.histogram(signal, pt)
leading = rf.histogram(signal, pt.replace(expression="first(Muon_pt)"))
momentum = rf.histogram(signal, pt.replace(expression="Muon_pt * cosh(Muon_eta)"))
rf.plot_histograms(
[all_muons, leading, momentum],
labels=["All muons", "Leading muon", r"Muon $|\vec{p}|$"],
variable=pt.replace(label=r"$p_T^{\mu}$ or $|\vec{p}^{\,\mu}|$"),
logy=True,
style=style,
)

import rootfig as rf
style = rf.Style(experiment="DUNE", status="Preliminary")
all_muons = rf.histogram(signal, pt)
leading = rf.histogram(signal, pt.replace(expression="first(Muon_pt)"))
momentum = rf.histogram(signal, pt.replace(expression="Muon_pt * cosh(Muon_eta)"))
rf.plot_histograms(
[all_muons, leading, momentum],
labels=["All muons", "Leading muon", r"Muon $|\vec{p}|$"],
variable=pt.replace(label=r"$p_T^{\mu}$ or $|\vec{p}^{\,\mu}|$"),
logy=True,
style=style,
)
Setup
The code reads the toy dataset. In a checkout of rootfig, python examples/gallery writes it to examples/out/ in a few seconds; run the code inside that directory.
It uses these samples and variables, shared by the gallery examples (see Samples, variables, cuts and styles):
signal = rf.Sample("signal.root", tree="events", label="Signal", weight="weight", scale=0.03)
zjets = rf.Sample("background.root", tree="events", label="Z + jets", weight="weight")
diboson = rf.Sample("diboson.root", tree="events", label="Diboson", weight="weight", scale=0.15)
data = rf.Sample("data.root", tree="events", label="Data", is_data=True)
mc = [zjets, diboson, signal] # stacked bottom to top
pt = rf.Variable("Muon_pt", bins=(30, 0, 300), label=r"$p_T^{\mu}$", unit="GeV")
mll = rf.Variable("m_ll", bins=(70, 50, 260), label=r"$m_{\ell\ell}$", unit="GeV")
met = rf.Variable("MET", bins=(40, 0, 400), label=r"$E_T^{miss}$", unit="GeV")