16                                    ISvcLocator *pSvcLocator)
 
   53     return StatusCode::SUCCESS;
 
   81     ATH_CHECK( decor_detectorElementID.isValid() );
 
  104     for (
const SiHit& siHit: *siHits) {
 
  105       if ( not siHit.isSCT() ) {
 
  107     return StatusCode::FAILURE;
 
  111                           siHit.getLayerDisk(),
 
  112                           siHit.getPhiModule(),
 
  113                           siHit.getEtaModule(),
 
  120     return StatusCode::FAILURE;
 
  122       siHitsCollections[wafer_hash].push_back(&siHit);
 
  127       stripAccessor ( *measurements,
 
  129               stripElements->
size());
 
  133     for (
const auto& hashId : allIdHashes) {
 
  136         ATH_MSG_FATAL( 
"Invalid strip detector element for hash " << hashId);
 
  137         return StatusCode::FAILURE;
 
  140       auto [startRange, stopRange] = stripAccessor.rangesForIdentifierDirect(hashId).front();
 
  141       const std::vector< const SiHit* >& siHitsWithCurrentHash = siHitsCollections.at(hashId);
 
  143       for (
auto itr = startRange; itr != stopRange; ++itr) {
 
  146     const std::vector< std::uint64_t > rdoIdentifierList = measurement->
rdoIdentifierList();
 
  148     std::vector< Identifier > rdos( rdoIdentifierList.size() );
 
  149         for (std::size_t 
i(0); 
i < rdoIdentifierList.size(); ++
i) {
 
  150           rdos[
i].set_literal( rdoIdentifierList[
i] );
 
  157           startPosX, startPosY, startPosZ,
 
  161     decor_sdo_words(*measurement) = std::move(word);
 
  162     decor_sdo_depositsBarcode(*measurement) = std::move(depositsUniqueID);
 
  163     decor_sdo_depositsEnergy(*measurement) = std::move(depositsEnergy);
 
  166     decor_sihit_energyDeposit(*measurement) = std::move(
energyDeposit);
 
  167     decor_sihit_meanTime(*measurement) = std::move(meanTime);
 
  168     decor_sihit_barcode(*measurement) = std::move(
uniqueID);
 
  169     decor_sihit_pdgid(*measurement) = std::move(pdgid);
 
  171     decor_sihit_startPosX(*measurement) = std::move(startPosX);
 
  172     decor_sihit_startPosY(*measurement) = std::move(startPosY);
 
  173     decor_sihit_startPosZ(*measurement) = std::move(startPosZ);
 
  175     decor_sihit_endPosX(*measurement) = std::move(endPosX);
 
  176     decor_sihit_endPosY(*measurement) = std::move(endPosY);
 
  177     decor_sihit_endPosZ(*measurement) = std::move(endPosZ);
 
  181     return StatusCode::SUCCESS;
 
  187                                               const std::vector<const SiHit*>& siHits)
 const 
  189     std::vector<SiHit> matchingHits {};
 
  190     std::vector<const SiHit*> multiMatchingHits {};
 
  192     for (
const SiHit* siHit: siHits) {
 
  195       HepGeom::Point3D<double> averagePosition = 0.5 * (siHit->localStartPosition() + siHit->localEndPosition());
 
  199       for (
const auto& hitIdentifier: rdos) {
 
  203       multiMatchingHits.push_back(siHit);
 
  212     for ( ; siHitIter != multiMatchingHits.end(); ++siHitIter) {
 
  213       const SiHit* lowestXPos  = *siHitIter;
 
  214       const SiHit* highestXPos = *siHitIter;
 
  217       std::vector<const SiHit* > ajoiningHits;
 
  218       ajoiningHits.push_back( *siHitIter );
 
  220       siHitIter2 = siHitIter + 1;
 
  221       while ( siHitIter2 != multiMatchingHits.end() ) {
 
  224                      (*siHitIter2)->particleLink()) ) {
 
  230     if (std::abs((highestXPos->
localEndPosition().x()-(*siHitIter2)->localStartPosition().x()))<0.00005 &&
 
  231         std::abs((highestXPos->
localEndPosition().y()-(*siHitIter2)->localStartPosition().y()))<0.00005 &&
 
  232         std::abs((highestXPos->
localEndPosition().z()-(*siHitIter2)->localStartPosition().z()))<0.00005 ) {
 
  233       highestXPos = *siHitIter2;
 
  234       ajoiningHits.push_back( *siHitIter2 );
 
  237       siHitIter2 = multiMatchingHits.erase( siHitIter2 );
 
  238     } 
else if (std::abs((lowestXPos->
localStartPosition().x()-(*siHitIter2)->localEndPosition().x()))<0.00005 &&
 
  239            std::abs((lowestXPos->
localStartPosition().y()-(*siHitIter2)->localEndPosition().y()))<0.00005 &&
 
  240            std::abs((lowestXPos->
localStartPosition().z()-(*siHitIter2)->localEndPosition().z()))<0.00005) {
 
  241       lowestXPos = *siHitIter2;
 
  242       ajoiningHits.push_back( *siHitIter2 );
 
  245       siHitIter2 = multiMatchingHits.erase( siHitIter2 );
 
  251       if ( ajoiningHits.empty() ) {
 
  254       } 
else if ( ajoiningHits.size() == 1 ) {
 
  256     matchingHits.push_back( *ajoiningHits[0] );
 
  260     ATH_MSG_DEBUG(
"Merging " << ajoiningHits.size() << 
" SiHits together." );
 
  262     float energyDep {0.f};
 
  264     for( 
const auto& siHit : ajoiningHits ){
 
  265       energyDep += siHit->energyLoss();
 
  266       time += siHit->meanTime();    
 
  268     time /= ajoiningHits.size();
 
  274                   (*siHitIter)->particleLink(),
 
  276                   (*siHitIter)->getBarrelEndcap(),
 
  277                   (*siHitIter)->getLayerDisk(),
 
  278                   (*siHitIter)->getEtaModule(),
 
  279                   (*siHitIter)->getPhiModule(),
 
  280                   (*siHitIter)->getSide() );
 
  282     ATH_MSG_DEBUG(
"Finished Merging " << ajoiningHits.size() << 
" SiHits together." );