00001
00002
00003
00004
00005
00006
00007
00008
00010
00011 #include <fstream>
00012 #include <iostream>
00013 #include <sstream>
00014
00015
00016 #include "TFile.h"
00017 #include "TROOT.h"
00018 #include "TStyle.h"
00019 #include "TSystem.h"
00020 #include "TTree.h"
00021
00022
00023 #include "JobControl/JobCModuleRegistry.h"
00024 #include "MessageService/MsgService.h"
00025 #include "MinosObjectMap/MomNavigator.h"
00026 #include "Plex/PlexSEIdAltL.h"
00027 #include "Plex/PlexHandle.h"
00028 #include "RawData/RawRecord.h"
00029 #include "RawData/RawHeader.h"
00030 #include "RawData/RawDaqSnarlHeader.h"
00031 #include "DatabaseInterface/DbiResultPtr.h"
00032 #include "DatabaseUpdater/DbuSubRunSummary.h"
00033
00034 #include "RawData/RawDigitDataBlock.h"
00035 #include "RawData/RawDigit.h"
00036
00037 #include "RawData/RawTpSinglesSummaryBlock.h"
00038 #include "RawData/RawCrateMonitorBlock.h"
00039 #include "RawData/RawLiTpmtDigitsBlock.h"
00040
00041 #include "RawData/RawLIAdcSummaryBlock.h"
00042 #include "RawData/RawLIAdcSummary.h"
00043 #include "RawData/RawLITimingSummaryBlock.h"
00044 #include "RawData/RawLITimingSummary.h"
00045
00046
00047 #include "RateSummary.h"
00048 #include "RSM.h"
00049 #include "UtilRSM.h"
00050 #include "TPSinglesEvent.h"
00051 #include "DaqSnarlEvent.h"
00052 #include "CrateMonitorEvent.h"
00053
00054 ClassImp(RateSummary)
00055
00056 CVSID("$Id: RateSummary.cxx,v 1.18 2005/03/05 20:41:01 bspeak Exp $");
00057 JOBMODULE(RateSummary, "RateSummary", "Build RateTree.root file");
00058
00059 RateSummary::RateSummary() :
00060 fFile(0), fTPtree(0), fDStree(0), fCMtree(0) {
00061 RSMSyn << "RateSummary::RateSummary" << endl;
00062 gROOT->SetBatch(kTRUE);
00063 fRun = 0;
00064 fSubRun = 0;
00065 }
00066
00067 RateSummary::~RateSummary() {
00068 RSMSyn << "RateSummary::~RateSummary" << endl;
00069 if(fFile) delete fFile;
00070 }
00071
00072 JobCResult RateSummary::Ana(const MomNavigator *mom) {
00073 RSMVer << "RateSummary::Ana" << endl;
00074
00075 JobCResult result(JobCResult::kPassed);
00076
00077 Bool_t HasDaqMonitor = false;
00078 Bool_t HasDaqSnarl = false;
00079 Bool_t HasLightInjection = false;
00080
00081 RawLITimingSummary *rlits = 0;
00082
00083 Int_t Plane, ShieldSection, SuperModule;
00084 Int_t Crate, Vmm, Varc, Vadc, Vachip;
00085 const char* rcInStr = 0;
00086
00087 for (int i=0;i<2;i++) {
00088 for(int j=0;j<SMPLANES;j++) fSMPlaneHits[i][j] = 0;
00089 for(int j=0;j<SHPLANES;j++) fSHPlaneHits[i][j] = 0;
00090 }
00091 fDSevt->Clear(); fDSevt->Reset();
00092 fTPevt->Clear(); fTPevt->Reset();
00093 fCMevt->Clear(); fCMevt->Reset();
00094
00095 TIter momitr = const_cast<MomNavigator*>(mom)->FragmentIter();
00096 TObject* momobj = 0;
00097 while ((momobj=momitr())) {
00098 RawRecord* rawrec = 0;
00099 if ((rawrec=dynamic_cast<RawRecord*>(momobj))) {
00100 const RawDaqHeader* dhdr =
00101 dynamic_cast<const RawDaqHeader*>(rawrec->GetRawHeader());
00102
00103 VldContext vldc = dhdr->GetVldContext();
00104 if (fRun!=dhdr->GetRun() || fSubRun!=dhdr->GetSubRun()) {
00105 RSMDeb << "Run change: " <<
00106 fRun << "-" << fSubRun << " -> " <<
00107 dhdr->GetRun() << "-" << dhdr->GetSubRun() << endl;
00108 CloseFile();
00109 fYear = vldc.GetTimeStamp().GetDate()/10000;
00110 fMonth = vldc.GetTimeStamp().GetDate()/100 - 100*fYear;
00111 fRun = dhdr->GetRun();
00112 fSubRun = dhdr->GetSubRun();
00113 DbiResultPtr<DbuSubRunSummary> dbptr(vldc);
00114 for (unsigned int i=0;i<dbptr.GetNumRows();i++) {
00115 const DbuSubRunSummary* dbsrs = dbptr.GetRow(i);
00116 Int_t tRun = dbsrs->fRun;
00117 Int_t tSubRun = dbsrs->fSubRun;
00118 if (tRun != fRun || tSubRun!=fSubRun) {
00119 RSMWar << "Not using DbuSubRunSummary for this VldContext"
00120 << vldc << ", displaced Run from the DaqHeader"
00121 << tRun << "-" << tSubRun << " != "
00122 << fRun << "-" << fSubRun << endl;
00123 continue;
00124 }
00125 Int_t tYear = dbsrs->fEndTime.GetDate()/10000;
00126 Int_t tMonth = dbsrs->fEndTime.GetDate()/100 - 100*tYear;
00127 if (tYear != fYear || tMonth!=fMonth) {
00128 RSMInf << "Using Year-Mo " << tYear << "-" << tMonth
00129 << " Instead of " << fYear << "-" << fMonth
00130 << " as dictated by Dbu" << endl;
00131
00132 fYear = tYear;
00133 fMonth = tMonth;
00134 }
00135 }
00136
00137 OpenFile();
00138 }
00139 PlexHandle ph(vldc);
00140
00141
00142 if(!rawrec->GetTempTags().Get("stream",rcInStr)) continue;
00143
00144
00145 if (!strcmp("DaqSnarl",rcInStr)) {
00146 HasDaqSnarl=true;
00147
00148
00149
00150
00151
00152
00153
00154 }
00155
00156
00157 if (!strcmp("DaqMonitor",rcInStr)) {
00158 HasDaqMonitor=true;
00159
00160
00161 }
00162
00163
00164 if (!strcmp("LightInjection",rcInStr)) {
00165 HasLightInjection=true;
00166 }
00167
00168 TIter rawitr = rawrec->GetRawBlockIter(); rawitr.Reset();
00169 TObject *rawobj = 0;
00170 while ((rawobj=rawitr())) {
00171 RawDigitDataBlock* dblock = 0;
00172 if ((dblock=dynamic_cast<RawDigitDataBlock*>(rawobj))) {
00173 const RawSnarlHeaderBlock* hdrblk =
00174 dynamic_cast<const RawSnarlHeaderBlock*>
00175 (rawrec->FindRawBlock("RawSnarlHeaderBlock"));
00176 VldTimeStamp trigger_time = hdrblk->GetTriggerTime();
00177
00178 fDSevt->Time = vldc.GetTimeStamp().GetSec();
00179
00180 fDSevt->RunNum = fRun;
00181 fDSevt->SubRunNum = fSubRun;
00182
00183 TIter digitr = dblock->GetDatumIter();
00184 TObject *digobj = 0;
00185 while ((digobj=digitr())) {
00186 RawDigit *digit=dynamic_cast<RawDigit*>(digobj);
00187 if(!digit) continue;
00188 RawChannelId rawid = digit->GetChannel();
00189 Crate = rawid.GetCrate();
00190 SuperModule = (Crate*2)/NCRATE;
00191 Varc = rawid.GetVarcId();
00192 Vmm = rawid.GetVmm();
00193 Vadc = rawid.GetVaAdcSel();
00194 Vachip = rawid.GetVaChip();
00195
00196 VldTimeStamp vt_T0 = digit->GetCrateT0();
00197 vt_T0.Add(VldTimeStamp(0,(Int_t)(1.5625*digit->GetTDC())));
00198
00199
00200
00201 DSChipEvent* chip =
00202 fDSevt->ChipGen(Crate,Varc,Vmm,Vadc,Vachip);
00203 chip->ADC += digit->GetADC();
00204 fDSevt->CrateADC[Crate] += digit->GetADC();
00205 Int_t MF = 4*(int)(rawid.GetCrate()/8);
00206 MF += 1 + 2*(rawid.GetCrate()%2);
00207 MF += rawid.GetVaAdcSel();
00208 fDSevt->MFADC[MF-1] += digit->GetADC();
00209 fDSevt->TotalADC += digit->GetADC();
00210 if(vt_T0<trigger_time) fDSevt->PreTrigADC+=digit->GetADC();
00211 else fDSevt->PostTrigADC += digit->GetADC();
00212
00213 PlexSEIdAltL seidl = ph.GetSEIdAltL(rawid);
00214 if (ph.GetReadoutType(rawid)==ReadoutType::kScintStrip &&
00215 seidl.IsValid()) {
00216 seidl.SetFirst();
00217
00218 if (seidl.IsVetoShield()) {
00219 chip->IsShield=true;
00220 int view_index = (Int_t)seidl.GetEnd() - 1;
00221 if (view_index<0 || view_index>1) {
00222 RSMWar
00223 << "Bad View Index " << view_index << endl;
00224 continue;
00225 }
00226 while (seidl.IsValid()) {
00227 Plane = seidl.GetCurrentItem().GetSEId().GetPlane();
00228 Plane = Plane - SHOFFSET;
00229 ShieldSection = (Plane*4)/SHPLANES;
00230 if(Plane>=0 && Plane<SHPLANES)
00231 fSHPlaneHits[view_index][Plane]++;
00232 else
00233 RSMWar
00234 << "Bad Plane in SH " << Plane << endl;
00235 seidl.Next();
00236 }
00237 }
00238 else {
00239
00240 Int_t view_index = (Int_t)seidl.GetEnd() - 1;
00241 if (view_index<0 || view_index>1) {
00242 RSMWar
00243 << "Bad View Index " << view_index << endl;
00244 continue;
00245 }
00246 while (seidl.IsValid()) {
00247 Plane = seidl.GetCurrentItem().GetSEId().GetPlane();
00248 if (Plane>=0 && Plane<SMPLANES)
00249 fSMPlaneHits[view_index][Plane]++;
00250 else
00251 RSMWar
00252 << "Bad Plane in SM " << Plane << endl;
00253 seidl.Next();
00254 }
00255 }
00256 }
00257 }
00258 }
00259
00260 RawTpSinglesSummaryBlock* rtpssb = 0;
00261 if ((rtpssb=dynamic_cast<RawTpSinglesSummaryBlock*>(rawobj))) {
00262 fTPevt->RunNum = fRun;
00263 fTPevt->SubRunNum = fSubRun;
00264 fTPevt->Time = vldc.GetTimeStamp().GetSec();
00265
00266 for(int i=0;i<NCRATE;i++)
00267 fTPevt->CrateRate[i] = rtpssb->GetHitsPerSecByCrate(i);
00268
00269 const map<RawChannelId,UInt_t> RateMap = rtpssb->GetRates();
00270 map<RawChannelId,UInt_t>::const_iterator ritr;
00271
00272 for (ritr=RateMap.begin();ritr!=RateMap.end();ritr++) {
00273 RawChannelId rawid = ritr->first;
00274 rawid.SetVaChannel(5);
00275 Int_t MF = 4*(int)(rawid.GetCrate()/8);
00276 MF += 1 + 2*(rawid.GetCrate()%2);
00277 MF += rawid.GetVaAdcSel();
00278 fTPevt->MFRate[MF-1] += ritr->second;
00279
00280 if(ritr->second==0) continue;
00281
00282 TPChipEvent* chip = fTPevt->ChipGen(rawid.GetCrate(),
00283 rawid.GetVarcId(),
00284 rawid.GetVmm(),
00285 rawid.GetVaAdcSel(),
00286 rawid.GetVaChip());
00287 chip->Rate = ritr->second;
00288
00289 PlexSEIdAltL pseidatl = ph.GetSEIdAltL(rawid);
00290 if (pseidatl.IsVetoShield()) {
00291 chip->IsShield = true;
00292 }
00293 }
00294 }
00295
00296 RawCrateMonitorBlock* rcmb = 0;
00297 if ((rcmb=dynamic_cast<RawCrateMonitorBlock*>(rawobj))) {
00298 fCMevt->RunNum = fRun;
00299 fCMevt->SubRunNum = fSubRun;
00300 fCMevt->Time = vldc.GetTimeStamp().GetSec();
00301
00302 int ThisCrate = rcmb->GetCrate();
00303
00304 fCMevt->ROPTempCPU[ThisCrate] = rcmb->GetRopTempCpuC();
00305 fCMevt->ROPTempMem[ThisCrate] = rcmb->GetRopTempMemC();
00306 fCMevt->ROPTempPmc[ThisCrate] = rcmb->GetRopTempPmcC();
00307
00308 int nummon=rcmb->GetNumVfbMonitors();
00309 for (int i=0;i<nummon;i++) {
00310 const RawCrateMonitorBlock::RawVfbMonitor& vfbmon =
00311 rcmb->GetVfbMonitor(i);
00312 CMChipEvent* chip = fCMevt->ChipGen(ThisCrate,
00313 vfbmon.varcId,
00314 vfbmon.vfbId >> 1,
00315 vfbmon.vfbId & 1,
00316 0);
00317 chip->Temp = vfbmon.vfbTempC;
00318 chip->ASDSupplyV = vfbmon.asdSupplyV;
00319 chip->PosRailV = vfbmon.positiveVaRailV;
00320 chip->NegRail0V = vfbmon.negativeVaRail0V;
00321 chip->NegRail1V = vfbmon.negativeVaRail1V;
00322 chip->NegRail2V = vfbmon.negativeVaRail2V;
00323 }
00324 }
00325
00326 RawLiTpmtDigitsBlock* rlitdb = 0;
00327 if ((rlitdb=dynamic_cast<RawLiTpmtDigitsBlock*>(rawobj))) {
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346 }
00347
00348 RawLIAdcSummaryBlock *rliasb = 0;
00349 if ((rliasb = dynamic_cast<RawLIAdcSummaryBlock*>(rawobj))) {
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368 }
00369
00370 RawLITimingSummaryBlock *rlitsb = 0;
00371 if ((rlitsb = dynamic_cast<RawLITimingSummaryBlock*>(rawobj))) {
00372
00373
00374 TIter lititr = rlitsb->GetDatumIter();
00375 TObject *litobj = 0;
00376 while((litobj=lititr()))
00377 if( (rlits=dynamic_cast<RawLITimingSummary*>(litobj))) {
00378 const RawChannelId rawid = rlits->GetChannel();
00379 fTPevt->CratePulsed[rawid.GetCrate()] = true;
00380 TPChipEvent* chip = fTPevt->ChipGen(rawid.GetCrate(),
00381 rawid.GetVarcId(),
00382 rawid.GetVmm(),
00383 rawid.GetVaAdcSel(),
00384 rawid.GetVaChip());
00385 chip->IsPulsed = true;
00386 }
00387 }
00388 }
00389
00390 if(fDSevt->IsFilled()) {
00391 fDSevt->SMPlanesHit[0] = 0;
00392 fDSevt->SMPlanesHit[1] = 0;
00393 fDSevt->SMHitBlock = 0;
00394
00395 Int_t PlanesHit = 0;
00396 for (int i=0;i<SMPLANES;i++) {
00397 if (fSMPlaneHits[0][i]>0 && fSMPlaneHits[1][i]>0) {
00398 PlanesHit++;
00399 if(i<SM1PLANES) fDSevt->SMPlanesHit[0]++;
00400 else fDSevt->SMPlanesHit[1]++;
00401 }
00402 else {
00403 if(PlanesHit>fDSevt->SMHitBlock) {
00404 fDSevt->SMHitBlock = PlanesHit;
00405 }
00406 PlanesHit = 0;
00407 }
00408 }
00409
00410
00411
00412
00413
00414
00415
00416
00417 }
00418 }
00419 }
00420 if(fDSevt->IsFilled() && HasDaqSnarl) {
00421 fDSevt->CheckChips();
00422 fDStree->Fill();
00423 }
00424 if(fTPevt->IsFilled() && HasDaqMonitor) {
00425 fTPevt->CheckChips();
00426 fTPtree->Fill();
00427 }
00428 if(fCMevt->IsFilled() && HasDaqMonitor) {
00429 fCMevt->CheckChips();
00430 fCMtree->Fill();
00431 }
00432 return result;
00433 }
00434
00435 void RateSummary::BeginJob() {
00436 RSMSyn << "RateSummary::BeginJob" << endl;
00437
00438 fRun = 0;
00439 fSubRun = 0;
00440
00441 fTPevt = new TPSinglesEvent();
00442 fDSevt = new DaqSnarlEvent();
00443 fCMevt = new CrateMonitorEvent();
00444
00445 for (int i=0;i<5;i++) {
00446 fSMPlaneHits[i] = new Int_t[SMPLANES];
00447 fSHPlaneHits[i] = new Int_t[SHPLANES];
00448 }
00449
00450 RSMDeb << "Finished RateSummary::BeginJob" << endl;
00451 }
00452
00453 void RateSummary::EndJob() {
00454 RSMSyn << "RateSummary::EndJob" << endl;
00455
00456 CloseFile();
00457 }
00458
00459 void RateSummary::OpenFile() {
00460 RSMSyn << "RateSummary::OpenFile" << endl;
00461
00462 char date_dir[10];
00463 char RateFileName[28];
00464
00465 sprintf(RateFileName,fRateFileName.c_str(),fRun,fSubRun);
00466
00467 string rdir = fRateFileDir + "/";
00468 if (fMonthlyDir) {
00469 sprintf(date_dir,"%4d_%02d",fYear,fMonth);
00470 rdir += date_dir; rdir += "/";
00471 }
00472 if(!UtilRSM::CheckDir(rdir.c_str())) exit(0);
00473
00474 string full_file = rdir+RateFileName;
00475
00476 RSMInf << "Writing to " << full_file << endl;
00477
00478 fFile = new TFile(full_file.c_str(),"RECREATE");
00479 fFile->cd();
00480
00481 fTPtree = new TTree("tprates","Trigger Processor Rates");
00482 fTPtree->Branch("tpevt","TPSinglesEvent",&fTPevt);
00483
00484 fDStree = new TTree("dsrates","DaqSnarl Rates");
00485 fDStree->Branch("dsevt","DaqSnarlEvent",&fDSevt);
00486
00487 fCMtree = new TTree("cmrates","Crate Monitor Rates");
00488 fCMtree->Branch("cmevt","CrateMonitorEvent",&fCMevt);
00489
00490 fFile->cd();
00491 }
00492
00493 void RateSummary::CloseFile() {
00494 if(fRun==0) return;
00495 RSMSyn << "RateSummary::CloseFile" << endl;
00496
00497 fFile->cd();
00498 fTPtree->Write();
00499 fDStree->Write();
00500 fCMtree->Write();
00501
00502 fFile->cd();
00503 fFile->Write(NULL,TObject::kOverwrite);
00504 fFile->Purge();
00505 fTPtree->Delete();
00506 fDStree->Delete();
00507 fCMtree->Delete();
00508 fFile->Purge();
00509 fFile->Close();
00510 fTPevt->Reset();
00511 fDSevt->Reset();
00512 fCMevt->Reset();
00513 }
00514
00515 const Registry& RateSummary::DefaultConfig() const {
00516 RSMSyn << "RateSummary::DefaultConfig" << endl;
00517
00518 static Registry r;
00519
00520 string name = this->JobCModule::GetName();
00521 r.SetName((name+".config.default").c_str());
00522 r.UnLockValues();
00523
00524 r.Set("RateFileName","F%08d_%04d.rate.root");
00525 r.Set("RateFileDir","./");
00526 r.Set("MonthlyDir",0);
00527
00528 r.LockValues();
00529 return r;
00530 }
00531
00532 void RateSummary::Config(const Registry& r) {
00533 RSMSyn << "RateSummary::Config" << endl;
00534 int tmpi = 0;
00535 const char* tmps = 0;
00536
00537 if(r.Get("RateFileName",tmps)) fRateFileName=tmps;
00538 if(r.Get("RateFileDir",tmps)) fRateFileDir=tmps;
00539 if(r.Get("MonthlyDir",tmpi)) fMonthlyDir=static_cast<bool>(tmpi);
00540 }