ROOT Basics: Deb Mohapatra
ROOT Basics: Deb Mohapatra
Deb Mohapatra
This lecture is based on Fermilab ROOT tutorial and ROOT lecture in CERN summer school
WHAT IS ROOT ? ROOT is an object oriented framework It has a C/C++ interpreter (CINT) and C/C++ compiler (ACLIC) ROOT is used extensively in High Energy Physics for data analysis - Reading and writing data files - Calculations to produce plots, numbers and fits. WHY ROOT ? It can handle large files (in GB) containing N-tuples and Histograms Multiplatform software Its based on widely known programming language C++ Its free
Introduction
Learning ROOT
http://root.cern.ch/root/Tutorials.html http://root.cern.ch/root/HowTo.html http://www-root.fnal.gov/root/ http://www.slac.stanford.edu/BFROOT/www/doc/w orkbook/root{1,2,3}/root{1,2,3}.html
BASH
export ROOTSYS=/cern/root export LD_LIBRARY_PATH=$ROOTSYS/lib:$LD_LIBRARY_PATH export PATH=$ROOTSYS/bin:$PATH setenv ROOTSYS /cern/root setenv LD_LIBRARY_PATH $ROOTSYS/lib:$LD_LIBRARY_PATH setenv PATH $ROOTSYS/bin:$PATH
TCSH
You may add the above lines to your ~/.cshrc or ~/.bashrc You may define your root settings in ~/.rootlogon.C History of all commands are stored in ~/.root_hist
TObject
IS A
Event
HAS A HAS A HAS A
Segment
HAS A
Track
HAS A HAS A
Vertex
Momentum
MassSquare
InterceptAtVert
lib
EditorBar.C Ifit.C analyze.C archi.C arrow.C basic.C basic.dat basic3d.C benchmarks.C canvas.C classcat.C cleanup.C compile.C copytree.C copytree2.C demos.C demoshelp.C dialogs.C dirs.C ellipse.C eval.C event.C exec1.C exec2.C feynman.C fildir.C file.C fillrandom.C first.C fit1.C fit1_C.C
tutorials
fitslicesy.C formula1.C framework.C games.C gaxis.C geometry.C gerrors.C gerrors2.C graph.C h1draw.C hadd.C hclient.C hcons.C hprod.C hserv.C hserv2.C hsimple.C hsum.C hsumTimer.C htmlex.C io.C latex.C latex2.C latex3.C manyaxis.C multifit.C myfit.C na49.C na49geomfile.C na49view.C na49visible.C
test
ntuple1.C oldbenchmarks.C pdg.dat psexam.C pstable.C rootalias.C rootenv.C rootlogoff.C rootlogon.C rootmarks.C runcatalog.sql runzdemo.C second.C shapes.C shared.C splines.C sqlcreatedb.C sqlfilldb.C sqlselect.C staff.C staff.dat surfaces.C tcl.C testrandom.C tornado.C tree.C two.C xyslider.C xysliderAction.C zdemo.C
include
Aclock.cxx Aclock.h Event.cxx Event.h EventLinkDef.h Hello.cxx Hello.h MainEvent.cxx Makefile Makefile.in Makefile.win32 README TestVectors.cxx Tetris.cxx Tetris.h eventa.cxx eventb.cxx eventload.cxx guitest.cxx hsimple.cxx hworld.cxx minexam.cxx stress.cxx tcollbm.cxx tcollex.cxx test2html.cxx tstring.cxx vlazy.cxx vmatrix.cxx vvector.cxx
*.h ...
User Interfaces
Quit Load a macro file Load and execute a macro file Compile and execute
GUI Basics
Start root
> root
Displaying a Histogram
Open the root file Browse the file
Right Click
context menu class::name methods
Middle Click
activate canvas freezes event status bar
tree.C
#include "Riostream.h" void tree() { ifstream in; in.open(Form("basic.dat")); Float_t x,y,z; Int_t nlines = 0;
TFile *f = new TFile("basic.root","RECREATE"); TH1F *h1 = new TH1F("h1","x distribution",100,-4,4); TNtuple *ntuple = new TNtuple("ntuple","data from ascii file","x:y:z");
while (1) { in >> x >> y >> z; if (!in.good()) break; if (nlines < 5) printf("x=%8f, y=%8f, z=%8f\n",x,y,z);
h1->Fill(x); ntuple->Fill(x,y,z);
nlines++; } printf(" found %d points\n",nlines);
in.close(); f->Write();
}
TBrowser t; nTuple->Print();
//Book and fill histograms and trees //-----f->Write(); //write the file f->Close(); //close the file
TH1F *h1 = new TH1F("h1","x distribution",100,-4,4); /*do some calculation and get the parameter that you want to fill*/ h1->Fill(x);
(unsigned)char
(unsigned)short (int) (unsigned)int (unsigned)long (int)
1
2 2 or 4 4 or 8
(U)Char_t
(U)Short_t (U)Int_t (U)Long_t
1
2 4 8
CHARACTER*1
INTEGER*2 INTEGER*4 INTEGER*8
float
double long double
4
8 (=4) 16 (= double)
Float_t
Double_t
4
8
REAL*4
REAL*8 REAL*16
#include "Riostream.h" #include "TFile.h" #include "TH1.h" #include "TNtuple.h" int main() { ifstream in; in.open(Form("basic.dat")); Float_t x,y,z; Int_t nlines = 0; TFile *f = new TFile("basic.root","RECREATE"); TH1F *h1 = new TH1F("h1","x distribution",100,-4,4); TNtuple *ntuple = new TNtuple("ntuple","data from ascii file","x:y:z"); while (1) { in >> x >> y >> z; if (!in.good()) break; if (nlines < 5) printf("x=%8f, y=%8f, z=%8f\n",x,y,z); h1->Fill(x); ntuple->Fill(x,y,z); nlines++; } printf(" found %d points\n",nlines); in.close(); f->Write(); f->Close(); return 0; }
Floats: Max bin content 7 digits Double: Max bin content 14 digits
1D Histograms: TH1
TH1F *name = new TH1F(name",Title, Bins, lowest bin, highest bin); Example: TH1F *h1 = new TH1F("h1","x distribution",100,-4,4); h1->Fill(x); h1->Draw();
Histogram Properties
Command h1.GetMean() h1.GetRMS() Parameters Mean Root of Variance
h1.GetMaximum();
h1.GetMaximumBin(int bin_number); h1.GetBinCenter(int bin_number); h1.GetBinContent(int bin_number);
Histogram Cosmetics
h1.SetMarkerStyle();
h1.SetFillColor();
1D Histogram
Overlapping h1->Draw(); h2->Draw(same); Fit ( will be covered in detail later) h1->Fit(gaus);
Canvas: Demo
root [1] c1 = new TCanvas("c1","Title",800,600); root [2] c1->Divide(2,2); root [3] c1->cd(1); root [4] h1->Draw(); root [5] c1->cd(2); root [6] h2->Draw(); root [7] c1->cd(3); root [8] h1->SetLineColor(2) root [9] h2->SetLineColor(4) root [10] h1->Draw(); root [11] h2->Draw("same"); root [12] c1->cd(4); root [13] h1->Fit("gaus");
2D Histograms: TH2
TH2F *name = new TH2F(name",Title, xBins, low xbin, up xbin, yBins, low ybin, up y bin); Example: TH2F *h12 = new TH2F("h12","x vs y",100,4,4,100, -4, 4); h12->Fill(x,y); h12->Draw();
3D Histograms: TH3
TH3F *name = new TH3F(name",Title, xBins, low xbin, up xbin, yBins, low ybin, up ybin, zBins, low zbin, up zbin); Example: TH3F *h123 = new TH3F("h123","x vs y vs z",100,-4,4,100, -4, 4,100,0,20); h123->Fill(x,y,z); h123->Draw();
Graphs
Graphics object made of two arrays X and Y, holding the x, y coordinates of n points
Graphs:
Int_t n = 20; Double_t x[n], y[n]; for (Int_t i=0; i<n; i++){ x[i] = i*0.1; y[i] = 10*sin(x[i]+0.2); } TGraph *gr1 = new TGraph (n, x, y); gr1->Draw("AC*");
AF
AL
TGraph *gr1 = new TGraph(n,x,y); TGraph *gr2 = new TGraph(n,x1,y1); gr1->SetLineColor(4); gr1->Draw("AC*"); gr2->SetLineWidth(3); gr2->SetMarkerStyle(21); gr2->SetLineColor(2); gr2->Draw("CP");
Polar Graphs
TTree
Saving data in a table with rows representing the event and columns representing quantities.
ROOT Tree
Store large quantities of same-class objects TTree class is optimized to reduce disk space and enhance access speed TTree can hold all kind of data TNtuple is a TTree that is limited to only hold floating-point numbers If we do not use TTree, we need to read each event in its entirety into memory extract the parameters from the event Compute quantities from the same fill a histogram
Tfile *F = new Tfile(test.root,RECREATE); TTree *T = new TTree("T","test"); T->Branch("x",&x,"x/F"); T->Branch("y",&y,"x/F"); T->Branch("z",&z,"x/F"); // Read/or calculate x,y and z T->Fill(); T->Close(); F->Close();
Tfile *F = new Tfile(test.root,RECREATE); TNtuple *T = new TNtuple("ntuple","data from ascii file","x:y:z"); // Read/or calculate x,y and z T->Fill(x,y,z); T->Close(); F->Close();
Draw: T->Draw(x);
T->Scan();
T->Draw(x); How to apply cuts: T->Draw(x,x>0); T->Draw(x,x>0 && y>0); T->Draw(y, ,same);
T->Draw(y:x);
T->Draw(z:y:x); T->Draw(sqrt(x*x+y*y)); T->Draw(x>>h1);
How to deal with number of large Root files with same trees ?
TChain chain("T"); // name of the tree is the argument chain.Add("file1.root"); chain.Add("file2.root"); chain.Add("file3.root); You can draw x from all the files in the chain at the same time chain.Draw("x");