GUI/TFndGeb2hdtGUI.cxx

00001 // @(#)fROOT/GUI:$Name:  $:$Id: TFndGeb2hdtGUI.cxx,v 1.24 2007/09/07 15:37:19 Diego_Faso Exp $
00002 // Author: Diego Faso <mailto:faso@to.infn.it>, 2006/06/05
00003 
00004 #include "TApplication.h"
00005 
00006 #include "TFndGeb2hdtGUI.h"
00007 
00008   ClassImp(TFndGeb2hdtGUI)
00009 
00010 //_____________________________
00011 TFndGeb2hdtGUI::TFndGeb2hdtGUI():
00012   TGMainFrame(gClient->GetRoot(),100,100),
00013   fCurMan()
00014 {
00015 //   SetLayoutBroken(kTRUE);
00016 //   SetCleanup(kDeepCleanup);
00017 
00018 }
00019 
00020 //_____________________________
00021 TFndGeb2hdtGUI::TFndGeb2hdtGUI(TFndGeb2hdtMan *Geb2hMan):
00022   TGMainFrame(gClient->GetRoot(),100,100),
00023   fCurMan()
00024 {
00025   fCurMan = Geb2hMan;
00026 }
00027 
00028 //_____________________________
00029 TFndGeb2hdtGUI::~TFndGeb2hdtGUI(){
00030   
00031   Cleanup();
00032 }
00033 
00034 //_____________________________
00035 void TFndGeb2hdtGUI::CloseWindow(){
00036   
00037   Info("TFndGeb2hdtGUI::CloseWindow","   ...closing GUI..."); 
00038   delete this;
00039 }
00040 
00041 //_____________________________
00042 void TFndGeb2hdtGUI::BuildGUI(){
00043  
00044   //  TThread::Lock();
00045   Info("BuildGUI","Building GUI");
00046   Bool_t is_online = kFALSE;
00047 
00048   if(!fCurMan){
00049     Error("BuildGUI","This GUI is not useful without a manager (TFndGeb2hdtMan)");
00050     return;
00051   }
00052   is_online = fCurMan->GetOnlFlag();
00053   
00054   //--------- buttons (in fButFrame) ---------//
00055   fButFrame = new TGVerticalFrame(this);
00056   fStopBut =  new TGTextButton(this, "&STOP", 1);
00057   fPauseBut = new TGTextButton(this, "&PAUSE", 2);
00058 
00059   if(is_online){ // shared memories reset in online-mode only
00060     fResetGtsBut = new TGTextButton(this, "&Reset GTS", 3);
00061     fResetTofBut = new TGTextButton(this, "&Reset TOF", 4);
00062     fResetSilBut = new TGTextButton(this, "&Reset SIL", 5);
00063     fResetLmdBut = new TGTextButton(this, "&Reset LMD", 6);
00064     fResetStbBut = new TGTextButton(this, "&Reset STB", 7);
00065   }
00066   
00067   
00068   fTextGroup = new TGGroupFrame(this, "Producer real-time messages", kVerticalFrame);
00069   fTextGroup->SetTitlePos(TGGroupFrame::kCenter);
00070   // ---
00071   fTextMessages = new TGTextEntry(fTextGroup,"...initializing monitor producer...");
00072   fTextMessages->SetAlignment(kTextCenterX);
00073 
00074   fTextGroup->AddFrame(fTextMessages, new TGLayoutHints(kLHintsExpandX, 0, 0, 20, 5));
00075   
00076   fButFrame->AddFrame(fStopBut, new TGLayoutHints(kLHintsExpandX, 0, 0, 5, 20));
00077   fButFrame->AddFrame(fPauseBut, new TGLayoutHints(kLHintsExpandX, 0, 0, 5, 20));
00078   if(is_online){ // shared memories reset in online-mode only
00079     fButFrame->AddFrame(fResetGtsBut, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 5));
00080     fButFrame->AddFrame(fResetTofBut, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 5));
00081     fButFrame->AddFrame(fResetSilBut, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 5));
00082     fButFrame->AddFrame(fResetLmdBut, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 5));
00083     fButFrame->AddFrame(fResetStbBut, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 5));
00084   }
00085   // ---
00086   fButFrame->AddFrame(fTextGroup, new TGLayoutHints(kLHintsExpandX, 0, 0, 20, 5));
00087   fButFrame->Resize(fButFrame->GetDefaultSize());
00088   
00089   AddFrame(fButFrame, new TGLayoutHints(kLHintsExpandX, 0, 0, 5, 20));
00090   SetWindowName("Producer Control");
00091   
00092   DontCallClose(); 
00093   //  MoveResizeSafe(5,150,300,500,this);
00094   Resize(GetDefaultSize());
00095 
00096   //   if(is_online)  MoveResizeSafe(5,150,250,350,this);
00097   //   else           MoveResizeSafe(5,150,250,150,this);
00098   
00099 
00100   MakeConnections();
00101 
00102   Info("BuildGUI","GUI built");
00103 
00104   RemapMainWindow();
00105   is_online ? MoveResizeSafe(5,130,250,550,this) : MoveResizeSafe(5,130,250,350,this);
00106   
00107   RemapMainWindow();
00108   usleep(300000);
00109   
00110   if(is_online) WriteTextMessage("...checking socket connection...");
00111   else WriteTextMessage("...initializing producer for file...");
00112 
00113   Info("BuildGUI","GUI re-mapped");
00114 
00115   //  Connect("HandleEvent(Event_t* event)","TFndGeb2hdtGUI",this,"HandleMouseActions(Event_t*)");
00116 
00117   //   SetDragType(0);
00118   //   SetDropType(0);
00119   //   SetEditable(0);
00120   //  gClient->GetRoot()->SetEditable(kFALSE);
00121   
00122   //   fResetGtsBut->SetState(kButtonDisabled);
00123   //   fResetTofBut->SetState(kButtonDisabled);
00124   //   fResetSilBut->SetState(kButtonDisabled);
00125   //   fResetLmdBut->SetState(kButtonDisabled);
00126   //   fResetStbBut->SetState(kButtonDisabled);
00127   
00128   //   fTextMessages;
00129   //  TThread::UnLock();
00130   return;
00131 }
00132 
00133 //____________________________________
00134 // void TFndGeb2hdtGUI::HandleMouseActions(Event_t *event){
00135 
00136   
00137 //   cout << "Event " << event << endl;
00138 
00139 // }
00140 
00141 //_____________________________
00142 void TFndGeb2hdtGUI::MakeConnections(){
00143 
00144   Bool_t is_online = kFALSE;
00145 
00146   if(!fCurMan){
00147     Error("MakeConnections","If you are reading this message you just have found a BUG!");
00148     gApplication->Terminate();
00149   }
00150   is_online = fCurMan->GetOnlFlag();
00151 
00152   fCurMan->Connect("SendRealTimeInfo(Int_t)","TFndGeb2hdtGUI",this,"ReceiveRealTimeInfo(Int_t)");
00153   
00154   // --- buttons
00155   fStopBut->Connect("Clicked()", "TFndGeb2hdtMan", fCurMan, "StopProducer()");
00156   fPauseBut->Connect("Clicked()", "TFndGeb2hdtMan", fCurMan, "PauseProducer()");
00157   
00158   if(is_online){ // shared memories reset in online-mode only
00159     fResetGtsBut->Connect("Clicked()", "TFndGeb2hdtMan", fCurMan, "ResetGts()");
00160     fResetTofBut->Connect("Clicked()", "TFndGeb2hdtMan", fCurMan, "ResetTof()");
00161     fResetSilBut->Connect("Clicked()", "TFndGeb2hdtMan", fCurMan, "ResetSil()");
00162     fResetLmdBut->Connect("Clicked()", "TFndGeb2hdtMan", fCurMan, "ResetLmd()");
00163     fResetStbBut->Connect("Clicked()", "TFndGeb2hdtMan", fCurMan, "ResetStb()");
00164   }
00165 
00166 }
00167 
00168 //______________________________________________________________________________
00169 void TFndGeb2hdtGUI::RemapMainWindow(){
00170 
00171   Layout();
00172   MapSubwindows();
00173   MapWindow();
00174   //   gClient->NeedRedraw(this);
00175   //   gClient->ProcessEventsFor(this);
00176 }
00177 
00178 //______________________________________________________________________________
00179 void TFndGeb2hdtGUI::WriteTextMessage(TString msg){
00180   
00181   fTextMessages->SetText(msg);
00182   gClient->NeedRedraw(fTextMessages);
00183   gClient->ProcessEventsFor(fTextMessages);
00184 }
00185 
00186 //______________________________________________________________________________
00187 void TFndGeb2hdtGUI::FlashTextMessage(TString msg,TString next_msg,Int_t time_ms){
00188   // used to display a message for "time_ms" milliseconds
00189   // if next_msg is passed, it will be displayed after flashing "msg"
00190   // otherwise the previous message will be used
00191   
00192   TString prev_msg = fTextMessages->GetText();
00193   //   Info("FlashTextMessage","     msg: \"%s\"",msg.Data());
00194   //   Info("FlashTextMessage","prev_msg: \"%s\"",prev_msg.Data());
00195   if(next_msg.IsNull()) next_msg = prev_msg;
00196   //   Info("FlashTextMessage","next_msg: \"%s\"",next_msg.Data());
00197   
00198   WriteTextMessage(msg);
00199   gSystem->Sleep(time_ms);
00200   //   gClient->NeedRedraw(this);
00201   //   gClient->ProcessEventsFor(this);
00202   WriteTextMessage(next_msg);
00203 
00204 }
00205 
00206 //______________________________________________________________________________
00207 void TFndGeb2hdtGUI::ReceiveRealTimeInfo(Int_t Info_id){
00208   // Values of Info_id are described in GUI::EFndGeb2hdt_GuiInfo
00209   // remember to check for "TFndGeb2hdtMan::fIstop" and "TFndGeb2hdtMan::fManStop" in case of "Info_id==G2H_INFO_FINISH_RUN"
00210   //
00211   // Get the signal from TFndGeb2hdtMan::PrintInfo and check the number of events!
00212 
00213   //  TThread::Lock();
00214 
00215   if(gClient) gClient->SetEditDisabled(kTRUE);
00216   Info("ReceiveRealTimeInfo","Real-Time Information received (id: %d)",Info_id);
00217   TString info_msg;
00218 
00219   switch(Info_id){
00220   case G2H_INFO_NO_ANSWER:            // no answer from DAQ
00221     WriteTextMessage("No answer received from DAQ: retrying...");
00222     break;
00223   case G2H_INFO_SEND_REQ_TO_DAQ:      // sending a new request for events to DAQ
00224     WriteTextMessage("Sending new event request to DAQ...");
00225     break;
00226     case G2H_INFO_CONNECTING_DB:      // connecting to the required DB host
00227       //      WriteTextMessage("Connecting to database");
00228     break;
00229     case G2H_INFO_DB_CONN_CLOSED:     // connection to database completed
00230       //      WriteTextMessage("Database information stored");
00231     break;
00232   case G2H_INFO_CAN_START_CONS:       // any consumer can start
00233     WriteTextMessage("Consumers can start");
00234     break;
00235   case G2H_INFO_EV_LOOP_START:        // event-loop just started
00236     WriteTextMessage("Starting event loop...");
00237     break;
00238   case G2H_INFO_SEND_FIRST_REQ:       // sending request for the first event
00239     WriteTextMessage("Sending request for first event");
00240     break;
00241   case G2H_INFO_STARTING_MONITORS:    // starting producer monitors
00242     WriteTextMessage("Monitors (histogram filling) Started");
00243     break;
00244   case G2H_INFO_FILLING_MONITORS:     // filling producer monitors
00245     WriteTextMessage("Filling monitor histograms");
00246     break;
00247   case G2H_INFO_UPDATING_PROD_SHR:    // updating producer shared memories
00248     info_msg.Form("Run %d - ev. %d (%u ev. tot)",
00249                   fndrun->GetCurOnlineRunNmber(),
00250                   fndrun->GetEvNum_Raw(),
00251                   fCurMan->GetCurrentEvent());
00252     
00253     //     if(fCurMan->GetRate() > 0){
00254     //       info_msg.Form("Run %d - ev. %d (running at %d ev/s)",
00255     //              fndrun->GetCurOnlineRunNmber(),
00256     //              fCurMan->GetCurrentEvent(),
00257     //              fCurMan->GetRate());
00258     //     }
00259     //     else{ 
00260     //       info_msg.Form("Run %d - ev. %d",fndrun->GetCurOnlineRunNmber(),fCurMan->GetCurrentEvent());
00261     //     }
00262     
00263     FlashTextMessage("Updating producer shared memories",info_msg.Data());
00264     //WriteTextMessage(info_msg.Data());
00265     break;
00266   case G2H_INFO_PAUSED:               // producer event-loop paused
00267     WriteTextMessage("PAUSED");
00268     break;
00269   case G2H_INFO_RESTARTED:            // producer event-loop restarted
00270     WriteTextMessage("Producer restarted");
00271     break;
00272   case G2H_INFO_TIMED_OUT:            // producer process has timed-out: exiting
00273     WriteTextMessage("Current geb2hdt process has timed out");
00274     break;
00275   case G2H_INFO_FINISH_RUN:           // run completed (performing end-of-run operations)
00276     WriteTextMessage("Current run completed: exiting...");
00277     break;
00278   case G2H_INFO_STOPPING:             // stopping current producer (normally due to a button action)
00279     WriteTextMessage("Stopping producer: please wait...");
00280     break;
00281   case G2H_INFO_EXITING:              // all producer processes completed: exiting froot
00282     WriteTextMessage("Cleaning memory...please wait.");
00283     break;
00284   case G2H_INFO_PRINT:                // printing information about the running producer
00285     if(fndrun->GetEvNum_Raw() == 0) break;
00286     info_msg.Form("Run %d - ev. %d (%u ev. tot)",
00287                   fndrun->GetCurOnlineRunNmber(),
00288                   fndrun->GetEvNum_Raw(),
00289                   fCurMan->GetCurrentEvent());
00290     
00291     //     if(fCurMan->GetRate() > 0){
00292     //       info_msg.Form("Run %d - ev. %d (running at %d ev/s)",
00293     //              fndrun->GetCurOnlineRunNmber(),
00294     //              fCurMan->GetCurrentEvent(),
00295     //              fCurMan->GetRate());
00296     //     }
00297     //     else{ 
00298     //       info_msg.Form("Run %d - ev. %d",fndrun->GetCurOnlineRunNmber(),fCurMan->GetCurrentEvent());
00299     //     }
00300     
00301     FlashTextMessage("Writing info (GUI)",info_msg.Data());
00302     //WriteTextMessage(info_msg.Data());
00303     break;
00304   case G2H_INFO_RESET_GTS:            // reset GTS producer histograms
00305     FlashTextMessage("...resetting GTS histograms...");
00306     break;
00307   case G2H_INFO_RESET_TOF:            // reset TOF producer histograms
00308     FlashTextMessage("...resetting TOF histograms...");
00309     break;
00310   case G2H_INFO_RESET_SIL:            // reset SIL producer histograms
00311     FlashTextMessage("...resetting SIL histograms...");
00312     break;
00313   case G2H_INFO_RESET_LMD:            // reset LMD producer histograms
00314     FlashTextMessage("...resetting TOF histograms...");
00315     break;
00316   case G2H_INFO_RESET_STB:            // reset STB producer histograms
00317     FlashTextMessage("...resetting STB histograms...");
00318     break;
00319   default:
00320     WriteTextMessage("ERROR (maybe a bug!)");
00321     Error("ReceiveRealTimeInfo","Received information not accepted.");
00322     return;
00323   }
00324   //  gClient->ProcessEventsFor(this);
00325 
00326   //  TThread::UnLock();
00327 
00328   if(gClient) gClient->SetEditDisabled(kFALSE);
00329   return;
00330 }

Generated on Tue Oct 16 15:40:46 2007 by  doxygen 1.5.2