]> git.uio.no Git - u/mrichter/AliRoot.git/blob - EVE/EveBase/AliEveEventSelectorWindow.cxx
From Mikolaj. Some fixes of event-selector. Document classes.
[u/mrichter/AliRoot.git] / EVE / EveBase / AliEveEventSelectorWindow.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-2008, ALICE Experiment at CERN, all rights reserved. *
3  * See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for          *
4  * full copyright notice.                                                 *
5  **************************************************************************/
6
7 ///////////////////////////////////////////////////////////////////////////
8 //
9 //  implementation of a GUI for the event/trigger selection
10 //
11 //  origin: Mikolaj Krzewicki, mikolaj.krzewicki@cern.ch
12 //
13 //////////////////////////////////////////////////////////////////////////
14
15 #include "AliEveEventSelectorWindow.h"
16 #include "AliEveEventSelector.h"
17 #include "AliEveEventManager.h"
18 #include <TGTextEntry.h>
19 #include <TGNumberEntry.h>
20 #include <TRootEmbeddedCanvas.h>
21 #include <TCanvas.h>
22 #include <TGButton.h>
23 #include <TGComboBox.h>
24 #include <TGLabel.h>
25 #include <TTree.h>
26 #include <AliESDEvent.h>
27 #include <AliESDRun.h>
28 #include <TH1.h>
29 #include <TDirectory.h>
30 #include <TROOT.h>
31
32 ClassImp(AliEveEventSelectorWindow)
33 //______________________________________________________________________________
34 AliEveEventSelectorWindow::AliEveEventSelectorWindow(const TGWindow *p, UInt_t w, UInt_t h,
35                                                      AliEveEventSelector* sel) :
36     TGMainFrame(p, w, h),
37     fPSelector(sel),
38     fPCanvas(NULL),
39     fPDrawFormula(NULL),
40     fPEntryFormula(NULL),
41     fPEntryLowerBound(NULL),
42     fPEntryHigherBound(NULL),
43     fPButtonTextDone(NULL),
44     fPComboBoxTrigger(NULL),
45     fPEntryTriggerSelection(NULL),
46     fPCheckTriggerSimple(NULL),
47     fPCheckTriggerString(NULL)
48 {
49   //ctor
50
51   //the canvas
52   fPCanvas = new TRootEmbeddedCanvas(0,this);
53   Int_t wid = fPCanvas->GetCanvasWindowId();
54   TCanvas *myc = new TCanvas("MyCanvas", 10,10,wid);
55   fPCanvas->AdoptCanvas(myc);
56   AddFrame(fPCanvas, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY));
57
58   //draw box frame
59   TGHorizontalFrame* hframedraw = new TGHorizontalFrame(this);
60   AddFrame(hframedraw, new TGLayoutHints((kLHintsExpandX), 5,5));
61
62   TGLabel* drawlabel = new TGLabel(hframedraw, "Draw expression:");
63   hframedraw->AddFrame(drawlabel, new TGLayoutHints((kLHintsLeft)));
64   fPDrawFormula = new TGTextEntry(hframedraw);
65   hframedraw->AddFrame(fPDrawFormula, new TGLayoutHints(kLHintsExpandX));
66   TGTextButton* buttondraw = new TGTextButton(hframedraw,"Draw");
67   buttondraw->Connect("Clicked()","AliEveEventSelectorWindow",
68                               this, "DoDrawHistogram()");
69   hframedraw->AddFrame(buttondraw, new TGLayoutHints(kLHintsLeft));
70   TGTextButton* buttonview = new TGTextButton(hframedraw,"Browse");
71   buttonview->Connect("Clicked()","TTree",fPSelector->GetESDTree(),"StartViewer()");
72   hframedraw->AddFrame(buttonview, new TGLayoutHints(kLHintsLeft));
73
74
75   //text selection frame
76   TGHorizontalFrame *hframetxtsel = new TGHorizontalFrame(this);
77   AddFrame(hframetxtsel, new TGLayoutHints((kLHintsExpandX), 5,5));
78
79   TGLabel* exprlabel = new TGLabel(hframetxtsel, "Expression:");
80   hframetxtsel->AddFrame(exprlabel, new TGLayoutHints(kLHintsLeft));
81
82   TGCheckButton* checktextsel = new TGCheckButton(hframetxtsel);
83   checktextsel->Connect("Toggled(Bool_t)", "AliEveEventSelector",
84                         fPSelector, "SetSelectOnString(Bool_t)");
85   checktextsel->SetState(fPSelector->GetSelectOnString() ? kButtonDown : kButtonUp);
86   hframetxtsel->AddFrame(checktextsel, new TGLayoutHints(kLHintsLeft));
87
88   fPEntryLowerBound = new TGNumberEntry(hframetxtsel);
89   hframetxtsel->AddFrame(fPEntryLowerBound, new TGLayoutHints(kLHintsLeft));
90   fPEntryFormula = new TGTextEntry(hframetxtsel);
91   hframetxtsel->AddFrame(fPEntryFormula, new TGLayoutHints(kLHintsExpandX));
92   fPEntryHigherBound = new TGNumberEntry(hframetxtsel);
93   hframetxtsel->AddFrame(fPEntryHigherBound, new TGLayoutHints(kLHintsLeft));
94   fPButtonTextDone = new TGTextButton(hframetxtsel,"Set");
95   fPButtonTextDone->Connect("Clicked()", "AliEveEventSelectorWindow",
96                             this, "DoSetSelectionString()");
97   hframetxtsel->AddFrame(fPButtonTextDone, new TGLayoutHints(kLHintsLeft));
98
99   //trigger cuts frame
100   TGHorizontalFrame* hframetrigger = new TGHorizontalFrame(this);
101   AddFrame(hframetrigger, new TGLayoutHints((kLHintsLeft), 5,5));
102
103   TGLabel* triglabel = new TGLabel(hframetrigger, "Trigger type:");
104   hframetrigger->AddFrame(triglabel, new TGLayoutHints(kLHintsLeft));
105   fPCheckTriggerSimple = new TGCheckButton(hframetrigger);
106   fPCheckTriggerSimple->Connect("Toggled(Bool_t)","AliEveEventSelector",
107                           fPSelector,"SetSelectOnTriggerType(Bool_t)");
108   fPCheckTriggerSimple->SetState(fPSelector->GetSelectOnTriggerType() ? kButtonDown : kButtonUp );
109   hframetrigger->AddFrame(fPCheckTriggerSimple, new TGLayoutHints(kLHintsLeft));
110   fPComboBoxTrigger = new TGComboBox(hframetrigger);
111   fPComboBoxTrigger->Resize(100,20);
112   fPComboBoxTrigger->Connect("Selected(const char*)","AliEveEventSelectorWindow",
113                              this,"DoHandleTriggerFromComboBox(const char*)");
114   hframetrigger->AddFrame(fPComboBoxTrigger, new TGLayoutHints(kLHintsLeft));
115
116   TGLabel* labelfreetrig = new TGLabel(hframetrigger, "Trigger type expression:");
117   hframetrigger->AddFrame(labelfreetrig, new TGLayoutHints(kLHintsLeft));
118   fPCheckTriggerString = new TGCheckButton(hframetrigger);
119   hframetrigger->AddFrame(fPCheckTriggerString, new TGLayoutHints(kLHintsLeft));
120   fPCheckTriggerString->Connect("Toggled(Bool_t)","AliEveEventSelector",
121                            fPSelector,"SetSelectOnTriggerString(Bool_t)");
122   fPCheckTriggerString->SetState(fPSelector->GetSelectOnTriggerString() ? kButtonDown : kButtonUp );
123   fPEntryTriggerSelection = new TGTextEntry(hframetrigger);
124   hframetrigger->AddFrame(fPEntryTriggerSelection, new TGLayoutHints(kLHintsExpandX));
125   TGTextButton* buttontrigsel = new TGTextButton(hframetrigger,"Set");
126   hframetrigger->AddFrame(buttontrigsel, new TGLayoutHints(kLHintsLeft));
127   buttontrigsel->Connect("Clicked()","AliEveEventSelectorWindow",
128                          this, "DoSetTriggerSelectionString()");
129
130   //multiplicity cuts frame
131   TGHorizontalFrame* hframemult = new TGHorizontalFrame(this);
132   AddFrame(hframemult, new TGLayoutHints((kLHintsLeft), 5,5));
133
134   TGLabel* multlabel = new TGLabel(hframemult, "Multiplicity:");
135   hframemult->AddFrame(multlabel, new TGLayoutHints(kLHintsLeft));
136   TGCheckButton* checkmult = new TGCheckButton(hframemult);
137   checkmult->Connect("Toggled(Bool_t)", "AliEveEventSelector",
138                       fPSelector,"SetSelectOnMultiplicity(Bool_t)");
139   checkmult->SetState(fPSelector->GetSelectOnMultiplicity() ? kButtonDown : kButtonUp );
140   hframemult->AddFrame(checkmult, new TGLayoutHints(kLHintsLeft));
141   fPEntryMultLow = new TGNumberEntry(hframemult);
142   hframemult->AddFrame(fPEntryMultLow, new TGLayoutHints(kLHintsLeft));
143   fPEntryMultHigh = new TGNumberEntry(hframemult);
144   hframemult->AddFrame(fPEntryMultHigh, new TGLayoutHints(kLHintsLeft));
145   TGTextButton* buttonmultset = new TGTextButton(hframemult,"Set");
146   hframemult->AddFrame(buttonmultset, new TGLayoutHints(kLHintsLeft));
147   buttonmultset->Connect("Clicked()","AliEveEventSelectorWindow",
148                          this, "DoSetMultiplicityRange()");
149
150   //wrap around
151   TGHorizontalFrame* hframewrap = new TGHorizontalFrame(this);
152   AddFrame(hframewrap, new TGLayoutHints((kLHintsLeft), 5,5));
153
154   TGLabel* wraplabel = new TGLabel(hframewrap, "Wrap around at the end.");
155   hframewrap->AddFrame(wraplabel, new TGLayoutHints(kLHintsLeft));
156   TGCheckButton* checkwraparound = new TGCheckButton(hframewrap);
157   hframewrap->AddFrame(checkwraparound, new TGLayoutHints(kLHintsLeft));
158   checkwraparound->Connect("Toggled(Bool_t)","AliEveEventSelector",
159                            fPSelector, "SetWrapAround(Bool_t)");
160   checkwraparound->SetState(fPSelector->GetWrapAround() ? kButtonDown : kButtonUp );
161
162   SetupTriggerSelect();
163   
164   //bookkeeping
165   SetWindowName("Event Selection");
166   MapSubwindows();
167
168   Resize(GetDefaultSize());
169   MapWindow();
170 }
171
172 //______________________________________________________________________________
173 AliEveEventSelectorWindow::~AliEveEventSelectorWindow()
174 {
175   //dtor
176 }
177
178 //______________________________________________________________________________
179 void AliEveEventSelectorWindow::SetupTriggerSelect()
180
181   //Set up the list of available triggers
182
183   // Do nothing if already enabled.
184   if (fPComboBoxTrigger->GetNumberOfEntries() > 0)
185     return;
186   AliEveEventManager* fM = fPSelector->GetEventManager();
187   AliESDEvent* esd = fM->GetESD();
188     
189   if (esd && fM->GetESDFile() != 0)
190   { 
191     TString activetrg = esd->GetESDRun()->GetActiveTriggerClasses();  //Get list of active classes
192     TObjArray* activetrgarr = activetrg.Tokenize(" "); //break up the classes string, space as separator
193     Int_t entries = activetrgarr->GetEntries();  //how many triggerclasses
194     TString entry;  //to hold the triger class name
195     TObjString* entryobj;
196     if (entries == 0)
197     {
198       fPComboBoxTrigger->SetEnabled(kFALSE);  //no trigger classes
199     }
200     else
201     {
202       fPComboBoxTrigger->RemoveAll(); //some initial cleanup
203       fPComboBoxTrigger->SetEnabled(kTRUE);  //no trigger classes
204       //fPComboBoxTrigger->AddEntry("",-1);  //first entry empty - select to not filter by trigger
205       for (Int_t i=0;i<entries;i++)
206       {
207         entryobj = (TObjString*)activetrgarr->At(i);
208         entry = entryobj->GetString();
209         fPComboBoxTrigger->AddEntry(entry.Data(), i);
210       }
211     }
212     fPComboBoxTrigger->Select(0, kTRUE); //set default no filtering and emit
213     fPComboBoxTrigger->SetEnabled(kTRUE);
214   } 
215   else
216   { 
217     fPComboBoxTrigger->SetEnabled(kFALSE);
218   } 
219
220
221 //______________________________________________________________________________
222 void AliEveEventSelectorWindow::DoSetSelectionString()
223 {
224   //process the entered formula and send it to the selector
225
226   TString str = fPEntryFormula->GetText();
227   TString s;
228   if (fPEntryLowerBound->GetNumber()==0&&fPEntryHigherBound->GetNumber()==0)
229   {
230     s = str;
231   }
232   else
233   {
234     s += "(";
235     s += str;
236     s += ")>";
237     s += fPEntryLowerBound->GetNumber();
238     s += "&&";
239     s += "(";
240     s += str;
241     s += ")<";
242     s += fPEntryHigherBound->GetNumber();
243   }
244   fPSelector->SetSelectionString(s);
245 }
246
247 //______________________________________________________________________________
248 void AliEveEventSelectorWindow::DoDrawHistogram()
249 {
250   //Draw histogram with formula in the draw field
251
252   TTree* tree = fPSelector->GetESDTree();
253   TString str = fPDrawFormula->GetText();
254   str += ">>selectionhist";
255   tree->Draw(str);
256   TH1* hist = dynamic_cast<TH1*>(gDirectory->Get("selectionhist"));
257   if (hist) hist->Draw();
258   TCanvas* canvas = fPCanvas->GetCanvas();
259   canvas->Update();
260 }
261
262 //______________________________________________________________________________
263 void AliEveEventSelectorWindow::DoSetTriggerSelectionString()
264 {
265   //Set trigger selection formula
266   
267   TString string = fPEntryTriggerSelection->GetText();
268   fPSelector->SetTriggerSelectionString(string);
269   fPEntryTriggerSelection->SetToolTipText(fPSelector->GetTriggerSelectionString());
270 }
271
272 //______________________________________________________________________________
273 void AliEveEventSelectorWindow::DoHandleTriggerFromComboBox(const char* str)
274 {
275   //Dispatch the trigger selection to proper destination
276   
277   if (fPSelector->GetSelectOnTriggerString() && !fPSelector->GetSelectOnTriggerType())
278   {
279     fPEntryTriggerSelection->Insert(str);
280     fPEntryTriggerSelection->SetFocus();
281   }
282   if (fPSelector->GetSelectOnTriggerType())
283     fPSelector->SetTriggerType(str);
284 }
285
286 //______________________________________________________________________________
287 void AliEveEventSelectorWindow::DoSetMultiplicityRange()
288 {
289   //Set the multiplicity range
290   
291   fPSelector->SetMultiplicityLow(fPEntryMultLow->GetNumber());
292   fPSelector->SetMultiplicityHigh(fPEntryMultHigh->GetNumber());
293 }