1743 lines
55 KiB
C++
1743 lines
55 KiB
C++
#include <TApplication.h>
|
|
#include <TSystem.h>
|
|
#include <TGClient.h>
|
|
#include <TGString.h>
|
|
#include <TString.h>
|
|
#include <TCanvas.h>
|
|
#include <TF1.h>
|
|
#include <TH2.h>
|
|
#include <TH3.h>
|
|
#include <TRandom.h>
|
|
#include <TRootEmbeddedCanvas.h>
|
|
#include <TGraph.h>
|
|
|
|
#include <string>
|
|
#include <iostream>
|
|
|
|
#include "TH5MainFrame.h"
|
|
#include "TH5Dataset.h"
|
|
#include "TH5Legend.h"
|
|
|
|
using namespace std;
|
|
|
|
ClassImp(TH5MainFrame)
|
|
|
|
TH5MainFrame::TH5MainFrame(const TGWindow *p, UInt_t w, UInt_t h, Int_t ssr)
|
|
: TGMainFrame(p, w, h), fSubsamplingRate(ssr) {
|
|
|
|
//initialize pointers to datasets:
|
|
for (Int_t n=0; n<5; ++n) {
|
|
fDataset[n] = NULL;
|
|
}
|
|
|
|
fNStepMax = 0;
|
|
|
|
// some predefined layout hints: numbers are left, right, top, bottom
|
|
fLayoutLeftflush = new TGLayoutHints(kLHintsLeft,5,5,5,5);
|
|
fLayoutRightflush = new TGLayoutHints(kLHintsRight,5,5,5,5);
|
|
fLayoutCentered = new TGLayoutHints(kLHintsCenterX,5,5,15,5);
|
|
|
|
//--------------------------------------------------------------------------
|
|
// main canvas for plotting:
|
|
fEcanvas = new TRootEmbeddedCanvas ("Ecanvas",this,w,h);
|
|
fLayoutCanvas = new TGLayoutHints(kLHintsExpandX | kLHintsExpandY,10,10,10,1);
|
|
AddFrame(fEcanvas, fLayoutCanvas);
|
|
|
|
//--------------------------------------------------------------------------
|
|
// file entry bar (includes Exit button)
|
|
fFileEntryBar = new TGHorizontalFrame(this, 600,40);
|
|
|
|
fFileLabel = new TGLabel(fFileEntryBar,"Enter filename: ");
|
|
|
|
fFileEntry = new TGTextEntry(fFileEntryBar, fFilenameBuffer = new TGTextBuffer(100));
|
|
fFileEntry->Resize(400, fFileEntry->GetDefaultHeight());
|
|
fFileEntry->SetToolTipText("Enter the filename, dude!");
|
|
fFileEntry->Connect("ReturnPressed()","TH5MainFrame",this,"LoadFile()");
|
|
|
|
fLoad = new TGTextButton(fFileEntryBar," &Load ");
|
|
fLoad->Connect("Clicked()","TH5MainFrame",this,"LoadFile()");
|
|
|
|
fExit = new TGTextButton(fFileEntryBar," &Exit ","gApplication->Terminate()");
|
|
|
|
fFileEntryBar->AddFrame(fFileLabel, fLayoutLeftflush);
|
|
fFileEntryBar->AddFrame(fFileEntry, fLayoutLeftflush);
|
|
fFileEntryBar->AddFrame(fLoad, fLayoutLeftflush);
|
|
fFileEntryBar->AddFrame(fExit, fLayoutRightflush);
|
|
|
|
AddFrame(fFileEntryBar, new TGLayoutHints(kLHintsLeft,2,2,2,2));
|
|
|
|
//--------------------------------------------------------------------------
|
|
// work space: (everything below the file entry bar)
|
|
fWorkspace = new TGHorizontalFrame(this, 600,40);
|
|
|
|
//--------------------------------------------------------------------------
|
|
// selection space: for file and step selection
|
|
fSelspace = new TGVerticalFrame(fWorkspace, 300,100);
|
|
|
|
// group frame for file selection:
|
|
fFileSelection = new TGGroupFrame(fSelspace, "File selection",kVerticalFrame);
|
|
fFileSelection->SetTitlePos(TGGroupFrame::kLeft);
|
|
|
|
for (Int_t n=0; n<5; ++n) {
|
|
fFileButton[n] = new TGCheckButton(fFileSelection, " no file loaded yet ",200);
|
|
fFileButton[n]->SetState(kButtonDisabled);
|
|
fFileSelection->AddFrame(fFileButton[n], new TGLayoutHints(kLHintsLeft,5,5,3,3));
|
|
TString slotCommand = TString("ActivateFile(Int_t=");
|
|
slotCommand+=n;
|
|
slotCommand+=TString(")");
|
|
fFileButton[n]->Connect("Clicked()","TH5MainFrame",this,slotCommand.Data());
|
|
}
|
|
|
|
fSelspace->AddFrame(fFileSelection, fLayoutLeftflush);
|
|
|
|
// group frame for step selection:
|
|
fStepSelection = new TGGroupFrame(fSelspace, "Step selection",kVerticalFrame);
|
|
fStepSelection->SetTitlePos(TGGroupFrame::kLeft);
|
|
|
|
fStepSlider = new TGHSlider(fStepSelection, 220, kSlider1 | kScaleDownRight, stepSliderID);
|
|
fStepSlider->SetRange(0,100);
|
|
fStepSlider->Connect("PositionChanged(Int_t)", "TH5MainFrame", this, "DoStepSlider(Int_t)");
|
|
fStepSlider->Connect("Released()", "TH5MainFrame", this, "DoLastPlot");
|
|
|
|
// various subframes needed for layout below step slider:
|
|
fStepSposTEFrame = new TGHorizontalFrame(fStepSelection);
|
|
fStepTEFrame = new TGVerticalFrame(fStepSposTEFrame);
|
|
fSposTEFrame = new TGVerticalFrame(fStepSposTEFrame);
|
|
fPrevStepFrame = new TGVerticalFrame(fStepSposTEFrame);
|
|
fNextStepFrame = new TGVerticalFrame(fStepSposTEFrame);
|
|
|
|
fStepLabel = new TGLabel(fStepTEFrame,"Step");
|
|
fStepSliderTE = new TGTextEntry(fStepTEFrame, fStepSliderTB = new TGTextBuffer(5), stepSliderTEID);
|
|
fStepSliderTB->AddText(0, "0");
|
|
fStepSliderTE->Connect("TextChanged(char*)", "TH5MainFrame", this, "DoStepText(char*)");
|
|
fStepTEFrame->AddFrame(fStepLabel, new TGLayoutHints(kLHintsLeft,2,1,1,0));
|
|
fStepTEFrame->AddFrame(fStepSliderTE, new TGLayoutHints(kLHintsCenterX,2,1,0,0));
|
|
|
|
fSposLabel = new TGLabel(fSposTEFrame,"Spos");
|
|
fSposSliderTE = new TGTextEntry(fSposTEFrame, fSposSliderTB = new TGTextBuffer(5), sposSliderTEID);
|
|
fSposSliderTB->AddText(0, "0");
|
|
fSposSliderTE->Connect("TextChanged(char*)", "TH5MainFrame", this, "DoStepText(char*)");
|
|
fSposSliderTE->Connect("ReturnPressed()","TH5MainFrame",this,"DoStepTextReturn(char*)");
|
|
fSposTEFrame->AddFrame(fSposLabel, new TGLayoutHints(kLHintsLeft,2,1,1,0));
|
|
fSposTEFrame->AddFrame(fSposSliderTE, new TGLayoutHints(kLHintsCenterX,2,1,0,0));
|
|
|
|
fPrevStepLabel = new TGLabel(fPrevStepFrame," ");
|
|
fPrevButton = new TGTextButton(fPrevStepFrame," Pre&v ");
|
|
fPrevButton->Connect("Clicked()","TH5MainFrame",this,"PlotNextStep(Int_t=-1)");
|
|
fPrevStepFrame->AddFrame(fPrevStepLabel, new TGLayoutHints(kLHintsLeft,2,1,1,0));
|
|
fPrevStepFrame->AddFrame(fPrevButton, new TGLayoutHints(kLHintsRight,2,1,0,0));
|
|
|
|
fNextStepLabel = new TGLabel(fNextStepFrame," ");
|
|
fNextButton = new TGTextButton(fNextStepFrame," &Next ");
|
|
fNextButton->Connect("Clicked()","TH5MainFrame",this,"PlotNextStep(Int_t=1)");
|
|
fNextStepFrame->AddFrame(fNextStepLabel, new TGLayoutHints(kLHintsLeft,2,1,1,0));
|
|
fNextStepFrame->AddFrame(fNextButton, new TGLayoutHints(kLHintsRight,2,1,0,0));
|
|
|
|
fStepSposTEFrame->AddFrame(fStepTEFrame, new TGLayoutHints(kLHintsCenterX,2,1,0,0));
|
|
fStepSposTEFrame->AddFrame(fSposTEFrame, new TGLayoutHints(kLHintsCenterX,2,1,0,0));
|
|
fStepSposTEFrame->AddFrame(fNextStepFrame, new TGLayoutHints(kLHintsRight,5,1,0,0));
|
|
fStepSposTEFrame->AddFrame(fPrevStepFrame, new TGLayoutHints(kLHintsRight,10,1,0,0));
|
|
|
|
fStepSelection->AddFrame(fStepSlider, new TGLayoutHints(kLHintsCenterX,5,1,0,2));
|
|
fStepSelection->AddFrame(fStepSposTEFrame, new TGLayoutHints(kLHintsCenterX,5,1,2,0));
|
|
|
|
fSelspace->AddFrame(fStepSelection, new TGLayoutHints(kLHintsCenterX,1,1,1,1));
|
|
|
|
fSelspace->MapSubwindows();
|
|
fWorkspace->AddFrame(fSelspace, new TGLayoutHints(kLHintsLeft,1,1,1,1));
|
|
|
|
//--------------------------------------------------------------------------
|
|
// variable space: for variable selection (also contains print button)
|
|
fVarspace = new TGVerticalFrame(fWorkspace, 300,100);
|
|
|
|
// group frame for variable selection
|
|
fVarSelection = new TGGroupFrame(fVarspace, "Var. sel.",kVerticalFrame);
|
|
fVarSelection->SetTitlePos(TGGroupFrame::kLeft);
|
|
|
|
// default names for particle variables
|
|
// (will be overwritten by loaded file)
|
|
fVarNameDefault[0] = TString(" x ");
|
|
fVarNameDefault[1] = TString(" y ");
|
|
fVarNameDefault[2] = TString(" z ");
|
|
fVarNameDefault[3] = TString(" phiz");
|
|
fVarNameDefault[4] = TString(" px ");
|
|
fVarNameDefault[5] = TString(" py ");
|
|
fVarNameDefault[6] = TString(" pz ");
|
|
fVarNameDefault[7] = TString(" enez");
|
|
|
|
for (Int_t n=0; n<8; ++n) {
|
|
fVarName[n] = fVarNameDefault[n];
|
|
fVarButton[n] = new TGCheckButton(fVarSelection, fVarName[n],200);
|
|
fVarButton[n]->SetState(kButtonDisabled);
|
|
Int_t l = 5;
|
|
if (n==3||n==7) l = 15;
|
|
Int_t b = 2;
|
|
if (n==3) b = 10;
|
|
fVarSelection->AddFrame(fVarButton[n], new TGLayoutHints(kLHintsLeft,l,0,2,b));
|
|
}
|
|
|
|
fVarspace->AddFrame(fVarSelection, new TGLayoutHints(kLHintsLeft,2,2,2,2));
|
|
|
|
// print space
|
|
fPrintspace = new TGVerticalFrame(fVarspace);
|
|
|
|
fPrintButton = new TGTextButton(fPrintspace," &Print ");
|
|
fPrintButton->Connect("Clicked()","TH5MainFrame",this,"PrintCanv()");
|
|
fPrintspace->AddFrame(fPrintButton, fLayoutLeftflush);
|
|
|
|
fPrintBox = new TGComboBox(fPrintspace,"format",100);
|
|
// define string array at the same time (see note at end of PrintCanv() method)
|
|
fPrintBox->AddEntry("pdf",0); H5PrintFormat[0] = TString("pdf");
|
|
fPrintBox->AddEntry("jpg",1); H5PrintFormat[1] = TString("jpg");
|
|
fPrintBox->AddEntry("png",2); H5PrintFormat[2] = TString("png");
|
|
fPrintBox->AddEntry("gif",3); H5PrintFormat[3] = TString("gif");
|
|
fPrintBox->AddEntry("tiff",4); H5PrintFormat[4] = TString("tiff");
|
|
fPrintBox->AddEntry("ps",5); H5PrintFormat[5] = TString("ps");
|
|
fPrintBox->AddEntry("ps-port",6); H5PrintFormat[6] = TString("Portrait");
|
|
fPrintBox->AddEntry("ps-land",7); H5PrintFormat[7] = TString("Landscape");
|
|
fPrintBox->AddEntry("eps",8); H5PrintFormat[8] = TString("eps");
|
|
fPrintBox->AddEntry("eps-pre",9); H5PrintFormat[9] = TString("Preview");
|
|
fPrintBox->AddEntry("svg",10); H5PrintFormat[10] = TString("svg");
|
|
fPrintBox->AddEntry("xpm",11); H5PrintFormat[11] = TString("xpm");
|
|
fPrintBox->AddEntry("xml",12); H5PrintFormat[12] = TString("xml");
|
|
fPrintBox->AddEntry("cxx",13); H5PrintFormat[13] = TString("cxx");
|
|
fPrintBox->AddEntry("root",14); H5PrintFormat[14] = TString("root");
|
|
fPrintBox->Select(0);
|
|
fPrintBox->Resize(70,20);
|
|
fPrintspace->AddFrame(fPrintBox, fLayoutLeftflush);
|
|
|
|
fVarspace->AddFrame(fPrintspace, fLayoutLeftflush);
|
|
|
|
fVarspace->MapSubwindows();
|
|
fWorkspace->AddFrame(fVarspace, fLayoutLeftflush);
|
|
|
|
//--------------------------------------------------------------------------
|
|
// button space: for plot buttons
|
|
fButtonspace = new TGVerticalFrame(fWorkspace, 300,100);
|
|
|
|
// group frame for histogramming, with three subframes
|
|
fHistoFrame = new TGGroupFrame(fButtonspace, "Histograms",kVerticalFrame);
|
|
f1dFrame = new TGHorizontalFrame(fHistoFrame);
|
|
f2dFrame = new TGHorizontalFrame(fHistoFrame);
|
|
f3dFrame = new TGHorizontalFrame(fHistoFrame);
|
|
|
|
// 1d histograms
|
|
fHisto1d = new TGTextButton(f1dFrame," &1D ");
|
|
fHisto1d->Connect("Clicked()","TH5MainFrame",this,"Histo1d()");
|
|
fHisto1d->Resize(20,fHisto1d->GetDefaultHeight());
|
|
|
|
fHisto1dBox = new TGComboBox(f1dFrame,"style",100);
|
|
fHisto1dBox->AddEntry("HIST",0); H5DrawOpt1d[0] = TString("");
|
|
fHisto1dBox->AddEntry("ERRBAR",1); H5DrawOpt1d[1] = TString("e1p");
|
|
fHisto1dBox->AddEntry("ERRBOX",2); H5DrawOpt1d[2] = TString("e2p");
|
|
fHisto1dBox->AddEntry("CURVE",3); H5DrawOpt1d[3] = TString("c");
|
|
fHisto1dBox->AddEntry("BAR",4); H5DrawOpt1d[4] = TString("b");
|
|
fHisto1dBox->AddEntry("LINE",5); H5DrawOpt1d[5] = TString("l");
|
|
fHisto1dBox->AddEntry("LEGO",6); H5DrawOpt1d[6] = TString("lego");
|
|
fHisto1dBox->Select(0);
|
|
fHisto1dBox->Resize(70,20);
|
|
|
|
// 2d histograms
|
|
fHisto2d = new TGTextButton(f2dFrame," &2D ");
|
|
fHisto2d->Connect("Clicked()","TH5MainFrame",this,"Histo2d()");
|
|
fHisto2d->Resize(70,fHisto2d->GetDefaultHeight());
|
|
|
|
fHisto2dBox = new TGComboBox(f2dFrame,"style",100);
|
|
fHisto2dBox->AddEntry("NOBIN",0); H5DrawOpt2d[0] = TString("unbinned");
|
|
fHisto2dBox->AddEntry("SCAT",1); H5DrawOpt2d[1] = TString("");
|
|
fHisto2dBox->AddEntry("BOX",2); H5DrawOpt2d[2] = TString("box");
|
|
fHisto2dBox->AddEntry("ARR",3); H5DrawOpt2d[3] = TString("arr");
|
|
fHisto2dBox->AddEntry("COLZ",4); H5DrawOpt2d[4] = TString("colz");
|
|
fHisto2dBox->AddEntry("TEXT",5); H5DrawOpt2d[5] = TString("text");
|
|
fHisto2dBox->AddEntry("CONT",6); H5DrawOpt2d[6] = TString("cont");
|
|
fHisto2dBox->AddEntry("CONTZ",7); H5DrawOpt2d[7] = TString("contz");
|
|
fHisto2dBox->AddEntry("CONT1",8); H5DrawOpt2d[8] = TString("cont1");
|
|
fHisto2dBox->AddEntry("CONT2",9); H5DrawOpt2d[9] = TString("cont2");
|
|
fHisto2dBox->AddEntry("CONT3",10); H5DrawOpt2d[10] = TString("cont3");
|
|
fHisto2dBox->AddEntry("LEGO",11); H5DrawOpt2d[11] = TString("lego");
|
|
fHisto2dBox->AddEntry("LEGO1",12); H5DrawOpt2d[12] = TString("lego1");
|
|
fHisto2dBox->AddEntry("LEGO2",13); H5DrawOpt2d[13] = TString("lego2");
|
|
fHisto2dBox->AddEntry("SURF1",14); H5DrawOpt2d[14] = TString("surf1");
|
|
fHisto2dBox->AddEntry("SURF2z",15);H5DrawOpt2d[15] = TString("surf2z");
|
|
fHisto2dBox->AddEntry("SURF3",16); H5DrawOpt2d[16] = TString("surf3");
|
|
fHisto2dBox->AddEntry("SURF4",17); H5DrawOpt2d[17] = TString("surf4");
|
|
fHisto2dBox->AddEntry("SURF1POL",18); H5DrawOpt2d[18] = TString("surf1pol");
|
|
fHisto2dBox->AddEntry("SURF1CYL",19); H5DrawOpt2d[19] = TString("surf1cyl");
|
|
fHisto2dBox->Select(0);
|
|
fHisto2dBox->Resize(70,20);
|
|
|
|
// 3d histograms
|
|
fHisto3d = new TGTextButton(f3dFrame," &3D ");
|
|
fHisto3d->Connect("Clicked()","TH5MainFrame",this,"Histo3d()");
|
|
fHisto3d->Resize(100,fHisto3d->GetDefaultHeight());
|
|
|
|
fHisto3dBox = new TGComboBox(f3dFrame,"style",100);
|
|
fHisto3dBox->AddEntry("SCAT",0); H5DrawOpt3d[0] = TString("");
|
|
fHisto3dBox->AddEntry("BOX",1); H5DrawOpt3d[1] = TString("box");
|
|
fHisto3dBox->Select(0);
|
|
fHisto3dBox->Resize(70,20);
|
|
|
|
f1dFrame->AddFrame(fHisto1d, new TGLayoutHints(kLHintsLeft,2,10,2,2));
|
|
f1dFrame->AddFrame(fHisto1dBox, new TGLayoutHints(kLHintsLeft,2,2,2,2));
|
|
|
|
f2dFrame->AddFrame(fHisto2d, new TGLayoutHints(kLHintsLeft,2,10,2,2));
|
|
f2dFrame->AddFrame(fHisto2dBox, new TGLayoutHints(kLHintsLeft,2,2,2,2));
|
|
|
|
f3dFrame->AddFrame(fHisto3d, new TGLayoutHints(kLHintsLeft,2,10,2,2));
|
|
f3dFrame->AddFrame(fHisto3dBox, new TGLayoutHints(kLHintsLeft,2,2,2,2));
|
|
|
|
fHistoFrame->AddFrame(f1dFrame, new TGLayoutHints(kLHintsLeft,2,2,10,2));
|
|
fHistoFrame->AddFrame(f2dFrame, new TGLayoutHints(kLHintsLeft,2,2,2,2));
|
|
fHistoFrame->AddFrame(f3dFrame, new TGLayoutHints(kLHintsLeft,2,2,2,2));
|
|
|
|
fHistoFrame->Resize(2000,500);
|
|
|
|
fButtonspace->AddFrame(fHistoFrame, new TGLayoutHints(kLHintsCenterX,2,2,2,2));
|
|
|
|
// group frame for line plots
|
|
fLinePlotFrame = new TGGroupFrame(fButtonspace, "Line plots",kVerticalFrame);
|
|
|
|
fSelLPFrame = new TGHorizontalFrame(fLinePlotFrame);
|
|
|
|
fSelLPFrameLeft = new TGVerticalFrame(fSelLPFrame);
|
|
fSelLPLabel1 = new TGLabel(fSelLPFrame,"Independent");
|
|
fSelLPLabel2 = new TGLabel(fSelLPFrame,"variable:");
|
|
fSelLPFrameLeft->AddFrame(fSelLPLabel1, new TGLayoutHints(kLHintsLeft,0,0,0,0));
|
|
fSelLPFrameLeft->AddFrame(fSelLPLabel2, new TGLayoutHints(kLHintsRight,0,0,0,0));
|
|
|
|
fSelLPFrameRight = new TGVerticalFrame(fSelLPFrame);
|
|
fSelLPBox = new TGComboBox(fSelLPFrameRight,"select",100);
|
|
fSelLPBox->Resize(70,20);
|
|
fSelLPFrameRight->AddFrame(fSelLPBox, new TGLayoutHints(kLHintsLeft,5,0,5,0));
|
|
|
|
fScalarLPFrame = new TGHorizontalFrame(fLinePlotFrame);
|
|
|
|
fScalar = new TGTextButton(fScalarLPFrame,"&Scalar");
|
|
fScalar->Connect("Clicked()","TH5MainFrame",this,"ScalarLinePlot()");
|
|
|
|
fScalarLPBox = new TGComboBox(fScalarLPFrame,"scalar",100);
|
|
fScalarLPBox->Resize(70,20);
|
|
|
|
fVectorLPFrame = new TGHorizontalFrame(fLinePlotFrame);
|
|
|
|
fVector = new TGTextButton(fVectorLPFrame,"&Vector");
|
|
fVector->Connect("Clicked()","TH5MainFrame",this,"VectorLinePlot()");
|
|
|
|
fVectorLPBox = new TGComboBox(fVectorLPFrame,"vector",100);
|
|
fVectorLPBox->Resize(70,20);
|
|
|
|
fSelLPFrame->AddFrame(fSelLPFrameLeft, new TGLayoutHints(kLHintsLeft,0,0,0,0));
|
|
fSelLPFrame->AddFrame(fSelLPFrameRight, new TGLayoutHints(kLHintsRight,5,0,2,0));
|
|
|
|
fScalarLPFrame->AddFrame(fScalar, new TGLayoutHints(kLHintsLeft,2,10,2,2));
|
|
fScalarLPFrame->AddFrame(fScalarLPBox, new TGLayoutHints(kLHintsLeft,2,2,2,2));
|
|
|
|
fVectorLPFrame->AddFrame(fVector, new TGLayoutHints(kLHintsLeft,2,10,2,2));
|
|
fVectorLPFrame->AddFrame(fVectorLPBox, new TGLayoutHints(kLHintsLeft,2,2,2,2));
|
|
|
|
fRadioLPFrame = new TGHorizontalFrame(fLinePlotFrame);
|
|
fRadioLPFrame->AddFrame(fRadioLP[0] = new TGRadioButton(fRadioLPFrame, "x", linePlotXID),
|
|
new TGLayoutHints(kLHintsLeft,20,2,2,2));
|
|
fRadioLPFrame->AddFrame(fRadioLP[1] = new TGRadioButton(fRadioLPFrame, "y", linePlotYID),
|
|
new TGLayoutHints(kLHintsLeft,2,2,2,2));
|
|
fRadioLPFrame->AddFrame(fRadioLP[2] = new TGRadioButton(fRadioLPFrame, "z", linePlotZID),
|
|
new TGLayoutHints(kLHintsLeft,2,2,2,2));
|
|
fRadioLP[0]->Connect("Pressed()", "TH5MainFrame", this, "DoLinePlotRadioButtons()");
|
|
fRadioLP[1]->Connect("Pressed()", "TH5MainFrame", this, "DoLinePlotRadioButtons()");
|
|
fRadioLP[2]->Connect("Pressed()", "TH5MainFrame", this, "DoLinePlotRadioButtons()");
|
|
|
|
fLinePlotFrame->AddFrame(fSelLPFrame, new TGLayoutHints(kLHintsLeft,2,2,10,2));
|
|
fLinePlotFrame->AddFrame(fScalarLPFrame, new TGLayoutHints(kLHintsLeft,2,2,10,2));
|
|
fLinePlotFrame->AddFrame(fVectorLPFrame, new TGLayoutHints(kLHintsLeft,2,2,2,2));
|
|
fLinePlotFrame->AddFrame(fRadioLPFrame, new TGLayoutHints(kLHintsLeft,2,2,2,2));
|
|
fLinePlotFrame->MapSubwindows();
|
|
|
|
fButtonspace->AddFrame(fLinePlotFrame, new TGLayoutHints(kLHintsCenterX,2,2,2,2));
|
|
|
|
fButtonspace->MapSubwindows();
|
|
fWorkspace->AddFrame(fButtonspace, fLayoutLeftflush);
|
|
|
|
fWorkspace->MapSubwindows();
|
|
AddFrame(fWorkspace, fLayoutCentered);
|
|
|
|
// Sets window name and shows the main frame
|
|
SetWindowName("H5PartROOT");
|
|
MapSubwindows();
|
|
Resize(GetDefaultSize());
|
|
MapWindow();
|
|
|
|
fLastPlot = kNoPlot;
|
|
|
|
}
|
|
|
|
TH5MainFrame::~TH5MainFrame() {
|
|
|
|
delete [] fDataset;
|
|
|
|
Cleanup(); // deletes all buttons and frames etc.
|
|
|
|
}
|
|
|
|
void TH5MainFrame::LoadFile() {
|
|
if (fFilenameBuffer->GetTextLength()==0) {
|
|
Error("LoadFile", "No filename entered!");
|
|
} else {
|
|
LoadFile(fFilenameBuffer->GetString());
|
|
}
|
|
}
|
|
|
|
void TH5MainFrame::LoadFile(const char * filename) {
|
|
|
|
FileStat_t fs;
|
|
Int_t notExist = gSystem->GetPathInfo(filename, fs);
|
|
if (notExist) {
|
|
Error("LoadFile", "There is no file named \"%s\"!",filename);
|
|
return;
|
|
}
|
|
|
|
// find the first available slot:
|
|
Int_t slot(0);
|
|
for (Int_t n=0; n<5; ++n) {
|
|
if (!fDataset[n]) {
|
|
slot = n;
|
|
break;
|
|
}
|
|
if (n==4) {
|
|
Error("LoadFile", "You have already loaded 5 files!");
|
|
return;
|
|
}
|
|
}
|
|
|
|
fDataset[slot] = new TH5Dataset(filename, fSubsamplingRate);
|
|
|
|
// update name of check button (strip path):
|
|
TString fname = fDataset[slot]->GetFilename();
|
|
Int_t nSteps = fDataset[slot]->GetNSteps();
|
|
|
|
TString bname(fname+TString(" ("));
|
|
bname+=nSteps;
|
|
bname+=TString(" steps)");
|
|
fFileButton[slot]->SetText(bname);
|
|
|
|
// ... and check the box!
|
|
fFileButton[slot]->SetState(kButtonDown);
|
|
// set file to active:
|
|
fDataset[slot]->SetState(kActive);
|
|
|
|
// warn if number of steps is larger than for first file:
|
|
if (nSteps != fDataset[0]->GetNSteps())
|
|
Warning("LoadFile","New file has %d steps, whereas first file has %d!",
|
|
nSteps,fDataset[0]->GetNSteps());
|
|
|
|
UpdateSelections();
|
|
|
|
}
|
|
|
|
void TH5MainFrame::ActivateFile(Int_t slot) {
|
|
if (fDataset[slot]->GetState() == kNotExist) {
|
|
fFileButton[slot]->SetState(kButtonDisabled);
|
|
return;
|
|
}
|
|
if (fFileButton[slot]->GetState()==kButtonUp) fDataset[slot]->SetState(kNotActive);
|
|
if (fFileButton[slot]->GetState()==kButtonDown) fDataset[slot]->SetState(kActive);
|
|
|
|
UpdateSelections();
|
|
|
|
}
|
|
|
|
void TH5MainFrame::UpdateSelections() {
|
|
|
|
// update step and variable selection (according to first selected file)
|
|
TH5Dataset* activeData[5];
|
|
Int_t nFiles(0);
|
|
GetSelFiles(activeData,nFiles);
|
|
|
|
if (activeData[0]) {
|
|
|
|
fStepSlider->SetRange(0,(activeData[0]->GetNSteps())-1);
|
|
fStepSlider->SetPosition(0);
|
|
|
|
for(Int_t i=0;i<8;i++){
|
|
EButtonState prevState = fVarButton[i]->GetState();
|
|
fVarName[i] = activeData[0]->GetPartVarName(i);
|
|
if (fVarName[i] != TString("")) {
|
|
if (prevState==kButtonDown) {
|
|
fVarButton[i]->SetState(prevState);
|
|
} else {
|
|
fVarButton[i]->SetState(kButtonUp);
|
|
}
|
|
fVarButton[i]->SetText(activeData[0]->GetPartVarName(i));
|
|
} else {
|
|
fVarName[i] = fVarNameDefault[i];
|
|
fVarButton[i]->SetState(kButtonDisabled);
|
|
}
|
|
}
|
|
|
|
Int_t prevSelEntry = fSelLPBox->GetSelected();
|
|
Int_t prevScalarEntry = fScalarLPBox->GetSelected();
|
|
Int_t prevVectorEntry = fVectorLPBox->GetSelected();
|
|
|
|
// fSelLPBox->RemoveAll(); // only in most recent version??
|
|
// fScalarLPBox->RemoveAll(); // only in most recent version??
|
|
fSelLPBox->RemoveEntries(0,fSelLPBox->GetNumberOfEntries()-1);
|
|
fScalarLPBox->RemoveEntries(0,fScalarLPBox->GetNumberOfEntries()-1);
|
|
Int_t sposID(0);
|
|
for (Int_t is = 0; is < activeData[0]->GetNScalarAttr(); is++) {
|
|
TString vname = activeData[0]->GetScalarStepVarName(is);
|
|
fSelLPBox->AddEntry(vname,is);
|
|
fScalarLPBox->AddEntry(vname,is);
|
|
if (vname=="Spos"||vname=="spos"||vname=="s") sposID = is;
|
|
}
|
|
|
|
// fVectorLPBox->RemoveAll(); // only in most recent version??
|
|
fVectorLPBox->RemoveEntries(0,fVectorLPBox->GetNumberOfEntries()-1);
|
|
for (Int_t iv = 0; iv < activeData[0]->GetNVectorAttr(); iv++) {
|
|
fVectorLPBox->AddEntry(activeData[0]->GetVectorStepVarName(iv),iv);
|
|
}
|
|
|
|
// restore previous setting if possible
|
|
if (activeData[0]->GetNScalarAttr() > prevSelEntry) {
|
|
fSelLPBox->Select(prevSelEntry);
|
|
} else {
|
|
fSelLPBox->Select(sposID);
|
|
}
|
|
if (activeData[0]->GetNScalarAttr() > prevScalarEntry) {
|
|
fScalarLPBox->Select(prevScalarEntry);
|
|
} else {
|
|
fScalarLPBox->Select(0);
|
|
}
|
|
if (activeData[0]->GetNVectorAttr() > prevVectorEntry) {
|
|
fVectorLPBox->Select(prevVectorEntry);
|
|
} else {
|
|
fVectorLPBox->Select(0);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
|
|
void TH5MainFrame::Histo1d() {
|
|
|
|
TH5Dataset* dataToPlot[5];
|
|
Int_t nFiles(0);
|
|
GetSelFiles(dataToPlot,nFiles);
|
|
|
|
switch (nFiles) {
|
|
case 0:
|
|
Error("Histo1d", "No files have been selected!");
|
|
break;
|
|
case 1:
|
|
Histo1d(dataToPlot[0]);
|
|
break;
|
|
case 2:
|
|
Histo1d(dataToPlot[0],dataToPlot[1]);
|
|
break;
|
|
case 3:
|
|
Error("Histo1d", "Histogramming for %d files not yet implemented",nFiles);
|
|
break;
|
|
case 4:
|
|
Error("Histo1d", "Histogramming for %d files not yet implemented",nFiles);
|
|
break;
|
|
case 5:
|
|
Error("Histo1d", "Histogramming for %d files not yet implemented",nFiles);
|
|
break;
|
|
default:
|
|
cout << "Huh?" << endl;
|
|
} // switch
|
|
|
|
fLastPlot = kHisto1d;
|
|
|
|
}
|
|
|
|
void TH5MainFrame::Histo1d(TH5Dataset* data) {
|
|
|
|
// Int_t step = fStepBox->GetSelected();
|
|
Int_t step = fStepSlider->GetPosition();
|
|
Int_t opt = fHisto1dBox->GetSelected();
|
|
TString drawOpt = H5DrawOpt1d[opt];
|
|
|
|
TString legEntry = TString("l");
|
|
if (drawOpt=="e1p") legEntry = TString("lp");
|
|
if (drawOpt=="e2p") legEntry = TString("fp");
|
|
|
|
TString* varToPlot[8];
|
|
Int_t nVars;
|
|
GetSelVar(varToPlot,nVars);
|
|
|
|
TCanvas *canv = fEcanvas->GetCanvas();
|
|
|
|
Double_t plotMin(0.);
|
|
Double_t plotMax(0.);
|
|
|
|
switch (nVars) {
|
|
case 0:
|
|
Error("Histo1d", "No variable has been selected!");
|
|
break;
|
|
|
|
case 1: // nVars == 1
|
|
|
|
{
|
|
TH1F* hist;
|
|
if (data) {
|
|
data->PlotRange(varToPlot[0], step, plotMin, plotMax);
|
|
hist = data->Histo1d(varToPlot[0],step,plotMin,plotMax);
|
|
if (data->GetUnit(*varToPlot[0]) != "")
|
|
hist->SetXTitle(*varToPlot[0] + AddBrackets(data->GetUnit(*varToPlot[0])));
|
|
}
|
|
canv->Clear();
|
|
canv->SetRightMargin(0.25);
|
|
|
|
if (drawOpt=="e2p") hist->SetFillColor(17);
|
|
if (drawOpt=="b") {
|
|
hist->SetBarOffset(0.2);
|
|
hist->SetBarWidth(0.75);
|
|
hist->SetFillColor(kBlack);
|
|
}
|
|
hist->Draw(drawOpt);
|
|
|
|
TH5Legend* leg = new TH5Legend(0.8,0.8,1.,0.95);
|
|
TString header(*varToPlot[0]+TString( "distribution, step "));
|
|
header+=step;
|
|
leg->AddEntry(hist, data->GetFilename(),legEntry);
|
|
leg->SetHeader(header);
|
|
leg->Draw();
|
|
|
|
canv->Update();
|
|
}
|
|
break;
|
|
case 2: // nVars == 2
|
|
|
|
TH1F* hist0 = (TH1F*) gROOT->FindObject("hist0");
|
|
if (hist0) delete hist0;
|
|
TH1F* hist1 = (TH1F*) gROOT->FindObject("hist1");
|
|
if (hist1) delete hist1;
|
|
|
|
if (data) {
|
|
data->PlotRange(varToPlot[0], step, plotMin, plotMax);
|
|
hist0 = data->Histo1d(varToPlot[0],step,plotMin,plotMax);
|
|
hist0->SetName("hist0");
|
|
if (data->GetUnit(*varToPlot[0]) != "")
|
|
hist0->SetXTitle(*varToPlot[0] + AddBrackets(data->GetUnit(*varToPlot[0])));
|
|
data->PlotRange(varToPlot[1], step, plotMin, plotMax);
|
|
hist1 = data->Histo1d(varToPlot[1],step,plotMin,plotMax);
|
|
hist1->SetName("hist1");
|
|
if (data->GetUnit(*varToPlot[1]) != "")
|
|
hist1->SetXTitle(*varToPlot[1] + AddBrackets(data->GetUnit(*varToPlot[1])));
|
|
}
|
|
|
|
canv->Clear();
|
|
canv->Divide(2,1);
|
|
|
|
if (drawOpt=="e2p") {
|
|
hist0->SetFillColor(17);hist1->SetFillColor(17);
|
|
}
|
|
if (drawOpt=="b") {
|
|
hist0->SetBarOffset(0.2);hist1->SetBarOffset(0.2);
|
|
hist0->SetBarWidth(0.75);hist1->SetBarWidth(0.75);
|
|
hist0->SetFillColor(kBlack);hist1->SetFillColor(kBlack);
|
|
}
|
|
|
|
canv->cd(1);
|
|
hist0->Draw(drawOpt);
|
|
TH5Legend* leg0 = new TH5Legend(0.7,0.75,.9,0.9);
|
|
leg0->AddEntry(hist0, data->GetFilename(),legEntry);
|
|
leg0->SetHeader(*varToPlot[0]+TString(" distribution"));
|
|
leg0->Draw();
|
|
|
|
canv->cd(2);
|
|
hist1->Draw(drawOpt);
|
|
TH5Legend* leg1 = new TH5Legend(0.7,0.75,.9,0.9);
|
|
leg1->AddEntry(hist1, data->GetFilename(),legEntry);
|
|
leg1->SetHeader(*varToPlot[1]+TString(" distribution"));
|
|
leg1->Draw();
|
|
|
|
break;
|
|
case 3: // nVars == 3
|
|
Error("Histo1d", "Histogramming for %d variables not yet implemented",nVars);
|
|
break;
|
|
case 4: // nVars == 4
|
|
Error("Histo1d", "Histogramming for %d variables not yet implemented",nVars);
|
|
break;
|
|
case 5: // nVars == 5
|
|
Error("Histo1d", "Histogramming for %d variables not yet implemented",nVars);
|
|
break;
|
|
case 6: // nVars == 6
|
|
Error("Histo1d", "Histogramming for %d variables not yet implemented",nVars);
|
|
break;
|
|
default:
|
|
cout << "Huh?" << endl;
|
|
}//switch
|
|
|
|
canv->Update();
|
|
|
|
}
|
|
|
|
void TH5MainFrame::Histo1d(TH5Dataset* data0, TH5Dataset* data1) {
|
|
|
|
Int_t step = fStepSlider->GetPosition();
|
|
Int_t opt = fHisto1dBox->GetSelected();
|
|
|
|
TString drawOpt = H5DrawOpt1d[opt];
|
|
TString drawOptSame = H5DrawOpt1d[opt]+TString("same");
|
|
|
|
TString legEntry = TString("l");
|
|
if (drawOpt=="e1p") legEntry = TString("lp");
|
|
if (drawOpt=="e2p") legEntry = TString("fp");
|
|
|
|
if (opt!=0) Warning("Histo1d", "Drawing option %s may give weird results for two files!", drawOpt.Data());
|
|
|
|
TString* varToPlot[8];
|
|
Int_t nVars;
|
|
GetSelVar(varToPlot,nVars);
|
|
|
|
TCanvas *canv = fEcanvas->GetCanvas();
|
|
canv->Clear();
|
|
canv->SetRightMargin(0.25);
|
|
|
|
Double_t plotMin(0.);
|
|
Double_t plotMax(0.);
|
|
Double_t min0(0.);
|
|
Double_t max0(0.);
|
|
Double_t min1(0.);
|
|
Double_t max1(0.);
|
|
|
|
switch (nVars) {
|
|
case 0:
|
|
Error("Histo1d", "No variables have been selected");
|
|
break;
|
|
|
|
case 1: { // nVars == 1
|
|
TH1F* hist0 = (TH1F*) gROOT->FindObject("hist0");
|
|
if (hist0) delete hist0;
|
|
TH1F* hist1 = (TH1F*) gROOT->FindObject("hist1");
|
|
if (hist1) delete hist1;
|
|
|
|
if (data0) data0->Range(varToPlot[0], step, min0, max0);
|
|
if (data1) data1->Range(varToPlot[0], step, min1, max1);
|
|
plotMin = min0 <? min1;
|
|
plotMax = max0 >? max1;
|
|
AddMargin(plotMin,plotMax);
|
|
|
|
if (data0) hist0 = data0->Histo1d(varToPlot[0], step, plotMin, plotMax);
|
|
hist0->SetName("hist0");
|
|
if (data1) hist1 = data1->Histo1d(varToPlot[0], step, plotMin, plotMax);
|
|
hist1->SetName("hist1");
|
|
|
|
if (data0->GetUnit(*varToPlot[0]) == data1->GetUnit(*varToPlot[0])) {
|
|
if (data0->GetUnit(*varToPlot[0]) != "") {
|
|
hist0->SetXTitle(*varToPlot[0] + AddBrackets(data0->GetUnit(*varToPlot[0])));
|
|
}
|
|
} else {
|
|
Warning("Histo1d","Inconsistent units between files %s and %s",
|
|
data0->GetFilename().Data(),data1->GetFilename().Data());
|
|
if (data0->GetUnit(*varToPlot[0]) != "") {
|
|
hist0->SetXTitle(*varToPlot[0] + AddBrackets(data0->GetUnit(*varToPlot[0])));
|
|
} else if (data0->GetUnit(*varToPlot[0]) != "") {
|
|
hist0->SetXTitle(*varToPlot[0] + AddBrackets(data0->GetUnit(*varToPlot[0])));
|
|
}
|
|
}
|
|
|
|
if (drawOpt=="e2p") {
|
|
hist0->SetFillColor(15);hist1->SetFillColor(18);
|
|
}
|
|
|
|
hist1->SetLineStyle(kDashed);
|
|
hist1->SetMarkerStyle(25);
|
|
|
|
if (hist0->GetMaximum() > hist1->GetMaximum()) {
|
|
hist0->Draw(drawOpt); hist1->Draw(drawOptSame);
|
|
} else {
|
|
hist1->Draw(drawOpt); hist0->Draw(drawOptSame);
|
|
}
|
|
|
|
TH5Legend* leg = new TH5Legend(0.8,0.8,1.,0.95);
|
|
leg->AddEntry(hist0, data0->GetFilename(),legEntry);
|
|
leg->AddEntry(hist1, data1->GetFilename(),legEntry);
|
|
leg->SetHeader(*varToPlot[0]+TString(" distribution"));
|
|
leg->Draw();
|
|
|
|
break; }
|
|
|
|
case 2: { // nVars == 2
|
|
|
|
TH1F* hist00 = (TH1F*) gROOT->FindObject("hist00");
|
|
if (hist00) delete hist00;
|
|
TH1F* hist01 = (TH1F*) gROOT->FindObject("hist01");
|
|
if (hist01) delete hist01;
|
|
TH1F* hist10 = (TH1F*) gROOT->FindObject("hist10");
|
|
if (hist10) delete hist10;
|
|
TH1F* hist11 = (TH1F*) gROOT->FindObject("hist11");
|
|
if (hist11) delete hist11;
|
|
|
|
if (data0) data0->Range(varToPlot[0], step, min0, max0);
|
|
if (data1) data1->Range(varToPlot[0], step, min1, max1);
|
|
plotMin = min0 <? min1;
|
|
plotMax = max0 >? max1;
|
|
AddMargin(plotMin,plotMax);
|
|
|
|
if (data0) hist00 = data0->Histo1d(varToPlot[0], step, plotMin, plotMax);
|
|
hist00->SetName("hist00");
|
|
if (data1) hist10 = data1->Histo1d(varToPlot[0], step, plotMin, plotMax);
|
|
hist10->SetName("hist10");
|
|
|
|
if (data0->GetUnit(*varToPlot[0]) == data1->GetUnit(*varToPlot[0])) {
|
|
if (data0->GetUnit(*varToPlot[0]) != "") {
|
|
hist00->SetXTitle(*varToPlot[0] + AddBrackets(data0->GetUnit(*varToPlot[0])));
|
|
}
|
|
} else {
|
|
Warning("Histo1d","Inconsistent units between files %s and %s",
|
|
data0->GetFilename().Data(),data1->GetFilename().Data());
|
|
if (data0->GetUnit(*varToPlot[0]) != "") {
|
|
hist00->SetXTitle(*varToPlot[0] + AddBrackets(data0->GetUnit(*varToPlot[0])));
|
|
} else if (data0->GetUnit(*varToPlot[0]) != "") {
|
|
hist00->SetXTitle(*varToPlot[0] + AddBrackets(data0->GetUnit(*varToPlot[0])));
|
|
}
|
|
}
|
|
|
|
if (data0) data0->Range(varToPlot[1], step, min0, max0);
|
|
if (data1) data1->Range(varToPlot[1], step, min1, max1);
|
|
plotMin = min0 <? min1;
|
|
plotMax = max0 >? max1;
|
|
AddMargin(plotMin,plotMax);
|
|
|
|
if (data0) hist01 = data0->Histo1d(varToPlot[1], step, plotMin, plotMax);
|
|
hist01->SetName("hist01");
|
|
if (data1) hist11 = data1->Histo1d(varToPlot[1], step, plotMin, plotMax);
|
|
hist11->SetName("hist11");
|
|
|
|
if (data0->GetUnit(*varToPlot[1]) == data1->GetUnit(*varToPlot[1])) {
|
|
if (data0->GetUnit(*varToPlot[1]) != "") {
|
|
hist01->SetXTitle(*varToPlot[1] + AddBrackets(data0->GetUnit(*varToPlot[1])));
|
|
}
|
|
} else {
|
|
Warning("Histo1d","Inconsistent units between files %s and %s",
|
|
data0->GetFilename().Data(),data1->GetFilename().Data());
|
|
if (data0->GetUnit(*varToPlot[1]) != "") {
|
|
hist01->SetXTitle(*varToPlot[1] + AddBrackets(data0->GetUnit(*varToPlot[1])));
|
|
} else if (data0->GetUnit(*varToPlot[1]) != "") {
|
|
hist01->SetXTitle(*varToPlot[1] + AddBrackets(data0->GetUnit(*varToPlot[1])));
|
|
}
|
|
}
|
|
|
|
if (drawOpt=="e2p") {
|
|
hist00->SetFillColor(15);hist10->SetFillColor(18);
|
|
hist01->SetFillColor(15);hist11->SetFillColor(18);
|
|
}
|
|
|
|
canv->Clear();
|
|
canv->Divide(2,1);
|
|
|
|
canv->cd(1);
|
|
|
|
hist10->SetLineStyle(kDashed);
|
|
hist10->SetMarkerStyle(25);
|
|
|
|
if (hist00->GetMaximum() > hist10->GetMaximum()) {
|
|
hist00->Draw(drawOpt); hist10->Draw(drawOptSame);
|
|
} else {
|
|
hist10->Draw(drawOpt); hist00->Draw(drawOptSame);
|
|
}
|
|
|
|
TH5Legend* leg0 = new TH5Legend(0.7,0.75,.9,0.9);
|
|
leg0->AddEntry(hist00, data0->GetFilename(),legEntry);
|
|
leg0->AddEntry(hist10, data1->GetFilename(),legEntry);
|
|
leg0->SetHeader(*varToPlot[0]+TString(" distribution"));
|
|
leg0->Draw();
|
|
|
|
canv->cd(2);
|
|
|
|
hist11->SetLineStyle(kDashed);
|
|
hist11->SetMarkerStyle(25);
|
|
|
|
if (hist01->GetMaximum() > hist11->GetMaximum()) {
|
|
hist01->Draw(drawOpt); hist11->Draw(drawOptSame);
|
|
} else {
|
|
hist11->Draw(drawOpt); hist01->Draw(drawOptSame);
|
|
}
|
|
|
|
TH5Legend* leg1 = new TH5Legend(0.7,0.75,.9,0.9);
|
|
leg1->AddEntry(hist01, data0->GetFilename(),legEntry);
|
|
leg1->AddEntry(hist11, data1->GetFilename(),legEntry);
|
|
leg1->SetHeader(*varToPlot[1] + TString(" distribution"));
|
|
leg1->Draw();
|
|
|
|
break; }
|
|
case 3: // nVars == 3
|
|
Error("Histo1d", "Histogramming for %d variables not yet implemented",nVars);
|
|
break;
|
|
case 4: // nVars == 4
|
|
Error("Histo1d", "Histogramming for %d variables not yet implemented",nVars);
|
|
break;
|
|
case 5: // nVars == 5
|
|
Error("Histo1d", "Histogramming for %d variables not yet implemented",nVars);
|
|
break;
|
|
case 6: // nVars == 6
|
|
Error("Histo1d", "Histogramming for %d variables not yet implemented",nVars);
|
|
break;
|
|
default:
|
|
cout << "Huh?" << endl;
|
|
} //switch
|
|
|
|
canv->Update();
|
|
|
|
|
|
}
|
|
|
|
void TH5MainFrame::Histo2d() {
|
|
|
|
TH5Dataset* dataToPlot[5];
|
|
Int_t nFiles(0);
|
|
GetSelFiles(dataToPlot,nFiles);
|
|
|
|
switch (nFiles) {
|
|
case 0:
|
|
Error("Histo2d", "No files have been selected!");
|
|
break;
|
|
case 1:
|
|
Histo2d(dataToPlot[0]);
|
|
break;
|
|
case 2:
|
|
Error("Histo2d", "2d histogram for %d files not yet implemented",nFiles);
|
|
break;
|
|
case 3:
|
|
Error("Histo2d", "2d histogram for %d files not yet implemented",nFiles);
|
|
break;
|
|
case 4:
|
|
Error("Histo2d", "2d histogram for %d files not yet implemented",nFiles);
|
|
break;
|
|
case 5:
|
|
Error("Histo2d", "2d histogram for %d files not yet implemented",nFiles);
|
|
break;
|
|
default:
|
|
cout << "Huh?" << endl;
|
|
} // switch
|
|
|
|
fLastPlot = kHisto2d;
|
|
|
|
}
|
|
|
|
void TH5MainFrame::Histo2d(TH5Dataset* data) {
|
|
|
|
Int_t step = fStepSlider->GetPosition();
|
|
Int_t opt = fHisto2dBox->GetSelected();
|
|
|
|
TString* varToPlot[8];
|
|
Int_t nVars;
|
|
GetSelVar(varToPlot,nVars);
|
|
|
|
TCanvas *canv = fEcanvas->GetCanvas();
|
|
|
|
canv->Clear();
|
|
if (H5DrawOpt2d[opt]=="colz"||H5DrawOpt2d[opt]=="contz"||H5DrawOpt2d[opt]=="surf2z") {
|
|
canv->SetRightMargin(0.35);
|
|
} else {
|
|
canv->SetRightMargin(0.25);
|
|
}
|
|
|
|
Double_t plotMinX(0.);
|
|
Double_t plotMaxX(0.);
|
|
Double_t plotMinY(0.);
|
|
Double_t plotMaxY(0.);
|
|
|
|
switch (nVars) {
|
|
case 0:
|
|
Error("Histo2d", "No variable has been selected!");
|
|
break;
|
|
|
|
case 1: // nVars == 1
|
|
|
|
{
|
|
TH2F* hist;
|
|
if (data) {
|
|
data->PlotRange(varToPlot[0], step, plotMinX, plotMaxX);
|
|
hist = data->Histo2d(varToPlot[0],varToPlot[0],step,plotMinX,plotMaxX,plotMinX,plotMaxX);
|
|
if (data->GetUnit(*varToPlot[0]) != "") {
|
|
hist->SetXTitle(*varToPlot[0] + AddBrackets(data->GetUnit(*varToPlot[0])));
|
|
hist->SetYTitle(*varToPlot[0] + AddBrackets(data->GetUnit(*varToPlot[0])));
|
|
}
|
|
}
|
|
hist->SetMarkerStyle(1);
|
|
hist->Draw(H5DrawOpt2d[opt]);
|
|
|
|
TH5Legend* leg = new TH5Legend(0.8,0.8,1.,0.95);
|
|
TString header(*varToPlot[0]+TString("-") + *varToPlot[0] +
|
|
TString(" distr., step "));
|
|
header+=step;
|
|
leg->AddEntry(hist, data->GetFilename(),"p");
|
|
leg->SetHeader(header);
|
|
leg->Draw();
|
|
|
|
canv->Update();
|
|
}
|
|
break;
|
|
case 2: // nVars == 2
|
|
|
|
{
|
|
TH2F* hist;
|
|
if (data) {
|
|
data->PlotRange(varToPlot[0], step, plotMinX, plotMaxX);
|
|
data->PlotRange(varToPlot[1], step, plotMinY, plotMaxY);
|
|
hist = data->Histo2d(varToPlot[0],varToPlot[1],step,plotMinX,plotMaxX,plotMinY,plotMaxY);
|
|
if (data->GetUnit(*varToPlot[0]) != "")
|
|
hist->SetXTitle(*varToPlot[0] + AddBrackets(data->GetUnit(*varToPlot[0])));
|
|
if (data->GetUnit(*varToPlot[1]) != "")
|
|
hist->SetYTitle(*varToPlot[1] + AddBrackets(data->GetUnit(*varToPlot[1])));
|
|
}
|
|
hist->SetMarkerStyle(1);
|
|
|
|
if (H5DrawOpt2d[opt]=="unbinned") { // true scatter plot
|
|
canv->Clear();
|
|
TH1F* shist = data->Scatter(varToPlot[0],varToPlot[1],canv,step,plotMinX,plotMaxX,plotMinY,plotMaxY);
|
|
if (data->GetUnit(*varToPlot[0]) != "")
|
|
shist->SetXTitle(*varToPlot[0] + AddBrackets(data->GetUnit(*varToPlot[0])));
|
|
if (data->GetUnit(*varToPlot[1]) != "")
|
|
shist->SetYTitle(*varToPlot[1] + AddBrackets(data->GetUnit(*varToPlot[1])));
|
|
} else {
|
|
hist->Draw(H5DrawOpt2d[opt]);
|
|
}
|
|
|
|
TH5Legend* leg = new TH5Legend(0.8,0.8,1.,0.95);
|
|
TString header(*varToPlot[0] + TString("-") + *varToPlot[1] +
|
|
TString(" distr., step "));
|
|
header+=step;
|
|
leg->AddEntry(hist, data->GetFilename(),"p");
|
|
leg->SetHeader(header);
|
|
leg->Draw();
|
|
|
|
canv->Update();
|
|
}
|
|
break;
|
|
case 3: // nVars == 3
|
|
Error("Histo2d", "Cannot produce 2d histogram with %d variables!",nVars);
|
|
break;
|
|
case 4: // nVars == 4
|
|
Error("Histo2d", "2d histogram for %d variables not yet implemented",nVars);
|
|
break;
|
|
case 5: // nVars == 5
|
|
Error("Histo2d", "Cannot produce 2d histogram with %d variables!",nVars);
|
|
break;
|
|
case 6: // nVars == 6
|
|
Error("Histo2d", "2d histogram for %d variables not yet implemented",nVars);
|
|
break;
|
|
default:
|
|
cout << "Huh?" << endl;
|
|
}//switch
|
|
|
|
}
|
|
|
|
void TH5MainFrame::Histo3d() {
|
|
|
|
TH5Dataset* dataToPlot[5];
|
|
Int_t nFiles(0);
|
|
GetSelFiles(dataToPlot,nFiles);
|
|
|
|
switch (nFiles) {
|
|
case 0:
|
|
Error("Histo3d", "No files have been selected!");
|
|
break;
|
|
case 1:
|
|
Histo3d(dataToPlot[0]);
|
|
break;
|
|
case 2:
|
|
Error("Histo3d", "3d histogram for %d files not yet implemented",nFiles);
|
|
break;
|
|
case 3:
|
|
Error("Histo3d", "3d histogram for %d files not yet implemented",nFiles);
|
|
break;
|
|
case 4:
|
|
Error("Histo3d", "3d histogram for %d files not yet implemented",nFiles);
|
|
break;
|
|
case 5:
|
|
Error("Histo3d", "3d histogram for %d files not yet implemented",nFiles);
|
|
break;
|
|
default:
|
|
cout << "Huh?" << endl;
|
|
} // switch
|
|
|
|
fLastPlot = kHisto3d;
|
|
|
|
}
|
|
|
|
void TH5MainFrame::Histo3d(TH5Dataset* data) {
|
|
|
|
Int_t step = fStepSlider->GetPosition();
|
|
Int_t opt = fHisto3dBox->GetSelected();
|
|
|
|
TString* varToPlot[8];
|
|
Int_t nVars;
|
|
GetSelVar(varToPlot,nVars);
|
|
|
|
TCanvas *canv = fEcanvas->GetCanvas();
|
|
|
|
canv->Clear();
|
|
canv->SetRightMargin(0.50); // is ignored by TH3F...
|
|
|
|
Double_t plotMinX(0.);
|
|
Double_t plotMaxX(0.);
|
|
Double_t plotMinY(0.);
|
|
Double_t plotMaxY(0.);
|
|
Double_t plotMinZ(0.);
|
|
Double_t plotMaxZ(0.);
|
|
|
|
switch (nVars) {
|
|
case 0:
|
|
Error("Histo3d", "No variable has been selected!");
|
|
break;
|
|
|
|
case 1: // nVars == 1
|
|
Error("Histo3d", "Cannot produce 3d histogram with %d variables",nVars);
|
|
break;
|
|
case 2: // nVars == 2
|
|
Error("Histo3d", "Cannot produce 3d histogram with %d variables",nVars);
|
|
break;
|
|
case 3: // nVars == 3
|
|
{
|
|
|
|
TH3F* hist;
|
|
if (data) {
|
|
data->PlotRange(varToPlot[0], step, plotMinX, plotMaxX);
|
|
data->PlotRange(varToPlot[1], step, plotMinY, plotMaxY);
|
|
data->PlotRange(varToPlot[2], step, plotMinZ, plotMaxZ);
|
|
hist = data->Histo3d(varToPlot[0],varToPlot[1],varToPlot[2],step,
|
|
plotMinX,plotMaxX,plotMinY,plotMaxY,plotMinZ,plotMaxZ);
|
|
if (data->GetUnit(*varToPlot[0]) != "")
|
|
hist->SetXTitle(*varToPlot[0] + AddBrackets(data->GetUnit(*varToPlot[0])));
|
|
if (data->GetUnit(*varToPlot[1]) != "")
|
|
hist->SetYTitle(*varToPlot[1] + AddBrackets(data->GetUnit(*varToPlot[1])));
|
|
if (data->GetUnit(*varToPlot[2]) != "")
|
|
hist->SetZTitle(*varToPlot[2] + AddBrackets(data->GetUnit(*varToPlot[2])));
|
|
}
|
|
hist->SetMarkerStyle(6);
|
|
hist->Draw(H5DrawOpt3d[opt]);
|
|
|
|
TH5Legend* leg = new TH5Legend(0.8,0.8,1.,0.95);
|
|
TString header(*varToPlot[0] + TString("-") + *varToPlot[1] +
|
|
TString("-") + *varToPlot[2] + TString(" distr., step "));
|
|
header += step;
|
|
leg->AddEntry(hist, data->GetFilename(),"p");
|
|
leg->SetHeader(header);
|
|
leg->Draw();
|
|
|
|
canv->Update();
|
|
}
|
|
break;
|
|
case 4: // nVars == 4
|
|
Error("Histo3d", "3d histogram for %d variables not yet implemented",nVars);
|
|
break;
|
|
case 5: // nVars == 5
|
|
Error("Histo3d", "3d histogram for %d variables not yet implemented",nVars);
|
|
break;
|
|
case 6: // nVars == 6
|
|
Error("Histo3d", "3d histogram for %d variables not yet implemented",nVars);
|
|
break;
|
|
default:
|
|
cout << "Huh?" << endl;
|
|
}//switch
|
|
|
|
}
|
|
|
|
void TH5MainFrame::ScalarLinePlot() {
|
|
|
|
// determine active datafiles
|
|
TH5Dataset* dataToPlot[5];
|
|
Int_t nFiles(0);
|
|
GetSelFiles(dataToPlot,nFiles);
|
|
|
|
// get selected variables
|
|
TString stepVarNameX;
|
|
TString stepVarNameY;
|
|
if (nFiles) {
|
|
stepVarNameX = TString(fSelLPBox->GetSelectedEntry()->GetTitle());
|
|
stepVarNameY = TString(fScalarLPBox->GetSelectedEntry()->GetTitle());
|
|
}
|
|
|
|
switch (nFiles) {
|
|
case 0:
|
|
Error("ScalarLinePlot", "No files have been selected!");
|
|
break;
|
|
case 1:
|
|
LinePlot(dataToPlot[0],stepVarNameX,stepVarNameY,kScalar);
|
|
break;
|
|
case 2:
|
|
LinePlot(dataToPlot[0],dataToPlot[1],stepVarNameX,stepVarNameY,kScalar);
|
|
break;
|
|
case 3:
|
|
Error("ScalarLinePlot", "LinePlot for %d files not yet implemented",nFiles);
|
|
break;
|
|
case 4:
|
|
Error("ScalarLinePlot", "LinePlot for %d files not yet implemented",nFiles);
|
|
break;
|
|
case 5:
|
|
Error("ScalarLinePlot", "LinePlot for %d files not yet implemented",nFiles);
|
|
break;
|
|
default:
|
|
cout << "Huh?" << endl;
|
|
} // switch
|
|
|
|
fLastPlot = kScalarLinePlot;
|
|
}
|
|
|
|
void TH5MainFrame::VectorLinePlot() {
|
|
|
|
// determine active datafiles
|
|
TH5Dataset* dataToPlot[5];
|
|
Int_t nFiles(0);
|
|
GetSelFiles(dataToPlot,nFiles);
|
|
|
|
// get selected variables
|
|
TString stepVarNameX;
|
|
TString stepVarNameY;
|
|
if (nFiles) {
|
|
stepVarNameX = TString(fSelLPBox->GetSelectedEntry()->GetTitle());
|
|
stepVarNameY = TString(fVectorLPBox->GetSelectedEntry()->GetTitle());
|
|
}
|
|
|
|
// get selected coordinate:
|
|
EH5Coord crd;
|
|
if (kButtonDown == fRadioLP[2]->GetState()) crd = kZ;
|
|
if (kButtonDown == fRadioLP[1]->GetState()) crd = kY;
|
|
if (kButtonDown == fRadioLP[0]->GetState()) crd = kX;
|
|
|
|
switch (nFiles) {
|
|
case 0:
|
|
Error("VectorLinePlot", "No files have been selected!");
|
|
break;
|
|
case 1:
|
|
LinePlot(dataToPlot[0],stepVarNameX,stepVarNameY,crd);
|
|
break;
|
|
case 2:
|
|
LinePlot(dataToPlot[0],dataToPlot[1],stepVarNameX,stepVarNameY,crd);
|
|
break;
|
|
case 3:
|
|
Error("VectorLinePlot", "LinePlot for %d files not yet implemented",nFiles);
|
|
break;
|
|
case 4:
|
|
Error("VectorLinePlot", "LinePlot for %d files not yet implemented",nFiles);
|
|
break;
|
|
case 5:
|
|
Error("VectorLinePlot", "LinePlot for %d files not yet implemented",nFiles);
|
|
break;
|
|
default:
|
|
cout << "Huh?" << endl;
|
|
} // switch
|
|
|
|
fLastPlot = kVectorLinePlot;
|
|
}
|
|
|
|
void TH5MainFrame::LinePlot(const TH5Dataset* data, const TString stepVarNameX,
|
|
const TString stepVarNameY, const EH5Coord coord) {
|
|
|
|
TString coordName;
|
|
if (coord==kScalar) coordName = TString("");
|
|
if (coord==kX) coordName = TString(" (x) ");
|
|
if (coord==kY) coordName = TString(" (y) ");
|
|
if (coord==kZ) coordName = TString(" (z) ");
|
|
|
|
Int_t nStep = data->GetNSteps();
|
|
|
|
Double_t varX[nStep];
|
|
Double_t varY[nStep];
|
|
|
|
Double_t varXMin = 1.e20;
|
|
Double_t varXMax = -1.e20;
|
|
Double_t varYMin = 1.e20;
|
|
Double_t varYMax = -1.e20;
|
|
|
|
TCanvas *canv = fEcanvas->GetCanvas();
|
|
canv->SetRightMargin(0.25);
|
|
|
|
for(Int_t step = 0; step < nStep; step++){
|
|
varX[step] = data->GetStepVar(stepVarNameX,kScalar,step);
|
|
if (varX[step] < varXMin) varXMin = varX[step];
|
|
if (varX[step] > varXMax) varXMax = varX[step];
|
|
|
|
varY[step] = data->GetStepVar(stepVarNameY,coord,step);
|
|
|
|
if (varY[step] < varYMin) varYMin = varY[step];
|
|
if (varY[step] > varYMax) varYMax = varY[step];
|
|
}
|
|
|
|
AddMargin(varXMin,varXMax);
|
|
AddMargin(varYMin,varYMax);
|
|
|
|
TH2F *linePlot = static_cast<TH2F*>(gROOT->FindObject("linePlot"));
|
|
if (linePlot) delete linePlot;
|
|
|
|
linePlot = new TH2F("linePlot","line plot",
|
|
200,varXMin,varXMax,200,varYMin,varYMax);
|
|
canv->Clear();
|
|
linePlot->SetStats(kFALSE);
|
|
linePlot->Draw();
|
|
|
|
TGraph* varGraph = new TGraph(nStep,varX,varY);
|
|
varGraph->Draw("LP");
|
|
|
|
TString varXTitle = stepVarNameX;
|
|
TString varYTitle = stepVarNameY+coordName;
|
|
|
|
if (data->GetUnit(stepVarNameX) != "")
|
|
varXTitle += AddBrackets(data->GetUnit(stepVarNameX));
|
|
if (data->GetUnit(stepVarNameY) != "")
|
|
varYTitle += AddBrackets(data->GetUnit(stepVarNameY));
|
|
|
|
TH5Legend* leg = new TH5Legend(0.8,0.8,1.,0.95);
|
|
leg->AddEntry(varGraph, data->GetFilename(),"lp");
|
|
leg->SetHeader("line plot");
|
|
leg->Draw();
|
|
|
|
linePlot->SetYTitle(varYTitle);
|
|
linePlot->SetXTitle(varXTitle);
|
|
canv->Update();
|
|
|
|
}
|
|
|
|
void TH5MainFrame::LinePlot(const TH5Dataset* data0, const TH5Dataset* data1,
|
|
const TString stepVarNameX, const TString stepVarNameY,
|
|
const EH5Coord coord) {
|
|
|
|
TString coordName;
|
|
if (coord==kScalar) coordName = TString("");
|
|
if (coord==kX) coordName = TString(" (x) ");
|
|
if (coord==kY) coordName = TString(" (y) ");
|
|
if (coord==kZ) coordName = TString(" (z) ");
|
|
|
|
Int_t nStep0 = data0->GetNSteps();
|
|
Int_t nStep1 = data1->GetNSteps();
|
|
|
|
Double_t varY0[nStep0];
|
|
Double_t varX0[nStep0];
|
|
Double_t varY1[nStep1];
|
|
Double_t varX1[nStep1];
|
|
|
|
Double_t varXMin0 = 1.e20;
|
|
Double_t varXMax0 = -1.e20;
|
|
Double_t varYMin0 = 1.e20;
|
|
Double_t varYMax0 = -1.e20;
|
|
Double_t varXMin1 = 1.e20;
|
|
Double_t varXMax1 = -1.e20;
|
|
Double_t varYMin1 = 1.e20;
|
|
Double_t varYMax1 = -1.e20;
|
|
|
|
TCanvas *canv = fEcanvas->GetCanvas();
|
|
canv->SetRightMargin(0.25);
|
|
|
|
for(Int_t step = 0; step < nStep0; step++){
|
|
varX0[step] = data0->GetStepVar(stepVarNameX,kScalar,step);
|
|
if (varX0[step] < varXMin0) varXMin0 = varX0[step];
|
|
if (varX0[step] > varXMax0) varXMax0 = varX0[step];
|
|
|
|
varY0[step] = data0->GetStepVar(stepVarNameY,coord,step);
|
|
if (varY0[step] < varYMin0) varYMin0 = varY0[step];
|
|
if (varY0[step] > varYMax0) varYMax0 = varY0[step];
|
|
}
|
|
|
|
for(Int_t step = 0; step < nStep1; step++){
|
|
varX1[step] = data1->GetStepVar(stepVarNameX,kScalar,step);
|
|
if (varX1[step] < varXMin1) varXMin1 = varX1[step];
|
|
if (varX1[step] > varXMax1) varXMax1 = varX1[step];
|
|
|
|
varY1[step] = data1->GetStepVar(stepVarNameY,coord,step);
|
|
if (varY1[step] < varYMin1) varYMin1 = varY1[step];
|
|
if (varY1[step] > varYMax1) varYMax1 = varY1[step];
|
|
}
|
|
|
|
Double_t varXMin = varXMin0 <? varXMin1;
|
|
Double_t varXMax = varXMax0 >? varXMax1;
|
|
Double_t varYMin = varYMin0 <? varYMin1;
|
|
Double_t varYMax = varYMax0 >? varYMax1;
|
|
|
|
AddMargin(varXMin,varXMax);
|
|
AddMargin(varYMin,varYMax);
|
|
|
|
TH2F *linePlot = static_cast<TH2F*>(gROOT->FindObject("linePlot"));
|
|
if (linePlot) delete linePlot;
|
|
|
|
linePlot = new TH2F("linePlot","line plot",
|
|
200,varXMin,varXMax,200,varYMin,varYMax);
|
|
canv->Clear();
|
|
linePlot->SetStats(kFALSE);
|
|
linePlot->Draw();
|
|
|
|
TGraph* varGraph0 = new TGraph(nStep0,varX0,varY0);
|
|
varGraph0->SetMarkerStyle(20);
|
|
varGraph0->SetLineStyle(kSolid);
|
|
|
|
TGraph* varGraph1 = new TGraph(nStep1,varX1,varY1);
|
|
varGraph1->SetMarkerStyle(25);
|
|
varGraph1->SetLineStyle(kDashed);
|
|
|
|
varGraph0->Draw("LP");
|
|
varGraph1->Draw("LPsame");
|
|
|
|
TString varXTitle = stepVarNameX;
|
|
TString varYTitle = stepVarNameY+coordName;
|
|
|
|
if (data0->GetUnit(stepVarNameX) == data1->GetUnit(stepVarNameX)) {
|
|
if (data0->GetUnit(stepVarNameX) != "") {
|
|
varXTitle += AddBrackets(data0->GetUnit(stepVarNameX));
|
|
}
|
|
} else {
|
|
Warning("LinePlot","Inconsistent units between files %s and %s",
|
|
data0->GetFilename().Data(),data1->GetFilename().Data());
|
|
if (data0->GetUnit(stepVarNameX) != "") {
|
|
varXTitle += AddBrackets(data0->GetUnit(stepVarNameX));
|
|
} else if (data1->GetUnit(stepVarNameX) != "") {
|
|
varXTitle += AddBrackets(data1->GetUnit(stepVarNameX));
|
|
}
|
|
}
|
|
|
|
if (data0->GetUnit(stepVarNameY) == data1->GetUnit(stepVarNameY)) {
|
|
if (data0->GetUnit(stepVarNameY) != "") {
|
|
varYTitle += AddBrackets(data0->GetUnit(stepVarNameY));
|
|
}
|
|
} else {
|
|
Warning("LinePlot","Inconsistent units between files %s and %s",
|
|
data0->GetFilename().Data(),data1->GetFilename().Data());
|
|
if (data0->GetUnit(stepVarNameY) != "") {
|
|
varYTitle += AddBrackets(data0->GetUnit(stepVarNameY));
|
|
} else if (data1->GetUnit(stepVarNameY) != "") {
|
|
varYTitle += AddBrackets(data1->GetUnit(stepVarNameY));
|
|
}
|
|
}
|
|
|
|
|
|
TH5Legend* leg = new TH5Legend(0.8,0.8,1.,0.95);
|
|
leg->AddEntry(varGraph0, data0->GetFilename(),"lp");
|
|
leg->AddEntry(varGraph1, data1->GetFilename(),"lp");
|
|
leg->SetHeader("line plot");
|
|
leg->Draw();
|
|
|
|
linePlot->SetYTitle(varYTitle);
|
|
linePlot->SetXTitle(varXTitle);
|
|
canv->Update();
|
|
|
|
}
|
|
|
|
void TH5MainFrame::GetSelVar(TString* selVarName[8], Int_t& nv) {
|
|
|
|
nv=0;
|
|
Int_t iter(0);
|
|
for (Int_t n=0; n<8; ++n) {
|
|
selVarName[n] = NULL;
|
|
if (fVarName[n]) {
|
|
if (fVarButton[n]->GetState()==kButtonDown) {
|
|
nv++;
|
|
selVarName[iter] = &fVarName[n];
|
|
iter++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void TH5MainFrame::GetSelFiles(TH5Dataset* selFile[5], Int_t& nf) {
|
|
|
|
nf=0;
|
|
Int_t iter(0);
|
|
|
|
for (Int_t n=0; n<5; ++n) {
|
|
selFile[n] = NULL;
|
|
if (fDataset[n]) {
|
|
if (fDataset[n]->GetState()==kActive) {
|
|
nf++;
|
|
selFile[iter] = fDataset[n];
|
|
iter++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void TH5MainFrame::PrintCanv() {
|
|
|
|
Int_t format = fPrintBox->GetSelected();
|
|
|
|
TCanvas *canv = fEcanvas->GetCanvas();
|
|
|
|
// construct filename from active files and plotted variables:
|
|
TString PrintFilename;
|
|
|
|
Int_t nFiles(0);
|
|
for (Int_t n=0; n<5; ++n) {
|
|
if (fDataset[n]) {
|
|
if (fDataset[n]->GetState()==kActive) {
|
|
if (nFiles > 0) {
|
|
PrintFilename+= TString("-");
|
|
PrintFilename+= fDataset[n]->GetFilenameNoExt();
|
|
} else {
|
|
PrintFilename = fDataset[n]->GetFilenameNoExt();
|
|
}
|
|
nFiles++;
|
|
}
|
|
}
|
|
}
|
|
|
|
Int_t nVars(0);
|
|
|
|
if (fLastPlot==kHisto1d || fLastPlot==kHisto2d || fLastPlot==kHisto3d) {
|
|
for (Int_t n=0; n<8; ++n) {
|
|
if (fVarName[n]) {
|
|
if (fVarButton[n]->GetState()==kButtonDown) {
|
|
PrintFilename += TString("-");
|
|
PrintFilename += fVarName[n];
|
|
nVars++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (fLastPlot==kScalarLinePlot) {
|
|
PrintFilename += TString("-");
|
|
PrintFilename += fScalarLPBox->GetSelectedEntry()->GetTitle();
|
|
PrintFilename += TString("-");
|
|
PrintFilename += fSelLPBox->GetSelectedEntry()->GetTitle();
|
|
}
|
|
|
|
if (fLastPlot==kVectorLinePlot) {
|
|
TString coordName;
|
|
if (kButtonDown == fRadioLP[2]->GetState()) coordName = TString("z");
|
|
if (kButtonDown == fRadioLP[1]->GetState()) coordName = TString("y");
|
|
if (kButtonDown == fRadioLP[0]->GetState()) coordName = TString("x");
|
|
|
|
PrintFilename += TString("-");
|
|
PrintFilename += fVectorLPBox->GetSelectedEntry()->GetTitle();
|
|
PrintFilename += TString("-");
|
|
PrintFilename += coordName;
|
|
PrintFilename += TString("-");
|
|
PrintFilename += fSelLPBox->GetSelectedEntry()->GetTitle();
|
|
}
|
|
|
|
PrintFilename+= ".";
|
|
PrintFilename+= H5PrintFormat[format];
|
|
canv->Print(PrintFilename,H5PrintFormat[format]);
|
|
|
|
// note: could do this directly like this:
|
|
// PrintFilename+= ".";
|
|
// PrintFilename+= fPrintBox->GetSelectedEntry()->GetTitle();
|
|
// canv->Print(PrintFilename,fPrintBox->GetSelectedEntry()->GetTitle());
|
|
// but then we would not have the opportunity to choose option labels in the
|
|
// GUI that are different from the sometimes cryptic ROOT option strings!
|
|
|
|
}
|
|
|
|
void TH5MainFrame::DoStepSlider(Int_t step) {
|
|
|
|
Int_t id;
|
|
TGFrame *frm = (TGFrame *) gTQSender;
|
|
if (frm->IsA()->InheritsFrom(TGSlider::Class())) {
|
|
TGSlider *sl = (TGSlider*) frm;
|
|
id = sl->WidgetId();
|
|
} else {
|
|
TGDoubleSlider *sd = (TGDoubleSlider *) frm;
|
|
id = sd->WidgetId();
|
|
}
|
|
|
|
char bufStep[32];
|
|
sprintf(bufStep, "%d", step);
|
|
|
|
Double_t spos = Spos(step);
|
|
char bufSpos[32];
|
|
sprintf(bufSpos, "%g", spos);
|
|
|
|
switch (id) {
|
|
case stepSliderID:
|
|
fStepSliderTB->Clear();
|
|
fStepSliderTB->AddText(0, bufStep);
|
|
// Re-align the cursor with the characters.
|
|
fStepSliderTE->SetCursorPosition(fStepSliderTE->GetCursorPosition());
|
|
fStepSliderTE->Deselect();
|
|
gClient->NeedRedraw(fStepSliderTE);
|
|
|
|
fSposSliderTB->Clear();
|
|
fSposSliderTB->AddText(0, bufSpos);
|
|
// Re-align the cursor with the characters.
|
|
fSposSliderTE->SetCursorPosition(fSposSliderTE->GetCursorPosition());
|
|
fSposSliderTE->Deselect();
|
|
gClient->NeedRedraw(fSposSliderTE);
|
|
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
void TH5MainFrame::DoStepText(const char * ) {
|
|
|
|
TGTextEntry *te = (TGTextEntry *) gTQSender;
|
|
Int_t id = te->WidgetId();
|
|
|
|
Double_t spos;
|
|
Int_t step;
|
|
char bufSpos[32];
|
|
char bufStep[32];
|
|
|
|
switch (id) {
|
|
case stepSliderTEID:
|
|
step = atoi(fStepSliderTB->GetString());
|
|
fStepSlider->SetPosition(step);
|
|
// update spos field:
|
|
spos = Spos(step);
|
|
sprintf(bufSpos, "%g", spos);
|
|
fSposSliderTB->Clear();
|
|
fSposSliderTB->AddText(0, bufSpos);
|
|
fSposSliderTE->SetCursorPosition(fSposSliderTE->GetCursorPosition());
|
|
fSposSliderTE->Deselect();
|
|
gClient->NeedRedraw(fSposSliderTE);
|
|
break;
|
|
case sposSliderTEID:
|
|
spos = atof(fSposSliderTB->GetString());
|
|
step = Step(spos);
|
|
fStepSlider->SetPosition(step);
|
|
// update step field:
|
|
sprintf(bufStep, "%d", step);
|
|
fStepSliderTB->Clear();
|
|
fStepSliderTB->AddText(0, bufStep);
|
|
fStepSliderTE->SetCursorPosition(fStepSliderTE->GetCursorPosition());
|
|
fStepSliderTE->Deselect();
|
|
gClient->NeedRedraw(fStepSliderTE);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void TH5MainFrame::DoStepTextReturn(const char * ) {
|
|
|
|
TGTextEntry *te = (TGTextEntry *) gTQSender;
|
|
Int_t id = te->WidgetId();
|
|
|
|
Double_t spos;
|
|
Int_t step;
|
|
char bufSpos[32];
|
|
char bufStep[32];
|
|
|
|
switch (id) {
|
|
case sposSliderTEID:
|
|
spos = atof(fSposSliderTB->GetString());
|
|
step = Step(spos);
|
|
fStepSlider->SetPosition(step);
|
|
// update step field:
|
|
sprintf(bufStep, "%d", step);
|
|
fStepSliderTB->Clear();
|
|
fStepSliderTB->AddText(0, bufStep);
|
|
fStepSliderTE->SetCursorPosition(fStepSliderTE->GetCursorPosition());
|
|
fStepSliderTE->Deselect();
|
|
gClient->NeedRedraw(fStepSliderTE);
|
|
// update spos field: (jump to next smaller spos)
|
|
spos = Spos(step);
|
|
sprintf(bufSpos, "%g", spos);
|
|
fSposSliderTB->Clear();
|
|
fSposSliderTB->AddText(0, bufSpos);
|
|
fSposSliderTE->SetCursorPosition(fSposSliderTE->GetCursorPosition());
|
|
fSposSliderTE->Deselect();
|
|
gClient->NeedRedraw(fSposSliderTE);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void TH5MainFrame::PlotNextStep(Int_t jump) {
|
|
|
|
// update step slider:
|
|
Int_t step = fStepSlider->GetPosition();
|
|
Int_t stepMax = fStepSlider->GetMaxPosition();
|
|
step += jump;
|
|
if (step > stepMax) step = stepMax;
|
|
if (step < 0) step = 0;
|
|
fStepSlider->SetPosition(step);
|
|
fStepSlider->PositionChanged(step); // triggers DoStepSlider!
|
|
|
|
DoLastPlot();
|
|
|
|
}
|
|
|
|
void TH5MainFrame::DoLastPlot() {
|
|
|
|
// redo last plot:
|
|
if (fLastPlot==kHisto1d) Histo1d();
|
|
if (fLastPlot==kHisto2d) Histo2d();
|
|
if (fLastPlot==kHisto3d) Histo3d();
|
|
if (fLastPlot==kScalarLinePlot) ScalarLinePlot();
|
|
if (fLastPlot==kVectorLinePlot) VectorLinePlot();
|
|
|
|
}
|
|
|
|
void TH5MainFrame::DoLinePlotRadioButtons()
|
|
{
|
|
|
|
TGButton *btn = (TGButton *) gTQSender;
|
|
Int_t id = btn->WidgetId();
|
|
|
|
switch (id) {
|
|
case linePlotXID:
|
|
fRadioLP[1]->SetState(kButtonUp);
|
|
fRadioLP[2]->SetState(kButtonUp);
|
|
break;
|
|
case linePlotYID:
|
|
fRadioLP[0]->SetState(kButtonUp);
|
|
fRadioLP[2]->SetState(kButtonUp);
|
|
break;
|
|
case linePlotZID:
|
|
fRadioLP[0]->SetState(kButtonUp);
|
|
fRadioLP[1]->SetState(kButtonUp);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
Int_t TH5MainFrame::Step(const Double_t spos ) {
|
|
|
|
TH5Dataset* activeData[5];
|
|
Int_t nFiles(0);
|
|
GetSelFiles(activeData,nFiles);
|
|
|
|
Int_t step;
|
|
if (activeData[0]) {
|
|
step = activeData[0]->GetStep(spos);
|
|
} else {
|
|
step = TMath::Nint(0.5*spos); // dummy
|
|
}
|
|
return(step);
|
|
}
|
|
|
|
Double_t TH5MainFrame::Spos(const Int_t step ) {
|
|
|
|
TH5Dataset* activeData[5];
|
|
Int_t nFiles(0);
|
|
GetSelFiles(activeData,nFiles);
|
|
|
|
Double_t spos;
|
|
if (activeData[0]) {
|
|
spos = activeData[0]->GetSpos(step);
|
|
} else {
|
|
spos = 2.*step; // dummy
|
|
}
|
|
return (spos);
|
|
}
|
|
|
|
void TH5MainFrame::Test() {
|
|
// try to change name of test button!
|
|
if (*(fTestButton->GetText())==TGHotString(" Test ")) {
|
|
fTestButton->SetText("Why");
|
|
} else if (*(fTestButton->GetText())==TGHotString("Why")) {
|
|
fTestButton->SetText("the");
|
|
} else if (*(fTestButton->GetText())==TGHotString("the")) {
|
|
fTestButton->SetText("hell");
|
|
} else if (*(fTestButton->GetText())==TGHotString("hell")) {
|
|
fTestButton->SetText("do");
|
|
} else if (*(fTestButton->GetText())==TGHotString("do")) {
|
|
fTestButton->SetText("you");
|
|
} else if (*(fTestButton->GetText())==TGHotString("you")) {
|
|
fTestButton->SetText("keep");
|
|
} else if (*(fTestButton->GetText())==TGHotString("keep")) {
|
|
fTestButton->SetText("clicking?");
|
|
} else if (*(fTestButton->GetText())==TGHotString("clicking?")) {
|
|
fTestButton->SetText(" Test ");
|
|
} else {
|
|
cout << "Huh?" << endl;
|
|
}
|
|
}
|
|
|