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.9 2010/01/02 23:43: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) << " SUBRUN START TIME  : " << fStartTime << endl;
01106   MSG("FillNearRunQuality",Msg::kInfo) << " SUBRUN END TIME    : " << fEndTime << endl;
01107   MSG("FillNearRunQuality",Msg::kInfo) << " SUBRUN DURATION    : " << fSubrunLength << " s." << endl;
01108 
01109   // Mean and median snarl rates
01110   //============================
01111   if(fTimeFrames > 0){
01112     Int_t oldtotal = 0;
01113     Int_t newtotal = 0;
01114     Int_t middletotal = (Int_t)(0.5*fTimeFrames);
01115   
01116     for(Int_t i=0; i<1001; i++){
01117       oldtotal = newtotal;
01118       newtotal += fSnarlRates[i];
01119       if( oldtotal<=middletotal && middletotal<newtotal ){
01120         fSnarlRateMedian = (float)i - 0.5;
01121         if( newtotal-oldtotal>0 )
01122           fSnarlRateMedian += (float)(middletotal-oldtotal)/(float)(newtotal-oldtotal);
01123       }
01124     }
01125     if(fSnarlRateMedian < fSnarlRateMin) fSnarlRateMedian=fSnarlRateMin;
01126     if(fSnarlRateMedian > fSnarlRateMax) fSnarlRateMedian=fSnarlRateMax;
01127     fSnarlRateMean = ((float)(fSnarls))/((float)(fTimeFrames));
01128     MSG("FillNearRunQuality",Msg::kInfo) << endl << " SNARL RATES SUMMARY " << endl
01129          << "  MIN  : " << fSnarlRateMin << endl
01130          << "  MED  : " << fSnarlRateMedian << endl
01131          << "  MEAN : " << fSnarlRateMean << endl
01132          << "  MAX  : " << fSnarlRateMax << endl;
01133   }
01134 
01135   // Trigger Rate
01136   //=============
01137   MSG("FillNearRunQuality",Msg::kInfo) << endl << " TRIGGER SUMMARY " << endl
01138        << "  SGATE Triggers    : " << fTriggersSpill << endl
01139        << "  Plane Triggers    : " << fTriggersPlane << endl
01140        << "  Activity Triggers : " << fTriggersActivity << endl
01141        << "  Total Snarls      : " << fSnarls << endl;
01142 
01143   // LI Variables
01144   //=============
01145   if (fSubrunLength > 0) fLIRate = (Float_t)fNbLIChan / fSubrunLength;
01146   else fLIRate = 0.;
01147   MSG("FillNearRunQuality",Msg::kDebug) << endl << " LI RATE " << endl
01148        << fNbLIChan << " hits in the subrun, making an averaged frequency of " << fLIRate << " Hz" << endl;
01149   
01150   // Error Variables - see Config methods for cut values
01151   // High ADC Values
01152   //====================================================
01153   Float_t avgadc = 0.;
01154   Float_t caperr = fCapidErrorCut * fSubrunLength;
01155   Float_t parerr = fParityErrorCut* fSubrunLength;
01156   Float_t miserr = fMiscountErrorCut* fSubrunLength;
01157   Float_t trcerr = fPriorTruncErrorCut* fSubrunLength;
01158   Float_t menerr = fSameMenuErrorCut* fSubrunLength;
01159   Float_t minerr = fSharedMinderErrorCut* fSubrunLength;
01160   Float_t trserr = fTransfMinderErrorCut* fSubrunLength;
01161 
01162   for(int i=0; i<8; ++i)
01163     for(int j=0; j<16; ++j)
01164       for(int k=0; k<8; ++k)
01165         for(int l=0; l<16; ++l){
01166           if(fTriggersSpill > 0) avgadc = (Float_t)vAverageAdc[i][j][k][l] / fTriggersSpill;
01167           if ( avgadc > fHighAdcCut )  
01168             { if (i<2) ++fHighAdcSpec; else ++fHighAdcCal; }
01169           if ( vCapidChannel[i][j][k][l] > caperr )  
01170             { if (i<2) ++fNbCapidSpec; else ++fNbCapidCal; }
01171           if ( vParityChannel[i][j][k][l] > parerr )   
01172             { if (i<2) ++fNbParitySpec; else ++fNbParityCal; }
01173           if ( vMisCntChannel[i][j][k][l] > miserr )   
01174             { if (i<2) ++fNbMisCountSpec; else ++fNbMisCountCal; }
01175           if ( vPrTruncChannel[i][j][k][l] > trcerr )  
01176             { if (i<2) ++fNbPriorityTruncSpec; else ++fNbPriorityTruncCal; }
01177           if ( vCapMenuChannel[i][j][k][l] > menerr )  
01178             { if (i<2) ++fNbSameMenuSpec; else ++fNbSameMenuCal; }
01179           if ( vCapMindChannel[i][j][k][l] > minerr )  
01180             { if (i<2) ++fNbSharedMinderSpec; else ++fNbSharedMinderCal; }
01181           if ( vTransferChannel[i][j][k][l] > trserr ) 
01182             { if (i<2) ++fNbTransferMinderSpec; else  ++fNbTransferMinderCal; }
01183         }
01184 
01185   MSG("FillNearRunQuality",Msg::kInfo) << endl << " ERROR SUMMARY" << endl
01186        << "  " << fNbCapidSpec+fNbCapidCal << " Channels with more than " 
01187        << fCapidErrorCut << " CAPID Errors" << endl
01188        << "  " << fNbParitySpec+fNbParityCal << " Channels with more than " 
01189        << fParityErrorCut << " Parity Errors." << endl
01190        << "  " << fNbMisCountSpec+fNbMisCountCal << " Channels with more than " 
01191        << fMiscountErrorCut << " MisCount Errors." << endl
01192        << "  " << fNbPriorityTruncSpec+fNbPriorityTruncCal << " Channels with more than " 
01193        << fPriorTruncErrorCut << " PriorityTruncate Errors." << endl
01194        << "  " << fNbSameMenuSpec+fNbSameMenuCal << " Channels with more than " 
01195        << fSameMenuErrorCut << " CapIdSameMenu Errors." << endl
01196        << "  " << fNbSharedMinderSpec+fNbSharedMinderCal << " Channels with more than " 
01197        << fSharedMinderErrorCut << " CapIdSharedMinder Errors." << endl
01198        << "  " << fNbTransferMinderSpec+fNbTransferMinderCal << " Channels with more than " 
01199        << fTransfMinderErrorCut << " TransferSharedMinder Errors." << endl;
01200 
01201   // Timing Variables
01202   //=================
01203   if( fLow-fLowCutoff>0 ) fAvgLow  = ((Float_t)cntLow)  / (fLow-fLowCutoff);
01204   if( fHighCutoff-fHigh>0 ) fAvgHigh = ((Float_t)cntHigh) / (fHighCutoff-fHigh);
01205   fAvgGate = ((Float_t)cntGate) / 520;   // 520 buckets = SGATE duration
01206   
01207 
01208   //Duration of Readout Problems
01209   //============================
01210   Int_t timeCounter = 0;
01211   
01212   //CALORIMETER
01213   //----------- 
01214   for(int i=(NbConnMenusCal-1);i>0;i--){
01215     timeCounter += arrayTimeCountColdMenusCal[i];    
01216     if(timeCounter>=fTimeframeArrayCounter){
01217       fTimeCountMaxColdMenusCal = i; break;} 
01218   }
01219   
01220   timeCounter = 0;
01221   for(int i=(NbConnMindersCal-1);i>0;i--){
01222     timeCounter += arrayTimeCountColdMindersCal[i];    
01223     if(timeCounter>=fTimeframeArrayCounter){fTimeCountMaxColdMindersCal = i; break;}
01224   }
01225 
01226   timeCounter = 0;
01227   for(int i=(NbConnMenusCal-1);i>0;i--){
01228     timeCounter += arrayTimeCountHotMenusCal[i];    
01229     if(timeCounter>=fTimeframeArrayCounter){
01230       fTimeCountMaxHotMenusCal = i; break;} 
01231   }
01232 
01233   //SPECTROMETER
01234   //------------
01235   timeCounter = 0;
01236   for(int i=(NbConnMenusSpec-1);i>0;i--){
01237     timeCounter += arrayTimeCountColdMenusSpec[i];    
01238     if(timeCounter>=fTimeframeArrayCounter){fTimeCountMaxColdMenusSpec = i; break;}
01239   }
01240 
01241   timeCounter = 0;
01242   for(int i=(NbConnMindersSpec-1);i>0;i--){
01243     timeCounter += arrayTimeCountColdMindersSpec[i];    
01244     if(timeCounter>=fTimeframeArrayCounter){fTimeCountMaxColdMindersSpec = i; break;}
01245   }
01246   
01247   timeCounter = 0;
01248   for(int i=799;i>0;i--){
01249     timeCounter += arrayTimeCountHotMenusSpec[i];    
01250     if(timeCounter>=fTimeframeArrayCounter){
01251       fTimeCountMaxHotMenusSpec = i; break;} 
01252   }
01253 
01254   // write variables to database
01255   // ===========================
01256   if( fStartTime>=0 && fEndTime>=0
01257    && fSubrunLength>0 && fTimeFrames>0 ){
01258     this->WriteSubRun();
01259   }
01260   else{
01261     MSG("FillNearRunQuality",Msg::kWarning) << " *** Run has no timeframes, no database entry will be created *** " << endl;
01262   }
01263 
01264   return;
01265 }
01266 
01267 //===========================================================
01268 void FillNearRunQuality::WriteSubRun()
01269 {
01270   MSG("FillNearRunQuality",Msg::kInfo) << endl << " *** FillNearRunQuality::WriteSubRun() *** " << endl;
01271 
01272   //Write database variables in root file
01273   //=====================================
01274   if( fWriteOutDatabaseVariables ) {
01275     fReadWrite = 0;
01276     this->WriteOutDatabaseVariables();
01277     MSG("FillNearRunQuality",Msg::kDebug) << endl << "... EndSubRun : Write ROOT file... End." << endl;
01278   }
01279 
01280   // write results to database
01281   // =========================
01282   if( fWriteToDatabase ){
01283     this->WriteToDatabase();
01284     MSG("FillNearRunQuality",Msg::kDebug) << endl << "... EndSubRun : Write To Database... End." << endl;
01285     //if( fWriteOutDatabaseVariables ) {
01286     //  fReadWrite = 1;
01287     //  this->WriteOutDatabaseVariables();
01288     //}
01289   }
01290     
01291   // read results from database
01292   // ==========================
01293   if( fReadFromDatabase ){
01294     this->ReadFromDatabase();
01295     MSG("FillNearRunQuality",Msg::kDebug) << endl << "... EndSubRun : Read From Database... End." << endl;
01296     //if( fWriteOutDatabaseVariables ) {
01297     //  fReadWrite = 2;
01298     //  this->WriteOutDatabaseVariables();
01299     //}
01300   }
01301 
01302 }
01303 
01304 //===========================================================
01305 void FillNearRunQuality::WriteOutDatabaseVariables()
01306 {
01307   MSG("FillNearRunQuality",Msg::kInfo) << " *** FillNearRunQuality::WriteOutDatabaseVariables() *** " << endl; 
01308 
01309   if( !fDatabaseFile ){
01310     TDirectory* tmpd = gDirectory;
01311     TString filename(fOutputLocation.Data());
01312     filename.Append("/dataquality.databasevariables");
01313     if( fName.Length()>0 ){
01314       filename.Append(".");
01315       filename.Append(fName.Data());
01316     }
01317     filename.Append(".root");
01318     MSG("FillNearRunQuality",Msg::kInfo) << "   opening file: " << filename << endl;
01319     fDatabaseFile = new TFile(filename.Data(),"RECREATE");
01320     fDatabaseTree = new TTree("DatabaseVariables","DatabaseVariables");
01321     fDatabaseTree->SetAutoSave(100);
01322     fDatabaseTree->Branch("Run",&fRun,"Run/I");
01323     fDatabaseTree->Branch("Subrun",&fSubRun,"Subrun/I");
01324     fDatabaseTree->Branch("StartTime",&fStartTime,"StartTime/I");
01325     fDatabaseTree->Branch("EndTime",&fEndTime,"EndTime/I");
01326     fDatabaseTree->Branch("Duration",&fSubrunLength,"Duration/I");
01327     fDatabaseTree->Branch("PhysicsRun", &fPhysicsRun,"PhysicsRun/I");
01328     fDatabaseTree->Branch("ModifiedRun", &fModifiedRun,"ModifiedRun/I");
01329     fDatabaseTree->Branch("TestRun", &fTestRun,"TestRun/I");
01330     fDatabaseTree->Branch("TriggersPlane", &fTriggersPlane,"TriggersPlane/I");
01331     fDatabaseTree->Branch("TriggersActivity", &fTriggersActivity,"TriggersActivity/I");
01332     fDatabaseTree->Branch("TriggersSpill", &fTriggersSpill,"TriggersSpill/I");
01333     fDatabaseTree->Branch("RopMask",&fRopMask,"RopMask/I");
01334     fDatabaseTree->Branch("TriggerMask",&fTriggerMask,"TriggerMask/I");
01335     fDatabaseTree->Branch("ColdCrates",&fMaxNbColdCrates,"ColdCrates/I");
01336     fDatabaseTree->Branch("ColdMindersCal",&fMaxNbColdMindersCal,"ColdMindersCal/I");
01337     fDatabaseTree->Branch("ColdMindersSpec",&fMaxNbColdMindersSpec,"ColdMindersSpec/I");
01338     fDatabaseTree->Branch("ColdMenusCal",&fMaxNbColdMenusCal,"ColdMenusCal/I");
01339     fDatabaseTree->Branch("ColdMenusSpec",&fMaxNbColdMenusSpec,"ColdMenusSpec/I");
01340     fDatabaseTree->Branch("HotMenusCal",&fMaxNbHotMenusCal,"HotMenusCal/I");
01341     fDatabaseTree->Branch("HotMenusSpec",&fMaxNbHotMenusSpec,"HotMenusSpec/I");
01342     fDatabaseTree->Branch("TimeCountHotMenusSpec",&fTimeCountMaxHotMenusSpec,"TimeCountHotMenusSpec/I");
01343     fDatabaseTree->Branch("TimeCountHotMenusCal",&fTimeCountMaxHotMenusCal,"TimeCountHotMenusCal/I");
01344     fDatabaseTree->Branch("TimeCountColdMenusSpec",&fTimeCountMaxColdMenusSpec,"TimeCountColdMenusSpec/I");
01345     fDatabaseTree->Branch("TimeCountColdMenusCal",&fTimeCountMaxColdMenusCal,"TimeCountColdMenusCal/I");
01346     fDatabaseTree->Branch("TimeCountColdMindersSpec",&fTimeCountMaxColdMindersSpec,"TimeCountColdMindersSpec/I");
01347     fDatabaseTree->Branch("TimeCountColdMindersCal",&fTimeCountMaxColdMindersCal,"TimeCountColdMindersCal/I");
01348     fDatabaseTree->Branch("LIRate",&fLIRate,"LIRate/F");
01349     fDatabaseTree->Branch("HighAdcSpec",&fHighAdcSpec,"HighAdcSpec/I");
01350     fDatabaseTree->Branch("HighAdcCal",&fHighAdcCal,"HighAdcCal/I");
01351     fDatabaseTree->Branch("CapidSpec",&fNbCapidSpec,"CapidSpec/I");
01352     fDatabaseTree->Branch("CapidCal",&fNbCapidCal,"CapidCal/I");
01353     fDatabaseTree->Branch("ParitySpec",&fNbParitySpec,"ParitySpec/I");
01354     fDatabaseTree->Branch("ParityCal",&fNbParityCal,"ParityCal/I");
01355     fDatabaseTree->Branch("MiscountSpec",&fNbMisCountSpec,"MiscountSpec/I");
01356     fDatabaseTree->Branch("MiscountCal",&fNbMisCountCal,"MiscountCal/I");
01357     fDatabaseTree->Branch("PriorTruncSpec",&fNbPriorityTruncSpec,"PriorTruncSpec/I");
01358     fDatabaseTree->Branch("PriorTruncCal",&fNbPriorityTruncCal,"PriorTruncCal/I");
01359     fDatabaseTree->Branch("SameMenuSpec",&fNbSameMenuSpec,"SameMenuSpec/I");
01360     fDatabaseTree->Branch("SameMenuCal",&fNbSameMenuCal,"SameMenuCal/I");
01361     fDatabaseTree->Branch("SharedMinderSpec",&fNbSharedMinderSpec,"SharedMinderSpec/I");
01362     fDatabaseTree->Branch("SharedMinderCal",&fNbSharedMinderCal,"SharedMinderCal/I");
01363     fDatabaseTree->Branch("TransferMinderSpec",&fNbTransferMinderSpec,"TransferMinderSpec/I");
01364     fDatabaseTree->Branch("TransferMinderCal",&fNbTransferMinderCal,"TransferMinderCal/I");
01365     fDatabaseTree->Branch("TimingAvgLow",&fAvgLow,"TimingAvgLow/F");
01366     fDatabaseTree->Branch("TimingAvgHigh",&fAvgHigh,"TimingAvgHigh/F");
01367     fDatabaseTree->Branch("TimingAvgGate",&fAvgGate,"TimingAvgGate/F");
01368     fDatabaseTree->Branch("SnarlRateMin",&fSnarlRateMin,"SnarlRateMin/I");
01369     fDatabaseTree->Branch("SnarlRateMax",&fSnarlRateMax,"SnarlRateMax/I");
01370     fDatabaseTree->Branch("SnarlRateMedian",&fSnarlRateMedian,"SnarlRateMedian/F");
01371     fDatabaseTree->Branch("SnarlRateMean",&fSnarlRateMean,"SnarlRateMean/F");
01372     fDatabaseTree->Branch("ReadWrite",&fReadWrite,"ReadWrite/I");
01373     gDirectory = tmpd;
01374   }
01375 
01376   if( fDatabaseFile ){
01377     TDirectory* tmpd = gDirectory;
01378     fDatabaseFile->cd();
01379     fDatabaseTree->Fill();
01380     gDirectory = tmpd;
01381   }
01382 
01383   return;
01384 }
01385 //===========================================================
01386 void FillNearRunQuality::WriteOutFile()
01387 {
01388   if(fDatabaseFile){
01389     MSG("FillNearRunQuality",Msg::kInfo) << " *** FillNearRunQuality::WriteOutFile() *** " << endl;
01390     TDirectory* tmpd = gDirectory;
01391     fDatabaseFile->cd();
01392     fDatabaseTree->Write();
01393     fDatabaseFile->Close();
01394     gDirectory = tmpd;
01395     MSG("FillNearRunQuality",Msg::kInfo) << "   closing file. " << endl;
01396   }
01397 }
01398 //===========================================================
01399 void FillNearRunQuality::Reset()
01400 {
01401   MSG("FillNearRunQuality",Msg::kInfo) << " *** FillNearRunQuality::Reset() *** " << endl;
01402 
01403   fWriteOutDatabaseVariables = 0;
01404   fDatabaseFile = 0;
01405   fDatabaseTree = 0;
01406   fName = "";
01407   fOutputLocation = ".";
01408   fCapidErrorCut = 100;
01409   fParityErrorCut = 10;
01410   fMiscountErrorCut = 10;
01411   fPriorTruncErrorCut = 10;
01412   fSameMenuErrorCut = 30;
01413   fSharedMinderErrorCut = 10;
01414   fTransfMinderErrorCut = 10;
01415   fHighAdcCut = 1000;
01416 
01417   fRecCounter = 0;
01418   fCounter = -1;
01419   fGoodCounter = 0;
01420   fSnarls = 0;
01421   fGoodSnarls = 0;
01422   fTimeFrames = 0;
01423   fSnarlRateMin = -1;
01424   fSnarlRateMax = -1;
01425   fSnarlRateMean = -999.9;
01426   fSnarlRateMedian = -999.9;
01427   fTriggersPlane = 0;
01428   fTriggersActivity = 0;
01429   fTriggersSpill = 0;
01430   fRopMask = -1;
01431   fTriggerMask = -1;
01432 
01433   fRun = -1;
01434   fSubRun = -1;
01435   fRunType = -1;
01436   fSnarl = 0;
01437   fTrigSrc = -1;
01438   fDigits = -1;
01439   fTrigTime = -1;
01440   fTrigBaseTime = -1;
01441   fTimeFrame = -1;
01442   fTime = -1;
01443   fAdc = -1;
01444   fTdc = -1;
01445   fDeltatdc = -1;
01446   fCrate = -1; 
01447   fMaster = -1;
01448   fMinder = -1;
01449   fMenu = -1;
01450   fCratet0sec = -1;
01451   fCratet0nsec = -1;
01452   fDatatype = -1;
01453   fErrorcode = -1;
01454   fRate = -1;
01455   fNearReadoutInt = -1;
01456   fRopMask = -1;
01457   fTriggerMask = -1;
01458 
01459   fPhysicsRun = -1;
01460   fModifiedRun = -1;
01461   fTestRun = -1;
01462   fStartTime = -1;
01463   fEndTime = -1;
01464   fSubrunLength = -1;
01465   fMinTdc = 0;
01466   fMaxTdc = 0;
01467 
01468   fNbCratesReadout = 0;
01469   fNTimeframesBadCrates = 0;
01470   fMaxNbColdMindersCal = 0;
01471   fMaxNbColdMindersSpec = 0;
01472   fMaxNbColdCrates = 0;
01473   fMaxNbColdMenusCal = 0;
01474   fMaxNbColdMenusSpec = 0;
01475   fInstrumType = kError;
01476   
01477   for(int i=0;i<8;i++){
01478     for(int j=0;j<16;j++){
01479       for(int k=0;k<8;k++){
01480         arrayColdMindersCal[i][j][k] = 0;
01481         arrayColdMindersSpec[i][j][k] = 0;
01482       }
01483     }
01484   }
01485   for(int i=0;i<NbConnMenusSpec;i++) arrayTimeCountColdMenusSpec[i] = 0;
01486   for(int i=0;i<NbConnMindersSpec;i++) arrayTimeCountColdMindersSpec[i] = 0;
01487   for(int i=0;i<NbConnMenusCal;i++) arrayTimeCountColdMenusCal[i] = 0;
01488   for(int i=0;i<NbConnMindersCal;i++) arrayTimeCountColdMindersCal[i] = 0;
01489   for(int i=0;i<NbConnMenusSpec;i++) arrayTimeCountHotMenusSpec[i] = 0;
01490   for(int i=0;i<NbConnMenusCal;i++) arrayTimeCountHotMenusCal[i] = 0;
01491 
01492 
01493   fMaxNbHotMenusSpec = 0;
01494   fMaxNbHotMenusCal = 0;
01495   fTimeCountMaxHotMenusSpec = 0;
01496   fTimeCountMaxHotMenusCal = 0;
01497   fTimeCountMaxColdMenusSpec = 0;
01498   fTimeCountMaxColdMenusCal = 0;
01499   fTimeCountMaxColdMindersSpec = 0;
01500   fTimeCountMaxColdMindersCal = 0;
01501 
01502   fNbLIChan = 0;
01503   fLIRate = 0.;
01504   fHighAdcSpec = 0;
01505   fHighAdcCal = 0;
01506   fNbCapidSpec = 0;
01507   fNbCapidCal = 0;
01508   fNbParitySpec = 0;
01509   fNbParityCal = 0;
01510   fNbMisCountSpec = 0;
01511   fNbMisCountCal = 0;
01512   fNbPriorityTruncSpec = 0;
01513   fNbPriorityTruncCal = 0;
01514   fNbSameMenuSpec = 0;
01515   fNbSameMenuCal = 0;
01516   fNbSharedMinderSpec = 0;
01517   fNbSharedMinderCal = 0;
01518   fNbTransferMinderSpec = 0;
01519   fNbTransferMinderCal = 0;
01520 
01521   fLowCutoff = 0;
01522   fLow = 0;
01523   fHigh = 0;
01524   fHighCutoff = 0;
01525 
01526   cntLow = 0;
01527   cntGate = 0;
01528   cntHigh = 0;
01529 
01530   for(int i=0; i<8; ++i)
01531     for(int j=0; j<16; ++j)
01532       for(int k=0; k<8; ++k)
01533         for(int l=0; l<16; ++l){
01534           vCapidChannel[i][j][k][l] = 0;
01535           vParityChannel[i][j][k][l] = 0;
01536           vMisCntChannel[i][j][k][l] = 0;
01537           vPrTruncChannel[i][j][k][l] = 0;
01538           vCapMenuChannel[i][j][k][l] = 0;
01539           vCapMindChannel[i][j][k][l] = 0;
01540           vTransferChannel[i][j][k][l] = 0;
01541           vAdcPerSnarl[i][j][k][l] = 0;
01542           vAverageAdc[i][j][k][l] = 0;
01543         }
01544 }
01545 //===========================================================
01546 //===========================================================

Generated on Mon Feb 15 11:06:42 2010 for loon by  doxygen 1.3.9.1