Adding new option - cumulative statistic
authormarian <marian@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 23 Nov 2007 21:50:00 +0000 (21:50 +0000)
committermarian <marian@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 23 Nov 2007 21:50:00 +0000 (21:50 +0000)
(Lars)

TPC/AliTPCCalibViewer.cxx
TPC/AliTPCCalibViewer.h
TPC/AliTPCCalibViewerGUI.cxx
TPC/AliTPCCalibViewerGUI.h

index 676db68..247588d 100644 (file)
@@ -37,6 +37,7 @@
 // ROOT includes 
 //
 #include <iostream>
+#include <fstream>
 #include <TString.h>
 #include <TRandom.h>
 #include <TLegend.h>
 #include "TTreeStream.h"
 #include "TFile.h"
 #include "TKey.h"
+#include "TGraph.h"
+#include "AliTPCCalibPulser.h"
+#include "AliTPCCalibPedestal.h"
+#include "AliTPCCalibCE.h"
+// #include "TObjArray.h"
+// #include "TObjString.h"
+// #include "TString.h"
+// #include "AliTPCCalPad.h"
 
 
 //
@@ -596,6 +605,99 @@ Int_t AliTPCCalibViewer::SigmaCut(const char* drawCommand, const char* sector, c
    return 1;
 }
 
+Int_t AliTPCCalibViewer::SigmaCutNew(const char* drawCommand, const char* sector, const char* cuts, Float_t sigmaMax, Bool_t plotMean, Bool_t plotMedian, Bool_t plotLTM, Bool_t pm, const char *sigmas, Float_t sigmaStep) const {
+   //
+   // Creates a histogram, where you can see, how much of the data are inside sigma-intervals 
+   // around the mean/median/LTM
+   // with drawCommand, sector and cuts you specify your input data, see EasyDraw
+   // sigmaMax: up to which sigma around the mean/median/LTM the histogram is generated (in units of sigma)
+   // sigmaStep: the binsize of the generated histogram
+   // plotMean/plotMedian/plotLTM: specifies where to put the center
+   //
+  
+   // Double_t ltmFraction = 0.8;  //unused
+   // avoid compiler warnings:
+   sigmaMax = sigmaMax;
+   pm = pm;
+   sigmaStep = sigmaStep;
+   
+   TString drawStr(drawCommand);
+   drawStr += " >> tempHist";
+   
+   Int_t entries = EasyDraw1D(drawStr.Data(), sector, cuts, "goff");
+   TH1F *htemp = (TH1F*)gDirectory->Get("tempHist");
+   TGraph *cutGraphMean   = 0;
+   // TGraph *cutGraphMedian = 0;
+   // TGraph *cutGraphLTM    = 0;
+   Double_t *values = fTree->GetV1();  // value is the array containing 'entries' numbers
+   Int_t    *index  = new Int_t[entries];
+   Float_t  *xarray = new Float_t[entries];
+   Float_t  *yarray = new Float_t[entries];
+   TMath::Sort(entries, values, index, kFALSE);
+   
+   Double_t mean = TMath::Mean(entries, values);
+   // Double_t median = TMath::Median(entries, values);
+   Double_t sigma = TMath::RMS(entries, values);
+   
+   TLegend * legend = new TLegend(.7,.7, .99, .99, "Cumulative");
+   fListOfObjectsToBeDeleted->Add(legend);
+   
+   // parse sigmas string
+   TObjArray *sigmasTokens = TString(sigmas).Tokenize(";");  
+   TVectorF nsigma(sigmasTokens->GetEntriesFast());
+   for (Int_t i = 0; i < sigmasTokens->GetEntriesFast(); i++) {
+      TString str(((TObjString*)sigmasTokens->At(i))->GetString());
+      Double_t sig = (str.IsFloat()) ? str.Atof() : 0;
+      nsigma[i] = sig;
+   }
+   
+   if (plotMean) {
+      for (Int_t i = 0; i < entries; i++) {
+         xarray[i] = TMath::Abs(values[index[i]] - mean) / sigma; 
+         yarray[i] = float(i) / float(entries);
+      }
+      cutGraphMean = new TGraph(entries, xarray, yarray);
+      if (cutGraphMean) {
+         fListOfObjectsToBeDeleted->Add(cutGraphMean);
+         cutGraphMean->SetLineColor(kRed);
+         legend->AddEntry(cutGraphMean, "Mean", "l");
+         cutGraphMean->SetTitle(Form("%s, Cumulative; Multiples of #sigma; Fraction of included data", htemp->GetTitle()));
+         cutGraphMean->Draw("alu");
+         DrawLines(cutGraphMean, nsigma, legend, kRed, kTRUE);
+      }
+   }
+   /*
+   if (plotMedian) {
+      cutHistoMedian = AliTPCCalibViewer::SigmaCut(htemp, median, sigma, sigmaMax, sigmaStep, pm);
+      if (cutHistoMedian) {
+         fListOfObjectsToBeDeleted->Add(cutHistoMedian);
+         cutHistoMedian->SetLineColor(kBlue);
+         legend->AddEntry(cutHistoMedian, "Median", "l");
+         cutHistoMedian->SetTitle(Form("%s, cumulative; Multiples of #sigma; Fraction of included data", htemp->GetTitle()));
+         if (plotMean && cutHistoMean) cutHistoMedian->Draw("same");
+            else cutHistoMedian->Draw();
+         DrawLines(cutHistoMedian, nsigma, legend, kBlue, pm);
+      }  // if (cutHistoMedian)
+   }
+   if (plotLTM) {
+      Double_t ltmRms = 0;
+      Double_t ltm = GetLTM(entries, values, &ltmRms, ltmFraction);
+      cutHistoLTM = AliTPCCalibViewer::SigmaCut(htemp, ltm, ltmRms, sigmaMax, sigmaStep, pm);
+      if (cutHistoLTM) {
+         fListOfObjectsToBeDeleted->Add(cutHistoLTM);
+         cutHistoLTM->SetLineColor(kGreen+2);
+         legend->AddEntry(cutHistoLTM, "LTM", "l");
+         cutHistoLTM->SetTitle(Form("%s, cumulative; Multiples of #sigma; Fraction of included data", htemp->GetTitle()));
+         if (plotMean && cutHistoMean || plotMedian && cutHistoMedian) cutHistoLTM->Draw("same");
+            else cutHistoLTM->Draw();
+         DrawLines(cutHistoLTM, nsigma, legend, kGreen+2, pm);
+      }
+   }*/
+   if (!plotMean && !plotMedian && !plotLTM) return -1;
+   legend->Draw();
+   return 1;
+}
+
 
 
 
@@ -622,7 +724,7 @@ Int_t AliTPCCalibViewer::Integrate(const char* drawCommand,       Int_t sector,
 }
 
 
-Int_t AliTPCCalibViewer::Integrate(const char* drawCommand, const char* sector, const char* cuts, Float_t sigmaMax, Bool_t plotMean, Bool_t plotMedian, Bool_t plotLTM, const char *sigmas, Float_t sigmaStep) const {
+Int_t AliTPCCalibViewer::IntegrateOld(const char* drawCommand, const char* sector, const char* cuts, Float_t sigmaMax, Bool_t plotMean, Bool_t plotMedian, Bool_t plotLTM, const char *sigmas, Float_t sigmaStep) const {
    //
    // Creates an integrated histogram Begin_Latex S(t, #mu, #sigma) End_Latex, out of the input distribution distribution Begin_Latex f(x, #mu, #sigma) End_Latex, given in "histogram"   
    // "mean" and "sigma" are Begin_Latex #mu End_Latex and  Begin_Latex #sigma End_Latex of the distribution in "histogram", to be specified by the user
@@ -706,6 +808,109 @@ Int_t AliTPCCalibViewer::Integrate(const char* drawCommand, const char* sector,
 }
 
 
+Int_t AliTPCCalibViewer::Integrate(const char* drawCommand, const char* sector, const char* cuts, Float_t sigmaMax, Bool_t plotMean, Bool_t plotMedian, Bool_t plotLTM, const char *sigmas, Float_t sigmaStep) const {
+   //
+   // Creates an integrated histogram Begin_Latex S(t, #mu, #sigma) End_Latex, out of the input distribution distribution Begin_Latex f(x, #mu, #sigma) End_Latex, given in "histogram"   
+   // "mean" and "sigma" are Begin_Latex #mu End_Latex and  Begin_Latex #sigma End_Latex of the distribution in "histogram", to be specified by the user
+   // sigmaMax: up to which sigma around the mean/median/LTM you want to integrate 
+   // if "igma == 0" and "sigmaMax == 0" the whole histogram is integrated
+   // "sigmaStep": the binsize of the generated histogram, -1 means, that the maximal reasonable stepsize is used
+   // The actual work is done on the array.
+   /* Begin_Latex 
+         f(x, #mu, #sigma)     #Rightarrow       S(t, #mu, #sigma) = #frac{#int_{-#infty}^{#mu + t #sigma} f(x, #mu, #sigma) dx}{ #int_{-#infty}^{+#infty} f(x, #mu, #sigma) dx }
+      End_Latex  
+   */
+   
+   Double_t ltmFraction = 0.8;
+   // avoid compiler warnings:
+   sigmaMax = sigmaMax;
+   sigmaStep = sigmaStep;
+   
+   TString drawStr(drawCommand);
+   drawStr += " >> tempHist";
+   
+   Int_t entries = EasyDraw1D(drawStr.Data(), sector, cuts, "goff");
+   TH1F *htemp = (TH1F*)gDirectory->Get("tempHist");
+   TGraph *integralGraphMean   = 0;
+   TGraph *integralGraphMedian = 0;
+   TGraph *integralGraphLTM    = 0;
+   Double_t *values = fTree->GetV1();  // value is the array containing 'entries' numbers
+   Int_t    *index  = new Int_t[entries];
+   Float_t  *xarray = new Float_t[entries];
+   Float_t  *yarray = new Float_t[entries];
+   TMath::Sort(entries, values, index, kFALSE);
+   
+   Double_t mean = TMath::Mean(entries, values);
+   Double_t median = TMath::Median(entries, values);
+   Double_t sigma = TMath::RMS(entries, values);
+   
+   // parse sigmas string
+   TObjArray *sigmasTokens = TString(sigmas).Tokenize(";");  
+   TVectorF nsigma(sigmasTokens->GetEntriesFast());
+   for (Int_t i = 0; i < sigmasTokens->GetEntriesFast(); i++) {
+      TString str(((TObjString*)sigmasTokens->At(i))->GetString());
+      Double_t sig = (str.IsFloat()) ? str.Atof() : 0;
+      nsigma[i] = sig;
+   }
+  
+   TLegend * legend = new TLegend(.7,.7, .99, .99, "Integrated histogram");
+   fListOfObjectsToBeDeleted->Add(legend);
+  
+   if (plotMean) {
+      for (Int_t i = 0; i < entries; i++) {
+         xarray[i] = (values[index[i]] - mean) / sigma; 
+         yarray[i] = float(i) / float(entries);
+      }
+      integralGraphMean = new TGraph(entries, xarray, yarray);
+      if (integralGraphMean) {
+         fListOfObjectsToBeDeleted->Add(integralGraphMean);
+         integralGraphMean->SetLineColor(kRed);
+         legend->AddEntry(integralGraphMean, "Mean", "l");
+         integralGraphMean->SetTitle(Form("%s, integrated; Multiples of #sigma; Fraction of included data", htemp->GetTitle()));
+         integralGraphMean->Draw("alu");
+         DrawLines(integralGraphMean, nsigma, legend, kRed, kTRUE);
+      }
+   }
+   if (plotMedian) {
+      for (Int_t i = 0; i < entries; i++) {
+         xarray[i] = (values[index[i]] - median) / sigma; 
+         yarray[i] = float(i) / float(entries);
+      }
+      integralGraphMedian = new TGraph(entries, xarray, yarray);
+      if (integralGraphMedian) {
+         fListOfObjectsToBeDeleted->Add(integralGraphMedian);
+         integralGraphMedian->SetLineColor(kBlue);
+         legend->AddEntry(integralGraphMedian, "Median", "l");
+         integralGraphMedian->SetTitle(Form("%s, integrated; Multiples of #sigma; Fraction of included data", htemp->GetTitle()));
+         if (plotMean && integralGraphMean) integralGraphMedian->Draw("samelu");
+            else integralGraphMedian->Draw("alu");
+         DrawLines(integralGraphMedian, nsigma, legend, kBlue, kTRUE);
+      }
+   }
+   if (plotLTM) {
+      Double_t ltmRms = 0;
+      Double_t ltm = GetLTM(entries, values, &ltmRms, ltmFraction);
+      for (Int_t i = 0; i < entries; i++) {
+         xarray[i] = (values[index[i]] - ltm) / ltmRms; 
+         yarray[i] = float(i) / float(entries);
+      }
+      integralGraphLTM = new TGraph(entries, xarray, yarray);
+      if (integralGraphLTM) {
+         fListOfObjectsToBeDeleted->Add(integralGraphLTM);
+         integralGraphLTM->SetLineColor(kGreen+2);
+         legend->AddEntry(integralGraphLTM, "LTM", "l");
+         integralGraphLTM->SetTitle(Form("%s, integrated; Multiples of #sigma; Fraction of included data", htemp->GetTitle()));
+         if (plotMean && integralGraphMean || plotMedian && integralGraphMedian) integralGraphLTM->Draw("samelu");
+            else integralGraphLTM->Draw("alu");
+         DrawLines(integralGraphLTM, nsigma, legend, kGreen+2, kTRUE);
+      }
+   }
+   if (!plotMean && !plotMedian && !plotLTM) return -1;
+   legend->Draw();
+   return entries;
+}
+
+
 void AliTPCCalibViewer::DrawLines(TH1F *histogram, TVectorF nsigma, TLegend *legend, Int_t color, Bool_t pm) const {
    // 
    // Private function for SigmaCut(...) and Integrate(...)
@@ -762,6 +967,58 @@ void AliTPCCalibViewer::DrawLines(TH1F *histogram, TVectorF nsigma, TLegend *leg
 }
 
 
+void AliTPCCalibViewer::DrawLines(TGraph *graph, TVectorF nsigma, TLegend *legend, Int_t color, Bool_t pm) const {
+   // 
+   // Private function for SigmaCut(...) and Integrate(...)
+   // Draws lines into the given histogram, specified by "nsigma", the lines are addeed to the legend
+   // 
+   
+   // start to draw the lines, loop over requested sigmas
+   char c[500];
+   for (Int_t i = 0; i < nsigma.GetNoElements(); i++) {
+      if (!pm) { 
+         TLine* lineUp = new TLine(nsigma[i], 0, nsigma[i], graph->Eval(nsigma[i]));
+         fListOfObjectsToBeDeleted->Add(lineUp);
+         lineUp->SetLineColor(color);
+         lineUp->SetLineStyle(2 + i);
+         lineUp->Draw();
+         TLine* lineLeft = new TLine(nsigma[i], graph->Eval(nsigma[i]), 0, graph->Eval(nsigma[i]));
+         fListOfObjectsToBeDeleted->Add(lineLeft);
+         lineLeft->SetLineColor(color);
+         lineLeft->SetLineStyle(2 + i);
+         lineLeft->Draw();
+         sprintf(c, "Fraction(%f #sigma) = %f",nsigma[i], graph->Eval(nsigma[i]));
+         legend->AddEntry(lineLeft, c, "l");
+      }
+      else { // if (pm)
+         TLine* lineUp1 = new TLine(nsigma[i], 0, nsigma[i], graph->Eval(nsigma[i]));
+         fListOfObjectsToBeDeleted->Add(lineUp1);
+         lineUp1->SetLineColor(color);
+         lineUp1->SetLineStyle(2 + i);
+         lineUp1->Draw();
+         TLine* lineLeft1 = new TLine(nsigma[i], graph->Eval(nsigma[i]), graph->GetHistogram()->GetXaxis()->GetBinLowEdge(0), graph->Eval(nsigma[i]));
+         fListOfObjectsToBeDeleted->Add(lineLeft1);
+         lineLeft1->SetLineColor(color);
+         lineLeft1->SetLineStyle(2 + i);
+         lineLeft1->Draw();
+         sprintf(c, "Fraction(+%f #sigma) = %f",nsigma[i], graph->Eval(nsigma[i]));
+         legend->AddEntry(lineLeft1, c, "l");
+         TLine* lineUp2 = new TLine(-nsigma[i], 0, -nsigma[i], graph->Eval(-nsigma[i]));
+         fListOfObjectsToBeDeleted->Add(lineUp2);
+         lineUp2->SetLineColor(color);
+         lineUp2->SetLineStyle(2 + i);
+         lineUp2->Draw();
+         TLine* lineLeft2 = new TLine(-nsigma[i], graph->Eval(-nsigma[i]), graph->GetHistogram()->GetXaxis()->GetBinLowEdge(0), graph->Eval(-nsigma[i]));
+         fListOfObjectsToBeDeleted->Add(lineLeft2);
+         lineLeft2->SetLineColor(color);
+         lineLeft2->SetLineStyle(2 + i);
+         lineLeft2->Draw();
+         sprintf(c, "Fraction(-%f #sigma) = %f",nsigma[i], graph->Eval(-nsigma[i]));
+         legend->AddEntry(lineLeft2, c, "l");
+      }
+   }  // for (Int_t i = 0; i < nsigma.GetNoElements(); i++)   
+}
+
 
 
 
@@ -1650,3 +1907,182 @@ void AliTPCCalibViewer::MakeTree(const char * fileName, TObjArray * array, const
    }
 }
 
+
+void AliTPCCalibViewer::MakeTree(const char *outPutFileName, const Char_t *inputFileName, AliTPCCalPad *outlierPad, Float_t ltmFraction, const char *mapFileName ){
+   // 
+   // Function to create a calibration Tree with all available information.
+   // See also documentation to MakeTree   
+   // the file "inputFileName" must be in the following format (see also CreateObjectList):
+   // (each colum separated by tabs, "dependingOnType" can have 2 or 3 colums)
+   // 
+   // type     path    dependingOnType
+   // 
+   // type == "CE":
+   // dependingOnType = CETmean        CEQmean CETrms
+   // 
+   // type == "Pulser":
+   // dependingOnType = PulserTmean    PulsterQmean    PulserTrms
+   // 
+   // type == "Pedestals":
+   // dependingOnType = Pedestals      Noise
+   // 
+   // type == "CalPad":
+   // dependingOnType = NameInFile     NameToWriteToFile
+   // 
+   // 
+   TObjArray objArray;
+   CreateObjectList(inputFileName, &objArray);
+   MakeTree(outPutFileName, &objArray, mapFileName, outlierPad, ltmFraction);   
+}
+
+void AliTPCCalibViewer::CreateObjectList(const Char_t *filename, TObjArray *calibObjects){
+   // 
+   // Function to create a TObjArray out of a given file
+   // the file must be in the following format:
+   // (each colum separated by tabs, "dependingOnType" can have 2 or 3 colums)
+   // 
+   // 
+   // type     path    dependingOnType
+   // 
+   // type == "CE":
+   // dependingOnType = CETmean        CEQmean CETrms
+   // 
+   // type == "Pulser":
+   // dependingOnType = PulserTmean    PulsterQmean    PulserTrms
+   // 
+   // type == "Pedestals":
+   // dependingOnType = Pedestals      Noise
+   // 
+   // type == "CalPad":
+   // dependingOnType = NameInFile     NameToWriteToFile
+   // 
+   // 
+   // 
+   if ( calibObjects == 0x0 ) return;
+   ifstream in;
+   in.open(filename);
+   if ( !in.is_open() ){
+      fprintf(stderr,"Error: cannot open list file '%s'", filename);
+      return;
+   }
+   
+   AliTPCCalPad *calPad=0x0;
+   
+   TString sFile;
+   sFile.ReadFile(in);
+   in.close();
+   
+   TObjArray *arrFileLine = sFile.Tokenize("\n");
+   TIter nextLine(arrFileLine);
+   
+   TObjString *sObjLine = 0x0;
+   while ( (sObjLine = (TObjString*)nextLine()) ){
+      TString sLine(sObjLine->GetString());
+      
+      TObjArray *arrCol = sLine.Tokenize("\t");
+      Int_t nCols = arrCol->GetEntriesFast();
+      
+      TObjString *sObjType     = (TObjString*)(arrCol->At(0));
+      TObjString *sObjFileName = (TObjString*)(arrCol->At(1));
+      TObjString *sObjName = 0x0;
+      
+      if ( !sObjType || !sObjFileName ) continue;
+      TString sType(sObjType->GetString());
+      TString sFileName(sObjFileName->GetString());
+      printf("Type %s, opening %s \n", sType.Data(), sFileName.Data());
+      TFile *fIn = TFile::Open(sFileName);
+      if ( !fIn ){
+         fprintf(stderr,"File not found: '%s'", sFileName.Data());
+         continue;
+      }
+      
+      if ( sType == "CE" ){  // next three colums are the names for CETmean, CEQmean and CETrms
+         AliTPCCalibCE *ce = (AliTPCCalibCE*)fIn->Get("AliTPCCalibCE");
+         calPad = new AliTPCCalPad((TObjArray*)ce->GetCalPadT0());         
+         if (nCols > 2) {  // check, if the name is provided
+            sObjName = (TObjString*)(arrCol->At(2));
+            calPad->SetNameTitle(sObjName->GetString().Data(), sObjName->GetString().Data());
+         }
+         else calPad->SetNameTitle("CETmean","CETmean");
+         calibObjects->Add(calPad);
+         
+         calPad = new AliTPCCalPad((TObjArray*)ce->GetCalPadQ());         
+         if (nCols > 3) {  // check, if the name is provided
+            sObjName = (TObjString*)(arrCol->At(3));
+            calPad->SetNameTitle(sObjName->GetString().Data(), sObjName->GetString().Data());
+         }
+         else calPad->SetNameTitle("CEQmean","CEQmean");
+         calibObjects->Add(calPad);        
+         
+         calPad = new AliTPCCalPad((TObjArray*)ce->GetCalPadRMS());
+         if (nCols > 4) {  // check, if the name is provided
+            sObjName = (TObjString*)(arrCol->At(4));
+            calPad->SetNameTitle(sObjName->GetString().Data(), sObjName->GetString().Data());
+         }
+         else calPad->SetNameTitle("CETrms","CETrms");
+         calibObjects->Add(calPad);         
+                  
+      } else if ( sType == "Pulser") {
+         AliTPCCalibPulser *sig = (AliTPCCalibPulser*)fIn->Get("AliTPCCalibPulser");
+         
+         calPad = new AliTPCCalPad((TObjArray*)sig->GetCalPadT0());         
+         if (nCols > 2) {
+            sObjName = (TObjString*)(arrCol->At(2));
+            calPad->SetNameTitle(sObjName->GetString().Data(), sObjName->GetString().Data());
+         }
+         else calPad->SetNameTitle("PulserTmean","PulserTmean");
+         calibObjects->Add(calPad);
+         
+         calPad = new AliTPCCalPad((TObjArray*)sig->GetCalPadQ());         
+         if (nCols > 3) {
+            sObjName = (TObjString*)(arrCol->At(3));
+            calPad->SetNameTitle(sObjName->GetString().Data(), sObjName->GetString().Data());
+         }
+         else calPad->SetNameTitle("PulserQmean","PulserQmean");
+         calibObjects->Add(calPad);        
+         
+         calPad = new AliTPCCalPad((TObjArray*)sig->GetCalPadRMS());
+         if (nCols > 4) {
+            sObjName = (TObjString*)(arrCol->At(4));
+            calPad->SetNameTitle(sObjName->GetString().Data(), sObjName->GetString().Data());
+         }
+         else calPad->SetNameTitle("PulserTrms","PulserTrms");
+         calibObjects->Add(calPad);         
+      
+      } else if ( sType == "Pedestals") {
+         AliTPCCalibPedestal *ped = (AliTPCCalibPedestal*)fIn->Get("AliTPCCalibPedestal");
+         
+         calPad = new AliTPCCalPad((TObjArray*)ped->GetCalPadPedestal());         
+         if (nCols > 2) {
+            sObjName = (TObjString*)(arrCol->At(2));
+            calPad->SetNameTitle(sObjName->GetString().Data(), sObjName->GetString().Data());
+         }
+         else calPad->SetNameTitle("Pedestals","Pedestals");
+         calibObjects->Add(calPad);
+         
+         calPad = new AliTPCCalPad((TObjArray*)ped->GetCalPadRMS());         
+         if (nCols > 3) {
+            sObjName = (TObjString*)(arrCol->At(3));
+            calPad->SetNameTitle(sObjName->GetString().Data(), sObjName->GetString().Data());
+         }
+         else calPad->SetNameTitle("Noise","Noise");
+         calibObjects->Add(calPad);        
+     
+      } else if ( sType == "CalPad") {
+         if (nCols > 2) sObjName = (TObjString*)(arrCol->At(2));
+         else continue;
+         calPad = new AliTPCCalPad(*(AliTPCCalPad*)fIn->Get(sObjName->GetString().Data()));
+         if (nCols > 3) {
+            sObjName = (TObjString*)(arrCol->At(3));
+            calPad->SetNameTitle(sObjName->GetString().Data(), sObjName->GetString().Data());
+         }
+         calibObjects->Add(calPad);
+      } else {
+         fprintf(stderr,"Undefined Type: '%s'",sType.Data());
+      }
+      delete fIn;
+   }
+}
+
+
+
index 8971cf8..7768f79 100644 (file)
@@ -20,6 +20,7 @@
 
 #include "AliMathBase.h"
 class TLegend;
+class TGraph;
 
 
 class AliTPCCalibViewer : public TObject {
@@ -44,9 +45,11 @@ public:
    Int_t  DrawHisto1D(const char* drawCommand,       Int_t sector, const char* cuts = 0, const char *sigmas = "2;4;6", Bool_t plotMean = kTRUE, Bool_t plotMedian = kTRUE, Bool_t plotLTM = kTRUE) const; // draws 1d histograms and superimposes mean, median, ltm and several sigma cuts
    Int_t  DrawHisto1D(const char* drawCommand, const char* sector, const char* cuts = 0, const char *sigmas = "2;4;6", Bool_t plotMean = kTRUE, Bool_t plotMedian = kTRUE, Bool_t plotLTM = kTRUE) const; // draws 1d histograms and superimposes mean, median, ltm and several sigma cuts
    Int_t     SigmaCut(const char* drawCommand,       Int_t sector, const char* cuts = 0, Float_t sigmaMax = 5, Bool_t plotMean = kTRUE, Bool_t plotMedian = kTRUE, Bool_t plotLTM = kTRUE, Bool_t pm = kFALSE, const char *sigmas = "", Float_t sigmaStep = -1) const;    // draws fraction of used pads over different sigma cuts
+   Int_t  SigmaCutNew(const char* drawCommand, const char* sector, const char* cuts = 0, Float_t sigmaMax = 5, Bool_t plotMean = kTRUE, Bool_t plotMedian = kTRUE, Bool_t plotLTM = kTRUE, Bool_t pm = kFALSE, const char *sigmas = "", Float_t sigmaStep = -1) const;    // draws fraction of used pads over different sigma cuts
    Int_t     SigmaCut(const char* drawCommand, const char* sector, const char* cuts = 0, Float_t sigmaMax = 5, Bool_t plotMean = kTRUE, Bool_t plotMedian = kTRUE, Bool_t plotLTM = kTRUE, Bool_t pm = kFALSE, const char *sigmas = "", Float_t sigmaStep = -1) const;    // draws fraction of used pads over different sigma cuts
    Int_t    Integrate(const char* drawCommand, const char* sector, const char* cuts = 0, Float_t sigmaMax = 5, Bool_t plotMean = kTRUE, Bool_t plotMedian = kTRUE, Bool_t plotLTM = kTRUE, const char *sigmas = "", Float_t sigmaStep = -1) const;    // draws an integrated histogram
    Int_t    Integrate(const char* drawCommand,       Int_t sector, const char* cuts = 0, Float_t sigmaMax = 5, Bool_t plotMean = kTRUE, Bool_t plotMedian = kTRUE, Bool_t plotLTM = kTRUE, const char *sigmas = "", Float_t sigmaStep = -1) const;    // draws an integrated histogram
+   Int_t IntegrateOld(const char* drawCommand, const char* sector, const char* cuts = 0, Float_t sigmaMax = 5, Bool_t plotMean = kTRUE, Bool_t plotMedian = kTRUE, Bool_t plotLTM = kTRUE, const char *sigmas = "", Float_t sigmaStep = -1) const;    // draws an integrated histogram
    
    AliTPCCalPad* GetCalPad(const char* desiredData, char* cuts = "", char* calPadName = "NoName") const;     // returns an AliTPCCalPad object containing the specified data with cuts applied
    AliTPCCalROC* GetCalROC(const char* desiredData, UInt_t sector, char* cuts = "") const;  // returns an AliTPCCalROC object containing the specified data for sector with cuts applied
@@ -57,6 +60,8 @@ public:
    
    static void MakeTreeWithObjects(const char * fileName, TObjArray * array, const char * mapFileName = 0);
    static void MakeTree(const char * fileName, TObjArray * array, const char * mapFileName = 0, AliTPCCalPad* outlierPad = 0, Float_t ltmFraction = 0.9);
+   static void MakeTree(const char *outPutFileName, const Char_t *inputFileName, AliTPCCalPad *outlierPad = 0, Float_t ltmFraction = 0.9, const char *mapFileName = "$ALICE_ROOT/TPC/Calib/MapCalibrationObjects.root");
+   static void CreateObjectList(const Char_t *filename, TObjArray *calibObjects);
    
    TFriendElement* AddReferenceTree(const char* filename, const char* treename = "calPads", const char* refname = "R");
    TFriendElement* AddFriend(const char* treename, const char* filename) {return fTree->AddFriend(treename, filename);};
@@ -87,9 +92,13 @@ protected:
    Bool_t fTreeMustBeDeleted;  // decides weather the tree must be deleted in destructor or not 
    
    void DrawLines(TH1F *cutHistoMean, TVectorF nsigma, TLegend *legend, Int_t color, Bool_t pm) const;
+   void DrawLines(TGraph *graph, TVectorF nsigma, TLegend *legend, Int_t color, Bool_t pm) const;
   
    
    ClassDef(AliTPCCalibViewer,1)    //  TPC calibration viewer class
 };
 
 #endif
+
+
+
index baf2cc9..532e9c0 100644 (file)
@@ -74,6 +74,8 @@
 #include <TH1.h>
 #include "TStyle.h"
 #include "AliTPCCalibViewer.h"
+#include "TGFileDialog.h"
+#include "TGFileDialog.h"
 
 // #include "TGListBox.h"
 // #include "TGNumberEntry"
@@ -102,6 +104,9 @@ AliTPCCalibViewerGUI::AliTPCCalibViewerGUI(const TGWindow *p, UInt_t w, UInt_t h
     ftabLeft(0),
     ftabLeft0(0),
     ftabLeft1(0),
+    ftabRight(0),
+    fTabRight0(0),
+    fTabRight1(0),
     fContRight(0),
     fContCenter(0),
     fContPlotOpt(0),
@@ -139,11 +144,13 @@ AliTPCCalibViewerGUI::AliTPCCalibViewerGUI(const TGWindow *p, UInt_t w, UInt_t h
     fComboMethod(0),
     fListNormalization(0),
     fComboCustom(0),
+    fLblCustomDraw(0),
     fChkAddDrawOpt(0),
     fNmbSector(0),
     fLblSector(0),
     fChkCutZero(0),
     fChkAddCuts(0),
+    fLblAddCuts(0),
     fComboAddCuts(0), 
     fComboCustomFit(0),
     fChkSetMax(0),
@@ -186,7 +193,21 @@ AliTPCCalibViewerGUI::AliTPCCalibViewerGUI(const TGWindow *p, UInt_t w, UInt_t h
     fChkStatSkewnessPM(0),
     fContStatKurt(0),
     fChkStatKurtosis(0),
-    fChkStatKurtosisPM(0)
+    fChkStatKurtosisPM(0),
+    fContLabeling(0),
+    fChkLabelTitle(0),
+    fTxtLabelTitle(0),
+    fChkLabelXaxis(0),
+    fTxtLabelXaxis(0),
+    fChkLabelYaxis(0),
+    fTxtLabelYaxis(0),
+    fChkLabelGetAuto(0),
+    fContSave(0),
+    fBtnSave(0),
+    fContAddSaveOpt(0),
+    fChkAddSaveOpt(0),
+    fComboAddSaveOpt(0)
+
 {
    //
    // AliTPCCalibViewerGUI constructor; fileName specifies the ROOT tree used for drawing 
@@ -239,7 +260,7 @@ AliTPCCalibViewerGUI::AliTPCCalibViewerGUI(const TGWindow *p, UInt_t w, UInt_t h
    //fBtnDraw->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "DoTest(=\"fBtnDraw clicked\")");
    fBtnDraw->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "DoDraw()");
    
-   // three tabs on the left side:
+   // tabs on the left side:
    ftabLeft = new TGTab(fContLeft);
    fContLeft->AddFrame(ftabLeft, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 8, 0));
    ftabLeft0 = ftabLeft->AddTab("General");
@@ -338,22 +359,7 @@ AliTPCCalibViewerGUI::AliTPCCalibViewerGUI(const TGWindow *p, UInt_t w, UInt_t h
       fRadioCustom = new TGRadioButton(ftabLeft0, "Custom: ", 12);
       ftabLeft0->AddFrame(fRadioCustom, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
       fRadioCustom->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsGeneral()");
-      
-      // custom options container
-      // --- fComboCustom --- the custom draw line
-      fContCustom = new TGCompositeFrame(fContTopBottom, 200, 200, kVerticalFrame | kFitWidth | kFitHeight);
-      fContTopBottom->AddFrame(fContCustom, new TGLayoutHints(kLHintsExpandX, 10, 0, 0, 0));
-   
-         // ------------------------- content of fContCustom -------------------------
-         // text field for custom draw command
-         fComboCustom = new TGComboBox(fContCustom);
-         fComboCustom->Resize(0, fBtnDraw->GetDefaultHeight());
-         fComboCustom->EnableTextInput(kTRUE);
-         fContCustom->AddFrame(fComboCustom, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
-         fComboCustom->Connect("ReturnPressed()", "AliTPCCalibViewerGUI", this, "HandleButtonsGeneral(=42)");
-         fComboCustom->Connect("Selected(Int_t)", "AliTPCCalibViewerGUI", this, "DoNewSelection()");
-      
-
+      // custom options container is located further down
       
       // **************************** content of tabLeft1 *******************************
       
@@ -496,7 +502,40 @@ AliTPCCalibViewerGUI::AliTPCCalibViewerGUI(const TGWindow *p, UInt_t w, UInt_t h
             fContStatKurt->AddFrame(fChkStatKurtosisPM, new TGLayoutHints(kLHintsNormal, 10, 0, 0, 0));
             fChkStatKurtosisPM->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsStat()");
 
-
+      
+      // custom options container
+      // --- fComboCustom --- the custom draw line on the very low
+      fContCustom = new TGCompositeFrame(fContTopBottom, 200, 200, kHorizontalFrame | kFitWidth | kFitHeight);
+      fContTopBottom->AddFrame(fContCustom, new TGLayoutHints(kLHintsExpandX, 10, 0, 0, 0));
+   
+         // ------------------------- content of fContCustom -------------------------
+         fLblCustomDraw = new TGLabel(fContCustom, "Custom Draw: ");
+         fLblCustomDraw->SetTextJustify(kTextLeft);
+         fContCustom->AddFrame(fLblCustomDraw, new TGLayoutHints(kLHintsNormal, 5, 0, 0, 0));
+         // text field for custom draw command
+         fComboCustom = new TGComboBox(fContCustom);
+         fComboCustom->Resize(0, fBtnDraw->GetDefaultHeight());
+         fComboCustom->EnableTextInput(kTRUE);
+         fContCustom->AddFrame(fComboCustom, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
+         fComboCustom->Connect("ReturnPressed()", "AliTPCCalibViewerGUI", this, "HandleButtonsGeneral(=42)");
+         fComboCustom->Connect("Selected(Int_t)", "AliTPCCalibViewerGUI", this, "DoNewSelection()");
+      
+   
+      // additional cuts container
+      fContAddCuts = new TGCompositeFrame(fContTopBottom, 200, 200, kHorizontalFrame | kFitWidth | kFitHeight);
+      fContTopBottom->AddFrame(fContAddCuts, new TGLayoutHints(kLHintsExpandX, 10, 0, 0, 0));
+      
+         // ------------------------- content of fContAddCuts -------------------------
+         fLblAddCuts = new TGLabel(fContAddCuts, "Custom Cuts:  ");
+         fLblAddCuts->SetTextJustify(kTextLeft);
+         fContAddCuts->AddFrame(fLblAddCuts, new TGLayoutHints(kLHintsNormal, 5, 0, 0, 0));
+         // combo text field for additional cuts
+         fComboAddCuts = new TGComboBox(fContAddCuts);
+         fComboAddCuts->Resize(0, fBtnDraw->GetDefaultHeight());
+         fComboAddCuts->EnableTextInput(kTRUE);
+         fContAddCuts->AddFrame(fComboAddCuts, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
+         fComboAddCuts->Connect("ReturnPressed()", "AliTPCCalibViewerGUI", this, "HandleButtonsRight(=31)");
+         fComboAddCuts->Connect("Selected(Int_t)", "AliTPCCalibViewerGUI", this, "DoNewSelection()");
          
          
 
@@ -513,146 +552,202 @@ AliTPCCalibViewerGUI::AliTPCCalibViewerGUI(const TGWindow *p, UInt_t w, UInt_t h
    // =========================================================================   
    // ************************* content of fContRight *************************
    // ========================================================================
-   // cut options container
-   //fContCuts = new TGCompositeFrame(fContRight, 200, 200, kVerticalFrame | kFitWidth | kFitHeight);
-   fContCuts = new TGGroupFrame(fContRight, "Cuts", kVerticalFrame | kFitWidth | kFitHeight);
-   fContRight->AddFrame(fContCuts, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
-
    
-      // ************************* content of fContCuts *************************
-      // TPC radio button
-      fRadioTPC = new TGRadioButton(fContCuts, "whole TPC", 20);
-      fContCuts->AddFrame(fRadioTPC, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
-      fRadioTPC->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsRight()");
-   
-      // side A radio button
-      fRadioSideA = new TGRadioButton(fContCuts, "side A", 21);
-      fContCuts->AddFrame(fRadioSideA, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
-      fRadioSideA->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsRight()");
-   
-      // side C radio button
-      fRadioSideC = new TGRadioButton(fContCuts, "side C", 22);
-      fContCuts->AddFrame(fRadioSideC, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
-      fRadioSideC->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsRight()");
+   // tabs on the right side:
+   ftabRight = new TGTab(fContRight);
+   fContRight->AddFrame(ftabRight, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 8, 0));
+   fTabRight0 = ftabRight->AddTab("Basic");
+   fTabRight1 = ftabRight->AddTab("Advanced");
+
    
-      // sector radio button
-      fRadioSector = new TGRadioButton(fContCuts, "sector", 23);
-      fContCuts->AddFrame(fRadioSector, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
-      fRadioSector->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsRight()");
+      // **************************** content of tabLeft0 *******************************
+      // cut options container
+      fContCuts = new TGGroupFrame(fTabRight0, "Cuts", kVerticalFrame | kFitWidth | kFitHeight);
+      fTabRight0->AddFrame(fContCuts, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
    
-      // sector options container
-      fContSector = new TGCompositeFrame(fContCuts, 200, 200, kHorizontalFrame | kFitWidth | kFitHeight);
-      fContCuts->AddFrame(fContSector, new TGLayoutHints(kLHintsExpandX, 5, 0, 0, 0));
       
-         // ------------------------- content of fContSector -------------------------
-         // sector number entry
-         fNmbSector = new TGNumberEntry(fContSector, 0, 1, -1, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative, TGNumberFormat::kNELLimitMinMax, 0, 71);
-         fContSector->AddFrame(fNmbSector, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
-         fNmbSector->Connect("ValueSet(Long_t)", "AliTPCCalibViewerGUI", this, "ChangeSector()");
-         
-         // sector number label
-         fLblSector = new TGLabel(fContSector, "IROC, A");
-         fLblSector->SetTextJustify(kTextLeft);
-         fContSector->AddFrame(fLblSector, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 5, 0, 0, 0));
+         // ************************* content of fContCuts *************************
+         // TPC radio button
+         fRadioTPC = new TGRadioButton(fContCuts, "whole TPC", 20);
+         fContCuts->AddFrame(fRadioTPC, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
+         fRadioTPC->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsRight()");
       
-      // additional cuts check button
-      fChkCutZero = new TGCheckButton(fContCuts, "Cut zeros");
-      fContCuts->AddFrame(fChkCutZero, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
-      fChkCutZero->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "DoNewSelection()");
-   
-      // additional cuts check button
-      fChkAddCuts = new TGCheckButton(fContCuts, "additional cuts");
-      fContCuts->AddFrame(fChkAddCuts, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
-      fChkAddCuts->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "DoNewSelection()");
-   
-      // additional cuts container
-      fContAddCuts = new TGCompositeFrame(fContCuts, 200, 200, kVerticalFrame | kFitWidth | kFitHeight);
-      fContCuts->AddFrame(fContAddCuts, new TGLayoutHints(kLHintsExpandX, -5, -5, 0, 0));
+         // side A radio button
+         fRadioSideA = new TGRadioButton(fContCuts, "side A", 21);
+         fContCuts->AddFrame(fRadioSideA, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
+         fRadioSideA->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsRight()");
       
-         // ------------------------- content of fContAddCuts -------------------------
-         // combo text field for additional cuts
-         fComboAddCuts = new TGComboBox(fContAddCuts);
-         fComboAddCuts->Resize(0, fBtnDraw->GetDefaultHeight());
-         fComboAddCuts->EnableTextInput(kTRUE);
-         fContAddCuts->AddFrame(fComboAddCuts, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
-         fComboAddCuts->Connect("ReturnPressed()", "AliTPCCalibViewerGUI", this, "DoNewSelection()");
-         fComboAddCuts->Connect("Selected(Int_t)", "AliTPCCalibViewerGUI", this, "DoNewSelection()");
-   
-   
-   // Scaling options container
-   fContScaling = new TGGroupFrame(fContRight, "Scaling", kVerticalFrame | kFitWidth | kFitHeight);
-   fContRight->AddFrame(fContScaling, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
-
-      // ************************* content of fContScaling *************************
-      // SetMaximum container
-      fContSetMax = new TGCompositeFrame(fContScaling, 200, 200, kVerticalFrame | kFitWidth | kFitHeight);
-      fContScaling->AddFrame(fContSetMax, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
+         // side C radio button
+         fRadioSideC = new TGRadioButton(fContCuts, "side C", 22);
+         fContCuts->AddFrame(fRadioSideC, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
+         fRadioSideC->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsRight()");
       
-         // ------------------------- content of fContSetMax -------------------------
-         // SetMaximum - checkbox
-         fChkSetMax = new TGCheckButton(fContSetMax, "Set fixed max.");
-         fContSetMax->AddFrame(fChkSetMax, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
-         fChkSetMax->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsRight()");
-         
-         // text field for maximum value
-         fTxtSetMax = new TGTextEntry(fContSetMax, "", 41);
-         fContSetMax->AddFrame(fTxtSetMax, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
-         fTxtSetMax->Connect("ReturnPressed()", "AliTPCCalibViewerGUI", this, "HandleButtonsRight()");
-   
-      // SetMinimum container
-      fContSetMin = new TGCompositeFrame(fContScaling, 200, 200, kVerticalFrame | kFitWidth | kFitHeight);
-      fContScaling->AddFrame(fContSetMin, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
+         // sector radio button
+         fRadioSector = new TGRadioButton(fContCuts, "sector", 23);
+         fContCuts->AddFrame(fRadioSector, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
+         fRadioSector->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsRight()");
       
-         // ------------------------- content of fContSetMin -------------------------
-         // SetMinimum - checkbox
-         fChkSetMin = new TGCheckButton(fContSetMin, "Set fixed min.");
-         fContSetMin->AddFrame(fChkSetMin, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
-         fChkSetMin->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "DoNewSelection()");
+         // sector options container
+         fContSector = new TGCompositeFrame(fContCuts, 200, 200, kHorizontalFrame | kFitWidth | kFitHeight);
+         fContCuts->AddFrame(fContSector, new TGLayoutHints(kLHintsExpandX, 5, 0, 0, 0));
          
-         // text field for minimum value
-         fTxtSetMin = new TGTextEntry(fContSetMin, "", 40);
-         fContSetMin->AddFrame(fTxtSetMin, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
-         fTxtSetMin->Connect("ReturnPressed()", "AliTPCCalibViewerGUI", this, "HandleButtonsRight()");
+            // ------------------------- content of fContSector -------------------------
+            // sector number entry
+            fNmbSector = new TGNumberEntry(fContSector, 0, 1, -1, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative, TGNumberFormat::kNELLimitMinMax, 0, 71);
+            fContSector->AddFrame(fNmbSector, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
+            fNmbSector->Connect("ValueSet(Long_t)", "AliTPCCalibViewerGUI", this, "ChangeSector()");
+            
+            // sector number label
+            fLblSector = new TGLabel(fContSector, "IROC, A");
+            fLblSector->SetTextJustify(kTextLeft);
+            fContSector->AddFrame(fLblSector, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 5, 0, 0, 0));
+         
+         // cut zeros check button
+         fChkCutZero = new TGCheckButton(fContCuts, "Cut zeros");
+         fContCuts->AddFrame(fChkCutZero, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
+         fChkCutZero->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "DoNewSelection()");
       
-      // get Min & Max from Plot - button
-      fBtnGetMinMax = new TGTextButton(fContScaling, "&Get scale from plot");
-      fContScaling->AddFrame(fBtnGetMinMax, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
-      fBtnGetMinMax->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "GetMinMax()");
+         // additional cuts check button
+         fChkAddCuts = new TGCheckButton(fContCuts, "Custom cuts");
+         fContCuts->AddFrame(fChkAddCuts, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
+         fChkAddCuts->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "DoNewSelection()");
+         // fContAddCuts' content is locaed further op
       
-      // GetMinMaxAuto - checkbox
-      fChkGetMinMaxAuto = new TGCheckButton(fContScaling, "Get Min + Max auto.");
-      fContScaling->AddFrame(fChkGetMinMaxAuto, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
-      fChkGetMinMaxAuto->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "DoNewSelection()");
-
       
-   // Fit options container
-   fContFit = new TGGroupFrame(fContRight, "Custom Fit", kVerticalFrame | kFitWidth | kFitHeight);
-   fContRight->AddFrame(fContFit, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
-
-      // ------------------------- content of fContFit -------------------------
-      // container for additional fits
-      fContAddFit = new TGCompositeFrame(fContFit, 200, 200, kVerticalFrame | kFitWidth | kFitHeight);
-      fContFit->AddFrame(fContAddFit, new TGLayoutHints(kLHintsExpandX, -5, -5, 0, 0));
+      // Scaling options container
+      fContScaling = new TGGroupFrame(fTabRight0, "Scaling", kVerticalFrame | kFitWidth | kFitHeight);
+      fTabRight0->AddFrame(fContScaling, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
    
-         // --- content of fContAddFit ---
-         // text field for custom fit
-         fComboCustomFit = new TGComboBox(fContAddFit);
-         fComboCustomFit->Resize(0, fBtnDraw->GetDefaultHeight());
-         fComboCustomFit->EnableTextInput(kTRUE);
-         fContAddFit->AddFrame(fComboCustomFit, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
-         fComboCustomFit->Connect("ReturnPressed()", "AliTPCCalibViewerGUI", this, "DoFit()");
-         fComboCustomFit->Connect("Selected(Int_t)", "AliTPCCalibViewerGUI", this, "DoFit()");
+         // ************************* content of fContScaling *************************
+         // SetMaximum container
+         fContSetMax = new TGCompositeFrame(fContScaling, 200, 200, kVerticalFrame | kFitWidth | kFitHeight);
+         fContScaling->AddFrame(fContSetMax, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
+         
+            // ------------------------- content of fContSetMax -------------------------
+            // SetMaximum - checkbox
+            fChkSetMax = new TGCheckButton(fContSetMax, "Set fixed max.");
+            fContSetMax->AddFrame(fChkSetMax, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
+            fChkSetMax->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsRight()");
+            
+            // text field for maximum value
+            fTxtSetMax = new TGTextEntry(fContSetMax, "", 41);
+            fContSetMax->AddFrame(fTxtSetMax, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
+            fTxtSetMax->Connect("ReturnPressed()", "AliTPCCalibViewerGUI", this, "HandleButtonsRight()");
+      
+         // SetMinimum container
+         fContSetMin = new TGCompositeFrame(fContScaling, 200, 200, kVerticalFrame | kFitWidth | kFitHeight);
+         fContScaling->AddFrame(fContSetMin, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
+         
+            // ------------------------- content of fContSetMin -------------------------
+            // SetMinimum - checkbox
+            fChkSetMin = new TGCheckButton(fContSetMin, "Set fixed min.");
+            fContSetMin->AddFrame(fChkSetMin, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
+            fChkSetMin->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "DoNewSelection()");
+            
+            // text field for minimum value
+            fTxtSetMin = new TGTextEntry(fContSetMin, "", 40);
+            fContSetMin->AddFrame(fTxtSetMin, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
+            fTxtSetMin->Connect("ReturnPressed()", "AliTPCCalibViewerGUI", this, "HandleButtonsRight()");
+         
+         // get Min & Max from Plot - button
+         fBtnGetMinMax = new TGTextButton(fContScaling, "&Get scale from plot");
+         fContScaling->AddFrame(fBtnGetMinMax, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
+         fBtnGetMinMax->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "GetMinMax()");
+         
+         // GetMinMaxAuto - checkbox
+         fChkGetMinMaxAuto = new TGCheckButton(fContScaling, "Get Min + Max auto.");
+         fContScaling->AddFrame(fChkGetMinMaxAuto, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
+         fChkGetMinMaxAuto->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "DoNewSelection()");
+         
+      // labeling container *** fContLabeling ***  " Labeling "      
+         fContLabeling = new TGGroupFrame(fTabRight0, "Labeling", kVerticalFrame | kFitWidth | kFitHeight);
+         fTabRight0->AddFrame(fContLabeling, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
+         
+            fChkLabelTitle = new TGCheckButton(fContLabeling, "Set title:");
+            fContLabeling->AddFrame(fChkLabelTitle, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
+            fChkLabelTitle->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsRight()");
+               
+            fTxtLabelTitle = new TGTextEntry(fContLabeling, "Title", 500);
+            fContLabeling->AddFrame(fTxtLabelTitle, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
+            fTxtLabelTitle->Connect("ReturnPressed()", "AliTPCCalibViewerGUI", this, "HandleButtonsRight(=50)");
+   
+            fChkLabelXaxis = new TGCheckButton(fContLabeling, "Set X-axis label:");
+            fContLabeling->AddFrame(fChkLabelXaxis, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
+            fChkLabelXaxis->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsRight()");
+               
+            fTxtLabelXaxis = new TGTextEntry(fContLabeling, "XaxisLabel", 500);
+            fContLabeling->AddFrame(fTxtLabelXaxis, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
+            fTxtLabelXaxis->Connect("ReturnPressed()", "AliTPCCalibViewerGUI", this, "HandleButtonsRight(=51)");
+   
+            fChkLabelYaxis = new TGCheckButton(fContLabeling, "Set Y-axis label:");
+            fContLabeling->AddFrame(fChkLabelYaxis, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
+            fChkLabelYaxis->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsRight()");
+               
+            fTxtLabelYaxis = new TGTextEntry(fContLabeling, "YaxisLabel", 500);
+            fContLabeling->AddFrame(fTxtLabelYaxis, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
+            fTxtLabelYaxis->Connect("ReturnPressed()", "AliTPCCalibViewerGUI", this, "HandleButtonsRight(=52)");
+   
+            fChkLabelGetAuto = new TGCheckButton(fContLabeling, "Get labels auto.");
+            fContLabeling->AddFrame(fChkLabelGetAuto, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
+            fChkLabelGetAuto->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsRight()");
+
       
-      // fit button
-      fBtnFit = new TGTextButton(fContAddFit, "&Fit");
-      fContAddFit->AddFrame(fBtnFit, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
-      fBtnFit->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "DoFit()");
+      // **************************** content of ftabLeft1 *******************************
+      // Save container
+      fContSave = new TGGroupFrame(fTabRight1, "Save", kVerticalFrame | kFitWidth | kFitHeight);
+      fTabRight1->AddFrame(fContSave, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
+         // save button
+         fBtnSave = new TGTextButton(fContSave, "&Save picute");
+         fContSave->AddFrame(fBtnSave, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
+         fBtnSave->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "SavePicture()");
+
+         // additional save options container
+         fContAddSaveOpt = new TGCompositeFrame(fContSave, 200, 200, kVerticalFrame | kFitWidth | kFitHeight);
+         fContSave->AddFrame(fContAddSaveOpt, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0));
    
-      // add fit function button
-      //fBtnAddFitFunction = new TGTextButton(fContAddFit, "&Add fit function to normalization");
-      //fContAddFit->AddFrame(fBtnAddFitFunction, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
-      //fBtnAddFitFunction->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "AddFitFunction()");
+            //  content of --- fContAddSaveOpt ---
+            // addition save options label
+            fChkAddSaveOpt = new TGCheckButton(fContAddSaveOpt, "Save options:");
+            fContAddSaveOpt->AddFrame(fChkAddSaveOpt, new TGLayoutHints(kLHintsNormal | kLHintsExpandX));
+            fChkAddSaveOpt->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "DoNewSelection()");
+            
+            // additional save options combo box
+            fComboAddSaveOpt = new TGComboBox(fContAddSaveOpt);
+            fContAddSaveOpt->AddFrame(fComboAddSaveOpt, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
+            fComboAddSaveOpt->Resize(0, fBtnDraw->GetDefaultHeight());
+            fComboAddSaveOpt->EnableTextInput(kTRUE);
+            fComboAddSaveOpt->Connect("ReturnPressed()", "AliTPCCalibViewerGUI", this, "SavePicture()");
+            // fComboAddSaveOpt->Connect("Selected(Int_t)", "AliTPCCalibViewerGUI", this, "SavePicture()");
+     
+      // Fit options container
+      fContFit = new TGGroupFrame(fTabRight1, "Custom Fit", kVerticalFrame | kFitWidth | kFitHeight);
+      fTabRight1->AddFrame(fContFit, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
+   
+         // ------------------------- content of fContFit -------------------------
+         // container for additional fits
+         fContAddFit = new TGCompositeFrame(fContFit, 200, 200, kVerticalFrame | kFitWidth | kFitHeight);
+         fContFit->AddFrame(fContAddFit, new TGLayoutHints(kLHintsExpandX, -5, -5, 0, 0));
+      
+            // --- content of fContAddFit ---
+            // text field for custom fit
+            fComboCustomFit = new TGComboBox(fContAddFit);
+            fComboCustomFit->Resize(0, fBtnDraw->GetDefaultHeight());
+            fComboCustomFit->EnableTextInput(kTRUE);
+            fContAddFit->AddFrame(fComboCustomFit, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
+            fComboCustomFit->Connect("ReturnPressed()", "AliTPCCalibViewerGUI", this, "DoFit()");
+            fComboCustomFit->Connect("Selected(Int_t)", "AliTPCCalibViewerGUI", this, "DoFit()");
          
+         // fit button
+         fBtnFit = new TGTextButton(fContAddFit, "&Fit");
+         fContAddFit->AddFrame(fBtnFit, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
+         fBtnFit->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "DoFit()");
+      
+         // add fit function button
+         //fBtnAddFitFunction = new TGTextButton(fContAddFit, "&Add fit function to normalization");
+         //fContAddFit->AddFrame(fBtnAddFitFunction, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
+         //fBtnAddFitFunction->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "AddFitFunction()");
+
+               
    // set default button states
    fRadioPredefined->SetState(kButtonDown);
    fRadioRaw->SetState(kButtonDown);
@@ -673,6 +768,10 @@ AliTPCCalibViewerGUI::AliTPCCalibViewerGUI(const TGWindow *p, UInt_t w, UInt_t h
    fChkStatEntries->SetState(kButtonDown);
    fChkStatMean->SetState(kButtonDown);
    fChkStatRMS->SetState(kButtonDown);
+   
+   fChkLabelGetAuto->SetState(kButtonDown);
+   
+   
 //    fChkStatMeanPM->SetState(kButtonUp);
 //    fChkStatRMSPM->SetState(kButtonUp);
 //    fChkStatUnderflow->SetState(kButtonUp);
@@ -703,6 +802,9 @@ AliTPCCalibViewerGUI::AliTPCCalibViewerGUI(const AliTPCCalibViewerGUI &c)
     ftabLeft(0),
     ftabLeft0(0),
     ftabLeft1(0),
+    ftabRight(0),
+    fTabRight0(0),
+    fTabRight1(0),
     fContRight(0),
     fContCenter(0),
     fContPlotOpt(0),
@@ -740,11 +842,13 @@ AliTPCCalibViewerGUI::AliTPCCalibViewerGUI(const AliTPCCalibViewerGUI &c)
     fComboMethod(0),
     fListNormalization(0),
     fComboCustom(0),
+    fLblCustomDraw(0),
     fChkAddDrawOpt(0),
     fNmbSector(0),
     fLblSector(0),
     fChkCutZero(0),
     fChkAddCuts(0),
+    fLblAddCuts(0),
     fComboAddCuts(0), 
     fComboCustomFit(0),
     fChkSetMax(0),
@@ -787,7 +891,22 @@ AliTPCCalibViewerGUI::AliTPCCalibViewerGUI(const AliTPCCalibViewerGUI &c)
     fChkStatSkewnessPM(0),
     fContStatKurt(0),
     fChkStatKurtosis(0),
-    fChkStatKurtosisPM(0)
+    fChkStatKurtosisPM(0),
+    fContLabeling(0),
+    fChkLabelTitle(0),
+    fTxtLabelTitle(0),
+    fChkLabelXaxis(0),
+    fTxtLabelXaxis(0),
+    fChkLabelYaxis(0),
+    fTxtLabelYaxis(0),
+    fChkLabelGetAuto(0),
+    fContSave(0),
+    fBtnSave(0),
+    fContAddSaveOpt(0),
+    fChkAddSaveOpt(0),
+    fComboAddSaveOpt(0)
+
+       
 {
   //
   // dummy AliTPCCalibViewerGUI copy constructor
@@ -880,6 +999,11 @@ void AliTPCCalibViewerGUI::Initialize(char* fileName) {
    fComboAddDrawOpt->AddEntry("surf1", 14);
    fComboAddDrawOpt->AddEntry("surf2", 15);
 
+   // fill fComboAddSaveOpt with some additional drawing options
+   fComboAddSaveOpt->AddEntry("Portrait", 0);
+   fComboAddSaveOpt->AddEntry("Landscape", 1);
+   fComboAddSaveOpt->AddEntry("Preview", 2);
+   fComboAddSaveOpt->AddEntry("+50", 3);
 
    fListVariables->Select(0);
    fListNormalization->Select(0);
@@ -983,24 +1107,6 @@ void AliTPCCalibViewerGUI::HandleButtons1D(Int_t id) {
 }
 
 
-void AliTPCCalibViewerGUI::HandleButtons2D(Int_t id) {
-   //
-   // handles mutual radio button exclusions
-   // 2D-Tab buttons
-   //
-   if (id == -1) {
-      TGButton *btn = (TGButton *) gTQSender;
-      id = btn->WidgetId();
-   }
-
-   switch (id) {
-      case 211:
-      break;
-   }
-   DoNewSelection();
-}
-
-
 void AliTPCCalibViewerGUI::HandleButtonsStat(Int_t id) {
    // 
    // handles statistic check boxes 
@@ -1008,7 +1114,10 @@ void AliTPCCalibViewerGUI::HandleButtonsStat(Int_t id) {
    // if the checkbox is checked, appends 'n' for name, 'e' for entries, ...
    // to a TString, passes this TString to gStyle->SetOptStat(...)
    // 
-   id = id; // to avoid compiler warnings 
+   if (id == -1) {
+      TGButton *btn = (TGButton *) gTQSender;
+      id = btn->WidgetId();
+   }
    TString statOpt("");
    if (fChkStatName->GetState() == kButtonDown) statOpt.Append("n");
    if (fChkStatEntries->GetState() == kButtonDown) statOpt.Append("e");
@@ -1060,12 +1169,24 @@ void AliTPCCalibViewerGUI::HandleButtonsRight(Int_t id) {
          fRadioSideA->SetState(kButtonUp);
          fRadioSideC->SetState(kButtonUp);
          break;
+      case 31:            // fComboAddCuts
+         fChkAddCuts->SetState(kButtonDown);
+         break;
       case 40:             // fTxtSetMin
          fChkSetMin->SetState(kButtonDown);
          break;
       case 41:             // fTxtSetMax
          fChkSetMax->SetState(kButtonDown);
          break;
+      case 50:             // fTxtLabelTitle
+         fChkLabelTitle->SetState(kButtonDown);
+         break;
+      case 51:             // fTxtLabelXaxis
+         fChkLabelXaxis->SetState(kButtonDown);
+         break;
+      case 52:             // fTxtLabelXaxis
+         fChkLabelYaxis->SetState(kButtonDown);
+         break;
    }
    DoNewSelection();
 }
@@ -1164,8 +1285,6 @@ void AliTPCCalibViewerGUI::DoDraw() {
       sectorStr += sector; //cuts += "sector==";
    }
    TString cutsStr("");
-   
-         
    if (fChkCutZero->GetState() == kButtonDown) {
       cutsStr += desiredData.Data();
       cutsStr += "!=0";
@@ -1244,6 +1363,20 @@ void AliTPCCalibViewerGUI::DoDraw() {
          fTxtSetMin->SetText(Form("%f", hist->GetMinimum()));
    }
    
+   // set labels accoring to specification, if cehckboxes are checked
+   if (fChkLabelTitle->GetState() == kButtonDown) 
+      hist->SetTitle(fTxtLabelTitle->GetText());
+   if (fChkLabelXaxis->GetState() == kButtonDown)
+      hist->GetXaxis()->SetTitle(fTxtLabelXaxis->GetText());
+   if (fChkLabelYaxis->GetState() == kButtonDown)
+      hist->GetYaxis()->SetTitle(fTxtLabelYaxis->GetText());
+   // get and/or set labels and title
+   if (fChkLabelGetAuto->GetState() == kButtonDown) {
+      fTxtLabelTitle->SetText(hist->GetTitle());
+      fTxtLabelXaxis->SetTitle(hist->GetXaxis()->GetTitle());
+      fTxtLabelYaxis->SetTitle(hist->GetYaxis()->GetTitle());
+   }
+   
    fCanvMain->GetCanvas()->Update();
 }
 
@@ -1363,6 +1496,72 @@ void AliTPCCalibViewerGUI::AddFitFunction() const {
    // 
    std::cout << "Not yet implemented." << std::endl;
 }
+
+void AliTPCCalibViewerGUI::SavePicture() {
+   // 
+   // saves the current picture
+   // 
+   // use the following combination of file type and save options:
+   // (see also TCanvas::Print)
+   // 
+   //       "ps"  - Postscript file is produced (see special cases below)
+   //    "Portrait" - Postscript file is produced (Portrait)
+   // "Landscape" - Postscript file is produced (Landscape)
+   //       "eps" - an Encapsulated Postscript file is produced
+   //    "Preview" - an Encapsulated Postscript file with preview is produced.
+   //       "pdf" - a PDF file is produced
+   //       "svg" - a SVG file is produced
+   //       "gif" - a GIF file is produced
+   //       "gif+NN" - an animated GIF file is produced, where NN is delay in 10ms units
+   //       "xpm" - a XPM file is produced
+   //       "png" - a PNG file is produced
+   //       "jpg" - a JPEG file is produced
+   //       "tiff" - a TIFF file is produced
+   //       "cxx" - a C++ macro file is produced
+   //       "xml" - a XML file
+   //       "root" - a ROOT binary file
+   
+
+      
+   const char *kSaveAsTypes[] = {
+      "Postscript",  "*.ps",
+      "Encapsulated Postscript",   "*.eps",
+      "PDF",   "*.pdf",
+      "JPEG",   "*.jpg",
+      "PNG",   "*.png",
+      "TIFF",   "*.tiff",
+      "GIF",   "*.gif",
+      "XPM",   "*.xpm",
+      "SVG",   "*.svg",
+      "XML",   "*.xml",
+      "C++ macro",   "*.cxx",
+      "Macro file",  "*.C",
+      "ROOT file",   "*.root",
+      "All file",    "*",
+       0,              0
+   };
+   TString addSaveOpt("");
+   if (fChkAddSaveOpt->GetState() == kButtonDown)
+   addSaveOpt += fComboAddSaveOpt->GetTextEntry()->GetText();
+   TString dir(".");
+   TGFileInfo fi;
+   fi.fFileTypes = kSaveAsTypes;
+   // fi.fIniDir    = StrDup(dir);
+   fi.fOverwrite = kFALSE;
+   new TGFileDialog(gClient->GetRoot(), gClient->GetRoot(), kFDSave, &fi);
+   if (fi.fFilename && strlen(fi.fFilename)) {
+      fCanvMain->GetCanvas()->Print(fi.fFilename, addSaveOpt.Data());
+   }
+
+// TList*      fFileNamesList  list of selected file names
+// Int_t       fFileTypeIdx    selected file type, index in fFileTypes
+// const char**        fFileTypes      file types used to filter selectable files
+// char*       fFilename       selected file name
+// char*       fIniDir on input: initial directory, on output: new directory
+// Bool_t      fMultipleSelection      if true, allow multiple file selection
+// Bool_t      fOverwrite      if true overwrite the file with existing name on save
+   
+}
    
 
 void AliTPCCalibViewerGUI::ShowGUI(const char* fileName) {
index 1acc251..6a71e48 100644 (file)
@@ -65,6 +65,7 @@ public:
    void DoNewSelection();                    // decides whether to redraw if user makes another selection
    void DoDraw();                            // main method for drawing according to user selection
    void DoFit();                             // main method for fitting
+   void SavePicture();                       // method for saving
    void GetMinMax();                         // Read current Min & Max from the plot and set it to fTxtSetMin & fTxtSetMax
    void ChangeSector();                      // function that is called, when the number of the sector is changed
    void AddFitFunction() const;              // adds the last fit function to the normalization list
@@ -80,6 +81,9 @@ protected:
    TGTab               *ftabLeft;            // Tabs on the left side for plot options
    TGCompositeFrame    *ftabLeft0;           // Tab 0 on the left side for general plot options
    TGCompositeFrame    *ftabLeft1;           // Tab 1 on the left side for 1D plot options
+   TGTab               *ftabRight;           // Tabs on the right side
+   TGCompositeFrame    *fTabRight0;          // Tab 0 on the right side for basic
+   TGCompositeFrame    *fTabRight1;          // Tab 1 on the right side for advanced
    TGCompositeFrame    *fContRight;          // container for GUI elements on right side
    TGCompositeFrame    *fContCenter;         // container for GUI elements at the center
    TGCompositeFrame    *fContPlotOpt;        // container for plot options GUI elements
@@ -117,11 +121,13 @@ protected:
    TGComboBox          *fComboMethod;        // normalization methods dropdown box
    TGListBox           *fListNormalization;  // listbox with possible normalization variables
    TGComboBox          *fComboCustom;        // combo box for custom draw commands
+   TGLabel             *fLblCustomDraw;      // custom draw labal
    TGCheckButton       *fChkAddDrawOpt;      // additional draw options check box
    TGNumberEntry       *fNmbSector;          // number entry box for specifying the sector
    TGLabel             *fLblSector;          // label that shows the active sector
    TGCheckButton       *fChkCutZero;         // cut zeros check box
    TGCheckButton       *fChkAddCuts;         // additional cuts check box
+   TGLabel             *fLblAddCuts;         // additional cuts label
    TGComboBox          *fComboAddCuts;       // additional cuts combo box
    TGComboBox          *fComboCustomFit;     // custom fit combo box
    TGCheckButton       *fChkSetMax;          // Set maximum check box
@@ -165,6 +171,19 @@ protected:
    TGCompositeFrame    *fContStatKurt;       // container for kurtosis and its error in stat opt
    TGCheckButton       *fChkStatKurtosis;    // checkbox to display kurtosis in statistic legend
    TGCheckButton       *fChkStatKurtosisPM;  // checkbox to display kurtosis error in statistic legend
+   TGGroupFrame        *fContLabeling;       // groupframe container for labeling
+   TGCheckButton       *fChkLabelTitle;      // checkbox to display specified title
+   TGTextEntry         *fTxtLabelTitle;      // text box to specify title
+   TGCheckButton       *fChkLabelXaxis;      // checkbox to display specified xaxis label
+   TGTextEntry         *fTxtLabelXaxis;      // text box to specify xaxis label
+   TGCheckButton       *fChkLabelYaxis;      // checkbox to display specified yaxis label
+   TGTextEntry         *fTxtLabelYaxis;      // text box to specify yaxis label
+   TGCheckButton       *fChkLabelGetAuto;    // checkbox to get labels atuomatically from plot
+   TGGroupFrame        *fContSave;           // container for save-button
+   TGButton            *fBtnSave;            // Save button
+   TGCompositeFrame    *fContAddSaveOpt;     // container for additional save options
+   TGCheckButton       *fChkAddSaveOpt;      // checkbox for additional save options
+   TGComboBox          *fComboAddSaveOpt;    // combobox for additional save options
    
    void Initialize(char* fileName);          // initializes the GUI with default settings and opens tree for drawing