1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
17 /***********************************************************************
18 This editor appears in the Reve window when v0 are visualize.
19 It allows to select the v0 as a function of some useful parameters.
21 Ludovic Gaudichet (gaudichet@to.infn.it)
22 ************************************************************************/
25 #include "V0Editors.h"
26 #include <Alieve/V0.h>
28 #include <Reve/RGValuators.h>
30 #include <TVirtualPad.h>
35 #include <TGNumberEntry.h>
36 #include <TGColorSelect.h>
37 #include <TGDoubleSlider.h>
40 #include <TRootEmbeddedCanvas.h>
48 using namespace Alieve;
50 //______________________________________________________________________
54 ClassImp(Alieve::V0ListEditor)
56 V0ListEditor::V0ListEditor(const TGWindow *p,
57 Int_t width, Int_t height,
58 UInt_t options, Pixel_t back) :
59 TGedFrame(p, width, height, options | kVerticalFrame, back),
69 //TGHorizontalFrame* frame = new TGHorizontalFrame(this);
71 // --- Rendering control
73 fRnrV0path = new TGCheckButton(this, "Render v0 path");
74 AddFrame(fRnrV0path, new TGLayoutHints(kLHintsTop, 3, 1, 1, 0));
75 fRnrV0path->Connect("Toggled(Bool_t)",
76 "Alieve::V0ListEditor", this, "DoRnrV0path()");
78 fRnrV0vtx = new TGCheckButton(this, "Render v0 vertices");
79 AddFrame(fRnrV0vtx, new TGLayoutHints(kLHintsTop, 3, 1, 1, 0));
80 fRnrV0vtx->Connect("Toggled(Bool_t)",
81 "Alieve::V0ListEditor", this, "DoRnrV0vtx()");
83 fRnrV0sDaugh = new TGCheckButton(this, "Render v0 daughters");
84 AddFrame(fRnrV0sDaugh, new TGLayoutHints(kLHintsTop, 3, 1, 1, 0));
85 fRnrV0sDaugh->Connect("Toggled(Bool_t)",
86 "Alieve::V0ListEditor", this, "DoRnrDaughters()");
88 for (Int_t i=0; i<fgkNRange; i++) fRange[i]=0;
89 for (Int_t i=0; i<fgkNCanvas; i++) fCanvasA[i]=0;
94 TGTextButton* resetCutsButton = new TGTextButton(this, "Reset all cuts", 40);
95 resetCutsButton->Connect("Clicked()", "Alieve::V0ListEditor", this, "ResetCuts()");
96 AddFrame(resetCutsButton, new TGLayoutHints(kLHintsTop, 3, 1, 1, 0));
99 V0ListEditor::~V0ListEditor() {}
102 //_________________________________________________________________________
103 void V0ListEditor::SetModel(TObject* obj)
105 fMList = dynamic_cast<V0List*>(obj);
107 for (Int_t i=0; i<fgkNRange; i++)
109 fRange[i]->SetValues( fMList->GetMin(i), fMList->GetMax(i) );
111 fRnrV0sDaugh->SetState(fMList->GetRnrDaughters() ? kButtonDown : kButtonUp);
112 fRnrV0vtx->SetState(fMList->GetRnrV0vtx() ? kButtonDown : kButtonUp);
113 fRnrV0path->SetState(fMList->GetRnrV0path() ? kButtonDown : kButtonUp);
119 //_________________________________________________________________________
120 TGCompositeFrame* V0ListEditor::AddTab(TGTab* tab, Int_t i, Int_t can,
123 TGCompositeFrame* frameTab = tab->AddTab(name);
124 frameTab->SetLayoutManager(new TGVerticalLayout( frameTab ));
126 TRootEmbeddedCanvas** embeddedCanvas = 0;
128 if (can==1) embeddedCanvas = &fCanvasA[i];
129 else if (can==2) embeddedCanvas = &fCanvasB[i];
131 *embeddedCanvas = new TRootEmbeddedCanvas("EmbeddedCanvas", frameTab, 200, 200);
132 TCanvas *c1 = (*embeddedCanvas)->GetCanvas();
133 c1->SetBorderMode(0);
136 c1->SetBorderMode(0);
138 frameTab->AddFrame(*embeddedCanvas, new TGLayoutHints(kLHintsTop|kLHintsExpandX,
144 //_________________________________________________________________________
145 TGCompositeFrame** V0ListEditor::CreateTab(TGTab **pMainTab, TGTab **ptab, Int_t can) {
149 pMainTab[0] = new TGTab(this,0,0);
150 pMainTab[0]->Connect("Selected(Int_t)", "Alieve::V0ListEditor", this, "UpdateSelectedTab()");
151 this->AddFrame(pMainTab[0], new TGLayoutHints( kLHintsTop | kLHintsExpandX,2,2,2,2));
155 // container of "Tab1"
156 TGCompositeFrame *frameTab1 = pMainTab[0]->AddTab("ident.");
157 frameTab1->SetLayoutManager(new TGVerticalLayout(frameTab1));
161 ptab[0] = new TGTab(frameTab1,2,2);
162 ptab[0]->Resize(ptab[0]->GetDefaultSize());
163 // The following is for updating the canvas of a tab if this one is selected
164 // (it updates every canvas)
165 ptab[0]->Connect("Selected(Int_t)", "Alieve::V0ListEditor", this, "UpdateSelectedTab()");
166 frameTab1->AddFrame(ptab[0], new TGLayoutHints(kLHintsLeft| kLHintsExpandX,0,0,0,0));
169 // container of "Tab2"
170 TGCompositeFrame *frameTab2 = pMainTab[0]->AddTab("v0");
171 frameTab2->SetLayoutManager(new TGVerticalLayout(frameTab2));
174 ptab[1] = new TGTab(frameTab2,440,299);
175 ptab[1]->Resize(ptab[1]->GetDefaultSize());
176 ptab[1]->Connect("Selected(Int_t)", "Alieve::V0ListEditor", this, "UpdateSelectedTab()");
177 frameTab2->AddFrame(ptab[1], new TGLayoutHints(kLHintsLeft| kLHintsExpandX ,0,0,0,0));
180 // container of "Tab3"
181 TGCompositeFrame *frameTab3 = pMainTab[0]->AddTab("daughters");
182 frameTab3->SetLayoutManager(new TGVerticalLayout(frameTab3));
185 ptab[2] = new TGTab(frameTab3,440,299);
186 ptab[2]->Resize(ptab[2]->GetDefaultSize());
187 ptab[2]->Connect("Selected(Int_t)", "Alieve::V0ListEditor", this, "UpdateSelectedTab()");
188 frameTab3->AddFrame(ptab[2], new TGLayoutHints(kLHintsLeft| kLHintsExpandX ,0,0,0,0));
191 TGCompositeFrame **frameTab = new TGCompositeFrame*[fgkNCanvas];
193 frameTab[0] = AddTab(ptab[0], 0, can, "K0s");
194 frameTab[1] = AddTab(ptab[0], 1, can, "Lambda");
195 frameTab[2] = AddTab(ptab[0], 2, can, "Anti-Lambda");
196 frameTab[3] = AddTab(ptab[0], 3, can, "Arm-Podo");
197 frameTab[4] = AddTab(ptab[0], 4, can, "Index");
198 frameTab[5] = AddTab(ptab[1], 5, can, "cosPointing");
199 frameTab[6] = AddTab(ptab[1], 6, can, "daughterDCA");
200 frameTab[7] = AddTab(ptab[1], 7, can, "radius");
201 frameTab[8] = AddTab(ptab[1], 8, can, "Pt");
202 frameTab[9] = AddTab(ptab[1], 9, can, "eta");
203 frameTab[10] = AddTab(ptab[2], 10, can, "neg Pt");
204 frameTab[11] = AddTab(ptab[2], 11, can, "neg eta");
205 frameTab[12] = AddTab(ptab[2], 12, can, "pos Pt");
206 frameTab[13] = AddTab(ptab[2], 13, can, "pos eta");
208 pMainTab[0]->SetTab(0);
214 gClient->GetColorByName("grey50", darkgrey);
215 ptab[0]->SetBackgroundColor(darkgrey);
216 ptab[1]->SetBackgroundColor(darkgrey);
217 ptab[2]->SetBackgroundColor(darkgrey);
223 //_________________________________________________________________________
224 void V0ListEditor::AddValuator(TGCompositeFrame* frame, char *name,
225 Float_t min, Float_t max, Int_t pres,
226 char *func, Int_t iHist) {
228 TGCompositeFrame* downFrame = new TGCompositeFrame(frame,
229 60, 60, kHorizontalFrame);
232 fRange[iHist] = new RGDoubleValuator(downFrame, name, 200, 0);
233 fRange[iHist]->SetNELength(6);
234 fRange[iHist]->Build();
235 fRange[iHist]->GetSlider()->SetWidth(200);
237 fRange[iHist]->SetLimits(min, max, TGNumberFormat::kNESRealTwo);
239 fRange[iHist]->SetLimits(min, max, TGNumberFormat::kNESInteger);
241 fRange[iHist]->SetLimits(min, max, TGNumberFormat::kNESRealThree);
243 fRange[iHist]->SetLimits(min, max, TGNumberFormat::kNESRealFour);
245 fRange[iHist]->SetLimits(min, max, TGNumberFormat::kNESReal);
247 fRange[iHist]->Connect("ValueSet()",
248 "Alieve::V0ListEditor", this, func);
249 downFrame->AddFrame(fRange[iHist], new TGLayoutHints(kLHintsLeft,
252 TGTextButton* adjustButton = new TGTextButton(downFrame, "Adjust Hist", 40);
255 sprintf(ch,"AdjustHist(=%i)",iHist);
256 adjustButton->Connect("Clicked()", "Alieve::V0ListEditor", this, ch);
257 downFrame->AddFrame(adjustButton, new TGLayoutHints(kLHintsTop, 0, 0, 0, 0));
259 frame->AddFrame(downFrame, new TGLayoutHints(kLHintsTop| kLHintsExpandY,
264 //_________________________________________________________________________
265 void V0ListEditor::AddSelectTab() {
267 TGCompositeFrame** tab = CreateTab(&fMainTabA, fTabA, 1);
269 AddValuator(tab[0], "mass K0s", 0, 5, 3, "MassK0sRange()", 1);
270 AddValuator(tab[1], "mass Lambda", 0, 5, 3, "MassLamRange()", 2);
271 AddValuator(tab[2], "mass Anti-Lambda", 0, 5, 3, "MassAntiLamRange()", 3);
272 AddValuator(tab[4], "ESD v0 index", 0,1e5, 0, "ESDv0IndexRange()", 12);
273 AddValuator(tab[5], "cos pointing angle", 0.8,1, 5, "CosPointingRange()", 5);
274 AddValuator(tab[6], "daughter DCA", 0, 10, 2, "DaughterDcaRange()", 4);
275 AddValuator(tab[7], "radius", 0,100, 2, "RadiusRange()", 6);
276 AddValuator(tab[8], "Pt range", 0, 10, 2, "PtRange()", 0);
277 AddValuator(tab[9], "eta", -2, 2, 2, "EtaRange()", 7);
278 AddValuator(tab[10], "neg Pt", 0, 10, 2, "NegPtRange()", 8);
279 AddValuator(tab[11], "neg eta", -2, 2, 2, "NegEtaRange()", 9);
280 AddValuator(tab[12], "pos Pt", 0, 10, 2, "PosPtRange()", 10);
281 AddValuator(tab[13], "pos eta", -2, 2, 2, "PosEtaRange()", 11);
287 //_________________________________________________________________________
288 void V0ListEditor::AddSeeTab() {
290 TGCompositeFrame** tab = CreateTab(&fMainTabB, fTabB, 2);
295 //_________________________________________________________________________
296 void V0ListEditor::AdjustHist(Int_t iHist) {
298 if (! fMList) return;
299 fMList->AdjustHist(iHist);
304 //_________________________________________________________________________
305 void V0ListEditor::ResetCuts() {
307 if (! fMList) return;
311 for (Int_t i=0; i<fgkNRange;i++) {
314 min = fRange[i]->GetLimitMin();
315 max = fRange[i]->GetLimitMax();
316 fMList->SetMin(i, min);
317 fMList->SetMax(i, max);
318 fRange[i]->SetValues(min, max);
319 fMList->AdjustHist(i);
322 // for the Index we scan its actual range
324 fMList->GetV0IndexRange(imin, imax);
326 Int_t minH = imin - (imax-imin)/20;
327 Int_t maxH = imax + (imax-imin)/20;
328 fMList->SetMin(12, minH);
329 fMList->SetMax(12, maxH);
330 fRange[12]->SetLimits(minH, maxH, TGNumberFormat::kNESInteger);
331 fRange[12]->SetValues(minH, maxH);
332 fMList->AdjustHist(12);
341 //_________________________________________________________________________
342 void V0ListEditor::FillCanvas() {
351 Int_t canvasMap[fgkNCanvas]={1,2,3,1000,12,5,4,6,0, 7,8,9,10,11};
353 for (Int_t i=0; i<fgkNCanvas; i++)
356 is2D = canvasMap[i]>999;
358 if (is2D) hist2D = fMList->GetHist2D(canvasMap[i]-1000);
359 else hist = fMList->GetHist(canvasMap[i]);
361 c1 = fCanvasA[i]->GetCanvas();
363 if (is2D) hist2D->Draw("colz"); else hist->Draw();
367 c1b = fCanvasB[i]->GetCanvas();
369 if (is2D) hist2D->Draw("colz"); else hist->Draw();
377 //_________________________________________________________________________
378 void V0ListEditor::UpdateSelectedTab() {
383 gClient->GetColorByName("yellow", yellow);
384 gClient->GetColorByName("grey", grey);
386 TGTabElement *tabElem;
387 for (i=0; i<fMainTabA->GetNumberOfTabs(); i++) {
389 tabElem = fMainTabA->GetTabTab(i);
390 tabElem->ChangeBackground(grey);
392 for (j=0; j<fTabA[i]->GetNumberOfTabs();j++) {
393 tabElem = fTabA[i]->GetTabTab(j);
394 tabElem->ChangeBackground(grey);
398 Int_t currentTab = fMainTabA->GetCurrent();
399 Int_t currentSubTab = fTabA[currentTab]->GetCurrent();
400 tabElem = fMainTabA->GetTabTab(currentTab);
401 tabElem->ChangeBackground(yellow);
402 tabElem = fTabA[currentTab]->GetTabTab(currentSubTab);
403 tabElem->ChangeBackground(yellow);
409 while (currentTab>i) {
410 iCan += fTabA[i]->GetNumberOfTabs();
413 iCan += currentSubTab;
414 c1 = fCanvasA[iCan]->GetCanvas();
415 c1->GetCanvas()->Modified();
416 c1->GetCanvas()->Update();
420 for (i=0; i<fMainTabB->GetNumberOfTabs(); i++) {
422 tabElem = fMainTabB->GetTabTab(i);
423 tabElem->ChangeBackground(grey);
425 for (j=0; j<fTabB[i]->GetNumberOfTabs();j++) {
426 tabElem = fTabB[i]->GetTabTab(j);
427 tabElem->ChangeBackground(grey);
431 currentTab = fMainTabB->GetCurrent();
432 currentSubTab = fTabB[currentTab]->GetCurrent();
433 tabElem = fMainTabB->GetTabTab(currentTab);
434 tabElem->ChangeBackground(yellow);
435 tabElem = fTabB[currentTab]->GetTabTab(currentSubTab);
436 tabElem->ChangeBackground(yellow);
441 while (currentTab>i) {
442 iCan += fTabB[i]->GetNumberOfTabs();
445 iCan += currentSubTab;
446 c1 = fCanvasB[iCan]->GetCanvas();
447 c1->GetCanvas()->Modified();
448 c1->GetCanvas()->Update();
452 //_________________________________________________________________________
453 void V0ListEditor::UpdateAll(Int_t iCanA) {
455 TCanvas *c1 = fCanvasA[iCanA]->GetCanvas();
459 static Int_t iCan, i;
462 while (fMainTabB->GetCurrent()>i) {
463 iCan += fTabB[i]->GetNumberOfTabs();
466 iCan += fTabB[i]->GetCurrent();
467 c1 = fCanvasB[iCan]->GetCanvas();
468 c1->GetCanvas()->Modified();
469 c1->GetCanvas()->Update();
475 //_________________________________________________________________________
477 void V0ListEditor::DoRnrV0vtx()
479 fMList->SetRnrV0vtx(fRnrV0vtx->IsOn());
483 void V0ListEditor::DoRnrV0path()
485 fMList->SetRnrV0path(fRnrV0path->IsOn());
489 void V0ListEditor::DoRnrDaughters()
491 fMList->SetRnrDaughters(fRnrV0sDaugh->IsOn());
496 //_________________________________________________________________________
497 void V0ListEditor::MassK0sRange() {
499 fMList->K0sMFilter(fRange[1]->GetMin(), fRange[1]->GetMax());
503 //_________________________________________________________________________
504 void V0ListEditor::MassLamRange() {
505 fMList->LamMFilter(fRange[2]->GetMin(), fRange[2]->GetMax());
509 //_________________________________________________________________________
510 void V0ListEditor::MassAntiLamRange() {
511 fMList->ALamMFilter(fRange[3]->GetMin(), fRange[3]->GetMax());
515 //_________________________________________________________________________
516 void V0ListEditor::ESDv0IndexRange() {
517 fMList->IndexFilter(fRange[12]->GetMin(), fRange[12]->GetMax());
521 //_________________________________________________________________________
522 void V0ListEditor::CosPointingRange() {
523 fMList->CosPointingFilter(fRange[5]->GetMin(), fRange[5]->GetMax());
527 //_________________________________________________________________________
528 void V0ListEditor::DaughterDcaRange() {
529 fMList->DaughterDCAFilter(fRange[4]->GetMin(), fRange[4]->GetMax());
533 //_________________________________________________________________________
534 void V0ListEditor::RadiusRange() {
535 fMList->RadiusFilter(fRange[6]->GetMin(), fRange[6]->GetMax());
539 //_________________________________________________________________________
540 void V0ListEditor::PtRange()
542 fMList->PtFilter(fRange[0]->GetMin(), fRange[0]->GetMax());
546 //_________________________________________________________________________
547 void V0ListEditor::EtaRange() {
548 fMList->EtaFilter(fRange[7]->GetMin(), fRange[7]->GetMax());
552 //_________________________________________________________________________
553 void V0ListEditor::NegPtRange() {
554 fMList->NegPtFilter(fRange[8]->GetMin(), fRange[8]->GetMax());
558 //_________________________________________________________________________
559 void V0ListEditor::NegEtaRange() {
560 fMList->NegEtaFilter(fRange[9]->GetMin(), fRange[9]->GetMax());
564 //_________________________________________________________________________
565 void V0ListEditor::PosPtRange() {
566 fMList->PosPtFilter(fRange[10]->GetMin(), fRange[10]->GetMax());
570 //_________________________________________________________________________
571 void V0ListEditor::PosEtaRange() {
572 fMList->PosEtaFilter(fRange[11]->GetMin(), fRange[11]->GetMax());