root einführung -...
TRANSCRIPT
ROOT Einführung
Julian Glatzer ([email protected])
Fortgeschrittenenpraktikum
Felix Bührer ([email protected])
Felix Bührer - ROOT Einführung25.02.2013 2
Was ist ROOT?
● ROOT ist ein am CERN entwickeltes Softwarepaket zur
Datenanalyse
(insbesondere in der Teilchenphysik)
● ROOT basiert auf C++ Klassen.
● Es ist nicht notwendig C++ im Detail zu können. Kenntnisse
schaden aber nicht.
● Wobei kann mir ROOT helfen?
– Datenverarbeitung (Einlesen, Fitten, ...)
– Visualisierung
Felix Bührer - ROOT Einführung25.02.2013 3
Warum ROOT?
● ROOT ist nicht das einsteigerfreundlichste Programm, aber:
- es ist sehr einfach, häufig benutzte Schritte zu wiederholen
- sehr mächtige Statistik-Funktionen und sehr robustes Fitting
● Gerade fürs FP: Gute Möglichkeit Methoden an Hand
“einfacher” Beispiele auszuprobieren
Felix Bührer - ROOT Einführung25.02.2013 4
● http://root.cern.ch
– User's Guide
in “Buchform” (PDFs)
– Reference Guide
Erklärung aller Klassen
– HowTo's
● Google Suche
– TH1F site:root.cern.ch
● Bei uns: Westbau 022, Tel: 8534, E-Mail
Hilfe
Felix Bührer - ROOT Einführung25.02.2013 5
Installation
● Im CIP-Pool installiert
● Für die meisten großen Linux-Distributionen in den Paketquellen enthalten
(Ubuntu: apt-get install root-system
Fedora: yum install root)
● Mac OS X und Windows binaries auf
http://root.cern.ch/drupal/content/downloading-root
Felix Bührer - ROOT Einführung25.02.2013 6
Erste Schritte
● Es gibt mehrere Möglichkeiten ROOT zu benutzen:
- über eine interaktive Shell (CINT)
- schreiben von Makros welche von ROOT ausgeführt werden
können
- Einbinden von ROOT-Klassen in kompilierfähigen C++-Code
- ROOT-Modul für Python
Felix Bührer - ROOT Einführung25.02.2013 7
Erste Schritte: Interaktiv● Starten durch Eingabe von root oder
Klick auf Desktop Icon
● Root hat einen eingebauten C++
Interpreter (CINT)
● Mit den Tasten ↑ ↓ erreicht man die
zuletzt benutzten Befehle
● Beenden mit .q
(bzw .qqqqqq)
● Sollte nur zum Testen benutzt werden
Felix Bührer - ROOT Einführung25.02.2013 8
● Makros automatisieren wiederkehrende
Arbeiten
● Werden in Textdateien geschrieben (z.B.
beispiel.C) und mit .x beispiel.C
ausgeführt
● Dateiname beispiel.C muss dem Namen
der Funktion void beispiel()
entsprechen.
void beispiel(){ gROOT->Reset(); cout << "Beispiel 1: "<<endl; cout << "Wurzel aus 2 = " << sqrt(2.) << endl;}
Erste Schritte: Makros
Felix Bührer - ROOT Einführung25.02.2013 9
Sehr kurze C++ Einführungvoid vartypen(){ int ganz=1; double fliesskomma=2.5; TString text="Hello world!"; cout << text << endl;
//Rechnen double dkf=fliesskomma+ganz;
cout << fliesskomma << " + " << ganz << " = " << dkf << endl;
TH1F* myHist=new TH1F(“myHisto”,”Distribution”,10,0.,1.); myHist->Fill(1.);}
Funktionsdefinition Rückgabetyp name(<Typ> parameter)Aufruf: name() bzw. name(1)
Variablendefinition: Typ name=wert
Ausgabe: cout: Kommandozeileendl: end line
Komplexere Objekte:Typ* name=new Typ(Parameter)
Aufruf von Objektfunktion mit ->
Felix Bührer - ROOT Einführung25.02.2013 10
ROOT Klassen
● ROOT bietet verschiedene Datenstrukturen in denen
Messwerte gespeichert werden können, für das FP relevant
sind:
- Histogramme (TH1F, TH2F)
- Graphen (TGraph, TGraphErrors)
● Außerdem: Funktions-Klasse (TF1), Definition von
benutzerdefinierten Funktionen
Felix Bührer - ROOT Einführung25.02.2013 11
Histogramme
dienen der Visualisierung von Wahrscheinlichkeitsverteilungen
6 + 1 = 7
Felix Bührer - ROOT Einführung25.02.2013 12
Histogramme
dienen der Visualisierung von Wahrscheinlichkeitsverteilungen
6 + 1 = 72 + 6 = 8
Felix Bührer - ROOT Einführung25.02.2013 13
Histogramme
dienen der Visualisierung von Wahrscheinlichkeitsverteilungen
6 + 1 = 72 + 6 = 82 + 3 = 5
Felix Bührer - ROOT Einführung25.02.2013 14
Histogramme
dienen der Visualisierung von Wahrscheinlichkeitsverteilungen
6 + 1 = 72 + 6 = 82 + 3 = 5
6 + 5 = 11
Felix Bührer - ROOT Einführung25.02.2013 15
Histogramme
dienen der Visualisierung von Wahrscheinlichkeitsverteilungen
6 + 1 = 72 + 6 = 82 + 3 = 5
6 + 5 = 114 + 5 = 9
Felix Bührer - ROOT Einführung25.02.2013 16
Histogramme
dienen der Visualisierung von Wahrscheinlichkeitsverteilungen
6 + 1 = 72 + 6 = 82 + 3 = 5
6 + 5 = 114 + 5 = 95 + 4 = 9
Felix Bührer - ROOT Einführung25.02.2013 17
Histogramme
dienen der Visualisierung von Wahrscheinlichkeitsverteilungen
6 + 1 = 72 + 6 = 82 + 3 = 5
6 + 5 = 114 + 5 = 95 + 4 = 92 + 5 = 7
...
Felix Bührer - ROOT Einführung25.02.2013 18
Histogramme
dienen der Visualisierung von Wahrscheinlichkeitsverteilungen
6 + 1 = 72 + 6 = 82 + 3 = 5
6 + 5 = 114 + 5 = 95 + 4 = 92 + 5 = 7
...
Felix Bührer - ROOT Einführung25.02.2013 19
Histogramme
dienen der Visualisierung von Wahrscheinlichkeitsverteilungen
6 + 1 = 72 + 6 = 82 + 3 = 5
6 + 5 = 114 + 5 = 95 + 4 = 92 + 5 = 7
...
1/6
5/36
1/9
1/12
1/18
1/36
Felix Bührer - ROOT Einführung25.02.2013 20
Histogramme● “Buchen”
● Mehrfach füllen
● Zeichnen
wobei Option=“”, “E” (√N Fehlerbalken), “SAME” (Histogramm über
altes Histogramm), “C” (glatte Kurve), “L” (Linie) oder Kombinationen z.B.
“SAME,E”.
TH1F* myHist=new TH1F(“myHisto”,“Distribution”,10,0.,1.);
myHist->Fill(x);
myHist->Draw(“Option”);
Name des Objekts Name beim Speichern Titel Anzahl Bins
X Achse von bis
Felix Bührer - ROOT Einführung25.02.2013 21
Histogramme
void histogram(){ gROOT->Reset(); gROOT->SetStyle("Plain"); TH1F* myHist = new TH1F("myHist","Distribution”, 10,0.,1.); myHist->Fill(0.37); //Bin 4 myHist->Fill(0.35); //Bin 4 myHist->Fill(0.78); //Bin 8 myHist->Fill(0.51); //Bin 6 myHist->Draw();}
Für schönere Grafik
Felix Bührer - ROOT Einführung25.02.2013 22
Histogramme
void histogram(){ gROOT->Reset(); gROOT->SetStyle("Plain"); TH1F* myHist = new TH1F("myHist","Distribution”
,10,0.,1.); myHist->Fill(0.37); //Bin 4 myHist->Fill(0.35); //Bin 4 myHist->Fill(0.78); //Bin 8 myHist->Fill(0.51); //Bin 6 myHist->Draw();}
Für schönere Grafik
Felix Bührer - ROOT Einführung25.02.2013 23
Rechtsklickmenüs
Viele Funktionen sindauch per Rechtsklick auf das passende Objekt erreichbar.
Felix Bührer - ROOT Einführung25.02.2013 24
Optionen● Für Linien
Hist->SetLineStyle(x); Hist->SetLineColor(x); Hist->SetLineWidth(x);
● Für Marker
Hist->SetMarkerStyle(x); Hist->SetMarkerColor(x); Hist->SetMarkerSize(x);
● Für Flächen
Hist->SetFillStyle(x); Hist->SetFillColor(x);
● Für Achsen
Hist->GetXaxis()->SetTitle(“#phi_{2}^{2}”);
Hist->GetYaxis()->SetRangeUser(-1.,1.);
● Für den Titel
Hist->SetTitle(“Titel”);
Latex mit # statt \
Felix Bührer - ROOT Einführung25.02.2013 25
Farben, Linien, Marker, ...
Felix Bührer - ROOT Einführung25.02.2013 26
Farben, Linien, Marker, ...
http://root.cern.ch/root/html522/TAttLine.htmlhttp://root.cern.ch/root/html522/TAttFill.htmlhttp://root.cern.ch/root/html522/TAttMarker.html
Felix Bührer - ROOT Einführung25.02.2013 27
Eine typische FP-Auswertung
z.B. Spannung in 0.1s Schritten
● Aus dem Versuch: Messwerte in Textdatei
● Ziel ist es die Werte darzustellen und eine
Anpassung durchzuführen
1. Einlesen der Daten
2. Füllen der Messwerte in geeignete
Datenstruktur
3. Anpassung einer Funktion an die Daten
peaks.dat:
322323322312314335291331329317318337336364310etc.
Felix Bührer - ROOT Einführung25.02.2013 28
Einlesen von Datenvoid readFile(){ gROOT->Reset(); gROOT->SetStyle("Plain"); ifstream in; //Input Stream in.open("peaks.dat"); //Oeffnen der Datei Float_t xi; Int_t nlines = 0;
TH1F* _histo = new TH1F("_histo","Peaks", 1250, 0., 125 );
while( !in.eof() ){ //Bis zum Ende der Datei if(in >> xi){ //Einlesen einer Zeile _histo->SetBinContent( nlines, xi );
//Setzen des Bin Inhalts nlines++; cout << nlines << ": " << xi <<endl; } }
cout<<"found "<<nlines<<" data points"<<endl; in.close(); _histo->Draw();}
peaks.dat:
322323322312314335291331329317318337336364310etc.
Felix Bührer - ROOT Einführung25.02.2013 29
Füllen in ein Histogrammvoid readFile(){ gROOT->Reset(); gROOT->SetStyle("Plain"); ifstream in; //Input Stream in.open("peaks.dat"); //Oeffnen der Datei Float_t xi; Int_t nlines = 0;
TH1F* _histo = new TH1F("_histo","Peaks", 1250, 0., 125 );
while( !in.eof() ){ //Bis zum Ende der Datei if(in >> xi){ //Einlesen einer Zeile _histo->SetBinContent( nlines, xi );
//Setzen des Bin Inhalts nlines++; cout << nlines << ": " << xi <<endl; } }
cout<<"found "<<nlines<<" data points"<<endl; in.close(); _histo->Draw();}
peaks.dat:
322323322312314335291331329317318337336364310etc.
Felix Bührer - ROOT Einführung25.02.2013 30
Füllen in ein Histogrammvoid readFile(){ gROOT->Reset(); gROOT->SetStyle("Plain"); ifstream in; //Input Stream in.open("peaks.dat"); //Oeffnen der Datei Float_t xi; Int_t nlines = 0;
TH1F* _histo = new TH1F("_histo","Peaks", 1250, 0., 125 );
while( !in.eof() ){ //Bis zum Ende der Datei if(in >> xi){ //Einlesen einer Zeile _histo->SetBinContent( nlines, xi );
//Setzen des Bin Inhalts nlines++; cout << nlines << ": " << xi <<endl; } }
cout<<"found "<<nlines<<" data points"<<endl; in.close(); _histo->Draw();}
peaks.dat:
322323322312314335291331329317318337336364310etc.
Felix Bührer - ROOT Einführung25.02.2013 31
1D-Fit
Felix Bührer - ROOT Einführung25.02.2013 32
Einschub: FunktionenROOT kann
● exp(x), sin(x), log(x), sqrt(x)
● gaus (mit 1 s!), Landau,...
● TMath Funktionen
http://root.cern.ch/root/html522/TMath.html
● Beliebige Funktionen
void function(){ gROOT->Reset(); gROOT->SetStyle("Plain"); TF1 *myFunc = new TF1("myFunction", "sin(x)/x",0.,6.5.); myFunc->Draw(); myFunc->GetXaxis()->SetTitle("x"); myFunc->GetYaxis()->SetTitle("f(x)=sin(x)/x"); myFunc->SetTitle("Funktion");}
Felix Bührer - ROOT Einführung25.02.2013 33
1D-Fit
.
.
.
_histo->Draw(); TF1* fitFunc = new TF1("fitFunc","pol1(0)+gaus(2)",0,130); fitFunc->SetParameter(3,70); fitFunc->SetParameter(4,5); fitFunc->SetLineColor(kRed); _histo->Fit("fitFunc","", "", 55,83); cout<<" --------------------------------" <<endl; cout<<" chi2/dof: "<< fitFunc->GetChisquare()/fitFunc->GetNDF()<<endl; }
Gaussfunktion [2]*exp(-((x-[3])/(2*[4]))^2) (Parameternummerierung startet bei 2)
Polynom ersten Grades [0]+[1]*x Parameternummerierung startet bei 0)
Startwerte setzen
Fit durchführen
Felix Bührer - ROOT Einführung25.02.2013 34
1D-Fit
.
.
.
_histo->Draw(); TF1* fitFunc = new TF1("fitFunc","pol1(0)+gaus(2)",0,130); fitFunc->SetParameter(3,70); fitFunc->SetParameter(4,5); fitFunc->SetLineColor(kRed); _histo->Fit("fitFunc","", "", 55,83); cout<<" --------------------------------" <<endl; cout<<" chi2/dof: "<< fitFunc->GetChisquare()/fitFunc->GetNDF()<<endl; }
Gaussfunktion [2]*exp(-((x-[3])/(2*[4]))^2) (Parameternummerierung startet bei 2)
Polynom ersten Grades [0]+[1]*x Parameternummerierung startet bei 0)
Startwerte setzen
Fit durchführen
Felix Bührer - ROOT Einführung25.02.2013 35
Kovarianzmatrix
.
.
.
_histo->Draw(); TF1* fitFunc = new TF1("fitFunc","pol1(0)+gaus(2)",0,130); fitFunc->SetParameter(3,70); fitFunc->SetParameter(4,5); fitFunc->SetLineColor(kRed); _histo->Fit("fitFunc","", "", 55,83); cout<<" --------------------------------" <<endl; cout<<" chi2/dof: "<< fitFunc->GetChisquare()/fitFunc->GetNDF()<<endl;
TVirtualFitter *fitter = TVirtualFitter::GetFitter(); TMatrixD *matrix = new TMatrixD(5,5,fitter->GetCovarianceMatrix()); matrix->Print(); }
Gaussfunktion [2]*exp(-((x-[3])/(2*[4]))^2) (Parameternummerierung startet bei 2)
Polynom ersten Grades [0]+[1]*x Parameternummerierung startet bei 0)
Startwerte setzen
Fit durchführen
Felix Bührer - ROOT Einführung25.02.2013 36
Kovarianzmatrix
.
.
.
_histo->Draw(); TF1* fitFunc = new TF1("fitFunc","pol1(0)+gaus(2)",0,130); fitFunc->SetParameter(3,70); fitFunc->SetParameter(4,5); fitFunc->SetLineColor(kRed); _histo->Fit("fitFunc","", "", 55,83); cout<<" --------------------------------" <<endl; cout<<" chi2/dof: "<< fitFunc->GetChisquare()/fitFunc->GetNDF()<<endl;
TVirtualFitter *fitter = TVirtualFitter::GetFitter(); TMatrixD *matrix = new TMatrixD(5,5,fitter->GetCovarianceMatrix()); matrix->Print(); }
Gaussfunktion [2]*exp(-((x-[3])/(2*[4]))^2) (Parameternummerierung startet bei 2)
Polynom ersten Grades [0]+[1]*x Parameternummerierung startet bei 0)
Startwerte setzen
Fit durchführen
Felix Bührer - ROOT Einführung25.02.2013 37
2D-Histogrammevoid twodhistos(){ gROOT->Reset(); gStyle->SetPalette(1); TCanvas *c1 = new TCanvas("c1","Canvas fuer viele Histogramme",800,800); c1->Divide(2,2); TH2F *h2 = new TH2F("h2","Energie vs Impuls",40,-5.,5.,40,-5.,5.); h2->FillRandom("gaus",6000); h2->GetXaxis()->SetTitle("Energie E (GeV)"); h2->GetYaxis()->SetTitle("Impuls p (GeV)"); h2->GetZaxis()->SetTitle("Ereignisse"); TF2* f2=new TF2("func2","sin(x)*sin(y)/(x*y)",-10.,10.,-10.,10.); c1->cd(1); h2->GetXaxis()->SetTitleOffset(1.5); h2->GetYaxis()->SetTitleOffset(1.5); h2->GetZaxis()->SetTitleOffset(1.2); h2->Draw("LEGO2"); c1->cd(2); h2->Draw("COL"); c1->cd(3); f2->Draw("SURF1"); c1->cd(4); f2->Draw("COLZ");}
Felix Bührer - ROOT Einführung25.02.2013 38
2D-Histogramme
Felix Bührer - ROOT Einführung25.02.2013 39
void graph(){ gROOT->Reset(); gROOT->SetStyle("Plain");
const int n = 300;//const wird zur Array Initialisierung benoetigt double x[n]; double y[n];
ifstream in; //Input Stream in.open("peak.dat"); //Oeffnen der Datei Int_t nlines = 0;
while( !in.eof() && nlines < n ){ //Bis zum Ende der Datei if(in >> x[nlines] >> y[nlines]){ //Einlesen einer Zeile nlines++; cout << nlines << ": " << x[nlines] << " " << y[nlines] << endl; } }
cout << "found "<< nlines << " data points."<<endl; in.close();
TGraph *gr = new TGraph(n,x,y); gr->Draw("AL");//Option A zeichnet Achsen, L Linien}
Graphen
Für nicht-äquidistante Messpunkte
Felix Bührer - ROOT Einführung25.02.2013 40
void graph(){ gROOT->Reset(); gROOT->SetStyle("Plain");
const int n = 300;//const wird zur Array Initialisierung benoetigt double x[n]; double y[n];
ifstream in; //Input Stream in.open("peak.dat"); //Oeffnen der Datei Int_t nlines = 0;
while( !in.eof() && nlines < n ){ //Bis zum Ende der Datei if(in >> x[nlines] >> y[nlines]){ //Einlesen einer Zeile nlines++; cout << nlines << ": " << x[nlines] << " " << y[nlines] << endl; } }
cout << "found "<< nlines << " data points."<<endl; in.close();
TGraph *gr = new TGraph(n,x,y); gr->Draw("AL");//Option A zeichnet Achsen, L Linien}
Graphen
Für nicht-äquidistante Messpunkte
Felix Bührer - ROOT Einführung25.02.2013 41
Graphen mit Fehlernvoid grapherrors(){ gROOT->Reset(); gROOT->SetStyle("Plain");
const int n = 10;//const is need in array initialization double x[n] = {-0.22, 0.05, 0.25, 0.35, 0.5, 0.61,0.7,0.85,0.89,0.95}; double y[n] = {1,2.9,5.6,7.4,9,9.6,8.7,6.3,4.5,1}; double ex[n] = {.05,.1,.07,.07,.04,.05,.06,.07,.08,.05}; double ey[n] = {.8,.7,.6,.5,.4,.4,.5,.6,.7,.8}; TGraphErrors *gr = new TGraphErrors(n,x,y,ex,ey); gr->Draw("ALP");}
Felix Bührer - ROOT Einführung25.02.2013 42
Zusammenfassung● Root zu benutzen ist eigentlich gar
nicht so schwer
● Die Online-Hilfe ist empfehlenswert
unverzichtbar
● “Google ist dein Freund”
● Ansonsten eure Betreuer fragen.
http://root.cern.ch
ROOT is user friendly (but it picks its friends carefully)
Felix Bührer - ROOT Einführung25.02.2013 43
Zum weiterlesen
Diese Einführung mit allen Code-Beispielen ist zu finden unter:
wwwhep.physik.uni-freiburg.de/fp/root2012-2/
Falls es Probleme mit den Beispielen gibt -> Kurze
Rückmeldung an mich.
Felix Bührer - ROOT Einführung25.02.2013 44
Backup
Felix Bührer - ROOT Einführung25.02.2013 45
Root Dateien
Histogramm speichern
Histogramm laden
void readHisto(){ gROOT->Reset(); gROOT->SetStyle("Plain"); TFile* _file=new TFile("histo.root","OPEN"); TH1F* _myH1 = (TH1F*)_file->Get("myHisto"); _myH1->Draw();}
void writeHisto(){ gROOT->Reset(); gROOT->SetStyle("Plain"); TFile* _file=new TFile("histo.root","RECREATE"); TH1F* myHist = new TH1F("myHisto","Distribution",10,0.,1.); myHist->Fill(0.37); myHist->Fill(0.35); myHist->Fill(0.78); myHist->Fill(0.51); myHist->Write(); _file->Close();}
TBrowser b
Oder interaktiv
Histogramm laden
new TBrowser
Felix Bührer - ROOT Einführung25.02.2013 46
PyROOT
import ROOThist = ROOT.TH1F("hist", "hist", 20, -5, 5)hist.FillRandom("gaus",10000)hist.Draw()raw_input("Press Enter to Exit")
● Wer sich in Python sicherer fühlt als mit C++: Alle
ROOT-Klassen existieren als Python-Modul
● Um Python mit ROOT benutzen zu können: ROOT-Modul in
$PYTHONPATH eintragen