]>
Commit | Line | Data |
---|---|---|
f6afd0e1 | 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" | |
2be6d65c | 13 | #include "AliSysInfo.h" |
f6afd0e1 | 14 | |
15 | #include <TEveUtil.h> | |
16 | #include <TList.h> | |
17 | #include <TROOT.h> | |
18 | ||
a13d7c88 | 19 | #include <TEveManager.h> |
20 | #include <TGFileDialog.h> | |
21 | #include <TGMenu.h> | |
22 | ||
23 | #include <TSystem.h> | |
24 | #include <TPRegexp.h> | |
25 | #include <RVersion.h> | |
26 | ||
27 | ||
f6afd0e1 | 28 | //______________________________________________________________________________ |
f6afd0e1 | 29 | // |
68ca2fe7 | 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. | |
f6afd0e1 | 34 | |
35 | ClassImp(AliEveMacroExecutor) | |
36 | ||
37 | //______________________________________________________________________________ | |
38 | AliEveMacroExecutor::AliEveMacroExecutor() : | |
39 | TObject(), | |
40 | fMacros(new TList) | |
41 | { | |
42 | // Constructor. | |
43 | ||
44 | fMacros->SetOwner(kTRUE); | |
45 | } | |
46 | ||
47 | //______________________________________________________________________________ | |
48 | AliEveMacroExecutor::~AliEveMacroExecutor() | |
49 | { | |
50 | // Destructor. | |
51 | ||
52 | delete fMacros; | |
53 | } | |
54 | ||
55 | /******************************************************************************/ | |
56 | ||
57 | void AliEveMacroExecutor::AddMacro(AliEveMacro* mac) | |
58 | { | |
59 | // Add a new macro. Ownership transfered to the executor. | |
60 | ||
61 | static const TEveException kEH("AliEveMacroExecutor::AddMacro "); | |
62 | ||
63 | const TString mname = mac->GetMacro(); | |
64 | if ( ! mname.IsNull() && TEveUtil::CheckMacro(mname) == kFALSE) | |
65 | { | |
a13d7c88 | 66 | TEveUtil::LoadMacro(mname); |
f6afd0e1 | 67 | } |
68 | fMacros->Add(mac); | |
69 | } | |
70 | ||
7b2d546e | 71 | AliEveMacro* AliEveMacroExecutor::FindMacro(const TString& func) |
72 | { | |
73 | // Find macro with given function name (it is supposed to be unique). | |
74 | // Returns 0 if not found. | |
75 | ||
76 | TIter next(fMacros); | |
77 | AliEveMacro* mac; | |
78 | while ((mac = (AliEveMacro*) next())) | |
79 | { | |
80 | if (mac->GetFunc() == func) | |
81 | return mac; | |
82 | } | |
83 | return 0; | |
84 | } | |
85 | ||
f6afd0e1 | 86 | /******************************************************************************/ |
87 | ||
a13d7c88 | 88 | void AliEveMacroExecutor::RemoveMacros() |
89 | { | |
90 | fMacros->Clear(); | |
91 | } | |
92 | ||
93 | /******************************************************************************/ | |
94 | ||
f6afd0e1 | 95 | #include "Api.h" |
96 | #include "TInterpreter.h" | |
97 | ||
98 | void AliEveMacroExecutor::ExecMacros() | |
99 | { | |
100 | // Execute registered macros. | |
101 | ||
102 | TIter next(fMacros); | |
103 | AliEveMacro* mac; | |
104 | while ((mac = (AliEveMacro*) next())) | |
105 | { | |
106 | // printf ("macro '%s'; func '%s'; args '%s'\n", mac->GetMacro().Data(), mac->GetFunc().Data(), mac->GetArgs().Data()); | |
107 | ||
68ca2fe7 | 108 | mac->ResetExecState(); |
109 | ||
f6afd0e1 | 110 | if (mac->GetActive() == kFALSE || mac->GetFunc().IsNull()) |
111 | { | |
112 | continue; | |
113 | } | |
114 | ||
68ca2fe7 | 115 | if ((mac->RequiresRunLoader() && ! AliEveEventManager::HasRunLoader()) || |
116 | (mac->RequiresESD() && ! AliEveEventManager::HasESD()) || | |
117 | (mac->RequiresESDfriend() && ! AliEveEventManager::HasESDfriend()) || | |
08b0f222 | 118 | (mac->RequiresRawReader() && ! AliEveEventManager::HasRawReader()) || |
119 | (mac->RequiresAOD() && ! AliEveEventManager::HasAOD())) | |
f6afd0e1 | 120 | { |
68ca2fe7 | 121 | mac->SetExecNoData(); |
122 | continue; | |
f6afd0e1 | 123 | } |
124 | ||
125 | TString cmd(mac->FormForExec()); | |
126 | try | |
127 | { | |
68ca2fe7 | 128 | Long_t result = 0; |
129 | TInterpreter::EErrorCode error = TInterpreter::kNoError; | |
130 | ||
2be6d65c | 131 | AliSysInfo::AddStamp(Form("%s_%s_before",mac->GetMacro().Data(), mac->GetFunc().Data())); |
68ca2fe7 | 132 | result = gInterpreter->ProcessLine(cmd, &error); |
2be6d65c | 133 | AliSysInfo::AddStamp(Form("%s_%s_after",mac->GetMacro().Data(), mac->GetFunc().Data())); |
68ca2fe7 | 134 | |
f6afd0e1 | 135 | // Try to fix broken cint state? Code taken form pyroot. |
68ca2fe7 | 136 | if (G__get_return(0) > G__RETURN_NORMAL) |
137 | { | |
138 | printf ("*** FIXING CINT STATE AFTER RETURN ***\n"); | |
139 | G__security_recover(0); | |
140 | } | |
141 | ||
1d059662 | 142 | if (error != TInterpreter::kNoError) |
68ca2fe7 | 143 | { |
144 | mac->SetExecError(); | |
145 | Error("ExecMacros", "Executing %s::%s, CINT error ... hopefully recovered.", | |
146 | mac->GetMacro().Data(), cmd.Data()); | |
147 | } | |
148 | else | |
f6afd0e1 | 149 | { |
68ca2fe7 | 150 | TEveElement *el = (TEveElement*) result; |
151 | TObject *obj = dynamic_cast<TObject*>(el); | |
152 | if (el != 0 && obj == 0) | |
153 | { | |
154 | Warning("ExecMacros", "Executing %s::%s, returned TEveElement seems bad, setting it to 0.", | |
155 | mac->GetMacro().Data(), cmd.Data()); | |
156 | el = 0; | |
157 | } | |
158 | mac->SetExecOK(el); | |
f6afd0e1 | 159 | } |
160 | } | |
161 | catch(TEveException& exc) | |
162 | { | |
68ca2fe7 | 163 | mac->SetExecException(exc); |
164 | ||
165 | // Try to fix broken cint state? Code taken form pyroot. | |
166 | if (G__get_return(0) > G__RETURN_NORMAL) | |
167 | { | |
168 | printf ("*** FIXING CINT STATE AFTER EXCEPTION ***\n"); | |
169 | G__security_recover(0); | |
170 | } | |
171 | ||
f6afd0e1 | 172 | Error("ExecMacros", "Executing %s::%s, caught exception: '%s'.", |
173 | mac->GetMacro().Data(), cmd.Data(), exc.Data()); | |
174 | } | |
f6afd0e1 | 175 | } |
176 | } | |
a13d7c88 | 177 | |
178 | /******************************************************************************/ | |
179 | ||
180 | #include <iostream> | |
181 | #include <fstream> | |
182 | using namespace std; | |
183 | ||
184 | namespace | |
185 | { | |
186 | const char *gMacroSaveAsTypes[] = {"CINT Macro", "*.C", | |
187 | 0, 0}; | |
188 | } | |
189 | ||
190 | void AliEveMacroExecutor::SaveAddedMacros() | |
191 | { | |
192 | ||
193 | TGFileInfo fi; | |
194 | fi.fFileTypes = gMacroSaveAsTypes; | |
195 | fi.fIniDir = StrDup(""); // current directory | |
196 | fi.fFileTypeIdx = 0; | |
197 | fi.fOverwrite = kTRUE; | |
198 | new TGFileDialog(gClient->GetDefaultRoot(), gEve->GetMainWindow(), kFDSave, &fi); | |
199 | if (!fi.fFilename) return; | |
200 | ||
201 | TPMERegexp filere(".*/([^/]+$)"); | |
202 | if (filere.Match(fi.fFilename) != 2) | |
203 | { | |
204 | Warning("AliEvePopupHandler", "file '%s' bad.", fi.fFilename); | |
205 | return; | |
206 | } | |
207 | printf("Saving...\n"); | |
208 | ||
209 | TString file(filere[1]); | |
210 | TString file1; | |
211 | if (!file.EndsWith(".C")) | |
212 | file1 = file + ".C"; | |
213 | gSystem->ChangeDirectory(fi.fIniDir); | |
214 | ofstream myfile; | |
215 | myfile.open (file1); | |
216 | ||
217 | TIter next(fMacros); | |
218 | AliEveMacro* mac; | |
219 | ||
220 | ||
221 | myfile <<"//Macro generated automatically by AliEveMacroExecutor\n\n"; | |
222 | ||
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"; | |
228 | ||
229 | while ((mac = (AliEveMacro*) next())) | |
230 | { | |
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"; | |
234 | } | |
235 | ||
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"; | |
241 | ||
242 | myfile <<"\n}"; | |
243 | myfile.close(); | |
244 | printf("Saved...\n"); | |
245 | ||
246 | } |