00001
00002
00003
00004
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00017
00018 #include <Riostream.h>
00019 #include <TDirectory.h>
00020 #include <TSystem.h>
00021 #include "TApplication.h"
00022
00023 #include "TFndRun.h"
00024 #include "TFndHStb.h"
00025 #include "TFndHdt.h"
00026 #include "TFndStbMon.h"
00027
00028 ClassImp(TFndStbMon)
00029
00030
00031 TFndStbMon::TFndStbMon(const TString &fmode,Int_t stb_tdc_bins,Double_t stb_tdc_min,Double_t stb_tdc_max):
00032 shmflg(),fout(),fstb(),
00033 fShmStbMain(),fShmStbTdc(),
00034 fMustRecoverHistos(),
00035 fSharedMemName_Main(),fSharedMemName_Tdc(),fSharedFileName_Main(),fSharedFileName_Tdc(),
00036 stbmult(),stbmaptdc(),
00037 stb_pattern(),stbtdc(),stb1d(),stb2d(),fLine()
00038 {
00039
00040 Init();
00041 OpenSharedFiles(fmode);
00042 InitHistos(stb_tdc_bins,stb_tdc_min,stb_tdc_max);
00043
00044
00045
00046
00047
00048
00049
00050
00051 }
00052
00053
00054 TFndStbMon::TFndStbMon():
00055 shmflg(),fout(),fstb(),
00056 fShmStbMain(),fShmStbTdc(),
00057 fMustRecoverHistos(),
00058 fSharedMemName_Main(),fSharedMemName_Tdc(),fSharedFileName_Main(),fSharedFileName_Tdc(),
00059 stbmult(),stbmaptdc(),
00060 stb_pattern(),stbtdc(),stb1d(),stb2d(),fLine()
00061 {
00062
00063
00064
00065 Init();
00066
00067 }
00068
00069
00070 TFndStbMon::TFndStbMon(TString *filename):
00071 shmflg(),fout(),fstb(),
00072 fShmStbMain(),fShmStbTdc(),
00073 fMustRecoverHistos(),
00074 fSharedMemName_Main(),fSharedMemName_Tdc(),fSharedFileName_Main(),fSharedFileName_Tdc(),
00075 stbmult(),stbmaptdc(),
00076 stb_pattern(),stbtdc(),stb1d(),stb2d(),fLine()
00077 {
00078
00079 Init();
00080
00081 fstb = new TFile(filename->Data());
00082 TString hname;
00083 hname = "stbmult";
00084 stbmult = (TH1F *) fstb->Get(hname);
00085 hname = "stbmaptdc";
00086 stbmaptdc = (TH2F *) fstb->Get(hname);
00087
00088 for(Int_t i=0;i<K_N_STB_CROWNS;i++) {
00089 hname = "stb_pattern_";
00090 hname+=i+1;
00091 stb_pattern[i] = (TH1F *) fstb->Get(hname);
00092 for(Int_t j=0;j<K_N_STB_TUBES;j++) {
00093 hname = "stbtdc_";
00094 hname+=i+1;
00095 hname+="_";
00096 hname+=j+1;
00097 stbtdc[i][j] = (TH1F *) fstb->Get(hname);
00098 }
00099 }
00100
00101 }
00102
00103
00104 TFndStbMon::~TFndStbMon() {
00105
00106 delete fLine;
00107 delete stb1d;
00108 delete stb2d;
00109 delete stbmult;
00110 delete stbmaptdc;
00111
00112 for(Int_t i=0;i<K_N_STB_CROWNS;i++) {
00113 for(Int_t j=0;j<K_N_STB_TUBES;j++) {
00114 delete stbtdc[i][j];
00115 }
00116 }
00117
00118 if(! shmflg){
00119 if(fstb && fstb->IsOpen()) fstb->Close();
00120 delete fstb;
00121 }
00122
00123 if(fout) fout->Close();
00124 delete fout;
00125
00126 if(fShmStbMain){ fShmStbMain->Close(); fShmStbMain = 0; }
00127 else delete fShmStbMain;
00128
00129 for(Int_t si=0;si<K_N_STB_CROWNS;si++){
00130 if(fShmStbTdc[si]){ fShmStbTdc[si]->Close(); fShmStbTdc[si] = 0; }
00131 else delete fShmStbTdc[si];
00132 }
00133
00134 }
00135
00136 void TFndStbMon::Init(){
00137
00138 fSharedMemName_Main = FROOT::ExpandPathName("$FND_SHR/stb.map");
00139 fSharedMemName_Tdc[0] = FROOT::ExpandPathName("$FND_SHR/stb_tdc_1.map");
00140 fSharedMemName_Tdc[1] = FROOT::ExpandPathName("$FND_SHR/stb_tdc_2.map");
00141 fSharedMemName_Tdc[2] = FROOT::ExpandPathName("$FND_SHR/stb_tdc_3.map");
00142 fSharedMemName_Tdc[3] = FROOT::ExpandPathName("$FND_SHR/stb_tdc_4.map");
00143 fSharedMemName_Tdc[4] = FROOT::ExpandPathName("$FND_SHR/stb_tdc_5.map");
00144 fSharedMemName_Tdc[5] = FROOT::ExpandPathName("$FND_SHR/stb_tdc_6.map");
00145
00146 fSharedFileName_Main = FROOT::ExpandPathName("stb.file.map");
00147 fSharedFileName_Tdc[0] = FROOT::ExpandPathName("stb_tdc_1.file.map");
00148 fSharedFileName_Tdc[1] = FROOT::ExpandPathName("stb_tdc_2.file.map");
00149 fSharedFileName_Tdc[2] = FROOT::ExpandPathName("stb_tdc_3.file.map");
00150 fSharedFileName_Tdc[3] = FROOT::ExpandPathName("stb_tdc_4.file.map");
00151 fSharedFileName_Tdc[4] = FROOT::ExpandPathName("stb_tdc_5.file.map");
00152 fSharedFileName_Tdc[5] = FROOT::ExpandPathName("stb_tdc_6.file.map");
00153 }
00154
00155
00156 void TFndStbMon::OpenSharedFiles(const TString &fmode){
00157
00158
00159 TString fhist = "_stb.root";
00160 shmflg = fndrun->Onlflg();
00161 cout << "Stb Shm flag is " << shmflg << endl;
00162
00163 TString stbnam_str = (fmode.IsNull())? "ONLM" : fmode;
00164 stbnam_str+=fhist;
00165
00166 fstb = new TFile(stbnam_str.Data(),"RECREATE","Stb Histogram File");
00167
00168 if(shmflg) {
00169 #if defined _FND_ONL_USE_MAP_FILES_
00170 fShmStbMain = TMapFile::Create(fSharedMemName_Main,"RECREATE",(Int_t)(1048576*FROOT::K_StbMapSize),"Stb memory mapped file with histograms");
00171 fShmStbMain->Print();
00172 #elif defined _FND_ONL_USE_SHARED_FILES_
00173 if(gSystem->AccessPathName(fSharedFileName_Main)){
00174 Printf("Shared file missing: creating it now...");
00175 fShmStbMain = new TFile(fSharedFileName_Main,"RECREATE");
00176 }
00177 else{
00178 Printf("Shared file found: histograms will be recovered...");
00179 fShmStbMain = TFile::Open(fSharedFileName_Main,"UPDATE");
00180 fMustRecoverHistos = kTRUE;
00181
00182 }
00183 #endif
00184
00185
00186 for(Int_t si=0;si<K_N_STB_CROWNS;si++){
00187 #if defined _FND_ONL_USE_MAP_FILES_
00188 fShmStbTdc[si] = TMapFile::Create(fSharedMemName_Tdc[si],"RECREATE",(Int_t)(1048576*FROOT::K_StbC1MapSize),"Stb memory mapped file with TDC histograms (Crown 1)");
00189 fShmStbTdc[si]->Print();
00190 #elif defined _FND_ONL_USE_SHARED_FILES_
00191 if( gSystem->AccessPathName(fSharedFileName_Tdc[si]) && fMustRecoverHistos == kTRUE){
00192 Printf("Shared file missing: creating it now...");
00193 fShmStbTdc[si] = new TFile(fSharedFileName_Tdc[si],"RECREATE");
00194 fMustRecoverHistos = kFALSE;
00195 }
00196 else{
00197 Printf("Shared file found: histograms will be recovered...");
00198 fShmStbTdc[si] = TFile::Open(fSharedFileName_Tdc[si],"UPDATE");
00199
00200 }
00201 #endif
00202 }
00203 }
00204
00205 }
00206
00207
00208 void TFndStbMon::InitHistos(const Int_t &stb_tdc_bins,const Double_t &stb_tdc_min,const Double_t &stb_tdc_max){
00209
00210 TString hnam = "";
00211 TString htit = "";
00212
00213 if(shmflg) fShmStbMain->cd();
00214
00215 hnam = "stbmult";
00216 htit = "Stb multiplicity";
00217 stbmult = (fMustRecoverHistos) ?
00218 ((TH1F*) (fShmStbMain->Get(hnam))) :
00219 new TH1F(hnam,htit,50,-0.5,49.5);
00220
00221 hnam = "stbmaptdc";
00222 htit = "Stb TDC pattern (Crown vs Tube)";
00223 stbmaptdc = (fMustRecoverHistos) ?
00224 ((TH2F*) (fShmStbMain->Get(hnam))) :
00225 new TH2F(hnam,htit,K_N_STB_TUBES,0.5,K_N_STB_TUBES + 0.5,K_N_STB_CROWNS,0.5,K_N_STB_CROWNS + 0.5);
00226
00227
00228
00229 for (Int_t ll=0;ll<K_N_STB_CROWNS;ll++) {
00230 hnam.Form("stb_pattern_%d",ll+1);
00231 htit.Form("Hit Pattern for Crown: %d",ll+1);
00232 stb_pattern[ll] = (fMustRecoverHistos) ?
00233 ((TH1F*) (fShmStbMain->Get(hnam))) :
00234 new TH1F(hnam,htit,K_N_STB_TUBES,0.5,0.5+K_N_STB_TUBES);
00235 stb_pattern[ll]->SetFillColor(4);
00236 }
00237
00238
00239 for(Int_t si=0;si<K_N_STB_CROWNS;si++){
00240 if(shmflg) fShmStbTdc[si]->cd();
00241
00242 for (Int_t l=0;l<K_N_STB_TUBES;l++) {
00243 hnam.Form("stbtdc_%d_%d",si+1,l+1);
00244 htit.Form("TDC for Crown: %d Tube: %d",si+1,l+1);
00245 stbtdc[si][l] = (fMustRecoverHistos) ?
00246 ((TH1F*) (fShmStbTdc[si]->Get(hnam))) :
00247 new TH1F(hnam,htit,stb_tdc_bins,stb_tdc_min,stb_tdc_max);
00248 stbtdc[si][l]->SetFillColor(6);
00249 }
00250 }
00251
00252 }
00253
00254
00255
00256 void TFndStbMon::Fill() {
00257
00258 TClonesArray *cl = fndrun->GetCurrentHdt()->GetStbHits();
00259 Fill(*cl);
00260 }
00261
00262
00263 void TFndStbMon::Fill(const TClonesArray &StbHit) {
00264
00265 Int_t nhstb = StbHit.GetEntries();
00266 stbmult->Fill((Float_t) nhstb);
00267
00268 for (Int_t j=0; j<nhstb; j++) {
00269 TFndHStb *hstb = (TFndHStb*) StbHit[j];
00270 Int_t crown = hstb->GetCrown();
00271 Int_t tube = hstb->GetTube();
00272 Float_t tdc = (Float_t) hstb->GetTdc();
00273
00274 if(tdc <0) continue;
00275
00276 stbmaptdc->Fill((Float_t ) tube,(Float_t ) crown);
00277 stbtdc[crown-1][tube-1]->Fill(tdc);
00278 stb_pattern[crown-1]->Fill((Float_t) tube);
00279
00280 }
00281 }
00282
00283
00284 void TFndStbMon::Update(Bool_t purge) {
00285
00286 if(!shmflg) return;
00287
00288 #if defined _FND_ONL_USE_MAP_FILES_
00289 Info("TFndStbMon::Update","1");
00290 if( fShmStbMain && fShmStbMain->IsWritable() ) fShmStbMain->Update();
00291
00292
00293 for(Int_t si=0;si<K_N_STB_CROWNS;si++){
00294 if( fShmStbTdc[si] && fShmStbTdc[si]->IsWritable() ) fShmStbTdc[si]->Update();
00295 }
00296 #elif defined _FND_ONL_USE_SHARED_FILES_
00297 WriteToFile(0,kTRUE);
00298
00299 fShmStbMain->cd();
00300 if(purge) fShmStbMain->Purge();
00301 fShmStbMain->Flush();
00302
00303 for(Int_t si=0;si<K_N_STB_CROWNS;si++){
00304 fShmStbTdc[si]->cd();
00305 if(purge) fShmStbTdc[si]->Purge();
00306 fShmStbTdc[si]->Flush();
00307 }
00308
00309
00310
00311 TString comm_cp = "";
00312 comm_cp.Form("cp ./stb.file.map %s",FROOT::ExpandPathName("$FND_SHR/stb.file.map").Data());
00313 gSystem->Exec(comm_cp);
00314 comm_cp.Form("cp ./stb_tdc_1.file.map %s",FROOT::ExpandPathName("$FND_SHR/stb_tdc_1.file.map").Data());
00315 gSystem->Exec(comm_cp);
00316 comm_cp.Form("cp ./stb_tdc_2.file.map %s",FROOT::ExpandPathName("$FND_SHR/stb_tdc_2.file.map").Data());
00317 gSystem->Exec(comm_cp);
00318 comm_cp.Form("cp ./stb_tdc_3.file.map %s",FROOT::ExpandPathName("$FND_SHR/stb_tdc_3.file.map").Data());
00319 gSystem->Exec(comm_cp);
00320 comm_cp.Form("cp ./stb_tdc_4.file.map %s",FROOT::ExpandPathName("$FND_SHR/stb_tdc_4.file.map").Data());
00321 gSystem->Exec(comm_cp);
00322 comm_cp.Form("cp ./stb_tdc_5.file.map %s",FROOT::ExpandPathName("$FND_SHR/stb_tdc_5.file.map").Data());
00323 gSystem->Exec(comm_cp);
00324 comm_cp.Form("cp ./stb_tdc_6.file.map %s",FROOT::ExpandPathName("$FND_SHR/stb_tdc_6.file.map").Data());
00325 gSystem->Exec(comm_cp);
00326
00327
00328 #endif
00329
00330 Info("Update","STB histograms updated (producer)");
00331
00332 }
00333
00334
00335 void TFndStbMon::ResetHistos(){
00336
00337 stbmult->Reset();
00338 stbmaptdc->Reset();
00339
00340 for(Int_t i=0; i<K_N_STB_CROWNS; i++) {
00341 stb_pattern[i]->Reset();
00342 for(Int_t j=0; j<K_N_STB_TUBES; j++) {
00343 stbtdc[i][j]->Reset();
00344 }
00345 }
00346
00347 }
00348
00349
00350 void TFndStbMon::WriteToFile(TString file,Bool_t IsShared) {
00351
00352 if(IsShared){
00353 fShmStbMain->cd();
00354 }
00355 else{
00356 if(file.IsNull())
00357 fstb->cd();
00358 else {
00359 fout = new TFile(file.Data(),"RECREATE","Lmd Histogram File");
00360 fout->cd();
00361 }
00362 }
00363
00364 stbmult->Write();
00365 stbmaptdc->Write();
00366 for(Int_t i=0; i<K_N_STB_CROWNS; i++) stb_pattern[i]->Write();
00367
00368
00369
00370 for(Int_t i=0; i<K_N_STB_CROWNS; i++) {
00371 if(IsShared){
00372 fShmStbTdc[i]->cd();
00373 }
00374 for(Int_t j=0; j<K_N_STB_TUBES; j++) {
00375 stbtdc[i][j]->Write();
00376 }
00377 }
00378 if(!file.IsNull()) fout->Close();
00379 delete fout; fout = 0;
00380 }
00381
00382
00383 void TFndStbMon::Add(TFndStbMon *stbmon) {
00384
00385 stbmult->Add((const TH1 *) stbmon->StbMult());
00386 stbmaptdc->Add((const TH2 *) stbmon->StbMapTdc());
00387 for (Int_t i=0;i<K_N_STB_CROWNS;i++) {
00388 stb_pattern[i]->Add((const TH1 *) stbmon->StbPattern(i+1));
00389 for (Int_t j=0;j<K_N_STB_TUBES;j++) {
00390 stbtdc[i][j]->Add((const TH1 *) stbmon->StbTdc(i+1,j+1));
00391 }
00392 }
00393 }
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496
00497
00498
00499
00500
00501
00502
00503
00504
00505
00506
00507
00508
00509
00510
00511
00512
00513
00514
00515
00516
00517
00518
00519
00520
00521
00522
00523
00524
00525
00526
00527
00528
00529
00530
00531
00532
00533
00534
00535
00536
00537
00538
00539
00540
00541
00542
00543
00544
00545
00546
00547