AliRoot Core  3abf5b4 (3abf5b4)
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
AliStorageAdministratorPanel.cxx
Go to the documentation of this file.
5 #include "AliESDEvent.h"
6 
7 #include <fstream>
8 #include <iostream>
9 
10 #include <TGMenu.h>
11 
12 using namespace std;
13 
15 
16 #define WINDOWS_WIDTH 500
17 #define WINDOWS_HEIGHT 350
18 
24 };
25 
26 enum MENUBAR{
34 };
35 
36 enum FRAME{
39 };
40 
42  TGMainFrame(gClient->GetRoot(), 400, 400),
43  fPanelQuited(false),
44  fConnectionLabel(0),
45  fDataLabel(0),
46  fSavingLabel(0),
47  fCurrentSizeLabel(0),
48  fMaxSizeLabel(0),
49  fMaxOccupationLabel(0),
50  fRemoveEventsLabel(0),
51  fEventsInChunkLabel(0),
52  fMaxStorageSize(0),
53  fMaxOccupation(0),
54  fRemoveEvents(0),
55  fEventsInChunk(0),
56  fCommunicationThread(0),
57  fCommunicationSocket(CLIENT_COMMUNICATION_REQ),
58  fServerSocket(SERVER_COMMUNICATION_REQ),
59  fEventManager(0)
60 {
61  InitWindow();
62 
63  //create event manager
65  fEventManager->CreateSocket(CLIENT_COMMUNICATION_REQ);
66  fEventManager->CreateSocket(SERVER_COMMUNICATION_REQ);
67 
68  // start communication with client thread
69  fCommunicationThread = new TThread("fCommunicationThread",
70  Dispatch,(void*)this);
71  fCommunicationThread->Run();
72 }
73 
75 {
76  cout<<"ADMIN -- AliStorageAdministratorPanel descructor called";
77  cout<<" --- OK"<<endl;
78 }
79 
80 void AliStorageAdministratorPanel::CheckStateHandle()//ask client about its state
81 {
82  while(!fPanelQuited)
83  {
84  CheckClientState(REQUEST_CONNECTION);
85  sleep(1);
86  CheckClientState(REQUEST_RECEIVING);
87  sleep(1);
88  CheckClientState(REQUEST_SAVING);
89  sleep(1);
90  CheckClientState(REQUEST_CURRENT_SIZE);
91  sleep(1);
92  CheckClientState(REQUEST_GET_PARAMS);
93  sleep(1);
94  }
95 }
96 
98 {
99  struct clientRequestStruct *request = new struct clientRequestStruct;
100  request->messageType = option;
102  {
103  SetLabel(fConnectionLabel,STATUS_DOWN);
104  SetLabel(fDataLabel,STATUS_DOWN);
105  SetLabel(fSavingLabel,STATUS_DOWN);
106  cout<<"ADMIN -- CLIENT IS DOWN"<<endl;
107  return;
108  }
109 
110  long response = -1;
111  struct clientRequestStruct *responseParams = NULL;
112 
113  if(option == REQUEST_GET_PARAMS)
114  {
115  fEventManager->Get(responseParams,fCommunicationSocket);
116  }
117  else
118  {
120  }
121  switch(option)
122  {
123  case REQUEST_CONNECTION:
124  SetLabel(fConnectionLabel,response);
125  break;
126  case REQUEST_RECEIVING:
127  SetLabel(fDataLabel,response);
128  break;
129  case REQUEST_SAVING:
130  SetLabel(fSavingLabel,response);
131  break;
132  case REQUEST_CURRENT_SIZE:
133  SetLabelValue(fCurrentSizeLabel,response,1);
134  break;
135  case REQUEST_GET_PARAMS:
136  fMaxStorageSize = responseParams->maxStorageSize;
137  fMaxOccupation = responseParams->maxOccupation;
138  fRemoveEvents = responseParams->removeEvents;
139  fEventsInChunk = responseParams->eventsInChunk;
140 
145  break;
146  default:break;
147  }
148  if(request){delete request;}
149 }
150 
152 {
153  SetCleanup(kDeepCleanup);
154  // add main manubar on top of the window
156  AddFrame(new TGHorizontal3DLine(this),
157  new TGLayoutHints(kLHintsNormal | kLHintsExpandX));
158  // add toolbar with pictured buttons
159  /*SetupToolbar();
160  AddFrame(new TGHorizontal3DLine(this),
161  new TGLayoutHints(kLHintsNormal | kLHintsExpandX));
162  // add dockable toolbar
163  SetupDockableMenuBar();
164  AddFrame(new TGHorizontal3DLine(this),
165  new TGLayoutHints(kLHintsNormal | kLHintsExpandX));
166  */
167 
168  // add frame with two segments for client and server
170  SetWindowName("ALICE Storage Manager");
171  MapSubwindows();
173  MapWindow();
174 }
175 
177 {
178  // create frame for both client and server
179  TGHorizontalFrame *threadsFrame = new TGHorizontalFrame(this);
180 
181  //create client frame and add components to it
182  TGCompositeFrame *clientThreadFrame = new TGCompositeFrame(threadsFrame,CLIENT_FRAME);
183  fConnectionLabel = new TGLabel(clientThreadFrame,"======Waiting======");
184  fDataLabel = new TGLabel(clientThreadFrame,"======Waiting======");
185  fSavingLabel = new TGLabel(clientThreadFrame,"======Waiting======");
186  fCurrentSizeLabel = new TGLabel(clientThreadFrame,"=========Waiting=========");
187  fMaxSizeLabel = new TGLabel(clientThreadFrame,"==========Waiting=========");
188  fMaxOccupationLabel = new TGLabel(clientThreadFrame,"==========Waiting=========");
189  fRemoveEventsLabel = new TGLabel(clientThreadFrame,"==========Waiting=========");
190  fEventsInChunkLabel = new TGLabel(clientThreadFrame,"==========Waiting=========");
191 
192  clientThreadFrame->AddFrame(new TGLabel(clientThreadFrame,
193  "ALICE Storage Client"),
194  new TGLayoutHints(kLHintsCenterX));
195 
196  //connection label
197  clientThreadFrame->AddFrame(new TGLabel(clientThreadFrame,
198  "Connection:"),
199  new TGLayoutHints(kLHintsCenterX));
200  clientThreadFrame->AddFrame(fConnectionLabel,
201  new TGLayoutHints(kLHintsCenterX));
202 
203  //data receiving label
204  clientThreadFrame->AddFrame(new TGLabel(clientThreadFrame,
205  "Receiving data:"),
206  new TGLayoutHints(kLHintsCenterX));
207  clientThreadFrame->AddFrame(fDataLabel,
208  new TGLayoutHints(kLHintsCenterX));
209 
210  //saving label
211  clientThreadFrame->AddFrame(new TGLabel(clientThreadFrame,
212  "Saving:"),
213  new TGLayoutHints(kLHintsCenterX));
214  clientThreadFrame->AddFrame(fSavingLabel,
215  new TGLayoutHints(kLHintsCenterX));
216 
217  //current size label
218  clientThreadFrame->AddFrame(new TGLabel(clientThreadFrame,
219  "Current storage size:"),
220  new TGLayoutHints(kLHintsCenterX));
221  clientThreadFrame->AddFrame(fCurrentSizeLabel,
222  new TGLayoutHints(kLHintsCenterX));
223 
224  //max size label
225  clientThreadFrame->AddFrame(new TGLabel(clientThreadFrame,
226  "Max storage size:"),
227  new TGLayoutHints(kLHintsCenterX));
228  clientThreadFrame->AddFrame(fMaxSizeLabel,
229  new TGLayoutHints(kLHintsCenterX));
230 
231  //max occupation label
232  clientThreadFrame->AddFrame(new TGLabel(clientThreadFrame,
233  "Max occupation percent:"),
234  new TGLayoutHints(kLHintsCenterX));
235  clientThreadFrame->AddFrame(fMaxOccupationLabel,
236  new TGLayoutHints(kLHintsCenterX));
237 
238  //remove events label
239  clientThreadFrame->AddFrame(new TGLabel(clientThreadFrame,
240  "Remove events percentage:"),
241  new TGLayoutHints(kLHintsCenterX));
242  clientThreadFrame->AddFrame(fRemoveEventsLabel,
243  new TGLayoutHints(kLHintsCenterX));
244 
245  //events in chunk label
246  clientThreadFrame->AddFrame(new TGLabel(clientThreadFrame,
247  "Number of events in chunk:"),
248  new TGLayoutHints(kLHintsCenterX));
249  clientThreadFrame->AddFrame(fEventsInChunkLabel,
250  new TGLayoutHints(kLHintsCenterX));
251 
252  //create server frame and add components to it
253  TGCompositeFrame *serverThreadFrame = new TGCompositeFrame(threadsFrame,SERVER_FRAME);
254  serverThreadFrame->AddFrame(new TGLabel(serverThreadFrame,
255  "ALICE Storage Server"),
256  new TGLayoutHints(kLHintsCenterX));
257 
258  //add client and server frames to threads frame
259  threadsFrame->AddFrame(clientThreadFrame,
260  new TGLayoutHints(kLHintsLeft | kLHintsExpandX));
261  threadsFrame->AddFrame(new TGVertical3DLine(threadsFrame),
262  new TGLayoutHints(kLHintsNormal | kLHintsExpandY));
263  threadsFrame->AddFrame(serverThreadFrame,
264  new TGLayoutHints(kLHintsRight | kLHintsExpandX));
265 
266  //add threads frame to main window
267  AddFrame(threadsFrame,new TGLayoutHints(kLHintsExpandX | kLHintsExpandY));
268 }
269 
271 {
272  //create popup menu for client
273  TGPopupMenu *clientPopup = new TGPopupMenu(fClient->GetRoot());
274  clientPopup->AddEntry("&Set storage params",MENUBAR_CLIENT_SET_PARAMS);
275  clientPopup->Associate(this);
276 
277  //create popup menu for server
278  TGPopupMenu *serverPopup = new TGPopupMenu(fClient->GetRoot());
279  serverPopup->AddEntry("&Get Events List",MENUBAR_SERVER_LIST_EVENTS);
280  serverPopup->AddEntry("&Mark Event",MENUBAR_SERVER_MARK_EVENT);
281  serverPopup->AddEntry("&Mark ALL Events",MENUBAR_SERVER_MARK_ALL_EVENTS);
282  serverPopup->AddEntry("&Get Event (test)",MENUBAR_SERVER_GET_EVENT);
283  serverPopup->AddEntry("&Get Next Event (test)",MENUBAR_SERVER_GET_NEXT_EVENT);
284  serverPopup->AddEntry("&Get Last Event (test)",MENUBAR_SERVER_GET_LAST_EVENT);
285  serverPopup->Associate(this);
286 
287  //create menubar
288  TGMenuBar *menuBar = new TGMenuBar(this,1,1,kHorizontalFrame);
289  menuBar->AddPopup("&Client",clientPopup,
290  new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 4, 0, 0));
291  menuBar->AddPopup("&Server", serverPopup,
292  new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 4, 0, 0));
293 
294  AddFrame(menuBar,new TGLayoutHints(kLHintsTop | kLHintsExpandX));
295 }
296 
297 //handle GUI actions
298 Bool_t AliStorageAdministratorPanel::ProcessMessage(Long_t msg, Long_t parm1, Long_t)
299 {
300  switch (GET_MSG(msg))
301  {
302 
303  case kC_COMMAND:
304  switch (GET_SUBMSG(msg))
305  {
306  case kCM_BUTTON://when button is pressed
307  break;
308  case kCM_MENUSELECT://when mouse is over menu entry
309  break;
310  case kCM_MENU://when menu entry was clicked
311  switch (parm1)
312  {
320  default:break;
321  }
322  break;
323  default:break;
324  }
325  break;
326  default:break;
327  }
328 
329  return false;
330 }
331 
333 {
334  AliStorageAdministratorPanelListEvents *listEventsWindow =
336  if(listEventsWindow){cout<<"List events window created"<<endl;}
337 }
338 
340 {
341  AliStorageAdministratorPanelMarkEvent *markEventWindow =
343  if(markEventWindow){cout<<"Mark event window created"<<endl;}
344 }
345 
347 {
348  // get list of all events:
349  struct serverRequestStruct *requestMessage = new struct serverRequestStruct;
350  requestMessage->messageType = REQUEST_LIST_EVENTS;
351 // requestMessage->list = list;
352 
353 // struct listRequestStruct list;
354 
355  requestMessage->runNumber[0]=0;
356  requestMessage->runNumber[1]=999999;
357  requestMessage->eventNumber[0]=0;
358  requestMessage->eventNumber[1]=999999;
359  requestMessage->marked[0]=1;
360  requestMessage->marked[1]=0;
361  requestMessage->multiplicity[0]=1;
362  requestMessage->multiplicity[1]=999999;
363  strcpy(requestMessage->system[0],"p-p");
364  strcpy(requestMessage->system[1],"A-A");
365 
366 
367  fEventManager->Send(requestMessage,SERVER_COMMUNICATION_REQ);
368  vector<serverListStruct> *tmpVector;
369  fEventManager->Get(tmpVector,SERVER_COMMUNICATION_REQ);
370  vector<serverListStruct> &receivedList = *tmpVector;
371 
372  cout<<"ADMIN PANEL -- received list of marked events:"<<receivedList.size()<<endl;
373 
374  int failCounter=0;
375 
376  int i;
377  for(i=0;i<receivedList.size();i++)
378  {
379  cout<<"marking:"<<i<<endl;
380  struct serverRequestStruct *requestMessage = new struct serverRequestStruct;
381  requestMessage->messageType = REQUEST_MARK_EVENT;
382 // requestMessage->event = mark;
383 
384 // struct eventStruct mark;
385  requestMessage->eventsRunNumber = receivedList[i].runNumber;
386  requestMessage->eventsEventNumber = receivedList[i].eventNumber;
387 
388 
389  fEventManager->Send(requestMessage,SERVER_COMMUNICATION_REQ);
390  bool response;
391  fEventManager->Get(&response,SERVER_COMMUNICATION_REQ);
392  delete requestMessage;
393  if(!response){failCounter++;}
394  }
395  cout<<"Tried to mark: "<<i<<"events"<<endl;
396  cout<<"Could not mark: "<<failCounter<<" events"<<endl;
397 }
398 
400 {
403 
404  setParamsWindow->Setup(fCommunicationSocket,
405  fMaxStorageSize/1000000,
409 }
410 
412 {
413  //this method is just for tests
414  int runNumber=197669;
415  int eventNumber=168;
416 
417  struct serverRequestStruct *requestMessage = new struct serverRequestStruct;
418 // struct eventStruct mark;
419  requestMessage->eventsRunNumber = runNumber;
420  requestMessage->eventsEventNumber = eventNumber;
421  requestMessage->messageType = REQUEST_GET_EVENT;
422 // requestMessage->event = mark;
423 
424  fEventManager->Send(requestMessage,fServerSocket);
425  AliESDEvent *resultEvent = NULL;
426  fEventManager->Get(resultEvent,fServerSocket);
427 
428  if(resultEvent)
429  {
430  cout<<"ADMIN -- received event. Run no:"<<resultEvent->GetRunNumber()<<"\tEvent no in file:"<<resultEvent->GetEventNumberInFile()<<endl;
431  }
432  else
433  {
434  cout<<"ADMIN -- received no event"<<endl;
435  }
436 }
437 
438 
440 {
441  //this method is just for tests
442  int runNumber=197669;
443  int eventNumber=33;
444 
445  struct serverRequestStruct *requestMessage = new struct serverRequestStruct;
446 // struct eventStruct mark;
447  requestMessage->eventsRunNumber = runNumber;
448  requestMessage->eventsEventNumber = eventNumber;
449  requestMessage->messageType = REQUEST_GET_NEXT_EVENT;
450 // requestMessage->event = mark;
451 
452  fEventManager->Send(requestMessage,fServerSocket);
453  AliESDEvent* resultEvent = NULL;
454  fEventManager->Get(resultEvent,fServerSocket);
455  if(resultEvent)
456  {
457  cout<<"ADMIN -- received event. Run no:"<<resultEvent->GetRunNumber()<<"\tEvent no in file:"<<resultEvent->GetEventNumberInFile()<<endl;
458  }
459  else
460  {
461  cout<<"ADMIN -- received no event"<<endl;
462  }
463 }
464 
465 
467 {
468  struct serverRequestStruct *requestMessage = new struct serverRequestStruct;
469  requestMessage->messageType = REQUEST_GET_LAST_EVENT;
470 
471  fEventManager->Send(requestMessage,fServerSocket);
472  AliESDEvent* resultEvent = NULL;
473  fEventManager->Get(resultEvent,fServerSocket);
474 
475  if(resultEvent)
476  {
477  cout<<"ADMIN -- received event. Run no:"<<resultEvent->GetRunNumber()<<"\tEvent no in file:"<<resultEvent->GetEventNumberInFile()<<endl;
478  }
479  else
480  {
481  cout<<"ADMIN -- received no event"<<endl;
482  }
483 }
484 
486 {
487  cout<<"ADMIN -- Quiting ALICE Storage Admin Panel"<<endl;
488  fPanelQuited=true;
489  gSystem->ExitLoop();
490 }
491 
493 
494 
495 //methods to change labels:
496 void AliStorageAdministratorPanel::SetLabel(TGLabel *label, int option)
497 {
498  switch(option)
499  {
500  case STATUS_WAITING:
501  label->SetText("Waiting");
502  label->SetTextColor(kBlack);
503  break;
504  case STATUS_OK:
505  label->SetText("OK");
506  label->SetTextColor(kBlack);
507  break;
508  case STATUS_ERROR:
509  label->SetText("ERROR");
510  label->SetTextColor(kBlack);
511  break;
512  case STATUS_DOWN:
513  label->SetText("CLIENT IS DOWN");
514  label->SetTextColor(kRed);
515  break;
516  default:break;
517  }
518  gClient->HandleInput();
519 }
520 
521 void AliStorageAdministratorPanel::SetLabelValue(TGLabel *label, long value,int option)
522 {
523  // options:
524  // 1 - MB
525  // 2 - percentage
526  // 3 - number
527 
528  switch(option)
529  {
530  case 1:
531  label->SetText(Form("%lu B (%.2f MB)",value,(float)value/(1000.*1000.)));
532  break;
533  case 2:
534  label->SetText(Form("%d %%",(int)value));
535  break;
536  case 3:
537  label->SetText(Form("%d",(int)value));
538  break;
539  default:break;
540  }
541  label->SetTextColor(kBlack);
542  gClient->HandleInput();
543 }
544 //other methods that can be useful later
545 
546 /*
547 void AliStorageAdministratorPanel::SetupToolbar()
548 {
549  TGToolBar* toolBar = new TGToolBar(this);
550  toolBar->AddButton(this,new TGPictureButton(toolBar,
551  Form("%s/MONITOR/icons/start.png",
552  gSystem->Getenv("ALICE_ROOT")),
553  TOOLBUTTON_START ) );
554  toolBar->AddButton(this, new TGPictureButton(toolBar,
555  Form("%s/MONITOR/icons/stop.png",
556  gSystem->Getenv("ALICE_ROOT")),
557  TOOLBUTTON_STOP) );
558 
559  AddFrame(toolBar, new TGLayoutHints(kLHintsNormal | kLHintsExpandX));
560 }
561 
562 void AliStorageAdministratorPanel::SetupDockableMenuBar()
563 {
564  TGDockableFrame *menuDock = new TGDockableFrame(this);
565  AddFrame(menuDock,new TGLayoutHints(kLHintsExpandX,0,0,1,0));
566  menuDock->SetWindowName("ALICE Storage Dockable MenuBar");
567  menuDock->EnableUndock(kTRUE);
568  menuDock->EnableHide(kTRUE);
569 
570  TGPopupMenu *popup1 = new TGPopupMenu(fClient->GetRoot());
571  popup1->AddEntry("&Check client state",MENUBAR_1_OPTION_1);
572  popup1->AddSeparator();
573  popup1->AddEntry("&BBB",MENUBAR_1_OPTION_2);
574  popup1->AddEntry("&CCC",MENUBAR_1_OPTION_3);
575 
576  popup1->DisableEntry(MENUBAR_1_OPTION_2);
577  popup1->Associate(this);
578 
579 
580  TGMenuBar *menuBar = new TGMenuBar(menuDock,1,1,kHorizontalFrame);
581  menuBar->AddPopup("&File",
582  popup1,
583  new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 4, 0, 0));
584 
585  menuDock->AddFrame(menuBar,
586  new TGLayoutHints(kLHintsTop | kLHintsExpandX));
587  }*/
void SetLabelValue(TGLabel *label, long value, int option)
void Setup(storageSockets socket, int maxStorageSize, int maxOccupation, int removeEvents, int eventsInChunk)
void SetLabel(TGLabel *label, int option)
static AliZMQManager * GetInstance()
ClassImp(AliStorageAdministratorPanel)
virtual Bool_t ProcessMessage(Long_t msg, Long_t parm1, Long_t)
static AliStorageAdministratorPanelSetStorageParams * GetInstance()
void CreateSocket(storageSockets socket)
#define WINDOWS_HEIGHT
bool Send(std::vector< serverListStruct > list, storageSockets socket)
static AliStorageAdministratorPanelListEvents * GetInstance()
#define WINDOWS_WIDTH
static AliStorageAdministratorPanelMarkEvent * GetInstance()
bool Get(std::vector< serverListStruct > *&result, storageSockets socket)