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