diff --git a/src/THcTimeSyncEvtHandler.cxx b/src/THcTimeSyncEvtHandler.cxx index f94ba4972e77e20e91d03e9a3ec60c03efe3a86c..3e72cc1c031e6dc5daad41348e760b80f315654c 100644 --- a/src/THcTimeSyncEvtHandler.cxx +++ b/src/THcTimeSyncEvtHandler.cxx @@ -168,9 +168,12 @@ Int_t THcTimeSyncEvtHandler::Analyze(THaEvData *evdata) if(fSlippage) { pslippedbank = p-2; // cout << banklen << " " << pslippedbank[0] << endl; + if(AllTdcsPresent(pslippedbank) && (banklen > fBadSyncSizeTrigger)) { + cout << "Slippage detected at event " << evdata->GetEvNum() << " with size " << banklen << " but not corrected" << endl; + } } else { - if(banklen > fBadSyncSizeTrigger) { - cout << "Slippage enabled at event " << evdata->GetEvNum() << endl; + if(AllTdcsPresent(p-2) && (banklen > fBadSyncSizeTrigger)) { + cout << "Slippage enabled at event " << evdata->GetEvNum() << " with size " << banklen << endl; fSlippage = 1; } } @@ -502,6 +505,7 @@ THaAnalysisObject::EStatus THcTimeSyncEvtHandler::Init(const TDatime& date) } fFirstTime = kTRUE; + fFirstTdcCheck = kTRUE; fMasterRoc = -1; fNEvents = 0; CrateTimeMap.clear(); @@ -544,6 +548,48 @@ Int_t THcTimeSyncEvtHandler::SetRewriteFile(const char *filename) { } return(0); } +Int_t THcTimeSyncEvtHandler::AllTdcsPresent(UInt_t *bank) { + /** + Check that all the 1190 TDCs that should be present are there. + + Return codes: + 0: All TDCs present + 1: TDCs missing at high end of crate + 2: TDCs missing at low end of crate + 3: Other arrangement of missing + */ + UInt_t headermask=0; + UInt_t trailermask=0; + + UInt_t *p=bank; + Int_t banklen = *p; + p++; // Header word + while(p++ < bank+banklen) { + if((*p & 0xf8000000) == 0x40000000) { + headermask |= (1<<(*p&0x1f)); + } else if ((*p & 0xf8000000) == 0x80000000) { + trailermask |= (1<<(*p&0x1f)); + } + } - + if(fFirstTdcCheck) { + fFirstTdcCheck=kFALSE; + fTdcMask = headermask | trailermask; + return(0); // All TDC present by definition + } else { + if((fTdcMask == headermask) && (fTdcMask == trailermask)) { + return(0); + } else { + cout << hex << "Header mask " << headermask << " Trailer mask " << trailermask << dec << endl; + cout << "TDC1190 Bank" << endl; + for(Int_t i=0;i<=banklen;i++) { + if(i%5 == 0) cout<<endl<<dec<<i<<": "; + cout << hex << setw(10) << bank[i]; + } + cout << dec << endl; + return(1); // Just return this for now + } + } +} + ClassImp(THcTimeSyncEvtHandler) diff --git a/src/THcTimeSyncEvtHandler.h b/src/THcTimeSyncEvtHandler.h index 53b388012e3b7868025d80d08df0124ef4c654a6..ff1e849512e0a180a726e6e4d6a77f63b12f9975 100644 --- a/src/THcTimeSyncEvtHandler.h +++ b/src/THcTimeSyncEvtHandler.h @@ -33,7 +33,7 @@ public: virtual void SetBadROC(Int_t roc) {fBadROC = roc;} virtual void SetResync(Bool_t b) {fResync = b;} virtual void SetBadSyncSizeTrigger(Int_t sizetrigger) {fBadSyncSizeTrigger = sizetrigger;} - + virtual Int_t AllTdcsPresent(UInt_t *bank); private: virtual void InitStats(); @@ -51,6 +51,8 @@ private: Bool_t fResync; // If true, stop correcting events on sync Int_t fBadSyncSizeTrigger; Bool_t fLastEventWasSync; // True when last event was sync event + Bool_t fFirstTdcCheck; + UInt_t fTdcMask; // Bit Pattern of TDC in ROC being checked Decoder::THaCodaFile* fCodaOut; // The CODA output file Int_t handle;