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());