]> git.uio.no Git - u/mrichter/AliRoot.git/blame_incremental - EVE/EveDet/AliEveTRDTrackListEditor.cxx
Changes for bug #70680: AliROOT Coverity DELETE_ARRAY checker fix
[u/mrichter/AliRoot.git] / EVE / EveDet / AliEveTRDTrackListEditor.cxx
... / ...
CommitLineData
1// Author: Benjamin Hess 29/01/2010
2
3/*************************************************************************
4 * Copyright (C) 2009-2010, Alexandru Bercuci, Benjamin Hess. *
5 * All rights reserved. *
6 *************************************************************************/
7
8//////////////////////////////////////////////////////////////////////////
9// //
10// AliEveTRDTrackListEditor //
11// //
12// The AliEveTRDTrackListEditor provides the graphical functionality //
13// for the AliEveTRDTrackList. It creates the tabs and canvases, when //
14// they are needed and, as well, frees allocated memory on destruction //
15// (or if new events are loaded and thus some tabs are closed). //
16// The function DrawHistos() accesses the temporary file created by the //
17// AliEveTRDTrackList and draws the desired data (the file will be //
18// created within the call of ApplyMacros()). Have a look at this //
19// function to learn more about the structure of the file and how to //
20// access the data. //
21//////////////////////////////////////////////////////////////////////////
22
23#include <EveDet/AliEveTRDData.h>
24#include <EveDet/AliEveTRDTrackList.h>
25#include "AliEveTRDTrackListEditor.h"
26
27#include <EveBase/AliEveEventManager.h>
28#include <AliTRDReconstructor.h>
29#include <AliTRDtrackV1.h>
30#include <TGButton.h>
31#include <TCanvas.h>
32#include <TEveBrowser.h>
33#include <TEveGedEditor.h>
34#include <TEveMacro.h>
35#include <TEveManager.h>
36#include <TFile.h>
37#include <TG3DLine.h>
38#include <TGButtonGroup.h>
39#include <TGFileDialog.h>
40#include <TGLabel.h>
41#include <TGListBox.h>
42#include <TGMsgBox.h>
43#include <TGTab.h>
44#include <TMap.h>
45#include <TObjString.h>
46#include <TROOT.h>
47#include <TSystem.h>
48#include <TGTextEntry.h>
49#include <TGTextEdit.h>
50#include <TGComboBox.h>
51#include <TGTextView.h>
52#include <TH1.h>
53#include <TTreeStream.h>
54
55
56ClassImp(AliEveTRDTrackListEditor)
57
58///////////////////////////////////////////////////////////
59///////////// AliEveTRDTrackListEditor //////////////////
60///////////////////////////////////////////////////////////
61AliEveTRDTrackListEditor::AliEveTRDTrackListEditor(const TGWindow* p, Int_t width, Int_t height,
62 UInt_t options, Pixel_t back) :
63 TGedFrame(p, width, height, options, back),
64 fM(0),
65 fHistoCanvas(0),
66 fHistoCanvasName(0),
67 fInheritedMacroList(0),
68 fInheritSettings(kFALSE),
69 fStyleFrame(0),
70 fMainFrame(0),
71 fHistoFrame(0),
72 fHistoSubFrame(0),
73 fBrowseFrame(0),
74 fbgStyleColor(0),
75 fbgStyleTrack(0),
76 frbColor(new TGRadioButton*[3]),
77 frbTrack(new TGRadioButton*[3]),
78 fbBrowse(0),
79 fbNew(0),
80 fbApplyMacros(0),
81 fbRemoveMacros(0),
82 fbDrawHisto(0),
83 fteField(0),
84 ftlMacroList(0),
85 ftlMacroSelList(0),
86 fFileInfo(0),
87 fFileTypes(0),
88 fLabel1(0), fLabel2(0), fLabel3(0), fLabel4(0),
89 fLine1(0), fLine2(0), fLine3(0), fLine4(0), fLine5(0),
90 fCheckButtons(0)
91{
92 // Creates the AliEveTRDTrackListEditor.
93
94 // Style stuff
95 fLine5 = new TGHorizontal3DLine(this, 194, 8);
96 AddFrame(fLine5, new TGLayoutHints(kLHintsLeft | kLHintsTop, 2, 2, 8, 8));
97 fStyleFrame = new TGHorizontalFrame(this);
98 AddFrame(fStyleFrame);
99
100 // Style - Track model
101 fbgStyleTrack = new TGButtonGroup(fStyleFrame, "Track model");
102 fbgStyleTrack->SetMapSubwindows(kTRUE);
103 fbgStyleTrack->Resize(194, 200);
104 fStyleFrame->AddFrame(fbgStyleTrack);
105
106 frbTrack[0] = new TGRadioButton(fbgStyleTrack, "Rieman", 0);
107 frbTrack[0]->SetToolTipText("Set the track model to \"Rieman\" (i.e. the used fit method)");
108 frbTrack[1] = new TGRadioButton(fbgStyleTrack, "Kalman", 1);
109 frbTrack[1]->SetToolTipText("Set the track model to \"Kalman\" (i.e. the used fit method)");
110 frbTrack[2] = new TGRadioButton(fbgStyleTrack, "Line", 2);
111 frbTrack[2]->SetToolTipText("Set the track model to \"Line\" (i.e. the used fit method)");
112
113 // Style - Color model
114 fbgStyleColor = new TGButtonGroup(fStyleFrame, "Color model");
115 fbgStyleColor->SetMapSubwindows(kTRUE);
116 fbgStyleColor->Resize(194, 200);
117 fStyleFrame->AddFrame(fbgStyleColor);
118
119 frbColor[0] = new TGRadioButton(fbgStyleColor, "PID LQ", 0);
120 frbColor[0]->SetToolTipText("Set color model to \"PID LQ\" -> 2 dimensional likelihood particle identification");
121 frbColor[1] = new TGRadioButton(fbgStyleColor, "PID NN", 1);
122 frbColor[1]->SetToolTipText("Set color model to \"PID NN\" -> Neural network particle identification");
123 frbColor[2] = new TGRadioButton(fbgStyleColor, "ESD Source", 2);
124 frbColor[2]->SetToolTipText("Set color model to \"ESD Source\" -> By source (TPC track prolongation or TRD stand alone)");
125
126 // Functionality for adding plugins
127 fMainFrame = CreateEditorTabSubFrame("Process");
128
129 fLabel1 = new TGLabel(fMainFrame,"Add plugin(s):");
130 fMainFrame->AddFrame(fLabel1);
131 fBrowseFrame = new TGHorizontalFrame(fMainFrame);
132
133 fteField = new TGTextEntry(fBrowseFrame);
134 fteField->SetToolTipText("Enter the pathname of the macro you want to add here and press \"Enter\"");
135 fteField->Connect("ReturnPressed()","AliEveTRDTrackListEditor", this, "HandleMacroPathSet()");
136 fBrowseFrame->AddFrame(fteField);
137
138 fbBrowse = new TGTextButton(fBrowseFrame, "Browse");
139 fbBrowse->SetToolTipText("Browse the macro you want to add");
140 fbBrowse->Connect("Clicked()", "AliEveTRDTrackListEditor", this, "BrowseMacros()");
141 fBrowseFrame->AddFrame(fbBrowse);
142
143 fbNew = new TGTextButton(fBrowseFrame, "New");
144 fbNew->SetToolTipText("Start macro creation wizard");
145 fbNew->Connect("Clicked()", "AliEveTRDTrackListEditor", this, "NewMacros()");
146 fBrowseFrame->AddFrame(fbNew);
147 fMainFrame->AddFrame(fBrowseFrame);
148
149 fLine1 = new TGHorizontal3DLine(fMainFrame, 194, 8);
150 fMainFrame->AddFrame(fLine1, new TGLayoutHints(kLHintsLeft | kLHintsTop, 2, 2, 8, 2));
151 fLabel2 = new TGLabel(fMainFrame,"Selection plugins:");
152 fMainFrame->AddFrame(fLabel2);
153
154 ftlMacroSelList = new TGListBox(fMainFrame);
155 ftlMacroSelList->Resize(194, 94);
156 ftlMacroSelList->SetMultipleSelections(kTRUE);
157 fMainFrame->AddFrame(ftlMacroSelList);
158
159 fLine2 = new TGHorizontal3DLine(fMainFrame, 194, 8);
160 fMainFrame->AddFrame(fLine2, new TGLayoutHints(kLHintsLeft | kLHintsTop, 2, 2, 8, 2));
161 fLabel3 = new TGLabel(fMainFrame,"Process plugins:");
162 fMainFrame->AddFrame(fLabel3);
163
164 ftlMacroList = new TGListBox(fMainFrame);
165 ftlMacroList->Resize(194, 94);
166 ftlMacroList->SetMultipleSelections(kTRUE);
167 fMainFrame->AddFrame(ftlMacroList);
168
169 fLine3 = new TGHorizontal3DLine(fMainFrame, 194, 8);
170 fMainFrame->AddFrame(fLine3, new TGLayoutHints(kLHintsLeft | kLHintsTop, 2, 2, 8, 2));
171
172 fbApplyMacros = new TGTextButton(fMainFrame, "Apply plugin(s)");
173 fbApplyMacros->SetToolTipText("Apply all selected macros/class functins to the list of tracks -> A data file will be generated");
174 fbApplyMacros->Connect("Clicked()", "AliEveTRDTrackListEditor", this, "ApplyMacros()");
175 fbApplyMacros->SetRightMargin(12);
176 fMainFrame->AddFrame(fbApplyMacros);
177
178 fbRemoveMacros = new TGTextButton(fMainFrame, "Remove plugin(s)");
179 fbRemoveMacros->SetToolTipText("Remove the selected macros/class functions from the list(s)");
180 fbRemoveMacros->Connect("Clicked()", "AliEveTRDTrackListEditor", this, "RemoveMacros()");
181 fMainFrame->AddFrame(fbRemoveMacros);
182
183 // Stuff for displaying histograms
184 fHistoFrame = CreateEditorTabSubFrame("Results");
185 fHistoFrame->SetMapSubwindows(kTRUE);
186 fLabel4 = new TGLabel(fHistoFrame,"Data from plugins:");
187 fHistoFrame->AddFrame(fLabel4);
188
189 fHistoSubFrame = new TGVerticalFrame(fHistoFrame);
190 fHistoSubFrame->SetMapSubwindows(kTRUE);
191 fHistoSubFrame->Resize(194, 200);
192 fHistoFrame->AddFrame(fHistoSubFrame);
193
194 fLine4 = new TGHorizontal3DLine(fHistoFrame, 194, 8);
195 fHistoFrame->AddFrame(fLine4, new TGLayoutHints(kLHintsLeft | kLHintsTop, 2, 2, 8, 2));
196
197 fbDrawHisto = new TGTextButton(fHistoFrame, "Draw projections");
198 fbDrawHisto->SetToolTipText("Uses the data file created by the last \"Apply selected plugin(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!");
199 fbDrawHisto->Connect("Clicked()", "AliEveTRDTrackListEditor", this, "DrawHistos()");
200 fHistoFrame->AddFrame(fbDrawHisto);
201
202 // Set up file dialog
203 fFileInfo = new TGFileInfo();
204 fFileInfo->SetMultipleSelection(kTRUE);
205
206 fFileTypes = new Char_t*[6];
207 fFileTypes[0] = (Char_t*)"All files"; fFileTypes[1] = (Char_t*)"*";
208 fFileTypes[2] = (Char_t*)"ROOT macros"; fFileTypes[3] = (Char_t*)"*.C";
209 fFileTypes[4] = 0; fFileTypes[5] = 0;
210 fFileInfo->fFileTypes = (const Char_t**)fFileTypes;
211 fFileInfo->fFileTypeIdx = 2;
212 fFileInfo->fMultipleSelection = kTRUE;
213
214 fHistoCanvasName = new TGString("");
215
216 // Handle style changed signals:
217 fbgStyleTrack->Connect("Clicked(Int_t)", "AliEveTRDTrackListEditor", this, "SetTrackModel(Int_t)");
218 fbgStyleColor->Connect("Clicked(Int_t)", "AliEveTRDTrackListEditor", this, "SetTrackColor(Int_t)");
219
220 // Handle the signal "Selected(Int_t ind)"
221 ftlMacroList->Connect("Selected(Int_t)", "AliEveTRDTrackListEditor", this, "UpdateMacroListSelection(Int_t)");
222 ftlMacroSelList->Connect("Selected(Int_t)", "AliEveTRDTrackListEditor", this, "UpdateMacroListSelection(Int_t)");
223
224 // Handle the signal "NewEventLoaded"
225 AliEveEventManager::GetMaster()->Connect("NewEventLoaded()", "AliEveTRDTrackListEditor", this, "HandleNewEventLoaded()");
226
227 // Handle the signal "Selected" (another tab has been selected)
228 GetGedEditor()->GetTab()->Connect("Selected(Int_t)", "AliEveTRDTrackListEditor", this, "HandleTabChangedToIndex(Int_t)");
229}
230
231//______________________________________________________
232AliEveTRDTrackListEditor::~AliEveTRDTrackListEditor()
233{
234 // Destructor: Closes all tabs created by this object and
235 // frees the corresponding memory.
236
237 if (fFileTypes != 0)
238 {
239 delete [] fFileTypes;
240 fFileTypes = 0;
241 }
242
243 if (fFileInfo != 0)
244 {
245 delete fFileInfo;
246 fFileInfo = 0;
247 }
248 // Close and delete all tabs that have been created by this class
249 CloseTabs();
250
251 if (fHistoCanvasName != 0)
252 {
253 delete fHistoCanvasName;
254 fHistoCanvasName = 0;
255 }
256 if (fInheritedMacroList != 0)
257 {
258 fInheritedMacroList->Delete();
259 delete fInheritedMacroList;
260 fInheritedMacroList = 0;
261 }
262}
263
264//______________________________________________________
265void AliEveTRDTrackListEditor::AddMacro(const Char_t* name, const Char_t* path)
266{
267 // Adds the macro path/name to the macro list. A warning is provided, if there is
268 // something wrong, e.g. if the macro does not have the correct signature.
269 Int_t result = fM->AddMacro(path, name);
270
271 switch (result)
272 {
273 case SUCCESS:
274 UpdateMacroList();
275 break;
276 case WARNING:
277 new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Warning", "Macro is already in list (won't be added again)!",
278 kMBIconExclamation, kMBOk);
279 break;
280 case ERROR:
281 new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Error", "Failed to load the macro (check messages in the terminal)!",
282 kMBIconExclamation, kMBOk);
283 break;
284 case SIGNATURE_ERROR:
285 new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Error",
286 "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*)",
287 kMBIconExclamation, kMBOk);
288 break;
289 case NOT_EXIST_ERROR:
290 new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Error",
291 "File does not exist or you do not have read permission!", kMBIconExclamation, kMBOk);
292 break;
293 default:
294 new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Error",
295 Form("AliEveTRDTrackList::AddMacro exited with unknown return value: %d", result),
296 kMBIconExclamation, kMBOk);
297 break;
298 }
299}
300
301//______________________________________________________
302void AliEveTRDTrackListEditor::ApplyMacros()
303{
304 // Applies the selected macros and updates the view.
305
306 Bool_t success = kFALSE;
307
308 // First apply the single track selection macros
309 TList* selIterator = new TList();
310 ftlMacroSelList->GetSelectedEntries(selIterator);
311 fM->ApplySTSelectionMacros(selIterator);
312
313 // Update view
314 gEve->Redraw3D();
315
316 // Now apply the process macros
317 TList* procIterator = new TList();
318 ftlMacroList->GetSelectedEntries(procIterator);
319 success = fM->ApplyProcessMacros(selIterator, procIterator);
320
321 // Update histogram tab (data has to be reloaded)
322 SetModel(fM);
323 Update();
324
325 // AlieveTRDTrackList::ApplyProcessMacros() automatically selects a macro -> Draw the histogram for it,
326 // if a process macro has been applied
327 if (success && procIterator->GetEntries() > 0)
328 {
329 // Set focus on "Histograms" tab
330 GetGedEditor()->GetTab()->SetTab("Results");
331
332 DrawHistos();
333 }
334
335 if (selIterator != 0) delete selIterator;
336 selIterator = 0;
337 if (procIterator != 0) delete procIterator;
338 procIterator = 0;
339
340 if (!success)
341 {
342 new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Error",
343 "AliEveTRDTrackList::ApplyProcessMacros experienced an error (cf. CINT-output)!",
344 kMBIconExclamation, kMBOk);
345 }
346}
347
348//______________________________________________________
349void AliEveTRDTrackListEditor::NewMacros()
350{
351 // Start the macro creation wizard.
352 // thanks to Jacek Otwinowski<J.Otwinowski@GSI.DE> for this suggestion
353
354 AliEveTRDMacroWizard *wizz = new AliEveTRDMacroWizard();
355 wizz->Connect("Create(Char_t*)", "AliEveTRDTrackListEditor", this, "AddMacro(Char_t*)");
356}
357
358
359//______________________________________________________
360void AliEveTRDTrackListEditor::BrowseMacros()
361{
362 // Creates a file-dialog. The selected files will be added to the macro list
363 // via AddMacro(...).
364
365 new TGFileDialog(gClient->GetRoot(), GetMainFrame(), kFDOpen, fFileInfo);
366
367 if (fFileInfo->fIniDir != 0 && fFileInfo->fFileNamesList != 0)
368 {
369 // Extract filenames
370 TObject* iter = fFileInfo->fFileNamesList->First();
371
372 Char_t* name = 0;
373
374 while (iter != 0)
375 {
376 // NOTE: fileInfo->fFileNamesList will be changed by that, too!
377 name = (Char_t*)strrchr(iter->GetName(), '/');
378 // Delete '"' at the end
379 name[strlen(name)] = '\0';
380
381 AddMacro(name + 1, fFileInfo->fIniDir);
382 iter = (TObjString*)fFileInfo->fFileNamesList->After(iter);
383 }
384 }
385
386 // -> The following problem has been fixed (trunk -> Changes according to 03 September 2008):
387 // Some error occurs, when one ends the filedialog with "cancel": fileInfo->fFileNamesList is set to 0x0, but
388 // in the next launch no new memory is allocated. So do this manually.
389 //if (fileInfo->fFileNamesList == 0) fileInfo->fFileNamesList = new TList();
390}
391
392//______________________________________________________
393void AliEveTRDTrackListEditor::CloseTabs()
394{
395 // Closes + deletes the tabs created by this object
396
397 if (fHistoCanvas != 0)
398 {
399 // Close the created tab, if it exists
400 if (fHistoCanvasName != 0)
401 {
402 if (gEve->GetBrowser()->GetTab(1)->SetTab(fHistoCanvasName->GetString()))
403 {
404 // Now the created tab is the current one and can be deleted
405 gEve->GetBrowser()->GetTab(1)->RemoveTab();
406 }
407 }
408 // With the tab removal, the canvas will be deleted automatically!
409 fHistoCanvas = 0;
410 }
411}
412
413//______________________________________________________
414void AliEveTRDTrackListEditor::DrawHistos()
415{
416 // Accesses the temporary data file created by the last call of ApplyMacros() and draws
417 // histograms according to the selection in the "Histograms"-tab.
418
419 Int_t nHistograms = GetNSelectedHistograms();
420 if (nHistograms <= 0)
421 {
422 new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Error",
423 "No data selected. Please select the data you want to plot!", kMBIconExclamation, kMBOk);
424 return;
425 }
426 if (nHistograms > 3)
427 {
428 new TGMsgBox(gClient->GetRoot(), GetMainFrame(),
429 "Error", "Only histograms with up to 3 dimensions supported. Please select 1,2 or 3 data macros!",
430 kMBIconExclamation, kMBOk);
431 return;
432 }
433
434 // Check, if a histo macro shall be drawn
435 Int_t indexOfHistoMacro = -1;
436 Int_t selectedChecked = 0;
437 for (Int_t j = 0; j < fM->fDataFromMacroList->GetEntries(); j++)
438 {
439 if (fCheckButtons[j]->TGButton::GetState() == kButtonDown)
440 {
441 selectedChecked++;
442
443 // Histo macro? -> To check this, look for the substring "(histo macro)"
444 if (strstr(fM->fDataFromMacroList->At(j)->GetName(), "(histo macro)") != 0)
445 {
446 // Is also another macro selected?
447 if (nHistograms > 1)
448 {
449 // Histo macros cannot(!) be correlated!
450 new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Error - Draw histograms",
451 "Histo macros (return value \"TH1*\") cannot be combined with other macros",
452 kMBIconExclamation, kMBOk);
453 return;
454 }
455
456 // Mark this histo macro for drawing
457 indexOfHistoMacro = j;
458
459 // Have all selected macros been checked? -> If yes, we are done with this
460 if (selectedChecked == nHistograms) break;
461 }
462 }
463 }
464
465 TFile* file = new TFile(Form("/tmp/TRD.TrackListMacroData_%s.root", gSystem->Getenv("USER")), "READ");
466 if (!file)
467 {
468 Error("Draw histograms", Form("Cannot open file \"/tmp/TRD.TrackListMacroData_%s.root\"",
469 gSystem->Getenv("USER")));
470 new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Error - Draw histograms",
471 Form("Cannot open file \"/tmp/TRD.TrackListMacroData_%s.root\"", gSystem->Getenv("USER")),
472 kMBIconExclamation, kMBOk);
473 return;
474 }
475
476 TTree* t = 0;
477 TTree* tFriend1 = 0;
478 TTree* tFriend2 = 0;
479
480 Int_t indexOfMacro1 = 0;
481 Int_t indexOfMacro2 = 0;
482 Int_t indexOfMacro3 = 0;
483
484 // Variable for the loop below -> Will be set to aborting value, if a histo macro is drawn
485 Int_t i = 0;
486
487 // Draw histo macro?
488 if (indexOfHistoMacro >= 0)
489 {
490 if ((t = (TTree*)file->Get(Form("TrackData%d", indexOfHistoMacro))))
491 {
492 SetDrawingToHistoCanvasTab();
493
494 TH1* myHist = 0;
495 t->SetBranchAddress(Form("Macro%d", indexOfHistoMacro), &myHist);
496 t->GetEntry(0);
497 if (myHist != 0) myHist->Draw();
498 else
499 {
500 Error("Draw histograms", Form("No histogram for histo macro \"%s\" found!",
501 fM->fDataFromMacroList->At(indexOfHistoMacro)->GetName()));
502 new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Error - Draw histograms",
503 Form("No histogram for histo macro \"%s\" found!",
504 fM->fDataFromMacroList->At(indexOfHistoMacro)->GetName()), kMBIconExclamation, kMBOk);
505
506 }
507
508 UpdateHistoCanvasTab();
509 }
510 else
511 {
512 Error("Draw histograms", Form("No data for histo macro \"%s\" found!\nMaybe no tracks have been selected.",
513 fM->fDataFromMacroList->At(indexOfHistoMacro)->GetName()));
514 new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Error - Draw histograms",
515 Form("No data for histo macro \"%s\" found!\nMaybe no tracks have been selected.",
516 fM->fDataFromMacroList->At(indexOfHistoMacro)->GetName()), kMBIconExclamation, kMBOk);
517 }
518
519 // Skip the loop below
520 i = fM->fDataFromMacroList->GetEntries();
521 }
522
523 // Load the trees in succession and remember the entries -> Plot the analyse macros
524 for ( ; i < fM->fDataFromMacroList->GetEntries(); i++)
525 {
526 if (fCheckButtons[i]->TGButton::GetState() == kButtonDown)
527 {
528 if (t == 0)
529 {
530 indexOfMacro1 = i;
531 if (!(t = (TTree*)file->Get(Form("TrackData%d", i))))
532 {
533 Error("Draw histograms", Form("No data for macro \"%s\" found!\nMaybe no tracks have been selected.",
534 fM->fDataFromMacroList->At(i)->GetName()));
535 new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Error - Draw histograms",
536 Form("No data for macro \"%s\" found!\nMaybe no tracks have been selected.",
537 fM->fDataFromMacroList->At(i)->GetName()), kMBIconExclamation, kMBOk);
538 break;
539 }
540
541 // 1d histogram
542 if (nHistograms == 1)
543 {
544 SetDrawingToHistoCanvasTab();
545
546 t->Draw(Form("Macro%d", indexOfMacro1), "1");
547 ((TH1*)gPad->GetPrimitive("htemp"))->SetTitle(Form("%s;%s",
548 fM->fDataFromMacroList->At(indexOfMacro1)->GetName(),
549 fM->fDataFromMacroList->At(indexOfMacro1)->GetName()));
550 UpdateHistoCanvasTab();
551
552 break;
553 }
554 }
555 else if (tFriend1 == 0)
556 {
557 indexOfMacro2 = i;
558 if (!(tFriend1 = (TTree*)file->Get(Form("TrackData%d", i))))
559 {
560 Error("Draw histograms", Form("No data for macro \"%s\" found!\nMaybe no tracks have been selected.",
561 fM->fDataFromMacroList->At(i)->GetName()));
562 new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Error - Draw histograms",
563 Form("No data for macro \"%s\" found!\nMaybe no tracks have been selected.",
564 fM->fDataFromMacroList->At(i)->GetName()),
565 kMBIconExclamation, kMBOk);
566 break;
567 }
568
569 // 2d histogram
570 if (nHistograms == 2)
571 {
572 SetDrawingToHistoCanvasTab();
573
574 t->AddFriend(tFriend1);
575 t->Draw(Form("Macro%d:Macro%d", indexOfMacro1, indexOfMacro2), "1");
576 ((TH1*)gPad->GetPrimitive("htemp"))->SetTitle(Form("%s - %s;%s;%s",
577 fM->fDataFromMacroList->At(indexOfMacro2)->GetName(),
578 fM->fDataFromMacroList->At(indexOfMacro1)->GetName(),
579 fM->fDataFromMacroList->At(indexOfMacro2)->GetName(),
580 fM->fDataFromMacroList->At(indexOfMacro1)->GetName()));
581
582 UpdateHistoCanvasTab();
583
584 break;
585 }
586 }
587 // 3d histogram
588 else
589 {
590 indexOfMacro3 = i;
591 if (!(tFriend2 = (TTree*)file->Get(Form("TrackData%d", i))))
592 {
593 Error("Draw histograms", Form("No data for macro \"%s\" found!\nMaybe no tracks have been selected.",
594 fM->fDataFromMacroList->At(i)->GetName()));
595 new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Error - Draw histograms",
596 Form("No data for macro \"%s\" found!\nMaybe no tracks have been selected.",
597 fM->fDataFromMacroList->At(i)->GetName()), kMBIconExclamation, kMBOk);
598 break;
599 }
600
601 SetDrawingToHistoCanvasTab();
602
603 t->AddFriend(tFriend1);
604 t->AddFriend(tFriend2);
605 t->Draw(Form("Macro%d:Macro%d:Macro%d", indexOfMacro1, indexOfMacro2, indexOfMacro3), "1");
606 ((TH1*)gPad->GetPrimitive("htemp"))->SetTitle(Form("%s - %s - %s;%s;%s;%s",
607 fM->fDataFromMacroList->At(indexOfMacro3)->GetName(),
608 fM->fDataFromMacroList->At(indexOfMacro2)->GetName(),
609 fM->fDataFromMacroList->At(indexOfMacro1)->GetName(),
610 fM->fDataFromMacroList->At(indexOfMacro3)->GetName(),
611 fM->fDataFromMacroList->At(indexOfMacro2)->GetName(),
612 fM->fDataFromMacroList->At(indexOfMacro1)->GetName()));
613
614 UpdateHistoCanvasTab();
615
616 break;
617 }
618 }
619 }
620
621 if (t != 0) delete t;
622 t = 0;
623 if (tFriend1 != 0) delete tFriend1;
624 tFriend1 = 0;
625 if (tFriend2 != 0) delete tFriend2;
626 tFriend2 = 0;
627
628 file->Close("R");
629 delete file;
630 file = 0;
631}
632
633//______________________________________________________
634Int_t AliEveTRDTrackListEditor::GetNSelectedHistograms() const
635{
636 // Returns the number of selected macros (or rather: of their selected data) in the "Histograms"-tab
637
638 Int_t count = 0;
639
640 for (Int_t i = 0; i < fM->fDataFromMacroList->GetEntries(); i++)
641 {
642 if (fCheckButtons[i]->TGButton::GetState() == kButtonDown) count++;
643 }
644
645 return count;
646}
647
648//______________________________________________________
649void AliEveTRDTrackListEditor::HandleMacroPathSet()
650{
651 // Takes the input of the text field (adding a macro), checks if the macro can be
652 // accessed (and that it exists) and adds the macro to the macro list via AddMacro(...).
653 // You can use environment variables in the text field, e.g. "$ALICE_ROOT/Eve/alice-macro/myMacro.C".
654
655 if (strlen(fteField->GetText()) != 0)
656 {
657 // Expand the pathname
658 Char_t* systemPath = gSystem->ExpandPathName(fteField->GetText());
659 fteField->SetText(systemPath);
660 delete systemPath;
661 systemPath = 0;
662
663 // Check if file exists
664 FILE* fp = NULL;
665
666 fp = fopen(fteField->GetText(), "rb");
667 if (fp != NULL)
668 {
669 fclose(fp);
670
671 // Extract filename
672 Char_t* name = (Char_t*)strrchr(fteField->GetText(), '/');
673
674 // Current path
675 if (name == NULL)
676 {
677 name = new Char_t[AliEveTRDTrackList::fkMaxMacroNameLength];
678 memset(name, '\0', sizeof(Char_t) * AliEveTRDTrackList::fkMaxMacroNameLength);
679 sprintf(name, "%s", fteField->GetText());
680
681 // Add path to textfield -> Path is "./" -> Use length for the name + 2
682 Char_t pathname[AliEveTRDTrackList::fkMaxMacroNameLength + 2];
683 memset(pathname, '\0', sizeof(Char_t) * (AliEveTRDTrackList::fkMaxMacroNameLength + 2));
684 sprintf(pathname, "./%s", fteField->GetText());
685 fteField->SetText(pathname);
686
687 AddMacro(name);
688 if (name != 0) delete [] name;
689 name = 0;
690 }
691 // Different path
692 else
693 {
694 // Extract path
695 Char_t* path = new Char_t[AliEveTRDTrackList::fkMaxMacroPathLength];
696 memset(path, '\0', sizeof(Char_t) * AliEveTRDTrackList::fkMaxMacroPathLength);
697 strncpy(path, fteField->GetText(), strlen(fteField->GetText()) - strlen(name));
698
699 // Ignore the slash "/" in name
700 AddMacro(name + 1, path);
701
702 if (path != 0) delete path;
703 path = 0;
704 }
705 }
706 else
707 {
708 new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Error",
709 "File does not exist or you do not have read permission!", kMBIconExclamation, kMBOk);
710 }
711 }
712}
713
714//______________________________________________________
715void AliEveTRDTrackListEditor::HandleNewEventLoaded()
716{
717 // Closes the tabs created by this object and sets a flag that will
718 // cause the function SetModel() to inherit the macro lists + style
719 // for the next AliEveTRDTrackList from the current one.
720
721 // Inherit the macro list and track style for the next track list!
722 fInheritSettings = kTRUE;
723
724 // Close the tabs
725 CloseTabs();
726}
727
728//______________________________________________________
729void AliEveTRDTrackListEditor::HandleTabChangedToIndex(Int_t index)
730{
731 // Saves the current tab in the current AliEveTRDTrackList.
732
733 fM->SetSelectedTab(index);
734}
735
736//______________________________________________________
737void AliEveTRDTrackListEditor::InheritMacroList()
738{
739 // The old macro list is possibly stored in the corresponding interior map. This function will
740 // use this interior map to move the data from the interior map to the newly loaded AliEveTRDTrackList.
741 // Then the interior map will be cleaned up. With this, the settings will be inherited from the previously
742 // loaded AliEveTRDTrackList.
743
744 if (fInheritedMacroList == 0) return;
745
746 // Clear list
747 fM->fMacroList->Delete();
748
749 // Store data from interior list in the track list's map
750 TMapIter* iter = (TMapIter*)fInheritedMacroList->MakeIterator();
751
752 TObject* key = 0;
753 TMacroData* macro = 0;
754
755 while ((key = iter->Next()) != 0)
756 {
757 macro = (TMacroData*)fInheritedMacroList->GetValue(key);
758 if (macro != 0) fM->fMacroList->Add(new TObjString(key->GetName()),
759 new TMacroData(macro->GetName(), macro->GetPath(), macro->GetType()));
760 else
761 {
762 Error("AliEveTRDTrackListEditor::InheritMacroList", Form("Failed to inherit the macro \"%s\"!", key->GetName()));
763 }
764 }
765
766 fInheritedMacroList->Delete();
767 delete fInheritedMacroList;
768 fInheritedMacroList = 0;
769}
770
771//______________________________________________________
772void AliEveTRDTrackListEditor::InheritStyle()
773{
774 // The old styles are stored in the corresponding button groups. This function will replace
775 // the style settings of the newly loaded AliEveTRDTrackList with the old styles. With this, the settings
776 // will be inherited from the previously loaded AliEveTRDTrackList.
777
778 for (Int_t ind = 0; ind < 3; ind++)
779 {
780 if (fbgStyleTrack->GetButton(ind)->IsOn())
781 {
782 SetTrackModel(ind);
783 break;
784 }
785 }
786 for (Int_t ind = 0; ind < 3; ind++)
787 {
788 if (fbgStyleColor->GetButton(ind)->IsOn())
789 {
790 SetTrackColor(ind);
791 break;
792 }
793 }
794}
795
796//______________________________________________________
797void AliEveTRDTrackListEditor::RemoveMacros()
798{
799 // Removes the selected macros from the corresponding list.
800
801 TList* iterator = new TList();
802
803 ftlMacroList->GetSelectedEntries(iterator);
804 fM->RemoveSelectedMacros(iterator);
805
806 if (iterator != 0) delete iterator;
807
808 iterator = new TList();
809 ftlMacroSelList->GetSelectedEntries(iterator);
810 fM->RemoveSelectedMacros(iterator);
811
812 // Selected macros are deleted from the list -> No selected entries left
813 fM->fMacroListSelected = 0;
814
815 UpdateMacroList();
816
817 if (iterator != 0) delete iterator;
818 iterator = 0;
819}
820
821//______________________________________________________
822void AliEveTRDTrackListEditor::SaveMacroList(TMap* list)
823{
824 // Saves the provided macro list in an interior list. This list will be used by
825 // InheritMacroList() to restore the data in "list". With this method one is able
826 // to inherit the macro list from track list to track list (i.e. from event to event).
827
828 if (fInheritedMacroList != 0)
829 {
830 fInheritedMacroList->Delete();
831 delete fInheritedMacroList;
832 }
833 fInheritedMacroList = new TMap();
834 fInheritedMacroList->SetOwnerKeyValue(kTRUE, kTRUE);
835
836 TMapIter* iter = (TMapIter*)list->MakeIterator();
837 TObject* key = 0;
838 TMacroData* macro = 0;
839
840 while ((key = iter->Next()) != 0)
841 {
842 macro = (TMacroData*)fM->fMacroList->GetValue(key);
843 if (macro != 0) fInheritedMacroList->Add(new TObjString(key->GetName()),
844 new TMacroData(macro->GetName(), macro->GetPath(), macro->GetType()));
845 else
846 {
847 Error("AliEveTRDTrackListEditor::SaveMacroList", Form("Failed to inherit the macro \"%s\"!", key->GetName()));
848 }
849 }
850}
851
852//______________________________________________________
853void AliEveTRDTrackListEditor::SetDrawingToHistoCanvasTab()
854{
855 // Sets gPad to the tab with the name of the current AliEveTRDTrackList. If this tab does
856 // not exist, it will be created. Otherwise, it is re-used.
857
858 // If the tab with the canvas has been closed, the canvas will be deleted.
859 // So, if there is no tab, set the canvas pointer to zero and recreate it in a new tab.
860 if (fHistoCanvas != 0)
861 {
862 if (gEve->GetBrowser()->GetTab(1)->SetTab(fHistoCanvasName->GetString()) == 0)
863 {
864 fHistoCanvas = 0;
865 }
866 }
867
868 if (!fHistoCanvas)
869 {
870 fHistoCanvas = gEve->AddCanvasTab(fM->GetName());
871 }
872
873 gPad = fHistoCanvas;
874}
875
876//______________________________________________________
877void AliEveTRDTrackListEditor::SetModel(TObject* obj)
878{
879 // Sets the model object, updates the related data in the GUI and
880 // inherits settings (cf. Inherit*(...)), if the flag fInheritSettings is set to kTRUE.
881
882 fM = dynamic_cast<AliEveTRDTrackList*>(obj);
883
884 if (fM == 0)
885 {
886 Error("SetModel", "Parameter is zero pointer");
887 return;
888 }
889
890 // Provide a pointer to this editor
891 fM->fEditor = this;
892
893 // If macro list + track style shall be inherited from previously loaded track list, do so
894 if (fInheritSettings)
895 {
896 InheritMacroList();
897 InheritStyle();
898
899 fInheritSettings = kFALSE;
900 }
901
902 // Select the correct styles
903 Int_t b = 0;
904 UChar_t style = fM->GetSelectedTrackStyle();
905 if (TESTBIT(style, AliEveTRDTrack::kSource)) b = 2;
906 else
907 {
908 if (TESTBIT(style, AliEveTRDTrack::kPID)) b = 1;
909 else b = 0;
910 }
911 fbgStyleColor->SetButton(b, kTRUE);
912
913
914 if (TESTBIT(style, AliEveTRDTrack::kTrackCosmics)) b = 2;
915 else
916 {
917 if (TESTBIT(style, AliEveTRDTrack::kTrackModel)) b = 1;
918 else b = 0;
919 }
920 fbgStyleTrack->SetButton(b, kTRUE);
921
922 UpdateMacroList();
923 UpdateHistoList();
924
925 // View correct tab
926 GetGedEditor()->GetTab()->SetTab(fM->GetSelectedTab());
927}
928
929//______________________________________________________
930void AliEveTRDTrackListEditor::SetTrackColor(Int_t ind)
931{
932 // Sets the color model for the tracks, updates the tracks with this model and
933 // redraws the scene.
934
935 switch(ind)
936 {
937 case AliTRDpidUtil::kLQ:
938 fM->UpdateTrackStyle(AliEveTRDTrack::kPID, AliTRDpidUtil::kLQ);
939 break;
940 case AliTRDpidUtil::kNN:
941 fM->UpdateTrackStyle(AliEveTRDTrack::kPID, AliTRDpidUtil::kNN);
942 break;
943 default:
944 fM->UpdateTrackStyle(AliEveTRDTrack::kSource);
945 break;
946 }
947
948 gEve->Redraw3D();
949}
950
951//______________________________________________________
952void AliEveTRDTrackListEditor::SetTrackModel(Int_t ind)
953{
954 // Sets the track model for the tracks, updates the tracks with this model and
955 // redraws the scene.
956
957 switch(ind)
958 {
959 case AliEveTRDTrack::kRieman:
960 fM->UpdateTrackStyle(AliEveTRDTrack::kTrackModel, AliEveTRDTrack::kRieman);
961 break;
962 case AliEveTRDTrack::kKalman:
963 fM->UpdateTrackStyle(AliEveTRDTrack::kTrackModel, AliEveTRDTrack::kKalman);
964 break;
965 default:
966 fM->UpdateTrackStyle(AliEveTRDTrack::kTrackCosmics);
967 break;
968 }
969
970 gEve->Redraw3D();
971}
972
973//______________________________________________________
974void AliEveTRDTrackListEditor::UpdateDataFromMacroListSelection()
975{
976 // Saves the current selection in the "Histograms"-tab to the current
977 // AliEveTRDTrackList. This means that the selection is updated and won't
978 // get lost, if another editor is loaded in Eve.
979
980 for (Int_t i = 0; i < fM->fDataFromMacroList->GetEntries(); i++)
981 {
982 fM->SetHistoDataSelection(i, fCheckButtons[i]->IsOn());
983 }
984}
985
986//______________________________________________________
987void AliEveTRDTrackListEditor::UpdateHistoCanvasTab()
988{
989 // Updates the histogram and the corresponding tab (including titles).
990
991 // Update name of the tab (tab has been set to current tab!)
992 fHistoCanvasName->SetString(fM->GetName());
993
994 // Use a copy of fHistoCanvasName!! -> If the user closes a tab manually, the TGString
995 // will be deleted -> Error might occur, when accessing the pointer
996 gEve->GetBrowser()->GetTab(1)->GetCurrentTab()->SetText(new TGString(fHistoCanvasName));
997
998 // Switch tabs to force redrawing
999 gEve->GetBrowser()->GetTab(1)->SetTab(0);
1000 gEve->GetBrowser()->GetTab(1)->SetTab(fHistoCanvasName->GetString());
1001 fHistoCanvas->Update();
1002}
1003
1004//______________________________________________________
1005void AliEveTRDTrackListEditor::UpdateHistoList()
1006{
1007 // Reloads (updates) the buttons in the "Histograms"-tab via
1008 // the current AliEveTRDTrackList (data).
1009
1010 fHistoSubFrame->TGCompositeFrame::Cleanup();
1011
1012 // Set buttons for histograms
1013 if (fCheckButtons != 0) delete fCheckButtons;
1014 fCheckButtons = new TGCheckButton*[fM->fDataFromMacroList->GetEntries()];
1015
1016 TObjString* iter = (TObjString*)fM->fDataFromMacroList->First();
1017 for (Int_t i = 0; i < fM->fDataFromMacroList->GetEntries() && iter != 0; i++)
1018 {
1019 fCheckButtons[i] = new TGCheckButton(fHistoSubFrame, iter->GetName());
1020 fHistoSubFrame->AddFrame(fCheckButtons[i]);
1021
1022 fCheckButtons[i]->SetState(kButtonUp, kFALSE);
1023 fCheckButtons[i]->MapRaised();
1024 fCheckButtons[i]->SetOn(fM->HistoDataIsSelected(i));
1025 fCheckButtons[i]->Connect("Clicked()", "AliEveTRDTrackListEditor", this, "UpdateDataFromMacroListSelection()");
1026
1027 iter = (TObjString*)fM->fDataFromMacroList->After(iter);
1028 }
1029}
1030
1031//______________________________________________________
1032void AliEveTRDTrackListEditor::UpdateMacroList()
1033{
1034 // Reloads (updates) the macro list (selection AND process macros) via
1035 // the current AliEveTRDTrackList (data).
1036
1037 ftlMacroList->RemoveAll();
1038 ftlMacroSelList->RemoveAll();
1039
1040 TMapIter* iter = (TMapIter*)fM->fMacroList->MakeIterator();
1041 TObject* key = 0;
1042 TMacroData* macro = 0;
1043
1044 Int_t ind = 0;
1045 while ((key = iter->Next()) != 0)
1046 {
1047 macro = (TMacroData*)fM->fMacroList->GetValue(key);
1048 if (macro != 0)
1049 {
1050 if (macro->IsProcessMacro())
1051 {
1052 ftlMacroList->AddEntry(macro->GetName(), ind);
1053 // Select, what has been selected before
1054 ftlMacroList->Select(ind, fM->MacroListIsSelected(ind));
1055 ind++;
1056 }
1057 else if (macro->IsSelectionMacro())
1058 {
1059 ftlMacroSelList->AddEntry(macro->GetName(), ind);
1060 // Select, what has been selected before
1061 ftlMacroSelList->Select(ind, fM->MacroListIsSelected(ind));
1062 ind++;
1063 }
1064 else
1065 {
1066 Error("AliEveTRDTrackListEditor::UpdateMacroList()",
1067 Form("Macro \"%s/%s.C\" is neither a selection macro nor a process macro!",
1068 macro->GetPath(), macro->GetName()));
1069 }
1070 }
1071 else
1072 {
1073 Error("AliEveTRDTrackListEditor::UpdateMacroList()",
1074 Form("Macro list is corrupted: Macro \"%s\" not found!", key->GetName()));
1075 }
1076 }
1077
1078 ftlMacroList->SortByName();
1079 ftlMacroSelList->SortByName();
1080}
1081
1082//______________________________________________________
1083void AliEveTRDTrackListEditor::UpdateMacroListSelection(Int_t ind)
1084{
1085 // Saves the current selection in the macro listS to the current
1086 // AliEveTRDTrackList. This means that the selection is updated and won't
1087 // get lost, if another editor is loaded in Eve.
1088 // NOTE: The indices in BOTH lists will be unique!
1089
1090 // Toggle selected item
1091 fM->SetMacroListSelection(ind, !fM->MacroListIsSelected(ind));
1092}
1093
1094
1095//______________________________________________________
1096//______________________________________________________
1097//______________________________________________________
1098
1099
1100/////////////////////////////////////////////////
1101ClassImp(AliEveTRDMacroWizard)
1102/////////////////////////////////////////////////
1103
1104//______________________________________________________
1105AliEveTRDMacroWizard::AliEveTRDMacroWizard(const TGWindow* p)
1106 :TGMainFrame(p ? p : gClient->GetRoot(), 10, 10, kMainFrame | kVerticalFrame)
1107 ,fText(0x0)
1108 ,fCombo(0x0)
1109 ,fTextEdit(0x0)
1110 ,fbCreate(0x0)
1111 ,fbCancel(0x0)
1112{
1113 // Creates the macro wizard.
1114
1115 const Int_t width = 300;
1116
1117 // horizontal frame
1118 TGHorizontalFrame *fFrameName = new TGHorizontalFrame(this, 10, 10, kHorizontalFrame);
1119 TGLabel *fLabel = new TGLabel(fFrameName, "Name*");
1120 fLabel->SetTextJustify(36);
1121 fLabel->SetMargins(0,0,0,0);
1122 fLabel->SetWrapLength(-1);
1123 fFrameName->AddFrame(fLabel, new TGLayoutHints(kLHintsLeft | kLHintsTop,2,2,2,2));
1124
1125 fText = new TGTextEntry(fFrameName);
1126 fText->SetMaxLength(255);
1127 fText->SetAlignment(kTextLeft);
1128 fText->SetText("");
1129 fText->Resize(width, fText->GetDefaultHeight());
1130 fFrameName->AddFrame(fText, new TGLayoutHints(kLHintsRight | kLHintsTop,2,2,2,2));
1131
1132
1133 // horizontal frame
1134 TGHorizontalFrame *fFrameComment = new TGHorizontalFrame(this,10,10,kHorizontalFrame);
1135 fLabel = new TGLabel(fFrameComment, "Comment");
1136 fLabel->SetTextJustify(36);
1137 fLabel->SetMargins(0,0,0,0);
1138 fLabel->SetWrapLength(-1);
1139 fFrameComment->AddFrame(fLabel, new TGLayoutHints(kLHintsLeft | kLHintsTop,2,2,2,2));
1140
1141 fTextEdit = new TGTextEdit(fFrameComment, width, 5*fText->GetDefaultHeight());
1142 fFrameComment->AddFrame(fTextEdit, new TGLayoutHints(kLHintsRight | kLHintsTop,2,2,2,2));
1143
1144 // horizontal frame
1145 TGHorizontalFrame *fFrameType = new TGHorizontalFrame(this,10,10,kHorizontalFrame);
1146 fLabel = new TGLabel(fFrameType, "Type*");
1147 fLabel->SetTextJustify(36);
1148 fLabel->SetMargins(0,0,0,0);
1149 fLabel->SetWrapLength(-1);
1150 fFrameType->AddFrame(fLabel, new TGLayoutHints(kLHintsLeft | kLHintsTop,2,2,2,2));
1151
1152 fCombo = new TGComboBox(fFrameType, -1, kHorizontalFrame | kSunkenFrame | kDoubleBorder | kOwnBackground);
1153 fCombo->AddEntry("Single Track Selection", AliEveTRDTrackList::kSingleTrackSelect);
1154 fCombo->AddEntry("Pair Tracks Selection", AliEveTRDTrackList::kCorrelTrackSelect);
1155 fCombo->AddEntry("Single Track Analyse", AliEveTRDTrackList::kSingleTrackAnalyse);
1156 fCombo->AddEntry("Single Track Histo", AliEveTRDTrackList::kSingleTrackHisto);
1157 fCombo->AddEntry("Pair Tracks Analyse", AliEveTRDTrackList::kCorrelTrackAnalyse);
1158 fCombo->AddEntry("Pair Tracks Histo", AliEveTRDTrackList::kCorrelTrackHisto);
1159 fCombo->Select(-1);
1160 fCombo->Resize(width, fText->GetDefaultHeight());
1161 fFrameType->AddFrame(fCombo, new TGLayoutHints(kLHintsRight | kLHintsTop,2,2,2,2));
1162
1163 // horizontal frame
1164 TGHorizontalFrame *fFrameAction = new TGHorizontalFrame(this,10,10,kHorizontalFrame);
1165 fbCancel = new TGTextButton(fFrameAction, "Cancel");
1166 fbCancel->SetToolTipText("Exit macro creation wizard");
1167 fFrameAction->AddFrame(fbCancel, new TGLayoutHints(kLHintsRight | kLHintsTop,2,2,2,2));
1168 fbCreate = new TGTextButton(fFrameAction, "Done");
1169 fbCreate->SetToolTipText("Use settings to create the macro");
1170 fFrameAction->AddFrame(fbCreate, new TGLayoutHints(kLHintsRight | kLHintsTop,2,2,2,2));
1171
1172
1173 // horizontal frame
1174 TGHorizontalFrame *fFrameText = new TGHorizontalFrame(this,10,10,kHorizontalFrame);
1175 fLabel = new TGLabel(fFrameText, "(*) Mandatory fields");
1176 fLabel->SetTextJustify(36);
1177 fLabel->SetMargins(0,0,0,0);
1178 fLabel->SetWrapLength(-1);
1179 fFrameText->AddFrame(fLabel, new TGLayoutHints(kLHintsLeft | kLHintsTop,2,2,2,2));
1180
1181 // put things together
1182 AddFrame(fFrameName, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsExpandX,2,2,2,2));
1183 AddFrame(fFrameComment, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsExpandX,2,2,2,2));
1184 AddFrame(fFrameType, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsExpandX,2,2,2,2));
1185 AddFrame(fFrameAction, new TGLayoutHints(kLHintsRight | kLHintsTop | kLHintsExpandX,2,2,2,2));
1186
1187 TGHorizontal3DLine *fLine = new TGHorizontal3DLine(this, 281, 2);
1188 AddFrame(fLine, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsExpandX,2,2,2,2));
1189 AddFrame(fFrameText, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsExpandX,2,2,2,2));
1190
1191
1192 SetWindowName("TRD Macro Wizard");
1193 SetMWMHints(kMWMDecorAll,
1194 kMWMFuncAll,
1195 kMWMInputModeless);
1196 MapSubwindows();
1197
1198 Resize(GetDefaultSize());
1199 MapWindow();
1200
1201 // Do the linking
1202 //fCombo->Connect("Selected(Int_t)", "AliEveTRDMacroWizard", this, "Create(Int_t)");
1203 fbCreate->Connect("Clicked()", "AliEveTRDMacroWizard", this, "HandleCreate()");
1204 fbCancel->Connect("Clicked()", "AliEveTRDMacroWizard", this, "CloseWindow()");
1205
1206 // Standard choice
1207 fCombo->Select(1, kFALSE);
1208}
1209
1210const Char_t *fIncludes =
1211"#if !defined(__CINT__) || defined(__MAKECINT__)\n"
1212"#include <TROOT.h>\n"
1213"#include <TH1.h>\n"
1214"#include <TRD/AliTRDgeometry.h>\n"
1215"#include <TRD/AliTRDcluster.h>\n"
1216"#include <TRD/AliTRDseedV1.h>\n"
1217"#include <TRD/AliTRDtrackV1.h>\n"
1218"#endif\n";
1219
1220const Char_t *fMacroTemplate[7] = {
1221""
1222," if (!track) return kFALSE;\n"
1223
1224," n = 0;\n"
1225" r = 0x0;\n"
1226" if (!track) return;\n"
1227
1228," if (!track) return 0x0;\n"
1229" TH1* h = 0x0;\n\n"
1230"// Set bins, xmin and xmax here\n"
1231" Int_t n = 1;\n"
1232" Double_t xmin = 0;\n"
1233" Double_t xmax = 100;\n\n"
1234" if(!(h = (TH1*)gROOT->FindObject(\"h\"))){\n"
1235" h = new TH1(\"h\", \"Title\", n, xmin, xmax);\n"
1236" h->GetXaxis()->SetTitle("");\n"
1237" h->GetYaxis()->SetTitle("");\n"
1238" } else h->Reset();\n"
1239
1240," if (!track) return kFALSE;\n"
1241" if (!track2) return kFALSE;\n"
1242
1243," n = 0;\n"
1244" r = 0x0;\n"
1245" if (!track) return;\n"
1246" if (!track2) return;\n"
1247
1248," if (!track) return 0x0;\n"
1249" if (!track2) return 0x0;\n"
1250" TH1* h = 0x0;\n\n"
1251"// Set bins, xmin and xmax here\n"
1252" Int_t n = 1;\n"
1253" Double_t xmin = 0;\n"
1254" Double_t xmax = 100;\n\n"
1255" if(!(h = (TH1*)gROOT->FindObject(\"h\"))){\n"
1256" h = new TH1(\"h\", \"Title\", n, xmin, xmax);\n"
1257" h->GetXaxis()->SetTitle("");\n"
1258" h->GetYaxis()->SetTitle("");\n"
1259" } else h->Reset();\n"
1260};
1261//______________________________________________________
1262void AliEveTRDMacroWizard::Create(Int_t type)
1263{
1264 // Creates the macro with the selected type (combo box).
1265
1266 const Char_t *name = fText->GetText();
1267 if(strcmp(name,"")==0){
1268 AliInfo("Please specify a name for your macro.");
1269 new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Error",
1270 "Please specify a name for your macro.", kMBIconExclamation, kMBOk);
1271 //fCombo->Select(-1);
1272 return;
1273 }
1274
1275 // Note: gSystem->AccessPathName(...) returns kTRUE, if the access FAILED!
1276 if(!gSystem->AccessPathName(Form("./%s.C", name))){
1277 // If there is already a file with this name -> Error
1278 AliInfo(Form("A macro \"%s.C\" already exists in the current directory!\nPlease choose another name!", name));
1279 new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Error",
1280 Form("A macro \"%s.C\" already exists in the current directory!\nPlease choose another name!", name), kMBIconExclamation, kMBOk);
1281 //fCombo->Select(-1);
1282 return;
1283 }
1284
1285 FILE* fp = 0x0;
1286 if(!(fp = fopen(Form("%s.C", name), "wt"))){
1287 AliInfo("Couldn't create macro file.");
1288 new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Error",
1289 "Couldn't create macro file.", kMBIconExclamation, kMBOk);
1290 //fCombo->Select(-1);
1291 return;
1292 }
1293
1294 TGText *comment = fTextEdit->GetText();
1295 Char_t *line = 0x0; Int_t iline = 0;
1296 while((line = comment->GetLine(TGLongPosition(0,iline++), 200))) fprintf(fp, "// %s\n", line);
1297
1298 fprintf(fp, "\n%s\n", fIncludes);
1299
1300 switch(type){
1301 case AliEveTRDTrackList::kSingleTrackSelect:
1302 fprintf(fp, "Bool_t %s(const AliTRDtrackV1 *track)\n", name);
1303 break;
1304 case AliEveTRDTrackList::kCorrelTrackSelect:
1305 fprintf(fp, "Bool_t %s(const AliTRDtrackV1 *track, const AliTRDtrackV1 *track2)\n", name);
1306 break;
1307 case AliEveTRDTrackList::kSingleTrackAnalyse:
1308 fprintf(fp, "void %s(const AliTRDtrackV1 *track, Double_t*& r, Int_t& n)\n", name);
1309 break;
1310 case AliEveTRDTrackList::kSingleTrackHisto:
1311 fprintf(fp, "TH1* %s(const AliTRDtrackV1 *track)\n", name);
1312 break;
1313 case AliEveTRDTrackList::kCorrelTrackAnalyse:
1314 fprintf(fp, "void %s(const AliTRDtrackV1 *track, const AliTRDtrackV1 *track2, Double_t*& r, Int_t& n)\n", name);
1315 break;
1316 case AliEveTRDTrackList::kCorrelTrackHisto:
1317 fprintf(fp, "TH1* %s(const AliTRDtrackV1 *track, const AliTRDtrackV1 *track2)\n", name);
1318 break;
1319 default:
1320 AliInfo(Form("Unknown type[%d]", type));
1321 new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Error",
1322 Form("Unknown type[%d]", type), kMBIconExclamation, kMBOk);
1323 fclose(fp);
1324 gSystem->Exec(Form("rm -f %s.C", name));
1325 //fCombo->Select(-1);
1326 return;
1327 }
1328
1329 fprintf(fp, "{\n%s\n", fMacroTemplate[type]);
1330 fprintf(fp, "// add your own code here\n\n\n}\n");
1331 fclose(fp);
1332
1333 Emit("Create(Int_t)", type);
1334 Create((Char_t*)name);
1335 CloseWindow();
1336}
1337
1338//______________________________________________________
1339void AliEveTRDMacroWizard::Create(Char_t *name)
1340{
1341 // Emits the creation signal.
1342
1343 Emit("Create(Char_t*)", Form("%s.C", name));
1344}
1345
1346//______________________________________________________
1347void AliEveTRDMacroWizard::HandleCreate()
1348{
1349 // Handles the signal, when the creation button is pressed.
1350
1351 Create(fCombo->GetSelected());
1352}