ROOT Tutorial
Tulika Bose
Brown University
NEPPSR 2007
ROOT
• What is ROOT ?
– ROOT is an object-oriented C++ analysis package
– User-compiled code can be called to produce 1-d, 2-d,
and 3-d graphics and histograms…
• ROOT uses a language called CINT (C/C++ Interpreter)
which contains several extensions to C++
– CINT allows the use of a dot “.” while an arrow “->” is
used in C++
– CINT commands always start with “.”
Useful Links
ROOT web-page: http://root.cern.ch/
ROOT can be downloaded from
http://root.cern.ch/twiki/bin/view/ROOT/Download
ROOT Tutorials:
• http://root.cern.ch/root/Tutorials.html
• Babar ROOT Tutorial I
• Babar ROOT Tutorial II
• Nevis tutorial:
http://www.nevis.columbia.edu/~seligman/root-class/
All files used in this tutorial can be found at
http://home.fnal.gov/~tulika/NEPPSR/
ROOT Basics
Start ROOT:
– type “root”
– (to skip the introductory welcome type “root –l”)
For help: type “.?”, “.h” Quit ROOT: type “.q”
ROOT analysis
A typical ROOT analysis could be:
• Take variables in an n-tuple, make histograms,
calculate quantities, and perform fits…
– How does one make a histogram ?
– What is an n-tuple ?
– How are calculations done ?
– How does one fit ?
Histograms
Making your first histogram:
• Histograms can be 1-d, 2-d and 3-d
• Declare a histogram to be filled with floating point numbers:
TH1F *histName = new TH1F(“histName”, “histTitle”, num_bins,x_low,x_high)
Note: Bin 0 Æ underflow (i.e. entries < x_low)
Bin (num_bins+1) Æ overflow (i.e. entries > x_high)
2-d and 3-d histograms can be booked similarly…
TH1F *my_hist = new TH1F(“my_hist”, “My First Histogram”, 100, 2, 200)
TH2F *myhist = new TH2F(“myhist”, “My Hist”, 100, 2, 200, 200, 0,500)
Drawing Histograms
• To draw:
– my_hist->Draw();
• To fill a histogram:
– my_hist->Fill(50);
– my_hist->Fill(100, 3); // the number 100 has weight=3
• Update the histogram:
– my_hist->Draw();
Histogram attributes:
• Change line color:
– my_hist->SetLineColor(2); //red
– or my_hist->SetLineColor(kRed);
– my_hist->Draw();
Look at the official documentation for the different drawing
options
ROOT Session
1 Black
2 Red
3 Light
green
4 Blue
5 Yellow
6 Magenta
7 Cyan
8 Green
COLORS
Marker Styles
Colors
Drawing Options
Drawing Options
LINE STYLES COLOR WHEEL
FILL STYLES
LaTeX in ROOT
The “Stats Box”
The Statistics Box :
• Setup with:
– gStyle->SetOptStat(mode)
– (ksiourmen)
• Default is (000001111):
• To show overflows and underflows:
– gStyle->SetOptStat(111111);
• To remove entirely:
– gStyle->SetOptStat(0);
k=1 kurtosis
K=2 Kurtosis+error
s=1 Skewness
S=2 Skewness+error
i=1 Integral
o=1 Overflow
u=1 Underflow
r=1 RMS
R=2 RMS+error
e=1 Entries
m=1 Mean
M=2 Mean+error
n=1 Name
More on histograms
• Draw a second histogram on top of the first:
– First book the histogram
– Use another color to differentiate
– Fill the histogram
– Draw the histogram
– my_hist_2->Draw(“same”)
• Errors:
– my_hist_2->Draw(“esame”)
• Default : errors = sqrt(entries)
• To get error as sqrt(sum of weights), enter
– my_hist_2->Sumw2() before filling the histogram
Exercises
Exercises:
• Add axis labels
• Add a legend
• Add a text box
Save Histograms:
c1->SaveAs(“myhisto.eps”);
c1->SaveAs(“myhisto.ps”);
c1->SaveAs(“myhisto.gif”);
Also can save source code for histogram:
c1->SaveAs(“myhisto.C”);
Recreate histogram in a brand new ROOT session:
.x myhisto.C
Functions and Histograms
• Define a function:
• Generate histograms from functions:
• Generate histograms with random numbers from a function:
• Write histogram to a root file:
TH1F *myhist = new TH1F("myhist", “Histo from gaus", 50, 0, 3);
myhist->FillRandom("myfunc", 10000);
myhist->Draw();
TFile *myfile = new TFile(“fillrandom.root”, “RECREATE”);
myhist->Write();
myfile->Close();
TF1 *myfunc = new TF1(“myfunc”, “gaus”, 0, 3);
myfunc->SetParameters(10.,1.5,0.5);
myfunc->Draw();
(myfunc->GetHistogram())->Draw();
Fitting Histograms
Let us try to fit the histogram created by the previous step:
Interactively:
• Open root file containing histogram:
root -l fillrandom.root
• Draw histogram:
myhist->Draw()
• Right click on the histogram and select “Fit Panel”
• Check to ensure:
• “gaus” is selected in the Function->Predefined pop-up menu
• “Chi-square” is selected in the Fit Settings->Method menu
• Click on “Fit” at the bottom
[Display fit parameters: Select Options-> Fit Parameters]
Fitting contd:
Using user defined functions:
• Create a file called user_func.C with the following
contents:
[tulika@cmslpc04 NEPPSR]$ root -l fillrandom.root
root [0]
Attaching file fillrandom.root as _file0...
root [1] .L user_func.C
root [2] TF1 *f1 = new TF1("f1", user_func, 0, 3, 3);
root [3] myhist->Draw()
: created default TCanvas with name c1
root [4] f1->SetParameters(10,myhist->GetMean(), myhist->GetRMS());
root [5] myhist->Fit("f1");
double user_func(double *x, double *par) {
double arg = 0;
if (par[2]) arg = (x[0] - par[1])/par[2];
return par[0]*TMath::Exp(-0.5*arg*arg);
}
gStyle->SetOptFit(1111)
Fitting contd:
Change fit range
Move the slider
N-tuples and trees
• An n-tuple is an ordered list of numbers
• A ROOT Tree can be an ordered list of any collections of
C++ objects
– It has branches which can hold many other objects, for
eg. vectors
• An n-tuple in ROOT is just a simple Tree, where each
branch contains floating point data
Getting started with trees
[tulika@cmslpc04 NEPPSR]$ root -l histo-174.root
root [0]
Attaching file histo-174.root as _file0...
root [1] .ls
TFile** histo-174.root
TFile* histo-174.root
KEY: TTree ttbar;1
root [2] ttbar->Print();
Download the file at
http://home.fnal.gov/~tulika/NEPPSR/histo-174.root
Use the following commands to open the file and list contents
The root-file consists of a tree called “ttbar”.
To display the names of the variables stored in the tree
use the “Print()” command
Plotting tree variables
root [3] TCanvas *c2= new TCanvas ("c2", "My Canvas",400, 600)
root [4] c2->Divide(1,2);
root [5] c2->cd(1);
root [6] ttbar->Draw("nj")
root [7] c2->cd(2);
root [8] ttbar->Draw("px:py")
To apply cuts:
root[9] TCanvas c3;
root [10] ttbar->Draw("nj", "nj>15");
Analyzing trees
[tulika@cmslpc04 NEPPSR]$ root -l histo-174.root
root [0]
Attaching file histo-174.root as _file0...
root [1] .ls
TFile** histo-174.root
TFile* histo-174.root
KEY: TTree ttbar;1
root [2] ttbar->MakeClass("Analyze")
Info in : Files: Analyze.h and Analyze.C
generated from TTree: ttbar
(Int_t)0
Add your analysis code to Analyze.C and then execute in ROOT:
root [0] .L Analyze.C
root [1] Analyze t
root [2] t.Loop()
“L”oad the file
Create an object of type t
Execute Loop command of object t
“Analyze” trees
Setup code goes here
Loop code goes here
Exercises
Look at the example code in
http://home.fnal.gov/~tulika/NEPPSR/AnalyzeExample.C
1. Modify it to plot “px”, “py”, and “pz” for all jets in the
event
2. Calculate η of the jets
3. Calculate the invariant mass of all possible di-jet and
three-jet combinations
4. Require pt > 20 GeV and abs(η) < 3.0 and repeat Step 3.
Search for new particles while learning ROOT :
http://www-clued0.fnal.gov/~tulika/brown/root-proj.htm
ROOT Tutorial
ROOT
Useful Links
ROOT Basics
ROOT analysis
Histograms
Drawing Histograms
Drawing Options
LaTeX in ROOT
The “Stats Box”
More on histograms
Exercises
Functions and Histograms
Fitting Histograms
Fitting contd:
N-tuples and trees
Getting started with trees
Plotting tree variables
Analyzing trees
“Analyze” trees
Exercises