]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
integration of TRD QA plugins into the TRD visualization
authorabercuci <abercuci@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 28 Oct 2008 15:37:24 +0000 (15:37 +0000)
committerabercuci <abercuci@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 28 Oct 2008 15:37:24 +0000 (15:37 +0000)
EVE/EveDet/AliEveTRDTrackList.cxx
EVE/EveDet/AliEveTRDTrackList.h
EVE/EveDet/AliEveTRDTrackListEditor.cxx
EVE/EveDet/AliEveTRDTrackListEditor.h
EVE/EveDet/EveDetLinkDef.h
EVE/alice-macros/trd_tracks.C [new file with mode: 0644]

index 8beeb3a88b8364b9927f49c234e6e8bebe700e9a..3b4fbb74748a33dafa714c3ad6ad9ae29b244609 100644 (file)
 // Uncomment to display debugging infos
 //#define ALIEVETRDTRACKLIST_DEBUG
 
-#include "AliEveTRDTrackList.h"
-
-#include <EveDet/AliEveTRDTrackListEditor.h>
-#include <AliTRDReconstructor.h>
 #include <TFile.h>
 #include <TFunction.h>
 #include <TH1.h>
 #include <TSystem.h>
 #include <TTree.h>
 #include <TTreeStream.h>
+#include <TMethodCall.h>
+
+#include <AliTRDReconstructor.h>
+
+#include <EveDet/AliEveTRDTrackList.h>
+#include <EveDet/AliEveTRDTrackList.h>
+#include <EveDet/AliEveTRDTrackListEditor.h>
+
+#include <qaRec/AliTRDrecoTask.h>
+#include <qaRec/run.h>
 
 ClassImp(AliEveTRDTrackList)
 
@@ -107,7 +113,7 @@ AliEveTRDTrackList::AliEveTRDTrackList(const Text_t* n, const Text_t* t, Bool_t
   if(gSystem->AccessPathName(Form("%s/.trdQArec" , gSystem->Getenv("HOME")))) gSystem->Exec("mkdir $HOME/.trdQArec");
   gSystem->SetBuildDir(Form("%s/.trdQArec", gSystem->Getenv("HOME")));
 
-  AddStandardMacros();
+  AddStandardContent();
 }
 
 //______________________________________________________
@@ -178,39 +184,30 @@ 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 = 0;
-
-  fp = fopen(pathname, "rb");
-  if (fp != 0)
-  {
+  FILE* fp = 0x0;
+  if((fp = fopen(pathname, "rb"))){
     fclose(fp);
-    fp = 0;
-  }
-  else  return NOT_EXIST_ERROR;
+    fp = 0x0;
+  } else  return NOT_EXIST_ERROR;
   
   // Clean up root, load the desired macro and then check the type of the macro
-  gROOT->Reset();
+  // A.B. gROOT->Reset();
  
-  if (forceReload)  gROOT->ProcessLineSync(Form(".L %s++", pathname));
-  else              gROOT->ProcessLineSync(Form(".L %s+", pathname));
+  gROOT->ProcessLineSync(Form(".L %s+%c", pathname, forceReload ? '+' : ' '));
 
   AliEveTRDTrackListMacroType type = GetMacroType(name, kFALSE);
 
   // Clean up again
-  gROOT->Reset();
+  // A.B. gROOT->Reset();
   
   // Has not the correct signature!
   if (type == kUnknown)  return SIGNATURE_ERROR;
 
-  Int_t returnValue = WARNING;
-
   // Only add macro, if it is not already in the list
-  if (fMacroList->GetValue(name) == 0)
-  {
-    if (AddMacroFast(path, name, type)) returnValue = SUCCESS;
-    else                                returnValue = WARNING;
+  Int_t returnValue = WARNING;
+  if(fMacroList->GetValue(name) == 0) {
+    returnValue = AddMacroFast(path, name, type) ? SUCCESS : ERROR;
   }
-
   return returnValue;
 }
 
@@ -260,7 +257,7 @@ Bool_t AliEveTRDTrackList::AddMacroFast(const Char_t* path, const Char_t* name,
 }
 
 //______________________________________________________
-void AliEveTRDTrackList::AddStandardMacros()
+void AliEveTRDTrackList::AddStandardContent()
 {
   // Adds standard macros to the macro list.
 
@@ -270,10 +267,32 @@ void AliEveTRDTrackList::AddStandardMacros()
   // -> If the file does not exist, nothing happens. So if you want to handle this,
   // use the return value of AddMacro (NOT_EXIST_ERROR is returned, if file does not exist)
   // (-> You can also check for other return values (see AddMacro(...)))
-  AddMacro("$(ALICE_ROOT)/TRD/qaRec/macros", "clusterSelection.C");
-  AddMacro("$(ALICE_ROOT)/TRD/qaRec/macros", "chargeDistr.C");
-  AddMacro("$(ALICE_ROOT)/TRD/qaRec/macros", "clusterResiduals.C");
-  AddMacro("$(ALICE_ROOT)/TRD/qaRec/macros", "PH.C");
+
+  if(gSystem->Load("libANALYSIS.so")<0) return;
+  if(gSystem->Load("libTRDqaRec.so")<0) return;
+  AliTRDrecoTask *task = 0x0;
+  TList *fPlots = 0x0;
+  for(Int_t it=0; it<NTRDTASKS; it++){
+    TClass c(fgkTRDtaskClassName[it]);
+    task = (AliTRDrecoTask*)c.New();
+    if(!(fPlots = task->GetPlotFunctors())){
+      AliWarning(Form("No Plot functors defined for task \"%s\"", fgkTRDtaskClassName[it]));
+      delete task;
+      continue;
+    }
+    if(!(task->Histos())){
+      AliWarning(Form("No Ref Histograms defined for task \"%s\"", fgkTRDtaskClassName[it]));
+      delete task;
+      continue;
+    }
+
+    // export task to CINT and add functions
+    gROOT->ProcessLine(Form("%s* %s = (%s*)0x%lx;", fgkTRDtaskClassName[it], task->GetName(), fgkTRDtaskClassName[it], (void*)task));
+    TIter iter(fPlots); TMethodCall *m = 0x0;
+    while((m = dynamic_cast<TMethodCall*>(iter()))){
+      AddMacroFast("", Form("%s->%s", task->GetName(), m->GetMethodName()), kSingleTrackHisto);
+    }
+  }
 }
 
 //______________________________________________________
@@ -292,20 +311,20 @@ Bool_t AliEveTRDTrackList::ApplyProcessMacros(const TList* selIterator, const TL
   if (procIterator->GetEntries() <= 0)  return kTRUE;
 
   // Clear root
-  gROOT->Reset();
+  // A.B. gROOT->Reset();
   
   // Clear old data and re-allocate
-  if (fDataTree == 0) fDataTree = new TTreeSRedirector(Form("/tmp/TRD.TrackListMacroData_%s.root", 
-                                                            gSystem->Getenv("USER")));
-  if (!fDataTree)
-  {
-    Error("Apply process macros", Form("File \"/tmp/TRD.TrackListMacroData_%s.root\" could not be accessed properly!", 
-                                       gSystem->Getenv("USER")));
+  if (fDataTree == 0x0){ 
+    TDirectory *cwd = gDirectory;
+    fDataTree = new TTreeSRedirector(Form("/tmp/TRD.TrackListMacroData_%s.root", gSystem->Getenv("USER")));
+    cwd->cd();
+  }
+  if (!fDataTree){
+    Error("Apply process macros", Form("File \"/tmp/TRD.TrackListMacroData_%s.root\" could not be accessed properly!", gSystem->Getenv("USER")));
     return kFALSE;
   }
   
-  if (fDataFromMacroList != 0)
-  {
+  if (fDataFromMacroList != 0) {
     fDataFromMacroList->Delete();
     delete fDataFromMacroList;
   }
@@ -319,16 +338,14 @@ Bool_t AliEveTRDTrackList::ApplyProcessMacros(const TList* selIterator, const TL
 
   Char_t** procCmds = 0;
   AliEveTRDTrackListMacroType* mProcType = 0;
-  if (procIterator->GetEntries() > 0) 
-  {
+  if (procIterator->GetEntries() > 0) {
     procCmds = new Char_t*[procIterator->GetEntries()];
     mProcType = new AliEveTRDTrackListMacroType[procIterator->GetEntries()];
   }
 
   Char_t** selCmds  = 0;
   AliEveTRDTrackListMacroType* mSelType = 0;
-  if (selIterator->GetEntries() > 0) 
-  {
+  if (selIterator->GetEntries() > 0) {
     selCmds = new Char_t*[selIterator->GetEntries()];
     mSelType = new AliEveTRDTrackListMacroType[selIterator->GetEntries()];
   }
@@ -341,20 +358,18 @@ Bool_t AliEveTRDTrackList::ApplyProcessMacros(const TList* selIterator, const TL
 
   AliEveTRDTrack* track1 = 0;
   AliEveTRDTrack* track2 = 0;
-  TH1* returnedHist = 0x0;
 
   // Collect the commands for each process macro and add them to "data-from-list"
-  for (Int_t i = 0; i < procIterator->GetEntries(); i++)
-  {
+  for (Int_t i = 0; i < procIterator->GetEntries(); i++){
     procCmds[i] = new Char_t[(fkMaxMacroPathNameLength + fkMaxApplyCommandLength)];
     memset(procCmds[i], '\0', sizeof(Char_t) * (fkMaxMacroNameLength + fkMaxApplyCommandLength));
 
     macro = (TMacroData*)fMacroList->GetValue(procIterator->At(i)->GetTitle());
 
-    if (!macro)
-    {
+    if (!macro){
       Error("Apply process macros", 
-            Form("Macro list is corrupted: Macro \"%s\" is not registered!", procIterator->At(i)->GetTitle()));
+        Form("Macro list is corrupted: Macro \"%s\" is not registered!", 
+        procIterator->At(i)->GetTitle()));
       continue;
     }
 
@@ -364,8 +379,7 @@ Bool_t AliEveTRDTrackList::ApplyProcessMacros(const TList* selIterator, const TL
            
     // Find the type of the process macro
     macroType = macro->GetType();
-    if (macroType == kSingleTrackHisto || macroType == kCorrelTrackHisto)
-    {
+    if (macroType == kSingleTrackHisto || macroType == kCorrelTrackHisto){
       mProcType[i] = macroType;
       numHistoMacros++;
       // Create the command 
@@ -373,37 +387,32 @@ Bool_t AliEveTRDTrackList::ApplyProcessMacros(const TList* selIterator, const TL
 
       // 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())));
-    }
-    else if (macroType == kSingleTrackAnalyse || macroType == kCorrelTrackAnalyse)
-    {
+    } else if (macroType == kSingleTrackAnalyse || macroType == kCorrelTrackAnalyse) {
       mProcType[i] = macroType;
       // Create the command 
       sprintf(procCmds[i], macro->GetCmd());
 
       // Add to "data-from-list"
       fDataFromMacroList->Add(new TObjString(macro->GetName()));
-    }
-    else
-    {
+    } else {
       Error("Apply process macros", 
-            Form("Macro list corrupted: Macro \"%s/%s.C\" is not registered as a process macro!", 
-                 macro->GetPath(), macro->GetName()));
+        Form("Macro list corrupted: Macro \"%s/%s.C\" is not registered as a process macro!", 
+        macro->GetPath(), macro->GetName()));
       mProcType[i] = kUnknown;
     } 
   }  
 
   // Collect the commands for each selection macro and add them to "data-from-list"
-  for (Int_t i = 0; i < selIterator->GetEntries(); i++)
-  {
+  for (Int_t i = 0; i < selIterator->GetEntries(); i++){
     selCmds[i] = new Char_t[(fkMaxMacroPathNameLength + fkMaxApplyCommandLength)];
     memset(selCmds[i], '\0', sizeof(Char_t) * (fkMaxMacroNameLength + fkMaxApplyCommandLength));
 
     macro = (TMacroData*)fMacroList->GetValue(selIterator->At(i)->GetTitle());
 
-    if (!macro)
-    {
+    if (!macro){
       Error("Apply process macros", 
-            Form("Macro list is corrupted: Macro \"%s\" is not registered!", selIterator->At(i)->GetTitle()));
+        Form("Macro list is corrupted: Macro \"%s\" is not registered!", 
+        selIterator->At(i)->GetTitle()));
       continue;
     }
 
@@ -415,68 +424,49 @@ Bool_t AliEveTRDTrackList::ApplyProcessMacros(const TList* selIterator, const TL
     macroType = macro->GetType();
 
     // Single track select macro
-    if (macroType == kSingleTrackSelect)
-    {
+    if (macroType == kSingleTrackSelect) {
       // Has already been processed by ApplySTSelectionMacros(...)
       mSelType[i] = macroType;         
     }
     // Correlated tracks select macro
-    else if (macroType == kCorrelTrackSelect)
-    {
+    else if (macroType == kCorrelTrackSelect) {
       mSelType[i] = macroType;  
  
       // Create the command
       sprintf(selCmds[i], macro->GetCmd());
-    }
-    else
-    {
+    } else {
       Error("Apply process macros", 
-            Form("Macro list corrupted: Macro \"%s/%s.C\" is not registered as a selection macro!", 
-                 macro->GetPath(), macro->GetName()));
+        Form("Macro list corrupted: Macro \"%s/%s.C\" is not registered as a selection macro!", 
+        macro->GetPath(), macro->GetName()));
       mSelType[i] = kUnknown;
     } 
   }  
 
   // Allocate memory for the histograms
   if (numHistoMacros > 0)  histos = new TH1*[numHistoMacros];
-  for (Int_t i = 0; i < numHistoMacros; i++)  histos[i] = 0;
+  for (Int_t i = 0; i < numHistoMacros; i++)  histos[i] = 0x0;
 
-  // Walk through the list of tracks     
-  for (TEveElement::List_i iter = this->BeginChildren(); iter != this->EndChildren(); ++iter)
-  {
-    track1 = dynamic_cast<AliEveTRDTrack*>(*iter);
 
-    if (!track1)  continue;
-  
+  //////////////////////////////////
+  // WALK THROUGH THE LIST OF TRACKS
+  //////////////////////////////////     
+  for (TEveElement::List_i iter = this->BeginChildren(); iter != this->EndChildren(); ++iter){
+    if(!(track1 = dynamic_cast<AliEveTRDTrack*>(*iter))) continue;
+
     // Skip tracks that have not been selected
     if (!track1->GetRnrState())  continue;
     
-    track1->ExportToCINT((Text_t*)"automaticTrack");
     // Cast to AliTRDtrackV1
+    gROOT->ProcessLineSync(Form("AliEveTRDTrack *automaticTrack = (AliEveTRDTrack*)0x%xl;", track1));
     gROOT->ProcessLineSync("AliTRDtrackV1* automaticTrackV1_1 = (AliTRDtrackV1*)automaticTrack->GetUserData();");
 
     // Collect data for each macro
-    for (Int_t i = 0, histoIndex = 0; i < procIterator->GetEntries(); i++)
-    {
+    for (Int_t i = 0, histoIndex = 0; i < procIterator->GetEntries(); i++){
       // Single track histo
-      if (mProcType[i] == kSingleTrackHisto)
-      {
-        returnedHist = (TH1*)gROOT->ProcessLineSync(procCmds[i]);
-        if (returnedHist != 0x0)
-        {
-          if (histos[histoIndex] == 0)  histos[histoIndex] = returnedHist;
-          else  
-          {
-            histos[histoIndex]->Add((const TH1*)returnedHist);
-            delete returnedHist;
-            returnedHist = 0;
-          }
-        }
-        histoIndex++;
-      }
-      // Correlated tracks histo
-      else if (mProcType[i] == kCorrelTrackHisto)
-      {
+      if (mProcType[i] == kSingleTrackHisto){
+        histos[histoIndex++] = (TH1*)gROOT->ProcessLineSync(procCmds[i]);
+       // Correlated tracks histo
+      } else if (mProcType[i] == kCorrelTrackHisto) {
         // 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.
@@ -486,23 +476,19 @@ Bool_t AliEveTRDTrackList::ApplyProcessMacros(const TList* selIterator, const TL
         iter2++;
         for ( ; iter2 != this->EndChildren(); ++iter2)
         {
-          track2 = dynamic_cast<AliEveTRDTrack*>(*iter2);
+          if(!(track2 = dynamic_cast<AliEveTRDTrack*>(*iter2))) continue;
 
-          if (!track2)  continue;
-    
           // Skip tracks that have not been selected
           if (!track2->GetRnrState())  continue;
       
-          track2->ExportToCINT((Text_t*)"automaticTrack");
           // Cast to AliTRDtrackV1
+          gROOT->ProcessLineSync(Form("AliEveTRDTrack *automaticTrack = (AliEveTRDTrack*)0x%xl;", track2));
           gROOT->ProcessLineSync("AliTRDtrackV1* automaticTrackV1_2 = (AliTRDtrackV1*)automaticTrack->GetUserData();");
 
           // Select track by default (so it will be processed, if there are no correlated tracks selection macros!)
           selectedByCorrSelMacro = kTRUE;
-          for (Int_t j = 0; j < selIterator->GetEntries(); j++)
-          {
-            if (mSelType[j] == kCorrelTrackSelect)
-            {
+          for (Int_t j = 0; j < selIterator->GetEntries(); j++){
+            if (mSelType[j] == kCorrelTrackSelect){
               selectedByCorrSelMacro = (Bool_t)gROOT->ProcessLineSync(selCmds[j]);
               if (!selectedByCorrSelMacro)  break;
             }
@@ -511,24 +497,12 @@ Bool_t AliEveTRDTrackList::ApplyProcessMacros(const TList* selIterator, const TL
           // If the pair has not been selected by the correlated tracks selection macros, skip it!
           if (!selectedByCorrSelMacro) continue;
           
-          returnedHist = (TH1*)gROOT->ProcessLineSync(procCmds[i]);
-          if (returnedHist != 0x0)
-          {
-            if (histos[histoIndex] == 0)  histos[histoIndex] = returnedHist;
-            else  
-            {
-              histos[histoIndex]->Add((const TH1*)returnedHist);
-
-              delete returnedHist;
-              returnedHist = 0;
-            }
-          }
+          histos[histoIndex] = (TH1*)gROOT->ProcessLineSync(procCmds[i]);
         }
         histoIndex++;
       }
       // Single track analyse
-      else if (mProcType[i] == kSingleTrackAnalyse)
-      {
+      else if (mProcType[i] == kSingleTrackAnalyse) {
         // Create data pointers in CINT, execute the macro and get the data
         gROOT->ProcessLineSync("Double_t* results = 0;");
         gROOT->ProcessLineSync("Int_t n = 0;");
@@ -536,13 +510,11 @@ Bool_t AliEveTRDTrackList::ApplyProcessMacros(const TList* selIterator, const TL
         Double_t* results = (Double_t*)gROOT->ProcessLineSync("results;");
         Int_t nResults = (Int_t)gROOT->ProcessLineSync("n;");
         
-        if (results == 0)
-        {
+        if (results == 0) {
           Error("Apply macros", Form("Error reading data from macro \"%s\"", procIterator->At(i)->GetTitle()));
           continue;
         }
-        for (Int_t resInd = 0; resInd < nResults; resInd++)
-        {
+        for (Int_t resInd = 0; resInd < nResults; resInd++){
           (*fDataTree) << Form("TrackData%d", i) << Form("Macro%d=", i) << results[resInd] << (Char_t*)"\n";   
         }
 
@@ -550,8 +522,7 @@ Bool_t AliEveTRDTrackList::ApplyProcessMacros(const TList* selIterator, const TL
         results = 0;
       }
       // Correlated tracks analyse
-      else if (mProcType[i] == kCorrelTrackAnalyse)
-      {
+      else if (mProcType[i] == kCorrelTrackAnalyse){
         // 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.
@@ -560,25 +531,20 @@ Bool_t AliEveTRDTrackList::ApplyProcessMacros(const TList* selIterator, const TL
         TEveElement::List_i iter2 = iter;
         iter2++;
 
-        for ( ; iter2 != this->EndChildren(); ++iter2)
-        {
-          track2 = dynamic_cast<AliEveTRDTrack*>(*iter2);
-
-          if (!track2)  continue;
+        for ( ; iter2 != this->EndChildren(); ++iter2) {
+          if(!(track2 = dynamic_cast<AliEveTRDTrack*>(*iter2))) continue;
  
           // Skip tracks that have not been selected
           if (!track2->GetRnrState())  continue;
     
-          track2->ExportToCINT((Text_t*)"automaticTrack");
           // Cast to AliTRDtrackV1
+          gROOT->ProcessLineSync(Form("AliEveTRDTrack *automaticTrack = (AliEveTRDTrack*)0x%xl;", track2));
           gROOT->ProcessLineSync("AliTRDtrackV1* automaticTrackV1_2 = (AliTRDtrackV1*)automaticTrack->GetUserData();");
 
           // Select track by default (so it will be processed, if there are no correlated tracks selection macros!)
           selectedByCorrSelMacro = kTRUE;
-          for (Int_t j = 0; j < selIterator->GetEntries(); j++)
-          {
-            if (mSelType[j] == kCorrelTrackSelect)
-            {
+          for (Int_t j = 0; j < selIterator->GetEntries(); j++) {
+            if (mSelType[j] == kCorrelTrackSelect) {
               selectedByCorrSelMacro = (Bool_t)gROOT->ProcessLineSync(selCmds[j]);
               if (!selectedByCorrSelMacro)  break;
             }
@@ -594,13 +560,11 @@ Bool_t AliEveTRDTrackList::ApplyProcessMacros(const TList* selIterator, const TL
           Double_t* results = (Double_t*)gROOT->ProcessLineSync("results;");
           Int_t nResults = (Int_t)gROOT->ProcessLineSync("n;");
      
-          if (results == 0)
-          {
+          if (results == 0) {
             Error("Apply macros", Form("Error reading data from macro \"%s\"", procIterator->At(i)->GetTitle()));
             continue;
           }
-          for (Int_t resInd = 0; resInd < nResults; resInd++)
-          {
+          for (Int_t resInd = 0; resInd < nResults; resInd++) {
             (*fDataTree) << Form("TrackData%d", i) << Form("Macro%d=", i) << results[resInd] << (Char_t*)"\n";   
           }
 
@@ -611,13 +575,10 @@ Bool_t AliEveTRDTrackList::ApplyProcessMacros(const TList* selIterator, const TL
     }
   }    
 
-  for (Int_t i = 0, histoIndex = 0; i < procIterator->GetEntries() && histoIndex < numHistoMacros; i++)
-  {
-    if (mProcType[i] == kSingleTrackHisto || mProcType[i] == kCorrelTrackHisto)
-    {
+  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] != 0)
-      {
+      if (histos[histoIndex]) {
         (*fDataTree) << Form("TrackData%d", i) << Form("Macro%d=", i) << histos[histoIndex] << (Char_t*)"\n";
       }
       histoIndex++;
@@ -641,7 +602,7 @@ Bool_t AliEveTRDTrackList::ApplyProcessMacros(const TList* selIterator, const TL
   histos = 0;
 
   // Clear root
-  gROOT->Reset();
+  // A.B. gROOT->Reset();
   
   // If there is data, select the first data set
   if (procIterator->GetEntries() > 0) SETBIT(fHistoDataSelected, 0);
@@ -666,23 +627,18 @@ void AliEveTRDTrackList::ApplySTSelectionMacros(const TList* iterator)
   Bool_t selectedByMacro = kFALSE;
 
   // Clear root
-  gROOT->Reset();
+  // A.B. gROOT->Reset();
 
   // Select all tracks at first. A track is then deselect, if at least one selection macro
   // returns kFALSE for this track
   // Enable all tracks (Note: EnableListElements(..) will call "ElementChanged", which will cause unforeseen behavior!)
-  for (TEveElement::List_i iter = this->BeginChildren(); iter != this->EndChildren(); ++iter)
-  {
-    ((TEveElement*)(*iter))->SetRnrState(kTRUE);
-  }
+  for (TEveElement::List_i iter = this->BeginChildren(); iter != this->EndChildren(); ++iter) ((TEveElement*)(*iter))->SetRnrState(kTRUE);
   SetRnrState(kTRUE);
   
-  for (Int_t i = 0; i < iterator->GetEntries(); i++)
-  {
+  for (Int_t i = 0; i < iterator->GetEntries(); i++){
     macro = (TMacroData*)fMacroList->GetValue(iterator->At(i)->GetTitle());
 
-    if (!macro)
-    {
+    if (!macro){
       Error("Apply selection macros", 
             Form("Macro list is corrupted: Macro \"%s\" is not registered!", iterator->At(i)->GetTitle()));
       continue;
@@ -696,8 +652,7 @@ void AliEveTRDTrackList::ApplySTSelectionMacros(const TList* iterator)
     macroType = macro->GetType();
 
     // Single track select macro
-    if (macroType == kSingleTrackSelect)
-    {
+    if (macroType == kSingleTrackSelect){
       // Walk through the list of tracks
       for (TEveElement::List_i iter = this->BeginChildren(); iter != this->EndChildren(); ++iter)
       {
@@ -708,29 +663,26 @@ void AliEveTRDTrackList::ApplySTSelectionMacros(const TList* iterator)
         // If the track has already been deselected, nothing is to do here
         if (!track1->GetRnrState()) continue;
 
-        track1->ExportToCINT((Text_t*)"automaticTrack");
         // Cast to AliTRDtrackV1
+        gROOT->ProcessLineSync(Form("AliEveTRDTrack *automaticTrack = (AliEveTRDTrack*)0x%xl;", track1));
         gROOT->ProcessLineSync("AliTRDtrackV1* automaticTrackV1_1 = (AliTRDtrackV1*)automaticTrack->GetUserData();");
         selectedByMacro = (Bool_t)gROOT->ProcessLineSync(macro->GetCmd());
         track1->SetRnrState(selectedByMacro && track1->GetRnrState());               
       }
     }
     // Correlated tracks select macro
-    else if (macroType == kCorrelTrackSelect)
-    {
+    else if (macroType == kCorrelTrackSelect){
       // Will be processed in ApplyProcessMacros(...)
       continue;
-    }
-    else
-    {
+    } else {
       Error("Apply selection macros", 
-            Form("Macro list corrupted: Macro \"%s/%s.C\" is not registered as a selection macro!", 
-                 macro->GetPath(), macro->GetName()));
+        Form("Macro list corrupted: Macro \"%s/%s.C\" is not registered as a selection macro!", 
+        macro->GetPath(), macro->GetName()));
     } 
   }
 
   // Clear root
-  gROOT->Reset();  
+  // A.B. gROOT->Reset();  
 }
 
 //______________________________________________________
@@ -746,8 +698,7 @@ AliEveTRDTrackList::AliEveTRDTrackListMacroType AliEveTRDTrackList::GetMacroType
   AliEveTRDTrackListMacroType type = kUnknown;
 
   // Re-do the check of the macro type
-  if (!UseList)
-  {
+  if (!UseList){
     // Single track select macro or single track histo macro?
     TFunction* f = gROOT->GetGlobalFunctionWithPrototype(name, "const AliTRDtrackV1*", kTRUE);
     if (f != 0x0)
index f4b6b0c47d649da89b1b17c0da98d4eb5eb59322..09d543790dc05d9949e81f468cbd81da645908b6 100644 (file)
@@ -64,6 +64,7 @@
 
 #define SIGNATURE_ERROR   -1
 #define NOT_EXIST_ERROR   -2
+#define ERROR            -3
 #define WARNING           0
 #define SUCCESS           1
 
@@ -121,7 +122,7 @@ public:
 
   Int_t AddMacro(const Char_t* path, const Char_t* name, Bool_t forceReload = kFALSE);                      
   Bool_t AddMacroFast(const Char_t* path, const Char_t* name, AliEveTRDTrackListMacroType type);        
-  virtual void AddStandardMacros();                           
+  virtual void AddStandardContent();                           
   Bool_t ApplyProcessMacros(const TList* selIterator, const TList* procIterator);               
   void ApplySTSelectionMacros(const TList* iterator);
 
index f8deaa2be8572fcf033c925dfb18e4682c67a867..6a15e41946873c74deda9b954eb7b9623a3329fc 100644 (file)
@@ -46,6 +46,8 @@
 #include <TROOT.h>
 #include <TSystem.h>
 #include <TGTextEntry.h>
+#include <TGTextEdit.h>
+#include <TGComboBox.h>
 #include <TGTextView.h>
 #include <TH1.h>
 #include <TTreeStream.h>
@@ -74,6 +76,7 @@ AliEveTRDTrackListEditor::AliEveTRDTrackListEditor(const TGWindow* p, Int_t widt
   frbColor(new TGRadioButton*[3]),
   frbTrack(new TGRadioButton*[3]),
   fbBrowse(0),
+  fbNew(0),
   fbApplyMacros(0),
   fbRemoveMacros(0),
   fbDrawHisto(0),
@@ -128,7 +131,7 @@ AliEveTRDTrackListEditor::AliEveTRDTrackListEditor(const TGWindow* p, Int_t widt
   
 
   // Functionality for adding macros  
-  fMainFrame = CreateEditorTabSubFrame("Apply macros");
+  fMainFrame = CreateEditorTabSubFrame("Process");
    
   fLabel1 = new TGLabel(fMainFrame,"Add macro(s):");
   fMainFrame->AddFrame(fLabel1);
@@ -143,6 +146,11 @@ AliEveTRDTrackListEditor::AliEveTRDTrackListEditor(const TGWindow* p, Int_t widt
   fbBrowse->SetToolTipText("Browse the macro you want to add");
   fbBrowse->Connect("Clicked()", "AliEveTRDTrackListEditor", this, "BrowseMacros()");
   fBrowseFrame->AddFrame(fbBrowse);
+  
+  fbNew = new TGTextButton(fBrowseFrame, "New");
+  fbNew->SetToolTipText("Start macro creation wizzard");
+  fbNew->Connect("Clicked()", "AliEveTRDTrackListEditor", this, "NewMacros()");
+  fBrowseFrame->AddFrame(fbNew);
   fMainFrame->AddFrame(fBrowseFrame);
 
   fLine1 = new TGHorizontal3DLine(fMainFrame, 194, 8);
@@ -157,7 +165,7 @@ AliEveTRDTrackListEditor::AliEveTRDTrackListEditor(const TGWindow* p, Int_t widt
 
   fLine2 = new TGHorizontal3DLine(fMainFrame, 194, 8);
   fMainFrame->AddFrame(fLine2, new TGLayoutHints(kLHintsLeft  | kLHintsTop, 2, 2, 8, 2));
-  fLabel3 = new TGLabel(fMainFrame,"Process macros:");
+  fLabel3 = new TGLabel(fMainFrame,"Process plugins:");
   fMainFrame->AddFrame(fLabel3);
 
   ftlMacroList = new TGListBox(fMainFrame);
@@ -168,21 +176,21 @@ AliEveTRDTrackListEditor::AliEveTRDTrackListEditor(const TGWindow* p, Int_t widt
   fLine3 = new TGHorizontal3DLine(fMainFrame, 194, 8);
   fMainFrame->AddFrame(fLine3, new TGLayoutHints(kLHintsLeft  | kLHintsTop, 2, 2, 8, 2));  
 
-  fbApplyMacros = new TGTextButton(fMainFrame, "Apply selected macro(s)");
-  fbApplyMacros->SetToolTipText("Apply all selected macros to the tracklist -> A data file will be generated");
+  fbApplyMacros = new TGTextButton(fMainFrame, "Apply plugin(s)");
+  fbApplyMacros->SetToolTipText("Apply all selected macros/class functins to the list of tracks -> A data file will be generated");
   fbApplyMacros->Connect("Clicked()", "AliEveTRDTrackListEditor", this, "ApplyMacros()");
   fbApplyMacros->SetRightMargin(12);
   fMainFrame->AddFrame(fbApplyMacros);
 
-  fbRemoveMacros = new TGTextButton(fMainFrame, "Remove selected macro(s)");
-  fbRemoveMacros->SetToolTipText("Remove the selected macro(s) from the list(s)");
+  fbRemoveMacros = new TGTextButton(fMainFrame, "Remove plugin(s)");
+  fbRemoveMacros->SetToolTipText("Remove the selected macros/class functions from the list(s)");
   fbRemoveMacros->Connect("Clicked()", "AliEveTRDTrackListEditor", this, "RemoveMacros()");
   fMainFrame->AddFrame(fbRemoveMacros);
 
   // Stuff for displaying histograms
-  fHistoFrame = CreateEditorTabSubFrame("Histograms");  
+  fHistoFrame = CreateEditorTabSubFrame("Results");  
   fHistoFrame->SetMapSubwindows(kTRUE);
-  fLabel4 = new TGLabel(fHistoFrame,"Data from applied macros:");
+  fLabel4 = new TGLabel(fHistoFrame,"Data from plugins:");
   fHistoFrame->AddFrame(fLabel4);
 
   fHistoSubFrame = new TGVerticalFrame(fHistoFrame);
@@ -193,7 +201,7 @@ AliEveTRDTrackListEditor::AliEveTRDTrackListEditor(const TGWindow* p, Int_t widt
   fLine4 = new TGHorizontal3DLine(fHistoFrame, 194, 8);
   fHistoFrame->AddFrame(fLine4, new TGLayoutHints(kLHintsLeft  | kLHintsTop, 2, 2, 8, 2));  
 
-  fbDrawHisto = new TGTextButton(fHistoFrame, "Draw histogram");
+  fbDrawHisto = new TGTextButton(fHistoFrame, "Draw projections");
   fbDrawHisto->SetToolTipText("Uses the data file created by the last \"Apply selected macro(s)\".\nClick here to display the data histograms of the selected macros.\nSelect multiple macros to create multi-dimensional plots.\nHisto macros cannot be used for multi-dimensional plots!");
   fbDrawHisto->Connect("Clicked()", "AliEveTRDTrackListEditor", this, "DrawHistos()");
   fHistoFrame->AddFrame(fbDrawHisto);
@@ -224,8 +232,7 @@ AliEveTRDTrackListEditor::AliEveTRDTrackListEditor(const TGWindow* p, Int_t widt
   AliEveEventManager::GetMaster()->Connect("NewEventLoaded()", "AliEveTRDTrackListEditor", this, "HandleNewEventLoaded()");
 
   // Handle the signal "Selected" (another tab has been selected)
-  GetGedEditor()->GetTab()->Connect("Selected(Int_t)", "AliEveTRDTrackListEditor", 
-                                    this, "HandleTabChangedToIndex(Int_t)");
+  GetGedEditor()->GetTab()->Connect("Selected(Int_t)", "AliEveTRDTrackListEditor", this, "HandleTabChangedToIndex(Int_t)");
 }
 
 //______________________________________________________
@@ -262,11 +269,10 @@ AliEveTRDTrackListEditor::~AliEveTRDTrackListEditor()
 }
 
 //______________________________________________________
-void AliEveTRDTrackListEditor::AddMacro(const Char_t* path, const Char_t* name)
+void AliEveTRDTrackListEditor::AddMacro(const Char_t* name, const Char_t* path)
 {
   // Adds the macro path/name to the macro list. A warning is provided, if there is
   // something wrong, e.g. if the macro does not have the correct signature.
-
   Int_t result = fM->AddMacro(path, name);
 
   switch (result)
@@ -278,6 +284,10 @@ void AliEveTRDTrackListEditor::AddMacro(const Char_t* path, const Char_t* name)
     new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Warning", "Macro is already in list (won't be added again)!",
                  kMBIconExclamation, kMBOk);
     break;
+  case ERROR:
+    new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Error", "Fail to load the macro (check messages in the terminal)!",
+                 kMBIconExclamation, kMBOk);
+    break;
   case SIGNATURE_ERROR:
     new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Error", 
                  "Macro has not the signature of...\n...a single track selection macro: Bool_t YourMacro(const AliTRDtrackV1*)\n...a correlated tracks selection macro: Bool_t YourMacro(const AliTRDtrackV1*, const AliTRDtrackV1*)\n...a single track analyse macro: void YourMacro(const AliTRDtrackV1*, Double_t*&, Int_t&)\n...a correlated tracks analyse macro: void YourMacro(const AliTRDtrackV1*, const AliTRDtrackV1*, Double_t*&, Int_t&)\n...a single track histo macro: TH1* YourMacro(const AliTRDtrackV1*)\n...a correlated tracks histo macro: TH1* YourMacro(const AliTRDtrackV1*, const AliTRDtrackV1*)", 
@@ -324,7 +334,7 @@ void AliEveTRDTrackListEditor::ApplyMacros()
   if (success && procIterator->GetEntries() > 0) 
   {
     // Set focus on "Histograms" tab
-    GetGedEditor()->GetTab()->SetTab("Histograms");
+    GetGedEditor()->GetTab()->SetTab("Results");
 
     DrawHistos();
   }
@@ -342,6 +352,17 @@ void AliEveTRDTrackListEditor::ApplyMacros()
   }
 }
 
+//______________________________________________________
+void AliEveTRDTrackListEditor::NewMacros()
+{
+  // Start the macro creation wizzard.
+  // thanks to Jacek Otwinowski<J.Otwinowski@GSI.DE> for this suggestion
+
+  AliEveTRDMacroWizzard *wizz = new AliEveTRDMacroWizzard();
+  wizz->Connect("Done(Char_t*)", "AliEveTRDTrackListEditor", this, "AddMacro(Char_t*)");
+}
+
+
 //______________________________________________________
 void AliEveTRDTrackListEditor::BrowseMacros()
 {
@@ -364,7 +385,7 @@ void AliEveTRDTrackListEditor::BrowseMacros()
       // Delete '"' at the end
       name[strlen(name)] = '\0';
               
-      AddMacro(fFileInfo->fIniDir, name + 1); 
+      AddMacro(name + 1, fFileInfo->fIniDir); 
       iter = (TObjString*)fFileInfo->fFileNamesList->After(iter);
     }
   }
@@ -670,7 +691,7 @@ void AliEveTRDTrackListEditor::HandleMacroPathSet()
         sprintf(pathname, "./%s", fteField->GetText());
         fteField->SetText(pathname);
 
-        AddMacro(".", name);  
+        AddMacro(name);  
         if (name != 0)  delete name;
         name = 0;
       }
@@ -683,7 +704,7 @@ void AliEveTRDTrackListEditor::HandleMacroPathSet()
         strncpy(path, fteField->GetText(), strlen(fteField->GetText()) - strlen(name));
         
         // Ignore the slash "/" in name
-        AddMacro(path, name + 1);  
+        AddMacro(name + 1, path);  
   
         if (path != 0)  delete path;
         path = 0;
@@ -1076,3 +1097,194 @@ void AliEveTRDTrackListEditor::UpdateMacroListSelection(Int_t ind)
   // Toggle selected item
   fM->SetMacroListSelection(ind, !fM->MacroListIsSelected(ind));
 }
+
+
+/////////////////////////////////////////////////
+ClassImp(AliEveTRDMacroWizzard)
+
+//______________________________________________________
+AliEveTRDMacroWizzard::AliEveTRDMacroWizzard(const TGWindow* p)
+  :TGMainFrame(p ? p : gClient->GetRoot(), 10, 10, kMainFrame | kVerticalFrame)
+  ,fText(0x0)
+  ,fCombo(0x0)
+  ,fTextEdit(0x0)
+{
+  const Int_t width = 300;
+
+  // horizontal frame
+  TGHorizontalFrame *fFrameName = new TGHorizontalFrame(this, 10, 10, kHorizontalFrame);
+  TGLabel *fLabel = new TGLabel(fFrameName, "Name*");
+  fLabel->SetTextJustify(36);
+  fLabel->SetMargins(0,0,0,0);
+  fLabel->SetWrapLength(-1);
+  fFrameName->AddFrame(fLabel, new TGLayoutHints(kLHintsLeft | kLHintsTop,2,2,2,2));
+
+  fText = new TGTextEntry(fFrameName);
+  fText->SetMaxLength(255);
+  fText->SetAlignment(kTextLeft);
+  fText->SetText("");
+  fText->Resize(width, fText->GetDefaultHeight());
+  fFrameName->AddFrame(fText, new TGLayoutHints(kLHintsRight | kLHintsTop,2,2,2,2));
+
+
+  // horizontal frame
+  TGHorizontalFrame *fFrameComment = new TGHorizontalFrame(this,10,10,kHorizontalFrame);
+  fLabel = new TGLabel(fFrameComment, "Comment");
+  fLabel->SetTextJustify(36);
+  fLabel->SetMargins(0,0,0,0);
+  fLabel->SetWrapLength(-1);
+  fFrameComment->AddFrame(fLabel, new TGLayoutHints(kLHintsLeft | kLHintsTop,2,2,2,2));
+
+  fTextEdit = new TGTextEdit(fFrameComment, width, 5*fText->GetDefaultHeight());
+  fFrameComment->AddFrame(fTextEdit, new TGLayoutHints(kLHintsRight | kLHintsTop,2,2,2,2));
+
+  // horizontal frame
+  TGHorizontalFrame *fFrameType = new TGHorizontalFrame(this,10,10,kHorizontalFrame);
+  fLabel = new TGLabel(fFrameType, "Type*");
+  fLabel->SetTextJustify(36);
+  fLabel->SetMargins(0,0,0,0);
+  fLabel->SetWrapLength(-1);
+  fFrameType->AddFrame(fLabel, new TGLayoutHints(kLHintsLeft | kLHintsTop,2,2,2,2));
+
+  fCombo = new TGComboBox(fFrameType, -1, kHorizontalFrame | kSunkenFrame | kDoubleBorder | kOwnBackground);
+  fCombo->AddEntry("Single Track Selection", AliEveTRDTrackList::kSingleTrackSelect);
+  fCombo->AddEntry("Pair Tracks Selection", AliEveTRDTrackList::kCorrelTrackSelect);
+  fCombo->AddEntry("Single Track Analyse", AliEveTRDTrackList::kSingleTrackAnalyse);
+  fCombo->AddEntry("Single Track Histo", AliEveTRDTrackList::kSingleTrackHisto);
+  fCombo->AddEntry("Pair Tracks Analyse", AliEveTRDTrackList::kCorrelTrackAnalyse);
+  fCombo->AddEntry("Pair Tracks Histo", AliEveTRDTrackList::kCorrelTrackHisto);
+  fCombo->Select(-1);
+  fCombo->Resize(width, fText->GetDefaultHeight());
+  fFrameType->AddFrame(fCombo, new TGLayoutHints(kLHintsRight | kLHintsTop,2,2,2,2));
+
+
+  // horizontal frame
+  TGHorizontalFrame *fFrameText = new TGHorizontalFrame(this,10,10,kHorizontalFrame);
+  fLabel = new TGLabel(fFrameText, "(*) Mandatory fields");
+  fLabel->SetTextJustify(36);
+  fLabel->SetMargins(0,0,0,0);
+  fLabel->SetWrapLength(-1);
+  fFrameText->AddFrame(fLabel, new TGLayoutHints(kLHintsLeft | kLHintsTop,2,2,2,2));
+
+  // put things together  
+  AddFrame(fFrameName, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsExpandX,2,2,2,2));
+  AddFrame(fFrameComment, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsExpandX,2,2,2,2));
+  AddFrame(fFrameType, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsExpandX,2,2,2,2));
+
+  TGHorizontal3DLine *fLine = new TGHorizontal3DLine(this, 281, 2);
+  AddFrame(fLine, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsExpandX,2,2,2,2));
+  AddFrame(fFrameText, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsExpandX,2,2,2,2));
+
+
+  SetWindowName("TRD Macro Wizzard");
+  SetMWMHints(kMWMDecorAll,
+              kMWMFuncAll,
+              kMWMInputModeless);
+  MapSubwindows();
+
+  Resize(GetDefaultSize());
+  MapWindow();
+
+  // Do the linking
+  fCombo->Connect("Selected(Int_t)", "AliEveTRDMacroWizzard", this, "Create(Int_t)");
+}  
+
+Char_t *fIncludes = 
+"#if !defined(__CINT__) || defined(__MAKECINT__)\n"
+"#include <TROOT.h>\n"
+"#include <TH1.h>\n"
+"#include <TRD/AliTRDgeometry.h>\n"
+"#include <TRD/AliTRDcluster.h>\n"
+"#include <TRD/AliTRDseedV1.h>\n"
+"#include <TRD/AliTRDtrackV1.h>\n"
+"#endif\n";
+
+Char_t *fMacroTemplate[7] = {
+""
+,"  if (!track) return kFALSE;\n"
+
+,"  n = 0;\n"
+"  r=0x0;\n"
+"  if (!track) return;\n"
+
+,"  if (!track) return 0x0;\n"
+"  TH1* h = 0x0;\n"
+"  if(!(h = (TH1*)gROOT->FindObject(\"h\"))){\n"
+"    h = new TH1(\"h\", \"Title\", n, xmin, xmax);\n"
+"    h->GetXaxis()->SetTitle("");\n"
+"    h->GetYaxis()->SetTitle("");\n"
+"  } else h->Reset();\n"
+
+,"  if (!track) return kFALSE;\n"
+"  if (!track2) return kFALSE;\n"
+
+,"  n = 0;\n"
+"  r=0x0;\n"
+"  if (!track) return;\n"
+"  if (!track2) return;\n"
+
+,"  if (!track) return 0x0;\n"
+"  if (!track2) return 0x0;\n"
+"  TH1* h = 0x0;\n"
+"  if(!(h = (TH1*)gROOT->FindObject(\"h\"))){\n"
+"    h = new TH1(\"h\", \"Title\", n, xmin, xmax);\n"
+"    h->GetXaxis()->SetTitle("");\n"
+"    h->GetYaxis()->SetTitle("");\n"
+"  } else h->Reset();\n"
+};
+//______________________________________________________
+void AliEveTRDMacroWizzard::Create(Int_t typ)
+{
+  const Char_t *name = fText->GetText();
+  if(strcmp(name,"")==0){
+    AliInfo("Please specify a name for your macro.");
+    fCombo->Select(-1);
+    return;
+  }
+
+  FILE* fp = 0x0;
+  if(!(fp = fopen(Form("%s.C", name), "wt"))){
+    AliInfo("Couldn't create macro file.");
+    fCombo->Select(-1);
+    return;
+  }
+
+  TGText *comment = fTextEdit->GetText();
+  Char_t *line = 0x0; Int_t iline = 0;
+  while((line = comment->GetLine(TGLongPosition(0,iline++), 200))) fprintf(fp, "// %s\n", line);
+
+  fprintf(fp, "\n%s\n", fIncludes);
+
+  switch(typ){
+  case AliEveTRDTrackList::kSingleTrackSelect:
+    fprintf(fp, "Bool_t %s(const AliTRDtrackV1 *track)\n", name);
+    break;
+  case AliEveTRDTrackList::kCorrelTrackSelect:
+    fprintf(fp, "Bool_t %s(const AliTRDtrackV1 *track, const AliTRDtrackV1 *track2)\n", name);
+    break;
+  case AliEveTRDTrackList::kSingleTrackAnalyse:
+    fprintf(fp, "void %s(const AliTRDtrackV1 *track, Double_t*& r, Int_t& n)\n", name);
+    break;
+  case AliEveTRDTrackList::kSingleTrackHisto:
+    fprintf(fp, "TH1* %s(const AliTRDtrackV1 *track)\n", name);
+    break;
+  case AliEveTRDTrackList::kCorrelTrackAnalyse:
+    fprintf(fp, "void %s(const AliTRDtrackV1 *track, const AliTRDtrackV1 *track2, Double_t*& r, Int_t& n)\n", name);
+    break;
+  case AliEveTRDTrackList::kCorrelTrackHisto:
+    fprintf(fp, "TH1* %s(const AliTRDtrackV1 *track, const AliTRDtrackV1 *track2)\n", name);
+    break;
+  default:
+    AliInfo(Form("Unknown typ[%d]", typ));
+    fclose(fp);
+    gSystem->Exec(Form("rm -f %s.C", name));
+    fCombo->Select(-1);
+    return;
+  }
+  
+  fprintf(fp, "{\n%s\n", fMacroTemplate[typ]);
+  fprintf(fp, "// add your own code here\n\n\n}\n");
+  fclose(fp);
+  Done(Form("%s.C", name));
+  CloseWindow();
+}
index 668e3ab9824accceaf5ed1093f615b12000c78bc..abfc921e04a6ce504e098249a17d37477dace7eb 100644 (file)
 // access the data.                                                     //
 //////////////////////////////////////////////////////////////////////////
 
+#ifndef ROOT_TGedFrame
 #include <TGedFrame.h>
+#endif
+
+#ifndef ROOT_TGFrame
+#include <TGFrame.h>
+#endif
 
 class AliEveTRDTrack;
 class AliEveTRDTrackList;
@@ -59,26 +65,26 @@ public:
   AliEveTRDTrackListEditor(const TGWindow* p = 0, Int_t width = 170, Int_t height = 30,
                                       UInt_t options = kChildFrame, Pixel_t back = GetDefaultFrameBackground());
   virtual ~AliEveTRDTrackListEditor();
-
   virtual void SetModel(TObject* obj);
 
-  void AddMacro(const Char_t* path, const Char_t* name);  
-  void ApplyMacros();                                     
-  void BrowseMacros();                                    
-  void CloseTabs();                                      
-  void DrawHistos();                                      
-  Int_t GetNSelectedHistograms() const;                        
-  void HandleMacroPathSet();                             
-  void HandleNewEventLoaded();                           
-  void HandleTabChangedToIndex(Int_t);                 
-  void RemoveMacros();    
-  void SaveMacroList(TMap* list);                               
-  void SetTrackColor(Int_t ind);                       
-  void SetTrackModel(Int_t ind);                         
-  void UpdateDataFromMacroListSelection();                
-  void UpdateHistoList();                                
-  void UpdateMacroList();                                 
-  void UpdateMacroListSelection(Int_t ind);                       
+  void    AddMacro(const Char_t* name, const Char_t* path = ".");  
+  void    ApplyMacros();
+  void    BrowseMacros();
+  void    CloseTabs();
+  void    DrawHistos();
+  Int_t   GetNSelectedHistograms() const;
+  void    HandleMacroPathSet();
+  void    HandleNewEventLoaded();
+  void    HandleTabChangedToIndex(Int_t);
+  void    NewMacros();
+  void    RemoveMacros();
+  void    SaveMacroList(TMap* list);
+  void    SetTrackColor(Int_t ind);
+  void    SetTrackModel(Int_t ind);
+  void    UpdateDataFromMacroListSelection();
+  void    UpdateHistoList();
+  void    UpdateMacroList();
+  void    UpdateMacroListSelection(Int_t ind);
   
 protected:
   AliEveTRDTrackList* fM;                                               // Model object
@@ -111,6 +117,7 @@ private:
   TGRadioButton**    frbTrack;               // Radio buttons for the track model
 
   TGTextButton*   fbBrowse;                  // "Browse" button
+  TGTextButton*   fbNew;                     // "New" button
   TGTextButton*   fbApplyMacros;             // "Apply macros" button
   TGTextButton*   fbRemoveMacros;            // "Remove macros" button
   TGTextButton*   fbDrawHisto;               // "Draw histogram" button
@@ -143,4 +150,24 @@ private:
   ClassDef(AliEveTRDTrackListEditor, 0);    // Editor for AliEveTRDTrackList.
 };
 
+class TGTextEdit;
+class TGComboBox;
+class AliEveTRDMacroWizzard : public TGMainFrame
+{
+public:
+  AliEveTRDMacroWizzard(const TGWindow* p = 0);
+  void Create(Int_t typ);
+  void Done(Char_t *macro)
+    { Emit("Done(Char_t*)", macro); } //*SIGNAL*
+private:
+  AliEveTRDMacroWizzard(const AliEveTRDMacroWizzard&);
+  AliEveTRDMacroWizzard& operator=(const AliEveTRDMacroWizzard&);
+
+  TGTextEntry *fText;
+  TGComboBox  *fCombo;
+  TGTextEdit  *fTextEdit;
+  
+  ClassDef(AliEveTRDMacroWizzard, 0);    // Helper class to create macro templates 
+};
+
 #endif
index f26246de7907aa951b8906fa723d0c7efd22ee5c..1812c830b6ad804c0623d8d7a8ce4f19b24431df 100644 (file)
@@ -88,6 +88,7 @@
 #pragma link C++ class AliEveTRDTrack+;
 #pragma link C++ class AliEveTRDTrackList+;
 #pragma link C++ class AliEveTRDTrackListEditor+;
+#pragma link C++ class AliEveTRDMacroWizzard+;
 
 // TOF
 #pragma link C++ class AliEveTOFDigitsInfo+;
diff --git a/EVE/alice-macros/trd_tracks.C b/EVE/alice-macros/trd_tracks.C
new file mode 100644 (file)
index 0000000..bf1884b
--- /dev/null
@@ -0,0 +1,51 @@
+void trd_tracks(TEveElement *cont = 0)
+{
+
+  // Link data containers
+  AliESDfriend *eventESDfriend = 0x0;
+  if(!(eventESDfriend = AliEveEventManager::AssertESDfriend())){
+    Warning("trd_tracks", "AliESDfriend not found");
+    return 0x0;
+  }
+
+  AliESDEvent* esd = AliEveEventManager::AssertESD();
+
+  AliEveEventManager::AssertGeometry();
+
+  AliMagFMaps *field = new AliMagFMaps("Maps","Maps", 2, 1., 10., AliMagFMaps::k5kG);
+  AliTracker::SetFieldMap(field, kTRUE);
+
+  AliTRDReconstructor *reco = new AliTRDReconstructor();
+  reco->SetRecoParam(AliTRDrecoParam::GetLowFluxParam());
+  reco->SetOption("!nn");
+
+  AliEveTRDTrackList *tracks = new AliEveTRDTrackList("TRD Tracks");
+  for (Int_t n=0; n<esd->GetNumberOfTracks(); n++){
+    AliESDtrack* esdTrack = esd->GetTrack(n);
+    AliESDfriendTrack *friendTrack = eventESDfriend->GetTrack(n);
+  
+    TObject *cal = 0x0;
+    Int_t ical = 0;
+    while(cal = friendTrack->GetCalibObject(ical++)){
+      if(strcmp(cal->IsA()->GetName(), "AliTRDtrackV1") != 0) continue;
+      AliTRDtrackV1 *trackObj = dynamic_cast<AliTRDtrackV1 *>(cal);
+      trackObj->SetReconstructor(reco);
+      AliEveTRDTrack *trackEve = new AliEveTRDTrack(trackObj);
+      tracks->AddElement(trackEve);
+      trackEve->SetESDstatus(esdTrack->GetStatus());
+    }
+  }
+       
+  tracks->SetTitle(Form("Tracks %d", tracks->NumChildren()));
+  tracks->StampObjProps();
+  gEve->AddElement(tracks, cont);
+  
+  gEve->Redraw3D();
+
+  TGLViewer *v = gEve->GetGLViewer();
+  v->SetCurrentCamera(TGLViewer::kCameraOrthoXOY);
+  ((TGLOrthoCamera&)v->CurrentCamera()).SetEnableRotate(kTRUE);
+  v->UpdateScene();
+  
+  return;
+}