2 /***********************************************************************
3 This editor appears in the Reve window when v0 are visualize.
4 It allows to select the v0 as a function of some useful parameters.
6 Ludovic Gaudichet (gaudichet@to.infn.it)
7 ************************************************************************/
12 #include "CascadeEditors.h"
13 #include <Reve/Cascade.h>
15 #include <Reve/RGValuators.h>
17 #include <TVirtualPad.h>
22 #include <TGNumberEntry.h>
23 #include <TGColorSelect.h>
24 #include <TGDoubleSlider.h>
27 #include <TRootEmbeddedCanvas.h>
36 //______________________________________________________________________
40 ClassImp(CascadeListEditor)
42 CascadeListEditor::CascadeListEditor(const TGWindow *p,
43 Int_t width, Int_t height,
44 UInt_t options, Pixel_t back) :
45 TGedFrame(p, width, height, options | kVerticalFrame, back),
55 MakeTitle("CascadeList");
57 //TGHorizontalFrame* frame = new TGHorizontalFrame(this);
59 // --- Rendering control
61 fRnrVtx = new TGCheckButton(this, "Render v0 and cascade vertices");
62 AddFrame(fRnrVtx, new TGLayoutHints(kLHintsTop, 3, 1, 1, 0));
63 fRnrVtx->Connect("Toggled(Bool_t)",
64 "Reve::CascadeListEditor", this, "DoRnrVtx()");
66 fRnrV0path = new TGCheckButton(this, "Render v0 path");
67 AddFrame(fRnrV0path, new TGLayoutHints(kLHintsTop, 3, 1, 1, 0));
68 fRnrV0path->Connect("Toggled(Bool_t)",
69 "Reve::CascadeListEditor", this, "DoRnrV0path()");
71 fRnrCasPath = new TGCheckButton(this, "Render cascade path");
72 AddFrame(fRnrCasPath, new TGLayoutHints(kLHintsTop, 3, 1, 1, 0));
73 fRnrCasPath->Connect("Toggled(Bool_t)",
74 "Reve::CascadeListEditor", this, "DoRnrCasPath()");
76 fRnrV0Daughters = new TGCheckButton(this, "Render v0 daughter tracks");
77 AddFrame(fRnrV0Daughters, new TGLayoutHints(kLHintsTop, 3, 1, 1, 0));
78 fRnrV0Daughters->Connect("Toggled(Bool_t)",
79 "Reve::CascadeListEditor", this, "DoRnrV0Daughters()");
81 fRnrBach = new TGCheckButton(this, "Render bachelor track");
82 AddFrame(fRnrBach, new TGLayoutHints(kLHintsTop, 3, 1, 1, 0));
83 fRnrBach->Connect("Toggled(Bool_t)",
84 "Reve::CascadeListEditor", this, "DoRnrBach()");
86 for (Int_t i=0; i<fgkNRange; i++) fRange[i]=0;
87 for (Int_t i=0; i<fgkNCanvas; i++) fCanvasA[i]=0;
88 for (Int_t i=0; i<fgkNCanvas; i++) fCanvasB[i]=0;
93 TGTextButton* resetCutsButton = new TGTextButton(this, "Reset all cuts", 40);
94 resetCutsButton->Connect("Clicked()", "Reve::CascadeListEditor", this, "ResetCuts()");
95 AddFrame(resetCutsButton, new TGLayoutHints(kLHintsTop, 3, 1, 1, 0));
98 CascadeListEditor::~CascadeListEditor()
102 //_________________________________________________________________________
103 void CascadeListEditor::SetModel(TObject* obj)
105 fMList = dynamic_cast<CascadeList*>(obj);
107 for (Int_t i=0; i<fgkNRange; i++)
109 fRange[i]->SetValues( fMList->GetMin(i), fMList->GetMax(i) );
111 fRnrV0Daughters->SetState(fMList->GetRnrV0Daughters() ? kButtonDown : kButtonUp);
112 fRnrV0path->SetState(fMList->GetRnrV0path() ? kButtonDown : kButtonUp);
113 fRnrVtx->SetState(fMList->GetRnrCasVtx() ? kButtonDown : kButtonUp);
114 fRnrBach->SetState(fMList->GetRnrBachelor() ? kButtonDown : kButtonUp);
115 fRnrCasPath->SetState(fMList->GetRnrCasPath() ? kButtonDown : kButtonUp);
121 //_________________________________________________________________________
122 TGCompositeFrame* CascadeListEditor::AddTab(TGTab* tab, Int_t i, Int_t can,
125 TGCompositeFrame* frameTab = tab->AddTab(name);
126 frameTab->SetLayoutManager(new TGVerticalLayout( frameTab ));
128 TRootEmbeddedCanvas** embeddedCanvas = 0;
130 if (can==1) embeddedCanvas = &fCanvasA[i];
131 else if (can==2) embeddedCanvas = &fCanvasB[i];
133 *embeddedCanvas = new TRootEmbeddedCanvas("EmbeddedCanvas", frameTab, 200, 200);
134 TCanvas *c1 = (*embeddedCanvas)->GetCanvas();
135 c1->SetBorderMode(0);
138 c1->SetBorderMode(0);
140 frameTab->AddFrame(*embeddedCanvas, new TGLayoutHints(kLHintsTop|kLHintsExpandX,
146 //_________________________________________________________________________
147 TGCompositeFrame** CascadeListEditor::CreateTab(TGTab **pMainTab, TGTab **ptab, Int_t can) {
151 pMainTab[0] = new TGTab(this,0,0);
152 pMainTab[0]->Connect("Selected(Int_t)", "Reve::CascadeListEditor", this, "UpdateSelectedTab()");
153 this->AddFrame(pMainTab[0], new TGLayoutHints( kLHintsTop | kLHintsExpandX,2,2,2,2));
156 // container of "Tab1"
157 TGCompositeFrame *frameTab1 = pMainTab[0]->AddTab("ident.");
158 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)", "Reve::CascadeListEditor", 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("cascade");
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)", "Reve::CascadeListEditor", 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("V0daugh/bach.");
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)", "Reve::CascadeListEditor", 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, "Xi");
194 frameTab[1] = AddTab(ptab[0], 1, can, "Omega");
195 frameTab[2] = AddTab(ptab[0], 2, can, "Arm.Podo.");
196 frameTab[3] = AddTab(ptab[0], 3, can, "Index");
198 frameTab[4] = AddTab(ptab[1], 4, can, "cosPointing");
199 frameTab[5] = AddTab(ptab[1], 5, can, "bachV0DCA");
200 frameTab[6] = AddTab(ptab[1], 6, can, "radius");
201 frameTab[7] = AddTab(ptab[1], 7, can, "Pt");
202 frameTab[8] = AddTab(ptab[1], 8, can, "eta");
204 frameTab[9] = AddTab(ptab[2], 9, can, "neg Pt");
205 frameTab[10] = AddTab(ptab[2], 10, can, "neg eta");
206 frameTab[11] = AddTab(ptab[2], 11, can, "pos Pt");
207 frameTab[12] = AddTab(ptab[2], 12, can, "pos eta");
208 frameTab[13] = AddTab(ptab[2], 13, can, "bach Pt");
209 frameTab[14] = AddTab(ptab[2], 14, can, "bach eta");
211 pMainTab[0]->SetTab(0);
217 gClient->GetColorByName("grey50", darkgrey);
218 ptab[0]->SetBackgroundColor(darkgrey);
219 ptab[1]->SetBackgroundColor(darkgrey);
220 ptab[2]->SetBackgroundColor(darkgrey);
226 //_________________________________________________________________________
227 void CascadeListEditor::AddValuator(TGCompositeFrame* frame, char *name,
228 Float_t min, Float_t max, Int_t pres,
229 char *func, Int_t iHist) {
231 TGCompositeFrame* downFrame = new TGCompositeFrame(frame,
232 60, 60, kHorizontalFrame);
235 fRange[iHist] = new RGDoubleValuator(downFrame, name, 200, 0);
236 fRange[iHist]->SetNELength(6);
237 fRange[iHist]->Build();
238 fRange[iHist]->GetSlider()->SetWidth(200);
240 fRange[iHist]->SetLimits(min, max, TGNumberFormat::kNESRealTwo);
242 fRange[iHist]->SetLimits(min, max, TGNumberFormat::kNESInteger);
244 fRange[iHist]->SetLimits(min, max, TGNumberFormat::kNESRealThree);
246 fRange[iHist]->SetLimits(min, max, TGNumberFormat::kNESRealFour);
248 fRange[iHist]->SetLimits(min, max, TGNumberFormat::kNESReal);
250 fRange[iHist]->Connect("ValueSet()",
251 "Reve::CascadeListEditor", this, func);
252 downFrame->AddFrame(fRange[iHist], new TGLayoutHints(kLHintsLeft,
255 TGTextButton* adjustButton = new TGTextButton(downFrame, "Adjust Hist", 40);
258 sprintf(ch,"AdjustHist(=%i)",iHist);
259 adjustButton->Connect("Clicked()", "Reve::CascadeListEditor", this, ch);
260 downFrame->AddFrame(adjustButton, new TGLayoutHints(kLHintsTop, 0, 0, 0, 0));
262 frame->AddFrame(downFrame, new TGLayoutHints(kLHintsTop| kLHintsExpandY,
267 //_________________________________________________________________________
268 void CascadeListEditor::AddSelectTab() {
270 TGCompositeFrame** tab = CreateTab(&fMainTabA, fTabA, 1);
272 AddValuator(tab[0], "mass Xi", 0, 5, 3, "MassXiRange()", 0);
273 AddValuator(tab[1], "mass Omega", 0, 5, 3, "MassOmegaRange()", 1);
275 AddValuator(tab[3], "Index", 0, 1e5, 0, "IndexRange()", 2);
276 AddValuator(tab[4], "cos pointing angle", 0.8, 1, 5, "CosPointingRange()", 3);
277 AddValuator(tab[5], "bach-V0 DCA", 0, 5, 3, "BachV0DCARange()", 4);
278 AddValuator(tab[6], "radius", 0, 100, 2, "RadiusRange()", 5);
279 AddValuator(tab[7], "Pt", 0, 10, 2, "PtRange()", 6);
280 AddValuator(tab[8], "Pseudo-rapidity", -2, 2, 2, "PseudoRapRange()", 7);
282 AddValuator(tab[9], "neg Pt", 0, 10, 2, "NegPtRange()", 8);
283 AddValuator(tab[10], "neg pseudo-rapidity", -2, 2, 2, "NegEtaRange()", 9);
284 AddValuator(tab[11], "pos Pt", 0, 10, 2, "PosPtRange()", 10);
285 AddValuator(tab[12], "pos pseudo-rapidity", -2, 2, 2, "PosEtaRange()", 11);
286 AddValuator(tab[13], "bach. Pt", 0, 10, 2, "BachPtRange()", 12);
287 AddValuator(tab[14], "bach. pseudo-rapidity", -2, 2, 2, "BachEtaRange()", 13);
293 //_________________________________________________________________________
294 void CascadeListEditor::AddSeeTab() {
296 TGCompositeFrame** tab = CreateTab(&fMainTabB, fTabB, 2);
301 //_________________________________________________________________________
302 void CascadeListEditor::AdjustHist(Int_t iHist) {
304 if (! fMList) return;
305 fMList->AdjustHist(iHist);
310 //_________________________________________________________________________
311 void CascadeListEditor::ResetCuts() {
313 if (! fMList) return;
317 for (Int_t i=0; i<fgkNRange;i++) {
320 min = fRange[i]->GetLimitMin();
321 max = fRange[i]->GetLimitMax();
322 fMList->SetMin(i, min);
323 fMList->SetMax(i, max);
324 fRange[i]->SetValues(min, max);
325 fMList->AdjustHist(i);
328 // for the Index we scan its actual range
330 fMList->GetCasIndexRange(imin, imax);
332 Int_t minH = imin-(imax-imin)/20;
333 Int_t maxH = imax+(imax-imin)/20;
334 fMList->SetMin(2, minH);
335 fMList->SetMax(2, maxH);
336 fRange[2]->SetLimits(minH, maxH, TGNumberFormat::kNESInteger);
337 fRange[2]->SetValues(minH, maxH);
338 fMList->AdjustHist(2);
346 //_________________________________________________________________________
347 void CascadeListEditor::FillCanvas() {
356 Int_t canvasMap[fgkNCanvas]={0,1,1000,2,3,4,5,6,7,8,9,10,11,12,13};
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();
380 //_________________________________________________________________________
381 void CascadeListEditor::UpdateSelectedTab() {
385 gClient->GetColorByName("yellow", yellow);
386 gClient->GetColorByName("grey", grey);
388 TGTabElement *tabElem;
389 for (Int_t i=0; i<fMainTabA->GetNumberOfTabs(); i++) {
391 tabElem = fMainTabA->GetTabTab(i);
392 tabElem->ChangeBackground(grey);
394 for (Int_t j=0; j<fTabA[i]->GetNumberOfTabs();j++) {
395 tabElem = fTabA[i]->GetTabTab(j);
396 tabElem->ChangeBackground(grey);
400 Int_t currentTab = fMainTabA->GetCurrent();
401 Int_t currentSubTab = fTabA[currentTab]->GetCurrent();
402 tabElem = fMainTabA->GetTabTab(currentTab);
403 tabElem->ChangeBackground(yellow);
404 tabElem = fTabA[currentTab]->GetTabTab(currentSubTab);
405 tabElem->ChangeBackground(yellow);
411 while (currentTab>i) {
412 iCan += fTabA[i]->GetNumberOfTabs();
415 iCan += currentSubTab;
416 c1 = fCanvasA[iCan]->GetCanvas();
417 c1->GetCanvas()->Modified();
418 c1->GetCanvas()->Update();
422 for (Int_t i=0; i<fMainTabB->GetNumberOfTabs(); i++) {
424 tabElem = fMainTabB->GetTabTab(i);
425 tabElem->ChangeBackground(grey);
427 for (Int_t j=0; j<fTabB[i]->GetNumberOfTabs();j++) {
428 tabElem = fTabB[i]->GetTabTab(j);
429 tabElem->ChangeBackground(grey);
433 currentTab = fMainTabB->GetCurrent();
434 currentSubTab = fTabB[currentTab]->GetCurrent();
435 tabElem = fMainTabB->GetTabTab(currentTab);
436 tabElem->ChangeBackground(yellow);
437 tabElem = fTabB[currentTab]->GetTabTab(currentSubTab);
438 tabElem->ChangeBackground(yellow);
443 while (currentTab>i) {
444 iCan += fTabB[i]->GetNumberOfTabs();
447 iCan += currentSubTab;
448 c1 = fCanvasB[iCan]->GetCanvas();
449 c1->GetCanvas()->Modified();
450 c1->GetCanvas()->Update();
454 //_________________________________________________________________________
455 void CascadeListEditor::UpdateAll(Int_t iCanA) {
457 TCanvas *c1 = fCanvasA[iCanA]->GetCanvas();
461 static Int_t iCan, i;
464 while (fMainTabB->GetCurrent()>i) {
465 iCan += fTabB[i]->GetNumberOfTabs();
468 iCan += fTabB[i]->GetCurrent();
469 c1 = fCanvasB[iCan]->GetCanvas();
470 c1->GetCanvas()->Modified();
471 c1->GetCanvas()->Update();
477 //_________________________________________________________________________
479 void CascadeListEditor::DoRnrVtx()
481 fMList->SetRnrCasVtx(fRnrVtx->IsOn());
485 void CascadeListEditor::DoRnrV0path()
487 fMList->SetRnrV0path(fRnrV0path->IsOn());
491 void CascadeListEditor::DoRnrV0Daughters()
493 fMList->SetRnrV0Daughters(fRnrV0Daughters->IsOn());
497 void CascadeListEditor::DoRnrBach()
499 fMList->SetRnrBachelor(fRnrBach->IsOn());
503 void CascadeListEditor::DoRnrCasPath()
505 fMList->SetRnrCasPath(fRnrCasPath->IsOn());
510 //_________________________________________________________________________
511 void CascadeListEditor::MassXiRange() {
513 fMList->XiMassFilter(fRange[0]->GetMin(), fRange[0]->GetMax());
517 //_________________________________________________________________________
518 void CascadeListEditor::MassOmegaRange() {
519 fMList->OmegaMassFilter(fRange[1]->GetMin(), fRange[1]->GetMax());
523 //_________________________________________________________________________
524 void CascadeListEditor::IndexRange() {
525 fMList->IndexFilter(fRange[2]->GetMin(), fRange[2]->GetMax());
528 //_________________________________________________________________________
529 void CascadeListEditor::CosPointingRange() {
530 fMList->CosPointingFilter(fRange[3]->GetMin(), fRange[3]->GetMax());
534 //_________________________________________________________________________
535 void CascadeListEditor::BachV0DCARange() {
536 fMList->BachV0DCAFilter(fRange[4]->GetMin(), fRange[4]->GetMax());
540 //_________________________________________________________________________
541 void CascadeListEditor::RadiusRange() {
542 fMList->RadiusFilter(fRange[5]->GetMin(), fRange[5]->GetMax());
546 //_________________________________________________________________________
547 void CascadeListEditor::PtRange() {
548 fMList->PtFilter(fRange[6]->GetMin(), fRange[6]->GetMax());
552 //_________________________________________________________________________
553 void CascadeListEditor::PseudoRapRange() {
554 fMList->PseudoRapFilter(fRange[7]->GetMin(), fRange[7]->GetMax());
558 //_________________________________________________________________________
559 void CascadeListEditor::NegPtRange() {
560 fMList->NegPtFilter(fRange[8]->GetMin(), fRange[8]->GetMax());
564 //_________________________________________________________________________
565 void CascadeListEditor::NegEtaRange() {
566 fMList->NegEtaFilter(fRange[9]->GetMin(), fRange[9]->GetMax());
570 //_________________________________________________________________________
571 void CascadeListEditor::PosPtRange() {
572 fMList->PosPtFilter(fRange[10]->GetMin(), fRange[10]->GetMax());
576 //_________________________________________________________________________
577 void CascadeListEditor::PosEtaRange() {
578 fMList->PosEtaFilter(fRange[11]->GetMin(), fRange[11]->GetMax());
582 //_________________________________________________________________________
583 void CascadeListEditor::BachPtRange() {
584 fMList->BachPtFilter(fRange[12]->GetMin(), fRange[12]->GetMax());
588 //_________________________________________________________________________
589 void CascadeListEditor::BachEtaRange() {
590 fMList->BachEtaFilter(fRange[13]->GetMin(), fRange[13]->GetMax());