Adding abbreviation (Lars Bozyk)
authormarian <marian@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 18 Feb 2008 12:09:49 +0000 (12:09 +0000)
committermarian <marian@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 18 Feb 2008 12:09:49 +0000 (12:09 +0000)
TPC/AliTPCCalibViewer.cxx
TPC/AliTPCCalibViewer.h
TPC/AliTPCCalibViewerGUI.cxx
TPC/AliTPCCalibViewerGUI.h

index ecbd795..d651fb4 100644 (file)
@@ -210,6 +210,108 @@ void AliTPCCalibViewer::Delete(Option_t* option) {
    delete fListOfObjectsToBeDeleted;
 }
 
+
+const char* AliTPCCalibViewer::AddAbbreviations(char* c, Bool_t printDrawCommand){ 
+   // Replace all "<variable>" with "<variable><fAbbreviation>" (Adds forgotten "~")
+   // but take care on the statistical information, like "CEQmean_Mean"
+   // and also take care on correct given variables, like "CEQmean~"
+   // 
+   // For each variable out of "listOfVariables":
+   // - 'Save' correct items:
+   //   - form <replaceString>, take <variable>'s first char, add <removeString>, add rest of <variable>, e.g. "C!#EQmean" (<removeString> = "!#")
+   //   - For each statistical information in "listOfNormalizationVariables":
+   //     - ReplaceAll <variable><statistical_Information> with <replaceString><statistical_Information>
+   //   - ReplaceAll <variable><abbreviation> with <replaceString><abbreviation>, e.g. "CEQmean~" -> "C!#EQmean~"
+   //   - ReplaceAll <variable><appendStr> with <replaceString><appendStr>, e.g. "CEQmean.fElements" -> "C!#EQmean.fElements"
+   //
+   // - Do actual replacing:
+   //   - ReplaceAll <variable> with <variable><fAbbreviation>, e.g. "CEQmean" -> "CEQmean~"
+   //
+   // - Undo saving:
+   //   - For each statistical information in "listOfNormalizationVariables":
+   //     - ReplaceAll <replaceString><statistical_Information> with <variable><statistical_Information> 
+   //   - ReplaceAll <replaceString><abbreviation> with <variable><abbreviation>, e.g. "C!#EQmean~" -> "CEQmean~"
+   //   - ReplaceAll <replaceString><appendStr> with <variable><appendStr>, e.g. "C!#EQmean.fElements" -> "CEQmean.fElements"
+   // 
+   // Now all the missing "~" should be added.
+   
+   TString str(c);
+   TString removeString = "!#";  // very unpropable combination of chars
+   TString replaceString = "";
+   TString searchString = "";
+   TString normString = "";
+   TObjArray *listOfVariables = GetListOfVariables();
+   listOfVariables->Add(new TObjString("channel"));
+   listOfVariables->Add(new TObjString("gx"));
+   listOfVariables->Add(new TObjString("gy"));
+   listOfVariables->Add(new TObjString("lx"));
+   listOfVariables->Add(new TObjString("ly"));
+   listOfVariables->Add(new TObjString("pad"));
+   listOfVariables->Add(new TObjString("row"));
+   listOfVariables->Add(new TObjString("rpad"));
+   listOfVariables->Add(new TObjString("sector"));
+   TObjArray *listOfNormalizationVariables = GetListOfNormalizationVariables();
+   Int_t nVariables = listOfVariables->GetEntriesFast();
+   Int_t nNorm = listOfNormalizationVariables->GetEntriesFast();
+   
+   Int_t *varLengths = new Int_t[nVariables];
+   for (Int_t i = 0; i < nVariables; i++) {
+      varLengths[i] = ((TObjString*)listOfVariables->At(i))->String().Length();
+   }
+   Int_t *normLengths = new Int_t[nNorm];
+   for (Int_t i = 0; i < nNorm; i++) {
+      normLengths[i] = ((TObjString*)listOfNormalizationVariables->At(i))->String().Length();
+      // printf("normLengths[%i] (%s) = %i \n", i,((TObjString*)listOfNormalizationVariables->At(i))->String().Data(), normLengths[i]);
+   }
+   Int_t *varSort = new Int_t[nVariables];
+   TMath::Sort(nVariables, varLengths, varSort, kTRUE);
+   Int_t *normSort = new Int_t[nNorm];
+   TMath::Sort(nNorm, normLengths, normSort, kTRUE);
+   // for (Int_t i = 0; i<nNorm; i++)  printf("normLengths: %i\n", normLengths[normSort[i]]);
+   // for (Int_t i = 0; i<nVariables; i++) printf("varLengths: %i\n", varLengths[varSort[i]]);
+   
+   for (Int_t ivar = 0; ivar < nVariables; ivar++) {
+      // ***** save correct tokens *****
+      // first get the next variable:
+      searchString = ((TObjString*)listOfVariables->At(varSort[ivar]))->String();
+      // printf("searchString: %s ++++++++++++++\n", searchString.Data());
+      // form replaceString:
+      replaceString = "";
+      for (Int_t i = 0; i < searchString.Length(); i++) {
+         replaceString.Append(searchString[i]);
+         if (i == 0) replaceString.Append(removeString);
+      }
+      // go through normalization:
+      // printf("go through normalization\n");
+      for (Int_t inorm = 0; inorm < nNorm; inorm++) {
+         // printf(" inorm=%i, nNorm=%i, normSort[inorm]=%i \n", inorm, nNorm, normSort[inorm]);
+         normString = ((TObjString*)listOfNormalizationVariables->At(normSort[inorm]))->String();
+         // printf(" walking in normalization, i=%i, normString=%s \n", inorm, normString.Data());
+         str.ReplaceAll(searchString + normString, replaceString + normString);
+         // like: str.ReplaceAll("CEQmean_Mean", "C!EQmean_Mean");
+      }
+      str.ReplaceAll(searchString + fAbbreviation, replaceString + fAbbreviation);
+      // like: str.ReplaceAll("CEQmean~", "C!EQmean~");
+      str.ReplaceAll(searchString + fAppendString,    replaceString + fAppendString);
+      // like: str.ReplaceAll("CEQmean.fElements", "C!EQmean.fElements");
+      
+      // ***** add missing extensions *****
+      str.ReplaceAll(searchString, replaceString + fAbbreviation);
+      // like: str.ReplaceAll("CEQmean", "C!EQmean~");
+   }
+   
+   // ***** undo saving *****
+   str.ReplaceAll(removeString, "");
+  
+   if (printDrawCommand) std::cout << "The string looks now like: " << str.Data() << std::endl;
+   delete varSort;
+   delete normSort;
+   return str.Data();
+}
+
+
+
+
 //_____________________________________________________________________________
 Int_t AliTPCCalibViewer::EasyDraw(const char* drawCommand, const char* sector, const char* cuts, const char* drawOptions, Bool_t writeDrawCommand) const {
   //
@@ -228,6 +330,11 @@ Int_t AliTPCCalibViewer::EasyDraw(const char* drawCommand, const char* sector, c
    sectorStr.ToUpper();
    TString cutStr("");
    //TString drawOptionsStr("profcolz ");
+   Bool_t dangerousToDraw = drawStr.Contains(":") || drawStr.Contains(">>");
+   if (dangerousToDraw) {
+      Warning("EasyDraw", "The draw string must not contain ':' or '>>'.");
+      return -1;
+   }
    TString drawOptionsStr("");
    TRandom rnd(0);
    Int_t rndNumber = rnd.Integer(10000);
@@ -353,8 +460,9 @@ Int_t AliTPCCalibViewer::EasyDraw1D(const char* drawCommand, const char* sector,
    cutStr.ReplaceAll(fAbbreviation, fAppendString);
    if (writeDrawCommand) std::cout << "fTree->Draw(\"" << drawStr << "\", \"" <<  cutStr << "\", \"" << drawOptionsStr << "\");" << std::endl;
    Int_t returnValue = fTree->Draw(drawStr.Data(), cutStr.Data(), drawOptionsStr.Data());
+   if (returnValue == -1) return -1;
    
-   TObject *obj = gPad->GetPrimitive("htemp"); 
+   TObject *obj = (gPad) ? gPad->GetPrimitive("htemp") : 0; 
    if (!obj) obj = (TH1F*)gDirectory->Get("htemp");
    if (!obj) obj = gPad->GetPrimitive("tempHist");
    if (!obj) obj = (TH1F*)gDirectory->Get("tempHist");
@@ -1440,7 +1548,8 @@ AliTPCCalROC* AliTPCCalibViewer::GetCalROC(const char* desiredData, UInt_t secto
   // sector specifies the sector of the created AliTPCCalROC
   //
    TString drawStr(desiredData);
-   drawStr.Append(Form(":channel%s", fAbbreviation.Data()));
+   drawStr.Append(":channel");
+   drawStr.Append(fAbbreviation);
    Int_t entries = EasyDraw1D(drawStr.Data(), (Int_t)sector, cuts, "goff");
    if (entries == -1) return 0;
    AliTPCCalROC * createdROC = new AliTPCCalROC(sector);
index 7573dc1..0b14267 100644 (file)
@@ -33,8 +33,8 @@ public:
    virtual ~AliTPCCalibViewer();
    virtual void Delete(Option_t* option = "");
    
-   TString GetAbbreviation() const { return fAbbreviation;  }
-   TString GetAppendString() const { return fAppendString; }
+   TString& GetAbbreviation()  { return fAbbreviation;  }
+   TString& GetAppendString()  { return fAppendString; }
    void SetAbbreviation(char* abr) { fAbbreviation = abr; }
    void SetAppendString(char* str) { fAppendString = str; }
    
@@ -42,6 +42,7 @@ public:
    virtual Long64_t Draw(const char* varexp, const TCut& selection, Option_t* option = "", Long64_t nentries = 1000000000, Long64_t firstentry = 0) { return fTree->Draw(varexp, selection, option, nentries, firstentry); };
    virtual Long64_t Draw(const char* varexp, const char* selection, Option_t* option = "", Long64_t nentries = 1000000000, Long64_t firstentry = 0) { return fTree->Draw(varexp, selection, option, nentries, firstentry); };
 
+   const char* AddAbbreviations(char* c, Bool_t printDrawCommand = kFALSE);
    Int_t EasyDraw(const char* drawCommand, const char* sector, const char* cuts = 0, const char* drawOptions = 0, Bool_t writeDrawCommand = kFALSE) const;   // easy drawing of data, use '~' for abbreviation of '.fElements'
    Int_t EasyDraw(const char* drawCommand, Int_t sector, const char* cuts = 0, const char* drawOptions = 0, Bool_t writeDrawCommand = kFALSE) const;   // easy drawing of data, use '~' for abbreviation of '.fElements'
    Int_t EasyDraw1D(const char* drawCommand, const char* sector, const char* cuts = 0, const char* drawOptions = 0, Bool_t writeDrawCommand = kFALSE) const;   // easy drawing of data, use '~' for abbreviation of '.fElements'
index f89ac1e..da6b73a 100644 (file)
 #include <string.h>
 #include <TH1.h>
 #include "TStyle.h"
-#include "AliTPCCalibViewer.h"
-#include "TGFileDialog.h"
 #include "TGFileDialog.h"
+#include "TGInputDialog.h"
+#include "AliTPCCalibViewer.h"
+#include "AliTPCPreprocessorOnline.h"
 
 // #include "TGListBox.h"
 // #include "TGNumberEntry"
@@ -70,6 +71,7 @@ ClassImp(AliTPCCalibViewerGUI)
 AliTPCCalibViewerGUI::AliTPCCalibViewerGUI(const TGWindow *p, UInt_t w, UInt_t h, char* fileName)
   : TGCompositeFrame(p, w, h),
     fViewer(0),
+    fPreprocessor(0),
     fContTopBottom(0),
     fContLCR(0),
     fContLeft(0),
@@ -113,6 +115,7 @@ AliTPCCalibViewerGUI::AliTPCCalibViewerGUI(const TGWindow *p, UInt_t w, UInt_t h
     fRadioSector(0),
     fComboAddDrawOpt(0),
     fChkAuto(0),
+    fChkAutoAppend(0),
     fComboMethod(0),
     fListNormalization(0),
     fComboCustom(0),
@@ -184,20 +187,27 @@ AliTPCCalibViewerGUI::AliTPCCalibViewerGUI(const TGWindow *p, UInt_t w, UInt_t h
     fContAddExport(0),
     fComboExportName(0),
     fBtnExport(0),
-    fBtnAddNorm(0)
+    fBtnAddNorm(0), 
+    fContTree(0),
+    fBtnDumpToFile(0),
+    fBtnLoadTree(0),
+    fChkAddAsReference(0),
+    fTxtRefName(0), 
+    fInitialized(0)
 {
    //
    // AliTPCCalibViewerGUI constructor; fileName specifies the ROOT tree used for drawing 
    //
 
    // draw the GUI:
+   fPreprocessor = new AliTPCPreprocessorOnline();
    DrawGUI(p, w, h);
    // initialize the AliTPCCalibViewer:
    if (fileName) Initialize(fileName);
    // set default button states:
    SetInitialValues();
    // do first drawing: 
-   DoDraw();
+   if (fileName) DoDraw();
 }
 
 
@@ -210,6 +220,7 @@ void AliTPCCalibViewerGUI::DrawGUI(const TGWindow *p, UInt_t w, UInt_t h) {
    // ======================================================================
    
    SetCleanup(kDeepCleanup);
+   p = p; // to avoid compiler warnings
 
    // *****************************************************************************
    // ************************* content of this MainFrame *************************
@@ -311,6 +322,11 @@ void AliTPCCalibViewerGUI::DrawGUI(const TGWindow *p, UInt_t w, UInt_t h) {
          fChkAuto = new TGCheckButton(fContDrawOpt, "Auto redraw");
          fContDrawOpt->AddFrame(fChkAuto, new TGLayoutHints(kLHintsNormal, 0, 2, 0, 0));
          fChkAuto->SetToolTipText("Decide if you want an automatic redraw on each new selection.\nNot recommended on a slow machine, during remote connection or if your draw option is 'same'.");
+         
+         // automatic append ending check button
+         fChkAutoAppend = new TGCheckButton(fContDrawOpt, "Auto add appending");
+         fContDrawOpt->AddFrame(fChkAutoAppend, new TGLayoutHints(kLHintsNormal, 0, 2, 0, 0));
+         fChkAutoAppend->SetToolTipText("Tries to repair your custom draw string or custom cut string, if you forgot '~' or '.fElements' \nThis function may be buggy!");
                
       
       // *** predefined radio button ***  " Predefined "
@@ -798,13 +814,39 @@ void AliTPCCalibViewerGUI::DrawGUI(const TGWindow *p, UInt_t w, UInt_t h) {
          fBtnExport->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "DoExport()");
          fBtnExport->SetToolTipText("Export the current 2D view as AliTPCCalPad to the CINT command line interpreter, use the specified name. \nThis works only in 2D mode.");
       
-         // export button
+         // add to normalisation button
          fBtnAddNorm = new TGTextButton(fContExport, "&Add to normalization");
          fContExport->AddFrame(fBtnAddNorm, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
          fBtnAddNorm->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "DoExportNorm()");
          fBtnAddNorm->SetToolTipText("Use the current 2D view as normalization variable, use the specified name. \nNot yet working!");
-         
-      
+
+      // Tree container
+      fContTree = new TGGroupFrame(fTabRight1, "Tree", kVerticalFrame | kFitWidth | kFitHeight);
+      fTabRight1->AddFrame(fContTree, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
+
+         // dump tree to file button
+         fBtnDumpToFile = new TGTextButton(fContTree, "&Dump to File");
+         fContTree->AddFrame(fBtnDumpToFile, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
+         fBtnDumpToFile->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "DoDumpToFile()");
+         fBtnDumpToFile->SetToolTipText("Write the exported CalPads to a new CalibTree");
+
+         // dump tree to file button
+         fBtnLoadTree = new TGTextButton(fContTree, "&Load Tree");
+         fContTree->AddFrame(fBtnLoadTree, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
+         fBtnLoadTree->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "DoLoadTree()");
+         fBtnLoadTree->SetToolTipText("Load and initialize a new calibration tree. ");
+
+         fChkAddAsReference = new TGCheckButton(fContTree, "as reference:");
+         fContTree->AddFrame(fChkAddAsReference, new TGLayoutHints(kLHintsNormal | kLHintsExpandX));
+         fChkAddAsReference->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "DoLoadTree()");
+         fChkAddAsReference->SetToolTipText("To add a new tree as reference tree.");
+            
+         fTxtRefName = new TGTextEntry(fContTree, "R", 500);
+         fContTree->AddFrame(fTxtRefName, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 15, 0, 0, 0));
+         // fTxtRefName->Connect("ReturnPressed()", "AliTPCCalibViewerGUI", this, "HandleButtonsNoRedraw(=50)");
+         fTxtRefName->SetToolTipText("Reference Name");
+        
+            
       // Fit options container
       fContFit = new TGGroupFrame(fTabRight1, "Custom fit", kVerticalFrame | kFitWidth | kFitHeight);
       fTabRight1->AddFrame(fContFit, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
@@ -845,11 +887,11 @@ void AliTPCCalibViewerGUI::SetInitialValues() {
    // 
    // Set the default button states
    // 
+   fChkAuto->SetState(kButtonUp);
    fRadioPredefined->SetState(kButtonDown);
    fRadioRaw->SetState(kButtonDown);
    fRadioTPC->SetState(kButtonDown);
    fRadio1D->SetState(kButtonDown);
-   fChkAuto->SetState(kButtonDown);
    fChkAddCuts->SetState(kButtonUp);
    fChkGetMinMaxAuto->SetState(kButtonDown);
    fChkSetMin->SetState(kButtonUp);
@@ -1002,7 +1044,8 @@ void AliTPCCalibViewerGUI::SetInitialValues() {
    //fCanvMain->GetCanvas()->GetCanvasImp()->ShowStatusBar(kTRUE); // klappt auch nicht
    fListVariables->IntegralHeight(kFALSE);         // naja
    fListNormalization->IntegralHeight(kFALSE);     // naja
-   
+   fChkAuto->SetState(kButtonDown);
+  
    // Make first drawing:
    // DoDraw();
 }
@@ -1011,6 +1054,7 @@ void AliTPCCalibViewerGUI::SetInitialValues() {
 AliTPCCalibViewerGUI::AliTPCCalibViewerGUI(const AliTPCCalibViewerGUI &c)
    : TGCompositeFrame(c.fParent, c.fWidth, c.fHeight),
     fViewer(0),
+    fPreprocessor(0),
     fContTopBottom(0),
     fContLCR(0),
     fContLeft(0),
@@ -1054,6 +1098,7 @@ AliTPCCalibViewerGUI::AliTPCCalibViewerGUI(const AliTPCCalibViewerGUI &c)
     fRadioSector(0),
     fComboAddDrawOpt(0),
     fChkAuto(0),
+    fChkAutoAppend(0),
     fComboMethod(0),
     fListNormalization(0),
     fComboCustom(0),
@@ -1125,7 +1170,13 @@ AliTPCCalibViewerGUI::AliTPCCalibViewerGUI(const AliTPCCalibViewerGUI &c)
     fContAddExport(0),
     fComboExportName(0),
     fBtnExport(0),
-    fBtnAddNorm(0)
+    fBtnAddNorm(0), 
+    fContTree(0),
+    fBtnDumpToFile(0),
+    fBtnLoadTree(0),
+    fChkAddAsReference(0),
+    fTxtRefName(0),
+    fInitialized(0)
 {
   //
   // dummy AliTPCCalibViewerGUI copy constructor
@@ -1153,6 +1204,7 @@ AliTPCCalibViewerGUI::~AliTPCCalibViewerGUI() {
    }
    Cleanup();
    if (fViewer) fViewer->Delete();
+   delete fPreprocessor;
 }
 
 
@@ -1438,7 +1490,6 @@ void AliTPCCalibViewerGUI::HandleButtonsNoRedraw(Int_t id) {
 }
 
 
-
 void AliTPCCalibViewerGUI::DoNewSelection() {
    //
    // decides whether to redraw if user makes another selection
@@ -1518,6 +1569,9 @@ TString* AliTPCCalibViewerGUI::GetDrawString() {
       if (desiredData == "") return 0;
    }
    
+   // try to add forgotten '~'
+   if (fChkAutoAppend->GetState() == kButtonDown) 
+      desiredData = TString(fViewer->AddAbbreviations((char*)desiredData.Data()));
    return new TString(desiredData.Data());
 }   
 
@@ -1562,6 +1616,10 @@ TString* AliTPCCalibViewerGUI::GetSectorString() {
    }
    if (fChkAddCuts->GetState() == kButtonDown)
       cutsStr += fComboAddCuts->GetTextEntry()->GetText();
+   
+   // try to add forgotten '~'
+   if (fChkAutoAppend->GetState() == kButtonDown) 
+      cutsStr = TString(fViewer->AddAbbreviations((char*)cutsStr.Data()));
    return new TString(cutsStr.Data());
 }
 
@@ -1638,8 +1696,7 @@ void AliTPCCalibViewerGUI::DoFit() {
 
    // specify data to plot:
    TString drawStr(GetDrawString()->Data());
-
-
+   
    // ********** create cut string **********
    if (fRadioTPC->GetState() == kButtonDown)
       cutStr += ""; // whole TPC is used for fitting
@@ -1656,9 +1713,14 @@ void AliTPCCalibViewerGUI::DoFit() {
       if (fRadioTPC->GetState() != kButtonDown) cutStr += " && ";
       cutStr += fComboAddCuts->GetTextEntry()->GetText();  
    }
+   // try to add forgotten '~'
+   if (fChkAutoAppend->GetState() == kButtonDown) 
+      cutStr = TString(fViewer->AddAbbreviations((char*)cutStr.Data()));
    
    // ********** get formula string **********
    formulaStr += fComboCustomFit->GetTextEntry()->GetText();
+   if (fChkAutoAppend->GetState() == kButtonDown) 
+      formulaStr = TString(fViewer->AddAbbreviations((char*)formulaStr.Data()));
 
    // ********** call AliTPCCalibViewer's fit-function
    returnStr = fViewer->Fit(drawStr.Data(), formulaStr.Data(), cutStr.Data(), chi2, fitParam, covMatrix);
@@ -1688,6 +1750,7 @@ void AliTPCCalibViewerGUI::DoExport() {
    AliTPCCalPad *calPad = fViewer->GetCalPad(desiredData.Data(), (char*)cutsStr.Data(), (char*)calPadName);
    // finally export calPad to Cint:
    gROOT->ProcessLine(Form("AliTPCCalPad* %s = (AliTPCCalPad*)0x%lx;", calPadName, calPad));
+   fPreprocessor->AddComponent(calPad);
    Info("ExportCalPad", "Current 2D view has been exported to an AliTPCCalPad* with name '%s'", calPadName);
 }
 
@@ -1735,10 +1798,24 @@ void AliTPCCalibViewerGUI::GetMinMax() {
    }
    if ( ptr != 0 && !ptr->InheritsFrom("TH1") ) return;      // if the loop did not find a TH1
    TH1 *hist = (TH1*)ptr;
-   Double_t histMax = hist->GetMaximum();
-   Double_t histMin = hist->GetMinimum();
-   fTxtSetMax->SetText(Form("%f",histMax));
-   fTxtSetMin->SetText(Form("%f",histMin));
+
+//    Double_t histMax = hist->GetMaximum();
+//    Double_t histMin = hist->GetMinimum();
+//    fTxtSetMax->SetText(Form("%f",histMax));
+//    fTxtSetMin->SetText(Form("%f",histMin));
+
+   if (fRadio2D->GetState() == kButtonDown) {
+      if (fChkSetMax->GetState() == kButtonUp)
+         fTxtSetMax->SetText(Form("%f", hist->GetMaximum()));
+      if (fChkSetMin->GetState() == kButtonUp)
+         fTxtSetMin->SetText(Form("%f", hist->GetMinimum()));
+   }
+   else if (fRadio1D->GetState() == kButtonDown) {
+      if (fChkSetMax->GetState() == kButtonUp)
+         fTxtSetMax->SetText( Form("%f", hist->GetXaxis()->GetXmax()) );
+      if (fChkSetMin->GetState() == kButtonUp)
+         fTxtSetMin->SetText( Form("%f", hist->GetXaxis()->GetXmin()) );
+   }
 }
 
 
@@ -1765,24 +1842,32 @@ void AliTPCCalibViewerGUI::SetMinMaxLabel() {
    TH1 *hist = (TH1*)ptr; 
    TString minTxt(fTxtSetMin->GetText());
    TString maxTxt(fTxtSetMax->GetText());
+   
    // set min and max according to specified values, if checkbox is checked
-   if (fChkSetMax->GetState() == kButtonDown && (maxTxt.IsDigit() || maxTxt.IsFloat()) )
-      hist->SetMaximum(maxTxt.Atof());
-   if (fChkSetMax->GetState() == kButtonUp)
-      hist->SetMaximum(-1111);  // default value, to unzoom
-   if (fChkSetMin->GetState() == kButtonDown && (minTxt.IsDigit() || minTxt.IsFloat()) )
-      hist->SetMinimum(minTxt.Atof());
-   if (fChkSetMin->GetState() == kButtonUp)
-      hist->SetMinimum(-1111);  // default value, to unzoom
-   // get min and max from plot       
-   if (fChkGetMinMaxAuto->GetState() == kButtonDown) {
-      // maybe call here GetMinMax ???
+   if (fRadio2D->GetState() == kButtonDown) {
+      if (fChkSetMax->GetState() == kButtonDown && fChkSetMax->GetState() == kButtonDown &&(maxTxt.IsDigit() || maxTxt.IsFloat()) )
+         hist->SetMaximum(maxTxt.Atof());
       if (fChkSetMax->GetState() == kButtonUp)
-         fTxtSetMax->SetText(Form("%f", hist->GetMaximum()));
+         hist->SetMaximum(-1111);  // default value, to unzoom
+      if (fChkSetMin->GetState() == kButtonDown && (minTxt.IsDigit() || minTxt.IsFloat()) )
+         hist->SetMinimum(minTxt.Atof());
       if (fChkSetMin->GetState() == kButtonUp)
-         fTxtSetMin->SetText(Form("%f", hist->GetMinimum()));
+         hist->SetMinimum(-1111);  // default value, to unzoom
+   }
+   else if (fRadio2D->GetState() == kButtonDown) {
+      if (fChkSetMin->GetState() == kButtonDown && 
+          fChkSetMax->GetState() == kButtonDown && hist->GetXaxis())
+         hist->GetXaxis()->SetRangeUser(hist->GetXaxis()->GetXmin(), hist->GetXaxis()->GetXmax());
+      else if (fChkSetMax->GetState() == kButtonDown && hist->GetXaxis())
+         hist->GetXaxis()->SetRangeUser(hist->GetXaxis()->GetXmin(), maxTxt.Atof());
+      else if (fChkSetMin->GetState() == kButtonDown && hist->GetXaxis())
+         hist->GetXaxis()->SetRangeUser(minTxt.Atof(), hist->GetXaxis()->GetXmax());
+      hist->SetTitle(hist->GetTitle());  // trick to update the histogram
    }
    
+   // get min and max from plot       
+   GetMinMax();
+   
    // set labels according to specification, if cehckboxes are checked
    if (fChkLabelTitle->GetState() == kButtonDown) 
       hist->SetTitle(fTxtLabelTitle->GetText());
@@ -1988,6 +2073,54 @@ void AliTPCCalibViewerGUI::SavePicture() {
 }
    
 
+void AliTPCCalibViewerGUI::DoDumpToFile() {
+   // 
+   // This function is called, when the "Dump to File" button is pressed. 
+   // All the exported CalPads will be written into an new CalibTree, 
+   // a Save File dialog will appear to specify the filename
+   // 
+   const char *kSaveAsTypes[] = {
+      "ROOT file",   "*.root",
+       0,              0
+   };
+   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)) {
+      fPreprocessor->DumpToFile(fi.fFilename);
+      Info("DumpToFile", Form("New CalibTree has been writen to file '%s'", fi.fFilename));
+   }
+}
+
+
+void AliTPCCalibViewerGUI::DoLoadTree() {
+   // function to load a new calib tree
+   // 
+   // 
+   const char *kFileTypes[] = {
+      "ROOT file",   "*.root",
+       0,              0
+   };
+   TString dir(".");
+   TGFileInfo fi;
+   fi.fFileTypes = kFileTypes;
+   // fi.fIniDir    = StrDup(dir);
+   fi.fOverwrite = kFALSE;
+   new TGFileDialog(gClient->GetRoot(), gClient->GetRoot(), kFDOpen, &fi);
+   if (fi.fFilename && strlen(fi.fFilename) && fChkAddAsReference->GetState() == kButtonUp) {
+      Initialize(fi.fFilename);
+      Reload();
+   }
+   else if (fi.fFilename && strlen(fi.fFilename) && fChkAddAsReference->GetState() == kButtonDown) {
+      fViewer->AddReferenceTree(fi.fFilename, "calPads", fTxtRefName->GetText());
+      Reload();
+   }
+}
+
+
 TObjArray* AliTPCCalibViewerGUI::ShowGUI(const char* fileName) {
    //
    // Initialize and show GUI for presentation for demonstration purposes
index f479397..56bb454 100644 (file)
@@ -31,6 +31,7 @@
 #include <TGTab.h>
 class TROOTt;
 class AliTPCCalibViewer;
+class AliTPCPreprocessorOnline;
 
 
 // class TGListBox;
@@ -67,7 +68,7 @@ public:
    TString* GetCutString();                                     // create the cut string out of selection
    TString* GetSectorString();                                  // create the sector string out of selection
    AliTPCCalibViewer* GetViewer() {return fViewer;}             // returns the internal AliTPCCalibViewer object, which does the work
-   static TObjArray* ShowGUI(const char* fileName);             // initialize and show GUI for presentation, standalone
+   static TObjArray* ShowGUI(const char* fileName = 0);             // initialize and show GUI for presentation, standalone
    
    void HandleButtonsGeneral(Int_t id = -1); // handles mutual radio button exclusions for general Tab
    void HandleButtons1D(Int_t id = -1);      // handles mutual radio button exclusions for 1D Tab
@@ -78,6 +79,8 @@ public:
    void DoDraw();                            // main method for drawing according to user selection
    void DoFit();                             // main method for fitting
    void DoExport();                          // function to export a CalPad to Cint
+   void DoDumpToFile();                      // function to dump a new calib tree to file
+   void DoLoadTree();                        // function to load a new calib tree
    void DoExportNorm();                      // function to use a calPad for normalization
    void SavePicture();                       // method for saving
    void GetMinMax();                         // Read current Min & Max from the plot and set it to fTxtSetMin & fTxtSetMax
@@ -87,8 +90,9 @@ public:
    void MouseMove(Int_t event, Int_t x, Int_t y, TObject *selected); 
    void UnchekAllStat();                     // Disable all statistical legend entries, no statistical legend.
    
- protected:   
+protected:   
    AliTPCCalibViewer   *fViewer;             // CalibViewer object used for drawing
+   AliTPCPreprocessorOnline *fPreprocessor;  // PreprocessorOnline object, used to collect the exported CalPads and to save them into a new calibTree
 
    TGCompositeFrame    *fContTopBottom;      // container for all GUI elements, vertical divided
    TGCompositeFrame    *fContLCR;            // container for all GUI elements, horizontal divided
@@ -133,6 +137,7 @@ public:
    TGRadioButton       *fRadioSector;        // sector radio button
    TGComboBox          *fComboAddDrawOpt;    // additional draw options combo box
    TGCheckButton       *fChkAuto;            // automatic redraw checkbox
+   TGCheckButton       *fChkAutoAppend;      // automatic appendign of "~" checkbox
    TGComboBox          *fComboMethod;        // normalization methods dropdown box
    TGListBox           *fListNormalization;  // listbox with possible normalization variables
    TGComboBox          *fComboCustom;        // combo box for custom draw commands
@@ -205,6 +210,11 @@ public:
    TGComboBox          *fComboExportName;    // dropdownbox to enter a name for the exported CalPad
    TGTextButton        *fBtnExport;          // button to export a CalPad
    TGTextButton        *fBtnAddNorm;         // button to add a CalPad to the normalization
+   TGCompositeFrame    *fContTree;           // container for tree functions
+   TGTextButton        *fBtnDumpToFile;      // button to dump a new CalibTree to file
+   TGTextButton        *fBtnLoadTree;        // button to load a new tree
+   TGCheckButton       *fChkAddAsReference;  // checkbox to add a new tree as referenceTree
+   TGTextEntry         *fTxtRefName;         // text box to specify the referenceTree's name
    
    private:
    Bool_t fInitialized;                      // has the GUI already been initialized?