Logo ROOT  
Reference Guide
TSessionViewer.cxx
Go to the documentation of this file.
1// @(#)root/sessionviewer:$Id$
2// Author: Marek Biskup, Jakub Madejczyk, Bertrand Bellenot 10/08/2005
3
4/*************************************************************************
5 * Copyright (C) 1995-2005, Rene Brun and Fons Rademakers. *
6 * All rights reserved. *
7 * *
8 * For the licensing terms see $ROOTSYS/LICENSE. *
9 * For the list of contributors see $ROOTSYS/README/CREDITS. *
10 *************************************************************************/
11
12//////////////////////////////////////////////////////////////////////////
13// //
14// TSessionViewer //
15// //
16// Widget used to manage PROOF or local sessions, PROOF connections, //
17// queries construction and results handling. //
18// //
19//////////////////////////////////////////////////////////////////////////
20
21#include "TApplication.h"
22#include "TROOT.h"
23#include "THashList.h"
24#include "TClass.h"
25#include "TSystem.h"
26#include "TGFileDialog.h"
27#include "TBrowser.h"
28#include "TGButton.h"
29#include "TGLayout.h"
30#include "TGListTree.h"
31#include "TGCanvas.h"
32#include "TGLabel.h"
33#include "TGTextEntry.h"
34#include "TGNumberEntry.h"
35#include "TGTableLayout.h"
36#include "TGComboBox.h"
37#include "TGSplitter.h"
38#include "TGProgressBar.h"
39#include "TGListView.h"
40#include "TGMsgBox.h"
41#include "TGMenu.h"
42#include "TGStatusBar.h"
43#include "TGIcon.h"
44#include "TChain.h"
45#include "TDSet.h"
46#include "TFileInfo.h"
47#include "TProof.h"
48#include "TRandom.h"
49#include "TSessionViewer.h"
50#include "TSessionLogView.h"
51#include "TQueryResult.h"
52#include "TGTextView.h"
53#include "TGMenu.h"
54#include "TGToolBar.h"
55#include "TGTab.h"
56#include "TRootEmbeddedCanvas.h"
57#include "TCanvas.h"
58#include "TGMimeTypes.h"
59#include "TInterpreter.h"
60#include "TContextMenu.h"
61#include "TG3DLine.h"
62#include "TSessionDialogs.h"
63#include "TEnv.h"
64#include "TH2.h"
65#include "TTreePlayer.h"
66#include "TFileCollection.h"
67#ifdef WIN32
68#include "TWin32SplashThread.h"
69#endif
70#include <stdlib.h>
71
73
74const char *kConfigFile = ".proofgui.conf";
75
84
85const char *xpm_names[] = {
86 "monitor01.xpm",
87 "monitor02.xpm",
88 "monitor03.xpm",
89 "monitor04.xpm",
90 0
91};
92
93const char *conftypes[] = {
94 "Config files", "*.conf",
95 "All files", "*.*",
96 0, 0
97};
98
99const char *pkgtypes[] = {
100 "Package files", "*.par",
101 "All files", "*.*",
102 0, 0
103};
104
105const char *macrotypes[] = {
106 "C files", "*.[C|c]*",
107 "All files", "*",
108 0, 0
109};
110
111
112const char *kFeedbackHistos[] = {
113 "PROOF_PacketsHist",
114 "PROOF_EventsHist",
115 "PROOF_NodeHist",
116 "PROOF_LatencyHist",
117 "PROOF_ProcTimeHist",
118 "PROOF_CpuTimeHist",
119 0
120};
121
122const char* const kSession_RedirectFile = ".templog";
123const char* const kSession_RedirectCmd = ".tempcmd";
124
125// Menu command id's
131
136
144
150
156
159
160const char *xpm_toolbar[] = {
161 "fileopen.xpm",
162 "filesaveas.xpm",
163 "",
164 "connect.xpm",
165 "disconnect.xpm",
166 "",
167 "query_new.xpm",
168 "query_submit.xpm",
169 "",
170 "about.xpm",
171 "",
172 "quit.xpm",
173 0
174};
175
177 { "", "Open Config File", kFALSE, kFileLoadConfig, 0 },
178 { "", "Save Config File", kFALSE, kFileSaveConfig, 0 },
179 { "", 0, 0, -1, 0 },
180 { "", "Connect", kFALSE, kSessionConnect, 0 },
181 { "", "Disconnect", kFALSE, kSessionDisconnect, 0 },
182 { "", 0, 0, -1, 0 },
183 { "", "New Query", kFALSE, kQueryNew, 0 },
184 { "", "Submit Query", kFALSE, kQuerySubmit, 0 },
185 { "", 0, 0, -1, 0 },
186 { "", "About Root", kFALSE, kHelpAbout, 0 },
187 { "", 0, 0, -1, 0 },
188 { "", "Exit Root", kFALSE, kFileQuit, 0 },
189 { 0, 0, 0, 0, 0 }
190};
191
192
193////////////////////////////////////////////////////////////////////////////////
194// Server Frame
195
196////////////////////////////////////////////////////////////////////////////////
197/// Constructor.
198
200 TGCompositeFrame(p, w, h), fFrmNewServer(0), fTxtName(0), fTxtAddress(0),
201 fNumPort(0), fLogLevel(0), fTxtConfig(0), fTxtUsrName(0), fSync(0),
202 fViewer(0), fBtnAdd(0), fBtnConnect(0)
203{
204}
205
206////////////////////////////////////////////////////////////////////////////////
207/// Destructor.
208
210{
211 Cleanup();
212}
213
214////////////////////////////////////////////////////////////////////////////////
215/// Build server configuration frame.
216
218{
220
222
223 fViewer = gui;
224 fFrmNewServer = new TGGroupFrame(this, "New Session");
226
228
230
231 fFrmNewServer->AddFrame(new TGLabel(fFrmNewServer, "Session Name:"),
232 new TGLayoutHints(kLHintsLeft, 3, 3, 3, 3));
234 (const char *)0, 1), new TGLayoutHints());
236 fTxtName->Associate(this);
237 fFrmNewServer->AddFrame(new TGLabel(fFrmNewServer, "Server name:"),
238 new TGLayoutHints(kLHintsLeft, 3, 3, 3, 3));
240 (const char *)0, 2), new TGLayoutHints());
242 fTxtAddress->Associate(this);
243 fFrmNewServer->AddFrame(new TGLabel(fFrmNewServer, "Port (default: 1093):"),
244 new TGLayoutHints(kLHintsLeft, 3, 3, 3, 3));
248 fNumPort->Associate(this);
249 fFrmNewServer->AddFrame(new TGLabel(fFrmNewServer, "Configuration File:"),
250 new TGLayoutHints(kLHintsLeft, 3, 3, 3, 3));
252 (const char *)0, 4), new TGLayoutHints());
254 fTxtConfig->Associate(this);
255 fFrmNewServer->AddFrame(new TGLabel(fFrmNewServer, "Log Level:"),
256 new TGLayoutHints(kLHintsLeft, 3, 3, 3, 3));
257
262 new TGLayoutHints(kLHintsLeft, 3, 3, 3, 3));
263 fLogLevel->Associate(this);
264
265 fFrmNewServer->AddFrame(new TGLabel(fFrmNewServer, "User Name:"),
266 new TGLayoutHints(kLHintsLeft, 3, 3, 3, 3));
268 (const char *)0, 6), new TGLayoutHints());
270 fTxtUsrName->Associate(this);
271
272 fFrmNewServer->AddFrame(new TGLabel(fFrmNewServer, "Process mode :"),
274 3, 3, 3, 3));
276 "&Synchronous"), new TGLayoutHints(kLHintsLeft | kLHintsBottom |
277 kLHintsExpandX, 3, 3, 3, 3));
278 fSync->SetToolTipText("Default Process Mode");
280
281 AddFrame(fBtnAdd = new TGTextButton(this, " Save "),
282 new TGLayoutHints(kLHintsTop | kLHintsCenterX, 5, 5, 15, 5));
283 fBtnAdd->SetToolTipText("Add server to the list");
284 fBtnAdd->Connect("Clicked()", "TSessionServerFrame", this,
285 "OnBtnAddClicked()");
286 AddFrame(fBtnConnect = new TGTextButton(this, " Connect "),
287 new TGLayoutHints(kLHintsTop | kLHintsCenterX, 5, 5, 15, 5));
288 fBtnConnect->Connect("Clicked()", "TSessionServerFrame", this,
289 "OnBtnConnectClicked()");
290 fBtnConnect->SetToolTipText("Connect to the selected server");
291
292 fTxtConfig->Connect("DoubleClicked()", "TSessionServerFrame", this,
293 "OnConfigFileClicked()");
294
295 fTxtName->Connect("TextChanged(char*)", "TSessionServerFrame", this,
296 "SettingsChanged()");
297 fTxtAddress->Connect("TextChanged(char*)", "TSessionServerFrame", this,
298 "SettingsChanged()");
299 fTxtConfig->Connect("TextChanged(char*)", "TSessionServerFrame", this,
300 "SettingsChanged()");
301 fTxtUsrName->Connect("TextChanged(char*)", "TSessionServerFrame", this,
302 "SettingsChanged()");
303 fSync->Connect("Clicked()", "TSessionServerFrame", this,
304 "SettingsChanged()");
305 fLogLevel->Connect("ValueChanged(Long_t)", "TSessionServerFrame", this,
306 "SettingsChanged()");
307 fLogLevel->Connect("ValueSet(Long_t)", "TSessionServerFrame", this,
308 "SettingsChanged()");
309 fNumPort->Connect("ValueChanged(Long_t)", "TSessionServerFrame", this,
310 "SettingsChanged()");
311 fNumPort->Connect("ValueSet(Long_t)", "TSessionServerFrame", this,
312 "SettingsChanged()");
313
314}
315
316////////////////////////////////////////////////////////////////////////////////
317/// Settings have changed, update GUI accordingly.
318
320{
321 TGTextEntry *sender = dynamic_cast<TGTextEntry*>((TQObject*)gTQSender);
322 Bool_t issync = (fSync->GetState() == kButtonDown);
323 if ((fViewer->GetActDesc()->fLocal) ||
324 (strcmp(fViewer->GetActDesc()->GetName(), fTxtName->GetText())) ||
325 (strcmp(fViewer->GetActDesc()->fAddress.Data(), fTxtAddress->GetText())) ||
326 (strcmp(fViewer->GetActDesc()->fConfigFile.Data(), fTxtConfig->GetText())) ||
327 (strcmp(fViewer->GetActDesc()->fUserName.Data(), fTxtUsrName->GetText())) ||
330 (fViewer->GetActDesc()->fSync != issync)) {
333 }
334 else {
337 }
338 if (sender) {
339 sender->SetFocus();
340 }
341}
342
343
344////////////////////////////////////////////////////////////////////////////////
345/// Handle expose event in server frame.
346
348{
349 //fTxtName->SelectAll();
350 //fTxtName->SetFocus();
351 return kTRUE;
352}
353
354////////////////////////////////////////////////////////////////////////////////
355/// Browse configuration files.
356
358{
359 // do nothing if connection in progress
360 if (fViewer->IsBusy())
361 return;
362 TGFileInfo fi;
365 if (!fi.fFilename) return;
367}
368
369////////////////////////////////////////////////////////////////////////////////
370/// Delete selected session configuration (remove it from the list).
371
373{
374 // do nothing if connection in progress
375 if (fViewer->IsBusy())
376 return;
378 TIter next(fViewer->GetSessions());
380
381 if (desc->fLocal) {
382 Int_t retval;
383 new TGMsgBox(fClient->GetRoot(), this, "Error Deleting Session",
384 "Deleting Local Sessions is not allowed !",
385 kMBIconExclamation,kMBOk,&retval);
386 return;
387 }
388 // ask for confirmation
389 TString m;
390 m.Form("Are you sure to delete the server \"%s\"",
391 desc->fName.Data());
392 Int_t result;
393 new TGMsgBox(fClient->GetRoot(), this, "", m.Data(), 0,
394 kMBOk | kMBCancel, &result);
395 // if confirmed, delete it
396 if (result == kMBOk) {
397 // remove the Proof session from gROOT list of Proofs
398 if (desc->fConnected && desc->fAttached && desc->fProof) {
399 desc->fProof->Detach("S");
400 }
401 // remove it from our sessions list
402 fViewer->GetSessions()->Remove((TObject *)desc);
403 // update configuration file
406
407 TObject *obj = fViewer->GetSessions()->Last();
409 fViewer->GetSessionItem(), (void *)obj);
410 if (item) {
417 fViewer->OnListTreeClicked(item, 1, 0, 0);
418 }
419 }
420 if (fViewer->IsAutoSave())
422}
423
424////////////////////////////////////////////////////////////////////////////////
425/// Connect to selected server.
426
428{
429 // do nothing if connection in progress
430 if (fViewer->IsBusy())
431 return;
432
435 }
436 else {
439 if (strlen(fTxtConfig->GetText()) > 1)
441 else
446 if (fViewer->IsAutoSave())
448 }
449 // set flag busy
450 fViewer->SetBusy();
451 // avoid input events in list tree while connecting
456 // set watch cursor to indicate connection in progress
458 gVirtualX->CreateCursor(kWatch));
459 gVirtualX->SetCursor(GetId(),gVirtualX->CreateCursor(kWatch));
460 // display connection progress bar in first part of status bar
462 // connect to proof startup message (to update progress bar)
463 TQObject::Connect("TProof", "StartupMessage(char *,Bool_t,Int_t,Int_t)",
464 "TSessionViewer", fViewer, "StartupMessage(char *,Bool_t,Int_t,Int_t)");
465 // collect and set-up configuration
466 TString address = fTxtAddress->GetText();
467 TString url;
468 if (address == "lite://") {
469 url = address;
470 }
471 else {
472 // collect and set-up configuration
473 url = fTxtUsrName->GetText();
474 url += "@"; url += address.Data();
475 if (fNumPort->GetIntNumber() > 0) {
476 url += ":";
477 url += fNumPort->GetIntNumber();
478 }
479 }
480
481 TProofDesc *desc;
483 if (!fViewer->GetActDesc()->fProofMgr ||
485 // hide connection progress bar from status bar
487 // release busy flag
489 // restore cursors and input
490 gVirtualX->SetCursor(GetId(), 0);
495 gVirtualX->SetCursor(fViewer->GetSessionHierarchy()->GetId(), 0);
496 return;
497 }
499 // check if the session already exist before to recreate it
500 TList *sessions = fViewer->GetActDesc()->fProofMgr->QuerySessions("");
501 if (sessions) {
502 TIter nextp(sessions);
503 // loop over existing Proof sessions
504 while ((desc = (TProofDesc *)nextp())) {
505 if ((desc->GetName() == fViewer->GetActDesc()->fTag) ||
506 (desc->GetTitle() == fViewer->GetActDesc()->fName)) {
509 fViewer->GetActDesc()->fTag = desc->GetName();
513
515 Int_t i = 0;
516 // browse list of feedback histos and check user's selected ones
517 while (kFeedbackHistos[i]) {
518 if (fViewer->GetCascadeMenu()->IsEntryChecked(41+i)) {
521 }
522 i++;
523 }
524 // connect feedback signal
525 fViewer->GetActDesc()->fProof->Connect("Feedback(TList *objs)",
526 "TSessionQueryFrame", fViewer->GetQueryFrame(),
527 "Feedback(TList *objs)");
528 gROOT->Time();
529 }
530 else {
531 // if feedback option not selected, clear Proof's feedback option
533 }
534
535 break;
536 }
537 }
538 }
539 if (fViewer->GetActDesc()->fProof == 0) {
540 if (fViewer->GetActDesc()->fProofMgr->IsValid()) {
543 desc = 0;
544 sessions = fViewer->GetActDesc()->fProofMgr->QuerySessions("");
545 if (sessions)
546 desc = (TProofDesc *)sessions->Last();
547 if (desc) {
549 fViewer->GetActDesc()->fTag = desc->GetName();
552 }
553 }
554 }
555 if (fViewer->GetActDesc()->fProof) {
560 if (fViewer->GetActDesc()->fLogLevel < 0)
562 if (fViewer->GetActDesc()->fProof->IsLite())
563 fViewer->GetActDesc()->fAddress = "lite://";
564 else
568 }
570
571 // check if connected and valid
572 if (fViewer->GetActDesc()->fProof &&
574 // set log level
576 // set query type (synch / asynch)
579 // set connected flag
581 // change list tree item picture to connected pixmap
584 if (item) {
586 // update viewer
587 fViewer->OnListTreeClicked(item, 1, 0, 0);
590 }
591 // connect to progress related signals
592 fViewer->GetActDesc()->fProof->Connect("Progress(Long64_t,Long64_t)",
593 "TSessionQueryFrame", fViewer->GetQueryFrame(),
594 "Progress(Long64_t,Long64_t)");
595 fViewer->GetActDesc()->fProof->Connect("Progress(Long64_t,Long64_t,Long64_t,Float_t,Float_t,Float_t,Float_t)",
596 "TSessionQueryFrame", fViewer->GetQueryFrame(),
597 "Progress(Long64_t,Long64_t,Long64_t,Float_t,Float_t,Float_t,Float_t)");
598 fViewer->GetActDesc()->fProof->Connect("Progress(Long64_t,Long64_t,Long64_t,Float_t,Float_t,Float_t,Float_t,Int_t,Int_t,Float_t)",
599 "TSessionQueryFrame", fViewer->GetQueryFrame(),
600 "Progress(Long64_t,Long64_t,Long64_t,Float_t,Float_t,Float_t,Float_t,Int_t,Int_t,Float_t)");
601 fViewer->GetActDesc()->fProof->Connect("StopProcess(Bool_t)",
602 "TSessionQueryFrame", fViewer->GetQueryFrame(),
603 "IndicateStop(Bool_t)");
605 "ResetProgressDialog(const char*,Int_t,Long64_t,Long64_t)",
606 "TSessionQueryFrame", fViewer->GetQueryFrame(),
607 "ResetProgressDialog(const char*,Int_t,Long64_t,Long64_t)");
608 // enable timer used for status bar icon's animation
610 // change status bar right icon to connected pixmap
611 fViewer->ChangeRightLogo("monitor01.xpm");
612 // do not animate yet
614 // connect to signal "query result ready"
615 fViewer->GetActDesc()->fProof->Connect("QueryResultReady(char *)",
616 "TSessionViewer", fViewer, "QueryResultReady(char *)");
617 // display connection information on status bar
618 TString msg;
619 msg.Form("PROOF Cluster %s ready", fViewer->GetActDesc()->fName.Data());
620 fViewer->GetStatusBar()->SetText(msg.Data(), 1);
624 // Enable previously uploaded packages if in auto-enable mode
626 TPackageDescription *package;
628 while ((package = (TPackageDescription *)next())) {
629 if (!package->fEnabled) {
630 if (fViewer->GetActDesc()->fProof->EnablePackage(package->fName) != 0)
631 Error("Submit", "Enable package failed");
632 else {
633 package->fEnabled = kTRUE;
635 }
636 }
637 }
638 }
639 }
640 // hide connection progress bar from status bar
642 // release busy flag
644 // restore cursors and input
645 gVirtualX->SetCursor(GetId(), 0);
650 gVirtualX->SetCursor(fViewer->GetSessionHierarchy()->GetId(), 0);
651}
652
653////////////////////////////////////////////////////////////////////////////////
654/// Reset server configuration fields.
655
657{
658 // do nothing if connection in progress
659 if (fViewer->IsBusy())
660 return;
668 fTxtName->SetText("");
669 fTxtAddress->SetText("");
670 fTxtConfig->SetText("");
671 fNumPort->SetIntNumber(1093);
673 fTxtUsrName->SetText("");
674}
675
676////////////////////////////////////////////////////////////////////////////////
677/// Add newly created session configuration in the list of sessions.
678
680{
681 Int_t retval;
682 Bool_t newSession = kTRUE;
683 TSessionDescription* desc = 0;
684 // do nothing if connection in progress
685 if (fViewer->IsBusy())
686 return;
687
688 if ((!fTxtName->GetBuffer()->GetTextLength()) ||
691 new TGMsgBox(fClient->GetRoot(), fViewer, "Error Adding Session",
692 "At least one required field is empty !",
693 kMBIconExclamation, kMBOk, &retval);
694 return;
695 }
697 if (obj)
698 desc = dynamic_cast<TSessionDescription*>(obj);
699 if (desc) {
700 new TGMsgBox(fClient->GetRoot(), fViewer, "Adding Session",
701 TString::Format("The session \"%s\" already exists ! Overwrite ?",
703 kMBCancel, &retval);
704 if (retval != kMBYes)
705 return;
706 newSession = kFALSE;
707 }
708 if (newSession) {
709 desc = new TSessionDescription();
710 desc->fName = fTxtName->GetText();
711 desc->fTag = "";
712 desc->fQueries = new TList();
713 desc->fPackages = new TList();
714 desc->fActQuery = 0;
715 desc->fProof = 0;
716 desc->fProofMgr = 0;
717 desc->fAutoEnable = kFALSE;
718 desc->fAddress = fTxtAddress->GetText();
719 desc->fPort = fNumPort->GetIntNumber();
720 desc->fConnected = kFALSE;
721 desc->fAttached = kFALSE;
722 desc->fLocal = kFALSE;
723 if (strlen(fTxtConfig->GetText()) > 1)
725 else
726 desc->fConfigFile = "";
728 desc->fUserName = fTxtUsrName->GetText();
729 desc->fSync = (fSync->GetState() == kButtonDown);
730 // add newly created session config to our session list
731 fViewer->GetSessions()->Add((TObject *)desc);
732 // save into configuration file
734 fViewer->GetSessionItem(), desc->fName.Data(),
736 fViewer->GetSessionHierarchy()->SetToolTipItem(item, "Proof Session");
737 item->SetUserData(desc);
745 fViewer->OnListTreeClicked(item, 1, 0, 0);
746 }
747 else {
751 if (strlen(fTxtConfig->GetText()) > 1)
757 item2->SetUserData(fViewer->GetActDesc());
759 1, 0, 0);
760 }
763 if (fViewer->IsAutoSave())
765}
766
767////////////////////////////////////////////////////////////////////////////////
768/// Update fields with values from session description desc.
769
771{
772 if (desc->fLocal) {
773 fTxtName->SetText("");
774 fTxtAddress->SetText("");
775 fNumPort->SetIntNumber(1093);
776 fTxtConfig->SetText("");
777 fTxtUsrName->SetText("");
779 return;
780 }
781
782 fTxtName->SetText(desc->fName);
786
787 if (desc->fConfigFile.Length() > 1) {
789 }
790 else {
791 fTxtConfig->SetText("");
792 }
794}
795
796////////////////////////////////////////////////////////////////////////////////
797/// Process messages for session server frame.
798/// Used to navigate between text entry fields.
799
801{
802 switch (GET_MSG(msg)) {
803 case kC_TEXTENTRY:
804 switch (GET_SUBMSG(msg)) {
805 case kTE_ENTER:
806 case kTE_TAB:
807 switch (parm1) {
808 case 1: // session name
811 break;
812 case 2: // server address
815 break;
816 case 3: // port number
819 break;
820 case 4: // configuration file
823 break;
824 case 5: // log level
827 break;
828 case 6: // user name
831 break;
832 }
833 break;
834
835 default:
836 break;
837 }
838 break;
839
840 default:
841 break;
842 }
843 return kTRUE;
844}
845
846////////////////////////////////////////////////////////////////////////////////
847// Session Frame
848
849////////////////////////////////////////////////////////////////////////////////
850/// Constructor.
851
853 TGCompositeFrame(p, w, h), fTab(0), fFA(0), fFB(0), fFC(0), fFD(0), fFE(0),
854 fCommandTxt(0), fCommandBuf(0), fInfoTextView(0), fClearCheck(0),
855 fBtnShowLog(0), fBtnNewQuery(0), fBtnGetQueries(0), fLBPackages(0),
856 fBtnAdd(0), fBtnRemove(0), fBtnUp(0), fBtnDown(0), fBtnShow(0),
857 fBtnShowEnabled(0), fChkMulti(0), fChkEnable(0), fBtnUpload(0),
858 fBtnEnable(0), fBtnClear(0), fBtnDisable(0), fDSetView(0), fDataSetTree(0),
859 fBtnUploadDSet(0), fBtnRemoveDSet(0), fBtnVerifyDSet(0), fBtnRefresh(0),
860 fTxtParallel(0), fLogLevel(0), fApplyLogLevel(0), fApplyParallel(0),
861 fViewer(0)
862{
863 for (int i=0;i<19;++i) fInfoLine[i] = 0;
864}
865
866////////////////////////////////////////////////////////////////////////////////
867/// Destructor.
868
870{
871 Cleanup();
872}
873
874////////////////////////////////////////////////////////////////////////////////
875/// Build session frame.
876
878{
881 fViewer = gui;
882 Int_t i,j;
883
884 // main session tab
885 fTab = new TGTab(this, 200, 200);
887 kLHintsExpandY, 2, 2, 2, 2));
888
889 // add "Status" tab element
890 TGCompositeFrame *tf = fTab->AddTab("Status");
891 fFA = new TGCompositeFrame(tf, 100, 100, kVerticalFrame);
894
895 // add first session information line
896 fInfoLine[0] = new TGLabel(fFA, " ");
898 kLHintsExpandX, 5, 5, 15, 5));
899
900 TGCompositeFrame* frmInfos = new TGHorizontalFrame(fFA, 350, 100);
901 frmInfos->SetLayoutManager(new TGTableLayout(frmInfos, 9, 2));
902
903 // add session information lines
904 j = 0;
905 for (i=0;i<17;i+=2) {
906 fInfoLine[i+1] = new TGLabel(frmInfos, " ");
907 frmInfos->AddFrame(fInfoLine[i+1], new TGTableLayoutHints(0, 1, j, j+1,
908 kLHintsLeft | kLHintsCenterY, 5, 5, 2, 2));
909 fInfoLine[i+2] = new TGLabel(frmInfos, " ");
910 frmInfos->AddFrame(fInfoLine[i+2], new TGTableLayoutHints(1, 2, j, j+1,
911 kLHintsLeft | kLHintsCenterY, 5, 5, 2, 2));
912 j++;
913 }
915 kLHintsExpandX | kLHintsExpandY, 5, 5, 5, 5));
916
917 // add "new query" and "get queries" buttons
918 TGCompositeFrame* frmBut1 = new TGHorizontalFrame(fFA, 350, 100);
919 frmBut1->SetCleanup(kDeepCleanup);
920 frmBut1->AddFrame(fBtnNewQuery = new TGTextButton(frmBut1, "New Query..."),
921 new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 5, 5, 5, 5));
922 fBtnNewQuery->SetToolTipText("Open New Query Dialog");
923 frmBut1->AddFrame(fBtnGetQueries = new TGTextButton(frmBut1, " Get Queries "),
924 new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 5, 5, 5, 5));
925 fBtnGetQueries->SetToolTipText("Get List of Queries from the server");
926 fBtnShowLog = new TGTextButton(frmBut1, "Show log...");
927 fBtnShowLog->SetToolTipText("Show Session log (opens log window)");
929 kLHintsExpandX, 5, 5, 5, 5));
932
933 // add "Commands" tab element
934 tf = fTab->AddTab("Commands");
935 fFC = new TGCompositeFrame(tf, 100, 100, kVerticalFrame);
938
939 // add command line label and text entry
940 TGCompositeFrame* frmCmd = new TGHorizontalFrame(fFC, 350, 100);
941 frmCmd->SetCleanup(kDeepCleanup);
942 frmCmd->AddFrame(new TGLabel(frmCmd, "Command Line :"),
943 new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 5, 5, 15, 5));
944 fCommandBuf = new TGTextBuffer(120);
945 frmCmd->AddFrame(fCommandTxt = new TGTextEntry(frmCmd,
947 kLHintsExpandX, 5, 5, 15, 5));
948 fFC->AddFrame(frmCmd, new TGLayoutHints(kLHintsExpandX, 5, 5, 10, 5));
949 // connect command line text entry to "return pressed" signal
950 fCommandTxt->Connect("ReturnPressed()", "TSessionFrame", this,
951 "OnCommandLine()");
952
953 // check box for option "clear view"
954 fClearCheck = new TGCheckButton(fFC, "Clear view after each command");
956 10, 5, 5, 5));
958 // add text view for redirected output
959 fFC->AddFrame(new TGLabel(fFC, "Output :"),
960 new TGLayoutHints(kLHintsLeft | kLHintsTop, 10, 5, 5, 5));
961 fInfoTextView = new TGTextView(fFC, 330, 150, "", kSunkenFrame |
964 kLHintsTop | kLHintsExpandX | kLHintsExpandY, 10, 10, 5, 5));
965
966 // add "Packages" tab element
967 tf = fTab->AddTab("Packages");
968 fFB = new TGCompositeFrame(tf, 100, 100, kVerticalFrame);
971
972 // new frame containing packages listbox and control buttons
973 TGCompositeFrame* frmcanvas = new TGHorizontalFrame(fFB, 350, 100);
974
975 // packages listbox
976 fLBPackages = new TGListBox(frmcanvas);
977 fLBPackages->Resize(80,150);
980 kLHintsExpandY, 5, 5, 5, 5));
981 // control buttons frame
982 TGCompositeFrame* frmBut2 = new TGVerticalFrame(frmcanvas, 150, 100);
983
984 fChkMulti = new TGCheckButton(frmBut2, "Multiple Selection");
985 fChkMulti->SetToolTipText("Enable multiple selection in the package list");
986 frmBut2->AddFrame(fChkMulti, new TGLayoutHints(kLHintsLeft, 5, 5, 5, 5));
987
988 fBtnAdd = new TGTextButton(frmBut2, " Add... ");
989 fBtnAdd->SetToolTipText("Add a package to the list");
991 kLHintsExpandX, 5, 5, 5, 5));
992 fBtnRemove = new TGTextButton(frmBut2, "Remove");
993 fBtnRemove->SetToolTipText("Remove package from the list");
995 kLHintsExpandX, 5, 5, 5, 5));
996 fBtnUp = new TGTextButton(frmBut2, "Move Up");
997 fBtnUp->SetToolTipText("Move package one step upward in the list");
999 kLHintsExpandX, 5, 5, 5, 5));
1000 fBtnDown = new TGTextButton(frmBut2, "Move Down");
1001 fBtnDown->SetToolTipText("Move package one step downward in the list");
1003 kLHintsExpandX, 5, 5, 5, 5));
1004 frmcanvas->AddFrame(frmBut2, new TGLayoutHints(kLHintsLeft | kLHintsCenterY |
1006 fFB->AddFrame(frmcanvas, new TGLayoutHints(kLHintsLeft | kLHintsTop |
1008
1009 TGCompositeFrame* frmLeg = new TGHorizontalFrame(fFB, 300, 100);
1010 frmLeg->SetCleanup(kDeepCleanup);
1011 TGPicture *pic1 = (TGPicture *)fClient->GetPicture("package.xpm");
1012 TGIcon *icn1 = new TGIcon(frmLeg, pic1, pic1->GetWidth(), pic1->GetHeight());
1013 frmLeg->AddFrame(icn1, new TGLayoutHints(kLHintsLeft | kLHintsTop,
1014 5, 5, 0, 5));
1015 frmLeg->AddFrame(new TGLabel(frmLeg, ": Local"),
1016 new TGLayoutHints(kLHintsLeft | kLHintsTop, 0, 10, 0, 5));
1017
1018 TGPicture *pic2 = (TGPicture *)fClient->GetPicture("package_delete.xpm");
1019 TGIcon *icn2 = new TGIcon(frmLeg, pic2, pic2->GetWidth(), pic2->GetHeight());
1020 frmLeg->AddFrame(icn2, new TGLayoutHints(kLHintsLeft | kLHintsTop,
1021 5, 5, 0, 5));
1022 frmLeg->AddFrame(new TGLabel(frmLeg, ": Uploaded"),
1023 new TGLayoutHints(kLHintsLeft | kLHintsTop, 0, 10, 0, 5));
1024
1025 TGPicture *pic3 = (TGPicture *)fClient->GetPicture("package_add.xpm");
1026 TGIcon *icn3 = new TGIcon(frmLeg, pic3, pic3->GetWidth(), pic3->GetHeight());
1027 frmLeg->AddFrame(icn3, new TGLayoutHints(kLHintsLeft | kLHintsTop,
1028 5, 5, 0, 5));
1029 frmLeg->AddFrame(new TGLabel(frmLeg, ": Enabled"),
1030 new TGLayoutHints(kLHintsLeft | kLHintsTop, 0, 10, 0, 5));
1032 kLHintsExpandX, 0, 0, 0, 0));
1033
1034 TGCompositeFrame* frmBtn = new TGHorizontalFrame(fFB, 300, 100);
1035 frmBtn->SetCleanup(kDeepCleanup);
1036 frmBtn->AddFrame(fBtnUpload = new TGTextButton(frmBtn,
1037 " Upload "), new TGLayoutHints(kLHintsLeft | kLHintsExpandX |
1038 kLHintsCenterY, 5, 5, 5, 5));
1039 fBtnUpload->SetToolTipText("Upload selected package(s) to the server");
1040 frmBtn->AddFrame(fBtnEnable = new TGTextButton(frmBtn,
1041 " Enable "), new TGLayoutHints(kLHintsLeft | kLHintsExpandX |
1042 kLHintsCenterY, 5, 5, 5, 5));
1043 fBtnEnable->SetToolTipText("Enable selected package(s) on the server");
1044 frmBtn->AddFrame(fBtnDisable = new TGTextButton(frmBtn,
1045 " Disable "), new TGLayoutHints(kLHintsLeft | kLHintsExpandX |
1046 kLHintsCenterY, 5, 5, 5, 5));
1047 fBtnDisable->SetToolTipText("Disable selected package(s) on the server");
1048 frmBtn->AddFrame(fBtnClear = new TGTextButton(frmBtn,
1049 " Clear "), new TGLayoutHints(kLHintsLeft | kLHintsExpandX |
1050 kLHintsCenterY, 5, 5, 5, 5));
1051 fBtnClear->SetToolTipText("Clear all packages on the server");
1052 fFB->AddFrame(frmBtn, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
1053
1055
1056 TGCompositeFrame* frmBtn3 = new TGHorizontalFrame(fFB, 300, 100);
1057 frmBtn3->SetCleanup(kDeepCleanup);
1058 fBtnShow = new TGTextButton(frmBtn3, "Show packages");
1059 fBtnShow->SetToolTipText("Show (list) available packages on the server");
1061 kLHintsExpandX, 5, 5, 5, 5));
1062 fBtnShowEnabled = new TGTextButton(frmBtn3, "Show Enabled");
1063 fBtnShowEnabled->SetToolTipText("Show (list) enabled packages on the server");
1065 kLHintsExpandX, 5, 5, 5, 5));
1066 fFB->AddFrame(frmBtn3, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
1067
1068 fChkEnable = new TGCheckButton(fFB, "Enable at session startup");
1069 fChkEnable->SetToolTipText("Enable packages on the server at startup time");
1070 fFB->AddFrame(fChkEnable, new TGLayoutHints(kLHintsLeft, 5, 5, 5, 5));
1071
1072 // add "DataSets" tab element
1073 tf = fTab->AddTab("DataSets");
1074 fFE = new TGCompositeFrame(tf, 100, 100, kVerticalFrame);
1077
1078 // new frame containing datasets treeview and control buttons
1079 TGCompositeFrame* frmdataset = new TGHorizontalFrame(fFE, 350, 100);
1080
1081 // datasets list tree
1082 fDSetView = new TGCanvas(frmdataset, 200, 200, kSunkenFrame | kDoubleBorder);
1084 5, 5, 5, 5));
1086 fDataSetTree->AddItem(0, "DataSets");
1087
1088 // control buttons frame
1089 TGCompositeFrame* frmBut3 = new TGVerticalFrame(frmdataset, 150, 100);
1090
1091 fBtnUploadDSet = new TGTextButton(frmBut3, " Upload... ");
1092 fBtnUploadDSet->SetToolTipText("Upload a dataset to the cluster");
1094 kLHintsExpandX, 5, 5, 5, 5));
1095 fBtnRemoveDSet = new TGTextButton(frmBut3, "Remove");
1096 fBtnRemoveDSet->SetToolTipText("Remove dataset from the cluster");
1098 kLHintsExpandX, 5, 5, 5, 5));
1099 fBtnVerifyDSet = new TGTextButton(frmBut3, "Verify");
1100 fBtnVerifyDSet->SetToolTipText("Verify dataset on the cluster");
1102 kLHintsExpandX, 5, 5, 5, 5));
1103 fBtnRefresh = new TGTextButton(frmBut3, "Refresh List");
1104 fBtnRefresh->SetToolTipText("Refresh List of DataSet/Files present on the cluster");
1106 kLHintsExpandX, 5, 5, 15, 5));
1107
1108 frmdataset->AddFrame(frmBut3, new TGLayoutHints(kLHintsLeft | kLHintsCenterY |
1109 kLHintsExpandY, 5, 5, 5, 0));
1110
1111 fFE->AddFrame(frmdataset, new TGLayoutHints(kLHintsLeft | kLHintsTop |
1113
1114 // add "Options" tab element
1115 tf = fTab->AddTab("Options");
1116 fFD = new TGCompositeFrame(tf, 100, 100, kVerticalFrame);
1119
1120 // add Log Level label and text entry
1121 TGCompositeFrame* frmLog = new TGHorizontalFrame(fFD, 310, 100, kFixedWidth);
1122 frmLog->SetCleanup(kDeepCleanup);
1123 frmLog->AddFrame(fApplyLogLevel = new TGTextButton(frmLog,
1124 " Apply "), new TGLayoutHints(kLHintsRight |
1125 kLHintsCenterY, 10, 5, 5, 5));
1126 fApplyLogLevel->SetToolTipText("Apply currently selected log level");
1130 kLHintsCenterY, 5, 5, 5, 5));
1131 frmLog->AddFrame(new TGLabel(frmLog, "Log Level :"),
1132 new TGLayoutHints(kLHintsRight | kLHintsCenterY, 5, 5, 5, 5));
1133 fFD->AddFrame(frmLog, new TGLayoutHints(kLHintsLeft, 5, 5, 15, 5));
1134
1135 // add Parallel Nodes label and text entry
1136 TGCompositeFrame* frmPar = new TGHorizontalFrame(fFD, 310, 100, kFixedWidth);
1137 frmPar->SetCleanup(kDeepCleanup);
1138 frmPar->AddFrame(fApplyParallel = new TGTextButton(frmPar,
1139 " Apply "), new TGLayoutHints(kLHintsRight |
1140 kLHintsCenterY, 10, 5, 5, 5));
1141 fApplyParallel->SetToolTipText("Apply currently selected parallel nodes");
1142 fTxtParallel = new TGTextEntry(frmPar);
1144 fTxtParallel->SetText("99999");
1147 kLHintsCenterY, 5, 5, 5, 5));
1148 frmPar->AddFrame(new TGLabel(frmPar, "Set Parallel Nodes :"),
1149 new TGLayoutHints(kLHintsRight | kLHintsCenterY, 5, 5, 5, 5));
1150 fFD->AddFrame(frmPar, new TGLayoutHints(kLHintsLeft, 5, 5, 5, 5));
1151
1152 // connect button actions to functions
1153 fBtnShowLog->Connect("Clicked()", "TSessionFrame", this,
1154 "OnBtnShowLogClicked()");
1155 fBtnNewQuery->Connect("Clicked()", "TSessionFrame", this,
1156 "OnBtnNewQueryClicked()");
1157 fBtnGetQueries->Connect("Clicked()", "TSessionFrame", this,
1158 "OnBtnGetQueriesClicked()");
1159
1160 fChkEnable->Connect("Toggled(Bool_t)", "TSessionFrame", this,
1161 "OnStartupEnable(Bool_t)");
1162 fChkMulti->Connect("Toggled(Bool_t)", "TSessionFrame", this,
1163 "OnMultipleSelection(Bool_t)");
1164 fBtnAdd->Connect("Clicked()", "TSessionFrame", this,
1165 "OnBtnAddClicked()");
1166 fBtnRemove->Connect("Clicked()", "TSessionFrame", this,
1167 "OnBtnRemoveClicked()");
1168 fBtnUp->Connect("Clicked()", "TSessionFrame", this,
1169 "OnBtnUpClicked()");
1170 fBtnDown->Connect("Clicked()", "TSessionFrame", this,
1171 "OnBtnDownClicked()");
1172 fApplyLogLevel->Connect("Clicked()", "TSessionFrame", this,
1173 "OnApplyLogLevel()");
1174 fApplyParallel->Connect("Clicked()", "TSessionFrame", this,
1175 "OnApplyParallel()");
1176 fBtnUpload->Connect("Clicked()", "TSessionFrame", this,
1177 "OnUploadPackages()");
1178 fBtnEnable->Connect("Clicked()", "TSessionFrame", this,
1179 "OnEnablePackages()");
1180 fBtnDisable->Connect("Clicked()", "TSessionFrame", this,
1181 "OnDisablePackages()");
1182 fBtnClear->Connect("Clicked()", "TSessionFrame", this,
1183 "OnClearPackages()");
1184 fBtnShowEnabled->Connect("Clicked()", "TSessionViewer", fViewer,
1185 "ShowEnabledPackages()");
1186 fBtnShow->Connect("Clicked()", "TSessionViewer", fViewer,
1187 "ShowPackages()");
1188
1189 fBtnUploadDSet->Connect("Clicked()", "TSessionFrame", this,
1190 "OnBtnUploadDSet()");
1191 fBtnRemoveDSet->Connect("Clicked()", "TSessionFrame", this,
1192 "OnBtnRemoveDSet()");
1193 fBtnVerifyDSet->Connect("Clicked()", "TSessionFrame", this,
1194 "OnBtnVerifyDSet()");
1195 fBtnRefresh->Connect("Clicked()", "TSessionFrame", this,
1196 "UpdateListOfDataSets()");
1197}
1198
1199////////////////////////////////////////////////////////////////////////////////
1200/// Display information on current session.
1201
1203{
1204 TString buf;
1205
1206 // if local session
1207 if (fViewer->GetActDesc()->fLocal) {
1208 buf.Form("*** Local Session on %s ***", gSystem->HostName());
1209 fInfoLine[0]->SetText(buf.Data());
1210 UserGroup_t *userGroup = gSystem->GetUserInfo();
1211 fInfoLine[1]->SetText("User :");
1212 if (userGroup) buf.Form("%s", userGroup->fRealName.Data());
1213 fInfoLine[2]->SetText(buf.Data());
1214 fInfoLine[3]->SetText("Working directory :");
1215 buf.Form("%s", gSystem->WorkingDirectory());
1216 fInfoLine[4]->SetText(buf.Data());
1217 fInfoLine[5]->SetText(" ");
1218 fInfoLine[6]->SetText(" ");
1219 fInfoLine[7]->SetText(" ");
1220 fInfoLine[8]->SetText(" ");
1221 fInfoLine[9]->SetText(" ");
1222 fInfoLine[10]->SetText(" ");
1223 fInfoLine[11]->SetText(" ");
1224 fInfoLine[12]->SetText(" ");
1225 fInfoLine[13]->SetText(" ");
1226 fInfoLine[14]->SetText(" ");
1227 fInfoLine[15]->SetText(" ");
1228 fInfoLine[16]->SetText(" ");
1229 fInfoLine[17]->SetText(" ");
1230 fInfoLine[18]->SetText(" ");
1231 if (userGroup) delete userGroup;
1232 Layout();
1234 return;
1235 }
1236 // return if not a valid Proof session
1237 if (!fViewer->GetActDesc()->fConnected ||
1239 !fViewer->GetActDesc()->fProof ||
1241 return;
1242
1243 if (!fViewer->GetActDesc()->fProof->IsMaster()) {
1245 buf.Form("*** Connected to %s (parallel mode, %d workers) ***",
1248 else
1249 buf.Form("*** Connected to %s (sequential mode) ***",
1251 fInfoLine[0]->SetText(buf.Data());
1252 fInfoLine[1]->SetText("Port number : ");
1253 buf.Form("%d", fViewer->GetActDesc()->fProof->GetPort());
1254 fInfoLine[2]->SetText(buf.Data());
1255 fInfoLine[3]->SetText("User : ");
1256 buf.Form("%s", fViewer->GetActDesc()->fProof->GetUser());
1257 fInfoLine[4]->SetText(buf.Data());
1258 fInfoLine[5]->SetText("Client protocol version : ");
1260 fInfoLine[6]->SetText(buf.Data());
1261 fInfoLine[7]->SetText("Remote protocol version : ");
1263 fInfoLine[8]->SetText(buf.Data());
1264 fInfoLine[9]->SetText("Log level : ");
1265 buf.Form("%d", fViewer->GetActDesc()->fProof->GetLogLevel());
1266 fInfoLine[10]->SetText(buf.Data());
1267 fInfoLine[11]->SetText("Session unique tag : ");
1268 buf.Form("%s", fViewer->GetActDesc()->fProof->IsValid() ?
1269 fViewer->GetActDesc()->fProof->GetSessionTag() : " ");
1270 fInfoLine[12]->SetText(buf.Data());
1271 fInfoLine[13]->SetText("Total MB's processed :");
1272 buf.Form("%.2f", float(fViewer->GetActDesc()->fProof->GetBytesRead())/(1024*1024));
1273 fInfoLine[14]->SetText(buf.Data());
1274 fInfoLine[15]->SetText("Total real time used (s) :");
1275 buf.Form("%.3f", fViewer->GetActDesc()->fProof->GetRealTime());
1276 fInfoLine[16]->SetText(buf.Data());
1277 fInfoLine[17]->SetText("Total CPU time used (s) :");
1278 buf.Form("%.3f", fViewer->GetActDesc()->fProof->GetCpuTime());
1279 fInfoLine[18]->SetText(buf.Data());
1280 }
1281 else {
1283 buf.Form("*** Master server %s (parallel mode, %d workers) ***",
1286 else
1287 buf.Form("*** Master server %s (sequential mode) ***",
1289 fInfoLine[0]->SetText(buf.Data());
1290 fInfoLine[1]->SetText("Port number : ");
1291 buf.Form("%d", fViewer->GetActDesc()->fProof->GetPort());
1292 fInfoLine[2]->SetText(buf.Data());
1293 fInfoLine[3]->SetText("User : ");
1294 buf.Form("%s", fViewer->GetActDesc()->fProof->GetUser());
1295 fInfoLine[4]->SetText(buf.Data());
1296 fInfoLine[5]->SetText("Protocol version : ");
1298 fInfoLine[6]->SetText(buf.Data());
1299 fInfoLine[7]->SetText("Image name : ");
1300 buf.Form("%s",fViewer->GetActDesc()->fProof->GetImage());
1301 fInfoLine[8]->SetText(buf.Data());
1302 fInfoLine[9]->SetText("Config directory : ");
1303 buf.Form("%s", fViewer->GetActDesc()->fProof->GetConfDir());
1304 fInfoLine[10]->SetText(buf.Data());
1305 fInfoLine[11]->SetText("Config file : ");
1306 buf.Form("%s", fViewer->GetActDesc()->fProof->GetConfFile());
1307 fInfoLine[12]->SetText(buf.Data());
1308 fInfoLine[13]->SetText("Total MB's processed :");
1309 buf.Form("%.2f", float(fViewer->GetActDesc()->fProof->GetBytesRead())/(1024*1024));
1310 fInfoLine[14]->SetText(buf.Data());
1311 fInfoLine[15]->SetText("Total real time used (s) :");
1312 buf.Form("%.3f", fViewer->GetActDesc()->fProof->GetRealTime());
1313 fInfoLine[16]->SetText(buf.Data());
1314 fInfoLine[17]->SetText("Total CPU time used (s) :");
1315 buf.Form("%.3f", fViewer->GetActDesc()->fProof->GetCpuTime());
1316 fInfoLine[18]->SetText(buf.Data());
1317 }
1318 Layout();
1320}
1321
1322////////////////////////////////////////////////////////////////////////////////
1323/// Open Upload Dataset dialog.
1324
1326{
1327 if (fViewer->IsBusy())
1328 return;
1329 if (fViewer->GetActDesc()->fLocal) return;
1330 new TUploadDataSetDlg(fViewer, 450, 360);
1331}
1332
1333////////////////////////////////////////////////////////////////////////////////
1334/// Update list of dataset present on the cluster.
1335
1337{
1338 TObjString *dsetname;
1339 TFileInfo *dsetfilename;
1340 // cleanup the list
1345
1346 const TGPicture *dseticon = fClient->GetPicture("rootdb_t.xpm");
1347 // ask for the list of datasets
1348
1349 // TODO: is now returning a TMap; viewer has to be adapted
1350 TList *dsetlist = 0; //fViewer->GetActDesc()->fProof->GetDataSets();
1351 // coverity[dead_error_condition]: to be changed for TMap usage
1352 if (dsetlist) {
1353 TGListTreeItem *dsetitem;
1355 TIter nextdset(dsetlist);
1356 while ((dsetname = (TObjString *)nextdset())) {
1358 // add the dataset in the tree
1360 dsetname->GetName(), dsetname);
1361 // ask for the list of files in the dataset
1362 TList *dsetfilelist = fViewer->GetActDesc()->fProof->GetDataSet(
1363 dsetname->GetName())->GetList();
1364 if(dsetfilelist) {
1365 TIter nextdsetfile(dsetfilelist);
1366 while ((dsetfilename = (TFileInfo *)nextdsetfile())) {
1367 if (! fDataSetTree->FindItemByObj(dsetitem, dsetfilename)) {
1368 // if not already in, add the file name in the tree
1369 fDataSetTree->AddItem(dsetitem,
1370 dsetfilename->GetFirstUrl()->GetUrl(),
1371 dsetfilename, dseticon, dseticon);
1372 }
1373 }
1374 // open the dataset item in order to show the files
1375 fDataSetTree->OpenItem(dsetitem);
1376 }
1377 }
1378 }
1379 }
1380 }
1381 // refresh list tree
1383}
1384
1385////////////////////////////////////////////////////////////////////////////////
1386/// Remove dataset from the list and from the cluster.
1387
1389{
1390 TGListTreeItem *item;
1391 TObjString *obj = 0;
1392 if (fViewer->GetActDesc()->fLocal) return;
1393
1394 item = fDataSetTree->GetSelected();
1395 if (!item) return;
1396 if (item->GetParent() == 0) return;
1397 if (item->GetParent() == fDataSetTree->GetFirstItem()) {
1398 // Dataset itself
1399 obj = (TObjString *)item->GetUserData();
1400 }
1401 else if (item->GetParent()->GetParent() == fDataSetTree->GetFirstItem()) {
1402 // One file of the dataset
1403 obj = (TObjString *)item->GetParent()->GetUserData();
1404 }
1405
1406 // if valid Proof session, set parallel slaves
1407 if (obj && fViewer->GetActDesc()->fProof &&
1411 }
1412}
1413
1414////////////////////////////////////////////////////////////////////////////////
1415/// Verify that the files in the selected dataset are present on the cluster.
1416
1418{
1419 TGListTreeItem *item;
1420 TObjString *obj = 0;
1421 if (fViewer->GetActDesc()->fLocal) return;
1422
1423 item = fDataSetTree->GetSelected();
1424 if (!item) return;
1425 if (item->GetParent() == 0) return;
1426 if (item->GetParent() == fDataSetTree->GetFirstItem()) {
1427 // Dataset itself
1428 obj = (TObjString *)item->GetUserData();
1429 }
1430 else if (item->GetParent()->GetParent() == fDataSetTree->GetFirstItem()) {
1431 // One file of the dataset
1432 obj = (TObjString *)item->GetParent()->GetUserData();
1433 }
1434
1435 // if valid Proof session, set parallel slaves
1436 if (obj && fViewer->GetActDesc()->fProof &&
1439 }
1440}
1441
1442////////////////////////////////////////////////////////////////////////////////
1443/// Apply selected log level on current session.
1444
1446{
1447 // if local session, do nothing
1448 if (fViewer->GetActDesc()->fLocal) return;
1449 // if valid Proof session, set log level
1450 if (fViewer->GetActDesc()->fProof &&
1454 }
1456}
1457
1458////////////////////////////////////////////////////////////////////////////////
1459/// Apply selected number of workers on current Proof session.
1460
1462{
1463 // if local session, do nothing
1464 if (fViewer->GetActDesc()->fLocal) return;
1465 // if valid Proof session, set parallel slaves
1466 if (fViewer->GetActDesc()->fProof &&
1468 Int_t nodes = atoi(fTxtParallel->GetText());
1470 }
1472}
1473
1474////////////////////////////////////////////////////////////////////////////////
1475/// Handle multiple selection check button.
1476
1478{
1480}
1481
1482////////////////////////////////////////////////////////////////////////////////
1483/// Handle multiple selection check button.
1484
1486{
1487 if (fViewer->GetActDesc())
1489}
1490
1491////////////////////////////////////////////////////////////////////////////////
1492/// Update list of packages.
1493
1495{
1496 TPackageDescription *package;
1497 const TGPicture *pict;
1500 while ((package = (TPackageDescription *)next())) {
1501 if (package->fEnabled)
1502 pict = fClient->GetPicture("package_add.xpm");
1503 else if (package->fUploaded)
1504 pict = fClient->GetPicture("package_delete.xpm");
1505 else
1506 pict = fClient->GetPicture("package.xpm");
1508 package->fId, package->fPathName, pict);
1510 }
1513}
1514
1515////////////////////////////////////////////////////////////////////////////////
1516/// Upload selected package(s) to the current session.
1517
1519{
1520 // if local session, do nothing
1521 if (fViewer->GetActDesc()->fLocal) return;
1522 // if valid Proof session, upload packages
1523 if (fViewer->GetActDesc()->fProof &&
1525 TObject *obj;
1526 TList selected;
1527 fLBPackages->GetSelectedEntries(&selected);
1528 TIter next(&selected);
1529 while ((obj = next())) {
1530 TString name = obj->GetTitle();
1531 if (fViewer->GetActDesc()->fProof->UploadPackage(name.Data()) != 0)
1532 Error("Submit", "Upload package failed");
1533 else {
1535 if (!o) continue;
1536 TPackageDescription *package =
1537 dynamic_cast<TPackageDescription *>(o);
1538 if (package) {
1539 package->fUploaded = kTRUE;
1540 ((TGIconLBEntry *)obj)->SetPicture(
1541 fClient->GetPicture("package_delete.xpm"));
1542 }
1543 }
1544 }
1546 }
1549}
1550
1551////////////////////////////////////////////////////////////////////////////////
1552/// Enable selected package(s) in the current session.
1553
1555{
1556 // if local session, do nothing
1557 if (fViewer->GetActDesc()->fLocal) return;
1558 // if valid Proof session, enable packages
1559 if (fViewer->GetActDesc()->fProof &&
1561 TObject *obj;
1562 TList selected;
1564 fLBPackages->GetSelectedEntries(&selected);
1565 TIter next(&selected);
1566 while ((obj = next())) {
1567 TString name = obj->GetTitle();
1569 if (!o) continue;
1570 TPackageDescription *package =
1571 dynamic_cast<TPackageDescription *>(o);
1572 if (package) {
1573 if (!package->fUploaded) {
1574 if (fViewer->GetActDesc()->fProof->UploadPackage(name.Data()) != 0)
1575 Error("Submit", "Upload package failed");
1576 else {
1577 package->fUploaded = kTRUE;
1578 ((TGIconLBEntry *)obj)->SetPicture(
1579 fClient->GetPicture("package_delete.xpm"));
1580 }
1581 }
1582 }
1584 Error("Submit", "Enable package failed");
1585 else {
1586 package->fEnabled = kTRUE;
1587 ((TGIconLBEntry *)obj)->SetPicture(fClient->GetPicture("package_add.xpm"));
1588 }
1589 }
1592 }
1595}
1596
1597////////////////////////////////////////////////////////////////////////////////
1598/// Disable selected package(s) in the current session.
1599
1601{
1602 // if local session, do nothing
1603 if (fViewer->GetActDesc()->fLocal) return;
1604 // if valid Proof session, disable (clear) packages
1605 if (fViewer->GetActDesc()->fProof &&
1607 TObject *obj;
1608 TList selected;
1609 fLBPackages->GetSelectedEntries(&selected);
1610 TIter next(&selected);
1611 while ((obj = next())) {
1612 TString name = obj->GetTitle();
1613 if (fViewer->GetActDesc()->fProof->ClearPackage(name) != 0)
1614 Error("Submit", "Clear package failed");
1615 else {
1617 if (!o) continue;
1618 TPackageDescription *package =
1619 dynamic_cast<TPackageDescription *>(o);
1620 if (package) {
1621 package->fEnabled = kFALSE;
1622 package->fUploaded = kFALSE;
1623 ((TGIconLBEntry *)obj)->SetPicture(fClient->GetPicture("package.xpm"));
1624 }
1625 }
1626 }
1628 }
1631}
1632
1633////////////////////////////////////////////////////////////////////////////////
1634/// Clear (disable) all packages in the current session.
1635
1637{
1638 TPackageDescription *package;
1639 // if local session, do nothing
1640 if (fViewer->GetActDesc()->fLocal) return;
1641 // if valid Proof session, clear packages
1642 if (fViewer->GetActDesc()->fProof &&
1644 if (fViewer->GetActDesc()->fProof->ClearPackages() != 0)
1645 Error("Submit", "Clear packages failed");
1646 else {
1648 while ((package = (TPackageDescription *)next())) {
1649 package->fEnabled = kFALSE;
1650 }
1651 }
1652 }
1655}
1656
1657////////////////////////////////////////////////////////////////////////////////
1658/// Open file dialog and add selected package file to the list.
1659
1661{
1662 if (fViewer->IsBusy())
1663 return;
1664 TGFileInfo fi;
1665 TPackageDescription *package;
1666 TGIconLBEntry *entry;
1667 fi.fFileTypes = pkgtypes;
1669 if (fi.fMultipleSelection && fi.fFileNamesList) {
1670 TObjString *el;
1671 TIter next(fi.fFileNamesList);
1672 while ((el = (TObjString *) next())) {
1673 package = new TPackageDescription;
1674 package->fName = gSystem->BaseName(gSystem->UnixPathName(el->GetString()));
1675 package->fPathName = gSystem->UnixPathName(el->GetString());
1676 package->fId = fViewer->GetActDesc()->fPackages->GetEntries();
1677 package->fUploaded = kFALSE;
1678 package->fEnabled = kFALSE;
1679 fViewer->GetActDesc()->fPackages->Add((TObject *)package);
1680 entry = new TGIconLBEntry(fLBPackages->GetContainer(),
1681 package->fId, package->fPathName,
1682 fClient->GetPicture("package.xpm"));
1684 }
1685 }
1686 else if (fi.fFilename) {
1687 package = new TPackageDescription;
1689 package->fPathName = gSystem->UnixPathName(fi.fFilename);
1690 package->fId = fViewer->GetActDesc()->fPackages->GetEntries();
1691 package->fUploaded = kFALSE;
1692 package->fEnabled = kFALSE;
1693 fViewer->GetActDesc()->fPackages->Add((TObject *)package);
1694 entry = new TGIconLBEntry(fLBPackages->GetContainer(),
1695 package->fId, package->fPathName,
1696 fClient->GetPicture("package.xpm"));
1698 }
1701}
1702
1703////////////////////////////////////////////////////////////////////////////////
1704/// Remove selected package from the list.
1705
1707{
1708 TPackageDescription *package;
1709 const TGPicture *pict;
1710 Int_t pos = fLBPackages->GetSelected();
1713 fViewer->GetActDesc()->fPackages->At(pos));
1714 Int_t id = 0;
1716 while ((package = (TPackageDescription *)next())) {
1717 package->fId = id;
1718 id++;
1719 if (package->fEnabled)
1720 pict = fClient->GetPicture("package_add.xpm");
1721 else if (package->fUploaded)
1722 pict = fClient->GetPicture("package_delete.xpm");
1723 else
1724 pict = fClient->GetPicture("package.xpm");
1726 package->fId, package->fPathName, pict);
1728 }
1731}
1732
1733////////////////////////////////////////////////////////////////////////////////
1734/// Move selected package entry one position up in the list.
1735
1737{
1738 TPackageDescription *package;
1739 const TGPicture *pict;
1740 Int_t pos = fLBPackages->GetSelected();
1741 if (pos <= 0) return;
1743 package = (TPackageDescription *)fViewer->GetActDesc()->fPackages->At(pos);
1745 fViewer->GetActDesc()->fPackages->At(pos));
1746 package->fId -= 1;
1747 fViewer->GetActDesc()->fPackages->AddAt(package, package->fId);
1748 Int_t id = 0;
1750 while ((package = (TPackageDescription *)next())) {
1751 package->fId = id;
1752 id++;
1753 if (package->fEnabled)
1754 pict = fClient->GetPicture("package_add.xpm");
1755 else if (package->fUploaded)
1756 pict = fClient->GetPicture("package_delete.xpm");
1757 else
1758 pict = fClient->GetPicture("package.xpm");
1760 package->fId, package->fPathName, pict);
1762 }
1763 fLBPackages->Select(pos-1);
1766}
1767
1768////////////////////////////////////////////////////////////////////////////////
1769/// Move selected package entry one position down in the list.
1770
1772{
1773 TPackageDescription *package;
1774 const TGPicture *pict;
1775 Int_t pos = fLBPackages->GetSelected();
1776 if (pos == -1 || pos == fViewer->GetActDesc()->fPackages->GetEntries()-1)
1777 return;
1779 package = (TPackageDescription *)fViewer->GetActDesc()->fPackages->At(pos);
1781 fViewer->GetActDesc()->fPackages->At(pos));
1782 package->fId += 1;
1783 fViewer->GetActDesc()->fPackages->AddAt(package, package->fId);
1784 Int_t id = 0;
1786 while ((package = (TPackageDescription *)next())) {
1787 package->fId = id;
1788 id++;
1789 if (package->fEnabled)
1790 pict = fClient->GetPicture("package_add.xpm");
1791 else if (package->fUploaded)
1792 pict = fClient->GetPicture("package_delete.xpm");
1793 else
1794 pict = fClient->GetPicture("package.xpm");
1796 package->fId, package->fPathName, pict);
1798 }
1799 fLBPackages->Select(pos+1);
1802}
1803
1804////////////////////////////////////////////////////////////////////////////////
1805/// Disconnect from current Proof session.
1806
1808{
1809 // if local session, do nothing
1810 if (fViewer->GetActDesc()->fLocal) return;
1811 // if valid Proof session, disconnect (close)
1812 if (fViewer->GetActDesc()->fAttached &&
1816 }
1817 // reset connected flag
1819 fViewer->GetActDesc()->fProof = 0;
1820 // disable animation timer
1822 // change list tree item picture to disconnected pixmap
1825 if (item) {
1828 }
1829 // update viewer
1831 1, 0, 0);
1834 fViewer->GetStatusBar()->SetText("", 1);
1835}
1836
1837////////////////////////////////////////////////////////////////////////////////
1838/// Show session log.
1839
1841{
1842 fViewer->ShowLog(0);
1843}
1844
1845////////////////////////////////////////////////////////////////////////////////
1846/// Call "New Query" Dialog.
1847
1849{
1850 TNewQueryDlg *dlg = new TNewQueryDlg(fViewer, 350, 310);
1851 dlg->Popup();
1852}
1853
1854////////////////////////////////////////////////////////////////////////////////
1855/// Get list of queries from current Proof server and populate the list tree.
1856
1858{
1859 TList *lqueries = 0;
1860 TQueryResult *query = 0;
1861 TQueryDescription *newquery = 0, *lquery = 0;
1862 if (fViewer->GetActDesc()->fProof &&
1864 lqueries = fViewer->GetActDesc()->fProof->GetListOfQueries();
1865 }
1866 if (lqueries) {
1867 TIter nextp(lqueries);
1868 // loop over list of queries received from Proof server
1869 while ((query = (TQueryResult *)nextp())) {
1870 // create new query description
1871 newquery = new TQueryDescription();
1872 newquery->fReference = TString::Format("%s:%s", query->GetTitle(),
1873 query->GetName());
1874 // check in our tree if it is already there
1875 TGListTreeItem *item =
1878 // if already there, skip
1880 newquery->fReference.Data()))
1881 continue;
1882 // check also in our query description list
1883 Bool_t found = kFALSE;
1884 TIter nextp2(fViewer->GetActDesc()->fQueries);
1885 while ((lquery = (TQueryDescription *)nextp2())) {
1886 if (lquery->fReference.CompareTo(newquery->fReference) == 0) {
1887 found = kTRUE;
1888 break;
1889 }
1890 }
1891 if (found) continue;
1892 // build new query description with infos from Proof
1893 newquery->fStatus = query->IsFinalized() ?
1896 newquery->fSelectorString = query->GetSelecImp()->GetName();
1897 newquery->fQueryName = TString::Format("%s:%s", query->GetTitle(),
1898 query->GetName());
1899 newquery->fOptions = query->GetOptions();
1900 newquery->fEventList = "";
1901 newquery->fNbFiles = 0;
1902 newquery->fNoEntries = query->GetEntries();
1903 newquery->fFirstEntry = query->GetFirst();
1904 newquery->fResult = query;
1905 newquery->fChain = 0;
1906 fViewer->GetActDesc()->fQueries->Add((TObject *)newquery);
1908 newquery->fQueryName, fViewer->GetQueryConPict(),
1910 item2->SetUserData(newquery);
1911 if (query->GetInputList())
1912 fViewer->GetSessionHierarchy()->AddItem(item2, "InputList");
1913 if (query->GetOutputList())
1914 fViewer->GetSessionHierarchy()->AddItem(item2, "OutputList");
1915 }
1916 }
1917 // at the end, update list tree
1920}
1921
1922////////////////////////////////////////////////////////////////////////////////
1923/// Command line handling.
1924
1926{
1927 // get command string
1928 const char *cmd = fCommandTxt->GetText();
1929 char opt[2];
1930 // form temporary file path
1931 TString pathtmp = TString::Format("%s/%s", gSystem->TempDirectory(),
1933 // if check box "clear view" is checked, open temp file in write mode
1934 // (overwrite), in append mode otherwise.
1935 if (fClearCheck->IsOn())
1936 snprintf(opt, 2, "w");
1937 else
1938 snprintf(opt, 2, "a");
1939
1940 // if valid Proof session, pass the command to Proof
1941 if (fViewer->GetActDesc()->fProof &&
1943 // redirect stdout/stderr to temp file
1944 if (gSystem->RedirectOutput(pathtmp.Data(), opt) != 0) {
1945 Error("ShowStatus", "stdout/stderr redirection failed; skipping");
1946 return;
1947 }
1948 // execute command line
1949 fViewer->GetActDesc()->fProof->Exec(cmd);
1950 // restore back stdout/stderr
1951 if (gSystem->RedirectOutput(0) != 0) {
1952 Error("ShowStatus", "stdout/stderr retore failed; skipping");
1953 return;
1954 }
1955 // if check box "clear view" is checked, clear text view
1956 if (fClearCheck->IsOn())
1958 // load (display) temp file in text view
1959 fInfoTextView->LoadFile(pathtmp.Data());
1960 // set focus to "command line" text entry
1962 }
1963 else {
1964 // if no Proof session, or Proof session not valid,
1965 // lets execute command line by TApplication
1966
1967 // redirect stdout/stderr to temp file
1968 if (gSystem->RedirectOutput(pathtmp.Data(), opt) != 0) {
1969 Error("ShowStatus", "stdout/stderr redirection failed; skipping");
1970 }
1971 // execute command line
1973 // restore back stdout/stderr
1974 if (gSystem->RedirectOutput(0) != 0) {
1975 Error("ShowStatus", "stdout/stderr retore failed; skipping");
1976 }
1977 // if check box "clear view" is checked, clear text view
1978 if (fClearCheck->IsOn())
1980 // load (display) temp file in text view
1981 fInfoTextView->LoadFile(pathtmp.Data());
1982 // set focus to "command line" text entry
1984 }
1985 // display bottom of text view
1987}
1988
1989////////////////////////////////////////////////////////////////////////////////
1990/// Switch widgets status/visibility for local/remote sessions.
1991
1993{
1994 if (local) {
1997 fTab->HideFrame(fTab->GetTabTab("Options"));
1998 fTab->HideFrame(fTab->GetTabTab("Packages"));
1999 fTab->HideFrame(fTab->GetTabTab("DataSets"));
2000 }
2001 else {
2004 fTab->ShowFrame(fTab->GetTabTab("Options"));
2005 fTab->ShowFrame(fTab->GetTabTab("Packages"));
2006 fTab->ShowFrame(fTab->GetTabTab("DataSets"));
2007 }
2008}
2009
2010////////////////////////////////////////////////////////////////////////////////
2011/// Shutdown current session.
2012
2014{
2015 // do nothing if connection in progress
2016 if (fViewer->IsBusy())
2017 return;
2018
2019 if (fViewer->GetActDesc()->fLocal) {
2020 Int_t retval;
2021 new TGMsgBox(fClient->GetRoot(), this, "Error Shutting down Session",
2022 "Shutting down Local Sessions is not allowed !",
2023 kMBIconExclamation,kMBOk,&retval);
2024 return;
2025 }
2026 if (!fViewer->GetActDesc()->fAttached ||
2027 !fViewer->GetActDesc()->fProof ||
2029 return;
2030 // ask for confirmation
2031 TString m;
2032 m.Form("Are you sure to shutdown the session \"%s\"",
2034 Int_t result;
2035 new TGMsgBox(fClient->GetRoot(), this, "", m.Data(), 0,
2036 kMBOk | kMBCancel, &result);
2037 // if confirmed, delete it
2038 if (result != kMBOk)
2039 return;
2040 // remove the Proof session from gROOT list of Proofs
2041 fViewer->GetActDesc()->fProof->Detach("S");
2042 // reset connected flag
2044 fViewer->GetActDesc()->fProof = 0;
2045 // disable animation timer
2047 // change list tree item picture to disconnected pixmap
2050 if (item) {
2053 }
2054 // update viewer
2056 1, 0, 0);
2059 fViewer->GetStatusBar()->SetText("", 1);
2060}
2061
2062//////////////////////////////////////////////////////////////////////////
2063// Edit Query Frame
2064//////////////////////////////////////////////////////////////////////////
2065
2066////////////////////////////////////////////////////////////////////////////////
2067/// Create a new Query dialog, used by the Session Viewer, to Edit a Query if
2068/// the editmode flag is set, or to create a new one if not set.
2069
2071 TGCompositeFrame(p, w, h, kVerticalFrame), fFrmMore(0), fBtnMore(0),
2072 fTxtQueryName(0), fTxtChain(0), fTxtSelector(0), fTxtOptions(0),
2073 fNumEntries(0), fNumFirstEntry(0), fTxtParFile(0), fTxtEventList(0),
2074 fViewer(0), fQuery(0), fChain(0)
2075{
2076}
2077
2078////////////////////////////////////////////////////////////////////////////////
2079/// Delete query dialog.
2080
2082{
2083 Cleanup();
2084}
2085
2086////////////////////////////////////////////////////////////////////////////////
2087/// Build the "new query" dialog.
2088
2090{
2091 TGButton *btnTmp;
2092 fViewer = gui;
2094 SetLayoutManager(new TGTableLayout(this, 6, 5));
2095
2096 // add "Query Name" label and text entry
2097 AddFrame(new TGLabel(this, "Query Name :"),
2098 new TGTableLayoutHints(0, 1, 0, 1, kLHintsCenterY, 5, 5, 4, 0));
2100 (const char *)0, 1), new TGTableLayoutHints(1, 2, 0, 1,
2101 kLHintsCenterY, 5, 5, 4, 0));
2102
2103 // add "TChain" label and text entry
2104 AddFrame(new TGLabel(this, "TChain :"),
2105 new TGTableLayoutHints(0, 1, 1, 2, kLHintsCenterY, 5, 5, 4, 0));
2106 AddFrame(fTxtChain = new TGTextEntry(this,
2107 (const char *)0, 2), new TGTableLayoutHints(1, 2, 1, 2,
2108 kLHintsCenterY, 5, 5, 4, 0));
2109 fTxtChain->SetToolTipText("Specify TChain or TDSet from memory or file");
2111 // add "Browse" button
2112 AddFrame(btnTmp = new TGTextButton(this, "Browse..."),
2113 new TGTableLayoutHints(2, 3, 1, 2, kLHintsCenterY, 5, 0, 4, 8));
2114 btnTmp->Connect("Clicked()", "TEditQueryFrame", this, "OnBrowseChain()");
2115
2116 // add "Selector" label and text entry
2117 AddFrame(new TGLabel(this, "Selector :"),
2118 new TGTableLayoutHints(0, 1, 2, 3, kLHintsCenterY, 5, 5, 0, 0));
2120 (const char *)0, 3), new TGTableLayoutHints(1, 2, 2, 3,
2121 kLHintsCenterY, 5, 5, 0, 0));
2122 // add "Browse" button
2123 AddFrame(btnTmp = new TGTextButton(this, "Browse..."),
2124 new TGTableLayoutHints(2, 3, 2, 3, kLHintsCenterY, 5, 0, 0, 8));
2125 btnTmp->Connect("Clicked()", "TEditQueryFrame", this, "OnBrowseSelector()");
2126
2127 // add "Less <<" ("More >>") button
2128 AddFrame(fBtnMore = new TGTextButton(this, " Less << "),
2129 new TGTableLayoutHints(2, 3, 4, 5, kLHintsCenterY, 5, 5, 4, 0));
2130 fBtnMore->Connect("Clicked()", "TEditQueryFrame", this, "OnNewQueryMore()");
2131
2132 // add (initially hidden) options frame
2133 fFrmMore = new TGCompositeFrame(this, 200, 200);
2135
2136 AddFrame(fFrmMore, new TGTableLayoutHints(0, 3, 5, 6,
2139
2140 // add "Options" label and text entry
2141 fFrmMore->AddFrame(new TGLabel(fFrmMore, "Options :"),
2142 new TGTableLayoutHints(0, 1, 0, 1, kLHintsCenterY, 5, 5, 0, 0));
2144 (const char *)0, 4), new TGTableLayoutHints(1, 2, 0, 1, 0, 17,
2145 0, 0, 8));
2146 //fTxtOptions->SetText("ASYN");
2147 fTxtOptions->SetText("");
2148
2149 // add "Nb Entries" label and number entry
2150 fFrmMore->AddFrame(new TGLabel(fFrmMore, "Nb Entries :"),
2151 new TGTableLayoutHints(0, 1, 1, 2, kLHintsCenterY, 5, 5, 0, 0));
2155 0, 17, 0, 0, 8));
2156 // coverity[negative_returns]: no problem with -1, the format is kNESInteger
2158 // add "First Entry" label and number entry
2159 fFrmMore->AddFrame(new TGLabel(fFrmMore, "First entry :"),
2160 new TGTableLayoutHints(0, 1, 2, 3, kLHintsCenterY, 5, 5, 0, 0));
2164 17, 0, 0, 8));
2165
2166 // add "Event list" label and text entry
2167 fFrmMore->AddFrame(new TGLabel(fFrmMore, "Event list :"),
2168 new TGTableLayoutHints(0, 1, 3, 4, kLHintsCenterY, 5, 5, 0, 0));
2170 (const char *)0, 6), new TGTableLayoutHints(1, 2, 3, 4, 0, 17,
2171 5, 0, 0));
2172 // add "Browse" button
2173 fFrmMore->AddFrame(btnTmp = new TGTextButton(fFrmMore, "Browse..."),
2174 new TGTableLayoutHints(2, 3, 3, 4, 0, 6, 0, 0, 8));
2175 btnTmp->Connect("Clicked()", "TEditQueryFrame", this, "OnBrowseEventList()");
2176
2177 fTxtQueryName->Associate(this);
2178 fTxtChain->Associate(this);
2179 fTxtSelector->Associate(this);
2180 fTxtOptions->Associate(this);
2181 fNumEntries->Associate(this);
2183 fTxtEventList->Associate(this);
2184
2185 fTxtQueryName->Connect("TextChanged(char*)", "TEditQueryFrame", this,
2186 "SettingsChanged()");
2187 fTxtChain->Connect("TextChanged(char*)", "TEditQueryFrame", this,
2188 "SettingsChanged()");
2189 fTxtSelector->Connect("TextChanged(char*)", "TEditQueryFrame", this,
2190 "SettingsChanged()");
2191 fTxtOptions->Connect("TextChanged(char*)", "TEditQueryFrame", this,
2192 "SettingsChanged()");
2193 fNumEntries->Connect("ValueChanged(Long_t)", "TEditQueryFrame", this,
2194 "SettingsChanged()");
2195 fNumFirstEntry->Connect("ValueChanged(Long_t)", "TEditQueryFrame", this,
2196 "SettingsChanged()");
2197 fTxtEventList->Connect("TextChanged(char*)", "TEditQueryFrame", this,
2198 "SettingsChanged()");
2199}
2200
2201////////////////////////////////////////////////////////////////////////////////
2202/// Show/hide options frame and update button text accordingly.
2203
2205{
2206 if (IsVisible(fFrmMore)) {
2208 fBtnMore->SetText(" More >> ");
2209 }
2210 else {
2212 fBtnMore->SetText(" Less << ");
2213 }
2214}
2215
2216////////////////////////////////////////////////////////////////////////////////
2217/// Call new chain dialog.
2218
2220{
2221 TNewChainDlg *dlg = new TNewChainDlg(fClient->GetRoot(), this);
2222 dlg->Connect("OnElementSelected(TObject *)", "TEditQueryFrame",
2223 this, "OnElementSelected(TObject *)");
2224}
2225
2226////////////////////////////////////////////////////////////////////////////////
2227/// Handle OnElementSelected signal coming from new chain dialog.
2228
2230{
2231 if (obj) {
2232 fChain = obj;
2233 if (obj->IsA() == TChain::Class())
2235 else if (obj->IsA() == TDSet::Class())
2236 fTxtChain->SetText(((TDSet *)fChain)->GetObjName());
2237 }
2238}
2239
2240////////////////////////////////////////////////////////////////////////////////
2241/// Open file browser to choose selector macro.
2242
2244{
2245 TGFileInfo fi;
2247 new TGFileDialog(fClient->GetRoot(), this, kFDOpen, &fi);
2248 if (!fi.fFilename) return;
2250}
2251
2252////////////////////////////////////////////////////////////////////////////////
2253///Browse event list
2254
2256{
2257}
2258
2259////////////////////////////////////////////////////////////////////////////////
2260/// Save current settings in main session viewer.
2261
2263{
2264 // if we are in edition mode and query description is valid,
2265 // use it, otherwise create a new one
2266 TQueryDescription *newquery;
2267 if (fQuery)
2268 newquery = fQuery;
2269 else
2270 newquery = new TQueryDescription();
2271
2272 // update query description fields
2273 newquery->fSelectorString = fTxtSelector->GetText();
2274 if (fChain) {
2275 newquery->fTDSetString = fChain->GetName();
2276 newquery->fChain = fChain;
2277 }
2278 else {
2279 newquery->fTDSetString = "";
2280 newquery->fChain = 0;
2281 }
2282 newquery->fQueryName = fTxtQueryName->GetText();
2283 newquery->fOptions = fTxtOptions->GetText();
2284 newquery->fNoEntries = fNumEntries->GetIntNumber();
2286 newquery->fNbFiles = 0;
2287 newquery->fResult = 0;
2288
2289 if (newquery->fChain) {
2290 if (newquery->fChain->IsA() == TChain::Class())
2291 newquery->fNbFiles = ((TChain *)newquery->fChain)->GetListOfFiles()->GetEntriesFast();
2292 else if (newquery->fChain->IsA() == TDSet::Class())
2293 newquery->fNbFiles = ((TDSet *)newquery->fChain)->GetListOfElements()->GetSize();
2294 }
2295 // update user data with modified query description
2297 fViewer->GetSessionHierarchy()->RenameItem(item, newquery->fQueryName);
2298 item->SetUserData(newquery);
2299 // update list tree
2306 if (fViewer->GetActDesc()->fLocal ||
2310 fViewer->GetActDesc()->fProof->IsValid())) {
2311 fViewer->GetQueryFrame()->GetTab()->SetTab("Status");
2313 }
2314}
2315
2316////////////////////////////////////////////////////////////////////////////////
2317/// Settings have changed, update GUI accordingly.
2318
2320{
2321 if (fQuery) {
2322 if ((strcmp(fQuery->fSelectorString.Data(), fTxtSelector->GetText())) ||
2323 (strcmp(fQuery->fQueryName.Data(), fTxtQueryName->GetText())) ||
2324 (strcmp(fQuery->fOptions.Data(), fTxtOptions->GetText())) ||
2327 (fQuery->fChain != fChain)) {
2329 }
2330 else {
2332 }
2333 }
2334 else {
2335 if ((fTxtQueryName->GetText()) &&
2336 ((fTxtQueryName->GetText()) ||
2337 (fTxtChain->GetText())))
2339 else
2341 }
2342}
2343
2344////////////////////////////////////////////////////////////////////////////////
2345/// Update entry fields with query description values.
2346
2348{
2349 fChain = 0;
2350 fQuery = desc;
2351 fTxtChain->SetText("");
2352 if (desc->fChain) {
2353 fChain = desc->fChain;
2355 }
2362}
2363
2364////////////////////////////////////////////////////////////////////////////////
2365// Query Frame
2366
2367////////////////////////////////////////////////////////////////////////////////
2368/// Constructor
2369
2371 TGCompositeFrame(p, w, h), fBtnSubmit(0), fBtnFinalize(0), fBtnStop(0),
2372 fBtnAbort(0), fBtnShowLog(0), fBtnRetrieve(0), fBtnSave(0), fInfoTextView(0),
2373 fModified(0), fFiles(0), fFirst(0), fEntries(0), fPrevTotal(0),
2374 fPrevProcessed(0), fLabInfos(0), fLabStatus(0), fTotal(0), fRate(0),
2375 fStatus(kStopped), fTab(0), fFA(0), fFB(0), fFC(0), fFD(0), frmProg(0),
2376 fECanvas(0), fStatsCanvas(0), fViewer(0), fDesc(0)
2377{
2378}
2379
2380////////////////////////////////////////////////////////////////////////////////
2381/// Destructor.
2382
2384{
2385 Cleanup();
2386}
2387
2388////////////////////////////////////////////////////////////////////////////////
2389/// Build query information frame.
2390
2392{
2395 fFirst = fEntries = fPrevTotal = 0;
2396 fPrevProcessed = 0;
2397 fViewer = gui;
2398 fModified = kFALSE;
2399
2400 // main query tab
2401 fTab = new TGTab(this, 200, 200);
2403 kLHintsExpandY, 2, 2, 2, 2));
2404
2405 // add "Status" tab element
2406 TGCompositeFrame *tf = fTab->AddTab("Status");
2407 fFB = new TGCompositeFrame(tf, 100, 100, kVerticalFrame);
2410
2411 // new frame containing control buttons and feedback histos canvas
2412 TGCompositeFrame* frmcanvas = new TGHorizontalFrame(fFB, 350, 100);
2413 // control buttons frame
2414 TGCompositeFrame* frmBut2 = new TGVerticalFrame(frmcanvas, 150, 100);
2415 fBtnSubmit = new TGTextButton(frmBut2, " Submit ");
2416 fBtnSubmit->SetToolTipText("Submit (process) selected query");
2418 kLHintsExpandX, 5, 5, 5, 5));
2419 fBtnStop = new TGTextButton(frmBut2, "Stop");
2420 fBtnStop->SetToolTipText("Stop processing query");
2422 kLHintsExpandX, 5, 5, 5, 5));
2423 fBtnAbort = new TGTextButton(frmBut2, "Abort");
2424 fBtnAbort->SetToolTipText("Abort processing query");
2426 kLHintsExpandX, 5, 5, 5, 5));
2427 frmcanvas->AddFrame(frmBut2, new TGLayoutHints(kLHintsLeft | kLHintsCenterY |
2429 // feedback histos embedded canvas
2430 fECanvas = new TRootEmbeddedCanvas("fECanvas", frmcanvas, 400, 150);
2435 4, 4, 4, 4));
2436 fFB->AddFrame(frmcanvas, new TGLayoutHints(kLHintsLeft | kLHintsTop |
2438
2439 // progress infos label
2440 fLabInfos = new TGLabel(fFB, " ");
2441 fFB->AddFrame(fLabInfos, new TGLayoutHints(kLHintsLeft, 5, 5, 5, 5));
2442 // progress status label
2443 fLabStatus = new TGLabel(fFB, " ");
2444 fFB->AddFrame(fLabStatus, new TGLayoutHints(kLHintsLeft, 5, 5, 5, 5));
2445
2446 //progress bar
2449 frmProg->SetBarColor("green");
2450 fFB->AddFrame(frmProg, new TGLayoutHints(kLHintsExpandX, 5, 5, 5, 5));
2451 // total progress infos
2452 fFB->AddFrame(fTotal = new TGLabel(fFB,
2453 " Estimated time left : 0 sec (--- events of --- processed) "),
2454 new TGLayoutHints(kLHintsLeft, 5, 5, 5, 5));
2455 // progress rate infos
2456 fFB->AddFrame(fRate = new TGLabel(fFB,
2457 " Processing Rate : -- events/sec "),
2458 new TGLayoutHints(kLHintsLeft, 5, 5, 5, 5));
2459
2460 // add "Results" tab element
2461 tf = fTab->AddTab("Results");
2462 fFC = new TGCompositeFrame(tf, 100, 100, kVerticalFrame);
2465 // query result (header) information text view
2466 fInfoTextView = new TGTextView(fFC, 330, 185, "", kSunkenFrame |
2469 kLHintsExpandY | kLHintsExpandX, 5, 5, 10, 10));
2470
2471 // add "Retrieve", "Finalize" and "Show Log" buttons
2472 TGCompositeFrame* frmBut3 = new TGHorizontalFrame(fFC, 350, 100);
2473 fBtnRetrieve = new TGTextButton(frmBut3, "Retrieve");
2474 fBtnRetrieve->SetToolTipText("Retrieve query results");
2476 kLHintsExpandX, 5, 5, 10, 10));
2477 fBtnFinalize = new TGTextButton(frmBut3, "Finalize");
2478 fBtnFinalize->SetToolTipText("Finalize query");
2480 kLHintsExpandX, 5, 5, 10, 10));
2481 fBtnShowLog = new TGTextButton(frmBut3, "Show Log");
2482 fBtnShowLog->SetToolTipText("Show query log (open log window)");
2484 kLHintsExpandX, 5, 5, 10, 10));
2486
2487 // add "Results" tab element
2488 tf = fTab->AddTab("Edit Query");
2489 fFD = new TEditQueryFrame(tf, 100, 100);
2490 fFD->Build(fViewer);
2491 tf->AddFrame(fFD, new TGLayoutHints(kLHintsTop | kLHintsLeft, 5, 5, 10, 0));
2492 TString btntxt;
2493 if (fViewer->GetActDesc()->fLocal ||
2494 (fViewer->GetActDesc()->fProof &&
2495 fViewer->GetActDesc()->fProof->IsValid())) {
2496 btntxt = " Submit ";
2497 }
2498 else {
2499 btntxt = " Apply changes ";
2500 }
2501 tf->AddFrame(fBtnSave = new TGTextButton(tf, btntxt),
2502 new TGLayoutHints(kLHintsTop | kLHintsLeft, 10, 5, 25, 5));
2503
2504 // connect button actions to functions
2505 fBtnSave->Connect("Clicked()", "TEditQueryFrame", fFD,
2506 "OnBtnSave()");
2507 fBtnSubmit->Connect("Clicked()", "TSessionQueryFrame", this,
2508 "OnBtnSubmit()");
2509 fBtnFinalize->Connect("Clicked()", "TSessionQueryFrame", this,
2510 "OnBtnFinalize()");
2511 fBtnStop->Connect("Clicked()", "TSessionQueryFrame", this,
2512 "OnBtnStop()");
2513 fBtnAbort->Connect("Clicked()", "TSessionQueryFrame", this,
2514 "OnBtnAbort()");
2515 fBtnShowLog->Connect("Clicked()", "TSessionQueryFrame", this,
2516 "OnBtnShowLog()");
2517 fBtnRetrieve->Connect("Clicked()", "TSessionQueryFrame", this,
2518 "OnBtnRetrieve()");
2519// fBtnSave->SetState(kButtonDisabled);
2520 Resize(350, 310);
2521}
2522
2523////////////////////////////////////////////////////////////////////////////////
2524/// Notify changes in query editor settings.
2525
2527{
2528 fModified = mod;
2529 if (fModified) {
2531 }
2532 else {
2534 }
2535 if (fViewer->GetActDesc()->fLocal ||
2536 (fViewer->GetActDesc()->fProof &&
2539}
2540
2541////////////////////////////////////////////////////////////////////////////////
2542/// Feedback function connected to Feedback signal.
2543/// Used to update feedback histograms.
2544
2546{
2547 // if no actual session, just return
2548 if (!fViewer->GetActDesc()->fAttached)
2549 return;
2550 if (!fViewer->GetActDesc()->fProof)
2551 return;
2552 if ((fViewer->GetActDesc()->fActQuery) &&
2557 return;
2558 TProof *sender = dynamic_cast<TProof*>((TQObject*)gTQSender);
2559 // if Proof sender match actual session one, update feedback histos
2560 if (sender && (sender == fViewer->GetActDesc()->fProof))
2561 UpdateHistos(objs);
2562}
2563
2564////////////////////////////////////////////////////////////////////////////////
2565/// Update feedback histograms.
2566
2568{
2569 TVirtualPad *save = gPad;
2570 TObject *o;
2571 Int_t pos = 1;
2572 Int_t i = 0;
2573 while (kFeedbackHistos[i]) {
2574 // check if user has selected this histogram in the option menu
2575 if (fViewer->GetCascadeMenu()->IsEntryChecked(41+i)) {
2576 if ( (o = objs->FindObject(kFeedbackHistos[i]))) {
2577 fStatsCanvas->cd(pos);
2578 gPad->SetEditable(kTRUE);
2579 if (TH1 *h = dynamic_cast<TH1*>(o)) {
2580 h->SetStats(0);
2581 h->SetBarWidth(0.75);
2582 h->SetBarOffset(0.125);
2583 h->SetFillColor(9);
2584 h->Draw("bar");
2585 pos++;
2586 }
2587 else if (TH2 *h2 = dynamic_cast<TH2*>(o)) {
2588 h2->Draw();
2589 pos++;
2590 }
2591 gPad->Modified();
2592 }
2593 }
2594 i++;
2595 }
2596 // update canvas
2597 fStatsCanvas->cd();
2600 if (save != 0) {
2601 save->cd();
2602 } else {
2603 gPad = 0;
2604 }
2605}
2606
2607////////////////////////////////////////////////////////////////////////////////
2608/// Update progress bar and status labels.
2609
2611{
2612 Long_t tt;
2613 UInt_t hh=0, mm=0, ss=0;
2614 TString stm;
2615 // if no actual session, just return
2616 if (!fViewer->GetActDesc()->fProof)
2617 return;
2618 // if Proof sender does't match actual session one, return
2619 TProof *sender = dynamic_cast<TProof*>((TQObject*)gTQSender);
2620 if (!sender || (sender != fViewer->GetActDesc()->fProof))
2621 return;
2622
2623 if ((fViewer->GetActDesc()->fActQuery) &&
2628 fTotal->SetText(" Estimated time left : 0 sec (0 events of 0 processed) ");
2629 fRate->SetText(" Processing Rate : 0.0f events/sec ");
2630 frmProg->Reset();
2631 fFB->Layout();
2632 return;
2633 }
2634
2635 if (total < 0)
2636 total = fPrevTotal;
2637 else
2638 fPrevTotal = total;
2639
2640 // if no change since last call, just return
2641 if (fPrevProcessed == processed)
2642 return;
2643 TString buf;
2644
2645 // Update information at first call
2646 if (fEntries != total) {
2647 buf.Form("PROOF cluster : \"%s\" - %d worker nodes",
2650 fLabInfos->SetText(buf);
2651
2652 fEntries = total;
2653 buf.Form(" %d files, %lld events, starting event %lld",
2655 fLabStatus->SetText(buf);
2656 }
2657
2658 // compute progress bar position and update
2659 Float_t pos = (Float_t)((Double_t)(processed * 100)/(Double_t)total);
2660 frmProg->SetPosition(pos);
2661 // if 100%, stop animation and set icon to "connected"
2662 if (pos >= 100.0) {
2664 fViewer->ChangeRightLogo("monitor01.xpm");
2665 }
2666
2667 // get current time
2668 if ((fViewer->GetActDesc()->fActQuery->fStatus ==
2675 Float_t eta = 0;
2676 if (processed)
2677 eta = ((Float_t)((Long64_t)tdiff)*total/Float_t(processed) -
2678 Long64_t(tdiff))/1000.;
2679
2680 tt = (Long_t)eta;
2681 if (tt > 0) {
2682 hh = (UInt_t)(tt / 3600);
2683 mm = (UInt_t)((tt % 3600) / 60);
2684 ss = (UInt_t)((tt % 3600) % 60);
2685 }
2686 if (hh)
2687 stm.Form("%d h %d min %d sec", hh, mm, ss);
2688 else if (mm)
2689 stm.Form("%d min %d sec", mm, ss);
2690 else
2691 stm.Form("%d sec", ss);
2692 if (processed == total) {
2693 // finished
2694 tt = (Long_t) Long64_t(tdiff)/1000;
2695 if (tt > 0) {
2696 hh = (UInt_t)(tt / 3600);
2697 mm = (UInt_t)((tt % 3600) / 60);
2698 ss = (UInt_t)((tt % 3600) % 60);
2699 }
2700 if (hh)
2701 stm.Form("%d h %d min %d sec", hh, mm, ss);
2702 else if (mm)
2703 stm.Form("%d min %d sec", mm, ss);
2704 else
2705 stm.Form("%d sec", ss);
2706 buf.Form(" Processed : %lld events in %s", total, stm.Data());
2707 fTotal->SetText(buf.Data());
2708 } else {
2709 // update status infos
2710 buf.Form(" Estimated time left : %s (%lld events of %lld processed) ",
2711 stm.Data(), processed, total);
2712 fTotal->SetText(buf.Data());
2713 }
2714 if (processed > 0 && (Long64_t)tdiff > 0) {
2715 buf.Form(" Processing Rate : %.1f events/sec ",
2716 (Float_t)processed/(Long64_t)tdiff*1000.);
2717 fRate->SetText(buf);
2718 }
2719 fPrevProcessed = processed;
2720
2721 fFB->Layout();
2722}
2723
2724////////////////////////////////////////////////////////////////////////////////
2725/// New version of Progress (just forward to the old version
2726/// for the time being).
2727
2729 Long64_t /*bytesread*/, Float_t /*initTime*/,
2730 Float_t /*procTime*/, Float_t /*evtrti*/,
2731 Float_t /*mbrti*/, Int_t /*actw*/,
2732 Int_t /*tses*/, Float_t /*eses*/)
2733{
2734 Progress(total, processed);
2735}
2736
2737////////////////////////////////////////////////////////////////////////////////
2738/// Update progress bar and status labels.
2739
2741{
2742 Long_t tt;
2743 UInt_t hh=0, mm=0, ss=0;
2744 TString stm;
2745 TString cproc;
2746 Int_t status;
2747
2748 switch (fViewer->GetActDesc()->fActQuery->fStatus) {
2749
2751 cproc = " - ABORTED";
2752 status = kAborted;
2753 break;
2755 cproc = " - STOPPED";
2756 status = kStopped;
2757 break;
2759 cproc = " ";
2760 status = kRunning;
2761 break;
2764 cproc = " ";
2765 status = kDone;
2766 break;
2767 default:
2768 status = -1;
2769 break;
2770 }
2771 if (processed < 0) processed = 0;
2772
2773 frmProg->SetBarColor("green");
2774 if (status == kAborted)
2775 frmProg->SetBarColor("red");
2776 else if (status == kStopped)
2777 frmProg->SetBarColor("yellow");
2778 else if (status == -1 ) {
2779 fTotal->SetText(" Estimated time left : 0 sec (0 events of 0 processed) ");
2780 fRate->SetText(" Processing Rate : 0.0f events/sec ");
2781 frmProg->Reset();
2782 fFB->Layout();
2783 return;
2784 }
2785
2786 if (total < 0)
2787 total = fPrevTotal;
2788 else
2789 fPrevTotal = total;
2790
2791 // if no change since last call, just return
2792 TString buf;
2793
2794 // Update information at first call
2795 if (fEntries != total) {
2796 fLabInfos->SetText("Local Session");
2797
2798 fEntries = total;
2799 buf.Form(" %d files, %lld events, starting event %lld",
2801 fLabStatus->SetText(buf.Data());
2802 }
2803
2804 // compute progress bar position and update
2805 Float_t pos = 0.0;
2806 if (processed > 0 && total > 0)
2807 pos = (Float_t)((Double_t)(processed * 100)/(Double_t)total);
2808 frmProg->SetPosition(pos);
2809 // if 100%, stop animation and set icon to "connected"
2810 if (pos >= 100.0) {
2812 fViewer->ChangeRightLogo("monitor01.xpm");
2813 }
2814
2815 // get current time
2816 if (status == kRunning)
2820 Float_t eta = 0;
2821 if (processed)
2822 eta = ((Float_t)((Long64_t)tdiff)*total/(Float_t)(processed) -
2823 (Long64_t)(tdiff))/1000.;
2824
2825 tt = (Long_t)eta;
2826 if (tt > 0) {
2827 hh = (UInt_t)(tt / 3600);
2828 mm = (UInt_t)((tt % 3600) / 60);
2829 ss = (UInt_t)((tt % 3600) % 60);
2830 }
2831 if (hh)
2832 stm = TString::Format("%d h %d min %d sec", hh, mm, ss);
2833 else if (mm)
2834 stm = TString::Format("%d min %d sec", mm, ss);
2835 else
2836 stm = TString::Format("%d sec", ss);
2837 if ((processed != total) && (status == kRunning)) {
2838 // update status infos
2839 buf.Form(" Estimated time left : %s (%lld events of %lld processed) ",
2840 stm.Data(), processed, total);
2841 fTotal->SetText(buf);
2842 } else {
2843 tt = (Long_t) Long64_t(tdiff)/1000;
2844 if (tt > 0) {
2845 hh = (UInt_t)(tt / 3600);
2846 mm = (UInt_t)((tt % 3600) / 60);
2847 ss = (UInt_t)((tt % 3600) % 60);
2848 }
2849 if (hh)
2850 stm = TString::Format("%d h %d min %d sec", hh, mm, ss);
2851 else if (mm)
2852 stm = TString::Format("%d min %d sec", mm, ss);
2853 else
2854 stm = TString::Format("%d sec", ss);
2855 buf.Form(" Processed : %ld events in %s",
2856 (Long_t)processed, stm.Data());
2857 buf += cproc;
2858 fTotal->SetText(buf.Data());
2859 }
2860 if (processed > 0 && (Long64_t)tdiff > 0) {
2861 buf.Form(" Processing Rate : %.1f events/sec ",
2862 (Float_t)processed/(Long64_t)tdiff*1000.);
2863 fRate->SetText(buf.Data());
2864 }
2865 fPrevProcessed = processed;
2866
2867 fFB->Layout();
2868}
2869
2870////////////////////////////////////////////////////////////////////////////////
2871/// Indicate that Cancel or Stop was clicked.
2872
2874{
2875 if (aborted == kTRUE) {
2876 // Aborted
2877 frmProg->SetBarColor("red");
2878 }
2879 else {
2880 // Stopped
2881 frmProg->SetBarColor("yellow");
2882 }
2883 // disconnect progress related signals
2884 if (fViewer->GetActDesc()->fProof &&
2886 fViewer->GetActDesc()->fProof->Disconnect("Progress(Long64_t,Long64_t)",
2887 this, "Progress(Long64_t,Long64_t)");
2888 fViewer->GetActDesc()->fProof->Disconnect("Progress(Long64_t,Long64_t,Long64_t,Float_t,Float_t,Float_t,Float_t)",
2889 this, "Progress(Long64_t,Long64_t,Long64_t,Float_t,Float_t,Float_t,Float_t)");
2890 fViewer->GetActDesc()->fProof->Disconnect("Progress(Long64_t,Long64_t,Long64_t,Float_t,Float_t,Float_t,Float_t,Int_t,Int_t,Float_t)",
2891 this, "Progress(Long64_t,Long64_t,Long64_t,Float_t,Float_t,Float_t,Float_t,Int_t,Int_t,Float_t)");
2892 fViewer->GetActDesc()->fProof->Disconnect("StopProcess(Bool_t)", this,
2893 "IndicateStop(Bool_t)");
2894 }
2895}
2896
2897////////////////////////////////////////////////////////////////////////////////
2898/// Reset progress frame information fields.
2899
2900void TSessionQueryFrame::ResetProgressDialog(const char * /*selector*/, Int_t files,
2901 Long64_t first, Long64_t entries)
2902{
2903 TString buf;
2904 fFiles = files > 0 ? files : 0;
2905 fFirst = first;
2906 fEntries = entries;
2907 fPrevProcessed = 0;
2908 fPrevTotal = 0;
2909
2910 if (!fViewer->GetActDesc()->fLocal) {
2911 frmProg->SetBarColor("green");
2912 frmProg->Reset();
2913 }
2914
2915 buf.Form("%0d files, %0lld events, starting event %0lld",
2916 fFiles > 0 ? fFiles : 0, fEntries > 0 ? fEntries : 0,
2917 fFirst >= 0 ? fFirst : 0);
2918 fLabStatus->SetText(buf.Data());
2919 // Reconnect the slots
2920 if (fViewer->GetActDesc()->fProof &&
2922 fViewer->GetActDesc()->fProof->Connect("Progress(Long64_t,Long64_t)",
2923 "TSessionQueryFrame", this, "Progress(Long64_t,Long64_t)");
2924 fViewer->GetActDesc()->fProof->Connect("Progress(Long64_t,Long64_t,Long64_t,Float_t,Float_t,Float_t,Float_t)",
2925 "TSessionQueryFrame", this,
2926 "Progress(Long64_t,Long64_t,Long64_t,Float_t,Float_t,Float_t,Float_t)");
2927 fViewer->GetActDesc()->fProof->Connect("StopProcess(Bool_t)",
2928 "TSessionQueryFrame", this, "IndicateStop(Bool_t)");
2929 buf.Form("PROOF cluster : \"%s\" - %d worker nodes",
2932 fLabInfos->SetText(buf.Data());
2933 }
2934 else if (fViewer->GetActDesc()->fLocal) {
2936 fLabInfos->SetText("Local Session");
2937 fLabStatus->SetText(" ");
2938 }
2939 else {
2940 fLabInfos->SetText(" ");
2941 fLabStatus->SetText(" ");
2942 }
2943 fFB->Layout();
2944}
2945
2946////////////////////////////////////////////////////////////////////////////////
2947/// Finalize query.
2948
2950{
2951 // check if Proof is valid
2952 if (fViewer->GetActDesc()->fProof &&
2954 gPad->SetEditable(kFALSE);
2956 if (!item) return;
2957 TObject *obj = (TObject *)item->GetUserData();
2958 if ((obj) && (obj->IsA() == TQueryDescription::Class())) {
2959 // as it can take time, set watch cursor
2960 gVirtualX->SetCursor(GetId(),gVirtualX->CreateCursor(kWatch));
2961 TQueryDescription *query = (TQueryDescription *)obj;
2963 UpdateButtons(query);
2964 // restore cursor
2965 gVirtualX->SetCursor(GetId(), 0);
2966 }
2967 }
2968 if (fViewer->GetActDesc()->fLocal) {
2969 gPad->SetEditable(kFALSE);
2971 if (chain)
2972 ((TTreePlayer *)(chain->GetPlayer()))->GetSelectorFromFile()->Terminate();
2973 }
2974}
2975
2976////////////////////////////////////////////////////////////////////////////////
2977/// Stop processing query.
2978
2980{
2981 // check for proof validity
2982 if (fViewer->GetActDesc()->fProof &&
2985 }
2986 if (fViewer->GetActDesc()->fLocal) {
2987 gROOT->SetInterrupt();
2990 }
2991 // stop icon animation and set connected icon
2992 fViewer->ChangeRightLogo("monitor01.xpm");
2994}
2995
2996////////////////////////////////////////////////////////////////////////////////
2997/// Show query log.
2998
3000{
3002 if (!item) return;
3003 TObject *obj = (TObject *)item->GetUserData();
3004 if ((!obj) || (obj->IsA() != TQueryDescription::Class()))
3005 return;
3006 TQueryDescription *query = (TQueryDescription *)obj;
3007 fViewer->ShowLog(query->fReference.Data());
3008}
3009
3010////////////////////////////////////////////////////////////////////////////////
3011/// Retrieve query.
3012
3014{
3015 // check for proof validity
3016 if (fViewer->GetActDesc()->fAttached &&
3020 if (!item) return;
3021 TObject *obj = (TObject *)item->GetUserData();
3022 if (obj && obj->IsA() == TQueryDescription::Class()) {
3023 // as it can take time, set watch cursor
3024 gVirtualX->SetCursor(GetId(), gVirtualX->CreateCursor(kWatch));
3025 TQueryDescription *query = (TQueryDescription *)obj;
3027 if (rc == 0)
3029 // restore cursor
3030 gVirtualX->SetCursor(GetId(), 0);
3031 }
3032 }
3033 if (fViewer->GetActDesc()->fLocal) {
3034 TGListTreeItem *item=0, *item2=0;
3036 fViewer->GetActDesc());
3037 if (item) {
3038 item2 = fViewer->GetSessionHierarchy()->FindItemByObj(item,
3040 }
3041 if (item2) {
3042 // add input and output list entries
3044 if (chain) {
3045 TSelector *selector = ((TTreePlayer *)(chain->GetPlayer()))->GetSelectorFromFile();
3046 if (selector) {
3047 TList *objlist = selector->GetOutputList();
3048 if (objlist)
3049 if (!fViewer->GetSessionHierarchy()->FindChildByName(item2, "OutputList"))
3050 fViewer->GetSessionHierarchy()->AddItem(item2, "OutputList");
3051 }
3052 }
3053 }
3054 // update list tree, query frame information, and buttons state
3057 UpdateInfos();
3059 }
3060}
3061
3062////////////////////////////////////////////////////////////////////////////////
3063/// Abort processing query.
3064
3066{
3067 // check for proof validity
3068 if (fViewer->GetActDesc()->fProof &&
3071 }
3072 if (fViewer->GetActDesc()->fLocal) {
3073 gROOT->SetInterrupt();
3076 }
3077 // stop icon animation and set connected icon
3078 fViewer->ChangeRightLogo("monitor01.xpm");
3080}
3081
3082////////////////////////////////////////////////////////////////////////////////
3083/// Submit query.
3084
3086{
3087 Int_t retval;
3088 Long64_t id = 0;
3090 if (!item) return;
3091 // retrieve query description attached to list tree item
3092 TObject *obj = (TObject *)item->GetUserData();
3093 if (!obj || obj->IsA() != TQueryDescription::Class())
3094 return;
3095 TQueryDescription *newquery = (TQueryDescription *)obj;
3096 // reset progress information
3098 newquery->fNbFiles, newquery->fFirstEntry, newquery->fNoEntries);
3099 // set query start time
3100 newquery->fStartTime = gSystem->Now();
3102 // check for proof validity
3103 if (fViewer->GetActDesc()->fProof &&
3106 // set query description status to submitted
3108 // if feedback option selected
3110 Int_t i = 0;
3111 // browse list of feedback histos and check user's selected ones
3112 while (kFeedbackHistos[i]) {
3113 if (fViewer->GetCascadeMenu()->IsEntryChecked(41+i)) {
3116 }
3117 i++;
3118 }
3119 // connect feedback signal
3120 fViewer->GetActDesc()->fProof->Connect("Feedback(TList *objs)",
3121 "TSessionQueryFrame", fViewer->GetQueryFrame(),
3122 "Feedback(TList *objs)");
3123 gROOT->Time();
3124 }
3125 else {
3126 // if feedback option not selected, clear Proof's feedback option
3128 }
3129 // set current proof session
3130 fViewer->GetActDesc()->fProof->cd();
3131 // check if parameter file has been specified
3132 if (newquery->fChain) {
3133 if (fViewer->GetActDesc()->fProof->IsLite()) {
3134 newquery->fOptions = "";
3135 }
3136 // set query reference id
3137 newquery->fReference= TString::Format("session-%s:q%d",
3140 if (newquery->fChain->IsA() == TChain::Class()) {
3141 // TChain case
3143 ((TChain *)newquery->fChain)->SetProof(fViewer->GetActDesc()->fProof);
3144 id = ((TChain *)newquery->fChain)->Process(newquery->fSelectorString,
3145 newquery->fOptions,
3146 newquery->fNoEntries > 0 ? newquery->fNoEntries : 1234567890,
3147 newquery->fFirstEntry);
3148 }
3149 else if (newquery->fChain->IsA() == TDSet::Class()) {
3150 // TDSet case
3152 id = ((TDSet *)newquery->fChain)->Process(newquery->fSelectorString,
3153 newquery->fOptions,
3154 newquery->fNoEntries,
3155 newquery->fFirstEntry);
3156 }
3157 }
3158 else {
3159 Error("Submit", "No TChain defined; skipping");
3161 return;
3162 }
3163 // set query reference id to unique identifier
3164 newquery->fReference= TString::Format("session-%s:q%lld",
3166 // start icon animation
3168 }
3169 else if (fViewer->GetActDesc()->fLocal) { // local session case
3170 // if feedback option selected
3172 Int_t i = 0;
3173 // browse list of feedback histos and check user's selected ones
3174 while (kFeedbackHistos[i]) {
3175 if (fViewer->GetCascadeMenu()->IsEntryChecked(41+i)) {
3177 }
3178 i++;
3179 }
3180 }
3181 if (newquery->fChain) {
3182 if (newquery->fChain->IsA() == TChain::Class()) {
3183 // TChain case
3186 UpdateButtons(newquery);
3187 gPad->SetEditable(kFALSE);
3188 ((TChain *)newquery->fChain)->SetTimerInterval(100);
3189 id = ((TChain *)newquery->fChain)->Process(newquery->fSelectorString,
3190 newquery->fOptions,
3191 newquery->fNoEntries > 0 ? newquery->fNoEntries : 1234567890,
3192 newquery->fFirstEntry);
3193 ((TChain *)newquery->fChain)->SetTimerInterval(0);
3194 OnBtnRetrieve();
3195 TChain *chain = (TChain *)newquery->fChain;
3196 ProgressLocal(chain->GetEntries(),
3197 chain->GetReadEntry()+1);
3201 UpdateButtons(newquery);
3202 }
3203 else {
3204 new TGMsgBox(fClient->GetRoot(), this, "Error Submitting Query",
3205 "Only TChains are allowed in Local Session (no TDSet) !",
3206 kMBIconExclamation,kMBOk,&retval);
3207 }
3208 }
3209 else {
3210 Error("Submit", "No TChain defined; skipping");
3212 return;
3213 }
3214 // set query reference id to unique identifier
3215 newquery->fReference = TString::Format("local-session-%s:q%lld", newquery->fQueryName.Data(), id);
3216 }
3217 // update buttons state
3218 UpdateButtons(newquery);
3219}
3220
3221////////////////////////////////////////////////////////////////////////////////
3222/// Update buttons state for the current query status.
3223
3225{
3227 if (!item) return;
3228 // retrieve query description attached to list tree item
3229 TObject *obj = (TObject *)item->GetUserData();
3230 if (!obj || obj->IsA() != TQueryDescription::Class())
3231 return;
3232 TQueryDescription *query = (TQueryDescription *)obj;
3233 if (desc != query) return;
3234
3235 Bool_t submit_en = kFALSE;
3236 if ((fViewer->GetActDesc()->fProof &&
3237 fViewer->GetActDesc()->fProof->IsValid()) ||
3239 submit_en = kTRUE;
3240
3241 switch (desc->fStatus) {
3243 fBtnSubmit->SetEnabled(submit_en);
3249 break;
3250
3252 fBtnSubmit->SetEnabled(submit_en);
3254 if (((desc->fResult == 0) || (desc->fResult &&
3255 (desc->fResult->IsFinalized() ||
3256 (desc->fResult->GetInputObject("TDSet") == 0)))) &&
3257 !(fViewer->GetActDesc()->fLocal))
3263 break;
3264
3266 fBtnSubmit->SetEnabled(submit_en);
3272 break;
3273
3281 break;
3282
3290 break;
3291
3293 fBtnSubmit->SetEnabled(submit_en);
3299 break;
3300
3302 fBtnSubmit->SetEnabled(submit_en);
3308 break;
3309
3311 fBtnSubmit->SetEnabled(submit_en);
3317 break;
3318
3319 default:
3320 break;
3321 }
3322 if (fViewer->GetActDesc()->fLocal &&
3326 }
3327}
3328
3329////////////////////////////////////////////////////////////////////////////////
3330/// Update query information (header) text view.
3331
3333{
3334 TString buffer;
3335 const char *qst[] = {"aborted ", "submitted", "running ",
3336 "stopped ", "completed"};
3337
3340
3341 if (fViewer->GetActDesc()->fLocal ||
3345 fViewer->GetActDesc()->fProof->IsValid())) {
3346 fBtnSave->SetText(" Submit ");
3347 }
3348 else {
3349 fBtnSave->SetText(" Apply changes ");
3350 }
3353 if (!fViewer->GetActDesc()->fActQuery ||
3355 ResetProgressDialog("", 0, 0, 0);
3356 if (fViewer->GetActDesc()->fLocal) {
3357 if (fViewer->GetActDesc()->fActQuery) {
3359 if (chain) {
3360 ProgressLocal(chain->GetEntries(),
3361 chain->GetReadEntry()+1);
3362 }
3363 else {
3364 ProgressLocal(0, 0);
3365 }
3367 }
3368 }
3369 else {
3370 fTotal->SetText(" Estimated time left : 0 sec (0 events of 0 processed) ");
3371 fRate->SetText(" Processing Rate : 0.0f events/sec ");
3372 frmProg->Reset();
3373 fFB->Layout();
3374 }
3375 return;
3376 }
3378
3379 // Status label
3380 Int_t st = (result->GetStatus() > 0 && result->GetStatus() <=
3381 TQueryResult::kCompleted) ? result->GetStatus() : 0;
3382
3383 Int_t qry = result->GetSeqNum();
3384
3385 buffer = TString::Format("------------------------------------------------------\n");
3386 // Print header
3387 if (!result->IsDraw()) {
3388 const char *fin = result->IsFinalized() ? "finalized" : qst[st];
3389 const char *arc = result->IsArchived() ? "(A)" : "";
3390 buffer = TString::Format(" Query No : %d\n", qry);
3391 buffer += TString::Format(" Ref : \"%s:%s\"\n", result->GetTitle(),
3392 result->GetName());
3393 buffer += TString::Format(" Selector : %s\n",
3394 result->GetSelecImp()->GetTitle());
3395 buffer += TString::Format("Status : %9s%s\n", fin, arc);
3396 buffer += TString::Format("------------------------------------------------------\n");
3397 } else {
3398 buffer += TString::Format(" Query No : %d\n", qry);
3399 buffer += TString::Format(" Ref : \"%s:%s\"\n", result->GetTitle(),
3400 result->GetName());
3401 buffer += TString::Format(" Selector : %s\n",
3402 result->GetSelecImp()->GetTitle());
3403 buffer += TString::Format("------------------------------------------------------\n");
3404 }
3405
3406 // Time information
3407 Int_t elapsed = (Int_t)(result->GetEndTime().Convert() -
3408 result->GetStartTime().Convert());
3409 buffer += TString::Format(" Started : %s\n",
3410 result->GetStartTime().AsString());
3411 buffer += TString::Format(" Real time : %d sec (CPU time: %.1f sec)\n",
3412 elapsed, result->GetUsedCPU());
3413
3414 // Number of events processed, rate, size
3415 Double_t rate = 0.0;
3416 if (result->GetEntries() > -1 && elapsed > 0)
3417 rate = result->GetEntries() / (Double_t)elapsed ;
3418 Float_t size = ((Float_t)result->GetBytes())/(1024*1024);
3419 buffer += TString::Format(" Processed : %lld events (size: %.3f MBs)\n",
3420 result->GetEntries(), size);
3421 buffer += TString::Format(" Rate : %.1f evts/sec\n", rate);
3422
3423 // Package information
3424 if (strlen(result->GetParList()) > 1) {
3425 buffer += TString::Format(" Packages : %s\n", result->GetParList());
3426 }
3427
3428 // Result information
3429 TString res = result->GetResultFile();
3430 if (!result->IsArchived()) {
3431 Int_t dq = res.Index("queries");
3432 if (dq > -1) {
3433 res.Remove(0,res.Index("queries"));
3434 res.Insert(0,"<PROOF_SandBox>/");
3435 }
3436 if (res.BeginsWith("-")) {
3437 res = (result->GetStatus() == TQueryResult::kAborted) ?
3438 "not available" : "sent to client";
3439 }
3440 }
3441 if (res.Length() > 1) {
3442 buffer += TString::Format("------------------------------------------------------\n");
3443 buffer += TString::Format(" Results : %s\n", res.Data());
3444 }
3445
3446 if (result->GetOutputList() && result->GetOutputList()->GetSize() > 0) {
3447 buffer += TString::Format(" Outlist : %d objects\n",
3448 result->GetOutputList()->GetSize());
3449 buffer += TString::Format("------------------------------------------------------\n");
3450 }
3451 fInfoTextView->LoadBuffer(buffer.Data());
3452
3453 //Float_t pos = Float_t((Double_t)(result->GetEntries() * 100)/(Double_t)total);
3454 if (result->GetStatus() == TQueryResult::kAborted)
3455 frmProg->SetBarColor("red");
3456 else if (result->GetStatus() == TQueryResult::kStopped)
3457 frmProg->SetBarColor("yellow");
3458 else
3459 frmProg->SetBarColor("green");
3460
3461 frmProg->SetPosition(100.0);
3462
3463 buffer = TString::Format(" Processed : %lld events in %.1f sec", result->GetEntries(),
3464 (Float_t)elapsed);
3465 fTotal->SetText(buffer.Data());
3466 buffer = TString::Format(" Processing Rate : %.1f events/sec ", rate);
3467 fRate->SetText(buffer.Data());
3468 fFB->Layout();
3469}
3470
3471//////////////////////////////////////////////////////////////////////////////////////////
3472// Output frame
3473
3474////////////////////////////////////////////////////////////////////////////////
3475/// Constructor.
3476
3478 TGCompositeFrame(p, w, h), fEntryTmp(0), fLVContainer(0), fViewer(0)
3479{
3480}
3481
3482////////////////////////////////////////////////////////////////////////////////
3483/// Destructor.
3484
3486{
3487 delete fLVContainer; // this container is inside the TGListView and is not
3488 // deleted automatically
3489 Cleanup();
3490}
3491
3492////////////////////////////////////////////////////////////////////////////////
3493/// Build query output information frame.
3494
3496{
3497 fViewer = gui;
3500
3501 // Container of object TGListView
3502 TGListView *frmListView = new TGListView(this, 340, 190);
3503 fLVContainer = new TGLVContainer(frmListView, kSunkenF