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 ************************************************************************/
9 #include "CascadeEditors.h"
10 #include <Alieve/Cascade.h>
12 #include <Reve/RGValuators.h>
14 #include <TVirtualPad.h>
19 #include <TGNumberEntry.h>
20 #include <TGColorSelect.h>
21 #include <TGDoubleSlider.h>
24 #include <TRootEmbeddedCanvas.h>
32 using namespace Alieve;
34 //______________________________________________________________________
38 ClassImp(Alieve::CascadeListEditor)
40 CascadeListEditor::CascadeListEditor(const TGWindow *p,
41 Int_t width, Int_t height,
42 UInt_t options, Pixel_t back) :
43 TGedFrame(p, width, height, options | kVerticalFrame, back),
53 MakeTitle("CascadeList");
55 //TGHorizontalFrame* frame = new TGHorizontalFrame(this);
57 // --- Rendering control
59 fRnrVtx = new TGCheckButton(this, "Render v0 and cascade vertices");
60 AddFrame(fRnrVtx, new TGLayoutHints(kLHintsTop, 3, 1, 1, 0));
61 fRnrVtx->Connect("Toggled(Bool_t)",
62 "Alieve::CascadeListEditor", this, "DoRnrVtx()");
64 fRnrV0path = new TGCheckButton(this, "Render v0 path");
65 AddFrame(fRnrV0path, new TGLayoutHints(kLHintsTop, 3, 1, 1, 0));
66 fRnrV0path->Connect("Toggled(Bool_t)",
67 "Alieve::CascadeListEditor", this, "DoRnrV0path()");
69 fRnrCasPath = new TGCheckButton(this, "Render cascade path");
70 AddFrame(fRnrCasPath, new TGLayoutHints(kLHintsTop, 3, 1, 1, 0));
71 fRnrCasPath->Connect("Toggled(Bool_t)",
72 "Alieve::CascadeListEditor", this, "DoRnrCasPath()");
74 fRnrV0Daughters = new TGCheckButton(this, "Render v0 daughter tracks");
75 AddFrame(fRnrV0Daughters, new TGLayoutHints(kLHintsTop, 3, 1, 1, 0));
76 fRnrV0Daughters->Connect("Toggled(Bool_t)",
77 "Alieve::CascadeListEditor", this, "DoRnrV0Daughters()");
79 fRnrBach = new TGCheckButton(this, "Render bachelor track");
80 AddFrame(fRnrBach, new TGLayoutHints(kLHintsTop, 3, 1, 1, 0));
81 fRnrBach->Connect("Toggled(Bool_t)",
82 "Alieve::CascadeListEditor", this, "DoRnrBach()");
84 for (Int_t i=0; i<fgkNRange; i++) fRange[i]=0;
85 for (Int_t i=0; i<fgkNCanvas; i++) fCanvasA[i]=0;
86 for (Int_t i=0; i<fgkNCanvas; i++) fCanvasB[i]=0;
91 TGTextButton* resetCutsButton = new TGTextButton(this, "Reset all cuts", 40);
92 resetCutsButton->Connect("Clicked()", "Alieve::CascadeListEditor", this, "ResetCuts()");
93 AddFrame(resetCutsButton, new TGLayoutHints(kLHintsTop, 3, 1, 1, 0));
96 CascadeListEditor::~CascadeListEditor()
100 //_________________________________________________________________________
101 void CascadeListEditor::SetModel(TObject* obj)
103 fMList = dynamic_cast<CascadeList*>(obj);
105 for (Int_t i=0; i<fgkNRange; i++)
107 fRange[i]->SetValues( fMList->GetMin(i), fMList->GetMax(i) );
109 fRnrV0Daughters->SetState(fMList->GetRnrV0Daughters() ? kButtonDown : kButtonUp);
110 fRnrV0path->SetState(fMList->GetRnrV0path() ? kButtonDown : kButtonUp);
111 fRnrVtx->SetState(fMList->GetRnrCasVtx() ? kButtonDown : kButtonUp);
112 fRnrBach->SetState(fMList->GetRnrBachelor() ? kButtonDown : kButtonUp);
113 fRnrCasPath->SetState(fMList->GetRnrCasPath() ? kButtonDown : kButtonUp);
119 //_________________________________________________________________________
120 TGCompositeFrame* CascadeListEditor::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** CascadeListEditor::CreateTab(TGTab **pMainTab, TGTab **ptab, Int_t can) {
149 pMainTab[0] = new TGTab(this,0,0);
150 pMainTab[0]->Connect("Selected(Int_t)", "Alieve::CascadeListEditor", this, "UpdateSelectedTab()");
151 this->AddFrame(pMainTab[0], new TGLayoutHints( kLHintsTop | kLHintsExpandX,2,2,2,2));
154 // container of "Tab1"
155 TGCompositeFrame *frameTab1 = pMainTab[0]->AddTab("ident.");
156 frameTab1->SetLayoutManager(new TGVerticalLayout(frameTab1));
159 ptab[0] = new TGTab(frameTab1,2,2);
160 ptab[0]->Resize(ptab[0]->GetDefaultSize());
161 // The following is for updating the canvas of a tab if this one is selected
162 // (it updates every canvas)
163 ptab[0]->Connect("Selected(Int_t)", "Alieve::CascadeListEditor", this, "UpdateSelectedTab()");
164 frameTab1->AddFrame(ptab[0], new TGLayoutHints(kLHintsLeft| kLHintsExpandX,0,0,0,0));
167 // container of "Tab2"
168 TGCompositeFrame *frameTab2 = pMainTab[0]->AddTab("cascade");
169 frameTab2->SetLayoutManager(new TGVerticalLayout(frameTab2));
172 ptab[1] = new TGTab(frameTab2,440,299);
173 ptab[1]->Resize(ptab[1]->GetDefaultSize());
174 ptab[1]->Connect("Selected(Int_t)", "Alieve::CascadeListEditor", this, "UpdateSelectedTab()");
175 frameTab2->AddFrame(ptab[1], new TGLayoutHints(kLHintsLeft| kLHintsExpandX ,0,0,0,0));
178 // container of "Tab3"
179 TGCompositeFrame *frameTab3 = pMainTab[0]->AddTab("V0daugh/bach.");
180 frameTab3->SetLayoutManager(new TGVerticalLayout(frameTab3));
183 ptab[2] = new TGTab(frameTab3,440,299);
184 ptab[2]->Resize(ptab[2]->GetDefaultSize());
185 ptab[2]->Connect("Selected(Int_t)", "Alieve::CascadeListEditor", this, "UpdateSelectedTab()");
186 frameTab3->AddFrame(ptab[2], new TGLayoutHints(kLHintsLeft| kLHintsExpandX ,0,0,0,0));
189 TGCompositeFrame **frameTab = new TGCompositeFrame*[fgkNCanvas];
191 frameTab[0] = AddTab(ptab[0], 0, can, "Xi");
192 frameTab[1] = AddTab(ptab[0], 1, can, "Omega");
193 frameTab[2] = AddTab(ptab[0], 2, can, "Arm.Podo.");
194 frameTab[3] = AddTab(ptab[0], 3, can, "Index");
196 frameTab[4] = AddTab(ptab[1], 4, can, "cosPointing");
197 frameTab[5] = AddTab(ptab[1], 5, can, "bachV0DCA");
198 frameTab[6] = AddTab(ptab[1], 6, can, "radius");
199 frameTab[7] = AddTab(ptab[1], 7, can, "Pt");
200 frameTab[8] = AddTab(ptab[1], 8, can, "eta");
202 frameTab[9] = AddTab(ptab[2], 9, can, "neg Pt");
203 frameTab[10] = AddTab(ptab[2], 10, can, "neg eta");
204 frameTab[11] = AddTab(ptab[2], 11, can, "pos Pt");
205 frameTab[12] = AddTab(ptab[2], 12, can, "pos eta");
206 frameTab[13] = AddTab(ptab[2], 13, can, "bach Pt");
207 frameTab[14] = AddTab(ptab[2], 14, can, "bach eta");
209 pMainTab[0]->SetTab(0);
215 gClient->GetColorByName("grey50", darkgrey);
216 ptab[0]->SetBackgroundColor(darkgrey);
217 ptab[1]->SetBackgroundColor(darkgrey);
218 ptab[2]->SetBackgroundColor(darkgrey);
224 //_________________________________________________________________________
225 void CascadeListEditor::AddValuator(TGCompositeFrame* frame, char *name,
226 Float_t min, Float_t max, Int_t pres,
227 char *func, Int_t iHist) {
229 TGCompositeFrame* downFrame = new TGCompositeFrame(frame,
230 60, 60, kHorizontalFrame);
233 fRange[iHist] = new RGDoubleValuator(downFrame, name, 200, 0);
234 fRange[iHist]->SetNELength(6);
235 fRange[iHist]->Build();
236 fRange[iHist]->GetSlider()->SetWidth(200);
238 fRange[iHist]->SetLimits(min, max, TGNumberFormat::kNESRealTwo);
240 fRange[iHist]->SetLimits(min, max, TGNumberFormat::kNESInteger);
242 fRange[iHist]->SetLimits(min, max, TGNumberFormat::kNESRealThree);
244 fRange[iHist]->SetLimits(min, max, TGNumberFormat::kNESRealFour);
246 fRange[iHist]->SetLimits(min, max, TGNumberFormat::kNESReal);
248 fRange[iHist]->Connect("ValueSet()",
249 "Alieve::CascadeListEditor", this, func);
250 downFrame->AddFrame(fRange[iHist], new TGLayoutHints(kLHintsLeft,
253 TGTextButton* adjustButton = new TGTextButton(downFrame, "Adjust Hist", 40);
256 sprintf(ch,"AdjustHist(=%i)",iHist);
257 adjustButton->Connect("Clicked()", "Alieve::CascadeListEditor", this, ch);
258 downFrame->AddFrame(adjustButton, new TGLayoutHints(kLHintsTop, 0, 0, 0, 0));
260 frame->AddFrame(downFrame, new TGLayoutHints(kLHintsTop| kLHintsExpandY,
265 //_________________________________________________________________________
266 void CascadeListEditor::AddSelectTab() {
268 TGCompositeFrame** tab = CreateTab(&fMainTabA, fTabA, 1);
270 AddValuator(tab[0], "mass Xi", 0, 5, 3, "MassXiRange()", 0);
271 AddValuator(tab[1], "mass Omega", 0, 5, 3, "MassOmegaRange()", 1);
273 AddValuator(tab[3], "Index", 0, 1e5, 0, "IndexRange()", 2);
274 AddValuator(tab[4], "cos pointing angle", 0.8, 1, 5, "CosPointingRange()", 3);
275 AddValuator(tab[5], "bach-V0 DCA", 0, 5, 3, "BachV0DCARange()", 4);
276 AddValuator(tab[6], "radius", 0, 100, 2, "RadiusRange()", 5);
277 AddValuator(tab[7], "Pt", 0, 10, 2, "PtRange()", 6);
278 AddValuator(tab[8], "Pseudo-rapidity", -2, 2, 2, "PseudoRapRange()", 7);
280 AddValuator(tab[9], "neg Pt", 0, 10, 2, "NegPtRange()", 8);
281 AddValuator(tab[10], "neg pseudo-rapidity", -2, 2, 2, "NegEtaRange()", 9);
282 AddValuator(tab[11], "pos Pt", 0, 10, 2, "PosPtRange()", 10);
283 AddValuator(tab[12], "pos pseudo-rapidity", -2, 2, 2, "PosEtaRange()", 11);
284 AddValuator(tab[13], "bach. Pt", 0, 10, 2, "BachPtRange()", 12);
285 AddValuator(tab[14], "bach. pseudo-rapidity", -2, 2, 2, "BachEtaRange()", 13);
291 //_________________________________________________________________________
292 void CascadeListEditor::AddSeeTab() {
294 TGCompositeFrame** tab = CreateTab(&fMainTabB, fTabB, 2);
299 //_________________________________________________________________________
300 void CascadeListEditor::AdjustHist(Int_t iHist) {
302 if (! fMList) return;
303 fMList->AdjustHist(iHist);
308 //_________________________________________________________________________
309 void CascadeListEditor::ResetCuts() {
311 if (! fMList) return;
315 for (Int_t i=0; i<fgkNRange;i++) {
318 min = fRange[i]->GetLimitMin();
319 max = fRange[i]->GetLimitMax();
320 fMList->SetMin(i, min);
321 fMList->SetMax(i, max);
322 fRange[i]->SetValues(min, max);
323 fMList->AdjustHist(i);
326 // for the Index we scan its actual range
328 fMList->GetCasIndexRange(imin, imax);
330 Int_t minH = imin-(imax-imin)/20;
331 Int_t maxH = imax+(imax-imin)/20;
332 fMList->SetMin(2, minH);
333 fMList->SetMax(2, maxH);
334 fRange[2]->SetLimits(minH, maxH, TGNumberFormat::kNESInteger);
335 fRange[2]->SetValues(minH, maxH);
336 fMList->AdjustHist(2);
344 //_________________________________________________________________________
345 void CascadeListEditor::FillCanvas() {
354 Int_t canvasMap[fgkNCanvas]={0,1,1000,2,3,4,5,6,7,8,9,10,11,12,13};
356 for (Int_t i=0; i<fgkNCanvas; i++)
359 is2D = canvasMap[i]>999;
361 if (is2D) hist2D = fMList->GetHist2D(canvasMap[i]-1000);
362 else hist = fMList->GetHist(canvasMap[i]);
364 c1 = fCanvasA[i]->GetCanvas();
366 if (is2D) hist2D->Draw("colz"); else hist->Draw();
370 c1b = fCanvasB[i]->GetCanvas();
372 if (is2D) hist2D->Draw("colz"); else hist->Draw();
378 //_________________________________________________________________________
379 void CascadeListEditor::UpdateSelectedTab() {
384 gClient->GetColorByName("yellow", yellow);
385 gClient->GetColorByName("grey", grey);
387 TGTabElement *tabElem;
388 for (i=0; i<fMainTabA->GetNumberOfTabs(); i++) {
390 tabElem = fMainTabA->GetTabTab(i);
391 tabElem->ChangeBackground(grey);
393 for (j=0; j<fTabA[i]->GetNumberOfTabs();j++) {
394 tabElem = fTabA[i]->GetTabTab(j);
395 tabElem->ChangeBackground(grey);
399 Int_t currentTab = fMainTabA->GetCurrent();
400 Int_t currentSubTab = fTabA[currentTab]->GetCurrent();
401 tabElem = fMainTabA->GetTabTab(currentTab);
402 tabElem->ChangeBackground(yellow);
403 tabElem = fTabA[currentTab]->GetTabTab(currentSubTab);
404 tabElem->ChangeBackground(yellow);
410 while (currentTab>i) {
411 iCan += fTabA[i]->GetNumberOfTabs();
414 iCan += currentSubTab;
415 c1 = fCanvasA[iCan]->GetCanvas();
416 c1->GetCanvas()->Modified();
417 c1->GetCanvas()->Update();
421 for (i=0; i<fMainTabB->GetNumberOfTabs(); i++) {
423 tabElem = fMainTabB->GetTabTab(i);
424 tabElem->ChangeBackground(grey);
426 for (j=0; j<fTabB[i]->GetNumberOfTabs();j++) {
427 tabElem = fTabB[i]->GetTabTab(j);
428 tabElem->ChangeBackground(grey);
432 currentTab = fMainTabB->GetCurrent();
433 currentSubTab = fTabB[currentTab]->GetCurrent();
434 tabElem = fMainTabB->GetTabTab(currentTab);
435 tabElem->ChangeBackground(yellow);
436 tabElem = fTabB[currentTab]->GetTabTab(currentSubTab);
437 tabElem->ChangeBackground(yellow);
442 while (currentTab>i) {
443 iCan += fTabB[i]->GetNumberOfTabs();
446 iCan += currentSubTab;
447 c1 = fCanvasB[iCan]->GetCanvas();
448 c1->GetCanvas()->Modified();
449 c1->GetCanvas()->Update();
453 //_________________________________________________________________________
454 void CascadeListEditor::UpdateAll(Int_t iCanA) {
456 TCanvas *c1 = fCanvasA[iCanA]->GetCanvas();
460 static Int_t iCan, i;
463 while (fMainTabB->GetCurrent()>i) {
464 iCan += fTabB[i]->GetNumberOfTabs();
467 iCan += fTabB[i]->GetCurrent();
468 c1 = fCanvasB[iCan]->GetCanvas();
469 c1->GetCanvas()->Modified();
470 c1->GetCanvas()->Update();
476 //_________________________________________________________________________
478 void CascadeListEditor::DoRnrVtx()
480 fMList->SetRnrCasVtx(fRnrVtx->IsOn());
484 void CascadeListEditor::DoRnrV0path()
486 fMList->SetRnrV0path(fRnrV0path->IsOn());
490 void CascadeListEditor::DoRnrV0Daughters()
492 fMList->SetRnrV0Daughters(fRnrV0Daughters->IsOn());
496 void CascadeListEditor::DoRnrBach()
498 fMList->SetRnrBachelor(fRnrBach->IsOn());
502 void CascadeListEditor::DoRnrCasPath()
504 fMList->SetRnrCasPath(fRnrCasPath->IsOn());
509 //_________________________________________________________________________
510 void CascadeListEditor::MassXiRange() {
512 fMList->XiMassFilter(fRange[0]->GetMin(), fRange[0]->GetMax());
516 //_________________________________________________________________________
517 void CascadeListEditor::MassOmegaRange() {
518 fMList->OmegaMassFilter(fRange[1]->GetMin(), fRange[1]->GetMax());
522 //_________________________________________________________________________
523 void CascadeListEditor::IndexRange() {
524 fMList->IndexFilter(fRange[2]->GetMin(), fRange[2]->GetMax());
527 //_________________________________________________________________________
528 void CascadeListEditor::CosPointingRange() {
529 fMList->CosPointingFilter(fRange[3]->GetMin(), fRange[3]->GetMax());
533 //_________________________________________________________________________
534 void CascadeListEditor::BachV0DCARange() {
535 fMList->BachV0DCAFilter(fRange[4]->GetMin(), fRange[4]->GetMax());
539 //_________________________________________________________________________
540 void CascadeListEditor::RadiusRange() {
541 fMList->RadiusFilter(fRange[5]->GetMin(), fRange[5]->GetMax());
545 //_________________________________________________________________________
546 void CascadeListEditor::PtRange() {
547 fMList->PtFilter(fRange[6]->GetMin(), fRange[6]->GetMax());
551 //_________________________________________________________________________
552 void CascadeListEditor::PseudoRapRange() {
553 fMList->PseudoRapFilter(fRange[7]->GetMin(), fRange[7]->GetMax());
557 //_________________________________________________________________________
558 void CascadeListEditor::NegPtRange() {
559 fMList->NegPtFilter(fRange[8]->GetMin(), fRange[8]->GetMax());
563 //_________________________________________________________________________
564 void CascadeListEditor::NegEtaRange() {
565 fMList->NegEtaFilter(fRange[9]->GetMin(), fRange[9]->GetMax());
569 //_________________________________________________________________________
570 void CascadeListEditor::PosPtRange() {
571 fMList->PosPtFilter(fRange[10]->GetMin(), fRange[10]->GetMax());
575 //_________________________________________________________________________
576 void CascadeListEditor::PosEtaRange() {
577 fMList->PosEtaFilter(fRange[11]->GetMin(), fRange[11]->GetMax());
581 //_________________________________________________________________________
582 void CascadeListEditor::BachPtRange() {
583 fMList->BachPtFilter(fRange[12]->GetMin(), fRange[12]->GetMax());
587 //_________________________________________________________________________
588 void CascadeListEditor::BachEtaRange() {
589 fMList->BachEtaFilter(fRange[13]->GetMin(), fRange[13]->GetMax());