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

FillNearRunQuality.cxx

Go to the documentation of this file.
00001 #include "FillNearRunQuality.h"
00002 
00003 #include "RunQuality/DbuNearRunQuality.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/RawHeader.h"
00019 #include "RawData/RawDaqHeader.h"
00020 #include "RawData/RawDaqSnarlHeader.h"
00021 #include "RawData/RawDigit.h"
00022 #include "RawData/RawChannelId.h"
00023 #include "RawData/RawQieDigit.h"
00024 
00025 #include "RawData/RawDaqHeaderBlock.h"
00026 #include "RawData/RawSnarlHeaderBlock.h"
00027 #include "RawData/RawRunStartBlock.h"
00028 #include "RawData/RawRunEndBlock.h"
00029 #include "RawData/RawSubRunEndBlock.h"
00030 #include "RawData/RawTpSinglesSummaryBlock.h"
00031 #include "RawData/RawVarcErrorInTfBlock.h"
00032 #include "RawData/RawSpillServerMonitorBlock.h"
00033 #include "RawData/RawLiTpmtDigitsBlock.h"
00034 #include "RawData/RawLIAdcSummaryBlock.h"
00035 #include "RawData/RawDigitDataBlock.h"
00036 #include "RawData/RawRunConfigBlock.h"
00037 #include "RawData/RawConfigFilesBlock.h"
00038 
00039 #include "OnlineUtil/mdRunTypeCodes.h"
00040 #include "OnlineUtil/mdTriggerCodes.h"
00041 
00042 #include "Validity/VldContext.h"
00043 #include "Validity/VldTimeStamp.h"
00044 
00045 #include <cmath>
00046 
00047 //
00048 // $Log $
00049 //
00050 
00051 ClassImp(FillNearRunQuality)
00052 
00053 CVSID("$Id: FillNearRunQuality.cxx,v 1.8 2009/11/17 13:34:32 blake Exp $");
00054 
00055 JOBMODULE(FillNearRunQuality,"FillNearRunQuality","FillNearRunQuality");
00056 
00057 //===========================================================
00058 // July 2009
00059 // Questions / Complaints : 
00060 // mitchell@hep.phy.cam.ac.uk
00061 // g.lefeuvre@sussex.ac.uk
00062 // blake@hep.phy.cam.ac.uk
00063 //===========================================================
00064 
00065 FillNearRunQuality::FillNearRunQuality() :
00066 
00067   NbConnMindersSpec(50),
00068   NbConnMenusSpec(800),
00069   NbConnMindersCal(528),
00070   NbConnMenusCal(8448),
00071 
00072   fDbiTaskNear(1),
00073 
00074   fWriteOutDatabaseVariables(0),
00075   fWriteToDatabase(0),
00076   fReadFromDatabase(0),
00077   fDatabaseFile(0),
00078   fDatabaseTree(0),
00079   fName(""),
00080   fOutputLocation("."),
00081 
00082   fCapidErrorCut(100),
00083   fParityErrorCut(10),
00084   fMiscountErrorCut(10),
00085   fPriorTruncErrorCut(10),
00086   fSameMenuErrorCut(30),
00087   fSharedMinderErrorCut(10),
00088   fTransfMinderErrorCut(10),
00089   fHighAdcCut(1000),
00090   fHotLimitCal(1000),
00091   fHotLimitSpec(1000),
00092   fColdLimitCal(1),
00093   fColdLimitSpec(20),
00094   
00095   fTimeframeArrayCounter(30),
00096 
00097   fRecCounter(0),
00098   fCounter(-1),
00099   fGoodCounter(0),
00100   fSnarls(0),
00101   fGoodSnarls(0),
00102   fTimeFrames(0),
00103   fSnarlRateMin(-1),
00104   fSnarlRateMax(-1),
00105   fSnarlRateMean(-999.9),
00106   fSnarlRateMedian(-999.9),
00107   fTriggersPlane(0),
00108   fTriggersActivity(0),
00109   fTriggersSpill(0),
00110 
00111   fRun(-1),
00112   fSubRun(-1),
00113   fRunType(-1),
00114   fTime(-1),
00115   fTimeFrame(-1),
00116   fSnarl(0),
00117   fTrigSrc(-1),
00118   fDigits(-1),
00119   fPhysicsRun(-1),
00120   fModifiedRun(-1),
00121   fTestRun(-1),
00122   fStartTime(-1),
00123   fEndTime(-1),
00124   fSubrunLength(-1),
00125 
00126   fTrigBaseTime(-1),
00127   fTrigTime(-1),
00128   fRopMask(-1),
00129   fTriggerMask(-1),
00130   fRate(-1),
00131   fCrate(-1), 
00132   fMaster(-1),
00133   fMinder(-1),
00134   fMenu(-1),
00135   fNearReadoutInt(-1),
00136 
00137   fAdc(-1),
00138   fTdc(-1),
00139   fDeltatdc(-1),
00140   fCratet0sec(-1),
00141   fCratet0nsec(-1),
00142   fDatatype(-1),
00143   fErrorcode(-1),
00144 
00145   fMinTdc(0),
00146   fMaxTdc(0),
00147   
00148   fNbCratesReadout(0),
00149   fNTimeframesBadCrates(0),
00150   fMaxNbColdMindersCal(0),
00151   fMaxNbColdMindersSpec(0),
00152   fMaxNbColdCrates(0),
00153   fMaxNbColdMenusCal(0),
00154   fMaxNbColdMenusSpec(0),
00155   fMaxNbHotMenusSpec(0),
00156   fMaxNbHotMenusCal(0),
00157   fTimeCountMaxHotMenusSpec(0),
00158   fTimeCountMaxHotMenusCal(0),
00159   fTimeCountMaxColdMenusSpec(0),
00160   fTimeCountMaxColdMenusCal(0),
00161   fTimeCountMaxColdMindersSpec(0),
00162   fTimeCountMaxColdMindersCal(0),
00163 
00164   fNbLIChan(0),
00165   fLIRate(0.),
00166   fHighAdcSpec(0),
00167   fHighAdcCal(0),
00168   fNbCapidSpec(0),
00169   fNbCapidCal(0),
00170   fNbParitySpec(0),
00171   fNbParityCal(0),
00172   fNbMisCountSpec(0),
00173   fNbMisCountCal(0),
00174   fNbPriorityTruncSpec(0),
00175   fNbPriorityTruncCal(0),
00176   fNbSameMenuSpec(0),
00177   fNbSameMenuCal(0),
00178   fNbSharedMinderSpec(0),
00179   fNbSharedMinderCal(0),
00180   fNbTransferMinderSpec(0),
00181   fNbTransferMinderCal(0),
00182 
00183   fReadWrite(-1)
00184 {
00185   MSG("FillNearRunQuality",Msg::kDebug) << " *** FillNearRunQuality::FillNearRunQuality() *** " << endl;
00186   
00187   arrayTimeCountColdMindersSpec = new Int_t[NbConnMindersSpec];
00188   arrayTimeCountColdMenusSpec = new Int_t[NbConnMenusSpec];
00189   arrayTimeCountColdMindersCal = new Int_t[NbConnMindersCal];
00190   arrayTimeCountColdMenusCal = new Int_t[NbConnMenusCal];
00191   arrayTimeCountHotMenusSpec = new Int_t[NbConnMenusSpec];
00192   arrayTimeCountHotMenusCal = new Int_t[NbConnMenusCal];
00193 
00194   fSnarlRates = new Int_t[1001];
00195 
00196   fNearReadout = new NearReadout();
00197 
00198   this->Reset();
00199 }
00200 
00201 //===========================================================
00202 FillNearRunQuality::~FillNearRunQuality()
00203 {
00204   MSG("FillNearRunQuality",Msg::kDebug) << " *** FillNearRunQuality::~FillNearRunQuality() *** " << endl;
00205 
00206   delete[] fSnarlRates;
00207   if(fNearReadout) delete fNearReadout;
00208   delete[] arrayTimeCountColdMindersSpec;
00209   delete[] arrayTimeCountColdMenusSpec;
00210   delete[] arrayTimeCountColdMindersCal;
00211   delete[] arrayTimeCountColdMenusCal;
00212   delete[] arrayTimeCountHotMenusSpec;
00213   delete[] arrayTimeCountHotMenusCal;
00214 }
00215 
00216 //===========================================================
00217 void FillNearRunQuality::BeginJob()
00218 {
00219   MSG("FillNearRunQuality",Msg::kInfo) << " *** FillNearRunQuality::BeginJob() *** " << endl;
00220 }
00221 
00222 //===========================================================
00223 JobCResult FillNearRunQuality::Ana(const MomNavigator *mom) 
00224 {
00225   MSG("FillNearRunQuality",Msg::kDebug) << " *** FillNearRunQuality::Ana(...) [" << fRecCounter << "] *** " << endl;
00226 
00227   JobCResult result(JobCResult::kPassed);
00228 
00229   VldContext vldc;
00230   TObject* momobject = 0;
00231   Bool_t   foundit   = 0;
00232 
00233   // ===================
00234   // PROCESS RAW RECORDS
00235   // ===================
00236   // Iterate over raw records in mom and extract
00237   // monitoring information from raw data blocks
00238 
00239   TIter momitr(mom->FragmentIter());
00240   while( (momobject = momitr()) ){
00241     if(momobject->InheritsFrom("RawRecord")){
00242       foundit = 1;
00243       fRecCounter++;
00244       MSG("FillNearRunQuality",Msg::kDebug) << "  *** RAW RECORD [" << fRecCounter << "] ***  " << endl;
00245       RawRecord* rawrec = dynamic_cast<RawRecord*>(momobject);
00246 
00247       // Get the raw header and extract validity context
00248       vldc = rawrec->GetRawHeader()->GetVldContext();
00249       this->ProcessHeader((TObject*)(rawrec->GetRawHeader()));
00250 
00251       // Iterate over the raw blocks in raw record
00252       // [Only analyse raw blocks for physics runs]
00253       TIter rawrecitr = rawrec->GetRawBlockIter();
00254       TObject* tob = 0;
00255       while((tob = rawrecitr())){
00256         MSG("FillNearRunQuality",Msg::kDebug) << " " << tob->GetName() << endl;
00257         if( fPhysicsRun>0 ) this->ProcessBlock(tob);
00258       }
00259     }
00260   }
00261 
00262   if (!foundit){
00263     MSG("FillNearRunQuality", Msg::kWarning) << "  *** FAILED TO FIND RAW RECORD ***  " << endl;
00264     return result.SetFailed();
00265   }
00266 
00267   MSG("FillNearRunQuality",Msg::kDebug) << " *** FillNearRunQuality::Ana( ) FINISHED *** " << endl;
00268   return result;
00269 
00270 }
00271 
00272 //===========================================================
00273 void FillNearRunQuality::EndJob() 
00274 {
00275   MSG("FillNearRunQuality",Msg::kInfo) << " *** FillNearRunQuality::EndJob() *** " << endl;
00276 
00277   this->EndSubRun();
00278 
00279   if (fWriteOutDatabaseVariables) this->WriteOutFile();
00280 
00281   this->Reset();
00282 
00283 }
00284 
00285 //===========================================================
00286 const Registry& FillNearRunQuality::DefaultConfig() const
00287 {
00288   MSG("FillNearRunQuality",Msg::kDebug) << " *** FillNearRunQuality::DefaultConfig() *** " << endl;
00289 
00290   static Registry r;
00291   r.SetName("FillNearRunQuality.config.default");
00292   r.UnLockValues();
00293   r.Set("DbiTaskNear",fDbiTaskNear);
00294   r.Set("WriteOutDatabaseVariables",fWriteOutDatabaseVariables);
00295   r.Set("WriteToDatabase", fWriteToDatabase);
00296   r.Set("ReadFromDatabase", fReadFromDatabase);
00297   r.Set("CapidErrorCut",fCapidErrorCut);
00298   r.Set("ParityErrorCut",fParityErrorCut);
00299   r.Set("MiscountErrorCut",fMiscountErrorCut);
00300   r.Set("PriorTruncErrorCut",fPriorTruncErrorCut);
00301   r.Set("SameMenuErrorCut",fSameMenuErrorCut);
00302   r.Set("SharedMinderErrorCut",fSharedMinderErrorCut);
00303   r.Set("TransfMinderErrorCut",fTransfMinderErrorCut);
00304   r.Set("CalorimeterHotChannelLimit",fHotLimitCal);
00305   r.Set("SpectrometerHotChannelLimit",fHotLimitSpec);
00306   r.Set("CalorimeterColdChannelLimit",fColdLimitCal);
00307   r.Set("SpectrometerColdChannelLimit",fColdLimitSpec);
00308   r.Set("HighAdcCut",fHighAdcCut);
00309   r.Set("Name",fName.Data());
00310   r.Set("OutputLocation",fOutputLocation.Data());
00311   r.Set("TimeframeCounter",fTimeframeArrayCounter);
00312   r.LockValues();
00313 
00314   return r;
00315 }
00316 
00317 //===========================================================
00318 // Config used when parameters passed to this code in macro
00319 void FillNearRunQuality::Config(const Registry &r)
00320 {
00321   MSG("FillNearRunQuality",Msg::kDebug) << " *** FillNearRunQuality::Config() *** " << endl;
00322 
00323   Int_t tmpint; 
00324   const char* tmpchar = 0;
00325 
00326   if(r.Get("DbiTaskNear",tmpint)) fDbiTaskNear = tmpint;
00327   if(r.Get("WriteOutDatabaseVariables",tmpint)) fWriteOutDatabaseVariables = tmpint;
00328   if(r.Get("WriteToDatabase", tmpint)) fWriteToDatabase = tmpint;
00329   if(r.Get("ReadFromDatabase", tmpint)) fReadFromDatabase = tmpint;
00330   if(r.Get("CapidErrorCut",tmpint)) fCapidErrorCut = tmpint;
00331   if(r.Get("ParityErrorCut",tmpint)) fParityErrorCut = tmpint;
00332   if(r.Get("MiscountErrorCut",tmpint)) fMiscountErrorCut = tmpint;
00333   if(r.Get("PriorTruncErrorCut",tmpint)) fPriorTruncErrorCut = tmpint;
00334   if(r.Get("SameMenuErrorCut",tmpint)) fSameMenuErrorCut = tmpint;
00335   if(r.Get("SharedMinderErrorCut",tmpint)) fSharedMinderErrorCut = tmpint;
00336   if(r.Get("TransfMinderErrorCut",tmpint)) fTransfMinderErrorCut = tmpint;
00337   if(r.Get("HighAdcCut",tmpint)) fHighAdcCut = tmpint;
00338   if(r.Get("Name",tmpchar)) fName = tmpchar;
00339   if(r.Get("OutputLocation",tmpchar)) fOutputLocation = tmpchar;
00340   if(r.Get("CalorimeterHotChannelLimit",tmpint)) fHotLimitCal = tmpint;
00341   if(r.Get("SpectrometerHotChannelLimit",tmpint)) fHotLimitSpec = tmpint;
00342   if(r.Get("CalorimeterColdChannelLimit",tmpint)) fColdLimitCal = tmpint;
00343   if(r.Get("SpectrometerColdChannelLimit",tmpint)) fColdLimitSpec = tmpint;
00344   if(r.Get("TimeframeCounter",tmpint)) fTimeframeArrayCounter = tmpint;
00345   return;
00346 }
00347 //===========================================================
00348 void FillNearRunQuality::WriteToDatabase()
00349 {
00350   MSG("FillNearRunQuality",Msg::kDebug) << " *** FillNearRunQuality::WriteToDatabase() *** " << endl;
00351 
00352   DbiCascader& cascader = DbiTableProxyRegistry::Instance().GetCascader();
00353 
00354   // Create the table
00355   //=================
00356   if( !cascader.TableExists("DBUNEARRUNQUALITY") ){
00357     MSG("FillNearRunQuality",Msg::kDebug) << "    Creating temporary DBUNEARRUNQUALITY table " << endl;
00358 
00359     //change here
00360     string tableDescr = "(SEQNO int, RUN int, SUBRUN int, STARTTIME timestamp, ENDTIME timestamp, SUBRUNLENGTH int,  PHYSICSRUN int, MODIFIEDRUN int, TESTRUN int, TRIGGERSPLANE int, TRIGGERSACTIVITY int,  TRIGGERSSPILL int, ROPMASK int, TRIGGERMASK int, COLDCRATES int, COLDMINDERSSPEC int, COLDMENUSSPEC int, COLDMINDERSCAL int, COLDMENUSCAL int, HOTMENUSSPEC int, HOTMENUSCAL int, TIMECOUNTHOTMENUSSPEC int, TIMECOUNTHOTMENUSCAL int, TIMECOUNTCOLDMENUSSPEC int, TIMECOUNTCOLDMENUSCAL int, TIMECOUNTCOLDMINDERSSPEC int, TIMECOUNTCOLDMINDERSCAL int, LIRATE float, HIGHADCSPEC int, HIGHADCCAL int, NBCAPIDSPEC int, NBCAPIDCAL int, NBPARITYSPEC int, NBPARITYCAL int, NBMISCOUNTSPEC int, NBMISCOUNTCAL int, NBPRIORITYTRUNCSPEC int, NBPRIORITYTRUNCCAL int, NBSAMEMENUSPEC int, NBSAMEMENUCAL int, NBSHAREDMINDERSPEC int, NBSHAREDMINDERCAL int, NBTRANSFERMINDERSPEC int, NBTRANSFERMINDERCAL int, AVGLOW float, AVGHIGH float, AVGGATE float, SNARLRATEMIN int, SNARLRATEMAX int, SNARLRATEMEDIAN float, SNARLRATEMEAN float)";
00361 
00362     Int_t dbNoTempDb = cascader.CreateTemporaryTable("DBUNEARRUNQUALITY",tableDescr);
00363 
00364     MSG("FillNearRunQuality",Msg::kDebug) << "    DbNoTempDb=" << dbNoTempDb << endl;
00365   } 
00366 
00367 
00368   // The table exists, Create the entry
00369   //===================================
00370   if( cascader.TableExists("DBUNEARRUNQUALITY") ){
00371     MSG("FillNearRunQuality",Msg::kVerbose) << "    Writing to DBUNEARRUNQUALITY table... " << endl;
00372 
00373     this->PrepareRow();
00374 
00375     VldTimeStamp start(fStartTime,0);
00376     VldTimeStamp end(fEndTime+1,0);
00377     TString logentry("Run Quality (Run=");
00378     logentry+=fRun;
00379     logentry.Append("/");
00380     logentry+=fSubRun;
00381     logentry.Append(")");
00382 
00383     MSG("FillNearRunQuality",Msg::kVerbose) << "     run: " << fRun << "/" << fSubRun << endl; 
00384     MSG("FillNearRunQuality",Msg::kVerbose) << "     start time: " << start << endl;
00385     MSG("FillNearRunQuality",Msg::kVerbose) << "     end time: " << end << endl;
00386     MSG("FillNearRunQuality",Msg::kVerbose) << "     log entry: " << logentry.Data() << endl;
00387 
00388     VldRange range(Detector::kNear,SimFlag::kData,start,end,logentry.Data());
00389     
00390     DbuNearRunQuality row( fRunElements, start, end,
00391                            fMaxNbColdCrates, fMaxNbColdMindersSpec, fMaxNbColdMenusSpec,
00392                            fMaxNbColdMindersCal, fMaxNbColdMenusCal, fMaxNbHotMenusSpec,
00393                            fMaxNbHotMenusCal, fTimeCountMaxHotMenusSpec,
00394                            fTimeCountMaxHotMenusCal, fTimeCountMaxColdMenusSpec,
00395                            fTimeCountMaxColdMenusCal, fTimeCountMaxColdMindersSpec,
00396                            fTimeCountMaxColdMindersCal, fLIRate, fHighAdcSpec,
00397                            fHighAdcCal, fNbCapidSpec, fNbCapidCal,
00398                            fNbParitySpec, fNbParityCal, fNbMisCountSpec,
00399                            fNbMisCountCal, fNbPriorityTruncSpec,
00400                            fNbPriorityTruncCal, fNbSameMenuSpec,
00401                            fNbSameMenuCal, fNbSharedMinderSpec,
00402                            fNbSharedMinderCal, fNbTransferMinderSpec,
00403                            fNbTransferMinderCal, fAvgLow, fAvgHigh,
00404                            fAvgGate, fSnarlRateMin, fSnarlRateMax,
00405                            fSnarlRateMedian, fSnarlRateMean );
00406 
00407     fGoodRun = row.GetGoodRun(fDbiTaskNear);
00408 
00409     Int_t aggNo = row.GetAggregateNo();
00410     Dbi::Task task = fDbiTaskNear;
00411     VldTimeStamp creationDate;
00412 
00413     MSG("FillNearRunQuality",Msg::kVerbose) << "     aggNo: " << aggNo << " taskNo: " << task << endl;
00414 
00415     DbiWriter<DbuNearRunQuality> writer(range,aggNo,task,creationDate,0,logentry.Data());
00416     writer << row;
00417     writer.Close();
00418 
00419     MSG("FillNearRunQuality",Msg::kDebug) << endl
00420                                       << " WRITING RESULTS: " << endl
00421                                       << " =============== " << endl
00422                                       << " Run=" << fRun << endl
00423                                       << " SubRun=" << fSubRun << endl
00424                                       << " StartTime=" << fStartTime << endl
00425                                       << " EndTime=" << fEndTime << endl
00426                                       << " SubRunLength=" << fSubrunLength << endl
00427                                       << " PhysicsRun=" << fPhysicsRun << endl
00428                                       << " ModifiedRun=" << fModifiedRun << endl
00429                                       << " TestRun=" << fTestRun << endl
00430                                       << " PlaneTriggers=" << fTriggersPlane << endl
00431                                       << " TriggerActivity=" << fTriggersActivity<< endl
00432                                       << " SpillTriggers=" << fTriggersSpill << endl
00433                                       << " RopMask=" << fRopMask << endl
00434                                       << " TriggerMask=" << fTriggerMask << endl
00435                                       << " ColdCrates=" << fMaxNbColdCrates<< endl
00436                                       << " ColdMindersSpec=" << fMaxNbColdMindersSpec<< endl
00437                                       << " ColdMenusSpec=" << fMaxNbColdMenusSpec<< endl
00438                                       << " ColdMindersCal=" << fMaxNbColdMindersCal<< endl
00439                                       << " ColdMenusCal=" << fMaxNbColdMenusCal << endl
00440                                       << " HotMenusSpec=" << fMaxNbHotMenusSpec << endl
00441                                       << " HotMenusCal=" << fMaxNbHotMenusCal << endl
00442                                       << " TimeCountHotMenusSpec=" << fTimeCountMaxHotMenusSpec << endl
00443                                       << " TimeCountHotMenusCal=" << fTimeCountMaxHotMenusCal << endl
00444                                       << " TimeCountColdMenusSpec=" << fTimeCountMaxColdMenusSpec << endl
00445                                       << " TimeCountColdMenusCal=" << fTimeCountMaxColdMenusCal << endl
00446                                       << " TimeCountColdMindersSpec=" << fTimeCountMaxColdMindersSpec << endl
00447                                       << " TimeCountColdMindersCal=" << fTimeCountMaxColdMindersCal << endl
00448                                       << " LIRate=" << fLIRate << endl
00449                                       << " HighAdcSpec=" << fHighAdcSpec << endl
00450                                       << " HighAdcCal=" << fHighAdcCal << endl
00451                                       << " CapidSpec=" << fNbCapidSpec << endl
00452                                       << " CapidCal=" << fNbCapidCal << endl
00453                                       << " ParitySpec=" << fNbParitySpec << endl
00454                                       << " ParityCal=" << fNbParityCal << endl
00455                                       << " MisCountSpec=" << fNbMisCountSpec << endl
00456                                       << " MisCountCal=" << fNbMisCountCal << endl
00457                                       << " PriorityTruncSpec=" << fNbPriorityTruncSpec << endl
00458                                       << " PriorityTruncCal=" << fNbPriorityTruncCal << endl
00459                                       << " SameMenuSpec=" << fNbSameMenuSpec << endl
00460                                       << " SameMenuCal=" << fNbSameMenuCal << endl
00461                                       << " SharedMinderSpec=" << fNbSharedMinderSpec << endl      
00462                                       << " SharedMinderCal=" << fNbSharedMinderCal << endl
00463                                       << " TransferMinderSpec=" << fNbTransferMinderSpec << endl
00464                                       << " TransferMinderCal=" << fNbTransferMinderCal << endl
00465                                       << " AvgLow=" << fAvgLow << endl
00466                                       << " AvgHigh=" << fAvgHigh << endl
00467                                       << " AvgGate=" << fAvgGate << endl 
00468                                       << " MinSnarlRate=" << fSnarlRateMin << endl
00469                                       << " MaxSnarlRate=" << fSnarlRateMax << endl
00470                                       << " MedianSnarlRate=" << fSnarlRateMedian << endl
00471                                       << " MeanSnarlRate=" << fSnarlRateMean << endl                                              
00472                                       << " GoodRun=" << fGoodRun << endl;
00473   }
00474 }
00475 //===========================================================
00476 void FillNearRunQuality::ReadFromDatabase()
00477 {
00478   MSG("FillNearRunQuality",Msg::kDebug) << " *** FillNearRunQuality::ReadFromDatabase() *** " << endl;
00479 
00480   DbiCascader& cascader = DbiTableProxyRegistry::Instance().GetCascader();
00481 
00482   if( cascader.TableExists("DBUNEARRUNQUALITY") ){
00483     MSG("FillNearRunQuality",Msg::kVerbose) << "    Reading from DBUNEARRUNQUALITY table... " << endl;
00484     cout << "    Reading from DBUNEARRUNQUALITY table... " << endl;
00485     
00486     Int_t time = (Int_t)(0.5*((double)fStartTime+(double)fEndTime));
00487     VldTimeStamp timestamp(time,0);
00488     VldContext vldc(Detector::kNear,SimFlag::kData,timestamp);
00489     Dbi::Task task = fDbiTaskNear;
00490 
00491     DbiResultPtr<DbuNearRunQuality> resptr("DBUNEARRUNQUALITY",vldc,task);
00492 
00493     MSG("FillNearRunQuality",Msg::kVerbose) << "    Number Of Rows = " << resptr.GetNumRows() << endl;
00494 
00495     if( resptr.GetNumRows()>0 ){
00496       for( unsigned int i=0; i<resptr.GetNumRows(); i++){
00497         const DbuNearRunQuality* rowptr = resptr.GetRow(i);
00498         fRun = rowptr->GetRun();
00499         fSubRun = rowptr->GetSubRun();
00500         fStartTime = rowptr->GetStartTime().GetSec();
00501         fEndTime = rowptr->GetEndTime().GetSec(); 
00502         fSubrunLength = rowptr->GetSubrunLength();
00503         fPhysicsRun = rowptr->GetPhysicsRun();
00504         fModifiedRun = rowptr->GetModifiedRun();
00505         fTestRun = rowptr->GetTestRun();
00506         fTriggersPlane = rowptr->GetTriggersPlane();
00507         fTriggersActivity = rowptr->GetTriggersActivity();
00508         fTriggersSpill = rowptr->GetTriggersSpill();
00509         fRopMask = rowptr->GetRopMask();
00510         fTriggerMask = rowptr->GetTriggerMask();
00511         fMaxNbColdCrates = rowptr->GetColdCrates();
00512         fMaxNbColdMindersSpec = rowptr->GetColdMindersSpec();
00513         fMaxNbColdMenusSpec = rowptr->GetColdMenusSpec();
00514         fMaxNbColdMindersCal = rowptr->GetColdMindersCal();
00515         fMaxNbColdMenusCal = rowptr->GetColdMenusCal();
00516         fMaxNbHotMenusSpec = rowptr->GetHotMenusSpec();
00517         fMaxNbHotMenusCal = rowptr->GetHotMenusCal();
00518         fTimeCountMaxHotMenusSpec = rowptr->GetTimeCountHotMenusSpec();
00519         fTimeCountMaxHotMenusCal = rowptr->GetTimeCountHotMenusCal();
00520         fTimeCountMaxColdMenusSpec = rowptr->GetTimeCountColdMenusSpec();
00521         fTimeCountMaxColdMenusCal = rowptr->GetTimeCountColdMenusCal();
00522         fTimeCountMaxColdMindersSpec = rowptr->GetTimeCountColdMindersSpec();
00523         fTimeCountMaxColdMindersCal = rowptr->GetTimeCountColdMindersCal();
00524         fLIRate = rowptr->GetLIRate();
00525         fHighAdcSpec = rowptr->GetHighAdcSpec();
00526         fHighAdcCal = rowptr->GetHighAdcCal();
00527         fNbCapidSpec = rowptr->GetNbCapidSpec();
00528         fNbCapidCal = rowptr->GetNbCapidCal();
00529         fNbParitySpec = rowptr->GetNbParitySpec();
00530         fNbParityCal = rowptr->GetNbParityCal();
00531         fNbMisCountSpec = rowptr->GetNbMisCountSpec();
00532         fNbMisCountCal = rowptr->GetNbMisCountCal();
00533         fNbPriorityTruncSpec = rowptr->GetNbPriorityTruncSpec();
00534         fNbPriorityTruncCal = rowptr->GetNbPriorityTruncCal();
00535         fNbSameMenuSpec = rowptr->GetNbSameMenuSpec();
00536         fNbSameMenuCal = rowptr->GetNbSameMenuCal();
00537         fNbSharedMinderSpec = rowptr->GetNbSharedMinderSpec();
00538         fNbSharedMinderCal = rowptr->GetNbSharedMinderCal();
00539         fNbTransferMinderSpec = rowptr->GetNbTransferMinderSpec();
00540         fNbTransferMinderCal = rowptr->GetNbTransferMinderCal();
00541         fAvgLow = rowptr->GetAvgLow();
00542         fAvgHigh = rowptr->GetAvgHigh();
00543         fAvgGate = rowptr->GetAvgGate();
00544         fSnarlRateMin = rowptr->GetSnarlRateMin();
00545         fSnarlRateMax = rowptr->GetSnarlRateMax();
00546         fSnarlRateMedian = rowptr->GetSnarlRateMedian();
00547         fSnarlRateMean = rowptr->GetSnarlRateMean();
00548         fGoodRun = rowptr->GetGoodRun(fDbiTaskNear);
00549 
00550         MSG("FillNearRunQuality",Msg::kDebug) << endl
00551                                           << " READING RESULTS: " << endl
00552                                           << " =============== " << endl
00553                                           << " Run=" << fRun << endl
00554                                           << " SubRun=" << fSubRun << endl
00555                                           << " StartTime=" << fStartTime << endl
00556                                           << " EndTime=" << fEndTime << endl
00557                                           << " SubRunLength=" << fSubrunLength << endl
00558                                           << " PhysicsRun=" << fPhysicsRun << endl
00559                                           << " ModifiedRun=" << fModifiedRun << endl
00560                                           << " TestRun=" << fTestRun << endl
00561                                           << " PlaneTriggers=" << fTriggersPlane << endl
00562                                           << " TriggerActivity=" << fTriggersActivity<< endl
00563                                           << " SpillTriggers=" << fTriggersSpill << endl
00564                                           << " RopMask=" << fRopMask << endl
00565                                           << " TriggerMask=" << fTriggerMask << endl
00566                                           << " ColdCrates=" << fMaxNbColdCrates<< endl
00567                                           << " ColdMindersSpec=" << fMaxNbColdMindersSpec<< endl
00568                                           << " ColdMenusSpec=" << fMaxNbColdMenusSpec<< endl
00569                                           << " ColdMindersCal=" << fMaxNbColdMindersCal<< endl
00570                                           << " ColdMenusCal=" << fMaxNbColdMenusCal << endl
00571                                           << " HotMenusSpec=" << fMaxNbHotMenusSpec << endl
00572                                           << " HotMenusCal=" << fMaxNbHotMenusCal << endl
00573                                           << " TimeCountHotMenusSpec=" << fTimeCountMaxHotMenusSpec << endl
00574                                           << " TimeCountHotMenusCal=" << fTimeCountMaxHotMenusCal << endl
00575                                           << " TimeCountColdMenusSpec=" << fTimeCountMaxColdMenusSpec << endl
00576                                           << " TimeCountColdMenusCal=" << fTimeCountMaxColdMenusCal << endl
00577                                           << " TimeCountColdMindersSpec=" << fTimeCountMaxColdMindersSpec << endl
00578                                           << " TimeCountColdMindersCal=" << fTimeCountMaxColdMindersCal << endl
00579                                           << " LIRate=" << fLIRate << endl
00580                                           << " HighAdcSpec=" << fHighAdcSpec << endl
00581                                           << " HighAdcCal=" << fHighAdcCal << endl
00582                                           << " CapidSpec=" << fNbCapidSpec << endl
00583                                           << " CapidCal=" << fNbCapidCal << endl
00584                                           << " ParitySpec=" << fNbParitySpec << endl
00585                                           << " ParityCal=" << fNbParityCal << endl
00586                                           << " MisCountSpec=" << fNbMisCountSpec << endl
00587                                           << " MisCountCal=" << fNbMisCountCal << endl
00588                                           << " PriorityTruncSpec=" << fNbPriorityTruncSpec << endl
00589                                           << " PriorityTruncCal=" << fNbPriorityTruncCal << endl
00590                                           << " SameMenuSpec=" << fNbSameMenuSpec << endl
00591                                           << " SameMenuCal=" << fNbSameMenuCal << endl
00592                                           << " SharedMinderSpec=" << fNbSharedMinderSpec << endl      
00593                                           << " SharedMinderCal=" << fNbSharedMinderCal << endl
00594                                           << " TransferMinderSpec=" << fNbTransferMinderSpec << endl
00595                                           << " TransferMinderCal=" << fNbTransferMinderCal << endl
00596                                           << " AvgLow=" << fAvgLow << endl
00597                                           << " AvgHigh=" << fAvgHigh << endl
00598                                           << " AvgGate=" << fAvgGate << endl 
00599                                           << " MinSnarlRate=" << fSnarlRateMin << endl
00600                                           << " MaxSnarlRate=" << fSnarlRateMax << endl
00601                                           << " MedianSnarlRate=" << fSnarlRateMedian << endl
00602                                           << " MeanSnarlRate=" << fSnarlRateMean << endl                                          
00603                                           << " GoodRun=" << fGoodRun << endl;
00604       }
00605     }
00606   }
00607 }
00608 //===========================================================
00609 void FillNearRunQuality::PrepareRow()
00610 {
00611   MSG("FillNearRunQuality",Msg::kDebug) << " *** FillNearRunQuality::PrepareRow() *** " << endl;
00612 
00613   fRunElements[0] = fRun;
00614   fRunElements[1] = fSubRun;
00615   fRunElements[2] = fSubrunLength;
00616   fRunElements[3] = fPhysicsRun;
00617   fRunElements[4] = fModifiedRun;
00618   fRunElements[5] = fTestRun;
00619   fRunElements[6] = fTriggersPlane;
00620   fRunElements[7] = fTriggersActivity;
00621   fRunElements[8] = fTriggersSpill;
00622   fRunElements[9] = fRopMask;
00623   fRunElements[10] = fTriggerMask;
00624 }
00625 //===========================================================
00626 void FillNearRunQuality::ProcessHeader(TObject* obj)
00627 {
00628   MSG("FillNearRunQuality",Msg::kDebug) << "*** ProcessHeader *** " << endl;
00629 
00630   // DAQ HEADER
00631   // ==========
00632   if(obj->InheritsFrom("RawDaqHeader")){
00633     MSG("FillNearRunQuality",Msg::kDebug) << " ... found RawDaqHeader " << endl;
00634     RawDaqHeader* hdr = (RawDaqHeader*)(obj);
00635         
00636     Int_t time = hdr->GetVldContext().GetTimeStamp().GetSec();
00637     Int_t timeframe = hdr->GetTimeFrameNum();
00638     Int_t run       = hdr->GetRun();
00639     Int_t subrun    = hdr->GetSubRun();
00640     Int_t runtype   = hdr->GetRunType();
00641 
00642     // New Run/Subrun
00643     if(  (fRun >= 0 && fSubRun >= 0)
00644      && !(run == fRun && subrun == fSubRun)
00645      && !(run == fRun && fEndTime-fStartTime < 30) ) {
00646       MSG("FillNearRunQuality",Msg::kInfo) << "   closing: " << fRun << "/" << fSubRun << endl;
00647       this->EndSubRun();
00648       this->Reset();
00649     }
00650 
00651     // Record Run/Subrun
00652     if(fRun < 0 || fSubRun < 0){
00653        MSG("FillNearRunQuality",Msg::kInfo) << "   opening: " << run << "/" << subrun << endl;
00654        fRun = run;
00655        fSubRun = subrun;
00656        fRunType = runtype;
00657     }
00658 
00659     // Record Run Type
00660     if(fPhysicsRun < 0){
00661       if(fRun >= 0){
00662         fPhysicsRun = 0;
00663         fModifiedRun = 0;
00664         fTestRun = 0;
00665         if(fRunType >= 0){
00666           if( (fRunType == 2) ) fPhysicsRun = 1;
00667           if( (fRunType&RUN_TYPE_PHYSICS) == (RUN_TYPE_PHYSICS) ) fPhysicsRun = 1;
00668           if( (fRunType&RUN_TYPE_MASK_MODIFIED) == (RUN_TYPE_MASK_MODIFIED) ) fModifiedRun = 1;
00669           if( (fRunType&RUN_TYPE_MASK_TEST) == (RUN_TYPE_MASK_TEST) ) fTestRun = 1;
00670         }
00671       }
00672       MSG("FillNearRunQuality",Msg::kInfo) << "   physics run = " << fPhysicsRun << endl;
00673     }
00674 
00675     // Duration of subrun
00676     if(timeframe >= 0 && time != fTime){
00677       if(time > fTime){
00678         if(fStartTime < 0) fStartTime = time;
00679         if(fEndTime < time)  fEndTime = time;
00680         if(fCounter >= 0 ){
00681           if(fSnarlRateMin < 0 || fCounter < fSnarlRateMin) fSnarlRateMin = fCounter;
00682           if(fCounter > fSnarlRateMax) fSnarlRateMax = fCounter;
00683           if(fCounter > 1000) fCounter = 1000;
00684           fSnarls += fCounter;
00685           fGoodSnarls += fGoodCounter;
00686           fSnarlRates[fCounter]++;
00687           fTimeFrames++;
00688         }
00689       }
00690       fCounter = 0;
00691       fGoodCounter = 0;
00692       fTime = time;
00693       fTimeFrame = timeframe;
00694     }
00695 
00696     // Set Integration Limits for Timing Check
00697     Int_t limitRun = 7719; //set by D.Petyt on integration intervals of tdc spectra
00698     if (fRun < limitRun) {
00699       fLowCutoff = 0;
00700       fLow  = 20;
00701       fHigh = 540;
00702       fHighCutoff = 640;
00703     }
00704     else {
00705       fLowCutoff = 15;
00706       fLow  = 80;
00707       fHigh = 600;
00708       fHighCutoff = 700;
00709     }
00710   }
00711 
00712   // SNARL HEADER
00713   // ============
00714   if(obj->InheritsFrom("RawDaqSnarlHeader")){
00715     MSG("FillNearRunQuality",Msg::kDebug) << " ... found RawDaqSnarlHeader " << endl;
00716     RawDaqSnarlHeader* hdr = (RawDaqSnarlHeader*)(obj);
00717         
00718     fTrigSrc = hdr->GetTrigSrc();
00719     fSnarl   = hdr->GetSnarl(); 
00720     fDigits  = hdr->GetNumRawDigits();
00721 
00722     // Trigger Counters
00723     Bool_t good_trigger = 0;
00724     Bool_t plane_trigger = ( (fTrigSrc&TRIGGER_BIT_PLANE) == (TRIGGER_BIT_PLANE) );
00725     Bool_t activity_trigger = ( (fTrigSrc&TRIGGER_BIT_ACTIVITY) == (TRIGGER_BIT_ACTIVITY) );
00726     Bool_t spill_trigger = ( (fTrigSrc&TRIGGER_BIT_SPILL) == (TRIGGER_BIT_SPILL) );
00727 
00728     if(plane_trigger)   {good_trigger |= 1; fTriggersPlane++; }
00729     if(activity_trigger){good_trigger |= 1; fTriggersActivity++; }
00730     if(spill_trigger)   {good_trigger |= 1; fTriggersSpill++; }
00731 
00732     if(fCounter>=0){
00733       fCounter++;
00734       if (good_trigger) fGoodCounter++;
00735     }
00736   }
00737 }
00738 
00739 //===========================================================
00740 void FillNearRunQuality::ProcessBlock(TObject* obj)
00741 {
00742 
00743   MSG("FillNearRunQuality",Msg::kDebug) << "*** ProcessBlock *** " << endl;
00744 
00745   // SKIP NON-PHYSICS RUNS
00746   // =====================
00747   if( fPhysicsRun<=0 ){
00748     MSG("FillNearRunQuality",Msg::kDebug) << "    ProcessBlock : Not a physics run, RETURN" << endl;
00749     return;
00750   }
00751 
00752   // HEADER BLOCKS
00753   // =============
00754   if(obj->InheritsFrom("RawDaqHeaderBlock")){
00755     MSG("FillNearRunQuality",Msg::kDebug) << " ... found RawDaqHeaderBlock " << endl;
00756     RawDaqHeaderBlock* rdb = (RawDaqHeaderBlock*)(obj);
00757     fTrigBaseTime = rdb->GetVldContext().GetTimeStamp().GetNanoSec();
00758   }
00759 
00760   // SNARL HEADER BLOCK
00761   // ==================
00762   if(obj->InheritsFrom("RawSnarlHeaderBlock")){
00763     MSG("FillNearRunQuality",Msg::kDebug) << " ... found RawSnarlHeaderBlock " << endl;
00764     RawSnarlHeaderBlock* rdb = (RawSnarlHeaderBlock*)(obj);
00765     fTrigTime = rdb->GetTriggerTime().GetNanoSec();
00766   }
00767 
00768   // RUN CONFIGURATION BLOCK
00769   // =======================
00770   if(obj->InheritsFrom("RawRunConfigBlock")){
00771     MSG("FillNearRunQuality",Msg::kDebug) << " ... found RawRunConfigBlock " << endl;
00772     RawRunConfigBlock* rdb = (RawRunConfigBlock*)(obj);
00773 
00774     char* config;
00775     config = (char*)(rdb->GetRunConfig());
00776 
00777     MSG("FillNearRunQuality",Msg::kVerbose) << " RUN_CONFIG_BLOCK: " << config << endl;
00778     
00779     char* word;
00780     int ctr = 0;
00781     bool cont = 1;
00782     word = strtok(config,";");
00783 
00784     while( cont ){
00785       MSG("FillNearRunQuality",Msg::kVerbose) << " (" << ctr << ") " << word << endl;
00786 
00787       // extract RopMask from run configuration
00788       if( strstr(word,"ropIdMask#") ){
00789         if( (word = strchr(word,'=')) ){
00790           if( strlen(word)>1 ){
00791             word=&(word[1]); 
00792             MSG("FillNearRunQuality",Msg::kVerbose) << " word=" << word << endl;
00793             if( fRopMask<0 ) fRopMask = strtol(word,&word,0);
00794           }
00795         }
00796       }
00797 
00798       // extract TriggerMask from  run configuration
00799       if( strstr(word,"triggerMask#") ){
00800         if( (word = strchr(word,'=')) ){
00801           if( strlen(word)>1 ){
00802             word=&(word[1]); 
00803             MSG("FillNearRunQuality",Msg::kVerbose) << " word=" << word << endl;
00804             if( fTriggerMask<0 ) fTriggerMask = strtol(word,&word,0);
00805           }
00806         }
00807       }
00808 
00809       cont = ( word = strtok(0,";") );
00810       ctr++;
00811     }
00812 
00813     // convert RopMask into CrateMask
00814     if( fRopMask>=0 ){
00815       Int_t cratemask = 0;
00816       for( Int_t n=0; n<16; n++){
00817         Int_t nbit = ( 1 << n );
00818         if( (fRopMask&nbit)==(nbit) ) cratemask++;
00819       }
00820       // (could record number of crates here)
00821       //fCrateMask = cratemask;
00822     }
00823 
00824     MSG("FillNearRunQuality",Msg::kDebug) << " RopMask=" << fRopMask << " TriggerMask=" << fTriggerMask << endl;
00825   }
00826 
00827   // RUN CONFIGURATION FILES
00828   // =======================
00829   if(obj->InheritsFrom("RawConfigFilesBlock")){
00830     MSG("FillNearRunQuality",Msg::kDebug) << " ... found RawConfigFilesBlock " << endl;
00831     RawConfigFilesBlock* rdb = (RawConfigFilesBlock*)(obj);
00832 
00833     char* config;
00834     config = (char*)(rdb->GetConfigFile()); 
00835 
00837     // MSG("FillNearRunQuality",Msg::kVerbose) << " RUN_CONFIG_FILE: " << config << endl;
00838   }
00839 
00840   // MONITORING BLOCKS
00841   // =================
00842   if(obj->InheritsFrom("RawTpSinglesSummaryBlock")){
00843 
00844     MSG("FillNearRunQuality",Msg::kDebug) << " ... found RawTpSinglesSummaryBlock " << endl;
00845     RawTpSinglesSummaryBlock* rdb = (RawTpSinglesSummaryBlock*)(obj);
00846     
00847     Int_t source = rdb->GetSource();
00848     Int_t sourcecheck = 0;
00849   
00850     Detector::Detector_t Detector = Detector::kUnknown;
00851     
00852     switch( source ){
00853     case 0: // Crate only
00854       Detector = Detector::kUnknown;
00855       break;
00856     case 1: // Crate and VARC (VA)
00857       Detector = Detector::kFar;
00858       break;
00859     case 2: // Crate and VFB/ADCSEL (VA)
00860       Detector = Detector::kFar;
00861       break;
00862     case 3: // Crate and VACHIP (VA)
00863       Detector = Detector::kFar;
00864       break;
00865     case 4: // Crate and Plane
00866       Detector = Detector::kUnknown;
00867       break;
00868     case 5: // Crate and MASTER (QIE)
00869       Detector = Detector::kNear;
00870       break;
00871     case 6: // Crate and MINDER (QIE)
00872       Detector = Detector::kNear;
00873       break;
00874     case 7: // Crate and MENU (QIE)
00875       Detector = Detector::kNear;
00876       sourcecheck = 1;
00877       break;
00878     default:
00879       break;
00880     }
00881     
00882     Int_t nbhotmenuscal = 0;
00883     Int_t nbhotmenusspec = 0;
00884 
00885     //Clear arrays to hold minders for this timeframe
00886     for(int i=0;i<8;i++){
00887       for(int j=0;j<16;j++){
00888         for(int k=0;k<8;k++){
00889           arrayColdMindersCal[i][j][k] = 0;
00890           arrayColdMindersSpec[i][j][k] = 0;
00891         }
00892       }
00893     }
00894     
00895     
00896     //Iterate over crates for crate rates
00897     fNbCratesReadout = 0;                     
00898     Int_t ncrates = rdb->GetNumberOfCrates();
00899 
00900     for(int i=0;i<ncrates;i++){
00901       Int_t craterate = rdb->GetHitsPerSecByCrate(i);
00902       if(craterate>0) fNbCratesReadout++;
00903     }
00904 
00905     
00906     // Iterate over raw channels for minders on/off per timeframe
00907     typedef std::map<RawChannelId,UInt_t> RCIdToRateMap;
00908     const RCIdToRateMap& rates = rdb->GetRates();
00909     RCIdToRateMap::const_iterator rateItr = rates.begin();
00910     RCIdToRateMap::const_iterator rateEnd = rates.end();
00911     
00912 
00913     //Perform the iteration
00914     //---------------------
00915     while(rateItr != rateEnd){
00916 
00917       RawChannelId rawch = rateItr->first;
00918       Int_t rawrate = rateItr->second;
00919       fRate   = rawrate;
00920       fCrate  = rawch.GetCrate();
00921       fMaster = rawch.GetMaster();
00922       fMinder = rawch.GetMinder();
00923       fMenu   = rawch.GetMenu();      
00924 
00925       fNearReadoutInt = fNearReadout->ConnectedMinder(fCrate,fMaster,fMinder);
00926 
00927       if(fCrate>1) fInstrumType = kCalorimeter;
00928       else if(fCrate<2) fInstrumType = kSpectrometer;
00929       else fInstrumType = kError;
00930             
00931       if(fNearReadoutInt==1){
00932 
00933         //Cold Channels
00934         //-------------
00935         if( (fInstrumType == kCalorimeter) && fRate < fColdLimitCal){        
00936           arrayColdMindersCal[fCrate][fMaster-9][fMinder]++;
00937         }
00938         if( (fInstrumType == kSpectrometer) && fRate < fColdLimitSpec){
00939           arrayColdMindersSpec[fCrate][fMaster-9][fMinder]++;
00940         }
00941         
00942         //Hot Channels
00943         //------------  
00944         if( (fInstrumType == kCalorimeter) && fRate>fHotLimitCal){
00945           nbhotmenuscal++;
00946         }  
00947         if( (fInstrumType == kSpectrometer) && fRate>fHotLimitSpec){
00948           nbhotmenusspec++;
00949         }
00950       }  
00951       rateItr++;
00952     }
00953 
00954     //Check crate readout status, if fewer than 8 set to bad
00955     if(fNbCratesReadout < 8){
00956       fNTimeframesBadCrates++;
00957     }
00958     
00959     if(( 8-fNbCratesReadout) > fMaxNbColdCrates) fMaxNbColdCrates = (8-fNbCratesReadout);
00960 
00961     
00962     Int_t nboffminders = 0;
00963     Int_t nboffchannelstotal = 0;
00964    
00965     //CALORIMETER
00966     //===========
00967     for(int i=0;i<8;i++){
00968       for(int j=0;j<16;j++){
00969         for(int k=0;k<8;k++){
00970           Int_t offchannels = arrayColdMindersCal[i][j][k];
00971           if(offchannels > 15) nboffminders++;
00972           nboffchannelstotal += offchannels;
00973         }
00974       }
00975     }
00976       
00977     if(nboffminders > fMaxNbColdMindersCal) fMaxNbColdMindersCal = nboffminders;
00978     if(nboffchannelstotal > fMaxNbColdMenusCal) fMaxNbColdMenusCal = nboffchannelstotal;
00979     arrayTimeCountColdMenusCal[nboffchannelstotal]++;
00980     arrayTimeCountColdMindersCal[nboffminders]++;
00981 
00982     if(nbhotmenuscal > fMaxNbHotMenusCal) fMaxNbHotMenusCal = nbhotmenuscal;
00983     arrayTimeCountHotMenusCal[nbhotmenuscal]++;  
00984 
00985 
00986     //SPECTROMETER
00987     //============
00988     nboffminders = 0;
00989     nboffchannelstotal = 0;
00990       
00991     for(int i=0;i<8;i++){
00992       for(int j=0;j<16;j++){
00993         for(int k=0;k<8;k++){
00994           Int_t offchannels = arrayColdMindersSpec[i][j][k];
00995           if(offchannels > 15) nboffminders++;
00996           nboffchannelstotal += offchannels;
00997         }
00998       }
00999     }
01000 
01001     if(nboffminders > fMaxNbColdMindersSpec) fMaxNbColdMindersSpec = nboffminders;
01002     if(nboffchannelstotal > fMaxNbColdMenusSpec) fMaxNbColdMenusSpec = nboffchannelstotal;
01003     arrayTimeCountColdMenusSpec[nboffchannelstotal]++;
01004     arrayTimeCountColdMindersSpec[nboffminders]++;
01005 
01006     if(nbhotmenusspec > fMaxNbHotMenusSpec) fMaxNbHotMenusSpec = nbhotmenusspec;
01007     arrayTimeCountHotMenusSpec[nbhotmenusspec]++;  
01008 
01009   } //END OF TPSINGLESBLOCK***
01010   
01011 
01012   // RAW DATA BLOCKS
01013   // ===============
01014   if(obj->InheritsFrom("RawDigitDataBlock")){
01015     MSG("FillNearRunQuality",Msg::kDebug) << " ... found RawDigitDataBlock " << endl;
01016     RawDigitDataBlock* rdb = (RawDigitDataBlock*)(obj);
01017 
01018     // Min and Max TDC
01019     // ===============
01020     //1055 buckets <=> ~20 microsec, normal max length of time window
01021     TIter digitr0 = rdb->GetDatumIter();
01022     Int_t tdc;
01023     Int_t mintdc = 100000000;
01024     Int_t maxtdc = 0;
01025     while(RawDigit *rd = (RawDigit*)(digitr0())){
01026       if (rd){
01027         tdc = (Int_t)(rd->GetTDC());
01028         if( tdc<mintdc ) mintdc = tdc;
01029         if( tdc>maxtdc ) maxtdc = tdc;
01030       }
01031     }
01032     fMinTdc = mintdc;
01033     fMaxTdc = maxtdc;
01034 
01035     // Iterate over raw digits
01036     // =======================    
01037     TIter digitr = rdb->GetDatumIter();
01038     while(RawDigit *rd = (RawDigit*)(digitr())){
01039       if(rd){
01040         // Get the data
01041         RawChannelId rawch = (RawChannelId)(rd->GetChannel());
01042         fCrate  = rawch.GetCrate();
01043         fMaster = rawch.GetMaster();
01044         fMinder = rawch.GetMinder();
01045         fMenu   = rawch.GetMenu();      
01046 
01047         fAdc = (Int_t)(rd->GetADC());
01048         fTdc = (Int_t)(rd->GetTDC());
01049         fErrorcode = (Int_t)(rd->GetErrorCode());
01050         fDeltatdc  = fTdc - fMinTdc; 
01051 
01052         fCratet0sec  = rd->GetCrateT0().GetSec();
01053         fCratet0nsec = rd->GetCrateT0().GetNanoSec();
01054         fDatatype    = rd->GetDataType();
01055 
01056         // Check the readout map
01057         fNearReadoutInt = fNearReadout->ConnectedMinder(fCrate,fMaster,fMinder);
01058 
01059         // ADC Rates
01060         if( (fAdc>100) && (fTrigSrc==65536) )  vAverageAdc[fCrate][fMaster-8][fMinder][fMenu] += fAdc;
01061 
01062         // LI TPMT hits show up in 0-16-0 (65536d = 16b = sgate trigger)
01063         if ( fTrigSrc==65536 &&  fCrate==0 && fMaster==16 && fMinder==0 ) fNbLIChan++;
01064 
01065         // Error counters
01066         if( (fErrorcode&0x01)==RawQieDigit::kParityError)  vParityChannel[fCrate][fMaster-8][fMinder][fMenu]++;
01067         if( (fErrorcode&0x02)==RawQieDigit::kCapIdError)   vCapidChannel[fCrate][fMaster-8][fMinder][fMenu]++;
01068         if( (fErrorcode&0x04)==RawQieDigit::kMisCountError) vMisCntChannel[fCrate][fMaster-8][fMinder][fMenu]++;
01069         if( (fErrorcode&0x08)==RawQieDigit::kPriorityTruncate) vPrTruncChannel[fCrate][fMaster-8][fMinder][fMenu]++;
01070         if( (fErrorcode&0x10)==RawQieDigit::kCapIdSameMenuError) vCapMenuChannel[fCrate][fMaster-8][fMinder][fMenu]++;
01071         if( (fErrorcode&0x20)==RawQieDigit::kCapIdSharedMinderError) vCapMindChannel[fCrate][fMaster-8][fMinder][fMenu]++;
01072         if( (fErrorcode&0x40)==RawQieDigit::kTransferSharedMinderError) vTransferChannel[fCrate][fMaster-8][fMinder][fMenu]++;
01073 
01074         // Timing counters, only for SGATE trigger (Reduce noise w/ cut on ADC)
01075         if ( (fTrigSrc==65536) && (fAdc>300) ){
01076           if ( fDeltatdc >= fLowCutoff
01077             && fDeltatdc < fLow ) cntLow++;
01078           else if ( fDeltatdc >= fLow 
01079                  && fDeltatdc < fHigh ) cntGate++;
01080           else if ( fDeltatdc >= fHigh
01081                  && fDeltatdc < fHighCutoff ) cntHigh++;
01082         }
01083       }
01084     }
01085   }  
01086   return;
01087 }
01088 
01089 //===========================================================
01090 void FillNearRunQuality::EndSubRun()
01091 {
01092   MSG("FillNearRunQuality",Msg::kInfo) << " *** FillNearRunQuality::EndSubRun() *** " << endl;
01093   MSG("FillNearRunQuality",Msg::kDebug) << "... EndSubRun : Calculate subrun variables..." << endl;
01094 
01095   // Abort non-physics runs
01096   // ======================
01097   if( fPhysicsRun<=0 ){
01098     MSG("FillNearRunQuality",Msg::kInfo) << "    EndSubRun : Not a physics run, RETURN" << endl;
01099     return;
01100   }
01101 
01102   // Duration of Subrun
01103   //===================
01104   fSubrunLength = fEndTime - fStartTime;
01105   MSG("FillNearRunQuality",Msg::kInfo) << endl << " SUBRUN DURATION   : " << fSubrunLength << " s." << endl;
01106 
01107   // Mean and median snarl rates
01108   //============================
01109   if(fTimeFrames > 0){
01110     Int_t oldtotal = 0;
01111     Int_t newtotal = 0;
01112     Int_t middletotal = (Int_t)(0.5*fTimeFrames);
01113   
01114     for(Int_t i=0; i<1001; i++){
01115       oldtotal = newtotal;
01116       newtotal += fSnarlRates[i];
01117       if( oldtotal<=middletotal && middletotal<newtotal ){
01118         fSnarlRateMedian = (float)i - 0.5;
01119         if( newtotal-oldtotal>0 )
01120           fSnarlRateMedian += (float)(middletotal-oldtotal)/(float)(newtotal-oldtotal);
01121       }
01122     }
01123     if(fSnarlRateMedian < fSnarlRateMin) fSnarlRateMedian=fSnarlRateMin;
01124     if(fSnarlRateMedian > fSnarlRateMax) fSnarlRateMedian=fSnarlRateMax;
01125     fSnarlRateMean = ((float)(fSnarls))/((float)(fTimeFrames));
01126     MSG("FillNearRunQuality",Msg::kInfo) << endl << " SNARL RATES SUMMARY " << endl
01127          << "  MIN  : " << fSnarlRateMin << endl
01128          << "  MED  : " << fSnarlRateMedian << endl
01129          << "  MEAN : " << fSnarlRateMean << endl
01130          << "  MAX  : " << fSnarlRateMax << endl;
01131   }
01132 
01133   // Trigger Rate
01134   //=============
01135   MSG("FillNearRunQuality",Msg::kInfo) << endl << " TRIGGER SUMMARY " << endl
01136        << "  SGATE Triggers    : " << fTriggersSpill << endl
01137        << "  Plane Triggers    : " << fTriggersPlane << endl
01138        << "  Activity Triggers : " << fTriggersActivity << endl
01139        << "  Total Snarls      : " << fSnarls << endl;
01140 
01141   // LI Variables
01142   //=============
01143   if (fSubrunLength > 0) fLIRate = (Float_t)fNbLIChan / fSubrunLength;
01144   else fLIRate = 0.;
01145   MSG("FillNearRunQuality",Msg::kDebug) << endl << " LI RATE " << endl
01146        << fNbLIChan << " hits in the subrun, making an averaged frequency of " << fLIRate << " Hz" << endl;
01147   
01148   // Error Variables - see Config methods for cut values
01149   // High ADC Values
01150   //====================================================
01151   Float_t avgadc = 0.;
01152   Float_t caperr = fCapidErrorCut * fSubrunLength;
01153   Float_t parerr = fParityErrorCut* fSubrunLength;
01154   Float_t miserr = fMiscountErrorCut* fSubrunLength;
01155   Float_t trcerr = fPriorTruncErrorCut* fSubrunLength;
01156   Float_t menerr = fSameMenuErrorCut* fSubrunLength;
01157   Float_t minerr = fSharedMinderErrorCut* fSubrunLength;
01158   Float_t trserr = fTransfMinderErrorCut* fSubrunLength;
01159 
01160   for(int i=0; i<8; ++i)
01161     for(int j=0; j<16; ++j)
01162       for(int k=0; k<8; ++k)
01163         for(int l=0; l<16; ++l){
01164           if(fTriggersSpill > 0) avgadc = (Float_t)vAverageAdc[i][j][k][l] / fTriggersSpill;
01165           if ( avgadc > fHighAdcCut )  
01166             { if (i<2) ++fHighAdcSpec; else ++fHighAdcCal; }
01167           if ( vCapidChannel[i][j][k][l] > caperr )  
01168             { if (i<2) ++fNbCapidSpec; else ++fNbCapidCal; }
01169           if ( vParityChannel[i][j][k][l] > parerr )   
01170             { if (i<2) ++fNbParitySpec; else ++fNbParityCal; }
01171           if ( vMisCntChannel[i][j][k][l] > miserr )   
01172             { if (i<2) ++fNbMisCountSpec; else ++fNbMisCountCal; }
01173           if ( vPrTruncChannel[i][j][k][l] > trcerr )  
01174             { if (i<2) ++fNbPriorityTruncSpec; else ++fNbPriorityTruncCal; }
01175           if ( vCapMenuChannel[i][j][k][l] > menerr )  
01176             { if (i<2) ++fNbSameMenuSpec; else ++fNbSameMenuCal; }
01177           if ( vCapMindChannel[i][j][k][l] > minerr )  
01178             { if (i<2) ++fNbSharedMinderSpec; else ++fNbSharedMinderCal; }
01179           if ( vTransferChannel[i][j][k][l] > trserr ) 
01180             { if (i<2) ++fNbTransferMinderSpec; else  ++fNbTransferMinderCal; }
01181         }
01182 
01183   MSG("FillNearRunQuality",Msg::kInfo) << endl << " ERROR SUMMARY" << endl
01184        << "  " << fNbCapidSpec+fNbCapidCal << " Channels with more than " 
01185        << fCapidErrorCut << " CAPID Errors" << endl
01186        << "  " << fNbParitySpec+fNbParityCal << " Channels with more than " 
01187        << fParityErrorCut << " Parity Errors." << endl
01188        << "  " << fNbMisCountSpec+fNbMisCountCal << " Channels with more than " 
01189        << fMiscountErrorCut << " MisCount Errors." << endl
01190        << "  " << fNbPriorityTruncSpec+fNbPriorityTruncCal << " Channels with more than " 
01191        << fPriorTruncErrorCut << " PriorityTruncate Errors." << endl
01192        << "  " << fNbSameMenuSpec+fNbSameMenuCal << " Channels with more than " 
01193        << fSameMenuErrorCut << " CapIdSameMenu Errors." << endl
01194        << "  " << fNbSharedMinderSpec+fNbSharedMinderCal << " Channels with more than " 
01195        << fSharedMinderErrorCut << " CapIdSharedMinder Errors." << endl
01196        << "  " << fNbTransferMinderSpec+fNbTransferMinderCal << " Channels with more than " 
01197        << fTransfMinderErrorCut << " TransferSharedMinder Errors." << endl;
01198 
01199   // Timing Variables
01200   //=================
01201   if( fLow-fLowCutoff>0 ) fAvgLow  = ((Float_t)cntLow)  / (fLow-fLowCutoff);
01202   if( fHighCutoff-fHigh>0 ) fAvgHigh = ((Float_t)cntHigh) / (fHighCutoff-fHigh);
01203   fAvgGate = ((Float_t)cntGate) / 520;   // 520 buckets = SGATE duration
01204   
01205 
01206   //Duration of Readout Problems
01207   //============================
01208   Int_t timeCounter = 0;
01209   
01210   //CALORIMETER
01211   //----------- 
01212   for(int i=(NbConnMenusCal-1);i>0;i--){
01213     timeCounter += arrayTimeCountColdMenusCal[i];    
01214     if(timeCounter>=fTimeframeArrayCounter){
01215       fTimeCountMaxColdMenusCal = i; break;} 
01216   }
01217   
01218   timeCounter = 0;
01219   for(int i=(NbConnMindersCal-1);i>0;i--){
01220     timeCounter += arrayTimeCountColdMindersCal[i];    
01221     if(timeCounter>=fTimeframeArrayCounter){fTimeCountMaxColdMindersCal = i; break;}
01222   }
01223 
01224   timeCounter = 0;
01225   for(int i=(NbConnMenusCal-1);i>0;i--){
01226     timeCounter += arrayTimeCountHotMenusCal[i];    
01227     if(timeCounter>=fTimeframeArrayCounter){
01228       fTimeCountMaxHotMenusCal = i; break;} 
01229   }
01230 
01231   //SPECTROMETER
01232   //------------
01233   timeCounter = 0;
01234   for(int i=(NbConnMenusSpec-1);i>0;i--){
01235     timeCounter += arrayTimeCountColdMenusSpec[i];    
01236     if(timeCounter>=fTimeframeArrayCounter){fTimeCountMaxColdMenusSpec = i; break;}
01237   }
01238 
01239   timeCounter = 0;
01240   for(int i=(NbConnMindersSpec-1);i>0;i--){
01241     timeCounter += arrayTimeCountColdMindersSpec[i];    
01242     if(timeCounter>=fTimeframeArrayCounter){fTimeCountMaxColdMindersSpec = i; break;}
01243   }
01244   
01245   timeCounter = 0;
01246   for(int i=799;i>0;i--){
01247     timeCounter += arrayTimeCountHotMenusSpec[i];    
01248     if(timeCounter>=fTimeframeArrayCounter){
01249       fTimeCountMaxHotMenusSpec = i; break;} 
01250   }
01251 
01252   this->WriteSubRun();
01253   return;
01254 }
01255 
01256 //===========================================================
01257 void FillNearRunQuality::WriteSubRun()
01258 {
01259   MSG("FillNearRunQuality",Msg::kInfo) << endl << " *** FillNearRunQuality::WriteSubRun() *** " << endl;
01260 
01261   //Write database variables in root file
01262   //=====================================
01263   if( fWriteOutDatabaseVariables ) {
01264     fReadWrite = 0;
01265     this->WriteOutDatabaseVariables();
01266     MSG("FillNearRunQuality",Msg::kDebug) << endl << "... EndSubRun : Write ROOT file... End." << endl;
01267   }
01268 
01269   // write results to database
01270   // =========================
01271   if( fWriteToDatabase ){
01272     this->WriteToDatabase();
01273     MSG("FillNearRunQuality",Msg::kDebug) << endl << "... EndSubRun : Write To Database... End." << endl;
01274     //if( fWriteOutDatabaseVariables ) {
01275     //  fReadWrite = 1;
01276     //  this->WriteOutDatabaseVariables();
01277     //}
01278   }
01279     
01280   // read results from database
01281   // ==========================
01282   if( fReadFromDatabase ){
01283     this->ReadFromDatabase();
01284     MSG("FillNearRunQuality",Msg::kDebug) << endl << "... EndSubRun : Read From Database... End." << endl;
01285     //if( fWriteOutDatabaseVariables ) {
01286     //  fReadWrite = 2;
01287     //  this->WriteOutDatabaseVariables();
01288     //}
01289   }
01290 
01291 }
01292 
01293 //===========================================================
01294 void FillNearRunQuality::WriteOutDatabaseVariables()
01295 {
01296   MSG("FillNearRunQuality",Msg::kInfo) << " *** FillNearRunQuality::WriteOutDatabaseVariables() *** " << endl; 
01297 
01298   if( !fDatabaseFile ){
01299     TDirectory* tmpd = gDirectory;
01300     TString filename(fOutputLocation.Data());
01301     filename.Append("/dataquality.databasevariables");
01302     if( fName.Length()>0 ){
01303       filename.Append(".");
01304       filename.Append(fName.Data());
01305     }
01306     filename.Append(".root");
01307     MSG("FillNearRunQuality",Msg::kInfo) << "   opening file: " << filename << endl;
01308     fDatabaseFile = new TFile(filename.Data(),"RECREATE");
01309     fDatabaseTree = new TTree("DatabaseVariables","DatabaseVariables");
01310     fDatabaseTree->SetAutoSave(100);
01311     fDatabaseTree->Branch("Run",&fRun,"Run/I");
01312     fDatabaseTree->Branch("Subrun",&fSubRun,"Subrun/I");
01313     fDatabaseTree->Branch("StartTime",&fStartTime,"StartTime/I");
01314     fDatabaseTree->Branch("EndTime",&fEndTime,"EndTime/I");
01315     fDatabaseTree->Branch("Duration",&fSubrunLength,"Duration/I");
01316     fDatabaseTree->Branch("PhysicsRun", &fPhysicsRun,"PhysicsRun/I");
01317     fDatabaseTree->Branch("ModifiedRun", &fModifiedRun,"ModifiedRun/I");
01318     fDatabaseTree->Branch("TestRun", &fTestRun,"TestRun/I");
01319     fDatabaseTree->Branch("TriggersPlane", &fTriggersPlane,"TriggersPlane/I");
01320     fDatabaseTree->Branch("TriggersActivity", &fTriggersActivity,"TriggersActivity/I");
01321     fDatabaseTree->Branch("TriggersSpill", &fTriggersSpill,"TriggersSpill/I");
01322     fDatabaseTree->Branch("RopMask",&fRopMask,"RopMask/I");
01323     fDatabaseTree->Branch("TriggerMask",&fTriggerMask,"TriggerMask/I");
01324     fDatabaseTree->Branch("ColdCrates",&fMaxNbColdCrates,"ColdCrates/I");
01325     fDatabaseTree->Branch("ColdMindersCal",&fMaxNbColdMindersCal,"ColdMindersCal/I");
01326     fDatabaseTree->Branch("ColdMindersSpec",&fMaxNbColdMindersSpec,"ColdMindersSpec/I");
01327     fDatabaseTree->Branch("ColdMenusCal",&fMaxNbColdMenusCal,"ColdMenusCal/I");
01328     fDatabaseTree->Branch("ColdMenusSpec",&fMaxNbColdMenusSpec,"ColdMenusSpec/I");
01329     fDatabaseTree->Branch("HotMenusCal",&fMaxNbHotMenusCal,"HotMenusCal/I");
01330     fDatabaseTree->Branch("HotMenusSpec",&fMaxNbHotMenusSpec,"HotMenusSpec/I");
01331     fDatabaseTree->Branch("TimeCountHotMenusSpec",&fTimeCountMaxHotMenusSpec,"TimeCountHotMenusSpec/I");
01332     fDatabaseTree->Branch("TimeCountHotMenusCal",&fTimeCountMaxHotMenusCal,"TimeCountHotMenusCal/I");
01333     fDatabaseTree->Branch("TimeCountColdMenusSpec",&fTimeCountMaxColdMenusSpec,"TimeCountColdMenusSpec/I");
01334     fDatabaseTree->Branch("TimeCountColdMenusCal",&fTimeCountMaxColdMenusCal,"TimeCountColdMenusCal/I");
01335     fDatabaseTree->Branch("TimeCountColdMindersSpec",&fTimeCountMaxColdMindersSpec,"TimeCountColdMindersSpec/I");
01336     fDatabaseTree->Branch("TimeCountColdMindersCal",&fTimeCountMaxColdMindersCal,"TimeCountColdMindersCal/I");
01337     fDatabaseTree->Branch("LIRate",&fLIRate,"LIRate/F");
01338     fDatabaseTree->Branch("HighAdcSpec",&fHighAdcSpec,"HighAdcSpec/I");
01339     fDatabaseTree->Branch("HighAdcCal",&fHighAdcCal,"HighAdcCal/I");
01340     fDatabaseTree->Branch("CapidSpec",&fNbCapidSpec,"CapidSpec/I");
01341     fDatabaseTree->Branch("CapidCal",&fNbCapidCal,"CapidCal/I");
01342     fDatabaseTree->Branch("ParitySpec",&fNbParitySpec,"ParitySpec/I");
01343     fDatabaseTree->Branch("ParityCal",&fNbParityCal,"ParityCal/I");
01344     fDatabaseTree->Branch("MiscountSpec",&fNbMisCountSpec,"MiscountSpec/I");
01345     fDatabaseTree->Branch("MiscountCal",&fNbMisCountCal,"MiscountCal/I");
01346     fDatabaseTree->Branch("PriorTruncSpec",&fNbPriorityTruncSpec,"PriorTruncSpec/I");
01347     fDatabaseTree->Branch("PriorTruncCal",&fNbPriorityTruncCal,"PriorTruncCal/I");
01348     fDatabaseTree->Branch("SameMenuSpec",&fNbSameMenuSpec,"SameMenuSpec/I");
01349     fDatabaseTree->Branch("SameMenuCal",&fNbSameMenuCal,"SameMenuCal/I");
01350     fDatabaseTree->Branch("SharedMinderSpec",&fNbSharedMinderSpec,"SharedMinderSpec/I");
01351     fDatabaseTree->Branch("SharedMinderCal",&fNbSharedMinderCal,"SharedMinderCal/I");
01352     fDatabaseTree->Branch("TransferMinderSpec",&fNbTransferMinderSpec,"TransferMinderSpec/I");
01353     fDatabaseTree->Branch("TransferMinderCal",&fNbTransferMinderCal,"TransferMinderCal/I");
01354     fDatabaseTree->Branch("TimingAvgLow",&fAvgLow,"TimingAvgLow/F");
01355     fDatabaseTree->Branch("TimingAvgHigh",&fAvgHigh,"TimingAvgHigh/F");
01356     fDatabaseTree->Branch("TimingAvgGate",&fAvgGate,"TimingAvgGate/F");
01357     fDatabaseTree->Branch("SnarlRateMin",&fSnarlRateMin,"SnarlRateMin/I");
01358     fDatabaseTree->Branch("SnarlRateMax",&fSnarlRateMax,"SnarlRateMax/I");
01359     fDatabaseTree->Branch("SnarlRateMedian",&fSnarlRateMedian,"SnarlRateMedian/F");
01360     fDatabaseTree->Branch("SnarlRateMean",&fSnarlRateMean,"SnarlRateMean/F");
01361     fDatabaseTree->Branch("ReadWrite",&fReadWrite,"ReadWrite/I");
01362     gDirectory = tmpd;
01363   }
01364 
01365   if( fDatabaseFile ){
01366     TDirectory* tmpd = gDirectory;
01367     fDatabaseFile->cd();
01368     fDatabaseTree->Fill();
01369     gDirectory = tmpd;
01370   }
01371 
01372   return;
01373 }
01374 //===========================================================
01375 void FillNearRunQuality::WriteOutFile()
01376 {
01377   if(fDatabaseFile){
01378     MSG("FillNearRunQuality",Msg::kInfo) << " *** FillNearRunQuality::WriteOutFile() *** " << endl;
01379     TDirectory* tmpd = gDirectory;
01380     fDatabaseFile->cd();
01381     fDatabaseTree->Write();
01382     fDatabaseFile->Close();
01383     gDirectory = tmpd;
01384     MSG("FillNearRunQuality",Msg::kInfo) << "   closing file. " << endl;
01385   }
01386 }
01387 //===========================================================
01388 void FillNearRunQuality::Reset()
01389 {
01390   MSG("FillNearRunQuality",Msg::kInfo) << " *** FillNearRunQuality::Reset() *** " << endl;
01391 
01392   fWriteOutDatabaseVariables = 0;
01393   fDatabaseFile = 0;
01394   fDatabaseTree = 0;
01395   fName = "";
01396   fOutputLocation = ".";
01397   fCapidErrorCut = 100;
01398   fParityErrorCut = 10;
01399   fMiscountErrorCut = 10;
01400   fPriorTruncErrorCut = 10;
01401   fSameMenuErrorCut = 30;
01402   fSharedMinderErrorCut = 10;
01403   fTransfMinderErrorCut = 10;
01404   fHighAdcCut = 1000;
01405 
01406   fRecCounter = 0;
01407   fCounter = -1;
01408   fGoodCounter = 0;
01409   fSnarls = 0;
01410   fGoodSnarls = 0;
01411   fTimeFrames = 0;
01412   fSnarlRateMin = -1;
01413   fSnarlRateMax = -1;
01414   fSnarlRateMean = -999.9;
01415   fSnarlRateMedian = -999.9;
01416   fTriggersPlane = 0;
01417   fTriggersActivity = 0;
01418   fTriggersSpill = 0;
01419   fRopMask = -1;
01420   fTriggerMask = -1;
01421 
01422   fRun = -1;
01423   fSubRun = -1;
01424   fRunType = -1;
01425   fSnarl = 0;
01426   fTrigSrc = -1;
01427   fDigits = -1;
01428   fTrigTime = -1;
01429   fTrigBaseTime = -1;
01430   fTimeFrame = -1;
01431   fTime = -1;
01432   fAdc = -1;
01433   fTdc = -1;
01434   fDeltatdc = -1;
01435   fCrate = -1; 
01436   fMaster = -1;
01437   fMinder = -1;
01438   fMenu = -1;
01439   fCratet0sec = -1;
01440   fCratet0nsec = -1;
01441   fDatatype = -1;
01442   fErrorcode = -1;
01443   fRate = -1;
01444   fNearReadoutInt = -1;
01445   fRopMask = -1;
01446   fTriggerMask = -1;
01447 
01448   fPhysicsRun = -1;
01449   fModifiedRun = -1;
01450   fTestRun = -1;
01451   fStartTime = -1;
01452   fEndTime = -1;
01453   fSubrunLength = -1;
01454   fMinTdc = 0;
01455   fMaxTdc = 0;
01456 
01457   fNbCratesReadout = 0;
01458   fNTimeframesBadCrates = 0;
01459   fMaxNbColdMindersCal = 0;
01460   fMaxNbColdMindersSpec = 0;
01461   fMaxNbColdCrates = 0;
01462   fMaxNbColdMenusCal = 0;
01463   fMaxNbColdMenusSpec = 0;
01464   fInstrumType = kError;
01465   
01466   for(int i=0;i<8;i++){
01467     for(int j=0;j<16;j++){
01468       for(int k=0;k<8;k++){
01469         arrayColdMindersCal[i][j][k] = 0;
01470         arrayColdMindersSpec[i][j][k] = 0;
01471       }
01472     }
01473   }
01474   for(int i=0;i<NbConnMenusSpec;i++) arrayTimeCountColdMenusSpec[i] = 0;
01475   for(int i=0;i<NbConnMindersSpec;i++) arrayTimeCountColdMindersSpec[i] = 0;
01476   for(int i=0;i<NbConnMenusCal;i++) arrayTimeCountColdMenusCal[i] = 0;
01477   for(int i=0;i<NbConnMindersCal;i++) arrayTimeCountColdMindersCal[i] = 0;
01478   for(int i=0;i<NbConnMenusSpec;i++) arrayTimeCountHotMenusSpec[i] = 0;
01479   for(int i=0;i<NbConnMenusCal;i++) arrayTimeCountHotMenusCal[i] = 0;
01480 
01481 
01482   fMaxNbHotMenusSpec = 0;
01483   fMaxNbHotMenusCal = 0;
01484   fTimeCountMaxHotMenusSpec = 0;
01485   fTimeCountMaxHotMenusCal = 0;
01486   fTimeCountMaxColdMenusSpec = 0;
01487   fTimeCountMaxColdMenusCal = 0;
01488   fTimeCountMaxColdMindersSpec = 0;
01489   fTimeCountMaxColdMindersCal = 0;
01490 
01491   fNbLIChan = 0;
01492   fLIRate = 0.;
01493   fHighAdcSpec = 0;
01494   fHighAdcCal = 0;
01495   fNbCapidSpec = 0;
01496   fNbCapidCal = 0;
01497   fNbParitySpec = 0;
01498   fNbParityCal = 0;
01499   fNbMisCountSpec = 0;
01500   fNbMisCountCal = 0;
01501   fNbPriorityTruncSpec = 0;
01502   fNbPriorityTruncCal = 0;
01503   fNbSameMenuSpec = 0;
01504   fNbSameMenuCal = 0;
01505   fNbSharedMinderSpec = 0;
01506   fNbSharedMinderCal = 0;
01507   fNbTransferMinderSpec = 0;
01508   fNbTransferMinderCal = 0;
01509 
01510   fLowCutoff = 0;
01511   fLow = 0;
01512   fHigh = 0;
01513   fHighCutoff = 0;
01514 
01515   cntLow = 0;
01516   cntGate = 0;
01517   cntHigh = 0;
01518 
01519   for(int i=0; i<8; ++i)
01520     for(int j=0; j<16; ++j)
01521       for(int k=0; k<8; ++k)
01522         for(int l=0; l<16; ++l){
01523           vCapidChannel[i][j][k][l] = 0;
01524           vParityChannel[i][j][k][l] = 0;
01525           vMisCntChannel[i][j][k][l] = 0;
01526           vPrTruncChannel[i][j][k][l] = 0;
01527           vCapMenuChannel[i][j][k][l] = 0;
01528           vCapMindChannel[i][j][k][l] = 0;
01529           vTransferChannel[i][j][k][l] = 0;
01530           vAdcPerSnarl[i][j][k][l] = 0;
01531           vAverageAdc[i][j][k][l] = 0;
01532         }
01533 }
01534 //===========================================================
01535 //===========================================================

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