// ************************************************************************************************
//
// ROOT-Skript für Fehlerdiagramme
//
// 1) Erstellung eines 2D-Histogramms
// 2) Einfügen von (1D)-Fehler-Achsen
//
// Heruntergeladen von: www.jb-electronics.de
//

// Anzahl der Messwerte
const int N = 50;

// Arrays für die Messwerte und die Fehler
double messwerte[N], fehler[N];

void fehlerbalken1d (void)  {

	// Beispielwerte für die Messungen
	int min = 5, max = 15;
	int minfehler = -1, maxfehler = 2;

	// Zufallsgenerator initialisieren
	TRandom *t = new TRandom();
	
	// zufällige "Messwerte" generieren
	for (int i = 0; i < N; i++) {
		messwerte[i]	= t->Uniform(min, max);
		fehler[i]		= t->Uniform(minfehler, maxfehler);
	}

	// Anzeigestil "schlicht" setzen
    gROOT->SetStyle("Plain");
 
    // Plotvorbereitungen: ein leeres Histogramm erstellen, denn wir benötigen zwei Achsen
	gStyle->SetOptStat(0); // nichts am Histogramm anzeigen
    gStyle->SetOptFit(1111); // zeige keine Fit-Parameter an
    TH2D *hempty = new TH2D("hempty", "", 1, 0, N + 1, 1, min + minfehler, max + maxfehler);
    hempty->GetXaxis()->SetTitle("Messung [#]");
    hempty->GetYaxis()->SetTitle("Messwert [Einheit]");
    hempty->Draw();

	// Erstelle Fehlerdiagramm
    // http://root.cern.ch/root/html520/TGraphErrors.html
    TGraphErrors *fehlerdiagramm = new TGraphErrors(N);
	
	// Farben einstellen
    fehlerdiagramm->SetLineColor(TColor::GetColor(255, 150, 150));
    fehlerdiagramm->SetMarkerStyle(kFullCircle);
	fehlerdiagramm->SetMarkerColor(kBlue);
	
	// Werte eintragen
    for (int i = 0; i < N; i++) {
		fehlerdiagramm->SetPoint(i, i + 1, messwerte[i]);
        fehlerdiagramm->SetPointError(i, 0, fehler[i]);
    }
	
	// Legende erstellen
	TLegend *leg = new TLegend(0.64, 0.15, 0.87, 0.29);
	leg->AddEntry(fehlerdiagramm, "Messreihe", "p");
	
	// Anzeigen
	fehlerdiagramm->Draw("P");
	leg->Draw();
	
}