ATLAS Offline Software
Loading...
Searching...
No Matches
ITkStripsRodEncoder Class Reference

Athena Algorithm Tool that provides conversion from ITkStrips RDO to ROD format Bytestream. More...

#include <ITkStripsRodEncoder.h>

Inheritance diagram for ITkStripsRodEncoder:
Collaboration diagram for ITkStripsRodEncoder:

Public Member Functions

virtual ~ITkStripsRodEncoder ()=default
 Destructor.
virtual StatusCode initialize () override
 Initialize.
virtual void fillROD (std::vector< uint32_t > &vec32Data, const uint32_t &robID, const std::vector< const SCT_RDORawData * > &vecRDOs) const override
 Main Convert method.

Private Member Functions

void encodeData (const std::vector< uint16_t > &clusters, const uint16_t ichannel, std::vector< uint8_t > &data_encode, int typ, uint8_t l0tag, uint8_t bc_count, uint32_t hccKey, uint16_t &size) const
void packFragments (std::vector< uint8_t > &vec8Words, std::vector< uint32_t > &vec32Words) const
 Method to pack vector of 8 bit words intto a vector of 32 bit words.
std::vector< uint16_t > clusterFinder (const std::bitset< 256 > &inputData, const uint8_t maxCluster=63) const
 @breif Method to set pairs of 8 bit words to a 32 bit word.
uint16_t clusterFinder_sub (uint64_t &hits_high64, uint64_t &hits_low64, bool isSecondRow) const
uint32_t set32Bits (const unsigned short int *arr8Words, const unsigned short int *position, const unsigned short int &numWords) const
bool getBit_128b (uint8_t bit_addr, uint64_t data_high64, uint64_t data_low64) const
void setBit_128b (uint8_t bit_addr, bool value, uint64_t &data_high64, uint64_t &data_low64) const
bool getParity_8bits (uint8_t val) const
int getBarrelEC (const SCT_RDORawData *rdo) const
 Get the barrel/endcape info from the RDO.
uint8_t getDiskLayer (const SCT_RDORawData *rdo) const
 Get disk/layer info from the RDO.
uint8_t getPhiModule (const SCT_RDORawData *rdo) const
 Get the phi value info from the RDO.
int getEtaModule (const SCT_RDORawData *rdo) const
 Get the eta value info from the RDO.
uint16_t getStripMax (const SCT_RDORawData *rdo) const
 Get the maxumum strip value info from the RDO.
int getSide (const SCT_RDORawData *rdo) const
 Get the side info from the RDO.
int getTimeBin (const SCT_RDORawData *rdo) const
 Get the time bin info from the RDO.
int getStrip (const SCT_RDORawData *rdo) const
 Get the strip number info from the RDO.
Identifier offlineID (const SCT_RDORawData *rdo) const
 Get the offline Identifier from the RDO.
uint32_t onlineID (const SCT_RDORawData *rdo) const
 Get the online Identifier from the RDO.
int getRODLink (const SCT_RDORawData *rdo) const
 Get the ROD link number info in the RDO header data.
uint16_t getHeaderPhysicsPacket (int typ, uint8_t l0tag, uint8_t bc_count) const
 Get the 16-bit word for a header with Type (PR or LP), L0Tag event and BCID.
uint16_t getHeaderUsingRDO (const SCT_RDORawData *rdo) const
 Get the 16-bit word for a header for a hit.
uint16_t getHeaderUsingHash (const IdentifierHash &linkHash, const int &errorWord) const
 Get the 16-bit word for a header for a link with a ByteStream error.
uint16_t getTrailer (const int &errorWord) const
 Get the 16-bit word for a trailer, with or without ByteStream errors.

Private Attributes

std::atomic< uint8_t > m_bcid = 0
 Method to encode RDO data to vector of 16 bin words.
std::atomic< uint8_t > m_l0tag = 0
ToolHandle< IITkStripCablingToolm_cabling
 Providing mappings of online and offline identifiers and also serial numbers.
ToolHandle< ITkStripDataRateMonToolm_dataRateMonTool {this, "DataRateMonitoringTool", "", "Monitoring tool for data rate evaluation"}
const SCT_IDm_itkStripsID {nullptr}
 Identifier helper class for the ITkStrips subdetector that creates compact Identifier objects and IdentifierHash or hash IDs.
BooleanProperty m_condensed {this, "CondensedMode", false, "Condensed mode (true) or Expanded mode (false)"}
 Example Boolean used to determine decoding mode, maybe unused finally.
std::set< Identifierm_swapModuleID {}
 Swap Module identifier, set by SCTRawContByteStreamTool.

Detailed Description

Athena Algorithm Tool that provides conversion from ITkStrips RDO to ROD format Bytestream.

Definition at line 31 of file ITkStripsRodEncoder.h.

Constructor & Destructor Documentation

◆ ~ITkStripsRodEncoder()

virtual ITkStripsRodEncoder::~ITkStripsRodEncoder ( )
virtualdefault

Destructor.

Member Function Documentation

◆ clusterFinder()

std::vector< uint16_t > ITkStripsRodEncoder::clusterFinder ( const std::bitset< 256 > & inputData,
const uint8_t maxCluster = 63 ) const
private

@breif Method to set pairs of 8 bit words to a 32 bit word.

Function used by the packFragments(...) method.

Parameters
arr8WordsPointer to array containing a pair of 8 bit words.
positionPointer to an array that gives the 32 bit starting positions of the 8 bit words and corresponding to arr8Words.
numWordsNumber of word to be set to a 32 bit word.

Definition at line 307 of file ITkStripsRodEncoder.cxx.

307 {
308
309 std::vector<uint16_t> clusters;
310
311 // Split into far (odd) and near (even) strips
312 std::bitset<128> dataEven;
313 std::bitset<128> dataOdd;
314 for(int i=0; i<128; ++i){
315 dataEven[i] = inputData[2*i];
316 dataOdd[i] = inputData[2*i+1];
317 }
318
319 // Split the 128-bit Even and Odd data into four 64-bit chunks for processing
320 uint64_t d0l = chunk<0>(dataEven);
321 uint64_t d0h = chunk<1>(dataEven);
322
323 uint64_t d1l = chunk<0>(dataOdd);
324 uint64_t d1h = chunk<1>(dataOdd);
325
326 while (d0l or d0h or d1l or d1h){
327 if (clusters.size() > maxCluster) break;
328
329 uint16_t cluster1 = clusterFinder_sub(d1h, d1l, true);
330 if (cluster1 != 0x3ff) // No cluster was found
331 clusters.push_back(cluster1);
332
333 if (clusters.size() > maxCluster) break;
334
335 uint16_t cluster0 = clusterFinder_sub(d0h, d0l, false);
336 if (cluster0 != 0x3ff) // No cluster was found
337 clusters.push_back(cluster0);
338 }
339
340 if (clusters.empty()) {
341 clusters.push_back(0x3fe);
342 } else {
343 clusters.back() |=1 << 11;
344 }
345
346 return clusters;
347}
uint16_t clusterFinder_sub(uint64_t &hits_high64, uint64_t &hits_low64, bool isSecondRow) const
setWord1 uint16_t

◆ clusterFinder_sub()

uint16_t ITkStripsRodEncoder::clusterFinder_sub ( uint64_t & hits_high64,
uint64_t & hits_low64,
bool isSecondRow ) const
private

Definition at line 368 of file ITkStripsRodEncoder.cxx.

368 {
369 uint8_t hit_addr = 128;
370 uint8_t hit_mask = 0;
371
372 if (hits_low64){
373 hit_addr = __builtin_ctzll(hits_low64);
374 } else if (hits_high64){
375 hit_addr = __builtin_ctzll(hits_high64) + 64;
376 }
377
378 hit_mask = getBit_128b(hit_addr+1, hits_high64, hits_low64) << 2
379 | getBit_128b(hit_addr+2, hits_high64, hits_low64) << 1
380 | getBit_128b(hit_addr+3, hits_high64, hits_low64);
381
382 for (int i=0; i<4; ++i)
383 setBit_128b(hit_addr+i, 0, hits_high64, hits_low64);
384
385 if (hit_addr == 128) {
386 return 0x3ff;
387 } else {
388 hit_addr += isSecondRow<<7;
389 return hit_addr << 3 | hit_mask;
390 }
391}
void setBit_128b(uint8_t bit_addr, bool value, uint64_t &data_high64, uint64_t &data_low64) const
bool getBit_128b(uint8_t bit_addr, uint64_t data_high64, uint64_t data_low64) const

◆ encodeData()

void ITkStripsRodEncoder::encodeData ( const std::vector< uint16_t > & clusters,
const uint16_t ichannel,
std::vector< uint8_t > & data_encode,
int typ,
uint8_t l0tag,
uint8_t bc_count,
uint32_t hccKey,
uint16_t & size ) const
private

Definition at line 267 of file ITkStripsRodEncoder.cxx.

268 {
269
270
271 if(hccKey!=0){
272 ATH_MSG_DEBUG("hccKey: " << std::bitset<32>(hccKey));
273 ATH_MSG_DEBUG("hccKey 8-bit word-4: "<<std::bitset<8>(hccKey));
274 ATH_MSG_DEBUG("hccKey 8-bit word-3: "<<std::bitset<8>(hccKey>>24));
275 ATH_MSG_DEBUG("hccKey 8-bit word-2: "<<std::bitset<8>(hccKey>>16));
276 ATH_MSG_DEBUG("hccKey 8-bit word-1: "<<std::bitset<8>(hccKey>>8));
277
278 data_encode.push_back(hccKey);
279 data_encode.push_back(hccKey>>24);
280 data_encode.push_back(hccKey>>16);
281 data_encode.push_back(hccKey>>8);
282
283 uint16_t header = getHeaderPhysicsPacket(ptyp, l0tag, bc_count);
284 ATH_MSG_DEBUG("header: " << std::bitset<16>(header));
285 data_encode.push_back((header>>8) & 0xff);
286 data_encode.push_back(header & 0xff);
287 }
288
289 for(size_t idx=0;auto &cluster : clusters){
290 if(cluster == 0x3fe) continue;
291 if(idx!=0) size++;
292
293 // cluster bits:
294 // "0" + 4-bit channel number + 11-bit cluster dropping the last cluster bit
295 uint16_t clusterbits = ((ichannel & 0xf) << 11) | (cluster & 0x7ff);
296 ATH_MSG_DEBUG("Clusters: " << idx << ": " << std::bitset<16>(clusterbits) << " size: " << size << " ichannel: " << ichannel);
297 data_encode.push_back((clusterbits>>8) & 0xff);
298 data_encode.push_back(clusterbits & 0xff);
299 idx++;
300 }
301
302 return;
303}
#define ATH_MSG_DEBUG(x)
size_t size() const
Number of registered mappings.
uint16_t getHeaderPhysicsPacket(int typ, uint8_t l0tag, uint8_t bc_count) const
Get the 16-bit word for a header with Type (PR or LP), L0Tag event and BCID.

◆ fillROD()

void ITkStripsRodEncoder::fillROD ( std::vector< uint32_t > & vec32Data,
const uint32_t & robID,
const std::vector< const SCT_RDORawData * > & vecRDOs ) const
overridevirtual

Main Convert method.

Converts SCT RDO to a vector of 32 bit words. Starts by retrieving and collecting errors, then loops through RDO's and decode them to 16 bit words, and then finally it packs the 16 bit word into 32 bit words vector.

Parameters
vec32DataVector of 32 bit words to be filled with encoded RDOs from the SCT.
robIDID of the current readout buffer (ROB).
vecRDOsVector containing the RDOs to be coverted to vector of 32 bit words.

Definition at line 121 of file ITkStripsRodEncoder.cxx.

122 {
123 //code to be filled here
124
125 std::unordered_map<uint32_t, std::vector<std::bitset<256>>> allStripData;
126 std::unordered_map<uint32_t, IdentifierHash> keyToHash;
127
128 IdentifierHash offlineHash = 0;
129
130 for (const auto& rdo : vecRDOs) {
131 int barrelEC = getBarrelEC(rdo);
132 int eta_mod = getEtaModule(rdo);
133 uint8_t side = getSide(rdo);
134 uint8_t disk = getDiskLayer(rdo);
135 uint8_t phi_mod = getPhiModule(rdo);
136 uint16_t strip_max = getStripMax(rdo);
137
138 if (strip_max == 0xFFFF){
139 //To do: Implement workaround
140 const Identifier rdoID{rdo->identify()};
141 ATH_MSG_WARNING("Negative maximum number of strips found " << m_itkStripsID->strip_max(rdoID));
142 continue;
143 }
144
145 uint8_t sideAC = 0;
146 if((barrelEC == 0 && eta_mod > 0) || barrelEC > 0) sideAC = 1;
147
148 uint8_t eta_group=0;
149
150 if (barrelEC == 0) {
151 if(disk < 2){
152 eta_group = static_cast<uint8_t>(std::floor((std::abs(eta_mod)-1) / 4));
153 }else{
154 eta_group = static_cast<uint8_t>(std::floor((std::abs(eta_mod)-1) / 2));
155 }
156 }else {
157 if(eta_mod>=0 && eta_mod<=9) eta_group = static_cast<uint8_t>(std::floor(eta_mod / 4));
158 else if(eta_mod>=10 && eta_mod<=13) eta_group = static_cast<uint8_t>(std::floor((eta_mod+2)/4));
159 else if(eta_mod>13) eta_group = static_cast<uint8_t>(std::floor((eta_mod-6)/2));
160 }
161
162 uint8_t chips_per_module = (strip_max + 1) / 128;
163 uint32_t key = hccKey(barrelEC, side, disk, phi_mod, eta_mod, eta_group);
164
165 offlineHash = m_itkStripsID->wafer_hash(offlineID(rdo));
166 keyToHash.insert({key,offlineHash});
167
168 ATH_MSG_DEBUG("barrel: "<< barrelEC<<" sideAC: " << (uint32_t)sideAC << " disk: "<<(uint32_t)disk << " side: " << (uint32_t)side <<" phi_mod: "<<(uint32_t)phi_mod << " eta_mod: " << eta_mod << " eta group: "<<(uint32_t)eta_group << " chips per module: " << (uint32_t)chips_per_module << " " << (uint32_t)robID << " " << (uint32_t)m_itkStripsID->wafer_hash(offlineID(rdo)));
169
170 ATH_MSG_DEBUG("key: " << std::bitset<32>(key));
171 auto& StripData = allStripData[key];
172
173 if (StripData.empty()) {
174 StripData.resize(chips_per_module);
175 }
176
177 //Populate the bitset for each chip with active strips
178 int strip = getStrip(rdo);
179 int chip = static_cast<int>(std::floor(strip / 128));
180 int strip_position = strip % 128;
181 int strip_logical_channel = 2*strip_position + (eta_mod & 1);
182
183 ATH_MSG_DEBUG("strip N: "<< strip << " chip n: " << chip << " Strip position: " << strip_position << " Strip position logical: " << strip_logical_channel);
184 StripData[chip].set(strip_logical_channel);
185 }
186
187 std::vector<uint8_t> vec8Data;
188 uint32_t vectorSize = 0;
189 std::vector<uint16_t> clusters;
190
191 ATH_MSG_DEBUG("All strip data size: " << allStripData.size());
192
193 //Iterate over processed strip data and find clusters
194 for (const auto& [key, StripData] : allStripData) {
195
196 uint16_t ichannel = 0;
197 uint16_t size = 1;
198 int ptype = 1;
199 bool keyRecorded = false;
200 clusters.clear();
201
202 ATH_MSG_DEBUG("key is: " << std::bitset<32>(key) << " StripData size: " << StripData.size());
203
204 for (size_t i = 0; i < StripData.size(); ++i) {
205
206 std::bitset<256> hits = StripData[i];
207
208 if(hits==0){
209 ++ichannel;
210 continue;
211 }
212
213 //Use clusterFinder to extract clusters from the bitset
214 clusters = clusterFinder(hits);
215
216 if(clusters.empty()){
217 ++ichannel;
218 continue;
219 }
220 uint32_t hccKey = (keyRecorded) ? 0 : key;
221 encodeData(clusters, ichannel, vec8Data, ptype, m_l0tag , m_bcid, hccKey, size);
222 keyRecorded = true;
223 ++ichannel;++size;
224 }
225 vec8Data.push_back(0xed);
226 vec8Data.push_back(0x6f);
227 ATH_MSG_DEBUG("Add 16-0s: " << size % 2 << " " << vec8Data.size());
228
229 if(size % 2 == 0){
230 vec8Data.push_back(0);
231 vec8Data.push_back(0);
232 }
233 uint32_t packetLenght = (vec8Data.size()-vectorSize)+4;
234 ATH_MSG_DEBUG("Packet Lenght: " << (uint32_t)packetLenght << " " << std::bitset<32>(packetLenght));
235
236 std::vector<uint8_t> pktlenght = split32bitWord(packetLenght);
237
238 ATH_MSG_DEBUG("PktLenght: " << pktlenght.size() << " vec8Data size: " << vec8Data.size());
239
240 uint32_t offset = vectorSize + 4;
241 vec8Data.insert(vec8Data.begin()+offset, pktlenght.begin(), pktlenght.end());
242 vectorSize = vec8Data.size();
243
244 ATH_MSG_DEBUG("vec8Data size: " << vec8Data.size() << " size: " << size-1);
245 packFragments(vec8Data,vec32Data);
246 if (not m_dataRateMonTool.empty()) {
247 m_dataRateMonTool->fill(keyToHash[key], vec32Data, allStripData[key]);
248 }
249 vec32Data.clear();
250 }
251
252 //Update BCID and L0Tag counters
253 m_bcid = (m_bcid + 1) & 0x7F;
254 m_l0tag = (m_l0tag + 1) & 0x7F;
255
256 ATH_MSG_DEBUG("vec8Data size: " << vec8Data.size());
257
258 packFragments(vec8Data,vec32Data);
259
260 for(auto &word: vec32Data){
261 ATH_MSG_DEBUG("32-bit word: " << std::bitset<32>(word));
262 }
263 return;
264}
#define ATH_MSG_WARNING(x)
const SCT_ID * m_itkStripsID
Identifier helper class for the ITkStrips subdetector that creates compact Identifier objects and Ide...
uint16_t getStripMax(const SCT_RDORawData *rdo) const
Get the maxumum strip value info from the RDO.
Identifier offlineID(const SCT_RDORawData *rdo) const
Get the offline Identifier from the RDO.
int getBarrelEC(const SCT_RDORawData *rdo) const
Get the barrel/endcape info from the RDO.
std::atomic< uint8_t > m_l0tag
int getEtaModule(const SCT_RDORawData *rdo) const
Get the eta value info from the RDO.
int getSide(const SCT_RDORawData *rdo) const
Get the side info from the RDO.
int getStrip(const SCT_RDORawData *rdo) const
Get the strip number info from the RDO.
std::vector< uint16_t > clusterFinder(const std::bitset< 256 > &inputData, const uint8_t maxCluster=63) const
@breif Method to set pairs of 8 bit words to a 32 bit word.
uint8_t getPhiModule(const SCT_RDORawData *rdo) const
Get the phi value info from the RDO.
uint8_t getDiskLayer(const SCT_RDORawData *rdo) const
Get disk/layer info from the RDO.
void encodeData(const std::vector< uint16_t > &clusters, const uint16_t ichannel, std::vector< uint8_t > &data_encode, int typ, uint8_t l0tag, uint8_t bc_count, uint32_t hccKey, uint16_t &size) const
ToolHandle< ITkStripDataRateMonTool > m_dataRateMonTool
void packFragments(std::vector< uint8_t > &vec8Words, std::vector< uint32_t > &vec32Words) const
Method to pack vector of 8 bit words intto a vector of 32 bit words.
std::atomic< uint8_t > m_bcid
Method to encode RDO data to vector of 16 bin words.
BySideTypeMod sideAC(0)
setEventNumber uint32_t

◆ getBarrelEC()

int ITkStripsRodEncoder::getBarrelEC ( const SCT_RDORawData * rdo) const
private

Get the barrel/endcape info from the RDO.

Definition at line 467 of file ITkStripsRodEncoder.cxx.

467 {
468 const Identifier rdoID{rdo->identify()};
469 return m_itkStripsID->barrel_ec(rdoID);
470}
virtual Identifier identify() const override final

◆ getBit_128b()

bool ITkStripsRodEncoder::getBit_128b ( uint8_t bit_addr,
uint64_t data_high64,
uint64_t data_low64 ) const
inlineprivate

Definition at line 350 of file ITkStripsRodEncoder.cxx.

350 {
351 if (bit_addr > 127) return false;
352
353 return bit_addr<64 ? data_low64>>bit_addr & 1 : data_high64>>(bit_addr-64) & 1;
354}

◆ getDiskLayer()

uint8_t ITkStripsRodEncoder::getDiskLayer ( const SCT_RDORawData * rdo) const
private

Get disk/layer info from the RDO.

Definition at line 473 of file ITkStripsRodEncoder.cxx.

473 {
474 const Identifier rdoID{rdo->identify()};
475 return m_itkStripsID->layer_disk(rdoID);
476}

◆ getEtaModule()

int ITkStripsRodEncoder::getEtaModule ( const SCT_RDORawData * rdo) const
private

Get the eta value info from the RDO.

Definition at line 485 of file ITkStripsRodEncoder.cxx.

485 {
486 const Identifier rdoID{rdo->identify()};
487 return m_itkStripsID->eta_module(rdoID);
488}

◆ getHeaderPhysicsPacket()

uint16_t ITkStripsRodEncoder::getHeaderPhysicsPacket ( int typ,
uint8_t l0tag,
uint8_t bc_count ) const
private

Get the 16-bit word for a header with Type (PR or LP), L0Tag event and BCID.

Definition at line 506 of file ITkStripsRodEncoder.cxx.

506 {
507 uint8_t bcid_low = bc_cout & 0x7; // BCID[2:0]
508 bool bc_parity = getParity_8bits(bc_cout);
509 //TYPE (4 bits) + FlagBit (1 bit) + L0tag (7 bits) + BCID (3 bits) + Parity (1 bit)
510 const uint16_t Header{static_cast<uint16_t>(((uint8_t)typ << 12) | (0x1 << 11) | (l0tag & 0x7f) << 4 | (bcid_low) << 1 | bc_parity)};
511 return Header;
512
513}
bool getParity_8bits(uint8_t val) const

◆ getHeaderUsingHash()

uint16_t ITkStripsRodEncoder::getHeaderUsingHash ( const IdentifierHash & linkHash,
const int & errorWord ) const
private

Get the 16-bit word for a header for a link with a ByteStream error.

Definition at line 525 of file ITkStripsRodEncoder.cxx.

525 {
526 const int rodLink{rodLinkFromOnlineID(m_cabling->getOnlineIdFromHash(linkHash))};
527 const uint16_t linkHeader{static_cast<uint16_t>(0x2000 | errorWord | (m_condensed.value() << 8) | rodLink)};
528 return linkHeader;
529}
ToolHandle< IITkStripCablingTool > m_cabling
Providing mappings of online and offline identifiers and also serial numbers.
BooleanProperty m_condensed
Example Boolean used to determine decoding mode, maybe unused finally.

◆ getHeaderUsingRDO()

uint16_t ITkStripsRodEncoder::getHeaderUsingRDO ( const SCT_RDORawData * rdo) const
private

Get the 16-bit word for a header for a hit.

Definition at line 518 of file ITkStripsRodEncoder.cxx.

518 {
519 const int rodLink{getRODLink(rdo)};
520 const uint16_t linkHeader{static_cast<uint16_t>(0x2000 | (m_condensed.value() << 8) | rodLink)};
521 return linkHeader;
522}
int getRODLink(const SCT_RDORawData *rdo) const
Get the ROD link number info in the RDO header data.

◆ getParity_8bits()

bool ITkStripsRodEncoder::getParity_8bits ( uint8_t val) const
private

Definition at line 498 of file ITkStripsRodEncoder.cxx.

498 {
499 val ^= val >> 4;
500 val ^= val >> 2;
501 val ^= val >> 1;
502 return val&1;
503}

◆ getPhiModule()

uint8_t ITkStripsRodEncoder::getPhiModule ( const SCT_RDORawData * rdo) const
private

Get the phi value info from the RDO.

Definition at line 479 of file ITkStripsRodEncoder.cxx.

479 {
480 const Identifier rdoID{rdo->identify()};
481 return m_itkStripsID->phi_module(rdoID);
482}

◆ getRODLink()

int ITkStripsRodEncoder::getRODLink ( const SCT_RDORawData * rdo) const
private

Get the ROD link number info in the RDO header data.

Definition at line 455 of file ITkStripsRodEncoder.cxx.

455 {
456 return rodLinkFromOnlineID(onlineID(rdo));
457}
uint32_t onlineID(const SCT_RDORawData *rdo) const
Get the online Identifier from the RDO.

◆ getSide()

int ITkStripsRodEncoder::getSide ( const SCT_RDORawData * rdo) const
private

Get the side info from the RDO.

Definition at line 460 of file ITkStripsRodEncoder.cxx.

460 {
461 const Identifier rdoID{rdo->identify()};
462 int itkSide{m_itkStripsID->side(rdoID)};
463 return itkSide;
464}

◆ getStrip()

int ITkStripsRodEncoder::getStrip ( const SCT_RDORawData * rdo) const
private

Get the strip number info from the RDO.

Definition at line 436 of file ITkStripsRodEncoder.cxx.

436 {
437 const Identifier rdoID{rdo->identify()};
438 return m_itkStripsID->strip(rdoID);
439}

◆ getStripMax()

uint16_t ITkStripsRodEncoder::getStripMax ( const SCT_RDORawData * rdo) const
private

Get the maxumum strip value info from the RDO.

Definition at line 491 of file ITkStripsRodEncoder.cxx.

491 {
492 const Identifier rdoID{rdo->identify()};
493 if(m_itkStripsID->strip_max(rdoID)<0) return 0xFFFF;
494 return m_itkStripsID->strip_max(rdoID);
495}

◆ getTimeBin()

int ITkStripsRodEncoder::getTimeBin ( const SCT_RDORawData * rdo) const
private

Get the time bin info from the RDO.

◆ getTrailer()

uint16_t ITkStripsRodEncoder::getTrailer ( const int & errorWord) const
private

Get the 16-bit word for a trailer, with or without ByteStream errors.

Definition at line 532 of file ITkStripsRodEncoder.cxx.

532 {
533 const uint16_t linkTrailer{static_cast<uint16_t>(0x4000 | errorWord)};
534 return linkTrailer;
535}

◆ initialize()

StatusCode ITkStripsRodEncoder::initialize ( )
overridevirtual

Initialize.

Definition at line 95 of file ITkStripsRodEncoder.cxx.

95 {
96 ATH_MSG_DEBUG("ITkStripsRodEncoder::initialize()");
97
98 // Retrieve cabling tool
99 ATH_CHECK(m_cabling.retrieve());
100 ATH_MSG_DEBUG("Retrieved tool " << m_cabling);
101 ATH_CHECK(detStore()->retrieve(m_itkStripsID, "SCT_ID"));
102 const InDetDD::SCT_DetectorManager* itkStripsDetManager{nullptr};
103 ATH_CHECK(detStore()->retrieve(itkStripsDetManager, "ITkStrip"));
104 const InDetDD::SiDetectorElementCollection* sctDetElementColl{itkStripsDetManager->getDetectorElementCollection()};
105 for (const InDetDD::SiDetectorElement* sctDetElement : *sctDetElementColl) {
106 if (sctDetElement->swapPhiReadoutDirection()) {
107 m_swapModuleID.insert(sctDetElement->identify());
108 }
109 }
110
111 if (not m_dataRateMonTool.empty())
112 ATH_CHECK(m_dataRateMonTool.retrieve());
113
114 ATH_MSG_DEBUG("Initialization was successful");
115 return StatusCode::SUCCESS;
116}
#define ATH_CHECK
Evaluate an expression and check for errors.
std::set< Identifier > m_swapModuleID
Swap Module identifier, set by SCTRawContByteStreamTool.
virtual const SiDetectorElementCollection * getDetectorElementCollection() const override
access to whole collectiom

◆ offlineID()

Identifier ITkStripsRodEncoder::offlineID ( const SCT_RDORawData * rdo) const
private

Get the offline Identifier from the RDO.

Definition at line 442 of file ITkStripsRodEncoder.cxx.

442 {
443 const Identifier rdoId{rdo->identify()};
444 return m_itkStripsID->wafer_id(rdoId);
445}

◆ onlineID()

uint32_t ITkStripsRodEncoder::onlineID ( const SCT_RDORawData * rdo) const
private

Get the online Identifier from the RDO.

Definition at line 448 of file ITkStripsRodEncoder.cxx.

448 {
449 const Identifier waferID{offlineID(rdo)};
450 const IdentifierHash offlineIDHash{m_itkStripsID->wafer_hash(waferID)};
451 return static_cast<uint32_t>(m_cabling->getOnlineIdFromHash(offlineIDHash));
452}

◆ packFragments()

void ITkStripsRodEncoder::packFragments ( std::vector< uint8_t > & vec8Words,
std::vector< uint32_t > & vec32Words ) const
private

Method to pack vector of 8 bit words intto a vector of 32 bit words.

Method us used by private method encodeData(...).

Parameters
vec8WordsVector containing 8 bit words.
vec32WordsVector for 32 bit words to be packed.

Definition at line 394 of file ITkStripsRodEncoder.cxx.

394 {
395 int num8Words{static_cast<int>(vec8Words.size())};
396 if (num8Words % 4 != 0) {
397 // Just add additional 8-bit words to make the size a multiple of 4
398 while (num8Words % 4 != 0) {
399 vec8Words.push_back(0x40); // Padding byte
400 num8Words++;
401 }
402 }
403 // Now merge 4 consecutive 8-bit words into 32-bit words
404 const unsigned short int numWords{4};
405 const unsigned short int position[numWords]{0, 8, 16, 24};
406 unsigned short int arr8Words[numWords]{0, 0, 0, 0};
407
408 for (int i{0}; i<num8Words; i += numWords) {
409 for (int j{0}; j<numWords; j++) {
410 arr8Words[j] = vec8Words[i + j];
411 }
412 const uint32_t uint32Word{set32Bits(arr8Words, position, numWords)};
413 vec32Words.push_back(uint32Word);
414 }
415 return;
416}
uint32_t set32Bits(const unsigned short int *arr8Words, const unsigned short int *position, const unsigned short int &numWords) const
float j(const xAOD::IParticle &, const xAOD::TrackMeasurementValidation &hit, const Eigen::Matrix3d &jab_inv)
const Amg::Vector3D & position() const
Method to retrieve the position of the Intersection.

◆ set32Bits()

uint32_t ITkStripsRodEncoder::set32Bits ( const unsigned short int * arr8Words,
const unsigned short int * position,
const unsigned short int & numWords ) const
private

Definition at line 420 of file ITkStripsRodEncoder.cxx.

421{
422 uint32_t uint32Word{0};
423 uint32_t pos{0};
424 uint32_t uint8Word{0};
425 for (uint16_t i{0}; i<numWords; i++) {
426 uint8Word = static_cast<uint32_t>(*(arr8Words + i));
427 pos = static_cast<uint32_t>(*(position + i));
428 uint32Word |= (uint8Word << pos); // Shift the 8-bit word to its correct position and merge
429 }
430 return uint32Word;
431}

◆ setBit_128b()

void ITkStripsRodEncoder::setBit_128b ( uint8_t bit_addr,
bool value,
uint64_t & data_high64,
uint64_t & data_low64 ) const
inlineprivate

Definition at line 357 of file ITkStripsRodEncoder.cxx.

357 {
358 if (bit_addr < 64) {
359 data_low64 = (data_low64 & ~(1ULL << bit_addr)) | ((uint64_t)value << bit_addr);
360 } else if (bit_addr < 128) {
361 data_high64 =
362 (data_high64 & ~(1ULL << (bit_addr-64))) | ((uint64_t)value << (bit_addr-64));
363 }
364}

Member Data Documentation

◆ m_bcid

std::atomic<uint8_t> ITkStripsRodEncoder::m_bcid = 0
mutableprivate

Method to encode RDO data to vector of 16 bin words.

Methods used by main convert methods fillROD(...).

Parameters
vecTimeBinsVector of time bins for RDOs.
vec16WordsVector of 16 bit words to filled from encoded RDO data.
rdoRDO raw data object to be encoded.
groupSizeGroup size info from the RDO.
stripStrip number info from the RDO.

Definition at line 72 of file ITkStripsRodEncoder.h.

◆ m_cabling

ToolHandle<IITkStripCablingTool> ITkStripsRodEncoder::m_cabling
private
Initial value:
{this,
"ITkStripCablingTool",
"ITkStripCablingTool",
"Tool to retrieve ITkStrips Cabling"}

Providing mappings of online and offline identifiers and also serial numbers.

Definition at line 155 of file ITkStripsRodEncoder.h.

155 {this,
156 "ITkStripCablingTool",
157 "ITkStripCablingTool",
158 "Tool to retrieve ITkStrips Cabling"};

◆ m_condensed

BooleanProperty ITkStripsRodEncoder::m_condensed {this, "CondensedMode", false, "Condensed mode (true) or Expanded mode (false)"}
private

Example Boolean used to determine decoding mode, maybe unused finally.

Definition at line 167 of file ITkStripsRodEncoder.h.

167{this, "CondensedMode", false, "Condensed mode (true) or Expanded mode (false)"};

◆ m_dataRateMonTool

ToolHandle<ITkStripDataRateMonTool> ITkStripsRodEncoder::m_dataRateMonTool {this, "DataRateMonitoringTool", "", "Monitoring tool for data rate evaluation"}
private

Definition at line 160 of file ITkStripsRodEncoder.h.

160{this, "DataRateMonitoringTool", "", "Monitoring tool for data rate evaluation"};

◆ m_itkStripsID

const SCT_ID* ITkStripsRodEncoder::m_itkStripsID {nullptr}
private

Identifier helper class for the ITkStrips subdetector that creates compact Identifier objects and IdentifierHash or hash IDs.

Also allows decoding of these IDs.

Definition at line 164 of file ITkStripsRodEncoder.h.

164{nullptr};

◆ m_l0tag

std::atomic<uint8_t> ITkStripsRodEncoder::m_l0tag = 0
mutableprivate

Definition at line 73 of file ITkStripsRodEncoder.h.

◆ m_swapModuleID

std::set<Identifier> ITkStripsRodEncoder::m_swapModuleID {}
private

Swap Module identifier, set by SCTRawContByteStreamTool.

Definition at line 170 of file ITkStripsRodEncoder.h.

170{};

The documentation for this class was generated from the following files: