30 ATH_CHECK(detStore()->retrieve(itkStripsDetManager,
"ITkStrip"));
33 if (element->swapPhiReadoutDirection()) {
38 return StatusCode::SUCCESS;
46 const EventContext& ctx,
47 const std::vector<IdentifierHash>* vecHash)
const
51 const uint32_t robID=robFrag.rod_source_id();
53 StatusCode
sc = StatusCode::SUCCESS;
59 cache.vecHash = vecHash;
62 const unsigned long int vecROBDataSize{robFrag.rod_ndata()};
63 if (vecROBDataSize > robFrag.payload_size_word()) {
64 ATH_MSG_WARNING(
"The ROB data does not seem to fit in the payload. Rejecting fragment (ndata size " << vecROBDataSize <<
" !< payload size " << robFrag.payload_size_word()
65 <<
" header size: " << robFrag.rod_header_size_word()
66 <<
" trailer size: " << robFrag.rod_trailer_size_word()
67 <<
" fragment size: " << robFrag.rod_fragment_size_word()
69 return StatusCode::RECOVERABLE;
71 robFrag.rod_data(vecROBData);
76 for (uint32_t i=0; i<vecROBDataSize; i++) {
81 const uint8_t* vecROBData_8bits =
reinterpret_cast<const uint8_t*
>(vecROBData);
82 const size_t total_bytes = vecROBDataSize *
sizeof(uint32_t);
84 uint32_t nclusters = 0;
85 uint8_t isHCCHeader = 0;
87 uint16_t hccword1 = 0;
89 uint8_t HccHeadFound = 0;
90 uint16_t packetSize = 0;
91 bool noClusterTag =
false;
93 for (
size_t i=0; i < total_bytes; i+=2) {
95 bool hasError =
false;
96 bool breakNow =
false;
97 uint16_t psize=packetSize/4;
98 uint16_t word16 = (vecROBData_8bits[i] << 8) | vecROBData_8bits[i + 1];
99 ATH_MSG_DEBUG(
" 16-bit word: " << std::bitset<16>(word16) <<
" " << (uint32_t)i <<
" " << total_bytes );
101 if(i==total_bytes-2)
ATH_MSG_DEBUG(
"nClusters found (this): " << (uint32_t)nclusters);
103 ATH_MSG_DEBUG(
"Check: " << nPacket <<
" Packets: " << packetSize/4 <<
" isHCCHeader: " << (uint32_t)isHCCHeader <<
" " << nPacket);
105 if(psize != 0 && nPacket != 0){
107 if((nPacket+1) % (packetSize/2)==0) nPacket=-1;
110 if(word16 == 0 && noClusterTag && nPacket != 0){
113 }
else if((vecROBData_8bits[i] == 0 || isHCCHeader == 1) && HccHeadFound == 0 && nPacket<2){
115 ATH_MSG_DEBUG(
"HCC header found, will decode the next three 8-bit words: " <<(uint32_t)isHCCHeader);
116 if(isHCCHeader == 0){
117 hccword1 = (vecROBData_8bits[i + 1] << 8) | vecROBData_8bits[i+2];
119 }
else if(isHCCHeader == 1){
120 word8 = vecROBData_8bits[i + 1];
123 ATH_CHECK(
processHccHeader(hccword1, word8, isHCCHeader, robID, data, rdoIDCont, dataItemsPool, cache, errs, hasError, breakNow,ctx));
124 if(isHCCHeader==0) HccHeadFound = 1;
127 }
else if((HccHeadFound==1 && vecROBData_8bits[i] == 0) || HccHeadFound==2){
128 if(HccHeadFound==1) HccHeadFound=2;
129 else if(HccHeadFound==2){
135 }
else if(packetSize!=0 && ((vecROBData_8bits[i] & 0xF8) == 0x18) && (((nPacket+1) % (packetSize/2)) == 5)){
139 ATH_CHECK(
processHeader(word16, robID, data, rdoIDCont, dataItemsPool, cache, errs, hasError, breakNow,ctx));
142 if(word16 == 0xed6f){
148 ATH_CHECK(
processHits(word16, robID, data, rdoIDCont, dataItemsPool, cache, errs, hasError, ctx));
154 if (data.isStripValid()) {
155 if (not data.isSaved()) {
157 const int rdoMade{
makeRDO(data, cache, dataItemsPool)};
159 sc = StatusCode::RECOVERABLE;
163 data.setSaved(rdoMade);
168 for (
auto& [hash, rdoColl] : data.rdoCollMap) {
169 if (rdoColl==
nullptr)
continue;
171 if (rdoColl->empty()) {
177 ATH_CHECK(data.writeHandleMap[hash].addOrDelete(std::move(rdoColl)));
180 if (
sc.isFailure())
ATH_MSG_DEBUG(
"One or more ByteStream errors found ");
192 if (rdoColl==
nullptr) {
193 ATH_MSG_WARNING(
"Null rdoCollection pointer found for linkIDHash: " << (uint32_t)data.linkIDHash);
197 int strip = data.strip;
198 if (((
strip & 0x7F) + (data.groupSize-1) >= 9999) or (
strip<0) or (
strip>=9999)) {
200 <<
" in collection " << data.linkIDHash <<
" out of range. Will not make RDO");
206 if (data.linkIDHash == cache.skipHash) {
210 else if (data.linkIDHash != cache.lastHash) {
211 cache.lastHash = data.linkIDHash;
213 std::vector<IdentifierHash>::const_iterator hashIDIterator{
find(cache.vecHash->begin(),
214 cache.vecHash->end(),
216 if (hashIDIterator == cache.vecHash->end()) {
219 cache.skipHash = data.linkIDHash;
232 const unsigned int rawDataWord{
static_cast<unsigned int>(data.groupSize | (
strip << 11) | (data.timeBin <<22) | (data.errors << 25))};
234 ATH_MSG_DEBUG(
"Output Raw Data " << std::hex <<
" Coll " << data.collID.getString()
235 <<
":-> " <<
m_itkStripsID->print_to_string(digitID) << std::dec);
242 (*sct_rdo) =
SCT3_RawData(digitID, rawDataWord, &(data.errorHit));
245 rdoColl->
push_back(std::make_unique<SCT3_RawData>(digitID, rawDataWord, &(data.errorHit)));
254 const std::unordered_set<IdentifierHash>* )
const
256 return StatusCode::SUCCESS;
265 return StatusCode::SUCCESS;
271 uint8_t &isHCCHeader,
280 const EventContext& )
const
283 StatusCode
sc{StatusCode::SUCCESS};
285 if(isHCCHeader == 1){
292 uint8_t
barrel = ((hccword1 >> 8) & 0x80);
293 ATH_MSG_DEBUG(
"is barrel: " << std::bitset<16>(hccword1 >> 8) <<
" " << std::bitset<8>(
barrel));
294 uint8_t side = ((hccword1 >> 5) & 0x80);
295 ATH_MSG_DEBUG(
"side : " << std::bitset<16>(hccword1 >> 5) <<
" " << std::bitset<8>(side));
296 uint8_t disk = ((hccword1 >> 9) & 0x7);
297 ATH_MSG_DEBUG(
"disk : " << std::bitset<16>((hccword1 >> 9) & 0x7) <<
" " << std::bitset<8>(disk));
298 uint8_t inout = ((hccword1 >> 8) & 0x1);
299 ATH_MSG_DEBUG(
"inout : " << std::bitset<16>((hccword1 >> 8) & 0x1) <<
" " << std::bitset<8>(inout));
300 uint8_t petal = ((hccword1 >> 7) & 0x1);
301 ATH_MSG_DEBUG(
"petal : " << std::bitset<16>((hccword1 >> 7) & 0x1) <<
" " << std::bitset<8>(petal));
302 uint8_t phimod = hccword1 & 0x7F;
303 ATH_MSG_DEBUG(
"phimod : " << std::bitset<16>(hccword1 & 0x7F) <<
" " << std::bitset<8>(phimod));
304 uint8_t hccnum = word8 & 0x80;
305 ATH_MSG_DEBUG(
"hccnum : " << std::bitset<16>(word8 & 0x80) <<
" " << std::bitset<8>(hccnum));
306 uint8_t etamod = word8 & 0x3F;
307 ATH_MSG_DEBUG(
"etamod : " << std::bitset<16>(word8 & 0x3F) <<
" " << std::bitset<8>(etamod));
309 bool isbarrel = (
barrel != 0x0);
310 bool issideA = (side != 0x0);
311 bool isinout = (inout == 0x1);
312 bool ispetal = (petal == 0x1);
313 uint8_t hccN = (hccnum == 0x80) ? 2 : 1;
315 ATH_MSG_DEBUG(
"isBarrel: " << isbarrel <<
" isSideA: " << issideA <<
" disk: " << (uint32_t)disk);
316 ATH_MSG_DEBUG(
"isInOut: " << isinout <<
" isPetal: " << ispetal <<
" phimod: " << (uint32_t)phimod);
317 ATH_MSG_DEBUG(
"HCCNum: " << (uint32_t)hccN <<
" etamod: " << (uint32_t)etamod);
319 int barrel_ec = isbarrel ? 0 : (issideA ? 2 : -2);
323 data.setCollection(
m_itkStripsID, offlinehash, rdoIDCont, dataItemsPool, errs);
326 ATH_MSG_DEBUG(
"hccheader " << isbarrel <<
" " << issideA <<
" " << (uint32_t)disk <<
" " << (uint32_t)inout <<
" " << (uint32_t)phimod <<
" " << (uint32_t)etamod <<
" " << (uint32_t)hccN );
335 const uint32_t robID,
343 const EventContext& ctx)
const
345 StatusCode
sc = StatusCode::SUCCESS;
347 data.foundHeader =
true;
350 uint8_t
type = (word16 >> 12) & 0xF;
352 uint8_t l0tag = (word16 >> 4) & 0x7F;
353 uint8_t bcid_low = (word16 >> 1) & 0x7;
354 uint8_t bcid_xor = word16 & 0x1;
356 ATH_MSG_DEBUG(
"l0tag: " << (uint32_t)l0tag <<
" bcid_low: " << (uint32_t)bcid_low <<
" bcid_xor: " << (uint32_t)bcid_xor <<
" type: " << (uint32_t)
type <<
" word16: " << std::bitset<16>(word16));
359 constexpr bool breakHere{
false};
361 if (hasError)
sc = StatusCode::RECOVERABLE;
362 if (breakHere)
return sc;
369 if (data.isStripValid()) {
370 if (not data.isSaved()) {
372 const int rdoMade{
makeRDO(data, cache, dataItemsPool)};
378 data.setSaved(rdoMade);
387 const int rodlinkNumber{
static_cast<int>(word16 & 0x7F)};
390 data.linkNumber = (((rodlinkNumber >>4)&0x7)*12+(rodlinkNumber &0xF));
391 const uint32_t onlineID{(robID & 0xFFFFFF) | (data.linkNumber << 24)};
392 ATH_MSG_DEBUG(
"OnlineID: " << (uint32_t)onlineID <<
" Link number: " << data.linkNumber);
394 if ((onlineID ==0) or (data.linkNumber > 95)) {
397 ATH_MSG_DEBUG(
"Header: xxx Link number out of range (skipping following data)"
398 << std::dec << data.linkNumber);
403 hash =
m_cabling->getHashFromOnlineId(onlineID, ctx);
404 if (hash.is_valid()) {
409 std::stringstream
msg;
410 msg <<std::hex << onlineID;
411 ATH_MSG_WARNING(
"Rob fragment (rob=" << robID <<
") with invalid onlineID " <<
msg.str() <<
" -> " << hash <<
".");
414 if (!hasError and not hash.is_valid()) {
415 std::stringstream
msg;
416 msg <<std::hex << onlineID;
417 ATH_MSG_WARNING(
"Rob fragment (rob=" << robID <<
") with invalid onlineID " <<
msg.str() <<
" -> " << hash <<
".");
421 data.condensedMode =
static_cast<bool>(word16 & 0x100);
434 const EventContext& )
const
436 StatusCode
sc = StatusCode::SUCCESS;
438 uint nchip = (word16 >> 11) & 0xF;
439 bool isSecondRow = (word16 >> 10) & 0x01;
440 uint8_t address = (word16 >> 3) & 0x7F;
443 uint8_t firsthit = (word16 >> 2) & 0x1;
444 uint8_t secondhit = (word16 >> 1) & 0x1;
445 uint8_t thirdhit = (word16) & 0x1;
451 uint8_t stripN1 = 0,stripN2 = 0,stripN3=0;
456 stripN1 = 2*addr + (isSecondRow ? 1 : 0);
460 stripN2 = 2*addr + (isSecondRow ? 1 : 0);
464 stripN3 = 2*addr + (isSecondRow ? 1 : 0);
468 data.strip = nchip * 128 + address;
470 ATH_MSG_DEBUG(
"abcclusters " << (uint32_t)nchip <<
" " << (uint32_t)data.strip <<
" " << (uint32_t)(stripN1) <<
" " << (uint32_t)(stripN2) <<
" " << (uint32_t)(stripN3));
473 if (thirdhit) data.groupSize = 4;
474 else if (secondhit) data.groupSize = 3;
475 else if (firsthit) data.groupSize = 2;
477 const int rdoMade =
makeRDO(data, cache, dataItemsPool);
482 data.setSaved(rdoMade);
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_WARNING(x,...)
#define ATH_MSG_VERBOSE(x,...)
InDetRawDataCollection< SCT_RDORawData > SCT_RDO_Collection
InDetRawDataContainer< InDetRawDataCollection< SCT_RDORawData > > SCT_RDO_Container
a typed memory pool that saves time spent allocation small object.
pointer nextElementPtr()
obtain the next available element in pool by pointer pool is resized if its limit has been reached On...
value_type push_back(value_type pElem)
IDC like storage for BS errors, TODO, customise implementation further so that we store int rather th...
StatusCode addSingleError(const IdentifierHash &hashID, SCT_ByteStreamErrors::ErrorType error, SCT_RodDecoderErrorsHelper &errs) const
Add single eror.
std::atomic_uint m_headNumber
Total number of decoded header data.
int makeRDO(SharedData &data, CacheHelper &cache, DataPool< SCT3_RawData > *dataItemsPool) const
Builds RawData RDO and adds to RDO container.
StatusCode processHeader(const uint16_t inData, const uint32_t robID, SharedData &data, SCT_RDO_Container &rdoIDCont, DataPool< SCT3_RawData > *dataItemsPool, CacheHelper &cache, SCT_RodDecoderErrorsHelper &errs, bool &hasError, bool &breakNow, const EventContext &ctx) const
Process header word.
StatusCode processHits(const uint16_t inData, const uint32_t robID, SharedData &data, SCT_RDO_Container &rdoIDCont, DataPool< SCT3_RawData > *dataItemsPool, CacheHelper &cache, SCT_RodDecoderErrorsHelper &errs, bool &hasError, const EventContext &ctx) const
Process raw data word.
virtual StatusCode initialize() override
Initialize.
std::atomic_uint m_nRDOs
Total number of SCT RDOs created.
ToolHandle< IITkStripCablingTool > m_cabling
Providing mappings of online and offline identifiers and also serial numbers.
const SCT_ID * m_itkStripsID
Identifier helper class for the SCT subdetector that creates compact Identifier objects and Identifie...
StatusCode processHccHeader(const uint16_t inData, const uint8_t data8, uint8_t &isHCCHeader, const uint32_t robID, SharedData &data, SCT_RDO_Container &rdoIDCont, DataPool< SCT3_RawData > *dataItemsPool, CacheHelper &cache, SCT_RodDecoderErrorsHelper &errs, bool &hasError, bool &breakNow, const EventContext &ctx) const
Process header word.
virtual StatusCode fillCollection(const OFFLINE_FRAGMENTS_NAMESPACE::ROBFragment &robFrag, SCT_RDO_Container &rdoIDCont, IDCInDetBSErrContainer &errs, DataPool< SCT3_RawData > *dataItemsPool, const EventContext &ctx, const std::vector< IdentifierHash > *vecHash=nullptr) const override
Fill SCT RDO Collection with decoded ROB data.
IdContext m_contextITk
"Context" of an expanded identifier (ExpandedIdentifier) for compact or hash versions (Identifier32 o...
std::vector< bool > m_swapPhiReadoutDirection
Swap phi readout direction.
StatusCode addRODError(uint32_t rodID, SCT_ByteStreamErrors::ErrorType error, SCT_RodDecoderErrorsHelper &errs, const std::unordered_set< IdentifierHash > *foundHashes=nullptr) const
Add an error for each wafer in the problematic ROD.
This is a "hash" representation of an Identifier.
Dedicated detector manager extending the functionality of the SiDetectorManager with dedicated SCT in...
virtual const SiDetectorElementCollection * getDetectorElementCollection() const override
access to whole collectiom
Class to hold the SiDetectorElement objects to be put in the detector store.
Class to hold geometrical description of a silicon detector element.
allows to accumulate errors in one fillColection call
void removeIfEmpty(const IdentifierHash id)
std::string find(const std::string &s)
return a remapped string
const DataType * PointerType
eformat::ROBFragment< PointerType > ROBFragment
ErrorType
SCT byte stream error type enums used in SCT_RodDecoder, SCT_ByteStreamErrorsTool,...
Temp object to help with trigger caching.
Struct to hold data shared in methods used in fillCollection method.