00001 #include "TRootanaDisplay.hxx"
00002 #include "TPad.h"
00003 #include "TSystem.h"
00004 #include <stdlib.h>
00005
00006 ClassImp(TRootanaDisplay)
00007
00008 TRootanaDisplay::TRootanaDisplay()
00009 {
00010 fNumberSkipEventsOnline = 1;
00011 fNumberSkipEventsOffline = 0;
00012 fNumberProcessed = 0;
00013 fCachedDataContainer = 0;
00014 SetDisplayName("Rootana Display");
00015
00016 fQuitPushed = false;
00017
00018
00019 DisableAutoMainWindow();
00020
00021
00022
00023 DisableRootOutput(true);
00024
00025 }
00026
00027 TRootanaDisplay::~TRootanaDisplay() {
00028
00029 for(unsigned int i = 0; i < fCanvasHandlers.size(); i++)
00030 delete fCanvasHandlers[i].second;
00031
00032 };
00033
00034 void TRootanaDisplay::InitializeMainWindow(){
00035
00036 fMainWindow = new TMainDisplayWindow(gClient->GetRoot(),1200,800,IsOffline());
00037
00038
00039
00040
00041
00042
00043 fMainWindow->GetResetButton()->Connect("Clicked()", "TRootanaDisplay", this, "Reset()");
00044
00045
00046 fMainWindow->GetTab()->Connect("Selected(Int_t)", "TRootanaDisplay", this, "UpdatePlotsAction()");
00047
00048
00049 fMainWindow->GetQuitButton()->Connect("Clicked()", "TRootanaDisplay", this, "QuitButtonAction()");
00050
00051
00052
00053 if(IsOffline())
00054 fMainWindow->GetNextButton()->Connect("Clicked()", "TRootanaDisplay", this, "NextButtonPushed()");
00055
00056
00057 if(IsOnline()){
00058 TGNumberEntry *skipButton = fMainWindow->GetSkipEventButton();
00059 skipButton->Connect("ValueSet(Long_t)", "TRootanaDisplay",this, "EventSkipButtonPushed()");
00060 skipButton->GetNumberEntry()->Connect("ReturnPressed()", "TRootanaDisplay", this, "EventSkipButtonPushed()");
00061 fNumberSkipEventsOnline = skipButton->GetNumberEntry()->GetIntNumber();
00062 }
00063
00064
00065 AddAllCanvases();
00066
00067
00068 GetDisplayWindow()->BuildWindow();
00069
00070
00071 }
00072
00073
00074 void TRootanaDisplay::AddSingleCanvas(TCanvasHandleBase* handleClass, std::string subtab_name){
00075
00076 std::pair<int,int> index = GetDisplayWindow()->AddCanvas(handleClass->GetTabName(),subtab_name);
00077
00078 std::pair< std::pair<int,int>, TCanvasHandleBase*> tmp(index,handleClass);
00079
00080 fCanvasHandlers.push_back(tmp);
00081
00082 TGCompositeFrame* embed = GetDisplayWindow()->GetCompositeFrame(index);
00083 handleClass->SetUpCompositeFrame(embed,this);
00084
00085
00086
00087 if(index.second == 0){
00088 TGTab* tab = GetDisplayWindow()->GetSubTab(index.first);
00089 tab->Connect("Selected(Int_t)", "TRootanaDisplay", this, "UpdatePlotsAction()");
00090 }
00091
00092
00093 }
00094
00095
00096 bool TRootanaDisplay::ProcessMidasEvent(TDataContainer& dataContainer){
00097
00098 fMainWindow->ResetSize();
00099 fNumberProcessed++;
00100
00101
00102
00103
00104 if(!IsOnline() || (IsOnline() && !fMainWindow->IsDisplayPaused())){
00105 SetCachedDataContainer(dataContainer);
00106
00107
00108 UpdateHistograms(*fCachedDataContainer);
00109 for(unsigned int i = 0; i < fCanvasHandlers.size(); i++)
00110 fCanvasHandlers[i].second->UpdateCanvasHistograms(*fCachedDataContainer);
00111 }
00112
00113
00114 if(IsOnline() && !fMainWindow->IsDisplayPaused() ){
00115
00116
00117
00118 if(fNumberSkipEventsOnline == 1 || fNumberProcessed % fNumberSkipEventsOnline == 1){
00119 UpdatePlotsAction();
00120 }
00121
00122 return true;
00123 }
00124
00125
00126 if(!IsOnline() && fNumberSkipEventsOffline >= fNumberProcessed){
00127 return true;
00128 }
00129
00130 UpdatePlotsAction();
00131
00132
00133
00134 waitingForNextButton = true;
00135 while(1){
00136
00137
00138 usleep(1000);
00139
00140
00141
00142 if(!waitingForNextButton) break;
00143
00144
00145
00146
00147 if(IsOnline() && !fMainWindow->IsDisplayPaused()) break;
00148
00149
00150 if(IsOnline() && fQuitPushed) break;
00151
00152
00153 fMainWindow->ResetSize();
00154
00155
00156 bool result = gSystem->ProcessEvents();
00157
00158 }
00159 return true;
00160
00161 }
00162
00163 void TRootanaDisplay::BeginRun(int transition,int run,int time){
00164
00165 std::cout << "Begin of run " << run << " at time " << time << std::endl;
00166 for(unsigned int i = 0; i < fCanvasHandlers.size(); i++)
00167 fCanvasHandlers[i].second->BeginRun(transition,run,time);
00168 UpdatePlotsAction();
00169 }
00170
00171 void TRootanaDisplay::EndRun(int transition,int run,int time){
00172
00173 std::cout << "End of run " << run << " at time " << time << std::endl;
00174 for(unsigned int i = 0; i < fCanvasHandlers.size(); i++)
00175 fCanvasHandlers[i].second->EndRun(transition,run,time);
00176 UpdatePlotsAction();
00177
00178 }
00179
00180
00181
00182 void TRootanaDisplay::UpdatePlotsAction(){
00183
00184 if(!fCachedDataContainer){
00185 char displayTitle[200];
00186 sprintf(displayTitle,"%s (): run %i (no events yet)",
00187 GetDisplayName().c_str(),GetCurrentRunNumber());
00188 GetDisplayWindow()->GetMain()->SetWindowName(displayTitle);
00189 return;
00190 }
00191
00192
00193 PlotCanvas(*fCachedDataContainer);
00194
00195
00196 std::pair<int,int> tabdex = GetDisplayWindow()->GetCurrentTabIndex();
00197 for(unsigned int i = 0; i < fCanvasHandlers.size(); i++){
00198 if(tabdex == fCanvasHandlers[i].first){
00199 TRootEmbeddedCanvas* embed = GetDisplayWindow()->GetCurrentEmbeddedCanvas();
00200 fCanvasHandlers[i].second->PlotCanvas(*fCachedDataContainer,embed);
00201 }
00202 }
00203
00204
00205
00206 char displayTitle[200];
00207 if(IsOnline())
00208 sprintf(displayTitle,"%s (online): run %i event %i",
00209 GetDisplayName().c_str(),GetCurrentRunNumber(),
00210 fCachedDataContainer->GetMidasData().GetSerialNumber());
00211 else
00212 sprintf(displayTitle,"%s (offline): run %i event %i",
00213 GetDisplayName().c_str(),GetCurrentRunNumber(),
00214 fCachedDataContainer->GetMidasData().GetSerialNumber());
00215
00216 GetDisplayWindow()->GetMain()->SetWindowName(displayTitle);
00217
00218
00219
00220 fMainWindow->ResetSize();
00221
00222 }
00223
00224 void TRootanaDisplay::Reset(){
00225
00226 ResetHistograms();
00227
00228 for(unsigned int i = 0; i < fCanvasHandlers.size(); i++)
00229 fCanvasHandlers[i].second->ResetCanvasHistograms();
00230 UpdatePlotsAction();
00231 }
00232
00233
00234 void TRootanaDisplay::QuitButtonAction()
00235 {
00236
00237
00238
00239
00240 if(!IsOnline()){
00241 EndRun(0,GetCurrentRunNumber(),0);
00242 CloseRootFile();
00243 }
00244
00245
00246
00247
00248
00249
00250 fQuitPushed = true;
00251 gApplication->Terminate(0);
00252 }