1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 ///////////////////////////////////////////////////////////////////////////////
20 // This class receives monitor histograms from a monitor process and //
21 // provides a graphical user interface for browsing and analysing the //
22 // monitor histograms. //
24 ///////////////////////////////////////////////////////////////////////////////
27 #include "AliMonitorClient.h"
28 #include "AliMonitorProcess.h"
30 #include <TGFileDialog.h>
33 #include <TApplication.h>
38 #include <TGTextEntry.h>
39 #include <TGToolBar.h>
41 #include <TGNumberEntry.h>
43 #include <TGSplitter.h>
44 #include <TGListTree.h>
45 #include <TRootEmbeddedCanvas.h>
46 #include <TGTextView.h>
51 #include "AliMonitorHisto.h"
54 ClassImp(AliMonitorClient)
57 const char* AliMonitorClient::fgSettingsFileName = ".AliMonitorClient";
60 //_____________________________________________________________________________
61 AliMonitorClient::AliMonitorStringDlg::AliMonitorStringDlg(TString& string,
65 AliMonitorDialog(main, 300, 80), fString(string)
67 // create a dialog for connecting to a monitor process
69 fStringLayout = new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 2, 5, 2, 2);
70 fStringLabel = new TGLabel(fFrame, label);
71 fFrame->AddFrame(fStringLabel, fStringLayout);
72 fStringEntry = new TGTextEntry(fFrame, string.Data());
73 fStringEntry->Resize(100, fStringEntry->GetDefaultHeight());
74 fFrame->AddFrame(fStringEntry, fStringLayout);
78 fMain->SetWindowName(title);
79 fMain->MapSubwindows();
81 gClient->WaitFor(fMain);
84 //_____________________________________________________________________________
85 AliMonitorClient::AliMonitorStringDlg::~AliMonitorStringDlg()
94 //_____________________________________________________________________________
95 void AliMonitorClient::AliMonitorStringDlg::OnOkClicked()
97 fString = fStringEntry->GetText();
101 //_____________________________________________________________________________
102 AliMonitorClient::AliMonitorNumberDlg::AliMonitorNumberDlg(Float_t& value,
107 AliMonitorDialog(main, 250, 80), fNumber(value)
109 // create a dialog for getting a number
111 fNumberLayout = new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 2, 5, 2, 2);
112 fNumberLabel = new TGLabel(fFrame, label);
113 fFrame->AddFrame(fNumberLabel, fNumberLayout);
114 fNumberEntry = new TGNumberEntry(fFrame, value, 4, -1,
115 TGNumberFormat::kNESRealOne);
116 fNumberEntry->SetLimits(TGNumberFormat::kNELLimitMin, min, 0);
117 fFrame->AddFrame(fNumberEntry, fNumberLayout);
121 fMain->SetWindowName(title);
122 fMain->MapSubwindows();
124 gClient->WaitFor(fMain);
127 //_____________________________________________________________________________
128 AliMonitorClient::AliMonitorNumberDlg::~AliMonitorNumberDlg()
133 delete fNumberLayout;
137 //_____________________________________________________________________________
138 void AliMonitorClient::AliMonitorNumberDlg::OnOkClicked()
140 fNumber = fNumberEntry->GetNumber();
145 // constants for menu entries
146 enum {kMenuFileConnect, kMenuFileDisconnect, kMenuFileOpen, kMenuFileExit,
147 kMenuViewToolBar, kMenuViewTree, kMenuViewDescription,
148 kMenuViewReference, kMenuViewStatistics,
149 kMenuFavAdd, kMenuFavDelete,
150 kMenuFavLoad, kMenuFavSave, kMenuFavSaveAs, kMenuFavSaveOnExit,
151 kMenuRefLoad, kMenuRefThreshold,
152 kMenuRefTakeCurrent, kMenuRefSave, kMenuRefSaveAs,
153 kMenuOptLoop, kMenuOptPrint,
154 kMenuOptSave, kMenuOptSaveOnExit,
155 kMenuHelpDoc, kMenuHelpAbout
158 //_____________________________________________________________________________
159 AliMonitorClient::AliMonitorClient():
160 TGMainFrame(gClient->GetRoot(), 500, 300)
162 // initialize the monitoring client window
165 fMenuBarLayout = new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX,
167 fMenuBarItemLayout = new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 4, 0, 0);
168 fMenuBarHelpLayout = new TGLayoutHints(kLHintsTop | kLHintsRight);
171 fMenuFile = new TGPopupMenu(gClient->GetRoot());
172 fMenuFile->AddEntry("&Connect...", kMenuFileConnect);
173 fMenuFile->AddEntry("&Disconnect...", kMenuFileDisconnect);
174 fMenuFile->HideEntry(kMenuFileDisconnect);
175 fMenuFile->AddEntry("&Open...", kMenuFileOpen);
176 fMenuFile->AddSeparator();
177 fMenuFile->AddEntry("E&xit", kMenuFileExit);
178 fMenuFile->Connect("Activated(Int_t)", "AliMonitorClient", this,
179 "OnMenuActivated(Int_t)");
182 fMenuView = new TGPopupMenu(gClient->GetRoot());
183 fMenuView->AddEntry("Tool&bar", kMenuViewToolBar);
184 fMenuView->CheckEntry(kMenuViewToolBar);
185 fMenuView->AddEntry("&Tree", kMenuViewTree);
186 fMenuView->CheckEntry(kMenuViewTree);
187 fMenuView->AddEntry("&Description", kMenuViewDescription);
188 fMenuView->CheckEntry(kMenuViewDescription);
189 fMenuView->AddSeparator();
190 fMenuView->AddEntry("&Reference", kMenuViewReference);
191 fMenuView->CheckEntry(kMenuViewReference);
192 AliMonitorHisto::SetDrawRef(kTRUE);
193 fMenuView->AddEntry("&Statistics", kMenuViewStatistics);
194 fMenuView->CheckEntry(kMenuViewStatistics);
195 gStyle->SetOptStat(1110);
196 fMenuView->Connect("Activated(Int_t)", "AliMonitorClient", this,
197 "OnMenuActivated(Int_t)");
200 fMenuFavorites = new TGPopupMenu(gClient->GetRoot());
201 fMenuFavorites->AddEntry("&Add", kMenuFavAdd);
202 fMenuFavorites->DisableEntry(kMenuFavAdd);
203 fMenuFavorites->AddEntry("&Delete", kMenuFavDelete);
204 fMenuFavorites->DisableEntry(kMenuFavDelete);
205 fMenuFavorites->AddSeparator();
206 fMenuFavorites->AddEntry("&Load...", kMenuFavLoad);
207 fMenuFavorites->AddEntry("&Save", kMenuFavSave);
208 fMenuFavorites->DisableEntry(kMenuFavSave);
209 fMenuFavorites->AddEntry("&Save As...", kMenuFavSaveAs);
210 fMenuFavorites->DisableEntry(kMenuFavSaveAs);
211 fMenuFavorites->AddEntry("Save On &Exit", kMenuFavSaveOnExit);
212 fMenuFavorites->CheckEntry(kMenuFavSaveOnExit);
213 fMenuFavorites->Connect("Activated(Int_t)", "AliMonitorClient", this,
214 "OnMenuActivated(Int_t)");
217 fMenuReference = new TGPopupMenu(gClient->GetRoot());
218 fMenuReference->AddEntry("&Load...", kMenuRefLoad);
219 fMenuReference->AddEntry("&Threshold...", kMenuRefThreshold);
220 fMenuReference->AddSeparator();
221 fMenuReference->AddEntry("Take &Current", kMenuRefTakeCurrent);
222 fMenuReference->DisableEntry(kMenuRefTakeCurrent);
223 fMenuReference->AddEntry("&Save", kMenuRefSave);
224 fMenuReference->DisableEntry(kMenuRefSave);
225 fMenuReference->AddEntry("Save &As...", kMenuRefSaveAs);
226 fMenuReference->DisableEntry(kMenuRefSaveAs);
227 fMenuReference->Connect("Activated(Int_t)", "AliMonitorClient", this,
228 "OnMenuActivated(Int_t)");
231 fMenuOptions = new TGPopupMenu(gClient->GetRoot());
232 fMenuOptions->AddEntry("&Loop Interval...", kMenuOptLoop);
233 fMenuOptions->AddEntry("&Print Command...", kMenuOptPrint);
234 fMenuOptions->AddSeparator();
235 fMenuOptions->AddEntry("&Save Settings", kMenuOptSave);
236 fMenuOptions->AddEntry("Save Settings on &Exit", kMenuOptSaveOnExit);
237 fMenuOptions->CheckEntry(kMenuOptSaveOnExit);
238 fMenuOptions->Connect("Activated(Int_t)", "AliMonitorClient", this,
239 "OnMenuActivated(Int_t)");
242 fMenuHelp = new TGPopupMenu(gClient->GetRoot());
243 fMenuHelp->AddEntry("&Documentation...", kMenuHelpDoc);
244 fMenuHelp->AddEntry("A&bout...", kMenuHelpAbout);
245 fMenuHelp->Connect("Activated(Int_t)", "AliMonitorClient", this,
246 "OnMenuActivated(Int_t)");
249 fMenuBar = new TGMenuBar(this, 1, 1, kHorizontalFrame);
250 fMenuBar->AddPopup("&File", fMenuFile, fMenuBarItemLayout);
251 fMenuBar->AddPopup("&View", fMenuView, fMenuBarItemLayout);
252 fMenuBar->AddPopup("F&avorites", fMenuFavorites, fMenuBarItemLayout);
253 fMenuBar->AddPopup("&Reference", fMenuReference, fMenuBarItemLayout);
254 fMenuBar->AddPopup("&Options", fMenuOptions, fMenuBarItemLayout);
255 fMenuBar->AddPopup("&Help", fMenuHelp, fMenuBarHelpLayout);
257 AddFrame(fMenuBar, fMenuBarLayout);
261 fToolBarLayout = new TGLayoutHints(kLHintsTop | kLHintsExpandX, 0, 0, 2, 2);
262 fToolBarSep = new TGHorizontal3DLine(this);
263 AddFrame(fToolBarSep, fToolBarLayout);
264 fToolBar = new TGToolBar(this, 60, 20, kHorizontalFrame);
265 AddFrame(fToolBar, fToolBarLayout);
267 // event number field
268 fEventNumberLayout = new TGLayoutHints(kLHintsCenterY | kLHintsLeft,
270 fEventNumber = new TGNumberEntry(fToolBar, 1, 4, 10,
271 TGNumberFormat::kNESInteger);
272 fEventNumber->SetLimits(TGNumberFormat::kNELLimitMin, 1, 0);
273 fToolBar->AddFrame(fEventNumber, fEventNumberLayout);
274 fEventNumber->GetNumberEntry()->Connect("ReturnPressed()",
275 "AliMonitorClient", this,
276 "OnEventNumberChanged()");
277 fEventNumber->GetButtonUp()->Connect("Clicked()",
278 "AliMonitorClient", this,
279 "OnEventNumberChanged()");
280 fEventNumber->GetButtonDown()->Connect("Clicked()",
281 "AliMonitorClient", this,
282 "OnEventNumberChanged()");
285 ToolBarData_t eventButton = {"h1_s.xpm", "draw event histogram",
287 fToolBar->AddButton(this, &eventButton, 5);
288 fEventButton = eventButton.fButton;
289 fEventButton->Connect("Pressed()", "AliMonitorClient", this,
290 "OnEventButtonPressed()");
293 ToolBarData_t sumButton = {"h2_s.xpm", "draw sum histogram",
295 fToolBar->AddButton(this, &sumButton, 5);
296 fSumButton = sumButton.fButton;
297 fSumButton->Connect("Pressed()", "AliMonitorClient", this,
298 "OnSumButtonPressed()");
301 ToolBarData_t runButton = {"h3_s.xpm", "draw run histogram",
303 fToolBar->AddButton(this, &runButton, 5);
304 fRunButton = runButton.fButton;
305 fRunButton->SetDown(kTRUE);
306 fRunButton->Connect("Pressed()", "AliMonitorClient", this,
307 "OnRunButtonPressed()");
311 sprintf(fileName, "%s/MONITOR/loop_on.xpm", gSystem->Getenv("ALICE_ROOT"));
312 ToolBarData_t loopButton = {fileName, "loop over histograms",
314 fToolBar->AddButton(this, &loopButton, 25);
315 fLoopButton = loopButton.fButton;
316 fLoopButton->Connect("Clicked()", "AliMonitorClient", this,
317 "OnLoopButtonClicked()");
318 fLoopOnPicture = gClient->GetPicture(fileName);
319 sprintf(fileName, "%s/MONITOR/loop_off2.xpm", gSystem->Getenv("ALICE_ROOT"));
320 fLoopOffPicture = gClient->GetPicture(fileName);
323 sprintf(fileName, "%s/MONITOR/previous_s.xpm",
324 gSystem->Getenv("ALICE_ROOT"));
325 ToolBarData_t previousButton = {fileName, "go to previous histogram",
327 fToolBar->AddButton(this, &previousButton, 5);
328 fPreviousButton = previousButton.fButton;
329 fPreviousButton->Connect("Clicked()", "AliMonitorClient", this,
330 "OnPreviousButtonClicked()");
333 sprintf(fileName, "%s/MONITOR/next_s.xpm", gSystem->Getenv("ALICE_ROOT"));
334 ToolBarData_t nextButton = {fileName, "go to next histogram",
336 fToolBar->AddButton(this, &nextButton, 5);
337 fNextButton = nextButton.fButton;
338 fNextButton->Connect("Clicked()", "AliMonitorClient", this,
339 "OnNextButtonClicked()");
342 sprintf(fileName, "%s/MONITOR/copy_s.xpm", gSystem->Getenv("ALICE_ROOT"));
343 ToolBarData_t copyButton = {fileName,
344 "copy the current histogram to a new canvas",
346 fToolBar->AddButton(this, ©Button, 25);
347 fCopyButton = copyButton.fButton;
348 fCopyButton->Connect("Clicked()", "AliMonitorClient", this,
349 "OnCopyButtonClicked()");
352 sprintf(fileName, "%s/MONITOR/save_s.xpm", gSystem->Getenv("ALICE_ROOT"));
353 ToolBarData_t saveButton = {fileName, "save the current histogram",
355 fToolBar->AddButton(this, &saveButton, 5);
356 fSaveButton = saveButton.fButton;
357 fSaveButton->Connect("Clicked()", "AliMonitorClient", this,
358 "OnSaveButtonClicked()");
361 ToolBarData_t printButton = {"printer_s.xpm", "print the current histogram",
363 fToolBar->AddButton(this, &printButton, 5);
364 fPrintButton = printButton.fButton;
365 fPrintButton->Connect("Clicked()", "AliMonitorClient", this,
366 "OnPrintButtonClicked()");
369 fBottomLayout = new TGLayoutHints(kLHintsExpandX | kLHintsBottom);
370 fLeftLayout = new TGLayoutHints(kLHintsLeft | kLHintsExpandY);
371 fExpandLayout = new TGLayoutHints(kLHintsExpandX | kLHintsExpandY);
373 fVerticalFrame = new TGVerticalFrame(this, 10, 10);
374 AddFrame(fVerticalFrame, fExpandLayout);
376 fHorizontalFrame = new TGHorizontalFrame(fVerticalFrame, 10, 10);
377 fVerticalFrame->AddFrame(fHorizontalFrame, fExpandLayout);
380 fTreeFrame = new TGCompositeFrame(fHorizontalFrame, 10, 10,
381 kSunkenFrame | kFixedWidth);
382 fHorizontalFrame->AddFrame(fTreeFrame, fLeftLayout);
383 fTreeCanvas = new TGCanvas(fTreeFrame, 10, 10);
384 fTreeFrame->AddFrame(fTreeCanvas, fExpandLayout);
385 fTree = new TGListTree(fTreeCanvas, kHorizontalFrame);
386 fTreeCanvas->AddFrame(fTree, fExpandLayout);
387 fTree->Connect("Clicked(TGListTreeItem*,Int_t)", "AliMonitorClient",
388 this, "OnTreeClicked(TGListTreeItem*,Int_t)");
389 fTree->Connect("ReturnPressed(TGListTreeItem*)", "AliMonitorClient",
390 this, "OnTreeReturnPressed(TGListTreeItem*)");
393 fAllItem = fTree->AddItem(NULL, "All");
394 fFavoritesItem = fTree->AddItem(NULL, "Favorites");
395 fComparisonItem = fTree->AddItem(NULL, "Comparison");
396 fHistoPicture = fClient->GetPicture("h1_t.xpm");
397 fTreeFrame->Resize(100, fTreeFrame->GetDefaultHeight());
399 // tree / histogram splitter
400 fTreeSplitter = new TGVSplitter(fHorizontalFrame, 4);
401 fTreeSplitter->SetFrame(fTreeFrame, kTRUE);
402 fHorizontalFrame->AddFrame(fTreeSplitter, fLeftLayout);
405 fDrawFrame = new TGCompositeFrame(fHorizontalFrame, 10, 10, kSunkenFrame);
406 fHorizontalFrame->AddFrame(fDrawFrame, fExpandLayout);
407 fDrawCanvas = new TRootEmbeddedCanvas("current monitor histogram",
409 fDrawFrame->AddFrame(fDrawCanvas, fExpandLayout);
412 fDescriptionFrame = new TGCompositeFrame(fVerticalFrame, 10, 60,
413 kSunkenFrame | kFixedHeight);
414 fVerticalFrame->AddFrame(fDescriptionFrame, fBottomLayout);
415 fDescription = new TGTextView(fDescriptionFrame, 10, 60, "");
416 fDescriptionFrame->AddFrame(fDescription, fExpandLayout);
418 // histogram / description splitter
419 fDescriptionSplitter = new TGHSplitter(fVerticalFrame, 4, 4);
420 fVerticalFrame->AddFrame(fDescriptionSplitter, fBottomLayout);
421 fDescriptionSplitter->SetFrame(fDescriptionFrame, kFALSE);
424 Connect("CloseWindow()", "AliMonitorClient", this, "CloseWindow()");
425 SetWindowName("Monitor Client");
426 SetWMSize(GetWidth(), GetHeight());
428 SetWMPosition(100, 100);
434 // default data members
435 fServerName = "localhost";
437 fSocketHandler = NULL;
439 fFolder = CreateTopFolder();
444 fLoopInterval = 1000;
446 fFavoritesFileName = "";
448 fReferenceFileName = "";
449 fReference = CreateTopFolder();
450 AliMonitorHisto::SetThreshold(5.0);
452 fPrintCommand = "gv";
454 // load saved settings
458 //_____________________________________________________________________________
459 AliMonitorClient::AliMonitorClient(const AliMonitorClient& client) :
462 Fatal("AliMonitorClient", "copy constructor not implemented");
465 //_____________________________________________________________________________
466 AliMonitorClient& AliMonitorClient::operator = (const AliMonitorClient&
469 Fatal("operator =", "assignment operator not implemented");
473 //_____________________________________________________________________________
474 AliMonitorClient::~AliMonitorClient()
478 delete fMenuBarLayout;
479 delete fMenuBarItemLayout;
480 delete fMenuBarHelpLayout;
483 delete fMenuFavorites;
484 delete fMenuReference;
489 delete fEventNumberLayout;
491 delete fToolBarLayout;
495 delete fBottomLayout;
497 delete fExpandLayout;
502 delete fTreeSplitter;
507 delete fDescriptionSplitter;
509 delete fDescriptionFrame;
511 delete fVerticalFrame;
512 delete fHorizontalFrame;
517 delete fSocketHandler;
520 if (fFolder) delete fFolder;
523 fLoopTimer->TurnOff();
527 if (fReference) delete fReference;
531 //_____________________________________________________________________________
532 void AliMonitorClient::CloseWindow()
534 // terminate the application when the window is closed
536 if (fMenuFavorites->IsEntryChecked(kMenuFavSaveOnExit)) {
539 if (fMenuOptions->IsEntryChecked(kMenuOptSaveOnExit)) {
542 gApplication->Terminate(0);
546 //_____________________________________________________________________________
547 void AliMonitorClient::OnNewData()
549 // called when data has arrived from the monitor server
551 if (CheckForNewData()) UpdateAll();
555 //_____________________________________________________________________________
556 void AliMonitorClient::OnMenuActivated(Int_t id)
558 // called when a menu item was selected
562 case kMenuFileConnect: {
563 if (ConnectToServer()) UpdateAll();
567 case kMenuFileDisconnect: {
568 DisconnectFromServer();
572 case kMenuFileOpen: {
573 if (OpenFile()) UpdateAll();
577 case kMenuFileExit: {
582 case kMenuViewToolBar: {
583 ViewToolBar(!fMenuView->IsEntryChecked(kMenuViewToolBar));
587 case kMenuViewTree: {
588 ViewTree(!fMenuView->IsEntryChecked(kMenuViewTree));
592 case kMenuViewDescription: {
593 ViewDescription(!fMenuView->IsEntryChecked(kMenuViewDescription));
597 case kMenuViewReference: {
598 ViewReference(!fMenuView->IsEntryChecked(kMenuViewReference));
603 case kMenuViewStatistics: {
604 ViewStatistics(!fMenuView->IsEntryChecked(kMenuViewStatistics));
611 fMenuFavorites->EnableEntry(kMenuFavSave);
612 fMenuFavorites->EnableEntry(kMenuFavSaveAs);
617 case kMenuFavDelete: {
618 if (DeleteFavorite()) {
621 fMenuFavorites->DisableEntry(kMenuFavDelete);
622 fMenuFavorites->EnableEntry(kMenuFavSave);
623 fMenuFavorites->EnableEntry(kMenuFavSaveAs);
629 if (LoadFavorites()) {
632 fMenuFavorites->DisableEntry(kMenuFavSave);
633 fMenuFavorites->EnableEntry(kMenuFavSaveAs);
639 if (SaveFavorites()) {
640 fMenuFavorites->DisableEntry(kMenuFavSave);
645 case kMenuFavSaveAs: {
646 if (SaveFavoritesAs()) {
647 fMenuFavorites->DisableEntry(kMenuFavSave);
652 case kMenuFavSaveOnExit: {
653 if (fMenuFavorites->IsEntryChecked(kMenuFavSaveOnExit)) {
654 fMenuFavorites->UnCheckEntry(kMenuFavSaveOnExit);
656 fMenuFavorites->CheckEntry(kMenuFavSaveOnExit);
662 if (LoadReference()) {
665 UpdateComparisonTree();
666 fMenuReference->EnableEntry(kMenuRefSaveAs);
671 case kMenuRefThreshold: {
672 Float_t threshold = AliMonitorHisto::GetThreshold();
673 new AliMonitorNumberDlg(threshold, this,
674 "Comparison with Reference Histograms",
675 "threshold for comparison:", 0.);
676 if (threshold < 0) break;
678 AliMonitorHisto::SetThreshold(threshold);
680 UpdateComparisonTree();
684 case kMenuRefTakeCurrent: {
685 if (TakeCurrentReference()) {
687 UpdateComparisonTree();
688 fMenuReference->EnableEntry(kMenuRefSave);
689 fMenuReference->EnableEntry(kMenuRefSaveAs);
695 if (SaveReference()) {
696 fMenuReference->DisableEntry(kMenuRefSave);
701 case kMenuRefSaveAs: {
702 if (SaveReferenceAs()) {
703 fMenuReference->DisableEntry(kMenuRefSave);
709 Float_t interval = fLoopInterval * 0.001;
710 new AliMonitorNumberDlg(interval, this, "Loop Interval",
711 "loop time in seconds:", 0.1);
712 if (interval < 0) break;
714 fLoopInterval = Int_t(1000 * interval);
717 fLoopTimer->Start(fLoopInterval);
722 case kMenuOptPrint: {
723 TString printCommand(fPrintCommand);
724 new AliMonitorStringDlg(printCommand, this, "Print Command",
725 "shell command for printing:");
726 if (printCommand.IsNull()) break;
728 fPrintCommand = printCommand;
732 case kMenuOptSaveOnExit: {
733 if (fMenuOptions->IsEntryChecked(kMenuOptSaveOnExit)) {
734 fMenuOptions->UnCheckEntry(kMenuOptSaveOnExit);
736 fMenuOptions->CheckEntry(kMenuOptSaveOnExit);
746 case kMenuHelpAbout: {
748 new TGMsgBox(gClient->GetRoot(), this,
749 "About", "AliMonitorClient $Revision$",
750 kMBIconAsterisk, kMBOk, &result);
756 new TGMsgBox(gClient->GetRoot(), this,
757 "AliMonitorClient", "not yet implemented",
758 kMBIconExclamation, kMBOk, &result);
764 //_____________________________________________________________________________
765 void AliMonitorClient::OnEventNumberChanged()
767 // called when the event number in the tool button was changed
769 if (!fRunButton->IsDown()) {
771 UpdateComparisonTree();
775 //_____________________________________________________________________________
776 void AliMonitorClient::OnEventButtonPressed()
778 // called when the event tool button was clicked
780 fSumButton->SetDown(kFALSE);
781 fRunButton->SetDown(kFALSE);
783 UpdateComparisonTree();
786 //_____________________________________________________________________________
787 void AliMonitorClient::OnSumButtonPressed()
789 // called when the sum tool button was clicked
791 fEventButton->SetDown(kFALSE);
792 fRunButton->SetDown(kFALSE);
794 UpdateComparisonTree();
797 //_____________________________________________________________________________
798 void AliMonitorClient::OnRunButtonPressed()
800 // called when the run tool button was clicked
802 fEventButton->SetDown(kFALSE);
803 fSumButton->SetDown(kFALSE);
805 UpdateComparisonTree();
808 //_____________________________________________________________________________
809 void AliMonitorClient::OnLoopButtonClicked()
811 // called when the loop tool button was clicked
813 // if loop is not running, start the loop timer and
814 // set the stop loop button picture
817 if (!GetBaseItem()) return;
819 fLoopTimer = new TTimer(fLoopInterval);
820 fLoopTimer->Connect("Timeout()", "AliMonitorClient", this,
822 ((TGPictureButton*) fLoopButton)->SetPicture(fLoopOffPicture);
823 fLoopTimer->TurnOn();
825 // if the loop is running, stop it
831 //_____________________________________________________________________________
832 void AliMonitorClient::OnPreviousButtonClicked()
834 // called when the previous tool button was clicked
837 if (!GetBaseItem()) return;
843 //_____________________________________________________________________________
844 void AliMonitorClient::OnNextButtonClicked()
846 // called when the next tool button was clicked
849 if (!GetBaseItem()) return;
855 //_____________________________________________________________________________
856 void AliMonitorClient::OnCopyButtonClicked()
858 // called when the copy tool button was clicked
860 fDrawCanvas->GetCanvas()->DrawClone();
863 //_____________________________________________________________________________
864 void AliMonitorClient::OnSaveButtonClicked()
866 // called when the save tool button was clicked
868 // display a file save dialog
869 static TGFileInfo fileInfo;
870 static const char* fileTypes[] = {"PostScript", "*.ps",
871 "Encapsulated PostScript", "*.eps",
873 "Gif files", "*.gif",
874 "Macro files", "*.C",
875 "ROOT files", "*.root",
878 fileInfo.fFileTypes = fileTypes;
879 new TGFileDialog(gClient->GetRoot(), this, kFDSave, &fileInfo);
880 if (!fileInfo.fFilename) return;
882 fDrawCanvas->GetCanvas()->SaveAs(fileInfo.fFilename);
885 //_____________________________________________________________________________
886 void AliMonitorClient::OnPrintButtonClicked()
888 // called when the print tool button was clicked
890 // save the canvas to a temporary postscript file
891 char fileName[L_tmpnam+4];
892 sprintf(fileName, "%s.ps", tmpnam(NULL));
893 fDrawCanvas->GetCanvas()->SaveAs(fileName);
895 // call the print command and delete the temporary file
897 sprintf(command, "%s %s", fPrintCommand.Data(), fileName);
898 gSystem->Exec(command);
899 gSystem->Unlink(fileName);
903 //_____________________________________________________________________________
904 void AliMonitorClient::OnTreeClicked(TGListTreeItem* item, Int_t)
906 // called when an item in the histogram tree is clicked
908 OnTreeReturnPressed(item);
911 //_____________________________________________________________________________
912 void AliMonitorClient::OnTreeReturnPressed(TGListTreeItem* item)
914 // called when return is pressed at an item in the histogram tree
923 //_____________________________________________________________________________
924 void AliMonitorClient::OnLoopTimer()
926 // called by the loop timer when a new histogram should be displayed
929 if (!GetBaseItem()) return;
935 //_____________________________________________________________________________
936 TFolder* AliMonitorClient::CreateTopFolder() const
938 // create a top folder for monitor histograms
940 return (new TFolder("Monitor", "monitor histograms"));
943 //_____________________________________________________________________________
944 AliMonitorHisto* AliMonitorClient::GetHisto(const char* folderName,
945 const char* histoName)
947 // find the monitor histogram with the given name in the given folder
949 TGListTreeItem* folderItem = fTree->FindChildByName(fAllItem, folderName);
951 TGListTreeItem* histoItem = fTree->FindChildByName(folderItem, histoName);
952 if (histoItem) return (AliMonitorHisto*) histoItem->GetUserData();
957 //_____________________________________________________________________________
958 TGListTreeItem* AliMonitorClient::GetItem(TGListTreeItem* base,
959 const char* folderName,
960 const char* histoName,
963 // find the tree item with given name in the given folder
964 // if create is kTRUE it is created if it is not there
966 // get or create the folder
967 TGListTreeItem* folderItem = fTree->FindChildByName(base, folderName);
969 if (!create) return NULL;
970 folderItem = fTree->AddItem(base, folderName);
973 // get or create the histo
974 TGListTreeItem* histoItem = fTree->FindChildByName(folderItem, histoName);
976 if (!create) return NULL;
977 histoItem = fTree->AddItem(folderItem, histoName,
978 fClient->GetPicture("h1_t.xpm"),
979 fClient->GetPicture("h1_t.xpm"));
985 //_____________________________________________________________________________
986 Bool_t AliMonitorClient::ConnectToServer()
988 // display the dialog for the server name or ip and try to connect to it
990 TString serverName(fServerName);
993 // ask for the server name or ip
994 new AliMonitorStringDlg(serverName, this, "Connection to monitor process",
995 "monitor server name or ip:");
996 if (serverName.IsNull()) return kFALSE;
998 // connect to the server
999 fSocket = new TSocket(serverName, AliMonitorProcess::GetPort());
1000 if (!fSocket || !fSocket->IsValid() || (fSocket->Send("client") <= 0)) {
1001 if (fSocket) delete fSocket;
1004 new TGMsgBox(gClient->GetRoot(), this, "Connect",
1005 "connection to monitor server failed",
1006 kMBIconExclamation, kMBOk, &result);
1008 } else { // set up a handler for notifying when new data is there
1009 fServerName = serverName;
1010 fSocketHandler = new TFileHandler(fSocket->GetDescriptor(),
1011 TFileHandler::kRead);
1012 fSocketHandler->Connect("Notified()", "AliMonitorClient", this,
1014 fSocketHandler->Add();
1015 TInetAddress adr = fSocket->GetInetAddress();
1016 Info("ConnectToServer", "connected to server:\n %s (%s), port %d\n",
1017 adr.GetHostName(), adr.GetHostAddress(), adr.GetPort());
1018 fMenuFile->HideEntry(kMenuFileConnect);
1019 fMenuFile->HideEntry(kMenuFileOpen);
1020 fMenuFile->EnableEntry(kMenuFileDisconnect);
1025 // delete the old monitor histos
1026 if (fFolder) delete fFolder;
1027 fFolder = CreateTopFolder();
1031 //_____________________________________________________________________________
1032 void AliMonitorClient::DisconnectFromServer()
1034 // disconnect from the monitor server
1036 // are-you-really-sure-dialog
1038 new TGMsgBox(gClient->GetRoot(), this, "Disconnect",
1039 "Do you really want to disconnect from the monitor server?",
1040 kMBIconQuestion, kMBYes | kMBNo, &result);
1041 if (result == kMBNo) return;
1043 // disconnect from the server
1044 fSocketHandler->Remove();
1045 fSocket->Send("Finished");
1049 fMenuFile->HideEntry(kMenuFileDisconnect);
1050 fMenuFile->EnableEntry(kMenuFileConnect);
1051 fMenuFile->EnableEntry(kMenuFileOpen);
1054 //_____________________________________________________________________________
1055 Bool_t AliMonitorClient::OpenFile()
1057 // open a file with monitor histograms
1059 // display a file open dialog
1060 static TGFileInfo fileInfo;
1061 static const char* fileTypes[] = {"ROOT files", "*.root",
1064 fileInfo.fFileTypes = fileTypes;
1065 new TGFileDialog(gClient->GetRoot(), this, kFDOpen, &fileInfo);
1066 if (!fileInfo.fFilename) return kFALSE;
1068 // open the root file
1069 TFile* file = TFile::Open(fileInfo.fFilename);
1070 if (!file || !file->IsOpen()) {
1072 new TGMsgBox(gClient->GetRoot(), this, "Open",
1073 "The file could not be opened.",
1074 kMBIconExclamation, kMBOk, &result);
1078 // get the folder with the monitor histograms
1079 TFolder* folder = (TFolder*) file->Get("Monitor");
1080 if (!folder || !folder->InheritsFrom(TFolder::Class())) {
1082 new TGMsgBox(gClient->GetRoot(), this, "Open",
1083 "The file does not contain monitor histograms.",
1084 kMBIconExclamation, kMBOk, &result);
1090 // replace the old folder with the new one
1094 if (fFolder) delete fFolder;
1100 //_____________________________________________________________________________
1101 void AliMonitorClient::ViewToolBar(Bool_t visible)
1103 // en- or disable the view of the tool bar
1106 ShowFrame(fToolBarSep);
1107 ShowFrame(fToolBar);
1108 fMenuView->CheckEntry(kMenuViewToolBar);
1110 HideFrame(fToolBarSep);
1111 HideFrame(fToolBar);
1112 fMenuView->UnCheckEntry(kMenuViewToolBar);
1116 //_____________________________________________________________________________
1117 void AliMonitorClient::ViewTree(Bool_t visible)
1119 // en- or disable the view of the tree
1122 fHorizontalFrame->ShowFrame(fTreeFrame);
1123 fHorizontalFrame->ShowFrame(fTreeSplitter);
1124 fMenuView->CheckEntry(kMenuViewTree);
1126 fHorizontalFrame->HideFrame(fTreeFrame);
1127 fHorizontalFrame->HideFrame(fTreeSplitter);
1128 fMenuView->UnCheckEntry(kMenuViewTree);
1132 //_____________________________________________________________________________
1133 void AliMonitorClient::ViewDescription(Bool_t visible)
1135 // en- or disable the view of the histogram description
1138 fVerticalFrame->ShowFrame(fDescriptionFrame);
1139 fVerticalFrame->ShowFrame(fDescriptionSplitter);
1140 fMenuView->CheckEntry(kMenuViewDescription);
1142 fVerticalFrame->HideFrame(fDescriptionFrame);
1143 fVerticalFrame->HideFrame(fDescriptionSplitter);
1144 fMenuView->UnCheckEntry(kMenuViewDescription);
1148 //_____________________________________________________________________________
1149 void AliMonitorClient::ViewReference(Bool_t visible)
1151 // en- or disable the view of the reference histos
1154 AliMonitorHisto::SetDrawRef(kTRUE);
1155 fMenuView->CheckEntry(kMenuViewReference);
1157 AliMonitorHisto::SetDrawRef(kFALSE);
1158 fMenuView->UnCheckEntry(kMenuViewReference);
1162 //_____________________________________________________________________________
1163 void AliMonitorClient::ViewStatistics(Bool_t visible)
1165 // en- or disable the view of the statistics box
1168 gStyle->SetOptStat(1110);
1169 fMenuView->CheckEntry(kMenuViewStatistics);
1171 gStyle->SetOptStat(0);
1172 fMenuView->UnCheckEntry(kMenuViewStatistics);
1177 //_____________________________________________________________________________
1178 Bool_t AliMonitorClient::AddFavorite()
1180 // add the current histogram or folder to the list of favorites
1182 if (!fCurrentItem || !fCurrentItem->GetParent()) return kFALSE;
1184 // get the folder item
1185 TGListTreeItem* folderItem = fCurrentItem->GetParent();
1186 if (fCurrentItem->GetFirstChild()) folderItem = fCurrentItem;
1188 Bool_t result = kFALSE;
1191 if (fCurrentItem->GetFirstChild()) {
1192 TGListTreeItem* histoItem = fCurrentItem->GetFirstChild();
1194 if (!GetItem(fFavoritesItem, folderItem->GetText(),
1195 histoItem->GetText(), kFALSE)) result = kTRUE;
1196 TGListTreeItem* item = GetItem(fFavoritesItem, folderItem->GetText(),
1197 histoItem->GetText(), kTRUE);
1198 item->SetUserData(histoItem->GetUserData());
1199 histoItem = histoItem->GetNextSibling();
1204 if (!GetItem(fFavoritesItem, folderItem->GetText(),
1205 fCurrentItem->GetText(), kFALSE)) result = kTRUE;
1206 TGListTreeItem* item = GetItem(fFavoritesItem, folderItem->GetText(),
1207 fCurrentItem->GetText(), kTRUE);
1208 item->SetUserData(fCurrentItem->GetUserData());
1211 if (result) gClient->NeedRedraw(fTree);
1215 //_____________________________________________________________________________
1216 Bool_t AliMonitorClient::DeleteFavorite()
1218 // delete the current histogram or folder from the list of favorites
1220 // check that the current item is a favorites histo or folder
1221 if (!fCurrentItem || !fCurrentItem->GetParent()) return kFALSE;
1222 TGListTreeItem* base = fCurrentItem;
1223 while (base->GetParent()) base = base->GetParent();
1224 if (base != fFavoritesItem) return kFALSE;
1227 TGListTreeItem* parent = fCurrentItem->GetParent();
1228 fTree->DeleteItem(fCurrentItem);
1229 fCurrentItem = NULL;
1231 // delete the parent folder if it is empty now
1232 if (parent->GetParent() != NULL) {
1233 if (!parent->GetFirstChild()) fTree->DeleteItem(parent);
1236 gClient->NeedRedraw(fTree);
1240 //_____________________________________________________________________________
1241 Bool_t AliMonitorClient::LoadFavorites(Bool_t dialog)
1243 // load the list of favorites from a file
1245 // display a file open dialog
1246 TGFileInfo fileInfo;
1247 static const char* fileTypes[] = {"Favorites files", "*.fav",
1250 fileInfo.fFileTypes = fileTypes;
1251 fileInfo.fIniDir = StrDup(".");
1252 fileInfo.fFilename = StrDup(fFavoritesFileName.Data());
1254 new TGFileDialog(gClient->GetRoot(), this, kFDOpen, &fileInfo);
1255 if (!fileInfo.fFilename) return kFALSE;
1258 // open the text file
1259 FILE* file = fopen(fileInfo.fFilename, "rt");
1262 new TGMsgBox(gClient->GetRoot(), this, "Load Favorites",
1263 "The file could not be opened.",
1264 kMBIconExclamation, kMBOk, &result);
1268 // delete the old favorites
1269 TGListTreeItem* favFolderItem = fFavoritesItem->GetFirstChild();
1270 while (favFolderItem) {
1271 TGListTreeItem* deleteItem = favFolderItem;
1272 favFolderItem = favFolderItem->GetNextSibling();
1273 fTree->DeleteItem(deleteItem);
1276 // scan the text file and add the favorites histos
1278 while (!feof(file)) {
1279 if (fgets(buffer, 255, file) == NULL) break;
1280 char* folder = strtok(buffer, "/");
1281 char* item = strtok(NULL, "\n");
1282 if (item[strlen(item)-1] == '\n') item[strlen(item)-1] = 0;
1283 if (!folder || !item) continue;
1285 AliMonitorHisto* histo = GetHisto(folder, item);
1286 TGListTreeItem* histoItem = GetItem(fFavoritesItem, folder, item, kTRUE);
1287 histoItem->SetUserData(histo);
1294 //_____________________________________________________________________________
1295 Bool_t AliMonitorClient::SaveFavorites()
1297 // save the list of favorites in a file with the name fFavoritesFileName
1299 // if no file name is given use a default one
1300 if (fFavoritesFileName.IsNull()) {
1301 char* fileName = gSystem->ConcatFileName(gSystem->HomeDirectory(),
1302 "AliMonitorClient.fav");
1303 fFavoritesFileName = fileName;
1307 // open the text file
1308 FILE* file = fopen(fFavoritesFileName.Data(), "wt");
1311 new TGMsgBox(gClient->GetRoot(), this, "Save Favorites",
1312 "The file could not be opened.",
1313 kMBIconExclamation, kMBOk, &result);
1317 // loop over folders
1318 TGListTreeItem* folderItem = fFavoritesItem->GetFirstChild();
1319 while (folderItem) {
1322 TGListTreeItem* histoItem = folderItem->GetFirstChild();
1325 // write the favorites
1326 if (fprintf(file, "%s/%s\n", folderItem->GetText(),
1327 histoItem->GetText()) <= 0) {
1329 new TGMsgBox(gClient->GetRoot(), this, "Save Favorites",
1330 "An error occured while sving the favorites.",
1331 kMBIconExclamation, kMBOk, &result);
1335 histoItem = histoItem->GetNextSibling();
1338 folderItem = folderItem->GetNextSibling();
1342 Info("SaveFavorites", "favorites saved to file %s",
1343 fFavoritesFileName.Data());
1347 //_____________________________________________________________________________
1348 Bool_t AliMonitorClient::SaveFavoritesAs()
1350 // ask for a file name and save the favorites to this file
1352 // display a save file dialog
1353 TGFileInfo fileInfo;
1354 static const char* fileTypes[] = {"Favorites files", "*.fav",
1357 fileInfo.fFileTypes = fileTypes;
1358 fileInfo.fIniDir = StrDup(".");
1359 fileInfo.fFilename = StrDup(fFavoritesFileName.Data());
1360 new TGFileDialog(gClient->GetRoot(), this, kFDSave, &fileInfo);
1361 if (!fileInfo.fFilename) return kFALSE;
1363 // save the favorites
1364 fFavoritesFileName = fileInfo.fFilename;
1365 return SaveFavorites();
1369 //_____________________________________________________________________________
1370 Bool_t AliMonitorClient::LoadReference(Bool_t dialog)
1372 // load reference histograms from a file
1374 // display a file open dialog
1375 TGFileInfo fileInfo;
1376 static const char* fileTypes[] = {"ROOT files", "*.root",
1379 fileInfo.fFileTypes = fileTypes;
1380 fileInfo.fIniDir = StrDup(".");
1381 fileInfo.fFilename = StrDup(fReferenceFileName.Data());
1383 new TGFileDialog(gClient->GetRoot(), this, kFDOpen, &fileInfo);
1384 if (!fileInfo.fFilename) return kFALSE;
1387 // open the root file
1388 TFile* file = TFile::Open(fileInfo.fFilename);
1389 if (!file || !file->IsOpen()) {
1391 new TGMsgBox(gClient->GetRoot(), this, "Load Reference",
1392 "The file could not be opened.",
1393 kMBIconExclamation, kMBOk, &result);
1397 // get the folder with the monitor histograms
1398 TFolder* folder = (TFolder*) file->Get("Monitor");
1399 if (!folder || !folder->InheritsFrom(TFolder::Class())) {
1401 new TGMsgBox(gClient->GetRoot(), this, "Load Reference",
1402 "The file does not contain monitor histograms.",
1403 kMBIconExclamation, kMBOk, &result);
1409 // replace the old reference folder with the new one
1410 fReferenceFileName = fileInfo.fFilename;
1414 if (fReference) delete fReference;
1415 fReference = folder;
1419 //_____________________________________________________________________________
1420 void AliMonitorClient::SetReference()
1422 // set the reference histograms for all monitor histograms
1425 TIterator* iFolder = fFolder->GetListOfFolders()->MakeIterator();
1426 while (TFolder* folder = (TFolder*) iFolder->Next()) {
1427 TFolder* refFolder = (TFolder*) fReference->FindObject(folder->GetName());
1428 if (!refFolder) continue;
1431 TIterator* iHisto = folder->GetListOfFolders()->MakeIterator();
1432 while (AliMonitorHisto* histo = (AliMonitorHisto*) iHisto->Next()) {
1433 AliMonitorHisto* refHisto =
1434 (AliMonitorHisto*) refFolder->FindObject(histo->GetName());
1435 if (!refHisto) continue;
1436 histo->SetReference(refHisto);
1444 //_____________________________________________________________________________
1445 Bool_t AliMonitorClient::TakeCurrentReference()
1447 // take the current monitor histogram or folder as reference
1449 // check that a histo or folder is selected
1450 if (!fCurrentItem) return kFALSE;
1451 AliMonitorHisto* histo = (AliMonitorHisto*) fCurrentItem->GetUserData();
1452 if (!histo && !fCurrentItem->GetFirstChild()) return kFALSE;
1457 sprintf(message, "Do you want to take the current histogram %s/%s "
1458 "as reference histogram?", fCurrentItem->GetParent()->GetText(),
1461 sprintf(message, "Do you want to take all current histogram of the "
1462 "folder %s as reference histogram?", fCurrentItem->GetText());
1465 new TGMsgBox(gClient->GetRoot(), this, "Take Current as Reference",
1466 message, kMBIconQuestion, kMBYes | kMBNo, &result);
1467 if (result != kMBYes) return kFALSE;
1470 if (histo) { // ... a histo
1471 TakeReferenceHisto(fCurrentItem->GetParent()->GetText(), histo);
1472 } else if (fCurrentItem->GetParent()) { // ... a folder
1473 TakeReferenceFolder(fCurrentItem);
1474 } else { // ... a top folder
1475 TGListTreeItem* folderItem = fCurrentItem->GetFirstChild();
1476 while (folderItem) {
1477 TakeReferenceFolder(folderItem);
1478 folderItem = folderItem->GetNextSibling();
1484 //_____________________________________________________________________________
1485 void AliMonitorClient::TakeReferenceHisto(const char* folderName,
1486 AliMonitorHisto* histo)
1488 // take the given monitor histogram as reference histogram
1490 // get or create the reference folder
1491 TFolder* refFolder = (TFolder*) fReference->FindObject(folderName);
1492 if (!refFolder) refFolder = fReference->AddFolder(folderName, folderName);
1494 // delete the old reference histo
1495 AliMonitorHisto* refHisto =
1496 (AliMonitorHisto*) refFolder->FindObject(histo->GetName());
1498 refFolder->Remove(refHisto);
1502 // add the new one and use it as reference
1503 refFolder->Add(new AliMonitorHisto(*histo));
1504 histo->SetReference(histo);
1507 //_____________________________________________________________________________
1508 void AliMonitorClient::TakeReferenceFolder(TGListTreeItem* item)
1510 // take all monitor histogram in the given folder as reference histograms
1513 TGListTreeItem* histoItem = item->GetFirstChild();
1515 AliMonitorHisto* histo = (AliMonitorHisto*) histoItem->GetUserData();
1516 if (histo) TakeReferenceHisto(item->GetText(), histo);
1517 histoItem = histoItem->GetNextSibling();
1521 //_____________________________________________________________________________
1522 Bool_t AliMonitorClient::SaveReference()
1524 // save the reference histograms to the file with name fReferenceFileName
1526 // if no file name is given use a default one
1527 if (fFavoritesFileName.IsNull()) {
1528 char* fileName = gSystem->ConcatFileName(gSystem->HomeDirectory(),
1529 "AliMonitorClientRef.root");
1530 fFavoritesFileName = fileName;
1534 // open the root file
1535 TFile* file = TFile::Open(fReferenceFileName, "RECREATE");
1536 if (!file || !file->IsOpen()) {
1538 new TGMsgBox(gClient->GetRoot(), this, "Save Reference",
1539 "The file could not be opened.",
1540 kMBIconExclamation, kMBOk, &result);
1541 if (file) delete file;
1545 // write the reference folder
1546 fReference->Write();
1549 Info("SaveReference", "reference histograms saved to file %s",
1550 fReferenceFileName.Data());
1554 //_____________________________________________________________________________
1555 Bool_t AliMonitorClient::SaveReferenceAs()
1557 // ask for a file name and save the reference histograms to this file
1559 // display a save file dialog
1560 TGFileInfo fileInfo;
1561 static const char* fileTypes[] = {"ROOT files", "*.root",
1564 fileInfo.fFileTypes = fileTypes;
1565 fileInfo.fIniDir = StrDup(".");
1566 fileInfo.fFilename = StrDup(fReferenceFileName.Data());
1567 new TGFileDialog(gClient->GetRoot(), this, kFDSave, &fileInfo);
1568 if (!fileInfo.fFilename) return kFALSE;
1570 // save the references
1571 fReferenceFileName = fileInfo.fFilename;
1572 return SaveReference();
1576 //_____________________________________________________________________________
1577 void AliMonitorClient::StopLoop()
1579 // stop looping over histograms
1581 // stop the timer and reset the loop button picture
1583 fLoopTimer->TurnOff();
1586 ((TGPictureButton*) fLoopButton)->SetPicture(fLoopOnPicture);
1590 //_____________________________________________________________________________
1591 void AliMonitorClient::LoadSettings()
1593 // load setting from the file with the name fgSettingFileName and apply them
1595 // open the text file
1596 char* fileName = gSystem->ConcatFileName(gSystem->HomeDirectory(),
1597 fgSettingsFileName);
1598 FILE* file = fopen(fileName, "rt");
1604 // scan the text file and apply the settings
1606 while (!feof(file)) {
1607 if (fgets(buffer, 255, file) == NULL) break;
1608 char* token = strtok(buffer, "=");
1609 char* value = strtok(NULL, "\n");
1610 if (!token || !value) continue;
1611 if (value[strlen(value)-1] == '\n') value[strlen(value)-1] = 0;
1613 if (strcmp(token, "ServerName") == 0) {
1614 fServerName = value;
1616 } else if (strcmp(token, "ViewToolBar") == 0) {
1617 ViewToolBar(strcmp(value, "0") != 0);
1618 } else if (strcmp(token, "ViewTree") == 0) {
1619 ViewTree(strcmp(value, "0") != 0);
1620 } else if (strcmp(token, "ViewDescription") == 0) {
1621 ViewDescription(strcmp(value, "0") != 0);
1622 } else if (strcmp(token, "ViewReference") == 0) {
1623 ViewReference(strcmp(value, "0") != 0);
1624 } else if (strcmp(token, "ViewStatistics") == 0) {
1625 ViewStatistics(strcmp(value, "0") != 0);
1627 } else if (strcmp(token, "FavoritesFileName") == 0) {
1628 fFavoritesFileName = value;
1629 LoadFavorites(kFALSE);
1630 } else if (strcmp(token, "FavoritesSaveOnExit") == 0) {
1631 if (strcmp(value, "0") != 0) {
1632 fMenuFavorites->CheckEntry(kMenuFavSaveOnExit);
1634 fMenuFavorites->UnCheckEntry(kMenuFavSaveOnExit);
1637 } else if (strcmp(token, "ReferenceFileName") == 0) {
1638 fReferenceFileName = value;
1639 LoadReference(kFALSE);
1640 } else if (strcmp(token, "ReferenceThreshold") == 0) {
1641 AliMonitorHisto::SetThreshold(atof(value));
1643 } else if (strcmp(token, "LoopInterval") == 0) {
1644 fLoopInterval = atoi(value);
1645 } else if (strcmp(token, "PrintCommand") == 0) {
1646 fPrintCommand = value;
1647 } else if (strcmp(token, "SettingsSaveOnExit") == 0) {
1648 if (strcmp(value, "0") != 0) {
1649 fMenuOptions->CheckEntry(kMenuOptSaveOnExit);
1651 fMenuOptions->UnCheckEntry(kMenuOptSaveOnExit);
1657 Info("LoadSettings", "settings from file %s applied", fileName);
1661 //_____________________________________________________________________________
1662 void AliMonitorClient::SaveSettings()
1664 // save setting to the file with the name fgSettingFileName
1666 // open the text file
1667 char* fileName = gSystem->ConcatFileName(gSystem->HomeDirectory(),
1668 fgSettingsFileName);
1669 FILE* file = fopen(fileName, "wt");
1672 new TGMsgBox(gClient->GetRoot(), this, "Save Settings",
1673 "The file could not be opened.",
1674 kMBIconExclamation, kMBOk, &result);
1679 // write the settings
1680 fprintf(file, "ServerName=%s\n", fServerName.Data());
1682 fprintf(file, "ViewToolBar=%d\n",
1683 fMenuView->IsEntryChecked(kMenuViewToolBar));
1684 fprintf(file, "ViewTree=%d\n",
1685 fMenuView->IsEntryChecked(kMenuViewTree));
1686 fprintf(file, "ViewDescription=%d\n",
1687 fMenuView->IsEntryChecked(kMenuViewDescription));
1688 fprintf(file, "ViewReference=%d\n",
1689 fMenuView->IsEntryChecked(kMenuViewReference));
1690 fprintf(file, "ViewStatistics=%d\n",
1691 fMenuView->IsEntryChecked(kMenuViewStatistics));
1693 if (!fFavoritesFileName.IsNull()) {
1694 fprintf(file, "FavoritesFileName=%s\n", fFavoritesFileName.Data());
1696 fprintf(file, "FavoritesSaveOnExit=%d\n",
1697 fMenuFavorites->IsEntryChecked(kMenuFavSaveOnExit));
1699 if (!fReferenceFileName.IsNull()) {
1700 fprintf(file, "ReferenceFileName=%s\n", fReferenceFileName.Data());
1702 fprintf(file, "ReferenceThreshold=%.1f\n", AliMonitorHisto::GetThreshold());
1704 fprintf(file, "LoopInterval=%d\n", fLoopInterval);
1705 fprintf(file, "PrintCommand=%s\n", fPrintCommand.Data());
1706 fprintf(file, "SettingsSaveOnExit=%d\n",
1707 fMenuOptions->IsEntryChecked(kMenuOptSaveOnExit));
1710 Info("SaveSettings", "settings saved to file %s", fileName);
1715 //_____________________________________________________________________________
1716 Bool_t AliMonitorClient::GetBaseItem()
1718 // get the base item for looping over histograms
1721 // the base item is a folder
1722 fBaseItem = fCurrentItem;
1723 // if the current item is a histo, its parent is the base folder
1724 if (fBaseItem->GetParent() && fBaseItem->GetParent()->GetParent()) {
1725 fBaseItem = fBaseItem->GetParent();
1728 } else { // if no item is selected the All item is the base item
1729 fBaseItem = fAllItem;
1730 fCurrentItem = fBaseItem->GetFirstChild();
1731 if (!fCurrentItem) return kFALSE;
1737 //_____________________________________________________________________________
1738 Bool_t AliMonitorClient::GoToNextItem()
1740 // go to the next histogram in the loop
1742 if (!fCurrentItem) return kFALSE;
1743 if (!fBaseItem || !fBaseItem->GetFirstChild()) return kFALSE;
1745 // remember the start item to avoid an endless loop
1746 TGListTreeItem* startItem = fCurrentItem;
1749 // folder -> first child
1750 if (fCurrentItem->GetFirstChild()) {
1751 fCurrentItem = fCurrentItem->GetFirstChild();
1753 // histo -> next histo
1754 } else if ((fCurrentItem != fBaseItem) &&
1755 (fCurrentItem->GetNextSibling())) {
1756 fCurrentItem = fCurrentItem->GetNextSibling();
1758 // last histo in folder -> next folder
1759 } else if ((fCurrentItem != fBaseItem) &&
1760 (fCurrentItem->GetParent() != fBaseItem) &&
1761 fCurrentItem->GetParent()->GetNextSibling()) {
1762 fCurrentItem = fCurrentItem->GetParent()->GetNextSibling();
1764 // last histo in last folder -> first folder
1766 fCurrentItem = fBaseItem->GetFirstChild();
1769 // abort if no next item found
1770 if (fCurrentItem == startItem) return kFALSE;
1772 // end loop if an item with a monitor histo was found
1773 } while (!fCurrentItem->GetUserData());
1779 //_____________________________________________________________________________
1780 Bool_t AliMonitorClient::GoToPreviousItem()
1782 // go to the previous histogram in the loop
1784 if (!fCurrentItem) return kFALSE;
1785 if (!fBaseItem || !fBaseItem->GetFirstChild()) return kFALSE;
1787 // remember the start item to avoid an endless loop
1788 TGListTreeItem* startItem = fCurrentItem;
1791 // folder -> last child
1792 if (fCurrentItem->GetFirstChild()) {
1793 fCurrentItem = fCurrentItem->GetFirstChild();
1794 while (fCurrentItem->GetNextSibling()) {
1795 fCurrentItem = fCurrentItem->GetNextSibling();
1798 // histo -> previous histo
1799 } else if ((fCurrentItem != fBaseItem) &&
1800 (fCurrentItem->GetPrevSibling())) {
1801 fCurrentItem = fCurrentItem->GetPrevSibling();
1803 // first histo in folder -> previous folder
1804 } else if ((fCurrentItem != fBaseItem) &&
1805 (fCurrentItem->GetParent() != fBaseItem) &&
1806 fCurrentItem->GetParent()->GetPrevSibling()) {
1807 fCurrentItem = fCurrentItem->GetParent()->GetPrevSibling();
1809 // first histo in first folder -> last folder
1811 fCurrentItem = fBaseItem->GetFirstChild();
1812 while (fCurrentItem->GetNextSibling()) {
1813 fCurrentItem = fCurrentItem->GetNextSibling();
1817 // abort if no next item found
1818 if (fCurrentItem == startItem) return kFALSE;
1820 // end loop if an item with a monitor histo was found
1821 } while (!fCurrentItem->GetUserData());
1827 //_____________________________________________________________________________
1828 void AliMonitorClient::UpdateItem(Bool_t highlight)
1830 // update the displayed tree for currently selected item
1832 if (highlight) { // highlight the selected item and open its parent folders
1833 TGListTreeItem* parent = fCurrentItem->GetParent();
1835 if (!parent->IsOpen()) fTree->OpenItem(parent);
1836 parent = parent->GetParent();
1838 fTree->HighlightItem(fCurrentItem);
1839 gClient->NeedRedraw(fTree);
1842 // update displayed histo
1843 UpdateDescription();
1846 // en- or disable the "Reference/Take Current" menu item
1847 TGListTreeItem* base = fCurrentItem;
1848 while (base->GetParent()) base = base->GetParent();
1849 if (base != fComparisonItem) {
1850 fMenuReference->EnableEntry(kMenuRefTakeCurrent);
1852 fMenuReference->DisableEntry(kMenuRefTakeCurrent);
1855 // en- or disable the "Favorites/Add" and "Favorites/Delete" menu items
1856 if (fCurrentItem->GetParent()) {
1857 if (base == fFavoritesItem) {
1858 fMenuFavorites->DisableEntry(kMenuFavAdd);
1859 fMenuFavorites->EnableEntry(kMenuFavDelete);
1861 fMenuFavorites->EnableEntry(kMenuFavAdd);
1862 fMenuFavorites->DisableEntry(kMenuFavDelete);
1865 fMenuFavorites->DisableEntry(kMenuFavAdd);
1866 fMenuFavorites->DisableEntry(kMenuFavDelete);
1871 //_____________________________________________________________________________
1872 Bool_t AliMonitorClient::CheckForNewData()
1874 // check whether the monitor process server sent new data
1876 // receive a message from the server
1877 if (!fSocket || !fSocket->IsValid()) return kFALSE;
1878 TMessage* message = NULL;
1879 Int_t result = fSocket->Recv(message);
1881 // replace the old folder of monitor histos with the new one
1883 if (fFolder) delete fFolder;
1884 fFolder = (TFolder*) message->ReadObject(message->GetClass());
1891 //_____________________________________________________________________________
1892 void AliMonitorClient::ClearItems(TGListTreeItem* base) const
1894 // remove the references to the histograms from all subitems of the
1897 // loop over folders
1898 TGListTreeItem* folderItem = base->GetFirstChild();
1899 while (folderItem) {
1902 TGListTreeItem* histoItem = folderItem->GetFirstChild();
1904 histoItem->SetUserData(NULL);
1905 histoItem = histoItem->GetNextSibling();
1908 folderItem = folderItem->GetNextSibling();
1912 //_____________________________________________________________________________
1913 void AliMonitorClient::CleanUpTree(TGListTreeItem* base)
1915 // remove items without monitor histograms and
1916 // folders without monitor histograms
1918 // loop over folders
1919 TGListTreeItem* folderItem = base->GetFirstChild();
1920 while (folderItem) {
1923 TGListTreeItem* histoItem = folderItem->GetFirstChild();
1925 TGListTreeItem* deleteItem = NULL;
1926 if (!histoItem->GetUserData()) deleteItem = histoItem;
1927 histoItem = histoItem->GetNextSibling();
1928 if (fCurrentItem == deleteItem) fCurrentItem = NULL;
1929 if (deleteItem) fTree->DeleteItem(deleteItem);
1932 folderItem = folderItem->GetNextSibling();
1935 // loop over folders and remove empty folders
1936 folderItem = base->GetFirstChild();
1937 while (folderItem) {
1938 TGListTreeItem* deleteItem = NULL;
1939 if (!folderItem->GetFirstChild()) deleteItem = folderItem;
1940 folderItem = folderItem->GetNextSibling();
1941 if (fCurrentItem == deleteItem) fCurrentItem = NULL;
1942 if (deleteItem) fTree->DeleteItem(deleteItem);
1946 //_____________________________________________________________________________
1947 void AliMonitorClient::UpdateTree()
1949 // update the tree of monitor histograms
1951 // delete references to old monitor histograms
1952 ClearItems(fAllItem);
1955 TIterator* iFolder = fFolder->GetListOfFolders()->MakeIterator();
1956 while (TFolder* folder = (TFolder*) iFolder->Next()) {
1959 TIterator* iHisto = folder->GetListOfFolders()->MakeIterator();
1960 while (AliMonitorHisto* histo = (AliMonitorHisto*) iHisto->Next()) {
1962 // add new monitor histograms
1963 TGListTreeItem* histoItem = GetItem(fAllItem, folder->GetName(),
1964 histo->GetName(), kTRUE);
1965 histoItem->SetUserData(histo);
1972 // remove items and folders without monitor histograms
1973 CleanUpTree(fAllItem);
1975 gClient->NeedRedraw(fTree);
1978 //_____________________________________________________________________________
1979 void AliMonitorClient::UpdateFavoritesTree()
1981 // update the tree of favorite monitor histograms
1983 // loop over folders
1984 TGListTreeItem* folderItem = fFavoritesItem->GetFirstChild();
1985 while (folderItem) {
1988 TGListTreeItem* histoItem = folderItem->GetFirstChild();
1991 // set monitor histo
1992 histoItem->SetUserData(GetHisto(folderItem->GetText(),
1993 histoItem->GetText()));
1994 histoItem = histoItem->GetNextSibling();
1997 folderItem = folderItem->GetNextSibling();
2001 //_____________________________________________________________________________
2002 void AliMonitorClient::UpdateComparisonTree()
2004 // update the tree of monitor histograms with significant deviation
2005 // from the reference histograms
2007 if (!fFolder) return;
2009 // delete references to old monitor histograms
2010 ClearItems(fComparisonItem);
2012 // add monitor histograms where the comparison returns a deviation
2013 // loop over folders
2014 TIterator* iFolder = fFolder->GetListOfFolders()->MakeIterator();
2015 while (TFolder* folder = (TFolder*) iFolder->Next()) {
2018 TIterator* iHisto = folder->GetListOfFolders()->MakeIterator();
2019 while (AliMonitorHisto* histo = (AliMonitorHisto*) iHisto->Next()) {
2021 // compare the histo to its reference
2022 Bool_t comparison = kTRUE;
2023 if (fEventButton->IsDown()) {
2024 comparison = histo->CompareEvent(fEventNumber->GetIntNumber());
2025 } else if (fSumButton->IsDown()) {
2026 comparison = histo->CompareSum(fEventNumber->GetIntNumber());
2028 comparison = histo->CompareRun();
2031 // add it to the comparison tree in case of a bad comparison result
2033 TGListTreeItem* histoItem = GetItem(fComparisonItem, folder->GetName(),
2034 histo->GetName(), kTRUE);
2035 histoItem->SetUserData(histo);
2043 // remove items and folders without monitor histograms
2044 CleanUpTree(fComparisonItem);
2046 gClient->NeedRedraw(fTree);
2049 //_____________________________________________________________________________
2050 void AliMonitorClient::UpdateDescription()
2052 // update the description of the current monitor histogram
2054 fDescription->Clear();
2055 AliMonitorHisto* histo = NULL;
2056 if (fCurrentItem) histo = (AliMonitorHisto*) fCurrentItem->GetUserData();
2057 if (histo) fDescription->LoadBuffer(histo->GetDescription().Data());
2059 gClient->NeedRedraw(fDescription);
2062 //_____________________________________________________________________________
2063 void AliMonitorClient::UpdateHisto()
2065 // update the current monitor histogram
2067 // clear the canvas if no histo is selected
2068 AliMonitorHisto* histo = NULL;
2069 if (fCurrentItem) histo = (AliMonitorHisto*) fCurrentItem->GetUserData();
2071 fDrawCanvas->GetCanvas()->Clear();
2072 fDrawCanvas->GetCanvas()->Update();
2076 // draw the histo for a single event or summed over several events or a run
2077 fDrawCanvas->GetCanvas()->cd();
2078 if (fEventButton->IsDown()) {
2079 histo->DrawEvent(fEventNumber->GetIntNumber());
2080 } else if (fSumButton->IsDown()) {
2081 histo->DrawSum(fEventNumber->GetIntNumber());
2087 //_____________________________________________________________________________
2088 void AliMonitorClient::UpdateAll()
2090 // update the trees, the histogram and the description
2093 UpdateFavoritesTree();
2094 UpdateComparisonTree();
2095 UpdateDescription();