7a47c0dd9fc2a8b2692da32164f48bf2c50b83a3
[u/mrichter/AliRoot.git] / EVE / EveDet / AliEveTRDTrackListEditor.cxx
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
56 ClassImp(AliEveTRDTrackListEditor)
57
58 ///////////////////////////////////////////////////////////
59 /////////////   AliEveTRDTrackListEditor //////////////////
60 ///////////////////////////////////////////////////////////
61 AliEveTRDTrackListEditor::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 //______________________________________________________
232 AliEveTRDTrackListEditor::~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 //______________________________________________________
265 void 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 //______________________________________________________
302 void 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 //______________________________________________________
349 void 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 //______________________________________________________
360 void 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 //______________________________________________________
393 void 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 //______________________________________________________
414 void 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 //______________________________________________________
634 Int_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 //______________________________________________________
649 void 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 //______________________________________________________
715 void 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 //______________________________________________________
729 void AliEveTRDTrackListEditor::HandleTabChangedToIndex(Int_t index)
730 {
731   // Saves the current tab in the current AliEveTRDTrackList.
732
733   fM->SetSelectedTab(index);
734 }
735
736 //______________________________________________________
737 void 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 //______________________________________________________
772 void 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 //______________________________________________________
797 void 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 //______________________________________________________
822 void 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 //______________________________________________________
853 void 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 //______________________________________________________
877 void 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 //______________________________________________________
930 void 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 //______________________________________________________
952 void 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 //______________________________________________________
974 void 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 //______________________________________________________
987 void 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 //______________________________________________________
1005 void 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 //______________________________________________________
1032 void 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 //______________________________________________________
1083 void 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 /////////////////////////////////////////////////
1101 ClassImp(AliEveTRDMacroWizard)
1102 /////////////////////////////////////////////////
1103
1104 //______________________________________________________
1105 AliEveTRDMacroWizard::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
1210 const 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
1220 const 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 //______________________________________________________
1262 void 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 //______________________________________________________
1339 void AliEveTRDMacroWizard::Create(Char_t *name)
1340 {
1341   // Emits the creation signal.
1342
1343   Emit("Create(Char_t*)", Form("%s.C", name));
1344 }
1345
1346 //______________________________________________________
1347 void AliEveTRDMacroWizard::HandleCreate()
1348 {
1349   // Handles the signal, when the creation button is pressed.
1350
1351   Create(fCombo->GetSelected());
1352 }