/************************************************************************** * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * * * * Author: The ALICE Off-line Project. * * Contributors are mentioned in the code where appropriate. * * * * Permission to use, copy, modify and distribute this software and its * * documentation strictly for non-commercial purposes is hereby granted * * without fee, provided that the above copyright notice appears in all * * copies and that both the copyright notice and this permission notice * * appear in the supporting documentation. The authors make no claims * * about the suitability of this software for any purpose. It is * * provided "as is" without express or implied warranty. * **************************************************************************/ /////////////////////////////////////////////////////////////////////////////// // // // // /////////////////////////////////////////////////////////////////////////////// #include //Root includes #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // #include #include // #include #include #include #include #include #include #include #include #include #include #include //AliRoot includes #include #include "AliTPCCalibViewerGUI.h" #include "AliTPCCalibViewer.h" #include "AliTPCcalibDB.h" #include "AliTPCcalibDButil.h" #include "AliTPCConfigParser.h" #include "AliTPCCalibViewerGUItime.h" ClassImp(AliTPCCalibViewerGUItime) AliTPCCalibViewerGUItime::AliTPCCalibViewerGUItime(const TGWindow *p, UInt_t w, UInt_t h) : TGCompositeFrame(p,w,h), fFile(0x0), fTree(0x0), fCalibViewerGUI(0x0), fCalibViewerGUItab(0x0), fCurrentHist(0x0), fCurrentGraph(0x0), fCurrentRunDetails(-1), fOutputCacheDir("/tmp"), fDrawString(""), fConfigFile(""), fConfigParser(new AliTPCConfigParser), fIsCustomDraw(kFALSE), fRunNumbers(10), fTimeStamps(10), fValuesX(10), fValuesY(10), fNoGraph(kFALSE), fGraphLimitEntries(10000), fMapRefTrees(new TMap), //GUI elements //main canvas Top part, bottom part fContTopBottom(0x0), //top left, centre, right fContLCR(0x0), //content left fContLeft(0x0), fContDrawOpt(0x0), fChkDrawOptSame(0x0), fComboAddDrawOpt(0x0), fContDrawSel(0x0), fContDrawSelSubRunTime(0x0), fRadioXhist(0x0), fRadioXrun(0x0), fRadioXtime(0x0), fListVariables(0x0), fComboRunType(0x0), fLblRunType(0x0), fNmbPar(0x0), fLblPar(0x0), fListCalibType(0x0), fContCalibType(0x0), //content centre fContCenter(0x0), fCanvMain(0x0), //content right fContRight(0x0), fContValues(0x0), fLblRunNumber(0x0), fLblRunTime(0x0), fLblValueX(0x0), fLblValueY(0x0), fLblRunNumberVal(0x0), fLblRunTimeVal(0x0), fLblValueXVal(0x0), fLblValueYVal(0x0), fBtnDumpRuns(0x0), fContAliases(0x0), fListAliases(0x0), //content bottom fContCustom(0x0), fContCustomCuts(0x0), fLblCustomDraw(0x0), fLblCustomCuts(0x0), fComboCustomDraw(0x0), fComboCustomCuts(0x0), fTrashBox(new TObjArray) { // // ctor // fMapRefTrees->SetOwnerKeyValue(); fTrashBox->SetOwner(); DrawGUI(p,w,h); gStyle->SetMarkerStyle(20); gStyle->SetMarkerSize(0.5); SetInitialValues(); } //______________________________________________________________________________ AliTPCCalibViewerGUItime::~AliTPCCalibViewerGUItime(){ // // dtor // delete fConfigParser; delete fTrashBox; delete fMapRefTrees; } //______________________________________________________________________________ void AliTPCCalibViewerGUItime::DrawGUI(const TGWindow */*p*/, UInt_t w, UInt_t h) { // // draw the GUI // // ====================================================================== // ************************* Display everything ************************* // ====================================================================== SetCleanup(kDeepCleanup); // ***************************************************************************** // ************************* content of this MainFrame ************************* // ***************************************************************************** // top level container with horizontal layout fContTopBottom = new TGCompositeFrame(this, w, h, kVerticalFrame | kFixedWidth | kFixedHeight); AddFrame(fContTopBottom, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0)); fContLCR = new TGCompositeFrame(fContTopBottom, w, h, kHorizontalFrame | kFixedWidth | kFixedHeight); fContTopBottom->AddFrame(fContLCR, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0)); // *********************************************************************** // ************************* content of fContLCR ************************* // *********************************************************************** // left container fContLeft = new TGCompositeFrame(fContLCR, 200, 200, kVerticalFrame | kFixedWidth | kFitHeight); fContLCR->AddFrame(fContLeft, new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandY, 5, 3, 3, 3)); // left vertical splitter TGVSplitter *splitLeft = new TGVSplitter(fContLCR); splitLeft->SetFrame(fContLeft, kTRUE); fContLCR->AddFrame(splitLeft, new TGLayoutHints(kLHintsLeft | kLHintsExpandY, 0, 0, 0, 0)); // right container fContRight = new TGCompositeFrame(fContLCR, 150, 200, kVerticalFrame | kFixedWidth | kFitHeight); fContLCR->AddFrame(fContRight, new TGLayoutHints(kLHintsTop | kLHintsRight | kLHintsExpandY, 3, 5, 3, 3)); // center container fContCenter = new TGCompositeFrame(fContLCR, 200, 200, kVerticalFrame | kFixedWidth | kFitHeight); fContLCR->AddFrame(fContCenter, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0)); // right vertical splitter TGVSplitter *splitRight = new TGVSplitter(fContLCR); splitRight->SetFrame(fContRight, kFALSE); fContLCR->AddFrame(splitRight, new TGLayoutHints(kLHintsLeft | kLHintsExpandY, 0, 0, 0, 0)); // ======================================================================== // ************************* content of fContLeft ************************* // ======================================================================== // --- draw button and tabLeft --- // draw options fContDrawOpt = new TGGroupFrame(fContLeft, "Draw options", kVerticalFrame | kFitWidth | kFitHeight); fContLeft->AddFrame(fContDrawOpt, new TGLayoutHints(kLHintsExpandX, 0, 0, 10, 0)); fChkDrawOptSame = new TGCheckButton(fContDrawOpt, "Same"); fContDrawOpt->AddFrame(fChkDrawOptSame, new TGLayoutHints(kLHintsNormal, 0, 2, 0, 0)); fChkDrawOptSame->SetToolTipText("Add draw option 'same'"); // additional draw options combo box fComboAddDrawOpt = new TGComboBox(fContDrawOpt); fComboAddDrawOpt->Resize(0, 22); fComboAddDrawOpt->EnableTextInput(kTRUE); fContDrawOpt->AddFrame(fComboAddDrawOpt, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0)); // fComboAddDrawOpt->Connect("ReturnPressed()", "AliTPCCalibViewerGUI", this, "HandleButtonsGeneral(=14)"); // fComboAddDrawOpt->Connect("Selected(Int_t)", "AliTPCCalibViewerGUI", this, "DoNewSelection()"); // draw selection group fContDrawSel = new TGGroupFrame(fContLeft, "Draw selection", kVerticalFrame | kFitWidth | kFitHeight); fContLeft->AddFrame(fContDrawSel, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 10, 0)); //x-axis variables selection, Run of Time fContDrawSelSubRunTime = new TGCompositeFrame(fContDrawSel, 200, 23, kHorizontalFrame | kFitWidth | kFixedHeight); fContDrawSel->AddFrame(fContDrawSelSubRunTime, new TGLayoutHints(kLHintsCenterX | kLHintsExpandX , 0, 0, 0, 0)); // ------------------------- content of fContDrawOpt ------------------------- // // Run radio button // Time radio button fRadioXhist = new TGRadioButton(fContDrawSelSubRunTime, "hist", kRadioXhist); fContDrawSelSubRunTime->AddFrame(fRadioXhist, new TGLayoutHints(kLHintsNormal, 0, 2, 0, 0)); fRadioXhist->Connect("Clicked()", "AliTPCCalibViewerGUItime", this, "HandleButtonsDrawSel()"); fRadioXhist->SetToolTipText("Draw the distribution of the variable"); fRadioXrun = new TGRadioButton(fContDrawSelSubRunTime, ":Run", kRadioXrun); fContDrawSelSubRunTime->AddFrame(fRadioXrun, new TGLayoutHints(kLHintsNormal, 2, 2, 0, 0)); fRadioXrun->Connect("Clicked()", "AliTPCCalibViewerGUItime", this, "HandleButtonsDrawSel()"); fRadioXrun->SetToolTipText("Use run number as x-value"); // Time radio button fRadioXtime = new TGRadioButton(fContDrawSelSubRunTime, ":Time", kRadioXtime); fContDrawSelSubRunTime->AddFrame(fRadioXtime, new TGLayoutHints(kLHintsNormal, 2, 2, 0, 0)); fRadioXtime->Connect("Clicked()", "AliTPCCalibViewerGUItime", this, "HandleButtonsDrawSel()"); fRadioXtime->SetToolTipText("Use time stamp number as x-value"); // list of variables fListVariables = new TGListBox(fContDrawSel); fContDrawSel->AddFrame(fListVariables, new TGLayoutHints(kLHintsNormal | kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0)); fListVariables->Connect("Selected(Int_t)", "AliTPCCalibViewerGUItime", this, "DoNewSelection()"); //-------------------- run type selection ------------------------ // Parameter label fLblRunType = new TGLabel(fContDrawSel, "Run Type:"); fLblRunType->SetTextJustify(kTextLeft); fContDrawSel->AddFrame(fLblRunType, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0)); fComboRunType = new TGComboBox(fContDrawSel); fComboRunType->EnableTextInput(kFALSE); fContDrawSel->AddFrame(fComboRunType, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0)); fComboRunType->Connect("Selected(Int_t)", "AliTPCCalibViewerGUItime", this, "DoDraw()"); // fComboRunType->SetEnabled(kFALSE); fComboRunType->Resize(0, 22); //-------------------- parameter selection ------------------------ // Parameter label fLblPar = new TGLabel(fContDrawSel, "Parameter:"); fLblPar->SetTextJustify(kTextLeft); fContDrawSel->AddFrame(fLblPar, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0)); fNmbPar = new TGNumberEntry(fContDrawSel, 0, 1, -1, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative, TGNumberFormat::kNELLimitMinMax, 0, 71); fContDrawSel->AddFrame(fNmbPar, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0)); fNmbPar->Connect("ValueSet(Long_t)", "AliTPCCalibViewerGUItime", this, "DoParLimitChange()"); fNmbPar->SetState(kFALSE); //-------------------- calibration type selection ------------------------ // label // draw selection group fContCalibType = new TGGroupFrame(fContLeft, "Calib type selection", kVerticalFrame | kFitWidth | kFitHeight); fContLeft->AddFrame(fContCalibType, new TGLayoutHints(kLHintsExpandX , 0, 0, 10, 0)); // list of variables fListCalibType = new TGListBox(fContCalibType); fContCalibType->AddFrame(fListCalibType, new TGLayoutHints(kLHintsNormal | kLHintsExpandX , 0, 0, 0, 0)); fListCalibType->Connect("Selected(Int_t)", "AliTPCCalibViewerGUItime", this, "DoChangeSelectionList()"); fListCalibType->Resize(0,88); fListCalibType->SetMultipleSelections(); // ========================================================================== // ************************* content of fContCenter ************************* // ======================================================================== // main drawing canvas fCanvMain = new TRootEmbeddedCanvas("GUItime_Canvas", fContCenter, 200, 200, kFitWidth | kFitHeight); fContCenter->AddFrame(fCanvMain, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0)); fCanvMain->GetCanvas()->Connect("ProcessedEvent(Int_t, Int_t, Int_t, TObject*)", "AliTPCCalibViewerGUItime", this, "MouseMove(Int_t, Int_t, Int_t, TObject*)"); // fCanvMain->GetCanvas()->Connect("RangeAxisChanged()", "AliTPCCalibViewerGUItime", this, "GetMinMax()"); fCanvMain->GetCanvas()->SetToolTipText("The Main_Canvas, here your plots are displayed."); fCanvMain->GetCanvas()->SetRightMargin(0.062); fCanvMain->GetCanvas()->SetLeftMargin(0.15); // ========================================================================= // ************************* content of fContRight ************************* // ======================================================================== //group frame for value information fContValues = new TGGroupFrame(fContRight, "Data point info", kVerticalFrame | kFitWidth | kFitHeight); fContRight->AddFrame(fContValues, new TGLayoutHints(kLHintsExpandX, 0, 0, 10, 0)); //set layout manager fContValues->SetLayoutManager(new TGMatrixLayout(fContValues, 0, 2, 5)); //value information labels //run number label fLblRunNumber = new TGLabel(fContValues, "Run:"); fLblRunNumber->SetTextJustify(kTextLeft); fContValues->AddFrame(fLblRunNumber, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0)); //run number fLblRunNumberVal = new TGLabel(fContValues, "000000"); fLblRunNumberVal->SetTextJustify(kTextLeft); fContValues->AddFrame(fLblRunNumberVal, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 0, 0, 0, 0)); //time stamp label fLblRunTime = new TGLabel(fContValues, "Time:"); fLblRunTime->SetTextJustify(kTextLeft); fContValues->AddFrame(fLblRunTime, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0)); //run number fLblRunTimeVal = new TGLabel(fContValues, "00.00.0000\n00:00:00"); fLblRunTimeVal->SetTextJustify(kTextLeft); fContValues->AddFrame(fLblRunTimeVal, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 0, 0, 0, 0)); //value label x fLblValueX = new TGLabel(fContValues, "x-Value:"); fLblValueX->SetTextJustify(kTextLeft); fContValues->AddFrame(fLblValueX, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0)); //value x fLblValueXVal = new TGLabel(fContValues, "00.000e+00"); fLblValueXVal->SetTextJustify(kTextRight); fContValues->AddFrame(fLblValueXVal, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0)); //value label y fLblValueY = new TGLabel(fContValues, "y-Value:"); fLblValueY->SetTextJustify(kTextLeft); fContValues->AddFrame(fLblValueY, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0)); //value y fLblValueYVal = new TGLabel(fContValues, "00.000e+00"); fLblValueYVal->SetTextJustify(kTextRight); fContValues->AddFrame(fLblValueYVal, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0)); // draw button fBtnDumpRuns = new TGTextButton(fContRight, "&Dump runs"); fContRight->AddFrame(fBtnDumpRuns, new TGLayoutHints(kLHintsExpandX, 0, 0, 10, 0)); fBtnDumpRuns->Connect("Clicked()", "AliTPCCalibViewerGUItime", this, "DoDumpRuns()"); fBtnDumpRuns->SetToolTipText("Press to dump the run numbers of the current selection."); //group frame for value information fContAliases = new TGGroupFrame(fContRight, "Aliases", kVerticalFrame | kFitWidth | kFitHeight); fContRight->AddFrame(fContAliases, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 10, 0)); // list of aliases fListAliases = new TGListBox(fContAliases); fContAliases->AddFrame(fListAliases, new TGLayoutHints(kLHintsNormal | kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0)); fListAliases->Connect("Selected(Int_t)", "AliTPCCalibViewerGUItime", this, "DoNewSelectionAliases()"); // fListAliases->Resize(0,88); //buttons TGCompositeFrame *frame1 = new TGCompositeFrame(fContAliases, 200, 23, kHorizontalFrame | kFitWidth | kFitHeight); fContAliases->AddFrame(frame1, new TGLayoutHints(kLHintsCenterX | kLHintsExpandX , 0, 0, 0, 0)); // add button TGTextButton *btnAdd = new TGTextButton(frame1, "&Add"); frame1->AddFrame(btnAdd, new TGLayoutHints(kLHintsExpandX, 0, 0, 10, 0)); btnAdd->Connect("Clicked()", "AliTPCCalibViewerGUItime", this, "DoAddAlias()"); btnAdd->SetToolTipText("Press to add an alias."); btnAdd->Resize(0,22); // del button TGTextButton *btnDel = new TGTextButton(frame1, "&Del"); frame1->AddFrame(btnDel, new TGLayoutHints(kLHintsExpandX, 0, 0, 10, 0)); btnDel->Connect("Clicked()", "AliTPCCalibViewerGUItime", this, "DoDelAlias()"); btnDel->SetToolTipText("Press to delete the selected alias."); btnDel->Resize(0,22); // update button TGTextButton *btnUp = new TGTextButton(frame1, "&Upd"); frame1->AddFrame(btnUp, new TGLayoutHints(kLHintsExpandX, 0, 0, 10, 0)); btnUp->Connect("Clicked()", "AliTPCCalibViewerGUItime", this, "UpdateAliasList()"); btnUp->SetToolTipText("Press to update the alias list."); btnUp->Resize(0,22); // ========================================================================= // ****************** bottom content of fContTopBottom ********************* // ========================================================================= // custom options container // --- fComboCustom --- the custom draw line on the very low fContCustom = new TGCompositeFrame(fContTopBottom, 200, 200, kHorizontalFrame | kFitWidth | kFitHeight); fContTopBottom->AddFrame(fContCustom, new TGLayoutHints(kLHintsExpandX, 10, 0, 0, 0)); // ------------------------- content of fContCustom ------------------------- fLblCustomDraw = new TGLabel(fContCustom, "Custom draw: "); fLblCustomDraw->SetTextJustify(kTextLeft); fContCustom->AddFrame(fLblCustomDraw, new TGLayoutHints(kLHintsNormal, 5, 0, 0, 0)); // text field for custom draw command fComboCustomDraw = new TGComboBox(fContCustom); // fComboCustomDraw->Resize(0, fLblValueY->GetDefaultHeight()); fComboCustomDraw->Resize(0, 22); fComboCustomDraw->EnableTextInput(kTRUE); fContCustom->AddFrame(fComboCustomDraw, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0)); fComboCustomDraw->Connect("ReturnPressed()", "AliTPCCalibViewerGUItime", this, "DoCustomDraw()"); fComboCustomDraw->Connect("Selected(Int_t)", "AliTPCCalibViewerGUItime", this, "DoCustomDraw()"); // additional cuts container fContCustomCuts = new TGCompositeFrame(fContTopBottom, 200, 200, kHorizontalFrame | kFitWidth | kFitHeight); fContTopBottom->AddFrame(fContCustomCuts, new TGLayoutHints(kLHintsExpandX, 10, 0, 0, 0)); // ------------------------- content of fContCustomCuts ------------------------- fLblCustomCuts = new TGLabel(fContCustomCuts, "Custom cuts: "); fLblCustomCuts->SetTextJustify(kTextLeft); fContCustomCuts->AddFrame(fLblCustomCuts, new TGLayoutHints(kLHintsNormal, 5, 0, 0, 0)); // combo text field for additional cuts fComboCustomCuts = new TGComboBox(fContCustomCuts); // fComboCustomCuts->Resize(0, fLblValueY->GetDefaultHeight()); fComboCustomCuts->Resize(0, 22); fComboCustomCuts->EnableTextInput(kTRUE); fContCustomCuts->AddFrame(fComboCustomCuts, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0)); fComboCustomCuts->Connect("ReturnPressed()", "AliTPCCalibViewerGUItime", this, "DoCustomCutsDraw()"); fComboCustomCuts->Connect("Selected(Int_t)", "AliTPCCalibViewerGUItime", this, "DoCustomCutsDraw()"); SetWindowName("AliTPCCalibViewer GUI - Time"); MapSubwindows(); Resize(GetDefaultSize()); MapWindow(); } //______________________________________________________________________________ void AliTPCCalibViewerGUItime::SetInitialValues(){ // // Set inital selections of the gui // fRadioXrun->SetState(kButtonDown); fRadioXtime->SetState(kButtonUp); } //______________________________________________________________________________ void AliTPCCalibViewerGUItime::UseFile(const char* fileName, const char* treeName) { // // retrieve tree from file // TString s=gSystem->GetFromPipe(Form("ls %s",fileName)); // TString s(fileName); TObjArray *arr=s.Tokenize("\n"); TIter next(arr); TObject *o=0; if (fTree) delete fTree; fTree=new TChain(treeName); while ( (o=next()) ){ fTree->AddFile(o->GetName()); } delete arr; if (!CheckChain()) return; UseConfigFile(fConfigFile.Data()); Reload(); } //______________________________________________________________________________ void AliTPCCalibViewerGUItime::UseChain(TChain *const chain = 0) { // // // fTree=chain; if (!CheckChain()) return; //set configuration file UseConfigFile(fConfigFile.Data()); Reload(); } //______________________________________________________________________________ Bool_t AliTPCCalibViewerGUItime::CheckChain() { // // check whether cahin has entries // decide whether to draw graphs in 2D // if (!fTree) return kFALSE; fTree->Lookup(); Long64_t entries=fTree->GetEntries(); if (entries==0){ AliError("No entries found in chain"); return kFALSE; } //check whether to draw graphs CheckDrawGraph(); return kTRUE; } //______________________________________________________________________________ void AliTPCCalibViewerGUItime::UseConfigFile(const char* file) { // // Use 'file' as configuration file // fConfigFile=file; fConfigParser->ParseConfigFileTxt(fConfigFile.Data()); FillCalibTypes(); } //______________________________________________________________________________ void AliTPCCalibViewerGUItime::FillRunTypes() { // //Loop over the tree entries and fill the run types // if (!fTree) return; Int_t id=0; fComboRunType->RemoveAll(); fComboRunType->AddEntry("ALL",id++); fComboRunType->Select(0,kFALSE); if (!fTree->GetBranch("runType.")) return; TObjString *runType=0x0; Int_t nevets=fTree->GetEntries(); fTree->SetBranchStatus("*",0); fTree->SetBranchStatus("runType.*",1); fTree->SetBranchAddress("runType.",&runType); for (Int_t iev=0;ievGetEntry(iev); TString type=runType->String(); if (!type.IsNull()&&!fComboRunType->FindEntry(type)) fComboRunType->AddEntry(type,id++); } fTree->ResetBranchAddresses(); fTree->SetBranchStatus("*",1); } //______________________________________________________________________________ void AliTPCCalibViewerGUItime::FillCalibTypes() { // // loop over configuration and fill calibration types // Int_t id=0; fListCalibType->RemoveAll(); TObject *o=0x0; fConfigParser->ResetIter(); TString type; while ( (o=fConfigParser->NextKey()) ){ type=fConfigParser->GetData(o,kCalibType); //remove whitespcaces type.Remove(TString::kBoth,' '); type.Remove(TString::kBoth,'\t'); if (type.IsNull()) type="UNSPECIFIED"; // printf("CalibType: '%s'\n",type.Data()); if (!fListCalibType->FindEntry(type.Data())) { fListCalibType->AddEntry(type,id); fListCalibType->Select(id++); } } //add type for unspecified calibration type type="UNSPECIFIED"; if (!fListCalibType->FindEntry(type.Data())) { fListCalibType->AddEntry(SubstituteUnderscores(type.Data()),id); fListCalibType->Select(id++); } } //______________________________________________________________________________ void AliTPCCalibViewerGUItime::CheckDrawGraph() { // // Check whether to draw graphs in 2D mode based on the number of entries in the chain // GetEstimate() returns the maximum size of the arrays stored in GetV1()... // if (!fTree) return; fNoGraph=kTRUE; if (fTree->GetEntries()GetEstimate()) fNoGraph=kFALSE; } //______________________________________________________________________________ void AliTPCCalibViewerGUItime::Reload(Int_t first) { // // reload the gui contents, this is needed after the input tree has changed // if ( !fTree ) return; //in case of the first call create run type and calibration type entries if (first){ FillRunTypes(); FillCalibTypes(); } //activate all branches fTree->SetBranchStatus("*",1); //reset variables list fListVariables->RemoveAll(); //get selected calibration types TList calibTypes; fListCalibType->GetSelectedEntries(&calibTypes); TObjArray *branchList = fTree->GetListOfBranches(); if ( !branchList ) return; TIter nextBranch(branchList); Int_t idCount=0,id=0; TObject *objBranch=0; while ( (objBranch=nextBranch()) ){ TString branchName(objBranch->GetName()); TString branchTitle(objBranch->GetName()); if (branchName == "run" || branchName == "time" || branchName == "runType.") continue; Bool_t active=kTRUE; TString calibType="UNSPECIFIED"; if (fConfigParser){ const TObject *key=(*fConfigParser)(branchName.Data()); if (key){ //test if branch is active active=fConfigParser->GetValue(branchName.Data(),kBranchOnOff); id=(*fConfigParser)()->IndexOf(key); // branchTitle=fConfigParser->GetData(key,kBranchTitle); calibType=fConfigParser->GetData(key,kCalibType); } else{ id=1000+idCount; } } else { id=idCount; } if (calibType.IsNull()) calibType="UNSPECIFIED"; //check if branch is in selected calibration types //if not, don't show it in the list and deactivate the branch. Bool_t calibActive=kFALSE; TIter nextCalib(&calibTypes); TObject *objCalib=0; while ( (objCalib=nextCalib()) ) if (calibType==objCalib->GetTitle()) calibActive=kTRUE; active&=calibActive; if (!active){ TString s=branchName; if (branchName.EndsWith(".")) s+="*"; // fTree->SetBranchStatus(s.Data(),0); continue; } // fListVariables->AddEntry(SubstituteUnderscores(branchTitle.Data()),id); fListVariables->AddEntry(branchTitle.Data(),id); ++idCount; } //trick to display modifications fListVariables->Resize(fListVariables->GetWidth()-1, fListVariables->GetHeight()); fListVariables->Resize(fListVariables->GetWidth()+1, fListVariables->GetHeight()); } //______________________________________________________________________________ void AliTPCCalibViewerGUItime::AddReferenceTree(const char* treeFileName, const char* refName) { // // map of reference trees that should always be attached to the CalibViewerGUI // fMapRefTrees->Add(new TObjString(refName), new TObjString(treeFileName)); } //______________________________________________________________________________ const char* AliTPCCalibViewerGUItime::GetDrawString(){ // // create draw string for ttree by combining the user requestsa // TString selectedVariable=""; Int_t id=-1; if (!fListVariables->GetSelectedEntry()) return ""; selectedVariable = fListVariables->GetSelectedEntry()->GetTitle(); id=fListVariables->GetSelectedEntry()->EntryId(); // printf("id: %d\n",id); TString branchName=selectedVariable; if (fConfigParser){ const TObject *key=(*fConfigParser)(id); if (key) branchName=(*fConfigParser)(id)->GetName(); } //treat case of TVector if (branchName.EndsWith(".")){ Int_t par = (Int_t)(fNmbPar->GetNumber()); branchName.Append(Form("fElements[%d]",par)); } // if (fRadioXrun->GetState()==kButtonDown) // selectedVariable.Append(":run"); // if (fRadioXtime->GetState()==kButtonDown) // selectedVariable.Append(":time"); return branchName.Data(); } //______________________________________________________________________________ const char* AliTPCCalibViewerGUItime::GetDrawOptionString(){ // // get user selected draw options // TString drawOpt; if (fComboAddDrawOpt->GetSelectedEntry()) drawOpt=fComboAddDrawOpt->GetSelectedEntry()->GetTitle(); if (fChkDrawOptSame->GetState()==kButtonDown && !drawOpt.Contains("same",TString::kIgnoreCase)) drawOpt+="same"; return drawOpt.Data(); } //______________________________________________________________________________ void AliTPCCalibViewerGUItime::GetCutString(TString &cutStr){ // // create cut string // TCut cuts(fComboCustomCuts->GetTextEntry()->GetText()); TString runType=""; if (fComboRunType->GetSelectedEntry()) runType=fComboRunType->GetSelectedEntry()->GetTitle(); if (runType!="ALL"&&!runType.IsNull()) cuts+=Form("runType.String().Data()==\"%s\"",runType.Data()); cutStr=cuts.GetTitle(); } //______________________________________________________________________________ void AliTPCCalibViewerGUItime::UpdateValueArrays(Bool_t withGraph, const Double_t *xArr) { // // // if (!withGraph){ fValuesX.ResizeTo(1); fValuesY.ResizeTo(1); fRunNumbers.ResizeTo(1); fTimeStamps.ResizeTo(1); } else { const Long64_t nrows=fTree->GetSelectedRows(); fValuesX.ResizeTo(nrows); fValuesY.ResizeTo(nrows); fRunNumbers.ResizeTo(nrows); fTimeStamps.ResizeTo(nrows); long long *index=new long long[nrows]; TMath::Sort(nrows,fTree->GetV2(),index,kFALSE); for (Long64_t i=0; iGetV3()[index[i]]; fRunNumbers.GetMatrixArray()[i]=fTree->GetV1()[index[i]]; fTimeStamps.GetMatrixArray()[i]=fTree->GetV2()[index[i]]; } delete [] index; } } //______________________________________________________________________________ void AliTPCCalibViewerGUItime::GetHistogramTitle(TString &title) { // // Create string for histogram title // title=fDrawString; Int_t pos=title.First(">>"); if (pos>0) title=title(0,pos); // if (!fIsCustomDraw){ if (fRadioXrun->GetState()==kButtonDown){ title+=":Run"; } else if (fRadioXtime->GetState()==kButtonDown){ title+=":Date"; } // } TString cuts; GetCutString(cuts); TObjArray *arr=title.Tokenize(":"); TObject *o=0x0; title+=" {"; title+=cuts; title+="}"; TIter next(arr,kIterBackward); while ( (o=next()) ){ TString varName=o->GetName(); title+=";"; //substitue variable names with names in configuration file if available if ((*fConfigParser)()->GetEntries()){ TString branchName=varName; Int_t par=0; if (branchName.Contains('.')) branchName=branchName(0,branchName.First('.')+1); //chek if a configuration for that branch is available const TObject *oBranch=(*fConfigParser)(branchName.Data()); if (oBranch){ TString branchTitle=fConfigParser->GetData(oBranch,kBranchTitle); if (!branchTitle.IsNull()){ //check for TVectorT type branch //add parameter name if available if (varName.Contains("fElements")){ TString parStr=varName(varName.First('[')+1,varName.Length()-varName.First('[')-2); par=parStr.Atoi(); branchTitle+=": "; TString yparname=fConfigParser->GetData(oBranch,par+kParamNames); if (!yparname.IsNull()){ branchTitle+=yparname; } else { branchTitle+="["; branchTitle+=par; branchTitle+="]"; } } } varName=SubstituteUnderscores(branchTitle.Data()); } } title+=varName; } delete arr; } //______________________________________________________________________________ void AliTPCCalibViewerGUItime::AdjustYRange() { // // // TIter nextGraphicObject(fTrashBox); TObject *o=0x0; Float_t min=0,max=0; while ( (o=nextGraphicObject()) ){ if (o->IsA()==TGraph::Class()){ TGraph *gr=(TGraph*)o; if (min==max) { min=TMath::MinElement(gr->GetN(),gr->GetY()); max=TMath::MaxElement(gr->GetN(),gr->GetY()); } else { Float_t currmin=TMath::MinElement(gr->GetN(),gr->GetY()); Float_t currmax=TMath::MaxElement(gr->GetN(),gr->GetY()); if (currmax>max) max=currmax; if (currminSetMinimum(min); fCurrentHist->SetMaximum(max); } } //______________________________________________________________________________ void AliTPCCalibViewerGUItime::DoDraw() { // // Draw graphics // TString drawString=fDrawString; TString cutString; GetCutString(cutString); TString optString = GetDrawOptionString(); Bool_t graphOutput=!fNoGraph; //ttree buffer for V1, V2... too small graphOutput&=(drawString.First(">>")<0); //histogram output in custom draw graphOutput&=fRadioXhist->GetState()!=kButtonDown; //histogram drawing selected // graphOutput&=!(fIsCustomDraw&&!fDrawString.Contains(":")); //custom draw 1D // graphOutput&=fDrawString.CountChar(':')<2; //custom draw 1D if (fIsCustomDraw&&fDrawString.Contains(":")) HandleButtonsDrawSel(-kRadioXhist); if (fIsCustomDraw&&fDrawString.Contains(":")) HandleButtonsDrawSel(-kRadioXhist); Bool_t drawSame=optString.Contains("same",TString::kIgnoreCase); // optString+="goff"; if (graphOutput) { drawString.Prepend("run:time:"); optString="goff"; }else{ // if (!fIsCustomDraw){ if (fRadioXrun->GetState()==kButtonDown){ drawString+=":run"; } else if (fRadioXtime->GetState()==kButtonDown){ drawString+=":time"; } // } } TVirtualPad *padsave=gPad; fCanvMain->GetCanvas()->cd(); //delete old histograms and graphs if (!drawSame){ fTrashBox->Delete(); fCurrentGraph=0x0; fCurrentHist=0x0; } //select data fTree->Draw(drawString.Data(),cutString.Data(),optString.Data()); if (fTree->GetSelectedRows()==-1) return; TString title; GetHistogramTitle(title); Bool_t drawGraph=kFALSE; Double_t *xArr=0; if (graphOutput){ drawGraph=kTRUE; if (fIsCustomDraw&&fDrawString.Contains(":")){ // fValuesX.SetElements(fTree->GetV4()); xArr=fTree->GetV4(); }else{ if (fRadioXrun->GetState()==kButtonDown){ // fValuesX.SetElements(fTree->GetV1()); xArr=fTree->GetV1(); } else if (fRadioXtime->GetState()==kButtonDown){ // fValuesX.SetElements(fTree->GetV2()); xArr=fTree->GetV2(); } else { drawGraph=kFALSE; } } } if (xArr) UpdateValueArrays(graphOutput, xArr); // if (graphOutput){ // if (fIsCustomDraw){ // if (fDrawString.Contains(":")){ // fValuesX.SetElements(fTree->GetV4()); // drawGraph=kTRUE; // } else { // drawGraph=kFALSE; // } // }else{ // drawGraph=kTRUE; // if (fRadioXrun->GetState()==kButtonDown){ // fValuesX.SetElements(fTree->GetV1()); // } else if (fRadioXtime->GetState()==kButtonDown){ // fValuesX.SetElements(fTree->GetV2()); // } else { // drawGraph=kFALSE; // } // } // } //create graph according to selection if (drawGraph){ TGraph *graph=new TGraph(fValuesX,fValuesY); TString grDraw="p"; if (!drawSame) grDraw+="a"; if (!fIsCustomDraw) grDraw+="l"; graph->Draw(grDraw.Data()); graph->SetEditable(kFALSE); TH1 *hist=graph->GetHistogram(); hist->SetTitle(title.Data()); fTrashBox->Add(graph); graph->SetLineColor(fTrashBox->GetEntries()); graph->SetMarkerColor(fTrashBox->GetEntries()); if (!drawSame) { fCurrentGraph=graph; fCurrentHist=hist; } } else { TH1 *hist=fTree->GetHistogram(); hist->SetTitle(title.Data()); // hist->Draw(optString.Data()); fTrashBox->Add(hist); hist->SetLineColor(fTrashBox->GetEntries()); hist->SetMarkerColor(fTrashBox->GetEntries()); if (!drawSame) fCurrentHist=hist; } //Set time axis if choosen as x-variables // if (fRadioXtime->GetState()==kButtonDown&&!fIsCustomDraw&&!drawSame){ if (fRadioXtime->GetState()==kButtonDown&&!drawSame){ TAxis *xaxis=fCurrentHist->GetXaxis(); xaxis->SetTimeFormat("#splitline{%d.%m}{%H:%M}"); xaxis->SetTimeDisplay(1); xaxis->SetLabelOffset(xaxis->GetLabelOffset()*3); xaxis->SetLabelSize(xaxis->GetLabelSize()/1.3); } if (!drawSame) { //Set title offset fCurrentHist->GetYaxis()->SetTitleOffset(1.5); } else { //adjust y-range AdjustYRange(); } gPad->Modified(); gPad->Update(); padsave->cd(); } //______________________________________________________________________________ void AliTPCCalibViewerGUItime::DoDumpRuns() { // // Dump the current run numbers to stdout // Int_t npoints=fRunNumbers.GetNrows(); Int_t *sortIndex = new Int_t[npoints]; TMath::Sort(npoints,fRunNumbers.GetMatrixArray(),sortIndex,kFALSE); Int_t run=0, prevRun=-1; for (Int_t irun=0;irunGetTextEntry()->GetText(); // if (fDrawString.Contains(">>")){ // Warning("DoCustomDraw","Currently no user defined histograms allowed!"); // return; // } fNmbPar->SetState(kFALSE); fIsCustomDraw=kTRUE; DoDraw(); } //______________________________________________________________________________ void AliTPCCalibViewerGUItime::DoCustomCutsDraw() { // // // if (fIsCustomDraw) DoCustomDraw(); else { fDrawString=GetDrawString(); fIsCustomDraw=kFALSE; DoDraw(); } } //______________________________________________________________________________ void AliTPCCalibViewerGUItime::HandleButtonsDrawSel(Int_t id) { // // Draw selection button handling (x-variable) // if (id == -1) { TGButton *btn = (TGButton *) gTQSender; id = btn->WidgetId(); } Bool_t doDraw=kFALSE; Bool_t noDraw=kFALSE; if (id<-1){ noDraw=kTRUE; id=TMath::Abs(id); } switch (id) { case (kRadioXhist): doDraw=(fRadioXtime->GetState()==kButtonDown||fRadioXrun->GetState()==kButtonDown); if (doDraw){ fRadioXrun->SetState(kButtonUp); fRadioXtime->SetState(kButtonUp); fRadioXhist->SetState(kButtonDown); } break; case (kRadioXrun): doDraw=(fRadioXtime->GetState()==kButtonDown||fRadioXhist->GetState()==kButtonDown); if (doDraw){ fRadioXhist->SetState(kButtonUp); fRadioXtime->SetState(kButtonUp); fRadioXrun->SetState(kButtonDown); } break; case (kRadioXtime): doDraw=(fRadioXhist->GetState()==kButtonDown||fRadioXrun->GetState()==kButtonDown); if (doDraw){ fRadioXrun->SetState(kButtonUp); fRadioXhist->SetState(kButtonUp); fRadioXtime->SetState(kButtonDown); } break; } if (doDraw&&!noDraw) DoCustomCutsDraw(); } //______________________________________________________________________________ void AliTPCCalibViewerGUItime::UpdateParName() { // // change parameter name // Int_t par = (Int_t)(fNmbPar->GetNumber()); TString parName=""; Int_t id=fListVariables->GetSelectedEntry()->EntryId(); if (fConfigParser && (*fConfigParser)(id)) parName=fConfigParser->GetData((*fConfigParser)(id),par+kParamNames); if (parName=="") parName.Form("%d",par); fLblPar->SetText(Form("Parameter: %s",parName.Data())); fDrawString=GetDrawString(); fIsCustomDraw=kFALSE; } //______________________________________________________________________________ void AliTPCCalibViewerGUItime::UpdateParLimits() { // // Adjust limits for TVectorT based variables // if (!fTree) return; TString selectedVariableTitle=""; Int_t id=-1; if (!fListVariables->GetSelectedEntry()) return; selectedVariableTitle = fListVariables->GetSelectedEntry()->GetTitle(); id=fListVariables->GetSelectedEntry()->EntryId(); // printf("id: %d\n",id); TString selectedVariable=selectedVariableTitle; const TObject *key=(*fConfigParser)(id); if (key) selectedVariable=(*fConfigParser)(id)->GetName(); if (selectedVariable.IsNull()||!selectedVariable.EndsWith(".")) { fNmbPar->SetState(kFALSE); fLblPar->SetText("Parameter: none"); return; } TVectorD *vD=0x0; TVectorF *vF=0x0; Int_t maxPar=0; fTree->GetEntry(1); TBranch *branch=fTree->GetTree()->GetBranch(selectedVariable.Data()); TString branchClass=branch->GetClassName(); Int_t event=0; if (branchClass=="TVectorT"){ // branch->SetAddress(&vD); fTree->SetBranchAddress(selectedVariable.Data(),&vD); while (maxPar<2&&eventGetEntries()){ fTree->GetEntry(event++); maxPar=vD->GetNrows(); } } else if (branchClass=="TVectorT"){ // branch->SetAddress(&vF); fTree->SetBranchAddress(selectedVariable.Data(),&vF); while (maxPar<2&&eventGetEntries()){ fTree->GetEntry(event++); maxPar=vF->GetNrows(); } } else { //class not known fNmbPar->SetState(kFALSE); return; } // branch->ResetAddress(); fTree->SetBranchAddress(selectedVariable.Data(),0x0); if (fNmbPar->GetNumMax()!=maxPar-1) fNmbPar->SetNumber(0); fNmbPar->SetLimitValues(0,maxPar-1); fNmbPar->SetState(kTRUE); UpdateParName(); } //______________________________________________________________________________ void AliTPCCalibViewerGUItime::MouseMove(Int_t event, Int_t x, Int_t y, TObject */*selected*/) { // // handle mouse events in the draw canvas // UInt_t dd=0,mm=0,yy=0,HH=0,MM=0,SS=0,run=0; Double_t valx=0.,valy=0.; if (!fCurrentGraph) { fLblRunNumberVal->SetText(Form("%06u",run)); fLblRunTimeVal->SetText(Form("%02u.%02u.%04u\n%02u:%02u:%02u",dd,mm,yy,HH,MM,SS)); fLblValueXVal->SetText(Form("%.3e", valx)); fLblValueYVal->SetText(Form("%.3e", valy)); return; } TVirtualPad *padsave=gPad; fCanvMain->GetCanvas()->cd(); Int_t n=fValuesY.GetNrows(); Double_t *arr=0x0; arr=fValuesX.GetMatrixArray(); Int_t minDist=1000000; Int_t minPoint=-1; for (Int_t i=0;iXtoAbsPixel(gPad->XtoPad(arr[i])); Int_t pyp = gPad->YtoAbsPixel(gPad->YtoPad(fValuesY[i])); Int_t d = TMath::Nint(TMath::Sqrt(TMath::Abs(pxp-x) + TMath::Abs(pyp-y))); if (d < minDist) { minDist = d; minPoint = i; } } if (minDist<2){ TTimeStamp t((Int_t)fTimeStamps[minPoint]); t.GetDate(kTRUE,0,&yy,&mm,&dd); t.GetTime(kTRUE,0,&HH,&MM,&SS); run=(UInt_t)fRunNumbers[minPoint]; valx=fValuesX[minPoint]; valy=fValuesY[minPoint]; } else { dd=0;mm=0;yy=0;HH=0;MM=0;SS=0;run=0; valx=0.; valy=0.; } fLblRunNumberVal->SetText(Form("%06u",run)); fLblRunTimeVal->SetText(Form("%02u.%02u.%04u\n%02u.%02u.%02u",dd,mm,yy,HH,MM,SS)); if (fIsCustomDraw){ fLblValueXVal->SetText(Form("%.3e", valx)); }else{ if (fRadioXrun->GetState()==kButtonDown){ fLblValueXVal->SetText("Run"); } else if (fRadioXtime->GetState()==kButtonDown){ fLblValueXVal->SetText("Time"); } } fLblValueYVal->SetText(Form("%.3e", valy)); padsave->cd(); if (run==0) return; if (event == kButton1Double ){ SetGuiTree(run); } //find closes point of current selection } //______________________________________________________________________________ void AliTPCCalibViewerGUItime::SetGuiTree(Int_t run) { // // create the AliTPCCalibViewerGUI tree for run // cache tree in directory fOutputCacheDir // retrieve file from this directory if it already exists // // //Create and set GUI tree // //try to find file for run in fOutputCacheDir TString fileName=fOutputCacheDir; if (!fileName.EndsWith("/")) fileName+="/"; fileName+=Form("guiTreeRun_%d.root",run); Bool_t load=kTRUE; if (gSystem->AccessPathName(fileName.Data())){ load=AliTPCcalibDB::CreateGUITree(run,fileName.Data()); if (!load){ fCalibViewerGUI->Reset(); if (fCalibViewerGUItab) fCalibViewerGUItab->SetText(new TGString(Form("Detail - XXXXX"))); return; } } fCalibViewerGUI->Initialize(fileName.Data()); if (fCalibViewerGUItab) fCalibViewerGUItab->SetText(new TGString(Form("Detail - %05d",run))); // //Create and set Reference GUI tree // AliTPCcalibDButil util; util.SetReferenceRun(run); fileName=fOutputCacheDir; if (!fileName.EndsWith("/")) fileName+="/"; fileName+=util.GetGUIRefTreeDefaultName(); //only update if file does not exist if (gSystem->AccessPathName(fileName.Data())){ util.UpdateRefDataFromOCDB(); util.CreateGUIRefTree(fileName.Data()); } fCalibViewerGUI->GetViewer()->AddReferenceTree(fileName.Data(),"calPads","Ref"); // // Process additional reference trees // TIter nextRefTree(fMapRefTrees); TObject *o=0x0; //Set static reference data while ( (o=nextRefTree()) ){ fCalibViewerGUI->GetViewer()->AddReferenceTree(fMapRefTrees->GetValue(o)->GetName(),"calPads",o->GetName()); } fCalibViewerGUI->Reload(); } //______________________________________________________________________________ const char* AliTPCCalibViewerGUItime::SubstituteUnderscores(const char* in) { // // // TString s(in); s.ReplaceAll("_{","|{"); s.ReplaceAll("_"," "); s.ReplaceAll("|{","_{"); return s.Data(); } //______________________________________________________________________________ void AliTPCCalibViewerGUItime::DoNewSelectionAliases() { // // // if (!fTree) return; TList *l=fTree->GetListOfAliases(); if (!l) return; TString selectedVariable=""; if (!fListAliases->GetSelectedEntry()) return; selectedVariable = fListAliases->GetSelectedEntry()->GetTitle(); fDrawString=selectedVariable; fIsCustomDraw=kFALSE; DoDraw(); } //______________________________________________________________________________ void AliTPCCalibViewerGUItime::DoAddAlias() { // // // new AliTPCCalibViewerGUItimeAddAliasFrame(gClient->GetRoot(), fContTopBottom, 400, 200, kVerticalFrame, this); } //______________________________________________________________________________ void AliTPCCalibViewerGUItime::DoDelAlias() { // // // if (!fTree) return; TList *l=fTree->GetListOfAliases(); if (!l) return; TString selectedVariable=""; if (!fListAliases->GetSelectedEntry()) return; selectedVariable = fListAliases->GetSelectedEntry()->GetTitle(); l->Remove(l->FindObject(selectedVariable.Data())); UpdateAliasList(); } //______________________________________________________________________________ void AliTPCCalibViewerGUItime::UpdateAliasList() { // // // printf("UpdateAliasList\n"); if (!fTree) return; TList *l=fTree->GetListOfAliases(); if (!l) return; TIter nextAlias(l); TObject *o; fListAliases->RemoveAll(); Int_t id=0; while( (o=nextAlias()) ){ fListAliases->AddEntry(o->GetName(),id++); } fListAliases->Resize(fListAliases->GetWidth()-1, fListAliases->GetHeight()); fListAliases->Resize(fListAliases->GetWidth()+1, fListAliases->GetHeight()); } //______________________________________________________________________________ TObjArray* AliTPCCalibViewerGUItime::ShowGUI(const char* fileName, const char* treeName) { // // Initialize and show GUI for presentation for demonstration purposes // or for fast standalone use // TGMainFrame* frmMain = new TGMainFrame(gClient->GetRoot(), 1000, 600); frmMain->SetWindowName("AliTPCCalibViewer GUItime"); frmMain->SetCleanup(kDeepCleanup); TGTab* tabMain = new TGTab(frmMain, 1000, 600); frmMain->AddFrame(tabMain, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0)); TGCompositeFrame* tabCont1 = tabMain->AddTab("Time"); TGCompositeFrame* tabCont2 = tabMain->AddTab("Detail - XXXXX"); AliTPCCalibViewerGUItime* calibViewerTime = new AliTPCCalibViewerGUItime(tabCont1, 1000, 600); tabCont1->AddFrame(calibViewerTime, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0)); calibViewerTime->SetConfigFileName("$ALICE_ROOT/TPC/CalibMacros/calibVarDescription.txt"); calibViewerTime->UseFile(fileName, treeName); AliTPCCalibViewerGUI* calibViewer = new AliTPCCalibViewerGUI(tabCont2, 1000, 600, 0); tabCont2->AddFrame(calibViewer, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0)); calibViewerTime->SetCalibViewerGUI(calibViewer); calibViewerTime->SetCalibViewerGUItab(tabMain->GetTabTab(1)); TObjArray *guiArray = new TObjArray(); guiArray->Add(calibViewerTime); guiArray->Add(calibViewer); frmMain->MapSubwindows(); frmMain->Resize(); frmMain->MapWindow(); return guiArray; } //______________________________________________________________________________ TObjArray* AliTPCCalibViewerGUItime::ShowGUI(TChain *chain) { // // Initialize and show GUI for presentation for demonstration purposes // or for fast standalone use // TGMainFrame* frmMain = new TGMainFrame(gClient->GetRoot(), 1000, 600); frmMain->SetWindowName("AliTPCCalibViewer GUItime"); frmMain->SetCleanup(kDeepCleanup); TGTab* tabMain = new TGTab(frmMain, 1000, 600); frmMain->AddFrame(tabMain, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0)); TGCompositeFrame* tabCont1 = tabMain->AddTab("Time"); AliTPCCalibViewerGUItime* calibViewerTime = new AliTPCCalibViewerGUItime(tabCont1, 1000, 600); tabCont1->AddFrame(calibViewerTime, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0)); calibViewerTime->UseChain(chain); TObjArray *guiArray = new TObjArray(); guiArray->Add(calibViewerTime); frmMain->MapSubwindows(); frmMain->Resize(); frmMain->MapWindow(); return guiArray; } //////////////////////////////////////////////////////////////////////// // // GUI Alias frame // //////////////////////////////////////////////////////////////////////// ClassImp(AliTPCCalibViewerGUItimeAddAliasFrame) AliTPCCalibViewerGUItimeAddAliasFrame::AliTPCCalibViewerGUItimeAddAliasFrame(const TGWindow *p, const TGWindow *main, UInt_t w, UInt_t h, UInt_t options, AliTPCCalibViewerGUItime *gui, TString strAlias) : fMain(0x0), fTxt1(0x0), fTxt2(0x0), fGUI(0x0) { fMain = new TGTransientFrame(p, main, w, h, options); fMain->Connect("CloseWindow()", "AliTPCCalibViewerGUItimeAddAliasFrame", this, "DoCancel()"); fMain->DontCallClose(); // to avoid double deletions. // use hierarchical cleaning fMain->SetCleanup(kDeepCleanup); //layout TGLayoutHints *l1 = new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX, 2, 2, 2, 2); TGLayoutHints *l2 = new TGLayoutHints(kLHintsTop | kLHintsRight | kLHintsExpandX, 2, 2, 0, 5); // TGLayoutHints *l3 = new TGLayoutHints(kLHintsTop | kLHintsRight, 5, 5, 5, 5); //input fields TGCompositeFrame *f1 = new TGCompositeFrame(fMain, 60, 20, kVerticalFrame); fMain->AddFrame(f1, l1); TGCompositeFrame *frameName = new TGCompositeFrame(f1); TGCompositeFrame *frameFormula = new TGCompositeFrame(f1); f1->AddFrame(frameName,l2); f1->AddFrame(frameFormula,l2); TGLabel *lblTxt1 = new TGLabel(frameName, "Name:"); TGLabel *lblTxt2 = new TGLabel(frameFormula, "Formula:"); fTxt1 = new TGTextEntry(frameName, new TGTextBuffer(1000)); fTxt2 = new TGTextEntry(frameFormula, new TGTextBuffer(1000)); frameName->AddFrame(lblTxt1, l2); frameName->AddFrame(fTxt1, l2); frameFormula->AddFrame(lblTxt2, l2); frameFormula->AddFrame(fTxt2, l2); fTxt1->Resize(350, fTxt1->GetDefaultHeight()); fTxt2->Resize(350, fTxt2->GetDefaultHeight()); //ok and cancel buttons TGHorizontalFrame *frame = new TGHorizontalFrame(fMain, 60, 20, kFixedWidth); TGTextButton *okButton = new TGTextButton(frame, "&Ok", 1); okButton->Connect("Clicked()", "AliTPCCalibViewerGUItimeAddAliasFrame", this, "DoOK()"); TGTextButton *cancelButton = new TGTextButton(frame, "&Cancel", 2); cancelButton->Connect("Clicked()", "AliTPCCalibViewerGUItimeAddAliasFrame", this, "DoCancel()"); frame->AddFrame(okButton, l1); frame->AddFrame(cancelButton, l1); frame->Resize(150, okButton->GetDefaultHeight()); fMain->AddFrame(frame, new TGLayoutHints(kLHintsBottom | kLHintsRight, 2, 2, 5, 1)); fGUI=gui; TString aliasName, alias; if (!strAlias.IsNull()){ TChain *c=fGUI->GetChain(); if (c){ TList *l=c->GetListOfAliases(); if (l){ TNamed *d=(TNamed*)l->FindObject(strAlias); if (d){ aliasName=d->GetName(); alias=d->GetTitle(); } } } }else{ alias=fGUI->GetCustomDrawString(); } fTxt1->SetText(aliasName.Data(),kFALSE); fTxt2->SetText(alias.Data(),kFALSE); fMain->MapSubwindows(); fMain->Resize(); // position relative to the parent's window fMain->CenterOnParent(); fMain->SetWindowName("Alias Editor"); fMain->MapWindow(); } //______________________________________________________________________________ AliTPCCalibViewerGUItimeAddAliasFrame::~AliTPCCalibViewerGUItimeAddAliasFrame() { // // // fMain->DeleteWindow(); // deletes fMain } //______________________________________________________________________________ void AliTPCCalibViewerGUItimeAddAliasFrame::DoOK() { // // // TString aliasName=fTxt1->GetText(); TString alias=fTxt2->GetText(); if (!aliasName.IsNull()&&!alias.IsNull()){ TChain *c=fGUI->GetChain(); if (c){ c->SetAlias(aliasName.Data(),alias.Data()); } } fGUI->UpdateAliasList(); delete this; } //______________________________________________________________________________ void AliTPCCalibViewerGUItimeAddAliasFrame::DoCancel() { // // // delete this; }