2 // Main authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007
4 /**************************************************************************
5 * Copyright(c) 1998-2008, ALICE Experiment at CERN, all rights reserved. *
6 * See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for *
7 * full copyright notice. *
8 **************************************************************************/
10 /***********************************************************************
11 This editor appears in the TEveUtil window when v0 are visualize.
12 It allows to select the v0 as a function of some useful parameters.
14 Ludovic Gaudichet (gaudichet@to.infn.it)
15 ************************************************************************/
17 #include "AliEveCascadeEditors.h"
18 #include <Alieve/AliEveCascade.h>
20 #include <TEveGValuators.h>
22 #include <TVirtualPad.h>
27 #include <TGNumberEntry.h>
28 #include <TGColorSelect.h>
29 #include <TGDoubleSlider.h>
32 #include <TRootEmbeddedCanvas.h>
39 //______________________________________________________________________
43 ClassImp(CascadeListEditor)
45 CascadeListEditor::CascadeListEditor(const TGWindow *p,
46 Int_t width, Int_t height,
47 UInt_t options, Pixel_t back) :
48 TGedFrame(p, width, height, options | kVerticalFrame, back),
58 MakeTitle("CascadeList");
60 //TGHorizontalFrame* frame = new TGHorizontalFrame(this);
62 // --- Rendering control
64 fRnrVtx = new TGCheckButton(this, "Render v0 and cascade vertices");
65 AddFrame(fRnrVtx, new TGLayoutHints(kLHintsTop, 3, 1, 1, 0));
66 fRnrVtx->Connect("Toggled(Bool_t)",
67 "CascadeListEditor", this, "DoRnrVtx()");
69 fRnrV0path = new TGCheckButton(this, "Render v0 path");
70 AddFrame(fRnrV0path, new TGLayoutHints(kLHintsTop, 3, 1, 1, 0));
71 fRnrV0path->Connect("Toggled(Bool_t)",
72 "CascadeListEditor", this, "DoRnrV0path()");
74 fRnrCasPath = new TGCheckButton(this, "Render cascade path");
75 AddFrame(fRnrCasPath, new TGLayoutHints(kLHintsTop, 3, 1, 1, 0));
76 fRnrCasPath->Connect("Toggled(Bool_t)",
77 "CascadeListEditor", this, "DoRnrCasPath()");
79 fRnrV0Daughters = new TGCheckButton(this, "Render v0 daughter tracks");
80 AddFrame(fRnrV0Daughters, new TGLayoutHints(kLHintsTop, 3, 1, 1, 0));
81 fRnrV0Daughters->Connect("Toggled(Bool_t)",
82 "CascadeListEditor", this, "DoRnrV0Daughters()");
84 fRnrBach = new TGCheckButton(this, "Render bachelor track");
85 AddFrame(fRnrBach, new TGLayoutHints(kLHintsTop, 3, 1, 1, 0));
86 fRnrBach->Connect("Toggled(Bool_t)",
87 "CascadeListEditor", this, "DoRnrBach()");
89 for (Int_t i=0; i<fgkNRange; i++) fRange[i]=0;
90 for (Int_t i=0; i<fgkNCanvas; i++) fCanvasA[i]=0;
91 for (Int_t i=0; i<fgkNCanvas; i++) fCanvasB[i]=0;
96 TGTextButton* resetCutsButton = new TGTextButton(this, "Reset all cuts", 40);
97 resetCutsButton->Connect("Clicked()", "CascadeListEditor", this, "ResetCuts()");
98 AddFrame(resetCutsButton, new TGLayoutHints(kLHintsTop, 3, 1, 1, 0));
101 CascadeListEditor::~CascadeListEditor()
105 //_________________________________________________________________________
106 void CascadeListEditor::SetModel(TObject* obj)
108 fMList = dynamic_cast<CascadeList*>(obj);
110 for (Int_t i=0; i<fgkNRange; i++)
112 fRange[i]->SetValues( fMList->GetMin(i), fMList->GetMax(i) );
114 fRnrV0Daughters->SetState(fMList->GetRnrV0Daughters() ? kButtonDown : kButtonUp);
115 fRnrV0path->SetState(fMList->GetRnrV0path() ? kButtonDown : kButtonUp);
116 fRnrVtx->SetState(fMList->GetRnrCasVtx() ? kButtonDown : kButtonUp);
117 fRnrBach->SetState(fMList->GetRnrBachelor() ? kButtonDown : kButtonUp);
118 fRnrCasPath->SetState(fMList->GetRnrCasPath() ? kButtonDown : kButtonUp);
124 //_________________________________________________________________________
125 TGCompositeFrame* CascadeListEditor::AddTab(TGTab* tab, Int_t i, Int_t can,
128 TGCompositeFrame* frameTab = tab->AddTab(name);
129 frameTab->SetLayoutManager(new TGVerticalLayout( frameTab ));
131 TRootEmbeddedCanvas** embeddedCanvas = 0;
133 if (can==1) embeddedCanvas = &fCanvasA[i];
134 else if (can==2) embeddedCanvas = &fCanvasB[i];
136 *embeddedCanvas = new TRootEmbeddedCanvas("EmbeddedCanvas", frameTab, 200, 200);
137 TCanvas *c1 = (*embeddedCanvas)->GetCanvas();
138 c1->SetBorderMode(0);
141 c1->SetBorderMode(0);
143 frameTab->AddFrame(*embeddedCanvas, new TGLayoutHints(kLHintsTop|kLHintsExpandX,
149 //_________________________________________________________________________
150 TGCompositeFrame** CascadeListEditor::CreateTab(TGTab **pMainTab, TGTab **ptab, Int_t can) {
154 pMainTab[0] = new TGTab(this,0,0);
155 pMainTab[0]->Connect("Selected(Int_t)", "CascadeListEditor", this, "UpdateSelectedTab()");
156 this->AddFrame(pMainTab[0], new TGLayoutHints( kLHintsTop | kLHintsExpandX,2,2,2,2));
159 // container of "Tab1"
160 TGCompositeFrame *frameTab1 = pMainTab[0]->AddTab("ident.");
161 frameTab1->SetLayoutManager(new TGVerticalLayout(frameTab1));
164 ptab[0] = new TGTab(frameTab1,2,2);
165 ptab[0]->Resize(ptab[0]->GetDefaultSize());
166 // The following is for updating the canvas of a tab if this one is selected
167 // (it updates every canvas)
168 ptab[0]->Connect("Selected(Int_t)", "CascadeListEditor", this, "UpdateSelectedTab()");
169 frameTab1->AddFrame(ptab[0], new TGLayoutHints(kLHintsLeft| kLHintsExpandX,0,0,0,0));
172 // container of "Tab2"
173 TGCompositeFrame *frameTab2 = pMainTab[0]->AddTab("cascade");
174 frameTab2->SetLayoutManager(new TGVerticalLayout(frameTab2));
177 ptab[1] = new TGTab(frameTab2,440,299);
178 ptab[1]->Resize(ptab[1]->GetDefaultSize());
179 ptab[1]->Connect("Selected(Int_t)", "CascadeListEditor", this, "UpdateSelectedTab()");
180 frameTab2->AddFrame(ptab[1], new TGLayoutHints(kLHintsLeft| kLHintsExpandX ,0,0,0,0));
183 // container of "Tab3"
184 TGCompositeFrame *frameTab3 = pMainTab[0]->AddTab("V0daugh/bach.");
185 frameTab3->SetLayoutManager(new TGVerticalLayout(frameTab3));
188 ptab[2] = new TGTab(frameTab3,440,299);
189 ptab[2]->Resize(ptab[2]->GetDefaultSize());
190 ptab[2]->Connect("Selected(Int_t)", "CascadeListEditor", this, "UpdateSelectedTab()");
191 frameTab3->AddFrame(ptab[2], new TGLayoutHints(kLHintsLeft| kLHintsExpandX ,0,0,0,0));
194 TGCompositeFrame **frameTab = new TGCompositeFrame*[fgkNCanvas];
196 frameTab[0] = AddTab(ptab[0], 0, can, "Xi");
197 frameTab[1] = AddTab(ptab[0], 1, can, "Omega");
198 frameTab[2] = AddTab(ptab[0], 2, can, "Arm.Podo.");
199 frameTab[3] = AddTab(ptab[0], 3, can, "Index");
201 frameTab[4] = AddTab(ptab[1], 4, can, "cosPointing");
202 frameTab[5] = AddTab(ptab[1], 5, can, "bachV0DCA");
203 frameTab[6] = AddTab(ptab[1], 6, can, "radius");
204 frameTab[7] = AddTab(ptab[1], 7, can, "Pt");
205 frameTab[8] = AddTab(ptab[1], 8, can, "eta");
207 frameTab[9] = AddTab(ptab[2], 9, can, "neg Pt");
208 frameTab[10] = AddTab(ptab[2], 10, can, "neg eta");
209 frameTab[11] = AddTab(ptab[2], 11, can, "pos Pt");
210 frameTab[12] = AddTab(ptab[2], 12, can, "pos eta");
211 frameTab[13] = AddTab(ptab[2], 13, can, "bach Pt");
212 frameTab[14] = AddTab(ptab[2], 14, can, "bach eta");
214 pMainTab[0]->SetTab(0);
220 gClient->GetColorByName("grey50", darkgrey);
221 ptab[0]->SetBackgroundColor(darkgrey);
222 ptab[1]->SetBackgroundColor(darkgrey);
223 ptab[2]->SetBackgroundColor(darkgrey);
229 //_________________________________________________________________________
230 void CascadeListEditor::AddValuator(TGCompositeFrame* frame, char *name,
231 Float_t min, Float_t max, Int_t pres,
232 char *func, Int_t iHist) {
234 TGCompositeFrame* downFrame = new TGCompositeFrame(frame,
235 60, 60, kHorizontalFrame);
238 fRange[iHist] = new TEveGDoubleValuator(downFrame, name, 200, 0);
239 fRange[iHist]->SetNELength(6);
240 fRange[iHist]->Build();
241 fRange[iHist]->GetSlider()->SetWidth(200);
243 fRange[iHist]->SetLimits(min, max, TGNumberFormat::kNESRealTwo);
245 fRange[iHist]->SetLimits(min, max, TGNumberFormat::kNESInteger);
247 fRange[iHist]->SetLimits(min, max, TGNumberFormat::kNESRealThree);
249 fRange[iHist]->SetLimits(min, max, TGNumberFormat::kNESRealFour);
251 fRange[iHist]->SetLimits(min, max, TGNumberFormat::kNESReal);
253 fRange[iHist]->Connect("ValueSet()",
254 "CascadeListEditor", this, func);
255 downFrame->AddFrame(fRange[iHist], new TGLayoutHints(kLHintsLeft,
258 TGTextButton* adjustButton = new TGTextButton(downFrame, "Adjust Hist", 40);
261 sprintf(ch,"AdjustHist(=%i)",iHist);
262 adjustButton->Connect("Clicked()", "CascadeListEditor", this, ch);
263 downFrame->AddFrame(adjustButton, new TGLayoutHints(kLHintsTop, 0, 0, 0, 0));
265 frame->AddFrame(downFrame, new TGLayoutHints(kLHintsTop| kLHintsExpandY,
270 //_________________________________________________________________________
271 void CascadeListEditor::AddSelectTab() {
273 TGCompositeFrame** tab = CreateTab(&fMainTabA, fTabA, 1);
275 AddValuator(tab[0], "mass Xi", 0, 5, 3, "MassXiRange()", 0);
276 AddValuator(tab[1], "mass Omega", 0, 5, 3, "MassOmegaRange()", 1);
278 AddValuator(tab[3], "Index", 0, 1e5, 0, "IndexRange()", 2);
279 AddValuator(tab[4], "cos pointing angle", 0.8, 1, 5, "CosPointingRange()", 3);
280 AddValuator(tab[5], "bach-AliEveV0 DCA", 0, 5, 3, "BachV0DCARange()", 4);
281 AddValuator(tab[6], "radius", 0, 100, 2, "RadiusRange()", 5);
282 AddValuator(tab[7], "Pt", 0, 10, 2, "PtRange()", 6);
283 AddValuator(tab[8], "Pseudo-rapidity", -2, 2, 2, "PseudoRapRange()", 7);
285 AddValuator(tab[9], "neg Pt", 0, 10, 2, "NegPtRange()", 8);
286 AddValuator(tab[10], "neg pseudo-rapidity", -2, 2, 2, "NegEtaRange()", 9);
287 AddValuator(tab[11], "pos Pt", 0, 10, 2, "PosPtRange()", 10);
288 AddValuator(tab[12], "pos pseudo-rapidity", -2, 2, 2, "PosEtaRange()", 11);
289 AddValuator(tab[13], "bach. Pt", 0, 10, 2, "BachPtRange()", 12);
290 AddValuator(tab[14], "bach. pseudo-rapidity", -2, 2, 2, "BachEtaRange()", 13);
296 //_________________________________________________________________________
297 void CascadeListEditor::AddSeeTab() {
299 TGCompositeFrame** tab = CreateTab(&fMainTabB, fTabB, 2);
304 //_________________________________________________________________________
305 void CascadeListEditor::AdjustHist(Int_t iHist) {
307 if (! fMList) return;
308 fMList->AdjustHist(iHist);
313 //_________________________________________________________________________
314 void CascadeListEditor::ResetCuts() {
316 if (! fMList) return;
320 for (Int_t i=0; i<fgkNRange;i++) {
323 min = fRange[i]->GetLimitMin();
324 max = fRange[i]->GetLimitMax();
325 fMList->SetMin(i, min);
326 fMList->SetMax(i, max);
327 fRange[i]->SetValues(min, max);
328 fMList->AdjustHist(i);
331 // for the Index we scan its actual range
333 fMList->GetCasIndexRange(imin, imax);
335 Int_t minH = imin-(imax-imin)/20;
336 Int_t maxH = imax+(imax-imin)/20;
337 fMList->SetMin(2, minH);
338 fMList->SetMax(2, maxH);
339 fRange[2]->SetLimits(minH, maxH, TGNumberFormat::kNESInteger);
340 fRange[2]->SetValues(minH, maxH);
341 fMList->AdjustHist(2);
349 //_________________________________________________________________________
350 void CascadeListEditor::FillCanvas() {
359 Int_t canvasMap[fgkNCanvas]={0,1,1000,2,3,4,5,6,7,8,9,10,11,12,13};
361 for (Int_t i=0; i<fgkNCanvas; i++)
364 is2D = canvasMap[i]>999;
366 if (is2D) hist2D = fMList->GetHist2D(canvasMap[i]-1000);
367 else hist = fMList->GetHist(canvasMap[i]);
369 c1 = fCanvasA[i]->GetCanvas();
371 if (is2D) hist2D->Draw("colz"); else hist->Draw();
375 c1b = fCanvasB[i]->GetCanvas();
377 if (is2D) hist2D->Draw("colz"); else hist->Draw();
383 //_________________________________________________________________________
384 void CascadeListEditor::UpdateSelectedTab() {
389 gClient->GetColorByName("yellow", yellow);
390 gClient->GetColorByName("grey", grey);
392 TGTabElement *tabElem;
393 for (i=0; i<fMainTabA->GetNumberOfTabs(); i++) {
395 tabElem = fMainTabA->GetTabTab(i);
396 tabElem->ChangeBackground(grey);
398 for (j=0; j<fTabA[i]->GetNumberOfTabs();j++) {
399 tabElem = fTabA[i]->GetTabTab(j);
400 tabElem->ChangeBackground(grey);
404 Int_t currentTab = fMainTabA->GetCurrent();
405 Int_t currentSubTab = fTabA[currentTab]->GetCurrent();
406 tabElem = fMainTabA->GetTabTab(currentTab);
407 tabElem->ChangeBackground(yellow);
408 tabElem = fTabA[currentTab]->GetTabTab(currentSubTab);
409 tabElem->ChangeBackground(yellow);
415 while (currentTab>i) {
416 iCan += fTabA[i]->GetNumberOfTabs();
419 iCan += currentSubTab;
420 c1 = fCanvasA[iCan]->GetCanvas();
421 c1->GetCanvas()->Modified();
422 c1->GetCanvas()->Update();
426 for (i=0; i<fMainTabB->GetNumberOfTabs(); i++) {
428 tabElem = fMainTabB->GetTabTab(i);
429 tabElem->ChangeBackground(grey);
431 for (j=0; j<fTabB[i]->GetNumberOfTabs();j++) {
432 tabElem = fTabB[i]->GetTabTab(j);
433 tabElem->ChangeBackground(grey);
437 currentTab = fMainTabB->GetCurrent();
438 currentSubTab = fTabB[currentTab]->GetCurrent();
439 tabElem = fMainTabB->GetTabTab(currentTab);
440 tabElem->ChangeBackground(yellow);
441 tabElem = fTabB[currentTab]->GetTabTab(currentSubTab);
442 tabElem->ChangeBackground(yellow);
447 while (currentTab>i) {
448 iCan += fTabB[i]->GetNumberOfTabs();
451 iCan += currentSubTab;
452 c1 = fCanvasB[iCan]->GetCanvas();
453 c1->GetCanvas()->Modified();
454 c1->GetCanvas()->Update();
458 //_________________________________________________________________________
459 void CascadeListEditor::UpdateAll(Int_t iCanA) {
461 TCanvas *c1 = fCanvasA[iCanA]->GetCanvas();
465 static Int_t iCan, i;
468 while (fMainTabB->GetCurrent()>i) {
469 iCan += fTabB[i]->GetNumberOfTabs();
472 iCan += fTabB[i]->GetCurrent();
473 c1 = fCanvasB[iCan]->GetCanvas();
474 c1->GetCanvas()->Modified();
475 c1->GetCanvas()->Update();
481 //_________________________________________________________________________
483 void CascadeListEditor::DoRnrVtx()
485 fMList->SetRnrCasVtx(fRnrVtx->IsOn());
489 void CascadeListEditor::DoRnrV0path()
491 fMList->SetRnrV0path(fRnrV0path->IsOn());
495 void CascadeListEditor::DoRnrV0Daughters()
497 fMList->SetRnrV0Daughters(fRnrV0Daughters->IsOn());
501 void CascadeListEditor::DoRnrBach()
503 fMList->SetRnrBachelor(fRnrBach->IsOn());
507 void CascadeListEditor::DoRnrCasPath()
509 fMList->SetRnrCasPath(fRnrCasPath->IsOn());
514 //_________________________________________________________________________
515 void CascadeListEditor::MassXiRange() {
517 fMList->XiMassFilter(fRange[0]->GetMin(), fRange[0]->GetMax());
521 //_________________________________________________________________________
522 void CascadeListEditor::MassOmegaRange() {
523 fMList->OmegaMassFilter(fRange[1]->GetMin(), fRange[1]->GetMax());
527 //_________________________________________________________________________
528 void CascadeListEditor::IndexRange() {
529 fMList->IndexFilter(fRange[2]->GetMin(), fRange[2]->GetMax());
532 //_________________________________________________________________________
533 void CascadeListEditor::CosPointingRange() {
534 fMList->CosPointingFilter(fRange[3]->GetMin(), fRange[3]->GetMax());
538 //_________________________________________________________________________
539 void CascadeListEditor::BachV0DCARange() {
540 fMList->BachV0DCAFilter(fRange[4]->GetMin(), fRange[4]->GetMax());
544 //_________________________________________________________________________
545 void CascadeListEditor::RadiusRange() {
546 fMList->RadiusFilter(fRange[5]->GetMin(), fRange[5]->GetMax());
550 //_________________________________________________________________________
551 void CascadeListEditor::PtRange() {
552 fMList->PtFilter(fRange[6]->GetMin(), fRange[6]->GetMax());
556 //_________________________________________________________________________
557 void CascadeListEditor::PseudoRapRange() {
558 fMList->PseudoRapFilter(fRange[7]->GetMin(), fRange[7]->GetMax());
562 //_________________________________________________________________________
563 void CascadeListEditor::NegPtRange() {
564 fMList->NegPtFilter(fRange[8]->GetMin(), fRange[8]->GetMax());
568 //_________________________________________________________________________
569 void CascadeListEditor::NegEtaRange() {
570 fMList->NegEtaFilter(fRange[9]->GetMin(), fRange[9]->GetMax());
574 //_________________________________________________________________________
575 void CascadeListEditor::PosPtRange() {
576 fMList->PosPtFilter(fRange[10]->GetMin(), fRange[10]->GetMax());
580 //_________________________________________________________________________
581 void CascadeListEditor::PosEtaRange() {
582 fMList->PosEtaFilter(fRange[11]->GetMin(), fRange[11]->GetMax());
586 //_________________________________________________________________________
587 void CascadeListEditor::BachPtRange() {
588 fMList->BachPtFilter(fRange[12]->GetMin(), fRange[12]->GetMax());
592 //_________________________________________________________________________
593 void CascadeListEditor::BachEtaRange() {
594 fMList->BachEtaFilter(fRange[13]->GetMin(), fRange[13]->GetMax());