]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - EVE/EveBase/AliEveMacroExecutor.cxx
Including time.h
[u/mrichter/AliRoot.git] / EVE / EveBase / AliEveMacroExecutor.cxx
index 80044f166dfb67fe9223a4b80943885108e2dcad..c943f04c34ac288138586b7a5214a8841772a416 100644 (file)
 #include "AliEveMacroExecutor.h"
 #include "AliEveMacro.h"
 #include "AliEveEventManager.h"
+#include "AliSysInfo.h"
 
 #include <TEveUtil.h>
 #include <TList.h>
 #include <TROOT.h>
 
+#include <TEveManager.h>
+#include <TGFileDialog.h>
+#include <TGMenu.h>
+
+#include <TSystem.h>
+#include <TPRegexp.h>
+#include <RVersion.h>
+
+
 //______________________________________________________________________________
-// Full description of AliEveMacroExecutor
 //
+// Contains a list of AliEveMacros.
+// The macros are added via AddMacro() and are owned by the executor.
+// The macros can be executed via ExecMacros().
+// They are executed in order in which they are registered.
 
 ClassImp(AliEveMacroExecutor)
 
@@ -50,7 +63,7 @@ void AliEveMacroExecutor::AddMacro(AliEveMacro* mac)
   const TString mname = mac->GetMacro();
   if ( ! mname.IsNull() && TEveUtil::CheckMacro(mname) == kFALSE)
   {
-    TEveUtil::LoadMacro(mname);
+    TEveUtil::LoadMacro(mname);  
   }
   fMacros->Add(mac);
 }
@@ -72,6 +85,13 @@ AliEveMacro* AliEveMacroExecutor::FindMacro(const TString& func)
 
 /******************************************************************************/
 
+void AliEveMacroExecutor::RemoveMacros()
+{
+  fMacros->Clear();
+}
+
+/******************************************************************************/
+
 #include "Api.h"
 #include "TInterpreter.h"
 
@@ -85,55 +105,142 @@ void AliEveMacroExecutor::ExecMacros()
   {
     // printf ("macro '%s'; func '%s'; args '%s'\n", mac->GetMacro().Data(), mac->GetFunc().Data(), mac->GetArgs().Data());
 
+    mac->ResetExecState();
+    
     if (mac->GetActive() == kFALSE || mac->GetFunc().IsNull())
     {
       continue;
     }
 
-    switch (mac->GetSources())
+    if ((mac->RequiresRunLoader() && ! AliEveEventManager::HasRunLoader()) ||
+        (mac->RequiresESD()       && ! AliEveEventManager::HasESD())       ||
+        (mac->RequiresESDfriend() && ! AliEveEventManager::HasESDfriend()) ||
+        (mac->RequiresRawReader() && ! AliEveEventManager::HasRawReader()) ||
+       (mac->RequiresAOD()       && ! AliEveEventManager::HasAOD()))
     {
-      case AliEveMacro::kRunLoader:
-       if ( ! AliEveEventManager::HasRunLoader())
-         continue;
-       break;
-      case AliEveMacro::kESD:
-       if ( ! AliEveEventManager::HasESD())
-         continue;
-       break;
-      case AliEveMacro::kESDfriend:
-       if ( ! AliEveEventManager::HasESDfriend())
-         continue;
-       break;
-      case AliEveMacro::kRawReader:
-       if ( ! AliEveEventManager::HasRawReader())
-         continue;
-       break;
-      default:
-       break;
+      mac->SetExecNoData();
+      continue;
     }
 
     TString cmd(mac->FormForExec());
     try
     {
-      gInterpreter->ProcessLine(cmd);
+      Long_t                   result = 0;
+      TInterpreter::EErrorCode error  = TInterpreter::kNoError;
+
+      AliSysInfo::AddStamp(Form("%s_%s_before",mac->GetMacro().Data(), mac->GetFunc().Data()));
+      result = gInterpreter->ProcessLine(cmd, &error);
+      AliSysInfo::AddStamp(Form("%s_%s_after",mac->GetMacro().Data(), mac->GetFunc().Data()));
+
       // Try to fix broken cint state? Code taken form pyroot.
-      if ( G__get_return( 0 ) > G__RETURN_NORMAL )
+      if (G__get_return(0) > G__RETURN_NORMAL)
+      {
+       printf ("*** FIXING CINT STATE AFTER RETURN ***\n");
+       G__security_recover(0);
+      }
+
+      if (error != TInterpreter::kNoError)
+      {
+        mac->SetExecError();
+        Error("ExecMacros", "Executing %s::%s, CINT error ... hopefully recovered.",
+              mac->GetMacro().Data(), cmd.Data());
+      }
+      else
       {
-       printf ("***INFIXING***\n");
-       G__security_recover( 0 );    // 0 ensures silence
+        TEveElement *el  = (TEveElement*) result;
+        TObject     *obj = dynamic_cast<TObject*>(el);
+        if (el != 0 && obj == 0)
+        {
+          Warning("ExecMacros", "Executing %s::%s, returned TEveElement seems bad, setting it to 0.",
+                  mac->GetMacro().Data(), cmd.Data());
+          el = 0;
+        }
+        mac->SetExecOK(el);
       }
     }
     catch(TEveException& exc)
     {
+      mac->SetExecException(exc);
+
+      // Try to fix broken cint state? Code taken form pyroot.
+      if (G__get_return(0) > G__RETURN_NORMAL)
+      {
+       printf ("*** FIXING CINT STATE AFTER EXCEPTION ***\n");
+       G__security_recover(0);
+      }
+
       Error("ExecMacros", "Executing %s::%s, caught exception: '%s'.",
            mac->GetMacro().Data(), cmd.Data(), exc.Data());
     }
+  }
+}
 
-    // Try to fix broken cint state? Code taken form pyroot.
-    if ( G__get_return( 0 ) > G__RETURN_NORMAL )
-    {
-      printf ("***POSTFIXING****\n");
-      G__security_recover( 0 );    // 0 ensures silence
-    }
+/******************************************************************************/
+
+#include <iostream>
+#include <fstream>
+using namespace std;
+
+namespace
+{
+const char *gMacroSaveAsTypes[] = {"CINT Macro", "*.C",
+                                   0, 0};
+}
+
+void AliEveMacroExecutor::SaveAddedMacros()
+{
+
+  TGFileInfo fi;
+  fi.fFileTypes   = gMacroSaveAsTypes;
+  fi.fIniDir      = StrDup(""); // current directory
+  fi.fFileTypeIdx = 0;
+  fi.fOverwrite   = kTRUE;
+  new TGFileDialog(gClient->GetDefaultRoot(), gEve->GetMainWindow(), kFDSave, &fi);
+  if (!fi.fFilename) return;
+
+  TPMERegexp filere(".*/([^/]+$)");
+  if (filere.Match(fi.fFilename) != 2)
+  {
+    Warning("AliEvePopupHandler", "file '%s' bad.", fi.fFilename);
+    return;
+  }
+  printf("Saving...\n");
+
+  TString file(filere[1]);
+  TString file1;
+  if (!file.EndsWith(".C"))
+  file1 = file + ".C";
+  gSystem->ChangeDirectory(fi.fIniDir);
+  ofstream myfile;
+  myfile.open (file1);
+
+  TIter next(fMacros);
+  AliEveMacro* mac;
+
+
+  myfile <<"//Macro generated automatically by AliEveMacroExecutor\n\n";
+
+  myfile <<"void "<<file<<"(){\n\n";
+  myfile <<"  AliEveMacroExecutor *exec = AliEveEventManager::GetMaster()->GetExecutor();\n";
+  myfile <<"  exec->RemoveMacros();\n";
+  myfile <<"  TEveBrowser *browser = gEve->GetBrowser();\n";
+  myfile <<"  browser->ShowCloseTab(kFALSE);\n";
+      
+  while ((mac = (AliEveMacro*) next()))
+  {
+    myfile <<"  exec->AddMacro(new AliEveMacro("<<mac->GetSources()<<", "<<char(34)<<mac->GetTags()<<char(34)<<", "
+     <<char(34)<<mac->GetMacro()<<char(34)<<", "<<char(34)<<mac->GetFunc()<<char(34)<<", "<<char(34)<<mac->GetArgs()
+     <<char(34)<<", "<<mac->GetActive()<<"));\n\n";
   }
+
+  myfile <<"  TEveWindowSlot *slot = TEveWindow::CreateWindowInTab(browser->GetTabRight());\n";
+  myfile <<"  slot->StartEmbedding();\n";
+  myfile <<"  AliEveMacroExecutorWindow* exewin = new AliEveMacroExecutorWindow(exec);\n";
+  myfile <<"  slot->StopEmbedding("<<char(34)<<"DataSelection"<<char(34)<<");\n";
+  myfile <<"  exewin->PopulateMacros();\n\n";
+
+  myfile <<"\n}";
+  myfile.close();
+  printf("Saved...\n");
+
 }