///////////////////////////////////////////////////////////////////////////////
-#include "AliMonitorClient.h"
-#include "AliMonitorDialog.h"
-#include "AliMonitorProcess.h"
-#include <TGMsgBox.h>
+#include <cstdlib>
+#include <TApplication.h>
+#include <TCanvas.h>
+#include <TClass.h>
+#include <TFile.h>
+#include <TFolder.h>
+#include <TG3DLine.h>
+#include <TGButton.h>
+#include <TGCanvas.h>
#include <TGFileDialog.h>
-#include <TSystem.h>
+#include <TGLabel.h>
+#include <TGListTree.h>
+#include <TGMenu.h>
+#include <TGMsgBox.h>
+#include <TGNumberEntry.h>
+#include <TGSplitter.h>
+#include <TGTextEntry.h>
+#include <TGTextView.h>
+#include <TGToolBar.h>
#include <TMessage.h>
-#include <TCanvas.h>
-#include <TApplication.h>
+#include <TRootEmbeddedCanvas.h>
+#include <TSocket.h>
#include <TStyle.h>
+#include <TTimer.h>
+#include "AliLog.h"
+#include "AliMonitorClient.h"
+#include "AliMonitorHisto.h"
+#include "AliMonitorProcess.h"
ClassImp(AliMonitorClient)
const char* AliMonitorClient::fgSettingsFileName = ".AliMonitorClient";
-//_____________________________________________________________________________
-class AliMonitorStringDlg : public AliMonitorDialog {
-
-public:
- AliMonitorStringDlg(TString& string, TGFrame* main, const char* title,
- const char* label);
- virtual ~AliMonitorStringDlg();
-
- virtual void OnOkClicked();
-
-private:
- TGLayoutHints* fStringLayout;
- TGLabel* fStringLabel;
- TGTextEntry* fStringEntry;
-
- TString& fString;
-};
-
//_____________________________________________________________________________
-AliMonitorStringDlg::AliMonitorStringDlg(TString& string, TGFrame* main,
- const char* title,
- const char* label) :
- AliMonitorDialog(main, 300, 80), fString(string)
+AliMonitorClient::AliMonitorStringDlg::AliMonitorStringDlg(TString& string,
+ TGFrame* main,
+ const char* title,
+ const char* label) :
+ AliMonitorDialog(main, 300, 80),
+ fStringLayout(new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 2, 5, 2, 2)),
+ fStringLabel(new TGLabel(fFrame, label)),
+ fStringEntry(new TGTextEntry(fFrame, string.Data())),
+ fString(string)
{
// create a dialog for connecting to a monitor process
- fStringLayout = new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 2, 5, 2, 2);
- fStringLabel = new TGLabel(fFrame, label);
fFrame->AddFrame(fStringLabel, fStringLayout);
- fStringEntry = new TGTextEntry(fFrame, string.Data());
fStringEntry->Resize(100, fStringEntry->GetDefaultHeight());
fFrame->AddFrame(fStringEntry, fStringLayout);
}
//_____________________________________________________________________________
-AliMonitorStringDlg::~AliMonitorStringDlg()
+AliMonitorClient::AliMonitorStringDlg::~AliMonitorStringDlg()
{
// clean up
}
//_____________________________________________________________________________
-void AliMonitorStringDlg::OnOkClicked()
+void AliMonitorClient::AliMonitorStringDlg::OnOkClicked()
{
fString = fStringEntry->GetText();
}
-
//_____________________________________________________________________________
-class AliMonitorNumberDlg : public AliMonitorDialog {
-
-public:
- AliMonitorNumberDlg(Float_t& value, TGFrame* main, const char* title,
- const char* label, Float_t min);
- virtual ~AliMonitorNumberDlg();
-
- virtual void OnOkClicked();
-
-private:
- TGLayoutHints* fNumberLayout;
- TGLabel* fNumberLabel;
- TGNumberEntry* fNumberEntry;
-
- Float_t& fNumber;
-};
-
-
-//_____________________________________________________________________________
-AliMonitorNumberDlg::AliMonitorNumberDlg(Float_t& value, TGFrame* main,
- const char* title, const char* label,
- Float_t min) :
- AliMonitorDialog(main, 250, 80), fNumber(value)
+AliMonitorClient::AliMonitorNumberDlg::AliMonitorNumberDlg(Float_t& value,
+ TGFrame* main,
+ const char* title,
+ const char* label,
+ Float_t min) :
+ AliMonitorDialog(main, 250, 80),
+ fNumberLayout(new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 2, 5, 2, 2)),
+ fNumberLabel(new TGLabel(fFrame, label)),
+ fNumberEntry(new TGNumberEntry(fFrame, value, 4, -1, TGNumberFormat::kNESRealOne)),
+ fNumber(value)
{
// create a dialog for getting a number
- fNumberLayout = new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 2, 5, 2, 2);
- fNumberLabel = new TGLabel(fFrame, label);
fFrame->AddFrame(fNumberLabel, fNumberLayout);
- fNumberEntry = new TGNumberEntry(fFrame, value, 4, -1,
- TGNumberFormat::kNESRealOne);
fNumberEntry->SetLimits(TGNumberFormat::kNELLimitMin, min, 0);
fFrame->AddFrame(fNumberEntry, fNumberLayout);
}
//_____________________________________________________________________________
-AliMonitorNumberDlg::~AliMonitorNumberDlg()
+AliMonitorClient::AliMonitorNumberDlg::~AliMonitorNumberDlg()
{
// clean up
}
//_____________________________________________________________________________
-void AliMonitorNumberDlg::OnOkClicked()
+void AliMonitorClient::AliMonitorNumberDlg::OnOkClicked()
{
fNumber = fNumberEntry->GetNumber();
}
//_____________________________________________________________________________
AliMonitorClient::AliMonitorClient():
- TGMainFrame(gClient->GetRoot(), 500, 300)
+ TGMainFrame(gClient->GetRoot(), 500, 300),
+ fQObject(),
+ fMenuBarLayout(new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX, 0, 0, 1, 1)),
+ fMenuBarItemLayout(new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 4, 0, 0)),
+ fMenuBarHelpLayout(new TGLayoutHints(kLHintsTop | kLHintsRight)),
+ fMenuFile(new TGPopupMenu(gClient->GetRoot())),
+ fMenuView(new TGPopupMenu(gClient->GetRoot())),
+ fMenuFavorites(new TGPopupMenu(gClient->GetRoot())),
+ fMenuReference(new TGPopupMenu(gClient->GetRoot())),
+ fMenuOptions(new TGPopupMenu(gClient->GetRoot())),
+ fMenuHelp(new TGPopupMenu(gClient->GetRoot())),
+ fMenuBar(new TGMenuBar(this, 1, 1, kHorizontalFrame)),
+ fToolBarLayout(new TGLayoutHints(kLHintsTop | kLHintsExpandX, 0, 0, 2, 2)),
+ fToolBarSep(new TGHorizontal3DLine(this)),
+ fToolBar(new TGToolBar(this, 60, 20, kHorizontalFrame)),
+ fEventNumberLayout(new TGLayoutHints(kLHintsCenterY | kLHintsLeft, 10, 2, 10, 5)),
+ fEventNumber(new TGNumberEntry(fToolBar, 1, 4, 10, TGNumberFormat::kNESInteger)),
+ fEventButton(NULL),
+ fSumButton(NULL),
+ fRunButton(NULL),
+ fLoopButton(NULL),
+ fLoopOnPicture(NULL),
+ fLoopOffPicture(NULL),
+ fPreviousButton(NULL),
+ fNextButton(NULL),
+ fCopyButton(NULL),
+ fSaveButton(NULL),
+ fPrintButton(NULL),
+ fBottomLayout(new TGLayoutHints(kLHintsExpandX | kLHintsBottom)),
+ fLeftLayout(new TGLayoutHints(kLHintsLeft | kLHintsExpandY)),
+ fExpandLayout(new TGLayoutHints(kLHintsExpandX | kLHintsExpandY)),
+ fVerticalFrame(new TGVerticalFrame(this, 10, 10)),
+ fHorizontalFrame(new TGHorizontalFrame(fVerticalFrame, 10, 10)),
+ fTreeFrame(new TGCompositeFrame(fHorizontalFrame, 10, 10, kSunkenFrame | kFixedWidth)),
+ fTreeCanvas(new TGCanvas(fTreeFrame, 10, 10)),
+ fTree(new TGListTree(fTreeCanvas, kHorizontalFrame)),
+ fHistoPicture(fClient->GetPicture("h1_t.xpm")),
+ fAllItem(fTree->AddItem(NULL, "All")),
+ fFavoritesItem(fTree->AddItem(NULL, "Favorites")),
+ fComparisonItem(fTree->AddItem(NULL, "Comparison")),
+ fTreeSplitter(new TGVSplitter(fHorizontalFrame, 4)),
+ fDrawFrame(new TGCompositeFrame(fHorizontalFrame, 10, 10, kSunkenFrame)),
+ fDrawCanvas(new TRootEmbeddedCanvas("current monitor histogram", fDrawFrame, 10, 10)),
+ fDescriptionSplitter(new TGHSplitter(fVerticalFrame, 4, 4)),
+ fDescriptionFrame(new TGCompositeFrame(fVerticalFrame, 10, 60, kSunkenFrame | kFixedHeight)),
+ fDescription(new TGTextView(fDescriptionFrame, 10, 60, "")),
+ fServerName("localhost"),
+ fSocket(NULL),
+ fSocketHandler(NULL),
+ fFolder(CreateTopFolder()),
+ fCurrentItem(NULL),
+ fBaseItem(NULL),
+ fLoopTimer(NULL),
+ fLoopInterval(1000),
+ fFavoritesFileName(""),
+ fReferenceFileName(""),
+ fReference(CreateTopFolder()),
+ fPrintCommand("gv")
{
// initialize the monitoring client window
- // *** menu bar ***
- fMenuBarLayout = new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX,
- 0, 0, 1, 1);
- fMenuBarItemLayout = new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 4, 0, 0);
- fMenuBarHelpLayout = new TGLayoutHints(kLHintsTop | kLHintsRight);
-
// File menu
- fMenuFile = new TGPopupMenu(gClient->GetRoot());
fMenuFile->AddEntry("&Connect...", kMenuFileConnect);
fMenuFile->AddEntry("&Disconnect...", kMenuFileDisconnect);
fMenuFile->HideEntry(kMenuFileDisconnect);
"OnMenuActivated(Int_t)");
// View menu
- fMenuView = new TGPopupMenu(gClient->GetRoot());
fMenuView->AddEntry("Tool&bar", kMenuViewToolBar);
fMenuView->CheckEntry(kMenuViewToolBar);
fMenuView->AddEntry("&Tree", kMenuViewTree);
"OnMenuActivated(Int_t)");
// Favorites menu
- fMenuFavorites = new TGPopupMenu(gClient->GetRoot());
fMenuFavorites->AddEntry("&Add", kMenuFavAdd);
fMenuFavorites->DisableEntry(kMenuFavAdd);
fMenuFavorites->AddEntry("&Delete", kMenuFavDelete);
"OnMenuActivated(Int_t)");
// Reference menu
- fMenuReference = new TGPopupMenu(gClient->GetRoot());
fMenuReference->AddEntry("&Load...", kMenuRefLoad);
fMenuReference->AddEntry("&Threshold...", kMenuRefThreshold);
fMenuReference->AddSeparator();
"OnMenuActivated(Int_t)");
// Options menu
- fMenuOptions = new TGPopupMenu(gClient->GetRoot());
fMenuOptions->AddEntry("&Loop Interval...", kMenuOptLoop);
fMenuOptions->AddEntry("&Print Command...", kMenuOptPrint);
fMenuOptions->AddSeparator();
"OnMenuActivated(Int_t)");
// Help menu
- fMenuHelp = new TGPopupMenu(gClient->GetRoot());
fMenuHelp->AddEntry("&Documentation...", kMenuHelpDoc);
fMenuHelp->AddEntry("A&bout...", kMenuHelpAbout);
fMenuHelp->Connect("Activated(Int_t)", "AliMonitorClient", this,
"OnMenuActivated(Int_t)");
// menu bar
- fMenuBar = new TGMenuBar(this, 1, 1, kHorizontalFrame);
fMenuBar->AddPopup("&File", fMenuFile, fMenuBarItemLayout);
fMenuBar->AddPopup("&View", fMenuView, fMenuBarItemLayout);
fMenuBar->AddPopup("F&avorites", fMenuFavorites, fMenuBarItemLayout);
// *** tool bar ***
- fToolBarLayout = new TGLayoutHints(kLHintsTop | kLHintsExpandX, 0, 0, 2, 2);
- fToolBarSep = new TGHorizontal3DLine(this);
AddFrame(fToolBarSep, fToolBarLayout);
- fToolBar = new TGToolBar(this, 60, 20, kHorizontalFrame);
AddFrame(fToolBar, fToolBarLayout);
// event number field
- fEventNumberLayout = new TGLayoutHints(kLHintsCenterY | kLHintsLeft,
- 10, 2, 10, 5);
- fEventNumber = new TGNumberEntry(fToolBar, 1, 4, 10,
- TGNumberFormat::kNESInteger);
fEventNumber->SetLimits(TGNumberFormat::kNELLimitMin, 1, 0);
fToolBar->AddFrame(fEventNumber, fEventNumberLayout);
fEventNumber->GetNumberEntry()->Connect("ReturnPressed()",
"OnPrintButtonClicked()");
// *** frames ***
- fBottomLayout = new TGLayoutHints(kLHintsExpandX | kLHintsBottom);
- fLeftLayout = new TGLayoutHints(kLHintsLeft | kLHintsExpandY);
- fExpandLayout = new TGLayoutHints(kLHintsExpandX | kLHintsExpandY);
-
- fVerticalFrame = new TGVerticalFrame(this, 10, 10);
AddFrame(fVerticalFrame, fExpandLayout);
- fHorizontalFrame = new TGHorizontalFrame(fVerticalFrame, 10, 10);
fVerticalFrame->AddFrame(fHorizontalFrame, fExpandLayout);
// tree frame
- fTreeFrame = new TGCompositeFrame(fHorizontalFrame, 10, 10,
- kSunkenFrame | kFixedWidth);
fHorizontalFrame->AddFrame(fTreeFrame, fLeftLayout);
- fTreeCanvas = new TGCanvas(fTreeFrame, 10, 10);
fTreeFrame->AddFrame(fTreeCanvas, fExpandLayout);
- fTree = new TGListTree(fTreeCanvas, kHorizontalFrame);
fTreeCanvas->AddFrame(fTree, fExpandLayout);
fTree->Connect("Clicked(TGListTreeItem*,Int_t)", "AliMonitorClient",
this, "OnTreeClicked(TGListTreeItem*,Int_t)");
this, "OnTreeReturnPressed(TGListTreeItem*)");
// tree items
- fAllItem = fTree->AddItem(NULL, "All");
- fFavoritesItem = fTree->AddItem(NULL, "Favorites");
- fComparisonItem = fTree->AddItem(NULL, "Comparison");
- fHistoPicture = fClient->GetPicture("h1_t.xpm");
fTreeFrame->Resize(100, fTreeFrame->GetDefaultHeight());
// tree / histogram splitter
- fTreeSplitter = new TGVSplitter(fHorizontalFrame, 4);
fTreeSplitter->SetFrame(fTreeFrame, kTRUE);
fHorizontalFrame->AddFrame(fTreeSplitter, fLeftLayout);
// histogram frame
- fDrawFrame = new TGCompositeFrame(fHorizontalFrame, 10, 10, kSunkenFrame);
fHorizontalFrame->AddFrame(fDrawFrame, fExpandLayout);
- fDrawCanvas = new TRootEmbeddedCanvas("current monitor histogram",
- fDrawFrame, 10, 10);
fDrawFrame->AddFrame(fDrawCanvas, fExpandLayout);
// description frame
- fDescriptionFrame = new TGCompositeFrame(fVerticalFrame, 10, 60,
- kSunkenFrame | kFixedHeight);
fVerticalFrame->AddFrame(fDescriptionFrame, fBottomLayout);
- fDescription = new TGTextView(fDescriptionFrame, 10, 60, "");
fDescriptionFrame->AddFrame(fDescription, fExpandLayout);
// histogram / description splitter
- fDescriptionSplitter = new TGHSplitter(fVerticalFrame, 4, 4);
fVerticalFrame->AddFrame(fDescriptionSplitter, fBottomLayout);
fDescriptionSplitter->SetFrame(fDescriptionFrame, kFALSE);
// default data members
- fServerName = "localhost";
- fSocket = NULL;
- fSocketHandler = NULL;
fFolder = CreateTopFolder();
- fCurrentItem = NULL;
- fBaseItem = NULL;
- fLoopTimer = NULL;
- fLoopInterval = 1000;
-
- fFavoritesFileName = "";
-
- fReferenceFileName = "";
fReference = CreateTopFolder();
AliMonitorHisto::SetThreshold(5.0);
- fPrintCommand = "gv";
-
// load saved settings
LoadSettings();
}
delete fHorizontalFrame;
if (fSocket) {
+ fSocketHandler->Remove();
+ fSocket->Send("disconnect");
fSocket->Close();
delete fSocket;
delete fSocketHandler;
if (fMenuOptions->IsEntryChecked(kMenuOptSaveOnExit)) {
SaveSettings();
}
+ if (fSocket) {
+ fSocketHandler->Remove();
+ fSocket->Send("disconnect");
+ fSocket->Close();
+ delete fSocket;
+ fSocket = NULL;
+ delete fSocketHandler;
+ fSocketHandler = NULL;
+ }
+
gApplication->Terminate(0);
}
//_____________________________________________________________________________
-TFolder* AliMonitorClient::CreateTopFolder()
+TFolder* AliMonitorClient::CreateTopFolder() const
{
// create a top folder for monitor histograms
if (serverName.IsNull()) return kFALSE;
// connect to the server
- fSocket = new TSocket(serverName, AliMonitorProcess::kgPort);
+ fSocket = new TSocket(serverName, AliMonitorProcess::GetPort());
if (!fSocket || !fSocket->IsValid() || (fSocket->Send("client") <= 0)) {
if (fSocket) delete fSocket;
fSocket = NULL;
"OnNewData()");
fSocketHandler->Add();
TInetAddress adr = fSocket->GetInetAddress();
- Info("ConnectToServer", "connected to server:\n %s (%s), port %d\n",
- adr.GetHostName(), adr.GetHostAddress(), adr.GetPort());
+ AliInfo(Form("connected to server: %s (%s), port %d",
+ adr.GetHostName(), adr.GetHostAddress(), adr.GetPort()));
fMenuFile->HideEntry(kMenuFileConnect);
fMenuFile->HideEntry(kMenuFileOpen);
fMenuFile->EnableEntry(kMenuFileDisconnect);
if (result == kMBNo) return;
// disconnect from the server
+ fSocketHandler->Remove();
+ fSocket->Send("disconnect");
fSocket->Close();
delete fSocket;
fSocket = NULL;
}
fclose(file);
- Info("SaveFavorites", "favorites saved to file %s",
- fFavoritesFileName.Data());
+ AliInfo(Form("favorites saved to file %s", fFavoritesFileName.Data()));
return kTRUE;
}
fReference->Write();
file->Close();
delete file;
- Info("SaveReference", "reference histograms saved to file %s",
- fReferenceFileName.Data());
+ AliInfo(Form("reference histograms saved to file %s",
+ fReferenceFileName.Data()));
return kTRUE;
}
}
fclose(file);
- Info("LoadSettings", "settings from file %s applied", fileName);
+ AliDebug(1, Form("settings from file %s applied", fileName));
free(fileName);
}
fMenuOptions->IsEntryChecked(kMenuOptSaveOnExit));
fclose(file);
- Info("SaveSettings", "settings saved to file %s", fileName);
+ AliInfo(Form("settings saved to file %s", fileName));
free(fileName);
}
{
// check whether the monitor process server sent new data
- // receive a message from the server
+ // disable the socket handler in this method
if (!fSocket || !fSocket->IsValid()) return kFALSE;
+ fSocketHandler->Remove();
+
+ // receive a control message from the server
+ char controlMessage[256];
+ if (fSocket->Recv(controlMessage, 255) <= 0) {
+ fSocketHandler->Add();
+ return kFALSE;
+ }
+
+ // if it is new histogram data, send ok
+ if ((strcmp(controlMessage, "histograms") != 0) ||
+ (fSocket->Send("ok") <= 0)) {
+ fSocketHandler->Add();
+ return kFALSE;
+ }
+
+ // get the histogram data
TMessage* message = NULL;
- Int_t result = fSocket->Recv(message);
+ if (fSocket->Recv(message) <= 0) {
+ fSocketHandler->Add();
+ return kFALSE;
+ }
// replace the old folder of monitor histos with the new one
- if (result > 0) {
+ if (message->GetClass()->InheritsFrom(TFolder::Class())) {
if (fFolder) delete fFolder;
fFolder = (TFolder*) message->ReadObject(message->GetClass());
+ delete message;
+ fSocketHandler->Add();
return kTRUE;
}
+ delete message;
+ fSocketHandler->Add();
return kFALSE;
}
//_____________________________________________________________________________
-void AliMonitorClient::ClearItems(TGListTreeItem* base)
+void AliMonitorClient::ClearItems(TGListTreeItem* base) const
{
// remove the references to the histograms from all subitems of the
// given tree item