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

EDControl.cxx

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

Generated at Mon Nov 26 18:20:06 2001 by doxygen1.2.3 written by Dimitri van Heesch, © 1997-2000