Main Page   Class Hierarchy   Compound List   File List   Compound Members   File Members  

EDGui.cxx

Go to the documentation of this file.
00001 
00002 #include <TSystem.h>
00003 #include <TRootEmbeddedCanvas.h>
00004 
00005 
00006 #include "bfemDisplay/EDControl.h"
00007 #include "bfemDisplay/EDGui.h"
00008 #include "bfemDisplay/Enum.h"
00009 
00010 
00011 //#define CONFIG_FILE "EDConfig"
00012 
00013 static const TString CONFIG_FILE = BFEMDISPLAYROOT + "/" + BFEMDISPLAYCONFIG + "/EDConfig";
00014 
00015 
00016 extern EDControl *m_evtCtrl; // Pointer to event control.
00017 
00018 Char_t m_threshVal[ 3 ][ 4 ][ 10 ]  // Array of thresholds for CAL, ACD and XGTs.
00019        = { { "0.1", "0.5", "2.0", "10.0" }, { "0.1", "0.5", "2.0", "10.0" }, { "0.5", "1.0", "2.0", "4.0" } };
00020 
00021 
00022 ClassImpQ(EDGui)
00023 
00024 
00025 EDGui::EDGui( const TGWindow *p, UInt_t w, UInt_t h ): TGMainFrame( p, w, h ) {
00026 
00027   m_rawFileExists = kFALSE;
00028   m_reconFileExists = kFALSE;
00029 
00030   m_inLoop = kFALSE;
00031 
00032   m_ModeIsDisplay = kTRUE;
00033 
00034   // Clear data file path names.
00035   sprintf( m_RawFilePath, "%s", "" );
00036   sprintf( m_ReconFilePath, "%s", "" );
00037 
00038   // Look for record of data directory.
00039 
00040   cout << (const char *)CONFIG_FILE << endl;
00041 
00042   ifstream configFile;
00043 
00044   if ( !gSystem->AccessPathName( (const char *)CONFIG_FILE, kFileExists ) ) {
00045 
00046     // Read data directory name if available.
00047     configFile.open( (const char *)CONFIG_FILE );
00048     configFile >> m_dataDir;
00049 
00050     if ( gSystem->AccessPathName( m_dataDir, kFileExists ) ) {
00051       // Default to working directory if previous data dir not available.
00052       sprintf( m_dataDir, gSystem->WorkingDirectory() );
00053     }
00054 
00055     // Read threshold values for CAL, ACD and XGT.
00056     for ( Int_t detTyp=0; detTyp<3; ++detTyp ) {
00057       for ( Int_t lev=0; lev<4; ++lev ) configFile >> m_threshVal[ detTyp ][ lev ];
00058     }
00059 
00060     configFile.close();
00061 
00062   }
00063 
00064   else {
00065 
00066     // Default to working directory if no record of previous data dir.
00067     // Default to hard-wired threshold values ( see top file ).
00068     sprintf( m_dataDir, gSystem->WorkingDirectory() );
00069 
00070   }
00071 
00072   // Create a menu bar at top of main window.
00073 
00074   m_MenuBarLayout = new TGLayoutHints( kLHintsTop | kLHintsLeft | kLHintsExpandX,
00075                                        1, 1, 1, 1 );
00076   m_MenuBarItemLayout = new TGLayoutHints( kLHintsTop | kLHintsLeft, 4, 0, 0, 0 );
00077 
00078   m_MenuFile = new TGPopupMenu( fClient->GetRoot() );
00079 
00080   /*  m_CascadeOpen = new TGPopupMenu( fClient->GetRoot() );
00081   m_CascadeOpen->AddEntry( "&Raw", kCascadeRaw );
00082   m_CascadeOpen->AddEntry( "R&econ", kCascadeRecon );
00083   m_MenuFile->AddPopup( "&Open", m_CascadeOpen );
00084   m_MenuFile->AddEntry( "&Save", kFileSave );*/
00085 
00086   m_MenuFile->AddEntry( "&Exit", kFileExit );
00087   m_MenuFile->Associate( this );
00088 
00089   /*  m_MenuMode = new TGPopupMenu( fClient->GetRoot() );
00090   m_MenuMode->AddEntry( "&Display", kModeDisplay );
00091   m_MenuMode->AddEntry( "&Analysis", kModeAnalysis );
00092   m_MenuMode->Associate( this );
00093   m_MenuMode->CheckEntry( kModeDisplay );  // Start in event display mode.*/
00094 
00095   m_MenuBar = new TGMenuBar( this, 1, 1 );
00096   m_MenuBar->AddPopup( "&File", m_MenuFile, m_MenuBarItemLayout );
00097   //  m_MenuBar->AddPopup( "&Mode", m_MenuMode, new TGLayoutHints( kLHintsTop | kLHintsRight, 0, 4, 0, 0 ) );
00098 
00099   AddFrame( m_MenuBar, m_MenuBarLayout );
00100 
00101   // Horizontal frame for directory navigation and file filter.
00102   m_HorizFrame1 = new TGCompositeFrame( this, 100, 100, kHorizontalFrame );
00103 
00104   // Current directory path.
00105 
00106   m_CurrentDir = new TGListBox( m_HorizFrame1, -1 );
00107   m_CurrentDir->Resize( 350, 20 );
00108   m_CurrentDir->AddEntry( m_dataDir, 1 );
00109   m_HorizFrame1->AddFrame( m_CurrentDir, new TGLayoutHints( kLHintsLeft | kLHintsTop, 2, 2, 2, 2 ) );
00110 
00111   // Button to go up one directory level.
00112 
00113   TGPicture *upDirPic = ( TGPicture* )gClient->GetPicture( "tb_uplevel.xpm" );
00114   m_UpDirButton = new TGPictureButton( m_HorizFrame1, upDirPic, kUpDir );
00115   m_UpDirButton->SetToolTipText( "Up one level" );
00116   m_UpDirButton->Associate( this );
00117   m_HorizFrame1->AddFrame( m_UpDirButton, new TGLayoutHints( kLHintsLeft | kLHintsTop, 5, 5, 5, 5 ) );
00118 
00119   // File filter combo box.
00120 
00121   m_HorizFrame1->AddFrame( new TGLabel( m_HorizFrame1, new TGHotString( "Filter:" ) ),
00122                            new TGLayoutHints( kLHintsLeft | kLHintsTop, 10, 5, 5, 5) );
00123 
00124   m_FilterBox = new TGComboBox( m_HorizFrame1, kFileFilter );
00125   m_FilterBox->Associate( this );
00126   Char_t filt[ 50 ];
00127   sprintf( filt, "%s", "Raw (*raw.root)" );
00128   m_FilterBox->AddEntry( filt, 1 );
00129   sprintf( filt, "%s", "Recon (*recon.root)" );
00130   m_FilterBox->AddEntry( filt, 2 );
00131   sprintf( filt, "%s", "G4 (*G4Sim.root)" );
00132   m_FilterBox->AddEntry( filt, 3 );
00133   m_FilterBox->Resize( 150, 20 );
00134   m_FilterBox->Select( 1 );
00135 
00136   m_HorizFrame1->AddFrame( m_FilterBox, new TGLayoutHints( kLHintsLeft | kLHintsTop, 5, 5, 5, 5 ) );
00137 
00138   AddFrame( m_HorizFrame1,  new TGLayoutHints( kLHintsExpandX, 20, 20, 20, 10  ) );
00139 
00140 
00141   // Horizontal frame for file list and display/analysis tabs.
00142   m_HorizFrame2 = new TGCompositeFrame( this, 100, 200, kHorizontalFrame );
00143 
00144 
00145   // List of files in currently selected directory.
00146 
00147   TGListView *m_FileView = new TGListView( m_HorizFrame2, 300, 200 );
00148 
00149   m_fileContainer = new TGFileContainer( m_FileView->GetViewPort(), 300, 100, kVerticalFrame, fgWhitePixel );
00150   m_fileContainer->Associate( this );
00151   m_FileView->GetViewPort()->SetBackgroundColor( fgWhitePixel );
00152   m_FileView->SetContainer( m_fileContainer );
00153   m_fileContainer->SetFilter( "*raw.root" );
00154   m_fileContainer->ChangeDirectory( m_dataDir );
00155   m_fileContainer->SetViewMode( kLVList );
00156 
00157   m_HorizFrame2->AddFrame( m_FileView, new TGLayoutHints( kLHintsLeft, 20, 20, 20, 10  ) );
00158 
00159   // Tabbed regions for display/analysis selection.
00160 
00161   m_Tab = new TGTab( m_HorizFrame2, 200, 300 );
00162   m_Tab->Associate( this );
00163 
00164   TGCompositeFrame *displayTab = m_Tab->AddTab( "Display" );
00165   TGCompositeFrame *analTab = m_Tab->AddTab( "Analysis" );
00166 
00167   // Threshold display group.
00168 
00169   m_ThreshGroup = new TGGroupFrame( displayTab, "Thresholds (MIP)", kHorizontalFrame );
00170 
00171   // Matrix of threshold values for CAL, ACD and XGTs.
00172 
00173   ULong_t green, blue, red, yellow;
00174   gClient->GetColorByName( "green", green );
00175   gClient->GetColorByName( "blue", blue );
00176   gClient->GetColorByName( "red", red );
00177   gClient->GetColorByName( "yellow", yellow );
00178 
00179   TGTextEntry *threshEntry;
00180   Char_t *detTypeTxt[ 4 ] = { "", "CAL", "ACD", "XGT" };
00181   Char_t *levTxt[ 4 ] = { "Lev1", "Lev2", "Lev3", "Lev4" };
00182 
00183   ULong_t color[ 4 ] = { green, blue, red, yellow };
00184 
00185   m_ThreshMatrix = new TGCompositeFrame( m_ThreshGroup, 200, 200 );
00186   TGMatrixLayout *threshMatrixLayout = new TGMatrixLayout( m_ThreshMatrix, 0, 4, 2 );
00187   m_ThreshMatrix->SetLayoutManager( threshMatrixLayout );
00188 
00189   m_ThreshEntryArray = new TObjArray();
00190 
00191 
00192   for ( Int_t row=0; row<5; ++row ) {
00193 
00194     for ( Int_t col=0; col<4; ++col ) {
00195 
00196       if ( row == 0 ) {
00197         TGLabel *typeLabel = new TGLabel( m_ThreshMatrix, detTypeTxt[ col ] );
00198         m_ThreshMatrix->AddFrame( typeLabel, new TGLayoutHints( kLHintsCenterX, 1, 1, 1, 1 ) );
00199         continue;
00200       }
00201 
00202       if ( col == 0 ) {
00203         TGLabel *levLabel = new TGLabel( m_ThreshMatrix, levTxt[ row - 1 ] );
00204         levLabel->SetBackgroundColor( color[ row - 1 ] );
00205         m_ThreshMatrix->AddFrame( levLabel, new TGLayoutHints( kLHintsCenterX, 1, 1, 1, 1 ) );
00206         continue;
00207       }
00208 
00209       threshEntry = new TGTextEntry( m_ThreshMatrix, m_threshVal[ col - 1 ][ row - 1 ], row*10+col );
00210       m_ThreshMatrix->AddFrame( threshEntry, new TGLayoutHints( kLHintsCenterX, 1, 1, 1, 1 ) );
00211       threshEntry->Resize( 50, 20 );
00212       m_ThreshEntryArray->Add( threshEntry );
00213 
00214     }
00215 
00216   }
00217 
00218   m_ThreshGroup->AddFrame( m_ThreshMatrix, new TGLayoutHints( kLHintsCenterX, 1, 1, 1, 1 ) );
00219 
00220   displayTab->AddFrame( m_ThreshGroup, new TGLayoutHints( kLHintsCenterX, 10, 10, 10, 10 ) );
00221 
00222 
00223   // Histogram display group.
00224 
00225   m_HistoGroup = new TGGroupFrame( analTab, "Histogram selection", kHorizontalFrame );
00226 
00227   m_HButtonTKR = new TGTextButton( m_HistoGroup, "&TKR", kHistTKR );
00228   m_HistoGroup->AddFrame( m_HButtonTKR, new TGLayoutHints( kLHintsLeft, 1, 5, 10, 1 ) );
00229   m_HButtonTKR->Associate( this );
00230   m_HButtonCAL = new TGTextButton( m_HistoGroup, "&CAL", kHistCAL );
00231   m_HistoGroup->AddFrame( m_HButtonCAL, new TGLayoutHints( kLHintsLeft, 1, 5, 10, 1 ) );
00232   m_HButtonCAL->Associate( this );
00233   m_HButtonACD = new TGTextButton( m_HistoGroup, "&ACD", kHistACD );
00234   m_HistoGroup->AddFrame( m_HButtonACD, new TGLayoutHints( kLHintsLeft, 1, 5, 10, 1 ) );
00235   m_HButtonACD->Associate( this );
00236   m_HButtonXGT = new TGTextButton( m_HistoGroup, "&XGT", kHistXGT );
00237   m_HistoGroup->AddFrame( m_HButtonXGT, new TGLayoutHints( kLHintsLeft, 1, 5, 10, 1 ) );
00238   m_HButtonXGT->Associate( this );
00239   m_HButtonTOTl = new TGTextButton( m_HistoGroup, "&TotL", kHistTOTl );
00240   m_HistoGroup->AddFrame( m_HButtonTOTl, new TGLayoutHints( kLHintsLeft, 1, 5, 10, 1 ) );
00241   m_HButtonTOTl->Associate( this );
00242   m_HButtonTOTr = new TGTextButton( m_HistoGroup, "&TotR", kHistTOTr );
00243   m_HistoGroup->AddFrame( m_HButtonTOTr, new TGLayoutHints( kLHintsLeft, 1, 5, 10, 1 ) );
00244   m_HButtonTOTr->Associate( this );
00245 
00246   analTab->AddFrame( m_HistoGroup, new TGLayoutHints( kLHintsCenterX | kLHintsCenterY, 5, 5, 5, 5 ) );
00247 
00248   m_HorizFrame2->AddFrame( m_Tab, new TGLayoutHints( kLHintsLeft, 20, 20, 20, 10  ) );
00249 
00250   AddFrame( m_HorizFrame2, new TGLayoutHints( kLHintsLeft, 0, 0, 0, 0 ) );
00251 
00252   // Add slide bar to select and indicate event number/id within the possible range.
00253 
00254   m_SliderFrame = new TGCompositeFrame( this, 600, 50, kHorizontalFrame );
00255 
00256   m_RewPic = ( TGPicture* )gClient->GetPicture( "first_t.xpm" );
00257   m_CtrlRew = new TGPictureButton( m_SliderFrame, m_RewPic, kRewind );
00258   m_SliderFrame->AddFrame( m_CtrlRew, new TGLayoutHints( kLHintsLeft, 1, 1, 1, 1 ) );
00259   m_CtrlRew->Associate( this );
00260 
00261   m_PrevPic = ( TGPicture* )gClient->GetPicture( "arrow_left.xpm" );
00262   m_CtrlPrev = new TGPictureButton( m_SliderFrame, m_PrevPic, kGoPrev );
00263   m_SliderFrame->AddFrame( m_CtrlPrev, new TGLayoutHints( kLHintsLeft, 1, 1, 1, 1 ) );
00264   m_CtrlPrev->Associate( this );
00265 
00266   m_Slider = new TGHSlider( m_SliderFrame, 500, kSlider2 | kScaleBoth, kSlider );
00267   m_Slider->SetPosition( 0 );
00268   m_Slider->Associate( this );
00269 
00270   m_SliderFrame->AddFrame( m_Slider, new TGLayoutHints( kLHintsLeft, 1, 1, 1, 1 ) );
00271 
00272   m_NextPic = ( TGPicture* )gClient->GetPicture( "arrow_right.xpm" );
00273   m_CtrlNext = new TGPictureButton( m_SliderFrame, m_NextPic, kGoNext );
00274   m_SliderFrame->AddFrame( m_CtrlNext, new TGLayoutHints( kLHintsLeft, 1, 1, 1, 1 ) );
00275   m_CtrlNext->Associate( this );
00276 
00277   m_AllPic = ( TGPicture* )gClient->GetPicture( "last_t.xpm" );
00278   m_CtrlAll = new TGPictureButton( m_SliderFrame, m_AllPic, kGoToEnd );
00279   m_SliderFrame->AddFrame( m_CtrlAll, new TGLayoutHints( kLHintsLeft, 1, 1, 1, 1 ) );
00280   m_CtrlAll->Associate( this );
00281 
00282   AddFrame( m_SliderFrame, new TGLayoutHints( kLHintsCenterX, 10, 10, 10, 10 ) );
00283 
00284 
00285   // Horizontal frame for run number and STOP button.
00286   m_HorizFrame3 = new TGCompositeFrame( this, 500, 200, kHorizontalFrame );
00287 
00288   m_EventTxtEntry = new TGTextEntry( m_HorizFrame3, "0", kEvtNumEntry );
00289   m_EventTxtEntry->Associate( this );
00290   m_EventTxtEntry->Resize( 70, 20 );
00291 
00292   m_HorizFrame3->AddFrame( m_EventTxtEntry, new TGLayoutHints( kLHintsCenterX | kLHintsCenterY, 20, 1, 1, 1 ) );
00293 
00294   m_StopPic = ( TGPicture* )gClient->GetPicture( "mb_stop_s.xpm" );
00295   m_CtrlStop = new TGPictureButton( m_HorizFrame3, m_StopPic, kStop );
00296   m_HorizFrame3->AddFrame( m_CtrlStop, new TGLayoutHints( kLHintsCenterX | kLHintsCenterY, 20, 1, 10, 1 ) );
00297   m_CtrlStop->Associate( this );
00298 
00299   AddFrame( m_HorizFrame3, new TGLayoutHints( kLHintsCenterX, 0, 0, 0, 0 ) );
00300 
00301   SetToolTips();
00302 
00303   MapSubwindows();
00304   SetWindowName( "EventControl" );
00305   Resize ( 671, 421 );
00306   MapWindow();
00307 
00308 }
00309 
00310 
00311 EDGui::~EDGui() {
00312 
00313   delete m_HButtonTKR;
00314   delete m_HButtonCAL;
00315   delete m_HButtonACD;
00316   delete m_HButtonXGT;
00317   delete m_HButtonTOTl;
00318   delete m_HButtonTOTr;
00319   delete m_HistoGroup;
00320 
00321   delete m_StopPic;
00322   delete m_CtrlStop;
00323   delete m_RewPic;
00324   delete m_CtrlRew;
00325   delete m_AllPic;
00326   delete m_CtrlAll;
00327   delete m_PrevPic;
00328   delete m_CtrlPrev;
00329   delete m_NextPic;
00330   delete m_CtrlNext;
00331 
00332   delete m_MenuFile;
00333   delete m_MenuBar;
00334 
00335 }
00336 
00337 
00338 Bool_t EDGui::ProcessMessage( Long_t msg, Long_t parm1, Long_t parm2 ) {
00339 
00340   Text_t tmp[ 200 ];
00341 
00342 
00343   if ( GET_MSG( msg ) == kC_COMMAND ) {
00344 
00345     if ( GET_SUBMSG( msg ) == kCM_MENU ) {
00346 
00347       switch( parm1 ) {
00348 
00349       case kFileExit:
00350         // Close all windows and exit.
00351         WriteConfigFile();
00352         m_evtCtrl->processCommand( kReqExit );
00353         break;
00354 
00355       default: break;
00356 
00357       }
00358 
00359     }
00360 
00361     if ( GET_SUBMSG( msg ) == kCM_TAB ) {
00362 
00363       switch( parm1 ) {
00364 
00365       case 0:  // "Display" tab.
00366 
00367         // Switch to display mode.
00368 
00369         if ( m_inLoop ) {
00370           // Don't switch tabs if looping over events.
00371           if ( !m_ModeIsDisplay ) m_Tab->SetTab( 1 ); // Switch back to analysis.
00372           break;
00373         }
00374 
00375         m_ModeIsDisplay = kTRUE;
00376         SetToolTips();
00377         m_evtCtrl->processCommand( kReqDisplay );
00378         break;
00379 
00380       case 1:  // "Analysis" tab.
00381 
00382         // Switch to analysis mode.
00383 
00384         if ( m_inLoop ) {
00385           // Don't switch tabs if looping over events.
00386           if ( m_ModeIsDisplay ) m_Tab->SetTab( 0 ); // Switch back to display.
00387           break;
00388         }
00389 
00390         m_ModeIsDisplay = kFALSE;
00391         SetToolTips();
00392         m_evtCtrl->processCommand( kReqAnalysis );
00393         break;
00394 
00395       default: break;
00396 
00397       }
00398 
00399     }
00400 
00401 
00402     if ( GET_SUBMSG( msg ) == kCM_BUTTON ) {
00403 
00404       if ( !m_rawFileExists && ( parm1 != kUpDir ) ) {
00405         new TGMsgBox( fClient->GetRoot(), this, "Error", "Please first select a raw data file.", 0, kMBOk );
00406         return( kFALSE );
00407       }
00408 
00409       switch( parm1 ) {
00410 
00411       case kGoNext:
00412         if ( m_ModeIsDisplay ) {
00413           WriteConfigFile();
00414           m_evtCtrl->processCommand( kReqDisplayNext );
00415         }
00416         // Not available for analysis mode.
00417         break;
00418 
00419       case kGoPrev:
00420         if ( m_ModeIsDisplay ) {
00421           WriteConfigFile();
00422           m_evtCtrl->processCommand( kReqPrev );
00423         }
00424         // Not available for analysis mode.
00425         break;
00426 
00427       case kGoToEnd:
00428         m_inLoop = kTRUE;
00429         if ( m_ModeIsDisplay ) {
00430           WriteConfigFile();
00431           m_evtCtrl->processCommand( kReqCue );
00432         }
00433         else  m_evtCtrl->processCommand( kReqAll );
00434         break;
00435 
00436       case kRewind:
00437         if ( m_ModeIsDisplay ) {
00438           m_inLoop = kTRUE;
00439           WriteConfigFile();
00440           m_evtCtrl->processCommand( kReqReview );
00441         }
00442         else m_evtCtrl->processCommand( kReqRewind );
00443         break;
00444 
00445       case kStop:
00446         m_inLoop = kFALSE;
00447         if ( m_ModeIsDisplay ) m_evtCtrl->processCommand( kReqDisplayStop );
00448         else  m_evtCtrl->processCommand( kReqAnalStop );
00449         break;
00450 
00451       case kUpDir:
00452 
00453         // Go up one level in directory structure.
00454 
00455         m_fileContainer->ChangeDirectory( ".." );
00456         m_fileContainer->DisplayDirectory();
00457         if ( m_FilterType == kFilterRaw || m_FilterType == kFilterG4 ) HiliteSelectedFile( m_RawFileName );
00458         else HiliteSelectedFile( m_ReconFileName );
00459 
00460         sprintf( tmp, "%s", m_fileContainer->GetDirectory() );
00461         m_CurrentDir->RemoveEntry( 1 );
00462         m_CurrentDir->AddEntry( tmp, 1 );
00463         m_CurrentDir->MapSubwindows();
00464         m_CurrentDir->Layout();
00465 
00466       break;
00467 
00468       case kHistTKR:
00469         m_evtCtrl->processCommand( kReqHistTKR );
00470         break;
00471 
00472       case kHistCAL:
00473         m_evtCtrl->processCommand( kReqHistCAL );
00474         break;
00475 
00476       case kHistACD:
00477         m_evtCtrl->processCommand( kReqHistACD );
00478         break;
00479 
00480       case kHistXGT:
00481         m_evtCtrl->processCommand( kReqHistXGT );
00482         break;
00483 
00484       case kHistTOTl:
00485         m_evtCtrl->processCommand( kReqHistTOTl );
00486         break;
00487 
00488       case kHistTOTr:
00489         m_evtCtrl->processCommand( kReqHistTOTr );
00490         break;
00491 
00492       default: break;
00493 
00494       }
00495 
00496     }
00497 
00498     if ( GET_SUBMSG( msg ) == kCM_COMBOBOX ) {
00499 
00500       switch( parm1 ) {
00501 
00502       case kFileFilter:
00503 
00504         // Set filter on the file type.
00505 
00506         if( parm2 == 1 ) {
00507           m_fileContainer->SetFilter( "*raw.root" );
00508           m_FilterType = kFilterRaw;
00509           m_fileContainer->DisplayDirectory();
00510           HiliteSelectedFile( m_RawFileName );
00511         }
00512         if( parm2 == 2 ) {
00513           m_fileContainer->SetFilter( "*recon.root" );
00514           m_FilterType = kFilterRecon;
00515           m_fileContainer->DisplayDirectory();
00516           HiliteSelectedFile( m_ReconFileName );
00517         }
00518         if( parm2 == 3 ) {
00519           m_fileContainer->SetFilter( "*G4Sim.root" );
00520           m_FilterType = kFilterG4;
00521           m_fileContainer->DisplayDirectory();
00522           HiliteSelectedFile( m_RawFileName );
00523         }
00524 
00525         break;
00526 
00527       default:
00528         break;
00529 
00530       }
00531 
00532     }
00533 
00534   }
00535 
00536   if ( GET_MSG( msg ) == kC_CONTAINER ) {
00537 
00538     void *p = NULL;
00539 
00540     TGFileItem *f = ( TGFileItem* )m_fileContainer->GetNextSelected( &p );
00541 
00542     switch( GET_SUBMSG( msg ) ) {
00543 
00544     case kCT_ITEMDBLCLICK:
00545 
00546       if ( m_inLoop ) {
00547         // Don't allow file loading during event loop - return file list to old status.
00548         if ( m_FilterType == kFilterRaw || m_FilterType == kFilterG4 ) HiliteSelectedFile( m_RawFileName );
00549         else  HiliteSelectedFile( m_ReconFileName );
00550         break;
00551       }
00552 
00553       // Process mouse double clicking in file view container.
00554 
00555       if ( m_fileContainer->NumSelected() != 1 ) break;  // Multiple selections not allowed!
00556 
00557       if ( S_ISDIR( f->GetType() ) ) {  // Case when directory is selected.
00558 
00559         // Concatenate old directory path with the requested directory.
00560         sprintf( tmp, "%s%s%s", m_fileContainer->GetDirectory(), "/", f->GetItemName()->GetString() );
00561         m_fileContainer->ChangeDirectory( tmp );
00562         if ( m_FilterType == kFilterRaw || m_FilterType == kFilterG4 ) HiliteSelectedFile( m_RawFileName );
00563         else HiliteSelectedFile( m_ReconFileName );
00564         m_CurrentDir->RemoveEntry( 1 );
00565         m_CurrentDir->AddEntry( tmp, 1 );
00566         m_CurrentDir->MapSubwindows();
00567         m_CurrentDir->Layout();
00568       }
00569 
00570       else {
00571 
00572         if ( m_FilterType == kFilterRaw || m_FilterType == kFilterG4 ) {
00573           sprintf( m_RawFileName, "%s", f->GetItemName()->GetString() );
00574           sprintf( m_RawFilePath, "%s%s%s", m_fileContainer->GetDirectory(), "/", m_RawFileName );
00575 
00576           m_rawFileExists = kTRUE;
00577 
00578           if ( m_FilterType == kFilterG4 ) m_isRealData = kFALSE;
00579           else m_isRealData = kTRUE;
00580 
00581           WriteConfigFile();
00582 
00583           if ( !m_ModeIsDisplay ) m_Tab->SetTab( 0 );  // Revert to Display mode.
00584 
00585           m_evtCtrl->processCommand( kReqRawFile );
00586         }
00587 
00588         if ( m_FilterType == kFilterRecon ) {
00589           sprintf( m_ReconFileName, "%s", f->GetItemName()->GetString() );
00590           sprintf( m_ReconFilePath, "%s%s%s", m_fileContainer->GetDirectory(), "/", m_ReconFileName );
00591 
00592           m_reconFileExists = kTRUE;
00593 
00594           WriteConfigFile();
00595 
00596           if ( !m_ModeIsDisplay ) m_Tab->SetTab( 0 );  // Revert to Display mode.
00597 
00598           m_evtCtrl->processCommand( kReqReconFile );
00599         }
00600 
00601       }
00602 
00603       break;
00604 
00605     default:
00606       break;
00607 
00608     }
00609 
00610   }
00611 
00612 
00613   if ( GET_MSG( msg ) == kC_HSLIDER ) {
00614 
00615     switch( GET_SUBMSG( msg ) ) {
00616 
00617     case kSL_RELEASE:
00618 
00619       if ( !m_rawFileExists ) {
00620         new TGMsgBox( fClient->GetRoot(), this, "Error", "Please first select a raw data file.", 0, kMBOk );
00621         m_Slider->SetPosition( 0 );
00622         return( kFALSE );
00623       }
00624 
00625       if ( m_ModeIsDisplay ) {
00626         WriteConfigFile();
00627         m_evtCtrl->processCommand( kReqDisplayGoto, m_Slider->GetPosition() );
00628       }
00629       else {
00630         m_evtCtrl->processCommand( kReqAnalGoto, m_Slider->GetPosition() );
00631       }
00632 
00633       SetEventNumber( m_Slider->GetPosition() );
00634 
00635       break;
00636 
00637     case kSL_POS:
00638 
00639       SetEventNumber( m_Slider->GetPosition() );
00640       break;
00641 
00642     default: break;
00643 
00644     }
00645 
00646   }
00647 
00648 
00649   if ( GET_MSG( msg ) == kC_TEXTENTRY ) {
00650 
00651     if ( GET_SUBMSG( msg ) == kTE_ENTER ) {
00652 
00653       if ( !m_rawFileExists ) {
00654         new TGMsgBox( fClient->GetRoot(), this, "Error", "Please first select a raw data file.", 0, kMBOk );
00655         SetEventNumber( 0 );
00656         return( kFALSE );
00657       }
00658 
00659       switch ( parm1 ) {
00660 
00661       case kEvtNumEntry:
00662 
00663         Char_t evtNo[ 20 ];
00664         sprintf( evtNo, "%s", m_EventTxtEntry->GetText() );
00665 
00666         if ( m_ModeIsDisplay ) {
00667           WriteConfigFile();
00668           m_evtCtrl->processCommand( kReqDisplayGoto, atoi( evtNo ) );
00669         }
00670         else m_evtCtrl->processCommand( kReqAnalGoto, atoi( evtNo ) );
00671         break;
00672 
00673       default: break;
00674 
00675       }
00676 
00677     }
00678 
00679   }
00680 
00681   return( kTRUE );
00682 
00683 }
00684 
00685 void EDGui::SetEventNumber( Int_t evt ) {
00686 
00687     Char_t tmp[ 10 ];
00688 
00689     sprintf( tmp, "%d", evt );
00690     m_EventTxtEntry->SetText( tmp );
00691     m_EventTxtEntry->Resize( 70, 20 );
00692 
00693 }
00694 
00695 
00696 void EDGui::WriteConfigFile() {
00697 
00698   // Write directory of last opened data file and the threshold values to the
00699   // config file.  This method is called every time a request to display a new
00700   // event is made.  The idea is that at that point the user wants to use the
00701   // thresholds currently set in the GUI.  An immediate save to disk avoids loss
00702   // of these settings in the event of a crash or program exit via the Cint session
00703   // or from the canvas window.
00704 
00705   ofstream configFile;
00706   TGTextEntry *txtEntry;
00707 
00708   sprintf( m_dataDir, m_fileContainer->GetDirectory() );
00709 
00710   configFile.open( (const char *)CONFIG_FILE, ios::out );
00711 
00712   configFile << m_dataDir;
00713   configFile << "\n";
00714 
00715   for ( Int_t detTyp=0; detTyp<3; ++detTyp ) {
00716     for ( Int_t lev=0; lev<4; ++lev ) {
00717       txtEntry = ( TGTextEntry* )m_ThreshEntryArray->At( detTyp + 3*lev );
00718       sprintf( m_threshVal[ detTyp ][ lev ], txtEntry->GetText() );
00719       configFile << m_threshVal[ detTyp ][ lev ] << " ";
00720     }
00721     configFile << "\n";
00722   }
00723 
00724   configFile.close();
00725 
00726 }
00727 
00728 
00729 void EDGui::GetThresholds( Float_t thresh[ 3 ][ 4 ] ) {
00730 
00731   for ( Int_t detTyp=0; detTyp<3; ++detTyp ) {
00732     for ( Int_t lev=0; lev<4; ++lev ) {
00733       thresh[ detTyp ][ lev ] = ( Float_t )atof( m_threshVal[ detTyp ][ lev ] );
00734     }
00735   }
00736 
00737 }
00738 
00739 
00740 void EDGui::HiliteSelectedFile( Char_t *fname ) {
00741 
00742   Char_t itemName[ 100 ];
00743   void *p=NULL;
00744   Bool_t matched = kFALSE;
00745 
00746 
00747   // By default, files displayed in the TGListView are highlighted in blue when clicked upon.  This
00748   // highlighting is lost however when different file filters are applied.  We want to keep the
00749   // highlighting in order to indicate the currently connected raw and recon files.  This method allows
00750   // us to "manually" add highlighting to a specified file with name fname.
00751 
00752   m_fileContainer->SelectAll();
00753   TGLVEntry *entry;
00754 
00755   for ( Int_t i=0; i < m_fileContainer->NumItems(); ++i ) {
00756     // Scan all files in the currently display directory.
00757 
00758     entry = ( TGLVEntry* )m_fileContainer->GetNextSelected( &p );
00759     sprintf( itemName, "%s", entry->GetItemName()->GetString() );
00760 
00761     if ( !strcmp( itemName, fname ) ) {
00762       // Look for files matching fname.
00763       m_fileContainer->InvertSelection();
00764       entry->Activate(kTRUE);  // Hilight the file name.
00765       entry->Layout();
00766       matched = kTRUE;
00767       break;
00768     }
00769 
00770   }
00771 
00772   // Un-select all if found no matching file.
00773   if ( !matched ) m_fileContainer->InvertSelection();
00774 
00775 }
00776 
00777 
00778 void EDGui::SetModeDisplay() {
00779 
00780   // Switch to display mode.
00781 
00782   m_ModeIsDisplay = kTRUE;
00783 
00784 }
00785 
00786 
00787 void EDGui::SetToolTips() {
00788 
00789   if ( m_ModeIsDisplay ) {
00790     m_CtrlRew->SetToolTipText( "Review events" );
00791     m_CtrlPrev->SetToolTipText( "Previous event" );
00792     m_CtrlNext->SetToolTipText( "Next event" );
00793     m_CtrlAll->SetToolTipText( "Cue events" );
00794     m_CtrlStop->SetToolTipText( "Stop display loop" );
00795   }
00796   else {
00797     m_CtrlRew->SetToolTipText( "Reset analysis" );
00798     m_CtrlPrev->SetToolTipText( "" );
00799     m_CtrlNext->SetToolTipText( "" );
00800     m_CtrlAll->SetToolTipText( "All events" );
00801     m_CtrlStop->SetToolTipText( "Stop analysis" );
00802   }
00803 
00804 }
00805 
00806 
00807 
00808 

Generated at Wed Nov 14 20:41:42 2001 by doxygen1.2.3 written by Dimitri van Heesch, © 1997-2000