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 **************************************************************************/
9 /**************************************************************************
10 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
12 * Author: The ALICE Off-line Project. *
13 * Contributors are mentioned in the code where appropriate. *
15 * Permission to use, copy, modify and distribute this software and its *
16 * documentation strictly for non-commercial purposes is hereby granted *
17 * without fee, provided that the above copyright notice appears in all *
18 * copies and that both the copyright notice and this permission notice *
19 * appear in the supporting documentation. The authors make no claims *
20 * about the suitability of this software for any purpose. It is *
21 * provided "as is" without express or implied warranty. *
22 **************************************************************************/
25 /***********************************************************************
26 This editor appears in the TEveUtil window when v0 are visualize.
27 It allows to select the v0 as a function of some useful parameters.
29 Ludovic Gaudichet (gaudichet@to.infn.it)
30 ************************************************************************/
33 #include "AliEveV0Editors.h"
34 #include <EveDet/AliEveV0.h>
36 #include <TEveGValuators.h>
38 #include <TVirtualPad.h>
43 #include <TGNumberEntry.h>
44 #include <TGColorSelect.h>
45 #include <TGDoubleSlider.h>
48 #include <TRootEmbeddedCanvas.h>
55 //______________________________________________________________________________
59 ClassImp(V0ListEditor)
61 V0ListEditor::V0ListEditor(const TGWindow *p,
62 Int_t width, Int_t height,
63 UInt_t options, Pixel_t back) :
64 TGedFrame(p, width, height, options | kVerticalFrame, back),
74 //TGHorizontalFrame* frame = new TGHorizontalFrame(this);
76 // --- Rendering control
78 fRnrV0path = new TGCheckButton(this, "Render v0 path");
79 AddFrame(fRnrV0path, new TGLayoutHints(kLHintsTop, 3, 1, 1, 0));
80 fRnrV0path->Connect("Toggled(Bool_t)",
81 "V0ListEditor", this, "DoRnrV0path()");
83 fRnrV0vtx = new TGCheckButton(this, "Render v0 vertices");
84 AddFrame(fRnrV0vtx, new TGLayoutHints(kLHintsTop, 3, 1, 1, 0));
85 fRnrV0vtx->Connect("Toggled(Bool_t)",
86 "V0ListEditor", this, "DoRnrV0vtx()");
88 fRnrV0sDaugh = new TGCheckButton(this, "Render v0 daughters");
89 AddFrame(fRnrV0sDaugh, new TGLayoutHints(kLHintsTop, 3, 1, 1, 0));
90 fRnrV0sDaugh->Connect("Toggled(Bool_t)",
91 "V0ListEditor", this, "DoRnrDaughters()");
93 for (Int_t i=0; i<fgkNRange; i++) fRange[i]=0;
94 for (Int_t i=0; i<fgkNCanvas; i++) fCanvasA[i]=0;
99 TGTextButton* resetCutsButton = new TGTextButton(this, "Reset all cuts", 40);
100 resetCutsButton->Connect("Clicked()", "V0ListEditor", this, "ResetCuts()");
101 AddFrame(resetCutsButton, new TGLayoutHints(kLHintsTop, 3, 1, 1, 0));
104 V0ListEditor::~V0ListEditor() {}
107 //______________________________________________________________________________
108 void V0ListEditor::SetModel(TObject* obj)
110 fMList = dynamic_cast<V0List*>(obj);
112 for (Int_t i=0; i<fgkNRange; i++)
114 fRange[i]->SetValues( fMList->GetMin(i), fMList->GetMax(i) );
116 fRnrV0sDaugh->SetState(fMList->GetRnrDaughters() ? kButtonDown : kButtonUp);
117 fRnrV0vtx->SetState(fMList->GetRnrV0vtx() ? kButtonDown : kButtonUp);
118 fRnrV0path->SetState(fMList->GetRnrV0path() ? kButtonDown : kButtonUp);
124 //______________________________________________________________________________
125 TGCompositeFrame* V0ListEditor::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** V0ListEditor::CreateTab(TGTab **pMainTab, TGTab **ptab, Int_t can) {
154 pMainTab[0] = new TGTab(this,0,0);
155 pMainTab[0]->Connect("Selected(Int_t)", "V0ListEditor", this, "UpdateSelectedTab()");
156 this->AddFrame(pMainTab[0], new TGLayoutHints( kLHintsTop | kLHintsExpandX,2,2,2,2));
160 // container of "Tab1"
161 TGCompositeFrame *frameTab1 = pMainTab[0]->AddTab("ident.");
162 frameTab1->SetLayoutManager(new TGVerticalLayout(frameTab1));
166 ptab[0] = new TGTab(frameTab1,2,2);
167 ptab[0]->Resize(ptab[0]->GetDefaultSize());
168 // The following is for updating the canvas of a tab if this one is selected
169 // (it updates every canvas)
170 ptab[0]->Connect("Selected(Int_t)", "V0ListEditor", this, "UpdateSelectedTab()");
171 frameTab1->AddFrame(ptab[0], new TGLayoutHints(kLHintsLeft| kLHintsExpandX,0,0,0,0));
174 // container of "Tab2"
175 TGCompositeFrame *frameTab2 = pMainTab[0]->AddTab("v0");
176 frameTab2->SetLayoutManager(new TGVerticalLayout(frameTab2));
179 ptab[1] = new TGTab(frameTab2,440,299);
180 ptab[1]->Resize(ptab[1]->GetDefaultSize());
181 ptab[1]->Connect("Selected(Int_t)", "V0ListEditor", this, "UpdateSelectedTab()");
182 frameTab2->AddFrame(ptab[1], new TGLayoutHints(kLHintsLeft| kLHintsExpandX ,0,0,0,0));
185 // container of "Tab3"
186 TGCompositeFrame *frameTab3 = pMainTab[0]->AddTab("daughters");
187 frameTab3->SetLayoutManager(new TGVerticalLayout(frameTab3));
190 ptab[2] = new TGTab(frameTab3,440,299);
191 ptab[2]->Resize(ptab[2]->GetDefaultSize());
192 ptab[2]->Connect("Selected(Int_t)", "V0ListEditor", this, "UpdateSelectedTab()");
193 frameTab3->AddFrame(ptab[2], new TGLayoutHints(kLHintsLeft| kLHintsExpandX ,0,0,0,0));
196 TGCompositeFrame **frameTab = new TGCompositeFrame*[fgkNCanvas];
198 frameTab[0] = AddTab(ptab[0], 0, can, "K0s");
199 frameTab[1] = AddTab(ptab[0], 1, can, "Lambda");
200 frameTab[2] = AddTab(ptab[0], 2, can, "Anti-Lambda");
201 frameTab[3] = AddTab(ptab[0], 3, can, "Arm-Podo");
202 frameTab[4] = AddTab(ptab[0], 4, can, "Index");
203 frameTab[5] = AddTab(ptab[1], 5, can, "cosPointing");
204 frameTab[6] = AddTab(ptab[1], 6, can, "daughterDCA");
205 frameTab[7] = AddTab(ptab[1], 7, can, "radius");
206 frameTab[8] = AddTab(ptab[1], 8, can, "Pt");
207 frameTab[9] = AddTab(ptab[1], 9, can, "eta");
208 frameTab[10] = AddTab(ptab[2], 10, can, "neg Pt");
209 frameTab[11] = AddTab(ptab[2], 11, can, "neg eta");
210 frameTab[12] = AddTab(ptab[2], 12, can, "pos Pt");
211 frameTab[13] = AddTab(ptab[2], 13, can, "pos eta");
213 pMainTab[0]->SetTab(0);
219 gClient->GetColorByName("grey50", darkgrey);
220 ptab[0]->SetBackgroundColor(darkgrey);
221 ptab[1]->SetBackgroundColor(darkgrey);
222 ptab[2]->SetBackgroundColor(darkgrey);
228 //______________________________________________________________________________
229 void V0ListEditor::AddValuator(TGCompositeFrame* frame, char *name,
230 Float_t min, Float_t max, Int_t pres,
231 char *func, Int_t iHist) {
233 TGCompositeFrame* downFrame = new TGCompositeFrame(frame,
234 60, 60, kHorizontalFrame);
237 fRange[iHist] = new TEveGDoubleValuator(downFrame, name, 200, 0);
238 fRange[iHist]->SetNELength(6);
239 fRange[iHist]->Build();
240 fRange[iHist]->GetSlider()->SetWidth(200);
242 fRange[iHist]->SetLimits(min, max, TGNumberFormat::kNESRealTwo);
244 fRange[iHist]->SetLimits(min, max, TGNumberFormat::kNESInteger);
246 fRange[iHist]->SetLimits(min, max, TGNumberFormat::kNESRealThree);
248 fRange[iHist]->SetLimits(min, max, TGNumberFormat::kNESRealFour);
250 fRange[iHist]->SetLimits(min, max, TGNumberFormat::kNESReal);
252 fRange[iHist]->Connect("ValueSet()",
253 "V0ListEditor", this, func);
254 downFrame->AddFrame(fRange[iHist], new TGLayoutHints(kLHintsLeft,
257 TGTextButton* adjustButton = new TGTextButton(downFrame, "Adjust Hist", 40);
260 sprintf(ch,"AdjustHist(=%i)",iHist);
261 adjustButton->Connect("Clicked()", "V0ListEditor", this, ch);
262 downFrame->AddFrame(adjustButton, new TGLayoutHints(kLHintsTop, 0, 0, 0, 0));
264 frame->AddFrame(downFrame, new TGLayoutHints(kLHintsTop| kLHintsExpandY,
269 //______________________________________________________________________________
270 void V0ListEditor::AddSelectTab() {
272 TGCompositeFrame** tab = CreateTab(&fMainTabA, fTabA, 1);
274 AddValuator(tab[0], "mass K0s", 0, 5, 3, "MassK0sRange()", 1);
275 AddValuator(tab[1], "mass Lambda", 0, 5, 3, "MassLamRange()", 2);
276 AddValuator(tab[2], "mass Anti-Lambda", 0, 5, 3, "MassAntiLamRange()", 3);
277 AddValuator(tab[4], "ESD v0 index", 0,1e5, 0, "ESDv0IndexRange()", 12);
278 AddValuator(tab[5], "cos pointing angle", 0.8,1, 5, "CosPointingRange()", 5);
279 AddValuator(tab[6], "daughter DCA", 0, 10, 2, "DaughterDcaRange()", 4);
280 AddValuator(tab[7], "radius", 0,100, 2, "RadiusRange()", 6);
281 AddValuator(tab[8], "Pt range", 0, 10, 2, "PtRange()", 0);
282 AddValuator(tab[9], "eta", -2, 2, 2, "EtaRange()", 7);
283 AddValuator(tab[10], "neg Pt", 0, 10, 2, "NegPtRange()", 8);
284 AddValuator(tab[11], "neg eta", -2, 2, 2, "NegEtaRange()", 9);
285 AddValuator(tab[12], "pos Pt", 0, 10, 2, "PosPtRange()", 10);
286 AddValuator(tab[13], "pos eta", -2, 2, 2, "PosEtaRange()", 11);
292 //______________________________________________________________________________
293 void V0ListEditor::AddSeeTab() {
295 TGCompositeFrame** tab = CreateTab(&fMainTabB, fTabB, 2);
300 //______________________________________________________________________________
301 void V0ListEditor::AdjustHist(Int_t iHist) {
303 if (! fMList) return;
304 fMList->AdjustHist(iHist);
309 //______________________________________________________________________________
310 void V0ListEditor::ResetCuts() {
312 if (! fMList) return;
316 for (Int_t i=0; i<fgkNRange;i++) {
319 min = fRange[i]->GetLimitMin();
320 max = fRange[i]->GetLimitMax();
321 fMList->SetMin(i, min);
322 fMList->SetMax(i, max);
323 fRange[i]->SetValues(min, max);
324 fMList->AdjustHist(i);
327 // for the Index we scan its actual range
329 fMList->GetV0IndexRange(imin, imax);
331 Int_t minH = imin - (imax-imin)/20;
332 Int_t maxH = imax + (imax-imin)/20;
333 fMList->SetMin(12, minH);
334 fMList->SetMax(12, maxH);
335 fRange[12]->SetLimits(minH, maxH, TGNumberFormat::kNESInteger);
336 fRange[12]->SetValues(minH, maxH);
337 fMList->AdjustHist(12);
346 //______________________________________________________________________________
347 void V0ListEditor::FillCanvas() {
356 Int_t canvasMap[fgkNCanvas]={1,2,3,1000,12,5,4,6,0, 7,8,9,10,11};
358 for (Int_t i=0; i<fgkNCanvas; i++)
361 is2D = canvasMap[i]>999;
363 if (is2D) hist2D = fMList->GetHist2D(canvasMap[i]-1000);
364 else hist = fMList->GetHist(canvasMap[i]);
366 c1 = fCanvasA[i]->GetCanvas();
368 if (is2D) hist2D->Draw("colz"); else hist->Draw();
372 c1b = fCanvasB[i]->GetCanvas();
374 if (is2D) hist2D->Draw("colz"); else hist->Draw();
382 //______________________________________________________________________________
383 void V0ListEditor::UpdateSelectedTab() {
388 gClient->GetColorByName("yellow", yellow);
389 gClient->GetColorByName("grey", grey);
391 TGTabElement *tabElem;
392 for (i=0; i<fMainTabA->GetNumberOfTabs(); i++) {
394 tabElem = fMainTabA->GetTabTab(i);
395 tabElem->ChangeBackground(grey);
397 for (j=0; j<fTabA[i]->GetNumberOfTabs();j++) {
398 tabElem = fTabA[i]->GetTabTab(j);
399 tabElem->ChangeBackground(grey);
403 Int_t currentTab = fMainTabA->GetCurrent();
404 Int_t currentSubTab = fTabA[currentTab]->GetCurrent();
405 tabElem = fMainTabA->GetTabTab(currentTab);
406 tabElem->ChangeBackground(yellow);
407 tabElem = fTabA[currentTab]->GetTabTab(currentSubTab);
408 tabElem->ChangeBackground(yellow);
414 while (currentTab>i) {
415 iCan += fTabA[i]->GetNumberOfTabs();
418 iCan += currentSubTab;
419 c1 = fCanvasA[iCan]->GetCanvas();
420 c1->GetCanvas()->Modified();
421 c1->GetCanvas()->Update();
425 for (i=0; i<fMainTabB->GetNumberOfTabs(); i++) {
427 tabElem = fMainTabB->GetTabTab(i);
428 tabElem->ChangeBackground(grey);
430 for (j=0; j<fTabB[i]->GetNumberOfTabs();j++) {
431 tabElem = fTabB[i]->GetTabTab(j);
432 tabElem->ChangeBackground(grey);
436 currentTab = fMainTabB->GetCurrent();
437 currentSubTab = fTabB[currentTab]->GetCurrent();
438 tabElem = fMainTabB->GetTabTab(currentTab);
439 tabElem->ChangeBackground(yellow);
440 tabElem = fTabB[currentTab]->GetTabTab(currentSubTab);
441 tabElem->ChangeBackground(yellow);
446 while (currentTab>i) {
447 iCan += fTabB[i]->GetNumberOfTabs();
450 iCan += currentSubTab;
451 c1 = fCanvasB[iCan]->GetCanvas();
452 c1->GetCanvas()->Modified();
453 c1->GetCanvas()->Update();
457 //______________________________________________________________________________
458 void V0ListEditor::UpdateAll(Int_t iCanA) {
460 TCanvas *c1 = fCanvasA[iCanA]->GetCanvas();
464 static Int_t iCan, i;
467 while (fMainTabB->GetCurrent()>i) {
468 iCan += fTabB[i]->GetNumberOfTabs();
471 iCan += fTabB[i]->GetCurrent();
472 c1 = fCanvasB[iCan]->GetCanvas();
473 c1->GetCanvas()->Modified();
474 c1->GetCanvas()->Update();
480 //______________________________________________________________________________
482 void V0ListEditor::DoRnrV0vtx()
484 fMList->SetRnrV0vtx(fRnrV0vtx->IsOn());
488 void V0ListEditor::DoRnrV0path()
490 fMList->SetRnrV0path(fRnrV0path->IsOn());
494 void V0ListEditor::DoRnrDaughters()
496 fMList->SetRnrDaughters(fRnrV0sDaugh->IsOn());
501 //______________________________________________________________________________
502 void V0ListEditor::MassK0sRange() {
504 fMList->K0sMFilter(fRange[1]->GetMin(), fRange[1]->GetMax());
508 //______________________________________________________________________________
509 void V0ListEditor::MassLamRange() {
510 fMList->LamMFilter(fRange[2]->GetMin(), fRange[2]->GetMax());
514 //______________________________________________________________________________
515 void V0ListEditor::MassAntiLamRange() {
516 fMList->ALamMFilter(fRange[3]->GetMin(), fRange[3]->GetMax());
520 //______________________________________________________________________________
521 void V0ListEditor::ESDv0IndexRange() {
522 fMList->IndexFilter(fRange[12]->GetMin(), fRange[12]->GetMax());
526 //______________________________________________________________________________
527 void V0ListEditor::CosPointingRange() {
528 fMList->CosPointingFilter(fRange[5]->GetMin(), fRange[5]->GetMax());
532 //______________________________________________________________________________
533 void V0ListEditor::DaughterDcaRange() {
534 fMList->DaughterDCAFilter(fRange[4]->GetMin(), fRange[4]->GetMax());
538 //______________________________________________________________________________
539 void V0ListEditor::RadiusRange() {
540 fMList->RadiusFilter(fRange[6]->GetMin(), fRange[6]->GetMax());
544 //______________________________________________________________________________
545 void V0ListEditor::PtRange()
547 fMList->PtFilter(fRange[0]->GetMin(), fRange[0]->GetMax());
551 //______________________________________________________________________________
552 void V0ListEditor::EtaRange() {
553 fMList->EtaFilter(fRange[7]->GetMin(), fRange[7]->GetMax());
557 //______________________________________________________________________________
558 void V0ListEditor::NegPtRange() {
559 fMList->NegPtFilter(fRange[8]->GetMin(), fRange[8]->GetMax());
563 //______________________________________________________________________________
564 void V0ListEditor::NegEtaRange() {
565 fMList->NegEtaFilter(fRange[9]->GetMin(), fRange[9]->GetMax());
569 //______________________________________________________________________________
570 void V0ListEditor::PosPtRange() {
571 fMList->PosPtFilter(fRange[10]->GetMin(), fRange[10]->GetMax());
575 //______________________________________________________________________________
576 void V0ListEditor::PosEtaRange() {
577 fMList->PosEtaFilter(fRange[11]->GetMin(), fRange[11]->GetMax());