AliEveMacro
[u/mrichter/AliRoot.git] / EVE / EveBase / AliEveMacroExecutor.cxx
1 // @(#)root/eve:$Id$
2 // Author: Matevz Tadel 2007
3
4 /**************************************************************************
5  * Copyright(c) 1998-2008, ALICE Experiment at CERN, all rights reserved. *
6  * See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for          *
7  * full copyright notice.                                                 *
8  **************************************************************************/
9
10 #include "AliEveMacroExecutor.h"
11 #include "AliEveMacro.h"
12 #include "AliEveEventManager.h"
13
14 #include <TEveUtil.h>
15 #include <TList.h>
16 #include <TROOT.h>
17
18 //______________________________________________________________________________
19 //
20 // Contains a list of AliEveMacros.
21 // The macros are added via AddMacro() and are owned by the executor.
22 // The macros can be executed via ExecMacros().
23 // They are executed in order in which they are registered.
24
25 ClassImp(AliEveMacroExecutor)
26
27 //______________________________________________________________________________
28 AliEveMacroExecutor::AliEveMacroExecutor() :
29   TObject(),
30   fMacros(new TList)
31 {
32   // Constructor.
33
34   fMacros->SetOwner(kTRUE);
35 }
36
37 //______________________________________________________________________________
38 AliEveMacroExecutor::~AliEveMacroExecutor()
39 {
40   // Destructor.
41
42   delete fMacros;
43 }
44
45 /******************************************************************************/
46
47 void AliEveMacroExecutor::AddMacro(AliEveMacro* mac)
48 {
49   // Add a new macro. Ownership transfered to the executor.
50
51   static const TEveException kEH("AliEveMacroExecutor::AddMacro ");
52
53   const TString mname = mac->GetMacro();
54   if ( ! mname.IsNull() && TEveUtil::CheckMacro(mname) == kFALSE)
55   {
56     TEveUtil::LoadMacro(mname);
57   }
58   fMacros->Add(mac);
59 }
60
61 AliEveMacro* AliEveMacroExecutor::FindMacro(const TString& func)
62 {
63   // Find macro with given function name (it is supposed to be unique).
64   // Returns 0 if not found.
65
66   TIter next(fMacros);
67   AliEveMacro* mac;
68   while ((mac = (AliEveMacro*) next()))
69   {
70     if (mac->GetFunc() == func)
71       return mac;
72   }
73   return 0;
74 }
75
76 /******************************************************************************/
77
78 #include "Api.h"
79 #include "TInterpreter.h"
80
81 void AliEveMacroExecutor::ExecMacros()
82 {
83   // Execute registered macros.
84
85   TIter next(fMacros);
86   AliEveMacro* mac;
87   while ((mac = (AliEveMacro*) next()))
88   {
89     // printf ("macro '%s'; func '%s'; args '%s'\n", mac->GetMacro().Data(), mac->GetFunc().Data(), mac->GetArgs().Data());
90
91     mac->ResetExecState();
92     
93     if (mac->GetActive() == kFALSE || mac->GetFunc().IsNull())
94     {
95       continue;
96     }
97
98     if ((mac->RequiresRunLoader() && ! AliEveEventManager::HasRunLoader()) ||
99         (mac->RequiresESD()       && ! AliEveEventManager::HasESD())       ||
100         (mac->RequiresESDfriend() && ! AliEveEventManager::HasESDfriend()) ||
101         (mac->RequiresRawReader() && ! AliEveEventManager::HasRawReader()) ||
102         (mac->RequiresAOD()       && ! AliEveEventManager::HasAOD()))
103     {
104       mac->SetExecNoData();
105       continue;
106     }
107
108     TString cmd(mac->FormForExec());
109     try
110     {
111       Long_t                   result = 0;
112       TInterpreter::EErrorCode error  = TInterpreter::kNoError;
113
114       result = gInterpreter->ProcessLine(cmd, &error);
115
116       // Try to fix broken cint state? Code taken form pyroot.
117       if (G__get_return(0) > G__RETURN_NORMAL)
118       {
119         printf ("*** FIXING CINT STATE AFTER RETURN ***\n");
120         G__security_recover(0);
121       }
122
123       if (error)
124       {
125         mac->SetExecError();
126         Error("ExecMacros", "Executing %s::%s, CINT error ... hopefully recovered.",
127               mac->GetMacro().Data(), cmd.Data());
128       }
129       else
130       {
131         TEveElement *el  = (TEveElement*) result;
132         TObject     *obj = dynamic_cast<TObject*>(el);
133         if (el != 0 && obj == 0)
134         {
135           Warning("ExecMacros", "Executing %s::%s, returned TEveElement seems bad, setting it to 0.",
136                   mac->GetMacro().Data(), cmd.Data());
137           el = 0;
138         }
139         mac->SetExecOK(el);
140       }
141     }
142     catch(TEveException& exc)
143     {
144       mac->SetExecException(exc);
145
146       // Try to fix broken cint state? Code taken form pyroot.
147       if (G__get_return(0) > G__RETURN_NORMAL)
148       {
149         printf ("*** FIXING CINT STATE AFTER EXCEPTION ***\n");
150         G__security_recover(0);
151       }
152
153       Error("ExecMacros", "Executing %s::%s, caught exception: '%s'.",
154             mac->GetMacro().Data(), cmd.Data(), exc.Data());
155     }
156   }
157 }