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." );