ROOT Tutorial - Bonn: Difference between revisions

From KIP Wiki
⧼kip-jumptonavigation⧽⧼kip-jumptosearch⧽
(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...)
 
No edit summary
 
Line 1: Line 1:
Nicked from Uni Bonn - Thanks! ;)


= Erstellen von Histogrammen =
= Erstellen von Histogrammen =



Latest revision as of 10:22, 28 October 2008

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:

http://root.cern.ch/