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

// Anzahl der Messwerte
const int N = 50;

// Arrays für die Messwerte und die Fehler
double messwertex[N], messwertey[N], fehlerx[N], fehlery[N];

void fehlerbalken2d (void)  {

	TCanvas *c = new TCanvas("canvas");
	c->SetWindowSize(600, 450);

	// Beispielwerte für die Messungen
	int min_x = 5, max_x = 15;
	int min_y = -10, max_y = 12;
	int minfehler_x = -2, maxfehler_x = 2;
	int minfehler_y = -1, maxfehler_y = 2;

	// Zufallsgenerator initialisieren
	TRandom *t = new TRandom();
	
	// zufällige "Messwerte" generieren
	for (int i = 0; i < N; i++) {
		messwertex[i]	= t->Uniform(min_x, max_x);
		messwertey[i]	= t->Uniform(min_y, max_y);
		fehlerx[i]		= t->Uniform(minfehler_x, maxfehler_x);
		fehlery[i]		= t->Uniform(minfehler_y, maxfehler_y);
	}

	// 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, min_x + minfehler_x, max_x + maxfehler_x, 1, min_y + minfehler_y, max_y + maxfehler_y);
    hempty->GetXaxis()->SetTitle("Messwert x [Einheit]");
    hempty->GetYaxis()->SetTitle("Messwert y [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, messwertex[i], messwertey[i]);
        fehlerdiagramm->SetPointError(i, fehlerx[i], fehlery[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();
	
}