27 ClassImp(TParallelCoordRange);
36 TParallelCoordRange::TParallelCoordRange()
37 :TNamed(
"Range",
"Range"), TAttLine(), fSize(0.01)
43 SetBit(kShowOnPad,kTRUE);
44 SetBit(kLiveUpdate,kFALSE);
50 TParallelCoordRange::~TParallelCoordRange()
57 TParallelCoordRange::TParallelCoordRange(TParallelCoordVar *var, Double_t min, Double_t max, TParallelCoordSelect *sel)
58 :TNamed(
"Range",
"Range"), TAttLine(1,1,1), fSize(0.01)
61 min = var->GetCurrentMin();
62 max = var->GetCurrentMax();
71 TParallelCoordSelect* s = var->GetParallel()->GetCurrentSelection();
78 SetLineColor(fSelect->GetLineColor());
80 SetBit(kShowOnPad,kTRUE);
81 SetBit(kLiveUpdate,var->GetParallel()->TestBit(TParallelCoord::kLiveUpdate));
87 void TParallelCoordRange::BringOnTop()
89 TList *list = fVar->GetParallel()->GetSelectList();
90 list->Remove(fSelect);
91 list->AddLast(fSelect);
98 void TParallelCoordRange::Delete(
const Option_t* )
100 fVar->GetRanges()->Remove(
this);
101 fVar->GetParallel()->CleanUpSelections(
this);
108 Int_t TParallelCoordRange::DistancetoPrimitive(Int_t px, Int_t py)
110 if(TestBit(kShowOnPad)){
111 Double_t xx,yy,thisx=0,thisy=0;
112 xx = gPad->AbsPixeltoX(px);
113 yy = gPad->AbsPixeltoY(py);
114 fVar->GetXYfromValue(fMin,thisx,thisy);
117 if(xx > thisx-2*fSize && xx < thisx && yy > thisy-fSize && yy<thisy+fSize) dist = 0;
118 fVar->GetXYfromValue(fMax,thisx,thisy);
119 if(xx > thisx-2*fSize && xx < thisx && yy > thisy-fSize && yy<thisy+fSize) dist = 0;
121 if(yy > thisy-2*fSize && yy < thisy && xx > thisx-fSize && xx<thisx+fSize) dist = 0;
122 fVar->GetXYfromValue(fMax,thisx,thisy);
123 if(yy > thisy-2*fSize && yy < thisy && xx > thisx-fSize && xx<thisx+fSize) dist = 0;
132 void TParallelCoordRange::Draw(Option_t* options)
140 void TParallelCoordRange::ExecuteEvent(Int_t entry, Int_t px, Int_t py)
143 if (!gPad->IsEditable() && entry!=kMouseEnter)
return;
145 Bool_t vert = fVar->GetVert();
146 static Int_t pxold, pyold;
147 static Int_t mindragged = -1;
148 Int_t plx1,plx2,ply1,ply2;
150 Double_t xx,yy,txxmin=0,txxmax=0,tyymin=0,tyymax=0;
151 TFrame *frame = gPad->GetFrame();
152 xx = gPad->AbsPixeltoX(px);
153 yy = gPad->AbsPixeltoY(py);
154 fVar->GetXYfromValue(fMin,txxmin,tyymin);
155 fVar->GetXYfromValue(fMax,txxmax,tyymax);
157 plx1 = gPad->XtoAbsPixel(txxmin-2*fSize);
158 plx2 = gPad->XtoAbsPixel(txxmax-2*fSize);
159 ply1 = gPad->YtoAbsPixel(tyymin+fSize);
160 ply2 = gPad->YtoAbsPixel(tyymax-fSize);
162 plx1 = gPad->XtoAbsPixel(txxmin+fSize);
163 plx2 = gPad->XtoAbsPixel(txxmax-fSize);
164 ply1 = gPad->YtoAbsPixel(tyymin-2*fSize);
165 ply2 = gPad->YtoAbsPixel(tyymax-2*fSize);
168 gPad->SetCursor(kPointer);
169 gVirtualX->SetLineColor(-1);
170 gVirtualX->SetLineWidth(1);
174 fVar->GetParallel()->SetCurrentSelection(fSelect);
175 ((TCanvas*)gPad)->Selected(gPad,fVar->GetParallel(),1);
176 if ((vert && yy<tyymax-fSize) || (!vert && xx < txxmax-fSize)) {
178 p = GetSliderPoints(fMin);
179 gVirtualX->DrawPolyLine(5,p);
183 p = GetSliderPoints(fMax);
184 gVirtualX->DrawPolyLine(5,p);
187 gVirtualX->DrawLine(plx1,ply1,plx2,ply2);
190 Double_t min = fMin, max= fMax;
191 if (mindragged == 1) min = fVar->GetValuefromXY(xx,yy);
192 if (mindragged == 0) max = fVar->GetValuefromXY(xx,yy);
193 if(fMin!=min || fMax != max) {
211 if((vert && yy > frame->GetY1() && yy < frame->GetY2()) ||
212 (!vert && xx > frame->GetX1() && xx < frame->GetX2())){
213 if (vert) p = GetSliderPoints(pyold);
214 else p = GetSliderPoints(pxold);
215 gVirtualX->DrawPolyLine(5,p);
217 if (vert) p = GetBindingLinePoints(pyold,mindragged);
218 else p = GetBindingLinePoints(pxold,mindragged);
219 gVirtualX->DrawPolyLine(2,p);
221 if (vert) p = GetSliderPoints(py);
222 else p = GetSliderPoints(px);
223 gVirtualX->DrawPolyLine(5,p);
225 if (vert) p = GetBindingLinePoints(py,mindragged);
226 else p = GetBindingLinePoints(px,mindragged);
227 gVirtualX->DrawPolyLine(2,p);
229 if (TestBit(kLiveUpdate)){
230 Double_t min = fMin, max= fMax;
231 if (mindragged == 1) min = fVar->GetValuefromXY(xx,yy);
232 if (mindragged == 0) max = fVar->GetValuefromXY(xx,yy);
233 if(fMin!=min || fMax != max) {
258 TPoint* TParallelCoordRange::GetBindingLinePoints(Int_t pos,Int_t mindragged)
260 Double_t txx,tyy,txxo,tyyo=0;
261 if (fVar->GetVert()){
263 tyy = gPad->AbsPixeltoY(pos);
266 txx = gPad->AbsPixeltoX(pos);
268 if (mindragged==1) fVar->GetXYfromValue(fMax,txxo,tyyo);
269 else fVar->GetXYfromValue(fMin,txxo,tyyo);
271 TPoint *bindline =
new TPoint[2];
272 if (fVar->GetVert()) {
274 bindline[0] = TPoint(gPad->XtoAbsPixel(txx-2*fSize),gPad->YtoAbsPixel(tyy+fSize));
275 bindline[1] = TPoint(gPad->XtoAbsPixel(txx-2*fSize),gPad->YtoAbsPixel(tyyo-fSize));
277 bindline[0] = TPoint(gPad->XtoAbsPixel(txx-2*fSize),gPad->YtoAbsPixel(tyyo+fSize));
278 bindline[1] = TPoint(gPad->XtoAbsPixel(txx-2*fSize),gPad->YtoAbsPixel(tyy-fSize));
282 bindline[0] = TPoint(gPad->XtoAbsPixel(txx+fSize),gPad->YtoAbsPixel(tyy-2*fSize));
283 bindline[1] = TPoint(gPad->XtoAbsPixel(txxo-fSize),gPad->YtoAbsPixel(tyy-2*fSize));
285 bindline[0] = TPoint(gPad->XtoAbsPixel(txxo+fSize),gPad->YtoAbsPixel(tyy-2*fSize));
286 bindline[1] = TPoint(gPad->XtoAbsPixel(txx-fSize),gPad->YtoAbsPixel(tyy-2*fSize));
295 TPoint* TParallelCoordRange::GetSliderPoints(Double_t value)
297 Double_t txx=0,tyy=0;
298 fVar->GetXYfromValue(value,txx,tyy);
301 if (fVar->GetVert()) {
302 tx[0]=gPad->XtoAbsPixel(txx);
303 tx[1]=tx[4]=gPad->XtoAbsPixel(txx-fSize);
304 ty[0]=ty[1]=ty[4]=gPad->YtoAbsPixel(tyy);
305 tx[2]=tx[3]=gPad->XtoAbsPixel(txx-2*fSize);
306 ty[2]=gPad->YtoAbsPixel(tyy+fSize);
307 ty[3]=gPad->YtoAbsPixel(tyy-fSize);
309 ty[0]=gPad->YtoAbsPixel(tyy);
310 ty[1]=ty[4]=gPad->YtoAbsPixel(tyy-fSize);
311 tx[0]=tx[1]=tx[4]=gPad->XtoAbsPixel(txx);
312 ty[2]=ty[3]=gPad->YtoAbsPixel(tyy-2*fSize);
313 tx[2]=gPad->XtoAbsPixel(txx-fSize);
314 tx[3]=gPad->XtoAbsPixel(txx+fSize);
316 TPoint *slider =
new TPoint[5];
317 for(UInt_t ui=0;ui<5;++ui) slider[ui] = TPoint(tx[ui],ty[ui]);
324 TPoint* TParallelCoordRange::GetSliderPoints(Int_t pos)
327 if (fVar->GetVert()){
329 tyy = gPad->AbsPixeltoY(pos);
332 txx = gPad->AbsPixeltoX(pos);
337 if (fVar->GetVert()) {
338 tx[0]=gPad->XtoAbsPixel(txx);
339 tx[1]=tx[4]=gPad->XtoAbsPixel(txx-fSize);
340 ty[0]=ty[1]=ty[4]=gPad->YtoAbsPixel(tyy);
341 tx[2]=tx[3]=gPad->XtoAbsPixel(txx-2*fSize);
342 ty[2]=gPad->YtoAbsPixel(tyy+fSize);
343 ty[3]=gPad->YtoAbsPixel(tyy-fSize);
345 ty[0]=gPad->YtoAbsPixel(tyy);
346 ty[1]=ty[4]=gPad->YtoAbsPixel(tyy-fSize);
347 tx[0]=tx[1]=tx[4]=gPad->XtoAbsPixel(txx);
348 ty[2]=ty[3]=gPad->YtoAbsPixel(tyy-2*fSize);
349 tx[2]=gPad->XtoAbsPixel(txx-fSize);
350 tx[3]=gPad->XtoAbsPixel(txx+fSize);
352 TPoint *slider =
new TPoint[5];
353 for(UInt_t ui=0;ui<5;++ui) slider[ui] = TPoint(tx[ui],ty[ui]);
360 Bool_t TParallelCoordRange::IsIn(Double_t evtval)
362 return evtval>=fMin && evtval<=fMax;
368 void TParallelCoordRange::Paint(Option_t* )
370 if(TestBit(kShowOnPad)){
371 PaintSlider(fMin,kTRUE);
372 PaintSlider(fMax,kTRUE);
379 void TParallelCoordRange::PaintSlider(Double_t value, Bool_t fill)
381 SetLineColor(fSelect->GetLineColor());
383 TPolyLine *p=
new TPolyLine();
388 Double_t *x =
new Double_t[5];
389 Double_t *y =
new Double_t[5];
393 fVar->GetXYfromValue(value,xx,yy);
395 x[0] = xx; x[1]=x[4]=xx-fSize; x[2]=x[3]=xx-2*fSize;
396 y[0]=y[1]=y[4]=yy; y[2] = yy+fSize; y[3] = yy-fSize;
398 y[0] = yy; y[1]=y[4]=yy-fSize; y[2]=y[3]= yy-2*fSize;
399 x[0]=x[1]=x[4]=xx; x[2]=xx-fSize; x[3] = xx+fSize;
402 p->SetFillStyle(1001);
404 p->PaintPolyLine(4,&x[1],&y[1],
"f");
405 p->SetFillColor(GetLineColor());
406 p->SetFillStyle(3001);
407 p->PaintPolyLine(4,&x[1],&y[1],
"f");
409 p->PaintPolyLine(5,x,y);
419 void TParallelCoordRange::Print(Option_t* )
const
421 printf(
"On \"%s\" : min = %f, max = %f\n", fVar->GetTitle(), fMin, fMax);
427 void TParallelCoordRange::SendToBack()
429 TList *list = fVar->GetParallel()->GetSelectList();
430 list->Remove(fSelect);
431 list->AddFirst(fSelect);
438 void TParallelCoordRange::SetLineColor(Color_t col)
440 fSelect->SetLineColor(col);
441 TAttLine::SetLineColor(col);
447 void TParallelCoordRange::SetLineWidth(Width_t wid)
449 fSelect->SetLineWidth(wid);
453 ClassImp(TParallelCoordSelect);
472 TParallelCoordSelect::TParallelCoordSelect()
473 : TList(), TAttLine(kBlue,1,1)
475 fTitle =
"Selection";
476 SetBit(kActivated,kTRUE);
477 SetBit(kShowRanges,kTRUE);
483 TParallelCoordSelect::TParallelCoordSelect(
const char* title)
484 : TList(), TAttLine(kBlue,1,1)
487 SetBit(kActivated,kTRUE);
488 SetBit(kShowRanges,kTRUE);
494 TParallelCoordSelect::~TParallelCoordSelect()
497 TParallelCoordRange* range;
498 while ((range = (TParallelCoordRange*)next())) range->GetVar()->GetRanges()->Remove(range);
505 void TParallelCoordSelect::SetActivated(Bool_t on)
508 TParallelCoordRange* range;
509 while ((range = (TParallelCoordRange*)next())) range->SetBit(TParallelCoordRange::kShowOnPad,on);
510 SetBit(kActivated,on);
516 void TParallelCoordSelect::SetShowRanges(Bool_t s)
519 TParallelCoordRange* range;
520 while ((range = (TParallelCoordRange*)next())) range->SetBit(TParallelCoordRange::kShowOnPad,s);
521 SetBit(kShowRanges,s);