// @(#)root/treeviewer:$Id$ // Author: Bastien Dalla Piazza 02/08/2007 /************************************************************************* * Copyright (C) 1995-2007, Rene Brun and Fons Rademakers. * * All rights reserved. * * * * For the licensing terms see $ROOTSYS/LICENSE. * * For the list of contributors see $ROOTSYS/README/CREDITS. * *************************************************************************/ #include "TParallelCoordEditor.h" #include "TParallelCoord.h" #include "TParallelCoordRange.h" #include "TParallelCoordVar.h" #include "TGFrame.h" #include "TGButton.h" #include "TGButtonGroup.h" #include "TGNumberEntry.h" #include "TGLabel.h" #include "TGTextEntry.h" #include "TGComboBox.h" #include "TGColorSelect.h" #include "TColor.h" #include "TG3DLine.h" #include "TGSlider.h" #include "TGComboBox.h" #include "TGDoubleSlider.h" #include "TTree.h" #include "TGListBox.h" #include "TGedPatternSelect.h" #include "Riostream.h" ClassImp(TParallelCoordEditor) //______________________________________________________________________________ /* Begin_Html

The TParallelCoord editor class

This is the TParallelCoord editor. It brings tools to explore datas Using parallel coordinates. The main tools are:
  • Dots spacing : Set the dots spacing with whichone the lines must be drawn. This tool is useful to reduce the image cluttering.
  • The Selections section : Set the current edited selection and allows to apply it to the tree through a generated entry list.
  • The Entries section : Set how many events must be drawn. A weight cut can be defioned here (see TParallelCoord for a a description of the weight cut).
  • The Variables tab : To define the global settings to display the axes. It is also possible to add a variable from its expression or delete a selected one (also possible using right click on the pad. End_Html */ enum EParallelWid { kGlobalLineColor, kLineTypeBgroup, kLineTypePoly, kLineTypeCurves, kGlobalLineWidth, kDotsSpacing, kDotsSpacingField, kSelectionSelect, kSelectLineColor, kSelectLineWidth, kActivateSelection, kDeleteSelection, kAddSelection, kAddSelectionEntry, kShowRanges, kPaintEntries, kEntriesToDraw, kFirstEntry, kNentries, kApplySelect, kUnApply, kDelayDrawing, kHideAllRanges, kVariables, kDeleteVar, kHistHeight, kHistWidth, kHistBinning, kRenameVar, kWeightCut, kHistColorSelect, kHistPatternSelect }; //______________________________________________________________________________ TParallelCoordEditor::TParallelCoordEditor(const TGWindow* /*p*/, Int_t/*width*/, Int_t /*height*/, UInt_t /*options*/, Pixel_t /*back*/) { // Normal constructor. fPriority = 1; fDelay = kTRUE; //**Line**_________________________________________ MakeTitle("Line"); TGHorizontalFrame *f1 = new TGHorizontalFrame(this); fGlobalLineColor = new TGColorSelect(f1,0,kGlobalLineColor); f1->AddFrame(fGlobalLineColor,new TGLayoutHints(kLHintsLeft | kLHintsTop)); fGlobalLineWidth = new TGLineWidthComboBox(f1, kGlobalLineWidth); fGlobalLineWidth->Resize(91, 20); f1->AddFrame(fGlobalLineWidth, new TGLayoutHints(kLHintsLeft, 3, 1, 1, 1)); AddFrame(f1, new TGLayoutHints(kLHintsLeft | kLHintsTop)); AddFrame(new TGLabel(this,"Dots spacing"), new TGLayoutHints(kLHintsLeft | kLHintsCenterY)); TGHorizontalFrame *f2 = new TGHorizontalFrame(this); fDotsSpacing = new TGHSlider(f2,100,kSlider1|kScaleBoth,kDotsSpacing); fDotsSpacing->SetRange(0,60); f2->AddFrame(fDotsSpacing,new TGLayoutHints(kLHintsLeft | kLHintsCenterY)); fDotsSpacingField = new TGNumberEntryField(f2, kDotsSpacingField, 0, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative); fDotsSpacingField->Resize(40,20); f2->AddFrame(fDotsSpacingField,new TGLayoutHints(kLHintsLeft | kLHintsCenterY)); AddFrame(f2, new TGLayoutHints(kLHintsLeft | kLHintsCenterY)); fLineTypeBgroup = new TGButtonGroup(this,2,1,0,0, "Line type"); fLineTypeBgroup->SetRadioButtonExclusive(kTRUE); fLineTypePoly = new TGRadioButton(fLineTypeBgroup,"Polyline", kLineTypePoly); fLineTypePoly->SetToolTipText("Draw the entries with a polyline"); fLineTypeCurves = new TGRadioButton(fLineTypeBgroup,"Curves", kLineTypeCurves); fLineTypeCurves->SetToolTipText("Draw the entries with a curve"); fLineTypeBgroup->ChangeOptions(kChildFrame|kVerticalFrame); AddFrame(fLineTypeBgroup, new TGLayoutHints(kLHintsCenterY | kLHintsLeft)); //**Selections**___________________________________ MakeTitle("Selections"); fHideAllRanges = new TGCheckButton(this,"Hide all ranges",kHideAllRanges); AddFrame(fHideAllRanges); fSelectionSelect = new TGComboBox(this,kSelectionSelect); fSelectionSelect->Resize(140,20); AddFrame(fSelectionSelect, new TGLayoutHints(kLHintsCenterY | kLHintsLeft,0,0,3,0)); TGHorizontalFrame *f3 = new TGHorizontalFrame(this); fSelectLineColor = new TGColorSelect(f3,0,kSelectLineColor); f3->AddFrame(fSelectLineColor,new TGLayoutHints(kLHintsLeft | kLHintsTop)); fSelectLineWidth = new TGLineWidthComboBox(f3, kSelectLineWidth); fSelectLineWidth->Resize(94, 20); f3->AddFrame(fSelectLineWidth, new TGLayoutHints(kLHintsLeft, 3, 1, 1, 1)); AddFrame(f3, new TGLayoutHints(kLHintsLeft | kLHintsTop,0,0,3,0)); fActivateSelection = new TGCheckButton(this,"Activate",kActivateSelection); fActivateSelection->SetToolTipText("Activate the current selection"); AddFrame(fActivateSelection); fShowRanges = new TGCheckButton(this,"Show ranges",kShowRanges); AddFrame(fShowRanges); TGHorizontalFrame *f5 = new TGHorizontalFrame(this); fAddSelectionField = new TGTextEntry(f5); fAddSelectionField->Resize(57,20); f5->AddFrame(fAddSelectionField, new TGLayoutHints(kLHintsLeft | kLHintsCenterY)); fAddSelection = new TGTextButton(f5,"Add"); fAddSelection->SetToolTipText("Add a new selection (Right click on the axes to add a range)."); f5->AddFrame(fAddSelection, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,3,0,0,0)); fDeleteSelection = new TGTextButton(f5,"Delete",kDeleteSelection); fDeleteSelection->SetToolTipText("Delete the current selection"); f5->AddFrame(fDeleteSelection, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,3,0,0,0)); AddFrame(f5, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,3,0,0,0)); TGHorizontalFrame *f7 = new TGHorizontalFrame(this); fApplySelect = new TGTextButton(f7,"Apply to tree",kApplySelect); fApplySelect->SetToolTipText("Generate an entry list for the current selection and apply it to the tree."); f7->AddFrame(fApplySelect); fUnApply = new TGTextButton(f7,"Reset tree",kUnApply); fUnApply->SetToolTipText("Reset the tree entry list"); f7->AddFrame(fUnApply, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,10,0,0,0)); AddFrame(f7, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,0,0,3,0)); //**Entries**___________________________________ MakeTitle("Entries"); fPaintEntries = new TGCheckButton(this,"Draw entries",kPaintEntries); AddFrame(fPaintEntries); fDelayDrawing = new TGCheckButton(this,"Delay Drawing", kDelayDrawing); AddFrame(fDelayDrawing); fEntriesToDraw = new TGDoubleHSlider(this,140,kDoubleScaleBoth,kEntriesToDraw); AddFrame(fEntriesToDraw); TGHorizontalFrame *f6 = new TGHorizontalFrame(this); TGVerticalFrame *v1 = new TGVerticalFrame(f6); TGVerticalFrame *v2 = new TGVerticalFrame(f6); v1->AddFrame(new TGLabel(v1,"First entry:")); fFirstEntry = new TGNumberEntryField(v1, kFirstEntry, 0, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative); fFirstEntry->Resize(68,20); v1->AddFrame(fFirstEntry); v2->AddFrame(new TGLabel(v2,"# of entries:")); fNentries = new TGNumberEntryField(v2, kFirstEntry, 0, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative); fNentries->Resize(68,20); v2->AddFrame(fNentries); f6->AddFrame(v1); f6->AddFrame(v2, new TGLayoutHints(kLHintsLeft,4,0,0,0)); AddFrame(f6); AddFrame(new TGLabel(this,"Weight cut:")); TGHorizontalFrame *f8 = new TGHorizontalFrame(this); fWeightCut = new TGHSlider(f8,100,kSlider1|kScaleBoth,kDotsSpacing); fWeightCutField = new TGNumberEntryField(f8,kDotsSpacingField, 0, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative); fWeightCutField->Resize(40,20); f8->AddFrame(fWeightCut); f8->AddFrame(fWeightCutField); AddFrame(f8); MakeVariablesTab(); } //______________________________________________________________________________ void TParallelCoordEditor::MakeVariablesTab() { // Make the "variable" tab. fVarTab = CreateEditorTabSubFrame("Variables"); //**Variable**_________________________________ TGHorizontalFrame *f9 = new TGHorizontalFrame(fVarTab); fAddVariable = new TGTextEntry(f9); fAddVariable->Resize(71,20); f9->AddFrame(fAddVariable, new TGLayoutHints(kLHintsCenterY)); fButtonAddVar = new TGTextButton(f9,"Add"); fButtonAddVar->SetToolTipText("Add a new variable from the tree (must be a valid expression)."); f9->AddFrame(fButtonAddVar, new TGLayoutHints(kLHintsCenterY,4,0,0,0)); fVarTab->AddFrame(f9); TGHorizontalFrame *f10 = new TGHorizontalFrame(fVarTab); fVariables = new TGComboBox(f10,kVariables); fVariables->Resize(105,20); f10->AddFrame(fVariables, new TGLayoutHints(kLHintsCenterY)); fVarTab->AddFrame(f10,new TGLayoutHints(kLHintsLeft,0,0,2,0)); TGHorizontalFrame *f12 = new TGHorizontalFrame(fVarTab); fDeleteVar = new TGTextButton(f12,"Delete",kDeleteVar); fDeleteVar->SetToolTipText("Delete the current selected variable"); f12->AddFrame(fDeleteVar, new TGLayoutHints(kLHintsCenterY,1,0,0,0)); fRenameVar = new TGTextButton(f12,"Rename",kRenameVar); fRenameVar->SetToolTipText("Rename the current selected variable"); f12->AddFrame(fRenameVar, new TGLayoutHints(kLHintsCenterY,4,0,0,0)); fVarTab->AddFrame(f12,new TGLayoutHints(kLHintsLeft,0,0,2,0)); fVarTab->AddFrame(new TGLabel(fVarTab,"Axis histograms:")); TGHorizontalFrame *f11 = new TGHorizontalFrame(fVarTab); TGVerticalFrame *v3 = new TGVerticalFrame(f11); TGVerticalFrame *v4 = new TGVerticalFrame(f11); v3->AddFrame(new TGLabel(v3,"Binning:")); fHistBinning = new TGNumberEntryField(v3, kHistWidth, 0, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative); fHistBinning->Resize(68,20); v3->AddFrame(fHistBinning); v4->AddFrame(new TGLabel(v4,"Width:")); fHistWidth = new TGNumberEntryField(v4, kHistWidth, 0, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative); fHistWidth->Resize(68,20); v4->AddFrame(fHistWidth, new TGLayoutHints(kLHintsLeft,4,0,0,0)); f11->AddFrame(v3); f11->AddFrame(v4); fVarTab->AddFrame(f11); fHistShowBoxes = new TGCheckButton(fVarTab,"Show box histograms"); fVarTab->AddFrame(fHistShowBoxes); fVarTab->AddFrame(new TGLabel(fVarTab,"Bar histograms style:")); TGCompositeFrame *f13 = new TGCompositeFrame(fVarTab, 80, 20, kHorizontalFrame); fHistColorSelect = new TGColorSelect(f13, 0, kHistColorSelect); f13->AddFrame(fHistColorSelect, new TGLayoutHints(kLHintsLeft, 1, 1, 1, 1)); fHistColorSelect->Associate(this); fHistPatternSelect = new TGedPatternSelect(f13, 1, kHistPatternSelect); f13->AddFrame(fHistPatternSelect, new TGLayoutHints(kLHintsLeft, 1, 1, 1, 1)); fHistPatternSelect->Associate(this); fVarTab->AddFrame(f13, new TGLayoutHints(kLHintsTop, 1, 1, 0, 0)); } //______________________________________________________________________________ TParallelCoordEditor::~TParallelCoordEditor() { // Destructor. delete fLineTypePoly; delete fLineTypeCurves; } //______________________________________________________________________________ void TParallelCoordEditor::CleanUpSelections() { // Clean up the selection combo box. TList *list = fParallel->GetSelectList(); fSelectionSelect->RemoveAll(); Bool_t enable = list->GetSize() > 0; fSelectionSelect->SetEnabled(enable); fSelectLineColor->SetEnabled(enable); fSelectLineWidth->SetEnabled(enable); fActivateSelection->SetEnabled(enable); fShowRanges->SetEnabled(enable); fDeleteSelection->SetEnabled(enable); if (list->GetSize() > 0) { Int_t i = 0; TIter next(list); TParallelCoordSelect* sel; while ((sel = (TParallelCoordSelect*)next())) { fSelectionSelect->AddEntry(sel->GetTitle(),i); TGLBEntry *entry = fSelectionSelect->GetListBox()->GetEntry(i); if (entry) entry->SetBackgroundColor(TColor::Number2Pixel(sel->GetLineColor())); ++i; } sel = fParallel->GetCurrentSelection(); if (sel) { fSelectionSelect->Select(list->IndexOf(sel),kFALSE); Color_t c; Pixel_t p; c = sel->GetLineColor(); p = TColor::Number2Pixel(c); fSelectLineColor->SetColor(p); fSelectLineWidth->Select(sel->GetLineWidth()); fActivateSelection->SetOn(sel->TestBit(TParallelCoordSelect::kActivated)); fShowRanges->SetOn(sel->TestBit(TParallelCoordSelect::kShowRanges)); } } } //______________________________________________________________________________ void TParallelCoordEditor::CleanUpVariables() { // Clean up the variables combo box. TList *list = fParallel->GetVarList(); fVariables->RemoveAll(); Bool_t enable = list->GetSize() > 0; fVariables->SetEnabled(enable); fDeleteVar->SetEnabled(enable); fHistShowBoxes->SetEnabled(enable); fHistWidth->SetEnabled(enable); fHistBinning->SetEnabled(enable); if (list->GetSize() > 0) { Int_t i = 0; TIter next(list); TParallelCoordVar* var; while ((var = (TParallelCoordVar*)next())) { fVariables->AddEntry(var->GetTitle(),i); ++i; } var = (TParallelCoordVar*)list->First(); fVariables->Select(0,kFALSE); fHistShowBoxes->SetOn(var->TestBit(TParallelCoordVar::kShowBarHisto)); fHistWidth->SetNumber(var->GetHistLineWidth()); fHistBinning->SetNumber(var->GetHistBinning()); } } //______________________________________________________________________________ void TParallelCoordEditor::ConnectSignals2Slots() { // Connect signals to slots. fGlobalLineColor->Connect("ColorSelected(Pixel_t)","TParallelCoordEditor", this, "DoGlobalLineColor(Pixel_t)"); fGlobalLineWidth->Connect("Selected(Int_t)","TParallelCoordEditor", this, "DoGlobalLineWidth(Int_t)"); fDotsSpacing->Connect("Released()","TParallelCoordEditor", this, "DoDotsSpacing()"); fDotsSpacing->Connect("PositionChanged(Int_t)","TParallelCoordEditor", this, "DoLiveDotsSpacing(Int_t)"); fDotsSpacingField->Connect("ReturnPressed()","TParallelCoordEditor", this, "DoDotsSpacingField()"); fLineTypeBgroup->Connect("Clicked(Int_t)", "TParallelCoordEditor", this, "DoLineType()"); fSelectionSelect->Connect("Selected(const char*)","TParallelCoordEditor", this, "DoSelectionSelect(const char*)"); fSelectLineColor->Connect("ColorSelected(Pixel_t)","TParallelCoordEditor", this, "DoSelectLineColor(Pixel_t)"); fSelectLineWidth->Connect("Selected(Int_t)","TParallelCoordEditor", this, "DoSelectLineWidth(Int_t)"); fActivateSelection->Connect("Toggled(Bool_t)","TParallelCoordEditor", this, "DoActivateSelection(Bool_t)"); fShowRanges->Connect("Toggled(Bool_t)","TParallelCoordEditor", this, "DoShowRanges(Bool_t)"); fDeleteSelection->Connect("Clicked()","TParallelCoordEditor", this, "DoDeleteSelection()"); fAddSelection->Connect("Clicked()","TParallelCoordEditor", this, "DoAddSelection()"); fPaintEntries->Connect("Toggled(Bool_t)","TParallelCoordEditor", this, "DoPaintEntries(Bool_t)"); fEntriesToDraw->Connect("Released()","TParallelCoordEditor", this, "DoEntriesToDraw()"); fEntriesToDraw->Connect("PositionChanged()","TParallelCoordEditor", this, "DoLiveEntriesToDraw()"); fFirstEntry->Connect("ReturnPressed()","TParallelCoordEditor", this, "DoFirstEntry()"); fNentries->Connect("ReturnPressed()","TParallelCoordEditor", this, "DoNentries()"); fApplySelect->Connect("Clicked()","TParallelCoordEditor", this, "DoApplySelect()"); fUnApply->Connect("Clicked()","TParallelCoordEditor", this, "DoUnApply()"); fDelayDrawing->Connect("Toggled(Bool_t)","TParallelCoordEditor", this, "DoDelayDrawing(Bool_t)"); fAddVariable->Connect("ReturnPressed()","TParallelCoordEditor", this, "DoAddVariable()"); fButtonAddVar->Connect("Clicked()","TParallelCoordEditor", this, "DoAddVariable()"); fHideAllRanges->Connect("Toggled(Bool_t)","TParallelCoordEditor", this, "DoHideAllRanges(Bool_t)"); fVariables->Connect("Selected(const char*)","TParallelCoordEditor", this, "DoVariableSelect(const char*)"); fDeleteVar->Connect("Clicked()","TParallelCoordEditor", this, "DoDeleteVar()"); fHistWidth->Connect("ReturnPressed()","TParallelCoordEditor", this, "DoHistWidth()"); fHistBinning->Connect("ReturnPressed()","TParallelCoordEditor", this, "DoHistBinning()"); fWeightCut->Connect("Released()","TParallelCoordEditor", this, "DoWeightCut()"); fWeightCut->Connect("PositionChanged(Int_t)","TParallelCoordEditor", this, "DoLiveWeightCut(Int_t)"); fWeightCutField->Connect("ReturnPressed()","TParallelCoordEditor", this, "DoWeightCut()"); fHistColorSelect->Connect("ColorSelected(Pixel_t)", "TParallelCoordEditor", this, "DoHistColorSelect(Pixel_t)"); fHistPatternSelect->Connect("PatternSelected(Style_t)", "TParallelCoordEditor", this, "DoHistPatternSelect(Style_t)"); fHistShowBoxes->Connect("Toggled(Bool_t)","TParallelCoordEditor", this, "DoHistShowBoxes(Bool_t)"); fInit = kFALSE; } //______________________________________________________________________________ void TParallelCoordEditor::DoActivateSelection(Bool_t on) { // Slot to activate or not a selection. if (fAvoidSignal) return; TParallelCoordSelect* sel = fParallel->GetCurrentSelection(); if (sel) { sel->SetActivated(on); Update(); } } //______________________________________________________________________________ void TParallelCoordEditor::DoAddSelection() { // Slot to add a selection. TString title = fAddSelectionField->GetText(); if(title == "") title = "Selection"; TString titlebis = title; Bool_t found = kTRUE; Int_t i=1; while (found){ if(fSelectionSelect->FindEntry(titlebis)) { titlebis = title; titlebis.Append(Form("(%d)",i)); } else found = kFALSE; ++i; } fParallel->AddSelection(titlebis.Data()); CleanUpSelections(); } //______________________________________________________________________________ void TParallelCoordEditor::DoAddVariable() { // Slot to add a variable. if (fAvoidSignal) return; fParallel->AddVariable(fAddVariable->GetText()); CleanUpVariables(); Update(); } //______________________________________________________________________________ void TParallelCoordEditor::DoApplySelect() { // Slot to apply a selection to the tree. //FIXME I forgot to update the slider over the entries // (nentries and firstentry might have changed after applying the selection) if (fAvoidSignal) return; fParallel->ApplySelectionToTree(); Update(); SetModel(fParallel); } //______________________________________________________________________________ void TParallelCoordEditor::DoDelayDrawing(Bool_t on) { // Slot to delay the drawing. if (fAvoidSignal) return; fDelay = on; fParallel->SetLiveRangesUpdate(!on); } //______________________________________________________________________________ void TParallelCoordEditor::DoDeleteSelection() { // Slot to delete a selection. if (fAvoidSignal) return; fParallel->DeleteSelection(fParallel->GetCurrentSelection()); CleanUpSelections(); Update(); } //______________________________________________________________________________ void TParallelCoordEditor::DoDeleteVar() { // Slot to delete a variable(). if (fAvoidSignal) return; TParallelCoordVar* var = fParallel->RemoveVariable(((TGTextLBEntry*)fVariables->GetSelectedEntry())->GetTitle()); CleanUpVariables(); if(var) Update(); } //______________________________________________________________________________ void TParallelCoordEditor::DoDotsSpacing() { // Slot to set the line dotspacing. if (fAvoidSignal) return; fParallel->SetDotsSpacing(fDotsSpacing->GetPosition()); fDotsSpacingField->SetNumber((Int_t)fDotsSpacing->GetPosition()); Update(); } //______________________________________________________________________________ void TParallelCoordEditor::DoDotsSpacingField() { // Slot to set the line dotspacing from the entry field. if (fAvoidSignal) return; fParallel->SetDotsSpacing((Int_t)fDotsSpacingField->GetNumber()); fDotsSpacing->SetPosition((Int_t)fDotsSpacingField->GetNumber()); Update(); } //______________________________________________________________________________ void TParallelCoordEditor::DoEntriesToDraw() { // Slot to select the entries to be drawn. if (fAvoidSignal) return; Long64_t nentries,firstentry; firstentry = (Long64_t)fEntriesToDraw->GetMinPosition(); nentries = (Long64_t)(fEntriesToDraw->GetMaxPosition() - fEntriesToDraw->GetMinPosition() + 1); fParallel->SetCurrentFirst(firstentry); fParallel->SetCurrentN(nentries); Update(); } //______________________________________________________________________________ void TParallelCoordEditor::DoFirstEntry() { // Slot to set the first entry. if (fAvoidSignal) return; fParallel->SetCurrentFirst((Long64_t)fFirstEntry->GetNumber()); fEntriesToDraw->SetPosition((Long64_t)fFirstEntry->GetNumber(),(Long64_t)fFirstEntry->GetNumber()+fParallel->GetCurrentN()); Update(); } //______________________________________________________________________________ void TParallelCoordEditor::DoGlobalLineColor(Pixel_t a) { // Slot to set the global line color. if (fAvoidSignal) return; fParallel->SetLineColor(TColor::GetColor(a)); Update(); } //______________________________________________________________________________ void TParallelCoordEditor::DoGlobalLineWidth(Int_t wid) { // Slot to set the global line width. if (fAvoidSignal) return; fParallel->SetLineWidth(wid); Update(); } //______________________________________________________________________________ void TParallelCoordEditor::DoHideAllRanges(Bool_t on) { // Slot to hide all the ranges. if (fAvoidSignal) return; TIter next(fParallel->GetSelectList()); TParallelCoordSelect* sel; while((sel = (TParallelCoordSelect*)next())) sel->SetShowRanges(!on); fShowRanges->SetOn(!on); fShowRanges->SetEnabled(!on); fShowRanges->SetOn(!on); Update(); } //______________________________________________________________________________ void TParallelCoordEditor::DoHistBinning() { // Slot to set the axes histogram binning. if (fAvoidSignal) return; fParallel->SetAxisHistogramBinning((Int_t)fHistBinning->GetNumber()); Update(); } //______________________________________________________________________________ void TParallelCoordEditor::DoHistColorSelect(Pixel_t p) { // Slot to set the histograms color. if (fAvoidSignal) return; Color_t col = TColor::GetColor(p); TIter next(fParallel->GetVarList()); TParallelCoordVar *var = NULL; while ((var = (TParallelCoordVar*)next())) var->SetFillColor(col); Update(); } //______________________________________________________________________________ void TParallelCoordEditor::DoHistShowBoxes(Bool_t s) { // Slot to set histogram height. if (fAvoidSignal) return; TIter next(fParallel->GetVarList()); TParallelCoordVar* var; while ((var = (TParallelCoordVar*)next())) var->SetBit(TParallelCoordVar::kShowBarHisto,s); Update(); } //______________________________________________________________________________ void TParallelCoordEditor::DoHistPatternSelect(Style_t sty) { // Slot to set the histograms fill style. if (fAvoidSignal) return; TIter next(fParallel->GetVarList()); TParallelCoordVar *var = NULL; while ((var = (TParallelCoordVar*)next())) var->SetFillStyle(sty); Update(); } //______________________________________________________________________________ void TParallelCoordEditor::DoHistWidth() { // Slot to set histogram width. if (fAvoidSignal) return; fParallel->SetAxisHistogramLineWidth((Int_t)fHistWidth->GetNumber()); Update(); } //______________________________________________________________________________ void TParallelCoordEditor::DoLineType() { // Slot to set the line type. if (fAvoidSignal) return; if(fLineTypePoly->GetState() == kButtonDown) fParallel->SetCurveDisplay(kFALSE); else fParallel->SetCurveDisplay(kTRUE); Update(); } //______________________________________________________________________________ void TParallelCoordEditor::DoLiveDotsSpacing(Int_t a) { // Slot to set the dots spacing online. if (fAvoidSignal) return; fDotsSpacingField->SetNumber(a); fParallel->SetDotsSpacing(a); if(!fDelay) Update(); } //______________________________________________________________________________ void TParallelCoordEditor::DoLiveEntriesToDraw() { // Slot to update the entries fields from the slider position. if (fAvoidSignal) return; Long64_t nentries,firstentry; firstentry = (Long64_t)fEntriesToDraw->GetMinPosition(); nentries = (Long64_t)(fEntriesToDraw->GetMaxPosition() - fEntriesToDraw->GetMinPosition() + 1); fFirstEntry->SetNumber(firstentry); fNentries->SetNumber(nentries); if (!fDelay) { fParallel->SetCurrentFirst(firstentry); fParallel->SetCurrentN(nentries); Update(); } } //______________________________________________________________________________ void TParallelCoordEditor::DoLiveWeightCut(Int_t n) { // Slot to update the wieght cut entry field from the slider position. if (fAvoidSignal) return; fWeightCutField->SetNumber(n); if (!fDelay) { fParallel->SetWeightCut(n); Update(); } } //______________________________________________________________________________ void TParallelCoordEditor::DoNentries() { // Slot to set the number of entries to display. if (fAvoidSignal) return; fParallel->SetCurrentN((Long64_t)fNentries->GetNumber()); fEntriesToDraw->SetPosition(fParallel->GetCurrentFirst(),fParallel->GetCurrentFirst()+fParallel->GetCurrentN()); Update(); } //______________________________________________________________________________ void TParallelCoordEditor::DoPaintEntries(Bool_t on) { // Slot to postpone the entries drawing. if (fAvoidSignal) return; fParallel->SetBit(TParallelCoord::kPaintEntries,on); Update(); } //______________________________________________________________________________ void TParallelCoordEditor::DoSelectLineColor(Pixel_t a) { // Slot to set the global line color. if (fAvoidSignal) return; TParallelCoordSelect* sel = fParallel->GetCurrentSelection(); if (sel) sel->SetLineColor(TColor::GetColor(a)); fSelectionSelect->GetSelectedEntry()->SetBackgroundColor(a); Update(); } //______________________________________________________________________________ void TParallelCoordEditor::DoSelectLineWidth(Int_t wid) { // Slot to set the global line width. if (fAvoidSignal) return; TParallelCoordSelect* sel = fParallel->GetCurrentSelection(); if (sel) { sel->SetLineWidth(wid); Update(); } } //______________________________________________________________________________ void TParallelCoordEditor::DoSelectionSelect(const char* title) { // Slot to set the selection beeing edited. if (fAvoidSignal) return; if (!fParallel->SetCurrentSelection(title)) return; Color_t c = fParallel->GetCurrentSelection()->GetLineColor(); Pixel_t p = TColor::Number2Pixel(c); fSelectLineColor->SetColor(p,kFALSE); fSelectLineWidth->Select(fParallel->GetCurrentSelection()->GetLineWidth(),kFALSE); fActivateSelection->SetOn(fParallel->GetCurrentSelection()->TestBit(TParallelCoordSelect::kActivated)); fShowRanges->SetOn(fParallel->GetCurrentSelection()->TestBit(TParallelCoordSelect::kShowRanges)); } //______________________________________________________________________________ void TParallelCoordEditor::DoShowRanges(Bool_t s) { // Slot to show or not the ranges on the pad. if (fAvoidSignal) return; TParallelCoordSelect *select = fParallel->GetCurrentSelection(); if (select) { select->SetShowRanges(s); Update(); } } //______________________________________________________________________________ void TParallelCoordEditor::DoUnApply() { // Slot to reset the tree entry list to the original one. if (fAvoidSignal) return; fParallel->ResetTree(); Update(); SetModel(fParallel); } //______________________________________________________________________________ void TParallelCoordEditor::DoVariableSelect(const char* /*var*/) { // Slot to select a variable. //cout<<((TGTextLBEntry*)fVariables->GetSelectedEntry())->GetTitle()<GetNumber(); fParallel->SetWeightCut(n); Update(); } //______________________________________________________________________________ void TParallelCoordEditor::SetModel(TObject* obj) { // Pick up the used parallel coordinates plot attributes. if (!obj) return; fParallel = dynamic_cast(obj); if (!fParallel) return; fAvoidSignal = kTRUE; Color_t c = fParallel->GetLineColor(); Pixel_t p = TColor::Number2Pixel(c); fGlobalLineColor->SetColor(p); fGlobalLineWidth->Select(fParallel->GetLineWidth()); fPaintEntries->SetOn(fParallel->TestBit(TParallelCoord::kPaintEntries)); fDotsSpacing->SetPosition(fParallel->GetDotsSpacing()); fDotsSpacingField->SetNumber(fParallel->GetDotsSpacing()); Bool_t cur = fParallel->GetCurveDisplay(); if (cur) fLineTypeBgroup->SetButton(kLineTypeCurves,kTRUE); else fLineTypeBgroup->SetButton(kLineTypePoly,kTRUE); if(fInit) fHideAllRanges->SetOn(kFALSE); CleanUpSelections(); CleanUpVariables(); if (fInit) fEntriesToDraw->SetRange(0,fParallel->GetNentries()); fEntriesToDraw->SetPosition(fParallel->GetCurrentFirst(), fParallel->GetCurrentFirst()+fParallel->GetCurrentN()); fFirstEntry->SetNumber(fParallel->GetCurrentFirst()); fNentries->SetNumber(fParallel->GetCurrentN()); fDelayDrawing->SetOn(fDelay); fWeightCut->SetRange(0,(Int_t)(fParallel->GetNentries()/10)); // Maybe search here for better boundaries. fWeightCut->SetPosition(fParallel->GetWeightCut()); fWeightCutField->SetNumber(fParallel->GetWeightCut()); fHistColorSelect->SetColor(TColor::Number2Pixel(((TParallelCoordVar*)fParallel->GetVarList()->Last())->GetFillColor()), kFALSE); fHistPatternSelect->SetPattern(((TParallelCoordVar*)fParallel->GetVarList()->Last())->GetFillStyle(),kFALSE); if (fInit) ConnectSignals2Slots(); fAvoidSignal = kFALSE; }