Upload
others
View
3
Download
0
Embed Size (px)
Citation preview
ROOT Intro
A (Short) Introduction to ROOT
Christian Klein-Bösing
IKP Münster
11. Januar 2006
ROOT Intro
ROOT Intro
What is ROOT?
An object oriented HEP analysis framework „In the mid 1990's, René Brun and Fons Rademakers had
many years of experience developing interactive tools and simulation packages. They had lead successful projects such as PAW, PIAF, and GEANT, and they knew the twenty-year-old FORTRAN libraries had reached their limits. Although still very popular, these tools could not scale up to the challenges offered by the Large Hadron Collider, where the data is a few orders of magnitude larger than anything seen before.“ (ROOT User‘s Guide)
Started in the context of the NA49 Experiment at CERN „Bazaar“ development style:
After 10 years ROOT should have almost all the features you need, because probably someone needed it before
ROOT Intro
The ROOT framework
A framework provides you with the tools (utilities and services) to do your work efficiently
ROOT Intro
The ROOT framework
A framework provides you with the tools (utilities and services) to do your work efficiently For ROOT this includes the common tasks:
Command Line Interpreter (Macros) Histograms and Fitting Writing a Graphical User Interface 2D Graphics Input/Output …
The ROOT framework is OO Here C++ Encapsulation, Inheritance etc.
ROOT Intro
More Information
http://root.cern.ch Latest Version Tutorials User‘s Guide Reference Guide ROOT-Talk
mailing list forum
ROOT Intro
Sort of an Outline
We want to work with ROOT Not all background information is needed (esp. the OO
philosphy) Start from simple examples (see also http://www-root.fnal.gov/root/)
ROOT structure and installation First ROOT session Command Line Basics Reading files The GUI Coming from PAW Macros
– Fitting– Trees
Best Of ROOT „unexpected“ effects Style Files
ROOT Intro
Installation
Do it yourself Binaries available for Linux, Unix, Windows, Mac … Or compile your own Or try out the PAIPIX live DVD (bootable Linux DVD for
scientists including ROOT, PAW, CERNLIB etc.) ROOT@IKP
On our LINUX workstations and the GRID-Cluster Default versions, change by setting ROOTSYS,
LD_LIBRARY_PATH and PATH > root
For all NWZNET users: Remote ssh-login to Linux Machine lambda.uni-muenster.de
Windows CIP-Pool (R210) and on the terminal server NWZHOME (Kudos to Jan Auffenberg) Command prompt I:\> root
setenv ROOTSYS /usr/local/root/5.04.00setenv PATH ${ROOTSYS}/bin/:${PATH}setenv LD_LIBRARY_PATH ${ROOTSYS}/lib
ROOT Intro
Installation
Do it yourself Binaries available for Linux, Unix, Windows, Mac … Or compile your own Or try out the PAIPIX live DVD (bootable Linux DVD for
scientists including ROOT, PAW, CERNLIB etc.) ROOT@IKP
On our LINUX workstations and the GRID-Cluster Default versions, change by setting ROOTSYS,
LD_LIBRARY_PATH and PATH > root
Windows CIP-Pool (R210) and on the terminal server NWZHOME (Kudos to Jan Auffenberg) Command prompt I:\> root
ROOT Intro
Framework Organization
*.h...
cintmakecintnewproofdproofservrmkdependrootroot.exerootcintroot-configrootd
bin
$ROOTSYS
libCint.solibCore.solibEG.so*libEGPythia.so*libEGPythia6.solibEGVenus.solibGpad.solibGraf.solibGraf3d.solibGui.solibGX11.so*libGX11TTF.solibHist.solibHistPainter.solibHtml.solibMatrix.solibMinuit.solibNew.solibPhysics.solibPostscript.solibProof.so*libRFIO.so*libRGL.solibRint.so*libThread.solibTree.solibTreePlayer.solibTreeViewer.so*libttf.solibX3d.solibXpm.a
Aclock.cxxAclock.hEvent.cxxEvent.hEventLinkDef.hHello.cxxHello.hMainEvent.cxxMakefileMakefile.inMakefile.win32READMETestVectors.cxxTetris.cxxTetris.heventa.cxxeventb.cxxeventload.cxxguitest.cxxhsimple.cxxhworld.cxxminexam.cxxstress.cxxtcollbm.cxxtcollex.cxxtest2html.cxxtstring.cxxvlazy.cxxvmatrix.cxxvvector.cxx
lib testtutorials include
* OptionalInstallation
EditorBar.CIfit.Canalyze.Carchi.Carrow.Cbasic.Cbasic.datbasic3d.Cbenchmarks.Ccanvas.Cclasscat.Ccleanup.Ccompile.Ccopytree.Ccopytree2.Cdemos.Cdemoshelp.Cdialogs.Cdirs.Cellipse.Ceval.Cevent.Cexec1.Cexec2.Cfeynman.Cfildir.Cfile.Cfillrandom.Cfirst.Cfit1.Cfit1_C.C
fitslicesy.Cformula1.Cframework.Cgames.Cgaxis.Cgeometry.Cgerrors.Cgerrors2.Cgraph.Ch1draw.Chadd.Chclient.Chcons.Chprod.Chserv.Chserv2.Chsimple.Chsum.ChsumTimer.Chtmlex.Cio.Clatex.Clatex2.Clatex3.Cmanyaxis.Cmultifit.Cmyfit.Cna49.Cna49geomfile.Cna49view.Cna49visible.C
ntuple1.Coldbenchmarks.Cpdg.datpsexam.Cpstable.Crootalias.Crootenv.Crootlogoff.Crootlogon.Crootmarks.Cruncatalog.sqlrunzdemo.Csecond.Cshapes.Cshared.Csplines.Csqlcreatedb.Csqlfilldb.Csqlselect.Cstaff.Cstaff.datsurfaces.Ctcl.Ctestrandom.Ctornado.Ctree.Ctwo.Cxyslider.CxysliderAction.Czdemo.C
ROOT Intro
Some ROOT Conventions
Classes begin with T: TH1F, TCanvas Non-class types end with _t:
Char_t Signed Character 1 byte Int_t Signed integer 4 bytes Float_t Float 4 bytes Double_t Float 8 bytes Bool_t Boolean (0=false, 1=true)
Global variables begin with g: gROOT, gDirectory Constansts began with k: kRed, kFullCircle More conventions for actual coding…
ROOT Intro
Start ROOT
Command Prompt:
-b: run in batch mode without graphics -l: do not show image logo -q: exit after processing command line script file(s)
> root [-b] [-q] [-l] [file1.C] [file2.root]
> root -b -q myMacro.C > myMacro.log
> root -b -q `myMacro.C(\“input.root\“)` > myMacro.log
ROOT Intro
Start ROOT
Command Prompt:
-b: run in batch mode without graphics -l: do not show image logo -q: exit after processing command line script file(s)
> root [-b] [-q] [-l] [file1.C] [file2.root]
ROOT Intro
Customizing ROOT
Environment Setup: rootrc ./.rootrc $HOME/.rootrc $ROOTSYS/etc/system.rootrc Defines e.g. load path for macros
Session specific: rootlogon.C, rootlogoff.C, rootalias.C Loaded in the sequence defined in rootrc Typically loads some shared libs or sets style
Unix.*.Root.MacroPath: .:${HOME}/root:${ROOTYS}/macros
{// load path defined in .rootrccout << ">>> ./rootlogon.C " << endl; gROOT->SetStyle("Plain");}
ROOT Intro
Three User Interfaces
GUI windows, buttons, menus
Root Command line CINT (C++ interpreter)
Macros, applications, libraries C++ compiler and interpreter Script and programming
language are the same! Remember PAW/KUIP
Personal bias towards command line and macros
ROOT Intro
Example 1 (Command Line): Open a file and draw a histogram
TFile is the ROOT class that handles files C++ syntax
Create a pointer f1 of type TFile
new object is initialized with (“hsimple.root“)
CINT commands are preceded by a “.“ (“.?“ for help on CINT) “.ls“: CINT command “gDirectory->ls()“: C++
equivalent
ROOT Intro
Example 1 (Command Line): Open a file and draw a histogram
TFile is the ROOT class that handles files C++ syntax
Create a pointer f1 of type TFile
new object is initialized with (“hsimple.root“)
CINT commands are preceded by a “.“ (“.?“ for help on CINT) “.ls“: CINT command “gDirectory->ls()“: C++
equivalent
ROOT Intro
ROOT Classes (TFile Example)
Reference Guide: Find the class in the index, for
example TFile. Class Inheritance
TFile (is a) -> TDirectory -> TNamed -> TObject
Class Description Private members Public methods Code
Most ROOT classes are a TObject ROOT files organized like a unix
directory Also Subdirectories Open changes working directory
into the file Global variable
gDirectory ~ $PWD
ROOT Intro
TFile Inheritance Tree
unix-like navigation
ROOT Intro
TFile Example continued
All Information also available on command prompt CINT auto-completion
TAB
TAB
ROOT Intro
Drawing Histograms
ROOT Intro
Drawing Histograms
ROOT Intro
Drawing Histograms
How is hpx known?CINT/ROOT performs an implicit:gROOT->FindObject(“hpx“)
Why this new window?Need a canvas to draw the histogram, created automatically, implicit:TCanvas *c1 = new TCanvas(“c1“)
ROOT Intro
Changing the look…
root[] hpx->Draw()
ROOT Intro
Changing the look…
root[] gROOT->SetStyle(“Plain“)root[] gROOT->ForceStyle();
ROOT Intro
Changing the look…
root[] gStyle->SetOptStat(0)
ROOT Intro
Changing the look…
root[] hpx->SetXTitle(“p_{x} (GeV/c)“)root[] hpx->SetYTitle(“Count“)
ROOT Intro
Changing the look…
root[] hpx->SetMarkerStyle(kFullCircle)root[] hpx->SetMarkerColor(kBlue)root[] hpx->Draw(“PE“)
ROOT Intro
The first macro
NB: Macro uses some implicit CINT/ROOT (read: non C++)declarations/initializations
ROOT Intro
Example 1 (GUI): Open a file and draw a histogram
ROOT Intro
Example 1 (GUI): Open a file and draw a histogram
ROOT Intro
Example 1 (GUI): Open a file and draw a histogram
ROOT Intro
Example 1 (GUI): Open a file and draw a histogram
ROOT Intro
Example 1 (GUI): Open a file and draw a histogram
ROOT Intro
Example 1 (GUI): Open a file and draw a histogram
You have to know how to access certain options: Via GUI and as well as via CL.
View->Editor Editor for each
component TCanvas TAxis TH1…
Lowercase difficult…
View->Toolbar Easy placement
of arrows, text Back to Macro
SaveAs: c1.C
ROOT Intro
PAW to ROOT
What about old HBOOK/PAW files? Conversion tool coming with ROOT
More information http://root.cern.ch/root/HowtoConvert.html
PAW to ROOT command translations histo/plot 20 chopt (chopt=box/col/cont/...) h20->Draw("opt"); (opt = box/col/cont/...) http://root.cern.ch/root/HowtoConvertFromPAW.html
> h2root file.hbk file.root
ROOT Intro
Summary
ROOT installation and structure First steps
Opening a file Plotting a histogram Editing the histogram
PAW to ROOT conversion More Examples
Tutorials and examples: http://root.cern.ch/root/Tutorials.html
HowTo‘s: http://root.cern.ch/root/Howto.html Reference Guide: http://root.cern.ch/root/Reference.html
ROOT Intro
What‘s next
Macros CINT traps Compiled vs. interpreted
Histogram and file creation Tree creation
Fitting Predefined functions User defined functions
Styles Create your own plot style
ROOT Intro
Macro execution
Macro as CL argument
Execution in ROOT
> root plot1.C
root[] .x plot1.C
Un-named macro
ROOT Intro
Macro execution
Macro as CL argument
Execution in ROOT
Load and execute
> root plot1.C
root[] .x plot1.C
root[] .L plot2.Croot[] plot2()
Un-named macro
named macro
ROOT Intro
Macro execution
Macro as CL argument
Execution in ROOT
Load and execute
Compile and execute
ACLiC (Automatic Compiler of Libraries for CINT)
Compile-time overhead Large macros/many operations
> root plot1.C
root[] .x plot1.C
root[] .L plot2.Croot[] plot2()
root[] .L plot3.C++root[] plot3()
ROOT Intro
CINT traps
The Command line and the interpretation of macros is driven by CINT (C/C++-INTerpreter by Masaharu Goto) Covers 95% of ANSI C 85% of ANSI-C++
void func(){ int i; for(i=0;i<10;i++) { int n; /* block scope */ printf("n=%d\\n",n++); } /* n is still alive here in cint, n should be already dead in ANSI C */ }
All variables global
{TFile *f1 = new TFile(“hsimple.root”);f1.ls(); // Not allowed in C++/tolerated in // CINTf1->ls(); // Correct C++
TFile f2(“hsimple.root”);f2->ls(); // Not allowed in C++/tolerated in // CINTf1.ls(); // Correct C++}
Pointers and objects treated similar
The ROOT CL/CINT does not teach you 100% correct C++
TH1F *h1 = new TH1F(“htest“,“Test“,2,0.,2.);htest->Draw();
Implicit Search
ROOT Intro
Histogram Creation
#include "TSystem.h"#include "TROOT.h"#include "TRandom.h"#include "TH1F.h" // 1-dim histogram of floats#include "TCanvas.h"#include "TStopwatch.h"
#include <iostream>using namespace std;
void histos1(){ TStopwatch timer; timer.Start();
gROOT->SetStyle("Plain"); // create TH1F *h1 = new TH1F("h1","My first histo",100,-4.,4.); // fill for(Int_t i = 0;i<(Int_t)1E+06;i++){ // create a random number following a Gaussian Float_t ran = gRandom->Gaus(0,0.5); h1->Fill(ran); }// loop over i
TCanvas *c1 = new TCanvas(); h1->DrawCopy(); c1->Update(); c1->SaveAs("h1.gif"); timer.Stop(); char cTmp[100]; sprintf(cTmp,"Real Time: %7.3f s, CPU Time: %7.3f s", timer.RealTime(),timer.CpuTime()); cout << cTmp << endl;}
ROOT Intro
Histogram Creation
TH1F constructor char* name char* title Int_t nbinsx Axis_t xlow Axis_t xup (Axis_t ~ double)
Fill(Axis_t x) Fill(Axis_t x,Stat_t w)
DrawCopy(char* copt) Clone the histogram and
draw the copy Interpreted vs. compiled
#include "TSystem.h"#include "TROOT.h"#include "TRandom.h"#include "TH1F.h" // 1-dim histogram of floats#include "TCanvas.h"#include "TStopwatch.h"
#include <iostream>using namespace std;
void histos1(){ TStopwatch timer; timer.Start();
gROOT->SetStyle("Plain"); // create TH1F *h1 = new TH1F("h1","My first histo",100,-4.,4.); // fill for(Int_t i = 0;i<(Int_t)1E+06;i++){ // create a random number following a Gaussian Float_t ran = gRandom->Gaus(0,0.5); h1->Fill(ran); }// loop over i
TCanvas *c1 = new TCanvas(); h1->DrawCopy(); c1->Update(); c1->SaveAs("h1.gif"); timer.Stop(); char cTmp[100]; sprintf(cTmp,"Real Time: %7.3f s, CPU Time: %7.3f s", timer.RealTime(),timer.CpuTime()); cout << cTmp << endl;}
107.3 s1.723 s0.671 sInterpr.
44.6 s1.111 s0.640 sCompiled
1E+081E+061E+04
ROOT Intro
Writing to a File
TFile constructur char* filename char *option
READ (default) NEW RECREATE UPDATE
Need to put the histogram into the file!!!
SetDirectory(TDirectory *d) Create the histogram within
the file structure in memory f1->cd();
#include "TSystem.h"#include "TROOT.h"#include "TFile.h"#include "TRandom.h"#include "TH1F.h"
void write(){ // create TH1F *h1 = new TH1F("h1","My first histo",100,-4.,4.); for(Int_t i = 0;i<(Int_t)1E+06;i++){ // create a random number following a Gaussian Float_t ran = gRandom->Gaus(0,0.5); h1->Fill(ran); }// loop over i
// open and write TFile *f1 = new TFile("h1.root","RECREATE"); h1->SetDirectory(f1); f1->Write(); f1->Close();
}
ROOT Intro
Writing to a File
TFile constructur char* filename char *option
READ (default) NEW RECREATE UPDATE
Need to put the histogram into the file!!!
SetDirectory(TDirectory *d) Create the histogram within
the file structure in memory f1->cd();
#include "TSystem.h"#include "TROOT.h"#include "TFile.h"#include "TRandom.h"#include "TH1F.h"
void write(){ // create TH1F *h1 = new TH1F("h1","My first histo",100,-4.,4.); for(Int_t i = 0;i<(Int_t)1E+06;i++){ // create a random number following a Gaussian Float_t ran = gRandom->Gaus(0,0.5); h1->Fill(ran); }// loop over i
// open and write TFile *f1 = new TFile("h1.root","RECREATE"); h1->SetDirectory(f1); f1->Write(); f1->Close();
}
#include "TSystem.h"#include "TROOT.h"#include "TFile.h"#include "TRandom.h"#include "TH1F.h"
void write(){ // open the file TFile *f1 = new TFile("h1.root","RECREATE"); // create TH1F *h1 = new TH1F("h1","My first histo",100,-4.,4.); for(Int_t i = 0;i<(Int_t)1E+06;i++){ // create a random number following a Gaussian Float_t ran = gRandom->Gaus(0,0.5); h1->Fill(ran); }// loop over i
// write f1->Write(); f1->Close();
}
ROOT Intro
Read a histogram from a file
Open file Get the object from the file
TObject* Get(char* name) Cast to correct type
We are still in the file If we close the object is lost
(Seg. fault) Set (memory copy) into
gROOT Same for Copy of the histo
TObject* Clone(char *newname)
#include "TSystem.h"#include "TROOT.h"#include "TFile.h"#include "TRandom.h"#include "TH1F.h"#include "TCanvas.h"
void reread(){
gROOT->SetStyle("Plain"); TCanvas *c1 = new TCanvas();
TFile *f1 = new TFile("h1.root"); TH1F *hTmp = (TH1F*)f1->Get("h1"); hTmp->SetDirectory(gROOT); // make a copy TH1F *h1 = (TH1F*)hTmp->Clone("h1_1"); h1->SetDirectory(gROOT); f1->Close(); hTmp->DrawCopy(); h1->SetMarkerStyle(kOpenTriangleUp); h1->DrawCopy("Psame"); c1->Update(); c1->SaveAs("reread.gif");}
ROOT Intro
Read a histogram from a file
#include "TSystem.h"#include "TROOT.h"#include "TFile.h"#include "TRandom.h"#include "TH1F.h"#include "TCanvas.h"
void reread(){
gROOT->SetStyle("Plain"); TCanvas *c1 = new TCanvas();
TFile *f1 = new TFile("h1.root"); TH1F *hTmp = (TH1F*)f1->Get("h1"); hTmp->SetDirectory(gROOT); // make a copy TH1F *h1 = (TH1F*)hTmp->Clone("h1_1"); h1->SetDirectory(gROOT); f1->Close(); hTmp->DrawCopy(); h1->SetMarkerStyle(kOpenTriangleUp); h1->DrawCopy("Psame"); c1->Update(); c1->SaveAs("reread.gif");}
ROOT Intro
Functions and Fitting
Function Objects TF1 Three constructors for TF1 User defined functions
Fitting Fit() Subranges and combining functions Fitting background and signal
ROOT Intro
TF1 Function Objects
Builtin functions “gaus“, “pol0-9“, “expo“, “landau“
root[] gaus->SetParameters(1,0,3)root[] gaus->Draw()
ROOT Intro
TF1 Function Objects
Builtin functions “gaus“, “pol0-9“, “expo“, “landau“
Constructors TF1(const char* name, const char* formula, Double_t xmin = 0, Double_t xmax = 1)
root[] gaus->SetParameters(1,0,3)root[] gaus->Draw()
root[] TF1 *f1 = new TF1(“myfunc“,“[0]*sin(x)/x“,0,10)root[] f1->SetParameter(0,2)root[] f1->Draw()
ROOT Intro
TF1 Function Objects
Builtin functions “gaus“, “pol0-9“, “expo“, “landau“
Constructors TF1(const char* name, const char* formula, Double_t xmin = 0, Double_t xmax = 1)
TF1(const char* name, void* fcn, Double_t xmin, Double_t xmax, Int_t npar)
root[] gaus->SetParameters(1,0,3)root[] gaus->Draw()
Double_t fitf(Double_t *x, Double_t *par){ Double_t arg = 0; if (par[2] != 0) arg = (x[0] - par[1])/par[2];
Double_t fitval = par[0]*TMath::Exp(-0.5*arg*arg); return fitval;}
void myfit(){// Creates a Root function based on function fitf above TF1 *func = new TF1("fitf",fitf,-2,2,3);}
ROOT Intro
TF1 Function Objects
Builtin functions “gaus“, “pol0-9“, “expo“, “landau“
Constructors TF1(const char* name, const char* formula, Double_t xmin = 0, Double_t xmax = 1) TF1(const char* name, void* fcn, Double_t xmin, Double_t xmax, Int_t npar)
Some usefull member functions SetParameters() SetRange() Integral()
Similar for TF2, TF3
root[] gaus->SetParameters(1,0,3)root[] gaus->Draw()
ROOT Intro
Fitting
Two ways to address the fitting function Name Pointer
root[] hpx->Fit(“gaus“)
root[] hpx->Fit(func)
ROOT Intro
Fitting
Two ways to address the fitting function Name Pointer
Better initialize the function parameters
Fitting a (sub-)range Range given in TF1 constructor or via SetRange(x1,x2)
root[] hpx->Fit(“gaus“)
root[] hpx->Fit(func)
root[] func->SetParameters(hpx->GetMaximum(),hpx->GetMean(),hpx->GetRMS())
root[] hpx->Fit(func,“R“)
ROOT Intro
Fitting
Two ways to address the fitting function Name Pointer
Better initialize the function parameters
Fitting a (sub-)range Range given in TF1 constructor or via SetRange(x1,x2)
Fit paramters printed on console Suppress with option “Q“
Function „added“ to histogram Suppress with option “0“
root[] hpx->Fit(“gaus“)
root[] hpx->Fit(func)
root[] func->SetParameters(hpx->GetMaximum(),hpx->GetMean(),hpx->GetRMS())
root[] hpx->Fit(func,“R“)
ROOT Intro
Fitting Example
Double_t fitf(Double_t *x, Double_t *par){ Double_t arg = 0; if (par[2] != 0) arg = (x[0] - par[1])/par[2];
Double_t fitval = par[0]*TMath::Exp(-0.5*arg*arg); return fitval;}
void myfit(){// Creates a Root function based on function fitf above TF1 *func = new TF1("fitf",fitf,-2,2,3);
TFile *f = new TFile("hsimple.root");
TCanvas *c1 = new TCanvas("c1","the fit canvas",500,400);
TH1F *hpx = (TH1F*)f->Get("hpx");// Sets initial values and parameter names func->SetParameters(100,0,1); func->SetParNames("Constant","Mean_value","Sigma");
// Fit histogram in range defined by function hpx->Fit(func,"r");
// Gets integral of function between fit limits printf("Integral of function = %g\n",func->Integral(-2,2));}
ROOT Intro
A real life Example
Two photon correlation via decay π0 → γγ (m = 135 MeV/c2) η → γγ (m = 548 MeV/c2)
Analysis Calculate invariant mass of all possible photon pair
combination: minv = 2 E1E2 (1- cos θ)
Combinatorial background: Nγγ = Nγ (Nγ - 1)/2 Estimated by mixing different events (uncorrelated
photons) Scaling of mixed event background Subtract background
ROOT Intro
A real-life Example
void RealMixFit(){
TCanvas *c1 = new TCanvas(); gStyle->SetOptStat(0); gROOT->ForceStyle();
TFile *f1 = new TFile("pi0_scan9_pid3_C9-17_bins64_rebin2_“ “nSigEx3.0_W0_W1_W2_W3_E2_E3_date000000.root");
// Get the real Events TH1F *hreal = (TH1F*)f1->Get("hRealSave26"); TH1F *hmix = (TH1F*)f1->Get("hMixSave26"); hmix->SetXTitle("m_{inv} (GeV/c^{2})"); hmix->SetMarkerStyle(kFullCircle); hreal->SetXTitle("m_{inv} (GeV/c^{2})"); hreal->SetMarkerStyle(kFullCircle);
hreal->DrawCopy(); c1->Update(); c1->SaveAs("real.gif"); if(getchar()=='q')return;
Nothing new: Read and plot the invariant
mass histogram
ROOT Intro
A real-life Example
TH1F* hratio = (TH1F*)hreal->Clone("hratio"); hratio->Divide(hmix); hratio->DrawCopy();
// Reset peak areas... for(int ib = 1;ib<=hratio->GetNbinsX();ib++){ Float_t x = hratio->GetBinCenter(ib); if(x < 0.130+3.*0.01){ // exclude pi0, nominal mass 0.135 hratio->SetBinContent(ib,0); hratio->SetBinError(ib,0); } if((x < 0.51+3.*0.03)&&(x > 0.548-3.*0.03)){ // exclude eta hratio->SetBinContent(ib,0); hratio->SetBinError(ib,0); } } hratio->SetMarkerColor(kBlue); hratio->DrawCopy("same"); TF1 *poli1 = new TF1("poli1","pol1",0.1,0.9); hratio->Fit(poli1,"RQ0"); poli1->SetRange(0,1.);
c1->Update(); c1->SaveAs("realovermix.gif"); if(getchar()=='q')return;
Determine a scaling function by fitting the ratio
ROOT Intro
A real-life Example
// scale mix.... for(int ib = 1;ib<=hmix->GetNbinsX();ib++){ Float_t x = hmix->GetBinCenter(ib); Float_t cont = hmix->GetBinContent(ib); Float_t err = hmix->GetBinError(ib); Float_t fScale = poli1->Eval(x); hmix->SetBinContent(ib,cont*fScale); hmix->SetBinError(ib,err*fScale); }
hreal->DrawCopy(); hmix->SetMarkerColor(kBlue); hmix->DrawCopy("same"); c1->Update(); c1->SaveAs("realscaledmix.gif"); if(getchar()=='q')
Scale the backgroundaccordingly
ROOT Intro
A real-life Example
TH1F* hdiff = (TH1F*)hreal->Clone("hdiff"); hdiff->Add(hmix,-1.); hdiff->DrawCopy(); TF1 *myg1 = new TF1("myg","gaus",0.05,0.2); myg1->SetLineColor(kRed); hdiff->Fit(myg1,"R"); TF1 *myg2 = new TF1("myg","gaus",0.4,0.6); myg2->SetLineColor(kYellow); hdiff->Fit(myg2,"R+"); c1->Update(); c1->SaveAs("realminusmix.gif"); if(getchar()=='q')return;
Subtract the backgroundand fit the peaks
Control of Energy scale (here ~ 5.5% off)
ROOT Intro
Trees, a snapshot…
Object TTree TTree has branches and
leaves Branch i.e. a track with px,
py, pz as leaves can be anything (C-struct,
TObject etc) Branch can also be single
float… Usually filled on a per-
cycle/-event basis Store large quantities of same
type structure data Many sophisticated I/O
features Here only simple examples
ROOT Intro
Tree creation
Create tree and add branches
NB: no constructor for branch element
Only associate variable branch name with pointer and type
Filled for each cycle
px, py, pz and ev change per event
Fill writes to the tree Write Tree at the end to file (to
gDirectory!!)
void tree1w() { // create a tree file tree1.root - create the file, // the Tree and a few branches TFile f("tree1.root","recreate"); TTree t1("t1","a simple Tree with simple variables"); Float_t px, py, pz; Double_t random; Int_t ev; t1.Branch("px",&px,"px/F"); t1.Branch("py",&py,"py/F"); t1.Branch("pz",&pz,"pz/F"); t1.Branch("ev",&ev,"ev/I"); //fill the tree for (Int_t i=0; i<10000; i++) { gRandom->Rannor(px,py); pz = px*px + py*py; ev = i; t1.Fill(); } //save the Tree heade; the file will be automatically closed //when going out of the function scope t1.Write();}
ROOT Intro
Tree usage
Graphical interface
CL Information on TTree
root[] t1->StartViewer()
root[] t1->Print()
ROOT Intro
Tree usage
Graphical interface
CL Information on TTree
CL Information on specific entry
root[] t1->StartViewer()
root[] t1->Print()
root[] t1->Show(10)
ROOT Intro
Tree usage
Graphical interface
CL Information on TTree
CL Information on specific entry
Plot (into htemp) 1D plots 2D plots Cuts Redirect: Draw(“px>>hUser“)
root[] t1->StartViewer()
root[] t1->Print()
root[] t1->Show(10)
ROOT Intro
Tree usage
Graphical interface
CL Information on TTree
CL Information on specific entry
Plot (into htemp) 1D plots 2D plots Cuts Redirect: Draw(“px>>hUser“)
More sophisticated operations Read Tree via macro
root[] t1->StartViewer()
root[] t1->Print()
root[] t1->Show(10)
root[] t1->MakeCode(“x.C“)
//////////////////////////////////////////////////////////// This file has been automatically generated // (Tue Nov 15 17:06:52 2005 by ROOT version4.04/02)// from TTree t1/a simple Tree with simple variables// found on file: tree1.root//////////////////////////////////////////////////////////
gROOT->Reset(); TFile *f = (TFile*)gROOT->GetListOfFiles()->FindObject("tree1.root"); if (!f) { f = new TFile("tree1.root"); } TTree *t1 = (TTree*)gDirectory->Get("t1");//Declaration of leaves types Float_t px; Float_t py; Float_t pz; Int_t ev; // Set branch addresses. t1->SetBranchAddress("px",&px); t1->SetBranchAddress("py",&py); t1->SetBranchAddress("pz",&pz); t1->SetBranchAddress("ev",&ev);// This is the loop skeleton// To read only selected branches, Insert statements like:// t1->SetBranchStatus("*",0); // disable all branches// TTreePlayer->SetBranchStatus("branchname",1); // activate branchname Long64_t nentries = t1->GetEntries();
Int_t nbytes = 0;// for (Long64_t i=0; i<nentries;i++) {// nbytes += t1->GetEntry(i);// }
ROOT Intro
ROOT Styles
Common Problem Need different styles for
publication, talk, thesis Colormap Fonts …
Root solution: TStyle Some builtin styles
Plain Pub Bold Video
User defined styles files…
Plain
Video
root[] gROOT->SetStyle(“Plain“)
ROOT Intro
User Style Files
Numerous Options See TStyle reference guide
for more details Fonts Axis offsets Linewidth…
void makeplotstyle(){ TStyle *pstyle = new TStyle("PlotStyle1", "Style for single Thesis Plots"); pstyle->SetPalette(1); pstyle->SetCanvasColor(10); pstyle->SetHistFillColor(10); pstyle->SetHistFillStyle(0); pstyle->SetOptTitle(0); pstyle->SetOptStat(0); pstyle->SetPadLeftMargin(0.17); pstyle->SetPadBottomMargin(0.2); pstyle->SetPadTickX(1); pstyle->SetPadTickY(1); pstyle->SetAxisColor(1, "XYZ"); pstyle->SetLabelColor(1, "XYZ"); pstyle->SetTickLength(0.03, "XYZ"); pstyle->SetTitleXSize(0.07); pstyle->SetTitleYSize(0.07); pstyle->SetNdivisions(505, "XYZ"); pstyle->SetLabelOffset(0.02, "XYZ"); pstyle->SetLabelSize(0.05, "XYZ"); pstyle->SetPadLeftMargin(0.2); pstyle->SetPadRightMargin(0.03); pstyle->SetPadBottomMargin(0.2); pstyle->SetTitleXOffset(0.9); // 1.1 pstyle->SetTitleYOffset(0.9); // 1-4 pstyle->SetMarkerSize(1.4); // pstyle->SetLineWidth(2); // pstyle->SetErrorX(0); //removes x-axis error bars // type * 10 + prec 6: helvetica bold 13: times normal 2: times bold const int iFont = 132; pstyle->SetLabelFont(iFont,"xyz"); pstyle->SetStatFont(iFont); pstyle->SetTitleFont(iFont); pstyle->SetTextFont(iFont); TFile f("plotstyle.root", "RECREATE"); f.cd(); pstyle->Write(); f.Close();}
void style(){ TFile *f1 = new TFile("plotstyle.root"); TStyle *s1 = (TStyle*)f1->Get("PlotStyle1"); s1->cd(); gROOT->ForceStyle();
TCanvas *c1 = new TCanvas(); TFile *f1 = new TFile("hsimple.root"); TH1F* h1 = (TH1F*)f1->Get("hpx"); h1->SetXTitle("p_{x} (GeV/c)"); h1->SetYTitle("Count"); h1->Draw(); c1->Update(); c1->SaveAs("mystyle.gif");}
ROOT Intro
Summary II
Macro execution Compiled vs. interpreted
CINT traps Histogram creation Read/write with root files
Remember the internal directory structure! Functions and fitting Root trees (snapshot) Root styles user defined styles
gROOT->SetStyle(“Plain“)
ROOT Intro
Create Your Own Class for ROOT I
Example: Generic particle information Inherit from TObject
Basic root-functionality char* GetClassName() FindObject()...
ClassDef macro Streamers Basic methods ${ROOTSYS}/include/Rtypes.h
MyParticle.h#ifndef ROOT_MyParticle#define ROOT_MyParticle
#include "TObject.h"
class MyParticle : public TObject { private: Int_t fNPID; // particle type Double_t fMom[3]; // particle momentum Double_t fVert[3]; // particle Vertex public: MyParticle(){... }
~MyParticle(){}
Double_t GetPx(){return fMom[0];} Double_t GetPy(){return fMom[1];} Double_t GetPz(){return fMom[2];} Double_t* GetMomentum(){return fMom;}
void SetPx(Double_t fPx){fMom[0] = fPx;} void SetPy(Double_t fPy){fMom[1] = fPy;} void SetPz(Double_t fPz){fMom[2] = fPz;} ... ClassDef(MyParticle,1)};
#endif}
ROOT Intro
Create Your Own Class for ROOT II
ROOT needs some more information to know your class ClassImp Macro
MyMacroLinkDef.h Used to generate dictionary information Defines what is available at the root prompt
MyParticle.C#include "MyParticle.h"
ClassImp(MyParticle)
#ifdef __CINT__
#pragma link off all globals;#pragma link off all classes;#pragma link off all functions;
#pragma link C++ class MyParticle+;
#endif
ROOT Intro
Create Your Own Class for ROOT III
Makefile Link and compile with
current root settings „root-config“ script
Generate dictionary information via rootcint
PACKAGE = MyParticle
ROOTINC := $(shell root-config --incdir)ROOTLIBS := $(shell root-config --libs)
CXXFLAGS = -I. -I$(ROOTINC) -Wall CINTINCLUDES = -I. -I$(ROOTINC)
LIBS = $(ROOTLIBS)
HDRFILES = $(PACKAGE).hLINKFILES = $(PACKAGE)LinkDef.h
SO = lib$(PACKAGE).so
$(SO) : $(PACKAGE).C $(PACKAGE)_dict.C $(HDRFILES)$(CXX) $(CXXFLAGS) -g -o $@ -shared $< \$(LIBS) $(PACKAGE)_dict.C
$(PACKAGE)_dict.C : $(HDRFILES) $(LINKFILE)rootcint -f $@ -c $(CINTINCLUDES) $^
.PHONY: cleanclean:
rm -f $(SO)rm -f $(PACKAGE)_dict.*
rootcint -f MyParticle_dict.C -c -I. -I/usr/local/root/4.04.02/include MyParticle.h
ROOT Intro
Use Your Own Class
TAB
Same CL-functionality as any ROOT class (such as TH1F, TFile..)
ROOT Intro
Final Summary
ROOT installation and structure
First steps on histogram and file handling
Macro execution (compiled and interpreted)
Read/write with root files
Functions and fitting
ROOT styles nnd user defined styles
All examples: http://qgp.uni-muenster.de/~stevero/talks/root_tutorial/macros.tgz
More Examples Tutorials and examples: http://root.cern.ch/root/Tutorials.html HowTo‘s: http://root.cern.ch/root/Howto.html Reference Guide: http://root.cern.ch/root/Reference.html
ROOT Intro
Final Summary
This was a first attempt of a root crash course Completely biased by personal experience, preferences and
limited knowledge What's missing? What's not needed? Barely touched the surface of ROOT's capabilities
ROOT Intro
Final Summary
This was a first attempt of a root crash course Completely biased by personal experience, preferences and
limited knowledge What's missing? What's not needed? Barely touched the surface of ROOT's capabilities