31 ClassImp(TParallelCoordVar);
52 TParallelCoordVar::TParallelCoordVar()
53 :TNamed(), TAttLine(), TAttFill(kOrange+9,0)
61 TParallelCoordVar::~TParallelCoordVar()
63 if (fHistogram)
delete fHistogram;
66 TParallelCoordRange* range;
67 while((range = (TParallelCoordRange*)next())) fParallel->CleanUpSelections(range);
71 if (fVal)
delete [] fVal;
79 TParallelCoordVar::TParallelCoordVar(Double_t *val,
const char* title, Int_t
id, TParallelCoord* parallel)
80 :TNamed(title,title), TAttLine(1,1,1), TAttFill(kOrange+9,3001)
85 fRanges =
new TList();
86 fNentries = fParallel->GetNentries();
88 fVal =
new Double_t[fParallel->GetNentries()];
90 for(Long64_t ui = 0;ui<fParallel->GetNentries();++ui) fVal[ui]=val[ui];
100 void TParallelCoordVar::AddRange(TParallelCoordRange* range)
103 TParallelCoordSelect *select = fParallel->GetCurrentSelection();
105 range =
new TParallelCoordRange(
this,0,0,select);
107 range->GetSelection()->Add(range);
109 Error(
"AddRange",
"You must create a selection before adding ranges.");
113 range->GetSelection()->Add(range);
120 void TParallelCoordVar::DeleteVariable()
122 fParallel->RemoveVariable(
this);
129 Int_t TParallelCoordVar::DistancetoPrimitive(Int_t px, Int_t py)
131 if(!gPad)
return 9999;
132 Double_t xx = gPad->AbsPixeltoX(px);
133 Double_t yy = gPad->AbsPixeltoY(py);
134 Double_t dist = 9999;
137 if (yy>fY1+0.01 && yy<fY2-0.01) dist = TMath::Abs(xx - fX1);
139 if (xx>fX1+0.01 && xx<fX2-0.01) dist = TMath::Abs(yy - fY1);
141 if (dist<=0.005)
return 0;
148 void TParallelCoordVar::Draw(Option_t *option)
158 Bool_t TParallelCoordVar::Eval(Long64_t evtidx, TParallelCoordSelect *select)
160 if (fRanges->GetSize() > 0){
162 Bool_t inarange = kFALSE;
163 Bool_t noOwnedRange = kTRUE;
164 TParallelCoordRange *range;
165 while ((range = (TParallelCoordRange*)next())){
166 if(select->Contains(range)) {
167 noOwnedRange = kFALSE;
168 if(range->IsIn(fVal[evtidx])) inarange = kTRUE;
171 if (noOwnedRange)
return kTRUE;
172 else return inarange;
180 void TParallelCoordVar::ExecuteEvent(Int_t entry, Int_t px, Int_t py)
183 if (!gPad->IsEditable() && entry!=kMouseEnter)
return;
185 static Int_t pxold, pyold;
187 static Int_t pzoomold;
188 static Bool_t first = kTRUE;
190 Int_t px1,px2,py1,py2,n=-1;
191 px1 = gPad->XtoAbsPixel(fX1);
192 px2 = gPad->XtoAbsPixel(fX2);
193 py1 = gPad->YtoAbsPixel(fY1);
194 py2 = gPad->YtoAbsPixel(fY2);
197 if(gPad->AbsPixeltoX(px)-fX1 > 0) gPad->SetCursor(kArrowVer);
198 else gPad->SetCursor(kArrowHor);
200 if(gPad->AbsPixeltoY(py)-fY1 > 0) gPad->SetCursor(kArrowHor);
201 else gPad->SetCursor(kArrowVer);
204 gVirtualX->SetLineColor(-1);
208 ((TCanvas*)gPad)->Selected(gPad,fParallel,1);
209 if(gPad->AbsPixeltoX(px)-fX1 > 0){
211 gVirtualX->DrawLine(gPad->XtoAbsPixel(fX1-0.05),py,gPad->XtoAbsPixel(fX1+0.05),py);
216 gVirtualX->DrawLine(px,py1,px,py2);
219 if(gPad->AbsPixeltoY(py)-fY1 > 0){
221 gVirtualX->DrawLine(px,gPad->YtoAbsPixel(fY1-0.05),px,gPad->YtoAbsPixel(fY1+0.05));
226 gVirtualX->DrawLine(px1,py,px2,py);
233 Double_t xx = gPad->AbsPixeltoX(px);
234 Double_t yy = gPad->AbsPixeltoY(py);
235 TFrame *frame = gPad->GetFrame();
238 Double_t axisSpace = (frame->GetX2() - frame->GetX1())/(fParallel->GetNvar() - 1);
239 Double_t pos = (xx - frame->GetX1())/axisSpace;
243 Double_t min = GetValuefromXY(xx,yy);
244 Double_t max = GetValuefromXY(xx,gPad->AbsPixeltoY(pzoomold));
245 if(TMath::Abs(min-max) < 0.00001)
return;
246 if (fParallel->TestBit(TParallelCoord::kGlobalScale)) {
249 min = max; max = mem;
251 fParallel->SetGlobalMin(min);
252 fParallel->SetGlobalMax(max);
254 SetCurrentLimits(min,max);
259 Double_t axisSpace = (frame->GetY2() - frame->GetY1())/(fParallel->GetNvar() - 1);
260 Double_t pos = (yy-frame->GetY1())/axisSpace;
264 Double_t min = GetValuefromXY(xx,yy);
265 Double_t max = GetValuefromXY(gPad->AbsPixeltoX(pzoomold),yy);
266 SetCurrentLimits(min,max);
270 if (n>=0 && (UInt_t)n>=fParallel->GetNvar()) --n;
271 else if (n<fParallel->GetVarList()->IndexOf(
this)) ++n;
272 fParallel->GetVarList()->Remove(
this);
273 fParallel->GetVarList()->AddAt(
this,n);
285 gPad->SetCursor(kArrowHor);
286 gVirtualX->DrawLine(pxold,py1,pxold,py2);
287 gVirtualX->DrawLine(px,py1,px,py2);
289 gPad->SetCursor(kArrowVer);
290 if(!first) gVirtualX->DrawLine(gPad->XtoAbsPixel(fX1-0.05),pyold,gPad->XtoAbsPixel(fX1+0.05),pyold);
291 gVirtualX->DrawLine(gPad->XtoAbsPixel(fX1-0.05),py,gPad->XtoAbsPixel(fX1+0.05),py);
296 gPad->SetCursor(kArrowVer);
297 gVirtualX->DrawLine(px1,pyold,px2,pyold);
298 gVirtualX->DrawLine(px1,py,px2,py);
300 gPad->SetCursor(kArrowHor);
301 if(!first) gVirtualX->DrawLine(pxold,gPad->YtoAbsPixel(fY1-0.05),pxold,gPad->YtoAbsPixel(fY1+0.05));
302 gVirtualX->DrawLine(px,gPad->YtoAbsPixel(fY1-0.05),px,gPad->YtoAbsPixel(fY1+0.05));
315 void TParallelCoordVar::GetEntryXY(Long64_t n, Double_t & x, Double_t & y)
319 if (fMinCurrent != fMaxCurrent) {
320 if (TestBit(kLogScale)) y = fY1 + (fY2 - fY1) *
321 (TMath::Log10(fVal[n]/fMinCurrent)) / (TMath::Log10(fMaxCurrent/fMinCurrent));
322 else y = fY1 + (fY2 - fY1) *
323 (fVal[n] - fMinCurrent) / (fMaxCurrent - fMinCurrent);
325 y = fY1 + 0.5*(fY2-fY1);
329 if (fMinCurrent != fMaxCurrent) {
330 if (TestBit(kLogScale)) x = fX1 + (fX2 - fX1) *
331 (TMath::Log10(fVal[n]/fMinCurrent)) / (TMath::Log10(fMaxCurrent/fMinCurrent));
332 else x = fX1 + (fX2 - fX1) *
333 (fVal[n] - fMinCurrent) / (fMaxCurrent - fMinCurrent);
335 x = fX1 + 0.5*(fX2-fX1);
344 Int_t TParallelCoordVar::GetEntryWeight(Long64_t evtidx)
346 Int_t bin = 1 + (Int_t)((fVal[evtidx] - fMinCurrent)/((fMaxCurrent-fMinCurrent)/fNbins));
347 return (Int_t)fHistogram->GetBinContent(bin);
353 TH1F* TParallelCoordVar::GetHistogram()
355 if (fHistogram)
delete fHistogram;
357 fHistogram =
new TH1F(
"hpa",
"hpa", fNbins, fMinCurrent, fMaxCurrent+0.0001*(fMaxCurrent-fMinCurrent));
358 fHistogram->SetDirectory(0);
359 Long64_t first = fParallel->GetCurrentFirst();
360 Long64_t nentries = fParallel->GetCurrentN();
361 for(Long64_t li=first; li<first+nentries;++li) {
362 if(fVal[li] >= fMinCurrent && fVal[li] <= fMaxCurrent) fHistogram->Fill(fVal[li]);
370 void TParallelCoordVar::GetMinMaxMean()
372 Double_t min,max,ave = 0;
375 Long64_t first,nentries;
376 first = fParallel->GetCurrentFirst();
377 nentries = fParallel->GetCurrentN();
378 for(Long64_t li=first; li<first+nentries;++li){
379 if(fVal[li]<min) min = fVal[li];
380 if(fVal[li]>max) max = fVal[li];
384 fMean = ave/((Double_t)nentries);
385 fMinCurrent = fMinInit = min;
386 fMaxCurrent = fMaxInit = max;
392 char* TParallelCoordVar::GetObjectInfo(Int_t px, Int_t py)
const
394 static char info[128];
397 if (!gPad)
return info;
398 Double_t xx = gPad->AbsPixeltoX(px);
399 Double_t yy = gPad->AbsPixeltoY(py);
402 snprintf(info,128,
"%s = %f", GetTitle(), fMinCurrent);
404 snprintf(info,128,
"%s = %f", GetTitle(), fMaxCurrent);
406 Double_t axislength = fY2-fY1;
407 Double_t pos = (yy-fY1)/axislength;
408 snprintf(info,128,
"%s = %f", GetTitle(), fMinCurrent + pos*(fMaxCurrent-fMinCurrent));
412 snprintf(info,128,
"%s = %f", GetTitle(), fMinCurrent);
414 snprintf(info,128,
"%s = %f", GetTitle(), fMaxCurrent);
416 Double_t axislength = fX2-fX1;
417 Double_t pos = (xx-fX1)/axislength;
418 snprintf(info,128,
"%s = %f", GetTitle(), pos*(fMaxCurrent-fMinCurrent));
427 void TParallelCoordVar::GetQuantiles()
429 Double_t *quantiles =
new Double_t[3];
430 quantiles[0]=0.; quantiles[1]=0.; quantiles[2] = 0.;
431 Double_t *prob =
new Double_t[3];
432 prob[0]=0.25; prob[1]=0.5; prob[2] = 0.75;
433 Long64_t first = fParallel->GetCurrentFirst();
434 Long64_t nentries = fParallel->GetCurrentN();
435 if (!TestBit(kLogScale) && first==0 && nentries==fNentries) TMath::Quantiles(fNentries,3,fVal,quantiles,prob,kFALSE);
437 Double_t* val =
new Double_t[nentries];
440 for (Long64_t n=first;n<first+nentries;++n) {
441 if (fVal[n] >= fMinCurrent) {
442 if (TestBit(kLogScale)) val[selected] = TMath::Log10(fVal[n]);
443 else val[selected] = fVal[n];
448 for (Long64_t n=first;n<first+nentries;++n) {
449 if (TestBit(kLogScale)) val[selected] = TMath::Log10(fVal[n]);
450 else val[selected] = fVal[n];
454 TMath::Quantiles(selected,3,val,quantiles,prob,kFALSE);
457 fQua1 = quantiles[0];
459 fQua3 = quantiles[2];
467 Double_t TParallelCoordVar::GetValuefromXY(Double_t x,Double_t y)
470 if (fMinCurrent == fMaxCurrent)
return fMinCurrent;
472 if (y<=fY1) pos = fMinCurrent;
473 else if (y>=fY2) pos = fMaxCurrent;
474 else pos = fMinCurrent + ((y-fY1)/(fY2-fY1))*(fMaxCurrent-fMinCurrent);
476 if (x<=fX1) pos = fMinCurrent;
477 else if (x>=fX2) pos = fMaxCurrent;
478 else pos = fMinCurrent + ((x-fX1)/(fX2-fX1))*(fMaxCurrent-fMinCurrent);
486 void TParallelCoordVar::GetXYfromValue(Double_t value, Double_t & x, Double_t & y)
488 if(value < fMinCurrent || value > fMaxCurrent)
return;
492 if (fMinCurrent != fMaxCurrent) {
493 if (TestBit(kLogScale)) y = fY1 + (fY2 - fY1) *
494 (TMath::Log10(value/fMinCurrent)) / (TMath::Log10(fMaxCurrent/fMinCurrent));
495 else y = fY1 + (fY2 - fY1) *
496 (value - fMinCurrent) / (fMaxCurrent - fMinCurrent);
498 y = fY1 + 0.5*(fY2-fY1);
502 if (fMinCurrent != fMaxCurrent) {
503 if (TestBit(kLogScale)) x = fX1 + (fX2 - fX1) *
504 (TMath::Log10(value/fMinCurrent)) / (TMath::Log10(fMaxCurrent/fMinCurrent));
505 else x = fX1 + (fX2 - fX1) *
506 (value - fMinCurrent) / (fMaxCurrent - fMinCurrent);
508 x = fX1 + 0.5*(fX2-fX1);
516 void TParallelCoordVar::Init()
539 SetBit(kLogScale,kFALSE);
540 SetBit(kShowBox,kFALSE);
541 SetBit(kShowBarHisto,kTRUE);
547 void TParallelCoordVar::Paint(Option_t* option)
550 TParallelCoordRange* range;
551 while ((range = (TParallelCoordRange*)next())) range->Paint(option);
554 if (TestBit(kShowBox)) PaintBoxPlot();
561 void TParallelCoordVar::PaintBoxPlot()
563 TLine *line =
new TLine();
564 line->SetLineColor(GetLineColor());
565 line->SetLineWidth(1);
566 TBox *box =
new TBox();
567 box->SetLineWidth(1);
568 box->SetLineColor(GetLineColor());
569 box->SetLineStyle(1);
570 box->SetFillStyle(0);
572 TFrame* frame = gPad->GetFrame();
575 if (fParallel->GetNvar() > 1) {
576 if (fX1==fX2) boxSize = fHistoHeight*((frame->GetY2()-frame->GetY1())/(fParallel->GetNvar()-1));
577 else boxSize = fHistoHeight*((frame->GetX2()-frame->GetX1())/(fParallel->GetNvar()-1));
578 if (boxSize >= 0.03) boxSize = 0.03;
582 Double_t qua1,med,qua3,max,min;
583 Double_t a,b,maxinit,mininit;
584 if (TestBit(kLogScale)) {
585 a = TMath::Log10(fMinCurrent);
586 b = TMath::Log10(fMaxCurrent/fMinCurrent);
587 if(fMinInit > 0) mininit = TMath::Log10(fMinInit);
588 else mininit = TMath::Log10(fMinCurrent);
589 maxinit = TMath::Log10(fMaxInit);
592 b = fMaxCurrent-fMinCurrent;
597 qua1 = fY1 + ((fQua1-a)/b)*(fY2-fY1);
598 qua3 = fY1 + ((fQua3-a)/b)*(fY2-fY1);
599 med = fY1 + ((fMed-a)/b)*(fY2-fY1);
600 max = fY1 + ((maxinit-a)/b)*(fY2-fY1);
601 min = fY1 + ((mininit-a)/b)*(fY2-fY1);
603 qua1 = fX1 + ((fQua1-a)/b)*(fX2-fX1);
604 qua3 = fX1 + ((fQua3-a)/b)*(fX2-fX1);
605 med = fX1 + ((fMed-a)/b)*(fX2-fX1);
606 max = fX1 + ((maxinit-a)/b)*(fX2-fX1);
607 min = fX1 + ((mininit-a)/b)*(fX2-fX1);
612 line->PaintLine(fX1-boxSize,min,fX1+boxSize,min);
613 line->PaintLine(fX2-boxSize,max,fX2+boxSize,max);
615 line->PaintLine(min,fY1-boxSize,min,fY1+boxSize);
616 line->PaintLine(max,fY2-boxSize,max,fY2+boxSize);
620 line->SetLineStyle(7);
622 if (min<frame->GetY1()) min = frame->GetY1();
623 if (max>frame->GetY2()) max = frame->GetY2();
624 line->PaintLine(fX1,min,fX1,qua1);
625 line->PaintLine(fX1,qua3,fX1,max);
627 if (min<frame->GetX1()) min = frame->GetX1();
628 if (max>frame->GetX2()) max = frame->GetX2();
629 line->PaintLine(min,fY1,qua1,fY2);
630 line->PaintLine(qua3,fY1,max,fY2);
634 if(fX1==fX2) box->PaintBox(fX1-boxSize,qua1,fX1+boxSize,qua3);
635 else box->PaintBox(qua1,fY1-boxSize,qua3,fY1+boxSize);
638 line->SetLineStyle(1);
639 if(fX1==fX2) line->PaintLine(fX1-boxSize,med,fX1+boxSize,med);
640 else line->PaintLine(med,fY1-boxSize,med,fY1+boxSize);
643 if (!TestBit(kLogScale) || (TestBit(kLogScale) && fMean > 0)) {
645 if (TestBit(kLogScale)) mean = TMath::Log10(fMean);
647 TMarker *mark = NULL;
648 if(fX1==fX2) mark =
new TMarker(fX1,fY1 + ((mean-a)/b)*(fY2-fY1),24);
649 else mark =
new TMarker(fX1 + ((mean-a)/b)*(fX2-fX1),fY1,24);
661 void TParallelCoordVar::PaintHistogram()
665 TFrame *frame = gPad->GetFrame();
667 if (!fHistogram) GetHistogram();
670 if (fHistoHeight!=0 && TestBit(kShowBarHisto)) {
672 TBox *b =
new TBox();
673 b->SetFillStyle(GetFillStyle());
674 b->SetFillColor(GetFillColor());
676 b->SetLineColor(GetFillColor());
678 Double_t hmin = fHistogram->GetMinimum();
679 Double_t hmax = fHistogram->GetMaximum();
682 Double_t dy = (fY2-fY1)/fNbins;
683 Double_t dv = (fMaxCurrent - fMinCurrent)/fNbins;
684 Double_t v = fMinCurrent;
685 Double_t y1 = fY1,x2,y2;
686 for (i=1; i<=fNbins; i++) {
687 x2 = fX1+((fHistogram->GetBinContent(i)-hmin)/(hmax-hmin))*fHistoHeight*
688 ((frame->GetX2()-frame->GetX1())/(fParallel->GetNvar()-1));
689 if(TestBit(kLogScale)) y2 = fY1 + (fY2-fY1)*(TMath::Log10((v+dv)/fMinCurrent)) / (TMath::Log10(fMaxCurrent/fMinCurrent));
691 b->PaintBox(fX1,y1,x2,y2,
"l");
697 Double_t dx = (fX2-fX1)/fNbins;
698 Double_t dv = (fMaxCurrent - fMinCurrent)/fNbins;
699 Double_t v = fMinCurrent;
700 Double_t x1 = fX1,x2,y2;
701 for (i=1; i<=fNbins; i++) {
702 y2 = fY1+((fHistogram->GetBinContent(i)-hmin)/(hmax-hmin))*fHistoHeight*((frame->GetY2()-frame->GetY1())/(fParallel->GetNvar()-1));
703 if(TestBit(kLogScale)) x2 = fX1 + (fX2-fX1)*(TMath::Log10((v+dv)/fMinCurrent)) / (TMath::Log10(fMaxCurrent/fMinCurrent));
705 b->PaintBox(x1,fY1,x2,y2,
"l");
712 if (fHistoLW==0 && !TestBit(kShowBox)) {
714 TLine* l =
new TLine(fX1,fY1,fX2,fY2);
715 l->SetLineWidth(GetLineWidth());
716 l->SetLineColor(GetLineColor());
717 l->SetLineStyle(GetLineColor());
720 }
else if (fHistoLW!=0){
722 TLine *lb =
new TLine();
723 lb->SetLineWidth(fHistoLW);
724 Double_t hmin = fHistogram->GetMinimum();
725 Double_t hmax = fHistogram->GetMaximum();
727 Int_t ncolors = gStyle->GetNumberOfColors();
730 Double_t dy = (fY2-fY1)/fNbins;
731 Double_t y1 = fY1,y2;
732 Double_t dv = (fMaxCurrent - fMinCurrent)/fNbins;
733 Double_t v = fMinCurrent;
734 for (i=1; i<=fNbins; i++) {
735 theColor = (Int_t)( ((fHistogram->GetBinContent(i)-hmin)/(hmax-hmin))*(ncolors-1) );
736 if(TestBit(kLogScale)) y2 = fY1 + (fY2-fY1)*(TMath::Log10((v+dv)/fMinCurrent)) / (TMath::Log10(fMaxCurrent/fMinCurrent));
738 lb->SetLineColor(gStyle->GetColorPalette(theColor));
739 lb->PaintLine(fX1,y1,fX1,y2);
745 Double_t dx = (fX2-fX1)/fNbins;
746 Double_t dv = (fMaxCurrent - fMinCurrent)/fNbins;
747 Double_t v = fMinCurrent;
748 Double_t x1 = fX1,x2;
749 for (i=1; i<=fNbins; i++) {
750 theColor = (Int_t)( ((fHistogram->GetBinContent(i)-hmin)/(hmax-hmin))*(ncolors-1) );
751 lb->SetLineColor(gStyle->GetColorPalette(theColor));
752 if(TestBit(kLogScale)) x2 = fX1 + (fX2-fX1)*(TMath::Log10((v+dv)/fMinCurrent)) / (TMath::Log10(fMaxCurrent/fMinCurrent));
754 lb->PaintLine(x1,fY1,x2,fY1);
766 void TParallelCoordVar::PaintLabels()
768 TLatex* t =
new TLatex();
769 TFrame *frame = gPad->GetFrame();
770 t->SetTextSize(0.03);
772 t->SetText(fX1,frame->GetY1() - 0.04 - t->GetTextSize(),GetName());
773 Double_t tlength = t->GetXsize();
774 if (fX1-0.5*tlength<0.01) {
776 t->SetText(0.01, frame->GetY1() - 0.04 - t->GetTextSize(), GetName());
778 }
else if (fX1+0.5*tlength > 0.99) {
780 t->SetText(0.99,frame->GetY1() - 0.04 - t->GetTextSize(),GetName());
784 t->PaintLatex(fX1,frame->GetY1() - 0.04 - t->GetTextSize(),0,0.03,GetName());
786 if (!fParallel->TestBit(TParallelCoord::kCandleChart)) {
788 t->PaintLatex(fX1,frame->GetY2() + 0.005,0,0.025,Form(
"%g",fMaxCurrent));
790 t->PaintLatex(fX1,frame->GetY1() - 0.005,0,0.025,Form(
"%g",fMinCurrent));
793 t->SetText(fX1-0.04,fY1+0.02,GetName());
794 t->SetTextSize(0.03);
795 Double_t tlength = t->GetXsize();
796 if (fX1-0.04-tlength<0.01) {
798 t->SetText(0.01,fY1+0.02,GetName());
802 t->PaintLatex(fX1-0.04,fY1+0.02,0,0.03,GetName());
804 if (!fParallel->TestBit(TParallelCoord::kCandleChart)) {
806 t->PaintLatex(0.01,fY1-0.02,0,0.025,Form(
"%g",fMinCurrent));
808 t->PaintLatex(0.99,fY1-0.02,0,0.025,Form(
"%g",fMaxCurrent));
817 void TParallelCoordVar::Print(Option_t* )
const
819 printf(
"**************variable #%d**************\n",fParallel->GetVarList()->IndexOf(
this));
820 printf(
"at x1=%f, y1=%f, x2=%f, y2=%f.\n",fX1,fY1,fX2,fY2);
821 printf(
"min = %f, Q1 = %f, Med = %f, Q3 = %f, Max = %f\n", fMinInit, fQua1, fMed, fQua3, fMaxInit);
829 void TParallelCoordVar::SavePrimitive(std::ostream & out, Option_t* options)
831 TString opt = options;
832 if (opt.Contains(
"pcalled")) {
833 out<<
" var->SetBit(TParallelCoordVar::kLogScale,"<<TestBit(kLogScale)<<
");"<<std::endl;
834 out<<
" var->SetBit(TParallelCoordVar::kShowBox,"<<TestBit(kShowBox)<<
");"<<std::endl;
835 out<<
" var->SetBit(TParallelCoordVar::kShowBarHisto,"<<TestBit(kShowBarHisto)<<
");"<<std::endl;
836 out<<
" var->SetHistogramBinning("<<fNbins<<
");"<<std::endl;
837 out<<
" var->SetHistogramLineWidth("<<fHistoLW<<
");"<<std::endl;
838 out<<
" var->SetInitMin("<<fMinInit<<
");"<<std::endl;
839 out<<
" var->SetInitMax("<<fMaxInit<<
");"<<std::endl;
840 out<<
" var->SetHistogramHeight("<<fHistoHeight<<
");"<<std::endl;
841 out<<
" var->GetMinMaxMean();"<<std::endl;
842 out<<
" var->GetHistogram();"<<std::endl;
843 out<<
" var->SetFillStyle("<<GetFillStyle()<<
");"<<std::endl;
844 out<<
" var->SetFillColor("<<GetFillColor()<<
");"<<std::endl;
845 out<<
" var->SetLineColor("<<GetLineColor()<<
");"<<std::endl;
846 out<<
" var->SetLineWidth("<<GetLineWidth()<<
");"<<std::endl;
847 out<<
" var->SetLineStyle("<<GetLineStyle()<<
");"<<std::endl;
848 if (TestBit(kShowBox)) out<<
" var->GetQuantiles();"<<std::endl;
850 TParallelCoordRange* range;
852 while ((range = (TParallelCoordRange*)next())) {
853 out<<
" //***************************************"<<std::endl;
854 out<<
" // Create the "<<i<<
"th range owned by the axis \""<<GetTitle()<<
"\"."<<std::endl;
855 out<<
" TParallelCoordSelect* sel = para->GetSelection(\""<<range->GetSelection()->GetTitle()<<
"\");"<<std::endl;
856 out<<
" TParallelCoordRange* newrange = new TParallelCoordRange(var,"<<range->GetMin()<<
","<<range->GetMax()<<
",sel);"<<std::endl;
857 out<<
" var->AddRange(newrange);"<<std::endl;
858 out<<
" sel->Add(newrange);"<<std::endl;
867 void TParallelCoordVar::SetBoxPlot(Bool_t box)
869 SetBit(kShowBox,box);
870 if (box) SetHistogramHeight(0.5);
872 SetHistogramHeight(0);
873 SetHistogramLineWidth(2);
880 void TParallelCoordVar::SetHistogramBinning(Int_t n)
882 if (n < 0 || n == fNbins)
return;
890 void TParallelCoordVar::SetHistogramHeight(Double_t h)
893 if (!fParallel->TestBit(TParallelCoord::kCandleChart)){
894 if(h!=0) SetBit(kShowBarHisto,kTRUE);
895 else SetBit(kShowBarHisto,kFALSE);
902 void TParallelCoordVar::SetCurrentMin(Double_t min)
910 void TParallelCoordVar::SetCurrentMax(Double_t max)
918 void TParallelCoordVar::SetCurrentLimits(Double_t min, Double_t max)
925 if(TestBit(kLogScale) && max<=0)
return;
926 if(TestBit(kLogScale) && min<=0) min = 0.00001*max;
934 if (fParallel->TestBit(TParallelCoord::kGlobalScale)) {
935 fParallel->SetGlobalMin(min);
936 fParallel->SetGlobalMax(max);
943 void TParallelCoordVar::SetLiveRangesUpdate(Bool_t on)
946 TParallelCoordRange* range;
947 while ((range = (TParallelCoordRange*)next())) range->SetBit(TParallelCoordRange::kLiveUpdate,on);
953 void TParallelCoordVar::SetLogScale(Bool_t log)
955 if (log == TestBit (kLogScale))
return;
956 if (fMaxInit < 0) SetBit(kLogScale,kFALSE);
958 if (fMaxCurrent < 0 ) fMaxCurrent = fMaxInit;
959 if (fMinCurrent < 0 ) fMinCurrent = 0.00001*fMaxCurrent;
960 SetBit(kLogScale,kTRUE);
961 SetCurrentMin(fMinCurrent);
962 SetCurrentMax(fMaxCurrent);
964 SetBit(kLogScale,kFALSE);
965 SetCurrentMin(fMinInit);
966 SetCurrentMax(fMaxInit);
975 void TParallelCoordVar::SetValues(Long64_t length, Double_t* val)
977 if (fVal)
delete [] fVal;
978 fVal =
new Double_t[length];
980 for (Long64_t li = 0; li < length; ++li) fVal[li] = val[li];
983 if (TestBit(kShowBox)) GetQuantiles();
990 void TParallelCoordVar::SetX(Double_t x, Bool_t gl)
992 TFrame *frame = gPad->GetFrame();
994 fY1 = frame->GetY1();
995 fY2 = frame->GetY2();
997 Double_t gmin = fParallel->GetGlobalMin();
998 Double_t gmax = fParallel->GetGlobalMax();
999 fY1 = frame->GetY1() + ((fMinCurrent-gmin)/(gmax-gmin))*(frame->GetY2()-frame->GetY1());
1000 fY2 = frame->GetY1() + ((fMaxCurrent-gmin)/(gmax-gmin))*(frame->GetY2()-frame->GetY1());
1009 void TParallelCoordVar::SetY(Double_t y, Bool_t gl)
1011 TFrame *frame = gPad->GetFrame();
1013 fX1 = frame->GetX1();
1014 fX2 = frame->GetX2();
1016 Double_t gmin = fParallel->GetGlobalMin();
1017 Double_t gmax = fParallel->GetGlobalMax();
1018 fX1 = frame->GetX1() + ((fMinCurrent-gmin)/(gmax-gmin))*(frame->GetX2()-frame->GetX1());
1019 fX2 = frame->GetX1() + ((fMaxCurrent-gmin)/(gmax-gmin))*(frame->GetX2()-frame->GetX1());