00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
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;
00029 ifstream m_reconPathFile;
00030 ifstream m_acdPedFile;
00031 ifstream m_xgtPedFile;
00032
00033 EDControl *m_evtCtrl;
00034
00035 ClassImp(EDControl)
00036
00037 EDControl::EDControl() {
00038
00039
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
00060 gui = new EDGui( gClient->GetRoot(), 650, 420 );
00061
00062
00063 setRawDataType( gui->m_isRealData );
00064
00065
00066 m_canvas = new TCanvas( "c1", "GLAST Event Display", 800, 840 );
00067
00068
00069 m_histos = new EDHistos( m_canvas );
00070 m_histos->InitHistos();
00071
00072
00073 gui->GetThresholds( m_threshold );
00074
00075
00076 m_ped = ReadCALPed();
00077 m_acdped = ReadACDPed();
00078
00079
00080 analysis = new EDAnalysis();
00081
00082 display = new DisplayCanvas();
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
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
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
00159
00160 gui->setSliderPosition( evtNo );
00161 gui->SetEventNumber( evtNo );
00162
00163 }
00164
00165 void EDControl::UpdateCanvas()
00166
00167 {
00168
00169
00170 m_canvas->Draw();
00171 m_canvas->Update();
00172
00173 }
00174
00175
00176 Int_t EDControl::checkNumEntries()
00177
00178 {
00179
00180
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
00219
00220 Int_t j = 0;
00221
00222 if ( gSystem->AccessPathName( CALPEDS_AUG2001, kFileExists ) ) {
00223
00224
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
00241 TFile *pedFile = new TFile((const char *) CALPEDS_AUG2001 );
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
00269
00270
00271 if ( gSystem->AccessPathName( (const char *)ACDPEDS, kFileExists ) ) {
00272
00273
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 );
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
00320
00321
00322 if ( gSystem->AccessPathName( (const char *)XGTPEDS, kFileExists ) ) {
00323
00324
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 );
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
00370
00371
00372
00373
00374 if ( gui->m_ModeIsDisplay ) {
00375
00376 gui->GetThresholds( m_threshold );
00377 display->setThresholds( m_threshold );
00378 }
00379
00380 switch( userReq ) {
00381
00382 case kReqDisplay:
00383
00384 m_canvas->Clear();
00385
00386
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
00396 UpdateGuiEvents( analysis->getCurrentEvent() );
00397 m_canvas->Clear();
00398 m_histos->DrawCALHistos();
00399 break;
00400
00401 case kReqRawFile:
00402
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();
00416 m_histos->HClr();
00417
00418 break;
00419
00420 case kReqReconFile:
00421
00422
00423 gui->SetModeDisplay();
00424 UpdateGuiEvents( 0 );
00425
00426 ConnectNewReconFile( gui->m_ReconFilePath );
00427
00428
00429
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
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
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
00464 display->setScanDirection( kForwards );
00465 display->Draw( evtNo, m_isRealData );
00466 UpdateGuiEvents( evtNo );
00467 break;
00468
00469 case kReqAnalGoto:
00470
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
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
00499 analysis->Go();
00500 break;
00501
00502 case kReqReview:
00503
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
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
00539 m_histos->DrawTKRHistos();
00540 break;
00541
00542 case kReqHistTOTl:
00543
00544 m_histos->DrawTKRtotLHistos();
00545 break;
00546
00547 case kReqHistTOTr:
00548
00549 m_histos->DrawTKRtotRHistos();
00550 break;
00551
00552 case kReqHistCAL:
00553
00554 m_histos->DrawCALHistos();
00555 break;
00556
00557 case kReqHistACD:
00558
00559 m_histos->DrawACDHistos();
00560 break;
00561
00562 case kReqHistXGT:
00563
00564 m_histos->DrawXGTHistos();
00565 break;
00566
00567 default: break;
00568
00569 }
00570
00571 }
00572
00573