KAHIBARO
Discord Login Register

25.2 B. ROOT Histogram Classes

Overview

ROOT provides a rich set of histogram classes that cover different dimensions, binning schemes, and data types. This appendix summarizes the most commonly used histogram classes, their typical use cases, and some key methods and options.

Histograms in ROOT all derive, directly or indirectly, from the base class TH1. For 2D and 3D histograms the base classes are TH2 and TH3. Concrete classes mostly differ by the data type used to store bin contents and by whether they use regular or variable binning.

Important:
All histogram classes described here follow the same conceptual rules:

  1. A histogram has a fixed number of bins per axis once constructed.
  2. It always has underflow and overflow bins on every axis.
  3. Use Fill() to add data and Draw() to visualize it.
  4. Call Sumw2() if you need correct bin errors with weighted entries.

One-dimensional histogram classes

The most frequently used 1D histogram classes are summarized in the following table.

ClassBaseBin content typeTypical use case
TH1CTH1Char_tVery small integer counts, low memory use
TH1STH1Short_tSmall integer counts
TH1ITH1Int_tInteger counts, larger ranges
TH1FTH1Float_tFloating point contents, most common choice
TH1DTH1Double_tHigh precision floating point

In practice, beginners mostly use TH1F and TH1D. The choice is usually between speed and memory on one side and numerical precision on the other.

A typical constructor for a 1D histogram with uniform binning looks like:

cpp
TH1F h("h", "Title;X axis;Y axis", nbins, x_min, x_max);

For variable binning, you pass an array of bin edges:

cpp
double edges[] = {0.0, 0.5, 1.0, 2.0};
TH1F h("h", "Variable bins", 3, edges);

Rule of thumb:
Use TH1F for general purpose analysis and plotting.
Use TH1D if you expect very large weights or you perform calculations where numerical precision is critical.

Two-dimensional histogram classes

For two dimensional distributions, you use TH2 based classes. These store a value in each 2D bin, conceptually similar to a matrix, and are useful for correlations between two observables, response matrices, and similar problems.

ClassBin content typeTypical use case
TH2CChar_tVery small integer counts, memory saving
TH2SShort_tSmall integer counts
TH2IInt_tInteger counts
TH2FFloat_tGeneral 2D histograms, most common
TH2DDouble_tHigh precision 2D histograms

Typical uniform binning constructor:

cpp
TH2F h2("h2", "Title;X;Y",
        nx, x_min, x_max,
        ny, y_min, y_max);

Variable binning can be applied on one or both axes by passing arrays of bin edges for x and y.

Important:
The total number of bins in a 2D histogram is
$N_{\text{tot}} = (N_x + 2)(N_y + 2)$
The extra 2 in each dimension accounts for underflow and overflow along that axis.

Three-dimensional histogram classes

Three dimensional histograms are less common but very useful for multidimensional detector studies, response modeling, and advanced analyses.

ClassBin content typeTypical use case
TH3CChar_tVery small integer counts
TH3SShort_tSmall integer counts
TH3IInt_tInteger counts
TH3FFloat_tGeneral 3D histograms
TH3DDouble_tHigh precision 3D histograms

Typical constructor:

cpp
TH3F h3("h3", "Title;X;Y;Z",
        nx, x_min, x_max,
        ny, y_min, y_max,
        nz, z_min, z_max);

As with TH1 and TH2, variable binning is possible along any axis by providing arrays of edges.

The total bin count including all underflow and overflow bins is:
$$
N_{\text{tot}} = (N_x + 2)(N_y + 2)(N_z + 2).
$$

Profile histograms

Profile histograms are special histogram types that store the mean value of one variable as a function of another, together with the associated statistical information.

They are based on the idea that if you fill a 2D histogram with points $(x, y)$, you may be interested in the average of $y$ for each $x$ bin instead of the full distribution.

The main classes are:

ClassDimensionMeaning
TProfile1DProfile of $y$ vs $x$
TProfile2D2DProfile of $z$ vs $(x, y)$
TProfile3D3DProfile of $t$ vs $(x, y, z)$

Typical constructor for a 1D profile:

cpp
TProfile p("p", "Profile;X;Mean Y",
           nbins, x_min, x_max);

Filling a profile is similar to filling a 2D histogram:

cpp
p.Fill(x_value, y_value);

Internally, profiles accumulate the sum of y, the sum of y^2, and the number of entries per bin. When you draw a profile, ROOT displays the mean value of y per bin and the corresponding uncertainty.

Key concept:
Profiles are for the mean of a quantity as a function of another variable.
They are not equivalent to projecting a 2D histogram, which gives you full distributions of one variable at fixed bins of the other.

Specialized histogram classes

ROOT also provides several specialized histogram and histogram related classes. These are less common for beginners but become important in more advanced analyses.

ClassDescriptionTypical use case
THStackStack of 1D histogramsStacked plots of components
TProfile2D2D profile histogramMean z vs (x, y) surfaces
TProfile3D3D profile histogramHigher dimensional profiles
THnN dimensional histogram (generic)Very high dimensional data
THnFN dimensional, float contentsFast N dimensional histograms
THnDN dimensional, double contentsPrecise N dimensional histograms

In everyday work, THStack is often used for visualization of contributions from different processes or samples in one combined plot, while THnF and THnD serve more niche high dimensional analysis purposes.

Choosing the right histogram class

Beginners are usually safe with a small subset of these classes. The table below offers a practical guide.

GoalRecommended class
Simple 1D distributionTH1F or TH1D
Correlation between two variablesTH2F or TH2D
3D distributionTH3F or TH3D
Mean of a variable vs another variableTProfile
Several 1D histograms in a stacked plotTHStack + TH1F
Very large weights, high precision sumsTH1D, TH2D, TH3D

Practical rule set:

  1. Start with TH1F, TH2F and TH3F for most tasks.
  2. Switch to TH1D or related double precision classes if you see numerical issues or handle very large datasets or weights.
  3. Use TProfile and its variants when you care about the mean of one quantity as a function of one or more other variables.

This appendix is intended as a quick reference. For detailed usage, methods, and advanced options of each class, consult the ROOT class reference documentation.

Views: 12

Comments

Please login to add a comment.

Don't have an account? Register now!