Skip to content

Stacked backgrounds with a signal overlaid

stack= selects the backgrounds by their legend labels. The signal is drawn as an outline over the stack in the text colour, like data points, so it stands out from the filled backgrounds on light and dark pages; panel="s/sqrt(b)" compares it with the background total, in the same colour. The hatched band belongs to the backgrounds; the signal's uncertainty is a light band in its own colour.

import matplotlib.pyplot as plt
import rootfig as rf

style = rf.Style()

rf.plot(
    [zjets, diboson, signal.replace(color=plt.rcParams["text.color"])],
    mll,
    stack=["Z + jets", "Diboson"],
    panel="s/sqrt(b)",
    logy=True,
    systematics={"lumi": 0.02},
    style=style,
)
import matplotlib.pyplot as plt
import rootfig as rf

style = rf.Style(experiment="ATLAS", status="Internal", lumi=140, com=13.6)

rf.plot(
    [zjets, diboson, signal.replace(color=plt.rcParams["text.color"])],
    mll,
    stack=["Z + jets", "Diboson"],
    panel="s/sqrt(b)",
    logy=True,
    systematics={"lumi": 0.02},
    style=style,
)
import matplotlib.pyplot as plt
import rootfig as rf

style = rf.Style(experiment="CMS", status="Preliminary", lumi=138, com=13.6)

rf.plot(
    [zjets, diboson, signal.replace(color=plt.rcParams["text.color"])],
    mll,
    stack=["Z + jets", "Diboson"],
    panel="s/sqrt(b)",
    logy=True,
    systematics={"lumi": 0.02},
    style=style,
)
import matplotlib.pyplot as plt
import rootfig as rf

style = rf.Style(experiment="LHCb", status="Preliminary", lumi=9, com=13.6)

rf.plot(
    [zjets, diboson, signal.replace(color=plt.rcParams["text.color"])],
    mll,
    stack=["Z + jets", "Diboson"],
    panel="s/sqrt(b)",
    logy=True,
    systematics={"lumi": 0.02},
    style=style,
)
import matplotlib.pyplot as plt
import rootfig as rf

style = rf.Style(experiment="ALICE", status="Preliminary")

rf.plot(
    [zjets, diboson, signal.replace(color=plt.rcParams["text.color"])],
    mll,
    stack=["Z + jets", "Diboson"],
    panel="s/sqrt(b)",
    logy=True,
    systematics={"lumi": 0.02},
    style=style,
)
import matplotlib.pyplot as plt
import rootfig as rf

style = rf.Style(experiment="DUNE", status="Preliminary")

rf.plot(
    [zjets, diboson, signal.replace(color=plt.rcParams["text.color"])],
    mll,
    stack=["Z + jets", "Diboson"],
    panel="s/sqrt(b)",
    logy=True,
    systematics={"lumi": 0.02},
    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")