fix and extend TRD track list functionality
authorabercuci <abercuci@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 28 Mar 2012 11:35:35 +0000 (11:35 +0000)
committerabercuci <abercuci@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 28 Mar 2012 11:35:35 +0000 (11:35 +0000)
EVE/EveDet/AliEveTRDTrackList.cxx
EVE/EveDet/AliEveTRDTrackList.h
EVE/EveDet/AliEveTRDTrackListEditor.cxx
EVE/EveDet/AliEveTRDTrackListEditor.h

index 80fa771..81b280b 100644 (file)
@@ -60,6 +60,7 @@
 // Uncomment to display debugging infos
 //#define ALIEVETRDTRACKLIST_DEBUG
 
+#include <AliLog.h>
 #include <TFile.h>
 #include <TFunction.h>
 #include <TH1.h>
@@ -69,7 +70,7 @@
 #include <TROOT.h>
 #include <TSystem.h>
 #include <TTree.h>
-#include <TTreeStream.h>
+//#include <TTreeStream.h>
 #include <TMethodCall.h>
 
 #include <AliTRDReconstructor.h>
 #include <../PWGPP/TRD/AliTRDpwgppHelper.h>
 
 ClassImp(AliEveTRDTrackList)
+TFile *AliEveTRDTrackList::fgData(NULL);
 
 ///////////////////////////////////////////////////////////
 /////////////   AliEveTRDTrackList ////////////////////////
 ///////////////////////////////////////////////////////////
 AliEveTRDTrackList::AliEveTRDTrackList(const Text_t* n, const Text_t* t, Bool_t doColor):
   TEveElementList(n, t, doColor),
-  fEditor(0x0),
-  fDataFromMacroList(0x0),
-  fMacroList(0x0),
-  fDataTree(0x0),
+  fEditor(NULL),
+  fDataFromMacroList(NULL),
+  fMacroList(NULL),
   fHistoDataSelected(0),
   fMacroListSelected(0),
   fSelectedTab(1),                              // Standard tab: "Apply macros" (index 1)
@@ -134,11 +135,6 @@ AliEveTRDTrackList::~AliEveTRDTrackList()
     delete fDataFromMacroList;
     fDataFromMacroList = 0;
   } 
-  if (fDataTree != 0)
-  {
-    delete fDataTree;
-    fDataTree = 0;
-  } 
   if (fMacroList != 0)
   {
     fMacroList->DeleteAll();
@@ -184,10 +180,10 @@ Int_t AliEveTRDTrackList::AddMacro(const Char_t* path, const Char_t* nameC, Bool
   for (UInt_t ind = 0; ind < fkMaxMacroNameLength && ind < strlen(nameC) - 2; ind++)  name[ind] = nameC[ind];
 
   // Check, if files exists
-  FILE* fp = 0x0;
+  FILE* fp = NULL;
   if((fp = fopen(pathname, "rb"))){
     fclose(fp);
-    fp = 0x0;
+    fp = NULL;
   } else  return NOT_EXIST_ERROR;
   
   // Clean up root, load the desired macro and then check the type of the macro
@@ -327,12 +323,22 @@ Bool_t AliEveTRDTrackList::ApplyProcessMacros(const TList* selIterator, const TL
   // A.B. gROOT->Reset();
   
   // Clear old data and re-allocate
-  if (!fDataTree){
+  TTree *treeSingle(NULL), *treeCorrel(NULL);
+  Double_t singleTrackOut[100][10], correlTrackOut[100][10];
+//  if (!fgData){
     TDirectory *cwd = gDirectory;
-    fDataTree = new TTreeSRedirector(Form("/tmp/TRD.TrackListMacroData_%s.root", gSystem->Getenv("USER")));
+    fgData = TFile::Open(Form("/tmp/TRD.TrackListMacroData_%s.root", gSystem->Getenv("USER")), "RECREATE");
+    treeSingle = new TTree("sTrack", "Data from single track processing");
+    treeCorrel = new TTree("cTrack", "Data from correlated track processing");
     cwd->cd();
-  }
-  if (!fDataTree){
+/*  } else {
+    TDirectory *cwd = gDirectory;
+    fgData = TFile::Open(Form("/tmp/TRD.TrackListMacroData_%s.root", gSystem->Getenv("USER")), "APPEND");
+    treeSingle = (TTree*)fgData->Get("sTrack");
+    treeCorrel = (TTree*)fgData->Get("cTrack");
+    cwd->cd();
+  }*/
+  if (!treeSingle || !treeCorrel){
     Error("Apply process macros", "File \"/tmp/TRD.TrackListMacroData_%s.root\" could not be accessed properly!", gSystem->Getenv("USER"));
     return kFALSE;
   }
@@ -349,6 +355,7 @@ Bool_t AliEveTRDTrackList::ApplyProcessMacros(const TList* selIterator, const TL
 
   TMacroData* macro(NULL);
 
+  TString* procName = new TString[procIterator->GetEntries()];
   TString* procCmds = new TString[procIterator->GetEntries()];
   AliEveTRDTrackListMacroType* mProcType = new AliEveTRDTrackListMacroType[procIterator->GetEntries()];
 
@@ -390,16 +397,15 @@ Bool_t AliEveTRDTrackList::ApplyProcessMacros(const TList* selIterator, const TL
       numHistoMacros++;
       // Create the command 
       procCmds[i] = macro->GetCmd();
+      procName[i] = macro->GetName();
 
       // Add to "data-from-list" -> Mark as a histo macro with the substring "(histo macro)"
-      fDataFromMacroList->Add(new TObjString(Form("%s (histo macro)", macro->GetName())));
+      //fDataFromMacroList->Add(new TObjString(Form("%s (histo macro)", macro->GetName())));
     } else if (macroType == kSingleTrackAnalyse || macroType == kCorrelTrackAnalyse) {
       mProcType[i] = macroType;
       // Create the command 
       procCmds[i] = macro->GetCmd();
-
-      // Add to "data-from-list"
-      fDataFromMacroList->Add(new TObjString(macro->GetName()));
+      procName[i] = macro->GetName();
     } else {
       Error("Apply process macros", 
         "Macro list corrupted: Macro \"%s/%s.C\" is not registered as a process macro!",
@@ -413,9 +419,7 @@ Bool_t AliEveTRDTrackList::ApplyProcessMacros(const TList* selIterator, const TL
     macro = (TMacroData*)fMacroList->GetValue(selIterator->At(i)->GetTitle());
 
     if (!macro){
-      Error("Apply process macros", 
-        "Macro list is corrupted: Macro \"%s\" is not registered!",
-        selIterator->At(i)->GetTitle());
+      AliError(Form("Macro list is corrupted: Macro \"%s\" is not registered!", selIterator->At(i)->GetTitle()));
       continue;
     }
 
@@ -468,9 +472,14 @@ Bool_t AliEveTRDTrackList::ApplyProcessMacros(const TList* selIterator, const TL
     for (Int_t i = 0, histoIndex = 0; i < procIterator->GetEntries(); i++){
       // Single track histo
       if (mProcType[i] == kSingleTrackHisto){
-        if(histos) histos[histoIndex++] = (TH1*)gROOT->ProcessLineSync(procCmds[i]);
-        // Correlated tracks histo
-      } else if (mProcType[i] == kCorrelTrackHisto) {
+        if(!histos) continue;
+        histos[histoIndex] = (TH1*)gROOT->ProcessLineSync(procCmds[i]);
+        if(!fDataFromMacroList->FindObject(histos[histoIndex]->GetName())) {
+          AliInfo(Form("Registering histo[%s] for cmd[%s]", histos[histoIndex]->GetName(), procName[i].Data()));
+          fDataFromMacroList->Add(new TObjString(histos[histoIndex]->GetName()));
+        }
+        histoIndex++;
+      } else if (mProcType[i] == kCorrelTrackHisto) {                              // CORRELATED TRACKS HISTO
         // Loop over all pairs behind the current one - together with the other loop this will be a loop
         // over all pairs. We have a pair of tracks, if and only if both tracks of the pair are selected (Rnr-state)
         // and are not equal.
@@ -478,8 +487,7 @@ Bool_t AliEveTRDTrackList::ApplyProcessMacros(const TList* selIterator, const TL
         // all correlated tracks selection macros.
         TEveElement::List_i iter2 = iter;
         iter2++;
-        for ( ; iter2 != this->EndChildren(); ++iter2)
-        {
+        for ( ; iter2 != this->EndChildren(); ++iter2){
           if(!(track2 = dynamic_cast<AliEveTRDTrack*>(*iter2))) continue;
 
           // Skip tracks that have not been selected
@@ -502,31 +510,34 @@ Bool_t AliEveTRDTrackList::ApplyProcessMacros(const TList* selIterator, const TL
           if (!selectedByCorrSelMacro) continue;
           
           if(histos) histos[histoIndex] = (TH1*)gROOT->ProcessLineSync(procCmds[i]);
-        }
+        } // End loop correl tracks
         histoIndex++;
-      }
-      // Single track analyse
-      else if (mProcType[i] == kSingleTrackAnalyse) {
+      } else if (mProcType[i] == kSingleTrackAnalyse) {                         // SINGLE TRACK ANALYSE
         // Create data pointers in CINT, execute the macro and get the data
-        gROOT->ProcessLineSync("Double_t* results = 0;");
+        gROOT->ProcessLineSync("Double_t results[10] = {0}, *presults=&results[0];");
         gROOT->ProcessLineSync("Int_t n = 0;");
         gROOT->ProcessLineSync(procCmds[i]);
-        Double_t* results = (Double_t*)gROOT->ProcessLineSync("results;");
         Int_t nResults = (Int_t)gROOT->ProcessLineSync("n;");
-        
-        if (results == 0) {
-          Error("Apply macros", "Error reading data from macro \"%s\"", procIterator->At(i)->GetTitle());
+        if (!nResults) {
+          AliError(Form("Error reading data from macro \"%s\"", procName[i].Data()));
           continue;
         }
-        for (Int_t resInd = 0; resInd < nResults; resInd++){
-          (*fDataTree) << Form("TrackData%d", i) << Form("Macro%d=", i) << results[resInd] << (Char_t*)"\n";   
+        if(nResults>10){
+          AliWarning(Form("Macro \"%s\" returns %d values. Limit set to 10.", procName[i].Data(), nResults));
+          nResults=10;
         }
-
-        delete results;
-        results = 0;
-      }
-      // Correlated tracks analyse
-      else if (mProcType[i] == kCorrelTrackAnalyse){
+        TBranch *b(treeSingle->GetBranch(procName[i].Data()));
+        if(!b) {
+          AliInfo(Form("Building branch[%s]", procName[i].Data()));
+          b = treeSingle->Branch(procName[i].Data(), singleTrackOut[i], Form("%s[%d]/D", procName[i].Data(), nResults));
+          // Add to "data-from-list"
+          for(Int_t ir(0); ir<nResults; ir++) fDataFromMacroList->Add(new TObjString(Form("%s[%d]", procName[i].Data(), ir)));
+        }
+        for (Int_t resInd = 0; resInd < nResults; resInd++, gROOT->ProcessLineSync("presults++;")){
+          Double_t *pres = (Double_t*)gROOT->ProcessLineSync("presults;");
+          singleTrackOut[i][resInd] = *pres;
+        }
+      } else if (mProcType[i] == kCorrelTrackAnalyse){                         // CORRELATED TRACKS ANALYSE
         // Loop over all pairs behind the current one - together with the other loop this will be a loop
         // over all pairs. We have a pair of tracks, if and only if both tracks of the pair are selected (Rnr-state)
         // and are not equal.
@@ -558,52 +569,56 @@ Bool_t AliEveTRDTrackList::ApplyProcessMacros(const TList* selIterator, const TL
           if (!selectedByCorrSelMacro) continue;
           
           // Create data pointers in CINT, execute the macro and get the data
-          gROOT->ProcessLineSync("Double_t* results = 0;");
+          gROOT->ProcessLineSync("Double_t results[10] = {0}, *presults=&results[0];");
           gROOT->ProcessLineSync("Int_t n = 0;");
           gROOT->ProcessLineSync(procCmds[i]);
-          Double_t* results = (Double_t*)gROOT->ProcessLineSync("results;");
           Int_t nResults = (Int_t)gROOT->ProcessLineSync("n;");
-     
-          if (results == 0) {
-            Error("Apply macros", "Error reading data from macro \"%s\"", procIterator->At(i)->GetTitle());
+          if (!nResults) {
+            AliError(Form("Error reading data from macro \"%s\"", procName[i].Data()));
             continue;
           }
-          for (Int_t resInd = 0; resInd < nResults; resInd++) {
-            (*fDataTree) << Form("TrackData%d", i) << Form("Macro%d=", i) << results[resInd] << (Char_t*)"\n";   
+          if(nResults>10){
+            AliWarning(Form("Macro \"%s\" returns %d values. Limit set to 10.", procName[i].Data(), nResults));
+            nResults=10;
           }
-
-          delete results;
-          results = 0;
-        }
-      }
-    }
-  }    
-
+          TBranch *b(treeCorrel->GetBranch(procName[i].Data()));
+          if(!b) {
+            AliInfo(Form("Building branch[%s]", procName[i].Data()));
+            b = treeCorrel->Branch(procName[i].Data(), correlTrackOut[i], Form("%s[%d]/D", procName[i].Data(), nResults));
+            // Add to "data-from-list"
+            for(Int_t ir(0); ir<nResults; ir++) fDataFromMacroList->Add(new TObjString(Form("%s[%d]", procName[i].Data(), ir)));
+          }
+          for (Int_t resInd = 0; resInd < nResults; resInd++, gROOT->ProcessLineSync("presults++;")){
+            Double_t *pres = (Double_t*)gROOT->ProcessLineSync("presults;");
+            correlTrackOut[i][resInd] = *pres;
+          }
+          b->Fill();
+        } // End loop correl tracks
+      } // End if correl macros
+    } // End loop all macro
+    treeSingle->Fill();
+    treeCorrel->Fill();
+  } // End loop single tracks
+
+  fgData->cd();
   for (Int_t i = 0, histoIndex = 0; i < procIterator->GetEntries() && histoIndex < numHistoMacros; i++) {
-    if (mProcType[i] == kSingleTrackHisto || mProcType[i] == kCorrelTrackHisto) {
-      // Might be empty (e.g. no tracks have been selected)!
-      if (histos[histoIndex]) {
-        (*fDataTree) << Form("TrackData%d", i) << Form("Macro%d=", i) << histos[histoIndex] << (Char_t*)"\n";
-      }
-      histoIndex++;
-    }
+    if (mProcType[i] != kSingleTrackHisto && mProcType[i] != kCorrelTrackHisto) continue;
+    // Might be empty (e.g. no tracks have been selected)!
+    if(histos[histoIndex]) histos[histoIndex]->Write();
+    histoIndex++;
   }
+  treeSingle->Write();
+  treeCorrel->Write();
+  fgData->Close();
 
-  if (fDataTree) delete fDataTree;
-  fDataTree = NULL;
-
-  if (procCmds)  delete [] procCmds;
-  procCmds = NULL;
-  if (mProcType)  delete [] mProcType;
-  mProcType = NULL;
+  if (procName)  delete [] procName; procName = NULL;
+  if (procCmds)  delete [] procCmds; procCmds = NULL;
+  if (mProcType)  delete [] mProcType; mProcType = NULL;
 
-  if (selCmds)  delete [] selCmds;
-  selCmds = NULL;
-  if (mSelType)  delete [] mSelType;
-  mSelType = NULL;
+  if (selCmds)  delete [] selCmds; selCmds = NULL;
+  if (mSelType)  delete [] mSelType; mSelType = NULL;
 
-  if (histos)  delete [] histos;
-  histos = NULL;
+  if (histos)  delete [] histos; histos = NULL;
 
   // Clear root
   // A.B. gROOT->Reset();
@@ -705,10 +720,10 @@ AliEveTRDTrackList::AliEveTRDTrackListMacroType AliEveTRDTrackList::GetMacroType
   if (!UseList){
     // Single track select macro or single track histo macro?
     TFunction* f = gROOT->GetGlobalFunctionWithPrototype(name, "const AliTRDtrackV1*", kTRUE);
-    if (f != 0x0)
+    if (f != NULL)
     {
       // Some additional check (is the parameter EXACTLY of the desired type?)
-      if (strstr(f->GetMangledName(), "oPconstsPAliTRDtrackV1mUsP") != 0x0)
+      if (strstr(f->GetMangledName(), "oPconstsPAliTRDtrackV1mUsP") != NULL)
       {
         // Single track select macro?
         if (!strcmp(f->GetReturnTypeName(), "Bool_t")) 
@@ -723,15 +738,15 @@ AliEveTRDTrackList::AliEveTRDTrackListMacroType AliEveTRDTrackList::GetMacroType
       }
     }
     // Single track analyse macro?
-    else if ((f = gROOT->GetGlobalFunctionWithPrototype(name, "const AliTRDtrackV1*, Double_t*&, Int_t&", kTRUE)) 
-             != 0x0)
+    else if ((f = gROOT->GetGlobalFunctionWithPrototype(name, "const AliTRDtrackV1*, Double_t*, Int_t&", kTRUE))
+             != NULL)
     {
       if (!strcmp(f->GetReturnTypeName(), "void"))
       {
         // Some additional check (are the parameters EXACTLY of the desired type?)
-        if (strstr(f->GetMangledName(), "oPconstsPAliTRDtrackV1mUsP") != 0x0 &&
-            strstr(f->GetMangledName(), "cODouble_tmUaNsP") != 0x0 &&
-            strstr(f->GetMangledName(), "cOInt_taNsP") != 0x0)
+        if (strstr(f->GetMangledName(), "oPconstsPAliTRDtrackV1mUsP") != NULL &&
+            strstr(f->GetMangledName(), "cODouble_tmUsP") != NULL &&
+            strstr(f->GetMangledName(), "cOInt_taNsP") != NULL)
         {
           type = kSingleTrackAnalyse;
         }
@@ -739,11 +754,11 @@ AliEveTRDTrackList::AliEveTRDTrackListMacroType AliEveTRDTrackList::GetMacroType
     }    
     // Correlated tracks select macro or correlated tracks histo macro?
     else if ((f = gROOT->GetGlobalFunctionWithPrototype(name, "const AliTRDtrackV1*, const AliTRDtrackV1*", kTRUE)) 
-             != 0x0)
+             != NULL)
     {
       // Some additional check (is the parameter EXACTLY of the desired type?)
-      if (strstr(f->GetMangledName(), "oPconstsPAliTRDtrackV1mUsP") != 0x0 &&
-          strstr(f->GetMangledName(), "cOconstsPAliTRDtrackV1mUsP") != 0x0)
+      if (strstr(f->GetMangledName(), "oPconstsPAliTRDtrackV1mUsP") != NULL &&
+          strstr(f->GetMangledName(), "cOconstsPAliTRDtrackV1mUsP") != NULL)
       {
         // Correlated track select macro?
         if (!strcmp(f->GetReturnTypeName(), "Bool_t")) 
@@ -759,16 +774,16 @@ AliEveTRDTrackList::AliEveTRDTrackListMacroType AliEveTRDTrackList::GetMacroType
     }    
     // Correlated tracks analyse macro?
     else if ((f = gROOT->GetGlobalFunctionWithPrototype(name, 
-                              "const AliTRDtrackV1*, const AliTRDtrackV1*, Double_t*&, Int_t&", kTRUE)) 
-             != 0x0)
+                              "const AliTRDtrackV1*, const AliTRDtrackV1*, Double_t*, Int_t&", kTRUE))
+             != NULL)
     {
       if (!strcmp(f->GetReturnTypeName(), "void"))
       {
         // Some additional check (is the parameter EXACTLY of the desired type?)
-        if (strstr(f->GetMangledName(), "oPconstsPAliTRDtrackV1mUsP") != 0x0 &&
-            strstr(f->GetMangledName(), "cOconstsPAliTRDtrackV1mUsP") != 0x0 &&
-            strstr(f->GetMangledName(), "cODouble_tmUaNsP") != 0x0 &&
-            strstr(f->GetMangledName(), "cOInt_taNsP") != 0x0)
+        if (strstr(f->GetMangledName(), "oPconstsPAliTRDtrackV1mUsP") != NULL &&
+            strstr(f->GetMangledName(), "cOconstsPAliTRDtrackV1mUsP") != NULL &&
+            strstr(f->GetMangledName(), "cODouble_tmUsP") != NULL &&
+            strstr(f->GetMangledName(), "cOInt_taNsP") != NULL)
         {
           type = kCorrelTrackAnalyse;
         }
@@ -887,7 +902,7 @@ void AliEveTRDTrackList::UpdateTrackStyle(AliEveTRDTrack::AliEveTRDTrackState s,
 
 
   // Walk through the list of tracks     
-  AliEveTRDTrack* track = 0x0;
+  AliEveTRDTrack* track = NULL;
   for (TEveElement::List_i iter = this->BeginChildren(); iter != this->EndChildren(); ++iter) 
   {
     if (!(track = dynamic_cast<AliEveTRDTrack*>(*iter)))  continue;
index 7dacbd6..5cfe547 100644 (file)
@@ -84,7 +84,7 @@ class TObjString;
 class TList;
 class TMap;
 class TPair;
-class TTreeSRedirector;
+//class TTree;//SRedirector;
 
 class AliEveTRDTrackList: public TEveElementList
 {
@@ -143,7 +143,7 @@ protected:
 
   TMap*  fMacroList;                 // Stores the names, paths, types and commands of all macros added to this list
 
-  TTreeSRedirector *fDataTree;       // Tree containing data for histograms
+  static TFile *fgData;              //! File containing processed data
 
   Int_t fHistoDataSelected;          // Stores the selection for the data of the histograms
   Int_t fMacroListSelected;          // Stores the selection of the macro list
index 054d1d6..71680ab 100644 (file)
 // access the data.                                                     //
 //////////////////////////////////////////////////////////////////////////
 
+#include <AliLog.h>
 #include <EveDet/AliEveTRDData.h>
 #include <EveDet/AliEveTRDTrackList.h>
 #include "AliEveTRDTrackListEditor.h"
-
 #include <EveBase/AliEveEventManager.h>
 #include <AliTRDReconstructor.h>
 #include <AliTRDtrackV1.h>
+
 #include <TGButton.h>
 #include <TCanvas.h>     
 #include <TEveBrowser.h>
@@ -208,6 +209,7 @@ AliEveTRDTrackListEditor::AliEveTRDTrackListEditor(const TGWindow* p, Int_t widt
   fFileTypes[2] = (Char_t*)"ROOT macros"; fFileTypes[3] = (Char_t*)"*.C";
   fFileTypes[4] = 0; fFileTypes[5] = 0;
   fFileInfo->fFileTypes = (const Char_t**)fFileTypes;
+  fFileInfo->fIniDir = (Char_t*)"$ALICE_ROOT/PWGPP/TRD/macros/EVE";
   fFileInfo->fFileTypeIdx = 2;
   fFileInfo->fMultipleSelection = kTRUE;
 
@@ -413,218 +415,95 @@ void AliEveTRDTrackListEditor::DrawHistos()
   // Accesses the temporary data file created by the last call of ApplyMacros() and draws
   // histograms according to the selection in the "Histograms"-tab.
  
-  Int_t nHistograms = GetNSelectedHistograms();
-  if (nHistograms <= 0)
-  {
-    new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Error", 
-                 "No data selected. Please select the data you want to plot!", kMBIconExclamation, kMBOk);
+//   Int_t nHistograms = GetNSelectedHistograms();
+//   if (nHistograms<=0 || nHistograms>3) {
+//     new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Error", 
+//                  Form("Number of selected projections [%d] outside range [1-3]!", nHistograms), kMBIconExclamation, kMBOk);
+//     return;
+//   }
+
+  TFile* file(NULL);
+  if (!(file=TFile::Open(Form("/tmp/TRD.TrackListMacroData_%s.root", gSystem->Getenv("USER")), "READ"))) {
+    AliError(Form("Cannot open file \"/tmp/TRD.TrackListMacroData_%s.root\"",
+                                  gSystem->Getenv("USER")));
+    new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Error - Draw histograms", 
+                 Form("Cannot open file \"/tmp/TRD.TrackListMacroData_%s.root\"", gSystem->Getenv("USER")),
+                 kMBIconExclamation, kMBOk);
     return;
   }
-  if (nHistograms > 3)
-  {
-    new TGMsgBox(gClient->GetRoot(), GetMainFrame(), 
-                 "Error", "Only histograms with up to 3 dimensions supported. Please select 1,2 or 3 data macros!",
+  TTree *ts(NULL), *tc(NULL);
+  if (!(ts=(TTree*)file->Get("sTrack"))) {
+    AliError(Form("Cannot find tree \"sTrack\" in file \"/tmp/TRD.TrackListMacroData_%s.root\"",
+                                  gSystem->Getenv("USER")));
+    new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Error - Draw histograms",
+                 Form("Cannot find tree \"sTrack\" in file \"/tmp/TRD.TrackListMacroData_%s.root\"", gSystem->Getenv("USER")),
                  kMBIconExclamation, kMBOk);
     return;
   }
-
-  // Check, if a histo macro shall be drawn
-  Int_t indexOfHistoMacro = -1;
-  Int_t selectedChecked = 0;
-  for (Int_t j = 0; j < fM->fDataFromMacroList->GetEntries(); j++)
-  {
-    if (fCheckButtons[j]->TGButton::GetState() == kButtonDown)
-    {
-      selectedChecked++;
-
-      // Histo macro? -> To check this, look for the substring "(histo macro)"
-      if (strstr(fM->fDataFromMacroList->At(j)->GetName(), "(histo macro)") != 0)
-      {
-        // Is also another macro selected?
-        if (nHistograms > 1)
-        {
-          // Histo macros cannot(!) be correlated!
-          new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Error - Draw histograms", 
-                       "Histo macros (return value \"TH1*\") cannot be combined with other macros", 
-                       kMBIconExclamation, kMBOk);
-          return;        
-        }
-
-        // Mark this histo macro for drawing
-        indexOfHistoMacro = j;
-
-        // Have all selected macros been checked? -> If yes, we are done with this
-        if (selectedChecked == nHistograms)  break;
-      }
-    }
-  }
-
-  TFile* file = new TFile(Form("/tmp/TRD.TrackListMacroData_%s.root", gSystem->Getenv("USER")), "READ");
-  if (!file)  
-  {
-    Error("Draw histograms", "Cannot open file \"/tmp/TRD.TrackListMacroData_%s.root\"",
-                                  gSystem->Getenv("USER"));
-    new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Error - Draw histograms", 
-                 Form("Cannot open file \"/tmp/TRD.TrackListMacroData_%s.root\"", gSystem->Getenv("USER")),
+  if (!(tc=(TTree*)file->Get("cTrack"))) {
+    AliError(Form("Cannot find tree \"cTrack\" in file \"/tmp/TRD.TrackListMacroData_%s.root\"",
+                                  gSystem->Getenv("USER")));
+    new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Error - Draw histograms",
+                 Form("Cannot find tree \"cTrack\" in file \"/tmp/TRD.TrackListMacroData_%s.root\"", gSystem->Getenv("USER")),
                  kMBIconExclamation, kMBOk);
     return;
   }
-  
-  TTree* t = 0;
-  TTree* tFriend1 = 0;
-  TTree* tFriend2 = 0;
-
-  Int_t indexOfMacro1 = 0;
-  Int_t indexOfMacro2 = 0;
-  Int_t indexOfMacro3 = 0;
-
-  // Variable for the loop below -> Will be set to aborting value, if a histo macro is drawn
-  Int_t i = 0;
-  
-  // Draw histo macro?
-  if (indexOfHistoMacro >= 0)
-  {
-    if ((t = (TTree*)file->Get(Form("TrackData%d", indexOfHistoMacro))))
-    {
-      SetDrawingToHistoCanvasTab();
-      TH1* myHist = 0;
-      t->SetBranchAddress(Form("Macro%d", indexOfHistoMacro), &myHist);
-      t->GetEntry(0);
-      if (myHist != 0)  myHist->Draw();
-      else
-      {
-        Error("Draw histograms", "No histogram for histo macro \"%s\" found!",
-                                      fM->fDataFromMacroList->At(indexOfHistoMacro)->GetName());
-        new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Error - Draw histograms", 
-                     Form("No histogram for histo macro \"%s\" found!", 
-                          fM->fDataFromMacroList->At(indexOfHistoMacro)->GetName()), kMBIconExclamation, kMBOk);
-               
-      }
 
-      UpdateHistoCanvasTab();    
-    }
-    else
-    {
-      Error("Draw histograms", "No data for histo macro \"%s\" found!\nMaybe no tracks have been selected.",
-                                    fM->fDataFromMacroList->At(indexOfHistoMacro)->GetName());
-      new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Error - Draw histograms", 
-                   Form("No data for histo macro \"%s\" found!\nMaybe no tracks have been selected.", 
-                        fM->fDataFromMacroList->At(indexOfHistoMacro)->GetName()), kMBIconExclamation, kMBOk);
-    }
-
-    // Skip the loop below
-    i = fM->fDataFromMacroList->GetEntries();
+  // Close any potential tab left from previous plottings
+  TGTab *tab(gEve->GetBrowser()->GetTab(1)); TGTabElement *tt(NULL);
+  TString vs; Int_t canvas(0), singleSelected(0);
+  while((tt=tab->GetTabTab(1))){
+    AliDebug(1, Form("Deleting tab[%s]", tt->GetString()));
+    tab->CloseTab(1); // trick. always close second tab due to internal renumbering inside TGTab
   }
-
-  // Load the trees in succession and remember the entries -> Plot the analyse macros
-  for ( ; i < fM->fDataFromMacroList->GetEntries(); i++)
-  {
-    if (fCheckButtons[i]->TGButton::GetState() == kButtonDown)
-    {
-      if (t == 0)
-      {
-        indexOfMacro1 = i;
-        if (!(t = (TTree*)file->Get(Form("TrackData%d", i))))
-        { 
-          Error("Draw histograms", "No data for macro \"%s\" found!\nMaybe no tracks have been selected.",
-                                        fM->fDataFromMacroList->At(i)->GetName());
-          new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Error - Draw histograms", 
-                       Form("No data for macro \"%s\" found!\nMaybe no tracks have been selected.", 
-                            fM->fDataFromMacroList->At(i)->GetName()), kMBIconExclamation, kMBOk);
-          break;   
-        }
-
-        // 1d histogram
-        if (nHistograms == 1) 
-        {
-          SetDrawingToHistoCanvasTab();
-      
-          t->Draw(Form("Macro%d", indexOfMacro1), "1");
-          ((TH1*)gPad->GetPrimitive("htemp"))->SetTitle(Form("%s;%s",
-            fM->fDataFromMacroList->At(indexOfMacro1)->GetName(),
-            fM->fDataFromMacroList->At(indexOfMacro1)->GetName()));
-          UpdateHistoCanvasTab();        
-
-          break;     
-        }
+  // Check, if a histo macro shall be drawn
+  canvas=0;
+  TH1* myHist(NULL); TBranch *b(NULL);
+  for (Int_t j = 0; j < fM->fDataFromMacroList->GetEntries(); j++) {
+    if (fCheckButtons[j]->TGButton::GetState() != kButtonDown) continue;
+    TString s(fCheckButtons[j]->GetTitle()); Int_t idx(s.Index('['));
+    // Histo macro
+    if(idx<0) {
+      if (!(myHist = (TH1*)file->Get(s.Data()))) {
+        AliError(Form("No histo[%s] found !", s.Data()));
+        new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Error - Draw histograms",
+                    Form("No histo[%s] found !", s.Data()), kMBIconExclamation, kMBOk);
+      } else {
+        SetDrawingToHistoCanvasTab(++canvas);
+        myHist->DrawCopy();
+        UpdateHistoCanvasTab(canvas);
       }
-      else if (tFriend1 == 0)
-      {
-        indexOfMacro2 = i;
-        if (!(tFriend1 = (TTree*)file->Get(Form("TrackData%d", i))))
-        { 
-          Error("Draw histograms", "No data for macro \"%s\" found!\nMaybe no tracks have been selected.",
-                                        fM->fDataFromMacroList->At(i)->GetName());
-          new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Error - Draw histograms", 
-                       Form("No data for macro \"%s\" found!\nMaybe no tracks have been selected.", 
-                            fM->fDataFromMacroList->At(i)->GetName()),
-                            kMBIconExclamation, kMBOk);
-          break;   
-        }
-        
-        // 2d histogram
-        if (nHistograms == 2) 
-        {
-          SetDrawingToHistoCanvasTab();
-
-          t->AddFriend(tFriend1);
-          t->Draw(Form("Macro%d:Macro%d", indexOfMacro1, indexOfMacro2), "1");
-          ((TH1*)gPad->GetPrimitive("htemp"))->SetTitle(Form("%s - %s;%s;%s",
-            fM->fDataFromMacroList->At(indexOfMacro2)->GetName(),
-            fM->fDataFromMacroList->At(indexOfMacro1)->GetName(),
-            fM->fDataFromMacroList->At(indexOfMacro2)->GetName(),
-            fM->fDataFromMacroList->At(indexOfMacro1)->GetName()));
-
-          UpdateHistoCanvasTab();
-          break;     
+    } else {
+      TString ss=s(0, idx);
+      if (!(b = ts->GetBranch(ss.Data()))) {
+        AliError(Form("No data for macro \"%s\" found !", ss.Data()));
+        new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Error - Draw tree",
+                    Form("No data for macro \"%s\" found !",
+                          ss.Data()), kMBIconExclamation, kMBOk);
+        continue;
+      } else {
+        if(!singleSelected){
+          vs=s;
+          singleSelected++;
+        } else if(singleSelected<3){
+          vs+=":";vs+=s;
+          singleSelected++;
+        } else {
+          AliError(Form("Variable \"%s\" can no longer be attached to plot !", s.Data()));
         }
-      }    
-      // 3d histogram
-      else
-      {
-        indexOfMacro3 = i;
-        if (!(tFriend2 = (TTree*)file->Get(Form("TrackData%d", i))))
-        { 
-          Error("Draw histograms", "No data for macro \"%s\" found!\nMaybe no tracks have been selected.",
-                                        fM->fDataFromMacroList->At(i)->GetName());
-          new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Error - Draw histograms", 
-                       Form("No data for macro \"%s\" found!\nMaybe no tracks have been selected.", 
-                            fM->fDataFromMacroList->At(i)->GetName()), kMBIconExclamation, kMBOk);
-          break;   
-        }
-
-        SetDrawingToHistoCanvasTab();
-
-        t->AddFriend(tFriend1);
-        t->AddFriend(tFriend2);
-        t->Draw(Form("Macro%d:Macro%d:Macro%d", indexOfMacro1, indexOfMacro2, indexOfMacro3), "1");
-        ((TH1*)gPad->GetPrimitive("htemp"))->SetTitle(Form("%s - %s - %s;%s;%s;%s",
-            fM->fDataFromMacroList->At(indexOfMacro3)->GetName(),
-            fM->fDataFromMacroList->At(indexOfMacro2)->GetName(),
-            fM->fDataFromMacroList->At(indexOfMacro1)->GetName(),
-            fM->fDataFromMacroList->At(indexOfMacro3)->GetName(),
-            fM->fDataFromMacroList->At(indexOfMacro2)->GetName(),
-            fM->fDataFromMacroList->At(indexOfMacro1)->GetName()));
-        
-        UpdateHistoCanvasTab();
-        break;     
       }
     }
   }
+  if(singleSelected){
+    SetDrawingToHistoCanvasTab(++canvas);
+    ts->Draw(vs.Data());
+    UpdateHistoCanvasTab(canvas);
+  }
 
-  if (t != 0) delete t;
-  t = 0;
-  if (tFriend1 != 0)  delete tFriend1;
-  tFriend1 = 0;
-  if (tFriend2 != 0)  delete tFriend2;
-  tFriend2 = 0;
 
   file->Close("R");
   delete file;
-  file = 0;
+  file = NULL;
 }
 
 //______________________________________________________
@@ -837,27 +716,18 @@ void AliEveTRDTrackListEditor::SaveMacroList(TMap* list)
 }
 
 //______________________________________________________
-void AliEveTRDTrackListEditor::SetDrawingToHistoCanvasTab()
+void AliEveTRDTrackListEditor::SetDrawingToHistoCanvasTab(Int_t canvas)
 {
   // Sets gPad to the tab with the name of the current AliEveTRDTrackList. If this tab does
   // not exist, it will be created. Otherwise, it is re-used.
 
   // If the tab with the canvas has been closed, the canvas will be deleted.
   // So, if there is no tab, set the canvas pointer to zero and recreate it in a new tab.
-  if (fHistoCanvas != 0) 
-  {
-    if (gEve->GetBrowser()->GetTab(1)->SetTab(fHistoCanvasName->GetString()) == 0)
-    {
-      fHistoCanvas = 0;
-    }
-  }
 
-  if (!fHistoCanvas)
-  {
-    fHistoCanvas = gEve->AddCanvasTab(fM->GetName());     
-  }
-                           
-  gPad = fHistoCanvas;
+  AliDebug(1, Form("Build Tab[%s_%d]", fM->GetName(), canvas));
+  fHistoCanvas = gEve->AddCanvasTab(Form("%s_%d", fM->GetName(), canvas));
+  fHistoCanvas->SetName(Form("c_%d", canvas));
+  fHistoCanvas->cd();
 }
 
 //______________________________________________________
@@ -971,20 +841,28 @@ void AliEveTRDTrackListEditor::UpdateDataFromMacroListSelection()
 }
 
 //______________________________________________________
-void AliEveTRDTrackListEditor::UpdateHistoCanvasTab()
+void AliEveTRDTrackListEditor::UpdateHistoCanvasTab(Int_t canvas)
 {
   // Updates the histogram and the corresponding tab (including titles).
 
   // Update name of the tab (tab has been set to current tab!)
-  fHistoCanvasName->SetString(fM->GetName());  
+  //fHistoCanvasName->SetString(Form("%s_%d", fM->GetName(), canvas));
 
   // Use a copy of fHistoCanvasName!! -> If the user closes a tab manually, the TGString
   // will be deleted -> Error might occur, when accessing the pointer   
-  gEve->GetBrowser()->GetTab(1)->GetCurrentTab()->SetText(new TGString(fHistoCanvasName));
+  //gEve->GetBrowser()->GetTab(canvas)->GetCurrentTab()->SetText(new TGString(fHistoCanvasName));
 
   // Switch tabs to force redrawing
-  gEve->GetBrowser()->GetTab(1)->SetTab(0);
-  gEve->GetBrowser()->GetTab(1)->SetTab(fHistoCanvasName->GetString());
+  TGTab *tab(gEve->GetBrowser()->GetTab(1));
+  if(tab->GetCurrent() != canvas){
+    AliError(Form("Curent tab[%s] tabId[%d] mismatch %d", tab->GetCurrentTab()->GetString(), tab->GetCurrent(), canvas));
+    return;
+  }
+  if(!tab->SetTab(canvas)){
+    AliError(Form("Failed updating tab[%d]", canvas));
+    return;
+  }
+  fHistoCanvas->Modified();
   fHistoCanvas->Update();
 }
 
index d9d4c57..0ee98c5 100644 (file)
@@ -144,8 +144,8 @@ private:
   TGCheckButton** fCheckButtons;            // Check buttons for histograms
 
   // Help functions
-  void SetDrawingToHistoCanvasTab();        
-  void UpdateHistoCanvasTab();              
+  void SetDrawingToHistoCanvasTab(Int_t canvas=1);        
+  void UpdateHistoCanvasTab(Int_t canvas=1);              
 
   ClassDef(AliEveTRDTrackListEditor, 0);    // Editor for AliEveTRDTrackList.
 };