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

EDControl.cxx

Go to the documentation of this file.
00001 
00002 //_______________________________________________________________________
00003 //
00004 // EDControl class.
00005 //
00006 // Overall control class.  Connects last known data directory, starts the
00007 // GUI, opens the canvas and initialises analysis histos.  Responds to
00008 // requests made by user via the GUI.
00009 //
00010 // -------------------------------------
00011 //
00012 // Authors: N Lumb, Gloria Spandre; INFN-Pisa.
00013 //
00014 // Start date: Sept. 2001.
00015 //
00016 //-----------------------------------------------------------------------
00017 
00018 
00019 #include "TKey.h"
00020 #include "TSystem.h"
00021 #include "TArrayF.h"
00022 
00023 
00024 #include "bfemDisplay/EDControl.h"
00025 #include "bfemDisplay/Enum.h"
00026 
00027 
00028 ifstream   m_rawPathFile;      // ASCII file containing name of raw file.
00029 ifstream   m_reconPathFile;    // ASCII file containing name of recon file.
00030 ifstream   m_acdPedFile;       // ASCII file containing ACD peds.
00031 ifstream   m_xgtPedFile;       // ASCII file containing XGT peds.
00032 
00033 EDControl *m_evtCtrl;
00034 
00035 ClassImp(EDControl)
00036 
00037 EDControl::EDControl() {
00038 
00039   // This pointer to event control is global variable accessible to all classes.
00040   m_evtCtrl = this;
00041 
00042   m_rawFile = 0;
00043   m_rawTree = 0;
00044   m_event = 0;
00045 
00046   m_reconFile = 0;
00047   m_reconTree = 0;
00048   m_recon = 0;
00049 
00050   m_ped = 0;
00051   m_acdped = 0;
00052   m_xgtped = 0;
00053 
00054 
00055   m_StopDisplayLoop = kFALSE;
00056 
00057   m_numEntries = 0;
00058 
00059   // Start the graphical user interface.
00060   gui = new EDGui( gClient->GetRoot(), 650, 420 );
00061 
00062   // Get data type ( real or MC ).
00063   setRawDataType( gui->m_isRealData );
00064 
00065   // Open the drawing canvas used to display events and analysis histos.
00066   m_canvas = new TCanvas( "c1", "GLAST Event Display", 800, 840 );
00067 
00068   // Initialise the analysis histos.
00069   m_histos = new EDHistos( m_canvas );
00070   m_histos->InitHistos();
00071 
00072   // Get thresholds from GUI.
00073   gui->GetThresholds( m_threshold );
00074 
00075   // Read pedestal values.
00076   m_ped = ReadCALPed();
00077   m_acdped = ReadACDPed();
00078   //  m_xgtped = ReadXGTPed();
00079 
00080   analysis = new EDAnalysis();  // Set up the analysis.
00081 
00082   display = new DisplayCanvas();   // Set up the event drawer.
00083 
00084   display->setThresholds( m_threshold );
00085 
00086   display->Draw( m_isRealData );
00087 
00088 }
00089 
00090 
00091 EDControl::~EDControl() {
00092 
00093   if ( m_rawFile ) delete m_rawFile;
00094   if ( m_event ) delete m_event;
00095   if ( m_reconFile ) delete m_reconFile;
00096   if ( m_recon ) delete m_recon;
00097   if ( m_histos ) delete m_histos;
00098   if ( m_ped ) delete m_ped;
00099   if ( m_acdped ) delete m_acdped;
00100   if ( m_xgtped ) delete m_xgtped;
00101 
00102   delete m_canvas;
00103   delete gui;
00104 
00105 }
00106 
00107 
00108 void EDControl::ConnectNewRawFile( Char_t *fname )
00109 
00110 {
00111   // Open the specified raw data file.
00112 
00113   if ( m_event ) m_event->Clean();
00114   if ( m_rawTree ) m_rawTree = 0;
00115   if ( m_rawFile ) delete m_rawFile;
00116 
00117   cout << "\nOpening raw data file " << fname << "...\n";
00118 
00119   m_rawFile = new TFile( fname );
00120 
00121   m_rawTree = ( TTree* )gDirectory->Get( "T" );
00122   if ( !m_event ) m_event = new DigiEvent();
00123   m_rawTree->SetBranchAddress( "DigiEvent", &m_event );
00124 
00125   m_numEntries = checkNumEntries();
00126 
00127   if ( m_numEntries ) gui->setSliderRange( m_numEntries );
00128 
00129 }
00130 
00131 void EDControl::ConnectNewReconFile( Char_t *fname )
00132 
00133 {
00134   // Open the specified recon data file.
00135 
00136   if ( m_recon ) delete m_recon;
00137   if ( m_reconTree ) m_reconTree = 0;
00138   if ( m_reconFile ) delete m_reconFile;
00139 
00140   cout << "\nOpening recon data file " << fname << "...\n";
00141 
00142   m_reconFile = new TFile( fname );
00143 
00144   m_reconTree = ( TTree* )gDirectory->Get( "T" );
00145   m_recon = new Recon();
00146   m_reconTree->SetBranchAddress( "Recon", &m_recon );
00147 
00148   m_numEntries = checkNumEntries();
00149 
00150   if ( m_numEntries ) gui->setSliderRange( m_numEntries );
00151 
00152 }
00153 
00154 
00155 void EDControl::UpdateGuiEvents( Int_t evtNo )
00156 
00157 {
00158   // Update the event number indicators in the GUI display.
00159 
00160   gui->setSliderPosition( evtNo );
00161   gui->SetEventNumber( evtNo );
00162 
00163 }
00164 
00165 void EDControl::UpdateCanvas()
00166 
00167 {
00168   // Refresh the display canvas.
00169 
00170   m_canvas->Draw();
00171   m_canvas->Update();
00172 
00173 }
00174 
00175 
00176 Int_t EDControl::checkNumEntries()
00177 
00178 {
00179   // Return maximum number of events that can be processed.  Checks for unequal raw and recon file
00180   // lengths.
00181   
00182   Int_t nentries;
00183   
00184   if ( m_reconTree == 0 ) {
00185     
00186     nentries = ( Int_t )m_rawTree->GetEntries();
00187     
00188   }
00189   
00190   else if ( m_rawTree == 0 ) {
00191 
00192     nentries = ( Int_t )m_reconTree->GetEntries();
00193     
00194   }
00195   
00196   else if ( m_rawTree->GetEntries() != m_reconTree->GetEntries() ) {
00197     
00198     printf ( "Two trees have unequal event counts! %i %i taking min \n", 
00199             ( Int_t )m_rawTree->GetEntries(), ( Int_t )m_reconTree->GetEntries() );
00200     
00201     nentries = TMath::Min( ( Int_t )m_rawTree->GetEntries(), ( Int_t )m_reconTree->GetEntries() );
00202     
00203   }
00204 
00205   else {
00206     
00207     nentries = ( Int_t )m_rawTree->GetEntries();
00208     
00209   }
00210 
00211   return nentries - 1;
00212 
00213 }
00214 
00215 TObjArray* EDControl::ReadCALPed()
00216 
00217 {
00218   // Read the CAL pedestal file.
00219 
00220   Int_t j = 0;
00221 
00222   if ( gSystem->AccessPathName( CALPEDS_AUG2001, kFileExists ) ) {
00223 
00224     // Warn that CAL ped file not available.
00225 
00226     Char_t msg[ 200 ];
00227 
00228     sprintf( msg, "CAL ped file \"%s\" not found. Program will now terminate.", (const char *)CALPEDS_AUG2001 );
00229 
00230     new  TGMsgBox( gui->fClient->GetRoot(), gui, "Warning", msg, 0, kMBOk );
00231 
00232     exit( 1 );
00233 
00234   }
00235   
00236   TObjArray *ped = new TObjArray(8);
00237 
00238   ped->InheritsFrom("TVector");
00239 
00240   //TFile *pedFile = new TFile((const char *) CALPEDS_MAY2001 ); //Berrie's Peds -  May 2001
00241   TFile *pedFile = new TFile((const char *) CALPEDS_AUG2001 ); //Eric's Peds - Aug 2001
00242 
00243   TIter next(pedFile->GetListOfKeys());
00244 
00245   TKey *key;
00246 
00247   while( ( key = (TKey*)next() ) ){
00248 
00249     TVector *v = (TVector*)key->ReadObj();
00250 
00251   
00252     ped->AddAt(v,j);
00253 
00254     j++;
00255 
00256   }
00257 
00258   cout << "===> Read CAL Peds" << endl;
00259 
00260   return ped;
00261 
00262 }
00263 
00264 
00265 TObjArray* EDControl::ReadACDPed()
00266 
00267 {
00268   // Read the ACD pedestal file.
00269 
00270 
00271   if ( gSystem->AccessPathName( (const char *)ACDPEDS, kFileExists ) ) {
00272 
00273     // Warn that ACD ped file not available.
00274 
00275     Char_t msg[ 200 ];
00276 
00277     sprintf( msg, "ACD ped file \"%s\" not found. Program will now terminate.",(const char *) ACDPEDS );
00278 
00279     new  TGMsgBox( gui->fClient->GetRoot(), gui, "Warning", msg, 0, kMBOk );
00280 
00281     exit( 1 );
00282 
00283     }
00284 
00285 
00286   TObjArray *acdped = new TObjArray(2);
00287 
00288   acdped->InheritsFrom("TVector");
00289 
00290   TVector *acd_ped = new TVector(NACD);
00291 
00292   TVector *acd_id = new TVector(NACD);
00293 
00294   m_acdPedFile.open( (const char *)ACDPEDS , ios::in ); //from RootAnalysis v2r2
00295  
00296   for (Int_t j=0; j<NACD; j++) {   
00297     
00298     m_acdPedFile >> acd_id->operator()( j );
00299 
00300     m_acdPedFile >> acd_ped->operator()( j );
00301     
00302   }
00303 
00304   acdped->AddAt(acd_id,0);
00305 
00306   acdped->AddAt(acd_ped,1);
00307 
00308   cout << "===> Read ACD Peds" << endl;
00309   
00310 
00311   return(acdped) ;
00312 
00313 }
00314 
00315 
00316 TObjArray* EDControl::ReadXGTPed()
00317 
00318 {
00319   // Read the XGT pedestal file.
00320 
00321 
00322   if ( gSystem->AccessPathName( (const char *)XGTPEDS, kFileExists ) ) {
00323 
00324     // Warn that XGT ped file not available.
00325 
00326     Char_t msg[ 200 ];
00327 
00328     sprintf( msg, "XGT ped file \"%s\" not found. Program will now terminate.",(const char *) XGTPEDS );
00329 
00330     new  TGMsgBox( gui->fClient->GetRoot(), gui, "Warning", msg, 0, kMBOk );
00331 
00332     exit( 1 );
00333 
00334     }
00335 
00336   
00337   TObjArray *xgtped = new TObjArray(2);
00338 
00339   xgtped->InheritsFrom("TVector");
00340 
00341   TVector *xgt_ped = new TVector(NXGT);
00342   
00343   TVector *xgt_id = new TVector(NXGT);
00344 
00345   m_xgtPedFile.open((const char *) XGTPEDS , ios::in ); //from RootAnalysis v2r2
00346  
00347   for (Int_t j=0; j<NXGT; j++) {   
00348     
00349     m_xgtPedFile >> xgt_id->operator()( j );
00350 
00351     m_xgtPedFile >> xgt_ped->operator()( j );
00352 
00353   }
00354 
00355   xgtped->AddAt(xgt_id,0);
00356 
00357   xgtped->AddAt(xgt_ped,1);
00358 
00359   cout << "===> Read XGT Peds" << endl;
00360   
00361   return(xgtped) ;
00362 
00363 }
00364 
00365 
00366 void EDControl::processCommand( Int_t userReq, Int_t evtNo )
00367 
00368 {
00369   // Called from the GUI after a user request.  Parameter userReq specifies the
00370   // requested action.  Second parameter evtNo is the event number, required
00371   // for some requests.
00372 
00373 
00374   if ( gui->m_ModeIsDisplay ) {
00375     // Update threshold values for any action in display mode.
00376     gui->GetThresholds( m_threshold );
00377     display->setThresholds( m_threshold );
00378   }
00379 
00380   switch( userReq ) {
00381 
00382   case kReqDisplay:
00383     // Draw event display instead of analysis histos.
00384     m_canvas->Clear();
00385     // Display event incremented at every draw.  Must reset here to avoid drawing successive
00386     // events whenever switch between Display and Analysis modes.
00387     display->setCurrentEvent( display->getCurrentEvent() - 1 );
00388     UpdateGuiEvents( display->getCurrentEvent() );
00389     display->setDrawingPads();
00390     display->Draw( m_isRealData );
00391     break;
00392     
00393 
00394   case kReqAnalysis:
00395     // Switch to display of analysis histos.
00396     UpdateGuiEvents( analysis->getCurrentEvent() );
00397     m_canvas->Clear();
00398     m_histos->DrawCALHistos();
00399     break;
00400 
00401   case kReqRawFile:
00402     // Load a raw data file.
00403 
00404     setRawDataType( gui->m_isRealData );
00405 
00406     gui->SetModeDisplay();
00407     UpdateGuiEvents( 0 );
00408 
00409     ConnectNewRawFile( gui->m_RawFilePath );
00410 
00411     display->setCurrentEvent( 0 );
00412     display->setScanDirection( kForwards );
00413     display->Draw( m_isRealData );
00414 
00415     analysis->Rewind();   // Go to start of file.
00416     m_histos->HClr();     // Clear histos.
00417 
00418     break;
00419 
00420   case kReqReconFile:
00421     // Load a recon data file.
00422 
00423     gui->SetModeDisplay();
00424     UpdateGuiEvents( 0 );
00425 
00426     ConnectNewReconFile( gui->m_ReconFilePath );
00427 
00428     // Re-connect raw file.  Otherwise get recon tracks drawn without raw points for first event
00429     // ( number of tkr layers, nTKR, returned as zero - don't know why! )
00430     if ( gui->m_rawFileExists ) ConnectNewRawFile( gui->m_RawFilePath );
00431 
00432     display->setCurrentEvent( 0 );
00433     display->setScanDirection( kForwards );
00434     display->Draw( m_isRealData );
00435 
00436     analysis->Rewind();
00437 
00438     break;
00439 
00440   case kReqExit:
00441     gSystem->ExitLoop();
00442     break;
00443  
00444   case kReqDisplayNext:
00445     // Step to next event to be displayed.
00446     if ( display->getScanDirection() == kBackwards ) display->setCurrentEvent( display->getCurrentEvent() + 2 );
00447     display->setScanDirection( kForwards );
00448     if ( display->getCurrentEvent() > m_numEntries ) break;
00449     UpdateGuiEvents( display->getCurrentEvent() );
00450     display->Draw( m_isRealData );
00451     break;
00452 
00453   case kReqPrev:
00454     // Step back one event for display.
00455     if ( display->getScanDirection() == kForwards ) display->setCurrentEvent( display->getCurrentEvent() - 2 );
00456     display->setScanDirection( kBackwards );
00457     if ( display->getCurrentEvent() < 0 ) break;
00458     UpdateGuiEvents( display->getCurrentEvent() );
00459     display->Draw( m_isRealData );
00460     break;
00461 
00462   case kReqDisplayGoto:
00463     // Display specified event.
00464     display->setScanDirection( kForwards );
00465     display->Draw( evtNo, m_isRealData );
00466     UpdateGuiEvents( evtNo );
00467     break;
00468 
00469   case kReqAnalGoto:
00470     // Analyse a further specified number of events.
00471     if ( evtNo <= analysis->getCurrentEvent() || evtNo >= m_numEntries ) {
00472       UpdateGuiEvents( analysis->getCurrentEvent() );
00473       break;
00474     }
00475     analysis->Go( evtNo - analysis->getCurrentEvent() );
00476     break;
00477 
00478   case kReqCue:
00479     // Step through events and display them until told to stop.
00480     if ( display->getScanDirection() == kBackwards ) display->setCurrentEvent( display->getCurrentEvent() + 2 );
00481     display->setScanDirection( kForwards );
00482 
00483     while ( !m_StopDisplayLoop ) {
00484       if ( display->getCurrentEvent() > m_numEntries ) {
00485         gui->setInLoop( kFALSE );
00486         break;
00487       }
00488       UpdateGuiEvents( display->getCurrentEvent() );
00489       display->Draw( m_isRealData );
00490       gSystem->ProcessEvents();
00491     }
00492 
00493     m_StopDisplayLoop = kFALSE;
00494 
00495     break;
00496 
00497   case kReqAll:
00498     // Analyse all events ( user can stop at any intermediate point ).
00499     analysis->Go();
00500     break;
00501 
00502   case kReqReview:
00503     // Step backwards through events and display until told to stop.
00504     if ( display->getScanDirection() == kForwards ) display->setCurrentEvent( display->getCurrentEvent() - 2 );
00505     display->setScanDirection( kBackwards );
00506 
00507     while ( !m_StopDisplayLoop ) {
00508       if ( display->getCurrentEvent() < 0 ) {
00509         gui->setInLoop( kFALSE );
00510         break;
00511       }
00512       UpdateGuiEvents( display->getCurrentEvent() );
00513       display->Draw( m_isRealData );
00514       gSystem->ProcessEvents();
00515     }
00516 
00517     m_StopDisplayLoop = kFALSE;
00518 
00519     break;
00520 
00521   case kReqRewind:
00522     // Go back to start of file for analysis.
00523     analysis->Rewind();
00524     UpdateGuiEvents( 0 );
00525     m_histos->HClr();
00526     cout << "\nRewind... done.\n";
00527     break;
00528 
00529   case kReqDisplayStop:
00530     m_StopDisplayLoop = kTRUE;
00531     break;
00532 
00533   case kReqAnalStop:
00534     analysis->m_Stop = kTRUE;
00535     break;
00536 
00537   case kReqHistTKR:
00538     // Display tracker analysis histos.
00539     m_histos->DrawTKRHistos();
00540     break;
00541 
00542   case kReqHistTOTl:
00543     // Display tracker TOT left histos.
00544     m_histos->DrawTKRtotLHistos();
00545     break;
00546 
00547   case kReqHistTOTr:
00548     // Display tracker TOT right histos.
00549     m_histos->DrawTKRtotRHistos();
00550     break;
00551 
00552   case kReqHistCAL:
00553     // Display CAL analysis histos.
00554     m_histos->DrawCALHistos();
00555     break;
00556 
00557   case kReqHistACD:
00558     // Display ACD analysis histos.
00559     m_histos->DrawACDHistos();
00560     break;
00561 
00562   case kReqHistXGT:
00563     // Display XGT analysis histos.
00564     m_histos->DrawXGTHistos();
00565     break;
00566 
00567   default: break;
00568 
00569   }
00570 
00571 }
00572 
00573 

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