00001 #include "FillFarRunQuality.h"
00002
00003 #include "RunQuality/DbuFarRunQuality.h"
00004
00005 #include "MessageService/MsgService.h"
00006 #include "MinosObjectMap/MomNavigator.h"
00007 #include "JobControl/JobCommand.h"
00008 #include "JobControl/JobCModuleRegistry.h"
00009
00010 #include "DatabaseInterface/DbiResultPtr.h"
00011 #include "DatabaseInterface/DbiSqlContext.h"
00012 #include "DatabaseInterface/DbiValidityRec.h"
00013 #include "DatabaseInterface/DbiCascader.h"
00014 #include "DatabaseInterface/DbiTableProxyRegistry.h"
00015 #include "DatabaseInterface/DbiWriter.h"
00016
00017 #include "RawData/RawRecord.h"
00018 #include "RawData/RawRecord.h"
00019 #include "RawData/RawHeader.h"
00020 #include "RawData/RawDaqHeader.h"
00021 #include "RawData/RawDaqSnarlHeader.h"
00022 #include "RawData/RawDaqHeaderBlock.h"
00023 #include "RawData/RawSnarlHeaderBlock.h"
00024 #include "RawData/RawRunStartBlock.h"
00025 #include "RawData/RawRunEndBlock.h"
00026 #include "RawData/RawSubRunEndBlock.h"
00027 #include "RawData/RawRunConfigBlock.h"
00028 #include "RawData/RawConfigFilesBlock.h"
00029 #include "RawData/RawTpSinglesSummaryBlock.h"
00030
00031 #include "OnlineUtil/mdTriggerCodes.h"
00032 #include "OnlineUtil/mdRunTypeCodes.h"
00033
00034 #include <cmath>
00035
00036
00037
00038
00039
00040 ClassImp(FillFarRunQuality)
00041
00042 CVSID("$Id: FillFarRunQuality.cxx,v 1.4 2008/01/11 17:31:59 bspeak Exp $");
00043
00044 JOBMODULE(FillFarRunQuality,"FillFarRunQuality","FillFarRunQuality");
00045
00046 FillFarRunQuality::FillFarRunQuality() :
00047 fTime(-1),
00048 fRecord(0),
00049 fCounter(-1),
00050 fGoodCounter(0),
00051 fHvStatus(-1),
00052 fHvStatusSM1(-1),
00053 fHvStatusSM2(-1),
00054 fReadoutStatus(-1),
00055 fTimeFrame(-1),
00056 fSource(-1),
00057 fRun(-1),
00058 fSubRun(-1),
00059 fRunType(-1),
00060 fRopMask(-1),
00061 fCrateMask(-1),
00062 fTriggerMask(-1),
00063 fStartTime(-1),
00064 fEndTime(-1),
00065 fTimeFrames(0),
00066 fSnarls(0),
00067 fGoodSnarls(0),
00068 fSnarlRateMin(-1),
00069 fSnarlRateMax(-1),
00070 fSnarlRateMean(-999.9),
00071 fSnarlRateMedian(-999.9),
00072 fTriggersPlane(0),
00073 fTriggersEnergy(0),
00074 fTriggersSpill(0),
00075 fTriggersRealSpill(0),
00076 fTriggersFakeSpill(0),
00077 fPhysicsRun(-1),
00078 fModifiedRun(-1),
00079 fTestRun(-1),
00080 fGoodRun(-1),
00081 fRawReadout(0)
00082 {
00083 MSG("FarRunQuality",Msg::kDebug) << " *** FillFarRunQuality::FillFarRunQuality() *** " << endl;
00084
00085 fRunQualityFile = 0;
00086 fRunQualityTree = 0;
00087 fRunQualityFileName = "dburunquality.root";
00088
00089 fWriteOutResults = 0;
00090 fWriteToDatabase = 0;
00091 fReadFromDatabase = 0;
00092
00093 fSnarlRates = new Int_t[1001];
00094 fCrateRates = new Int_t[17];
00095
00096 fRawReadout = new RawReadout();
00097
00098 this->Reset();
00099 }
00100
00101 FillFarRunQuality::~FillFarRunQuality()
00102 {
00103 MSG("FarRunQuality",Msg::kDebug) << " *** FillFarRunQuality::~FillFarRunQuality() *** " << endl;
00104
00105 delete [] fSnarlRates;
00106 delete [] fCrateRates;
00107 if( fRawReadout ) delete fRawReadout;
00108 }
00109
00110 void FillFarRunQuality::BeginJob()
00111 {
00112 MSG("FarRunQuality",Msg::kInfo) << " *** FillFarRunQuality::BeginJob(...) *** " << endl;
00113
00114 }
00115
00116 JobCResult FillFarRunQuality::Get(MomNavigator *mom)
00117 {
00118 MSG("FarRunQuality",Msg::kDebug) << " *** FillFarRunQuality::Get(...) *** " << endl;
00119
00120 JobCResult result(JobCResult::kPassed);
00121
00122 VldContext vldc;
00123 TObject* momobject = 0;
00124 Bool_t foundit = 0;
00125
00126
00127
00128 TIter momitr(mom->FragmentIter());
00129 while((momobject = momitr())){
00130 if(momobject->InheritsFrom("RawRecord")){
00131 foundit = 1;
00132 fRecord++;
00133 MSG("FarRunQuality",Msg::kDebug) << " *** RAW RECORD [" << fRecord << "] *** " << endl;
00134 RawRecord* rawrec = dynamic_cast<RawRecord*>(momobject);
00135
00136
00137
00138 vldc = rawrec->GetRawHeader()->GetVldContext();
00139 this->ProcessHeader((TObject*)(rawrec->GetRawHeader()));
00140
00141
00142
00143 TIter rawrecitr = rawrec->GetRawBlockIter();
00144 TObject* tob = 0;
00145 while((tob = rawrecitr())){
00146 MSG("FarRunQuality",Msg::kDebug) << " " << tob->GetName() << endl;
00147 this->ProcessBlock(tob);
00148 }
00149 }
00150 }
00151
00152 if( !foundit ){
00153 MSG("FarRunQuality",Msg::kWarning) << " *** FAILED TO FIND RAW RECORD *** " << endl;
00154 return result.SetFailed();
00155 }
00156
00157 return result;
00158 }
00159
00160
00161
00162
00163
00164
00165
00166
00167 const Registry& FillFarRunQuality::DefaultConfig() const
00168 {
00169 MSG("FarRunQuality",Msg::kDebug) << " *** FillFarRunQuality::DefaultConfig() *** " << endl;
00170
00171 static Registry r;
00172 r.SetName("FillFarRunQuality.config.default");
00173 r.UnLockValues();
00174 r.Set("RunQualityFileName",fRunQualityFileName.Data());
00175 r.Set("WriteToDatabase",fWriteToDatabase);
00176 r.Set("ReadFromDatabase",fReadFromDatabase);
00177 r.Set("WriteOutResults",fWriteOutResults);
00178 r.LockValues();
00179
00180 return r;
00181 }
00182
00183 void FillFarRunQuality::Config(const Registry& r)
00184 {
00185 MSG("FarRunQuality",Msg::kDebug) << " *** FillFarRunQuality::Config() *** " << endl;
00186
00187 Int_t tmpint; const char* tmpchar = 0;
00188
00189 if(r.Get("RunQualityFileName",tmpchar)) fRunQualityFileName = tmpchar;
00190 if(r.Get("WriteToDatabase",tmpint)) fWriteToDatabase = tmpint;
00191 if(r.Get("ReadFromDatabase",tmpint)) fReadFromDatabase = tmpint;
00192 if(r.Get("WriteOutResults",tmpint)) fWriteOutResults = tmpint;
00193
00194 return;
00195 }
00196
00197 void FillFarRunQuality::HandleCommand(JobCommand* command)
00198 {
00199 TString cmd = command->PopCmd();
00200 if(cmd=="Set"){
00201 TString opt = command->PopOpt();
00202
00203 }
00204 }
00205
00206 void FillFarRunQuality::EndJob()
00207 {
00208 MSG("FarRunQuality",Msg::kInfo) << " *** FillFarRunQuality::EndJob() *** " << endl;
00209
00210
00211
00212 this->EndSubRun();
00213
00214
00215
00216 if( fWriteOutResults ){
00217 this->WriteOutFile();
00218 }
00219 }
00220
00221 void FillFarRunQuality::WriteToDatabase()
00222 {
00223 MSG("FarRunQuality",Msg::kDebug) << " *** FillFarRunQuality::WriteToDatabase() *** " << endl;
00224
00225 DbiCascader& cascader = DbiTableProxyRegistry::Instance().GetCascader();
00226
00227 if( !cascader.TableExists("DBUFARRUNQUALITY") ){
00228 MSG("FarRunQuality",Msg::kDebug) << " Creating temporary DBUFARRUNQUALITY table " << endl;
00229
00230 string tableDescr = "(SEQNO int, RUN int, SUBRUN int, RUNTYPE int, ROPMASK int, CRATEMASK int, TRIGGERMASK int, STARTTIME timestamp, ENDTIME timestamp, TIMEFRAMES int, SNARLS int, GOODSNARLS int, MINSNARLRATE int, MAXSNARLRATE int, MEANSNARLRATE float, MEDIANSNARLRATE float, PLANETRIGGERS int, ENERGYTRIGGERS int, SPILLTRIGGERS int, SPILLTRIGGERSREAL int, SPILLTRIGGERSFAKE int, PHYSICSRUN int, MODIFIEDRUN int, TESTRUN int)";
00231
00232 Int_t dbNoTempDb = cascader.CreateTemporaryTable("DBUFARRUNQUALITY",tableDescr);
00233
00234 MSG("FarRunQuality",Msg::kDebug) << " DbNoTempDb=" << dbNoTempDb << endl;
00235 }
00236
00237 if( cascader.TableExists("DBUFARRUNQUALITY") ){
00238 MSG("FarRunQuality",Msg::kVerbose) << " Writing to DBUFARRUNQUALITY table... " << endl;
00239
00240 VldTimeStamp start(fStartTime,0);
00241 VldTimeStamp end(fEndTime,0);
00242 TString logentry("Run Quality (Run=");
00243 logentry+=fRun;
00244 logentry.Append("/");
00245 logentry+=fSubRun;
00246 logentry.Append(")");
00247
00248 MSG("FarRunQuality",Msg::kVerbose) << " run: " << fRun << "/" << fSubRun << endl;
00249 MSG("FarRunQuality",Msg::kVerbose) << " start time: " << start << endl;
00250 MSG("FarRunQuality",Msg::kVerbose) << " end time: " << end << endl;
00251 MSG("FarRunQuality",Msg::kVerbose) << " log entry: " << logentry.Data() << endl;
00252
00253 VldRange range(Detector::kFar,SimFlag::kData,start,end,logentry.Data());
00254
00255 DbuFarRunQuality row( fRun,fSubRun,fRunType,
00256 fRopMask,fCrateMask,fTriggerMask,
00257 start,end,fTimeFrames,
00258 fSnarls,fGoodSnarls,
00259 fSnarlRateMin,fSnarlRateMax,
00260 fSnarlRateMean,fSnarlRateMedian,
00261 fTriggersPlane,fTriggersEnergy,
00262 fTriggersSpill,fTriggersRealSpill,fTriggersFakeSpill,
00263 fPhysicsRun,fModifiedRun,fTestRun );
00264 fGoodRun = row.GetGoodRun();
00265
00266 Int_t aggNo = row.GetAggregateNo();
00267 Dbi::Task task = 0;
00268 VldTimeStamp creationDate;
00269
00270 MSG("FarRunQuality",Msg::kVerbose) << " aggNo: " << aggNo << " taskNo: " << task << endl;
00271
00272 DbiWriter<DbuFarRunQuality> writer(range,aggNo,task,creationDate,0,logentry.Data());
00273 writer << row;
00274 writer.Close();
00275
00276 MSG("FarRunQuality",Msg::kDebug) << endl
00277 << " WRITING RESULTS: " << endl
00278 << " =============== " << endl
00279 << " Run=" << fRun << endl
00280 << " SubRun=" << fSubRun << endl
00281 << " RunType=" << fRunType << endl
00282 << " RopMask=" << fRopMask << endl
00283 << " CrateMask=" << fCrateMask << endl
00284 << " TriggerMask=" << fTriggerMask << endl
00285 << " StartTime=" << fStartTime << endl
00286 << " EndTime=" << fEndTime << endl
00287 << " TimeFrames=" << fTimeFrames << endl
00288 << " Snarls=" << fSnarls << endl
00289 << " GoodSnarls=" << fGoodSnarls << endl
00290 << " MinSnarlRate=" << fSnarlRateMin << endl
00291 << " MaxSnarlRate=" << fSnarlRateMax << endl
00292 << " MeanSnarlRate=" << fSnarlRateMean << endl
00293 << " MedianSnarlRate=" << fSnarlRateMedian << endl
00294 << " PlaneTriggers=" << fTriggersPlane << endl
00295 << " EnergyTriggers=" << fTriggersEnergy << endl
00296 << " SpillTriggers=" << fTriggersSpill << endl
00297 << " SpillTriggersReal=" << fTriggersRealSpill << endl
00298 << " SpillTriggersFake=" << fTriggersFakeSpill << endl
00299 << " PhysicsRun=" << fPhysicsRun << endl
00300 << " ModifiedRun=" << fModifiedRun << endl
00301 << " TestRun=" << fTestRun << endl
00302 << " GoodRun=" << fGoodRun << endl;
00303
00304 }
00305 }
00306
00307 void FillFarRunQuality::ReadFromDatabase()
00308 {
00309 MSG("FarRunQuality",Msg::kDebug) << " *** FillFarRunQuality::ReadFromDatabase() *** " << endl;
00310
00311 DbiCascader& cascader = DbiTableProxyRegistry::Instance().GetCascader();
00312
00313 if( cascader.TableExists("DBUFARRUNQUALITY") ){
00314 MSG("FarRunQuality",Msg::kVerbose) << " Reading from DBUFARRUNQUALITY table... " << endl;
00315 cout << " Reading from DBUFARRUNQUALITY table... " << endl;
00316
00317 Int_t time = (Int_t)(0.5*((double)fStartTime+(double)fEndTime));
00318 VldTimeStamp timestamp(time,0);
00319 VldContext vldc(Detector::kFar,SimFlag::kData,timestamp);
00320 Dbi::Task task = 0;
00321
00322 DbiResultPtr<DbuFarRunQuality> resptr("DBUFARRUNQUALITY",vldc,task);
00323
00324 MSG("FarRunQuality",Msg::kVerbose) << " Number Of Rows = " << resptr.GetNumRows() << endl;
00325
00326 if( resptr.GetNumRows()>0 ){
00327 for( unsigned int i=0; i<resptr.GetNumRows(); i++){
00328 const DbuFarRunQuality* rowptr = resptr.GetRow(i);
00329 fRun = rowptr->GetRun();
00330 fSubRun = rowptr->GetSubRun();
00331 fRunType = rowptr->GetRunType();
00332 fRopMask = rowptr->GetRopMask();
00333 fCrateMask = rowptr->GetCrateMask();
00334 fTriggerMask = rowptr->GetTriggerMask();
00335
00336 fStartTime = rowptr->GetStartTime().GetSec();
00337 fEndTime = rowptr->GetEndTime().GetSec();
00338 fTimeFrames = rowptr->GetTimeFrames();
00339 fSnarls = rowptr->GetSnarls();
00340 fGoodSnarls = rowptr->GetGoodSnarls();
00341 fSnarlRateMin = rowptr->GetMinSnarlRate();
00342 fSnarlRateMax = rowptr->GetMaxSnarlRate();
00343 fSnarlRateMean = rowptr->GetMeanSnarlRate();
00344 fSnarlRateMedian = rowptr->GetMedianSnarlRate();
00345 fTriggersPlane = rowptr->GetPlaneTriggers();
00346 fTriggersEnergy = rowptr->GetEnergyTriggers();
00347 fTriggersSpill = rowptr->GetSpillTriggers();
00348 fTriggersRealSpill = rowptr->GetSpillTriggersReal();
00349 fTriggersFakeSpill = rowptr->GetSpillTriggersFake();
00350 fPhysicsRun = rowptr->GetPhysicsRun();
00351 fModifiedRun = rowptr->GetModifiedRun();
00352 fTestRun = rowptr->GetTestRun();
00353 fGoodRun = rowptr->GetGoodRun();
00354
00355 MSG("FarRunQuality",Msg::kDebug) << endl
00356 << " READING RESULTS: " << endl
00357 << " =============== " << endl
00358 << " Run=" << fRun << endl
00359 << " SubRun=" << fSubRun << endl
00360 << " RunType=" << fRunType << endl
00361 << " RopMask=" << fRopMask << endl
00362 << " CrateMask=" << fCrateMask << endl
00363 << " TriggerMask=" << fTriggerMask << endl
00364 << " StartTime=" << fStartTime << endl
00365 << " EndTime=" << fEndTime << endl
00366 << " TimeFrames=" << fTimeFrames << endl
00367 << " Snarls=" << fSnarls << endl
00368 << " GoodSnarls=" << fGoodSnarls << endl
00369 << " MinSnarlRate=" << fSnarlRateMin << endl
00370 << " MaxSnarlRate=" << fSnarlRateMax << endl
00371 << " MeanSnarlRate=" << fSnarlRateMean << endl
00372 << " MedianSnarlRate=" << fSnarlRateMedian << endl
00373 << " PlaneTriggers=" << fTriggersPlane << endl
00374 << " EnergyTriggers=" << fTriggersEnergy << endl
00375 << " SpillTriggers=" << fTriggersSpill << endl
00376 << " SpillTriggersReal=" << fTriggersRealSpill << endl
00377 << " SpillTriggersFake=" << fTriggersFakeSpill << endl
00378 << " PhysicsRun=" << fPhysicsRun << endl
00379 << " ModifiedRun=" << fModifiedRun << endl
00380 << " TestRun=" << fTestRun << endl
00381 << " GoodRun=" << fGoodRun << endl;
00382 }
00383 }
00384 }
00385 }
00386
00387 void FillFarRunQuality::WriteOutResults()
00388 {
00389 MSG("FarRunQuality",Msg::kDebug) << " *** FillFarRunQuality::WriteOutResults() *** " << endl;
00390
00391 if( !fRunQualityFile ){
00392 MSG("FarRunQuality",Msg::kDebug) << " opening file: " << fRunQualityFileName.Data() << endl;
00393 TDirectory* tmpd = gDirectory;
00394 fRunQualityFile = new TFile(fRunQualityFileName.Data(),"RECREATE");
00395 fRunQualityTree = new TTree("FarRunQuality","FarRunQuality");
00396 fRunQualityTree->SetAutoSave(100);
00397 fRunQualityTree->Branch("Source",&fSource,"Source/I");
00398 fRunQualityTree->Branch("Run",&fRun,"Run/I");
00399 fRunQualityTree->Branch("SubRun",&fSubRun,"SubRun/I");
00400 fRunQualityTree->Branch("RunType",&fRunType,"RunType/I");
00401 fRunQualityTree->Branch("RopMask",&fRopMask,"RopMask/I");
00402 fRunQualityTree->Branch("CrateMask",&fCrateMask,"CrateMask/I");
00403 fRunQualityTree->Branch("TriggerMask",&fTriggerMask,"TriggerMask/I");
00404 fRunQualityTree->Branch("StartTime",&fStartTime,"StartTime/I");
00405 fRunQualityTree->Branch("EndTime",&fEndTime,"EndTime/I");
00406 fRunQualityTree->Branch("TimeFrames",&fTimeFrames,"TimeFrames/I");
00407 fRunQualityTree->Branch("Snarls",&fSnarls,"Snarls/I");
00408 fRunQualityTree->Branch("GoodSnarls",&fGoodSnarls,"GoodSnarls/I");
00409 fRunQualityTree->Branch("SnarlRateMin",&fSnarlRateMin,"MinSnarlRate/I");
00410 fRunQualityTree->Branch("SnarlRateMax",&fSnarlRateMax,"MaxSnarlRate/I");
00411 fRunQualityTree->Branch("SnarlRateMean",&fSnarlRateMean,"MeanSnarlRate/F");
00412 fRunQualityTree->Branch("SnarlRateMedian",&fSnarlRateMedian,"MedianSnarlRate/F");
00413 fRunQualityTree->Branch("PlaneTriggers",&fTriggersPlane,"PlaneTriggers/I");
00414 fRunQualityTree->Branch("EnergyTriggers",&fTriggersEnergy,"EnergyTriggers/I");
00415 fRunQualityTree->Branch("SpillTriggers",&fTriggersSpill,"SpillTriggers/I");
00416 fRunQualityTree->Branch("SpillTriggersReal",&fTriggersRealSpill,"SpillTriggersReal/I");
00417 fRunQualityTree->Branch("SpillTriggersFake",&fTriggersFakeSpill,"SpillTriggersFake/I");
00418 fRunQualityTree->Branch("PhysicsRun",&fPhysicsRun,"PhysicsRun/I");
00419 fRunQualityTree->Branch("ModifiedRun",&fModifiedRun,"ModifiedRun/I");
00420 fRunQualityTree->Branch("TestRun",&fTestRun,"TestRun/I");
00421 fRunQualityTree->Branch("GoodRun",&fGoodRun,"GoodRun/I");
00422 gDirectory = tmpd;
00423 }
00424
00425 if( fRunQualityFile ){
00426 TDirectory* tmpd = gDirectory;
00427 fRunQualityFile->cd();
00428 fRunQualityTree->Fill();
00429 gDirectory = tmpd;
00430 }
00431 }
00432
00433 void FillFarRunQuality::WriteOutFile()
00434 {
00435 MSG("FarRunQuality",Msg::kDebug) << " *** FillFarRunQuality::WriteOutFile() *** " << endl;
00436
00437 if( fRunQualityFile ){
00438 MSG("FarRunQuality",Msg::kDebug) << " closing file: " << fRunQualityFileName.Data() << endl;
00439 TDirectory* tmpd = gDirectory;
00440 fRunQualityFile->cd();
00441 fRunQualityTree->Write();
00442 fRunQualityFile->Close();
00443 gDirectory = tmpd;
00444 }
00445 }
00446
00447 void FillFarRunQuality::ProcessHeader(TObject* obj)
00448 {
00449
00450
00451
00452 if(obj->InheritsFrom("RawDaqHeader")){
00453 MSG("FarRunQuality",Msg::kDebug) << " ... found RawDaqHeader " << endl;
00454 RawDaqHeader* hdr = (RawDaqHeader*)(obj);
00455
00456 Int_t time = hdr->GetVldContext().GetTimeStamp().GetSec();
00457 Int_t timeframe = hdr->GetTimeFrameNum();
00458 Int_t run = hdr->GetRun();
00459 Int_t subrun = hdr->GetSubRun();
00460 Int_t runtype = hdr->GetRunType();
00461
00462 MSG("FarRunQuality",Msg::kDebug) << " timeframe=" << timeframe << " time=" << time << endl;
00463
00464
00465 if( (fRun>=0 && fSubRun>=0)
00466 && !(run==fRun && subrun==fSubRun)
00467 && !(run==fRun && fEndTime-fStartTime<30) ){
00468 MSG("FarRunQuality",Msg::kDebug) << " closing:" << fRun << "/"<< fSubRun << endl;
00469 this->EndSubRun();
00470 this->Reset();
00471 }
00472
00473
00474 if( fRun<0 || fSubRun<0 ){
00475 MSG("FarRunQuality",Msg::kDebug) << " opening:" << run << "/"<< subrun << endl;
00476 fRun = run;
00477 fSubRun = subrun;
00478 fRunType = runtype;
00479 }
00480
00481
00482 if( fPhysicsRun<0 ){
00483 if( fRun>=0 ){
00484 fPhysicsRun = 0;
00485 fModifiedRun = 0;
00486 fTestRun = 0;
00487 if( fRunType>=0 ){
00488 if( (fRunType==2) ) fPhysicsRun = 1;
00489 if( (fRunType&RUN_TYPE_PHYSICS)==(RUN_TYPE_PHYSICS) ) fPhysicsRun = 1;
00490 if( (fRunType&RUN_TYPE_MASK_MODIFIED)==(RUN_TYPE_MASK_MODIFIED) ) fModifiedRun = 1;
00491 if( (fRunType&RUN_TYPE_MASK_TEST)==(RUN_TYPE_MASK_TEST) ) fTestRun = 1;
00492 }
00493 }
00494 }
00495
00496
00497 if( timeframe>=0 && time!=fTime ){
00498
00499 if( time>fTime ){
00500 if( fStartTime<0 ) fStartTime = time;
00501 if( time>fEndTime ) fEndTime = time;
00502 if( fCounter>=0 ){
00503 if( fSnarlRateMin<0 || fCounter<fSnarlRateMin ) fSnarlRateMin = fCounter;
00504 if( fCounter>fSnarlRateMax ) fSnarlRateMax = fCounter;
00505 if( fCounter>1000 ) fCounter = 1000;
00506 fSnarls += fCounter;
00507 fGoodSnarls += fGoodCounter;
00508 fSnarlRates[fCounter]++;
00509 fTimeFrames++;
00510 }
00511 }
00512
00513 fCounter = 0;
00514 fGoodCounter = 0;
00515 fTime = time;
00516 fTimeFrame = timeframe;
00517 }
00518
00519 MSG("FarRunQuality",Msg::kVerbose) << " run=" << fRun << " subrun=" << fSubRun << " runtype=" << fRunType << " physics=" << fPhysicsRun << endl;
00520 }
00521
00522
00523
00524 if(obj->InheritsFrom("RawDaqSnarlHeader")){
00525 MSG("FarRunQuality",Msg::kDebug) << " ... found RawDaqSnarlHeader " << endl;
00526 RawDaqSnarlHeader* hdr = (RawDaqSnarlHeader*)(obj);
00527
00528 Int_t time = hdr->GetVldContext().GetTimeStamp().GetSec();
00529 Int_t timeframe = hdr->GetTimeFrameNum();
00530 Int_t trigger = hdr->GetTrigSrc();
00531 Int_t digits = hdr->GetNumRawDigits();
00532 Int_t spilltype = hdr->GetRemoteSpillType();
00533
00534
00535 Bool_t plane_trigger = ((trigger&TRIGGER_BIT_PLANE)==(TRIGGER_BIT_PLANE));
00536 Bool_t energy_trigger = ((trigger&TRIGGER_BIT_E4)==(TRIGGER_BIT_E4));
00537 Bool_t spill_trigger = ((trigger&TRIGGER_BIT_SPILL_IP)==(TRIGGER_BIT_SPILL_IP));
00538 Bool_t real_spill_trigger = 0; if( spill_trigger && spilltype==1 ) real_spill_trigger = 1;
00539 Bool_t fake_spill_trigger = 0; if( spill_trigger && spilltype==3 ) fake_spill_trigger = 1;
00540
00541 MSG("FarRunQuality",Msg::kVerbose) << " time=" << time << " timeframe=" << timeframe << endl;
00542 MSG("FarRunQuality",Msg::kVerbose) << " trigger=" << trigger << " (PL,EN,SP)=(" << plane_trigger << "," << energy_trigger << "," << spill_trigger << ")" << endl;
00543
00544 Bool_t good_trigger = 0;
00545 if( plane_trigger ) { good_trigger |= 1; fTriggersPlane++; }
00546 if( energy_trigger ){ good_trigger |= 1; fTriggersEnergy++; }
00547 if( spill_trigger ) { good_trigger |= 1; fTriggersSpill++; }
00548 if( real_spill_trigger ) { good_trigger |= 1; fTriggersRealSpill++; }
00549 if( fake_spill_trigger ) { good_trigger |= 1; fTriggersFakeSpill++; }
00550
00551 Bool_t good_detector = 0;
00552 if( fHvStatus>0 ) good_detector = fHvStatus;
00553
00554 Bool_t good_event = 0;
00555 if( digits>=0 && digits<1000 ) good_event = 1;
00556
00557
00558 if( fCounter>=0 ){
00559 fCounter++;
00560 if( good_detector && good_trigger && good_event ) fGoodCounter++;
00561 }
00562 }
00563
00564 }
00565
00566 void FillFarRunQuality::ProcessBlock(TObject* obj)
00567 {
00568
00569
00570
00571 if(obj->InheritsFrom("RawDaqHeaderBlock")){
00572 MSG("FarRunQuality",Msg::kDebug) << " ... found RawDaqHeaderBlock " << endl;
00573
00575
00576 }
00577
00578
00579
00580 if(obj->InheritsFrom("RawSnarlHeaderBlock")){
00581 MSG("FarRunQuality",Msg::kDebug) << " ... found RawSnarlHeaderBlock " << endl;
00582
00584
00585 }
00586
00587
00588
00589 if(obj->InheritsFrom("RawRunConfigBlock")){
00590 MSG("FarRunQuality",Msg::kDebug) << " ... found RawRunConfigBlock " << endl;
00591 RawRunConfigBlock* rdb = (RawRunConfigBlock*)(obj);
00592
00593 char* config;
00594 config = (char*)(rdb->GetRunConfig());
00595
00596 MSG("FarRunQuality",Msg::kVerbose) << " RUN_CONFIG_BLOCK: " << config << endl;
00597
00598 char* word;
00599 int ctr = 0;
00600 bool cont = 1;
00601 word = strtok(config,";");
00602
00603 while( cont ){
00604 MSG("FarRunQuality",Msg::kVerbose) << " (" << ctr << ") " << word << endl;
00605
00606
00607 if( strstr(word,"ropIdMask#") ){
00608 if( (word = strchr(word,'=')) ){
00609 if( strlen(word)>1 ){
00610 word=&(word[1]);
00611 if( fRopMask<0 ) fRopMask = strtol(word,&word,0);
00612 }
00613 }
00614 }
00615
00616
00617 if( strstr(word,"triggerMask#") ){
00618 if( (word = strchr(word,'=')) ){
00619 if( strlen(word)>1 ){
00620 word=&(word[1]);
00621 if( fTriggerMask<0 ) fTriggerMask = strtol(word,&word,0);
00622 }
00623 }
00624 }
00625
00626 cont = ( word = strtok(0,";") );
00627 ctr++;
00628 }
00629
00630
00631 if( fRopMask>=0 ){
00632 Int_t cratemask = 0;
00633 for( Int_t n=0; n<16; n++){
00634 Int_t nbit = ( 1 << n );
00635 if( (fRopMask&nbit)==(nbit) ) cratemask++;
00636 }
00637
00638
00639 }
00640
00641 MSG("FarRunQuality",Msg::kDebug) << " RopMask=" << fRopMask << " TriggerMask=" << fTriggerMask << endl;
00642 }
00643
00644
00645
00646 if(obj->InheritsFrom("RawConfigFilesBlock")){
00647 MSG("FarRunQuality",Msg::kDebug) << " ... found RawConfigFilesBlock " << endl;
00648 RawConfigFilesBlock* rdb = (RawConfigFilesBlock*)(obj);
00649
00650 char* config;
00651 config = (char*)(rdb->GetConfigFile());
00652
00654
00655 }
00656
00657
00658
00659 if(obj->InheritsFrom("RawRunStartBlock")){
00660 MSG("FarRunQuality",Msg::kDebug) << " ... found RawRunStartBlock " << endl;
00661 RawRunStartBlock* rdb = (RawRunStartBlock*)(obj);
00662
00663 fStartTime = rdb->GetStartTime().GetSec();
00664
00665 MSG("FarRunQuality",Msg::kDebug) << " StartTime=" << fStartTime << endl;
00666 }
00667
00668
00669
00670 if(obj->InheritsFrom("RawTpSinglesSummaryBlock")){
00671 MSG("FarRunQuality",Msg::kDebug) << " ... found RawTpSinglesSummaryBlock " << endl;
00672 RawTpSinglesSummaryBlock* rdb = (RawTpSinglesSummaryBlock*)(obj);
00673
00674 Int_t time = rdb->GetStartTimeStamp().GetSec();
00675 Double_t frametime = (rdb->GetEndTimeStamp().GetSec()-rdb->GetStartTimeStamp().GetSec())+1.0e-9*(rdb->GetEndTimeStamp().GetNanoSec()-rdb->GetStartTimeStamp().GetNanoSec());
00676
00677 Int_t source = rdb->GetSource();
00678 Int_t sourcecheck = 0;
00679 Int_t minrate = -99999;
00680 Int_t maxchips = +99999;
00681
00682 Int_t allchips1 = 0;
00683 Int_t allchips2 = 0;
00684 Int_t coldchips1 = 0;
00685 Int_t coldchips2 = 0;
00686
00687 Detector::Detector_t Detector = Detector::kUnknown;
00688
00689 switch( source ){
00690 case 0:
00691 Detector = Detector::kUnknown;
00692 break;
00693 case 1:
00694 Detector = Detector::kFar;
00695 break;
00696 case 2:
00697 Detector = Detector::kFar;
00698 break;
00699 case 3:
00700 Detector = Detector::kFar;
00701 break;
00702 case 4:
00703 Detector = Detector::kUnknown;
00704 break;
00705 case 5:
00706 Detector = Detector::kNear;
00707 break;
00708 case 6:
00709 Detector = Detector::kNear;
00710 break;
00711 case 7:
00712 Detector = Detector::kNear;
00713 break;
00714 default:
00715 break;
00716 }
00717
00718
00719 if( source==3 && Detector==Detector::kFar ){
00720 minrate = 50;
00721 maxchips = 20;
00722 sourcecheck = 1;
00723 }
00724
00725 if( source==7 && Detector==Detector::kNear ){
00726 minrate = -99999;
00727 maxchips = +99999;
00728 sourcecheck = 1;
00729 }
00730
00731
00732 typedef std::map<RawChannelId,UInt_t> RCIdToRateMap;
00733 const RCIdToRateMap& rates = rdb->GetRates();
00734 RCIdToRateMap::const_iterator rateItr = rates.begin();
00735 RCIdToRateMap::const_iterator rateEnd = rates.end();
00736 while ( rateItr != rateEnd ) {
00737 RawChannelId rawch = rateItr->first;
00738 Int_t rawrate = rateItr->second;
00739 Int_t correctedrate = (Int_t)(rawrate/frametime);
00740 Int_t rate = correctedrate;
00741 Int_t crate = rawch.GetCrate();
00742
00743 RawReadout::ReadoutType_t readout = fRawReadout->GetReadoutType(rawch);
00744
00745 if( ( sourcecheck )
00746 && ( readout==RawReadout::kDetector
00747 || readout==RawReadout::kVetoShield ) ){
00748
00749
00750 if( crate>=0 && crate<8 ){
00751 allchips1++;
00752 if( rate<minrate ){
00753 coldchips1++;
00754 MSG("FarRunQuality",Msg::kVerbose) << " cold chip (SM1): crate=" << crate << " corrected rate=" << correctedrate << endl;
00755 }
00756 }
00757
00758
00759 if( crate>=8 && crate<16 ){
00760 allchips2++;
00761 if( rate<minrate ){
00762 coldchips2++;
00763 MSG("FarRunQuality",Msg::kVerbose) << " cold chip (SM2): crate=" << crate << " corrected rate=" << correctedrate << endl;
00764 }
00765 }
00766
00767 }
00768
00769 rateItr++;
00770 }
00771
00772
00773 Int_t ncrates = rdb->GetNumberOfCrates();
00774 Int_t ncrates_readout = 0;
00775
00776 for( Int_t k=0; k<ncrates; k++ ){
00777 if( rdb->GetHitsPerSecByCrate(k)>0 ) ncrates_readout++;
00778 }
00779
00780 if( ncrates_readout>=0 && ncrates_readout<=16 ){
00781 fCrateRates[ncrates_readout]++;
00782 }
00783
00784 MSG("FarRunQuality",Msg::kVerbose) << " time=" << time << " frametime=" << frametime << endl;
00785 MSG("FarRunQuality",Msg::kVerbose) << " crates=" << ncrates_readout << "/" << ncrates << endl;
00786 MSG("FarRunQuality",Msg::kVerbose) << " source=" << source << " check=" << sourcecheck << endl;
00787 MSG("FarRunQuality",Msg::kVerbose) << " minrate=" << minrate << " maxchips=" << maxchips << endl;
00788 MSG("FarRunQuality",Msg::kVerbose) << " SM1: allchips=" << allchips1 << " coldchips=" << coldchips1 << endl;
00789 MSG("FarRunQuality",Msg::kVerbose) << " SM2: allchips=" << allchips2 << " coldchips=" << coldchips2 << endl;
00790
00791 fHvStatus = -1;
00792 fHvStatusSM1 = -1;
00793 fHvStatusSM2 = -1;
00794 fReadoutStatus = -1;
00795
00796
00797 if( sourcecheck ){
00798
00799
00800 if( allchips1>0 ){
00801 if( coldchips1<maxchips ) fHvStatusSM1 = 1;
00802 else fHvStatusSM1 = 0;
00803 }
00804
00805
00806 if( allchips2>0 ){
00807 if( coldchips2<maxchips ) fHvStatusSM2 = 1;
00808 else fHvStatusSM2 = 0;
00809 }
00810
00811
00812 if( fHvStatusSM1==1 && fHvStatusSM2!=0 ) fHvStatus = 1;
00813 if( fHvStatusSM1!=0 && fHvStatusSM2==1 ) fHvStatus = 1;
00814 if( fHvStatusSM1==0 || fHvStatusSM2==0 ) fHvStatus = 0;
00815
00816
00817 if( ncrates_readout==16 ) fReadoutStatus = 1;
00818 else fReadoutStatus = 0;
00819 }
00820
00821 MSG("FarRunQuality",Msg::kDebug) << " HV STATUS: SM1=" << fHvStatusSM1 << " SM2=" << fHvStatusSM2 << " overall=" << fHvStatus << endl;
00822 MSG("FarRunQuality",Msg::kDebug) << " READOUT STATUS: " << fReadoutStatus << endl;
00823 }
00824 }
00825
00826 void FillFarRunQuality::EndSubRun()
00827 {
00828 MSG("FarRunQuality",Msg::kDebug) << " *** FillFarRunQuality::EndSubRun() *** " << endl;
00829
00830
00831
00832
00833
00834 if( fTimeFrames>0 ){
00835 Int_t oldtotal = 0;
00836 Int_t newtotal = 0;
00837 Int_t middletotal = (Int_t)(0.5*fTimeFrames);
00838
00839 for(Int_t i=0; i<1001; i++){
00840 oldtotal = newtotal;
00841 newtotal += fSnarlRates[i];
00842 if( oldtotal<=middletotal && middletotal<newtotal ){
00843 fSnarlRateMedian = (float)i - 0.5;
00844 if( newtotal-oldtotal>0 ){
00845 fSnarlRateMedian += (float)(middletotal-oldtotal)/(float)(newtotal-oldtotal);
00846 }
00847 }
00848 }
00849
00850 if( fSnarlRateMedian<fSnarlRateMin) fSnarlRateMedian=fSnarlRateMin;
00851 if( fSnarlRateMedian>fSnarlRateMax) fSnarlRateMedian=fSnarlRateMax;
00852
00853 fSnarlRateMean = ((float)(fSnarls))/((float)(fTimeFrames));
00854 }
00855
00856
00857
00858
00859 if( fTimeFrames>0 ){
00860 Int_t goodreadout = 0;
00861 Int_t badreadout = 0;
00862 for(Int_t i=0; i<=16; i++){
00863 if( i==16 ) goodreadout += fCrateRates[i];
00864 else badreadout += fCrateRates[i];
00865 }
00866
00867 Int_t cratemask = -1;
00868 Int_t maxcratemask = 16;
00869 if( ( goodreadout>0 )
00870 && ( goodreadout>60 || badreadout<60 ) ) maxcratemask=16;
00871 else maxcratemask = 15;
00872
00873 for(Int_t i=0; i<=maxcratemask; i++){
00874 if( fCrateRates[i]>0 ) cratemask = i;
00875 }
00876
00877 fCrateMask = cratemask;
00878 }
00879
00880
00881
00882
00883
00884
00885
00886
00887 fGoodRun = 0;
00888 if( ( fRun>=0 )
00889 && ( fPhysicsRun==1 && fTestRun==0 )
00890 && ( fCrateMask==16 )
00891 && ( fTimeFrames>=300 || (fSubRun>0 && fTimeFrames>120 ) )
00892 && ( fGoodSnarls>=100 && (double)fGoodSnarls/(double)fTimeFrames<30 )
00893 && ( fSnarlRateMedian<100 && fSnarlRateMax<300 ) ){
00894 fGoodRun = 1;
00895 }
00896
00897
00898
00899 MSG("FarRunQuality",Msg::kVerbose) << " *** FillFarRunQuality::PrintResults() *** " << endl;
00900
00901 MSG("FarRunQuality",Msg::kInfo) << endl
00902 << " RESULTS: " << endl
00903 << " ======= " << endl
00904 << " Run=" << fRun << endl
00905 << " SubRun=" << fSubRun << endl
00906 << " RunType=" << fRunType << endl
00907 << " RopMask=" << fRopMask << endl
00908 << " CrateMask=" << fCrateMask << endl
00909 << " TriggerMask=" << fTriggerMask << endl
00910 << " StartTime=" << fStartTime << endl
00911 << " EndTime=" << fEndTime << endl
00912 << " TimeFrames=" << fTimeFrames << endl
00913 << " Snarls=" << fSnarls << endl
00914 << " GoodSnarls=" << fGoodSnarls << endl
00915 << " MinSnarlRate=" << fSnarlRateMin << endl
00916 << " MaxSnarlRate=" << fSnarlRateMax << endl
00917 << " MeanSnarlRate=" << fSnarlRateMean << endl
00918 << " MedianSnarlRate=" << fSnarlRateMedian << endl
00919 << " PlaneTriggers=" << fTriggersPlane << endl
00920 << " EnergyTriggers=" << fTriggersEnergy << endl
00921 << " SpillTriggers=" << fTriggersSpill << endl
00922 << " SpillTriggersReal=" << fTriggersRealSpill << endl
00923 << " SpillTriggersFake=" << fTriggersFakeSpill << endl
00924 << " PhysicsRun=" << fPhysicsRun << endl
00925 << " ModifiedRun=" << fModifiedRun << endl
00926 << " TestRun=" << fTestRun << endl
00927 << " GoodRun=" << fGoodRun << endl;
00928
00929
00930
00931 this->WriteSubRun();
00932
00933 }
00934
00935 void FillFarRunQuality::WriteSubRun()
00936 {
00937 MSG("FarRunQuality",Msg::kDebug) << " *** FillFarRunQuality::WriteSubRun() *** " << endl;
00938
00939
00940
00941 if( fWriteOutResults ){
00942 fSource = 0;
00943 this->WriteOutResults();
00944 }
00945
00946
00947
00948 if( fWriteToDatabase ){
00949 this->WriteToDatabase();
00950 if( fWriteOutResults ){
00951 fSource = 1;
00952 this->WriteOutResults();
00953 }
00954 }
00955
00956
00957
00958 if( fReadFromDatabase ){
00959 this->ReadFromDatabase();
00960 if( fWriteOutResults ){
00961 fSource = 2;
00962 this->WriteOutResults();
00963 }
00964 }
00965
00966 }
00967
00968 void FillFarRunQuality::Reset()
00969 {
00970 MSG("FarRunQuality",Msg::kDebug) << " *** FillFarRunQuality::Reset() *** " << endl;
00971
00972 fTime = -1;
00973 fCounter = -1;
00974 fGoodCounter = 0;
00975 fHvStatus = -1;
00976 fHvStatusSM1 = -1;
00977 fHvStatusSM2 = -1;
00978 fReadoutStatus = -1;
00979 fTimeFrame = -1;
00980 fSource = -1;
00981 fRun = -1;
00982 fSubRun = -1;
00983 fRunType = -1;
00984 fRopMask = -1;
00985 fCrateMask = -1;
00986 fTriggerMask = -1;
00987 fStartTime = -1;
00988 fEndTime = -1;
00989 fTimeFrames = 0;
00990 fSnarls = 0;
00991 fGoodSnarls = 0;
00992 fSnarlRateMin = -1;
00993 fSnarlRateMax = -1;
00994 fSnarlRateMean = -999.9;
00995 fSnarlRateMedian = -999.9;
00996 fTriggersPlane = 0;
00997 fTriggersEnergy = 0;
00998 fTriggersSpill = 0;
00999 fTriggersRealSpill = 0;
01000 fTriggersFakeSpill = 0;
01001 fPhysicsRun = -1;
01002 fModifiedRun = -1;
01003 fTestRun = -1;
01004 fGoodRun = -1;
01005
01006 for(Int_t i=0; i<17; i++){ fCrateRates[i]=0; }
01007 for(Int_t i=0; i<1001; i++){ fSnarlRates[i]=0; }
01008 }