ROOT Tutorial - Bonn

From KIP Wiki
Revision as of 10:21, 28 October 2008 by Fruehr (talk | contribs) (New page: = Erstellen von Histogrammen = ZunĂ€chst muss man das leere Histogram anlegen, in diesem Fall ein 1-dimensionales Histogram fĂŒr Float-Genauigkeit pro Bin: TH1F * myhisto = new TH1F("m...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
⧌kip-jumptonavigation⧜⧌kip-jumptosearch⧜

Erstellen von Histogrammen

ZunĂ€chst muss man das leere Histogram anlegen, in diesem Fall ein 1-dimensionales Histogram fĂŒr Float-Genauigkeit pro Bin:

 TH1F * myhisto = new TH1F("myHisto", "my Title", 20, 0, 20);

'myhisto' ist der Name des Zeigers auf das Histogram, "myHisto" der Name des Histograms, "my Title" der Titel, 20 die Anzahl der Bins insgesamt, und die letzten beiden Zahlen geben an, dass die Bins von 0-20 laufen sollen. Zur Auswahl stehen auch weitere Histogramme, zum Beispiel 1-dim. fĂŒr ein Byte pro Bin (TH1C), fĂŒr Short (TH1S), fĂŒr Integer (TH1I) oder fĂŒr Double (TH1D) pro Bin. Je nach Auswahl variiert der maximale BinInhalt/die maximale Genauigkeit pro Bin. Es gibt auch 2- und dreidimensionale Histogramme (z.B. TH2F oder TH3F). Diese erzeugt man analog mit:

 TH2F * myhisto_2dim = new TH2F("myHisto", "my Title", 20, 0, 20, 10, -5, 5); 

Um spÀter das Histogram normieren zu können, oder EintrÀge gewichtet vornehmen zu können, und dennoch Fehlerbalken halbwegs sinnvoller Natur anzeigen zu können, brauchen wir nun:

 myhisto->Sumw2();

Diese Funktion veranlasst, dass beim FĂŒllen/Normieren des Histogramms gleichzeitig die die Summe der Quadrate der Gewichte pro Bin gespeichert wird. Die Fehlerbalken könnend dann spĂ€ter als Wurzel aus den selbigen Summen berechnet werden. Macht man das nicht, bekommt man als Fehler einfach die Wurzel aus der Summe des Bins selbst, was gerade bei auf 1 normierten Histogrammen natĂŒrlich viel zu gross ist. Das leere Histogramm können wir nun anschauen mit:

 myhisto->Draw();

Da das noch etwas langweilig ist, ist es wohl zweckmĂ€ĂŸig, nun etwas in das Histogram einzufĂŒllen:

 myhisto->Fill(12);

Man kann auch Ereignisse beim EinfĂŒllen auch mit einem Gewicht (hier 3) versehen.

 myhisto->Fill(9,3);

Um das Resultat zu sehen, kann man das Histogramm mit

  myhisto->Draw();

neu zeichnen lassen. Man kann der 'Draw()'-Funktion auch Optionen mitgeben, die Allgemeines zum Aussehen spezifizieren, z.B.

  myhisto->Draw("HIST");

ohne Fehlerbalken oder

  myhisto->Draw("SAME");

um 2 Histogramme ĂŒbereinander ins gleiche Panel zu malen.

Oft möchte man ein Histogramm auf Eins normieren. Dies geht z.B. mit

 Double_t scale = 1/myhisto->Integral();
 myhisto->Scale(scale);

oder vielleicht eleganter mit

 myhisto->DrawNormalized();

Die Overflow/Underflow-Bins werden dabei nicht mitberechnet.

Speichern von Histogrammen in einer .root-Datei

Um das Histogram fĂŒr spĂ€tere Verwendung zu speichern, legt man zunĂ€chst eine Root-Datei an.

 TFile * myfile = new TFile("myfile.root", "RECREATE");

Die Option 'RECREATE' ist optional und gibt an, dass, falls bereits eine Datei mit dem angebenen Namen existiert, diese ĂŒberschrieben wird. Ansonsten wird eine neue Datei angelegt. Da man natĂŒrlich mehrere TFile-Objekte im gleichen Programm haben kann, kann man mit

 myfile->cd();

eine Datei als die gerade relevante auswÀhlen. Das Histogramm (und alle anderen gerade existenten) schreiben wir in die Datei mit

 myfile->Write();

Danach kann die Datei geschlossen werden.

 myfile->Close();

SpÀter kann man die Datei wieder anhÀngen und das Histogramm anschauen wie unter 'Allgemeines' beschrieben oder auch anderweitig weiter bearbeiten.

Darstellung mehrerer Histogramme im TCanvas

Teilung des TCanvas

ZunĂ€chst muss der TCanvas natĂŒrlich erzeugt werden.

TCanvas * mycanvas = new TCanvas("myCanvas", "my Title", 1);

Der TCanvas kann nun in beliebig viele kleinere TCanvas-Objekte (hier 2x3) aufgeteilt werden:

mycanvas->Divide(2,3);

Ein einzelner Unter-TCanvas (hier Nr. 3) wird mit

mycanvas->cd(3);

ausgewÀhlt. Nun kann ein Histogramm mit 'Draw' hineingemalt werden.

myhisto->Draw();

Gleicher TCanvas

Mit

myhisto->Draw("SAME");

kann ein Histogramm in den gleichen TCanvas gemalt werden wie das vorige. In dem Fall ist es u.U. sinnvoll, z.B. die Farbe der Histogramm-Linie zu Àndern:

myhisto->SetLineColor(4);

Die FlÀche unter der Histogramm-Linie kann man mit

myhisto->setFillColor(4);

in der gewĂ€hlten Farbe ausgemalt werden. Eine Liste der Zahlencodes fĂŒr die Farben findet sich unten.

THStack

Zur Darstellung mehrer Plots im gleichen Canvas kann auch der THStack nĂŒtzlich sein. Man erzeugt einen solchen mit:

 THStack * mystack = new THStack("myStack","my Title");

Mit 'Add' kann man Histogramme dem THStack hinzufĂŒgen:

 mystack->Add(myhisto);
 mystack->Add(myhisto2);

Beim Zeichnen des THStacks kann man nun festlegen, ob man die einzelnen Histogramme aufaddiert wie z.B. fĂŒr einen Massenpeak-Plot (default) oder nicht aufaddiert (Option 'nostack') darstellen möchte:

 mystack->Draw();
 mystack->Draw("nostack");


Histogramm-Achsen

Hier sind verschiedene Möglichkeiten aufgezĂ€hlt, die Histogramm-Achsen zu verĂ€ndern. FĂŒr Y-Achsen geht es analog. Titel:

 myhisto->GetXaxis()->SetTitle("my x-axis label");

Anzahl der Achsenunterteilungen:

myhisto->GetXaxis()->SetNdivisions(20);

LĂ€nge der Achsenunterteilungs-Striche

 myhisto->GetXaxis()->SetTickLength(0.01);

Lage der Achsenunterteilungs-Striche ( "+" ĂŒber der Achse, "-" unter der Achse, "+-" beides):

 myhisto->GetXaxis()->SetTicks("+-");

Zahlen an der Achse in die Mitte des Bins legen:

 myhisto->GetXaxis()->CenterLabels();

Abstand der Zahlen zur Achse:

 myhisto->GetXaxis()->SetLabelOffset(0.01);

GrĂ¶ĂŸe der Zahlen:

 myhisto->GetXaxis()->SetLabelSize(0.03);

Abstand des Achsentitels zur Achse:

 myhisto->GetXaxis()->SetTitleOffset(1.1);

AchsenTitel in die Mitte der Achse rĂŒcken:

 myhisto->GetXaxis()->CenterTitle();

Farbe des Achsentitels:

 myhisto->GetXaxis()->SetTitleColor(2);

Bei Dezimalzahlen auch bei Integer-Zahlen Stellen hinter dem Komma anzeigen (also 2.0 statt 2)

 myhisto->GetXaxis()->SetDecimals();

GrĂ¶ĂŸe des Titels

 myhisto->GetXaxis()->SetTitleSize(0.035);


Statistik-Fenster

Blendet den unschönen Namen des Histograms im Statistik-Fenster auf. Das funktionierte bei mir mit Cint bei mir aber nur dann vernĂŒnftig, wenn der danach TCanvas neu erstellt wird.

gStyle->SetOptStat(110000);

Die Ziffer gibt an, ob eine spezielle Information angezeigt werden soll oder nicht. Dabei ist '1' an und '0' aus. So kann man mit

gStyle->SetOptStat(111100);

auch Over- und Underflow-Bin anzeigen lassen. Laut Root-Webseite soll es aber nicht sinnvoll sein, Zahlencodes wie '001111' mit voranstehenden Nullen anzugeben, da diese dann als hexadezimale Zahlen interpretiert werden. Darum sollten voranstehende Nullen weggelassen werden: '001111' -> '1111' Ganz entfernen kann man die Statistikbox mit

gStyle->SetOptStat(0);


TCanvas

Um den Hintergrund des TCanvas weiss zu machen:

 c1->SetFillColor(0);
 c1->SetFrameBorderMode(0);

Siehe dazu auch Markus' Tipps: http://silabwiki.physik.uni-bonn.de/wiki/Tipps_zu_ROOT [bearbeiten] Farbcodes

schwarz = 1 rot = 2 hellgrĂŒn = 3 blau = 4 gelb = 5 pink = 6 tĂŒrkis = 7 grĂŒn = 8 lila = 9 weiss = 10 grau = 11,12,....

Mehr Infos

  • Tipps zum Fitten mit Root:

http://atlas-wiki1.physik.uni-bonn.de/mediawiki/index.php/RootTutorialFits

  • Die Root-Webseite kann manchmal auch ganz hilfreich sein:

http://root.cern.ch/