15 ISvcLocator *pSvcLocator)
67 return StatusCode::SUCCESS;
123 for (
const SiHit& siHit: *siHits) {
124 if ( not siHit.isSCT() ) {
126 return StatusCode::FAILURE;
130 siHit.getLayerDisk(),
131 siHit.getPhiModule(),
132 siHit.getEtaModule(),
139 return StatusCode::FAILURE;
141 siHitsCollections[wafer_hash].push_back(&siHit);
148 stripElements->size());
152 for (
const auto& hashId : allIdHashes) {
155 ATH_MSG_FATAL(
"Invalid strip detector element for hash " << hashId);
156 return StatusCode::FAILURE;
160 const std::vector< const SiHit* >& siHitsWithCurrentHash = siHitsCollections.at(hashId);
162 for (
auto itr = startRange; itr != stopRange; ++itr) {
171 startPosX, startPosY, startPosZ,
175 decor_sdo_words(*measurement) = std::move(word);
176 decor_sdo_depositsBarcode(*measurement) = std::move(depositsBarcode);
177 decor_sdo_depositsEnergy(*measurement) = std::move(depositsEnergy);
180 decor_sihit_energyDeposit(*measurement) = std::move(
energyDeposit);
181 decor_sihit_meanTime(*measurement) = std::move(meanTime);
182 decor_sihit_barcode(*measurement) = std::move(
barcode);
183 decor_sihit_pdgid(*measurement) = std::move(pdgid);
185 decor_sihit_startPosX(*measurement) = std::move(startPosX);
186 decor_sihit_startPosY(*measurement) = std::move(startPosY);
187 decor_sihit_startPosZ(*measurement) = std::move(startPosZ);
189 decor_sihit_endPosX(*measurement) = std::move(endPosX);
190 decor_sihit_endPosY(*measurement) = std::move(endPosY);
191 decor_sihit_endPosZ(*measurement) = std::move(endPosZ);
195 return StatusCode::SUCCESS;
201 const std::vector<const SiHit*>& siHits)
const
203 std::vector<SiHit> matchingHits {};
204 std::vector<const SiHit*> multiMatchingHits {};
206 for (
const SiHit* siHit: siHits) {
209 HepGeom::Point3D<double> averagePosition = 0.5 * (siHit->localStartPosition() + siHit->localEndPosition());
213 for (
const auto& hitIdentifier: cluster.rdoList()) {
217 multiMatchingHits.push_back(siHit);
226 for ( ; siHitIter != multiMatchingHits.end(); ++siHitIter) {
227 const SiHit* lowestXPos = *siHitIter;
228 const SiHit* highestXPos = *siHitIter;
231 std::vector<const SiHit* > ajoiningHits;
232 ajoiningHits.push_back( *siHitIter );
234 siHitIter2 = siHitIter + 1;
235 while ( siHitIter2 != multiMatchingHits.end() ) {
238 (*siHitIter2)->particleLink()) ) {
244 if (std::abs((highestXPos->
localEndPosition().x()-(*siHitIter2)->localStartPosition().x()))<0.00005 &&
245 std::abs((highestXPos->
localEndPosition().y()-(*siHitIter2)->localStartPosition().y()))<0.00005 &&
246 std::abs((highestXPos->
localEndPosition().z()-(*siHitIter2)->localStartPosition().z()))<0.00005 ) {
247 highestXPos = *siHitIter2;
248 ajoiningHits.push_back( *siHitIter2 );
251 siHitIter2 = multiMatchingHits.erase( siHitIter2 );
252 }
else if (std::abs((lowestXPos->
localStartPosition().x()-(*siHitIter2)->localEndPosition().x()))<0.00005 &&
253 std::abs((lowestXPos->
localStartPosition().y()-(*siHitIter2)->localEndPosition().y()))<0.00005 &&
254 std::abs((lowestXPos->
localStartPosition().z()-(*siHitIter2)->localEndPosition().z()))<0.00005) {
255 lowestXPos = *siHitIter2;
256 ajoiningHits.push_back( *siHitIter2 );
259 siHitIter2 = multiMatchingHits.erase( siHitIter2 );
265 if ( ajoiningHits.empty() ) {
268 }
else if ( ajoiningHits.size() == 1 ) {
270 matchingHits.push_back( *ajoiningHits[0] );
274 ATH_MSG_DEBUG(
"Merging " << ajoiningHits.size() <<
" SiHits together." );
276 float energyDep {0.f};
278 for(
const auto& siHit : ajoiningHits ){
279 energyDep += siHit->energyLoss();
280 time += siHit->meanTime();
282 time /= ajoiningHits.size();
290 (*siHitIter)->getBarrelEndcap(),
291 (*siHitIter)->getLayerDisk(),
292 (*siHitIter)->getEtaModule(),
293 (*siHitIter)->getPhiModule(),
294 (*siHitIter)->getSide() );
296 ATH_MSG_DEBUG(
"Finished Merging " << ajoiningHits.size() <<
" SiHits together." );