ROOT logo
// @(#)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 "TParallelCoord.h"
#include "TParallelCoordVar.h"
#include "TParallelCoordRange.h"

#include "Riostream.h"
#include "TROOT.h"
#include "TVirtualX.h"
#include "TPad.h"
#include "TPolyLine.h"
#include "TGraph.h"
#include "TPaveText.h"
#include "float.h"
#include "TMath.h"
#include "TBox.h"
#include "TH1.h"
#include "TStyle.h"
#include "TEntryList.h"
#include "TFrame.h"
#include "TTree.h"
#include "TTreePlayer.h"
#include "TSelectorDraw.h"
#include "TTreeFormula.h"
#include "TView.h"
#include "TRandom.h"
#include "TEnv.h"
#include "TCanvas.h"
#include "TGaxis.h"
#include "TFile.h"

ClassImp(TParallelCoord)

//______________________________________________________________________________
/* Begin_Html
<center><h2>Parallel Coordinates class</h2></center>
<p>
The multidimensional system of Parallel coordinates is a common way of studying high-dimensional geometry and visualizing multivariate problems. It has first been proposed by A. Inselberg in 1981.
<p>
To show a set of points in an n-dimensional space, a backdrop is drawn consisting of n parallel lines. A point in n-dimensional space is represented as a polyline with vertices on the parallel axes; the position of the vertex on the i-th axis corresponds to the i-th coordinate of the point.
<p>
This tool comes with a rather large gui in the editor. It is necessary to use this editor in order to explore a data set, as explained below.
<h4>Reduce cluttering:</h4>
<p>
The main issue for parallel coordinates is the very high cluttering of the output when dealing with large data set. Two techniques have been implemented to bypass that so far:
<ul>
<li>Draw doted lines instead of plain lines with an adjustable dots spacing. A slider to adjust the dots spacing is available in the editor.</li>
<li>Sort the entries to display with  a "weight cut". On each axis is drawn a histogram describing the distribution of the data on the corresponding variable. The "weight" of an entry is the sum of the bin content of each bin the entry is going through. An entry going through the histograms peaks will have a big weight wether an entry going randomly through the histograms will have a rather small weight. Setting a cut on this weight allows to draw only the most representative entries. A slider set the cut is also available in the gui.</li>
</ul>
<center><h2>Selections:</h2></center>
<p>
Selections of specific entries can be defined over the data se using parallel coordinates. With that representation, a selection is an ensemble of ranges defined on the axes. Ranges defined on the same axis are conjugated with OR (an entry must be in one or the other ranges to be selected). Ranges on different axes are are conjugated with AND (an entry must be in all the ranges to be selected). Several selections can be defined with different colors. It is possible to generate an entry list from a given selection and apply it to the tree using the editor ("Apply to tree" button).
<center><h2>Axes:</h2></center>
<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.
<center><h2>Candle chart:</h2></center>
<p>
TParallelCoord can also be used to display a candle chart. In that mode, every variable is drawn in the same scale. The candle chart can be combined with the parallel coordinates mode, drawing the candle sticks over the axes.
End_Html
Begin_Macro(source)
{
   TCanvas *c1 = new TCanvas("c1");
   TFile *f = TFile::Open("$ROOTSYS/tutorials/tree/cernstaff.root");
   TTree *T = (TTree*)f->Get("T");
   T->Draw("Age:Grade:Step:Cost:Division:Nation","","para");
   TParallelCoord* para = (TParallelCoord*)gPad->GetListOfPrimitives()->FindObject("ParaCoord");
   TParallelCoordVar* grade = (TParallelCoordVar*)para->GetVarList()->FindObject("Grade");
   grade->AddRange(new TParallelCoordRange(grade,11.5,14));
   para->AddSelection("less30");
   para->GetCurrentSelection()->SetLineColor(kViolet);
   TParallelCoordVar* age = (TParallelCoordVar*)para->GetVarList()->FindObject("Age");
   age->AddRange(new TParallelCoordRange(age,21,30));
   return c1;
}
End_Macro
Begin_Html
<p> Some references:
<ul>
<li> Alfred Inselberg's Homepage <http://www.math.tau.ac.il/~aiisreal>, with Visual Tutorial, History, Selected Publications and Applications.</li>
<li> A small, easy introduction <http://catt.okstate.edu/jones98/parallel.html> by Christopher V. Jones. </li>
<li> Almir Olivette Artero, Maria Cristina Ferreira de Oliveira, Haim Levkowitz, "Uncovering Clusters in Crowded Parallel Coordinates Visualizations," <i>infovis</i>, pp. 81-88,  IEEE Symposium on Information Visualization (INFOVIS'04),  2004. </li>
</ul>
End_Html
*/


//______________________________________________________________________________
TParallelCoord::TParallelCoord()
   :TNamed()
{
   // Default constructor.

   Init();
}


//______________________________________________________________________________
TParallelCoord::TParallelCoord(Long64_t nentries)
{
   // Constructor without a reference to a tree,
   // the datas must be added afterwards with
   // TParallelCoord::AddVariable(Double_t*,const char*).

   Init();
   fNentries = nentries;
   fCurrentN = fNentries;
   fVarList = new TList();
   fSelectList = new TList();
   fCurrentSelection = new TParallelCoordSelect();
   fSelectList->Add(fCurrentSelection);
}


//______________________________________________________________________________
TParallelCoord::TParallelCoord(TTree* tree, Long64_t nentries)
   :TNamed("ParaCoord","ParaCoord")
{
   // Normal constructor, the datas must be added afterwards
   // with TParallelCoord::AddVariable(Double_t*,const char*).

   Init();
   Int_t estimate = tree->GetEstimate();
   if (nentries>estimate) {
      Warning("TParallelCoord","Call tree->SetEstimate(tree->GetEntries()) to display all the tree variables");
      fNentries = estimate;
   } else {
      fNentries = nentries;
   }
   fCurrentN = fNentries;
   fTree = tree;
   fTreeName = fTree->GetName();
   if (fTree->GetCurrentFile()) fTreeFileName = fTree->GetCurrentFile()->GetName();
   else fTreeFileName = "";
   fVarList = new TList();
   fSelectList = new TList();
   fCurrentSelection = new TParallelCoordSelect();
   fSelectList->Add(fCurrentSelection);
}


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

   if (fCurrentEntries) delete fCurrentEntries;
   if (fInitEntries != fCurrentEntries && fInitEntries != 0) delete fInitEntries;
   if (fVarList) {
      fVarList->Delete();
      delete fVarList;
   }
   if (fSelectList) {
      fSelectList->Delete();
      delete fSelectList;
   }
   if (fCandleAxis) delete fCandleAxis;
   SetDotsSpacing(0);
}


//______________________________________________________________________________
void TParallelCoord::AddVariable(Double_t* val, const char* title)
{
   // Add a variable.

   ++fNvar;
   fVarList->Add(new TParallelCoordVar(val,title,fVarList->GetSize(),this));
   SetAxesPosition();
}


//______________________________________________________________________________
void TParallelCoord::AddVariable(const char* varexp)
{
   // Add a variable from an expression.

   if(!fTree) return; // The tree from whichone one will get the data must be defined.

   // Select in the only the entries of this TParallelCoord.
   TEntryList *list = GetEntryList(kFALSE);
   fTree->SetEntryList(list);

   // ensure that there is only one variable given:

   TString exp = varexp;

   if (exp.Contains(':') || exp.Contains(">>") || exp.Contains("<<")) {
      Warning("AddVariable","Only a single variable can be added at a time.");
      return;
   }
   if (exp == ""){
      Warning("AddVariable","Nothing to add");
      return;
   }

   Long64_t en = fTree->Draw(varexp,"","goff");
   if (en<0) {
      Warning("AddVariable","%s could not be evaluated",varexp);
      return;
   }

   AddVariable(fTree->GetV1(),varexp);
   TParallelCoordVar* var = (TParallelCoordVar*)fVarList->Last();
   var->Draw();
}


//______________________________________________________________________________
void TParallelCoord::AddSelection(const char* title)
{
   // Add a selection.

   TParallelCoordSelect *sel = new TParallelCoordSelect(title);
   fSelectList->Add(sel);
   fCurrentSelection = sel;
}


//______________________________________________________________________________
void  TParallelCoord::ApplySelectionToTree()
{
   // Apply the current selection to the tree.

   if(!fTree) return;
   if(fSelectList) {
      if(fSelectList->GetSize() == 0) return;
      if(fCurrentSelection == 0) fCurrentSelection = (TParallelCoordSelect*)fSelectList->First();
   }
   fCurrentEntries = GetEntryList();
   fNentries = fCurrentEntries->GetN();
   fCurrentFirst = 0;
   fCurrentN = fNentries;
   fTree->SetEntryList(fCurrentEntries);
   TString varexp = "";
   TIter next(fVarList);
   TParallelCoordVar* var;
   while ((var = (TParallelCoordVar*)next())) varexp.Append(Form(":%s",var->GetTitle()));
   varexp.Remove(TString::kLeading,':');
   TSelectorDraw* selector = (TSelectorDraw*)((TTreePlayer*)fTree->GetPlayer())->GetSelector();
   fTree->Draw(varexp.Data(),"","goff para");
   next.Reset();
   Int_t i = 0;
   while ((var = (TParallelCoordVar*)next())) {
      var->SetValues(fNentries, selector->GetVal(i));
      ++i;
   }
   if (fSelectList) {           // FIXME It would be better to update the selections by deleting
      fSelectList->Delete();    // the meaningless ranges (selecting everything or nothing for example)
      fCurrentSelection = 0;    // after applying a new entrylist to the tree.
   }
   gPad->Modified();
   gPad->Update();
}


//______________________________________________________________________________
void  TParallelCoord::BuildParallelCoord(TSelectorDraw* selector, Bool_t candle)
{
   // Call constructor and add the variables.

   TParallelCoord* pc = new TParallelCoord(selector->GetTree(),selector->GetNfill());
   pc->SetBit(kCanDelete);
   selector->SetObject(pc);
   TString varexp = "";
   for(Int_t i=0;i<selector->GetDimension();++i) {
      if (selector->GetVal(i)) {
         pc->AddVariable(selector->GetVal(i),selector->GetVar(i)->GetTitle());
         if (selector->GetVar(i)) varexp.Append(Form(":%s",selector->GetVar(i)->GetTitle()));
      }
   }
   varexp.Remove(TString::kLeading,':');
   if (selector->GetSelect()) varexp.Append(Form("{%s}",selector->GetSelect()->GetTitle()));
   pc->SetTitle(varexp.Data());
   if (!candle) pc->Draw();
   else pc->Draw("candle");
}

//______________________________________________________________________________
void TParallelCoord::CleanUpSelections(TParallelCoordRange* range)
{
   // Clean up the selections from the ranges which could have been deleted
   // when a variable has been deleted.

   TIter next(fSelectList);
   TParallelCoordSelect* select;
   while ((select = (TParallelCoordSelect*)next())){
      if(select->Contains(range)) select->Remove(range);
   }
}


//______________________________________________________________________________
void TParallelCoord::DeleteSelection(TParallelCoordSelect * sel)
{
   // Delete a selection.

   fSelectList->Remove(sel);
   delete sel;
   if(fSelectList->GetSize() == 0) fCurrentSelection = 0;
   else fCurrentSelection = (TParallelCoordSelect*)fSelectList->At(0);
}


//______________________________________________________________________________
Int_t TParallelCoord::DistancetoPrimitive(Int_t px, Int_t py)
{
   // Compute the distance from the TParallelCoord.

   if(!gPad) return 9999;

   TFrame *frame = gPad->GetFrame();

   Double_t x1,x2,y1,y2,xx,yy;

   x1 = frame->GetX1()+0.01;
   x2 = frame->GetX2()-0.01;
   y2 = frame->GetY2()-0.01;
   y1 = frame->GetY1()+0.01;

   xx = gPad->AbsPixeltoX(px);
   yy = gPad->AbsPixeltoY(py);

   if(xx>x1 && xx<x2 && yy>y1 && yy<y2) return 0;
   else                                 return 9999;
}


//______________________________________________________________________________
void TParallelCoord::Draw(Option_t* option)
{
   // Draw the parallel coordinates graph.

   if (!GetTree()) return;
   if (!fCurrentEntries) fCurrentEntries = fInitEntries;
   Bool_t optcandle = kFALSE;
   TString opt = option;
   opt.ToLower();
   if(opt.Contains("candle")) {
      optcandle = kTRUE;
      opt.ReplaceAll("candle","");
   }
   if(optcandle) {
      SetBit(kPaintEntries,kFALSE);
      SetBit(kCandleChart,kTRUE);
      SetGlobalScale(kTRUE);
   }

   if (gPad) {
      if (!gPad->IsEditable()) gROOT->MakeDefCanvas();
   } else gROOT->MakeDefCanvas();
   TView *view = gPad->GetView();
   if(view){
      delete view;
      gPad->SetView(0);
   }
   gPad->Clear();
   if (!optcandle) {
      if (gPad && gPad->IsA() == TCanvas::Class()
         && !((TCanvas*)gPad)->GetShowEditor()) {
         ((TCanvas*)gPad)->ToggleEditor();
         ((TCanvas*)gPad)->ToggleEventStatus();
      }
   }

   gPad->SetBit(TGraph::kClipFrame,kTRUE);

   TFrame *frame = new TFrame(0.1,0.1,0.9,0.9);
   frame->SetBorderSize(0);
   frame->SetBorderMode(0);
   frame->SetFillStyle(0);
   frame->SetLineColor(gPad->GetFillColor());
   frame->Draw();
   AppendPad(option);
   TPaveText *title = new TPaveText(0.05,0.95,0.35,1);
   title->AddText(GetTitle());
   title->Draw();
   SetAxesPosition();
   TIter next(fVarList);
   TParallelCoordVar* var;
   while ((var = (TParallelCoordVar*)next())) {
      if(optcandle) {
         var->SetBoxPlot(kTRUE);
         var->SetHistogramHeight(0.5);
         var->SetHistogramLineWidth(0);
      }
      var->Draw();
   }

   if (optcandle) {
      if (TestBit(kVertDisplay)) fCandleAxis = new TGaxis(0.05,0.1,0.05,0.9,GetGlobalMin(),GetGlobalMax());
      else                       fCandleAxis = new TGaxis(0.1,0.05,0.9,0.05,GetGlobalMin(),GetGlobalMax());
      fCandleAxis->Draw();
   }

   if (gPad && gPad->IsA() == TCanvas::Class())
      ((TCanvas*)gPad)->Selected(gPad,this,1);
}


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

   gPad->SetCursor(kHand);
}


//______________________________________________________________________________
TParallelCoordSelect* TParallelCoord::GetCurrentSelection()
{
   // Return the selection currently being edited.

   if (!fSelectList) return 0;
   if (!fCurrentSelection) {
      fCurrentSelection = (TParallelCoordSelect*)fSelectList->First();
   }
   return fCurrentSelection;
}


//______________________________________________________________________________
TEntryList* TParallelCoord::GetEntryList(Bool_t sel)
{
   // Get the whole entry list or one for a selection.

   if(!sel || fCurrentSelection->GetSize() == 0){ // If no selection is specified, return the entry list of all the entries.
      return fInitEntries;
   } else { // return the entry list corresponding to the current selection.
      TEntryList *enlist = new TEntryList(fTree);
      TIter next(fVarList);
      for (Long64_t li=0;li<fNentries;++li) {
         next.Reset();
         Bool_t inrange=kTRUE;
         TParallelCoordVar* var;
         while((var = (TParallelCoordVar*)next())){
            if(!var->Eval(li,fCurrentSelection)) inrange = kFALSE;
         }
         if(!inrange) continue;
         enlist->Enter(fCurrentEntries->GetEntry(li));
      }
      return enlist;
   }
}


//______________________________________________________________________________
Double_t TParallelCoord::GetGlobalMax()
{
   // return the global maximum.

   Double_t gmax=-DBL_MAX;
   TIter next(fVarList);
   TParallelCoordVar* var;
   while ((var = (TParallelCoordVar*)next())) {
      if (gmax < var->GetCurrentMax()) gmax = var->GetCurrentMax();
   }
   return gmax;
}


//______________________________________________________________________________
Double_t TParallelCoord::GetGlobalMin()
{
   // return the global minimum.

   Double_t gmin=DBL_MAX;
   TIter next(fVarList);
   TParallelCoordVar* var;
   while ((var = (TParallelCoordVar*)next())) {
      if (gmin > var->GetCurrentMin()) gmin = var->GetCurrentMin();
   }
   return gmin;
}


//______________________________________________________________________________
Int_t TParallelCoord::GetNbins()
{
   // get the binning of the histograms.

   return ((TParallelCoordVar*)fVarList->First())->GetNbins();
}


//______________________________________________________________________________
TParallelCoordSelect* TParallelCoord::GetSelection(const char* title)
{
   // Get a selection from its title.

   TIter next(fSelectList);
   TParallelCoordSelect* sel;
   while ((sel = (TParallelCoordSelect*)next()) && strcmp(title,sel->GetTitle())) { }
   return sel;
}


//______________________________________________________________________________
TTree* TParallelCoord::GetTree()
{
   // return the tree if fTree is defined. If not, the method try to load the tree
   // from fTreeFileName.

   if (fTree) return fTree;
   if (fTreeFileName=="" || fTreeName=="") {
      Error("GetTree","Cannot load the tree: no tree defined!");
      return 0;
   }
   TFile *f = TFile::Open(fTreeFileName.Data());
   if (!f) {
      Error("GetTree","Tree file name : \"%s\" does not exsist (Are you in the correct directory?).",fTreeFileName.Data());
      return 0;
   } else if (f->IsZombie()) {
      Error("GetTree","while opening \"%s\".",fTreeFileName.Data());
      return 0;
   } else {
      fTree = (TTree*)f->Get(fTreeName.Data());
      if (!fTree) {
         Error("GetTree","\"%s\" not found in \"%s\".", fTreeName.Data(), fTreeFileName.Data());
         return 0;
      } else {
         fTree->SetEntryList(fCurrentEntries);
         TString varexp = "";
         TIter next(fVarList);
         TParallelCoordVar* var;
         while ((var = (TParallelCoordVar*)next())) varexp.Append(Form(":%s",var->GetTitle()));
         varexp.Remove(TString::kLeading,':');
         fTree->Draw(varexp.Data(),"","goff para");
         TSelectorDraw* selector = (TSelectorDraw*)((TTreePlayer*)fTree->GetPlayer())->GetSelector();
         next.Reset();
         Int_t i = 0;
         while ((var = (TParallelCoordVar*)next())) {
            var->SetValues(fNentries, selector->GetVal(i));
            ++i;
         }
         return fTree;
      }
   }
}


//______________________________________________________________________________
Double_t* TParallelCoord::GetVariable(const char* vartitle)
{
   // Get the variables values from its title.

   TIter next(fVarList);
   TParallelCoordVar* var = 0;
   while(((var = (TParallelCoordVar*)next()) != 0) && (var->GetTitle() != vartitle)) { }
   if(!var) return 0;
   else     return var->GetValues();
}


//______________________________________________________________________________
Double_t* TParallelCoord::GetVariable(Int_t i)
{
   // Get the variables values from its index.

   if(i<0 || (UInt_t)i>fNvar) return 0;
   else return ((TParallelCoordVar*)fVarList->At(i))->GetValues();
}


//______________________________________________________________________________
void TParallelCoord::Init()
{
   // Initialise the data members of TParallelCoord.

   fNentries = 0;
   fVarList = 0;
   fSelectList = 0;
   SetBit(kVertDisplay,kTRUE);
   SetBit(kCurveDisplay,kFALSE);
   SetBit(kPaintEntries,kTRUE);
   SetBit(kLiveUpdate,kFALSE);
   SetBit(kGlobalScale,kFALSE);
   SetBit(kCandleChart,kFALSE);
   SetBit(kGlobalLogScale,kFALSE);
   fTree = 0;
   fCurrentEntries = 0;
   fInitEntries = 0;
   fCurrentSelection = 0;
   fNvar = 0;
   fDotsSpacing = 0;
   fCurrentFirst = 0;
   fCurrentN = 0;
   fCandleAxis = 0;
   fWeightCut = 0;
   fLineWidth = 1;
   fLineColor = kGreen-8;
   fTreeName = "";
   fTreeFileName = "";
}

//______________________________________________________________________________
void TParallelCoord::Paint(Option_t* /*option*/)
{
   // Paint the parallel coordinates graph.

   if (!GetTree()) return;
   gPad->Range(0,0,1,1);
   TFrame *frame = gPad->GetFrame();
   frame->SetLineColor(gPad->GetFillColor());
   SetAxesPosition();
   if(TestBit(kPaintEntries)){
      PaintEntries(0);
      TIter next(fSelectList);
      TParallelCoordSelect* sel;
      while((sel = (TParallelCoordSelect*)next())) {
         if(sel->GetSize()>0 && sel->TestBit(TParallelCoordSelect::kActivated)) {
            PaintEntries(sel);
         }
      }
   }
   gPad->RangeAxis(0,0,1,1);
}


//______________________________________________________________________________
void TParallelCoord::PaintEntries(TParallelCoordSelect* sel)
{
   // Loop over the entries and paint them.

   if (fVarList->GetSize() < 2) return;
   Int_t i=0;
   Long64_t n=0;

   Double_t *x = new Double_t[fNvar];
   Double_t *y = new Double_t[fNvar];

   TGraph    *gr     = 0;
   TPolyLine *pl     = 0;
   TAttLine  *evline = 0;

   if (TestBit (kCurveDisplay)) {gr = new TGraph(fNvar); evline = (TAttLine*)gr;}
   else                       {pl = new TPolyLine(fNvar); evline = (TAttLine*)pl;}

   if (fDotsSpacing == 0) evline->SetLineStyle(1);
   else                   evline->SetLineStyle(11);
   if (!sel){
      evline->SetLineWidth(GetLineWidth());
      evline->SetLineColor(GetLineColor());
   } else {
      evline->SetLineWidth(sel->GetLineWidth());
      evline->SetLineColor(sel->GetLineColor());
   }
   TParallelCoordVar *var;

   TFrame *frame = gPad->GetFrame();
   Double_t lx   = ((frame->GetX2() - frame->GetX1())/(fNvar-1));
   Double_t ly   = ((frame->GetY2() - frame->GetY1())/(fNvar-1));
   Double_t a,b;
   TRandom r;

   for (n=fCurrentFirst; n<fCurrentFirst+fCurrentN; ++n) {
      TListIter next(fVarList);
      Bool_t inrange = kTRUE;
      // Loop to check whenever the entry must be painted.
      if (sel) {
         while ((var = (TParallelCoordVar*)next())){
            if (!var->Eval(n,sel)) inrange = kFALSE;
         }
      }
      if (fWeightCut > 0) {
         next.Reset();
         Int_t entryweight = 0;
         while ((var = (TParallelCoordVar*)next())) entryweight+=var->GetEntryWeight(n);
         if (entryweight/(Int_t)fNvar < fWeightCut) inrange = kFALSE;
      }
      if(!inrange) continue;
      i = 0;
      next.Reset();
      // Loop to set the polyline points.
      while ((var = (TParallelCoordVar*)next())) {
         var->GetEntryXY(n,x[i],y[i]);
         ++i;
      }
      // beginning to paint the first point at a random distance
      // to avoid artefacts when increasing the dots spacing.
      if (fDotsSpacing != 0) {
         if (TestBit(kVertDisplay)) {
            a    = (y[1]-y[0])/(x[1]-x[0]);
            b    = y[0]-a*x[0];
            x[0] = x[0]+lx*r.Rndm(n);
            y[0] = a*x[0]+b;
         } else {
            a    = (x[1]-x[0])/(y[1]-y[0]);
            b    = x[0]-a*y[0];
            y[0] = y[0]+ly*r.Rndm(n);
            x[0] = a*y[0]+b;
         }
      }
      if (pl) pl->PaintPolyLine(fNvar,x,y);
      else    gr->PaintGraph(fNvar,x,y,"C");
   }

   if (pl) delete pl;
   if (gr) delete gr;
   delete [] x;
   delete [] y;
}


//______________________________________________________________________________
void TParallelCoord::RemoveVariable(TParallelCoordVar *var)
{
   // Delete a variable from the graph.

   fVarList->Remove(var);
   fNvar = fVarList->GetSize();
   SetAxesPosition();
}


//______________________________________________________________________________
TParallelCoordVar* TParallelCoord::RemoveVariable(const char* vartitle)
{
   // Delete the variable "vartitle" from the graph.

   TIter next(fVarList);
   TParallelCoordVar* var=0;
   while((var = (TParallelCoordVar*)next())) {
      if (!strcmp(var->GetTitle(),vartitle)) break;
   }
   if(!var) Error("RemoveVariable","\"%s\" not a variable",vartitle);
   fVarList->Remove(var);
   fNvar = fVarList->GetSize();
   SetAxesPosition();
   var->DeleteVariable();
   return var;
}


//______________________________________________________________________________
void TParallelCoord::ResetTree()
{
   // Reset the tree entry list to the initial one..

   if(!fTree) return;
   fTree->SetEntryList(fInitEntries);
   fCurrentEntries = fInitEntries;
   fNentries = fCurrentEntries->GetN();
   fCurrentFirst = 0;
   fCurrentN = fNentries;
   TString varexp = "";
   TIter next(fVarList);
   TParallelCoordVar* var;
   while ((var = (TParallelCoordVar*)next())) varexp.Append(Form(":%s",var->GetTitle()));
   varexp.Remove(TString::kLeading,':');
   fTree->Draw(varexp.Data(),"","goff para");
   next.Reset();
   TSelectorDraw* selector = (TSelectorDraw*)((TTreePlayer*)fTree->GetPlayer())->GetSelector();
   Int_t i = 0;
   while ((var = (TParallelCoordVar*)next())) {
      var->SetValues(fNentries, selector->GetVal(i));
      ++i;
   }
   if (fSelectList) {           // FIXME It would be better to update the selections by deleting
      fSelectList->Delete();    // the meaningless ranges (selecting everything or nothing for example)
      fCurrentSelection = 0;    // after applying a new entrylist to the tree.
   }
   gPad->Modified();
   gPad->Update();
}


//______________________________________________________________________________
void TParallelCoord::SaveEntryLists(const char* filename, Bool_t overwrite)
{
   // Save the entry lists in a root file "filename.root".

   TString sfile = filename;
   if (sfile == "") sfile = Form("%s_parallelcoord_entries.root",fTree->GetName());

   TFile* f = TFile::Open(sfile.Data());
   if (f) {
      Warning("SaveEntryLists","%s already exists.", sfile.Data());
      if (!overwrite) return;
      else Warning("SaveEntryLists","Overwriting.");
      f = new TFile(sfile.Data(),"RECREATE");
   } else {
      f = new TFile(sfile.Data(),"CREATE");
   }
   gDirectory = f;
   fInitEntries->Write("initentries");
   fCurrentEntries->Write("currententries");
   Info("SaveEntryLists","File \"%s\" written.",sfile.Data());
}


//______________________________________________________________________________
void TParallelCoord::SavePrimitive(ostream & out, Option_t* options)
{
   // Save the TParallelCoord in a macro.

   TString opt = options;
   opt.ToLower();
   //Bool_t overwrite = opt.Contains("overwrite"); // Is there a way to specify "options" when saving ?
   // Save the entrylists.
   const char* filename = Form("%s_parallelcoord_entries.root",fTree->GetName());
   SaveEntryLists(filename,kTRUE); // FIXME overwriting by default.
   SaveTree(fTreeFileName,kTRUE);  // FIXME overwriting by default.
   out<<"   // Create a TParallelCoord."<<endl;
   out<<"   TFile *f = TFile::Open(\""<<fTreeFileName.Data()<<"\");"<<endl;
   out<<"   TTree* tree = (TTree*)f->Get(\""<<fTreeName.Data()<<"\");"<<endl;
   out<<"   TParallelCoord* para = new TParallelCoord(tree,"<<fNentries<<");"<<endl;
   out<<"   // Load the entrylists."<<endl;
   out<<"   TFile *entries = TFile::Open(\""<<filename<<"\");"<<endl;
   out<<"   TEntryList *currententries = (TEntryList*)entries->Get(\"currententries\");"<<endl;
   out<<"   tree->SetEntryList(currententries);"<<endl;
   out<<"   para->SetInitEntries((TEntryList*)entries->Get(\"initentries\"));"<<endl;
   out<<"   para->SetCurrentEntries(currententries);"<<endl;
   TIter next(fSelectList);
   TParallelCoordSelect* sel;
   out<<"   TParallelCoordSelect* sel;"<<endl;
   out<<"   para->GetSelectList()->Delete();"<<endl;
   while ((sel = (TParallelCoordSelect*)next())) {
      out<<"   para->AddSelection(\""<<sel->GetTitle()<<"\");"<<endl;
      out<<"   sel = (TParallelCoordSelect*)para->GetSelectList()->Last();"<<endl;
      out<<"   sel->SetLineColor("<<sel->GetLineColor()<<");"<<endl;
      out<<"   sel->SetLineWidth("<<sel->GetLineWidth()<<");"<<endl;
   }
   TIter nextbis(fVarList);
   TParallelCoordVar* var;
   TString varexp = "";
   while ((var = (TParallelCoordVar*)nextbis())) varexp.Append(Form(":%s",var->GetTitle()));
   varexp.Remove(TString::kLeading,':');
   out<<"   tree->Draw(\""<<varexp.Data()<<"\",\"\",\"goff para\");"<<endl;
   out<<"   TSelectorDraw* selector = (TSelectorDraw*)((TTreePlayer*)tree->GetPlayer())->GetSelector();"<<endl;
   nextbis.Reset();
   Int_t i=0;
   out<<"   TParallelCoordVar* var;"<<endl;
   while ((var = (TParallelCoordVar*)nextbis())) {
      out<<"   //***************************************"<<endl;
      out<<"   // Create the axis \""<<var->GetTitle()<<"\"."<<endl;
      out<<"   para->AddVariable(selector->GetVal("<<i<<"),\""<<var->GetTitle()<<"\");"<<endl;
      out<<"   var = (TParallelCoordVar*)para->GetVarList()->Last();"<<endl;
      var->SavePrimitive(out,"pcalled");
      ++i;
   }
   out<<"   //***************************************"<<endl;
   out<<"   // Set the TParallelCoord parameters."<<endl;
   out<<"   para->SetCurrentFirst("<<fCurrentFirst<<");"<<endl;
   out<<"   para->SetCurrentN("<<fCurrentN<<");"<<endl;
   out<<"   para->SetWeightCut("<<fWeightCut<<");"<<endl;
   out<<"   para->SetDotsSpacing("<<fDotsSpacing<<");"<<endl;
   out<<"   para->SetLineColor("<<GetLineColor()<<");"<<endl;
   out<<"   para->SetLineWidth("<<GetLineWidth()<<");"<<endl;
   out<<"   para->SetBit(TParallelCoord::kVertDisplay,"<<TestBit(kVertDisplay)<<");"<<endl;
   out<<"   para->SetBit(TParallelCoord::kCurveDisplay,"<<TestBit(kCurveDisplay)<<");"<<endl;
   out<<"   para->SetBit(TParallelCoord::kPaintEntries,"<<TestBit(kPaintEntries)<<");"<<endl;
   out<<"   para->SetBit(TParallelCoord::kLiveUpdate,"<<TestBit(kLiveUpdate)<<");"<<endl;
   out<<"   para->SetBit(TParallelCoord::kGlobalLogScale,"<<TestBit(kGlobalLogScale)<<");"<<endl;
   if (TestBit(kGlobalScale)) out<<"   para->SetGlobalScale(kTRUE);"<<endl;
   if (TestBit(kCandleChart)) out<<"   para->SetCandleChart(kTRUE);"<<endl;
   if (TestBit(kGlobalLogScale)) out<<"   para->SetGlobalLogScale(kTRUE);"<<endl;
   out<<endl<<"   para->Draw();"<<endl;
}


//______________________________________________________________________________
void TParallelCoord::SaveTree(const char* filename, Bool_t overwrite)
{
   // Save the tree in a file if fTreeFileName == "".

   if (!(fTreeFileName=="")) return;
   TString sfile = filename;
   if (sfile == "") sfile = Form("%s.root",fTree->GetName());

   TFile* f = TFile::Open(sfile.Data());
   if (f) {
      Warning("SaveTree","%s already exists.", sfile.Data());
      if (!overwrite) return;
      else Warning("SaveTree","Overwriting.");
      f = new TFile(sfile.Data(),"RECREATE");
   } else {
      f = new TFile(sfile.Data(),"CREATE");
   }
   gDirectory = f;
   fTree->Write(fTreeName.Data());
   fTreeFileName = sfile;
   Info("SaveTree","File \"%s\" written.",sfile.Data());
}


//______________________________________________________________________________
void TParallelCoord::SetAxesPosition()
{
   // Update the position of the axes.

   if(!gPad) return;
   Bool_t vert          = TestBit (kVertDisplay);
   TFrame *frame        = gPad->GetFrame();
   if (fVarList->GetSize() > 1) {
      if (vert) {
         frame->SetX1(1.0/((Double_t)fVarList->GetSize()+1));
         frame->SetX2(1-frame->GetX1());
         frame->SetY1(0.1);
         frame->SetY2(0.9);
         gPad->RangeAxis(1.0/((Double_t)fVarList->GetSize()+1),0.1,1-frame->GetX1(),0.9);
      } else {
         frame->SetX1(0.1);
         frame->SetX2(0.9);
         frame->SetY1(1.0/((Double_t)fVarList->GetSize()+1));
         frame->SetY2(1-frame->GetY1());
         gPad->RangeAxis(0.1,1.0/((Double_t)fVarList->GetSize()+1),0.9,1-frame->GetY1());
      }

      Double_t horSpace    = (frame->GetX2() - frame->GetX1())/(fNvar-1);
      Double_t verSpace   = (frame->GetY2() - frame->GetY1())/(fNvar-1);
      Int_t i=0;
      TIter next(fVarList);

      TParallelCoordVar* var;
      while((var = (TParallelCoordVar*)next())){
         if (vert) var->SetX(gPad->GetFrame()->GetX1() + i*horSpace,TestBit(kGlobalScale));
         else      var->SetY(gPad->GetFrame()->GetY1() + i*verSpace,TestBit(kGlobalScale));
         ++i;
      }
   } else if (fVarList->GetSize()==1) {
      frame->SetX1(0.1);
      frame->SetX2(0.9);
      frame->SetY1(0.1);
      frame->SetY2(0.9);
      if (vert) ((TParallelCoordVar*)fVarList->First())->SetX(0.5,TestBit(kGlobalScale));
      else      ((TParallelCoordVar*)fVarList->First())->SetY(0.5,TestBit(kGlobalScale));
   }
}


//______________________________________________________________________________
void TParallelCoord::SetAxisHistogramBinning(Int_t n)
{
   // Set the same histogram axis binning for all axis.

   TIter next(fVarList);
   TParallelCoordVar *var;
   while((var = (TParallelCoordVar*)next())) var->SetHistogramBinning(n);
}


//______________________________________________________________________________
void TParallelCoord::SetAxisHistogramHeight(Double_t h)
{
   // Set the same histogram axis height for all axis.

   TIter next(fVarList);
   TParallelCoordVar *var;
   while((var = (TParallelCoordVar*)next())) var->SetHistogramHeight(h);
}


//______________________________________________________________________________
void TParallelCoord::SetGlobalLogScale(Bool_t lt)
{
   // All axes in log scale.

   if (lt == TestBit(kGlobalLogScale)) return;
   SetBit(kGlobalLogScale,lt);
   TIter next(fVarList);
   TParallelCoordVar* var;
   while ((var = (TParallelCoordVar*)next())) var->SetLogScale(lt);
   if (TestBit(kGlobalScale)) SetGlobalScale(kTRUE);
}


//______________________________________________________________________________
void TParallelCoord::SetGlobalScale(Bool_t gl)
{
   // Constraint all axes to the same scale.

   SetBit(kGlobalScale,gl);
   if (fCandleAxis) {
      delete fCandleAxis;
      fCandleAxis = 0;
   }
   if (gl) {
      Double_t min,max;
      min = GetGlobalMin();
      max = GetGlobalMax();
      if (TestBit(kGlobalLogScale) && min<=0) min = 0.00001*max;
      if (TestBit(kVertDisplay)) {
         if (!TestBit(kGlobalLogScale)) fCandleAxis = new TGaxis(0.05,0.1,0.05,0.9,min,max);
         else                           fCandleAxis = new TGaxis(0.05,0.1,0.05,0.9,min,max,510,"G");
      } else {
         if (!TestBit(kGlobalLogScale)) fCandleAxis = new TGaxis(0.1,0.05,0.9,0.05,min,max);
         else                           fCandleAxis = new TGaxis(0.1,0.05,0.9,0.05,min,max,510,"G");
      }
      fCandleAxis->Draw();
      SetGlobalMin(min);
      SetGlobalMax(max);
      TIter next(fVarList);
      TParallelCoordVar* var;
      while ((var = (TParallelCoordVar*)next())) var->GetHistogram();
   }
   gPad->Modified();
   gPad->Update();
}


//______________________________________________________________________________
void TParallelCoord::SetAxisHistogramLineWidth(Int_t lw)
{
   // Set the same histogram axis line width for all axis.

   TIter next(fVarList);
   TParallelCoordVar *var;
   while((var = (TParallelCoordVar*)next())) var->SetHistogramLineWidth(lw);
}


//______________________________________________________________________________
void TParallelCoord::SetCandleChart(Bool_t can)
{
   // Set a candle chart display.

   SetBit(kCandleChart,can);
   SetGlobalScale(can);
   TIter next(fVarList);
   TParallelCoordVar* var;
   while ((var = (TParallelCoordVar*)next())) {
      var->SetBoxPlot(can);
      var->SetHistogramLineWidth(0);
   }
   if (fCandleAxis) delete fCandleAxis;
   fCandleAxis = 0;
   SetBit(kPaintEntries,!can);
   if (can) {
      if (TestBit(kVertDisplay)) fCandleAxis = new TGaxis(0.05,0.1,0.05,0.9,GetGlobalMin(),GetGlobalMax());
      else                       fCandleAxis = new TGaxis(0.1,0.05,0.9,0.05,GetGlobalMin(),GetGlobalMax());
      fCandleAxis->Draw();
   } else {
      if (fCandleAxis) {
         delete fCandleAxis;
         fCandleAxis = 0;
      }
   }
   gPad->Modified();
   gPad->Update();
}


//______________________________________________________________________________
void TParallelCoord::SetCurrentFirst(Long64_t f)
{
   // Set the first entry to be dispayed.

   if(f<0 || f>fNentries) return;
   fCurrentFirst = f;
   if(fCurrentFirst + fCurrentN > fNentries) fCurrentN = fNentries-fCurrentFirst;
   TIter next(fVarList);
   TParallelCoordVar* var;
   while ((var = (TParallelCoordVar*)next())) {
      var->GetMinMaxMean();
      var->GetHistogram();
      if (var->TestBit(TParallelCoordVar::kShowBox)) var->GetQuantiles();
   }
}


//______________________________________________________________________________
void TParallelCoord::SetCurrentN(Long64_t n)
{
   // Set the number of entry to be displayed.

   if(n<=0) return;
   if(fCurrentFirst+n>fNentries) fCurrentN = fNentries-fCurrentFirst;
   else fCurrentN = n;
   TIter next(fVarList);
   TParallelCoordVar* var;
   while ((var = (TParallelCoordVar*)next())) {
      var->GetMinMaxMean();
      var->GetHistogram();
      if (var->TestBit(TParallelCoordVar::kShowBox)) var->GetQuantiles();
   }
}


//______________________________________________________________________________
TParallelCoordSelect* TParallelCoord::SetCurrentSelection(const char* title)
{
   // Set the selection beeing edited.

   if (fCurrentSelection && fCurrentSelection->GetTitle() == title) return fCurrentSelection;
   TIter next(fSelectList);
   TParallelCoordSelect* sel;
   while((sel = (TParallelCoordSelect*)next()) && strcmp(sel->GetTitle(),title))
   if (sel) fCurrentSelection = sel;
   return sel;
}


//______________________________________________________________________________
void TParallelCoord::SetCurrentSelection(TParallelCoordSelect* sel)
{
   // Set the selection beeing edited.

   if (fCurrentSelection == sel) return;
   fCurrentSelection = sel;
}


//______________________________________________________________________________
void TParallelCoord::SetDotsSpacing(Int_t s)
{
   // Set dots spacing. Modify the line style 11.
   // If the canvas support transparency dot spacing is ignored.

   if (gPad->GetCanvas()->SupportAlpha()) return;
   if (s == fDotsSpacing) return;
   fDotsSpacing = s;
   gStyle->SetLineStyleString(11,Form("%d %d",4,s*8));
}


//______________________________________________________________________________
void TParallelCoord::SetEntryList(TParallelCoord* para, TEntryList* enlist)
{
   // Set the entry lists of "para".

   para->SetCurrentEntries(enlist);
   para->SetInitEntries(enlist);
}


//______________________________________________________________________________
void TParallelCoord::SetGlobalMax(Double_t max)
{
   // Force all variables to adopt the same max.

   TIter next(fVarList);
   TParallelCoordVar* var;
   while ((var = (TParallelCoordVar*)next())) {
      var->SetCurrentMax(max);
   }
}


//______________________________________________________________________________
void TParallelCoord::SetGlobalMin(Double_t min)
{
   // Force all variables to adopt the same min.

   TIter next(fVarList);
   TParallelCoordVar* var;
   while ((var = (TParallelCoordVar*)next())) {
      var->SetCurrentMin(min);
   }
}


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

   SetBit(kLiveUpdate,on);
   TIter next(fVarList);
   TParallelCoordVar* var;
   while((var = (TParallelCoordVar*)next())) var->SetLiveRangesUpdate(on);
}


//______________________________________________________________________________
void TParallelCoord::SetVertDisplay(Bool_t vert)
{
   // Set the vertical or horizontal display.

   if (vert == TestBit (kVertDisplay)) return;
   SetBit(kVertDisplay,vert);
   if (!gPad) return;
   TFrame* frame = gPad->GetFrame();
   if (!frame) return;
   UInt_t ui = 0;   
   Double_t horaxisspace = (frame->GetX2() - frame->GetX1())/(fNvar-1);
   Double_t veraxisspace = (frame->GetY2() - frame->GetY1())/(fNvar-1);
   TIter next(fVarList);
   TParallelCoordVar* var;
   while ((var = (TParallelCoordVar*)next())) {
      if (vert) var->SetX(frame->GetX1() + ui*horaxisspace,TestBit(kGlobalScale));
      else      var->SetY(frame->GetY1() + ui*veraxisspace,TestBit(kGlobalScale));
      ++ui;
   }
   if (TestBit(kCandleChart)) {
      if (fCandleAxis) delete fCandleAxis;
      if (TestBit(kVertDisplay)) fCandleAxis = new TGaxis(0.05,0.1,0.05,0.9,GetGlobalMin(),GetGlobalMax());
      else                       fCandleAxis = new TGaxis(0.1,0.05,0.9,0.05,GetGlobalMin(),GetGlobalMax());
      fCandleAxis->Draw();
   }
   gPad->Modified();
   gPad->Update();
}


//______________________________________________________________________________
void TParallelCoord::UnzoomAll()
{
   // Unzoom all variables.

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