#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)
TParallelCoordVar::TParallelCoordVar()
:TNamed(), TAttLine(), TAttFill(kOrange+9,0)
{
Init();
}
TParallelCoordVar::~TParallelCoordVar()
{
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)
{
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)
{
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()
{
fParallel->RemoveVariable(this);
delete this;
}
Int_t TParallelCoordVar::DistancetoPrimitive(Int_t px, Int_t py)
{
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)
{
TIter next(fRanges);
TParallelCoordRange* range;
while ((range = (TParallelCoordRange*)next())) range->Draw();
AppendPad(option);
}
Bool_t TParallelCoordVar::Eval(Long64_t evtidx, TParallelCoordSelect *select)
{
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)
{
if (!gPad) return;
if (!gPad->IsEditable() && entry!=kMouseEnter) return;
static Int_t pxold, pyold;
static Int_t zoom;
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;
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)
{
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)
{
Int_t bin = 1 + (Int_t)((fVal[evtidx] - fMinCurrent)/((fMaxCurrent-fMinCurrent)/fNbins));
return (Int_t)fHistogram->GetBinContent(bin);
}
TH1F* TParallelCoordVar::GetHistogram()
{
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()
{
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
{
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()
{
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)
{
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)
{
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()
{
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* )
{
PaintHistogram();
if (TestBit(kShowBox)) PaintBoxPlot();
PaintLabels();
}
void TParallelCoordVar::PaintBoxPlot()
{
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);
}
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);
}
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);
}
if(fX1==fX2) box->PaintBox(fX1-boxSize,qua1,fX1+boxSize,qua3);
else box->PaintBox(qua1,fY1-boxSize,qua3,fY1+boxSize);
line->SetLineStyle(1);
if(fX1==fX2) line->PaintLine(fX1-boxSize,med,fX1+boxSize,med);
else line->PaintLine(med,fY1-boxSize,med,fY1+boxSize);
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()
{
Int_t i;
TFrame *frame = gPad->GetFrame();
if (!fHistogram) GetHistogram();
if (fHistoHeight!=0 && TestBit(kShowBarHisto)) {
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) {
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 {
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)) {
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){
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) {
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 {
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()
{
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* ) const
{
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)
{
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)
{
SetBit(kShowBox,box);
if (box) SetHistogramHeight(0.5);
else {
SetHistogramHeight(0);
SetHistogramLineWidth(2);
}
}
void TParallelCoordVar::SetHistogramBinning(Int_t n)
{
if (n < 0 || n == fNbins) return;
fNbins = n;
GetHistogram();
}
void TParallelCoordVar::SetHistogramHeight(Double_t h)
{
fHistoHeight = h;
if (!fParallel->TestBit(TParallelCoord::kCandleChart)){
if(h!=0) SetBit(kShowBarHisto,kTRUE);
else SetBit(kShowBarHisto,kFALSE);
}
}
void TParallelCoordVar::SetCurrentMin(Double_t min)
{
fMinCurrent = min;
}
void TParallelCoordVar::SetCurrentMax(Double_t max)
{
fMaxCurrent = max;
}
void TParallelCoordVar::SetCurrentLimits(Double_t min, Double_t max)
{
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)
{
TIter next(fRanges);
TParallelCoordRange* range;
while ((range = (TParallelCoordRange*)next())) range->SetBit(TParallelCoordRange::kLiveUpdate,on);
}
void TParallelCoordVar::SetLogScale(Bool_t log)
{
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)
{
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)
{
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)
{
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: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