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