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