16 ISvcLocator *pSvcLocator)
53 return StatusCode::SUCCESS;
82 ATH_CHECK( decor_detectorElementID.isValid() );
105 for (
const SiHit& siHit: *siHits) {
106 if (!siHit.isPixel()) {
108 return StatusCode::FAILURE;
112 siHit.getLayerDisk(),
113 siHit.getPhiModule(),
114 siHit.getEtaModule()));
120 return StatusCode::FAILURE;
122 siHitsCollections[wafer_hash].push_back(&siHit);
126 pixelAccessor ( *measurements,
128 pixElements->
size());
132 for (
const auto& hashId : allIdHashes) {
135 ATH_MSG_FATAL(
"Invalid pixel detector element for hash " << hashId);
136 return StatusCode::FAILURE;
139 auto [startRange, stopRange] = pixelAccessor.rangesForIdentifierDirect(hashId).front();
140 const std::vector< const SiHit* >& siHitsWithCurrentHash = siHitsCollections.at(hashId);
142 for (
auto itr = startRange; itr != stopRange; ++itr) {
145 const std::vector< std::uint64_t > rdoIdentifierList = measurement->
rdoIdentifierList();
147 std::vector< Identifier > rdos( rdoIdentifierList.size() );
148 for (std::size_t
i(0);
i < rdoIdentifierList.size(); ++
i) {
149 rdos[
i].set_literal( rdoIdentifierList[
i] );
156 startPosX, startPosY, startPosZ,
160 decor_sdo_words(*measurement) = std::move(word);
161 decor_sdo_depositsBarcode(*measurement) = std::move(depositsUniqueID);
162 decor_sdo_depositsEnergy(*measurement) = std::move(depositsEnergy);
165 decor_sihit_energyDeposit(*measurement) = std::move(
energyDeposit);
166 decor_sihit_meanTime(*measurement) = std::move(meanTime);
167 decor_sihit_barcode(*measurement) = std::move(
uniqueID);
168 decor_sihit_pdgid(*measurement) = std::move(pdgid);
170 decor_sihit_startPosX(*measurement) = std::move(startPosX);
171 decor_sihit_startPosY(*measurement) = std::move(startPosY);
172 decor_sihit_startPosZ(*measurement) = std::move(startPosZ);
174 decor_sihit_endPosX(*measurement) = std::move(endPosX);
175 decor_sihit_endPosY(*measurement) = std::move(endPosY);
176 decor_sihit_endPosZ(*measurement) = std::move(endPosZ);
180 return StatusCode::SUCCESS;
186 const std::vector<const SiHit*>& sihits,
187 const std::vector< std::vector< int > >& sdoTracks)
const
189 std::vector<SiHit> matchingHits {};
190 std::vector<const SiHit*> multiMatchingHits {};
192 for (
const SiHit* siHit : sihits) {
196 HepGeom::Point3D<double> averagePosition = 0.5 * (siHit->localStartPosition() + siHit->localEndPosition());
200 for(
const Identifier& hitIdentifier : rdos ) {
205 multiMatchingHits.push_back(siHit);
212 for (
const std::vector<int>& uniqueIDSDOColl : sdoTracks ) {
213 if (
std::find(uniqueIDSDOColl.begin(), uniqueIDSDOColl.end(), siHitUniqueID) == uniqueIDSDOColl.end())
continue;
214 multiMatchingHits.push_back(siHit);
224 for ( ; siHitIter != multiMatchingHits.end(); ++siHitIter) {
225 const SiHit* lowestXPos = *siHitIter;
226 const SiHit* highestXPos = *siHitIter;
229 std::vector<const SiHit* > ajoiningHits;
230 ajoiningHits.push_back( *siHitIter );
232 siHitIter2 = siHitIter + 1;
233 while ( siHitIter2 != multiMatchingHits.end() ) {
236 (*siHitIter2)->particleLink()) ) {
242 if (std::abs((highestXPos->
localEndPosition().x()-(*siHitIter2)->localStartPosition().x()))<0.00005 &&
243 std::abs((highestXPos->
localEndPosition().y()-(*siHitIter2)->localStartPosition().y()))<0.00005 &&
244 std::abs((highestXPos->
localEndPosition().z()-(*siHitIter2)->localStartPosition().z()))<0.00005 ) {
245 highestXPos = *siHitIter2;
246 ajoiningHits.push_back( *siHitIter2 );
249 siHitIter2 = multiMatchingHits.erase( siHitIter2 );
250 }
else if (std::abs((lowestXPos->
localStartPosition().x()-(*siHitIter2)->localEndPosition().x()))<0.00005 &&
251 std::abs((lowestXPos->
localStartPosition().y()-(*siHitIter2)->localEndPosition().y()))<0.00005 &&
252 std::abs((lowestXPos->
localStartPosition().z()-(*siHitIter2)->localEndPosition().z()))<0.00005) {
253 lowestXPos = *siHitIter2;
254 ajoiningHits.push_back( *siHitIter2 );
257 siHitIter2 = multiMatchingHits.erase( siHitIter2 );
263 if ( ajoiningHits.empty() ) {
266 }
else if ( ajoiningHits.size() == 1 ) {
268 matchingHits.push_back( *ajoiningHits[0] );
272 ATH_MSG_DEBUG(
"Merging " << ajoiningHits.size() <<
" SiHits together." );
274 float energyDep {0.f};
276 for(
const auto& siHit : ajoiningHits ){
277 energyDep += siHit->energyLoss();
278 time += siHit->meanTime();
280 time /= ajoiningHits.size();
286 (*siHitIter)->particleLink(),
288 (*siHitIter)->getBarrelEndcap(),
289 (*siHitIter)->getLayerDisk(),
290 (*siHitIter)->getEtaModule(),
291 (*siHitIter)->getPhiModule(),
292 (*siHitIter)->getSide() );
294 ATH_MSG_DEBUG(
"Finished Merging " << ajoiningHits.size() <<
" SiHits together." );