// @(#)root/treeviewer:$Id$
// Author: Bastien Dalla Piazza  02/08/2007

/*************************************************************************
 * Copyright (C) 1995-2007, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#include "TParallelCoordVar.h"
#include "TParallelCoord.h"
#include "TParallelCoordRange.h"

#include "Riostream.h"
#include "TROOT.h"
#include "TLatex.h"
#include "TLine.h"
#include "TVirtualPad.h"
#include "TMath.h"
#include "TH1.h"
#include "TStyle.h"
#include "TBox.h"
#include "TCollection.h"
#include "TList.h"
#include "TFrame.h"
#include "TCanvas.h"
#include "TMarker.h"

ClassImp(TParallelCoordVar)

//______________________________________________________________________________
/* Begin_Html
<center><h2>Axes:</h2></center>
<p>
Class containing a variable for the TParallelCoord.
<p>
Options can be defined each axis separatly using the right mouse click. These options can be applied to every axes using the editor.
<ul>
<li>Axis width: If set to 0, the axis is simply a line. If higher, a color histogram is drawn on the axis.</li>
<li>Axis histogram height: If not 0, a usual bar histogram is drawn on the plot.</li>
</ul>
<p>
The order in which the variables are drawn is essential to see the clusters. The axes can be dragged to change their position. A zoom is also available. The logarithm scale is also available by right clicking on the axis.
End_Html
*/

//______________________________________________________________________________
TParallelCoordVar::TParallelCoordVar()
   :TNamed(), TAttLine(), TAttFill(kOrange+9,0)
{
   // Default constructor.

   Init();
}


//______________________________________________________________________________
TParallelCoordVar::~TParallelCoordVar()
{
   //Destructor.

   if (fHistogram) delete fHistogram;
   if (fRanges){
      TIter next(fRanges);
      TParallelCoordRange* range;
      while((range = (TParallelCoordRange*)next())) fParallel->CleanUpSelections(range);
      fRanges->Delete();
      delete fRanges;
   }
   if (fVal) delete [] fVal;
}


//______________________________________________________________________________
TParallelCoordVar::TParallelCoordVar(Double_t *val, const char* title, Int_t id, TParallelCoord* parallel)
   :TNamed(title,title), TAttLine(1,1,1), TAttFill(kOrange+9,3001)
{
   // Normal constructor. By default, the title and the name are the expression given to TTree::Draw. The name
   // can be changed by the user (the label on the plot) but not the title.

   Init();
   fId = id;
   fParallel      = parallel;
   fRanges        = new TList();
   fNentries       = fParallel->GetNentries();

   fVal = new Double_t[fParallel->GetNentries()];

   for(Long64_t ui = 0;ui<fParallel->GetNentries();++ui) fVal[ui]=val[ui];

   GetMinMaxMean();
   GetHistogram();
   GetQuantiles();
}


//______________________________________________________________________________
void TParallelCoordVar::AddRange(TParallelCoordRange* range)
{
   // Add a range to the current selection on the axis.

   if (!range) {
      TParallelCoordSelect *select = fParallel->GetCurrentSelection();
      if (select) {
         range = new TParallelCoordRange(this,0,0,select);
         fRanges->Add(range);
         range->GetSelection()->Add(range);
         range->Draw();
      } else {
         Error("AddRange","You must create a selection before adding ranges.");
      }
   } else {
      fRanges->Add(range);
      range->GetSelection()->Add(range);
      range->Draw();
   }
}


//______________________________________________________________________________
void TParallelCoordVar::DeleteVariable()
{
   // Delete variables.

   fParallel->RemoveVariable(this);
   delete this;
}


//______________________________________________________________________________
Int_t TParallelCoordVar::DistancetoPrimitive(Int_t px, Int_t py)
{
   // Computes the distance from the axis.

   if(!gPad) return 9999;
   Double_t xx = gPad->AbsPixeltoX(px);
   Double_t yy = gPad->AbsPixeltoY(py);
   Double_t dist = 9999;

   if (fX1==fX2) {
      if (yy>fY1+0.01 && yy<fY2-0.01) dist = TMath::Abs(xx - fX1);
   } else {
      if (xx>fX1+0.01 && xx<fX2-0.01) dist = TMath::Abs(yy - fY1);
   }
   if (dist<=0.005) return 0;
   else             return 9999;
}


//______________________________________________________________________________
void TParallelCoordVar::Draw(Option_t *option)
{
   // Draw the axis.

   TIter next(fRanges);
   TParallelCoordRange* range;
   while ((range = (TParallelCoordRange*)next())) range->Draw();
   AppendPad(option);
}


//______________________________________________________________________________
Bool_t TParallelCoordVar::Eval(Long64_t evtidx, TParallelCoordSelect *select)
{
   // Check if the entry is within the range(s) of "select". Two ranges on a single
   // axis are conjugated as a "or": to be selected, the entry must be in one of
   // the ranges.

   if (fRanges->GetSize() > 0){
      TIter next(fRanges);
      Bool_t inarange = kFALSE;
      Bool_t noOwnedRange = kTRUE;
      TParallelCoordRange *range;
      while ((range = (TParallelCoordRange*)next())){
         if(select->Contains(range)) {
            noOwnedRange = kFALSE;
            if(range->IsIn(fVal[evtidx])) inarange = kTRUE;
         }
      }
      if (noOwnedRange) return kTRUE;
      else return inarange;
   }
   else return kTRUE;
}


//______________________________________________________________________________
void TParallelCoordVar::ExecuteEvent(Int_t entry, Int_t px, Int_t py)
{
   // Execute the corresponding entry.

   if (!gPad) return;
   if (!gPad->IsEditable() && entry!=kMouseEnter) return;

   static Int_t pxold, pyold;
   static Int_t zoom; // -1:nothing zoomed or translated, 0:translating the axis, 1:zooming
   static Int_t pzoomold;
   static Bool_t first = kTRUE;

   Int_t px1,px2,py1,py2,n=-1;
   px1 = gPad->XtoAbsPixel(fX1);
   px2 = gPad->XtoAbsPixel(fX2);
   py1 = gPad->YtoAbsPixel(fY1);
   py2 = gPad->YtoAbsPixel(fY2);

   if(fX1 == fX2) {
      if(gPad->AbsPixeltoX(px)-fX1 > 0) gPad->SetCursor(kArrowVer);
      else                              gPad->SetCursor(kArrowHor);
   } else {
      if(gPad->AbsPixeltoY(py)-fY1 > 0) gPad->SetCursor(kArrowHor);
      else                              gPad->SetCursor(kArrowVer);
   }

   gVirtualX->SetLineColor(-1);
   switch (entry) {
      case kButton1Down:
         if (fX1==fX2){
            ((TCanvas*)gPad)->Selected(gPad,fParallel,1);
            if(gPad->AbsPixeltoX(px)-fX1 > 0){
               zoom = 1;
               gVirtualX->DrawLine(gPad->XtoAbsPixel(fX1-0.05),py,gPad->XtoAbsPixel(fX1+0.05),py);
               first = kTRUE;
               pzoomold = py;
            } else {
               zoom = 0;
               gVirtualX->DrawLine(px,py1,px,py2);
            }
         } else {
            if(gPad->AbsPixeltoY(py)-fY1 > 0){
               zoom = 1;
               gVirtualX->DrawLine(px,gPad->YtoAbsPixel(fY1-0.05),px,gPad->YtoAbsPixel(fY1+0.05));
               first=kTRUE;
               pzoomold = px;
            } else {
               zoom = 0;
               gVirtualX->DrawLine(px1,py,px2,py);
            }
         }
         pxold = px;
         pyold = py;
         break;
      case kButton1Up: {
         Double_t xx = gPad->AbsPixeltoX(px);
         Double_t yy = gPad->AbsPixeltoY(py);
         TFrame *frame = gPad->GetFrame();
         if (fX1==fX2) {
            if(zoom == 0){
               Double_t axisSpace = (frame->GetX2() - frame->GetX1())/(fParallel->GetNvar() - 1);
               Double_t pos = (xx - frame->GetX1())/axisSpace;
               if (pos < 0) n = -1;
               else         n = (Int_t)pos;
            } else {
               Double_t min = GetValuefromXY(xx,yy);
               Double_t max = GetValuefromXY(xx,gPad->AbsPixeltoY(pzoomold));
               if(TMath::Abs(min-max) < 0.00001) return;       // Avoid zooming if the axis is just clicked.
               if (fParallel->TestBit(TParallelCoord::kGlobalScale)) {
                  if (min>max) {
                     Double_t mem = min;
                     min = max; max = mem;
                  }
                  fParallel->SetGlobalMin(min);
                  fParallel->SetGlobalMax(max);
               } else {
                  SetCurrentLimits(min,max);
               }
            }
         } else {
            if(zoom == 0) {
               Double_t axisSpace = (frame->GetY2() - frame->GetY1())/(fParallel->GetNvar() - 1);
               Double_t pos = (yy-frame->GetY1())/axisSpace;
               if (pos < 0) n= -1;
               else         n = (Int_t)pos;
            } else {
               Double_t min = GetValuefromXY(xx,yy);
               Double_t max = GetValuefromXY(gPad->AbsPixeltoX(pzoomold),yy);
               SetCurrentLimits(min,max);
            }
         }
         if(zoom == 0){
            if (n>=0 && (UInt_t)n>=fParallel->GetNvar()) --n;
            else if (n<fParallel->GetVarList()->IndexOf(this)) ++n;
            fParallel->GetVarList()->Remove(this);
            fParallel->GetVarList()->AddAt(this,n);
         }
         gPad->Modified();
         break;
      }
      case kMouseMotion:
         pxold=px;
         pyold=py;
         break;
      case kButton1Motion:
         if(fX1==fX2){
            if(zoom==0){
               gPad->SetCursor(kArrowHor);
               gVirtualX->DrawLine(pxold,py1,pxold,py2);
               gVirtualX->DrawLine(px,py1,px,py2);
            } else if(zoom==1) {
               gPad->SetCursor(kArrowVer);
               if(!first) gVirtualX->DrawLine(gPad->XtoAbsPixel(fX1-0.05),pyold,gPad->XtoAbsPixel(fX1+0.05),pyold);
               gVirtualX->DrawLine(gPad->XtoAbsPixel(fX1-0.05),py,gPad->XtoAbsPixel(fX1+0.05),py);
               first = kFALSE;
            }
         } else {
            if(zoom==0){
               gPad->SetCursor(kArrowVer);
               gVirtualX->DrawLine(px1,pyold,px2,pyold);
               gVirtualX->DrawLine(px1,py,px2,py);
            } else if(zoom==1){
               gPad->SetCursor(kArrowHor);
               if(!first) gVirtualX->DrawLine(pxold,gPad->YtoAbsPixel(fY1-0.05),pxold,gPad->YtoAbsPixel(fY1+0.05));
               gVirtualX->DrawLine(px,gPad->YtoAbsPixel(fY1-0.05),px,gPad->YtoAbsPixel(fY1+0.05));
               first = kFALSE;
            }
         }
         pxold = px;
         pyold = py;
         break;
   }
}


//______________________________________________________________________________
void TParallelCoordVar::GetEntryXY(Long64_t n, Double_t & x, Double_t & y)
{
   // Get the position of the variable on the graph for the n'th entry.

   if(fX1==fX2){
      x = fX1;
      if (fMinCurrent != fMaxCurrent) {
         if (TestBit(kLogScale)) y = fY1 + (fY2 - fY1) *
                                    (TMath::Log10(fVal[n]/fMinCurrent)) / (TMath::Log10(fMaxCurrent/fMinCurrent));
         else                    y = fY1 + (fY2 - fY1) *
                                    (fVal[n] - fMinCurrent) / (fMaxCurrent - fMinCurrent);
      } else {
         y = fY1 + 0.5*(fY2-fY1);
      }
   } else {
      y = fY1;
      if (fMinCurrent != fMaxCurrent) {
         if (TestBit(kLogScale)) x = fX1 + (fX2 - fX1) *
                                    (TMath::Log10(fVal[n]/fMinCurrent)) / (TMath::Log10(fMaxCurrent/fMinCurrent));
         else                    x = fX1 + (fX2 - fX1) *
                                    (fVal[n] - fMinCurrent) / (fMaxCurrent - fMinCurrent);
      } else {
         x = fX1 + 0.5*(fX2-fX1);
      }
   }
}


//______________________________________________________________________________
Int_t TParallelCoordVar::GetEntryWeight(Long64_t evtidx)
{
   // Get the entry weight: The weight of an entry for a given variable
   // is the bin content of the histogram bin the entry is going through.

   Int_t bin = 1 + (Int_t)((fVal[evtidx] - fMinCurrent)/((fMaxCurrent-fMinCurrent)/fNbins));
   return (Int_t)fHistogram->GetBinContent(bin);
}


//______________________________________________________________________________
TH1F* TParallelCoordVar::GetHistogram()
{
   // Create or recreate the histogram.

   if (fHistogram) delete fHistogram;
   fHistogram = NULL;
   fHistogram = new TH1F("hpa", "hpa", fNbins, fMinCurrent, fMaxCurrent+0.0001*(fMaxCurrent-fMinCurrent));
   fHistogram->SetDirectory(0);
   Long64_t first = fParallel->GetCurrentFirst();
   Long64_t nentries = fParallel->GetCurrentN();
   for(Long64_t li=first; li<first+nentries;++li) {
      if(fVal[li] >= fMinCurrent && fVal[li] <= fMaxCurrent) fHistogram->Fill(fVal[li]);
   }
   return fHistogram;
}


//______________________________________________________________________________
void TParallelCoordVar::GetMinMaxMean()
{
   //Get mean, min and max of thos variable
   Double_t min,max,ave = 0;
   min = DBL_MAX;
   max = -DBL_MAX;
   Long64_t first,nentries;
   first = fParallel->GetCurrentFirst();
   nentries = fParallel->GetCurrentN();
   for(Long64_t li=first; li<first+nentries;++li){
      if(fVal[li]<min) min = fVal[li];
      if(fVal[li]>max) max = fVal[li];
      ave+=fVal[li];
   }

   fMean = ave/((Double_t)nentries);
   fMinCurrent = fMinInit = min;
   fMaxCurrent = fMaxInit = max;
}


//______________________________________________________________________________
char* TParallelCoordVar::GetObjectInfo(Int_t px, Int_t py) const
{
   // Returns info about this axis.

   static char info[128];
   info[0] = 0;

   if (!gPad) return info;
   Double_t xx = gPad->AbsPixeltoX(px);
   Double_t yy = gPad->AbsPixeltoY(py);
   if (fX1 == fX2) {
      if (yy<fY1) {
         snprintf(info,128,"%s = %f", GetTitle(), fMinCurrent);
      } else if (yy>fY2) {
         snprintf(info,128,"%s = %f", GetTitle(), fMaxCurrent);
      } else {
         Double_t axislength = fY2-fY1;
         Double_t pos = (yy-fY1)/axislength;
         snprintf(info,128,"%s = %f", GetTitle(), fMinCurrent + pos*(fMaxCurrent-fMinCurrent));
      }
   } else {
      if (xx<fX1) {
         snprintf(info,128,"%s = %f", GetTitle(), fMinCurrent);
      } else if(xx>fX2) {
         snprintf(info,128,"%s = %f", GetTitle(), fMaxCurrent);
      } else {
         Double_t axislength = fX2-fX1;
         Double_t pos = (xx-fX1)/axislength;
         snprintf(info,128,"%s = %f", GetTitle(), pos*(fMaxCurrent-fMinCurrent));
      }
   }
   return info;
}


//______________________________________________________________________________
void TParallelCoordVar::GetQuantiles()
{
   // Get the box plot values (quantiles).

   Double_t *quantiles = new Double_t[3];
   quantiles[0]=0.; quantiles[1]=0.; quantiles[2] = 0.;
   Double_t *prob = new Double_t[3];
   prob[0]=0.25; prob[1]=0.5; prob[2] = 0.75;
   Long64_t first = fParallel->GetCurrentFirst();
   Long64_t nentries = fParallel->GetCurrentN();
   if (!TestBit(kLogScale) && first==0 && nentries==fNentries) TMath::Quantiles(fNentries,3,fVal,quantiles,prob,kFALSE);
   else {
      Double_t* val = new Double_t[nentries];
      Int_t selected = 0;
      if(fMinInit<=0) {
         for (Long64_t n=first;n<first+nentries;++n) {
            if (fVal[n] >= fMinCurrent) {
               if (TestBit(kLogScale)) val[selected] = TMath::Log10(fVal[n]);
               else                    val[selected] = fVal[n];
               ++selected;
            }
         }
      } else {
         for (Long64_t n=first;n<first+nentries;++n) {
            if (TestBit(kLogScale)) val[selected] = TMath::Log10(fVal[n]);
            else                    val[selected] = fVal[n];
            ++selected;
         }
      }
      TMath::Quantiles(selected,3,val,quantiles,prob,kFALSE);
      delete [] val;
   }
   fQua1 = quantiles[0];
   fMed = quantiles[1];
   fQua3 = quantiles[2];
   delete [] quantiles;
   delete [] prob;
}


//______________________________________________________________________________
Double_t TParallelCoordVar::GetValuefromXY(Double_t x,Double_t y)
{
   // Get the value corresponding to the posiiton.

   Double_t pos;
   if (fMinCurrent == fMaxCurrent) return fMinCurrent;
   if (fX1 == fX2) {
      if (y<=fY1)      pos = fMinCurrent;
      else if (y>=fY2) pos = fMaxCurrent;
      else             pos = fMinCurrent + ((y-fY1)/(fY2-fY1))*(fMaxCurrent-fMinCurrent);
   } else {
      if (x<=fX1)      pos = fMinCurrent;
      else if (x>=fX2) pos = fMaxCurrent;
      else             pos = fMinCurrent + ((x-fX1)/(fX2-fX1))*(fMaxCurrent-fMinCurrent);
   }
   return pos;
}


//______________________________________________________________________________
void TParallelCoordVar::GetXYfromValue(Double_t value, Double_t & x, Double_t & y)
{
   // Get a position corresponding to the value on the axis.

   if(value < fMinCurrent || value > fMaxCurrent) return;

   if (fX1==fX2) {
      x = fX1;
      if (fMinCurrent != fMaxCurrent) {
         if (TestBit(kLogScale)) y = fY1 + (fY2 - fY1) *
                                    (TMath::Log10(value/fMinCurrent)) / (TMath::Log10(fMaxCurrent/fMinCurrent));
         else                    y = fY1 + (fY2 - fY1) *
                                    (value - fMinCurrent) / (fMaxCurrent - fMinCurrent);
      } else {
         y = fY1 + 0.5*(fY2-fY1);
      }
   } else {
      y = fY1;
      if (fMinCurrent != fMaxCurrent) {
         if (TestBit(kLogScale)) x = fX1 + (fX2 - fX1) *
                                    (TMath::Log10(value/fMinCurrent)) / (TMath::Log10(fMaxCurrent/fMinCurrent));
         else                    x = fX1 + (fX2 - fX1) *
                                    (value - fMinCurrent) / (fMaxCurrent - fMinCurrent);
      } else {
         x = fX1 + 0.5*(fX2-fX1);
      }
   }
}


//______________________________________________________________________________
void TParallelCoordVar::Init()
{
   // Initialise the TParallelVar variables.

   fX1         = 0;
   fX2         = 0;
   fY1         = 0;
   fY2         = 0;
   fId         = 0;
   fVal        = NULL;
   fMean       = 0;
   fMinInit    = 0;
   fMinCurrent = 0;
   fMaxInit    = 0;
   fMaxCurrent = 0;
   fMed        = 0;
   fQua1       = 0;
   fQua3       = 0;
   fNentries   = 0;
   fParallel   = NULL;
   fHistogram  = NULL;
   fNbins      = 100;
   fHistoLW    = 2;
   fHistoHeight     = 0.5;
   fRanges     = NULL;
   SetBit(kLogScale,kFALSE);
   SetBit(kShowBox,kFALSE);
   SetBit(kShowBarHisto,kTRUE);
}


//______________________________________________________________________________
void TParallelCoordVar::Paint(Option_t* /*option*/)
{
   // Paint the axis.

   PaintHistogram();
   if (TestBit(kShowBox)) PaintBoxPlot();
   PaintLabels();
}


//______________________________________________________________________________
void TParallelCoordVar::PaintBoxPlot()
{
   // Paint the boxes in the case of a candle chart.

   TLine *line = new TLine();
   line->SetLineColor(GetLineColor());
   line->SetLineWidth(1);
   TBox *box = new TBox();
   box->SetLineWidth(1);
   box->SetLineColor(GetLineColor());
   box->SetLineStyle(1);
   box->SetFillStyle(0);

   TFrame* frame = gPad->GetFrame();

   Double_t boxSize;
   if (fParallel->GetNvar() > 1) {
      if (fX1==fX2) boxSize = fHistoHeight*((frame->GetY2()-frame->GetY1())/(fParallel->GetNvar()-1));
      else          boxSize = fHistoHeight*((frame->GetX2()-frame->GetX1())/(fParallel->GetNvar()-1));
      if (boxSize >= 0.03) boxSize = 0.03;
   }
   else boxSize = 0.03;

   Double_t qua1,med,qua3,max,min;
   Double_t a,b,maxinit,mininit;
   if (TestBit(kLogScale)) {
      a = TMath::Log10(fMinCurrent);
      b = TMath::Log10(fMaxCurrent/fMinCurrent);
      if(fMinInit > 0) mininit = TMath::Log10(fMinInit);
      else             mininit = TMath::Log10(fMinCurrent);
      maxinit = TMath::Log10(fMaxInit);
   } else {
      a = fMinCurrent;
      b = fMaxCurrent-fMinCurrent;
      mininit = fMinInit;
      maxinit = fMaxInit;
   }
   if(fX1==fX2) {
      qua1 = fY1 + ((fQua1-a)/b)*(fY2-fY1);
      qua3 = fY1 + ((fQua3-a)/b)*(fY2-fY1);
      med  = fY1 + ((fMed-a)/b)*(fY2-fY1);
      max  = fY1 + ((maxinit-a)/b)*(fY2-fY1);
      min  = fY1 + ((mininit-a)/b)*(fY2-fY1);
   } else {
      qua1 = fX1 + ((fQua1-a)/b)*(fX2-fX1);
      qua3 = fX1 + ((fQua3-a)/b)*(fX2-fX1);
      med  = fX1 + ((fMed-a)/b)*(fX2-fX1);
      max  = fX1 + ((maxinit-a)/b)*(fX2-fX1);
      min  = fX1 + ((mininit-a)/b)*(fX2-fX1);
   }

   // min and max lines.
   if (fX1==fX2) {
      line->PaintLine(fX1-boxSize,min,fX1+boxSize,min);
      line->PaintLine(fX2-boxSize,max,fX2+boxSize,max);
   } else {
      line->PaintLine(min,fY1-boxSize,min,fY1+boxSize);
      line->PaintLine(max,fY2-boxSize,max,fY2+boxSize);
   }

   // lines from min and max to the box.
   line->SetLineStyle(7);
   if (fX1==fX2) {
      if (min<frame->GetY1()) min = frame->GetY1();
      if (max>frame->GetY2()) max = frame->GetY2();
      line->PaintLine(fX1,min,fX1,qua1);
      line->PaintLine(fX1,qua3,fX1,max);
   } else {
      if (min<frame->GetX1()) min = frame->GetX1();
      if (max>frame->GetX2()) max = frame->GetX2();
      line->PaintLine(min,fY1,qua1,fY2);
      line->PaintLine(qua3,fY1,max,fY2);
   }

   // Box
   if(fX1==fX2) box->PaintBox(fX1-boxSize,qua1,fX1+boxSize,qua3);
   else box->PaintBox(qua1,fY1-boxSize,qua3,fY1+boxSize);

   // Median line
   line->SetLineStyle(1);
   if(fX1==fX2) line->PaintLine(fX1-boxSize,med,fX1+boxSize,med);
   else line->PaintLine(med,fY1-boxSize,med,fY1+boxSize);

   // Paint average
   if (!TestBit(kLogScale) || (TestBit(kLogScale) && fMean > 0)) {
      Double_t mean;
      if (TestBit(kLogScale)) mean = TMath::Log10(fMean);
      else mean = fMean;
      TMarker *mark = NULL;
      if(fX1==fX2) mark = new TMarker(fX1,fY1 + ((mean-a)/b)*(fY2-fY1),24);
      else         mark = new TMarker(fX1 + ((mean-a)/b)*(fX2-fX1),fY1,24);
      mark->Paint();
      delete mark;
   }

   delete line;
   delete box;
}


//______________________________________________________________________________
void TParallelCoordVar::PaintHistogram()
{
   // Paint the histogram on the axis.

   Int_t i;

   TFrame *frame = gPad->GetFrame();

   if (!fHistogram) GetHistogram();

   // Paint the axis body.
   if (fHistoHeight!=0 && TestBit(kShowBarHisto)) {
      // Paint the axis body using bar chart.
      TBox *b = new TBox();
      b->SetFillStyle(GetFillStyle());
      b->SetFillColor(GetFillColor());
      b->SetLineStyle(1);
      b->SetLineColor(GetFillColor());
      b->SetLineWidth(1);
      Double_t hmin = fHistogram->GetMinimum();
      Double_t hmax = fHistogram->GetMaximum();
      if (fX1 == fX2) {
         // Vertical case.
         Double_t dy = (fY2-fY1)/fNbins;
         Double_t dv = (fMaxCurrent - fMinCurrent)/fNbins;
         Double_t v = fMinCurrent;
         Double_t y1 = fY1,x2,y2;
         for (i=1; i<=fNbins; i++) {
            x2 = fX1+((fHistogram->GetBinContent(i)-hmin)/(hmax-hmin))*fHistoHeight*
                 ((frame->GetX2()-frame->GetX1())/(fParallel->GetNvar()-1));
            if(TestBit(kLogScale)) y2 = fY1 + (fY2-fY1)*(TMath::Log10((v+dv)/fMinCurrent)) / (TMath::Log10(fMaxCurrent/fMinCurrent));
            else y2=y1+dy;
            b->PaintBox(fX1,y1,x2,y2,"l");
            y1=y2;
            v += dv;
         }
      } else {
         // Horizontal case.
         Double_t dx = (fX2-fX1)/fNbins;
         Double_t dv = (fMaxCurrent - fMinCurrent)/fNbins;
         Double_t v = fMinCurrent;
         Double_t x1 = fX1,x2,y2;
         for (i=1; i<=fNbins; i++) {
            y2 = fY1+((fHistogram->GetBinContent(i)-hmin)/(hmax-hmin))*fHistoHeight*((frame->GetY2()-frame->GetY1())/(fParallel->GetNvar()-1));
            if(TestBit(kLogScale)) x2 = fX1 + (fX2-fX1)*(TMath::Log10((v+dv)/fMinCurrent)) / (TMath::Log10(fMaxCurrent/fMinCurrent));
            else x2=x1+dx;
            b->PaintBox(x1,fY1,x2,y2,"l");
            x1=x2;
            v+=dv;
         }
      }
      delete b;
   }
   if (fHistoLW==0 && !TestBit(kShowBox)) {
      // Paint the axis body as a simple line.
      TLine* l = new TLine(fX1,fY1,fX2,fY2);
      l->SetLineWidth(GetLineWidth());
      l->SetLineColor(GetLineColor());
      l->SetLineStyle(GetLineColor());
      l->Paint();
      delete l;
   } else if (fHistoLW!=0){
      // Paint the axis body using the color palette.
      TLine *lb = new TLine();
      lb->SetLineWidth(fHistoLW);
      Double_t hmin = fHistogram->GetMinimum();
      Double_t hmax = fHistogram->GetMaximum();
      Int_t theColor;
      Int_t ncolors = gStyle->GetNumberOfColors();
      if (fX1 == fX2) {
         // Vertical case.
         Double_t dy = (fY2-fY1)/fNbins;
         Double_t y1 = fY1,y2;
         Double_t dv = (fMaxCurrent - fMinCurrent)/fNbins;
         Double_t v = fMinCurrent;
         for (i=1; i<=fNbins; i++) {
            theColor = (Int_t)( ((fHistogram->GetBinContent(i)-hmin)/(hmax-hmin))*(ncolors-1) );
            if(TestBit(kLogScale)) y2 = fY1 + (fY2-fY1)*(TMath::Log10((v+dv)/fMinCurrent)) / (TMath::Log10(fMaxCurrent/fMinCurrent));
            else y2=y1+dy;
            lb->SetLineColor(gStyle->GetColorPalette(theColor));
            lb->PaintLine(fX1,y1,fX1,y2);
            y1=y2;
            v+=dv;
         }
      } else {
         // Horizontal case.
         Double_t dx = (fX2-fX1)/fNbins;
         Double_t dv = (fMaxCurrent - fMinCurrent)/fNbins;
         Double_t v = fMinCurrent;
         Double_t x1 = fX1,x2;
         for (i=1; i<=fNbins; i++) {
            theColor = (Int_t)( ((fHistogram->GetBinContent(i)-hmin)/(hmax-hmin))*(ncolors-1) );
            lb->SetLineColor(gStyle->GetColorPalette(theColor));
            if(TestBit(kLogScale)) x2 = fX1 + (fX2-fX1)*(TMath::Log10((v+dv)/fMinCurrent)) / (TMath::Log10(fMaxCurrent/fMinCurrent));
            else x2=x1+dx;
            lb->PaintLine(x1,fY1,x2,fY1);
            x1=x2;
            v+=dv;
         }
      }
      delete lb;
   }
}


//______________________________________________________________________________
void TParallelCoordVar::PaintLabels()
{
   // Paint the axis labels and titles.

   TLatex* t = new TLatex();
   TFrame *frame = gPad->GetFrame();
   t->SetTextSize(0.03);
   if (fX1==fX2) {
      t->SetText(fX1,frame->GetY1() - 0.04 - t->GetTextSize(),GetName());
      Double_t tlength = t->GetXsize();
      if (fX1-0.5*tlength<0.01) {
         t->SetTextAlign(11);
         t->SetText(0.01, frame->GetY1() - 0.04 - t->GetTextSize(), GetName());
         t->Paint();
      } else if (fX1+0.5*tlength > 0.99) {
         t->SetTextAlign(31);
         t->SetText(0.99,frame->GetY1() - 0.04 - t->GetTextSize(),GetName());
         t->Paint();
      } else {
         t->SetTextAlign(21);
         t->PaintLatex(fX1,frame->GetY1() - 0.04 - t->GetTextSize(),0,0.03,GetName());
      }
      if (!fParallel->TestBit(TParallelCoord::kCandleChart)) {
         t->SetTextAlign(21);
         t->PaintLatex(fX1,frame->GetY2() + 0.005,0,0.025,Form("%g",fMaxCurrent));
         t->SetTextAlign(23);
         t->PaintLatex(fX1,frame->GetY1() - 0.005,0,0.025,Form("%g",fMinCurrent));
      }
   } else {
      t->SetText(fX1-0.04,fY1+0.02,GetName());
      t->SetTextSize(0.03);
      Double_t tlength = t->GetXsize();
      if (fX1-0.04-tlength<0.01) {
         t->SetTextAlign(12);
         t->SetText(0.01,fY1+0.02,GetName());
         t->Paint();
      } else {
         t->SetTextAlign(32);
         t->PaintLatex(fX1-0.04,fY1+0.02,0,0.03,GetName());
      }
      if (!fParallel->TestBit(TParallelCoord::kCandleChart)) {
         t->SetTextAlign(12);
         t->PaintLatex(0.01,fY1-0.02,0,0.025,Form("%g",fMinCurrent));
         t->SetTextAlign(32);
         t->PaintLatex(0.99,fY1-0.02,0,0.025,Form("%g",fMaxCurrent));
      }
   }
   delete t;
}


//______________________________________________________________________________
void TParallelCoordVar::Print(Option_t* /*option*/) const
{
   // Print the axis main datas.

   printf("**************variable #%d**************\n",fParallel->GetVarList()->IndexOf(this));
   printf("at x1=%f, y1=%f, x2=%f, y2=%f.\n",fX1,fY1,fX2,fY2);
   printf("min = %f, Q1 = %f, Med = %f, Q3 = %f, Max = %f\n", fMinInit, fQua1, fMed, fQua3, fMaxInit);
}


//______________________________________________________________________________
void TParallelCoordVar::SavePrimitive(std::ostream & out, Option_t* options)
{
   // Save the TParallelCoordVar as a macro. Can be used only in the context
   // of TParallelCoord::SavePrimitive (pointer "TParallelCoord* para" is
   // defined in TParallelCoord::SavePrimitive) with the option "pcalled".

   TString opt = options;
   if (opt.Contains("pcalled")) {
      out<<"   var->SetBit(TParallelCoordVar::kLogScale,"<<TestBit(kLogScale)<<");"<<std::endl;
      out<<"   var->SetBit(TParallelCoordVar::kShowBox,"<<TestBit(kShowBox)<<");"<<std::endl;
      out<<"   var->SetBit(TParallelCoordVar::kShowBarHisto,"<<TestBit(kShowBarHisto)<<");"<<std::endl;
      out<<"   var->SetHistogramBinning("<<fNbins<<");"<<std::endl;
      out<<"   var->SetHistogramLineWidth("<<fHistoLW<<");"<<std::endl;
      out<<"   var->SetInitMin("<<fMinInit<<");"<<std::endl;
      out<<"   var->SetInitMax("<<fMaxInit<<");"<<std::endl;
      out<<"   var->SetHistogramHeight("<<fHistoHeight<<");"<<std::endl;
      out<<"   var->GetMinMaxMean();"<<std::endl;
      out<<"   var->GetHistogram();"<<std::endl;
      out<<"   var->SetFillStyle("<<GetFillStyle()<<");"<<std::endl;
      out<<"   var->SetFillColor("<<GetFillColor()<<");"<<std::endl;
      out<<"   var->SetLineColor("<<GetLineColor()<<");"<<std::endl;
      out<<"   var->SetLineWidth("<<GetLineWidth()<<");"<<std::endl;
      out<<"   var->SetLineStyle("<<GetLineStyle()<<");"<<std::endl;
      if (TestBit(kShowBox)) out<<"   var->GetQuantiles();"<<std::endl;
      TIter next(fRanges);
      TParallelCoordRange* range;
      Int_t i = 1;
      while ((range = (TParallelCoordRange*)next())) {
         out<<"   //***************************************"<<std::endl;
         out<<"   // Create the "<<i<<"th range owned by the axis \""<<GetTitle()<<"\"."<<std::endl;
         out<<"   TParallelCoordSelect* sel = para->GetSelection(\""<<range->GetSelection()->GetTitle()<<"\");"<<std::endl;
         out<<"   TParallelCoordRange* newrange = new TParallelCoordRange(var,"<<range->GetMin()<<","<<range->GetMax()<<",sel);"<<std::endl;
         out<<"   var->AddRange(newrange);"<<std::endl;
         out<<"   sel->Add(newrange);"<<std::endl;
         ++i;
      }
   }
}


//______________________________________________________________________________
void TParallelCoordVar::SetBoxPlot(Bool_t box)
{
   // Set the axis to display a candle.

   SetBit(kShowBox,box);
   if (box) SetHistogramHeight(0.5);
   else {
      SetHistogramHeight(0);
      SetHistogramLineWidth(2);
   }
}


//______________________________________________________________________________
void TParallelCoordVar::SetHistogramBinning(Int_t n)
{
   // Set the histogram binning.

   if (n < 0 || n == fNbins) return;
   fNbins = n;
   GetHistogram();
}


//______________________________________________________________________________
void TParallelCoordVar::SetHistogramHeight(Double_t h)
{
   // Set the height of the bar histogram.

   fHistoHeight = h;
   if (!fParallel->TestBit(TParallelCoord::kCandleChart)){
      if(h!=0) SetBit(kShowBarHisto,kTRUE);
      else SetBit(kShowBarHisto,kFALSE);
   }
}


//______________________________________________________________________________
void TParallelCoordVar::SetCurrentMin(Double_t min)
{
   // Set the current minimum of the axis.

   fMinCurrent = min;
}


//______________________________________________________________________________
void TParallelCoordVar::SetCurrentMax(Double_t max)
{
   // Set the current maximum of the axis.

   fMaxCurrent = max;
}


//______________________________________________________________________________
void TParallelCoordVar::SetCurrentLimits(Double_t min, Double_t max)
{
   // Set the limits within which one the entries must be painted.

   if (min>max) {
      Double_t mem = min;
      min = max;
      max = mem;
   }
   if(TestBit(kLogScale) && max<=0) return;
   if(TestBit(kLogScale) && min<=0) min = 0.00001*max;
   fMinCurrent = min;
   fMaxCurrent = max;

   delete fHistogram;
   fHistogram = NULL;
   GetHistogram();

   if (fParallel->TestBit(TParallelCoord::kGlobalScale)) {
      fParallel->SetGlobalMin(min);
      fParallel->SetGlobalMax(max);
   }
}


//______________________________________________________________________________
void TParallelCoordVar::SetLiveRangesUpdate(Bool_t on)
{
   // If true, the pad is updated while the motion of a dragged range.

   TIter next(fRanges);
   TParallelCoordRange* range;
   while ((range = (TParallelCoordRange*)next())) range->SetBit(TParallelCoordRange::kLiveUpdate,on);
}


//______________________________________________________________________________
void TParallelCoordVar::SetLogScale(Bool_t log)
{
   // Set the axis in logscale.

   if (log == TestBit (kLogScale)) return;
   if (fMaxInit < 0)             SetBit(kLogScale,kFALSE);
   else if (log) {
      if (fMaxCurrent < 0 ) fMaxCurrent = fMaxInit;
      if (fMinCurrent < 0 ) fMinCurrent = 0.00001*fMaxCurrent;
      SetBit(kLogScale,kTRUE);
      SetCurrentMin(fMinCurrent);
      SetCurrentMax(fMaxCurrent);
   } else {
      SetBit(kLogScale,kFALSE);
      SetCurrentMin(fMinInit);
      SetCurrentMax(fMaxInit);
   }
   GetQuantiles();
   GetHistogram();
}


//______________________________________________________________________________
void TParallelCoordVar::SetValues(Long64_t length, Double_t* val)
{
   // Set the variable values.

   if (fVal) delete [] fVal;
   fVal = new Double_t[length];
   fNentries = length;
   for (Long64_t li = 0; li < length; ++li) fVal[li] = val[li];
   GetMinMaxMean();
   GetHistogram();
   if (TestBit(kShowBox)) GetQuantiles();
}


//______________________________________________________________________________
void TParallelCoordVar::SetX(Double_t x, Bool_t gl)
{
   // Set the X position of the axis in the case of a vertical axis.
   // and rotate the axis if it was horizontal.

   TFrame *frame = gPad->GetFrame();
   if (!gl) {
      fY1 = frame->GetY1();
      fY2 = frame->GetY2();
   } else {
      Double_t gmin = fParallel->GetGlobalMin();
      Double_t gmax = fParallel->GetGlobalMax();
      fY1 = frame->GetY1() + ((fMinCurrent-gmin)/(gmax-gmin))*(frame->GetY2()-frame->GetY1());
      fY2 = frame->GetY1() + ((fMaxCurrent-gmin)/(gmax-gmin))*(frame->GetY2()-frame->GetY1());
   }
   fX1 = fX2 = x;
}


//______________________________________________________________________________
void TParallelCoordVar::SetY(Double_t y, Bool_t gl)
{
   // Set the Y position of the axis in the case of a horizontal axis.
   // and rotate the axis if it was vertical.

   TFrame *frame = gPad->GetFrame();
   if (!gl) {
      fX1 = frame->GetX1();
      fX2 = frame->GetX2();
   } else {
      Double_t gmin = fParallel->GetGlobalMin();
      Double_t gmax = fParallel->GetGlobalMax();
      fX1 = frame->GetX1() + ((fMinCurrent-gmin)/(gmax-gmin))*(frame->GetX2()-frame->GetX1());
      fX2 = frame->GetX1() + ((fMaxCurrent-gmin)/(gmax-gmin))*(frame->GetX2()-frame->GetX1());
   }
   fY1 = fY2 = y;
}
 TParallelCoordVar.cxx:1
 TParallelCoordVar.cxx:2
 TParallelCoordVar.cxx:3
 TParallelCoordVar.cxx:4
 TParallelCoordVar.cxx:5
 TParallelCoordVar.cxx:6
 TParallelCoordVar.cxx:7
 TParallelCoordVar.cxx:8
 TParallelCoordVar.cxx:9
 TParallelCoordVar.cxx:10
 TParallelCoordVar.cxx:11
 TParallelCoordVar.cxx:12
 TParallelCoordVar.cxx:13
 TParallelCoordVar.cxx:14
 TParallelCoordVar.cxx:15
 TParallelCoordVar.cxx:16
 TParallelCoordVar.cxx:17
 TParallelCoordVar.cxx:18
 TParallelCoordVar.cxx:19
 TParallelCoordVar.cxx:20
 TParallelCoordVar.cxx:21
 TParallelCoordVar.cxx:22
 TParallelCoordVar.cxx:23
 TParallelCoordVar.cxx:24
 TParallelCoordVar.cxx:25
 TParallelCoordVar.cxx:26
 TParallelCoordVar.cxx:27
 TParallelCoordVar.cxx:28
 TParallelCoordVar.cxx:29
 TParallelCoordVar.cxx:30
 TParallelCoordVar.cxx:31
 TParallelCoordVar.cxx:32
 TParallelCoordVar.cxx:33
 TParallelCoordVar.cxx:34
 TParallelCoordVar.cxx:35
 TParallelCoordVar.cxx:36
 TParallelCoordVar.cxx:37
 TParallelCoordVar.cxx:38
 TParallelCoordVar.cxx:39
 TParallelCoordVar.cxx:40
 TParallelCoordVar.cxx:41
 TParallelCoordVar.cxx:42
 TParallelCoordVar.cxx:43
 TParallelCoordVar.cxx:44
 TParallelCoordVar.cxx:45
 TParallelCoordVar.cxx:46
 TParallelCoordVar.cxx:47
 TParallelCoordVar.cxx:48
 TParallelCoordVar.cxx:49
 TParallelCoordVar.cxx:50
 TParallelCoordVar.cxx:51
 TParallelCoordVar.cxx:52
 TParallelCoordVar.cxx:53
 TParallelCoordVar.cxx:54
 TParallelCoordVar.cxx:55
 TParallelCoordVar.cxx:56
 TParallelCoordVar.cxx:57
 TParallelCoordVar.cxx:58
 TParallelCoordVar.cxx:59
 TParallelCoordVar.cxx:60
 TParallelCoordVar.cxx:61
 TParallelCoordVar.cxx:62
 TParallelCoordVar.cxx:63
 TParallelCoordVar.cxx:64
 TParallelCoordVar.cxx:65
 TParallelCoordVar.cxx:66
 TParallelCoordVar.cxx:67
 TParallelCoordVar.cxx:68
 TParallelCoordVar.cxx:69
 TParallelCoordVar.cxx:70
 TParallelCoordVar.cxx:71
 TParallelCoordVar.cxx:72
 TParallelCoordVar.cxx:73
 TParallelCoordVar.cxx:74
 TParallelCoordVar.cxx:75
 TParallelCoordVar.cxx:76
 TParallelCoordVar.cxx:77
 TParallelCoordVar.cxx:78
 TParallelCoordVar.cxx:79
 TParallelCoordVar.cxx:80
 TParallelCoordVar.cxx:81
 TParallelCoordVar.cxx:82
 TParallelCoordVar.cxx:83
 TParallelCoordVar.cxx:84
 TParallelCoordVar.cxx:85
 TParallelCoordVar.cxx:86
 TParallelCoordVar.cxx:87
 TParallelCoordVar.cxx:88
 TParallelCoordVar.cxx:89
 TParallelCoordVar.cxx:90
 TParallelCoordVar.cxx:91
 TParallelCoordVar.cxx:92
 TParallelCoordVar.cxx:93
 TParallelCoordVar.cxx:94
 TParallelCoordVar.cxx:95
 TParallelCoordVar.cxx:96
 TParallelCoordVar.cxx:97
 TParallelCoordVar.cxx:98
 TParallelCoordVar.cxx:99
 TParallelCoordVar.cxx:100
 TParallelCoordVar.cxx:101
 TParallelCoordVar.cxx:102
 TParallelCoordVar.cxx:103
 TParallelCoordVar.cxx:104
 TParallelCoordVar.cxx:105
 TParallelCoordVar.cxx:106
 TParallelCoordVar.cxx:107
 TParallelCoordVar.cxx:108
 TParallelCoordVar.cxx:109
 TParallelCoordVar.cxx:110
 TParallelCoordVar.cxx:111
 TParallelCoordVar.cxx:112
 TParallelCoordVar.cxx:113
 TParallelCoordVar.cxx:114
 TParallelCoordVar.cxx:115
 TParallelCoordVar.cxx:116
 TParallelCoordVar.cxx:117
 TParallelCoordVar.cxx:118
 TParallelCoordVar.cxx:119
 TParallelCoordVar.cxx:120
 TParallelCoordVar.cxx:121
 TParallelCoordVar.cxx:122
 TParallelCoordVar.cxx:123
 TParallelCoordVar.cxx:124
 TParallelCoordVar.cxx:125
 TParallelCoordVar.cxx:126
 TParallelCoordVar.cxx:127
 TParallelCoordVar.cxx:128
 TParallelCoordVar.cxx:129
 TParallelCoordVar.cxx:130
 TParallelCoordVar.cxx:131
 TParallelCoordVar.cxx:132
 TParallelCoordVar.cxx:133
 TParallelCoordVar.cxx:134
 TParallelCoordVar.cxx:135
 TParallelCoordVar.cxx:136
 TParallelCoordVar.cxx:137
 TParallelCoordVar.cxx:138
 TParallelCoordVar.cxx:139
 TParallelCoordVar.cxx:140
 TParallelCoordVar.cxx:141
 TParallelCoordVar.cxx:142
 TParallelCoordVar.cxx:143
 TParallelCoordVar.cxx:144
 TParallelCoordVar.cxx:145
 TParallelCoordVar.cxx:146
 TParallelCoordVar.cxx:147
 TParallelCoordVar.cxx:148
 TParallelCoordVar.cxx:149
 TParallelCoordVar.cxx:150
 TParallelCoordVar.cxx:151
 TParallelCoordVar.cxx:152
 TParallelCoordVar.cxx:153
 TParallelCoordVar.cxx:154
 TParallelCoordVar.cxx:155
 TParallelCoordVar.cxx:156
 TParallelCoordVar.cxx:157
 TParallelCoordVar.cxx:158
 TParallelCoordVar.cxx:159
 TParallelCoordVar.cxx:160
 TParallelCoordVar.cxx:161
 TParallelCoordVar.cxx:162
 TParallelCoordVar.cxx:163
 TParallelCoordVar.cxx:164
 TParallelCoordVar.cxx:165
 TParallelCoordVar.cxx:166
 TParallelCoordVar.cxx:167
 TParallelCoordVar.cxx:168
 TParallelCoordVar.cxx:169
 TParallelCoordVar.cxx:170
 TParallelCoordVar.cxx:171
 TParallelCoordVar.cxx:172
 TParallelCoordVar.cxx:173
 TParallelCoordVar.cxx:174
 TParallelCoordVar.cxx:175
 TParallelCoordVar.cxx:176
 TParallelCoordVar.cxx:177
 TParallelCoordVar.cxx:178
 TParallelCoordVar.cxx:179
 TParallelCoordVar.cxx:180
 TParallelCoordVar.cxx:181
 TParallelCoordVar.cxx:182
 TParallelCoordVar.cxx:183
 TParallelCoordVar.cxx:184
 TParallelCoordVar.cxx:185
 TParallelCoordVar.cxx:186
 TParallelCoordVar.cxx:187
 TParallelCoordVar.cxx:188
 TParallelCoordVar.cxx:189
 TParallelCoordVar.cxx:190
 TParallelCoordVar.cxx:191
 TParallelCoordVar.cxx:192
 TParallelCoordVar.cxx:193
 TParallelCoordVar.cxx:194
 TParallelCoordVar.cxx:195
 TParallelCoordVar.cxx:196
 TParallelCoordVar.cxx:197
 TParallelCoordVar.cxx:198
 TParallelCoordVar.cxx:199
 TParallelCoordVar.cxx:200
 TParallelCoordVar.cxx:201
 TParallelCoordVar.cxx:202
 TParallelCoordVar.cxx:203
 TParallelCoordVar.cxx:204
 TParallelCoordVar.cxx:205
 TParallelCoordVar.cxx:206
 TParallelCoordVar.cxx:207
 TParallelCoordVar.cxx:208
 TParallelCoordVar.cxx:209
 TParallelCoordVar.cxx:210
 TParallelCoordVar.cxx:211
 TParallelCoordVar.cxx:212
 TParallelCoordVar.cxx:213
 TParallelCoordVar.cxx:214
 TParallelCoordVar.cxx:215
 TParallelCoordVar.cxx:216
 TParallelCoordVar.cxx:217
 TParallelCoordVar.cxx:218
 TParallelCoordVar.cxx:219
 TParallelCoordVar.cxx:220
 TParallelCoordVar.cxx:221
 TParallelCoordVar.cxx:222
 TParallelCoordVar.cxx:223
 TParallelCoordVar.cxx:224
 TParallelCoordVar.cxx:225
 TParallelCoordVar.cxx:226
 TParallelCoordVar.cxx:227
 TParallelCoordVar.cxx:228
 TParallelCoordVar.cxx:229
 TParallelCoordVar.cxx:230
 TParallelCoordVar.cxx:231
 TParallelCoordVar.cxx:232
 TParallelCoordVar.cxx:233
 TParallelCoordVar.cxx:234
 TParallelCoordVar.cxx:235
 TParallelCoordVar.cxx:236
 TParallelCoordVar.cxx:237
 TParallelCoordVar.cxx:238
 TParallelCoordVar.cxx:239
 TParallelCoordVar.cxx:240
 TParallelCoordVar.cxx:241
 TParallelCoordVar.cxx:242
 TParallelCoordVar.cxx:243
 TParallelCoordVar.cxx:244
 TParallelCoordVar.cxx:245
 TParallelCoordVar.cxx:246
 TParallelCoordVar.cxx:247
 TParallelCoordVar.cxx:248
 TParallelCoordVar.cxx:249
 TParallelCoordVar.cxx:250
 TParallelCoordVar.cxx:251
 TParallelCoordVar.cxx:252
 TParallelCoordVar.cxx:253
 TParallelCoordVar.cxx:254
 TParallelCoordVar.cxx:255
 TParallelCoordVar.cxx:256
 TParallelCoordVar.cxx:257
 TParallelCoordVar.cxx:258
 TParallelCoordVar.cxx:259
 TParallelCoordVar.cxx:260
 TParallelCoordVar.cxx:261
 TParallelCoordVar.cxx:262
 TParallelCoordVar.cxx:263
 TParallelCoordVar.cxx:264
 TParallelCoordVar.cxx:265
 TParallelCoordVar.cxx:266
 TParallelCoordVar.cxx:267
 TParallelCoordVar.cxx:268
 TParallelCoordVar.cxx:269
 TParallelCoordVar.cxx:270
 TParallelCoordVar.cxx:271
 TParallelCoordVar.cxx:272
 TParallelCoordVar.cxx:273
 TParallelCoordVar.cxx:274
 TParallelCoordVar.cxx:275
 TParallelCoordVar.cxx:276
 TParallelCoordVar.cxx:277
 TParallelCoordVar.cxx:278
 TParallelCoordVar.cxx:279
 TParallelCoordVar.cxx:280
 TParallelCoordVar.cxx:281
 TParallelCoordVar.cxx:282
 TParallelCoordVar.cxx:283
 TParallelCoordVar.cxx:284
 TParallelCoordVar.cxx:285
 TParallelCoordVar.cxx:286
 TParallelCoordVar.cxx:287
 TParallelCoordVar.cxx:288
 TParallelCoordVar.cxx:289
 TParallelCoordVar.cxx:290
 TParallelCoordVar.cxx:291
 TParallelCoordVar.cxx:292
 TParallelCoordVar.cxx:293
 TParallelCoordVar.cxx:294
 TParallelCoordVar.cxx:295
 TParallelCoordVar.cxx:296
 TParallelCoordVar.cxx:297
 TParallelCoordVar.cxx:298
 TParallelCoordVar.cxx:299
 TParallelCoordVar.cxx:300
 TParallelCoordVar.cxx:301
 TParallelCoordVar.cxx:302
 TParallelCoordVar.cxx:303
 TParallelCoordVar.cxx:304
 TParallelCoordVar.cxx:305
 TParallelCoordVar.cxx:306
 TParallelCoordVar.cxx:307
 TParallelCoordVar.cxx:308
 TParallelCoordVar.cxx:309
 TParallelCoordVar.cxx:310
 TParallelCoordVar.cxx:311
 TParallelCoordVar.cxx:312
 TParallelCoordVar.cxx:313
 TParallelCoordVar.cxx:314
 TParallelCoordVar.cxx:315
 TParallelCoordVar.cxx:316
 TParallelCoordVar.cxx:317
 TParallelCoordVar.cxx:318
 TParallelCoordVar.cxx:319
 TParallelCoordVar.cxx:320
 TParallelCoordVar.cxx:321
 TParallelCoordVar.cxx:322
 TParallelCoordVar.cxx:323
 TParallelCoordVar.cxx:324
 TParallelCoordVar.cxx:325
 TParallelCoordVar.cxx:326
 TParallelCoordVar.cxx:327
 TParallelCoordVar.cxx:328
 TParallelCoordVar.cxx:329
 TParallelCoordVar.cxx:330
 TParallelCoordVar.cxx:331
 TParallelCoordVar.cxx:332
 TParallelCoordVar.cxx:333
 TParallelCoordVar.cxx:334
 TParallelCoordVar.cxx:335
 TParallelCoordVar.cxx:336
 TParallelCoordVar.cxx:337
 TParallelCoordVar.cxx:338
 TParallelCoordVar.cxx:339
 TParallelCoordVar.cxx:340
 TParallelCoordVar.cxx:341
 TParallelCoordVar.cxx:342
 TParallelCoordVar.cxx:343
 TParallelCoordVar.cxx:344
 TParallelCoordVar.cxx:345
 TParallelCoordVar.cxx:346
 TParallelCoordVar.cxx:347
 TParallelCoordVar.cxx:348
 TParallelCoordVar.cxx:349
 TParallelCoordVar.cxx:350
 TParallelCoordVar.cxx:351
 TParallelCoordVar.cxx:352
 TParallelCoordVar.cxx:353
 TParallelCoordVar.cxx:354
 TParallelCoordVar.cxx:355
 TParallelCoordVar.cxx:356
 TParallelCoordVar.cxx:357
 TParallelCoordVar.cxx:358
 TParallelCoordVar.cxx:359
 TParallelCoordVar.cxx:360
 TParallelCoordVar.cxx:361
 TParallelCoordVar.cxx:362
 TParallelCoordVar.cxx:363
 TParallelCoordVar.cxx:364
 TParallelCoordVar.cxx:365
 TParallelCoordVar.cxx:366
 TParallelCoordVar.cxx:367
 TParallelCoordVar.cxx:368
 TParallelCoordVar.cxx:369
 TParallelCoordVar.cxx:370
 TParallelCoordVar.cxx:371
 TParallelCoordVar.cxx:372
 TParallelCoordVar.cxx:373
 TParallelCoordVar.cxx:374
 TParallelCoordVar.cxx:375
 TParallelCoordVar.cxx:376
 TParallelCoordVar.cxx:377
 TParallelCoordVar.cxx:378
 TParallelCoordVar.cxx:379
 TParallelCoordVar.cxx:380
 TParallelCoordVar.cxx:381
 TParallelCoordVar.cxx:382
 TParallelCoordVar.cxx:383
 TParallelCoordVar.cxx:384
 TParallelCoordVar.cxx:385
 TParallelCoordVar.cxx:386
 TParallelCoordVar.cxx:387
 TParallelCoordVar.cxx:388
 TParallelCoordVar.cxx:389
 TParallelCoordVar.cxx:390
 TParallelCoordVar.cxx:391
 TParallelCoordVar.cxx:392
 TParallelCoordVar.cxx:393
 TParallelCoordVar.cxx:394
 TParallelCoordVar.cxx:395
 TParallelCoordVar.cxx:396
 TParallelCoordVar.cxx:397
 TParallelCoordVar.cxx:398
 TParallelCoordVar.cxx:399
 TParallelCoordVar.cxx:400
 TParallelCoordVar.cxx:401
 TParallelCoordVar.cxx:402
 TParallelCoordVar.cxx:403
 TParallelCoordVar.cxx:404
 TParallelCoordVar.cxx:405
 TParallelCoordVar.cxx:406
 TParallelCoordVar.cxx:407
 TParallelCoordVar.cxx:408
 TParallelCoordVar.cxx:409
 TParallelCoordVar.cxx:410
 TParallelCoordVar.cxx:411
 TParallelCoordVar.cxx:412
 TParallelCoordVar.cxx:413
 TParallelCoordVar.cxx:414
 TParallelCoordVar.cxx:415
 TParallelCoordVar.cxx:416
 TParallelCoordVar.cxx:417
 TParallelCoordVar.cxx:418
 TParallelCoordVar.cxx:419
 TParallelCoordVar.cxx:420
 TParallelCoordVar.cxx:421
 TParallelCoordVar.cxx:422
 TParallelCoordVar.cxx:423
 TParallelCoordVar.cxx:424
 TParallelCoordVar.cxx:425
 TParallelCoordVar.cxx:426
 TParallelCoordVar.cxx:427
 TParallelCoordVar.cxx:428
 TParallelCoordVar.cxx:429
 TParallelCoordVar.cxx:430
 TParallelCoordVar.cxx:431
 TParallelCoordVar.cxx:432
 TParallelCoordVar.cxx:433
 TParallelCoordVar.cxx:434
 TParallelCoordVar.cxx:435
 TParallelCoordVar.cxx:436
 TParallelCoordVar.cxx:437
 TParallelCoordVar.cxx:438
 TParallelCoordVar.cxx:439
 TParallelCoordVar.cxx:440
 TParallelCoordVar.cxx:441
 TParallelCoordVar.cxx:442
 TParallelCoordVar.cxx:443
 TParallelCoordVar.cxx:444
 TParallelCoordVar.cxx:445
 TParallelCoordVar.cxx:446
 TParallelCoordVar.cxx:447
 TParallelCoordVar.cxx:448
 TParallelCoordVar.cxx:449
 TParallelCoordVar.cxx:450
 TParallelCoordVar.cxx:451
 TParallelCoordVar.cxx:452
 TParallelCoordVar.cxx:453
 TParallelCoordVar.cxx:454
 TParallelCoordVar.cxx:455
 TParallelCoordVar.cxx:456
 TParallelCoordVar.cxx:457
 TParallelCoordVar.cxx:458
 TParallelCoordVar.cxx:459
 TParallelCoordVar.cxx:460
 TParallelCoordVar.cxx:461
 TParallelCoordVar.cxx:462
 TParallelCoordVar.cxx:463
 TParallelCoordVar.cxx:464
 TParallelCoordVar.cxx:465
 TParallelCoordVar.cxx:466
 TParallelCoordVar.cxx:467
 TParallelCoordVar.cxx:468
 TParallelCoordVar.cxx:469
 TParallelCoordVar.cxx:470
 TParallelCoordVar.cxx:471
 TParallelCoordVar.cxx:472
 TParallelCoordVar.cxx:473
 TParallelCoordVar.cxx:474
 TParallelCoordVar.cxx:475
 TParallelCoordVar.cxx:476
 TParallelCoordVar.cxx:477
 TParallelCoordVar.cxx:478
 TParallelCoordVar.cxx:479
 TParallelCoordVar.cxx:480
 TParallelCoordVar.cxx:481
 TParallelCoordVar.cxx:482
 TParallelCoordVar.cxx:483
 TParallelCoordVar.cxx:484
 TParallelCoordVar.cxx:485
 TParallelCoordVar.cxx:486
 TParallelCoordVar.cxx:487
 TParallelCoordVar.cxx:488
 TParallelCoordVar.cxx:489
 TParallelCoordVar.cxx:490
 TParallelCoordVar.cxx:491
 TParallelCoordVar.cxx:492
 TParallelCoordVar.cxx:493
 TParallelCoordVar.cxx:494
 TParallelCoordVar.cxx:495
 TParallelCoordVar.cxx:496
 TParallelCoordVar.cxx:497
 TParallelCoordVar.cxx:498
 TParallelCoordVar.cxx:499
 TParallelCoordVar.cxx:500
 TParallelCoordVar.cxx:501
 TParallelCoordVar.cxx:502
 TParallelCoordVar.cxx:503
 TParallelCoordVar.cxx:504
 TParallelCoordVar.cxx:505
 TParallelCoordVar.cxx:506
 TParallelCoordVar.cxx:507
 TParallelCoordVar.cxx:508
 TParallelCoordVar.cxx:509
 TParallelCoordVar.cxx:510
 TParallelCoordVar.cxx:511
 TParallelCoordVar.cxx:512
 TParallelCoordVar.cxx:513
 TParallelCoordVar.cxx:514
 TParallelCoordVar.cxx:515
 TParallelCoordVar.cxx:516
 TParallelCoordVar.cxx:517
 TParallelCoordVar.cxx:518
 TParallelCoordVar.cxx:519
 TParallelCoordVar.cxx:520
 TParallelCoordVar.cxx:521
 TParallelCoordVar.cxx:522
 TParallelCoordVar.cxx:523
 TParallelCoordVar.cxx:524
 TParallelCoordVar.cxx:525
 TParallelCoordVar.cxx:526
 TParallelCoordVar.cxx:527
 TParallelCoordVar.cxx:528
 TParallelCoordVar.cxx:529
 TParallelCoordVar.cxx:530
 TParallelCoordVar.cxx:531
 TParallelCoordVar.cxx:532
 TParallelCoordVar.cxx:533
 TParallelCoordVar.cxx:534
 TParallelCoordVar.cxx:535
 TParallelCoordVar.cxx:536
 TParallelCoordVar.cxx:537
 TParallelCoordVar.cxx:538
 TParallelCoordVar.cxx:539
 TParallelCoordVar.cxx:540
 TParallelCoordVar.cxx:541
 TParallelCoordVar.cxx:542
 TParallelCoordVar.cxx:543
 TParallelCoordVar.cxx:544
 TParallelCoordVar.cxx:545
 TParallelCoordVar.cxx:546
 TParallelCoordVar.cxx:547
 TParallelCoordVar.cxx:548
 TParallelCoordVar.cxx:549
 TParallelCoordVar.cxx:550
 TParallelCoordVar.cxx:551
 TParallelCoordVar.cxx:552
 TParallelCoordVar.cxx:553
 TParallelCoordVar.cxx:554
 TParallelCoordVar.cxx:555
 TParallelCoordVar.cxx:556
 TParallelCoordVar.cxx:557
 TParallelCoordVar.cxx:558
 TParallelCoordVar.cxx:559
 TParallelCoordVar.cxx:560
 TParallelCoordVar.cxx:561
 TParallelCoordVar.cxx:562
 TParallelCoordVar.cxx:563
 TParallelCoordVar.cxx:564
 TParallelCoordVar.cxx:565
 TParallelCoordVar.cxx:566
 TParallelCoordVar.cxx:567
 TParallelCoordVar.cxx:568
 TParallelCoordVar.cxx:569
 TParallelCoordVar.cxx:570
 TParallelCoordVar.cxx:571
 TParallelCoordVar.cxx:572
 TParallelCoordVar.cxx:573
 TParallelCoordVar.cxx:574
 TParallelCoordVar.cxx:575
 TParallelCoordVar.cxx:576
 TParallelCoordVar.cxx:577
 TParallelCoordVar.cxx:578
 TParallelCoordVar.cxx:579
 TParallelCoordVar.cxx:580
 TParallelCoordVar.cxx:581
 TParallelCoordVar.cxx:582
 TParallelCoordVar.cxx:583
 TParallelCoordVar.cxx:584
 TParallelCoordVar.cxx:585
 TParallelCoordVar.cxx:586
 TParallelCoordVar.cxx:587
 TParallelCoordVar.cxx:588
 TParallelCoordVar.cxx:589
 TParallelCoordVar.cxx:590
 TParallelCoordVar.cxx:591
 TParallelCoordVar.cxx:592
 TParallelCoordVar.cxx:593
 TParallelCoordVar.cxx:594
 TParallelCoordVar.cxx:595
 TParallelCoordVar.cxx:596
 TParallelCoordVar.cxx:597
 TParallelCoordVar.cxx:598
 TParallelCoordVar.cxx:599
 TParallelCoordVar.cxx:600
 TParallelCoordVar.cxx:601
 TParallelCoordVar.cxx:602
 TParallelCoordVar.cxx:603
 TParallelCoordVar.cxx:604
 TParallelCoordVar.cxx:605
 TParallelCoordVar.cxx:606
 TParallelCoordVar.cxx:607
 TParallelCoordVar.cxx:608
 TParallelCoordVar.cxx:609
 TParallelCoordVar.cxx:610
 TParallelCoordVar.cxx:611
 TParallelCoordVar.cxx:612
 TParallelCoordVar.cxx:613
 TParallelCoordVar.cxx:614
 TParallelCoordVar.cxx:615
 TParallelCoordVar.cxx:616
 TParallelCoordVar.cxx:617
 TParallelCoordVar.cxx:618
 TParallelCoordVar.cxx:619
 TParallelCoordVar.cxx:620
 TParallelCoordVar.cxx:621
 TParallelCoordVar.cxx:622
 TParallelCoordVar.cxx:623
 TParallelCoordVar.cxx:624
 TParallelCoordVar.cxx:625
 TParallelCoordVar.cxx:626
 TParallelCoordVar.cxx:627
 TParallelCoordVar.cxx:628
 TParallelCoordVar.cxx:629
 TParallelCoordVar.cxx:630
 TParallelCoordVar.cxx:631
 TParallelCoordVar.cxx:632
 TParallelCoordVar.cxx:633
 TParallelCoordVar.cxx:634
 TParallelCoordVar.cxx:635
 TParallelCoordVar.cxx:636
 TParallelCoordVar.cxx:637
 TParallelCoordVar.cxx:638
 TParallelCoordVar.cxx:639
 TParallelCoordVar.cxx:640
 TParallelCoordVar.cxx:641
 TParallelCoordVar.cxx:642
 TParallelCoordVar.cxx:643
 TParallelCoordVar.cxx:644
 TParallelCoordVar.cxx:645
 TParallelCoordVar.cxx:646
 TParallelCoordVar.cxx:647
 TParallelCoordVar.cxx:648
 TParallelCoordVar.cxx:649
 TParallelCoordVar.cxx:650
 TParallelCoordVar.cxx:651
 TParallelCoordVar.cxx:652
 TParallelCoordVar.cxx:653
 TParallelCoordVar.cxx:654
 TParallelCoordVar.cxx:655
 TParallelCoordVar.cxx:656
 TParallelCoordVar.cxx:657
 TParallelCoordVar.cxx:658
 TParallelCoordVar.cxx:659
 TParallelCoordVar.cxx:660
 TParallelCoordVar.cxx:661
 TParallelCoordVar.cxx:662
 TParallelCoordVar.cxx:663
 TParallelCoordVar.cxx:664
 TParallelCoordVar.cxx:665
 TParallelCoordVar.cxx:666
 TParallelCoordVar.cxx:667
 TParallelCoordVar.cxx:668
 TParallelCoordVar.cxx:669
 TParallelCoordVar.cxx:670
 TParallelCoordVar.cxx:671
 TParallelCoordVar.cxx:672
 TParallelCoordVar.cxx:673
 TParallelCoordVar.cxx:674
 TParallelCoordVar.cxx:675
 TParallelCoordVar.cxx:676
 TParallelCoordVar.cxx:677
 TParallelCoordVar.cxx:678
 TParallelCoordVar.cxx:679
 TParallelCoordVar.cxx:680
 TParallelCoordVar.cxx:681
 TParallelCoordVar.cxx:682
 TParallelCoordVar.cxx:683
 TParallelCoordVar.cxx:684
 TParallelCoordVar.cxx:685
 TParallelCoordVar.cxx:686
 TParallelCoordVar.cxx:687
 TParallelCoordVar.cxx:688
 TParallelCoordVar.cxx:689
 TParallelCoordVar.cxx:690
 TParallelCoordVar.cxx:691
 TParallelCoordVar.cxx:692
 TParallelCoordVar.cxx:693
 TParallelCoordVar.cxx:694
 TParallelCoordVar.cxx:695
 TParallelCoordVar.cxx:696
 TParallelCoordVar.cxx:697
 TParallelCoordVar.cxx:698
 TParallelCoordVar.cxx:699
 TParallelCoordVar.cxx:700
 TParallelCoordVar.cxx:701
 TParallelCoordVar.cxx:702
 TParallelCoordVar.cxx:703
 TParallelCoordVar.cxx:704
 TParallelCoordVar.cxx:705
 TParallelCoordVar.cxx:706
 TParallelCoordVar.cxx:707
 TParallelCoordVar.cxx:708
 TParallelCoordVar.cxx:709
 TParallelCoordVar.cxx:710
 TParallelCoordVar.cxx:711
 TParallelCoordVar.cxx:712
 TParallelCoordVar.cxx:713
 TParallelCoordVar.cxx:714
 TParallelCoordVar.cxx:715
 TParallelCoordVar.cxx:716
 TParallelCoordVar.cxx:717
 TParallelCoordVar.cxx:718
 TParallelCoordVar.cxx:719
 TParallelCoordVar.cxx:720
 TParallelCoordVar.cxx:721
 TParallelCoordVar.cxx:722
 TParallelCoordVar.cxx:723
 TParallelCoordVar.cxx:724
 TParallelCoordVar.cxx:725
 TParallelCoordVar.cxx:726
 TParallelCoordVar.cxx:727
 TParallelCoordVar.cxx:728
 TParallelCoordVar.cxx:729
 TParallelCoordVar.cxx:730
 TParallelCoordVar.cxx:731
 TParallelCoordVar.cxx:732
 TParallelCoordVar.cxx:733
 TParallelCoordVar.cxx:734
 TParallelCoordVar.cxx:735
 TParallelCoordVar.cxx:736
 TParallelCoordVar.cxx:737
 TParallelCoordVar.cxx:738
 TParallelCoordVar.cxx:739
 TParallelCoordVar.cxx:740
 TParallelCoordVar.cxx:741
 TParallelCoordVar.cxx:742
 TParallelCoordVar.cxx:743
 TParallelCoordVar.cxx:744
 TParallelCoordVar.cxx:745
 TParallelCoordVar.cxx:746
 TParallelCoordVar.cxx:747
 TParallelCoordVar.cxx:748
 TParallelCoordVar.cxx:749
 TParallelCoordVar.cxx:750
 TParallelCoordVar.cxx:751
 TParallelCoordVar.cxx:752
 TParallelCoordVar.cxx:753
 TParallelCoordVar.cxx:754
 TParallelCoordVar.cxx:755
 TParallelCoordVar.cxx:756
 TParallelCoordVar.cxx:757
 TParallelCoordVar.cxx:758
 TParallelCoordVar.cxx:759
 TParallelCoordVar.cxx:760
 TParallelCoordVar.cxx:761
 TParallelCoordVar.cxx:762
 TParallelCoordVar.cxx:763
 TParallelCoordVar.cxx:764
 TParallelCoordVar.cxx:765
 TParallelCoordVar.cxx:766
 TParallelCoordVar.cxx:767
 TParallelCoordVar.cxx:768
 TParallelCoordVar.cxx:769
 TParallelCoordVar.cxx:770
 TParallelCoordVar.cxx:771
 TParallelCoordVar.cxx:772
 TParallelCoordVar.cxx:773
 TParallelCoordVar.cxx:774
 TParallelCoordVar.cxx:775
 TParallelCoordVar.cxx:776
 TParallelCoordVar.cxx:777
 TParallelCoordVar.cxx:778
 TParallelCoordVar.cxx:779
 TParallelCoordVar.cxx:780
 TParallelCoordVar.cxx:781
 TParallelCoordVar.cxx:782
 TParallelCoordVar.cxx:783
 TParallelCoordVar.cxx:784
 TParallelCoordVar.cxx:785
 TParallelCoordVar.cxx:786
 TParallelCoordVar.cxx:787
 TParallelCoordVar.cxx:788
 TParallelCoordVar.cxx:789
 TParallelCoordVar.cxx:790
 TParallelCoordVar.cxx:791
 TParallelCoordVar.cxx:792
 TParallelCoordVar.cxx:793
 TParallelCoordVar.cxx:794
 TParallelCoordVar.cxx:795
 TParallelCoordVar.cxx:796
 TParallelCoordVar.cxx:797
 TParallelCoordVar.cxx:798
 TParallelCoordVar.cxx:799
 TParallelCoordVar.cxx:800
 TParallelCoordVar.cxx:801
 TParallelCoordVar.cxx:802
 TParallelCoordVar.cxx:803
 TParallelCoordVar.cxx:804
 TParallelCoordVar.cxx:805
 TParallelCoordVar.cxx:806
 TParallelCoordVar.cxx:807
 TParallelCoordVar.cxx:808
 TParallelCoordVar.cxx:809
 TParallelCoordVar.cxx:810
 TParallelCoordVar.cxx:811
 TParallelCoordVar.cxx:812
 TParallelCoordVar.cxx:813
 TParallelCoordVar.cxx:814
 TParallelCoordVar.cxx:815
 TParallelCoordVar.cxx:816
 TParallelCoordVar.cxx:817
 TParallelCoordVar.cxx:818
 TParallelCoordVar.cxx:819
 TParallelCoordVar.cxx:820
 TParallelCoordVar.cxx:821
 TParallelCoordVar.cxx:822
 TParallelCoordVar.cxx:823
 TParallelCoordVar.cxx:824
 TParallelCoordVar.cxx:825
 TParallelCoordVar.cxx:826
 TParallelCoordVar.cxx:827
 TParallelCoordVar.cxx:828
 TParallelCoordVar.cxx:829
 TParallelCoordVar.cxx:830
 TParallelCoordVar.cxx:831
 TParallelCoordVar.cxx:832
 TParallelCoordVar.cxx:833
 TParallelCoordVar.cxx:834
 TParallelCoordVar.cxx:835
 TParallelCoordVar.cxx:836
 TParallelCoordVar.cxx:837
 TParallelCoordVar.cxx:838
 TParallelCoordVar.cxx:839
 TParallelCoordVar.cxx:840
 TParallelCoordVar.cxx:841
 TParallelCoordVar.cxx:842
 TParallelCoordVar.cxx:843
 TParallelCoordVar.cxx:844
 TParallelCoordVar.cxx:845
 TParallelCoordVar.cxx:846
 TParallelCoordVar.cxx:847
 TParallelCoordVar.cxx:848
 TParallelCoordVar.cxx:849
 TParallelCoordVar.cxx:850
 TParallelCoordVar.cxx:851
 TParallelCoordVar.cxx:852
 TParallelCoordVar.cxx:853
 TParallelCoordVar.cxx:854
 TParallelCoordVar.cxx:855
 TParallelCoordVar.cxx:856
 TParallelCoordVar.cxx:857
 TParallelCoordVar.cxx:858
 TParallelCoordVar.cxx:859
 TParallelCoordVar.cxx:860
 TParallelCoordVar.cxx:861
 TParallelCoordVar.cxx:862
 TParallelCoordVar.cxx:863
 TParallelCoordVar.cxx:864
 TParallelCoordVar.cxx:865
 TParallelCoordVar.cxx:866
 TParallelCoordVar.cxx:867
 TParallelCoordVar.cxx:868
 TParallelCoordVar.cxx:869
 TParallelCoordVar.cxx:870
 TParallelCoordVar.cxx:871
 TParallelCoordVar.cxx:872
 TParallelCoordVar.cxx:873
 TParallelCoordVar.cxx:874
 TParallelCoordVar.cxx:875
 TParallelCoordVar.cxx:876
 TParallelCoordVar.cxx:877
 TParallelCoordVar.cxx:878
 TParallelCoordVar.cxx:879
 TParallelCoordVar.cxx:880
 TParallelCoordVar.cxx:881
 TParallelCoordVar.cxx:882
 TParallelCoordVar.cxx:883
 TParallelCoordVar.cxx:884
 TParallelCoordVar.cxx:885
 TParallelCoordVar.cxx:886
 TParallelCoordVar.cxx:887
 TParallelCoordVar.cxx:888
 TParallelCoordVar.cxx:889
 TParallelCoordVar.cxx:890
 TParallelCoordVar.cxx:891
 TParallelCoordVar.cxx:892
 TParallelCoordVar.cxx:893
 TParallelCoordVar.cxx:894
 TParallelCoordVar.cxx:895
 TParallelCoordVar.cxx:896
 TParallelCoordVar.cxx:897
 TParallelCoordVar.cxx:898
 TParallelCoordVar.cxx:899
 TParallelCoordVar.cxx:900
 TParallelCoordVar.cxx:901
 TParallelCoordVar.cxx:902
 TParallelCoordVar.cxx:903
 TParallelCoordVar.cxx:904
 TParallelCoordVar.cxx:905
 TParallelCoordVar.cxx:906
 TParallelCoordVar.cxx:907
 TParallelCoordVar.cxx:908
 TParallelCoordVar.cxx:909
 TParallelCoordVar.cxx:910
 TParallelCoordVar.cxx:911
 TParallelCoordVar.cxx:912
 TParallelCoordVar.cxx:913
 TParallelCoordVar.cxx:914
 TParallelCoordVar.cxx:915
 TParallelCoordVar.cxx:916
 TParallelCoordVar.cxx:917
 TParallelCoordVar.cxx:918
 TParallelCoordVar.cxx:919
 TParallelCoordVar.cxx:920
 TParallelCoordVar.cxx:921
 TParallelCoordVar.cxx:922
 TParallelCoordVar.cxx:923
 TParallelCoordVar.cxx:924
 TParallelCoordVar.cxx:925
 TParallelCoordVar.cxx:926
 TParallelCoordVar.cxx:927
 TParallelCoordVar.cxx:928
 TParallelCoordVar.cxx:929
 TParallelCoordVar.cxx:930
 TParallelCoordVar.cxx:931
 TParallelCoordVar.cxx:932
 TParallelCoordVar.cxx:933
 TParallelCoordVar.cxx:934
 TParallelCoordVar.cxx:935
 TParallelCoordVar.cxx:936
 TParallelCoordVar.cxx:937
 TParallelCoordVar.cxx:938
 TParallelCoordVar.cxx:939
 TParallelCoordVar.cxx:940
 TParallelCoordVar.cxx:941
 TParallelCoordVar.cxx:942
 TParallelCoordVar.cxx:943
 TParallelCoordVar.cxx:944
 TParallelCoordVar.cxx:945
 TParallelCoordVar.cxx:946
 TParallelCoordVar.cxx:947
 TParallelCoordVar.cxx:948
 TParallelCoordVar.cxx:949
 TParallelCoordVar.cxx:950
 TParallelCoordVar.cxx:951
 TParallelCoordVar.cxx:952
 TParallelCoordVar.cxx:953
 TParallelCoordVar.cxx:954
 TParallelCoordVar.cxx:955
 TParallelCoordVar.cxx:956
 TParallelCoordVar.cxx:957
 TParallelCoordVar.cxx:958
 TParallelCoordVar.cxx:959
 TParallelCoordVar.cxx:960
 TParallelCoordVar.cxx:961
 TParallelCoordVar.cxx:962
 TParallelCoordVar.cxx:963
 TParallelCoordVar.cxx:964
 TParallelCoordVar.cxx:965
 TParallelCoordVar.cxx:966
 TParallelCoordVar.cxx:967
 TParallelCoordVar.cxx:968
 TParallelCoordVar.cxx:969
 TParallelCoordVar.cxx:970
 TParallelCoordVar.cxx:971
 TParallelCoordVar.cxx:972
 TParallelCoordVar.cxx:973
 TParallelCoordVar.cxx:974
 TParallelCoordVar.cxx:975
 TParallelCoordVar.cxx:976
 TParallelCoordVar.cxx:977
 TParallelCoordVar.cxx:978
 TParallelCoordVar.cxx:979
 TParallelCoordVar.cxx:980
 TParallelCoordVar.cxx:981
 TParallelCoordVar.cxx:982
 TParallelCoordVar.cxx:983
 TParallelCoordVar.cxx:984
 TParallelCoordVar.cxx:985
 TParallelCoordVar.cxx:986
 TParallelCoordVar.cxx:987
 TParallelCoordVar.cxx:988
 TParallelCoordVar.cxx:989
 TParallelCoordVar.cxx:990
 TParallelCoordVar.cxx:991
 TParallelCoordVar.cxx:992
 TParallelCoordVar.cxx:993
 TParallelCoordVar.cxx:994
 TParallelCoordVar.cxx:995
 TParallelCoordVar.cxx:996
 TParallelCoordVar.cxx:997
 TParallelCoordVar.cxx:998
 TParallelCoordVar.cxx:999
 TParallelCoordVar.cxx:1000
 TParallelCoordVar.cxx:1001
 TParallelCoordVar.cxx:1002
 TParallelCoordVar.cxx:1003
 TParallelCoordVar.cxx:1004
 TParallelCoordVar.cxx:1005
 TParallelCoordVar.cxx:1006
 TParallelCoordVar.cxx:1007
 TParallelCoordVar.cxx:1008
 TParallelCoordVar.cxx:1009
 TParallelCoordVar.cxx:1010
 TParallelCoordVar.cxx:1011
 TParallelCoordVar.cxx:1012
 TParallelCoordVar.cxx:1013
 TParallelCoordVar.cxx:1014
 TParallelCoordVar.cxx:1015
 TParallelCoordVar.cxx:1016
 TParallelCoordVar.cxx:1017
 TParallelCoordVar.cxx:1018
 TParallelCoordVar.cxx:1019
 TParallelCoordVar.cxx:1020
 TParallelCoordVar.cxx:1021
 TParallelCoordVar.cxx:1022
 TParallelCoordVar.cxx:1023
 TParallelCoordVar.cxx:1024
 TParallelCoordVar.cxx:1025
 TParallelCoordVar.cxx:1026
 TParallelCoordVar.cxx:1027
 TParallelCoordVar.cxx:1028
 TParallelCoordVar.cxx:1029
 TParallelCoordVar.cxx:1030
 TParallelCoordVar.cxx:1031
 TParallelCoordVar.cxx:1032
 TParallelCoordVar.cxx:1033
 TParallelCoordVar.cxx:1034
 TParallelCoordVar.cxx:1035
 TParallelCoordVar.cxx:1036
 TParallelCoordVar.cxx:1037
 TParallelCoordVar.cxx:1038
 TParallelCoordVar.cxx:1039
 TParallelCoordVar.cxx:1040
 TParallelCoordVar.cxx:1041
 TParallelCoordVar.cxx:1042
 TParallelCoordVar.cxx:1043
 TParallelCoordVar.cxx:1044
 TParallelCoordVar.cxx:1045
 TParallelCoordVar.cxx:1046
 TParallelCoordVar.cxx:1047
 TParallelCoordVar.cxx:1048
 TParallelCoordVar.cxx:1049
 TParallelCoordVar.cxx:1050
 TParallelCoordVar.cxx:1051
 TParallelCoordVar.cxx:1052
 TParallelCoordVar.cxx:1053
 TParallelCoordVar.cxx:1054
 TParallelCoordVar.cxx:1055