Skip to content

Commit a42dd80

Browse files
aferrero2707aphecetche
authored andcommitted
[MCH] improved digits time computation
The code introduces various fixes and improvements in the handling of the HeartBeat packets, which are used to compute the reference SAMPA time at the beginning of each time frame.
1 parent 8818ea6 commit a42dd80

3 files changed

Lines changed: 92 additions & 20 deletions

File tree

Detectors/MUON/MCH/Raw/Decoder/include/MCHRawDecoder/DataDecoder.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,14 +109,16 @@ class DataDecoder
109109
TimeFrameStartRecord() = default;
110110

111111
/// store the new orbit/bc pair, and copy the existing one in the "*Prev" data members
112-
void update(uint32_t orbit, uint32_t bunchCrossing);
113-
bool check();
112+
bool update(uint32_t orbit, uint32_t bunchCrossing, bool verbose = false);
113+
bool check(int32_t orbit, uint32_t bc, int32_t orbitRef, uint32_t bcRef, bool verbose = false);
114114

115115
int64_t mOrbit{-1};
116116
int64_t mBunchCrossing{-1};
117117

118118
int64_t mOrbitPrev{-1};
119119
int64_t mBunchCrossingPrev{-1};
120+
121+
bool mValid{true};
120122
};
121123

122124
/// Structure used internally to store the information of the decoded digits.

Detectors/MUON/MCH/Raw/Decoder/src/DataDecoder.cxx

Lines changed: 88 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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
661731
void 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);

Detectors/MUON/MCH/Raw/Decoder/src/ROFFinder.cxx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,6 @@ void ROFFinder::sortDigits()
156156

157157
auto orbit = digit.getOrbit();
158158
if (orbit < mFirstTForbit) {
159-
LOG(error) << "[ROFFinder::fillDigitsArray] orbit smaller than first TF orbit: " << orbit << ", " << mFirstTForbit;
160159
continue;
161160
}
162161

0 commit comments

Comments
 (0)