Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

FillFarRunQuality.cxx

Go to the documentation of this file.
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 // $Log $
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   // PROCESS RAW RECORD
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       // Get the raw header and extract validity context
00137       // Process the raw header (ProcessHeader)
00138       vldc = rawrec->GetRawHeader()->GetVldContext();
00139       this->ProcessHeader((TObject*)(rawrec->GetRawHeader()));
00140        
00141       // Iterate over the raw blocks in raw record
00142       // Process the raw block (ProcessBlock)
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 // JobCResult FillFarRunQuality::Ana(const MomNavigator *mom) 
00161 // {
00162 //   MSG("FarRunQuality",Msg::kInfo) << " *** FillFarRunQuality::Ana(...) *** " << endl;
00163 //
00164 //   return JobCResult::kPassed;
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   // process last subrun
00211   // ===================
00212   this->EndSubRun();
00213 
00214   // writing out file
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   // DAQ Header
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     // New Run/SubRun
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     // Record Run/SubRun
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     // Record RunType
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     // Record Time
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   // Snarl Header
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     // Record Trigger Type
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     // Count Good Snarls
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   // Header Block
00570   // ============
00571   if(obj->InheritsFrom("RawDaqHeaderBlock")){
00572     MSG("FarRunQuality",Msg::kDebug) << " ... found RawDaqHeaderBlock " << endl;
00573 
00575     // RawDaqHeaderBlock* rdb = (RawDaqHeaderBlock*)(obj); 
00576   }
00577 
00578   // Snarl Header Block
00579   // ==================
00580   if(obj->InheritsFrom("RawSnarlHeaderBlock")){
00581     MSG("FarRunQuality",Msg::kDebug) << " ... found RawSnarlHeaderBlock " << endl;
00582 
00584     // RawSnarlHeaderBlock* rdb = (RawSnarlHeaderBlock*)(obj);
00585   }
00586 
00587   // Run Configuration
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       // extract RopMask from run configuration
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       // extract TriggerMask from  run configuration
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     // convert RopMask into CrateMask
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       // (could record number of crates here)
00638       // fCrateMask = cratemask;
00639     }
00640 
00641     MSG("FarRunQuality",Msg::kDebug) << " RopMask=" << fRopMask << " TriggerMask=" << fTriggerMask << endl;
00642   }
00643 
00644   // Run Configuration Files
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     // MSG("FarRunQuality",Msg::kVerbose) << " RUN_CONFIG_FILE: " << config << endl;
00655   }
00656 
00657   // Run Start Block
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   // Singles Summary Block
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: // Crate only
00691         Detector = Detector::kUnknown;
00692         break;
00693       case 1: // Crate and VARC (VA)
00694         Detector = Detector::kFar;
00695         break;
00696       case 2: // Crate and VFB/ADCSEL (VA)
00697         Detector = Detector::kFar;
00698         break;
00699       case 3: // Crate and VACHIP (VA)
00700         Detector = Detector::kFar;
00701         break;
00702       case 4: // Crate and Plane
00703         Detector = Detector::kUnknown;
00704         break;
00705       case 5: // Crate and MASTER (QIE)
00706         Detector = Detector::kNear;
00707         break;
00708       case 6: // Crate and MINDER (QIE)
00709         Detector = Detector::kNear;
00710         break;
00711       case 7: // Crate and MENU (QIE)
00712         Detector = Detector::kNear;
00713         break;
00714       default:
00715         break;
00716     }
00717 
00718     // check source type
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     // Iterate over raw channels and record any hot/cold chips
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         // supermodule 1   
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         // supermodule 2
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     // record number of crates in readout
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     // analyse singles data
00797     if( sourcecheck ){
00798 
00799       // supermodule 1
00800       if( allchips1>0 ){
00801         if( coldchips1<maxchips ) fHvStatusSM1 = 1;
00802         else fHvStatusSM1 = 0;
00803       }
00804 
00805       // supermodule 2
00806       if( allchips2>0 ){
00807         if( coldchips2<maxchips ) fHvStatusSM2 = 1;
00808         else fHvStatusSM2 = 0;
00809       }
00810 
00811       // determine HV status
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       // determine readout status
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   // Calculate run quality parameters
00831   // ================================
00832 
00833   // calculate mean and median snarl rates
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   // determine cratemask (number of crates reading out)
00857   // for cratemask=16 (full readout), require:
00858   //   >60 secs "good readout" OR <60 secs "bad readout".
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   // determine whether this is a good run
00881   // physics runtype + no test bit set + full readout
00882   // run >= 300 seconds, subrun >= 120 seconds
00883   // good snarls >= 100
00884   // good snarl rate < 30 Hz
00885   // median snarl rate < 100 Hz
00886   // maximum snarl rate < 300 Hz
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   // print results
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   // write out results
00930   // =================
00931   this->WriteSubRun();
00932 
00933 }
00934 
00935 void FillFarRunQuality::WriteSubRun() 
00936 {
00937   MSG("FarRunQuality",Msg::kDebug) << " *** FillFarRunQuality::WriteSubRun() *** " << endl;
00938 
00939   // write results to file
00940   // =====================
00941   if( fWriteOutResults ){
00942     fSource = 0;
00943     this->WriteOutResults();
00944   }
00945 
00946   // write results to database
00947   // =========================
00948   if( fWriteToDatabase ){
00949     this->WriteToDatabase();
00950     if( fWriteOutResults ){
00951       fSource = 1;
00952       this->WriteOutResults();
00953     }
00954   }
00955     
00956   // read results from database
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 }

Generated on Mon Nov 23 05:26:46 2009 for loon by  doxygen 1.3.9.1