Using the Treeviewer


If you’re going to take The RDataframe Path, or terms like “cut” and “scatterplot” are unfamiliar to you, I advise you to work through this page. It introduces concepts that you’ll find useful later in this tutorial.

Otherwise, if you feel that this course has been too easy so far, you can skip the TreeViewer. It’s trivial to learn on your own if you want to. You can skip ahead to The Notebook Server.

Right-click the tree1 icon again and select StartViewer.


You’re looking at the TreeViewer, a tool for making plots from n-tuples interactively. The TreeViewer is handy for quick studies of n-tuples, but it’s almost certainly not enough to get you through the work you’ll have to do this summer. Any serious analysis work will involve some amount of coding.

Still, there are times when a simple tool can be useful. Let’s use the TreeViewer to examine the tree1 n-tuple. Once you have an idea of what’s inside tree1, you’ll be ready to start writing programs to analyze it.

In the second column of the large pane in the window, you’ll see the variables in the n-tuple; they all have a “leaf” icon next to them. Double-click on one of them and look the resulting histogram. Double-click on a few more variables and see how the histogram changes.


Figure 17: This is what I see when I run TreeViewer on my Macintosh.

Correlating variables: scatterplots

(10 minutes)

Left-click on a variable and hold the mouse down. Drag the variable next to the blue curly X in the first column, over the word -empty-, and let go of the button. Now select a different variable and drag it over next to the curly Y. Click on the scatterplot icon in the lower left-hand corner of the TreeViewer (it’s next to a button labeled SPIDER1).


This is a scatterplot, a handy way of observing the correlations between two variables. Be careful: it’s easy to fall into the trap of thinking that each (x,y) point on a scatterplot represents two values in your n-tuple. In fact, the scatterplot is a grid and each square in the grid is randomly populated with a density of dots that’s proportional to the number of values in that grid.

Drag different pairs of variables to the X and Y boxes and look at the scatterplots. Do you see any correlations between the variables?


If you just see a shapeless blob on the scatterplot, the variables are likely to be uncorrelated; for example, plot px versus py. If you see a pattern, there may be a correlation; for example, plot pz versus zv. It appears that the higher pz is, the lower zv is. Perhaps the particle loses energy before it is deflected in the target.

zv vs ebeam

Figure 18: This is what I see when I make a scatterplot of zv versus ebeam. The variables look uncorrelated to me, except that we can’t have zv < 0.

New variables: expressions

(10 minutes)


There are other quantities that we may be interested in apart from the ones already present in the n-tuple. One such quantity is \(p_{T}\) which is defined by:

\[ p_{T} = \sqrt{ p_{x}^{2} + p_{y}^{2} } \]

This is the transverse momentum of the particle, that is, the component of the particle’s momentum that’s perpendicular to the z-axis.

You can use TreeViewer to create expressions that are functions of the variables in the tree. Double-click on one the E() icons that has the word -empty- next to it. In the dialog box, type sqrt(px*px+py*py) in the box under Expression, and type ~pt2 in the box under Alias. Then click on Done. Now double-click on the word ~pt in the TreeViewer.


When you’re typing in the expression, you don’t have to type the name of any variable in the tree. You can just click on the name in the TreeViewer.

The quantity theta, or the angle that the beam makes with the z-axis, is calculated by:

\[ \theta = \arctan\left(\frac{p_{T}}{p_{z}}\right) \]

The units are radians. Let’s create a new expression to calculate theta. Double-click on a different E() icon with -empty- next to it. Type atan2(~pt,pz) under Expression, and ~theta under Alias. Click Done, then double-click on ~theta. 3


After an expression is no longer empty, you can’t double-click on it to edit it; that will just cause the expression to be plotted. To edit an existing expression, right-click on it and select EditExpression.

You can have expressions within expressions (such as ~pt in the definition of ~theta). All expressions that you create must have names that begin with a tilde (~), and the expression editor will enforce this. A common error is to forget the tilde when you’re typing an expression; that’s the reason why it can be a good idea to insert a variable or an alias into an expression by clicking on it in the TreeViewer.

Restricting values: cuts

(10 minutes)

Let’s create a “cut” (a limit on the range of a variable to be plotted). Edit another empty expression and give it the formula zv < 20 and the alias zcut.


Note how the icon changes in the TreeViewer. ROOT recognizes that you’ve typed a logical expression instead of a calculation.

Drag ~zcut to the scissor icon. Double-click on zv to plot it. Double-click on some of the other variables and look at both the histogram title and the Nent in the statistics box of the histograms; the z-cut affects all the plots, not just the plot of zv.

Double-click on the scissor icon to turn off the cut; note the change in the scissor icon. Double-click on the icon again to turn the cut back on.

Now edit ~zcut by right-clicking on it and selecting EditExpression. Edit the expression to read zv<20 && zv>10 and click Done. Plot zv. Has the cut changed? Now drag ~zcut to the scissors and plot zv again.4

theta with cuts

Figure 19: This is what I see when I make a plot of theta with the cut zv<20 && zv>10.


If you wanted to display this plot in a talk, you’d have to label both axes (which you’ve already learned how to do) and do something about that title. It’s not clear how to fix the title of a plot from TreeViewer; if you right-click on it you see that it’s a TPaveText with a number of options that don’t seem to do what you want.

I figured this out by saving the plot as c1.C, examining that file, and looking up TPaveText on the ROOT web site. The simplest way to edit the title is right-click on it, select Clear, then select InsertText and type in your new title.

An obscure ROOT trick

Once, in a quick-and-dirty analysis with TreeViewer, I set up a whole bunch of complex expressions that I knew I’d want to use again. I had a file (let’s call it vertexAnalysis.root) that I was re-creating over and over again. After I re-made it, I always wanted to view it with the same complicated expressions that I’d set up in TreeViewer.

I looked in TreeViewer’s File ‣ Save Source. I saved the source as vertexAnalysis.C. After that, whenever I re-built vertexAnalysis.root, all I had to do was type

root vertexAnalysis.C

This would open vertexAnalysis.root and the TreeViewer panel would be completely recreated. All my complicated expressions were still in place. I could remake my plots with a simple double-click.

xkcd nihilism

Figure 20: by Randall Munroe. That’s why we climb (analyze) TTrees: the future is an adventure, and you don’t know what you’ll find. And perhaps the first speaker is wrong in other ways.


Go ahead and click on the SPIDER button if you want. A spider (or radar) chart is a way of displaying multivariant data in a two-dimensional graph.

I’ve never seen spider charts used in physics, except when I looked up the definition for this tutorial. By the way, if you clicked that link, you just looked up spider charts on the web. (OK, I’m no Randall Munroe.)


That first character is a tilde (~), not a dash.


The reason to use atan2(y,x) instead of just atan(y/x) is that the atan2 function correctly handles the case when x=0.


For those who know what a “weighted histogram” means: A “cut” is actually a weight ROOT applies when filling a histogram; a logical expression has the value 1 if true and the value 0 if false. If you want to fill a histogram with weighted values, use an expression for the cut that corresponds to the weight.

For example: a cut of 1/e will fill a histogram with each event weighted by 1/e; a cut of (1/e)*(sqrt(z)>3.2) will fill a histogram with events weighted by 1/e, for those events with sqrt(z) greater than 3.2.