354 {
355 constexpr int MaxChannelinStripRow = 128;
356 long unsigned int stripNumber = 0;
357 bool filledHeader = false;
358
360 bool firstClusterFilled = false;
361
362 for (const InDetRawDataCollection<SCT_RDORawData>* SCT_Collection : stripRDO) {
363 if (SCT_Collection == nullptr) { continue; }
364
365 std::map<int, bool> firedStrips;
366 std::map<int, const SCT_RDORawData*> firedStripsToRDO;
367
368
369
370
371 for (const SCT_RDORawData* sctRawData : *SCT_Collection) {
372 const Identifier rdoId = sctRawData->identify();
373 const int baseLineStrip{
m_sctId->strip(rdoId)};
374 for (
int i = 0;
i < sctRawData->getGroupSize();
i++) {
375 firedStrips[baseLineStrip +
i] =
true;
376 firedStripsToRDO[baseLineStrip +
i] = sctRawData;
377 }
378 }
379
380
381 std::map<int, int> stripEncodingForITK;
382 std::map<int, const SCT_RDORawData* > stripEncodingForITKToRDO;
383 for (const auto& [stripID, fired] : firedStrips) {
384
385 if (!fired) continue;
386
387
388 std::bitset<3> hitMap;
389 int currChipID = stripID / MaxChannelinStripRow;
390 int maxStripIDForCurrChip = (currChipID + 1) * MaxChannelinStripRow;
391
392 for (
int i = 0;
i < 3;
i++) {
393
394 if ((stripID + 1 + i) >= maxStripIDForCurrChip) continue;
395 if (firedStrips.find(stripID + 1 + i) != firedStrips.end()) {
396 if (firedStrips.at(stripID + 1 + i)) {
398 firedStrips[stripID + 1 +
i] =
false;
399 } else {
401 }
402 }
403 }
404
405
406 stripEncodingForITK[stripID] = static_cast<int>(hitMap.to_ulong());
407 stripEncodingForITKToRDO[stripID] = firedStripsToRDO[stripID];
408 }
409
410 stripNumber = 0;
411 firstClusterFilled = false;
412
413
414 for (const auto& [stripID, encoding] : stripEncodingForITK) {
415 const SCT_RDORawData* sctRawData = stripEncodingForITKToRDO[stripID];
416 const Identifier rdoId = sctRawData->
identify();
417 const InDetDD::SiDetectorElement* sielement =
m_SCT_mgr->getDetectorElement(rdoId);
418
419
420 if(hashList.size() > 0)
421 {
422 if(std::find(hashList.begin(), hashList.end(), sielement->
identifyHash()) == hashList.end())
continue;
423 }
424
425
426 if (!filledHeader) {
428 filledHeader = true;
429 }
430
431
432 int chipID = stripID / MaxChannelinStripRow;
433 int ITkStripID = stripID % MaxChannelinStripRow;
434
435
437 if (
m_sctId->barrel_ec(rdoId) == 0) {
439 }
440 ITkStripID +=
offset * MaxChannelinStripRow;
441 stripNumber++;
442
443 bool lastBit = (stripNumber == stripEncodingForITK.size());
444
445
447 lastBit,
448 chipID,
449 ITkStripID,
450 stripEncodingForITK.at(stripID),
451 0x0F0F
452 );
453
455
456
457 if (!firstClusterFilled) {
458 packedWord = (
static_cast<uint64_t>(encodedCluster) << 32);
459 firstClusterFilled = true;
460 } else {
461 packedWord |=
static_cast<uint64_t>(encodedCluster);
462 encodedData.push_back(packedWord);
463 firstClusterFilled = false;
464 packedWord = 0;
465 }
466
467
468 if (lastBit && firstClusterFilled) {
469 encodedData.push_back(packedWord);
470 }
471
472 }
473
474 filledHeader = false;
475 }
476
477 return StatusCode::SUCCESS;
478}
virtual Identifier identify() const override final