41 ClassImp(TParallelCoord);
 
  134 TParallelCoord::TParallelCoord()
 
  145 TParallelCoord::TParallelCoord(Long64_t nentries)
 
  148    fNentries = nentries;
 
  149    fCurrentN = fNentries;
 
  150    fVarList = 
new TList();
 
  151    fSelectList = 
new TList();
 
  152    fCurrentSelection = 
new TParallelCoordSelect();
 
  153    fSelectList->Add(fCurrentSelection);
 
  160 TParallelCoord::TParallelCoord(TTree* tree, Long64_t nentries)
 
  161    :TNamed(
"ParaCoord",
"ParaCoord")
 
  164    Int_t estimate = tree->GetEstimate();
 
  165    if (nentries>estimate) {
 
  166       Warning(
"TParallelCoord",
"Call tree->SetEstimate(tree->GetEntries()) to display all the tree variables");
 
  167       fNentries = estimate;
 
  169       fNentries = nentries;
 
  171    fCurrentN = fNentries;
 
  173    fTreeName = fTree->GetName();
 
  174    if (fTree->GetCurrentFile()) fTreeFileName = fTree->GetCurrentFile()->GetName();
 
  175    else fTreeFileName = 
"";
 
  176    fVarList = 
new TList();
 
  177    fSelectList = 
new TList();
 
  178    fCurrentSelection = 
new TParallelCoordSelect();
 
  179    fSelectList->Add(fCurrentSelection);
 
  185 TParallelCoord::~TParallelCoord()
 
  187    if (fInitEntries != fCurrentEntries && fCurrentEntries != 0) 
delete fCurrentEntries;
 
  193       fSelectList->Delete();
 
  196    if (fCandleAxis) 
delete fCandleAxis;
 
  203 void TParallelCoord::AddVariable(Double_t* val, 
const char* title)
 
  206    fVarList->Add(
new TParallelCoordVar(val,title,fVarList->GetSize(),
this));
 
  213 void TParallelCoord::AddVariable(
const char* varexp)
 
  218    TEntryList *list = GetEntryList(kFALSE);
 
  219    fTree->SetEntryList(list);
 
  223    TString exp = varexp;
 
  225    if (exp.Contains(
':') || exp.Contains(
">>") || exp.Contains(
"<<")) {
 
  226       Warning(
"AddVariable",
"Only a single variable can be added at a time.");
 
  230       Warning(
"AddVariable",
"Nothing to add");
 
  234    Long64_t en = fTree->Draw(varexp,
"",
"goff");
 
  236       Warning(
"AddVariable",
"%s could not be evaluated",varexp);
 
  240    AddVariable(fTree->GetV1(),varexp);
 
  246 void TParallelCoord::AddSelection(
const char* title)
 
  248    TParallelCoordSelect *sel = 
new TParallelCoordSelect(title);
 
  249    fSelectList->Add(sel);
 
  250    fCurrentSelection = sel;
 
  256 void  TParallelCoord::ApplySelectionToTree()
 
  260       if(fSelectList->GetSize() == 0) 
return;
 
  261       if(fCurrentSelection == 0) fCurrentSelection = (TParallelCoordSelect*)fSelectList->First();
 
  263    fCurrentEntries = GetEntryList();
 
  264    fNentries = fCurrentEntries->GetN();
 
  266    fCurrentN = fNentries;
 
  267    fTree->SetEntryList(fCurrentEntries);
 
  269    TIter next(fVarList);
 
  270    TParallelCoordVar* var;
 
  271    while ((var = (TParallelCoordVar*)next())) varexp.Append(Form(
":%s",var->GetTitle()));
 
  272    varexp.Remove(TString::kLeading,
':');
 
  273    TSelectorDraw* selector = (TSelectorDraw*)((TTreePlayer*)fTree->GetPlayer())->GetSelector();
 
  274    fTree->Draw(varexp.Data(),
"",
"goff");
 
  277    while ((var = (TParallelCoordVar*)next())) {
 
  278       var->SetValues(fNentries, selector->GetVal(i));
 
  282       fSelectList->Delete();    
 
  283       fCurrentSelection = 0;    
 
  292 void  TParallelCoord::BuildParallelCoord(TSelectorDraw* selector, Bool_t candle)
 
  294    TParallelCoord* pc = 
new TParallelCoord(selector->GetTree(),selector->GetNfill());
 
  295    pc->SetBit(kCanDelete);
 
  296    selector->SetObject(pc);
 
  298    for(Int_t i=0;i<selector->GetDimension();++i) {
 
  299       if (selector->GetVal(i)) {
 
  300          if (selector->GetVar(i)) {
 
  301             pc->AddVariable(selector->GetVal(i),selector->GetVar(i)->GetTitle());
 
  302             varexp.Append(Form(
":%s",selector->GetVar(i)->GetTitle()));
 
  306    varexp.Remove(TString::kLeading,
':');
 
  307    if (selector->GetSelect()) varexp.Append(Form(
"{%s}",selector->GetSelect()->GetTitle()));
 
  308    pc->SetTitle(varexp.Data());
 
  309    if (!candle) pc->Draw();
 
  310    else pc->Draw(
"candle");
 
  317 void TParallelCoord::CleanUpSelections(TParallelCoordRange* range)
 
  319    TIter next(fSelectList);
 
  320    TParallelCoordSelect* select;
 
  321    while ((select = (TParallelCoordSelect*)next())){
 
  322       if(select->Contains(range)) select->Remove(range);
 
  329 void TParallelCoord::DeleteSelection(TParallelCoordSelect * sel)
 
  331    fSelectList->Remove(sel);
 
  333    if(fSelectList->GetSize() == 0) fCurrentSelection = 0;
 
  334    else fCurrentSelection = (TParallelCoordSelect*)fSelectList->At(0);
 
  340 Int_t TParallelCoord::DistancetoPrimitive(Int_t px, Int_t py)
 
  342    if(!gPad) 
return 9999;
 
  344    TFrame *frame = gPad->GetFrame();
 
  346    Double_t x1,x2,y1,y2,xx,yy;
 
  348    x1 = frame->GetX1()+0.01;
 
  349    x2 = frame->GetX2()-0.01;
 
  350    y2 = frame->GetY2()-0.01;
 
  351    y1 = frame->GetY1()+0.01;
 
  353    xx = gPad->AbsPixeltoX(px);
 
  354    yy = gPad->AbsPixeltoY(py);
 
  356    if(xx>x1 && xx<x2 && yy>y1 && yy<y2) 
return 0;
 
  363 void TParallelCoord::Draw(Option_t* option)
 
  365    if (!GetTree()) 
return;
 
  366    if (!fCurrentEntries) fCurrentEntries = fInitEntries;
 
  367    Bool_t optcandle = kFALSE;
 
  368    TString opt = option;
 
  370    if(opt.Contains(
"candle")) {
 
  372       opt.ReplaceAll(
"candle",
"");
 
  375       SetBit(kPaintEntries,kFALSE);
 
  376       SetBit(kCandleChart,kTRUE);
 
  377       SetGlobalScale(kTRUE);
 
  381       if (!gPad->IsEditable()) gROOT->MakeDefCanvas();
 
  382    } 
else gROOT->MakeDefCanvas();
 
  383    TView *view = gPad->GetView();
 
  390       if (gPad && gPad->IsA() == TCanvas::Class()
 
  391          && !((TCanvas*)gPad)->GetShowEditor()) {
 
  392          ((TCanvas*)gPad)->ToggleEditor();
 
  393          ((TCanvas*)gPad)->ToggleEventStatus();
 
  397    gPad->SetBit(TGraph::kClipFrame,kTRUE);
 
  399    TFrame *frame = 
new TFrame(0.1,0.1,0.9,0.9);
 
  400    frame->SetBorderSize(0);
 
  401    frame->SetBorderMode(0);
 
  402    frame->SetFillStyle(0);
 
  403    frame->SetLineColor(gPad->GetFillColor());
 
  406    TPaveText *title = 
new TPaveText(0.05,0.95,0.35,1);
 
  407    title->AddText(GetTitle());
 
  410    TIter next(fVarList);
 
  411    TParallelCoordVar* var;
 
  412    while ((var = (TParallelCoordVar*)next())) {
 
  414          var->SetBoxPlot(kTRUE);
 
  415          var->SetHistogramHeight(0.5);
 
  416          var->SetHistogramLineWidth(0);
 
  421       if (TestBit(kVertDisplay)) fCandleAxis = 
new TGaxis(0.05,0.1,0.05,0.9,GetGlobalMin(),GetGlobalMax());
 
  422       else                       fCandleAxis = 
new TGaxis(0.1,0.05,0.9,0.05,GetGlobalMin(),GetGlobalMax());
 
  426    if (gPad && gPad->IsA() == TCanvas::Class())
 
  427       ((TCanvas*)gPad)->Selected(gPad,
this,1);
 
  433 void TParallelCoord::ExecuteEvent(Int_t , Int_t , Int_t )
 
  436    gPad->SetCursor(kHand);
 
  442 TParallelCoordSelect* TParallelCoord::GetCurrentSelection()
 
  444    if (!fSelectList) 
return 0;
 
  445    if (!fCurrentSelection) {
 
  446       fCurrentSelection = (TParallelCoordSelect*)fSelectList->First();
 
  448    return fCurrentSelection;
 
  454 TEntryList* TParallelCoord::GetEntryList(Bool_t sel)
 
  456    if(!sel || fCurrentSelection->GetSize() == 0){ 
 
  459       TEntryList *enlist = 
new TEntryList(fTree);
 
  460       TIter next(fVarList);
 
  461       for (Long64_t li=0;li<fNentries;++li) {
 
  463          Bool_t inrange=kTRUE;
 
  464          TParallelCoordVar* var;
 
  465          while((var = (TParallelCoordVar*)next())){
 
  466             if(!var->Eval(li,fCurrentSelection)) inrange = kFALSE;
 
  468          if(!inrange) 
continue;
 
  469          enlist->Enter(fCurrentEntries->GetEntry(li));
 
  478 Double_t TParallelCoord::GetGlobalMax()
 
  480    Double_t gmax=-DBL_MAX;
 
  481    TIter next(fVarList);
 
  482    TParallelCoordVar* var;
 
  483    while ((var = (TParallelCoordVar*)next())) {
 
  484       if (gmax < var->GetCurrentMax()) gmax = var->GetCurrentMax();
 
  492 Double_t TParallelCoord::GetGlobalMin()
 
  494    Double_t gmin=DBL_MAX;
 
  495    TIter next(fVarList);
 
  496    TParallelCoordVar* var;
 
  497    while ((var = (TParallelCoordVar*)next())) {
 
  498       if (gmin > var->GetCurrentMin()) gmin = var->GetCurrentMin();
 
  506 Int_t TParallelCoord::GetNbins()
 
  508    return ((TParallelCoordVar*)fVarList->First())->GetNbins();
 
  514 TParallelCoordSelect* TParallelCoord::GetSelection(
const char* title)
 
  516    TIter next(fSelectList);
 
  517    TParallelCoordSelect* sel;
 
  518    while ((sel = (TParallelCoordSelect*)next()) && strcmp(title,sel->GetTitle())) { }
 
  526 TTree* TParallelCoord::GetTree()
 
  528    if (fTree) 
return fTree;
 
  529    if (fTreeFileName==
"" || fTreeName==
"") {
 
  530       Error(
"GetTree",
"Cannot load the tree: no tree defined!");
 
  533    TFile *f = TFile::Open(fTreeFileName.Data());
 
  535       Error(
"GetTree",
"Tree file name : \"%s\" does not exist (Are you in the correct directory?).",fTreeFileName.Data());
 
  537    } 
else if (f->IsZombie()) {
 
  538       Error(
"GetTree",
"while opening \"%s\".",fTreeFileName.Data());
 
  541       fTree = (TTree*)f->Get(fTreeName.Data());
 
  543          Error(
"GetTree",
"\"%s\" not found in \"%s\".", fTreeName.Data(), fTreeFileName.Data());
 
  546          fTree->SetEntryList(fCurrentEntries);
 
  548          TIter next(fVarList);
 
  549          TParallelCoordVar* var;
 
  550          while ((var = (TParallelCoordVar*)next())) varexp.Append(Form(
":%s",var->GetTitle()));
 
  551          varexp.Remove(TString::kLeading,
':');
 
  552          fTree->Draw(varexp.Data(),
"",
"goff");
 
  553          TSelectorDraw* selector = (TSelectorDraw*)((TTreePlayer*)fTree->GetPlayer())->GetSelector();
 
  556          while ((var = (TParallelCoordVar*)next())) {
 
  557             var->SetValues(fNentries, selector->GetVal(i));
 
  568 Double_t* TParallelCoord::GetVariable(
const char* vartitle)
 
  570    TIter next(fVarList);
 
  571    TParallelCoordVar* var = 0;
 
  572    while(((var = (TParallelCoordVar*)next()) != 0) && (var->GetTitle() != vartitle)) { }
 
  574    else     return var->GetValues();
 
  580 Double_t* TParallelCoord::GetVariable(Int_t i)
 
  582    if(i<0 || (UInt_t)i>fNvar) 
return 0;
 
  583    else return ((TParallelCoordVar*)fVarList->At(i))->GetValues();
 
  589 void TParallelCoord::Init()
 
  594    SetBit(kVertDisplay,kTRUE);
 
  595    SetBit(kCurveDisplay,kFALSE);
 
  596    SetBit(kPaintEntries,kTRUE);
 
  597    SetBit(kLiveUpdate,kFALSE);
 
  598    SetBit(kGlobalScale,kFALSE);
 
  599    SetBit(kCandleChart,kFALSE);
 
  600    SetBit(kGlobalLogScale,kFALSE);
 
  604    fCurrentSelection = 0;
 
  612    fLineColor = kGreen-8;
 
  620 void TParallelCoord::Paint(Option_t* )
 
  622    if (!GetTree()) 
return;
 
  623    gPad->Range(0,0,1,1);
 
  624    TFrame *frame = gPad->GetFrame();
 
  625    frame->SetLineColor(gPad->GetFillColor());
 
  627    if(TestBit(kPaintEntries)){
 
  629       TIter next(fSelectList);
 
  630       TParallelCoordSelect* sel;
 
  631       while((sel = (TParallelCoordSelect*)next())) {
 
  632          if(sel->GetSize()>0 && sel->TestBit(TParallelCoordSelect::kActivated)) {
 
  637    gPad->RangeAxis(0,0,1,1);
 
  639    TIter nextVar(fVarList);
 
  640    TParallelCoordVar* var=0;
 
  641    while((var = (TParallelCoordVar*)nextVar())) {
 
  649 void TParallelCoord::PaintEntries(TParallelCoordSelect* sel)
 
  651    if (fVarList->GetSize() < 2) 
return;
 
  655    Double_t *x = 
new Double_t[fNvar];
 
  656    Double_t *y = 
new Double_t[fNvar];
 
  660    TAttLine  *evline = 0;
 
  662    if (TestBit (kCurveDisplay)) {gr = 
new TGraph(fNvar); evline = (TAttLine*)gr;}
 
  663    else                       {pl = 
new TPolyLine(fNvar); evline = (TAttLine*)pl;}
 
  665    if (fDotsSpacing == 0) evline->SetLineStyle(1);
 
  666    else                   evline->SetLineStyle(11);
 
  668       evline->SetLineWidth(GetLineWidth());
 
  669       evline->SetLineColor(GetLineColor());
 
  671       evline->SetLineWidth(sel->GetLineWidth());
 
  672       evline->SetLineColor(sel->GetLineColor());
 
  674    TParallelCoordVar *var;
 
  676    TFrame *frame = gPad->GetFrame();
 
  677    Double_t lx   = ((frame->GetX2() - frame->GetX1())/(fNvar-1));
 
  678    Double_t ly   = ((frame->GetY2() - frame->GetY1())/(fNvar-1));
 
  682    for (n=fCurrentFirst; n<fCurrentFirst+fCurrentN; ++n) {
 
  683       TListIter next(fVarList);
 
  684       Bool_t inrange = kTRUE;
 
  687          while ((var = (TParallelCoordVar*)next())){
 
  688             if (!var->Eval(n,sel)) inrange = kFALSE;
 
  691       if (fWeightCut > 0) {
 
  693          Int_t entryweight = 0;
 
  694          while ((var = (TParallelCoordVar*)next())) entryweight+=var->GetEntryWeight(n);
 
  695          if (entryweight/(Int_t)fNvar < fWeightCut) inrange = kFALSE;
 
  697       if(!inrange) 
continue;
 
  701       while ((var = (TParallelCoordVar*)next())) {
 
  702          var->GetEntryXY(n,x[i],y[i]);
 
  707       if (fDotsSpacing != 0) {
 
  708          if (TestBit(kVertDisplay)) {
 
  709             a    = (y[1]-y[0])/(x[1]-x[0]);
 
  711             x[0] = x[0]+lx*r.Rndm();
 
  714             a    = (x[1]-x[0])/(y[1]-y[0]);
 
  716             y[0] = y[0]+ly*r.Rndm();
 
  720       if (pl) pl->PaintPolyLine(fNvar,x,y);
 
  721       else    gr->PaintGraph(fNvar,x,y,
"C");
 
  733 void TParallelCoord::RemoveVariable(TParallelCoordVar *var)
 
  735    fVarList->Remove(var);
 
  736    fNvar = fVarList->GetSize();
 
  743 Bool_t TParallelCoord::RemoveVariable(
const char* vartitle)
 
  745    TIter next(fVarList);
 
  746    TParallelCoordVar* var=0;
 
  747    while((var = (TParallelCoordVar*)next())) {
 
  748       if (!strcmp(var->GetTitle(),vartitle)) 
break;
 
  751       Error(
"RemoveVariable",
"\"%s\" not a variable",vartitle);
 
  763 void TParallelCoord::ResetTree()
 
  766    fTree->SetEntryList(fInitEntries);
 
  767    fCurrentEntries = fInitEntries;
 
  768    fNentries = fCurrentEntries->GetN();
 
  770    fCurrentN = fNentries;
 
  772    TIter next(fVarList);
 
  773    TParallelCoordVar* var;
 
  774    while ((var = (TParallelCoordVar*)next())) varexp.Append(Form(
":%s",var->GetTitle()));
 
  775    varexp.Remove(TString::kLeading,
':');
 
  776    fTree->Draw(varexp.Data(),
"",
"goff");
 
  778    TSelectorDraw* selector = (TSelectorDraw*)((TTreePlayer*)fTree->GetPlayer())->GetSelector();
 
  780    while ((var = (TParallelCoordVar*)next())) {
 
  781       var->SetValues(fNentries, selector->GetVal(i));
 
  785       fSelectList->Delete();    
 
  786       fCurrentSelection = 0;    
 
  795 void TParallelCoord::SaveEntryLists(
const char* filename, Bool_t overwrite)
 
  797    TString sfile = filename;
 
  798    if (sfile == 
"") sfile = Form(
"%s_parallelcoord_entries.root",fTree->GetName());
 
  800    TFile* f = TFile::Open(sfile.Data());
 
  802       Warning(
"SaveEntryLists",
"%s already exists.", sfile.Data());
 
  803       if (!overwrite) 
return;
 
  804       else Warning(
"SaveEntryLists",
"Overwriting.");
 
  805       f = 
new TFile(sfile.Data(),
"RECREATE");
 
  807       f = 
new TFile(sfile.Data(),
"CREATE");
 
  810    fInitEntries->Write(
"initentries");
 
  811    fCurrentEntries->Write(
"currententries");
 
  812    Info(
"SaveEntryLists",
"File \"%s\" written.",sfile.Data());
 
  818 void TParallelCoord::SavePrimitive(std::ostream & out, Option_t* options)
 
  820    TString opt = options;
 
  824    const char* filename = Form(
"%s_parallelcoord_entries.root",fTree->GetName());
 
  825    SaveEntryLists(filename,kTRUE); 
 
  826    SaveTree(fTreeFileName,kTRUE);  
 
  827    out<<
"   // Create a TParallelCoord."<<std::endl;
 
  828    out<<
"   TFile *f = TFile::Open(\""<<fTreeFileName.Data()<<
"\");"<<std::endl;
 
  829    out<<
"   TTree* tree = (TTree*)f->Get(\""<<fTreeName.Data()<<
"\");"<<std::endl;
 
  830    out<<
"   TParallelCoord* para = new TParallelCoord(tree,"<<fNentries<<
");"<<std::endl;
 
  831    out<<
"   // Load the entrylists."<<std::endl;
 
  832    out<<
"   TFile *entries = TFile::Open(\""<<filename<<
"\");"<<std::endl;
 
  833    out<<
"   TEntryList *currententries = (TEntryList*)entries->Get(\"currententries\");"<<std::endl;
 
  834    out<<
"   tree->SetEntryList(currententries);"<<std::endl;
 
  835    out<<
"   para->SetInitEntries((TEntryList*)entries->Get(\"initentries\"));"<<std::endl;
 
  836    out<<
"   para->SetCurrentEntries(currententries);"<<std::endl;
 
  837    TIter next(fSelectList);
 
  838    TParallelCoordSelect* sel;
 
  839    out<<
"   TParallelCoordSelect* sel;"<<std::endl;
 
  840    out<<
"   para->GetSelectList()->Delete();"<<std::endl;
 
  841    while ((sel = (TParallelCoordSelect*)next())) {
 
  842       out<<
"   para->AddSelection(\""<<sel->GetTitle()<<
"\");"<<std::endl;
 
  843       out<<
"   sel = (TParallelCoordSelect*)para->GetSelectList()->Last();"<<std::endl;
 
  844       out<<
"   sel->SetLineColor("<<sel->GetLineColor()<<
");"<<std::endl;
 
  845       out<<
"   sel->SetLineWidth("<<sel->GetLineWidth()<<
");"<<std::endl;
 
  847    TIter nextbis(fVarList);
 
  848    TParallelCoordVar* var;
 
  850    while ((var = (TParallelCoordVar*)nextbis())) varexp.Append(Form(
":%s",var->GetTitle()));
 
  851    varexp.Remove(TString::kLeading,
':');
 
  852    out<<
"   tree->Draw(\""<<varexp.Data()<<
"\",\"\",\"goff\");"<<std::endl;
 
  853    out<<
"   TSelectorDraw* selector = (TSelectorDraw*)((TTreePlayer*)tree->GetPlayer())->GetSelector();"<<std::endl;
 
  856    out<<
"   TParallelCoordVar* var;"<<std::endl;
 
  857    while ((var = (TParallelCoordVar*)nextbis())) {
 
  858       out<<
"   //***************************************"<<std::endl;
 
  859       out<<
"   // Create the axis \""<<var->GetTitle()<<
"\"."<<std::endl;
 
  860       out<<
"   para->AddVariable(selector->GetVal("<<i<<
"),\""<<var->GetTitle()<<
"\");"<<std::endl;
 
  861       out<<
"   var = (TParallelCoordVar*)para->GetVarList()->Last();"<<std::endl;
 
  862       var->SavePrimitive(out,
"pcalled");
 
  865    out<<
"   //***************************************"<<std::endl;
 
  866    out<<
"   // Set the TParallelCoord parameters."<<std::endl;
 
  867    out<<
"   para->SetCurrentFirst("<<fCurrentFirst<<
");"<<std::endl;
 
  868    out<<
"   para->SetCurrentN("<<fCurrentN<<
");"<<std::endl;
 
  869    out<<
"   para->SetWeightCut("<<fWeightCut<<
");"<<std::endl;
 
  870    out<<
"   para->SetDotsSpacing("<<fDotsSpacing<<
");"<<std::endl;
 
  871    out<<
"   para->SetLineColor("<<GetLineColor()<<
");"<<std::endl;
 
  872    out<<
"   para->SetLineWidth("<<GetLineWidth()<<
");"<<std::endl;
 
  873    out<<
"   para->SetBit(TParallelCoord::kVertDisplay,"<<TestBit(kVertDisplay)<<
");"<<std::endl;
 
  874    out<<
"   para->SetBit(TParallelCoord::kCurveDisplay,"<<TestBit(kCurveDisplay)<<
");"<<std::endl;
 
  875    out<<
"   para->SetBit(TParallelCoord::kPaintEntries,"<<TestBit(kPaintEntries)<<
");"<<std::endl;
 
  876    out<<
"   para->SetBit(TParallelCoord::kLiveUpdate,"<<TestBit(kLiveUpdate)<<
");"<<std::endl;
 
  877    out<<
"   para->SetBit(TParallelCoord::kGlobalLogScale,"<<TestBit(kGlobalLogScale)<<
");"<<std::endl;
 
  878    if (TestBit(kGlobalScale)) out<<
"   para->SetGlobalScale(kTRUE);"<<std::endl;
 
  879    if (TestBit(kCandleChart)) out<<
"   para->SetCandleChart(kTRUE);"<<std::endl;
 
  880    if (TestBit(kGlobalLogScale)) out<<
"   para->SetGlobalLogScale(kTRUE);"<<std::endl;
 
  881    out<<std::endl<<
"   para->Draw();"<<std::endl;
 
  887 void TParallelCoord::SaveTree(
const char* filename, Bool_t overwrite)
 
  889    if (!(fTreeFileName==
"")) 
return;
 
  890    TString sfile = filename;
 
  891    if (sfile == 
"") sfile = Form(
"%s.root",fTree->GetName());
 
  893    TFile* f = TFile::Open(sfile.Data());
 
  895       Warning(
"SaveTree",
"%s already exists.", sfile.Data());
 
  896       if (!overwrite) 
return;
 
  897       else Warning(
"SaveTree",
"Overwriting.");
 
  898       f = 
new TFile(sfile.Data(),
"RECREATE");
 
  900       f = 
new TFile(sfile.Data(),
"CREATE");
 
  903    fTree->Write(fTreeName.Data());
 
  904    fTreeFileName = sfile;
 
  905    Info(
"SaveTree",
"File \"%s\" written.",sfile.Data());
 
  911 void TParallelCoord::SetAxesPosition()
 
  914    Bool_t vert          = TestBit (kVertDisplay);
 
  915    TFrame *frame        = gPad->GetFrame();
 
  916    if (fVarList->GetSize() > 1) {
 
  918          frame->SetX1(1.0/((Double_t)fVarList->GetSize()+1));
 
  919          frame->SetX2(1-frame->GetX1());
 
  922          gPad->RangeAxis(1.0/((Double_t)fVarList->GetSize()+1),0.1,1-frame->GetX1(),0.9);
 
  926          frame->SetY1(1.0/((Double_t)fVarList->GetSize()+1));
 
  927          frame->SetY2(1-frame->GetY1());
 
  928          gPad->RangeAxis(0.1,1.0/((Double_t)fVarList->GetSize()+1),0.9,1-frame->GetY1());
 
  931       Double_t horSpace    = (frame->GetX2() - frame->GetX1())/(fNvar-1);
 
  932       Double_t verSpace   = (frame->GetY2() - frame->GetY1())/(fNvar-1);
 
  934       TIter next(fVarList);
 
  936       TParallelCoordVar* var;
 
  937       while((var = (TParallelCoordVar*)next())){
 
  938          if (vert) var->SetX(gPad->GetFrame()->GetX1() + i*horSpace,TestBit(kGlobalScale));
 
  939          else      var->SetY(gPad->GetFrame()->GetY1() + i*verSpace,TestBit(kGlobalScale));
 
  942    } 
else if (fVarList->GetSize()==1) {
 
  947       if (vert) ((TParallelCoordVar*)fVarList->First())->SetX(0.5,TestBit(kGlobalScale));
 
  948       else      ((TParallelCoordVar*)fVarList->First())->SetY(0.5,TestBit(kGlobalScale));
 
  955 void TParallelCoord::SetAxisHistogramBinning(Int_t n)
 
  957    TIter next(fVarList);
 
  958    TParallelCoordVar *var;
 
  959    while((var = (TParallelCoordVar*)next())) var->SetHistogramBinning(n);
 
  965 void TParallelCoord::SetAxisHistogramHeight(Double_t h)
 
  967    TIter next(fVarList);
 
  968    TParallelCoordVar *var;
 
  969    while((var = (TParallelCoordVar*)next())) var->SetHistogramHeight(h);
 
  975 void TParallelCoord::SetGlobalLogScale(Bool_t lt)
 
  977    if (lt == TestBit(kGlobalLogScale)) 
return;
 
  978    SetBit(kGlobalLogScale,lt);
 
  979    TIter next(fVarList);
 
  980    TParallelCoordVar* var;
 
  981    while ((var = (TParallelCoordVar*)next())) var->SetLogScale(lt);
 
  982    if (TestBit(kGlobalScale)) SetGlobalScale(kTRUE);
 
  988 void TParallelCoord::SetGlobalScale(Bool_t gl)
 
  990    SetBit(kGlobalScale,gl);
 
  997       min = GetGlobalMin();
 
  998       max = GetGlobalMax();
 
  999       if (TestBit(kGlobalLogScale) && min<=0) min = 0.00001*max;
 
 1000       if (TestBit(kVertDisplay)) {
 
 1001          if (!TestBit(kGlobalLogScale)) fCandleAxis = 
new TGaxis(0.05,0.1,0.05,0.9,min,max);
 
 1002          else                           fCandleAxis = 
new TGaxis(0.05,0.1,0.05,0.9,min,max,510,
"G");
 
 1004          if (!TestBit(kGlobalLogScale)) fCandleAxis = 
new TGaxis(0.1,0.05,0.9,0.05,min,max);
 
 1005          else                           fCandleAxis = 
new TGaxis(0.1,0.05,0.9,0.05,min,max,510,
"G");
 
 1007       fCandleAxis->Draw();
 
 1010       TIter next(fVarList);
 
 1011       TParallelCoordVar* var;
 
 1012       while ((var = (TParallelCoordVar*)next())) var->GetHistogram();
 
 1021 void TParallelCoord::SetAxisHistogramLineWidth(Int_t lw)
 
 1023    TIter next(fVarList);
 
 1024    TParallelCoordVar *var;
 
 1025    while((var = (TParallelCoordVar*)next())) var->SetHistogramLineWidth(lw);
 
 1031 void TParallelCoord::SetCandleChart(Bool_t can)
 
 1033    SetBit(kCandleChart,can);
 
 1034    SetGlobalScale(can);
 
 1035    TIter next(fVarList);
 
 1036    TParallelCoordVar* var;
 
 1037    while ((var = (TParallelCoordVar*)next())) {
 
 1038       var->SetBoxPlot(can);
 
 1039       var->SetHistogramLineWidth(0);
 
 1041    if (fCandleAxis) 
delete fCandleAxis;
 
 1043    SetBit(kPaintEntries,!can);
 
 1045       if (TestBit(kVertDisplay)) fCandleAxis = 
new TGaxis(0.05,0.1,0.05,0.9,GetGlobalMin(),GetGlobalMax());
 
 1046       else                       fCandleAxis = 
new TGaxis(0.1,0.05,0.9,0.05,GetGlobalMin(),GetGlobalMax());
 
 1047       fCandleAxis->Draw();
 
 1061 void TParallelCoord::SetCurrentFirst(Long64_t f)
 
 1063    if(f<0 || f>fNentries) 
return;
 
 1065    if(fCurrentFirst + fCurrentN > fNentries) fCurrentN = fNentries-fCurrentFirst;
 
 1066    TIter next(fVarList);
 
 1067    TParallelCoordVar* var;
 
 1068    while ((var = (TParallelCoordVar*)next())) {
 
 1069       var->GetMinMaxMean();
 
 1070       var->GetHistogram();
 
 1071       if (var->TestBit(TParallelCoordVar::kShowBox)) var->GetQuantiles();
 
 1078 void TParallelCoord::SetCurrentN(Long64_t n)
 
 1081    if(fCurrentFirst+n>fNentries) fCurrentN = fNentries-fCurrentFirst;
 
 1083    TIter next(fVarList);
 
 1084    TParallelCoordVar* var;
 
 1085    while ((var = (TParallelCoordVar*)next())) {
 
 1086       var->GetMinMaxMean();
 
 1087       var->GetHistogram();
 
 1088       if (var->TestBit(TParallelCoordVar::kShowBox)) var->GetQuantiles();
 
 1095 TParallelCoordSelect* TParallelCoord::SetCurrentSelection(
const char* title)
 
 1097    if (fCurrentSelection && fCurrentSelection->GetTitle() == title) 
return fCurrentSelection;
 
 1098    TIter next(fSelectList);
 
 1099    TParallelCoordSelect* sel;
 
 1100    while((sel = (TParallelCoordSelect*)next()) && strcmp(sel->GetTitle(),title))
 
 1101    if (sel) fCurrentSelection = sel;
 
 1108 void TParallelCoord::SetCurrentSelection(TParallelCoordSelect* sel)
 
 1110    if (fCurrentSelection == sel) 
return;
 
 1111    fCurrentSelection = sel;
 
 1118 void TParallelCoord::SetDotsSpacing(Int_t s)
 
 1120    if (gPad->GetCanvas()->SupportAlpha()) 
return;
 
 1121    if (s == fDotsSpacing) 
return;
 
 1123    gStyle->SetLineStyleString(11,Form(
"%d %d",4,s*8));
 
 1129 void TParallelCoord::SetEntryList(TParallelCoord* para, TEntryList* enlist)
 
 1131    para->SetCurrentEntries(enlist);
 
 1132    para->SetInitEntries(enlist);
 
 1138 void TParallelCoord::SetGlobalMax(Double_t max)
 
 1140    TIter next(fVarList);
 
 1141    TParallelCoordVar* var;
 
 1142    while ((var = (TParallelCoordVar*)next())) {
 
 1143       var->SetCurrentMax(max);
 
 1150 void TParallelCoord::SetGlobalMin(Double_t min)
 
 1152    TIter next(fVarList);
 
 1153    TParallelCoordVar* var;
 
 1154    while ((var = (TParallelCoordVar*)next())) {
 
 1155       var->SetCurrentMin(min);
 
 1162 void TParallelCoord::SetLiveRangesUpdate(Bool_t on)
 
 1164    SetBit(kLiveUpdate,on);
 
 1165    TIter next(fVarList);
 
 1166    TParallelCoordVar* var;
 
 1167    while((var = (TParallelCoordVar*)next())) var->SetLiveRangesUpdate(on);
 
 1173 void TParallelCoord::SetVertDisplay(Bool_t vert)
 
 1175    if (vert == TestBit (kVertDisplay)) 
return;
 
 1176    SetBit(kVertDisplay,vert);
 
 1178    TFrame* frame = gPad->GetFrame();
 
 1181    Double_t horaxisspace = (frame->GetX2() - frame->GetX1())/(fNvar-1);
 
 1182    Double_t veraxisspace = (frame->GetY2() - frame->GetY1())/(fNvar-1);
 
 1183    TIter next(fVarList);
 
 1184    TParallelCoordVar* var;
 
 1185    while ((var = (TParallelCoordVar*)next())) {
 
 1186       if (vert) var->SetX(frame->GetX1() + ui*horaxisspace,TestBit(kGlobalScale));
 
 1187       else      var->SetY(frame->GetY1() + ui*veraxisspace,TestBit(kGlobalScale));
 
 1190    if (TestBit(kCandleChart)) {
 
 1191       if (fCandleAxis) 
delete fCandleAxis;
 
 1192       if (TestBit(kVertDisplay)) fCandleAxis = 
new TGaxis(0.05,0.1,0.05,0.9,GetGlobalMin(),GetGlobalMax());
 
 1193       else                       fCandleAxis = 
new TGaxis(0.1,0.05,0.9,0.05,GetGlobalMin(),GetGlobalMax());
 
 1194       fCandleAxis->Draw();
 
 1203 void TParallelCoord::UnzoomAll()
 
 1205    TIter next(fVarList);
 
 1206    TParallelCoordVar* var;
 
 1207    while((var = (TParallelCoordVar*)next())) var->Unzoom();