Walkthrough: Using the Python Analyze script (10 minutes)

As it stands, the Analyze script does nothing, but let’s learn how to run it anyway. Hit SHIFT-ENTER in the cell to run the script.1

Python will pause as it reads through all the events in the Tree. Since we haven’t included any analysis code yet, you won’t see anything else happen.

Let’s start making histograms. In the Set-up section, insert the following code:

chi2Hist = TH1D("chi2","Histogram of Chi2",100,0,20)

In the Loop section, put this in:

    chi2 = mychain.chi2

This goes in the Wrap-up section:

canvas = TCanvas()


Don’t forget about the indentation. The lines in the Loop section must be indented to show they’re part of the loop.

Execute your revised script.


Finally, we’ve made our first histogram with a Python script. In the Set-up section, we defined a histogram; in the Loop section, we filled the histogram with values; in the Wrap-up section, we drew the histogram.

How did I know which bin limits to use on chi2Hist? Before I wrote the code, I drew a test histogram:

import ROOT
myFile = ROOT.TFile("experiment.root")
tree1 = ROOT.gROOT.FindObject("tree1")
acanvas = TCanvas()

Hmm, the histogram’s axes aren’t labeled. How do I put the labels in the script? Here’s how I figured it out: I went back to command-line ROOT from The Basics and plotted chi2 with the Treeviewer. I labeled the axes on my test histogram by right-clicking on them and selecting SetTitle. I saved the canvas by selecting Save->c1.C from the File menu. I looked at c1.C and saw these commands in the file:

chi2->GetYaxis()->SetTitle("number of events");

I scrolled up and saw that ROOT had used the variable chi2 for the name of the histogram pointer. I copied the lines into my Python script, but used the name of my histogram instead, and converted the C++ lines into Python. This usually means replacing “->” with “.” and removing the semi-colon from the end:

chi2Hist.GetYaxis().SetTitle("number of events")

Try this yourself: add the two lines above to the Set-up section, right after the line that defines the histogram. Test the revised script.2

xkcd game_theory

Figure 30: https://xkcd.com/601/ by Randall Munroe. Fortunately it’s easier to analyze histograms than it is to analyze love. At least it is for me!


You may want to organize your scripts in files outside of notebook cells. This lets you keep track of different versions of your scripts, and allows you to use your favorite text editor. To run an external script from within a notebook cell, use the %run magic command; e.g.,

%run Analyze.py

You can save the contents of notebook cells by putting the %%writefile cell magic command at the top of the cell and hitting SHIFT-ENTER; e.g.,

%%writefile AnalyzeChi2.py

There’s another way to do this in the notebook. Plot the graph with JSROOT:

%jsroot on

You can then right-click on the axes, select Title->SetTitle, and enter the axis label you want. However, this solution can’t be automated. If you have to generate a hundred histograms each with different axis labels, you’ll want a method you can put into a script.