ROOT Tutorial - Bonn
Nicked from Uni Bonn - Thanks! ;)
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: