@@ -154,31 +154,86 @@ bool DataDecoder::RawDigit::operator==(const DataDecoder::RawDigit& other) const
154154 return digit == other.digit && info == other.info ;
155155}
156156
157- void DataDecoder::TimeFrameStartRecord::update (uint32_t orbit, uint32_t bunchCrossing)
157+ bool DataDecoder::TimeFrameStartRecord::update (uint32_t orbit, uint32_t bunchCrossing, bool verbose )
158158{
159- mOrbitPrev = mOrbit ;
160- mBunchCrossingPrev = mBunchCrossing ;
159+ if (verbose) {
160+ LOGP (info, " [TimeFrameStartRecord::update()] new {}/{} current {}/{} prev {}/{} valid {}" ,
161+ orbit, bunchCrossing, mOrbit , mBunchCrossing , mOrbitPrev , mBunchCrossingPrev , mValid );
162+ }
163+
164+ // if this is the first occurence, simply initialize the orbit and binch crossing and mark the start recortd as valid
165+ if (mOrbit < 0 ) {
166+ mOrbit = orbit;
167+ mBunchCrossing = bunchCrossing;
168+
169+ mValid = true ;
170+ return true ;
171+ }
172+
173+ if (mOrbit == orbit) {
174+ if (mValid ) {
175+ // there is already one valid record for this orbit, so the current one is discarded
176+ return false ;
177+ } else {
178+ // there is already one record for this orbit, but it is invalid
179+ // check if the current one is compatible with the previous, if yes replace the existing one
180+ if (check (orbit, bunchCrossing, mOrbitPrev , mBunchCrossingPrev , verbose)) {
181+ mOrbit = orbit;
182+ mBunchCrossing = bunchCrossing;
183+
184+ mValid = true ;
185+ }
186+ }
187+ } else {
188+ // we received an HB packet for a new TF, check if it is compatible with the last stored one
189+ bool valid = check (orbit, bunchCrossing, mOrbit , mBunchCrossing , verbose);
190+
191+ bool replace = valid || (mOrbitPrev < 0 ) || (mValid == false );
192+
193+ if (replace) {
194+ mOrbitPrev = mOrbit ;
195+ mBunchCrossingPrev = mBunchCrossing ;
196+
197+ mOrbit = orbit;
198+ mBunchCrossing = bunchCrossing;
199+
200+ mValid = valid;
201+ }
202+ }
203+
204+ if (verbose) {
205+ LOGP (info, " [TimeFrameStartRecord::update()] set to {}/{} prev {}/{} valid {}" ,
206+ mOrbit , mBunchCrossing , mOrbitPrev , mBunchCrossingPrev , mValid );
207+ }
161208
162- mOrbit = orbit;
163- mBunchCrossing = bunchCrossing;
209+ return mValid ;
164210}
165211
166- bool DataDecoder::TimeFrameStartRecord::check ()
212+ bool DataDecoder::TimeFrameStartRecord::check (int32_t orbit, uint32_t bc, int32_t orbitRef, uint32_t bcRef, bool verbose )
167213{
168- if (mOrbitPrev < 0 ) {
169- return true ;
214+ if (verbose ) {
215+ LOGP (info, " [TimeFrameStartRecord::check()] current {}/{} ref {}/{} " , orbit, bc, orbitRef, bcRef) ;
170216 }
171217
172- if (mOrbit < mOrbitPrev ) {
173- return false ;
218+ if (orbitRef < 0 ) {
219+ return true ;
174220 }
175221
176- uint64_t dOrbit = mOrbit - mOrbitPrev ;
177- uint64_t bcExpected = dOrbit * bcInOrbit + mBunchCrossingPrev ;
222+ int64_t dOrbit = orbit - orbitRef;
223+ if (verbose) {
224+ LOGP (info, " [TimeFrameStartRecord::check()] dOrbit{}" , dOrbit);
225+ }
226+ int64_t bcExpected = dOrbit * bcInOrbit + bcRef;
178227
179228 uint64_t bcExpected20bits = bcExpected & twentyBitsAtOne;
180229
181- return (bcExpected20bits == mBunchCrossing );
230+ bool result = (bcExpected20bits == bc);
231+
232+ if (verbose) {
233+ LOGP (info, " dOrbit {} expected {} expected20bits {} bc {} valid {}" , dOrbit, bcExpected, bcExpected20bits, bc, result);
234+ }
235+
236+ return result;
182237}
183238
184239// _________________________________________________________________________________________________
@@ -374,6 +429,12 @@ void DataDecoder::updateMergerRecord(uint32_t mergerChannelId, uint32_t mergerBo
374429 mergerCh.digitId = digitId;
375430 mergerCh.bcEnd = digit.info .bunchCrossing + (digit.info .sampaTime + digit.digit .getNofSamples () - 1 ) * 4 ;
376431 mMergerRecordsReady [mergerBoardId] |= mergerChannelBitmask;
432+ if (mDebug ) {
433+ std::cout << fmt::format (" [updateMergerRecord] updated S{}-DS{}-CHIP{} time {}-{}-{} cs {}" ,
434+ (int )digit.info .solar , (int )digit.info .ds , (int )digit.info .chip ,
435+ (int )digit.info .orbit , (int )digit.info .bunchCrossing , (int )digit.info .sampaTime , (int )digit.digit .getNofSamples ())
436+ << std::endl;
437+ }
377438}
378439
379440// _________________________________________________________________________________________________
@@ -501,18 +562,20 @@ void DataDecoder::decodePage(gsl::span<const std::byte> page)
501562
502563 uint32_t bcTF = subtractBcOffset (bunchCrossing, mSampaTimeOffset );
503564
504- updateTimeFrameStartRecord (chipId, mFirstOrbitInTF , bcTF);
505-
506565 if (mDebug ) {
507566 auto s = asString (dsElecId);
508567 LOGP (info, " HeartBeat: {}-CHIP{} -> {}/{} offset {} -> bcTF {}" ,
509568 s, chip, mFirstOrbitInTF , bunchCrossing, mSampaTimeOffset , bcTF);
510569 }
511570
512- if (!mTimeFrameStartRecords [chipId].check ()) {
571+ if (chipId >= DataDecoder::sReadoutChipsNum ) {
572+ return ;
573+ }
574+
575+ if (!mTimeFrameStartRecords [chipId].update (mFirstOrbitInTF , bcTF)) {
513576 if (mErrorCount < MCH_DECODER_MAX_ERROR_COUNT ) {
514577 auto s = asString (dsElecId);
515- LOGP (warning, " Inconsistent HeartBeat packet received: {}-CHIP{} {}/{} (last {}/{})" ,
578+ LOGP (warning, " Bad HeartBeat packet received: {}-CHIP{} {}/{} (last {}/{})" ,
516579 s, chip, mFirstOrbitInTF , bcTF, mTimeFrameStartRecords [chipId].mOrbitPrev , mTimeFrameStartRecords [chipId].mBunchCrossingPrev );
517580 mErrorCount += 1 ;
518581 }
@@ -637,6 +700,13 @@ bool DataDecoder::getTimeFrameStartRecord(const RawDigit& digit, uint32_t& orbit
637700 return false ;
638701 }
639702
703+ if (tfStart.mValid == false ) {
704+ if (mErrorCount < MCH_DECODER_MAX_ERROR_COUNT ) {
705+ LOGP (warning, " Invalid TF start record for S{}-J{}-DS{}-CHIP{}" , info.solar , info.ds / 5 + 1 , info.ds % 5 , info.chip );
706+ mErrorCount += 1 ;
707+ }
708+ }
709+
640710 // orbit and BC from the last received HB packet
641711 uint32_t orbitHBP = tfStart.mOrbit ;
642712 // SAMPA BC at the beginning of the current TF
@@ -661,6 +731,7 @@ bool DataDecoder::getTimeFrameStartRecord(const RawDigit& digit, uint32_t& orbit
661731void DataDecoder::computeDigitsTime ()
662732{
663733 static constexpr int32_t timeInvalid = DataDecoder::tfTimeInvalid;
734+ constexpr int BCINORBIT = o2::constants::lhc::LHCMaxBunches;
664735
665736 auto setDigitTime = [&](Digit& d, int32_t tfTime) {
666737 d.setTime (tfTime);
0 commit comments