Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

ROOT-Einführung Julian Glatzer Fortgeschrittenenpraktikum Martin Flechl

Ähnliche Präsentationen


Präsentation zum Thema: "ROOT-Einführung Julian Glatzer Fortgeschrittenenpraktikum Martin Flechl"—  Präsentation transkript:

1 ROOT-Einführung Julian Glatzer Fortgeschrittenenpraktikum Martin Flechl Felix Bührer

2 Martin Flechl - ROOT-Einführung Zweck dieser Einführung ● ROOT ist ein Werkzeug, das ihr im FP häufig verwenden werdet ● Diese Einführung soll euch zeigen, – wie ihr ROOT überhaupt laufen können läßt, – was man damit machen kann, – und beinhaltet viele nützliche Beispiele ● Diese Folien sind im Netz (Link auf FP-Homepage): wwwhep.physik.uni-freiburg.de/fp/root2013-1/ damit sie im FP zum Nachschlagen verwendet werden können wwwhep.physik.uni-freiburg.de/fp/root2013-1/

3 Martin Flechl - ROOT-Einführung 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

4 Martin Flechl - ROOT-Einführung Warum ROOT? ● Mit ROOT: ● - es ist sehr einfach, häufig benutzte Schritte zu wiederholen - sehr mächtige Funktionen zur statistischen Auswertung, zum Fitten und zur Visualisierung von Ergebnissen - ideales Werkzeug für viele FP-Problemstellungen

5 Martin Flechl - ROOT-Einführung ● – User's Guide in “Buchform” (PDFs) – Reference Guide Erklärung aller Klassen – HowTo's ● Google Suche – TH1F site:root.cern.ch ● Bei uns: Westbau / GMH, Hilfe

6 Martin Flechl - ROOT-Einführung 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 roothttp://root.cern.ch/drupal/content/downloading- root ●...oder Source-Code selber kompilieren

7 Martin Flechl - ROOT-Einführung Erste Schritte ● Es gibt mehrere Möglichkeiten ROOT zu benutzen: - über eine interaktive Shell (CINT) - via Makros welche von ROOT ausgeführt werden können - durch Einbinden von ROOT-Klassen in kompilierfähigen C++-Code - über ein ROOT-Modul für Python

8 Martin Flechl - ROOT-Einführung Erste Schritte: Interaktiv ● Starten durch Eingabe von root (bzw. root.exe) im Terminal oder Klick auf Desktop-Icon ● Root hat einen eingebauten C++ Interpreter (CINT) ● Mit den Tasten ↑ ↓ erreicht man die zuletzt benutzten Befehle ● Beenden mit.q ● Nützlich zum Testen oder für schnelle einfache Rechnungen

9 Martin Flechl - ROOT-Einführung ● 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(){ cout << "Beispiel 1: "<

10 Martin Flechl - ROOT-Einführung C++: Funktionen void 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( parameter) Aufruf: name() bzw. name(1) Variablendefinition: Typ name=wert Ausgabe: cout: Ausgabezeile endl: end line Komplexere Objekte: Typ* name=new Typ(Parameter) Aufruf von Objektfunktion mit ->

11 Martin Flechl - ROOT-Einführung 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

12 Martin Flechl - ROOT-Einführung Histogramme dienen der Visualisierung von Wahrscheinlichkeitsverteilungen = 7

13 Martin Flechl - ROOT-Einführung Histogramme dienen der Visualisierung von Wahrscheinlichkeitsverteilungen = = 8

14 Martin Flechl - ROOT-Einführung Histogramme dienen der Visualisierung von Wahrscheinlichkeitsverteilungen = = = 5

15 Martin Flechl - ROOT-Einführung Histogramme dienen der Visualisierung von Wahrscheinlichkeitsverteilungen = = = = 11

16 Martin Flechl - ROOT-Einführung Histogramme dienen der Visualisierung von Wahrscheinlichkeitsverteilungen = = = = = 9

17 Martin Flechl - ROOT-Einführung Histogramme dienen der Visualisierung von Wahrscheinlichkeitsverteilungen = = = = = = 9

18 Martin Flechl - ROOT-Einführung Histogramme dienen der Visualisierung von Wahrscheinlichkeitsverteilungen = = = = = = = 7...

19 Martin Flechl - ROOT-Einführung Histogramme dienen der Visualisierung von Wahrscheinlichkeitsverteilungen = = = = = = = 7...

20 Martin Flechl - ROOT-Einführung Histogramme dienen der Visualisierung von Wahrscheinlichkeitsverteilungen = = = = = = = /6 5/36 1/9 1/12 1/18 1/36

21 Martin Flechl - ROOT-Einführung Histogramme ● Deklaration (“Objekt erstellen”) ● Werte einfüllen (z.B. x...Würfelergebnis) ● 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”,12,0.,12.); myHist->Fill(x); myHist->Draw(“Option”); Name des ObjektsRoot-interner Name Titel Anzahl Bins X Achse von bis

22 Martin Flechl - ROOT-Einführung 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

23 Martin Flechl - ROOT-Einführung 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

24 Martin Flechl - ROOT-Einführung Optionen ● Für Linien Hist->SetLineStyle(x); Hist->SetLineColor(x); Hist->SetLineWidth(x); ● Für Marker (Symbole für Datenpunkte) 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.); gPad->SetLogy(); ● Für den Titel Hist->SetTitle(“Titel”); Latex mit # statt \

25 Martin Flechl - ROOT-Einführung Farben, Linien, Marker,...

26 Martin Flechl - ROOT-Einführung Farben, Linien, Marker,...

27 Martin Flechl - ROOT-Einführung Rechtsklickmenüs Viele Funktionen sind auch per Rechtsklick auf das passende Objekt erreichbar.

28 Martin Flechl - ROOT-Einführung 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 (“Fit”) durchzuführen ● 1. Einlesen der Daten ● 2. Füllen der Messwerte in geeignete Datenstruktur ● 3. Anpassung einer Funktion an die Daten peaks.dat: etc.

29 Martin Flechl - ROOT-Einführung Einlesen von Daten void readFile(){ gROOT->Reset(); gROOT->SetStyle("Plain"); ifstream in; //Input Stream in.open("peaks.dat"); //Oeffnen der Datei Float_t xi; Int_t iline = 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 iline++; cout << iline << ": " << xi <Draw(); } peaks.dat: etc.

30 Martin Flechl - ROOT-Einführung Füllen in ein Histogramm void readFile(){ gROOT->Reset(); gROOT->SetStyle("Plain"); ifstream in; //Input Stream in.open("peaks.dat"); //Oeffnen der Datei Float_t xi; Int_t iline = 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( iline, xi ); //Setzen des Bin Inhalts iline++; cout << iline << ": " << xi <Draw(); } peaks.dat: etc.

31 Martin Flechl - ROOT-Einführung Füllen in ein Histogramm void readFile(){ gROOT->Reset(); gROOT->SetStyle("Plain"); ifstream in; //Input Stream in.open("peaks.dat"); //Oeffnen der Datei Float_t xi; Int_t iline = 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( iline, xi ); //Setzen des Bin Inhalts iline++; cout << iline << ": " << xi <Draw(); } peaks.dat: etc.

32 Martin Flechl - ROOT-Einführung D-Fit

33 Martin Flechl - ROOT-Einführung Einschub: Funktionen ROOT kann ● exp(x), sin(x), log(x), sqrt(x) ● gaus (mit 1 s!), Landau,... ● TMath Funktionen ● 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"); }

34 Martin Flechl - ROOT-Einführung D-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<<" " <GetNDF()<

35 Martin Flechl - ROOT-Einführung D-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<<" " <GetNDF()<

36 Martin Flechl - ROOT-Einführung 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<<" " <GetNDF()<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

37 Martin Flechl - ROOT-Einführung 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<<" " <GetNDF()<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

38 Martin Flechl - ROOT-Einführung D-Histos/-Funktionen void 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); //sonst: h2->Fill(2.3,4.4); 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"); }

39 Martin Flechl - ROOT-Einführung D-Histogramme

40 Martin Flechl - ROOT-Einführung void graph(){ gROOT->Reset(); gROOT->SetStyle("Plain"); const int n = 300; //Anzahl der Datenpunkte //const wird zur Array-Initialisierung benoetigt double x[n]={0}; double y[n]={0}; //Vektoren mit (x/y)-Werten ifstream in; //Input Stream in.open("peak.dat"); //Oeffnen der Datei Int_t iline = 0; while( !in.eof() && iline < n ){ //Bis zum Ende der Datei if(in >> x[iline] >> y[iline]){ //Einlesen einer Zeile iline++; cout << iline << ": " << x[iline] << " " << y[iline] << endl; } cout << "found "<< iline << " data points."<Draw("AL");//Option A zeichnet Achsen, L Linien } Graphen 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."<Draw("AL");//Option A zeichnet Achsen, L Linien } Menge von (x/y)-Werten [(x/y/z) für 2D] (auch) für nicht-äquidistante Messpunkte peak.dat: etc.

41 Martin Flechl - ROOT-Einführung 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."<Draw("AL");//Option A zeichnet Achsen, L Linien } Graphen 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."<Draw("AL");//Option A zeichnet Achsen, L Linien } Für nicht-äquidistante Messpunkte

42 Martin Flechl - ROOT-Einführung Graphen mit Fehlern void 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"); } void 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"); } x, y:Koordinaten des Messpunkts ex, ey:Fehlerbalkengröße in x/y-Richtung [TGraphAsymmErrors: unabhängige Fehlergröße in +/- –Richtung]

43 Martin Flechl - ROOT-Einführung Zusammenfassung ● Root zu benutzen ist eigentlich gar nicht so schwer ● Die Online-Hilfe ist empfehlenswert unverzichtbar ● Ansonsten eure Betreuer fragen.

44 Martin Flechl - ROOT-Einführung Zum Weiterlesen Diese Einführung mit allen Code-Beispielen ist zu finden unter: wwwhep.physik.uni-freiburg.de/fp/root2013-1/ Viele zusätzliche Code-Beispiele gibt es hier: wwwhep.physik.uni-freiburg.de/fp/root2013-1/

45 Martin Flechl - ROOT-Einführung Backup

46 Martin Flechl - ROOT-Einführung 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

47 Martin Flechl - ROOT-Einführung PyROOT void 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"); } import ROOT hist = 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


Herunterladen ppt "ROOT-Einführung Julian Glatzer Fortgeschrittenenpraktikum Martin Flechl"

Ähnliche Präsentationen


Google-Anzeigen