Skip to content

Commit 42ae460

Browse files
martenoledavidrohr
authored andcommitted
Move digit parsing into CruRawReader
1 parent 253c3ed commit 42ae460

9 files changed

Lines changed: 254 additions & 705 deletions

File tree

DataFormats/Detectors/TRD/include/DataFormatsTRD/RawData.h

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -401,20 +401,12 @@ struct trdTestPattern6 {
401401
struct DigitMCMData {
402402
// 10987654321098765432109876543210
403403
// uint32_t: 00000000000000000000000000000000
404-
/* union {
405-
uint32_t word0;
406-
struct {
407-
uint32_t a : 2;
408-
uint32_t b : 5;
409-
uint32_t adc : 21; //adc bit patternpad plane
410-
} __attribute__((__packed__));
411-
};*/
412404
union {
413405
// 10987654321098765432109876543210
414406
// uint32_t: 00000000000000000000000000000000
415407
uint32_t word;
416408
struct {
417-
uint32_t c : 2; // c is wrong I cant remember name, but not a concern at the moment.
409+
uint32_t f : 2;
418410
uint32_t z : 10;
419411
uint32_t y : 10;
420412
uint32_t x : 10;
@@ -485,16 +477,16 @@ void printTrackletHCHeader(o2::trd::TrackletHCHeader& tracklet);
485477
void printTrackletMCMData(o2::trd::TrackletMCMData& tracklet);
486478
void printTrackletMCMHeader(o2::trd::TrackletMCMHeader& mcmhead);
487479

488-
void printDigitHCHeader(o2::trd::DigitHCHeader& digitmcmheader);
489480
void printDigitMCMData(o2::trd::DigitMCMData& digitmcmdata);
490481
void printDigitMCMHeader(o2::trd::DigitMCMHeader& digitmcmhead);
491482
void printDigitMCMADCMask(o2::trd::DigitMCMADCMask& digitmcmadcmask);
492483

493484
void printHalfCRUHeader(o2::trd::HalfCRUHeader& halfcru);
494485
void clearHalfCRUHeader(o2::trd::HalfCRUHeader& halfcru);
495486
bool sanityCheckTrackletMCMHeader(o2::trd::TrackletMCMHeader* header);
496-
bool sanityCheckDigitMCMHeader(o2::trd::DigitMCMHeader* header);
487+
bool sanityCheckDigitMCMHeader(const o2::trd::DigitMCMHeader* header);
497488
bool sanityCheckDigitMCMADCMask(o2::trd::DigitMCMADCMask& mask, int numberofbitsset);
489+
bool sanityCheckDigitMCMADCMask(const o2::trd::DigitMCMADCMask& mask);
498490
bool sanityCheckDigitMCMWord(o2::trd::DigitMCMData* word, int adcchannel);
499491
void incrementADCMask(DigitMCMADCMask& mask, int channel);
500492
void printDigitMCMHeader(o2::trd::DigitMCMHeader& header);

DataFormats/Detectors/TRD/include/DataFormatsTRD/RawDataStats.h

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,15 @@ enum ParsingErrors {
3737
DigitMCMHeaderSanityCheckFailure, // essentially we did not see an MCM header see RawData.h for requirement
3838
DigitROBDecreasing, // sequential headers must have the same or increasing rob number
3939
DigitMCMNotIncreasing, // sequential headers must have increasing mcm number
40-
DigitADCMaskMismatch, // mask adc count does not match # of 1s in bitpattern
40+
DigitMCMDuplicate, // we saw two DigitMCMHeaders for the same MCM in one trigger
41+
DigitADCMaskInvalid, // mask adc count does not match # of 1s in bitpattern or the check bits are wrongly set
4142
DigitADCMaskAdvanceToEnd, // in advancing to adcmask we have reached the end of the buffer
4243
DigitMCMHeaderBypassButStateMCMHeader, // we are reading mcmadc data but the state is mcmheader
4344
DigitEndMarkerStateButReadingMCMADCData, // read the endmarker while expecting to read the mcmadcdata
4445
DigitADCChannel21, // ADCMask is zero but we are still on a digit.
4546
DigitADCChannelGT22, // error allocating digit, so digit channel has error value
4647
DigitGT10ADCs, // more than 10 adc data words seen
47-
DigitSanityCheck, // adc failed sanity check see RawData.cxx for faiulre reasons
48+
DigitSanityCheck, // adc failed sanity check based on current channel (odd/even) and check bits DigitMCMData.f
4849
DigitExcessTimeBins, // ADC has more than 30 timebins (10 adc words)
4950
DigitParsingExitInWrongState, // exiting parsing in the wrong state ... got to the end of the buffer in wrong state.
5051
DigitStackMismatch, // mismatch between rdh and hcheader stack calculation/value
@@ -59,8 +60,8 @@ enum ParsingErrors {
5960
TrackletStateMCMHeaderButParsingMCMData,
6061
TrackletTrackletCountGTThatDeclaredInMCMHeader, // mcmheader tracklet count does not match that in we have parsed.
6162
TrackletInvalidTrackletCount, // invalid tracklet count in header vs data
62-
TrackletPadRowIncreaseError, // subsequent padrow can not be less than previous one.
63-
TrackletColIncreaseError, // subsequent col can not be less than previous one
63+
TrackletDataWrongOrdering, // the tracklet data is not arriving in increasing MCM order
64+
TrackletDataDuplicateMCM, // we see more than one TrackletMCMHeader for the same MCM
6465
TrackletNoTrackletEndMarker, // got to the end of the buffer with out finding a tracklet end marker.
6566
TrackletExitingNoTrackletEndMarker, // got to the end of the buffer exiting tracklet parsing with no tracklet end marker
6667
DigitHeaderCountGT3, // digital half chamber header had more than 3 additional words expected by header. most likely corruption above somewhere.
@@ -87,7 +88,7 @@ enum ParsingErrors {
8788
FEEIDIsFFFF, // RDH is in error, the FEEID is 0xffff
8889
FEEIDBadSector, // RDH is in error, the FEEID.supermodule is not a valid value.
8990
DigitHCHeaderPreTriggerPhaseOOB, // pretrigger phase in Digit HC header has to be less than 12, it is not.
90-
HalfCRUBadBC, // saw a bc below the L0 trigger
91+
HalfCRUBadBC, // the BC in the half-CRU header is so low that the BC shift would make it negative
9192
TRDLastParsingError // This is to keep QC happy until we can change it there as well.
9293
};
9394

@@ -97,31 +98,32 @@ static std::unordered_map<int, std::string> ParsingErrorsString = {
9798
{BadDigit, "Bad Digt"},
9899
{BadTracklet, "Bad Tracklet"},
99100
{DigitEndMarkerWrongState, "Digit EndMarker but Wrong State"},
100-
{DigitMCMHeaderSanityCheckFailure, "Digit MCM Header Sanity Check Failure"},
101+
{DigitMCMHeaderSanityCheckFailure, "DigitMCMHeaderSanityCheckFailure"},
101102
{DigitROBDecreasing, "Digit ROB not increasing"},
102-
{DigitMCMNotIncreasing, "Digit MCM number Not Increasing"},
103-
{DigitADCMaskMismatch, "Digit ADCMask Mismatch"},
103+
{DigitMCMNotIncreasing, "DigitMCMNotIncreasing"},
104+
{DigitMCMDuplicate, "DigitMCMDuplicate"},
105+
{DigitADCMaskInvalid, "DigitADCMaskInvalid"},
104106
{DigitADCMaskAdvanceToEnd, "Digit ADC Mask problem, advancing to end"},
105107
{DigitMCMHeaderBypassButStateMCMHeader, "Digit MCM Header bypassed but state is mcm header"},
106108
{DigitEndMarkerStateButReadingMCMADCData, "Digit End Marker but state is MCMADCData"},
107109
{DigitADCChannel21, "Digit ADC has Channel 21"},
108110
{DigitADCChannelGT22, "Digit ADC Channel > 22"},
109111
{DigitGT10ADCs, "Digit has more than 10 ADCs"},
110-
{DigitSanityCheck, "Digit Sanity Check Failure"},
112+
{DigitSanityCheck, "DigitSanityCheck"},
111113
{DigitExcessTimeBins, "Digit has Excess TimeBins"},
112114
{DigitParsingExitInWrongState, "Digit Parsing Exiting in wrong starte"},
113115
{DigitStackMismatch, "Digit Stack MisMatch"},
114116
{DigitLayerMismatch, "Digit Layer MisMatch"},
115117
{TrackletCRUPaddingWhileParsingTracklets, "Tracklet CRU Padding while parsing trackletsl"},
116118
{TrackletHCHeaderSanityCheckFailure, "Tracklet HC Header Sanity Check Failure"},
117119
{TrackletHCHeaderFailure, "TrackletHCHeaderFailure"},
118-
{TrackletMCMHeaderSanityCheckFailure, "Tracklet MCMHeader Sanity Check Failure"},
120+
{TrackletMCMHeaderSanityCheckFailure, "TrackletMCMHeaderSanityCheckFailure"},
119121
{TrackletMCMHeaderButParsingMCMData, "Tracklet on MCMHeader, but parsing MCMData"},
120122
{TrackletStateMCMHeaderButParsingMCMData, "Tracklet state MCMHeader but parsing MCMData"},
121123
{TrackletTrackletCountGTThatDeclaredInMCMHeader, "Tracklet count > than that in the MCM header"},
122124
{TrackletInvalidTrackletCount, "Tracklet invalid tracklet count"},
123-
{TrackletPadRowIncreaseError, "Tracklet padrow is not increasing"},
124-
{TrackletColIncreaseError, "Tracklet column is not increasing"},
125+
{TrackletDataWrongOrdering, "TrackletDataWrongOrdering"},
126+
{TrackletDataDuplicateMCM, "TrackletDataDuplicateMCM"},
125127
{TrackletNoTrackletEndMarker, "Tracklet did not find an end marker"},
126128
{TrackletExitingNoTrackletEndMarker, "Tracklet exiting with out a tracklet end marker"},
127129
{DigitHeaderCountGT3, "DigitHeaderCountGT3"},
@@ -147,7 +149,7 @@ static std::unordered_map<int, std::string> ParsingErrorsString = {
147149
{FEEIDIsFFFF, "FEEID Is FFFx"},
148150
{FEEIDBadSector, "FEEID Sector is not valid"},
149151
{DigitHCHeaderPreTriggerPhaseOOB, "Digit Half Chamber Header PreTriggerPhase is out of bounds"},
150-
{HalfCRUBadBC, "HalfCRU has a bad bunchcrossing"},
152+
{HalfCRUBadBC, "HalfCRUBadBC"},
151153
{TRDLastParsingError, "Last Parsing Error"}};
152154

153155
//enumerations for the options, saves on having a long parameter list.

DataFormats/Detectors/TRD/src/RawData.cxx

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
#include <iomanip>
1313
#include <iostream>
14+
#include <bitset>
1415
#include "fairlogger/Logger.h"
1516
#include "DataFormatsTRD/RawData.h"
1617
#include "DataFormatsTRD/LinkRecord.h"
@@ -251,17 +252,29 @@ bool sanityCheckTrackletMCMHeader(o2::trd::TrackletMCMHeader* header)
251252
return goodheader;
252253
}
253254

254-
bool sanityCheckDigitMCMHeader(o2::trd::DigitMCMHeader* header)
255+
bool sanityCheckDigitMCMHeader(const o2::trd::DigitMCMHeader* header)
255256
{
256257
// a bit limited to what we can check.
257-
bool goodheader = true;
258258
if (header->res != 0xc) {
259-
goodheader = false;
259+
return false;
260260
}
261261
if (header->yearflag == 0) { //we only have data after 2007 now in run3.
262-
goodheader = false;
262+
return false;
263263
}
264-
return goodheader;
264+
return true;
265+
}
266+
267+
bool sanityCheckDigitMCMADCMask(const o2::trd::DigitMCMADCMask& mask)
268+
{
269+
if (mask.n != 0x1) {
270+
return false;
271+
}
272+
if (mask.j != 0xc) {
273+
return false;
274+
}
275+
int counter = (~mask.c) & 0x1f;
276+
std::bitset<NADCMCM> headerMask(mask.adcmask);
277+
return (counter == headerMask.count());
265278
}
266279

267280
bool sanityCheckDigitMCMADCMask(o2::trd::DigitMCMADCMask& mask, int numberofbitsset)
@@ -294,7 +307,7 @@ bool sanityCheckDigitMCMWord(o2::trd::DigitMCMData* word, int adcchannel)
294307
{
295308
bool gooddata = true;
296309
// DigitMCMWord0x3 is odd 10 for odd adc channels and 11 for even, counted as the first of the 3.
297-
switch (word->c) {
310+
switch (word->f) {
298311
case 3: // even adc channnel
299312
if (adcchannel % 2 == 0) {
300313
gooddata = true;
@@ -329,8 +342,8 @@ void printDigitMCMHeader(o2::trd::DigitMCMHeader& digitmcmhead)
329342

330343
void printDigitMCMData(o2::trd::DigitMCMData& digitmcmdata)
331344
{
332-
LOGF(info, "DigitMCMRawData: Raw:0x%08x res(0xc):0x%02x x: 0x%04x y: 0x%04x z 0x%04x ",
333-
digitmcmdata.word, digitmcmdata.c, digitmcmdata.x, digitmcmdata.y, digitmcmdata.z);
345+
LOGF(info, "DigitMCMRawData: Raw:0x%08x res:0x%x x: 0x%03x y: 0x%03x z 0x%03x ",
346+
digitmcmdata.word, digitmcmdata.f, digitmcmdata.x, digitmcmdata.y, digitmcmdata.z);
334347
}
335348
void printDigitMCMADCMask(o2::trd::DigitMCMADCMask& digitmcmadcmask)
336349
{

Detectors/TRD/reconstruction/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
o2_add_library(TRDReconstruction
1313
SOURCES src/CTFCoder.cxx
1414
src/CTFHelper.cxx
15-
src/DigitsParser.cxx
1615
src/CruRawReader.cxx
1716
src/DataReaderTask.cxx
1817
src/EventRecord.cxx

Detectors/TRD/reconstruction/include/TRDReconstruction/CruRawReader.h

Lines changed: 20 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,15 @@
1616
#ifndef O2_TRD_CRURAWREADER
1717
#define O2_TRD_CRURAWREADER
1818

19-
#include <fstream>
20-
#include <iostream>
2119
#include <string>
2220
#include <cstdint>
21+
#include <bitset>
2322
#include <array>
24-
#include <vector>
25-
#include <chrono>
2623
#include "Headers/RAWDataHeader.h"
2724
#include "Headers/RDHAny.h"
2825
#include "DetectorsRaw/RDHUtils.h"
2926
#include "DataFormatsTRD/RawData.h"
3027
#include "DataFormatsTRD/RawDataStats.h"
31-
#include "TRDReconstruction/DigitsParser.h"
3228
#include "DataFormatsTRD/Constants.h"
3329
#include "DataFormatsTRD/Digit.h"
3430
#include "CommonDataFormat/InteractionRecord.h"
@@ -83,15 +79,18 @@ class CruRawReader
8379
void clearall()
8480
{
8581
mEventRecords.clear();
86-
mDigitsParser.clear();
8782
}
8883

89-
enum TrackletParserState { StateTrackletHCHeader,
90-
StateTrackletMCMHeader,
91-
StateTrackletMCMData,
92-
StateMoveToEndMarker,
93-
StateSecondEndmarker,
94-
StateFinished };
84+
// both the tracklet and the digit parsing is implemented as a state machine
85+
enum ParsingState { StateTrackletHCHeader,
86+
StateTrackletMCMHeader,
87+
StateTrackletMCMData,
88+
StateDigitMCMHeader,
89+
StateDigitADCMask,
90+
StateDigitMCMData,
91+
StateMoveToEndMarker,
92+
StateSecondEndmarker,
93+
StateFinished };
9594

9695
private:
9796
// the parsing starts here, payload from all available RDHs is copied into mHBFPayload and afterwards processHalfCRU() is called
@@ -119,6 +118,8 @@ class CruRawReader
119118
// returns total number of words read (no matter if parsed successfully or not)
120119
int parseTrackletLinkData(int linkSize32, int& hcid, int& trackletWordsRejected);
121120

121+
int parseDigitLinkData(int maxWords32, int hcid, int& digitWordsRejected);
122+
122123
// check validity of TrackletHCHeader (always once bit needs to be set and hcid needs to be consistent with what we expect from RDH)
123124
// FIXME currently hcid can be overwritten from TrackletHCHeader
124125
bool isTrackletHCHeaderOK(const TrackletHCHeader& header, int& hcid);
@@ -136,9 +137,6 @@ class CruRawReader
136137
// helper function to dump the whole input payload including RDH headers
137138
void dumpInputPayload() const;
138139

139-
// dump out a link with in a half cru buffer
140-
void outputLinkRawData(int link);
141-
142140
// ###############################################################
143141
// ## class member variables
144142
// ###############################################################
@@ -149,7 +147,7 @@ class CruRawReader
149147
int mHalfChamberMajor{0};
150148
std::bitset<16> mOptions;
151149

152-
std::array<uint32_t, o2::trd::constants::HBFBUFFERMAX> mHBFPayload; // this holds the O2 payload held with in the HBFs to pass to parsing.
150+
std::array<uint32_t, o2::trd::constants::HBFBUFFERMAX> mHBFPayload; // the full input data payload excluding the RDH header(s)
153151

154152
uint32_t mTotalTrackletsFound{0}; // accumulated number of tracklets found
155153
uint32_t mTotalDigitsFound{0}; // accumulated number of digits found
@@ -169,15 +167,14 @@ class CruRawReader
169167
HalfCRUHeader mCurrentHalfCRUHeader; // are we waiting for new header or currently parsing the payload of on
170168
HalfCRUHeader mPreviousHalfCRUHeader; // are we waiting for new header or currently parsing the payload of on
171169
DigitHCHeader mDigitHCHeader; // Digit HalfChamber header we are currently on.
172-
uint16_t mTimeBins; // the number of time bins to be read out (default 30, can be overwritten from digit HC header)
173-
bool mHaveSeenDigitHCHeader3{false};
170+
uint16_t mTimeBins{constants::TIMEBINS}; // the number of time bins to be read out (default 30, can be overwritten from digit HC header)
171+
bool mHaveSeenDigitHCHeader3{false}; // flag, whether we can compare an incoming DigitHCHeader3 with a header we have seen before
174172
uint32_t mPreviousDigitHCHeadersvnver; // svn ver in the digithalfchamber header, used for validity checks
175173
uint32_t mPreviousDigitHCHeadersvnrver; // svn release ver also used for validity checks
176-
TrackletHCHeader mTrackletHCHeader; // Tracklet HalfChamber header we are currently on.
177-
uint16_t mCurrentLink; // current link within the halfcru we are parsing 0-14
178-
uint16_t mCRUEndpoint; // the upper or lower half of the currently parsed cru 0-14 or 15-29
179-
uint16_t mCRUID; // CRU ID taken from the FEEID of the RDH
180-
TRDFeeID mFEEID; // current Fee ID working on
174+
175+
uint16_t mCRUEndpoint; // the upper or lower half of the currently parsed cru 0-14 or 15-29
176+
uint16_t mCRUID; // CRU ID taken from the FEEID of the RDH
177+
TRDFeeID mFEEID; // current Fee ID working on
181178

182179
o2::InteractionRecord mIR;
183180
std::array<uint32_t, 15> mCurrentHalfCRULinkLengths;
@@ -193,8 +190,6 @@ class CruRawReader
193190
uint32_t mWordsRejected = 0; // those words rejected before tracklet and digit parsing together with the digit and tracklet rejected words;
194191
uint32_t mWordsAccepted = 0; // those words before before tracklet and digit parsing together with the digit and tracklet rejected words;
195192

196-
DigitsParser mDigitsParser;
197-
198193
EventStorage mEventRecords; // store data range indexes into the above vectors.
199194
EventRecord* mCurrentEvent; // the current event we are looking at, info extracted from cru half chamber header.
200195
};

0 commit comments

Comments
 (0)