Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
hist007_TH1_liveupdate_uhi.py
Go to the documentation of this file.
1## \file
2## \ingroup tutorial_hist
3## \notebook -js
4## Simple example illustrating how to use the C++ interpreter.
5##
6## \macro_image
7## \macro_code
8##
9## \date July 2025
10## \author Wim Lavrijsen, Nursena Bitirgen
11
12import matplotlib.pyplot as plt
13import mplhep as hep
14import numpy as np
15from ROOT import TH1F, gBenchmark, gRandom
16
17# Create a new canvas, and enable interactive mode.
18plt.ion()
19fig, ax = plt.subplots(figsize=(8, 6), num="The HSUM Example")
20
21gBenchmark.Start("hsum")
22
23# Create some histograms.
24BINS = 100
25RANGE_MIN, RANGE_MAX = -4, 4
26total = TH1F("total", "This is the total distribution", BINS, RANGE_MIN, RANGE_MAX)
27main = TH1F("main", "Main contributor", BINS, RANGE_MIN, RANGE_MAX)
28s1 = TH1F("s1", "This is the first signal", BINS, RANGE_MIN, RANGE_MAX)
29s2 = TH1F("s2", "This is the second signal", BINS, RANGE_MIN, RANGE_MAX)
30# total.Sumw2()
31
32# initialize a dictionary that holds the histogram counts as numpy arrays
33counts = {"total": np.zeros(BINS), "main": np.zeros(BINS), "s1": np.zeros(BINS), "s2": np.zeros(BINS)}
34
35# Initialize random number generator.
37gauss, landau = gRandom.Gaus, gRandom.Landau
38
39# def gauss(loc, scale):
40# return np.random.normal(loc, scale)
41
42# def landau(loc, scale):
43# return np.random.standard_cauchy() * scale + loc
44
45
46# initialize the histogram filling method
47def fill_hist(hist_name, x, weight=1.0):
48 if RANGE_MIN <= x < RANGE_MAX:
49 idx = int((x - RANGE_MIN) / (RANGE_MAX - RANGE_MIN) * BINS)
50 counts[hist_name][idx] += weight
51
52
53# Fill histograms randomly
54kUPDATE = 500
55N_EVENTS = 10000
56for i in range(1, N_EVENTS + 1):
57 # Generate random values.
58 xmain = gauss(-1, 1.5)
59 xs1 = gauss(-0.5, 0.5)
60 xs2 = landau(1, 0.15)
61
62 # Fill histograms
63 # Compute the counts
64 fill_hist("main", xmain)
65 fill_hist("s1", xs1, 0.3)
66 fill_hist("s2", xs2, 0.2)
67 fill_hist("total", xmain)
68 fill_hist("total", xs1, 0.3)
69 fill_hist("total", xs2, 0.2)
70 # Set the bin contents
71 total[...] = counts["total"]
72 main[...] = counts["main"]
73 s1[...] = counts["s1"]
74 s2[...] = counts["s2"]
75
76 # Update display every kUPDATE events.
77 if i % kUPDATE == 0:
78 ax.cla()
79 entries = total.GetEntries()
80 mean = total.GetMean()
81 stddev = total.GetStdDev()
82 stats_text = f"Entries = {entries:.0f}\nMean = {mean:.2f}\nStd Dev = {stddev:.2f}"
83 hep.histplot(main, histtype="fill", color="gray", alpha=0.5, edgecolor="blue", linewidth=1.5, ax=ax)
84 hep.histplot(total, histtype="errorbar", color="black", ecolor="blue", linewidth=2, ax=ax)
85 hep.histplot(s1, histtype="errorbar", color="blue", alpha=0.7, ecolor="blue", linewidth=2, marker="+", ax=ax)
86 hep.histplot(s2, histtype="errorbar", color="blue", alpha=0.7, ecolor="blue", linewidth=2, marker="+", ax=ax)
87 ax.set_title("This is the total distribution", pad=20, fontsize=14, loc="center")
88 ax.text(
89 0.95,
90 0.90,
91 stats_text,
92 transform=ax.transAxes,
93 ha="right",
94 va="top",
95 fontsize=12,
96 bbox=dict(facecolor="white", edgecolor="black", boxstyle="round,pad=0.2", alpha=0.9),
97 )
98
99 # Plot formatting
100 ax.set_xlim(RANGE_MIN, RANGE_MAX)
101 ax.set_ylim(0, max(counts["total"]) * 1.2)
102 plt.pause(0.001)
103
104# Done, show final plot.
105plt.grid(True)
106plt.ioff()
107plt.show()
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
1-D histogram with a float per channel (see TH1 documentation)
Definition TH1.h:879