2 // Author: Matevz Tadel 2007
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 **************************************************************************/
10 #include "AliEveMacroExecutor.h"
11 #include "AliEveMacro.h"
12 #include "AliEveEventManager.h"
13 #include "AliSysInfo.h"
19 #include <TEveManager.h>
20 #include <TGFileDialog.h>
28 //______________________________________________________________________________
30 // Contains a list of AliEveMacros.
31 // The macros are added via AddMacro() and are owned by the executor.
32 // The macros can be executed via ExecMacros().
33 // They are executed in order in which they are registered.
35 ClassImp(AliEveMacroExecutor)
37 //______________________________________________________________________________
38 AliEveMacroExecutor::AliEveMacroExecutor() :
44 fMacros->SetOwner(kTRUE);
47 //______________________________________________________________________________
48 AliEveMacroExecutor::~AliEveMacroExecutor()
55 /******************************************************************************/
57 void AliEveMacroExecutor::AddMacro(AliEveMacro* mac)
59 // Add a new macro. Ownership transfered to the executor.
61 static const TEveException kEH("AliEveMacroExecutor::AddMacro ");
63 const TString mname = mac->GetMacro();
64 if ( ! mname.IsNull() && TEveUtil::CheckMacro(mname) == kFALSE)
66 TEveUtil::LoadMacro(mname);
71 AliEveMacro* AliEveMacroExecutor::FindMacro(const TString& func)
73 // Find macro with given function name (it is supposed to be unique).
74 // Returns 0 if not found.
78 while ((mac = (AliEveMacro*) next()))
80 if (mac->GetFunc() == func)
86 /******************************************************************************/
88 void AliEveMacroExecutor::RemoveMacros()
93 /******************************************************************************/
96 #include "TInterpreter.h"
98 void AliEveMacroExecutor::ExecMacros()
100 // Execute registered macros.
104 while ((mac = (AliEveMacro*) next()))
106 // printf ("macro '%s'; func '%s'; args '%s'\n", mac->GetMacro().Data(), mac->GetFunc().Data(), mac->GetArgs().Data());
108 mac->ResetExecState();
110 if (mac->GetActive() == kFALSE || mac->GetFunc().IsNull())
115 if ((mac->RequiresRunLoader() && ! AliEveEventManager::HasRunLoader()) ||
116 (mac->RequiresESD() && ! AliEveEventManager::HasESD()) ||
117 (mac->RequiresESDfriend() && ! AliEveEventManager::HasESDfriend()) ||
118 (mac->RequiresRawReader() && ! AliEveEventManager::HasRawReader()) ||
119 (mac->RequiresAOD() && ! AliEveEventManager::HasAOD()))
121 mac->SetExecNoData();
125 TString cmd(mac->FormForExec());
129 TInterpreter::EErrorCode error = TInterpreter::kNoError;
131 AliSysInfo::AddStamp(Form("%s_%s_before",mac->GetMacro().Data(), mac->GetFunc().Data()));
132 result = gInterpreter->ProcessLine(cmd, &error);
133 AliSysInfo::AddStamp(Form("%s_%s_after",mac->GetMacro().Data(), mac->GetFunc().Data()));
135 // Try to fix broken cint state? Code taken form pyroot.
136 if (G__get_return(0) > G__RETURN_NORMAL)
138 printf ("*** FIXING CINT STATE AFTER RETURN ***\n");
139 G__security_recover(0);
142 if (error != TInterpreter::kNoError)
145 Error("ExecMacros", "Executing %s::%s, CINT error ... hopefully recovered.",
146 mac->GetMacro().Data(), cmd.Data());
150 TEveElement *el = (TEveElement*) result;
151 TObject *obj = dynamic_cast<TObject*>(el);
152 if (el != 0 && obj == 0)
154 Warning("ExecMacros", "Executing %s::%s, returned TEveElement seems bad, setting it to 0.",
155 mac->GetMacro().Data(), cmd.Data());
161 catch(TEveException& exc)
163 mac->SetExecException(exc);
165 // Try to fix broken cint state? Code taken form pyroot.
166 if (G__get_return(0) > G__RETURN_NORMAL)
168 printf ("*** FIXING CINT STATE AFTER EXCEPTION ***\n");
169 G__security_recover(0);
172 Error("ExecMacros", "Executing %s::%s, caught exception: '%s'.",
173 mac->GetMacro().Data(), cmd.Data(), exc.Data());
178 /******************************************************************************/
186 const char *gMacroSaveAsTypes[] = {"CINT Macro", "*.C",
190 void AliEveMacroExecutor::SaveAddedMacros()
194 fi.fFileTypes = gMacroSaveAsTypes;
195 fi.fIniDir = StrDup(""); // current directory
197 fi.fOverwrite = kTRUE;
198 new TGFileDialog(gClient->GetDefaultRoot(), gEve->GetMainWindow(), kFDSave, &fi);
199 if (!fi.fFilename) return;
201 TPMERegexp filere(".*/([^/]+$)");
202 if (filere.Match(fi.fFilename) != 2)
204 Warning("AliEvePopupHandler", "file '%s' bad.", fi.fFilename);
207 printf("Saving...\n");
209 TString file(filere[1]);
211 if (!file.EndsWith(".C"))
213 gSystem->ChangeDirectory(fi.fIniDir);
221 myfile <<"//Macro generated automatically by AliEveMacroExecutor\n\n";
223 myfile <<"void "<<file<<"(){\n\n";
224 myfile <<" AliEveMacroExecutor *exec = AliEveEventManager::GetMaster()->GetExecutor();\n";
225 myfile <<" exec->RemoveMacros();\n";
226 myfile <<" TEveBrowser *browser = gEve->GetBrowser();\n";
227 myfile <<" browser->ShowCloseTab(kFALSE);\n";
229 while ((mac = (AliEveMacro*) next()))
231 myfile <<" exec->AddMacro(new AliEveMacro("<<mac->GetSources()<<", "<<char(34)<<mac->GetTags()<<char(34)<<", "
232 <<char(34)<<mac->GetMacro()<<char(34)<<", "<<char(34)<<mac->GetFunc()<<char(34)<<", "<<char(34)<<mac->GetArgs()
233 <<char(34)<<", "<<mac->GetActive()<<"));\n\n";
236 myfile <<" TEveWindowSlot *slot = TEveWindow::CreateWindowInTab(browser->GetTabRight());\n";
237 myfile <<" slot->StartEmbedding();\n";
238 myfile <<" AliEveMacroExecutorWindow* exewin = new AliEveMacroExecutorWindow(exec);\n";
239 myfile <<" slot->StopEmbedding("<<char(34)<<"DataSelection"<<char(34)<<");\n";
240 myfile <<" exewin->PopulateMacros();\n\n";
244 printf("Saved...\n");