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
00039 gui = new EDGui( gClient->GetRoot(), 600, 420, this );
00040
00041
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
00048 m_canvas = new TCanvas( "c1", "GLAST Event Display", 800, 840 );
00049
00050
00051 m_histos = new EDHistos( m_canvas );
00052 m_histos->InitHistos();
00053
00054 m_ped = ReadCALPed();
00055 m_acdped = ReadACDPed();
00056
00057
00058 analysis = new EDAnalysis( this );
00059
00060 display = new DisplayCanvas( this );
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
00122
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
00162
00163 Int_t j = 0;
00164
00165 if ( gSystem->AccessPathName( CALPEDS_AUG2001, kFileExists ) ) {
00166
00167
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
00184 TFile *pedFile = new TFile( CALPEDS_AUG2001 );
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
00213
00214 if ( gSystem->AccessPathName( ACDPEDS, kFileExists ) ) {
00215
00216
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 );
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
00264
00265 if ( gSystem->AccessPathName( XGTPEDS, kFileExists ) ) {
00266
00267
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 );
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
00316 m_canvas->Clear();
00317 display->setDrawingPads();
00318 display->Draw( m_isRealData );
00319 break;
00320
00321
00322 case kReqAnalysis:
00323
00324 m_canvas->Clear();
00325 break;
00326
00327 case kReqRawFile:
00328
00329
00330 setRawDataType( gui->m_isRealData );
00331
00332 gui->SetModeDisplay();
00333
00334 ConnectNewRawFile( gui->m_RawFilePath );
00335
00336
00337
00338
00339
00340
00341
00342 display->setCurrentEvent( 0 );
00343 display->setScanDirection( kForwards );
00344 display->Draw( m_isRealData );
00345
00346 analysis->Rewind();
00347 m_histos->HClr();
00348
00349 break;
00350
00351 case kReqReconFile:
00352
00353
00354 gui->SetModeDisplay();
00355
00356 ConnectNewReconFile( gui->m_ReconFilePath );
00357
00358
00359
00360 if ( gui->m_rawFileExists ) ConnectNewRawFile( gui->m_RawFilePath );
00361
00362
00363
00364
00365
00366
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
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
00389 analysis->Go( 1 );
00390 break;
00391
00392 case kReqPrev:
00393
00394 if ( display->getScanDirection() == kForwards ) display->setCurrentEvent( display->getCurrentEvent() - 2 );
00395 display->setScanDirection( kBackwards );
00396
00397 display->Draw( m_isRealData );
00398 break;
00399
00400 case kReqDisplayGoto:
00401
00402 display->setScanDirection( kForwards );
00403 display->Draw( evtNo, m_isRealData );
00404 break;
00405
00406 case kReqAnalGoto:
00407
00408 analysis->Go( evtNo );
00409 break;
00410
00411 case kReqCue:
00412
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
00428 analysis->Go();
00429 break;
00430
00431 case kReqReview:
00432
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
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
00463 m_histos->DrawTKRHistos();
00464 break;
00465
00466 case kReqHistTOTl:
00467
00468 m_histos->DrawTKRtotLHistos();
00469 break;
00470
00471 case kReqHistTOTr:
00472
00473 m_histos->DrawTKRtotRHistos();
00474 break;
00475
00476 case kReqHistCAL:
00477
00478 m_histos->DrawCALHistos();
00479 break;
00480
00481 case kReqHistACD:
00482
00483 m_histos->DrawACDHistos();
00484 break;
00485
00486 case kReqHistXGT:
00487
00488 m_histos->DrawXGTHistos();
00489 break;
00490
00491 default: break;
00492
00493 }
00494
00495 }
00496
00497